Thanks for the compliments
The final update includes:
-everything from 1 and 2.
-the enemy no patrols when he is unaware about you.
-while patrolling, if his hp is low he uses his heal.
-if he doesnt have the mp to heal, he will track down the appropriate healer (withing 1000 dist) and use it to heal himself.
If there are any bugs or glitches let me know, and ill fix them. Anyway, i hope you like it
`sets up initial program status
set display mode 1024,768,16
sync on
sync rate 60
hide mouse
autocam off
randomize timer()
set camera range 1,10000
`makes the ground texture
ink 0,0
box 0,0,64,64
ink rgb(25,25,25),0
box 1,1,63,63
ink rgb(50,50,50),0
box 2,2,62,62
ink rgb(75,75,75),0
box 3,3,61,61
ink rgb(100,100,100),0
box 4,4,60,60
ink rgb(125,125,125),0
box 5,5,59,59
ink rgb(150,150,150),0
box 6,6,58,58
ink rgb(175,175,175),0
box 7,7,57,57
get image 1,0,0,64,64
cls
`texture for box attack
ink rgb(100,80,0),0
box 0,0,64,64
ink rgb(130,120,0),0
box 5,5,59,59
ink rgb(80,70,0),0
box 15,15,49,49
get image 2,0,0,64,64
`makes level
make matrix 1,6000,6000,10,10
`load image "ground.bmp",1
prepare matrix texture 1,1,1,1
`makes player
make object cone 3,40
xrotate object 3,90
fix object pivot 3
`makes outside walls
make object cube 1,6000
texture object 1,1
scale object texture 1,10,10
set object 1,1,1,0,1,0
position object 1,3000,0,3000
`makes AI character
make object cone 2,40
xrotate object 2,90
fix object pivot 2
position object 2,3000,20,3000
color object 2,rgb(200,200,200)
`players shadow
make object cylinder 7,40
scale object 7,100,2,100
color object 7,rgb(40,40,40)
`players attack shadow
make object cube 8,50
scale object 8,100,2,100
color object 8,rgb(0,0,0)
hide object 8
`makes AI's shadow
make object cylinder 5,40
scale object 5,100,2,100
color object 5,rgb(40,40,40)
`makes AI attack object
make object cube 4,5
scale object 4,40,200,300
color object 4,rgb(0,0,0)
`makes player's attack object
make object cube 6,50
scale object 6,100,50,100
texture object 6,2
`makes 5 randomly placed mp heals
mp1x#=rnd(5800)+100
mp1z#=rnd(5800)+100
mp2x#=rnd(5800)+100
mp2z#=rnd(5800)+100
mp3x#=rnd(5800)+100
mp3z#=rnd(5800)+100
mp4x#=rnd(5800)+100
mp4z#=rnd(5800)+100
mp5x#=rnd(5800)+100
mp5z#=rnd(5800)+100
for healer=10 to 14
make object cone healer,150
xrotate object healer,180
next healer
color object 10,rgb(255,100,100)
color object 11,rgb(255,100,100)
color object 12,rgb(255,100,100)
color object 13,rgb(100,255,100)
color object 14,rgb(100,255,100)
position object 10,mp1x#,get ground height(1,mp1x#,mp1z#),mp1z#
position object 11,mp2x#,get ground height(1,mp2x#,mp2z#),mp2z#
position object 12,mp3x#,get ground height(1,mp3x#,mp3z#),mp3z#
position object 13,mp4x#,get ground height(1,mp4x#,mp4z#),mp4z#
position object 14,mp5x#,get ground height(1,mp5x#,mp5z#),mp5z#
`AI ENEMY STATS
`health
enemy_hp=1200
enemy_maxhp=1200
`magic points
enemy_mp=120
enemy_maxmp=120
`damage dealt on normal attack
enemy_strength=10
`sets AI reaction and movement variables
aware=0
`the distance infront of the enemy used for his sight, same effects as hearing.
sight_distance#=750
`a distance around the enemy used for hearing. if you step within it, the enemy will become aware of your presence.
hearing_distance#=300
`the distance at which the enemy stops following you (gives up)
max_range#=1000
AI_attacktime=10
AI_weight=5
AI_walkingspeed=7
`AI healing ability
enemy_heal_effect=45
enemy_heal_mpuse=20
enemy_heal_speed=100
`PLAYER STATS
`health
hp=1000
maxhp=1000
`magic points
mp=150
maxmp=150
`damage dealt on normal attack
strength=15
`character variables
`how fast the player walks
player_walkingspeed=10
weight=5
`how high player jumps
player_jumpforce=23
`how fast the players attack is
player_attacktime=20
`player healing ability
`how many points to heal
heal_effect=50
`how much mp used
heal_mpuse=20
`how long it takes
heal_speed=60
`action shortcuts
stand=0
jump=1
walk=2
heal=3
attack=4
limit=5
`sets gravity
gravity=-5
lcount=-100
`text color
ink rgb(200,50,50),0
position object 3,0,0,0
do
gosub player_movement
gosub AI_player
gosub healers
gosub debug_info
gosub rules
`gets distance between player and AI player
distance#=sqrt((object position x(3)-object position x(2))^2+(object position y(3)-object position y(2))^2+(object position z(3)-object position z(2))^2)
sync
loop
debug_info:
ink 0,0
box 3,1,142,187
box 893,1,1007,72
ink rgb(100,100,100),0
box 5,3,140,185
box 895,3,1005,70
ink rgb(255,255,255),0
text 10,5,"-Player Stats-"
text 10,20,"Hp:"+str$(hp)+"/"+str$(maxhp)
text 10,35,"Mp:"+str$(mp)+"/"+str$(maxmp)
if action=0 then text 10,50,"Action:Standing"
if action=1 then text 10,50,"Action:Jumping"
if action=2 then text 10,50,"Action:Walking"
if action=3 then text 10,50,"Action:Healing"
if action=4 then text 10,50,"Action:Attacking"
text 900,2,"-Enemy Stats-"
text 900,20,"Hp:"+str$(enemy_hp)+"/"+str$(enemy_maxhp)
text 900,35,"Mp:"+str$(enemy_mp)+"/"+str$(enemy_maxmp)
if goal=0
if eaction=0 then text 900,50,"Action:Standing"
if eaction=1 then text 900,50,"Action:Jumping"
if eaction=2 and emovement_action=1 then text 900,50,"Action:Following"
if eaction=2 and emovement_action=0 then text 900,50,"Action:Escaping"
if eaction=3 then text 900,50,"Action:Healing"
if eaction=4 then text 900,50,"Action:Attacking"
else
text 900,50,"Action:Patrol"
endif
text 10,80,"-Player Controls-"
text 10,95,"Mouse:Turn"
text 10,110,"Mousebuttons:Move"
text 10,125,"Spacebar:Jump"
text 10,140,"Enter:Attack"
text 10,155,"Control:Heal"
text 10,170,"Shift:Limit"
return
player_movement:
`gets players old values
oldx#=x#
oldy#=y#
oldz#=z#
`movement and rotation
if action=stand or action=walk or action=jump
if upkey()=1
move object 3,player_walkingspeed
if action=0 then action=2
endif
if downkey()=1
move object 3,-1*player_walkingspeed
if action=0 then action=2
endif
if upkey()=0 and downkey()=0 and action=2 then action=0
endif
`turning player
if action<>attack
if leftkey()=1 then yrotate object 3,wrapvalue(object angle y(3)-5)
if rightkey()=1 then yrotate object 3,wrapvalue(object angle y(3)+5)
endif
`gets camera variables
x#=object position x(3)
y#=object position y(3)
z#=object position z(3)
yr#=object angle y(3)
camyr#=wrapvalue(curveangle(yr#,camera angle y(),12.0))
camx#=newxvalue(x#,wrapvalue(camyr#+180),300)
camz#=newzvalue(z#,wrapvalue(camyr#+180),300)
camy#=get ground height(1,camx#,camz#)+200
if camx#>5900 then camx#=5900
if camx#<100 then camx#=100
if camz#>5900 then camz#=5900
if camz#<100 then camz#=100
if camy#>2800 then camy#=2800
position camera camx#,camy#,camz#
point camera x#,y#,z#
yrotate camera wrapvalue(camyr#)
`calculates standing and jumping
if action=stand or action=walk then y#=get ground height(1,x#,z#)+20
`jump with out flying
if action=jump then y#=oldy#:gravity_force=gravity_force+(gravity/10):y#=y#+gravity_force+vertforce
`starting an attack
if returnkey()=1
if action=stand or action=walk then action=attack
endif
`starting a heal
if controlkey()=1 and mp=>heal_mpuse
if action=stand or action=walk then action=heal
endif
`starting a limit break
if shiftkey()=1 and mp>20
if action=stand or action=walk then action=limit
endif
`going to various abilities
gosub attack
gosub heal
gosub limit
`sliding collision with walls and roof
if x#>5900 then x#=5900
if x#<100 then x#=100
if z#>5900 then z#=5900
if z#<100 then z#=100
if y#>2800 then y#=2800
`jumping, gravity and staying on the ground
if vertforce>0 then dec vertforce
if y#<get ground height(1,x#,z#)+20 then action=stand
`starting a jump
if spacekey()=1
if action=stand or action=walk
vertforce=player_jumpforce
action=jump
gravity_force=gravity
endif
endif
`sliding collision with AI player
dx#=object position x(3)-object position x(2)
dz#=object position z(3)-object position z(2)
`moving player away
if dx#<25 and dx#>0 and dy#>-25 and dy#<20 and z#>az#-25 and z#<az#+25 then x#=ax#+25
if dx#>-25 and dx#<0 and dy#>-25 and dy#<20 and z#>az#-25 and z#<az#+25 then x#=ax#-25
if dz#<25 and dz#>0 and dy#>-25 and dy#<20 and x#>ax#-25 and x#<ax#+25 then z#=az#+25
if dz#>-25 and dz#<0 and dy#>-25 and dy#<20 and x#>ax#-25 and x#<ax#+25 then z#=az#-25
`positioning camera in final position
position object 3,x#,y#,z#
`positions players shadow
position object 7,x#,get ground height(1,x#,z#)+1,z#
return
AI_player:
`gets the AI player's current position into variables.
ax#=object position x(2)
ay#=object position y(2)
az#=object position z(2)
ary#=object angle y(2)
`stores old AI positions
oldax#=ax#
olday#=ay#
oldaz#=az#
`makes enemy patrol if it is unaware that you are around, and if its hp is less than 50% it will heal.
if aware=0
if enemy_hp>enemy_maxhp/2
gosub enemy_patrol
else
if enemy_mp=>enemy_heal_mpuse
eaction=heal
gosub enemy_heal
else
gosub enemy_patrol
endif
endif
endif
`things to do if the AI player is aware that the main player exists.
if aware=1
`points and AI object towards player if it is aware, and moves it if it's not in attack range.
point object 2,x#,y#,z#
goal=0
if eaction=walk or eaction=stand
`enemy will run away if it's hp is less than 25%, if not it will keep chasing you
if enemy_hp>enemy_maxhp*0.30
if range=0 then emovement_action=1:eaction=walk
else
emovement_action=0:eaction=walk
endif
gosub enemy_follow
gosub enemy_escape
endif
if range=1
`attacks player if it is aware, in range, and facing the right angle
if eaction=stand or eaction=walk
if enemy_hp>enemy_maxhp*0.30 then eaction=attack
endif
endif
`makes enemy unaware when it is past it's max range, so it won't chase you forever.
if distance#>max_range# then aware=0
endif
`enemy heals itself
if enemy_hp<enemy_maxhp*0.3
if distance#>500
if eaction<>jump and enemy_mp=>enemy_heal_mpuse then eaction=heal
endif
endif
`goes to ability code and checks the eaction
gosub enemy_attack
gosub enemy_heal
`if Ai player hears the main player then it is aware
if distance#<hearing_distance# then aware=1:text 200,30,"You are in AI player's hearing range!"
`if AI player sees the main player then it is aware.
if distance#<sight_distance#
position camera ax#,ay#,az#
yrotate camera ary#
if object in screen(3)=1 then aware=1:text 200,45,"You are in AI player's seeing range!"
position camera camx#,camy#,camz#
yrotate camera camyr#
endif
`checks to see if player and enemy are in range
if distance#<=50
range=1
else
range=0
endif
`sliding collision with walls and roof
if ax#>5900 then ax#=5900
if ax#<100 then ax#=100
if az#>5900 then az#=5900
if az#<100 then az#=100
if ay#>2800 then ay#=2800
`poisitons and rotates enemy and it's shadow
position object 2,ax#,ay#,az#
yrotate object 2,ary#
position object 5,ax#,get ground height(1,ax#,az#)+1,az#
return
`a healing ability that takes mp - used by the enemy
enemy_heal:
if enemy_mp+enemy_heal_mpuse=>enemy_heal_mpuse
if eaction=heal and ehealcount=0 then dec enemy_mp,enemy_heal_mpuse:ehealcount=enemy_heal_speed
if ehealcount>0
color object 2,rgb(rnd(100)+100,rnd(100)+100,rnd(100)+100)
eaction=heal
scale object 2,100,ehealcount*3+100,100
dec ehealcount
if ehealcount=0
inc enemy_hp,enemy_heal_effect
if enemy_hp>enemy_maxhp then enemy_hp=enemy_maxhp
color object 2,rgb(100,100,100)
eaction=stand
endif
endif
else
scale object 2,100,100,100
endif
return
`a healing ability that takes mp - used by player
heal:
if mp+heal_mpuse=>heal_mpuse
if action=heal and healcount=0 then dec mp,heal_mpuse:healcount=heal_speed
if healcount>0
color object 3,rgb(rnd(100)+100,rnd(100)+100,rnd(100)+100)
scale object 3,healcount*2+100,healcount*2+100,healcount*2+100
action=heal
dec healcount
if healcount=0
scale object 3,100,100,100
color object 3,rgb(200,200,200)
inc hp,heal_effect
if hp>maxhp then hp=maxhp
action=stand
endif
endif
endif
return
`a normal attack by the enemy
enemy_attack:
if eaction=attack and eattackcount=0 then eattackcount=AI_attacktime
if eattackcount>0
eaction=attack
`dealing damage
if eattackcount=1 and distance#<55 then dec hp,enemy_strength
show object 4
position object 4,ax#,ay#+eattackcount*4-15,az#
yrotate object 4,ary#
move object 4,20
color object 2,rgb(255,100,100)
dec eattackcount
if eattackcount=0 then eaction=stand:color object 2,rgb(100,100,100)
else
hide object 4
endif
return
`a normal attack by the player
attack:
if action=attack and attackcount=0 then attackcount=player_attacktime
if attackcount>0
action=attack
show object 6
show object 8
position object 6,x#,y#+(attackcount*5),z#
position object 8,x#,get ground height(1,x#,z#)+1,z#
yrotate object 6,yr#
yrotate object 8,yr#
move object 6,50
move object 8,50
dec attackcount
`dealing damage and ending attack
if attackcount=0
if distance#<70 and object in screen(2)=1 then dec enemy_hp,strength
action=stand
endif
else
hide object 6
hide object 8
endif
return
enemy_patrol:
if goal=0
goalx#=rnd(5800)+100
goalz#=rnd(5800)+100
goal=1
endif
if goal=1
point object 2,goalx#,get ground height(1,goalx#,goalz#),goalz#
move object 2,AI_walkingspeed
ax#=object position x(2)
ay#=get ground height(1,ax#,az#)+20
az#=object position z(2)
ary#=object angle y(2)
for check=10 to 14
if object exist(check)=1
if goalx#=object position x(check)
if goalz#=object position x(check) then goto noheal
endif
endif
next check
for check=10 to 14
if object exist(check)=1
if ax#>object position x(check)-1000 and ax#<object position x(check)+1000 and az#>object position z(check)-1000 and az#<object position z(check)+1000
if check<13 and check>9
if enemy_hp<enemy_maxhp/2
goalx#=object position x(check)
goalz#=object position z(check)
endif
else
if enemy_mp<enemy_maxmp/2
goalx#=object position x(check)
goalz#=object position z(check)
endif
endif
endif
endif
next check
noheal:
`it gets to its goal
if ax#>goalx#-10 and ax#<goalx#+10 and az#>goalz#-10 and az#<goalz#+10
goal=0
endif
endif
return
`the enemy's movement to follow you
enemy_follow:
if emovement_action=1 and eaction=walk
move object 2,AI_walkingspeed
ax#=object position x(2)
ay#=get ground height(1,ax#,az#)+20
az#=object position z(2)
ary#=object angle y(2)
endif
return
`the enemy's movement to run away from you
enemy_escape:
if emovement_action=0 and eaction=walk
yrotate object 2,wrapvalue(object angle y(2)-180)
move object 2,AI_walkingspeed
ax#=object position x(2)
ay#=get ground height(1,ax#,az#)+20
az#=object position z(2)
ary#=object angle y(2)
if distance#>max_range#-100 then aware=0:
if needheal=1 and distance#>400 then eaction=heal
endif
return
healers:
for healer=10 to 14
if object exist(healer)=0 then goto nexthealplayer
if object position x(3)>object position x(healer)-40 and object position x(3)<object position x(healer)+40
if object position z(3)>object position z(healer)-40 and object position z(3)<object position z(healer)+40
if healer<13 then inc hp,maxhp/4 else inc mp,maxmp/4
delete object healer
endif
endif
nexthealplayer:
next healer
for healer=10 to 14
if object exist(healer)=0 then goto nexthealenemy
if object position x(2)>object position x(healer)-40 and object position x(2)<object position x(healer)+40
if object position z(2)>object position z(healer)-40 and object position z(2)<object position z(healer)+40
if healer<13 then inc enemy_hp,enemy_maxhp/4 else inc enemy_mp,enemy_maxmp/4
delete object healer
endif
endif
nexthealenemy:
next healer
return
rules:
if enemy_hp>enemy_maxhp then enemyhp=enemy_maxhp
if enemy_mp>enemy_maxmp then enemy_mp=enemy_maxmp
if hp>maxhp then hp=maxhp
if mp>maxmp then mp=maxmp
if enemy_hp<1 then goto victory
if hp<1 then goto gameover
return
victory:
text object screen x(2),object screen y(2),"You win!!"
ghost object on 2
sync
wait 500
for explosion=1 to 30
make object sphere explosion+20,50
position object explosion+20,ax#,ay#,az#
yrotate object explosion+20,wrapvalue(explosion*36)
next explosion
delete object 2
delete object 4
delete object 5
delete object 6
a=100
do
a=a+2
for move_explosion=1 to 30
move object move_explosion+20,1
color object move_explosion+20,rgb(rnd(100)+100,rnd(100)+100,rnd(100)+100)
next move_explosion
set gamma a,a,a
if a=500 then exit
sync
loop
goto ending
limit:
if action=limit and lcount=-100
for crates=1 to 10
make object cube crates+100,rnd(15)+40
texture object crates+100,2
next crates
make object cylinder 111,150
color object 111,rgb(255,255,180)
ghost object on 111
scale object 111,100,500,100
oldmp=mp
lcount=200
endif
if lcount>-100
action=limit
if lcount<50 and mp>0 then dec mp:dec enemy_hp,6
if lcount>0
for position=1 to 10
position object position+100,ax#+rnd(4)-2,ay+(lcount*3)-position*50,az#+rnd(4)-2
next position
position object 111,ax#,ay#,az#
position camera camera position x()+rnd(10),camera position y()+rnd(10),camera position z()+rnd(10)
endif
dec lcount
if lcount<0
scale object 111,lcount+100,500,lcount+100
endif
`dealing damage and ending attack
if lcount=-100
for decrates=1 to 11
delete object decrates+100
next decrates
dec enemy_hp,mp
action=stand
endif
endif
return
gameover:
a=255
do
move camera rnd(5)-2.5
rotate camera wrapvalue(camera angle x()+rnd(5)-2.5),wrapvalue(camera angle y()+rnd(5)-2.5),wrapvalue(camera angle z()+rnd(5)-2.5)
if camera position x()<100 then position camera 100,camera position y(),camera position z()
if camera position x()>900 then position camera 900,camera position y(),camera position z()
if camera position z()<100 then position camera camera position x(),camera position y(),100
if camera position z()>900 then position camera camera position x(),camera position y(),900
if camera position y()<get ground height(1,camera position x(),camera position z() )+10 then position camera camera position x(),get ground height(1,camera position x(),camera position z() )+10,camera position z()
set gamma a,a,a
dec a,2
if a<=5 then exit
sync
loop
wait 500
set gamma 255,255,255
ending:
.........what's the point of reading this?