TGC Codebase Backup



A early testing demo of my game by Laak

15th Apr 2006 21:07
Summary

this is a testing version of my game. please tell me what you think and any suggestions. right now it does not have any effects, interface, or good graphics. will put in mine, rock



Description



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    Rem Project: BOBBLE2A
Rem Created: 3/27/2006 6:19:01 PM

Rem ***** Main Source File *****
REM USEFUL DATA
REMSTART
HEADER:
1-10: PLAYER 1
10-20: PLAYER 2
20-100: WORLD AND EFFECTS
100-300: BULLETS
300-400: INTERACTIVE OBJECTS(POWERUPS,TURRETS,ETC)

POWERUP IDS:
1=HEALTH
2=SPEED
3=MINES
4=ROCKETS
REMEND
REM COMPLETE REMAKE OF THE ORIGINAL BOBBLE GAME




RANDOMIZE TIMER()
SYNC ON
SET DISPLAY MODE 1280,1024,0
`SET WINDOW SIZE 960,768
`SET WINDOW POSITION 160,128
HIDE MOUSE
GOSUB LOAD_SEQ
GOSUB INIT_PLAYER_1
GOSUB INIT_PLAYER_2
GOSUB INIT_GLOBAL_VARS
GOSUB INIT_BULLETS
GOSUB INIT_POWERUPS
GOSUB MAKE_TERRAIN
GOSUB MAKE_BOUNDING
GOSUB MAKE_LIGHTING
GOSUB MAKE_WATER
GOSUB INIT_EFFECTS
GOSUB UPDATE_OBJECTS
GOSUB INIT_SOUNDS

DO
GOSUB REFRESH
GOSUB GLOBAL_TIMER
REM UPDATES TIMER FOR INTERPOLATION BASED MOVEMENT
IF LOOP_COUNT > 10
GOSUB CONTROLS_Q_MOVEMENT
ENDIF
REM THIS ALSO UPDATES PLAYER POSITION
GOSUB UPDATE_PLAYER_EFFECTS
REM FOR DIFFERENT PLAYER GRAPHICS EFFECTS
GOSUB BULLETS
REM THIS UPDATES AND CONTROLS BULLETS. FIRE COMMAND IS GENERATED IN THE CONTROLS SECTION
GOSUB WATER_ENGINE
REM FOR DECIDING WHICH WATER MESHES TO RENDER AS ALPHA

GOSUB COLLISIONS_BULLETS
REM
GOSUB COLLISIONS_TANKS

GOSUB EFFECTS
REM SMOKE,WATER FOAM,EXPLOSIONS,ETC
GOSUB UPDATE_POWERUPS

GOSUB GLOBAL_SOUNDS


GOSUB UPDATE_CAMERA
LOOP


LOAD_SEQ:
TANK_TEX = 1
MATRIX_TEX = 2
SKYBOX_TEX = 4
WATER_TEX = 3
EXPL_TEX = 5
POW1_TEX = 6
POW2_TEX = 7
FIRE1_SND = 2
HIT1_SND = 3
WATER1_SND = 4
TANK1_SND = 5
TANK2_SND = 6
M1= 1

SET CURSOR 500,480
PRINT "LOADING"
SYNC


LOAD IMAGE "LEAD.BMP",TANK_TEX
LOAD IMAGE "GRASSTEX2.JPG",MATRIX_TEX
LOAD IMAGE "WATERSHINE2.BMP",WATER_TEX,1
LOAD IMAGE "allround.bmp",SKYBOX_TEX,1

load image "health_powerup.bmp",POW1_TEX,1
LOAD IMAGE "SPEED_powerup.JPG",POW2_TEX,1



LOAD SOUND "BUTTON 2.WAV",FIRE1_SND
LOAD SOUND "HIT TUBE.WAV",HIT1_SND
LOAD SOUND "ROWING BOAT LOOP.WAV",WATER1_SND
LOAD SOUND "SKIDOO LOOP.WAV",TANK1_SND
CLONE SOUND TANK2_SND,TANK1_SND
SET SOUND VOLUME TANK1_SND,92
SET SOUND VOLUME TANK2_SND,92


LOAD MUSIC "ARCADE6.MIDI",M1

RETURN


INIT_PLAYER_1:

TYPE PLAYER
R AS INTEGER
G AS INTEGER
B AS INTEGER
SX AS FLOAT
SY AS FLOAT
SZ AS FLOAT
X as float
Y as float
Z AS FLOAT
SPEED AS FLOAT
TANK_ANG AS FLOAT
TURRET_ANG AS FLOAT
HEALTH AS FLOAT
ACCELERATE_ON AS INTEGER
MOVE_ON AS INTEGER
TURN_TANK_ON AS INTEGER
TURN_TURRET_ON AS INTEGER
ACCEL_RATE AS FLOAT
DECCEL_RATE AS FLOAT
TURN_TANK_RATE AS FLOAT
TURN_TURRET_RATE AS FLOAT
SPEED_CAP AS FLOAT
FIRE_W_1 AS BOOLEAN
FIRE_W_2 AS BOOLEAN
CURRENT_BULLET AS INTEGER
COL_RAD AS FLOAT
JOYX AS FLOAT
JOYY AS FLOAT
JOYZ AS FLOAT
CONTROL_TYPE AS FLOAT
BUL_DEL AS FLOAT
COLLISION AS BOOLEAN
COL_COUNT AS INTEGER
SPEED_COUNT AS INTEGER
ENDTYPE

P1 AS PLAYER

P1.R = RND(255)
P1.G = RND(255)
P1.B = RND(255)
P1.SX = 0
P1.SY = 0
P1.SZ = 300
P1.HEALTH = 100
P1.TURN_TANK_RATE = .1
P1.ACCEL_RATE = .0007
P1.DECCEL_RATE = .00007
P1.SPEED_CAP = .2
P1.CURRENT_BULLET = 0
P1.COL_RAD = 11
P1.BUL_DEL = 9
P1.SPEED = .00001

TYPE CAMERA
X AS INTEGER
Y AS INTEGER
Z AS INTEGER
AX AS INTEGER
AY AS INTEGER
AZ AS INTEGER
DIST AS FLOAT
HEIGHT AS FLOAT
SMOOTH AS INTEGER
RANGE AS INTEGER
ENDTYPE
C1 AS CAMERA
C1.DIST = 100
C1.HEIGHT = 30
C1.SMOOTH = 25
C1.RANGE = 6000


Autocam off
make camera 1
POSITION CAMERA 1,0,0,0
POSITION CAMERA 1,0,50,400
YROTATE CAMERA 1,180
set camera view 1,0,0,1280,512
set camera aspect 1,2.25
SET CAMERA RANGE 1,1,C1.RANGE

MAKE OBJECT CUBE 1,20
SCALE OBJECT 1,100,30,100
MAKE OBJECT SPHERE 2,20
MAKE OBJECT CYLINDER 3,10
XROTATE OBJECT 3,90
FIX OBJECT PIVOT 3
SCALE OBJECT 3,50,225,50
SET OBJECT CULL 3,0

FOR T=4 TO 7
MAKE OBJECT SPHERE T,9
NEXT T


POSITION OBJECT 1,P1.SX,P1.SY,P1.SZ
POSITION OBJECT 2,P1.SX,P1.SY,P1.SZ
POSITION OBJECT 3,P1.SX,P1.SY,P1.SZ



`COLOR OBJECT 1,RGB(P1.R,P1.G,P1.B)
TEXTURE OBJECT 1,TANK_TEX
TEXTURE OBJECT 2,TANK_TEX
TEXTURE OBJECT 3,TANK_TEX
FOR T= 4 TO 7
TEXTURE OBJECT T,TANK_TEX
NEXT T
`COLOR OBJECT 2,RGB(P1.R,P1.G,P1.B)
`COLOR OBJECT 3,RGB(P1.R,P1.G,P1.B)


SET OBJECT EMISSIVE 1,RGB(0,50,255)
SET OBJECT EMISSIVE 2,RGB(0,50,255)
SET OBJECT EMISSIVE 3,RGB(0,50,255)
FOR T= 4 TO 7
SET OBJECT EMISSIVE T,RGB(0,50,255)
NEXT T


RETURN






INIT_PLAYER_2:

P2 AS PLAYER

P2.R = RND(255)
P2.G = RND(255)
P2.B = RND(255)
P2.X = 0
P2.Y = 0
P2.Z = -500
P2.HEALTH = 100
P2.TURN_TANK_RATE = .1
P2.ACCEL_RATE = .0007
P2.DECCEL_RATE = .00007
P2.SPEED_CAP = .2
P2.TURN_TURRET_RATE = .2
P2.CURRENT_BULLET = 0
P2.COL_RAD = 11
P2.CONTROL_TYPE = 1
P2.SPEED = .00001


C2 AS CAMERA
C2.DIST = 100
C2.HEIGHT = 30
C2.SMOOTH = 25
C2.RANGE = 6000

make camera 2
position camera 2,0,50,-400
YROTATE CAMERA 2,0
set camera view 2,0,512,1280,1024
set camera aspect 2,2.25
SET CAMERA RANGE 2,1,C2.RANGE

MAKE OBJECT CUBE 11,20
SCALE OBJECT 11,100,30,100
MAKE OBJECT SPHERE 12,20
MAKE OBJECT CYLINDER 13,10
XROTATE OBJECT 13,90
FIX OBJECT PIVOT 13
SCALE OBJECT 13,50,225,50
SET OBJECT CULL 13,0
FOR T=14 TO 17
MAKE OBJECT SPHERE T,9
NEXT T



POSITION OBJECT 11,P2.SX,P2.SY,P2.SZ
POSITION OBJECT 12,P2.SX,P2.SY,P2.SZ
POSITION OBJECT 13,P2.SX,P2.SY,P2.SZ



`COLOR OBJECT 11,RGB(P2.R,P2.G,P2.B)
TEXTURE OBJECT 11,TANK_TEX
TEXTURE OBJECT 12,TANK_TEX
TEXTURE OBJECT 13,TANK_TEX
FOR T= 14 TO 17
TEXTURE OBJECT T,TANK_TEX
NEXT T
`COLOR OBJECT 12,RGB(P2.R,P2.G,P2.B)
`COLOR OBJECT 13,RGB(P2.R,P2.G,P2.B)


SET OBJECT EMISSIVE 11,RGB(0,50,255)
SET OBJECT EMISSIVE 12,RGB(0,50,255)
SET OBJECT EMISSIVE 13,RGB(0,50,255)
FOR T= 14 TO 17
SET OBJECT EMISSIVE T,RGB(0,50,255)
NEXT T


RETURN

INIT_GLOBAL_VARS:
TIME1 AS INTEGER ` VARIABLES TO DEDUCE ELAPSED TIME FROM CYCLE TO CYCLE
TIME2 AS INTEGER ` ''
ELAPSED AS INTEGER ` ''
AMBIENT AS INTEGER`AMBIENT LIGHT LEVEL
MATOFFSETX AS INTEGER ` OFFSET VALUE OF MATRIX FROM ORIGIN
MATOFFSETX AS INTEGER ` ''
START_COUNTER AS INTEGER REM USE TO LOCK MOVEMENT UNTIL FRAME RATE STEADIES.
LOOP_COUNT AS INTEGER REM USED TO FIND OUT AVERAGE FRAME RATE FOR ENTIRE PROGRAM AND ADJUST CAMERA SMOOTH VALUES ACCORDINGLY
`SOMETIMES A RAPID CHANGE IN FPS CAN DISRUPT THE INTERPOLATION ENGINE
TEXT_SIZE AS INTEGER ` KINDOF OBVIOUS
TEXT_FONT AS STRING
NMOUSE AS INTEGER ` TWO MOUSE VALUES FOR DETERMINING MOUSE SPEED
PMOUSE AS INTEGER ` ''
MOVEMOUSE AS INTEGER
BULLET_DELAY AS FLOAT
CURRENT_EXPLOSION AS INTEGER


AMBIENT = 40
START_COUNTER = 150
MATOFFSETX = -500
MATOFFSETZ = -500
ELAPSED = 1
TEXT_FONT = "ARIAL"
TEXT_SIZE = 18
CURRENT_EXPLOSION = 0

BUL_RATE = 100
RETURN


INIT_BULLETS:
type bullet
   ID AS INTEGER
   SPEED AS FLOAT
   COLORR AS INTEGER
   COLORB AS INTEGER
   COLORG AS INTEGER
   ALIVE AS BOOLEAN
   START_X_POS AS FLOAT
   START_Y_POS AS FLOAT
   START_Z_POS AS FLOAT
   X AS FLOAT
   Y AS FLOAT
   Z AS FLOAT
   X_ANGLE AS FLOAT
   Y_ANGLE AS FLOAT
   Z_ANGLE AS FLOAT
   SIZE AS FLOAT
   RANGE AS FLOAT
   DAMAGE AS FLOAT
   HEIGHT AS FLOAT
endtype
DIM P1_BULLETS(100) AS BULLET
DIM P2_BULLETS(100) AS BULLET

FOR T=0 TO 99
P1_BULLETS(T).ID = T
P1_BULLETS(T).SPEED = .25
P1_BULLETS(T).COLORR = RND(255)
P1_BULLETS(T).COLORG = RND(255)
P1_BULLETS(T).COLORB = RND(255)
P1_BULLETS(T).START_X_POS = P1.X
P1_BULLETS(T).START_Y_POS = P1.Y
P1_BULLETS(T).START_Z_POS = P1.Z
P1_BULLETS(T).Y_ANGLE = P1.TANK_ANG
P1_BULLETS(T).SIZE = 6.5
P1_BULLETS(T).RANGE = 3000
P1_BULLETS(T).DAMAGE = 1
P1_BULLETS(T).HEIGHT = 5
MAKE OBJECT SPHERE T+100,P1_BULLETS(T).SIZE,5,5
POSITION OBJECT T+100,P1_BULLETS(T).START_X_POS,P1_BULLETS(T).START_Y_POS,P1_BULLETS(T).START_Z_POS
COLOR OBJECT T+100,RGB(P1_BULLETS(T).COLORR,P1_BULLETS(T).COLORG,P1_BULLETS(T).COLORB)
SET OBJECT EMISSIVE T+100,RGB(P1_BULLETS(T).COLORR/2,P1_BULLETS(T).COLORG/2,P1_BULLETS(T).COLORB/2)
NEXT T

FOR T=0 TO 99
P2_BULLETS(T).ID = T
P2_BULLETS(T).SPEED = .25
P2_BULLETS(T).COLORR = RND(255)
P2_BULLETS(T).COLORG = RND(255)
P2_BULLETS(T).COLORB = RND(255)
P2_BULLETS(T).START_X_POS = P2.X
P2_BULLETS(T).START_Y_POS = P2.Y
P2_BULLETS(T).START_Z_POS = P2.Z
P2_BULLETS(T).Y_ANGLE = P2.TANK_ANG
P2_BULLETS(T).SIZE = 6.5
P2_BULLETS(T).RANGE = 3000
P2_BULLETS(T).DAMAGE = 1
P2_BULLETS(T).HEIGHT = 5
MAKE OBJECT SPHERE T+200,P2_BULLETS(T).SIZE,5,5
POSITION OBJECT T+200,P2_BULLETS(T).START_X_POS,P2_BULLETS(T).START_Y_POS,P2_BULLETS(T).START_Z_POS
COLOR OBJECT T+200,RGB(P2_BULLETS(T).COLORR,P2_BULLETS(T).COLORG,P2_BULLETS(T).COLORB)
SET OBJECT EMISSIVE T+200,RGB(P2_BULLETS(T).COLORR/2,P2_BULLETS(T).COLORG/2,P2_BULLETS(T).COLORB/2)
NEXT T

RETURN

INIT_POWERUPS:
TYPE POWERUP
VARIANT AS INTEGER `defines type of powerup when spawned
COL_RAD AS FLOAT
ALIVE AS BOOLEAN
HIT AS BOOLEAN
ON AS BOOLEAN
X AS FLOAT
Y AS FLOAT
Z AS FLOAT
DURATION  AS INTEGER
ENDTYPE
DIM POW(10) AS POWERUP
FOR T=0 TO 10

`TEMP = RND(100)
`IF TEMP=<40 THEN POW(T).VARIANT = 1
`IF TEMP>40 AND TEMP =<65 THEN POW(T).VARIANT = 2
`IF TEMP>65 AND TEMP =<90 THEN POW(T).VARIANT = 3
`IF TEMP>90 THEN POW(T).VARIANT = 4
`POW(T).VARIANT = RND(1)+1
pow(t).variant = 1
SPAWN_POWERUP(T,T+300,POW(T).VARIANT)

NEXT T


RETURN

MAKE_TERRAIN:
MAKE MATRIX 1,1000,1000,75,75
POSITION MATRIX 1,MATOFFSETX,0,MATOFFSETZ
PREPARE MATRIX TEXTURE 1,MATRIX_TEX,1,1
FILL MATRIX 1,0,1

FOR T= 1 TO RND(7)+3
SET MATRIX HEIGHT 1,RND(40)+5,RND(40)+5,RND(300)+100
SET MATRIX HEIGHT 1,RND(40)+5,RND(40)+5,RND(300)+100
NEXT T



FOR T=3 TO 72
FOR M=72 TO 3 STEP -1
PREVX# = GET MATRIX HEIGHT(1,T-1,M)
PREVZ# = GET MATRIX HEIGHT(1,T,M-1)
NEXX# = GET MATRIX HEIGHT(1,T+1,M)
NEXZ# = GET MATRIX HEIGHT(1,T,M+1)
DPREVX# = GET MATRIX HEIGHT(1,T-2,M)
DPREVZ# = GET MATRIX HEIGHT(1,T,M-2)
DNEXX# = GET MATRIX HEIGHT(1,T+2,M)
DNEXZ# = GET MATRIX HEIGHT(1,T,M+2)
TPREVX# = GET MATRIX HEIGHT(1,T-3,M)
TPREVZ# = GET MATRIX HEIGHT(1,T,M-3)
TNEXX# = GET MATRIX HEIGHT(1,T+3,M)
TNEXZ# = GET MATRIX HEIGHT(1,T,M+3)
ADD# = PREVX# + PREVZ# + NEXX# +NEXZ# + DPREVX# + DPREVZ# + DNEXX# + DNEXZ# + TPREVX# + TPREVZ# + TNEXX# + TNEXZ#
H#= ADD# / 6
SET MATRIX HEIGHT 1,T,M,H#
NEXT M
NEXT T


set normalization on
For Z =0 To 74
   For X = 0 To 74
`         Make Vectors
        r=Make Vector3(1)
        r=Make Vector3(2)
        r=Make Vector3(3)

        tw#=13 ` need to adjust according to "look"  - heavy/light shadows 0-15

        `Make two vectors at each vertex in same plane
        AX# = X: AZ# = Z:AY# = Get matrix Height(1, AX#, AZ#)
        dzx#=((Get matrix Height(1, AX#, AZ#))- (Get matrix Height(1, AX#+1, AZ#)))
        dzy#=((Get matrix Height(1, AX#, AZ#))- (Get matrix Height(1, AX#, AZ#+1)))

        ` Set vectors  - based on your axis, might need to change (-) signs
        Set Vector3 1, -tw#,dzx#,0
        Set Vector3 2, 0,-dzy#,tw#

        ` Get cross product of 2 vertex vectors - gives the normal
        Cross Product Vector3 3,1,2

        `Pull out x,y,z of Normal
        nx#=x vector3(3)
        ny#=y vector3(3)
        nz#=z vector3(3)
        set matrix normal 1, x,z,nx#,ny#,nz#

   Next X
Next Z


UPDATE MATRIX 1

RETURN




MAKE_BOUNDING:
MAKE OBJECT CUBE 10,5000
SET OBJECT CULL 10,0
TEXTURE OBJECT 10,SKYBOX_TEX
SET OBJECT LIGHT 10,0
SET OBJECT TEXTURE 10,2,0
set object texture 10,1,0
RETURN

MAKE_LIGHTING:
SET AMBIENT LIGHT AMBIENT

RETURN

MAKE_WATER:
rem center water object
MAKE OBJECT PLAIN 20,5000,5000
XROTATE OBJECT 20,90
FIX OBJECT PIVOT 20
POSITION OBJECT 20,0,1,0
`color object 20,rgb(0,120,255)
TEXTURE OBJECT 20,WATER_TEX
`SET ALPHA MAPPING ON 20,70
SET OBJECT EMISSIVE 20,RGB(30,80,180)
RETURN

INIT_EFFECTS:
remstart
TYPE EXPLOSION
X AS FLOAT
Y AS FLOAT
Z AS FLOAT
ALPHA AS FLOAT
SCALE AS FLOAT
ALIVE AS BOOLEAN
ENDTYPE

DIM EXPL(5) AS EXPLOSION

FOR T= 0 TO 5
EXPL(T).ALPHA = 100
EXPL(T).SCALE = 100
EXPL(T).ALIVE = 0
MAKE OBJECT SPHERE T+30,10,10,10
HIDE OBJECT T+30

NEXT T
remend
RETURN

UPDATE_OBJECTS:

`PLAYER 1
POSITION OBJECT 1,OBJECT POSITION X(1),GET GROUND HEIGHT(1,OBJECT POSITION X(1),OBJECT POSITION Z(1)),OBJECT POSITION Z(1)
POSITION OBJECT 2,OBJECT POSITION X(2),GET GROUND HEIGHT(1,OBJECT POSITION X(2),OBJECT POSITION Z(2)),OBJECT POSITION Z(2)
POSITION OBJECT 3,OBJECT POSITION X(3),GET GROUND HEIGHT(1,OBJECT POSITION X(3),OBJECT POSITION Z(3)),OBJECT POSITION Z(3)

POSITION OBJECT 11,OBJECT POSITION X(11),GET GROUND HEIGHT(1,OBJECT POSITION X(11),OBJECT POSITION Z(11)),OBJECT POSITION Z(11)
POSITION OBJECT 12,OBJECT POSITION X(12),GET GROUND HEIGHT(1,OBJECT POSITION X(12),OBJECT POSITION Z(12)),OBJECT POSITION Z(12)
POSITION OBJECT 13,OBJECT POSITION X(13),GET GROUND HEIGHT(1,OBJECT POSITION X(13),OBJECT POSITION Z(13)),OBJECT POSITION Z(13)

RETURN

INIT_SOUNDS:
`LOOP SOUND TANK1_SND
`LOOP SOUND TANK2_SND
LOOP MUSIC M1
RETURN

REFRESH:
SYNC

`FRAME_RATE=50-ELAPSED
`IF FRAME_RATE<0 THEN FRAME_RATE= 0
`IF LOOP_COUNT < 100
`IF ELAPSED < 33 THEN WAIT 33-ELAPSED
`ENDIF












`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````

WAIT 0 `ADJUST THIS VALUE TO DECREASE OR INCREASE FRAME RATE. THE
`ELAPSED VALUE IS A COUNTER THAT STORES THE NUMBER OF MILLESECONDS SINCE THE LAST UPDATE. SUBTRACT
`THIS FROM 33 AND YOU SHOULD HAVE A PRETTY SMOOTH FRAME RATE. FOR FASTER COMPUTERS SUBTRACT FROM 66.

``````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
`````````````````````````````````````````````````````````````````````````````
````````````````````````````````````````````````````````````````````````````













SET CURSOR 0,0
SET TEXT SIZE TEXT_SIZE
SET TEXT FONT TEXT_FONT
PRINT "P1.X=",P1.X
PRINT "P1.Y=",P1.Y
PRINT "P1.Z=",P1.Z
PRINT "P2.X=",P2.X
PRINT "P2.Y=",P2.Y
PRINT "P2.Z=",P2.Z
PRINT "ELAPSED =",ELAPSED
PRINT "COUNTER=",COUNTER
PRINT "P1.SPEED=",P1.SPEED
PRINT "P2.SPEED=",P2.SPEED
PRINT "FPS=",SCREEN FPS()
PRINT "MOUSEMOVEX=",MOVEMOUSE
PRINT "W KEY=",KEYSTATE(17)
PRINT "P2.ACCEL=",P2.ACCELERATE_ON
PRINT "KEY=",SCANCODE()
PRINT "P1.CB=",P1.CURRENT_BULLET
print "P2.CB=",P2.CURRENT_BULLET
PRINT "C1.SMOOTH =",C1.SMOOTH
PRINT "LOOPCOUNT=",LOOP_COUNT
INK RGB(200,0,90),0
PRINT "P1.HEALTH=",P1.HEALTH
PRINT "P2.HEALTH=",P2.HEALTH
INK RGB(255,255,255),0
PRINT "JOYX = ",JOYX
PRINT "JOYY = ",JOYY
PRINT "P2.ACCEL_RATE = ",P2.ACCEL_RATE
PRINT "JIO#",JY#
PRINT "JY/1000=",JY#/1000
PRINT "P1.COL_COUNT=",P1.COL_COUNT
PRINT "P1.COLLISION=",P1.COLLISION
PRINT "P1.SPEED_COUNT+",P1.SPEED_COUNT

IF KEYSTATE(157) = 1 THEN P1.HEALTH = 100 AND P2.HEALTH = 200

RETURN

GLOBAL_TIMER:
TIME1 = TIMER()
ELAPSED = TIME1-TIME2
TIME2 = TIMER()
INC LOOP_COUNT
RETURN



CONTROLS_Q_MOVEMENT:

REM DETECT CONTROLS
IF UPKEY() = 1
INC P1.SPEED,ELAPSED*P1.ACCEL_RATE
ENDIF
IF DOWNKEY() = 1
DEC P1.SPEED,ELAPSED*P1.ACCEL_RATE
ENDIF

IF RIGHTKEY() = 1
INC P1.TANK_ANG,ELAPSED*P1.TURN_TANK_RATE
ENDIF
IF LEFTKEY() = 1
DEC P1.TANK_ANG,ELAPSED*P1.TURN_TANK_RATE
ENDIF
IF MOUSECLICK() = 1 THEN P1.FIRE_W_1 = 1 ELSE P1.FIRE_W_1 = 0


IF P2.CONTROL_TYPE = 1

IF KEYSTATE(17) = 1 AND P2.SPEED<P2.SPEED_CAP
INC P2.SPEED,ELAPSED*P2.ACCEL_RATE
endif

IF KEYSTATE(31) = 1 AND P1.SPEED>-P2.SPEED_CAP
DEC P2.SPEED,ELAPSED*P2.ACCEL_RATE
ENDIF

IF KEYSTATE(32) = 1
INC P2.TANK_ANG,ELAPSED*P2.TURN_TANK_RATE
ENDIF

IF KEYSTATE(30) = 1
DEC P2.TANK_ANG,ELAPSED*P2.TURN_TANK_RATE
ENDIF

IF KEYSTATE(51) = 1
DEC P2.TURRET_ANG,ELAPSED*P2.TURN_TURRET_RATE
ENDIF

IF KEYSTATE(52) = 1
INC P2.TURRET_ANG,ELAPSED*P2.TURN_TURRET_RATE
ENDIF

IF SPACEKEY() = 1
P2.FIRE_W_1 = 1
ELSE
P2.FIRE_W_1 = 0
ENDIF

ENDIF

IF P2.CONTROL_TYPE =2
JOYX = CONTROL DEVICE X()
JOYY = CONTROL DEVICE Y()
JOYZ = CONTROL DEVICE Z()
JY# = JOYY
JX# = JOYX
JZ# = JOYZ
P2.ACCEL_RATE = JY# / 2000000
P2.TURN_TANK_RATE = JX# / 8000
P2.TURN_TURRET_RATE = JZ# / 5000
IF JOYSTICK FIRE X(5)
P2.FIRE_W_1 = 1
ELSE
P2.FIRE_W_1 = 0
ENDIF

INC P2.SPEED,ELAPSED*P2.ACCEL_RATE
INC P2.TANK_ANG,ELAPSED*P2.TURN_TANK_RATE
INC P2.TURRET_ANG,ELAPSED*P2.TURN_TURRET_RATE

ENDIF





REM BEGIN HANDLE FORWARD BACK MOVEMENT



IF P1.SPEED > 0 THEN DEC P1.SPEED,P1.DECCEL_RATE*ELAPSED
IF P1.SPEED < 0 THEN INC P1.SPEED,P1.DECCEL_RATE*ELAPSED

if P1.SPEED > P1.SPEED_CAP THEN P1.SPEED = P1.SPEED_CAP
if P1.SPEED < -P1.SPEED_CAP THEN P1.SPEED = -P1.SPEED_CAP


P1.X = P1.X + SIN(P1.TANK_ANG)*(P1.SPEED*ELAPSED)
P1.Z = P1.Z + COS(P1.TANK_ANG)*(P1.SPEED*ELAPSED)

REM PLAYER 2



IF P2.SPEED > 0 THEN DEC P2.SPEED,P2.DECCEL_RATE*ELAPSED
IF P2.SPEED < 0 THEN INC P2.SPEED,P2.DECCEL_RATE*ELAPSED

if P2.SPEED > P2.SPEED_CAP THEN P2.SPEED = P2.SPEED_CAP
if P2.SPEED < -P2.SPEED_CAP THEN P2.SPEED = -P2.SPEED_CAP

P2.X = P2.X + SIN(P2.TANK_ANG)*(P2.SPEED*ELAPSED)
P2.Z = P2.Z + COS(P2.TANK_ANG)*(P2.SPEED*ELAPSED)


REM END HANDLE F+B MOVEMENT
REM BEGIN HANDLE TURNING
INC P1.TURRET_ANG,MOUSEMOVEX()/3
REM END  HANDLE TURNING










REM END DETECT
REM BEGIN PLAYER UPDATE

P1.Y = GET GROUND HEIGHT(1,OBJECT POSITION X(1)-MATOFFSETX,OBJECT POSITION Z(1)-MATOFFSETZ)
P2.Y = GET GROUND HEIGHT(1,OBJECT POSITION X(11)-MATOFFSETX,OBJECT POSITION Z(11)-MATOFFSETZ)
REM BEFORE POSITIONING, DO A BOUNDS CHECK

REM END BOUNDS CHECK

REM UPDATE POSITION





POSITION OBJECT 1,P1.X,P1.Y,P1.Z
POSITION OBJECT 2,P1.X,P1.Y,P1.Z
POSITION OBJECT 3,P1.X+SIN(P1.TURRET_ANG)*6,P1.Y+5,P1.Z+COS(P1.TURRET_ANG)*6






YROTATE OBJECT 1,P1.TANK_ANG
YROTATE OBJECT 2,P1.TANK_ANG
YROTATE OBJECT 3,P1.TURRET_ANG

P1.X = OBJECT POSITION X(1)
P1.Y = OBJECT POSITION Y(1)
P1.Z = OBJECT POSITION Z(1)
P1.TANK_ANG = OBJECT ANGLE Y(1)
M=45
FOR T=4 TO 7
POSITION OBJECT T,P1.X+(SIN(P1.TANK_ANG+M)*11),P1.Y,P1.Z+(COS(P1.TANK_ANG+M)*11)
YROTATE OBJECT T,P1.TANK_ANG
INC M,90
NEXT T

POSITION OBJECT 11,P2.X,P2.Y,P2.Z
POSITION OBJECT 12,P2.X,P2.Y,P2.Z
POSITION OBJECT 13,P2.X+SIN(P2.TURRET_ANG)*6,P2.Y+5,P2.Z+COS(P2.TURRET_ANG)*6




YROTATE OBJECT 11,P2.TANK_ANG
YROTATE OBJECT 12,P2.TANK_ANG
YROTATE OBJECT 13,P2.TURRET_ANG

P2.X = OBJECT POSITION X(11)
P2.Y = OBJECT POSITION Y(11)
P2.Z = OBJECT POSITION Z(11)
P2.TANK_ANG = OBJECT ANGLE Y(11)


M=45
FOR T=14 TO 17
POSITION OBJECT T,P2.X+(SIN(P2.TANK_ANG+M)*11),P2.Y,P2.Z+(COS(P2.TANK_ANG+M)*11)
YROTATE OBJECT T,P2.TANK_ANG
INC M,90
NEXT T

REM END POSITION UPDATE

RETURN

UPDATE_PLAYER_EFFECTS:
RETURN

BULLETS:
DEC P2.BUL_DEL
DEC P1.BUL_DEL

IF P2.CURRENT_BULLET => 100 THEN P2.CURRENT_BULLET = 0
IF P2.FIRE_W_1 = 1 AND P2.BUL_DEL =< 0
   P2_BULLETS(P2.CURRENT_BULLET).RANGE = 1000
   P2_BULLETS(P2.CURRENT_BULLET).ALIVE = 1
   P2_BULLETS(P2.CURRENT_BULLET).X = P2_BULLETS(P2.CURRENT_BULLET).START_X_POS
   P2_BULLETS(P2.CURRENT_BULLET).Y = P2_BULLETS(P2.CURRENT_BULLET).START_Y_POS
   P2_BULLETS(P2.CURRENT_BULLET).Z = P2_BULLETS(P2.CURRENT_BULLET).START_Z_POS
   position object P2.CURRENT_BULLET+200,P2_BULLETS(P2.CURRENT_BULLET).X,P2_BULLETS(P2.CURRENT_BULLET).Y,P2_BULLETS(P2.CURRENT_BULLET).Z
   P2_BULLETS(P2.CURRENT_BULLET).X_ANGLE = 0
   P2_BULLETS(P2.CURRENT_BULLET).Y_ANGLE = P2.TURRET_ANG
   P2_BULLETS(P2.CURRENT_BULLET).Z_ANGLE = 0
   ROTATE OBJECT P2.CURRENT_BULLET+200,P2_BULLETS(P2.CURRENT_BULLET).X_ANGLE,P2_BULLETS(P2.CURRENT_BULLET).Y_ANGLE,P2_BULLETS(P2.CURRENT_BULLET).Z_ANGLE
   PLAY SOUND FIRE1_SND
   P2.BUL_DEL = BUL_RATE/ELAPSED
   INC P2.CURRENT_BULLET
ENDIF
FOR T=0 TO 99
   IF P2_BULLETS(T).RANGE <= 0 THEN P2_BULLETS(T).ALIVE = 0

   IF P2_BULLETS(T).ALIVE = 1
      DEC P2_BULLETS(T).RANGE
      SHOW OBJECT T+200
      MOVE OBJECT T+200,P2_BULLETS(T).SPEED * ELAPSED
   ELSE
   HIDE OBJECT T+200
   POSITION OBJECT T+200,P2_BULLETS(T).START_X_POS,P2_BULLETS(T).START_Y_POS,P2_BULLETS(T).START_Z_POS
   ROTATE OBJECT T+200,P2_BULLETS(T).X_ANGLE,P2_BULLETS(T).Y_ANGLE,P2_BULLETS(T).Z_ANGLE,
   ENDIF
NEXT T
FOR T=0 TO 99
P2_BULLETS(T).START_X_POS = P2.X
P2_BULLETS(T).START_Y_POS = P2.Y
P2_BULLETS(T).START_Z_POS = P2.Z

P2_BULLETS(T).X_ANGLE = 0
P2_BULLETS(T).Y_ANGLE = P2.TURRET_ANG
P2_BULLETS(T).Z_ANGLE = 0

NEXT T

IF P1.CURRENT_BULLET => 100 THEN P1.CURRENT_BULLET = 0
IF P1.FIRE_W_1 = 1 AND  P1.BUL_DEL =< 0
   P1_BULLETS(P1.CURRENT_BULLET).RANGE = 1000
   P1_BULLETS(P1.CURRENT_BULLET).ALIVE = 1
   P1_BULLETS(P1.CURRENT_BULLET).X = P1_BULLETS(P1.CURRENT_BULLET).START_X_POS
   P1_BULLETS(P1.CURRENT_BULLET).Y = P1_BULLETS(P1.CURRENT_BULLET).START_Y_POS
   P1_BULLETS(P1.CURRENT_BULLET).Z = P1_BULLETS(P1.CURRENT_BULLET).START_Z_POS
   position object P1.CURRENT_BULLET+100,P1_BULLETS(P1.CURRENT_BULLET).X,P1_BULLETS(P1.CURRENT_BULLET).Y,P1_BULLETS(P1.CURRENT_BULLET).Z
   P1_BULLETS(P1.CURRENT_BULLET).X_ANGLE = 0
   P1_BULLETS(P1.CURRENT_BULLET).Y_ANGLE = P1.TURRET_ANG
   P1_BULLETS(P1.CURRENT_BULLET).Z_ANGLE = 0
   ROTATE OBJECT P1.CURRENT_BULLET+100,P1_BULLETS(P1.CURRENT_BULLET).X_ANGLE,P1_BULLETS(P1.CURRENT_BULLET).Y_ANGLE,P1_BULLETS(P1.CURRENT_BULLET).Z_ANGLE
   PLAY SOUND FIRE1_SND
   P1.BUL_DEL = BUL_RATE/ELAPSED
   INC P1.CURRENT_BULLET
ENDIF
FOR T=0 TO 99
   IF P1_BULLETS(T).RANGE <= 0 THEN P1_BULLETS(T).ALIVE = 0

   IF P1_BULLETS(T).ALIVE = 1
      DEC P1_BULLETS(T).RANGE
      SHOW OBJECT T+100
      MOVE OBJECT T+100,P1_BULLETS(T).SPEED * ELAPSED
   ELSE
   HIDE OBJECT T+100
   POSITION OBJECT T+100,P1_BULLETS(T).START_X_POS,P1_BULLETS(T).START_Y_POS,P1_BULLETS(T).START_Z_POS
   ROTATE OBJECT T+100,P1_BULLETS(T).X_ANGLE,P1_BULLETS(T).Y_ANGLE,P1_BULLETS(T).Z_ANGLE,
   ENDIF
NEXT T
FOR T=0 TO 99
P1_BULLETS(T).START_X_POS = P1.X
P1_BULLETS(T).START_Y_POS = P1.Y
P1_BULLETS(T).START_Z_POS = P1.Z

P1_BULLETS(T).X_ANGLE = 0
P1_BULLETS(T).Y_ANGLE = P1.TURRET_ANG
P1_BULLETS(T).Z_ANGLE = 0

NEXT T

FOR T=0 TO 99

P1_BULLETS(T).X = OBJECT POSITION X(T+100)
P1_BULLETS(T).Z = OBJECT POSITION Z(T+100)
P1_BULLETS(T).Y = GET GROUND HEIGHT(1,P1_BULLETS(T).X-MATOFFSETX,P1_BULLETS(T).Z-MATOFFSETZ)+P1_BULLETS(T).HEIGHT
POSITION OBJECT T+100,P1_BULLETS(T).X,P1_BULLETS(T).Y,P1_BULLETS(T).Z


P2_BULLETS(T).X = OBJECT POSITION X(T+200)
P2_BULLETS(T).Z = OBJECT POSITION Z(T+200)
P2_BULLETS(T).Y = GET GROUND HEIGHT(1,P2_BULLETS(T).X-MATOFFSETX,P2_BULLETS(T).Z-MATOFFSETZ)+P2_BULLETS(T).HEIGHT
POSITION OBJECT T+200,P2_BULLETS(T).X,P2_BULLETS(T).Y,P2_BULLETS(T).Z




NEXT T






RETURN

WATER_ENGINE:
RETURN

COLLISIONS_BULLETS:
IF OBJECT COLLISION(1,11) = 0

FOR T=0 TO 99

IF P1_BULLETS(T).X > P2.X - P2.COL_RAD AND P1_BULLETS(T).X < P2.X + P2.COL_RAD AND P1_BULLETS(T).Z > P2.Z - P2.COL_RAD AND P1_BULLETS(T).Z < P2.Z + P2.COL_RAD
P1_BULLETS(T).ALIVE = 0
DEC P2.HEALTH
PLAY SOUND HIT1_SND
ENDIF

IF P2_BULLETS(T).X > P1.X - P1.COL_RAD AND P2_BULLETS(T).X < P1.X + P1.COL_RAD AND P2_BULLETS(T).Z > P1.Z - P1.COL_RAD AND P2_BULLETS(T).Z < P1.Z + P1.COL_RAD
P2_BULLETS(T).ALIVE = 0
DEC P1.HEALTH
PLAY SOUND HIT1_SND
ELSE

ENDIF

NEXT T

ENDIF
RETURN

COLLISIONS_TANKS:
RETURN

EFFECTS:
`DEC P1.COL_COUNT
`IF P1.COLLISION = 1 THEN P1.COL_COUNT = 100
`IF P1.COL_COUNT >0 THEN SET CARTOON SHADING ON 2,EXPL_TEX,EXPL_TEX ELSE SET SHADING OFF 1

RETURN

UPDATE_POWERUPS:
FOR T=0 TO 10

IF POW(T).VARIANT = 1
ROTATE OBJECT T+300,OBJECT ANGLE X(T+300)+2,OBJECT ANGLE Y(T+300)+2,OBJECT ANGLE Z(T+300)+2
ENDIF

IF POW(T).VARIANT = 2
ROTATE OBJECT T+300,OBJECT ANGLE X(T+300)+2,OBJECT ANGLE Y(T+300)+2,OBJECT ANGLE Z(T+300)+2
ENDIF

IF P1.X > POW(T).X - POW(T).COL_RAD  AND P1.X < POW(T).X + POW(T).COL_RAD AND P1.Z > POW(T).Z - POW(T).COL_RAD AND P1.Z < POW(T).Z + POW(T).COL_RAD
POW(T).ALIVE = 0
INC P1.HEALTH,20
PLAY SOUND HIT1_SND
POW(T).HIT = 1
IF POW(T).VARIANT = 2
POW(T).ALIVE = 0
P1.SPEED_CAP=.4
P1.SPEED_COUNT = LOOP_COUNT
PLAY SOUND HIT1_SND
POW(T).HIT = 1
ENDIF
ENDIF

IF P2.X > POW(T).X - POW(T).COL_RAD  AND P2.X < POW(T).X + POW(T).COL_RAD AND P2.Z > POW(T).Z - POW(T).COL_RAD AND P2.Z < POW(T).Z + POW(T).COL_RAD
IF POW(T).VARIANT = 1
POW(T).ALIVE = 0
INC P2.HEALTH,20
PLAY SOUND HIT1_SND
POW(T).HIT = 1
POW(T).ON = 1
ENDIF

IF POW(T).VARIANT = 2
POW(T).ALIVE = 0
P2.SPEED_CAP= .4
P2.SPEED_COUNT = LOOP_COUNT
PLAY SOUND HIT1_SND
POW(T).HIT = 1
POW(T).ON = 1
ENDIF
ENDIF

if POW(T).ALIVE = 0
DELETE OBJECT T+300
`CORRECT VARIANT HERE
`POW(T).VARIANT = RND(3)+1
`POW(T).VARIANT = RND(1)+1
POW(T).VARIANT = 1

SPAWN_POWERUP(T,T+300,POW(T).VARIANT)

ENDIF



`POWERUP EFFECTS MANAGEMENT
IF POW(T).ON = 1
IF POW(T).VARIANT = 2
IF ABS(LOOP_COUNT - P2.SPEED_COUNT) > 20
P2.SPEED_CAP = .2
ENDIF
IF ABS(LOOP_COUNT - P1.SPEED_COUNT) > 20
P1.SPEED_CAP = .2
ENDIF
ENDIF
ENDIF


NEXT T

RETURN


GLOBAL_SOUNDS:
`IF P1.SPEED > 0 THEN SET SOUND SPEED TANK1_SND,ABS((P1.SPEED*50000)+7000)
`IF P1.SPEED < 0 THEN SET SOUND SPEED TANK1_SND,ABS((P1.SPEED*50000)-7000)


`IF P2.SPEED > 0 THEN SET SOUND SPEED TANK2_SND,ABS((P2.SPEED*50000)+7000)
`IF P2.SPEED < 0 THEN SET SOUND SPEED TANK2_SND,ABS((P2.SPEED*50000)-7000)
RETURN


UPDATE_CAMERA:
IF LOOP_COUNT < 100
C1.SMOOTH = 50 - ELAPSED*1.2
IF C1.SMOOTH <= 0 THEN C1.SMOOTH = 1
C2.SMOOTH = 50-ELAPSED*1.2
IF C2.SMOOTH <= 0 THEN C2.SMOOTH = 1
ENDIF
SET CAMERA TO FOLLOW 1,P1.X,P1.Y,P1.Z,P1.TURRET_ANG,C1.DIST,C1.HEIGHT,C1.SMOOTH,0
SET CAMERA TO FOLLOW 2,P2.X,P2.Y,P2.Z,P2.TURRET_ANG,C2.DIST,C2.HEIGHT,C2.SMOOTH,0
C1.AX = CAMERA ANGLE X(1)
C1.AY = CAMERA ANGLE Y(1)
C1.AZ = CAMERA ANGLE Z(1)

C2.AX = CAMERA ANGLE X(2)
C2.AY = CAMERA ANGLE Y(2)
C2.AZ = CAMERA ANGLE Z(2)

RETURN

FUNCTION SPAWN_POWERUP(ID,OBJ_NUM,VARIANT)
   POW(ID).ALIVE = 1
   POW(ID).X = RND(6000)-3000 ` JUST GAVE UP ON FORMULA AND MADE A CONSTANT
   POW(ID).Z = RND(6000)-3000
   POW(ID).COL_RAD = 40
   SELECT VARIANT
      CASE 1
        MAKE OBJECT CUBE OBJ_NUM,20
        POSITION OBJECT OBJ_NUM,POW(ID).X,20,POW(ID).Z
        TEXTURE OBJECT OBJ_NUM,6
        POW(ID).DURATION = 0
      ENDCASE
      CASE 2
         MAKE OBJECT CYLINDER OBJ_NUM,20
         POSITION OBJECT OBJ_NUM,POW(ID).X,20,POW(ID).Z
         TEXTURE OBJECT OBJ_NUM,7
         ROTATE OBJECT OBJ_NUM,RND(359),RND(359),RND(359)
         SET OBJECT CULL OBJ_NUM,0
         POW(ID).DURATION = 10
      ENDCASE
      CASE 3
      ENDCASE
      CASE 4
      ENDCASE
   ENDSELECT
ENDFUNCTION