Well ...the problem you had in your collision checking, was that you add two more objects (your catwalk and second floor)
Those object has number 57 & 58, and if you want to climb on them, you can not check...
if object collision(lift,58)>0
Camera has not collision at all, so the object helper(889), is to check if camera have any collision with the lift. It would be better to say camera helper than lift helper, but in the other case, we had just one object to climb...now we have three.
The way you have to do it, is check if object helper is colliding with any object you want to climb like 57 and 58 + lift but they are not consecutive numbers.
So we have to copy the same conditions for the lift to apply to objects 57&58.
for i= 57 to 58
if object collision(i,889)>0 bla bla bla....
next i
With this bucle we add same codition to all object into it.
I have made some arrangements to the code, and I add different speed to the goblyn (
Move Object 3,3+rnd(2)) to leave me breathe

.
The code needs to add even gravity, but it works. Here is the code.
Rem Setup sync
Sync On
Sync Rate 30
Draw to front
Backdrop on
Set camera range 1,3000
Autocam off
Hide mouse
Fog on
Fog distance 3000
Fog color RGB(128,128,128)
Color Backdrop RGB(128,128,128)
Rem make matrix
Make matrix 1,10000,10000,20,20
Rem texture matrix
Load image "grass09.bmp",1
Prepare matrix texture 1,1,1,1
Fill matrix 1,0,1
rem Make Gun
Make object cylinder 1,2
XRotate Object 1,90
Fix object pivot 1
Scale object 1,500,500,500
position object 1,5,-7,15
Lock object on 1
rem make HUD
Make object Plain 200,1,1
position object 200,-2.7,1.9,4
Lock object on 200
ghost object on 200
Make object Plain 201,1,1
position object 201,2.7,1.9,4
Lock object on 201
ghost object on 201
Load image "score.bmp",201
rem Load and create hud bitmaps.
Load Bitmap "Radar.bmp",2
Create Bitmap 1,50,50
rem fire texture
Load Image "fire.bmp",2
rem Make Bullet
Make Object Sphere 2,2
texture object 2,2
Hide Object 2
rem Make MonsterBullet
Make Object Sphere 102,2
texture object 102,2
Hide Object 102
rem Make Explosion
Make Object Sphere 30,20
texture object 30,2
ghost object on 30
Hide Object 30
Make Object Sphere 31,20
texture object 31,2
ghost object on 31
Hide Object 31
rem Make Monster Explosion
Make Object Sphere 130,20
texture object 130,2
ghost object on 130
Hide Object 130
Make Object Sphere 131,20
texture object 131,2
ghost object on 131
Hide Object 131
rem load particles
For x = 0 to 10
Make object plain x+10,5,5
Texture object x+10,2
Set object x+10,1,0,0
Ghost object on x+10
Hide object x+10
Next x
rem load Monsterparticles
Load Image "fire.bmp",2
For x =100 to 110
Make object plain x+10,5,5
Texture object x+10,2
Set object x+10,1,0,0
Ghost object on x+10
Hide object x+10
Next x
rem intialize particle counter
Pn=10
MPn=110
rem load sounds
Load sound "crickets.wav",1
Loop sound 1
Load 3Dsound "fireball2.wav",2
Load 3Dsound "fireball2.wav",102
Load 3Dsound "Explode.wav",3
Load 3Dsound "Explode.wav",103
rem Randomize the matrix
randomize matrix 1,125
rem create decorative objects
load image "cottag02.bmp",300
t=300
For x = 1 to 9
For z = 1 to 9
Make object cube t,100
Scale object t,100,600,100
y = get ground height(1,x*1000,z*1000)
position object t,x*1000,y+275,z*1000
texture object t,300
scale object texture t,1,-6
inc t
next z
next x
Rem Load Target
Load object "idle.x",3
Append Object "Walk.x",3,21
Yrotate object 3,180
Fix Object Pivot 3
Loop Object 3
mX# = 5000
mZ# = 5000
mY# = Get Ground Height(1,5000,5000)
X# = 5500
Y# = Get Ground Height(1,5500,5500)
Z# = 5500
MonsterScore=0
PlayerScore=0
Gosub PlaceMonster
Gosub PlacePlayer
`WATER
make object plain 77,10000,10000
ghost object on 77
color object 77, rgb(0,0,255)
xrotate object 77,90
position object 77,5000,20,5000
`catwalk
make object box 58,50,10,1340:position object 58,50,320,750:texture object 58,300
`second floor
make object box 57,200,10,200:position object 57,50,320,0:texture object 57,300
`lift
lift=888
make object box lift,200,10,200
position object lift,0,0,1500
`lift helper to check collision if we are on the lift
make object box 889,5,100,5:hide object 889
Rem Main loop
Do
`elevator moving up & down
`lift movements
cron=cron+1
if cron<330 then inc lifty
if cron>330 then dec lifty
lx=object position x(lift)
lz=object position z(lift)
my_floor= get ground height(1,lx,lz)
if object position y(lift)<my_floor then cron=0
position object lift,0,lifty,1500
position object 889,x#,y#,z#
rem if object collision(888,889)>0 then y#=object position y(888)
rem if object collision(57,889)>0 then y#=object position y(57)
`position object cAY#,caX#,caZ#,x,y#+2.5,z
set cursor 550,20
print "MScore: ",MonsterScore
set cursor 550,40
print "PScore: ",PlayerScore
print total object frames(3)
oldcAY# = cAY#
oldcAX# = cAX#
oldX#=X#
oldY#=Y#
oldZ#=Z#
cAY# = WrapValue(cAY#+MousemoveX()*0.5)
cAX# = WrapValue(cAX#+MousemoveY()*0.5)
caZ# = Camera angle Z()
Rem Control input for camera
If Upkey()=1
XTest# = Newxvalue(X#,cAY#,7)
ZTest# = Newzvalue(Z#,cAY#,7)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
X#=XTest#
Z#=ZTest#
Endif
Endif
If Downkey()=1
XTest# = Newxvalue(X#,Wrapvalue(cAY#-180),7)
ZTest# = Newzvalue(Z#,Wrapvalue(cAY#-180),7)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
X#=XTest#
Z#=ZTest#
Endif
Endif
If Leftkey()=1
XTest# = Newxvalue(X#,Wrapvalue(cAY#-90),7)
ZTest# = Newzvalue(Z#,Wrapvalue(cAY#-90),7)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
X#=XTest#
Z#=ZTest#
Endif
Endif
If Rightkey()=1
XTest# = Newxvalue(X#,Wrapvalue(cAY#+90),7)
ZTest# = Newzvalue(Z#,Wrapvalue(cAY#+90),7)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
X#=XTest#
Z#=ZTest#
Endif
Endif
Rem Rotate camera
cTestX#=WrapValue(cAX#-180)
if cTestX# > 225 then cAX#=45
if cTestX# < 135 then cAX#=315
YRotate camera CurveAngle(cAY#,oldcAY#,24)
XRotate camera CurveAngle(cAX#,oldcAX#,24)
Y# = Get ground height(1,X#,Z#)+35
rem collision detection
if DecoCollide(X#,Y#,Z#) = 1
X#=oldX#
Y#=oldY#
Z#=oldZ#
Endif
Rem Position Camera
Position Camera X#,Y#,Z#
rem condition for going up and down with lift
if object collision(lift,889)>0 then position camera x#,object position y(lift)+50,z#:position object 889,x#,object position y(lift)-50,z#:y#=camera position y()
`collision of object helper with catwalk and second floor
for i= 57 to 58
if object collision(i,889)>0 then position camera x#,object position y(i)+50,z#:position object 889,x#,object position y(i)+50,z#:y#=camera position y()
next i
Rem Position Listener
Position Listener X#,Y#,Z#
Rotate Listener 0,cAY#,0
Rem Shoot bullet
if Mouseclick()=1 and Explode =0
if BulletLife=0 or BulletLife<50
Position object 2,X#,Y#-7,Z#
Set object to camera orientation 2
BulletLife =120
show object 2
Loop sound 2
Endif
Endif
If BulletLife > 0 then Gosub ShootBullet
If MonsterBulletLife > 0 then Gosub MonsterShootBullet
If Explode > 0 then Gosub ExplodeRocket
If MonsterExplode > 0
Gosub MonsterExplodeRocket
else
Gosub MonsterAI
Endif
Rem make radar
Copy Bitmap 2,1
set current bitmap 1
ink rgb(0,0,255),rgb(0,0,0)
PRX#=X#/200
PRZ#=50-(Z#/200)
Circle PRX#,PRZ#,1
ink rgb(255,0,0),rgb(0,0,0)
MRX#=mX#/200
MRZ#=50-(mZ#/200)
Circle MRX#,MRZ#,1
Get image 200,0,0,50,50
set current bitmap 0
texture object 200,200
ink rgb(255,128,128),rgb(0,0,0)
Rem Refresh Screen
Sync
Loop
Rem Shoot player bullet
ShootBullet:
Dec BulletLife
Move object 2,100
bX#=Object position X(2)
bY#=Object position Y(2)
bZ#=Object position Z(2)
inc Pn
if Pn=21 then Pn=10
Scale object Pn,100,100,100
Position object Pn,bX#,bY#,bZ#
point object Pn,X#,Y#,Z#
Zrotate object Pn,rnd(180)
Show object Pn
for x = 1 to 10
scale object int((Wrapvalue((Pn-9+x)*36))/36)+10,100+x*25,100+x*25,100+x*25
set cursor 10,10
next x
if bY# < Get Ground height(1,bX#,bZ#) then BulletLife=0
Position sound 2,bX#,bY#,bZ#
set cursor 10,10
if Sqrt((mX# - bX#)^2 + (mY#+25 - bY#)^2 + (mZ# - bZ#)^2) <20
Gosub PlaceMonster
inc PlayerScore
MonsterBulletLife = 1
BulletLife=0
endif
if DecoCollide(bX#,bY#,bZ#) = 1 then BulletLife = 0
if BulletLife = 0
Hide object 2
stop sound 2
for x=10 to 20
hide object x
next x
Explode = 20
endif
Return
Rem Explode bullet
ExplodeRocket:
Position object 30,bX#,bY#,bZ#
Show object 30
Position object 31,bX#,bY#,bZ#
Show object 31
EScale=20*(30-Explode)
Scale object 30,EScale,EScale,EScale
Yrotate object 30,WrapValue(Explode*37)
Scale object 31,EScale/1.5,EScale/1.5,EScale/1.5
Yrotate object 31,WrapValue(359-Explode*37)
Dec Explode
If Explode = 0 then hide object 30: Hide object 31
If Explode=18
position sound 3,bX#,bY#,bZ#
play sound 3
endif
If Explode < 15 then position sound 3,X#,Y#,Z#
Return
Rem Explode monster bullet
MonsterExplodeRocket:
Position object 130,MbX#,MbY#,MbZ#
Show object 130
Position object 131,MbX#,MbY#,MbZ#
Show object 131
EScale=20*(30-MonsterExplode)
Scale object 130,EScale,EScale,EScale
Yrotate object 130,WrapValue(MonsterExplode*37)
Scale object 131,EScale/1.5,EScale/1.5,EScale/1.5
Yrotate object 131,WrapValue(359-MonsterExplode*37)
Dec MonsterExplode
If MonsterExplode = 0 then hide object 130: Hide object 131
If MonsterExplode=18
position sound 103,X#,Y#,Z#
play sound 103
endif
If MonsterExplode < 15 then position sound 103,X#,Y#,Z#
Return
Rem Simple AI for guided monster misile
MonsterAI:
Point object 3,X#,Y#,Z#
If AvoidDeco >0
mA# = Object Angle Y(3)
Dec AvoidDeco
Yrotate object 3,WrapValue(mA#+AvoidDeco*60)
endif
Rem Position Monster at new location
Position Object 3,mX#,mY#,mZ#
Rem check distance from player
PDist=Sqrt((mX# - X#)^2 + (mY#+25 - Y#)^2 + (mZ# - Z#)^2)
Rem If the player is within range shoot bullet
if PDist<1500
if MonsterBulletLife=0 or MonsterBulletLife < 500-Pdist/10
Point object 3,X#,Y#-25,Z#
If BulletAvoidDeco > 0
CornerAim = Rnd(1)
mA# = object angle Y(3)
if CornerAim = 0 then Yrotate Object 3,WrapValue(mA#+BulletAvoidDeco*10)
if CornerAim = 1 then Yrotate Object 3,WrapValue(mA#+BulletAvoidDeco*-16)
Dec BulletAvoidDeco
Endif
If ShootUp > 0
mA# = object angle X(3)
XRotate Object 3,WrapValue(mA#+ShootUp*-8)
Dec ShootUp
Endif
Position object 102,mX#,mY#+25,mZ#
Set object to object orientation 102,3
MonsterBulletLife =500
show object 102
Loop sound 102
Rem Play idle animation
Loop Object 3,0,20
Endif
Endif
if PDist>1000
Rem Store old location
OldmX# = mX#
OldmZ# = mZ#
OldmY# = mY#
Rem Play walking animation
Loop Object 3,21,46
Rem Move monster
Move Object 3,3+rnd(2)
Rem Get new position
mX# = Object Position X(3)
mZ# = Object Position Z(3)
mY# = Get Ground Height(1,mX#,mZ#)
Rem Check for Decoration collision
If DecoCollide(mX#,mY#,mZ#) = 1 and AvoidDeco = 0
mX# = OldmX#
mZ# = OldmZ#
mY# = OldmY#
AvoidDeco = 3
Endif
Endif
Return
Rem Shoot Monster bullet
MonsterShootBullet:
Dec MonsterBulletLife
Move object 102,12
MbX#=Object position X(102)
MbY#=Object position Y(102)
MbZ#=Object position Z(102)
inc MPn
if MPn=121 then MPn=110
Scale object MPn,100,100,100
Position object MPn,MbX#,MbY#,MbZ#
Position sound 102,MbX#,MbY#,MbZ#
point object MPn,X#,Y#,Z#
Zrotate object MPn,rnd(180)
Show object MPn
for x = 1 to 10
scale object int((Wrapvalue((MPn-9+x)*36))/36)+110,100+x*25,100+x*25,100+x*25
next x
if MbY# < Get Ground height(1,MbX#,MbZ#)
MonsterBulletLife=0
ShootUp=3
endif
Pdist=Sqrt((X# - MbX#)^2 + (Y#+25 - MbY#)^2 + (Z# - MbZ#)^2)
if Pdist<50
GoSub PlacePlayer
MonsterBulletLife = 0
inc MonsterScore
endif
Rem guided missile
if Pdist <500+PlayerScore*100 and Pdist>250 then Point object 102,X#,Y#,Z#
if Pdist < 100 then point object 102,X#,Y#,Z#
if DecoCollide(MbX#,MbY#,MbZ#) = 1
MonsterBulletLife = 0
BulletAvoidDeco = BulletAvoidDeco + 2
Endif
if MonsterBulletLife = 0
Hide object 102
stop sound 102
for x=110 to 120
hide object x
next x
MonsterExplode = 20
endif
Return
PlaceMonster:
mX#=X#
mY#=Y#
mZ#=Z#
While Sqrt((X# - MX#)^2 + (Y#+25 - MY#)^2 + (Z# - MZ#)^2)<1000
mX#=rnd(10000)
mZ#=rnd(10000)
mY#= get ground height(1,mX#,mZ#)
If DecoCollide(mX#,mY#,mZ#) = 1
mX#=X#
mY#=Y#
mZ#=Z#
endif
EndWhile
Position object 3,mX#,mY#,mZ#
Return
PlacePlayer:
X#=mX#
Y#=mY#
Z#=mZ#
While Sqrt((X# - mX#)^2 + (Y#+25 - mY#)^2 + (Z# - mZ#)^2)<1000
X#=rnd(10000)
Z#=rnd(10000)
Y#= get ground height(1,X#,Z#)
If DecoCollide(X#,Y#,Z#) = 1
X#=mX#
Y#=mY#
Z#=mZ#
endif
EndWhile
Position camera X#,Y#,Z#
Point camera mX#,mY#,mZ#
Return
` *** CLEAR WORLD - ClearWorld
` *** Remove all existing 3D elements from world
` ***
function ClearWorld
for x = 1 to 1000
if object exist(x) = 1 then delete object x
if matrix exist(x) = 1 then delete matrix x
if mesh exist(x) = 1 then delete mesh x
if light exist(x) = 1 then delete light x
if sound exist(x) = 1 then stop sound x
if x <= 32
if animation exist(x) = 1 then delete animation x
endif
next x
`Static Objects
make object cube 1,5
make static object 1
delete object 1
delete static objects
fog off
backdrop off
cls 0
endfunction
Function DecoCollide(X#,Y#,Z#)
for u = 1 to 9
for v = 1 to 9
if X#>u*1000-60
if X#<u*1000+60
if Z#>v*1000-60
if Z#<v*1000+60
if Y# < Get ground height(1,u*1000,v*1000)+575
Collide=1
Exitfunction Collide
endif
endif
endif
endif
endif
next v
next u
Collide=0
Endfunction Collide
I'm not a grumpy grandpa
