cruisin-usa/RACER.ASM

2331 lines
43 KiB
NASM
Executable File

.FILE "RACER.ASM"
*----------------------------------------------------------------------------
*
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
*ALL RIGHTS RESERVED
*
.include MACS.EQU
.include MPROC.EQU
.include OBJ.EQU
.include VUNIT.EQU
.include CMOS.EQU
.include SYSID.EQU
.include SYS.EQU
.include GLOBALS.EQU
.include SNDTAB.EQU
.include PALL.EQU
.include OBJECTS.EQU
.include TEXT.EQU
.include DELTA.EQU
.include RACER.EQU
.include COMM.EQU
.GLOBL COMPTRAK,FIND_DYNA
.GLOBL OM_DRONE,PLY2CAR
.globl testor_grape,hotrod_yellow,bullet_plat
.globl testor_blue,hotrod_brtblue,bullet_grape
.globl cvette_blue,cvette_red,cvette_purple
.globl missle_blue,missle_red,missle_yellow,hotrod_maroon
RACER_DRONE_INITTABI .word RACER_DRONE_INITTAB
RACER_DRONE_INITTAB
RDIM VETTE_MOD ,4, 572,0.90,1.00,cvette_blue
RDIM HOTROD_MOD,4,1724,0.87,1.00,hotrod_yellow
RDIM TESTOR_MOD,3, 572,0.84,1.00,testor_grape
RDIM BULLET_MOD,3,1724,0.81,1.00,missle_red
RDIM VETTE_MOD ,2, 572,0.78,1.00,cvette_purple
RDIM BULLET_MOD,2,1724,0.78,0.35,missle_blue
RDIM VETTE_MOD ,1,1724,0.74,1.00,cvette_red
RDIM TESTOR_MOD,1, 572,0.70,0.30,testor_blue
RDIM HOTROD_MOD,0, 572,0.66,1.00,hotrod_brtblue
RDIM BULLET_MOD,0,1724,0.62,1.00,missle_yellow
.bss FINISHNUM,1 ;NUMBER OF DRONES FINISHED
RACER_PTRI .word RACER_PTR
.bss RACER_PTR,10
.GLOBL OM_TRACK_LO,OM_TRACK_HI
.bss OM_TRACK_LO,1
.bss OM_TRACK_HI,1
*----------------------------------------------------------------------------
*
*PARAMETERS
* R0 POSITION ACHIEVED FOR THIS RACE
*
*MODIFIES : ADJ_DIFFICULTY,ADJ_DIFF_LOCAL (CMOS)
*
GMAX .word 100000
DIFF_CHANGE:
CMPI 1,R0
LDFZ 0.07,R1
LDFNZ -0.035,R1
ADDF @GAMEDIFF,R1
CMPF 1.25,R1
LDFGT 1.25,R1
CMPF 0.8,R1
LDFLT 0.8,R1
STF R1,@GAMEDIFF
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*GET YOUR DIFFICULTY
*
GETDIFF:
*GET DIFFICULTY ADJUST
LDI ADJ_DIFFICULTY,AR2 ;GET DIFFICULTY ADJUST
CALL ADJUSTMENT_READ ;100000=1.0
FLOAT R0
MPYF 0.04,R0
ADDF 0.80,R0 ;GLOBAL DIFF 0.80-1.16
*GET GAME DIFFICULTY
LDI @HEAD2HEAD_ON,R1
LDFZ @GAMEDIFF,R1
BZ GD1
.GLOBL OM_DIFF
LDF @OM_DIFF,R1
CMPF 1.16,R1
LDFGT 1.16,R1
CMPF 0.8,R1
LDFLT 0.8,R1
ADDF @GAMEDIFF,R1
MPYF 0.5,R1
GD1
CMPF 1.16,R1
LDFGT 1.16,R1
CMPF 0.8,R1
LDFLT 0.8,R1
SUBF 1.0,R1
*GET TRACK DIFFICULTY
*GET CURRENT RACE
LDI @BONUS_WAVE,AR2
CMPI 0,AR2
LDILT 0,AR2
CMPI 13,AR2
LDIGT 13,AR2
ADDI @DIFFTABI,AR2
LDF *AR2,R2
ADDF R1,R0
ADDF R2,R0
CMPF 0.75,R0
LDFLT 0.75,R0
CMPF 1.25,R0
LDFGT 1.25,R0 ;ABSOLUTE MAX/MINS
RETS
DIFFTABI .word DIFFTAB
DIFFTAB
.float 0 ;GG
.float -0.03 ;SF
.float -0.02 ;101
.float -0.03 ;REDWD
.float -0.03 ;BEVH
.float 0 ;LA
.float -0.03 ;DV
.float -0.01 ;AZ
.float -0.02 ;GCAN
.float -0.03 ;IOWA
.float -0.03 ;CHI
.float -0.02 ;IND
.float -0.02 ;APP
.float 0 ;DC
*----------------------------------------------------------------------------
*
* 1. INIT
* 2. SPREAD
* 3. RUN
*
*PARAMETERS
* R4 RANK
* AR7 PROCESS
*
* if R4 > 7 then
* this drone is possibly a linked drone
* end if
*
RACER_DRONE:
LDF 0,R0
STF R0,*+AR7(FINISHDIST)
LDI 0,R0
STI R0,@FINISHNUM ;INITIALIZE FINISH COUNT
LDI 0,R0
STI R0,*+AR7(PASSCNT) ;INITIALIZE PASSING SOUND INHIBIT
STI R4,*+AR7(DELTA_INIT)
LDI R4,AR0
MPYI RD_SIZE,AR0
ADDI @RACER_DRONE_INITTABI,AR0
STI AR0,*+AR7(INITINDEX)
CMPI 8,R4
BLT NOTLINKED
LDI @HEAD2HEAD_ON,R0
BZ NOTLINKED
LDI @OM_VEHICLE,R0
.if CDEBUG
BN $
.endif
BR COMM_DRONE
NOTLINKED
LDI *+AR0(RD_MODEL),R0
JJKK STI R0,*+AR7(DELTA_MODEL)
LDI R0,AR2
LDI R0,AR5
MPYI VEHTAB_SIZE,AR2
ADDI @VEHICLE_TABLEI,AR2
LDI *+AR2(VEHTAB_MODEL),AR2
CALL OBJ_GETE
BC SUICIDE
LDI AR0,AR4
*STORE THE POINTER TO THE OBJECT
;
LDI R4,AR1
ADDI @RACER_PTRI,AR1
STI AR4,*AR1
LDI AR5,AR2
CALL VEHICLE_ANI_INIT
CALL DELTA_OINIT
*SET PROPER PALETTE
LDI *+AR7(INITINDEX),AR0
LDI *+AR0(RD_PALETTE),R0
BZ NOOTHERPAL
LDI R0,AR2
CALL PAL_FIND_RAW
STI R0,*+AR4(OPAL)
ORM O_1PAL,*+AR4(OFLAGS)
NOOTHERPAL
LDF *+AR5(CARRDFR),R0
MPYF 1.5,R0 ;OFFROAD = 1.5X ONROAD
STF R0,*+AR5(CAROFRDFR)
LDI *+AR7(INITINDEX),AR0
LDF *+AR0(RD_XLANE),R0
STF R0,*+AR7(DELTA_XLANE)
STF R0,*+AR7(ROADOFFSET)
LDI 2,R2 ;SET LANE STATUS
FLOAT 600,R1
CMPF R1,R0
LDIGT 3,R2
STI R2,*+AR7(DELTA_STATUS)
LDI @_MODE,R1
AND MMODE,R1
CMPI MATTR,R1
LDFZ 1.0,R0 ;FOR ATTRACT ALWAYS 1 DIFFICULTY
CALLNZ GETDIFF
MPYF *+AR0(RD_MAXACCEL),R0
STF R0,*+AR5(CARMAXACCEL) ;SET ACCEL POWER
LDF *+AR0(RD_REL),R0
STF R0,*+AR7(RELATIVITY) ;SET RELATIVITY COEFFICIENT
*
*INIT POSITION N ROAD PIECES FROM BEGINNING
*
LDI @DYNALIST_TRUEBEGIN,AR2
LDI *+AR2(OUSR1),R0
ANDN 0FFh,R0
LDI *+AR2(OLINK4),AR2 ;SKIP FIRST GROUP
LDI *+AR0(RD_POSITION),AR3 ;NUMBER OF PIECES AHEAD
CALL SPOS_INIT ;INIT STARTING POSITION
;initialize Ytheta to the intentional direction
STF R2,*+AR4(ORADY)
STF R2,*+AR5(CARYROT)
STF R2,*+AR5(CARVROT)
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL FIND_YMATRIX
LDI DRONE_C|VEHICLE_T|DRNE_RACER,R0
STI R0,*+AR4(OID)
STI R0,*+AR5(CAR_ID)
STI R0,*+AR7(PID)
*INIT THROTTLE AND BRAKE
CLRF R0
STF R0,*+AR5(CARBRAKE)
LDF 0.44,R0
STF R0,*+AR5(CARTRACTION)
LDF 1.0,R0
STF R0,*+AR7(DELTA_THROTTLE)
STF R0,*+AR7(POWERSURGE)
LDF 0.05,R0
CALL FRAND
ADDF 1.20,R0
STF R0,*+AR7(POWERCATCH) ;BLAST FROM START RANDOM TIME
LDI 120,R0 ;WAIT A LITTLE BEFORE UPDATE
STI R0,*+AR7(SURGETIME)
STI R0,*+AR7(CATCHTIME)
LDI 0,R0
STI R0,*+AR7(STEALTHMODE) ;NO STEALTH INIT
LDI AR4,AR2
CALL OBJ_PULL
CALL OBJ_INSERT
; LDF 0.42,R0
; STF R0,*+AR5(CARMAXACCEL) ;SET ACCEL POWER
*******************
LDI *+AR7(DELTA_INIT),R2 ;GET CAR #
STI R2,*+AR5(CARNUM) ;SAVE IN CAR STRUCTURE
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
BZ NOTLINKED3 ;NO...
LDI @DIPRAM,R1 ;MASTER?
TSTB CMDP_MASTER,R1
LDIZ 1,R0 ;YES, MASTER
LDINZ 0,R0 ;SLAVE
LSH -1,R2
AND 1,R2 ;MASK FOR ODD/EVEN BIT
XOR R2,R0 ;ODDS-MASTER, EVEN-SLAVE
STI R0,*+AR5(CAR_OM)
BNZ OM_DRONE ;OTHER MACHINE CONTROL
NOTLINKED3
*
*RACING DRONE LOOP (ONTRACK)
*
RACER_LP:
LDI @SUSPEND_MODE,R0
CMPI SM_HALT,R0
BNE RACE_ON
CALL GETTRAK
CALL DRONESTOP
B RACER_SLP
RACE_ON
LDI *+AR5(CARTRAK),AR0 ;CHECK FOR FINISH LINE
LDI *+AR0(OUSR1),R0
LSH -8,R0
CMPI @FINISH_ID,R0
CALLGE RACE_FIN
CALL RPASS ;CHECK FOR PASSING SOUND
*CHECK IF WE ARE ON THE TRACK
CKSTEALTH
LDI @DYNALIST_TRUEBEGIN,AR2 ;GET CLOSEST ROAD ID
LDI *+AR2(OLINK4),AR2 ;LINK A COUPLE AHEAD
LDI *+AR2(OLINK4),AR2
LDI *+AR2(OUSR1),R0
LDI @DYNALIST_END,AR2 ;GET FURTHEST ROAD ID
LDI *+AR2(OUSR1),R1
LDI *+AR7(DELTA_LAST_OID),R2 ;CHECK TO SEE IF IT IS IN THE RANGE
CMPI R0,R2
BLT LO_STEALTH
CMPI R1,R2 ;LAST REAL SEGMENT
BGE HI_STEALTH
*CHECK DISTANCE TO TRACKING PIECE
LDI *+AR7(DELTA_TPIECE),AR2 ;Get tracking piece
SUBF *+AR4(OPOSX),*+AR2(OPOSX),R2 ;DELTA X
LDF *+AR2(OPOSZ),R1 ;DELTA Z
SUBF *+AR4(OPOSZ),R1
MPYF R2,R2
MPYF R1,R1
ADDF R1,R2
FLOAT 5000,R1 ;TO THE NEXT ROADPIECE
MPYF R1,R1
CMPF R1,R2 ;DISTANCE LT 5000 ?
BLT NUTRACK ;NO...KEEP ON TRUCKIN'
LDI *+AR2(OLINK4),R0 ;Get link to NEXT piece
BZ ONTRACK ;OUT IN THE DISTANCE
LDI R0,AR0
SUBF *+AR4(OPOSX),*+AR0(OPOSX),R1 ;DELTA X
LDF *+AR0(OPOSZ),R0 ;DELTA Z
SUBF *+AR4(OPOSZ),R0
MPYF R0,R0
MPYF R1,R1
ADDF R0,R1
CMPF R2,R1 ;DIST TRACK CLOSER?
BGT ONTRACK ;NO, WERE ON TRACK
NOP
NUTRACK
LDI *+AR2(OLINK4),R0 ;Get link to NEXT piece
BZ HI_STEALTH
STI R0,*+AR7(DELTA_TPIECE) ;save ptr
LDI R0,AR0
LDI *+AR0(OUSR1),R0 ;read road ID
STI R0,*+AR7(DELTA_LAST_OID) ;save road ID
B CKSTEALTH ;CHECK NEW SECTION
*R2=DIST TO TPIECE SQUARED
*AR2=TRACKING PIECE
ONTRACK
CALL SQRT ;GET ACTUAL DISTANCE
LDF *+AR5(CARSPEED),R1
LDFLE 30,R1 ;if 0 or less assume 30 mph
FLOATP @NFRAMES,R2
MPYF R2,R1
CALL DIV_F ;R0/R1 (distance to piece/speed) -> # frames to achieve
PUSHF R0
*GET TRACKING GOAL
CALL CKPCOL ;CHECK PLAYER COLLISION
CALL OBSTABINIT ;CLEAR ROAD OBSTACLE MAP
CALL CARSCAN
CALL PLSCAN ;TEST TO SCAN PLAYER ON TRACK
CALL GETRDOFFSET
STF R0,*+AR7(ROADOFFSET)
*GET DIRECTION ANGLE FOR TRACKING PIECE
LDI *+AR7(DELTA_TPIECE),AR2 ;Get tracking piece
LDI *+AR2(OLINK4),R0
BNZ ROADTRAK1
LOCKUP
ROADTRAK1
LDI R0,AR0
SUBF *+AR2(OPOSX),*+AR0(OPOSX),R2
LDF *+AR0(OPOSZ),R3
SUBF *+AR2(OPOSZ),R3
CALL ARCTANF
SUBF HALFPI,R0
LDF R0,R2 ;FIND THETA
CALL _SINE
LDF R0,R1
CALL _COSI
MPYF *+AR7(ROADOFFSET),R0 ;X LANE OFFSET
MPYF *+AR7(ROADOFFSET),R1 ;Z LANE OFFSET
SUBF *+AR4(OPOSX),*+AR2(OPOSX),R2
ADDF R0,R2
LDF *+AR2(OPOSZ),R3 ;COMPUTE DELTA Z TO GOAL
SUBF *+AR4(OPOSZ),R3
ADDF R1,R3
;POSITION TRACKING
;
;Set steering, trottle, gear, and brake
;and call DRONEGO
;find the theta delta to this position
;
*GET XZ ANGLE TO GOAL
CALL ARCTANF
SUBF HALFPI,R0 ;R0 DESIRED THETA (float)
LDF *+AR4(ORADY),R2 ;R2 CURRENT THETA
CALL GETTHETADIFF ;->R0 THETA DELTA (float)
POPF R1 ;GET TIME
FIX R1
FLOAT R1
SUBF 1,R1 ;DBG
BZ NODIV
CALL DIV_F ;-> R0
NODIV
*THROTTLE ONLY IF RACE IS ON
PUSHF R0
CALL GETPOWER ;UPDATE POWER STUFF
LDF *+AR7(DELTA_THROTTLE),R0 ;HAS THE RACE BEGUN?
LDI @_MODE,R1
TSTB MGO,R1
LDFZ 0,R0 ;N -> THROTTLE = 0
STF R0,*+AR5(CARTHROTTLE)
POPF R0
MPYF 2.5,R0 ;OVERSTEERing EFFECT
CMPF 0.09,R0
LDFGT 0.09,R0
CMPF -0.09,R0
LDFLT -0.09,R0
PUSHF R0 ;save steering value
FLOAT @NFRAMES,R1
MPYF *+AR5(CARSPEED),R1
BZD NOTURN
LDFZ 0,R0
MPYF 0.416,R1
MPYF @STEERI,R1
;----> BZD NOTURN
CALL DIV_F
CMPF -0.3,R0 ;LIMIT CHECK
LDFLT -0.3,R0
CMPF 0.3,R0 ;LIMIT CHECK
LDFGT 0.3,R0
NOTURN
STF R0,*+AR5(CARTURN)
CALL DRONE_RIDE_RIGHT ;FIND DISTANCE TO CENTER OF ROAD
STF R0,*+AR5(CARDIST2CNTR)
CALL GETTRAK
POPF R2
CALL DRONEGO
NEGF *+AR5(CARTURN),R0 ;FIX CARTURN SIGN
STF R0,*+AR5(CARTURN)
RACER_SLP
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
.GLOBL SEND_RACER_POS
CALLNZ SEND_RACER_POS ;SEND YOUR POSITION TO LINKED GAME
NOTLINKED4
SLEEP 1
B RACER_LP
*
*CHECK RACE FINISH
*
RACE_FIN
LDF *+AR7(FINISHDIST),R0
BNZ RACFIN1
LDF 0.7,R0
CALL SFRAND
STF R0,*+AR7(FINISHROT)
LDI @FINISHNUM,R0
ADDI 1,R0
STI R0,@FINISHNUM
SUBRI 10,R0
MPYI 2800,R0
ADDI 3500,R0
FLOAT R0
RACFIN1
LDF *+AR5(CARSPEED),R2
FLOAT @NFRAMES,R1
MPYF R1,R2
SUBF R2,R0
STF R0,*+AR7(FINISHDIST)
BLT RACEDONE
RETS
RACEDONE
LDI *+AR7(STEALTHMODE),R0 ;CHECK STEALTH
BZ RD0
LDF *+AR5(CARSPEED),R0
BZ RD0
FLOAT 300,R0 ;ONE TIME RANDOM ADD
CALL SFRAND
ADDF *+AR4(OPOSX),R0
STF R0,*+AR4(OPOSX)
FLOAT 300,R0
CALL SFRAND
ADDF *+AR4(OPOSZ),R0
STF R0,*+AR4(OPOSZ)
RD0
LDF 0,R0
STF R0,*+AR5(CARSPEED)
STF R0,*+AR5(CARMAXACCEL)
LDI *+AR7(STEALTHMODE),R0 ;CHECK STEALTH
RETSNZ ;YES, KEEP WAITING
POP R0 ;CAN CALL
LDI *+AR4(OFLAGS),R0
OR O_NOCOLL,R0 ;SET NON COLLIDE FLAG
STI R0,*+AR4(OFLAGS)
RDL
CALL GETTRAK
CALL ROADIR
ADDF *+AR7(FINISHROT),R0
STF R0,*+AR5(CARYROT)
CALL DRONESTOP
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
CALLNZ SEND_RACER_POS ;SEND YOUR POSITION TO LINKED GAME
SLEEP 1 ;JUST HANG THERE
; SLEEP 10 ;JUST HANG THERE
B RDL
*
*CHECK PLAYER COLLISION
*AR4=DRONE CAR
*
CKPCOL
LDI @PLYCAR,AR2 ;GET PLAYER CAR OBJECT
LDI *+AR2(OCARBLK),AR3
CALL CKAHEAD
BN CKPX ;CAR BEHIND, IGNORE
*GET CURRENT DISTANCE
SUBF *+AR4(OPOSX),*+AR2(OPOSX),R6
LDF *+AR2(OPOSZ),R7
SUBF *+AR4(OPOSZ),R7
MPYF R6,R6,R1
MPYF R7,R7,R2
ADDF R1,R2 ;distance^2
FLOAT 3000,R0
MPYF R0,R0
CMPF R2,R0
BLT CARCHKX ;TOO FAR AWAY
LDF *+AR5(CARSPEED),R0
SUBF *+AR3(CARSPEED),R0
CMPF 30,R0
BLT CKPX
NOP
CKPX
RETS
*
*ENTER DISTANT STEALTH MODE
*
HI_STEALTH
LDI 1,R0
STI R0,*+AR7(STEALTHMODE) ;HI STEALTH FLAG
LDI *+AR7(DELTA_LAST_OID),R2 ;GRAB THE LAST KNOWN VALID OID
CALL FIND_MAP ;*+AR7(DELTA_SPTR),*+AR7(DELTA_LAST_OID)
LDI *+AR4(OFLAGS),R0
OR O_NOCOLL,R0 ;SET NON COLLIDE FLAG
STI R0,*+AR4(OFLAGS)
HI_STLP
*CHECK FINISH LINE
LDI *+AR7(DELTA_LAST_OID),R0 ;CHECK TO SEE IF IT IS IN THE RANGE
LSH -8,R0
CMPI @FINISH_ID,R0
CALLGE RACE_FIN
*CHECK IF CURRENT SECTION ON TRACK LIST
LDI @DYNALIST_END,AR2 ;GET FURTHEST ROAD ID
LDI *+AR2(OUSR1),R1
LDI *+AR7(DELTA_LAST_OID),R2 ;CHECK TO SEE IF IT IS IN THE RANGE
CMPI R1,R2
BLT REENTER ;WERE OFF ACTIVE TRACK
LDI @HEAD2HEAD_ON,R0
CALLNZ CKTRANSHI
CALL STEALTH_UPDATE
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
CALLNZ SEND_RACER_POS ;SEND YOUR POSITION TO LINKED GAME
SLEEP 1
B HI_STLP
HI_ST_END
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
CALLNZ SEND_RACER_POS ;SEND YOUR POSITION TO LINKED GAME
; SLEEP 10
SLEEP 1
B HI_ST_END
*
*ENTER CLOSE STEALTH MODE
*
LO_STEALTH
LDI -1,R0
STI R0,*+AR7(STEALTHMODE) ;LO STEALTH FLAG
LDI *+AR7(DELTA_LAST_OID),R2 ;GET POINTER TO STEALTH MAP
CALL FIND_MAP ;
LDI *+AR4(OFLAGS),R0
OR O_NOCOLL,R0 ;SET NON COLLIDE FLAG
STI R0,*+AR4(OFLAGS)
LO_STLP
LDI @DYNALIST_TRUEBEGIN,AR2 ;GET CLOSEST ROAD ID
LDI *+AR2(OLINK4),AR2
LDI *+AR2(OLINK4),AR2
LDI *+AR2(OLINK4),AR2
LDI *+AR2(OUSR1),R0
LDI *+AR7(DELTA_LAST_OID),R2 ;CHECK TO SEE IF IT IS IN THE RANGE
CMPI R0,R2
BGT REENTER ;REENTER THE SYSTEM DUDES...
LDI @HEAD2HEAD_ON,R0
CALLNZ CKTRANSLO
CALL STEALTH_UPDATE
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
CALLNZ SEND_RACER_POS ;SEND YOUR POSITION TO LINKED GAME
SLEEP 1
B LO_STLP
*
*REENTER REGULAR SYSTEM
*R2=OID OF SECTION BEING TRACKED
*
REENTER
LDI 0,R0
STI R0,*+AR7(STEALTHMODE) ;NO STEALTH INIT
LDI *+AR4(OFLAGS),R0
ANDN O_NOCOLL,R0 ;CLEAR NON-COLLIDE FLAG
STI R0,*+AR4(OFLAGS)
CALL FIND_DYNA ;GET TRACKING PIECE POINTER
STI AR2,*+AR7(DELTA_TPIECE)
CALL GETTRAK ;GET CLOSEST ROAD SECT ->AR0
CALL ROADIR ;GET RADIANS FOR ORIENTATION
LDF R0,R2
STF R2,*+AR4(ORADY)
STF R2,*+AR5(CARYROT)
STF R2,*+AR5(CARVROT)
LDF 0,R0
STF R0,*+AR5(CARDROT) ;CLEAN UP REENTRY
STF R0,*+AR5(CARSPRAD)
STF R0,*+AR5(CARSKID)
LDI 0,R0
STI R0,*+AR5(CAR_SPIN)
LDI AR4,AR2 ;GET NEW MATRIX
ADDI OMATRIX,AR2
CALL FIND_YMATRIX
FLOAT 1000,R0 ;PUT DUDE DOWN INTO ROAD
ADDF *+AR4(OPOSY),R0
B RACER_LP
*
*CHECK TRANSFER TO OTHER MACHINE ON LINK
*LO STEALTH CASE
CKTRANSLO
CALL COMPTRAK
BLE CKTLX
CALL CKRANGE
BZ SEND_RACER_XSFER
CKTLX
RETS
*HI STEALTH CASE
CKTRANSHI
CALL COMPTRAK
BGE CKTHX
CALL CKRANGE
BZ SEND_RACER_XSFER
CKTHX
RETS
*
*CHECK IF CAR TRACK ID IS IN OTHER PLAYERS RANGE
*RETURNS EQ =IN RANGE, NE=OUT OF RANGE
CKRANGE
LDI *+AR7(DELTA_LAST_OID),R2 ;CHECK TO SEE IF IT IS IN THE RANGE
CMPI @OM_TRACK_LO,R2
BLT CKRFAIL
CMPI @OM_TRACK_HI,R2
BGT CKRFAIL
LDI 0,R0
RETS
CKRFAIL
LDI 1,R0
RETS
*
*COMPARE TO PLAYERS RANK
*RETURNS:GT IF WE'RE AHEAD OF OTHER PLAYER
*R0=OTHER PLAYER TRACK ID, R1= OUR TRACK ID
*DESTROYS AR0,AR1
*
COMPTRAK
LDI @PLY2CAR,AR0
LDI *+AR0(OCARBLK),AR1
LDI *+AR1(CARTRACK_ID),R0
LDI @PLYCBLK,AR1
LDI *+AR1(CARTRACK_ID),R1
CMPI R0,R1
RETS
*
*TRANSFER CAR TO OTHER MACHINE
*AR4=CAR
*AR5=CAR BLOCK
*AR7=PROCESS
*
SEND_RACER_XSFER:
LDI CB_RACER_XSFER,R0 ;MESSAGE HEADER
*SEND MESSAGE HEADER
LDI @COMMQ_TMP_BUFFI,AR2
STI R0,*AR2
*SEND CAR ID #
LDI *+AR7(DELTA_INIT),R0
STI R0,*+AR2(1)
LDI 1,RC
CALL MESSAGE_ADD
POP R0 ;CLEAN OFF STACK
B OM_DRONE ;NOW CONTROLLED BY OTHER MACHINE
*
*GET A CAR FROM OTHER MACHINE
*AR4=CAR
*AR5=CAR BLOCK
*AR7=PROCESS
*
*NOTE SHOULD ADD IN FUTURE: CAR_SPIN,CARSPRAD,CARGEAR,CARRPM,CARSKID
.GLOBL DECODE_RACER_XSFER
DECODE_RACER_XSFER:
LDI *AR2++,R0
LDI @IGNORE_UPDATES,R1
RETSNZ
LSH -16,R0 ;GET CAR #
BLT LINKRECX
CMPI 7,R0
BGT LINKRECX ;RANGE CHECK
ADDI @RACER_PTRI,R0
LDI R0,AR4
LDI *AR4,R0 ;GET POINTER
BZ LINKRECX
LDI R0,AR4
LDI *+AR4(OPLINK),AR7
*INITIALIZE SHIT
LDF 1.0,R0
STF R0,*+AR7(DELTA_THROTTLE)
STF R0,*+AR7(POWERSURGE)
STF R0,*+AR7(POWERCATCH) ;BLAST FROM START RANDOM TIME
LDI 75,R0 ;WAIT A LITTLE BEFORE UPDATE
STI R0,*+AR7(SURGETIME)
LDI 27,R0 ;WAIT A LITTLE BEFORE UPDATE
STI R0,*+AR7(CATCHTIME)
LDI *+AR4(OCARBLK),AR5
LDI 1,R0
STI R0,*+AR7(STEALTHMODE) ;SET STEALTH INIT
LDI 0,R0
STI R0,*+AR5(CAR_OM) ;CAR BELONGS TO ME NOW!!!
*CHECK FOR HI OR LO STEALTH ENTRY
LDI *+AR5(CARTRACK_ID),R1 ;GET TRACK ID
STI R1,*+AR7(DELTA_LAST_OID)
LDI @DYNALIST_END,AR0 ;GET FURTHEST ROAD ID
LDI *+AR0(OUSR1),R0
CMPI R1,R0
BGT LINKREC1
LDI @HI_STEALTHI,R2
B LINKREC3
LINKREC1
LDI @DYNALIST_TRUEBEGIN,AR0 ;GET CLOSEST ROAD ID
LDI *+AR0(OLINK4),AR0
LDI *+AR0(OLINK4),AR0
LDI *+AR0(OLINK4),AR0
LDI *+AR0(OUSR1),R0
CMPI R1,R0
LDILT @ACTIVE_XSFERI,R2
LDIGE @LO_STEALTHI,R2
LINKREC3
STI R2,*+AR7(PWAKE) ;CHANGE WAKE-UP ADDR
RETS
LINKRECX
RETS
HI_STEALTHI .WORD HI_STEALTH
LO_STEALTHI .WORD LO_STEALTH
*
*TRANSFER ACTIVE RACER
*
ACTIVE_XSFERI .WORD ACTIVE_XSFER
ACTIVE_XSFER:
LDI 0,R0
STI R0,*+AR7(STEALTHMODE) ;NO STEALTH INIT
LDI *+AR4(OFLAGS),R0
ANDN O_NOCOLL,R0 ;CLEAR NON-COLLIDE FLAG
STI R0,*+AR4(OFLAGS)
LDI *+AR5(CARTRACK_ID),R2 ;GET TRACK ID
STI R2,*+AR7(DELTA_LAST_OID) ;CHECK TO SEE IF IT IS IN THE RANGE
CALL FIND_DYNA ;GET TRACKING PIECE POINTER
STI AR2,*+AR7(DELTA_TPIECE)
LDF 0,R0
STF R0,*+AR5(CARDROT) ;CLEAN UP REENTRY
STF R0,*+AR5(CARSPRAD)
STF R0,*+AR5(CARSKID)
LDI 0,R0
STI R0,*+AR5(CAR_SPIN)
B RACER_LP
*
*UPDATE STEALTH POSITION
*LINEAR TRACK TO NEXT TRACK SEGMENT
*
STEALTH_UPDATE:
LDI *+AR7(DELTA_SPTR),AR0 ;STEP TO NEXT PIECE?
FLOAT *+AR0(X),R2
SUBF *+AR4(OPOSX),R2
FLOAT *+AR0(Z),R3
SUBF *+AR4(OPOSZ),R3
MPYF R2,R2,R0
MPYF R3,R3,R1
ADDF R1,R0
FLOAT 5000,R1 ;TO THE NEXT PIECE
MPYF R1,R1
CMPF R1,R0
BGT STLUP1
ADDI 4,AR0
STI AR0,*+AR7(DELTA_SPTR)
LDI *+AR0(3),R0
STI R0,*+AR7(DELTA_LAST_OID) ;SAVE THE LAST KNOWN VALID OID
CMPI -1,R0 ;CHECK END OF THE LINE
BNZ STEALTH_UPDATE
POP R0 ;END OF LINE JUST SLEEP
B HI_ST_END
STLUP1
FLOAT *+AR0(Y),R0 ;GET Y POSITION SET
; LDF *+AR0(Y),R0 ;GET Y POSITION SET
FLOAT 250,R1
SUBF R1,R0
STF R0,*+AR4(OPOSY) ;ADJUST YOUR Y
LDI @VECTORAI,AR2 ;GET DIRECTIONAL VELOCITY
STF R2,*AR2 ;DELTA X
LDF 0,R0 ;DELTA Y
STF R0,*+AR2(1)
STF R3,*+AR2(2) ;DELTA Z
CALL NORMALIZE
CALL GETRPM
CALL GETAUTO
STI R0,*+AR5(CARGEAR) ;DO THE GEAR
LDI *+AR7(DELTA_SPTR),R0 ;STEP TO NEXT PIECE?
STI R0,*+AR5(CARTRAK) ;PUT THIS INTO CARTRAK FOR NOW
CALL GETPOWER ;UPDATE POWER STUFF
CALL GETSTSPD ;GET STEALTH SPEED
MPYF *AR2,R5,R0 ;X DELTA
ADDF *+AR4(OPOSX),R0
STF R0,*+AR4(OPOSX)
MPYF *+AR2(2),R5 ;Z DELTA
ADDF *+AR4(OPOSZ),R5
STF R5,*+AR4(OPOSZ)
RETS
*
*GET RACER POWER
*
GETPOWER
PUSH AR2
LDI *+AR7(CATCHTIME),R0 ;CHECK IF TIME FOR POWER CHANGE
DEC R0
STI R0,*+AR7(CATCHTIME)
BNN GETSURGE ;NOPE
*GET NEW UPDATE TIMER
LDI 35,AR2
CALL RANDU
ADDI 10,R0
STI R0,*+AR7(CATCHTIME)
*GET DISTANCE TO PLAYER
LDI @PLYCAR,AR0
SUBF *+AR4(OPOSX),*+AR0(OPOSX),R1
LDF *+AR0(OPOSZ),R2
SUBF *+AR4(OPOSZ),R2
MPYF R1,R1
MPYF R2,R2
ADDF R1,R2
CALL SQRT
LDI *+AR7(STEALTHMODE),R3 ;HI,LO OR NO STEALTH?
BZ PDIST
LDI R3,R1
LDI 0,R2
B PDIST1
PDIST
LDI *+AR0(OCARBLK),AR1
LDI *+AR1(CARTRAK),AR2
LDI *+AR2(OUSR1),R2
LDI *+AR5(CARTRAK),AR3
LDI *+AR3(OUSR1),R1
PDIST1
MPYF 0.01,R0
MPYF 0.01,R0
MPYF 0.07,R0
CMPF 0.4,R0 ;MAX OUT AT +-60%
LDFGT 0.4,R0
LDF 1.0,R3 ;SIGN
CMPI R2,R1
LDFZ 0,R3 ;EVEN RACE
LDFGT -1.0,R3
BLE PDIST1A
CMPF 0.1,R0
LDFLT 0.1,R0 ;MINIMUM IF AHEAD
B PDIST1B
PDIST1A
CMPF 0.2,R0
LDFLT 0.2,R0 ;MINIMUM IF BEHIND
PDIST1B
MPYF R3,R0,R3 ;DO THE SIGN
FLOAT @PLYRFIRST,R0 ;TIME IN FIRST
BZ PDIST2
MPYF 0.01,R0
MPYF 0.15,R0
CALL FRAND
CMPF 0.15,R0
LDFGT 0.15,R0 ;BOOST FOR LONG TIME FIRST
ADDF R0,R3 ;A LITTLE BOOST IF PLAYER = #1
PDIST2
MPYF *+AR7(RELATIVITY),R3 ;ADJUST FOR RELATIVITY
ADDF 1.0,R3
STF R3,*+AR7(POWERCATCH)
GETSURGE
LDI *+AR7(SURGETIME),R0 ;CHECK IF TIME FOR POWER CHANGE
DEC R0
STI R0,*+AR7(SURGETIME)
BNN POWERX
LDI 90,AR2 ;GET NEW TIME
CALL RANDU
ADDI 30,AR2
STI R0,*+AR7(SURGETIME)
LDF 0.12,R0 ;GET NEW POWERSURGE
CALL SFRAND
ADDF 1.0,R0
STF R0,*+AR7(POWERSURGE)
POWERX
LDF *+AR7(POWERSURGE),R0
MPYF *+AR7(POWERCATCH),R0
STF R0,*+AR7(DELTA_THROTTLE)
POP AR2
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*GET STEALTH CAR SPEED
*
*PARAMETERS
* AR4 CAR OBJECT
* AR5 CAR BLOCK
*
*RETURNS
* R5 DISTANCE TRAVELLED
*
GETSTSPD:
*GET ENGINE ACCEL
LDF *+AR7(DELTA_THROTTLE),R0 ;HAS THE RACE BEGUN?
LDI @_MODE,R1
TSTB MGO,R1
LDFZ 0,R0 ;N -> THROTTLE = 0
STF R0,*+AR5(CARTHROTTLE)
MPYF *+AR5(CARMAXACCEL),R0
LDF *+AR5(CARRPM),R1
MPYF 0.333,R1
FIX R1,IR0 ;GET TABLE INDEX
CMPI 18,IR0
LDIGT 18,IR0 ;KEEP INDEX IN RANGE
LDI @ENGACTABI,AR0
LDF *+AR0(IR0),R2 ;GET LO POWER FACTOR FOR GEAR
ADDI 1,IR0
LDF *+AR0(IR0),R3 ;GET HI POWER FACTOR FOR GEAR
FLOAT IR0,R4
SUBF R1,R4,R1
LDFLT 0,R1 ;KEEP FACTOR IN BOUNDS
CMPF 1.0,R1
LDFGT 1.0,R1
MPYF R1,R2 ;INTERPOLATE !!!
SUBRF 1.0,R1
MPYF R1,R3
ADDF R2,R3,R1
LDI *+AR5(CARGEAR),IR0 ;GEAR MULTIPLIER
LDI @GEARACTABI,AR0
MPYF *+AR0(IR0),R1
MPYF 0.97,R1 ;3% POWER LOSS AUTO
MPYF R1,R0
*GET TOTAL FRICTION
*GET ROAD FRICTION
LDF *+AR5(CARRDFR),R3 ;GET ROAD FRICTION
*GET ENGINE FRICTION
LDI *+AR5(CARGEAR),IR0
LDI @ENGFRI,AR0
LDF *+AR0(IR0),R4
LDF *+AR5(CARRPM),R5 ;MORE REVS MORE FRICTION
SUBF 42,R5 ;HEAVY FRICTION ABOVE 3900
LDFLT 0,R5
MPYF 0.04,R5
ADDF 1.0,R5 ;APPROX RANGE 1-2
MPYF R4,R5
GETSP22
ADDF R5,R3
*CALC NEW SPEED
GETSPD2
LDF 0,R5
LDF *+AR5(CARSPEED),R1
LDPI @NFRAMES,RC
SUBI 1,RC
*R0=ACCEL
*R1=SPEED
*R3=TOTAL FRICTION
*R5=DISTANCE
*R7=ENGINE FRICTION
RPTB GSL0
MPYF R1,R3,R4 ;BRAKE/ROAD/ENGINE FRICTION
SUBF R4,R1 ;SUBTRACT FRICTION
ADDF R0,R1 ;ADD ACCEL
GSL0 ADDF R1,R5 ;ADD TO DISTANCE
MPYF 1.5,R5 ;SPEEDFUDGE
STF R5,*+AR5(CARDIST) ;SAVE YOUR DISTANCE
STF R1,*+AR5(CARSPEED) ;NEW SPEED
RETS
*----------------------------------------------------------------------------
*---------------------------------------------------------------------------
*GET OBJECT POINTER TO ROAD SEG ID IN R2
*
*PARAMETERS
* R2 OUSR1
*RETURNS
* AR2 POINTER TO OBJECT
*
FIND_DYNA:
LDI @DYNALIST_TRUEBEGIN,AR2
FDL
LDI *+AR2(OUSR1),R0
CMPI R0,R2
BZ FDLX
LDI *+AR2(OLINK4),AR2
CMPI 0,AR2 ;CHECK END OF THE LINE
BNZ FDL
LOCKUP ;ERROR COULDN'T FIND THE SUCKER
POP R0
DIE
FDLX
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*GIVEN A SECTION/ROAD ID FIND THE MAP ENTRY IN THE
*ROAD MAP WHICH CONTAINS THE ID EQUAL TO, OR GREATER
*THAN THE GIVEN ID.
*[finds GE road ID ptr]
*
*PARAMETERS
* R2 CODED ID (from OUSR1)
* AR7 DRONE PROCESS
*
*RETURNS
* AR0 - POINTS TO MAP ENTRY
* MAP ENTRY-->*+AR7(DELTA_SPTR)
* MAP FLAGS-->*+AR7(DELTA_LAST_OID)
*
FIND_MAP:
LDI @LEG_MAPI,AR0
ADDI 3,AR0 ;OFFSET TO ID
FIND_LP
LDI *AR0++(4),R0
CMPI R2,R0
BLT FIND_LP
FINDX
SUBI 7,AR0
STI AR0,*+AR7(DELTA_SPTR)
STI R0,*+AR7(DELTA_LAST_OID) ;save road id
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*AM I AHEAD OF THIS VEHICLE?
*
*PARAMETERS
* AR4 MY OBJECT
* AR5 MY CAR BLOCK
* AR2 TEST OBJECT
* AR3 TEST CAR BLOCK
*
*RETURNS
* BGE AR2 CAR AHEAD OF AR4 CAR
* BLT AR2 CAR BEHIND AR4 CAR
* AR0,R0,R1,R2 CLOBBERED
.globl CKAHEAD
CKAHEAD:
LDI *+AR3(CARTRAK),AR0
LDI *+AR0(OUSR1),R0
LDI *+AR5(CARTRAK),AR0
CMPI *+AR0(OUSR1),R0
RETSNZ ;RETURN VALUE IF NOT THE SAME
LDI *+AR0(OLINK4),R0 ;GET NEXT ROAD OBJECT
LDINZ R0,AR0 ;HANDLE END OF LIST PROBLEM
LDI *+AR0(OLINK4),R0 ;GET NEXT ROAD OBJECT
LDINZ R0,AR0 ;HANDLE END OF LIST
SUBF *+AR4(OPOSX),*+AR0(OPOSX),R0
MPYF R0,R0
LDF *+AR0(OPOSZ),R1
SUBF *+AR4(OPOSZ),R1
MPYF R1,R1
ADDF R1,R0
SUBF *+AR2(OPOSX),*+AR0(OPOSX),R2
MPYF R2,R2
LDF *+AR0(OPOSZ),R1
SUBF *+AR2(OPOSZ),R1
MPYF R1,R1
ADDF R2,R1
CMPF R1,R0 ;WHO IS CLOSER?
RETS
*----------------------------------------------------------------------------
ROADOBSTABI .WORD ROADOBSTAB
.BSS ROADOBSTAB,50 ;ARRAY OF ROAD OBSTACLES
*----------------------------------------------------------------------------
*SCAN CAR LIST FOR OBSTACLES TO AVOID
*BUILD OBSTACLE ARRAY
*ROAD IS 5000 WIDE SO 50 UNITS X 100
*CAR IS 8 UNITS WIDE
*
*PARAMETERS
* AR4 CAR OBJECT
* AR5 CAR STRUCTURE
*
CARSCAN:
LDI @CAR_LIST,R0
BZ OBSCX
OBSCL
LDI R0,AR2
CMPI AR2,AR4
BZ OBSCLP ;BR -> DONT COMPARE AGAINST OURSELF
LDI *+AR2(OFLAGS),R0 ;STEALTH MODE?
TSTB O_NOCOLL,R0 ;check non-collide flag
BNZ OBSCLP ;YES, DONT BOTHER
LDI 2000H,R0
CALL CARCHEK
OBSCLP
LDI *+AR2(OLINK3),R0
BNZ OBSCL
OBSCX
RETS
*GO FOR OPEN PATH
*IF NO OPENING BRAKE ONLY FOR IMMINENT COLLISION 10 FRAMES OR LESS
.BSS PLYRCLOSE,1 ;CLOSING VELOCITY OF DRONE ON PLAYER
PLSCAN:
LDPI @PLYCAR,AR2 ;GET PLAYER CAR OBJECT
LDI *+AR2(OCARBLK),AR3
LDI 4000H,R0
CALL CARCHEK
STI R0,@PLYRCLOSE
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
WACKER .WORD 3D20AH
LAKEL .WORD 3EF0CH
*
*OBSTACLE TABLE INIT
*
OBSTABINIT:
LDI 0,R0
LDI @ROADOBSTABI,AR0
RPTS 49
STI R0,*AR0++ ;CLEAR OUT THE TABLE
*CHICAGO KLUDGE
*GET CURRENT RACE
LDI @BONUS_WAVE,R0
CMPI 10,R0
BNE OI4 ;NOT CHICAGO
LDI 1000H,R0 ;BLOCK OUT LANES 2 LANE CASE
LDI @ROADOBSTABI,AR0
LDI *+AR7(DELTA_TPIECE),AR2
LDI *+AR2(OUSR1),R1
CMPI @WACKER,R1
BLT OIX ;STRAIGHT 4 LANE
CMPI @LAKEL,R1
BGT OI1
LDI *+AR7(DELTA_INIT),R1 ;CHECK STARTING POSITION
LSH -1,R1
LDIC 0,R1 ;BLOCKOUT ONE SIDE
LDINC 23,R1
ADDI R1,AR0
LDI 26,RC
RPTB OILP00
OILP00 STI R0,*AR0++
RETS
OI1
LDI *+AR7(DELTA_INIT),R1 ;CHECK STARTING POSITION
CMPI 3,R1
BLT OI10
LSH -1,R1
BC OI2
OI10
LDI 13,RC
RPTB OILP0
STI R0,*+AR0(36) ;BLOCK OUT BOTH ENDS
OILP0 STI R0,*AR0++
RETS
OI2
STI R0,*+AR0(36)
STI R0,*+AR0(37) ;EL TRACK PILLAR BLOCKOUT
STI R0,*+AR0(38)
STI R0,*+AR0(39)
STI R0,*+AR0(40)
STI R0,*+AR0(09)
STI R0,*+AR0(10)
STI R0,*+AR0(11)
STI R0,*+AR0(12)
STI R0,*+AR0(13)
RETS
*END CHICAGO KLUDGE
OI4
LDI *+AR7(DELTA_TPIECE),AR2
CALL GET_LANES ;GET # OF LANES
LDI R0,R0
BNZ OIX ;FOUR LANE CASE
LDI 1000H,R0 ;BLOCK OUT LANES 2 LANE CASE
LDI @ROADOBSTABI,AR0
LDI 11,RC
RPTB OILP
STI R0,*+AR0(38) ;BLOCK OUT BOTH ENDS
OILP STI R0,*AR0++
OIX
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*EXAMINE ROAD OBSTACLE MAP TO GET OFFSET CHANGE IF ANY
*
*PARAMETERS
* AR4 CAR
* AR5 CAR BLOCK
* AR7 PROCESS
*RETURNS
* R0 NEW ROAD OFFSET
*TRASHES AR2
*
GETRDOFFSET:
LDI 0,R6 ;LFT SCAN INIT
LDI 0,R7 ;RT SCAN INIT
NEGF *+AR5(CARDIST2CNTR),R0
MPYF 0.01,R0 ;DIVIDE BY 100
FIX R0
ADDI 21,R0 ;LEFT EDGE OF ZONE
CMPI 41,R0 ;MIN AND MAXES
LDIGT 41,R0
CMPI 0,R0 ;MIN AND MAXES
LDILT 0,R0
LDI @ROADOBSTABI,AR0
ADDI R0,AR0
*CHECK CURRENT GAP
LDI *AR0++,R1
RPTS 6
OR *AR0++,R1
BZ OK ;WERE O.K.
*CHECK FOR PLAYER
CMPI 4000H,R1 ;PLAYER PRESENT?
BLT S000 ;NO
AND 0FFFH,R1 ;BRAKE IF REAL CLOSE...
CMPI 20,R1
BGT S00 ;NOT REAL CLOSE
;Check for COPCAR
LDI *+AR5(CAR_ID),R2
CMPI DRONE_C|VEHICLE_T|DRNE_COPCAR,R2
BEQ S000 ;COPCARS DON'T SLOW DOWN FOR THE PLAYER
LDI @PLYCBLK,AR2 ;GET PLAYER CAR OBJECT
LDF *+AR2(CARSPEED),R2 ;PLAYER SPEED
SUBF *+AR5(CARSPEED),R2
CMPF 10,R2
BGT S000 ;DONT BRAKE, PLAYER SPEED GREATER
FLOAT R1
MPYF 0.01,R1 ;BRAKE FACTOR CALC
ADDF 0.80,R1
MPYF *+AR5(CARSPEED),R1
STF R1,*+AR5(CARSPEED) ;CUT SPEED
S00
S000
*WE HAVE AN OBSTACLE
*SCAN RIGHT 0--->49
*ADJUST COUNT FOR END
LDI R0,R3
LDI 30,R2 ;SEARCH 20 SPACES RIGHT
ADDI R2,R3
SUBI 49,R3
BLE SR00
SUBI R3,R2 ;DECREASE COUNT TO AVOID OVERSCAN
SR00
LDI @ROADOBSTABI,AR0
ADDI R0,AR0
LDI 0,R1 ;SEQUENCE COUNT
SR0
LDI *AR0++,R0
LDINZ 0,R1 ;NON ZERO RESET COUNT
ADDI 1,R1
CMPI 8,R1
BGT FOUNDR ;FOUND A GAP
SUBI 1,R2
BNZ SR0
B LEFTSCAN ;FOUND NOTHING
FOUNDR
SUBI 4,AR0 ;GET CENTER INDEX
LDI AR0,R6 ;SAVE VALUE
*WE HAVE AN OBSTACLE
*SCAN LEFT 49--->0
LEFTSCAN:
NEGF *+AR5(CARDIST2CNTR),R0
MPYF 0.01,R0 ;DIVIDE BY 100
FIX R0
ADDI 29,R0 ;RT EDGE OF ZONE
CMPI 49,R0 ;MIN AND MAXES
LDIGT 49,R0
CMPI 7,R0 ;MIN AND MAXES
BLT DONE ;NOT ENOUGH ROOM ON THE LEFT
LDI @ROADOBSTABI,AR0
ADDI R0,AR0
LDI 30,R2 ;COUNT
SUBI R2,R0
BGT SL00
ADDI R0,R2 ;DECREASE COUNT TO AVOID OVERSCAN
SL00
LDI 0,R1 ;SEQUENCE COUNT
SL0
LDI *AR0--,R0
LDINZ 0,R1 ;NON ZERO RESET COUNT
ADDI 1,R1
CMPI 8,R1
BGT FOUNDL ;FOUND A GAP
SUBI 1,R2
BNZ SL0
B DONE
*
*FOUND A GAP ON THE LEFT
*AR0 HAS GAP
*
FOUNDL
ADDI 4,AR0
LDI AR0,R7
*
*FOUND A GAP
*R6=LEFT GAP, R7=RIGHT GAP
*
DONE
ADDI R6,R7,R0
BZ FAIL ;NO GAP FOUND, GO WITH OLDIE
LDI R6,R6 ;CHECK LFT FAIL
LDIZ R7,R6
LDI R7,R7 ;CHECK RT FAIL
LDIZ R6,R7
SUBI @ROADOBSTABI,R6 ;FIND CLOSEST DIRECTION
SUBI @ROADOBSTABI,R7
LDF *+AR7(ROADOFFSET),R0
MPYF 0.01,R0 ;DIVIDE BY 100
FIX R0
SUBI R6,R0,R2 ;FIND CLOSEST RT OR LFT
SUBI R7,R0,R3
ABSI R2
ABSI R3
CMPI R2,R3
LDILT R7,R0
LDIGE R6,R0
SUBI 25,R0
FLOAT R0
MPYF 100,R0 ;NEW OFFSET
ROXX
RETS
FAIL
NOP
OK ;CURRENT OFFSET IS O.K.
LDF *+AR7(ROADOFFSET),R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*CHECK CAR OBSTACLE
*
*PARAMETERS
* AR2 OBSTACLE CAR
* AR4 DRONE CAR
* AR5 DRONE CAR BLOCK
* R0 TABLE CODE 1000= PLAYER, 2000=DRONE
*RETURNS
* R0 CLOSING TIME (800H=OUT OF RANGE)
*
.BSS CARTMP1,1
CARCHEK:
STI R0,@CARTMP1 ;SAVE CAR CODE
LDI *+AR2(OCARBLK),AR3
CALL CKAHEAD
BN CARCHKX ;CAR BEHIND, IGNORE
*GET CURRENT DISTANCE
SUBF *+AR4(OPOSX),*+AR2(OPOSX),R6
LDF *+AR2(OPOSZ),R7
SUBF *+AR4(OPOSZ),R7
MPYF R6,R6,R1
MPYF R7,R7,R2
ADDF R1,R2 ;distance^2
FLOAT 30000,R0
MPYF R0,R0
CMPF R2,R0
BLT CARCHKX ;TOO FAR AWAY
*CHECK IF CAR BLOCKING THE SIDE
LDF *+AR3(CARZPLUS),R1
ADDF *+AR5(CARZPLUS),R1
ADDF 200,R1 ;LEAVE A LITTLE ROOM
MPYF R1,R1 ;GET 1/2 Z1+Z2 SQUARED
CMPF R1,R2 ;CLOSE ENOUGH ?
BGT SIDECKX ;NO...
LDF *+AR5(CARDIST2CNTR),R1
SUBF *+AR3(CARDIST2CNTR),R1
ABSF R1
FLOAT 400,R3
CMPF R3,R1
BLT SIDECKX ;OFFSET TOO CLOSE
LDF 10,R0
PUSHF R0
B GOTONE
SIDECKX
CALL SQRT
LDF R0,R5
*GET DISTANCE T+1
*CAR 0 T+1
LDF *+AR5(CARSPEED),R1
LDF *+AR5(CARVROT),R2
CALL _SINE
NEGF R0
MPYF R0,R1,R3
CALL _COSI
MPYF R0,R1,R4
SUBF R3,R6
SUBF R4,R7
*CAR 1 T+1
LDF *+AR3(CARSPEED),R1
LDF *+AR3(CARVROT),R2
CALL _SINE
NEGF R0
MPYF R0,R1,R3
CALL _COSI
MPYF R0,R1,R4
ADDF R3,R6
ADDF R4,R7
MPYF R6,R6,R1
MPYF R7,R7,R2
ADDF R1,R2 ;distance^2
CALL SQRT ;DISTANCE T+1
SUBF R5,R0
BGE CARCHKX ;MOVING APART
*FIND CLOSING RATE
ABSF R0,R1
MPYF 1.5,R1 ;VELOCITY FUDGE FACTOR
ABSF R6 ;ADJUST DELTA X FOR CAR THICKNESS
FLOAT 400,R0
SUBF R0,R6
LDFLT 0,R6
ABSF R7 ;ADJUST DELTA Z FOR CAR THICKNESS
FLOAT 1000,R0
SUBF R0,R7
LDFLT 0,R7
MPYF R6,R6,R0
MPYF R7,R7,R2
ADDF R0,R2 ;distance^2
CALL SQRT ;DISTANCE T+1
CALL DIV_F ;CLOSING FRAMES
CMPF 200,R0
BGT CARCHKX ;TOO FAR AWAY
PUSHF R0
*GOT A LIVE ONE
*BLANK OUT TABLE SPACE
GOTONE
CALL GETPV ;GET PERPENDICULAR VELOCITY
POPF R1
MPYF R1,R0,R2 ;PROJECTED OFFSET
FIX R1,IR1 ;SAVE TIME
SUBF *+AR3(CARDIST2CNTR),R2
MPYF 0.01,R2
FIX R2,IR0
ADDI 25,IR0 ;ADJUST FOR ROAD CENTER (25), CAR THICKNESS (4)
CALL GETWIDTH ;GET CAR WIDTH
MPYF 0.01,R0
ABSF R0
CMPF 20,R0
LDFGT 20,R0
FIX R0,R0
ADDI 3,R0
LDI R0,RC ;WIDTH COUNT
LSH -1,R0 ;DIVIDE BY 2
SUBI R0,IR0 ;CENTER UP CAR AREA
LDI @ROADOBSTABI,AR0
LDI @CARTMP1,R1 ;GET CODE TO STORE
ADDI IR1,R1 ;ADD IN THE TIME
RPTB LOADLP
CMPI 0,IR0
BLT LOADLP
CMPI 49,IR0
BGT LOADLPX
STI R1,*+AR0(IR0) ;PUT IN ENTRY IN TABLE
LOADLP ADDI 1,IR0
LOADLPX
LDI IR1,R0 ;RETURN TIME DUDES
RETS
CARCHKX
LDI 800H,R0 ;FOUND NO CLOSING TIME
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*GET PERPENDICULAR VELOCITY
*OF CAR TO ROAD
*
*PARAMETERS
* AR2 CAR IN QUESTION
* AR3 CAR BLOCK
*RETURNS
* R0 PERP SPEED +RIGHT -LEFT
* R2 ANGLE
*
GETPV:
LDI *+AR2(OCARBLK),AR3
PUSH AR2
LDI *+AR3(CARTRAK),AR2
CALL GETRDIR ;R0= RADIANS
SUBF *+AR3(CARVROT),R0
LDF R0,R2
CALL _SINE
MPYF *+AR3(CARSPEED),R0
MPYF 1.5,R0
POP AR2
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*GET CAR WIDTH ON ROAD
*
*PARAMETERS
* AR2 CAR IN QUESTION
* AR3 CAR BLOCK
*RETURNS
* R0 WIDTH
* R1 HEIGHT
*
GETWIDTH:
PUSH AR2
LDI *+AR3(CARTRAK),AR2
CALL GETRDIR ;R0= RADIANS
POP AR2
SUBF *+AR3(CARVROT),R0
LDF R0,R2
CALL _SINE
LDF R0,R1
CALL _COSI
LDF *+AR3(CARXPLUS),R2
SUBF *+AR3(CARXMINUS),R2
LDF *+AR3(CARZPLUS),R3
SUBF *+AR3(CARZMINUS),R3
ABSF R0
ABSF R1
MPYF R0,R2,R4 ;COS*X+SIN*Z WIDTH TERMS
MPYF R1,R3,R5
MPYF R1,R2,R2 ;SIN*X+COS*Z HEIGHT TERMS
MPYF R0,R3,R3
ADDF R4,R5,R0 ;WIDTH
ADDF R2,R3,R1 ;HEIGHT
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*CHECK FOR RACER PASSING SOUND
*
*PARAMETERS
* AR4 RACER CAR OBJ
* AR5 RACER CAR STRUCT
*
RPASS:
LDI *+AR7(PASSCNT),R0 ;INHIBIT PASSING SOUND?
BZ RPASS1
SUBI 1,R0
LDIN 0,R0
STI R0,*+AR7(PASSCNT)
RETS
RPASS1
LDI @PLYCAR,AR2 ;GET PLAYER CAR OBJECT
LDI *+AR2(OCARBLK),AR3
LDF *+AR5(CARSPEED),R3 ;SPEED GREATER?
SUBF *+AR3(CARSPEED),R3
CMPF 40,R3
BGT RPASS2
ABSF R3
CMPF 20,R3
BLT RPASSX
CMPF 60,R3
LDFGT 60,R3
LDI *+AR4(ODIST),R0
CMPI 0,R0
BLT RPASSX
CMPI 3000,R0
BGT RPASSX
B RPASS3
RPASS2
LDI *+AR4(ODIST),R0
CMPI 1500,R0
BLT RPASSX
CMPI 5000,R0
BGT RPASSX
RPASS3
LDF *+AR5(CARDIST2CNTR),R0
SUBF *+AR3(CARDIST2CNTR),R0
ABSF R0,R1
FLOAT 4000,R0
CALL DIV_F
CMPF 1.0,R0
LDFGT 1.0,R0
FLOAT 255,R1
MPYF R1,R0 ;VOLUME FACTOR
FIX R0
LDI SMCARPASS,AR2 ;DIFFERENT SOUND DIFF VEL
CMPF 40,R3
LDIGT FCARPASS,AR2
CMPF 60,R3
BLT RPASS4
FIX R3
LSH -1,R3
LDIC SPCARPASS,AR2
RPASS4
CALL VOLSNDFX
LDI 40,R0
STI R0,*+AR7(PASSCNT)
RPASSX
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*INITIALIZE RACER STARTING POSITION
*
*PARAMETERS
* AR4 OBJECT
* AR2 TRAKING OBJECT PLAYER STARTS OUT ON
* AR3 RANK FORWARD
*RETURNS
* R2 (FL) FACING THETA
*
*
SPOS_INIT:
PUSH AR5
PUSH AR6
LDI @VECTORBI,AR5
LDF *+AR2(OPOSX),R0
STF R0,*+AR5(X)
LDF *+AR2(OPOSY),R0
STF R0,*+AR5(Y)
LDF *+AR2(OPOSZ),R0
STF R0,*+AR5(Z)
LDI *+AR2(OLINK4),AR2 ;GET *NEXT* PIECE
LOOP56
LDF *+AR2(OPOSX),R2
SUBF *+AR5(X),R2
LDF *+AR2(OPOSZ),R3
SUBF *+AR5(Z),R3
CALL ARCTANF
SUBF HALFPI,R0
LDF R0,R2 ;THIS IS INITIAL FACING
CMPI 0,AR3
BEQ OFFANDDONE
FLOAT 5500,R0
CALL DISTANCE_2D
ADDF *+AR5(X),R0
STF R0,*+AR5(X)
ADDF *+AR5(Z),R1
STF R1,*+AR5(Z)
DEC AR3
CMPI 0,AR3
BLE OFFANDDONE
LOOP56A
LDF *+AR2(OPOSX),R0
SUBF *+AR5(X),R0
MPYF R0,R0
LDF *+AR2(OPOSZ),R2
SUBF *+AR5(Z),R2
MPYF R2,R2
ADDF R0,R2
CALL SQRT
FLOAT 5000,R1
CMPF R1,R0
BGT LOOP56
LDI *+AR2(OLINK4),AR2
BU LOOP56A
OFFANDDONE
STI AR2,*+AR7(DELTA_TPIECE)
L874 LDI *+AR2(OUSR1),R0
STI R0,*+AR7(DELTA_LAST_OID)
PUSHFL R2
LDI @MATRIXAI,AR2
CALL FIND_YMATRIX
CALL CLR_VECTORA
LDF *+AR7(DELTA_XLANE),R0
STF R0,*+AR2(X)
LDI @MATRIXAI,R2
LDI AR2,R3
CALL MATRIX_MUL
LDI @VECTORAI,AR0
LDF *+AR5(X),R0
ADDF *+AR0(X),R0
STF R0,*+AR4(OPOSX)
LDF *+AR5(Y),R0
SUBF *+AR5(CARWHLTAB+1),R0
ADDF *+AR0(Y),R0
STF R0,*+AR4(OPOSY)
LDF *+AR5(Z),R0
ADDF *+AR0(Z),R0
STF R0,*+AR4(OPOSZ)
POPFL R2
POP AR6
POP AR5
RETS
*----------------------------------------------------------------------------
.GLOBL WRECK,WRECKST,WRECKFLG,VIEW1I,VIEW0I,VIEW2I
*----------------------------------------------------------------------------
*START PLAYER WRECK
*
*PARAMETERS
* AR4 PLAYER OBJECT
* AR5 PLAYER CAR BLOCK
* AR7 PROCESS BLOCK
*
WRECKST:
PUSH AR4
PUSH AR5
PUSH AR7
LDI @PLYCAR,AR4
LDI @PLYCBLK,AR5
LDI @PLYPROC,AR7
LDI @CAMVIEW,R0
STI R0,*+AR7(PDATA+21) ;SAVE OLD VIEW...
BNZ WRKST1
LDI @VIEW2I,AR2
LDI UTIL_C,R2
CALL PRC_CREATE ;SETUP VIEW 1 IF FIRST PERSON
WRKST1
LDF *+AR5(CT_PRDYD),R0 ;DELTA Y TO ROAD
ADDF *+AR4(OPOSY),R0 ;ADD Y POSTION OF CAR
STF R0,*+AR7(PDATA+20) ;ABSOLUTE Y OF ROAD
*GET YOUR RADIANS
LDF 0.104,R0
STF R0,*+AR7(PDATA) ;X RADIANS
LDF 0.104,R0
STF R0,*+AR7(PDATA+1) ;Y RADIANS
LDF 0,R0
STF R0,*+AR7(PDATA+2) ;Z RADIANS
LDF 0,R0
STF R0,*+AR7(PDATA+3) ;X RADIAN TOTAL
STF R0,*+AR7(PDATA+5) ;Z RADIAN TOTAL
LDF *+AR5(CARYROT),R0 ;GET CAR Y ROT
STF R0,*+AR7(PDATA+4)
LDF -60,R0
STF R0,*+AR4(OVELY) ;STUFF VERTICAL VELOCITY
LDI 1,R0 ;SET WRECK FLAG
STI R0,@WRECKFLG
LDI 0,R0
STI R0,*+AR5(CARSHAD) ;TURN OFF SHADOW
POP AR7
POP AR5
POP AR4
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*FLYING CAR PROCESS
*
*
*PARAMETERS
* AR4 DRONE PROCESS
* AR5 DRONE CAR BLOCK
* PDATA= X RAD
* PDATA+1= Y RAD
* PDATA+2= Z RAD
* PDATA+3= X RAD TOTAL
* PDATA+4= Y RAD TOTAL
* PDATA+5= Z RAD TOTAL
* PDATA+6=MATRIX
* PDATA+20=INIT HT
* PDATA+21=CAMVIEW SAVE
*
.globl GETFLYMAT
WRECK:
CALL GETTRAK ;KEEP UPDATING YOUR TRACKER
FLOAT @NFRAMES,R1 ;ADJUST MATRIX FOR FRAME COUNT
LDF *+AR7(PDATA),R0 ;ACCUMULATE X RADIANS
MPYF R1,R0
ADDF *+AR7(PDATA+3),R0
STF R0,*+AR7(PDATA+3)
LDF *+AR7(PDATA+1),R0 ;ACCUMULATE Y RADIANS
MPYF R1,R0
ADDF *+AR7(PDATA+4),R0
STF R0,*+AR7(PDATA+4)
LDF *+AR7(PDATA+2),R0 ;ACCUMULATE Z RADIANS
MPYF R1,R0
ADDF *+AR7(PDATA+5),R0
STF R0,*+AR7(PDATA+5)
CALL GETFLYMAT ;COMPUTE MATRICES
*CONVERT CARVROT,CARSPEED TO OVELX, OVELZ
LDF *+AR5(CARVROT),R2
ADDF 1.57,R2 ;CORRECT FOR 90 DEGREE ERROR
CALL _SINE
LDF *+AR5(CARSPEED),R3
MPYF R3,R0
STF R0,*+AR4(OVELZ) ;CONVERT TO CARVROT, CARSPEED TO XZVEL
CALL _COSI
MPYF R3,R0
STF R0,*+AR4(OVELX)
CALL OVELNADD ;UPDATE VELOCITIES
LDI *+AR4(OCARBLK),R3 ;GET CAR DATA AREA
CALL ROADSCAN ;CHECK WHEEL HITS
LDI *+AR4(OCARBLK),AR5 ;GET CAR DATA AREA
*KEEP Y ABOVE THE ROAD
LDI *+AR5(CT_PCOL),R0
BZ WRECK1
LDF *+AR5(CT_PRDYD),R0 ;DELTA Y TO ROAD
ADDF *+AR4(OPOSY),R0 ;ADD Y POSTION OF CAR
LDF R0,R1
SUBF *+AR7(PDATA+20),R0
ADDF *+AR4(OPOSY),R0
STF R0,*+AR4(OPOSY)
STF R1,*+AR7(PDATA+20) ;SAVE NEW BASE LINE
*CHECK FOR THE END
WRECK1
FLOAT @NFRAMES,R2
MPYF 2,R2 ;FRAME ADJUSTED GRAVITY
ADDF *+AR4(OVELY),R2
STF R2,*+AR4(OVELY)
CMPF 60,R2
RETSLT ;NOT OVER YET
*END IT ALL
LDI 0,R0 ;END IT ALL
STI R0,@WRECKFLG
LDI 1,R0
STI R0,*+AR5(CARSHAD) ;TURN ON SHADOW
SONDFX BOTTOMOUT ;BOTTOM OUT SOUND
LDI *+AR7(PDATA+21),R0 ;RETURN TO FIRST PERSON?
BNZ WRECKSLP
LDI @VIEW0I,AR2
LDI UTIL_C,R2
CALL PRC_CREATE ;RETURN TO 1ST PERSON
WRECKSLP
RETS
*
*PLAYER DRAFT CHECK
*AR4=PLAYER OBJECT
*AR5=PLAYER CAR BLOCK
*
;PLYRDRAFT:
;*DECAY DRAFT VALUE
; LDF @PLDRAFTVAL,R0
; SUBRF 1.0,R0
; MPYF 0.97,R0
; SUBRF 1.0,R0
; CMPF 1.0,R0
; LDFGT 1.0,R0
; STF R0,@PLDRAFTVAL
;
;*SCAN DRONES FOR POSSIBLE DRAFT
;
; LDI *+AR5(CARTRAK),AR0
; LDI *+AR0(OUSR1),R5 ;GET CURRENT CAR TRACK
;
; LDF *+AR5(CARDIST2CNTR),R6 ;GET OUR LANE POSITION
; LDI @CAR_LIST,AR2
; LDI AR2,R0
; BZ DRAFTX
;DRAFTL
; LDI *+AR2(OFLAGS),R0
; TSTB O_NOCOLL,R0 ;STEALTH MODE ?
; BNZ DRAFTLP ;YES, DONT BOTHER
; LDI *+AR2(OCARBLK),AR3 ;QUICK FRONT/BACK CHECK
;
; LDF *+AR3(CARDIST2CNTR),R2 ;GET LANE POSITION
; SUBF R6,R2,R4
; ABSF R4
; CMPF 250,R4
; BGT DRAFTLP
;
; LDF *+AR3(CARSPEED),R0 ;IS SPEED CLOSE???
; SUBF *+AR5(CARSPEED),R0
; ABSF R0
; CMPF 50,R0
; BGT DRAFTLP
;
; LDI *+AR3(CARTRAK),AR0
; CMPI *+AR0(OUSR1),R5
; BGT DRAFTLP
; BLT DRAFT1
;
; CALL CKAHEAD
; BLT DRAFTLP
;DRAFT1
; SUBF *+AR4(OPOSX),*+AR2(OPOSX),R2 ;DELTA X
;
; LDF *+AR2(OPOSZ),R1 ;DELTA Z
; SUBF *+AR4(OPOSZ),R1
;
; MPYF R2,R2
; MPYF R1,R1
; ADDF R1,R2
;
; FLOAT 5000,R1 ;TO THE NEXT ROADPIECE
; MPYF R1,R1
; CMPF R1,R2 ;DISTANCE LT 5000 ?
; BGT DRAFTLP
; CALL SQRT
;
; FLOAT 1000,R1
; SUBF R1,R0
; LDFLT 0,R0
;
; MPYF 0.1,R0
; ADDF R4,R0
;
; MPYF 0.01,R0
; MPYF 0.02,R0
; ADDF 0.87,R0
;
; ADDF @PLDRAFTVAL,R0 ;GRADUAL EFFECT
; MPYF 0.5,R0
; STF R0,@PLDRAFTVAL
; RETS
;
;*WE HAVE A DRAFT HERE
;
;DRAFTLP
; LDI *+AR2(OLINK3),AR2
; LDI AR2,R0
; BNZ DRAFTL
;DRAFTX
; RETS
*----------------------------------------------------------------------------
.END