Rem Project: Creature Trainer
Rem Created: Monday, October 16, 2017
Rem ***** Main Source File *****
Rem Project: Test sight
Rem Created: Thursday, October 05, 2017
Rem *****Creature Line of Sight Demo****
type vector
x as integer
y as integer
z as integer
endtype
type brain
value as float
w1 as float
w2 as float
w3 as float
w4 as float
w5 as float
endtype
type input_type
val1 as brain //
val2 as brain
val3 as brain // ENEMY
val4 as brain
endtype
type eye
eyes as integer
FOV as integer
distance as integer
endtype
type creature
sex as integer
position as vector
kingdom as integer
Neuron as input_type
speed as integer
age as integer
fitness as integer
distance_moved as integer
COLOR as integer
health as integer
fov as integer
sight_dist as integer
turn_speed as integer
endtype
type tree
health as integer
endtype
#constant true = 1
#constant false = 0
#constant Learning_constant = 2000
#CONSTANT cplayer = 2000
#CONSTANT csight =10000
#CONSTANT eyeoffset = 2000
#CONSTANT cfood = 2
#CONSTANT cmate = 1
#CONSTANT cenemy = 3
#CONSTANT cwall = 4
#constant max_trees = 50
#constant tree_offset = 5000
#Constant world_size = 500
dim creatures(5) as creature
dim brains(100,3,5) as float
global nur as input_type
global max_health = 1000
global Max_creatures = 200
global inputs as input_type
Global last_select
Global POPULATION as integer
Global Tree_population
global mousex#
Global mousey#
Input "Input number of creatures to spawn then press ENTER:",Max_creatures
wait 300
randomize (rnd(1000000))
//initialize()
//COLOR BACKDROP 1,0
//=========================================================================================================================
// Starting to Main Game loop, After creature is trained Main loop moves to the MOVE_CREATURE function
//=========================================================================================================================
while keystate(1) = false
Print "Helpful Hint, Nature likes Randomness"
print "Training Tends to lead to Higher rates of Cultures dying off"
Print "I Never see Randomized Die off unless Creature count is below 50"
print ""
print ""
Print "Press R for randomized Creatures"
print "Press E for Creatures all at 20%"
print "Press T to Train Creatures with User controls"
print ""
Print "<Run Mode Keys>"
Print "Press P to Pause"
print "Press C to clear the creature data from the screen"
print "Arrow keys control position of the Camera"
print "Use the mouse to adjust the Camera Pitch"
print " "
sync
wait key
if keystate(28) = true
wait 200
initialize()
init_creatures(3)
move_creatures()
endif
if keystate(19) = true
wait 200
initialize()
init_creatures(1)
move_creatures()
endif
if keystate(18) = true
wait 200
initialize()
init_creatures(2)
move_creatures()
endif
if keystate(20) = true
wait 200
cls
Print "You will soon see a Creature in front of you, control him using the arrow keys"
print ""
print "The white triangle is his line of sight and your reactions and controls when"
print "the items are in his view will determine ALL of the creatures behaviors."
print " "
print "When you are happy with your setting start the game by hitting ENTER"
print ""
print "Press Any Key to Continue..."
WAIT key
initialize()
Creature_trainer()
endif
endwhile
//============================================================================================================================================
// Initialization Functions
//============================================================================================================================================
function initialize()
sync on
inputs.val1.w1 = 2000
inputs.val1.w2 = 2000
inputs.val1.w3 = 2000
inputs.val1.w4 = 2000
inputs.val1.w5 = 2000
inputs.val2.w1 = 2000
inputs.val2.w2 = 2000
inputs.val2.w3 = 2000
inputs.val2.w4 = 2000
inputs.val2.w5 = 2000
inputs.val3.w1 = 2000
inputs.val3.w2 = 2000
inputs.val3.w3 = 2000
inputs.val3.w4 = 2000
inputs.val3.w5 = 2000
inputs.val4.w1 = 2000
inputs.val4.w2 = 2000
inputs.val4.w3 = 2000
inputs.val4.w4 = 2000
inputs.val4.w5 = 2000
MAKE OBJECT sphere 1,10;MAKE OBJECT cone 2,10;MAKE OBJECT sphere 3,10;MAKE OBJECT cube 4,10
MAKE OBJECT sphere cplayer,10
MAKE OBJECT TRIANGLE csight,0,0,0,-30,0,100,30,0,100
POSITION OBJECT 1,0,0,0;POSITION OBJECT 2,0,0,100;POSITION OBJECT 3,100,0,0;POSITION OBJECT 4,100,0,100
POSITION OBJECT cplayer ,50,0,50
POSITION OBJECT csight,object position x(cplayer),object position y(cplayer),object position z(cplayer)
rotate object csight, OBJECT ANGLE X (cplayer),OBJECT ANGLE y (cplayer),OBJECT ANGLE z (cplayer)
MAKE CAMERA 1
POSITION CAMERA 1,0,200,50
POINT CAMERA 1,50,0,50
SET OBJECT collision to polygons csight
for a = 1 to 4
creatures(a).position.x = OBJECT POSITION X (a)
creatures(a).position.y = OBJECT POSITION y (a)
creatures(a).position.z = OBJECT POSITION z (a)
next
creatures(1).kingdom = cfood
creatures(2).kingdom = cmate
creatures(3).kingdom = cenemy
creatures(4).kingdom = cwall
endfunction
function INIT_creatures(style as integer)
backdrop off
SET CURSOR 0,0
delete object 1
delete object 2
delete object 3
delete object 4
delete object 5
set OBJECT collision off csight
HIDE OBJECT CSIGHT
DELETE OBJECT cplayer
ink rgb(50,75,0),0:box 1,1,101,101:get image 1,0,0,101,101
make matrix 1,world_size*10,world_size*10,20,20
prepare matrix texture 1,1,1,1
POSITION MATRIX 1,-(world_size*5),-5,-(world_size*5)
SET MATRIX WIREFRAME OFF 1
update matrix 1
Dim animals(Max_creatures) as creature
for count = 1 to max_trees
make_creature(0,rnd(world_size ),0,rnd(world_size),1,0,0,rnd(20),0,0,0)
next
for count = 1 to max_creatures
animals(count).kingdom = 0 //rnd(1)
if animals(count).kingdom = 0
Make_animals:
make_creature(rnd(1),rnd(world_size),0,rnd(world_size),0,rnd(10) + 1,rgb(rnd(255),rnd(255),rnd(255)),rnd(500),RND(45),rnd(50),rnd(150))
//========== Make all the creatures start with random stats
select style
case 1
animals(count).neuron.val1.w1= rnd(10000)+ 1
animals(count).neuron.val1.w2= rnd(10000)+ 1
animals(count).neuron.val1.w3= rnd(10000)+ 1
animals(count).neuron.val1.w4= rnd(10000)+ 1
animals(count).neuron.val1.w5= rnd(10000)+ 1
animals(count).neuron.val2.w1= rnd(10000)+ 1
animals(count).neuron.val2.w2= rnd(10000)+ 1
animals(count).neuron.val2.w3= rnd(10000)+ 1
animals(count).neuron.val2.w4= rnd(10000)+ 1
animals(count).neuron.val2.w5= rnd(10000)+ 1
animals(count).neuron.val3.w1= rnd(10000)+ 1
animals(count).neuron.val3.w2= rnd(10000)+ 1
animals(count).neuron.val3.w3= rnd(10000)+ 1
animals(count).neuron.val3.w4= rnd(10000)+ 1
animals(count).neuron.val3.w5= rnd(10000)+ 1
animals(count).neuron.val4.w1= rnd(10000)+ 1
animals(count).neuron.val4.w2= rnd(10000)+ 1
animals(count).neuron.val4.w3= rnd(10000)+ 1
animals(count).neuron.val4.w4= rnd(10000)+ 1
animals(count).neuron.val4.w5= rnd(10000)+ 1
endcase
case 2 //============== EVEN CONTROLS
animals(count).neuron.val1.w1= 2000
animals(count).neuron.val1.w2= 2000
animals(count).neuron.val1.w3= 2000
animals(count).neuron.val1.w4= 2000
animals(count).neuron.val1.w5= 2000
animals(count).neuron.val2.w1= 2000
animals(count).neuron.val2.w2= 2000
animals(count).neuron.val2.w3= 2000
animals(count).neuron.val2.w4= 2000
animals(count).neuron.val2.w5= 2000
animals(count).neuron.val3.w1= 2000
animals(count).neuron.val3.w2= 2000
animals(count).neuron.val3.w3= 2000
animals(count).neuron.val3.w4= 2000
animals(count).neuron.val3.w5= 2000
animals(count).neuron.val4.w1= 2000
animals(count).neuron.val4.w2= 2000
animals(count).neuron.val4.w3= 2000
animals(count).neuron.val4.w4= 2000
animals(count).neuron.val4.w5= 2000
endcase
case 3 //-------------- USER INPUT
animals(count).neuron.val1.w1= inputs.val1.w1
animals(count).neuron.val1.w2= inputs.val1.w2
animals(count).neuron.val1.w3= inputs.val1.w3
animals(count).neuron.val1.w4= inputs.val1.w4
animals(count).neuron.val1.w5= inputs.val1.w5
animals(count).neuron.val2.w1= inputs.val2.w1
animals(count).neuron.val2.w2= inputs.val2.w2
animals(count).neuron.val2.w3= inputs.val2.w3
animals(count).neuron.val2.w4= inputs.val2.w4
animals(count).neuron.val2.w5= inputs.val2.w5
animals(count).neuron.val3.w1= inputs.val3.w1
animals(count).neuron.val3.w2= inputs.val3.w2
animals(count).neuron.val3.w3= inputs.val3.w3
animals(count).neuron.val3.w4= inputs.val3.w4
animals(count).neuron.val3.w5= inputs.val3.w5
animals(count).neuron.val4.w1= inputs.val4.w1
animals(count).neuron.val4.w2= inputs.val4.w2
animals(count).neuron.val4.w3= inputs.val4.w3
animals(count).neuron.val4.w4= inputs.val4.w4
animals(count).neuron.val4.w5= inputs.val4.w5
endcase
endselect
endif
next
endfunction
//============================================================================================================================================
// SIGHT Functions
//============================================================================================================================================
function CREATURE_TRAINER()
while keystate(1) = false
SET CURSOR 0,0
print current camera()
Print "Press Enter then Enter the amount of Creatures you wish to spawn"
Print "TOP LEFT 3 = Wall"
Print "TOP RIGHT 4 = Enemy"
Print "BOTTOM LEFT 2 = Mate"
Print "BOTTOM RIGHT 1 = Food"
if leftkey() = 1 then yROTATE OBJECT cplayer, OBJECT ANGLE Y(cplayer)-.3
if rightkey() = 1 then yROTATE OBJECT cplayer, OBJECT ANGLE Y(cplayer)+.3
if upkey() = 1 then MOVE OBJECT cplayer,.1
if downkey() = 1 then MOVE OBJECT cplayer,-.1
POSITION OBJECT csight,object position x(cplayer),object position y(cplayer),object position z(cplayer)
rotate object csight, OBJECT ANGLE X (cplayer),OBJECT ANGLE y (cplayer),OBJECT ANGLE z (cplayer)
set OBJECT COLLISION off cplayer;set OBJECT COLLISION on csight
sees = OBJECT COLLISION (csight,0)
if sees = 0
if upkey() = true
sight_trainer(sees,1)
endif
if downkey() = true
sight_trainer(sees,2)
endif
if leftkey() = true
sight_trainer(sees,3)
endif
if rightkey() = true
sight_trainer(sees,4)
endif
if scancode() = 0
sight_trainer(sees,5)
endif
endif
if sees <>0
if upkey() = true
sight_trainer(sees,1)
endif
if downkey() = true
sight_trainer(sees,2)
endif
if leftkey() = true
sight_trainer(sees,3)
endif
if rightkey() = true
sight_trainer(sees,4)
endif
if scancode() = 0
sight_trainer(sees,5)
endif
print "Player sees object:" ;OBJECT COLLISION (csight,0)
endif
if keystate(28) = true
wait 500
init_creatures(3)
move_creatures()
endif
if keystate(19) = true
wait 500
init_creatures(1)
move_creatures()
endif
if keystate(18) = true
wait 500
init_creatures(2)
move_creatures()
endif
set OBJECT COLLISION off csight;set OBJECT COLLISION on cplayer
PRINT "FORWARD: BACKWARDS: UP: DOWN: NULL"
print print_weight(inputs.val1.w1);" :"; print_weight(inputs.val1.w2);" :";inputs.val1.w3;" :";inputs.val1.w4;" :";inputs.val1.w5
print print_weight(inputs.val2.w1);" :"; print_weight(inputs.val2.w2);" :";inputs.val2.w3;" :";inputs.val2.w4;" :";inputs.val2.w5
print inputs.val3.w1;" :";inputs.val3.w2;" :";inputs.val3.w3;" :";inputs.val3.w4;" :";inputs.val3.w5
print inputs.val4.w1;" :";inputs.val4.w2;" :";inputs.val4.w3;" :";inputs.val4.w4;" :";inputs.val4.w5
sync
endwhile
endfunction
FUNCTION sight_handler(count,in)
// POSITION OBJECT sight,object position x(count),object position y(count),object position z(count)
// rotate object sight, OBJECT ANGLE X (count),OBJECT ANGLE y (count),OBJECT ANGLE z (count)
// set OBJECT COLLISION off count;set OBJECT COLLISION on sight
// sees = OBJECT COLLISION (sight,0)
// if sees = 0 then sight_handler(count,0) // sees nothing
// if sees <>0
// if sees > tree_offset then sight_handler(count,1) // food
// if animals(sees).sex <> animals(count).sex then sight_handler(count,2) // mate
// if animals(sees).sex = animals(count).sex then sight_handler(count,3) // enemy
// endif
// set OBJECT COLLISION off sight;set OBJECT COLLISION on count
ret = 0
sight = count + eyeoffset
POSITION OBJECT sight,object position x(count),object position y(count),object position z(count)
rotate object sight, OBJECT ANGLE X (count),OBJECT ANGLE y (count),OBJECT ANGLE z (count)
set OBJECT COLLISION off count;set OBJECT COLLISION on sight
in = OBJECT COLLISION (sight,0)
if sees = 0 then in = 0 // sees nothing
if sees <>0
if sees > tree_offset then in = 1 // food
if animals(sees).sex <> animals(count).sex then in = 2 // mate
if animals(sees).sex = animals(count).sex then in = 3 // enemy
endif
set OBJECT COLLISION off sight;set OBJECT COLLISION on count
select in
case 0: // Sees nothing
trigger = rnd(10000);if animals(count).neuron.val4.w1 > trigger
MOVE OBJECT count, animals(count).speed
ret=1
animals(count).distance_moved = animals(count).distance_moved +animals(count).speed:endif
trigger = rnd(10000);if animals(count).neuron.val4.w2 > trigger
MOVE OBJECT count,-animals(count).speed
ret=2
animals(count).distance_moved = animals(count).distance_moved +animals(count).speed:endif
trigger = rnd(10000);if animals(count).neuron.val4.w3 > trigger
yROTATE OBJECT count, OBJECT ANGLE Y(count)-animals(count).turn_speed:ret=3:endif
trigger = rnd(10000);if animals(count).neuron.val4.w4 > trigger
yROTATE OBJECT count, OBJECT ANGLE Y(count)+ animals(count).turn_speed:ret=4:endif
//print "nothing"
//trigger = rnd(100);if animals(count).neuron.val4.w5 > trigger:endif
//yROTATE OBJECT count, OBJECT ANGLE Y(count)+ (-15 + rnd(30))- //.1
endcase
case 1: // Sees food
trigger = rnd(10000);if animals(count).neuron.val1.w1 > trigger
MOVE OBJECT count,animals(count).speed
ret=1
animals(count).distance_moved = animals(count).distance_moved +animals(count).speed:endif
trigger = rnd(10000);if animals(count).neuron.val1.w2 > trigger
MOVE OBJECT count,-animals(count).speed
ret=2
animals(count).distance_moved = animals(count).distance_moved +animals(count).speed:endif
trigger = rnd(10000);if animals(count).neuron.val1.w3 > trigger
yROTATE OBJECT count, OBJECT ANGLE Y(count)-animals(count).turn_speed:ret=3:endif
trigger = rnd(10000);if animals(count).neuron.val1.w4 > trigger
yROTATE OBJECT count, OBJECT ANGLE Y(count)+ animals(count).turn_speed:ret=4:endif
//trigger = rnd(100);if animals(count).neuron.val1.w5 > trigger:endif
//goto skip
endcase
case 2: //Sees Mate
trigger = rnd(10000);if animals(count).neuron.val2.w1 > trigger
MOVE OBJECT count,animals(count).speed
ret=1
animals(count).distance_moved = animals(count).distance_moved +animals(count).speed:endif
trigger = rnd(10000);if animals(count).neuron.val2.w2 > trigger
MOVE OBJECT count,-animals(count).speed
ret= 2
animals(count).distance_moved = animals(count).distance_moved +animals(count).speed:endif
trigger = rnd(10000);if animals(count).neuron.val2.w3 > trigger
yROTATE OBJECT count, OBJECT ANGLE Y(count)-animals(count).turn_speed:ret=3:endif
trigger = rnd(10000);if animals(count).neuron.val2.w4 > trigger
yROTATE OBJECT count, OBJECT ANGLE Y(count)+ animals(count).turn_speed:ret=4:endif
//print "sex"
//trigger = rnd(100);if animals(count).neuron.val2.w5 > trigger:endif
///goto skip
endcase
case 3: //Sees Enemy
trigger = rnd(10000);if animals(count).neuron.val3.w1 > trigger
MOVE OBJECT count, animals(count).speed
ret= 1
animals(count).distance_moved = animals(count).distance_moved +animals(count).speed:endif
trigger = rnd(10000);if animals(count).neuron.val3.w2 > trigger
MOVE OBJECT count,-animals(count).speed
ret= 2
animals(count).distance_moved = animals(count).distance_moved +animals(count).speed:endif
trigger = rnd(10000);if animals(count).neuron.val3.w3 > trigger
yROTATE OBJECT count, OBJECT ANGLE Y(count)-animals(count).turn_speed:ret=3:endif
trigger = rnd(10000);if animals(count).neuron.val3.w4 > trigger
yROTATE OBJECT count, OBJECT ANGLE Y(count)+ animals(count).turn_speed:ret=4:endif
//Print "fight"
//trigger = rnd(100);if animals(count).neuron.val3.w5 > trigger:endif
//goto skip
endcase
endselect
endfunction ret
FUNCTION sight_trainer(in,key)
select in
case 2: // food
select key
case 1:
inputs.val1.w1 = increase(inputs.val1.w1)
inputs.val1.w2 = decrease(inputs.val1.w2)
inputs.val1.w3 = decrease(inputs.val1.w3)
inputs.val1.w4 = decrease(inputs.val1.w4)
inputs.val1.w5 = decrease(inputs.val1.w5)
endcase
case 2:
inputs.val1.w1 = decrease(inputs.val1.w1)
inputs.val1.w2 = increase(inputs.val1.w2)
inputs.val1.w3 = decrease(inputs.val1.w3)
inputs.val1.w4 = decrease(inputs.val1.w4)
inputs.val1.w5 = decrease(inputs.val1.w5)
endcase
case 3:
inputs.val1.w1 = decrease(inputs.val1.w1)
inputs.val1.w2 = decrease(inputs.val1.w2)
inputs.val1.w3 = increase(inputs.val1.w3)
inputs.val1.w4 = decrease(inputs.val1.w4)
inputs.val1.w5 = decrease(inputs.val1.w5)
endcase
case 4:
inputs.val1.w1 = decrease(inputs.val1.w1)
inputs.val1.w2 = decrease(inputs.val1.w2)
inputs.val1.w3 = decrease(inputs.val1.w3)
inputs.val1.w4 = increase(inputs.val1.w4)
inputs.val1.w5 = decrease(inputs.val1.w5)
endcase
case 5:
inputs.val1.w1 = decrease(inputs.val1.w1)
inputs.val1.w2 = decrease(inputs.val1.w2)
inputs.val1.w3 = decrease(inputs.val1.w3)
inputs.val1.w4 = decrease(inputs.val1.w4)
inputs.val1.w5 = increase(inputs.val1.w5)
endcase
endselect
endcase
case 1: // mate
select key
case 1:
inputs.val2.w1 = increase(inputs.val2.w1)
inputs.val2.w2 = decrease(inputs.val2.w2)
inputs.val2.w3 = decrease(inputs.val2.w3)
inputs.val2.w4 = decrease(inputs.val2.w4)
inputs.val2.w5 = decrease(inputs.val2.w5)
endcase
case 2:
inputs.val2.w1 = decrease(inputs.val2.w1)
inputs.val2.w2 = increase(inputs.val2.w2)
inputs.val2.w3 = decrease(inputs.val2.w3)
inputs.val2.w4 = decrease(inputs.val2.w4)
inputs.val2.w5 = decrease(inputs.val2.w5)
endcase
case 3:
inputs.val2.w1 = decrease(inputs.val2.w1)
inputs.val2.w2 = decrease(inputs.val2.w2)
inputs.val2.w3 = increase(inputs.val2.w3)
inputs.val2.w4 = decrease(inputs.val2.w4)
inputs.val2.w5 = decrease(inputs.val2.w5)
endcase
case 4:
inputs.val2.w1 = decrease(inputs.val2.w1)
inputs.val2.w2 = decrease(inputs.val2.w2)
inputs.val2.w3 = decrease(inputs.val2.w3)
inputs.val2.w4 = increase(inputs.val2.w4)
inputs.val2.w5 = decrease(inputs.val2.w5)
endcase
case 5:
inputs.val2.w1 = decrease(inputs.val2.w1)
inputs.val2.w2 = decrease(inputs.val2.w2)
inputs.val2.w3 = decrease(inputs.val2.w3)
inputs.val2.w4 = decrease(inputs.val2.w4)
inputs.val2.w5 = increase(inputs.val2.w5)
endcase
endselect
endcase
case 3: // enemy
select key
case 1:
inputs.val3.w1 = increase(inputs.val3.w1)
inputs.val3.w2 = decrease(inputs.val3.w2)
inputs.val3.w3 = decrease(inputs.val3.w3)
inputs.val3.w4 = decrease(inputs.val3.w4)
inputs.val3.w5 = decrease(inputs.val3.w5)
endcase
case 2:
inputs.val3.w1 = decrease(inputs.val3.w1)
inputs.val3.w2 = increase(inputs.val3.w2)
inputs.val3.w3 = decrease(inputs.val3.w3)
inputs.val3.w4 = decrease(inputs.val3.w4)
inputs.val3.w5 = decrease(inputs.val3.w5)
endcase
case 3:
inputs.val3.w1 = decrease(inputs.val3.w1)
inputs.val3.w2 = decrease(inputs.val3.w2)
inputs.val3.w3 = increase(inputs.val3.w3)
inputs.val3.w4 = decrease(inputs.val3.w4)
inputs.val3.w5 = decrease(inputs.val3.w5)
endcase
case 4:
inputs.val3.w1 = decrease(inputs.val3.w1)
inputs.val3.w2 = decrease(inputs.val3.w2)
inputs.val3.w3 = decrease(inputs.val3.w3)
inputs.val3.w4 = increase(inputs.val3.w4)
inputs.val3.w5 = decrease(inputs.val3.w5)
endcase
case 5:
inputs.val3.w1 = decrease(inputs.val3.w1)
inputs.val3.w2 = decrease(inputs.val3.w2)
inputs.val3.w3 = decrease(inputs.val3.w3)
inputs.val3.w4 = decrease(inputs.val3.w4)
inputs.val3.w5 = increase(inputs.val3.w5)
endcase
endselect
endcase
case 0:
select key
case 1:
inputs.val4.w1 = increase(inputs.val4.w1)
inputs.val4.w2 = decrease(inputs.val4.w2)
inputs.val4.w3 = decrease(inputs.val4.w3)
inputs.val4.w4 = decrease(inputs.val4.w4)
inputs.val4.w5 = decrease(inputs.val4.w5)
endcase
case 2:
inputs.val4.w1 = decrease(inputs.val4.w1)
inputs.val4.w2 = increase(inputs.val4.w2)
inputs.val4.w3 = decrease(inputs.val4.w3)
inputs.val4.w4 = decrease(inputs.val4.w4)
inputs.val4.w5 = decrease(inputs.val4.w5)
endcase
case 3:
inputs.val4.w1 = decrease(inputs.val4.w1)
inputs.val4.w2 = decrease(inputs.val4.w2)
inputs.val4.w3 = increase(inputs.val4.w3)
inputs.val4.w4 = decrease(inputs.val4.w4)
inputs.val4.w5 = decrease(inputs.val4.w5)
endcase
case 4:
inputs.val4.w1 = decrease(inputs.val4.w1)
inputs.val4.w2 = decrease(inputs.val4.w2)
inputs.val4.w3 = decrease(inputs.val4.w3)
inputs.val4.w4 = increase(inputs.val4.w4)
inputs.val4.w5 = decrease(inputs.val4.w5)
endcase
case 5:
inputs.val4.w1 = decrease(inputs.val4.w1)
inputs.val4.w2 = decrease(inputs.val4.w2)
inputs.val4.w3 = decrease(inputs.val4.w3)
inputs.val4.w4 = decrease(inputs.val4.w4)
inputs.val4.w5 = increase(inputs.val4.w5)
endcase
endselect
endcase
endselect
endfunction
//============================================================================================================================================
// Creature Creation functions
//============================================================================================================================================
function make_creature(sex,x,y,z,kingdom,speed,color,age,turnspeed,fov,sdist)
//===== MAKE A TREE =======
if kingdom = 1
if tree_population => max_trees then exitfunction
while OBJECT EXIST(count+tree_offset) = 1
inc count
endwhile
MAKE OBJECT cone count + tree_offset,50
COLOR OBJECT count+tree_offset,RGB(0,rnd(255),0)
POSITION OBJECT count+tree_offset,x,20,z
inc tree_population
endif
if population => max_creatures then exitfunction
count = 1
while OBJECT EXIST(count) = 1
inc count
endwhile
if kingdom = 0
sight = count + EYEOFFSET
MAKE OBJECT TRIANGLE sight,0,0,0,-(fov),0,sdist,fov,0,sdist
SET OBJECT collision to polygons sight
set OBJECT COLLISION off sight
HIDE OBJECT sight
animals(count).position.x = x
animals(count).position.z = z
animals(count).sex = rnd(1)
animals(count).speed = speed
animals(count).kingdom = kingdom
animals(count).color = color
animals(count).age = age
animals(count).health = max_health
animals(count).turn_speed = turnspeed
animals(count).fov = fov
animals(count).sight_dist = sdist
if animals(count).sex = 0
MAKE OBJECT cone count,25;
endif
if animals(count).sex = 1
MAKE OBJECT cone count,15;
endif
COLOR OBJECT count,color
POSITION OBJECT count,x,y,z
XROTATE OBJECT count,90
SET OBJECT cull count,0
FIX OBJECT PIVOT count
YROTATE OBJECT count,rnd(360)
inc population
endif
endfunction count
function breed(creature1, creature2)
Mr = 100
if animals(creature1).kingdom <> animals(creature2).kingdom then exitfunction
if population => max_creatures then exitfunction
nur = animals(creature1).neuron
if animals(creature1).kingdom = 0
count = make_creature(rnd(1),object position x(creature1),0,object position z(creature1),0,animals(creature1).speed + (rnd(2)-1),animals(creature1).color+ rgb(rnd(mr/100),rnd(mr/100),rnd(mr/100)),rnd(20),animals(creature1).turn_speed,animals(creature1).fov+(rnd(2)-1),animals(creature1).sight_dist+(rnd(2)-1))
animals(count).neuron = nur
POSITION OBJECT count,animals(count).position.x,0,animals(count).position.z
animals(count).neuron.val1.w1= (animals(creature1).neuron.val1.w1 + animals(creature2).neuron.val1.w1) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val1.w2= (animals(creature1).neuron.val1.w2 + animals(creature2).neuron.val1.w2) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val1.w3= (animals(creature1).neuron.val1.w3 + animals(creature2).neuron.val1.w3) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val1.w4= (animals(creature1).neuron.val1.w4 + animals(creature2).neuron.val1.w4) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val1.w5= (animals(creature1).neuron.val1.w5 + animals(creature2).neuron.val1.w5) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val2.w1= (animals(creature1).neuron.val2.w1 + animals(creature2).neuron.val2.w1) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val2.w2= (animals(creature1).neuron.val2.w2 + animals(creature2).neuron.val2.w2) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val2.w3= (animals(creature1).neuron.val2.w3 + animals(creature2).neuron.val2.w3) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val2.w4= (animals(creature1).neuron.val2.w4 + animals(creature2).neuron.val2.w4) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val2.w5= (animals(creature1).neuron.val2.w5 + animals(creature2).neuron.val2.w5) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val3.w1= (animals(creature1).neuron.val3.w1 + animals(creature2).neuron.val3.w1) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val3.w2= (animals(creature1).neuron.val3.w2 + animals(creature2).neuron.val3.w2) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val3.w3= (animals(creature1).neuron.val3.w3 + animals(creature2).neuron.val3.w3) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val3.w4= (animals(creature1).neuron.val3.w4 + animals(creature2).neuron.val3.w4) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val3.w5= (animals(creature1).neuron.val3.w5 + animals(creature2).neuron.val3.w5) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val4.w1= (animals(creature1).neuron.val4.w1 + animals(creature2).neuron.val4.w1) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val4.w2= (animals(creature1).neuron.val4.w2 + animals(creature2).neuron.val4.w2) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val4.w3= (animals(creature1).neuron.val4.w3 + animals(creature2).neuron.val4.w3) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val4.w4= (animals(creature1).neuron.val4.w4 + animals(creature2).neuron.val4.w4) / 2 + (mr - rnd(mr * 2))
animals(count).neuron.val4.w5= (animals(creature1).neuron.val4.w5 + animals(creature2).neuron.val4.w5) / 2 + (mr - rnd(mr * 2))
// animals(count).color = // (-5000 + (rnd(10000)))
// animals(creature1).neuron.val1.w1= animals(creature1).neuron.val1.w1 + animals(creature2).neuron.val1.w1= animals(creature2).neuron.val1.w1 / 2 + (mr - rnd(mr * 2))
// animals(creature1).neuron.val1.w2= animals(creature1).neuron.val1.w2 + animals(creature2).neuron.val1.w2= animals(creature2).neuron.val1.w2 / 2 + (mr - rnd(mr * 2))
// animals(creature1).neuron.val1.w3= animals(creature1).neuron.val1.w3 + animals(creature2).neuron.val1.w3= animals(creature2).neuron.val1.w3 / 2 + (mr - rnd(mr * 2))
// animals(creature1).neuron.val1.w4= animals(creature1).neuron.val1.w4 + animals(creature2).neuron.val1.w4= animals(creature2).neuron.val1.w4 / 2+ (mr - rnd(mr * 2))
// animals(creature1).neuron.val1.w5= animals(creature1).neuron.val1.w5 + animals(creature2).neuron.val1.w5= animals(creature2).neuron.val1.w5 / 2+ (mr - rnd(mr * 2))
//
// animals(count).neuron.val2.w1= animals(count).neuron.val2.w1+ (mr - rnd(mr * 2))
// animals(count).neuron.val2.w2= animals(count).neuron.val2.w2+ (mr - rnd(mr * 2))
// animals(count).neuron.val2.w3= animals(count).neuron.val2.w3+ (mr - rnd(mr * 2))
// animals(count).neuron.val2.w4= animals(count).neuron.val2.w4+ (mr - rnd(mr * 2))
// animals(count).neuron.val2.w5= animals(count).neuron.val2.w5+ (mr - rnd(mr * 2))
//
// animals(count).neuron.val3.w1= animals(count).neuron.val3.w1+ (mr - rnd(mr * 2))
// animals(count).neuron.val3.w2= animals(count).neuron.val3.w2+ (mr - rnd(mr * 2))
// animals(count).neuron.val3.w3= animals(count).neuron.val3.w3+ (mr - rnd(mr * 2))
// animals(count).neuron.val3.w4= animals(count).neuron.val3.w4+ (mr - rnd(mr * 2))
// animals(count).neuron.val3.w5= animals(count).neuron.val3.w5+ (mr - rnd(mr * 2))
//
// animals(count).neuron.val4.w1= animals(count).neuron.val4.w1+ (mr - rnd(mr * 2))
// animals(count).neuron.val4.w2= animals(count).neuron.val4.w2+ (mr - rnd(mr * 2))
// animals(count).neuron.val4.w3= animals(count).neuron.val4.w3+ (mr - rnd(mr * 2))
// animals(count).neuron.val4.w4= animals(count).neuron.val4.w4+ (mr - rnd(mr * 2))
// animals(count).neuron.val4.w5= animals(count).neuron.val4.w5+ (mr - rnd(mr * 2))
endif
endfunction
function SELECTIVE_BREEDING(creature)
count = 1
for count = 1 to max_creatures
while OBJECT EXIST(count) = 1
inc count
endwhile
if animals(count).kingdom = 0 then animals(count) = animals(creature)
next
endfunction
//============================================================================================================================================
// CORE Functions
//============================================================================================================================================
Function print_stats(creature1 as integer )
print "Creature:";creature1;" "
print "Type :";animals(creature1).kingdom;" ";
Print "Sex :";animals(creature1).sex;" ";
PRINT "Speed :";print_weight(animals(creature1).speed);" ";
print "Population:"; population;" ";
print "Health :";animals(creature1).health;" ";
print "AGE :";animals(creature1).age;" ";
print "Turn Speed :";animals(creature1).turn_speed
print "FOV :";animals(creature1).fov;" ";
print "Vision :";animals(creature1).sight_dist
print "Food :";animals(creature1).neuron.val1.w1;" :";animals(creature1).neuron.val1.w2;" :";animals(creature1).neuron.val1.w3;" :";animals(creature1).neuron.val1.w4;" :";animals(creature1).neuron.val1.w5
print "Mate :";animals(creature1).neuron.val2.w1;" :";animals(creature1).neuron.val2.w2;" :";animals(creature1).neuron.val2.w3;" :";animals(creature1).neuron.val2.w4;" :";animals(creature1).neuron.val2.w5
print "Enemy :";animals(creature1).neuron.val3.w1;" :";animals(creature1).neuron.val3.w2;" :";animals(creature1).neuron.val3.w3;" :";animals(creature1).neuron.val3.w4;" :";animals(creature1).neuron.val3.w5
print "Default :";animals(creature1).neuron.val4.w1;" :";animals(creature1).neuron.val4.w2;" :";animals(creature1).neuron.val4.w3;" :";animals(creature1).neuron.val4.w4;" :";animals(creature1).neuron.val4.w5
endfunction
function increase(var#)
val# = var# + (((10000-var#) / Learning_constant))
endfunction val#
function decrease(var#)
val# = var# - (var# / learning_constant)
endfunction val#
//========================== MOVE CREATURES ----------- MAIN LOOP -----------
function move_creatures()
do
SELECTED_CREATURE = PICK OBJECT(MOUSEX(),MOUSEY(),1, max_creatures)
for count = 1 to max_creatures
if OBJECT EXIST(count) = false then goto skip2
//======== SIGHT HANDLER ==================================================================
if animals(count).kingdom = 0
sight_handler(count,1)
//======== COLLISION HANDLER ==================================================================
XPos#=Object Position X(count):YPos#=Object Position Y(count):ZPos#=Object Position Z(count)
ANIMALS(count).POSITION.X = Object Position X(count):ANIMALS(count).POSITION.Y = Object Position Y(count):ANIMALS(count).POSITION.Z = Object Position Z(count)
collision = Object Collision(count,0)
If Collision > 0
Dec XPos#,Get Object Collision X()
Dec ZPos#,Get Object Collision Z()
Position Object count,XPos#,YPos#,ZPos#
if animals(count).kingdom = 0
//-------- EATING
if collision > max_creatures
inc animals(count).Health,500
DELETE OBJECT collision
dec tree_population
MAKE_creature(0,rnd(world_size*2),0,rnd(world_Size*2),1,0,0,0,0,0,0)
endif
if collision < max_creatures
//----- FIGHTING
if ANIMALS(count).sex = ANIMALS(collision).sex
dec ANIMALS(count).health,50
dec ANIMALS(collision).health,20
endif
//----- MATING
if ANIMALS(count).sex <> ANIMALS(collision).sex and ANIMALS(count).age > 200 and animals(count).health > max_health / 2
trigger = rnd(1000); if trigger > 100 then breed(count,collision) // How often they breed If greater then 900 for instance its 10% of the time they contact each other they breed
endif // END ANIMAL MATING LOOP
endif
endif // END OF MAIN COLLISION LOOP
endif // END OF IF CREATURE IS AN ANIMAL LOOP
endif
//======== END COLLISION HANDLER ==================================================================
//======== AGE HANDLER ==================================================================
inc animals(count).age
if animals(count).age > max_age then dec animals(count).health
if animals(count).kingdom = 0
if animals(count).health < 0
dec population
DELETE OBJECT count
DELETE OBJECT count + eyeoffset
endif
endif
//======== END AGE HANDLER ==================================================================
skip2:
next
if keystate(46) = true then last_select = 0 // if the C button is hit the Stats are cleared from the screen
if keystate(25) = true then pause(x#,y#) // If the P button is hit the game is paused
camera_controls()
print "FPS :";SCREEN FPS();" "
loop
endfunction
function pause(x#,y#)
wait 150
while keystate(25) = false
for count = 1 to max_creatures
AVGSPEED = AVGSPEED + animals(count).speed
AVGHEALTH = AVGHEALTH + animals(count).health
AVGAGE = AVGAGE + animals(count).AGE
AVGFOV = AVGFOV + animals(count).fov
AVGSIGHT = AVGSIGHT + animals(count).sight_dist
AVGTURN = AVGTURN + animals(count).turn_speed
// print "Food :";animals(creature1).neuron.val1.w1;" :";animals(creature1).neuron.val1.w2;" :";animals(creature1).neuron.val1.w3;" :";animals(creature1).neuron.val1.w4;" :";animals(creature1).neuron.val1.w5
// print "Mate :";animals(creature1).neuron.val2.w1;" :";animals(creature1).neuron.val2.w2;" :";animals(creature1).neuron.val2.w3;" :";animals(creature1).neuron.val2.w4;" :";animals(creature1).neuron.val2.w5
// print "Enemy :";animals(creature1).neuron.val3.w1;" :";animals(creature1).neuron.val3.w2;" :";animals(creature1).neuron.val3.w3;" :";animals(creature1).neuron.val3.w4;" :";animals(creature1).neuron.val3.w5
// print "Default :";animals(creature1).neuron.val4.w1;" :";animals(creature1).neuron.val4.w2;" :";animals(creature1).neuron.val4.w3;" :";animals(creature1).neuron.val4.w4;" :";animals(creature1).neuron.val4.w5
next
PRINT "AVERAGES"
PRINT "Speed :";AVGSPEED / MAX_CREATURES
print "Health :";AVGHEALTH / MAX_CREATURES
print "AGE :";AVGAGE / MAX_CREATURES
print "Turn Speed :";AVGTURN / MAX_CREATURES
print "FOV :";AVGFOV / MAX_CREATURES
print "Vision :";AVGSIGHT / MAX_CREATURES
AVGSPEED = 0
AVGHEALTH = 0
AVGAGE = 0
AVGFOV = 0
AVGSIGHT = 0
AVGTURN = 0
camera_controls()
print "Press P to unpause":
endwhile
wait 150
endfunction
function Camera_controls()
SELECTED_CREATURE = PICK OBJECT(MOUSEX(),MOUSEY(),1, max_creatures)
control camera using arrowkeys 1,10,1
IF camera position y(1) < (50+get ground height(1,camera position x(1),camera position z(1))) then position camera 1,camera position x(1),50+get ground height(1,camera position x(1),camera position z(1)),camera position z(1)
//IF CAMERA POSITION Y(1) = MATRIX POSITION Y(1) + 10 THEN POSITION CAMERA(1) CAMERA POSITION X,MATRIX POSITION Y(1) + 10,CAMERA POSITION Z(1)
mousex#=mousex#+mousemovey():
mousey#=mousey#+mousemovex():
rotate camera 1,mousex#,mousey#,0
set cursor 0,0
if mouseclick() = 1 and selected_creature > 0
last_select = selected_creature
endif
sight = last_select + eyeoffset
if last_select > 0 and OBJECT EXIST (sight) = 1
SHOW OBJECT sight
set OBJECT COLLISION on sight:set OBJECT COLLISION off Last_select
sees = object collision(sight,0)
Print "Creature Sees :"
if sees <> 0
if sees > tree_offset then print "Food"
if sees =<max_creatures
if animals(sees).sex <> animals(last_select).sex then print "Mate"
if animals(sees).sex = animals(last_select).sex then print "Enemy"
endif
endif
if sees = 0 then print "Nothing"
set OBJECT COLLISION off sight: SET OBJECT COLLISION ON Last_select
print_stats(last_select)
if object exist (last_select )
x=OBJECT POSITION X (last_select)
y=OBJECT POSITION y (last_select)
z=OBJECT POSITION z (last_select)
yrotate object sight, object angle y(last_select)
position object sight,x,y,z
POSITION CAMERA x,y,z
endif
endif
sync
if spacekey() = true then exitfunction
endfunction
function print_weight(weight)
if weight > 0
ink RGB(0,255,0),0
else
ink RGB(255,0,0),0
endif
endfunction weight
function save()
DELETE FILE "Creatures.dat"
MAKE FILE "Creatures.dat"
OPEN TO WRITE 1,"Creatures.dat"
WRITE BYTE 1,max_creatures
for count = 1 to max_creatures
count = 1
while OBJECT EXIST(count) = 1
inc count
endwhile
pop = pop + 1
next
endfunction
function load()
OPEN TO READ 1,"Creatures.dat"
READ BYTE 1, size
if ARRAY INDEX VALID(animals(1))then UNDIM animals();dim animals(size)
endfunction
// inputs.val1.value = 1
// inputs.val1.w1 = increase(inputs.val1.w1)
// inputs.val1.w2 = decrease(inputs.val1.w2)
// inputs.val1.w3 = decrease(inputs.val1.w3))
// inputs.val1.w4 = decrease(inputs.val1.w4)
// inputs.val1.w5 = inputs.val1.w5
//
// =================== 344 in move creatures
// for count = 1 to max_creatures
// brains(count,1,1) = inputs.val1.w1
// brains(count,1,2) = inputs.val1.w2
// brains(count,1,3) = inputs.val1.w3
// brains(count,1,4) = inputs.val1.w4
// brains(count,1,5) = inputs.val1.w5
//
// brains(count,2,1) = inputs.val1.w1
// brains(count,2,2) = inputs.val1.w2
// brains(count,2,3) = inputs.val1.w3
// brains(count,2,4) = inputs.val1.w4
// brains(count,2,5) = inputs.val1.w5
//
// brains(count,3,1) = inputs.val1.w1
// brains(count,3,2) = inputs.uval1.w2
// brains(count,3,3) = inputs.val1.w3
// brains(count,3,4) = inputs.val1.w4
// brains(count,3,5) = inputs.val1.w5
// next
// Key = sort_weights(animals(count).neuron.val1.w1,animals(count).neuron.val1.w2,animals(count).neuron.val1.w3,animals(count).neuron.val1.w4,animals(count).neuron.val1.w5)
//
// function sort_weights(w1,w2,w3,w4,w5)
//
// if w1> w2 and w1>w3 and w1> w4 and w1>w5 then ret = 1
// if w2> w1 and w2>w3 and w2> w4 and w2 > w5 then ret = 2
// if w3> w2 and w3>w1 and w3> w4 and w3>w5 then ret = 3
// if w4> w2 and w4>w3 and w4> w1 and w4>w5 then ret = 4
// if w5> w2 and w5>w3 and w5> w4 and w5>w1 then ret = 5
//
// endfunction ret
//========================594
// animals(count).neuron.val1.w1= animals(count).neuron.val1.w1
// animals(count).neuron.val1.w2= animals(count).neuron.val1.w2
// animals(count).neuron.val1.w3= animals(count).neuron.val1.w3
// animals(count).neuron.val1.w4= animals(count).neuron.val1.w4
// animals(count).neuron.val1.w5= animals(count).neuron.val1.w5
//
// animals(count).neuron.val2.w1= animals(count).neuron.val2.w1
// animals(count).neuron.val2.w2= animals(count).neuron.val2.w2
// animals(count).neuron.val2.w3= animals(count).neuron.val2.w3
// animals(count).neuron.val2.w4= animals(count).neuron.val2.w4
// animals(count).neuron.val2.w5= animals(count).neuron.val2.w5
//
// animals(count).neuron.val3.w1= animals(count).neuron.val3.w1
// animals(count).neuron.val3.w2= animals(count).neuron.val3.w2
// animals(count).neuron.val3.w3= animals(count).neuron.val3.w3
// animals(count).neuron.val3.w4= animals(count).neuron.val3.w4
// animals(count).neuron.val3.w5= animals(count).neuron.val3.w5
//304
// animals(count).neuron.val1.w1= 100
// animals(count).neuron.val1.w2= 0
// animals(count).neuron.val1.w3= 0
// animals(count).neuron.val1.w4= 0
// animals(count).neuron.val1.w5= 0
//
// animals(count).neuron.val2.w1= 0
// animals(count).neuron.val2.w2= 0
// animals(count).neuron.val2.w3= 0
// animals(count).neuron.val2.w4= 0
// animals(count).neuron.val2.w5= 0
//
// animals(count).neuron.val3.w1= 0
// animals(count).neuron.val3.w2= 0
// animals(count).neuron.val3.w3= 0
// animals(count).neuron.val3.w4= 0
// animals(count).neuron.val3.w5= 0
// animals(count).neuron.val1.w1= rnd(100)
// animals(count).neuron.val1.w2= rnd(100)
// animals(count).neuron.val1.w3= rnd(100)
// animals(count).neuron.val1.w4= rnd(100)
// animals(count).neuron.val1.w5= rnd(100)
//
// animals(count).neuron.val2.w1= rnd(100)
// animals(count).neuron.val2.w2= rnd(100)
// animals(count).neuron.val2.w3= rnd(100)
// animals(count).neuron.val2.w4= rnd(100)
// animals(count).neuron.val2.w5= rnd(100)
//
// animals(count).neuron.val3.w1= rnd(100)
// animals(count).neuron.val3.w2= rnd(100)
// animals(count).neuron.val3.w3= rnd(100)
// animals(count).neuron.val3.w4= rnd(100)
// animals(count).neuron.val3.w5= rnd(100)
Currently pretty long, 1000 lines or so but could be cleaned up a bit. I just been wanting to release this soon as possible because I have been saying a couple days for a few weeks since I started working on it lol. Enjoy and please please give some feed back, I am extremely new to Darkbasic and don't know half what I need to with this lang. Hell This is missing the all important Save creature feature that I want because I started to work on it today and realized and don't know squat about File IO in DBPro so any help in optimization mainly would be greatly appreciated