Challenge: 
Winner?: 
No
Code Snippet: 
` By: Patrick Lewis
`18/Feb/2005
Hide Mouse
Type Coordinates
   x as Float
   y as Float
   z as Float
Endtype

Global Object As Coordinates
Global Target as Coordinates
Global AI as Coordinates
Global Camera as Coordinates

Type Attributes
   Energy as Integer
   Armor as Integer
   Health as Integer
   Damage as Integer
   Range as Integer
   Ablative as Integer
   Shield as Integer
   Pos as Coordinates
   Weapon as String
   Weap_ID as Integer
   Speed as Float
   Object_Num as Integer
   Velocity as Float
EndType

Global Robot as Attributes
Global Robot_Rating as Integer
Dim Enemy(20) as Attributes
Dim Enemy_Rating(20) as Integer

Type Weapons
   Weapon_ID as Integer
   Weapon_Name as String
   Weapon_Damage as Integer
   Weapon_Range as Integer
EndType

Global Robot_Weapon as Weapons
Dim Enemy_Weapon(20) as Weapons

Type Bullets
   Bullet_Damage as Integer
   Bullet_Range as Integer
   Bullet_Area as Integer
   Bullet_Speed as Integer
   Bullet_Object as Integer
   Bullet_Target as Coordinates
EndType

Global Robot_Bullet as Bullets
Dim Enemy_Bullet(20) as Bullets
Sync On
Sync Rate 60
Autocam Off

Do
   Global Level as Float
   Global Score as Integer
   Global EnemyCount as Integer

   Level =1
   Score = 0
   NextLevel=100
   EnemyCount=0
   Robot_Rating=Make_Robot(1)
   Make_Crosshair()
   Make_Road()
   Make_X_Road()
   Return_Object(1)
   Position Camera 0,Object.y+100,50
   Point Camera 0,0,51
   Position Object 501,0,-8,60
   Position Object 502,0,-8,60+174

   Do
      Move_Roads()
      Move_Robot()
      Start_Enemy()
      If Move_Enemy() Then Exit
      Move_Crosshair()
      If Mouseclick()=1
         Return_Target(3)
         Make_R_Bullet(Target.x,0,Target.z)
      Endif
      Move_R_Bullet()
      Ink RGB(171,180,254),0
      Set Cursor 0,0
      Print "Score: ";Score
      If Score>NextLevel
         Level=Level+1
         NextLevel=NextLevel+(Level*100)
      Endif
      Print "Level: ";Level
      Ink Rgb(255-Robot.Health*2,50,55+Robot.Health*2),0
      Print "Health: "; Robot.Health
      Sync
   Loop
Center Text Object Screen X(1),Object Screen Y(1)-20,"You died! Press the anykey to play again"
Sync
Sleep 1000
Clear Entry Buffer
Wait Key
For i = 1001 to 1020
   If Object Exist (i) Then Delete Object I
Next i
Loop




Function Make_Robot(ObjectID)
If Object Exist (ObjectID) Then Delete Object ObjectID
Make Object Cube ObjectID,5
If Object Exist(2) Then Delete Object 2
If Mesh Exist(2) Then Delete Mesh 2
Make Object Sphere 2,5
Make Mesh From Object 2,2
Add Limb ObjectID,1,2
Offset Limb ObjectID,1,0,4,0
Delete Mesh 2
Delete Object 2
Make Object Cylinder 2,4
Scale Object 2,30,100,30
Offset Limb 2,0,0,2,0
Roll Object Right 2,100
Fix Object Pivot 2
Make Mesh From Object 2,2
Add Limb ObjectID,2,2
Add Limb ObjectID,3,2
Offset Limb ObjectID,2,0,1,-3
Offset Limb ObjectID,3,0,1,3
Color Limb ObjectID,2,RGB(128,128,128)
Color Limb ObjectID,3,RGB(128,128,128)
Delete Mesh 2
Delete Object 2
Make Object Cylinder 2,10
Scale Object 2,100,20,20
Pitch Object Down 2,90
Fix Object Pivot 2
Make Mesh From Object 2,2
Add Limb ObjectID,4,2
Add Limb ObjectID,5,2
Offset Limb ObjectID,4,0,-3,-3
Offset Limb ObjectID,5,0,-3,3
Delete Object 2
Delete Mesh 2
Make Object Sphere 2,10
Scale Object 2,100,20,1
Make Mesh from Object 2,2
Add Limb ObjectID,6,2
Add Limb ObjectID,7,2
Offset Limb ObjectID,6,0,-3,-3.9
Offset Limb ObjectID,7,0,-3,3.9
Delete Object 2
Delete Mesh 2
Set Object Cull ObjectID,0
Turn Object Left ObjectID,90
Fix Object Pivot ObjectID
If Bitmap Exist(1) Then Delete Bitmap 1
Create Bitmap 1,100,20
Set Current Bitmap 1
Ink RGB(210,210,210),0
Box 0,0,99,19
Ink Rgb(40,40,40),0
For i = 0 to 90 step 10
   Box i,0,i+1,19
Next i
Get Image 1,0,0,99,19
Delete Bitmap 1
Texture Limb 1,4,1
Texture Limb 1,5,1
Set Object Collision Off 1
Robot.Health=100
Robot.Object_Num=1
EndFunction R

Function Move_Robot()
YRotate Object 1,0
Move Object Left 1,((LeftKey()*(Object Screen X(1)>20))-(RightKey()*(Object Screen X(1)<(Screen Width()-20))))*.8
Move Object 1,(Upkey()*(Object Screen Y(1)>Screen Height()*.1)-DownKey()*(Object Screen Y(1)<Screen Height()-40))*.8
YRotate Object 1,RightKey()*45-LeftKey()*45
Scroll Limb Texture 1,4,-.005,0
Scroll Limb Texture 1,5,-.005,0
Minimap(1,RGB(119,119,255))
EndFunction

Function Make_AI()
If Object Exist (2) then Delete Object 2
Make Object Sphere 2,1,10,10
Set Object Collision Off 2
Hide Object 2
Endfunction


Function Make_R_Bullet(Tx#,Ty#,Tz#)
If Object Exist(101) Then ExitFunction
Make Object Sphere 101,2
   Robot_Bullet.Bullet_Damage=rnd(4)+1
   Robot_Bullet.Bullet_Range=50
   Robot_Bullet.Bullet_Area=5
   Robot_Bullet.Bullet_Speed=6
   Robot_Bullet.Bullet_Object=101
   Robot_Bullet.Bullet_Target.x=Tx#
   Robot_Bullet.Bullet_Target.y=Ty#
   Robot_Bullet.Bullet_Target.z=Tz#
Return_Object(1)
Position Object 101,Object.x,Object.y,Object.z
Point Object 101,Tx#,Ty#,Tz#
EndFunction

Function Move_R_Bullet()
If Object Exist(101)=0 then ExitFunction
Speed=Robot_Bullet.Bullet_Speed
If Speed=0 then Speed=1
For i = 1 to Speed
   If Robot_Bullet.Bullet_Speed>0 Then Move Object 101,1
   Robot_Bullet.Bullet_Range=Robot_Bullet.Bullet_Range-1
   If Robot_Bullet.Bullet_Range=0
      Robot_Bullet.Bullet_Speed=0
      scale=Robot_Bullet.Bullet_Area/Object Size(101)*100
      Robot_Bullet.Bullet_Damage=Robot_Bullet.Bullet_Damage*3
      Scale Object 101,scale,scale,scale
      Color Object 101,Rgb(255,0,0)
      Ghost Object On 101
   Endif
   HitEnemy=Object Collision(101,0)
   If HitEnemy>1000 and HitEnemy<1021
      Enemy(HitEnemy-1000).Health=Enemy(HitEnemy-1000).Health-Robot_Bullet.Bullet_Damage
      If Enemy(HitEnemy-1000).Health<1 Then Delete Object HitEnemy:EnemyCount=EnemyCount-1
      Delete Object 101
      Score=Score+Robot_Bullet.Bullet_Damage
      ExitFunction
   Endif
   If Robot_Bullet.Bullet_Range<-10
      Delete Object 101
      ExitFunction
   Endif
Next i
EndFunction

Function Make_Crosshair()
If Object Exist (3) Then Delete Object 3
Make Object Cylinder 3,10
If Mesh Exist(2)Then Delete Mesh 2
Make Mesh From Object 2,3
Add Limb 3,1,2
Add Limb 3,2,2
Delete Mesh 2
Rotate Limb 3,1,0,0,90
Rotate Limb 3,2,90,0,0
Scale Limb 3,0,10,100,10
Scale Limb 3,1,10,100,10
Scale Limb 3,2,10,100,10
Pitch Object Down 3,90
Fix Object Pivot 3
Color Object 3,Rgb(255,0,0)
Position Object 3,0,5,0
Set Object Cull 3,0
Set Object Collision Off 3
Ghost Object On 3
EndFunction

Function Move_Crosshair()
mx=MouseX():my=MouseY()
cntr=0
Do
   cx=Object Screen X(3): cy=Object Screen Y(3)
   If cx=mx and cy=my then Exit
   Move Object Left 3,((cx>mx)-(cx<mx))*.2
   Move Object 3,((cy>my)-(cy<my))*.2
   cntr=cntr+1
   If cntr>40 Then Exit
Loop
Roll Object Left 3,1
Fix Object Pivot 3
EndFunction

Function Make_Enemy_Robot(ObjectID,ERID)
Make Object Cube ObjectID,5
If Object Exist(2) Then Delete Object 2
If Mesh Exist(2) Then Delete Mesh 2
Make Object Sphere 2,5
Make Mesh From Object 2,2
Add Limb ObjectID,1,2
Offset Limb ObjectID,1,0,4,0
Delete Mesh 2
Delete Object 2
Make Object Cylinder 2,4
Scale Object 2,30,100,30
Offset Limb 2,0,0,2,0
Roll Object Right 2,100
Fix Object Pivot 2
Make Mesh From Object 2,2
Add Limb ObjectID,2,2
Add Limb ObjectID,3,2
Offset Limb ObjectID,2,0,1,-3
Offset Limb ObjectID,3,0,1,3
Delete Mesh 2
Delete Object 2
Make Object Cylinder 2,10
Scale Object 2,100,20,20
Pitch Object Down 2,90
Fix Object Pivot 2
Make Mesh From Object 2,2
Add Limb ObjectID,4,2
Add Limb ObjectID,5,2
Offset Limb ObjectID,4,0,-3,-3
Offset Limb ObjectID,5,0,-3,3
Delete Object 2
Delete Mesh 2
Make Object Sphere 2,10
Scale Object 2,100,20,1
Make Mesh from Object 2,2
Add Limb ObjectID,6,2
Add Limb ObjectID,7,2
Offset Limb ObjectID,6,0,-3,-3.9
Offset Limb ObjectID,7,0,-3,3.9
Delete Object 2
Delete Mesh 2
Set Object Cull ObjectID,0
Turn Object Left ObjectID,90
Fix Object Pivot ObjectID
Color Object ObjectID,RGB(128,0,0)
Color Limb ObjectID,2,RGB(128,128,128)
Color Limb ObjectID,3,RGB(128,128,128)
Texture Limb 1,4,1
Texture Limb 1,5,1
Set Object Collision Off 1
Enemy(ERID).Health=10+Rnd(Level*2)
Enemy(ERID).Object_Num=ObjectID
EndFunction R


Function Start_Enemy()
If Rnd(800)>Level+((Level-EnemyCount)*3) Then ExitFunction
For i = 1001 to 1020
   If Object Exist(i)=0
      Make_Enemy_Robot(i,i-1000)
      EnemyCount=EnemyCount+1
      Position Object i,((rnd(400)-200)+(rnd(400)-200))/2,0,125+Rnd(200)
      Turn Object Right i,180
      Exit
   Endif
Next
EndFunction

Function Move_Enemy()
Make_AI()
Dead=0
Set Object Collision On 1
For i = 1 to 20
   If Object Exist(1000+i)
      Return_Object(1000+i)
      Return_Target(1)
      Position Object 2,Object.x,Object.y,Object.z
      Set Object To Object Orientation 2,1000+i
      Move Object 2,10
      Point Object 2,Target.x,Object.y,Target.z
      Move Object 2,Rnd(3)
      Return_AI()
      Point Object 1000+i,AI.x,Object.y,AI.z
      Move Object 1000+i,.75
      Minimap(1000+i,RGB(255,0,0))
      If Object Collision (1000+i,1)
         Dead=1
         Set Object Collision Off 1
         ExitFunction Dead
      Endif
   Endif
   Enemy_Shoot(i)
   If Move_E_Bullet(i) Then ExitFunction 1
Next i
Set Object Collision Off 1
EndFunction Dead

Function Enemy_Shoot(ERID)
If Object Exist(1000+ERID)=0 Then ExitFunction
If rnd(2000)>Level
   Return_Object(1000+ERID):Return_Target(1)
   Dist#=(Object.x-Target.x)^2+(Object.z-Target.z)^2
   If Dist#<55^2
      aimx#=rnd(20-(level/6))-(10-(level/3))+Target.x
      aimz#=rnd(20-(level/6))-(10-(level/3))+Target.z
      Make_E_Bullet(ERID,aimx#,target.y,aimz#)
   Endif
Endif
EndFunction


Function Make_E_Bullet(ERID,Tx#,Ty#,Tz#)
If Object Exist(2000+ERID) Then ExitFunction
If Object Exist(1000+ERID)=0 Then ExitFunction
Make Object Sphere 2000+ERID,2
   Enemy_Bullet(ERID).Bullet_Damage=rnd(Level)+1
   Enemy_Bullet(ERID).Bullet_Range=50
   Enemy_Bullet(ERID).Bullet_Area=5
   Enemy_Bullet(ERID).Bullet_Speed=3
   Enemy_Bullet(ERID).Bullet_Object=2000+ERID
   Enemy_Bullet(ERID).Bullet_Target.x=Tx#
   Enemy_Bullet(ERID).Bullet_Target.y=Ty#
   Enemy_Bullet(ERID).Bullet_Target.z=Tz#
Return_Object(1000+ERID)
Position Object 2000+ERID,Object.x,Object.y,Object.z
Point Object 2000+ERID,Tx#,Ty#,Tz#
EndFunction

Function Move_E_Bullet(ERID)
Dead=0
If Object Exist(2000+ERID)=0 then ExitFunction Dead
Speed=Enemy_Bullet(ERID).Bullet_Speed
If Speed=0 then Speed=1
For i = 1 to Speed
   If Enemy_Bullet(ERID).Bullet_Speed>0 Then Move Object 2000+ERID,1
   Enemy_Bullet(ERID).Bullet_Range=Enemy_Bullet(ERID).Bullet_Range-1
   If Enemy_Bullet(ERID).Bullet_Range=0
      Enemy_Bullet(ERID).Bullet_Speed=0
      scale=Enemy_Bullet(ERID).Bullet_Area/Object Size(2000+ERID)*100
      Enemy_Bullet(ERID).Bullet_Damage=Enemy_Bullet(ERID).Bullet_Damage*3
      Scale Object 2000+ERID,scale,scale,scale
      Color Object 2000+ERID,Rgb(255,0,0)
      Ghost Object On 2000+ERID
   Endif
   HitEnemy=Object Collision(2000+ERID,1)
   If HitEnemy
      Robot.Health=Robot.Health-Enemy_Bullet(ERID).Bullet_Damage
      If Robot.Health<1 Then Dead=1
      Delete Object 2000+ERID
      ExitFunction Dead
   Endif
   If Enemy_Bullet(ERID).Bullet_Range<-10
      Delete Object 2000+ERID
      ExitFunction Dead
   Endif
Next i
EndFunction Dead

Function Make_Road()
If Object Exist(501) Then Delete Object 501
If Bitmap Exist(1) Then Delete Bitmap 1
Create Bitmap 1,300,300
Set Current Bitmap 1
Ink RGB(128,128,128),0
Box 50,0,249,299
Ink RGB(75,75,75),0
For i = 1 to 300
   Dot rnd(200)+50,rnd(299)
Next i
Ink RGB(198,198,0),0
For i = 0 to 250 step 50
   Box 148,i,152,i+30
Next i
Get Image 501,0,0,299,299
Set Current Bitmap 0
Delete Bitmap 1
Make Object Plain 501,175,175
Texture Object 501,501
Pitch Object Down 501,90
EndFunction

Function Make_X_Road()
If Object Exist(502) Then Delete Object 502
If Bitmap Exist(1) Then Delete Bitmap 1
Create Bitmap 1,300,300
Set Current Bitmap 1
Ink RGB(128,128,128),0
Box 50,0,249,299
Box 0,50,299,249
Ink RGB(75,75,75),0
For i = 1 to 300
   Dot rnd(200)+50,rnd(299)
Next i
Ink RGB(198,198,0),0
For i = 0 to 250 step 50
   Box 148,i,152,i+30
   Box i,148,i+30,152
Next i
Get Image 502,0,0,299,299
Set Current Bitmap 0
Delete Bitmap 1
Make Object Plain 502,175,175
Texture Object 502,502
Pitch Object Down 502,90
EndFunction

Function Move_Roads()
Move Object Up 501,.65
Move Object Up 502,.65
Return_Object(501)
If Object.z<60-174 Then Position Object 501,0,-8,60+174
Return_Object(502)
If Object.z<60-174 Then Position Object 502,0,-8,60+174
EndFunction

Function Minimap(ObjectID,Color)
Return_Object(ObjectID)
Ink Color,0
Box (Object.x/5)+600,50-(Object.z/5),(Object.x/5)+602,52-(Object.z/5)
EndFunction

Function Return_Target(TargetID)
Target.x=Object Position X(TargetID):Target.y=Object Position Y(TargetID):Target.z=Object Position Z(TargetID)
EndFunction

Function Return_Object(ObjectID)
Object.x=Object Position X(ObjectID):Object.y=Object Position Y(ObjectID):Object.z=Object Position Z(ObjectID)
EndFunction

Function Return_AI()
AI.x=Object Position X(2):AI.y=Object Position Y(2):AI.z=Object Position Z(2)
EndFunction

Function Return_Camera()
Camera.x=Camera Position X():Camera.y=Camera Position Y():Camera.z=Camera Position Z()
EndFunction