2331 lines
43 KiB
NASM
Executable File
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
|
|
|
|
|
|
|