Isn't this challenge over?
At any rate, DD beat me to the character interaction part! However, I thought I'd use my own advice when TDK asked about the lowest point/path. Here's the story of the demo:
Blue just wants to take a walk and map out the lowest points in it's very bumpy world. However, blue's cousin red always wants to play and wants to be included in everything blue does so red follows blue around all the time. When blue gets fed up with red, blue decides to try and run away, but blue doesn't have as much stamina as red (that's what happens when you spend too much time programming and eating potatoe chips).
remstart
==============================================================
= Title : ai challenge
= Author : Latch Grapple
= Date : 02/25/2008
= Update :
= Version:
==============================================================
Comments
==============================================================
remend
rem =============================================================
rem = SET UP DISPLAY
rem =============================================================
autocam off
set display mode 800,600,32
sync on
sync rate 60
hide mouse
randomize timer()
rem =============================================================
rem = TEST DBC Version
rem =============================================================
tversion:
Print "Please Enter the version of DBC you are using"
Print "1 = DBC 1.13 or less"
Print "2 = DBC 1.20"
Input "version : ";a
if a < 1 or a > 2
cls
goto tversion
endif
if a=1 then version=113
if a=2 then version=120
cls
create bitmap 1,258,258
wait 0
`version=120
`version=113
rem =============================================================
rem = MAIN
rem =============================================================
_main:
gosub _init
`position camera 0,0,-50
do
gosub _move_main
gosub _ai_follow
sync
loop
end
rem =============================================================
rem = SUBROUTINES - PROCEDURES
rem =============================================================
_init:
gosub _ground
gosub _characters
gosub _lighting
position object 1,5000,30,5000
color backdrop RGB(128,128,255)
set text font "system",1
set text opaque
ink rgb(255,0,0),0
set current bitmap 0
return
`----------------------------------------------------------------
_ground:
ink rgb(100,100,100),0
box 0,0,100,100
for n=1 to 10
blur bitmap 1,3
next n
get image 3,0,0,112,112
sync
cls 0
make matrix 1,10000,10000,25,25
prepare matrix texture 1,3,1,1
randomize matrix 1,2000
calc_mat_normals(1,25,25,20.0,20.0)
update matrix 1
return
`----------------------------------------------------------------
_characters:
rem textures
ink 255,0
dot 0,0
get image 1,0,0,1,2
sync
cls
ink rgb(255,0,0),0
dot 0,0
get image 2,0,0,1,2
rem main character
make object sphere 1,25
make mesh from object 1,1
make object box 2,5,30,6
offset limb 2,0,0,-15,0
make mesh from object 2,2
delete object 2
add limb 1,1,2
add limb 1,2,2
add limb 1,3,1
offset limb 1,1,-6,-6,0
offset limb 1,2,6,-6,0
texture object 1,1
hide limb 1,0
rem animate
set object keyframe 1,0
rotate limb 1,1,30,0,0
rotate limb 1,2,330,0,0
offset limb 1,3,0,-5,0
set object keyframe 1,10
rotate limb 1,1,0,0,0
rotate limb 1,2,0,0,0
offset limb 1,3,0,0,0
set object keyframe 1,20
rotate limb 1,1,330,0,0
rotate limb 1,2,30,0,0
offset limb 1,3,0,-5,0
set object keyframe 1,30
rotate limb 1,1,359,0,0
rotate limb 1,2,1,0,0
offset limb 1,3,0,-.5,0
set object keyframe 1,38
scale object 1,400,400,400
set object speed 1,25
loop object 1
`hide object 1
rem enemy
make object sphere 2,25
add limb 2,1,2
add limb 2,2,2
add limb 2,3,1
delete mesh 1
delete mesh 2
offset limb 2,1,-6,-6,0
offset limb 2,2,6,-6,0
texture object 2,2
hide limb 2,0
`hide object 2
rem animate
set object keyframe 2,0
rotate limb 2,1,60,0,0
rotate limb 2,2,300,0,0
offset limb 2,3,0,-5,0
set object keyframe 2,10
rotate limb 2,1,0,0,0
rotate limb 2,2,0,0,0
offset limb 2,3,0,0,0
set object keyframe 2,20
rotate limb 2,1,300,0,0
rotate limb 2,2,60,0,0
offset limb 2,3,0,-5,0
set object keyframe 2,30
rotate limb 2,1,359,0,0
rotate limb 2,2,1,0,0
offset limb 2,3,0,-.5,0
set object keyframe 2,38
scale object 2,400,400,400
set object speed 2,35
loop object 2
rem collision
set object collision on 1
set object collision on 2
set object collision to boxes 1
set object collision to boxes 2
return
`---------------------------------------------------------------------
_move_main:
objx#=object position x(1)
objy#=object position y(1)
objz#=object position z(1)
if objx# > 10000 or objx# < 0 then objx#=5000 : objz#=5000
if objz# > 10000 or objz# < 0 then objz#=5000 : objx#=5000
oangy#=object angle y(1)
y#=get ground height(1,objx#,objz#)
position object 1,objx#,y#+140,objz#
if y# <= 50
move object 1,5
else
if y# >= oldy#
rem get the side heights to figure out which way to turn
rem left
newx=newxvalue(objx#,wrapvalue(oangy#-90),13)
newz=newzvalue(objz#,wrapvalue(oangy#-90),13)
lht=get ground height(1,newx,newz)
rem right
newx=newxvalue(objx#,wrapvalue(oangy#+90),13)
newz=newzvalue(objz#,wrapvalue(oangy#+90),13)
rht=get ground height(1,newx,newz)
if rht >= lht
anginc=-2.2
else
anginc=2.7
endif
yrotate object 1,wrapvalue(object angle y(1)+anginc)
move object 1,6
endif
endif
oldy#=y#
set camera to follow object position x(1),object position y(1),object position z(1),object angle y(1),500,objy#+100,100,0
`position camera object position x(1),object position y(1)+300,object position z(1)
`set camera to object orientation 1
`move camera -300
`point camera object position x(1),object position y(1),object position z(1)
return
`---------------------------------------------------------------
_ai_follow:
rem make object two chase object 1
objx#=object position x(1)
`objy#=object position y(1)
objz#=object position z(1)
enx#=object position x(2)
enz#=object position z(2)
ht#=get ground height(1,enx#,enz#)
position object 2,enx#,ht#+140,enz#
eny#=object position y(2)
dist#=sqrt((objx#-enx#)^2+(objz#-enz#)^2)
if dist# < 5000 and dist# > 800 then center text screen width()/2,100,"HEY WAIT UP!!!"
if dist# < 400 then center text screen width()/2,0,"HEY BLUE!!!!"
if dist# < 300 then center text screen width()/2,20,"IT'S ME, RED!!"
if dist# < 200
center text screen width()/2,40,"WHERE YA GOING??"
center text screen width()/2,60,"CAN I COME???"
center text screen width()/2,80,"CAN I? CAN I?"
endif
rem calculate a smooth angle to turn towards object 1
enangy#=object angle y(2)
point object 2,objx#,eny#,objz#
newangy#=object angle y(2)
yrotate object 2,enangy#
attackang#=curveangle(newangy#,enangy#,30)
yrotate object 2,attackang#
move object 2,12
bang=object hit(1,2)
if bang=1
inc count
if count >= 5
tim=timer()
count=0
endif
endif
if timer()-tim < 2000
set object speed 1,60
move object 1,15
yrotate object 1,wrapvalue(object angle Y(1)+rnd(6)-3)
else
set object speed 1,25
endif
return
`---------------------------------------------------------------
_lighting:
if version=120
set ambient light 30
color ambient light 0
`set directional light 0,1,-.5,1
make light 1
set directional light 1,1,-2,3
else
set ambient light 40
color ambient light rgb(180,180,180)
make light 1
set directional light 1,1,-.5,1
endif
return
rem =============================================================
rem = FUNCTIONS
rem =============================================================
Function calc_mat_normals(mat,tilex,tilez,sizex#,sizez#)
Rem By Lee Bamber From DB Example - Adds shaded areas to matrix to give depth
rem added tile and tile size factor for normal depth adjustment - latch
for z=1 to tilez
for x=1 to tilex
rem Get matrix heights
h8#=get matrix height(mat,x,z-1)
h4#=get matrix height(mat,x-1,z)
h#=get matrix height(mat,x-1,z-1)
h2#=get matrix height(mat,x,z)
rem Calculate projected angle X using heights
x1#=(x-1)*sizex# : y1#=h#
x2#=(x+0)*sizex# : y2#=h4#
dx#=x2#-x1#
dy#=y2#-y1#
ax#=atanfull(dx#,dy#)
ax#=wrapvalue(90-ax#)
rem Calculate projected angle Z using heights
z1#=(z-1)*sizez# : y1#=h2#
z2#=(z+0)*sizez# : y2#=h8#
dz#=z2#-z1#
dy#=y2#-y1#
az#=atanfull(dz#,dy#)
az#=wrapvalue(90-az#)
rem Make normal from projected angle
nx#=sin(ax#)
ny#=cos(ax#)
nz#=sin(az#)
rem Setting matrix normal for smoothness
set matrix normal mat,x,z,nx#,ny#,nz#
next x
next z
update matrix mat
EndFunction
rem =============================================================
rem = DATA STATEMENTS
rem =============================================================
Enjoy your day.