this is not my final entry
REM Ini
sync on
sync rate 30
set display mode 1024, 768, 32
set window position 1, 1
set camera range 1, 100000
autocam off
REM Set
global num_islands as integer : num_islands = 5 `number of random islands
global rad_islands as float : rad_islands = 20 `island radius (avg) in matrix tile units
global environment_size as float : environment_size = 5000.0 `size of simulation in DB units
global seconds_to_starve as integer : seconds_to_starve = 60
global sink_speed as float : sink_speed = 1.0
f = 3
#Constant starting_corpses = 500/f
#Constant starting_prokaryotes = 500/f
#Constant starting_plankton = 500/f
#Constant starting_crab = 100/f
#Constant starting_krill = 200/f
#Constant starting_seal = 50/f
#Constant starting_squid = 100/f
#Constant starting_whale = 5/f
#Constant starting_penguin = 50/f
#Constant starting_fish = 100/f
#Constant starting_bird = 10/f
#Constant starting_nutrients = 500/f
REM Con
#Constant CORPSE 0
#Constant PROKARYOTES 1
#Constant PLANKTON 2
#Constant CRAB 3
#Constant KRILL 4
#Constant SEAL 5
#Constant SQUID 6
#Constant WHALE 7
#Constant PENGUIN 8
#Constant FISH 9
#Constant BIRD 10
#Constant NUTRIENTS 11
#Constant float_max_velocity 1.0
#Constant loops_to_turn_max 600
#Constant bird_minimum_height 100.0
#Constant bird_maximum_height 1300.0
#Constant bound_creatures 800
REM Typ
type xyz
x as float
y as float
z as float
endtype
type creature_types
name as string
obj as integer
days_to_grow as float
start_weight as float
adult_weight as float
height as float
max_vel as float
move_mode as string
sexually_reproduce as integer
food_dec_per_loop as float
prey_1 as integer
prey_2 as integer
prey_3 as integer
r
g
b
endtype
type creatures
kind as integer
obj as integer
gender as integer
weight as float
food as float
age as float
ang as xyz
vel as xyz
time_to_turn as integer
remove as integer
zonex
zoney
zonez
endtype
REM Var
global mtx_ocean as integer
global mtx_ground as integer
global calc_alt as integer
global oldmc
global mc
global return_x as float
global return_y as float
global return_z as float
REM Arr
global max_creatures as integer : max_creatures = 0
global max_a as integer : max_a = 15 : global amt_a as integer
#Constant max_creature_types 11
#Constant ocean_tiles 25
#Constant max_msg 10
DIM c(max_creatures) as creatures
DIM a(max_a) as integer
DIM t(max_creature_types) as creature_types
DIM w(ocean_tiles, ocean_tiles) as integer
dim msg(max_msg) as string
dim msg_species(max_creature_types) as integer
REM Load Environment
make_ground()
make_water()
position camera 800.0, 1600.0, 800.0
point camera environment_size/2.0, 0.0, environment_size/2.0
REM Load Creatures
` set_creature_type(i, name, days_to_grow, , adult_weight, max_vel, , , reproduce_mode, move_mode,
` prey_1, prey_2, prey_3, color_r, color_g, color_b, number of starting)
set_creature_type(0, "Corpse", 0.0, 5.0, 0.0, -1, "Sink", -1, -1, -1, 0, 0, 0, starting_corpses)
set_creature_type(1, "Prokaryotes", 0.1, 6.0, 0.0, 0, "Float", CORPSE, -1, -1, 255, 170, 0, starting_prokaryotes)
set_creature_type(2, "Plankton", 0.1, 6.0, 0.0, 0, "Float", NUTRIENTS, -1, -1, 0, 255, 0, starting_plankton)
set_creature_type(3, "Crab", 1.0, 10.0, 1.0, 1, "Walk", CORPSE, -1, -1, 255, 0, 0, starting_crab)
set_creature_type(4, "Krill", 0.5, 8.0, 0.0, 1, "Float", PLANKTON, -1, -1, 255, 255, 0, starting_krill)
set_creature_type(5, "Seal", 10.0, 35.0, 5.0, 1, "SwimWalk", KRILL, PENGUIN, FISH, 190, 190, 190, starting_seal)
set_creature_type(6, "Squid", 5.0, 12.0, 10.0, 1, "Swim", KRILL, -1, -1, 255, 128, 64, starting_squid)
set_creature_type(7, "Sperm Whale", 5.0, 100.0,2.5, 1, "Swim", KRILL, SEAL, SQUID, 0, 0, 255, starting_whale)
set_creature_type(8, "Penguin", 10.0, 25.0, 1.0, 1, "SwimWalk", SQUID, CRAB, -1, 32, 32, 32, starting_penguin)
set_creature_type(9, "Fish", 0.1, 20.0, 7.5, 1, "Swim", SQUID, CRAB, -1, 100, 170, 220, starting_fish)
set_creature_type(10, "Albatross", 5.0, 25.0, 20.0, 1, "Fly", FISH, SQUID, -1, 240, 240, 240, starting_bird)
set_creature_type(11, "Nutrients", 0.0, 5.0, 0.0, -1, "Float", -1, -1, -1, 255, 0, 255, starting_nutrients)
REM Main
do
REM Display data for user
set cursor 0,0
print "FPS: " + str$(screen fps())
print "Press (numpad '+') for max FPS or (numpad 'Enter') for 30 FPS"
print
print "Total creatures: " + str$(max_creatures)
inc calc_alt
if calc_alt = 15 then calc_alt = 0
do_mouse()
do_interface()
do_waves()
do_creatures()
sync
loop
function do_interface()
if calc_alt = 0
for n = 0 to max_creature_types
msg_species(n) = count_species(n)
next n
endif
REM Display species data
for n = 0 to max_creature_types
ink rgb(t(n).r, t(n).g, t(n).b), 0
print t(n).name + ": " + str$(msg_species(n))
next n
REM Display messages
print
ink rgb(255,255,0),0
for n = 0 to max_msg
print msg(n)
next n
endfunction
function do_creatures()
REM Remove creature (required to be in a separate do loop) (once per 15 loops)
if calc_alt = 12
for n = 1 to max_creatures
if n < max_creatures or n = max_creatures
if c(n).remove
remove_creature(n)
endif
endif
next n
endif
temp = max_creatures
for n = 1 to temp
REM calculate zone X Y and Z (Once per 15 loops)
if calc_alt = 3
c(n).zonex = int(object position x(c(n).obj) / 100.0)
c(n).zoney = int(object position y(c(n).obj) / 100.0)
c(n).zonez = int(object position z(c(n).obj) / 100.0)
endif
remstart
REM Once per 15 loops, do AI (seek prey/mate, evade predator)
if calc_alt = 2
REM Fill array "a" with nearby creatures (in adjacent zones)
fill_a_adjacent_zones(n)
if c(n).food > c(n).weight
REM If organism has enough food to make babies,
a = check_for_mate_adj(n)
if a
REM If there is a mate, go towards it
message_3d("Heart", object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj))
endif
else
REM Otherwise, see if there's anything to eat
a = check_for_prey_adj(n)
if a
REM If there is prey, go towards it
message_3d("Yum", object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj))
endif
endif
REM Check for predators
a = check_for_predators(n)
if a
REM If there is a predator, run away from it
message_3d("Uhoh", object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj))
endif
endif
remend
REM Once per 15 loops, EAT and REPRODUCE
`if calc_alt = 8
if calc_alt = 6
i = check_zone_for_prey(n)
if i > 0
inc c(n).food, c(i).weight
c(i).remove = 1
message_3d("Gulp", object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj))
message_2d("A "+t(c(n).kind).name+" has eaten a "+t(c(i).kind).name)
endif
endif
if calc_alt = 9
if t(c(n).kind).sexually_reproduce = 0
if c(n).food > c(n).weight
c(n).food = c(n).weight / 2.0
if c(n).kind = PROKARYOTES then add_creature(NUTRIENTS, object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj), 1) : message_2d("Prokaryotes produced Nutrients")
add_creature(c(n).kind, object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj), 1)
message_3d("Baby", object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj))
message_2d("A "+t(c(n).kind).name+" was born")
endif
endif
if t(c(n).kind).sexually_reproduce = 1
i = check_zone_for_mate(n)
if t(c(n).kind).sexually_reproduce = 1
if i > 0 and c(n).food > c(n).weight and c(i).food > c(i).weight
c(n).food = c(n).weight / 2.0
c(i).food = c(i).weight / 2.0
add_creature(c(n).kind, object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj), 1)
message_3d("Baby", object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj))
message_2d("A "+t(c(n).kind).name+" was born")
endif
endif
endif
endif
`endif
if c(n).kind = CORPSE or c(n).kind = NUTRIENTS
else
REM Use up organism's food (each loop)
dec c(n).food, t(c(n).kind).food_dec_per_loop
REM Bound food (each loop)
if c(n).food > c(n).weight * 2.0 then c(n).food = c(n).weight * 2.0
REM See if organism starves (each loop) -- IF food value is less than zero
if c(n).food < 0.0
if c(n).kind = NUTRIENTS
message_2d("nutrients decayed")
else
message_2d("A "+t(c(n).kind).name+" has died of starvation")
endif
message_3d("Starve", object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj))
add_creature(CORPSE, object position x(c(n).obj), object position y(c(n).obj), object position z(c(n).obj), 1)
c(n).remove = 1
endif
endif
REM Orient and move organism (Every loop)
select t(c(n).kind).move_mode
case "Walk"
do_organism_movement_walk(n)
endcase
case "SwimWalk"
h# = get ground height(mtx_ground, object position x(c(n).obj), object position z(c(n).obj))
if h# > 700.0
do_organism_movement_walk(n)
else
do_organism_movement_swim(n)
endif
endcase
case "Swim"
do_organism_movement_swim(n)
endcase
case "Float"
do_organism_movement_float(n)
endcase
case "Fly"
do_organism_movement_fly(n)
endcase
case "Sink"
do_organism_movement_sink(n)
endcase
endselect
next n
endfunction
function check_zone_for_prey(n)
for i = 1 to max_creatures
if c(n).zonex = c(i).zonex and c(n).zoney = c(i).zoney and c(n).zonez = c(i).zonez
if c(i).kind = t(c(n).kind).prey_1 or c(i).kind = t(c(n).kind).prey_2 or c(i).kind = t(c(n).kind).prey_3
r = i
endif
endif
next i
endfunction r
function check_zone_for_mate(n)
for i = 1 to max_creatures
if c(n).zonex = c(i).zonex and c(n).zoney = c(i).zoney and c(n).zonez = c(i).zonez
if c(i).kind = c(n).kind
if (c(n).gender = 0 and c(i).gender = 1) or (c(n).gender = 1 and c(i).gender = 0)
r = i
endif
endif
endif
next i
endfunction r
function fill_a_adjacent_zones(n)
REM Clear a()
for i = 1 to max_a
a(i) = 0
next i
amt_a = 0
REM Get adjacents
for i = 1 to max_creatures
if i = n
else
if c(i).zonex = c(n).zonex or c(i).zonex = c(n).zonex - 1 or c(i).zonex = c(n).zonex + 1
if c(i).zoney = c(n).zoney or c(i).zoney = c(n).zoney - 1 or c(i).zoney = c(n).zoney + 1
if c(i).zonez = c(n).zonez or c(i).zonez = c(n).zonez - 1 or c(i).zonez = c(n).zonez + 1
if amt_a < max_a
inc amt_a
a(amt_a) = i
endif
endif
endif
endif
endif
next i
endfunction
function check_for_mate_adj(n)
if amt_a > 0
for i = 1 to amt_a
if c(a(i)).kind = c(n).kind `if same species
if (c(a(i)).gender = 0 and c(n).gender = 1) or (c(a(i)).gender = 1 and c(n).gender = 0) `if diff gender
return_x = object position x(c(a(i)).obj)
return_y = object position y(c(a(i)).obj)
return_z = object position z(c(a(i)).obj)
r = 1
endif
endif
next i
endif
endfunction r
function check_for_prey_adj(n)
if amt_a > 0
for i = 1 to amt_a
if c(a(i)).kind = t(c(n).kind).prey_1 or c(a(i)).kind = t(c(n).kind).prey_2 or c(a(i)).kind = t(c(n).kind).prey_3
return_x = object position x(c(a(i)).obj)
return_y = object position y(c(a(i)).obj)
return_z = object position z(c(a(i)).obj)
r = 1
endif
next i
endif
endfunction r
function check_for_predators(n)
for i = 1 to amt_a
if t(c(a(i)).kind).prey_1 = c(n).kind or t(c(a(i)).kind).prey_2 = c(n).kind or t(c(a(i)).kind).prey_3 = c(n).kind
return_x = object position x(c(a(i)).obj)
return_y = object position y(c(a(i)).obj)
return_z = object position z(c(a(i)).obj)
r = 1
endif
next i
endfunction r
function message_2d(str as string)
for i = 0 to max_msg
if i < max_msg then msg(i) = msg(i+1)
next i
msg(max_msg) = str
endfunction
function message_3d(str as string, x as float, y as float, z as float)
endfunction
function do_organism_movement_sink(n)
`get vars
y# = object position y(c(n).obj)
h_ground# = get ground height(mtx_ground, x#, z#) + 2.5
if y# > h_ground# then dec y#, sink_speed
position object c(n).obj, object position x(c(n).obj), y#, object position z(c(n).obj)
endfunction
function do_organism_movement_fly(n)
`get vars
x# = object position x(c(n).obj)
y# = object position y(c(n).obj)
z# = object position z(c(n).obj)
h_ground# = get ground height(mtx_ground, x#, z#) + bird_minimum_height
h_ocean# = get ground height(mtx_ocean, x#, z#) + matrix position y(mtx_ocean) + bird_minimum_height
`get new velocity vector if its time to turn
if c(n).time_to_turn = 0
c(n).ang.y = rnd(360)
c(n).ang.x = rnd(360)
c(n).time_to_turn = rnd(loops_to_turn_max)
rotate object c(n).obj, c(n).ang.x, c(n).ang.y, 0.0
endif
`keep above ground
if y# < h_ground#
position object c(n).obj, x#, h_ground#, z#
y# = h_ground#
endif
`keep above water surface
if y# < h_ocean#
position object c(n).obj, x#, h_ocean#, z#
y# = h_ocean#
endif
`keep below maximum height
if y# > bird_maximum_height
position object c(n).obj, x#, bird_maximum_height, z#
y# = bird_maximum_height
endif
`bound position within environment
if x# > environment_size then position object c(n).obj, environment_size, y#, z# : x# = environment_size
if x# < 0.0 then position object c(n).obj, 0.0, y#, z# : x# = 0.0
if z# > environment_size then position object c(n).obj, x#, y#, environment_size : z# = environment_size
if z# < 0.0 then position object c(n).obj, x#, y#, 0.0 : z# = 0.0
`adjust time to turn variable
dec c(n).time_to_turn
`adjust position based on direction organism is moving
move object c(n).obj, t(c(n).kind).max_vel
endfunction
function do_organism_movement_swim(n)
`get vars
x# = object position x(c(n).obj)
y# = object position y(c(n).obj)
z# = object position z(c(n).obj)
h_ground# = get ground height(mtx_ground, x#, z#)
h_ocean# = get ground height(mtx_ocean, x#, z#) + matrix position y(mtx_ocean)
`get new velocity vector if its time to turn
if c(n).time_to_turn = 0
c(n).ang.y = rnd(360)
c(n).ang.x = rnd(360)
c(n).time_to_turn = rnd(loops_to_turn_max)
rotate object c(n).obj, c(n).ang.x, c(n).ang.y, 0.0
endif
`keep out of islands -- reposition it if stuck under island
if h_ground# > 900.0
x# = rnd(int(environment_size))
y# = rnd(800)
z# = rnd(int(environment_size))
position object c(n).obj, x#, y#, z#
endif
`keep above ground
if y# < h_ground#
position object c(n).obj, x#, h_ground#, z#
y# = h_ground#
endif
`keep below water surface
if y# > h_ocean#
position object c(n).obj, x#, h_ocean#, z#
y# = h_ocean#
endif
`bound position within environment
if x# > environment_size then position object c(n).obj, environment_size, y#, z# : x# = environment_size
if x# < 0.0 then position object c(n).obj, 0.0, y#, z# : x# = 0.0
if z# > environment_size then position object c(n).obj, x#, y#, environment_size : z# = environment_size
if z# < 0.0 then position object c(n).obj, x#, y#, 0.0 : z# = 0.0
`adjust time to turn variable
dec c(n).time_to_turn
`adjust position based on direction organism is moving
move object c(n).obj, t(c(n).kind).max_vel
endfunction
function do_organism_movement_walk(n)
`get vars
x# = object position x(c(n).obj)
y# = object position y(c(n).obj)
z# = object position z(c(n).obj)
h_ground# = get ground height(mtx_ground, x#, z#)
`get new velocity vector if its time to turn
if c(n).time_to_turn = 0
c(n).ang.y = rnd(360)
c(n).time_to_turn = rnd(loops_to_turn_max)
rotate object c(n).obj, 0.0, c(n).ang.y, 0.0
endif
`bound position within environment
if x# > environment_size then position object c(n).obj, environment_size, y#, z# : x# = environment_size
if x# < 0.0 then position object c(n).obj, 0.0, y#, z# : x# = 0.0
if z# > environment_size then position object c(n).obj, x#, y#, environment_size : z# = environment_size
if z# < 0.0 then position object c(n).obj, x#, y#, 0.0 : z# = 0.0
`adjust time to turn variable
dec c(n).time_to_turn
`adjust position based on direction organism is moving
x# = newxvalue(x#, c(n).ang.y, t(c(n).kind).max_vel)
z# = newzvalue(z#, c(n).ang.y, t(c(n).kind).max_vel)
y# = get ground height(mtx_ground, x#, z#)
`position creature object
position object c(n).obj, x#, y#+t(c(n).kind).height, z#
endfunction
function do_organism_movement_float(n)
`get vars
x# = object position x(c(n).obj)
y# = object position y(c(n).obj)
z# = object position z(c(n).obj)
h_ground# = get ground height(mtx_ground, x#, z#)
h_ocean# = get ground height(mtx_ocean, x#, z#) + matrix position y(mtx_ocean)
`randomize velocity vector (brownian motion)
if calc_alt = 0 or calc_alt = 7
inc c(n).vel.x, ((rnd(10)-5) / 10.0)
inc c(n).vel.y, ((rnd(10)-5) / 10.0)
inc c(n).vel.z, ((rnd(10)-5) / 10.0)
endif
`bound velocity
if c(n).vel.x > float_max_velocity then c(n).vel.x = float_max_velocity
if c(n).vel.x < -float_max_velocity then c(n).vel.x = -float_max_velocity
if c(n).vel.y > float_max_velocity then c(n).vel.y = float_max_velocity
if c(n).vel.y < -float_max_velocity then c(n).vel.y = -float_max_velocity
if c(n).vel.z > float_max_velocity then c(n).vel.z = float_max_velocity
if c(n).vel.z < -float_max_velocity then c(n).vel.z = -float_max_velocity
`bound position within environment
if x# > environment_size then position object c(n).obj, environment_size, y#, z# : x# = environment_size
if x# < 0.0 then position object c(n).obj, 0.0, y#, z# : x# = 0.0
if z# > environment_size then position object c(n).obj, x#, y#, environment_size : z# = environment_size
if z# < 0.0 then position object c(n).obj, x#, y#, 0.0 : z# = 0.0
`keep out of islands -- reposition it if stuck under island
if h_ground# > 900.0
x# = rnd(int(environment_size))
y# = rnd(800)
z# = rnd(int(environment_size))
position object c(n).obj, x#, y#, z#
endif
`keep above ground
if y# < h_ground#
position object c(n).obj, x#, h_ground#, z#
y# = h_ground#
endif
`keep below water surface
if y# > h_ocean#
position object c(n).obj, x#, h_ocean#, z#
y# = h_ocean#
endif
`adjust organism position
position object c(n).obj, x# + c(n).vel.x, y# + c(n).vel.y, z# + c(n).vel.z
endfunction
function minimum_four_floats(fa as float, fb as float, fc as float, fd as float)
if fa < fb and fa < fc and fa < fd then r = 0
if fb < fa and fb < fc and fb < fd then r = 1
if fc < fb and fc < fa and fc < fd then r = 2
if fd < fb and fd < fc and fd < fa then r = 3
endfunction r
function add_initial_creatures(creature_type as integer, move_mode as string, number as integer)
local x as float
local y as float
local z as float
for n = 1 to number
REM This select structure finds a suitable XYZ coordinate to place the current organism to be added
found = 0
select move_mode
case "Float"
` Keep getting random XYZ until XYZ is in the ocean AND is above the ground/sand
repeat
x = rnd(environment_size)
z = rnd(environment_size)
y = rnd(800)
if get ground height(mtx_ground, x, z) < 800.0 and get ground height(mtx_ground, x, z) < y
found = 1
endif
until found
endcase
case "Walk"
` Get random position with Y right above ground
x = rnd(environment_size)
z = rnd(environment_size)
y = get ground height(mtx_ground, x, z) + (t(creature_type).adult_weight)
endcase
case "SwimWalk"
` Get random position with Y right above ground
x = rnd(environment_size)
z = rnd(environment_size)
y = get ground height(mtx_ground, x, z) + (t(creature_type).adult_weight)
endcase
case "Swim"
` Keep getting random XYZ until XYZ is in the ocean AND is above the ground/sand
repeat
x = rnd(environment_size)
z = rnd(environment_size)
y = rnd(800)
if get ground height(mtx_ground, x, z) < 800.0 and get ground height(mtx_ground, x, z) < y
found = 1
endif
until found
endcase
case "Fly"
` Get random position with Y position in the air
x = rnd(environment_size)
z = rnd(environment_size)
y = rnd(200) + 1050.0
endcase
endselect
add_creature(creature_type, x, y, z, 1)
next n
endfunction
function remove_creature(id as integer)
REM Remove object
delete object c(id).obj
REM Remove array slot
array delete element c(), id
REM Adjust max_creature variable
dec max_creatures
endfunction
function add_creature(creature_type as integer, x as float, y as float, z as float, adult as integer)
if count_species(creature_type) < bound_creatures
REM Add slot to creature array and adjust max_creatures variable
array insert at bottom c()
inc max_creatures
REM Set creature stats
c(max_creatures).kind = creature_type
c(max_creatures).ang.x = rnd(360)
c(max_creatures).ang.y = rnd(360)
c(max_creatures).gender = rnd(1)
if adult = 0
c(max_creatures).weight = t(creature_type).start_weight
c(max_creatures).food = t(creature_type).start_weight / 2.0
c(max_creatures).age = 0.0
else
c(max_creatures).weight = t(creature_type).adult_weight
c(max_creatures).food = t(creature_type).adult_weight / 2.0
c(max_creatures).age = t(creature_type).days_to_grow
endif
REM Add object
c(max_creatures).obj = free_obj()
instance object c(max_creatures).obj, t(creature_type).obj
position object c(max_creatures).obj, x, y, z
rotate object c(max_creatures).obj, c(max_creatures).ang.x, c(max_creatures).ang.y, 0.0
endif
endfunction
function do_waves()
for x = 0 to ocean_tiles
for y = 0 to ocean_tiles
set matrix height mtx_ocean,x,y,(sin(w(x,y)))*25.0
if w(x,y) < 360
inc w(x,y), 5
else
w(x,y) = 0
endif
next y
next x
update matrix mtx_ocean
endfunction
function make_water()
REM Matrix texture
ink rgb(113-100, 137-100, 253-100), 0
box 0, 0, 64, 64
ink rgb(90-50, 197-50, 254-50), 0
for x = 0 to 64
for y = 0 to 64
if rnd(1) = 0 then box x, y, x+1, y+1
next y
next x
img_ocean = free_img()
get image img_ocean, 0, 0, 63, 63
REM Make matrix
mtx_ocean = free_mtx()
make matrix mtx_ocean, environment_size, environment_size, ocean_tiles, ocean_tiles
prepare matrix texture mtx_ocean, img_ocean, 1, 1
fill matrix mtx_ocean, 0, 1
randomize matrix mtx_ocean, 100
position matrix mtx_ocean, 0, 800, 0
set matrix mtx_ocean, 0,0,0,0,0,1,1
ghost matrix on mtx_ocean, 1
update matrix mtx_ocean
REM Array with random starting heights
for x = 0 to ocean_tiles
for y = 0 to ocean_tiles
w(x, y) = (rnd(72))*5
next y
next x
endfunction
function make_ground()
REM Matrix textures
ink rgb(247, 207, 115), 0
box 0, 0, 64, 64
ink rgb(251, 230, 179), 0
for x = 0 to 64
for y = 0 to 64
if rnd(2) = 0 then box x, y, x+1, y+1
next y
next x
ink rgb(86, 183, 15), 0
box 64, 0, 128, 64
ink rgb(21, 191, 81), 0
for x = 64 to 128
for y = 0 to 64
if rnd(2) = 0 then box x, y, x+1, y+1
next y
next x
img_matrix = free_img()
get image img_matrix, 0, 0, 127, 63
REM Make matrix
mtx_ground = free_mtx()
make matrix mtx_ground, environment_size, environment_size, 100, 100
prepare matrix texture mtx_ground, img_matrix, 2, 1
fill matrix mtx_ground, 0, 1
randomize matrix mtx_ground, 50
set matrix trim mtx_ground, 0.1, 0.1
REM Set islands
for n = 1 to num_islands
island_x = rnd(100)
island_y = rnd(100)
island_r = (rnd(20)-10 + rad_islands)
for x = 0 to 99
for y = 0 to 99
dist# = distance_2(x, y, island_x, island_y)
if dist# < island_r
if dist# < (island_r - 10)
REM If top of island
set matrix tile mtx_ground, x, y, 2
set matrix height mtx_ground, x, y, rnd(50) + 1000.0
else
REM If shore
dist2# = island_r - dist#
set matrix height mtx_ground, x, y, bound_float(get matrix height(1, x, y) + 100.0*dist2#, 1000.0 + rnd(50))
endif
endif
next y
next x
next n
update matrix mtx_ground
endfunction
function bound_float(f as float, b as float)
local r as float
if f < b
r = f
else
r = b
endif
endfunction r
function distance_2(xa, ya, xb, yb)
dx# = xa - xb
dy# = ya - yb
d# = sqrt(dx#*dx# + dy#*dy#)
endfunction d#
function do_mouse()
local mmy as float
local mmx as float
local spd as float
REM Var
spd = 1.0
oldmc = mc
mc = mouseclick()
mmy = mousemovey() / 5.0
mmx = mousemovex() / 5.0
REM Toggle FPS
if keystate(78) then sync rate 0
if keystate(156) then sync rate 30
REM Look
if mc = 2 and oldmc = 2
`hide moues while looking around
hide mouse
position mouse 512, 384
`turn camera
xrotate camera wrapvalue(camera angle x() + mmy)
yrotate camera wrapvalue(camera angle y() + mmx)
`bound camera angle
if camera angle x()>89 and camera angle x()<180 then xrotate camera 89
if camera angle x()<271 and camera angle x()>180 then xrotate camera 271
else
show mouse
endif
REM Move
if keystate(42)
spd = spd * 10
endif
if keystate(17)
move camera spd
endif
if keystate(31)
move camera -spd
endif
if keystate(30)
position camera newxvalue(camera position x(), camera angle y()-90.0, spd), camera position y(), newzvalue(camera position z(), camera angle y()-90.0, spd)
endif
if keystate(32)
position camera newxvalue(camera position x(), camera angle y()+90.0, spd), camera position y(), newzvalue(camera position z(), camera angle y()+90.0, spd)
endif
if keystate(16)
position camera camera position x(), camera position y() - spd, camera position z()
endif
if keystate(18)
position camera camera position x(), camera position y() + spd, camera position z()
endif
if camera position y() < 1.0 then position camera camera position x(), 1.0, camera position z()
endfunction
function free_obj()
repeat
inc i
if object exist(i)=0 then found=1
until found
endfunction i
function free_img()
repeat
inc i
if image exist(i)=0 then found=1
until found
endfunction i
function free_mtx()
repeat
inc i
if matrix exist(i)=0 then found=1
until found
endfunction i
function set_creature_type(i as integer, name as string, days_to_grow as float, adult_weight as float, max_vel as float, reproduce_mode as integer, move_mode as string, prey_1 as integer, prey_2 as integer, prey_3 as integer, r, g, b, start_number)
t(i).name = name
t(i).days_to_grow = days_to_grow
t(i).start_weight = adult_weight / 10.0
t(i).height = adult_weight / 2.0
t(i).adult_weight = adult_weight
t(i).max_vel = max_vel
t(i).move_mode = move_mode
t(i).prey_1 = prey_1
t(i).prey_2 = prey_2
t(i).prey_3 = prey_3
t(i).sexually_reproduce = reproduce_mode
t(i).food_dec_per_loop = adult_weight / (seconds_to_starve * 60)
t(i).r = r
t(i).g = g
t(i).b = b
t(i).obj = free_obj()
make object cube t(i).obj, t(i).adult_weight
color object t(i).obj, rgb(r,g,b)
hide object t(i).obj
if start_number > 0
add_initial_creatures(i, move_mode, start_number)
endif
endfunction
function count_species(i)
for n = 1 to max_creatures
if c(n).kind = i then inc count
next n
endfunction count
it is in a 3d ocean with islands. most of the organisms either float or swim, some also walk, and the bird flies
each animal has certain types of prey to eat. it needs to be nearby its prey to eat the prey and increase its food value
an animal needs a certain amount of food and a nearby opposite-gendered counterpart to mate
each organism dies if it goes too long without food
prokaryotes go around eating corpses (waste) and churning out nutrients. the (photosynthetic) plankton eat the nutrients. krill eat the plankton. the 'primary consumers' (biology term) eat the krill (whale, seal, squid) and secondary consumers eat seals or squid (fish, whale, penguin, et al)
thus everything cycles, from waste to producer to primary consumer to secondary consumer to waste, but the system is rather unstable, like real life
i'm still trying to find starting values that establish an equilibrium (ie they dont all die out after a couple minutes) feel free to play with the numebers (either the starting # of each organism, its weight, or whatever else)
also the program may skip a bit, since once per 15 loops, lots of calculation is done