Challenge: 
Version: 
(Version B)
Winner?: 
No
Code Snippet: 
Rem Project: AI Tank
Rem Created: 3/17/2005 3:15:05 PM
Rem Created by Patrick Lewis
Rem ***** Main Source File *****

Sync On:Sync Rate 60:Autocam Off
Global MaxCodes
MaxCodes=55

Type Coordinates
   x as FLoat
   y as Float
   z as Float
Endtype

Global Object as Coordinates
Global Target as Coordinates

Type Menu
   ObjectNum as DWord
   MenuText as String
   Rotate As Float
   Pos as Coordinates
Endtype
MI=MaxCodes+20
Dim Menu(MI) as Menu

Type Commands
   Menu_ID as Integer
   Com_ID as Integer
   Com_Text as String
   Value as Integer
EndType
Dim Command_Menu(20) as Commands
Dim Code_List(MaxCodes) as Commands
Global MouseRate
Global m_Select as Integer
Global Select_Menu as Integer
Global Last_Menu as Integer
Global Code
Global IfCount

Type Players
   Com_Line as Integer
   Com_Delay as Integer
   N as Integer
   A as Integer
   B as Integer
   Hull as Integer
   Armor as Integer
   Treads as Integer
   Turret as Integer
   Weapon as Integer
   Scanner as Integer
   Tank_Angle as Float
   Scanner_Angle as Float
   Turret_Angle as Float
   Shield_On as Integer
   Shield as Integer
   Position as Coordinates
   Tank_Object as Integer
   Repair_Kits as Integer
   Temp_Damage as Integer
   Temp_Object as Integer
   Temp_Range as Integer
   Temp_Enemy as Integer
   BulletID as Integer
   Bullet_Range as Integer
   IfDoIt as Integer
   IfDeep as Integer
   HitMe as Integer
   Rep as Integer
   Rep_Count as Integer
EndType

Dim Player(2) as Players
Dim Player_Code(2,MaxCodes) as Commands

Dim Bullets(50)

Make_Field()
Make_Tank(10)
Make_Tank(11)
Position Object 10,15,2,15
Position Object 11,185,2,185
Position Camera 100,20,10
Restore R_Main_Menu
i=0
Do
   Read ID
   If ID=999 Then Exit
   Command_Menu(i).Com_ID=ID
   Read Command_Menu(i).Com_Text
   Read Flag
   Make_Menu_Box(100+i,Command_Menu(i).Com_Text,Command_Menu(i).Com_ID,45,45-(i*5),80)
   i=i+1
Loop

Select_Menu=0
Last_Menu=0
Code=0
Do
   Turn Object Left 10,1
   Turn Object Right 11,1
   Select Select_Menu
      Case 0:Main_Menu():EndCase
      Case 1,2,3,4,5,6:Sub_Menu():EndCase
      Case 7:System_Menu():EndCase
   EndSelect
   If m_Select=Code+19 and Code>0
      Code=Code-1
      If Code_List(Code).Com_Text="End If" Then IfCount=IfCount+1
      If Left$(Code_List(Code).Com_Text,2)="If" Then IfCount=IfCount-1
      Code_List(Code).Menu_ID=0
      Code_List(Code).Com_ID=0
      Code_List(Code).Value=0
      Code_List(Code).Com_Text=""
      Delete_Menu_Box(m_Select)
   Endif
   Turn Camera Left LeftKey()-RightKey()
   Move Camera Upkey()-DownKey()
   Sync
Loop

Function Main_Menu()
   Select_Menu=0
   If Last_Menu<>Select_Menu
      For i = 0 to 19
         Delete_Menu_Box(i)
      Next i
      Restore R_Main_Menu
      i=0
      Do
         Read ID
         If ID=999 Then Exit
         Command_Menu(i).Com_ID=ID
         Read Command_Menu(i).Com_Text
         Read Flag
         Make_Menu_Box(100+i,Command_Menu(i).Com_Text,Command_Menu(i).Com_ID,45,45-(i*5),80)
         i=i+1
      Loop
      Last_Menu=Select_Menu
   Endif
   m_Select=Menu_Wrangler()
   If M_Select>-1 and M_select<20
      Select_Menu=M_select+1
   Endif
EndFunction

Function Sub_Menu()
   If Last_Menu<>Select_Menu
      For i = 0 to 19
         Delete_Menu_Box(i)
      Next i
      Select Select_Menu
         Case 1:Restore R_Move_Menu:EndCase
         Case 2:Restore R_Scan_Menu:EndCase
         Case 3:Restore R_Weapon_Menu:EndCase
         Case 4:Restore R_Conditions_Menu:EndCase
         Case 5:Restore R_Var_Menu:EndCase
         Case 6:Restore R_Misc_Menu:EndCase
      EndSelect
      i=0
      Do
         Read ID
         If ID=999 Then Exit
         Command_Menu(i).Com_ID=ID
         Read Command_Menu(i).Com_Text
         Read Command_Menu(i).Value
         Make_Menu_Box(100+i,Command_Menu(i).Com_Text,Command_Menu(i).Com_ID,45,45-(i*5),80)
         i=i+1
      Loop
      Last_Menu=Select_Menu
   Endif
   m_Select=Menu_Wrangler()
   If m_Select<0 then ExitFunction
   If m_Select=0
      Select_Menu=0
      ExitFunction
   Else
      If Menu(M_Select).MenuText="End If" and IfCount=0 Then ExitFunction
      If M_select<20 and Code<=MaxCodes
         Code_List(Code).Menu_ID=Select_Menu
         Code_List(Code).Com_ID=M_Select
         offset=Int(Code/19)
         If Menu(M_Select).MenuText="End If" Then IfCount=IfCount-1
         horz=-50+(offset*30)+IfCount*3:vert=45+(Offset*19*5)-(code*5)
         If Command_Menu(M_Select).Value=1
            Make_Menu_Box(200+Code,"Enter Value:",20+Code,horz,vert,80)
            Do
               Set Cursor Object Screen X(200+Code)+45,Object Screen Y(200+Code)-10
               Input "",v$
               If Val(v$)<51 OR Select_Menu<>5 Or M_select<>5 Then Exit
            Loop
            Code_List(Code).Value=Val(v$)
            Code_List(Code).Com_Text=Menu(M_Select).MenuText+v$
         Else
            Code_List(Code).Value=0
            Code_List(Code).Com_Text=Menu(M_Select).MenuText
         Endif
         Make_Menu_Box(200+Code,Str$(Code+1)+": "+Code_List(Code).Com_Text,20+Code,horz,vert,80)
         Code=Code+1
         If Left$(Menu(M_Select).MenuText,2)="If" Then IfCount=IfCount+1
      Endif
   Endif
EndFunction

Function System_Menu()
   If Last_Menu<>Select_Menu
      For i = 0 to 19
         Delete_Menu_Box(i)
      Next i
      Restore R_Syst_Menu
      i=0
      Do
         Read ID
         If ID=999 Then Exit
         Command_Menu(i).Com_ID=ID
         Read Command_Menu(i).Com_Text
         Read Command_Menu(i).Value
         Make_Menu_Box(100+i,Command_Menu(i).Com_Text,Command_Menu(i).Com_ID,45,45-(i*5),80)
         i=i+1
      Loop
      Last_Menu=Select_Menu
   Endif
   m_Select=Menu_Wrangler()
   if m_Select<0 Then ExitFunction
   Select m_Select
      Case 0
         Select_Menu=0
         ExitFunction
      EndCase
      Case 1
         Make_Menu_Box(101,"Enter File Name:",1,45,40,80)
         Set Cursor Object Screen X(101)-45,Object Screen Y(101)+15
         Input "",fs$
         If File Exist(fs$)
            Make_Menu_Box(101,"File Exists. Delete (Y=Yes)?",1,45,40,80)
            Set Cursor Object Screen X(101)-45,Object Screen Y(101)+15
            Input "",a$:If lower$(a$)="y" Then Delete File fs$
         Endif
         Save_Code_List(fs$)
         Last_Menu=0
      EndCase
      Case 2
         Make_Menu_Box(102,"Enter File Name:",2,45,35,80)
         Set Cursor Object Screen X(102)-45,Object Screen Y(102)+15
         Input "",fs$
         If File Exist(fs$)
            For i = 20 to 20+MaxCodes
               Delete_Menu_Box(i)
            Next i
            Load_Code_List(fs$)
            IfCount=0
            For i = 0 to MaxCodes
               If Code_List(i).Com_ID>0
                  If Code_List(i).Com_Text="End If" Then IfCount=IfCount-1
                  offset=Int(i/19)
                  horz=-50+(offset*30)+IfCount*3:vert=45+(Offset*19*5)-(i*5)
                  Make_Menu_Box(200+i,Str$(i+1)+": "+Code_List(i).Com_Text,20+i,horz,vert,80)
                  If Left$(Code_List(i).Com_Text,2)="If" Then IfCount=IfCount+1
                  Code=i
               Endif
            Next i
            Last_Menu=0
         Else
            Set Cursor Screen Width()/2-20,100
            Print "File Name does not exist."
            Sync
            Wait Key
         Endif
      EndCase
      Case 3
         Test()
      EndCase
      Case 4
      Rem Load 2nd player code
      Endcase
   Endselect
EndFunction

Function Test()
   Kill=0:Win=0
   Position Object 10,15,2,15
   Position Object 11,185,2,185
   Rotate Object 10,0,0,0
   Rotate Object 11,0,180,0
   For i = 0 to MaxCodes+20
      Delete_Menu_Box(i)
   Next i
   For j = 1 to 2
      For i = 0 to MaxCodes
         Player_Code(j,i).Menu_ID=Code_List(i).Menu_ID
         Player_Code(j,i).Com_ID=Code_List(i).Com_ID
         Player_Code(j,i).Com_Text=Code_List(i).Com_Text
         Player_Code(j,i).Value=Code_List(i).Value
      Next i
      Player(j).Com_Line = 0
      Player(j).Com_Delay = 1
      Player(j).N = 0
      Player(j).A = 0
      Player(j).B = 0
      Player(j).Hull = 100
      Player(j).Armor = 100
      Player(j).Treads = 100
      Player(j).Turret = 100
      Player(j).Weapon = 100
      Player(j).Scanner = 100
      Player(j).Tank_Angle = 0
      Player(j).Scanner_Angle = 0
      Player(j).Turret_Angle = 0
      Player(j).Shield_On = 0
      Player(j).Shield = 1000
      Player(j).Tank_Object = 9+j
      Player(j).Repair_Kits = 3
      Player(j).Temp_Damage = 0
      Player(j).Temp_Object = 0
      Player(j).Temp_Range = 0
      Player(j).Temp_Enemy = 0
      Player(j).BulletID = 0
      Player(j).Bullet_Range = 0
      Player(j).IfDoIt=0
      Player(j).IfDeep=0
      Player(j).HitMe=Timer()
      Player(j).Rep=0
   Next j
   Player(2).Tank_Angle=180
   Do
      Wrangle_Code()
      Wrangle_Bullets()
      If Player(1).Com_Line>0 Then Center Text Screen Width()/2,0,Player_Code(1,Player(1).Com_Line-1).Com_Text
      If Player(1).Hull<1 And Player(2).Hull<1
         Kill=0:Win=0
         Exit
      Endif
      If Player(1).Hull<1
         Kill=1:Win=2
         Exit
      Endif
      If Player(2).Hull<1
         Kill=2:Win=1
         Exit
      Endif
      Turn Camera Left LeftKey()-RightKey()
      Move Camera Upkey()-DownKey()
      Set Cursor 0,0:Print "Enemy Found: ";Player(1).Temp_Enemy
      Print "Press [Space] To Exit Test"
      If Inkey$()=" " Then Exit
      Sync
   Loop
   If Kill=1 Then Center Text Screen Width()/2,100,"Player 2 Wins!"
   If Kill=2 Then Center Text Screen Width()/2,100,"Player 1 Wins!"
   If Kill=0 Then Center Text Screen Width()/2,100,"It's a tie!"
   Sync
   Wait Key
For i = 0 to MaxCodes
   If Code_List(i).Com_ID>0
      If Code_List(i).Com_Text="End If" Then IfCount=IfCount-1
      offset=Int(i/19)
      horz=-50+(offset*30)+IfCount*3:vert=45+(Offset*19*5)-(i*5)
      Make_Menu_Box(200+i,Str$(i+1)+": "+Code_List(i).Com_Text,20+i,horz,vert,80)
      If Left$(Code_List(i).Com_Text,2)="If" Then IfCount=IfCount+1
      Code=i
   Endif
Next i
   Select_Menu=0:Last_Menu=1
EndFunction

Function Wrangle_Code()
   For i = 1 to 2
      If Player(i).Com_Delay<1
         If Player(i).Com_Line>MaxCodes Then Player(i).Com_Line=0
         If Player_Code(i,Player(i).Com_Line).Com_Text="" Then Player(i).Com_Line=0
         Code$=Player_Code(i,Player(i).Com_Line).Com_text
         Menu=Player_Code(i,Player(i).Com_Line).Menu_ID
         Code=Player_Code(i,Player(i).Com_Line).Com_ID
         Valu=Player_Code(i,Player(i).Com_Line).Value
         Select Menu
            Case 1
               If Player(i).IfDeep=Player(i).IfDoIt
                  Select Code
                     Case 1:C_Move_Forward(i):EndCase
                     Case 2:C_Move_Back(i):EndCase
                     Case 3:C_Set_N_To_Px(i):EndCase
                     Case 4:C_Set_N_To_Py(i):EndCase
                     Case 5:C_Turn_Right(i):EndCase
                     Case 6:C_Turn_Left(i):EndCase
                     Case 7:C_Set_N_To_Pa(i):EndCase
                     Case 8:C_Check_Treads(i):EndCase
                     Case 9:C_Repair_Treads(i):EndCase
                  EndSelect
               Endif
            EndCase
            Case 2
               If Player(i).IfDeep=Player(i).IfDoIt
                  Select Code
                     Case 1:C_Scan_For_Obst(i):EndCase
                     Case 2:C_Set_N_To_Or(i):EndCase
                     Case 3:C_Set_N_to_Ox(i):EndCase
                     Case 4:C_Set_N_To_Oy(i):EndCase
                     Case 5:C_Scan_For_Enemy(i):EndCase
                     Case 6:C_Set_N_To_Er(i):EndCase
                     Case 7:C_Set_N_To_Ex(i):EndCase
                     Case 8:C_Set_N_To_Ey(i):EndCase
                     Case 9:C_Set_N_To_Ea(i):EndCase
                     Case 10:C_Turn_Scanner_Right(i):EndCase
                     Case 11:C_Turn_Scanner_Left(i):EndCase
                     Case 12:C_Set_N_To_Sa(i):EndCase
                     Case 13:C_Check_Scanner(i):Endcase
                     Case 14:C_Repair_Scanner(i):EndCase
                     Case 15:C_Set_Scanner_Angle_To_N(i):EndCase
                  EndSelect
               Endif
            EndCase
            Case 3
               If Player(i).IfDeep=Player(i).IfDoIt
                  Select Code
                     Case 1:C_Fire_Weapon(i):EndCase
                     Case 2:C_Turn_Turret_Right(i):EndCase
                     Case 3:C_Turn_Turret_Left(i):EndCase
                     Case 4:C_Set_N_To_Wa(i):EndCase
                     Case 5:C_Check_Weapon(i):EndCase
                     Case 6:C_Repair_Weapon(i):EndCase
                     Case 7:C_Check_Turret(i):EndCase
                     Case 8:C_Repair_Turret(i):EndCase
                     Case 9:C_Set_Turret_Angle_To_N(i):EndCase
                  EndSelect
               EndIf
            EndCase
            Case 4
               Select Code
                  Case 1:N_LessThan_Val(i,Valu):EndCase
                  Case 2:N_GreaterThan_Val(i,Valu):EndCase
                  Case 3:N_Equals_Val(i,Valu):EndCase
                  Case 4:N_NotEqual_Val(i,Valu):EndCase
                  Case 5:N_LessThan_A(i):EndCase
                  Case 6:N_GreaterThan_A(i):EndCase
                  Case 7:N_Equals_A(i):EndCase
                  Case 8:N_NotEqual_A(i):EndCase
                  Case 9:N_LessThan_B(i):EndCase
                  Case 10:N_GreaterThan_B(i):EndCase
                  Case 11:N_Equals_B(i):EndCase
                  Case 12:N_NotEqual_B(i):EndCase
                  Case 13:C_End_If(i):EndCase
               EndSelect
            EndCase
            Case 5
               If Player(i).IfDeep=Player(i).IfDoIt
                  Select Code
                     Case 1:Player(i).A=Player(i).N:EndCase
                     Case 2:Player(i).A=Player(i).B:EndCase
                     Case 3:Player(i).B=Player(i).A:EndCase
                     Case 4:Player(i).B=Player(i).N:EndCase
                     Case 5:Player(i).N=Player(i).A:EndCase
                     Case 6:Player(i).N=Player(i).B:EndCase
                     Case 7:Player(i).N=Rnd(Player(i).A):EndCase
                     Case 8:Player(i).A=Valu:EndCase
                     Case 9:Player(i).B=Valu:EndCase
                     Case 10:Player(i).N=Valu:EndCase
                     Case 11:Player(i).N=Player(i).N+Valu:EndCase
                     Case 12:Player(i).N=Player(i).N-Valu:EndCase
                     Case 13:Player(i).N=Player(i).N+Player(i).A:EndCase
                     Case 14:Player(i).N=Player(i).N-Player(i).A:EndCase
                     Case 15:Player(i).N=Player(i).Temp_Damage:EndCase
                  EndSelect
               EndIf
            EndCase
            Case 6
               If Player(i).IfDeep=Player(i).IfDoIt
                  Select Code
                     Case 1:C_Goto(i,Valu):EndCase
                     Case 2:C_Wait(i,Valu):EndCase
                     Case 3:C_Repeat(i,Valu):EndCase
                     Case 4:C_Loop(i):EndCase
                     Case 5:C_Check_Hit(i):EndCase
                     Case 6:C_Check_Armor(i):EndCase
                     Case 7:C_Repair_Armor(i):EndCase
                     Case 8:C_Check_Hull(i):EndCase
                     Case 9:C_Repair_Hull(i):EndCase
                     Case 10:C_Raise_Shield(i):EndCase
                     Case 11:C_Lower_Shield(i):EndCase
                     Case 12:C_Set_N_To_Se(i):EndCase
                  EndSelect
               EndIf
            EndCase
         EndSelect
         Player(i).Com_Line=Player(i).Com_Line+1
      Endif
   Player(i).Com_delay=Player(i).Com_Delay-1
   Next i
EndFunction


Function Make_Field()
   If Matrix Exist(1) Then Delete Matrix 1
   Make Matrix 1,200,200,20,20
   If Bitmap Exist(1) Then Delete Bitmap 1
   Create Bitmap 1,128,128
   Set Current Bitmap 1
   Ink RGB(0,128,0),0
   Box 0,0,127,127
   For i=1 to 200
      Dot rnd(127),rnd(127),Rgb(10,Rnd(255),10)
   Next i
   Get Image 999,0,0,127,127
   Prepare Matrix Texture 1,999,1,1
   Update Matrix 1
   Make Object Box 901,200,10,2
   Offset Limb 901,0,100,0,0
   Clone Object 902,901
   Clone Object 903,901
   Clone Object 904,901
   Turn Object Left 902,90
   Move Object 903,200
   Move Object Right 904,200
   Turn Object Left 904,90
   Make Object Sphere 601,7,8,8
   Make Object Cylinder 602,5
   Scale Object 602,30,100,30
   Make Mesh From Object 602,602
   Add Limb 601,1,602
   Delete Object 602
   Delete Mesh 602
   Offset Limb 601,1,0,2.5,0
   Offset Limb 601,0,0,7,0
   Texture Limb 601,0,999
   Color Limb 601,1,RGB(128,64,64)
   Make Object Sphere 602,8,8,8
   Color Object 602,RGB(109,103,78)
   For i = 1 to rnd(50)+rnd(50)+rnd(50)+rnd(50)
      cln=rnd(1)+1
      Clone Object 602+i,600+cln
      Position Object 602+i,rnd(180)+10,0,rnd(180)+10
      Set Object Collision To Boxes 602+i
   Next i
   Position Object 601,rnd(180)+10,0,rnd(180)+10
   Set Object Collision To Boxes 601
   Position Object 602,rnd(180)+10,0,rnd(180)+10
   Set Object Collision To Boxes 602
EndFunction

Function Make_Tank(ObjectID)
If Object Exist (ObjectID) Then Delete Object ObjectID
`Body
Make Object Box ObjectID,7,2.5,5
`Turret
If Object Exist(2) Then Delete Object 2
If Mesh Exist(2) Then Delete Mesh 2
Make Object Cylinder 2,5
Scale Object 2,100,40,100
Make Mesh From Object 2,2
Add Limb ObjectID,1,2
Offset Limb ObjectID,1,0,2,0
Delete Mesh 2
Delete Object 2
`Cannon
Make Object Cylinder 2,4
Scale Object 2,25,120,25
Offset Limb 2,0,0,2,0
Roll Object Right 2,90
Fix Object Pivot 2
Make Mesh From Object 2,2
Add Limb ObjectID,2,2
Offset Limb ObjectID,2,0,2,0
Color Limb ObjectID,2,RGB(128,128,128)
`Treads
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,3,2
Add Limb ObjectID,4,2
Offset Limb ObjectID,3,0,-1.5,-3
Offset Limb ObjectID,4,0,-1.5,3
`Tread Panels
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,5,2
Add Limb ObjectID,6,2
Offset Limb ObjectID,5,0,-1.5,-3.9
Offset Limb ObjectID,6,0,-1.5,3.9
Delete Object 2
Delete Mesh 2
`Scanner
Make Object Box 2,2,.4,1
Offset Limb 2,0,1,0,0
Make Mesh From Object 2,2
Add Limb ObjectID,7,2
Offset Limb ObjectID,7,0,3.2,0
Delete Object 2
Delete Mesh 2

`Lid
Make Object Sphere 2,5
Scale Object 2,100,.1,100
Make Mesh From Object 2,2
Add Limb ObjectID,8,2
Offset Limb ObjectID,8,0,2.9,0
Delete Object 2
Delete Mesh 2

`Object settings
Set Object Cull ObjectID,0
Turn Object Left ObjectID,90
Fix Object Pivot ObjectID
Color Object ObjectID,RGB(192,192,192)
`Treads image
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 ObjectID,3,1
Texture Limb ObjectID,4,1
Set Object Collision On ObjectID
Set Object Collision to Boxes ObjectID
EndFunction

Function Make_Menu_Box(ObjectID,txt$,MenuID,x#,y#,z#)
If MenuID>Array Count(Menu()) Or MenuID<0 Then ExitFunction
If Object Exist(ObjectID) Then Delete Object ObjectID
If Image Exist(ObjectID) Then Delete Image ObjectID
If Menu(MenuID).ObjectNum>0
   If Object Exist(Menu(MenuID).ObjectNum) then Delete Object Menu(MenuID).ObjectNum
Endif
Make Object Box ObjectID,25,4,4
If Bitmap Exist(1) Then Delete Bitmap 1
w=Text Width(txt$)*1.2:h=Text Height(txt$)*2
Create Bitmap 1,w+1,h+1
Set Current Bitmap 1
Ink RGB(0,0,128),0
Box 0,0,w,h
Ink RGB(255,255,255),0
Center Text w/2,h*.33,txt$
Get Image ObjectID,0,0,w,h,1
Texture Object ObjectID,ObjectID
Set Current Bitmap 0
Delete Bitmap 1
Menu(MenuID).ObjectNum=ObjectID
Menu(MenuID).MenuText=txt$
Menu(MenuID).Pos.x=x#
Menu(MenuID).Pos.y=y#
Menu(MenuID).Pos.z=z#
Position Object ObjectID,Camera Position X(),Camera Position Y(),Camera Position Z()
Set Object To Camera Orientation ObjectID
Move Object ObjectID,z#
Move Object Right ObjectID,x#
Move Object Up ObjectID,y#
`Lock Object On ObjectID
Set Object Collision Off ObjectID
Set Object Collision To Boxes ObjectID
Endfunction

Function Menu_Wrangler()
Menu_Item=-1
For i = 0 to Array Count(Menu())
   ObjectID=Menu(i).ObjectNum
   If ObjectID>0
      Position Object ObjectID,Camera Position X(),Camera Position Y(),Camera Position Z()
      Set Object To Camera Orientation ObjectID
      Move Object ObjectID,Menu(i).Pos.z
      Move Object Right ObjectID,Menu(i).Pos.x
      Move Object Up ObjectID,Menu(i).Pos.y
      If Pick Object(MouseX(),MouseY(),ObjectID,ObjectID)=ObjectID
         Menu(i).Rotate=Menu(i).Rotate+1
         Menu_Item=i
      Else
         Menu(i).Rotate=0
      Endif
      If Menu(i).Rotate>89 Then Menu(i).Rotate=0
      Pitch Object Down ObjectID,Menu(i).Rotate
   Endif
Next i
If MouseClick()=1 And MouseRate=0
   MouseRate=1
Else
   If MouseClick()=0 Then MouseRate=0
   Menu_Item=-1
Endif
EndFunction Menu_Item

Function Delete_Menu_Box(MenuID)
ObjectID=Menu(MenuID).ObjectNum
If ObjectID>0
   If Object Exist(ObjectID)
      Delete Object ObjectID
      Delete Image ObjectID
   Endif
Endif
Menu(MenuID).ObjectNum=0
Menu(MenuID).MenuText=""
Menu(MenuID).Rotate=0
EndFunction

R_Main_Menu:
Data 0,"Movement Menu",0
Data 1,"Scanner Menu",0
Data 2,"Weapon Menu",0
Data 3,"Conditions Menu",0
Data 4,"Variables Menu",0
Data 5,"Misc. Menu",0
Data 6,"System Menu",0
Data 999,"999",999

R_Move_Menu:
Data 0,"Main Menu",0
Data 1,"Move Forward 1",0
Data 2,"Move Back 1",0
Data 3,"Set N=Tank_X",0
Data 4,"Set N=Tank_Y",0
Data 5,"Turn Tank Right 45",0
Data 6,"Turn Tank Left 45",0
Data 7,"Set N=Tank_Angle",0
Data 8,"Check Treads",0
Data 9,"Repair Treads",0
Data 999,"999",999

R_Scan_Menu:
Data 0,"Main Menu",0
Data 1,"Scan For Obstical",0
Data 2,"Set N=Object_Range",0
Data 3,"Set N=Object_X",0
Data 4,"Set N=Object_Y",0
Data 5,"Scan For Enemy",0
Data 6,"Set N=Enemy_Range",0
Data 7,"Set N=Enemy_X",0
Data 8,"Set N=Enemy_Y",0
Data 9,"Set N=Enemy_Angle",0
Data 10,"Turn Scanner Right 45",0
Data 11,"Turn Scanner Left 45",0
Data 12,"Set N=Scanner_Angle",0
Data 13,"Check Scanner",0
Data 14,"Repair Scanner",0
Data 15,"Set Scanner_Angle=N",0
Data 999,"999",999

R_Weapon_Menu:
Data 0,"Main Menu",0
Data 1,"Fire Weapon",0
Data 2,"Turn Turret Right 45",0
Data 3,"Turn Turret Left 45",0
Data 4,"Set N=Turret_Angle",0
Data 5,"Check Weapon",0
Data 6,"Repair Weapon",0
Data 7,"Check Turret",0
Data 8,"Repair Turret",0
Data 9,"Set Turret_Angle=N",0
Data 999,"999",999

R_Conditions_Menu:
Data 0,"Main Menu",0
Data 1,"If N < ",1
Data 2,"If N > ",1
Data 3,"If N = ",1
Data 4,"If N <> ",1
Data 5,"If N < A",0
Data 6,"If N > A",0
Data 7,"If N = A",0
Data 8,"If N <> A",0
Data 9,"If N < B",0
Data 10,"If N > B",0
Data 11,"If N = B",0
Data 12,"If N <> B",0
Data 13,"End If",0
Data 999,"999",999

R_Var_Menu:
Data 0,"Main Menu",0
Data 1,"Set A = N",0
Data 2,"Set A = B",0
Data 3,"Set B = A",0
Data 4,"Set B = N",0
Data 5,"Set N = A",0
Data 6,"Set N = B",0
Data 7,"Set N=Random(A)",0
Data 8,"Set A = ",1
Data 9,"Set B = ",1
Data 10,"Set N = ",1
Data 11,"Set N = N + ",1
Data 12,"Set N = N - ",1
Data 13,"Set N = N + A",0
Data 14,"Set N = N - A",0
Data 15,"Set N = Damage",0
Data 999,"999",999


R_Misc_Menu:
Data 0,"Main Menu",0
Data 1,"Goto ",1
Data 2,"Wait ",1
Data 3,"Repeat ",1
Data 4,"Loop   ",0
Data 5,"Set N = Tank_Hit",0
Data 6,"Check Armor",0
Data 7,"Repair Armor",0
Data 8,"Check Hull",0
Data 9,"Repair Hull",0
Data 10,"Raise Shield",0
Data 11,"Lower Shield",0
Data 12,"Set N = Shield Energy",0
Data 999,"999",999

R_Syst_Menu:
Data 0,"Main Menu",0
Data 1,"Save Code",1
Data 2,"Load Code",1
Data 3,"Test Code",0
Data 4,"Play Code",0
Data 999,"999",999


Function C_Move_Forward(P)
   If Player(P).Treads<1 Or Player(P).Shield_on=1 Then ExitFunction
   Move Object Player(P).Tank_Object,5
   If Object Collision (Player(P).Tank_Object,0)>0 Then Move Object Player(P).Tank_Object,-5
   Player(P).Com_Delay=50
EndFunction

Function C_Move_Back(P)
   If Player(P).Treads<1 Or Player(P).Shield_on=1 Then ExitFunction
   Move Object Player(P).Tank_Object,-5
   If Object Collision (Player(P).Tank_Object,0)>0 Then Move Object Player(P).Tank_Object,5
   Player(P).Com_Delay=50
EndFunction

Function C_Set_N_To_Px(P)
   Player(P).N=Object Position X(Player(P).Tank_Object)
   Player(P).Com_Delay=1
EndFunction

Function C_Set_N_To_Py(P)
   Player(P).N=Object Position Z(Player(P).Tank_Object)
   Player(P).Com_Delay=1
EndFunction

Function C_Turn_Right(P)
   If Player(P).Treads<1 Or Player(P).Shield_on=1 Then ExitFunction
   Player(P).Tank_Angle=Player(P).Tank_Angle+45
   If Player(P).Tank_Angle>360 Then Player(P).Tank_Angle=Player(P).Tank_Angle-360
   If Player(P).Tank_Angle<0 Then Player(P).Tank_Angle=Player(P).Tank_Angle+360
   Rotate Object Player(P).Tank_Object,0,Player(P).Tank_Angle,0
   Player(P).Com_Delay=50
EndFunction

Function C_Turn_Left(P)
   If Player(P).Treads<1 Or Player(P).Shield_on=1 Then ExitFunction
   Player(P).Tank_Angle=Player(P).Tank_Angle-45
   If Player(P).Tank_Angle>359 Then Player(P).Tank_Angle=Player(P).Tank_Angle-360
   If Player(P).Tank_Angle<0 Then Player(P).Tank_Angle=Player(P).Tank_Angle+360
   Rotate Object Player(P).Tank_Object,0,Player(P).Tank_Angle,0
   Player(P).Com_Delay=50
EndFunction

Function C_Set_N_To_Pa(P)
   Player(P).N=Player(P).Tank_Angle
   Player(P).Com_Delay=1
EndFunction

Function C_Check_Treads(P)
   Player(P).Temp_Damage=Player(P).Treads
   Player(P).Com_Delay=10
EndFunction

Function C_Repair_Treads(P)
   If Player(P).Repair_Kits>0
      Player(P).Repair_Kits=Player(P).Repair_Kits-1
      Player(P).Treads=100
      Player(P).Com_Delay=100
   Else
      Player(P).Com_Delay=1
   EndIf
EndFunction

Function C_Scan_For_Obst(P)
   If Player(P).Scanner<1 Or Player(P).Shield_on=1 Then ExitFunction
   If Object Exist(2) Then Delete Object 2
   Make Object Cube 2,5
   Return_Object(Player(P).Tank_Object)
   Rotate Object 2,0,Player(P).Scanner_Angle+Player(P).Tank_Angle,0
   For i = 1 to 10
      Scale Object 2,i*100,100,100
      Position Object 2,Object.x,Object.y,Object.z
      Move Object 2,5*i
      If Object Collision(2,0)>600
         Player(P).Temp_Object=Object Collision(2,0)
         Player(P).Temp_Range=i
         Exit
      Else
         Player(P).Temp_Object=0
         Player(P).Temp_Range=999
      Endif
   Next i
   Delete Object 2
   Player(P).Com_Delay=20
Endfunction

Function C_Set_N_To_Or(P)
   Player(P).N=Player(P).Temp_Range
   Player(P).Com_Delay=1
EndFunction

Function C_Set_N_To_Ox(P)
   Return_Object(Player(P).Temp_Object)
   Player(P).N=Object.x
   Player(P).Com_Delay=1
EndFunction

Function C_Set_N_To_Oy(P)
   Return_Object(Player(P).Temp_Object)
   Player(P).N=Object.z
   Player(P).Com_Delay=1
EndFunction

Function C_Scan_For_Enemy(P)
   If Player(P).Scanner<1 Or Player(P).Shield_on=1 Then ExitFunction
   If Object Exist(2) Then Delete Object 2
   Make Object Cube 2,5
   Set Object Collision To Boxes 2
   Return_Object(Player(P).Tank_Object)
   Rotate Object 2,0,Player(P).Scanner_Angle+Player(P).Tank_Angle,0
   For i = 1 to 10
      Scale Object 2,i*100,100,100
      Position Object 2,Object.x,Object.y,Object.z
      Move Object 2,5*i
      oc=Object Collision(2,0)
      If oc>9 And oc<21 And oc<>Player(P).Tank_Object
         Player(P).Temp_Enemy=oc
         Player(P).Temp_Range=i
         Exit
      Else
         Player(P).Temp_Enemy=0
         Player(P).Temp_Range=999
      Endif
   Next i
   Delete Object 2
   Player(P).Com_Delay=20
Endfunction

Function C_Set_N_To_Er(P)
   Player(P).N=Player(P).Temp_Range
   Player(P).Com_Delay=1
EndFunction

Function C_Set_N_To_Ex(P)
   Return_Object(Player(P).Temp_Enemy)
   Player(P).N=Object.x
   Player(P).Com_Delay=1
EndFunction

Function C_Set_N_To_Ey(P)
   Return_Object(Player(P).Temp_Enemy)
   Player(P).N=Object.z
   Player(P).Com_Delay=1