cruisin-usa/PLYR.ASM

3563 lines
67 KiB
NASM
Executable File

.FILE "PLYR.ASM"
*----------------------------------------------------------------------------
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
*ALL RIGHTS RESERVED
*
.include C30.EQU
.include OBJ.EQU
.include MACS.EQU
.include MPROC.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 DIRQ.EQU
.include DELTA.EQU
.include COMM.EQU
JARVK .set 0
.globl RANDSND,RANDVSND
.globl ROADIR,GETNXTRDIR
.globl DRONINBZ,INBOUNDZ
.globl GETRPM,GETAUTO,ENGFRI,GEARACTABI,ENGACTABI,STEERI
.globl PLYRFIRST,DRONESTOP,PLYRDRAFT
*THESE ARE EDGE VARIABLES AND SHOULD NOT BE MESSED WITH
.bss OFFROAD_TMR,1
.bss ZOOMRAM,0
.bss ZOOMD,1 ;CURRENT ZOOM DISTANCE
.bss ZOOMDD,1
.bss ZOOMDG,1 ;ZOOM DIST GOAL
.bss ZOOMH,1 ;CURRENT ZOOM HEIGHT
.bss ZOOMHD,1
.bss ZOOMHG,1 ;ZOOM HEIGHT GOAL
.bss CAMVIEW,1 ;CAMERA VIEW 1=THIRD PERSON
.bss BRAKEON,1 ;1=BRAKE PEDAL ON
.bss WRECKFLG,1 ;1=PLAYER CAR WRECKED, 0=NORMAL
.bss REVFLG,1
.bss _plyr1,0 ;PLYR STRUCT
.bss PLYSTAT,1
.bss PLYCAR,1
.bss PLYPROC,1
.bss PLYCBLK,1 ;End Plyr Struct
.bss OLDPLYSPD,1 ;OLD PLAYER SPEED
.bss OLDPLYAIR,1 ;OLD PLAYER AIRBORNE
.bss PLYRFIRST,1 ;TICKS PLAYER IN 1ST PLACE
.bss PLAIRTIM,1 ;TIMER FOR AIR SOUND DISABLE
.bss CHEATACC,1
.bss CHEAT,1
.globl HEAD2HEAD_ON,PLY2CAR,CHEAT
*PLAYER 1ST, 2ND, 3RD POSTION COORDS:
PLYPOS1Z .set 0
PLYPOS1Y .set -150
.if JARVK
PLYPOS2Z .set 3840
PLYPOS2Y .set -700
PLYPOS3Z .set 6000
PLYPOS3Y .set -1000
.else
PLYPOS2Z .set 2200
PLYPOS2Y .set -400
PLYPOS3Z .set 3840
PLYPOS3Y .set -700
.endif
;PLYPOS3Y .set -2700 ;good heli height
ZOOMRATIO .set 0.05 ;1/ZOOMTIME FOR VIEW CHANGE
*SWITCH BIT VALUES
SHIFT .set 4 ;LO-HI SHIFT LEVER
BRAKE .set 1 ;BRAKE PEDAL
*RAM VARIABLES
.bss PLMSAV,15 ;AREAS TO SAVE PLAYER MATRICES
.bss PMSAV,9
ZOOMI .word ZOOMRAM
GRAVITY .set 1.20
ROADFRICI .float 0.0028
OFRDFRICI .float 0.010
BRAKFRICI .float 0.020
SKIDFRICI .float 0.003
SPINFRICI .float 0.015 ;SPINOUT FRICTION
*RPM MAX
NUM_RPMS .set 47
NUM_RPM .set 47.0
OVERREV .set 51.0
*----------------------------------------------------------------------------
*PLAYER CAR SPECIALIZED PARAMETER TABLE
*
*ACCELERATION, TRACTION (0=total traction), ONROAD DAMPING, OFFROAD DAMPING
*
CARPARAMTABI .word CARPARAMTAB
*STDARD .float 0.82,1.00,0.0028,0.010
*NEWSTD .float 0.82,0.90,0.0028,0.0060
CARPARAMTAB:
*#0 MUSCLE CAR
.float 0.91,0.60,0.0028,0.010 ;ALL AROUND
CARPARAMTAB1
*#1 XXX
.float 0.98,0.50,0.0032,0.0042 ;ACCEL
*#2 MISSILE
.float 0.88,0.70,0.0026,0.010 ;TOP SPEED
*#3 FERRARI
.float 0.89,0.50,0.0028,0.010 ;HANDLING
*HIDDEN VEHICLES
*#4 jeep
.float 0.95,0.60,0.0030,0.0039
*#5 sbusp
.float 0.89,0.50,0.0028,0.010
*#6 copcar
.float 0.91,0.65,0.0028,0.0050
*#7 gtruck
.float 0.89,0.50,0.0028,0.010
CARPARAMTABL .set CARPARAMTAB1-CARPARAMTAB ;LENGTH OF ENTRY
*----------------------------------------------------------------------------
*GET CAR PARAMETERS FOR PLAYER
*PARAMETERS
* R0 CAR # 0-3
* AR0 CAR BLOCK INDEX
*LOADS PARAMETERS INTO CAR BLOCK
*TRASHES R0,AR2
GETCARPARAM:
LDI @CARPARAMTABI,AR2
MPYI CARPARAMTABL,R0
ADDI R0,AR2
LDF *AR2++,R0
STF R0,*+AR0(CARMAXACCEL)
LDF *AR2++,R0
STF R0,*+AR0(CARTRACTION)
LDF *AR2++,R0
STF R0,*+AR0(CARRDFR)
LDF *AR2++,R0
STF R0,*+AR0(CAROFRDFR)
RETS
*----------------------------------------------------------------------------
*INIT CAR 3 POINT SUSPENSION DATA STRUCTURE
*PARAMETERS
* AR4 OBJECT BLOCK
* R0 VEHICLE #
*RETURNS AR0 POINTS TO CARBLOCK
*
* NO CARRY ON FAILURE TO ALLOCATE CAR BLOCK
*
*TRASHED R1-R7
_CARV0:
PUSH R0
PUSH AR1
CALL GETCAR
BNC CARV_ERR
STI AR0,*+AR4(OCARBLK)
LDF 0,R0
RPTS CARSIZ-1
STF R0,*AR0++ ;CLEAR OUT THE BLOCK
SUBI CARSIZ,AR0 ;RESTORE AR2
CALL _makbox ;GET YOUR CAR BOX
LDI *+AR4(OROMDATA),AR1 ;TWEAK RADIUS SLIGHTLY
FLOAT *AR1,R0
MPYF 1.1,R0
FIX R0
STI R0,*+AR4(ORAD) ;GET OBJECT RADIUS
LDI 0,R0 ;INIT FLAGS
STI R0,*+AR0(CAR_SPIN)
STI R0,*+AR0(CAR_ONROAD)
STI R0,*+AR0(CAR_AIRF)
STI R0,*+AR0(CAR_AIRB)
STI R0,*+AR0(CARPTSTR) ;POSITION TRACKING SYSTEM
STI R0,*+AR0(CARPTSRANK)
STI R0,*+AR0(CAR_BUMP)
STI R0,*+AR0(CARGEAR)
STI R0,*+AR0(CARTRANS) ;AUTO IS DEFAULT
STI R0,*+AR0(CARNUM) ;CLEAR DISPATCH NUMBER
STI R0,*+AR0(CARTRACK_ID) ;CLEAR TRACK ID
STI R0,*+AR0(CAR_OM) ;CLEAR OTHER MACHINE FLAG
LDF 0,R0
STF R0,*+AR0(CARRPM)
LDI 1,R0
STI R0,*+AR0(CARSHAD) ;SHADOW ON
LDF @ROADFRICI,R0 ;FRICTION COEFFICIENTS
STF R0,*+AR0(CARRDFR)
LDF @OFRDFRICI,R0
STF R0,*+AR0(CAROFRDFR)
LDF 0.82,R0
STF R0,*+AR0(CARMAXACCEL) ;SET ACCEL POWER
LDF 1.0,R0
STF R0,*+AR0(CARMASS) ;DEFAULT CAR MASS
STF R0,*+AR0(CARTRACTION) ;DEFAULT TRACTION COEFFICIENT
LDI 1,R0
LS O_3DROT_B,R0
OR *+AR4(OFLAGS),R0 ;FLAG SYSTEM AS NON-2D OPTIMIZABLE
STI R0,*+AR4(OFLAGS)
SETC
CARV_ERR
POP AR1
POP R0
RETS
*----------------------------------------------------------------------------
.globl BONUS_WAIT_LOOP
BONUS_WAIT_LOOP:
LDI @DID_TIMED_OUT,R0
BNZ BWLX
LDI @PLYCAR,AR2
LDI *+AR2(OFLAGS),R0 ;CHECK IF ALREADY ON LIST
TSTB O_LIST_M,R0
BNZ BWLX ;YES, DONT INSERT
CALL OBJ_INSERT ;INSERT PLAYER OBJECT
BWLX
BONUS_WAIT_LP
LDI @PLYCAR,AR4
LDI @PLYCBLK,AR5
CALL ZOOMUP ;UPDATE YOUR ZOOM
SLEEP 1
LDI @_MODE,R0
AND MMODE,R0
CMPI MGAME,R0
BNE BONUS_WAIT_LP
BU PLYR_ENTER
*----------------------------------------------------------------------------
*PLYR_CAR_INIT
*PARAMETERS
* AR4 CAR (NOT INSERTED)
*RETURNS
* AR4 CAR (INSERTED)
* AR5 CAR BLOCK
.globl PLYR_CAR_INIT
PLYR_CAR_INIT:
STI AR4,@PLYCAR ;INIT CAR PLAYER STRUCT
STI AR7,@PLYPROC
LDI @CHOOSENCAR,AR1
CMPI 4,AR1
BLT DOGENRLB
LDI AR1,R0
CMPI 4,AR1
LDIEQ JEEP_MOD,R0
CMPI 5,AR1
LDIEQ PLYR_SBUS_MOD,R0
CMPI 6,AR1
LDIEQ PLYR_COPCAR_MOD,R0
CMPI 7,AR1
LDIEQ 3,R0
LDI R0,AR1
DOGENRLB
LDI AR1,AR2
MPYI VEHTAB_SIZE,AR1
ADDI @VEHICLE_TABLEI,AR1
LDI *+AR1(VEHTAB_MODEL),R1
STI R1,*+AR4(OROMDATA)
CALL VEHICLE_ANI_INIT ;SETUP WHEEL ANIMATION
LDF -1,R0
STF R0,*+AR4(OUSR1) ;skid system flag
LDI 0,R0
STI R0,@_MPH
STI R0,@OLDPLYAIR ;OLD AIRBORNE FLAG
STI R0,@PLAIRTIM ;CLEAR AIR TIMER
STI R0,@ENGVOL ;ENGINE SOUND VOLUME
STI AR7,*+AR4(OPLINK) ;SETUP OPLINK
LDI AR4,AR2
CALL OBJ_INSERT ;INSERT SUCKER ON THE LIST
LDF 0,R0
STF R0,@OLDPLYSPD
LDI @CHOOSENCAR,R0
CALL _CARV0 ;INIT CAR DATA STRUCT IN PROCESS
CALL GETCARPARAM ;GET SPECIAL PLAYER CAR PARAMETERS
STI AR0,@PLYCBLK
LDI PLYR_C,R0
STI R0,*+AR0(CAR_ID)
STI R0,*+AR4(OID)
LDI @CHOSEN_TRANSMISSION,R0
STI R0,*+AR0(CARTRANS) ;AUTO/MANUAL SWITCH
LDF 2.0,R0
STF R0,*+AR0(CARMASS) ;SET CAR MASS
LDI 11,R0
STPI R0,@OFFROAD_TMR
LDF @STEERCT,R0 ;STEERING CENTER
STF R0,@WHEELPOS
RETS ;DONE INITIALIZING PLYR CAR
*----------------------------------------------------------------------------
*PARAMETERS
* AR4 CAR OBJECT
PLYR_INTRO_ENTER:
LDI *+AR4(OCARBLK),AR5
LDI 0,R0 ;NEUTRAL, PLEASE
STI R0,*+AR5(CARGEAR)
CALL GETTRAK
LDI *+AR5(CARTRAK),AR2
;Set Appropriate Palette
;
LDI @CHOOSENCAR,R0
LDI R0,AR0
CMPI 4,R0
LDIEQ JEEP_MOD,AR0
CMPI 5,R0
LDIEQ PTRUCKG_MOD,AR0
CMPI 6,AR0
LDIEQ COPCAR_MOD,AR0
CMPI 7,AR0
LDIGE GTRUCK_MOD,AR0
MPYI VEHTAB_SIZE,AR0
ADDI @VEHICLE_TABLEI,AR0
LDI *+AR0(VEHTAB_PAL),AR2
CALL PAL_FIND
STI R0,*+AR4(OPAL)
;
;INIT CAMERA
;
LDF @START_RADY,R2 ;SETUP MATRIX
STF R2,*+AR5(CARYROT)
STF R2,*+AR5(CARVROT)
CLRF R0
STF R0,*+AR5(CARTHROTTLE)
STF R0,*+AR5(CARSPEED)
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL FIND_YMATRIX
;SET CAMERA POSITION
;
;
LDF @START_RADY,R2 ;SETUP MATRIX
LDI @MATRIXAI,AR2
CALL FIND_YMATRIX
LDI AR2,R2
CALL CLR_VECTORA
FLOAT -20*FEET,R0
STF R0,*+AR2(Y)
FLOAT (-20*FEET),R0
STF R0,*+AR2(Z)
LDI AR2,R3
CALL MATRIX_MUL
LDI @CAMERAPOSI,AR3 ;INIT CAMERA POSITION
LDF *+AR4(OPOSX),R0
ADDF *+AR2(X),R0
STF R0,*+AR3(X) ;CAMERA X
LDF *+AR4(OPOSY),R0
ADDF *+AR2(Y),R0
STF R0,*+AR3(Y) ;CAMERA Y
LDF *+AR4(OPOSZ),R0
ADDF *+AR2(Z),R0
STF R0,*+AR3(Z) ;CAMERA Z
CALL RESCAN ;RESET ACTIVE OBJECT LIST
LDI 1,R0
STI R0,@CAMVIEW ;INIT CAMERA VIEW TO 3RD PERSON
BU PLYR_INTRO_JOIN
*----------------------------------------------------------------------------
_PLYR:
PLYR_ENTER
CALL OBJ_GET ;INIT PLAYER OBJECT
LDI AR0,AR4
CALL PLYR_CAR_INIT
LDF @START_POS+X,R0
STF R0,*+AR4(OPOSX)
LDF @START_POS+Y,R0
STF R0,*+AR4(OPOSY)
LDF @START_POS+Z,R0
STF R0,*+AR4(OPOSZ)
LDI PLYR_C|PLYR1_T,R0
STI R0,*+AR7(PID)
*INITIALIZE PLAYER COORD, FACING ANGLE
LDI *+AR4(OCARBLK),AR5
CALL GETTRAK
LDI *+AR5(CARTRAK),AR2
LDI @DYNALIST_TRUEBEGIN,AR2
LDI *+AR2(OUSR1),R0
LDI *+AR2(OLINK4),AR2 ;SKIP FIRST GROUP
; ANDN 0FFh,R0
; ADDI 0100h,R0
;L10 LDI *+AR2(OLINK4),AR2 ;SKIP FIRST GROUP
; CMPI *+AR2(OUSR1),R0
; BGT L10
LDF *+AR2(OPOSX),R0
STF R0,*+AR4(OPOSX)
LDF *+AR2(OPOSY),R0
STF R0,*+AR4(OPOSY)
LDF *+AR2(OPOSZ),R0
STF R0,*+AR4(OPOSZ)
CALL GETRDIR ;GET ANGLE OF ROAD
*INIT CAMERA
LDF R0,R2
STF R2,*+AR5(CARYROT)
STF R2,*+AR5(CARVROT)
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL FIND_YMATRIX
NEGF R2
CALL NORMITS
LDP @_CAMERARAD+Y
STF R2,@_CAMERARAD+Y ;UPDATE CAMERA RAD
SETDP
LDI @CAMERAMATRIXI,AR2
CALL FIND_YMATRIX
*OFFSET THE CAR INTO LANE 1
LDI AR4,R2
ADDI OMATRIX,R2
CALL CLR_VECTORA
FLOAT 10*FEET,R0
;
;if vehicle is a slave, then offset into lane #2
;
LANESIZE .set 1152
;if a slave then ALWAYS appear on right side
;
;
LDI @DIPRAM,R1
TSTB DIP_COMMP,R1
BNZ BABA
TSTB CMDP_MASTER,R1
BZ BABA
FLOAT LANESIZE,R1
ADDF R1,R0
BABA
STF R0,*+AR2(X)
LDI AR2,R3
CALL MATRIX_MUL
LDI R3,AR2
LDF *+AR4(OPOSX),R0
ADDF *+AR2(X),R0
STF R0,*+AR4(OPOSX)
LDF *+AR4(OPOSY),R0
ADDF *+AR2(Y),R0
STF R0,*+AR4(OPOSY)
LDF *+AR4(OPOSZ),R0
ADDF *+AR2(Z),R0
STF R0,*+AR4(OPOSZ)
*SET CAMERA POSITION
LDI @CAMERAMATRIXI,AR2
LDI AR2,R2
CALL CLR_VECTORA
FLOAT -20*FEET,R0
STF R0,*+AR2(Y)
FLOAT (-20*FEET),R0
STF R0,*+AR2(Z)
LDI AR2,R3
CALL MATRIX_MUL
LDI @CAMERAPOSI,AR3 ;INIT CAMERA POSITION
LDF *+AR4(OPOSX),R0
ADDF *+AR2(X),R0
STF R0,*+AR3(X) ;CAMERA X
LDF *+AR4(OPOSY),R0
ADDF *+AR2(Y),R0
STF R0,*+AR3(Y) ;CAMERA Y
LDF *+AR4(OPOSZ),R0
ADDF *+AR2(Z),R0
STF R0,*+AR3(Z) ;CAMERA Z
CALL RESCAN ;RESET ACTIVE OBJECT LIST
*CAMERA INIT
PLYR_INTRO_JOIN
; LDF 1.0,R0 ;INIT DRAFT VALUE
; STF R0,@PLDRAFTVAL
LDF 0,R0 ;INITIALIZE PLAYER ZOOM POSITION
STF R0,@ZOOMDD
STF R0,@ZOOMHD
FLOAT PLYPOS2Y,R0
STF R0,@ZOOMH
STF R0,@ZOOMHG
FLOAT PLYPOS2Z,R0
STF R0,@ZOOMD
STF R0,@ZOOMDG
LDI @VIEW1I,AR2
LDI @CAMVIEW,R0
LDIEQ @VIEW0I,AR2
LDI 1,R1
STI R1,@CAMVIEW ;INIT CAMERA VIEW TO 3RD PERSON
CMPI 2,R0
LDIEQ @VIEW2I,AR2
LDI UTIL_C,R2 ;RESTORE OLD VIEW
CALL PRC_CREATE
.data
VIEW0I .word _VIEW0
VIEW1I .word _VIEW1
VIEW2I .word _VIEW2
.text
L883 LDI 0,R0 ;BRAKE INITIALLY OFF
STPI R0,@BRAKEON
STI R0,@WRECKFLG ;WRECK OFF
STI R0,@PLYRFIRST ;TIMER FOR PLAYER IN 1ST PLACE
CALL _off_brake
LDF 1.0,R0 ;INITIALIZE THE CHEAT
STF R0,@CHEATACC
STF R0,@CHEAT
LDI @_MODE,R0
OR MHUD,R0
STI R0,@_MODE
*
*PLAYER CAR LOOP
*
PLYRLP: LDI @END_OF_GAMEP,R0
BNZ ENDPLAYER
LDI @NFRAMES,R2
NEGI R2,R1
LDI @POSITION,R0 ;TIMER FOR HOW LONG PLAYER IN 1ST
CMPI 1,R0
LDIZ @PLYRFIRST,R1
ADDI R2,R1
STI R1,@PLYRFIRST ;TIMER FOR PLAYER IN 1ST PLACE
LDI @_countdown,R1 ;TIMEOUT?
CALLLE TIMED_OUT ;SETBACK?
DONT_TIMEOUT
*CHECK FOR BONUS SCREEN
* !!!! DO NOT REMOVE THIS CODE
* !!!! EVEN IF YOU DON'T KNOW WHAT
* !!!! IT DOES
LDI @_MODE,R0
AND MMODE,R0
CMPI MBONUS,R0
BEQ BONUS_WAIT_LOOP
LDI @PLYCAR,AR4 ;GET PLAYER CAR OBJECT
LDI *+AR4(OCARBLK),AR5
.globl WRECK,WRECKST,WRECKFLG,VIEW1I,VIEW0I,VIEW2I
PLYRSPD00
LDI @WRECKFLG,R0 ;WRECK?
BZ PLYRSPD
CALL WRECK ;DO YOUR WRECK THING
CALL INBOUNDZ ;KEEP IN BOUNDS
B PLYRCAM ;DONT CHANGE MATRIX OR CAMERA POS
PLYRSPD
CALL CKOFRD ;CHECK YOUR OFFROAD COUNTER
CMPI 0,R0
CALLZ PLYONRD ;RESET PLAYER ON ROAD
LDF *+AR4(OMAT11),R0 ;IF PLAYER FLIPPED RESET 'EM
CMPF 0.01,R0
CALLLT PLYONRD
*GET CAR SPEED
CALL GETGEAR ;GET CAR GEAR
LDI *+AR5(CARGEAR),R1
STI R0,*+AR5(CARGEAR)
CMPI R0,R1 ;CHECK FOR UPSHIFT
BGE PLYRSPD0 ;DOWNSHIFT OR NO SHIFT
; CMPI 4,R0 ;4TH GEAR?
; BZ PLYRSPD0 ;YES, NO RUBBER
CALL GETPEDAL ;GET GAS PEDAL VALUE
MPYF 2,R0 ;GIVE A LITTLE JOLT
CMPF 1.4,R0 ;CHECK THROTTLE
BLE PLYRSPD01 ;NOT ENOUGH
PUSHF R0
SONDFX UPSHIFTSND ;MAKE YOUR UPSHIFT DUDES
CREATEC FLAME_PRC,UTIL_C ;make child flames
CREATEC SMOKE_PROC,UTIL_C ;make child smoke
; LDI *+AR5(CARGEAR),AR2 ;MAKE RIGHT REV ON SHIFT
; ADDI @SHIFTSNDTABI,AR2
; LDI *-AR2(1),AR2
; CALL ONESND
POPF R0
B PLYRSPD01
PLYRSPD0
CALL GETPEDAL ;GET GAS PEDAL VALUE
PLYRSPD01
; NEGF *+AR5(CARTHROTTLE),R1
; ADDF R0,R1
; CMPF 0.3,R1
; BLT NO_PEDAL_FLAME
; PUSHF R0
; CREATEC FLAME_PRC,UTIL_C ;make child flames
; POPF R0
;NO_PEDAL_FLAME
LDI @_MODE,R1
TSTB MGO,R1
LDFZ 0,R0 ;YIP, NO THROTTLE
STF R0,*+AR5(CARTHROTTLE)
CALL GETBRAKE ;GET YOUR BRAKE, DUDES...
STF R0,*+AR5(CARBRAKE) ;STORE IT
; LDF @PLDRAFTVAL,R0 ;SET DRAFTING VALUE
; STF R0,@DRAFTVAL
CALL GETSPD
LDF *+AR5(CARSPEED),R0 ;OUTPUT IN MPH
LDI @_countdown,R1
BGT NOTGO
LDI SM_GO,R1 ;we have to take care of the case when the plyr
STI R1,@SUSPEND_MODE ;just 'rolls' into the checkpoint
NOTGO
MPYF MPH_CONVERSION,R0
FIX R0
STI R0,@_MPH
*GET YOUR SKID FACTOR
CALL GETSKID
LDF *+AR5(CARSKID),R0
*DO YOUR TRACTION CHEAT...
LDI @HEAD2HEAD_ON,R1 ;LINK?
BZ GSKD1 ;FORGET IT, NOT HEAD2HEAD
LDI *+AR5(CAR_SPIN),R1 ;FULL SKID ON SPIN-OUT
BNZ GSKD1
LDF 2.00,R1
SUBF @CHEAT,R1
MPYF R1,R0
STF R0,*+AR5(CARSKID) ;CHEAT SKID VALUE
GSKD1
MPYF R0,R0
CMPF 1.0,R0
LDFGT 1.0,R0
SUBRF 1,R0
CMPF 0.333,R0
LDFLT 0.333,R0
MPYF 2.5,R0 ;STEERING WHEEL POWER
STF R0,@WHEELPWR
*GET CAR DIRECTION DELTA RADIANS
CALL GETTRAK ;GET CLOSEST TRAKC SECTION
CALL GETSTEER ;RET R0=STEERING DELTA RADIANS
CALL GETDIR ;ADJUST DIRECTION BASED ON SKID
PUSHF R0
CALL INBOUNDZ ;KEEP IN BOUNDS
CALL BACKCK ;KEEP IN RIGHT DIRECTION
POPF R0
*GET INCREMENTAL ROTATION MATRIX
LDF R0,R2
ADDF *+AR5(CARROT),R2 ;GET RID OF OLD OVERROTATION
LDI @MATRIXAI,AR2
CALL FIND_YMATRIX
*FORM NEW ROTATION MATRIX
LDI AR4,R2
ADDI OMATRIX,R2
LDI R2,R3
CALL CONCATMAT
*FORM NEW VELOCITY MATRIX
LDF *+AR5(CARVROT),R2 ;GET VELOCITY MATRIX
SUBF *+AR5(CARYROT),R2
LDI @MATRIXBI,AR2
CALL FIND_YMATRIX
LDI AR4,R2
ADDI OMATRIX,R2
LDI AR2,R3
CALL CONCATMAT
LDF *+AR5(CARDIST),R2 ;GET DISTANCE
MPYF @CHEAT,R2 ;DO THE CHEAT THING !!!
LDI @MATRIXBI,AR2
LDI *+AR5(CAR_AIRB),R0
BNZ PAIRB ;WERE FLYING
*MOVE CAR FORWARD
LDI AR4,R3
ADDI OVELX,R3
CALL FORWARD
PAIRB
CALL OVELADD
*GET ROAD MATRIX
LDI *+AR4(OCARBLK),R3 ;GET CAR DATA AREA
CALL CAR_ROAD_COLL
*GET NEW CAR MATRIX
LDF *+AR5(CARYROT),R2
STF R2,*+AR4(ORADY) ;STORE CAR OBJECT RADY
LDI @MATRIXAI,AR2
CALL FIND_YMATRIX
LDI AR4,R2
ADDI OMATRIX,R2
LDI R2,R3
CALL CONCATMAT
*GET CAMERA ORIENTATION MATRIX
PLYRCAM:
*DO YOUR ZOOM JIVE
CALL ZOOMUP ;UPDATE YOUR ZOOM
LDI @CAMVIEW,R0
BNZ CAM3RD
*FIRST PERSON CAMERA
CAM1ST
****************************
CALL CAMMATSAV
****************************
LDI @CAMERAMATRIXI,AR2
NEGF *+AR5(CARYROT),R2 ;FOLLOW CAR ROTATION
LDP @_CAMERARAD+Y
STF R2,@_CAMERARAD+Y ;UPDATE CAMERA RAD
SETDP ;RESTORE DP TO ZERO PAGE
LDI AR4,R2
ADDI OMATRIX,R2
CALL CPYIMAT
LDF 0,R0
STF R0,*+AR5(CARROT) ;NO OVERROTATION IN CORNER
LDF *+AR5(CARXLEAN),R2 ;GET X LEAN FACTOR
MPYF -0.7,R2 ;NEGATE AND SCALE
LDP @_CAMERARAD+X
STF R2,@_CAMERARAD+X
SETDP
LDI @MATRIXBI,AR2
CALL FIND_XMATRIX
LDI AR2,AR0
LDI @MATRIXCI,AR1
PUSH AR1
LDF *+AR5(CARZLEAN),R2 ;GET Z LEAN FACTOR
MPYF -0.5,R2 ;NEGATE AND SCALE
LDI @MATRIXAI,AR2
CALL FIND_ZMATRIX
CALL CONCAT201 ;CONCAT YOUR MATRICES
POP R2 ;GET MATRIXC POINTER
LDI @CAMERAMATRIXI,AR2 ;GET SOURCE MATRIX
LDI AR2,R3
CALL CONCATMAT
****************************
CALL CAMMATAVG
*************************
BR CAM3RDX
;
;THIRD PERSON CAMERA
;
CAM3RD
CLRF R2
LDP @_CAMERARAD+X
STF R2,@_CAMERARAD+X
SETDP
ABSF *+AR4(OVELX),R0 ;DONT CHANGE CAMERA DIR FOR SMALL VEL
ABSF *+AR4(OVELZ),R1
ADDF R0,R1
CMPF 2,R1
BLT CAM3RD0
LDI *+AR5(CAR_SPIN),R0 ;SPINNING?
BNZ CAM3RD0 ;YES, DONT mess WITH CAMERA ANGLE
LDF *+AR4(OVELX),R3
LDF *+AR4(OVELZ),R2
CALL ARCTANF
*MAX CAMERA ANGLE CHANGE
LDP @_CAMERARAD+Y
SUBF @_CAMERARAD+Y,R0 ;GET OLD CAMERA
LDF 0,R1 ;NORMALIZE DIFFERENCE
CMPF 3.14,R0
LDFGT -6.28,R1
CMPF -3.14,R0
LDFLT 6.28,R1
ADDF R1,R0
MPYF 0.20,R0 ;ANGLE SMOOTHING
ADDF @_CAMERARAD+Y,R0
SETDP
CALL CAMCHK ;CHECK OUT NEW VALUE
BZ CAMOK ;ITS O.K...
*WE'RE OFF
LDF R0,R4 ;SAVE NEW VALUE
CALL CAMROT ;GET ADJUSTED ANGLE VALUE
LDF R0,R5 ;SAVE NEW ADJUSTED VALUE
LDP @_CAMERARAD+Y,R6 ;GET OLD VALUE
LDF @_CAMERARAD+Y,R6 ;GET OLD VALUE
SETDP
SUBF R6,R5,R2
CALL NORMITS
ABSF R2,R3
SUBF R4,R5,R2
CALL NORMITS
ABSF R2
CMPF R2,R3
BLT CAMBAD1
LDF R5,R0 ;NEW ONE IS CLOSER, GO WITH CORRECTION
B CAMOK
CAMBAD1
CAM3RD0
LDP @_CAMERARAD+Y
LDF @_CAMERARAD+Y,R0 ;UPDATE CAMERA RAD
SETDP
CALL CAMCHK ;CHECK IF OLDIE IS ON...
BZ CAMOK ;YES... KEEP IT
CALL CAMROT ;NO...GET CORRECTION
CAMOK
LDP @_CAMERARAD+Y
STF R0,@_CAMERARAD+Y ;UPDATE CAMERA RAD
SETDP
LDI @CAMERAMATRIXI,AR2 ;GET SOURCE MATRIX
LDF R0,R2
CALL FIND_YMATRIX ;LOAD CAMERA MATRIX
CALL GETCARROT ;GET CAR OVERROTATE
NEGF R1,R2
LDI @MATRIXAI,AR2
CALL FIND_YMATRIX ;GET CARROT MATRIX
LDI AR4,R2 ;MULT INTO OBJ MATRIX
ADDI OMATRIX,R2
LDI R2,R3
CALL CONCATMAT
CAM3RDX
;
;GET NEW CAMERA POSITION
;GET NEW CAMERA OFFSET FROM CAR
;
LDI @CAMERAMATRIXI,AR2 ;GET SOURCE MATRIX
NEGF @ZOOMD,R2 ;GET ZOOM DISTANCE
LDI @VECTORAI,R3
LDI R3,AR3
CALL FORWARD
;
;ADD IT IN TO CAMERAPOS
;
LDF *+AR4(OPOSX),R0
SUBF *AR3,R0 ;INVERT X FOR SOME REASON
LDI @CAMERAPOSI,AR0
STF R0,*AR0 ;X COORD
LDF 0,R0 ;ADJUST WRECK HEIGHT
LDI @WRECKFLG,R1
LDFNZ *+AR5(CT_PRDYD),R0
MPYF 0.6,R0
ADDF @ZOOMH,R0
; LDF @ZOOMH,R0
ADDF *+AR4(OPOSY),R0
ADDF *+AR3(1),R0
STF R0,*+AR0(1) ;Y COORD
LDF *+AR4(OPOSZ),R0
ADDF *+AR3(2),R0
STF R0,*+AR0(2) ;Z COORD
LDI @CAMVIEW,R0
BZ PLYS1
CALL CAMYADJ ;YES, ADJUST CAMERA Y ABOVE ROAD
PLYS1
CALL GETREV ;GET YOUR RPM'S, MAKE SOUND
CALL PLYR_SNDS ;HANDLE SOME PLYR SOUNDS
CALL PLMOTION
CALL PLYRWHL
CALL PLYR_RIDE_RIGHT ;FIND DISTANCE TO CENTER OF ROAD
STF R0,*+AR5(CARDIST2CNTR)
PLYSLP
LDI @HEAD2HEAD_ON,R0
BZ NOPLINK
LDI *+AR5(CARTRAK),AR0
LDI *+AR0(OUSR1),R0 ;read road ID
STI R0,*+AR5(CARTRACK_ID) ;SAVE TRACK ID
CALL SEND_PLAYERS_POS
CALL CHEATCK
NOPLINK
SLEEP 1
B PLYRLP
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*MIDWAY CHEAT IS HERE!!!!!!!!!!!!
*MAY NEED MAX CHEAT WITH DISTANCE IN FUTURE
CHEATCK
.GLOBL COMPTRAK
FLOAT @NFRAMES,R2
CALL COMPTRAK
LDFZ 1.0,R2 ;NO CHEAT WERE THE SAME
BZ CCKX ;WERE THE SAME, NO CHANGE
LDIGT 0,R3 ;WERE AHEAD
LDFGT @AHEAD,R1 ;WERE AHEAD
LDILE 1,R3 ;WERE BEHIND
LDFLE @CATCHUP,R1 ;WERE BEHIND
MPYF R2,R1
ADDF @CHEAT,R1
*LIMIT ADVANTAGE AT CLOSE DISTANCE
LDI @PLY2CAR,AR0
LDF *+AR0(OPOSZ),R2
SUBF *+AR4(OPOSZ),R2
SUBF *+AR0(OPOSX),*+AR4(OPOSX),R3
MPYF R2,R2
MPYF R3,R3
ADDF R3,R2
CALL SQRT
MPYF @DISTCON,R0
CMPF 0.10,R0
LDFGT 0.10,R0
ADDF 1.0,R0
CMPI 1,R3 ;BEHIND?
BNE CCK1 ;NO MINIMUM CATCHUP
CMPF R0,R1
LDFLT R0,R1 ;MINIMUM VALUE
CCK1
*JARV CHANGE February 7,1995
; ADDF 0.10,R0 ;MAXIMUM VALUE
ADDF 0.09,R0 ;MAXIMUM VALUE
*JARV END CHANGE
CMPF R0,R1
LDFGT R0,R1
CMPF 1.0,R1
LDFLT 1.0,R1
STF R1,@CHEAT
FLOAT 300,R2
SUBF *+AR5(CARSPEED),R2
LDFLT 0,R2
MPYF @SPDCON,R2
SUBF 1.10,R0
MPYF 10,R0
MPYF R0,R2
ADDF 1.0,R2
CMPF 2.0,R2
LDFGT 2.0,R2
CALL COMPTRAK
LDFGE 1.0,R2
CCKX
STF R2,@CHEATACC
RETS
CATCHUP .FLOAT 0.0001
AHEAD .FLOAT -0.0008
DISTCON .FLOAT 0.000001
SPDCON .FLOAT 0.00333
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*CAMERA CHECK
*
*PARAMETERS
* R0 CAMERA ANGLE
* AR0 CAMERA POSITION XYZ POINTER
* AR4 PLAYER CAR
*RETURNS
* CARRY SET COLLIDE WITH ROAD
CAMCHKL:
FLOAT -170,R1 ;GET LEFT CORNER DIST
B CAMCHK0
CAMCHKR:
FLOAT 170,R1 ;GET RIGHT CORNER DIST
CAMCHK0:
PUSHF R0
PUSH R3
PUSH AR0
PUSH AR4
LDI AR0,AR4
*CHECK RIGHT CORNER
*ADJUST CAMERA X,Z
LDI @VECTORAI,AR0 ;GET TEMP VECTOR, CORNER COORD STORE
LDF R0,R2 ;GET CAMERA ANGLE
CALL _SINE
NEGF R0,R3
CALL _COSI
MPYF R1,R0
MPYF R1,R3
ADDF *+AR4(0),R0 ;GET X,Y,Z COORDS
STF R0,*AR0
LDF *+AR4(1),R0
STF R0,*+AR0(1)
ADDF *+AR4(2),R3
STF R3,*+AR0(2)
LDI AR0,AR4 ;POINT TO XYZ OF CAMERA
CALL CAMSCAN
CAMCHKRX
POP AR4
POP AR0
POP R3
POPF R0
RETS
*----------------------------------------------------------------------------
*CAMCHKLR
*PARAMETERS
* AR0 CAMERA POSITION XYZ POINTER
* AR4 PLAYER CAR
*RETURNS
* R3=0 CAMERA O.K.,
* R0=1 LEFT OFF,
* R0=2 RIGHT OFF,
* R0=3 BOTH OFF
*RETURNS
* Z=1 CAMERA O.K.
CAMCHKLR:
CALL CAMCHKL
LDINC 1,R3
LDIC 0,R3
CALL CAMCHKR
LDINC 2,R1
LDIC 0,R1
ADDI R1,R3
RETS
*----------------------------------------------------------------------------
*CAMERA CHECKER
*PARAMETERS
* R0 ANGLE
* AR4 PLAYER CAR
* AR5 CAR BLOCK
*RETURNS
* R3=0 CAMERA O.K.
* R0=1 LEFT OFF,
* R0=2 RIGHT OFF,
* R0=3 BOTH OFF
*RETURNS
* Z=1 CAMERA O.K.
CAMCHK:
PUSH AR0
CALL GETCAMPOS
LDI AR3,AR0
CALL CAMCHKLR
POP AR0
RETS
*----------------------------------------------------------------------------
*CAMERA ROTATER
*PARAMETERS
* R0 CURRENT ANGLE
* AR4 PLAYER CAR
* AR5 CAR BLOCK
*RETURNS
* R0 ADJUSTED ANGLE
CAMROT: PUSH AR0
PUSH AR2
LDF R0,R3
CALL ROADIR ;R0=ROADIR
ADDF R0,R3,R2
CALL NORMITS ;FIND DIRECTION
ABSF R2,R1 ;STOP OSCILLATION AROUND
CMPF 0.1,R1
BGT CAMROT1
NEGF R2,R1
B CAMROT2
CAMROT1
LDF R2,R2
LDFN 0.1,R1
LDFNN -0.1,R1
CAMROT2
ADDF R1,R3,R0 ;RETURN R0=ADJUSTED ANGLE
POP AR2
POP AR0
RETS
*----------------------------------------------------------------------------
*GET NEW CAMERA POSITION
*PARAMETERS
* R0 CAMERARAD
* AR4 PLAYER CAR
*RETURNS
* AR3=VECTORA=CAMERAPOS X,Y,Z
GETCAMPOS:
PUSHF R0
PUSH AR2
LDI @MATRIXAI,AR2 ;GET SOURCE MATRIX
LDF R0,R2
CALL FIND_YMATRIX ;LOAD CAMERA MATRIX
NEGF @ZOOMD,R2 ;GET ZOOM DISTANCE
LDI @VECTORAI,R3
LDI R3,AR3
CALL FORWARD
LDF *+AR4(OPOSX),R0 ;ADD IN PLAYER CAR POSITION
SUBF *AR3,R0 ;INVERT X FOR SOME REASON
STF R0,*AR3 ;X COORD
LDF @ZOOMH,R0
ADDF *+AR4(OPOSY),R0
ADDF *+AR3(1),R0
STF R0,*+AR3(1) ;Y COORD
LDF *+AR4(OPOSZ),R0
ADDF *+AR3(2),R0
STF R0,*+AR3(2) ;Z COORD
POP AR2
POPF R0
RETS
*----------------------------------------------------------------------------
*CAMERA ADJUST - KEEP IT OUT OF THE GROUND AND BUILDINGS
*PARAMETERS
* AR0 CAMERA POSITION XYZ POINTER
* AR4 PLAYER CAR
CAMYADJ:
*ADJUST CAMERA Y
PUSH AR4
LDI AR0,AR4 ;POINT TO XYZ OF CAMERA
CALL CAMSCAN
LDI AR4,AR0
POP AR4
BNC CAM1XX ;NO COLLISION, SKIP IT...
FLOAT 133,R1
SUBF R0,R1
BLE CAM1XX
FLOAT 500,R0 ;OVERPASS BYPASS
CMPF R0,R1
BGT CAM1XX
NEGF R1
ADDF *+AR0(1),R1
STF R1,*+AR0(1) ;CAMERA Y COORD
CAM1XX
RETS
*----------------------------------------------------------------------------
*PUT PLAYER ON ROAD
*PARAMETERS
* AR4 PLAYER OBJECT
* AR5 PLAYER CAR
PLYONRD:
LDF 0,R0
STF R0,*+AR5(CARSPRAD)
STF R0,*+AR5(CARDROT)
LDI 0,R0
STI R0,*+AR5(CAR_SPIN) ;RESET SPIN FLAG
STPI R0,@WRECKFLG ;WRECK OFF
LDI AR4,AR0 ;GET MATRIX BACK TO NORMAL
ADDI OMATRIX,AR0
CALL INITMAT
CALL GETTRAK ;GET CLOSEST TRACK SEGMENT
LDF *+AR0(OPOSX),R0 ;NEW POSITION
STF R0,*+AR4(OPOSX)
LDF *+AR0(OPOSZ),R0
STF R0,*+AR4(OPOSZ)
LDF *+AR0(OPOSY),R0
STF R0,*+AR4(OPOSY)
CALL ROADIR ;GET DIRECTION IN R0
STF R0,*+AR5(CARYROT)
STF R0,*+AR5(CARVROT)
LDF R0,R2
NEGF R0
LDP @_CAMERARAD+Y
STF R0,@_CAMERARAD+Y ;UPDATE CAMERA YRAD
SETDP
CALL _SINE
LDF R0,R3
CALL _COSI
FLOAT 722,R1 ;GET LANE DIST
MPYF R1,R0
MPYF R1,R3
ADDF *+AR4(OPOSX),R0
STF R0,*+AR4(OPOSX)
ADDF *+AR4(OPOSZ),R3
STF R3,*+AR4(OPOSZ)
RETS
*----------------------------------------------------------------------------
*DRONE LOOP
*PARAMETERS
* R2 CURRENT STEERING DELTA ANGLE
* AR4 CAR OBJECT
* AR5 CAR DATA BLOCK
* CARBLK STUFF TO LOAD
* CARTURN ;ANGLE OF FRONT WHEELS (FLOAT)
* CARTRACTION ;TRACTION COEFFICIENT OF TIRES (FLOAT)
* CARMAXACCEL ;MAXIMUM ACCEL (PIX/16 MSEC) (FLOAT)
* CARTHROTTLE ;THROTTLE VALUE 0-1.0 (FLOAT)
* CARBRAKE ;BRAKING FRICTION (0-1.0) (FLOAT)
*
DRONEGO:
PUSHF R2
CALL GETAUTO ;GET AUTO TRANS VALUE
STI R0,*+AR5(CARGEAR) ;DO THE GEAR
; LDF 1.0,R0
; STF R0,@DRAFTVAL ;NO DRAFTING FOR DRONES...
CALL GETSPD
CALL GETSKID
CALL GETRPM ;GET YOUR REVS
*GET CAR DIRECTION DELTA RADIANS
POPF R0 ;GET STEERIN ANGLE
CALL GETDIR
PUSHF R0
CALL DRONINBZ
POPF R2
*GET INCREMENTAL ROTATION MATRIX
LDI @MATRIXAI,AR2
CALL FIND_YMATRIX
*FORM NEW ROTATION MATRIX
LDI AR4,R2
ADDI OMATRIX,R2
LDI R2,R3
CALL CONCATMAT
*FORM NEW VELOCITY MATRIX
LDF *+AR5(CARVROT),R2 ;GET VELOCITY MATRIX
SUBF *+AR5(CARYROT),R2
LDI @MATRIXBI,AR2
CALL FIND_YMATRIX
LDI AR4,R2
ADDI OMATRIX,R2
LDI AR2,R3
CALL CONCATMAT
LDF *+AR5(CARDIST),R2 ;GET DISTANCE
LDI @MATRIXBI,AR2
LDI *+AR5(CAR_AIRB),R0
BNZ DAIRB ;WERE FLYING
*MOVE CAR FORWARD
LDI AR4,R3
ADDI OVELX,R3
CALL FORWARD
DAIRB
CALL OVELADD
*GET ROAD MATRIX
DRONESTOP:
LDI *+AR4(OCARBLK),R3 ;GET CAR DATA AREA
CALL CAR_ROAD_COLL
*GET CAR MATRIX
LDF *+AR5(CARYROT),R2
STF R2,*+AR4(ORADY) ;STORE CAR OBJECT RADY
LDI @MATRIXAI,AR2
CALL FIND_YMATRIX
*FORM NEW ROTATION MATRIX FOR CAR
LDI AR4,R2
ADDI OMATRIX,R2
LDI R2,R3
CALL CONCATMAT
CALL DRONE_RIDE_RIGHT ;GET DISTANCE TO CENTER OF LANE
STF R0,*+AR5(CARDIST2CNTR)
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*GEAR RATIO TABLE
GEARTABI .word GEARTAB
GEARTAB .float 0.0,0.60,0.35,0.21,0.15
.BSS ENGVOL,1
*----------------------------------------------------------------------------
*GET REV FOR PLAYER CAR
*PARAMETERS
* AR4 PLAYER CAR OBJECT
* AR5 PLAYER CAR STRUCTURE
GETREV:
LDI @_MODE,R1 ;ON STARTING LINE?
TSTB MGO,R1
BZ REV0 ;YES, NEUTRAL GEAR
LDI *+AR5(CARGEAR),R0
BZ REV0 ;NEUTRAL GEAR
LDI *+AR5(CAR_AIRB),R0 ;IN AIR?
BZ REV1 ;NO... REGULAR REV STUFF
*FREE REV NEUTRAL CASE
REV0
CALL GETPEDAL ;GET PEDAL 0-1
MPYF NUM_RPM,R0
LDF *+AR5(CARRPM),R1
FLOATP @NFRAMES,R3
MPYF 2,R3
ADDF R3,R1
LDF R1,R2 ;MAX SLEW RATE LIMIT
MPYF 2,R3
SUBF R3,R1 ;MIN SLEW RATE LIMIT
CMPF R2,R0
LDFGT R2,R0
CMPF R1,R0
LDFLT R1,R0
B REV3
*REGULAR IN GEAR CASE
REV1
LDI @GEARTABI,AR0
ADDI *+AR5(CARGEAR),AR0
LDF *+AR5(CARSPEED),R0 ;GET SPEED
MPYF *AR0,R0 ;MULTIPLY BY GEAR RATIO
REV3
FIX *+AR5(CARRPM),R1
STF R0,*+AR5(CARRPM)
FIX R0,AR0
*R1=OLD REV
*AR0=NEW REV
*GET ENGINE VOLUME
*THROTTLE FACTOR
LDF *+AR5(CARTHROTTLE),R0
MPYF 0.8,R0
ADDF 0.2,R0
*SPEED FACTOR
LDF *+AR5(CARSPEED),R2
MPYF 0.01,R2
MPYF 0.333,R2
SUBRF 1.0,R2
MPYF 0.75,R2
ADDF 0.25,R2
CMPF 1.0,R2
LDFGT 1.0,R2
CMPF 0,R2
LDFLT 0,R2
MPYF R2,R0
FLOAT 225,R2
MPYF R2,R0
*REV FACTOR
LDF *+AR5(CARRPM),R2
MPYF 0.02,R2
MPYF 0.5,R2
ADDF 0.5,R2
MPYF R2,R0
FIX R0 ;NEW ENGINE VOLUME
*CHECK FOR CHANGE IN REV OR VOLUME
CMPI R1,AR0 ;NEW REV?
BNE REV4 ;NO...
LDI @ENGVOL,R1 ;NEW ENGINE VOLUME ?
SUBI R0,R1
ABSI R1
CMPI 4,R1
RETSLT ;NO... QUIT
REV4
LDI R0,R1
STI R0,@ENGVOL ;STORE NEW VOLUME
CMPI 0,AR0
LDILT 0,AR0
MPYI 5,AR0
LDI AR0,R0 ;SPEED (OF OSCILLATION)
CMPI 253,R0
LDIGT 253,R0
LDI @_MODE,R2
AND MSLINE,R2
BZ REV5
LSH -4,R1 ;CUT VOLUME ON START LINE
REV5
B PLYR_ENGINE ;GO DO IT...
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*GETRPM FOR DRONE CAR
*PARAMETERS
* AR4 CAR OBJECT
* AR5 CAR STRUCTURE
GETRPM:
LDI @GEARTABI,AR0
ADDI *+AR5(CARGEAR),AR0
LDF *+AR5(CARSPEED),R0 ;GET SPEED
MPYF *AR0,R0 ;MULTIPLY BY GEAR RATIO
CMPF NUM_RPM,R0 ;LIMIT TO RANGE
LDFGT NUM_RPM,R0
CMPI 0,R0
LDILT 0,R0
STF R0,*+AR5(CARRPM)
RETS
*----------------------------------------------------------------------------
*GET SKID FACTOR
*PARAMETERS
* AR4 CAR
* AR5 CAR BLOCK
*RETURNS
* R0 SKID FACTOR
* 0=NOSKID, 1.0=FULL SKID
GETSKID:
*CHECK SPIN OUT
LDI *+AR5(CAR_SPIN),R0 ;FULL SKID ON SPIN-OUT
BEQ GETSK00
LDF 1.00,R0
B GETSKXX
*CHECK OVERREV
GETSK00
LDI *+AR5(CARGEAR),R0 ;HI GEAR?
CMPI 4,R0
BZ GETSK0 ;YES, NO OVERREV...
LDF *+AR5(CARRPM),R0
CMPF OVERREV,R0 ;OVERREV:
BLT GETSK0
LDF 0.80,R0 ;YES DO A SKID
B GETSKXX
*GET STEERING-SPEED SKID
GETSK0
LDF *+AR5(CARYROT),R2
SUBF *+AR5(CARVROT),R2
CALL NORMITS
CMPF 1.2,R2 ;KEEP IN RANGE
LDFGT 1.2,R2
CMPF -1.2,R2
LDFLT -1.2,R2
LDF R2,R0
MPYF 0.2,R0 ;ADJUST IT DUDE
ADDF *+AR5(CARTURN),R0
ABSF R0
CMPF 0.3,R0
LDFGT 0.3,R0 ;MAX IT OUT
MPYF *+AR5(CARSPEED),R0
*GET LOW SPEED RIPOUT
LDF *+AR5(CARTHROTTLE),R1 ;FULL THROTTLE?
CMPF 0.90,R1
BLT GETSK1 ;NO
LDI *+AR5(CARGEAR),R1 ;FULL THROTTLE?
BZ GETSK1
CMPI 2,R1
BGT GETSK1 ;ONLY FIRST GEAR...
LDF *+AR5(CARSPEED),R1
; SUBF 65,R1
SUBF 100,R1
LDFGT 0,R1
ABSF R1
MPYF 1.1,R1
ADDF R1,R0
GETSK1
*GET BRAKE FACTOR
LDF *+AR5(CARBRAKE),R1
MPYF 1.0,R1
ADDF 1.0,R1
MPYF R1,R0 ;DOUBLE IT FOR BRAKE DUDE!!!
*GET THROTTLE FACTOR
LDF *+AR5(CARTHROTTLE),R1
MPYF 0.25,R1
ADDF 1.0,R1
MPYF R1,R0 ;25% BOOST FOR THROTTLE ON
SUBF 22,R0
; SUBF 15,R0
LDFLT 0,R0 ;NO SKID
; MPYF 0.05,R0 ;DIVIDE BY 25
MPYF 0.045,R0 ;DIVIDE BY 25
GETSKX
CMPF 1.0,R0
LDFGT 1.0,R0
MPYF *+AR5(CARTRACTION),R0 ;GET TRACTION COEFF.
GETSKXX
STF R0,*+AR5(CARSKID) ;NEW SKID FACTOR
RETS
*----------------------------------------------------------------------------
*CHECK FOR OFFROAD TIMEOUT
*PARAMETERS
* AR5 PLAYER CAR STRUCTURE
*RETURNS
* R0 RETURNED WITH OFFROAD TIMER
CKOFRD:
LDI AR5,AR3 ;CHECK FOR ALL WHEELS OFF
ADDI CARPCOL,AR3
LDI 0,R3
LDI @OFFROAD_TMR,R0
LDI 4,RC
RPTB OFFRLP
LDI *AR3++(CARVSIZ),AR0 ;GET ROAD OBJECT INTERSECTING
LDI *+AR0(OID),R1 ;CHECK OID
AND CLASS_M+TYPE_M,R1
CMPI ROAD_C,R1
BZ NOTOFF
AND CLASS_M,R1
CMPI ROAD_C,R1
LDIZ 1,R3
CMPI GROUND_C,R1
OFFRLP LDIZ 1,R3
LDI R3,R3 ;ANY GROUND?
BNE NOTOFFX ;YES
CMPI 8,R0
LDILE 0,R0 ;RESET HIM ON 8 IF NO GROUND
B NOTOFFX
NOTOFF
LDI 20,R0
STI R0,@OFFROAD_TMR ;ALL WHEELS OFFROAD FLAG
NOTOFFX
RETS
*----------------------------------------------------------------------------
*GETDIR-->GET CAR DIRECTION
*PARAMETERS
* R0 NEW STEERING DELTA
* AR4 CAR OBJECT
* AR5 CAR BLOCK POINTER
*RETURNS
* R0 NET STEERING CHANGE
* CARYROT,CARVROT,CARDROT SET
*CLOBBERED
* R1,R2,R3,R4,R5
GETDIR:
LDI *+AR5(CAR_AIRF),R1
BZ GETDIR1
LDF 0,R0 ;NO STEERING IN AIR
LDF *+AR5(CARDROT),R1
ADDF *+AR5(CARYROT),R1
B GETDIR2
GETDIR1
LDI *+AR5(CAR_SPIN),R1 ;CHECK SPINOUT...
BNZ CARSPIN
*GET SKID FACTOR
LDF *+AR5(CARSKID),R4 ;R4=SKID FACTOR
LDF 1.0,R5
SUBF R4,R5 ;R5=1-SKID FACTOR
MPYF 0.75,R5
ADDF 0.25,R5 ;ADJUST STEER BY .5-1.0 (.5=MAX SKID)
MPYF R5,R0 ;SKID ADJUSTED STEERING
*GET SLIDE DELTA ANGLE
LDF *+AR5(CARVROT),R3 ;VELOCITY ROTATION
LDF *+AR5(CARYROT),R1 ;BODY ROTATION
SUBF R3,R1,R2 ;ROTATIONAL DIFFERENCE
CALL NORMITS ;NORMALIZE DIFFERENCE
*GET RECOVERY FACTOR
MPYF 0.095,R2
NEGF R2,R5
MPYF 0.5,R5
ADDF R5,R1
*GET NEW CARVROT
ADDF R2,R3 ;ADD IN RECOVERY FACTOR
ADDF R0,R3 ;ADD IN STEERING FACTOR
STF R3,*+AR5(CARVROT) ;VELOCITY DIRECTION
*GET DELTA BODY MOMENTUM
MPYF *+AR5(CARDROT),R4 ;BODY DELTA MOMENTUM ON SKID
MPYF 0.7,R4
LDF *+AR5(CARTHROTTLE),R5
MPYF 0.5,R5
ADDF 0.5,R5
MPYF 1.2,R5
MPYF R5,R4 ;PUMP UP BODY SLIDE...
ADDF R4,R0
STF R0,*+AR5(CARDROT) ;BODY DELTA
ADDF R0,R1 ;ADD CARDROT TO CARYROT
GETDIR2
STF R1,*+AR5(CARYROT) ;BODY DIRECTION
RETS
*
*CAR SPINOUT
*
CARSPIN:
LDI @NFRAMES,AR3
SUBI 1,AR3 ;CUT DOWN COUNT
CMPI 2,R1 ;TIMED SPIN?
BLT SPINL0 ;NO...
*TIMED SPIN
SUBI 1,R1 ;DECREMENT TIME
SUBI AR3,R1
CMPI 2,R1
BLE SPINREC ;TIMES UP RECOVER
STI R1,*+AR5(CAR_SPIN)
LDF *+AR5(CARDROT),R1 ;ROTATE THE DUDE
ADDF *+AR5(CARYROT),R1
STF R1,*+AR5(CARYROT) ;BODY DIRECTION
B SPINLX
*ANGULAR SPIN
SPINL0
LDF *+AR5(CARDROT),R1 ;ROTATE THE DUDE
LDF *+AR5(CARYROT),R2 ;VELOCITY ROTATION
ADDF R1,R2,R3
STF R3,*+AR5(CARYROT) ;BODY DIRECTION
ABSF R1,R3
SUBRF *+AR5(CARSPRAD),R3 ;READY FOR RECOVERY?
STF R3,*+AR5(CARSPRAD)
BNN SPINL ;SPIN NOT OVER YET...
CALL ROADIR ;GET NEAREST TRACK PIECE ANGLE IN R0
*CHECK FOR DRONE
LDI *+AR4(OID),R1
AND CLASS_M+SUBTYPE_M,R1
CMPI DRONE_C+DRNE_RHO,R1
BNE REGSPIN
LDI *+AR4(OID),R1
AND TYPE_M,R1
CMPI DEAD_VEH_T,R1 ;CHECK FOR DEAD DRONE
BNE DRONESPIN ;NOT DEAD
LDF *+AR5(CARDROT),R0 ;DECAY SPIN FOR DEAD GUY...
MPYF 0.98,R0
ABSF R0,R1
CMPF 0.04,R1
LDFLT 0,R0
STF R0,*+AR5(CARDROT)
B SPINL
DRONESPIN
ADDF 3.14,R0 ;ADJUST FOR TRAFFIC GOING AGAINST ROAD
REGSPIN
LDF R0,R2
SUBF *+AR5(CARYROT),R2 ;VELOCITY ROTATION
CALL NORMITS ;NORMALIZE DIFFERENCE
ABSF R2
CMPF 0.2,R2 ;ROTATIONS CLOSE?
BLT SPINREC0 ;DO THE RECOVERY...
SPINL
DB AR3,SPINL0
SPINLX
LDF 0,R0 ;NO STEERING SPIN
RETS
*RECOVER FROM SPIN DUDE
SPINREC0
STF R0,*+AR5(CARYROT) ;LOAD ROAD DIRECTION
SPINREC
LDF *+AR5(CARYROT),R2
CALL NORMIT
STF R2,*+AR5(CARYROT) ;BODY DIRECTION
STF R2,*+AR5(CARVROT)
LDI 0,R2
STI R2,*+AR5(CAR_SPIN) ;CLEAR SPIN FLAG
LDF 0,R0
STF R0,*+AR5(CARSPRAD) ;CLEAR SPIN RADIANS
STF R0,*+AR5(CARDROT) ;BODY DELTA
RETS
*----------------------------------------------------------------------------
*GETCARROT- GET OVERROTATION
GETCARROT:
PUSH R3
LDF *+AR5(CARROT),R0 ;GET PREVIOUS VALUE
LDF *+AR5(CARTURN),R1
MPYF -0.5,R1 ;ADJUST VALUE
LDI *+AR5(CAR_AIRF),R2 ;NO CHANGE IF IN THE AIR
LDFNZ R0,R1
LDF *+AR5(CARDIST),R2 ;LIMIT ROTATION SLEW RATE BY SPEED
CMPF 10,R2
LDFGT 10,R2
MPYF 0.05,R2
MPYF 0.1,R2 ;SLEW RATE
SUBF R1,R0,R3
ABSF R3,R3
CMPF R2,R3 ;DONT CHANGE FOR SMALL VALUE
BLE GETC1
SUBF R1,R0,R3 ;LIMIT TO +-0.05
BN GETC0
NEGF R2
GETC0
ADDF R2,R0,R1
GETC1
LDI @WRECKFLG,R0
LDFNZ 0,R1 ;CLEAR CARROT ON WRECK
*EXPERIMENTAL CODE
; LDF 0,R1
******************
STF R1,*+AR5(CARROT)
POP R3
RETS
*----------------------------------------------------------------------------
*ENGINE ACCEL MULTIPLIER TABLE
*
GEARACTABI .word GEARACTAB
GEARACTAB
.float 0.0,1.7,1.5,1.4,1.2 ;POWER FACTOR GEAR(0-4)
ENGACTABI .word ENGACTAB
ENGACTAB
.float 1.20,1.20,0.50,0.60,0.70 ;0000,0300,0600,0900,1200
.float 0.80,0.90,1.00,1.00,1.00 ;1500,1800,2100,2400,2700
.float 1.00,1.00,1.00,1.00,0.90 ;3000,3300,3600,3900,4200
.float 0.80,0.40,0.20,0.00,0.00 ;4500,4800,5100,5400,5700
*ENGINE FRICTION
ENGFRI .word ENGFR
ENGFR .float 0.000,0.005,0.003,0.001,0.000 ;GEAR(0-4) ENGINE FRICTION
*----------------------------------------------------------------------------
*GET NEW CAR SPEED
*
*PARAMETERS
* AR4 CAR OBJECT
* AR5 CAR BLOCK
*
GETSPD:
LDI *+AR5(CAR_AIRB),R0
BZ GETSPD1 ;NO AIR DUDE...
*AIRBORNE CASE
FLOATP @NFRAMES,R0
MPYF 4,R0 ;GET GRAVITATIONAL ACCEL
ADDF *+AR4(OVELY),R0
STF R0,*+AR4(OVELY)
LDF 0,R0 ;SET ACCEL, FRICT TO ZERO
LDF 0,R3
BR GETSPD2
*CHECK SPIN OUT
GETSPD1
LDI *+AR5(CAR_SPIN),R0
BZ GETSPD10 ;NO SPINOUT...
LDF 0,R0 ;SET ACCEL TO ZERO
LDF @SPINFRICI,R3
BR GETSPD2
*GET ENGINE ACCEL
GETSPD10
LDF *+AR5(CARTHROTTLE),R0
MPYF *+AR5(CARMAXACCEL),R0
CMPI @PLYCAR,AR4 ;CHEAT ACCEL
LDFNZ 1.0,R1
LDFZ @CHEATACC,R1
MPYF R1,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
LDF 1.0,R2
LDI *+AR5(CARTRANS),R3
LDFZ 0.96,R2 ;4% POWER LOSS AUTOMATIC
MPYF R2,R1
*CUT ACCEL ON SKID
MPYF R1,R0
LDF *+AR5(CARSKID),R1 ;CUT DOWN ACCEL ON SKID
MPYF 0.25,R1 ;ONLY 25% CUT
SUBRF 1.0,R1
MPYF R1,R0 ;R0=ENGINE ACCEL
*GET GRAVITY ACCEL
LDF *+AR4(OMAT21),R1 ;ADD IN YOUR GRAVITY ACTION
LDF 2,R3 ;DEFAULT CONSTANT
LDI @_countdown,R2 ;TIMEOUT?
LDFZ 0,R3 ;YES, NO GRAVITY
LDI @_MODE,R2 ;ON START LINE?
TSTB MGO,R2
LDFZ 0,R3 ;YIP, NO GRAVITY
LDF *+AR5(CARBRAKE),R2 ;BRAKE ON?
CMPF 0.5,R2
LDFGT 0,R3 ;YES, NO GRAV
MPYF R3,R1 ;MULTIPLY BY CONSTANT
ADDF R1,R0
*GET TOTAL FRICTION
*GET ROAD FRICTION
LDI AR5,AR3
ADDI CARPCOL,AR3
LDF 0,R3
LDI 4,RC
RPTB FRICLP
LDI *AR3++(CARVSIZ),AR0 ;GET ROAD OBJECT INTERSECTING
LDI *+AR0(OID),R1 ;CHECK OID
AND CLASS_M+TYPE_M,R1
CMPI ROAD_C,R1
LDFZ *+AR5(CARRDFR),R2 ;GET ROAD FRICTION
LDFNZ *+AR5(CAROFRDFR),R2 ;GET OFF ROAD FRICTION
; MPYF @DRAFTVAL,R2 ;ADJUST FOR DRAFT
FRICLP ADDF R2,R3
MPYF 0.20,R3 ;TAKE AVERAGE BASED ON WHEELS OFF
*JARV CHANGE
CMPI @PLYCAR,AR4
BNE FRL1
LDF @CHEAT,R1
CMPF 1.09,R1
BLE FRL1
ADDF *+AR5(CARRDFR),R3 ;CUT DOWN OFF ROAD FRIC IF BEHIND
MPYF 0.5,R3
FRL1
*JARV ENDCHANGE
*GET SKID FRICTION
LDF *+AR5(CARSKID),R4 ;ADD IN SKID FACTOR
LDF @SKIDFRICI,R1
MPYF R1,R4,R5
LDF *+AR5(CARSPEED),R2 ;CUT SKID FRICTION FOR LOW SPEED BURNOUT
CMPF 100,R2
BGT FRIC0
LDF *+AR5(CARTHROTTLE),R2 ;FULL THROTTLE?
CMPF 0.90,R2
BLT FRIC0
LDI *+AR5(CARGEAR),R2
CMPI 2,R2
BLE FRIC1 ;LOW SPEED BURNOUT, NO FRICTION111
; BZ FRIC1 ;LOW SPEED BURNOUT, NO FRICTION111
FRIC0
ADDF R5,R3
*GET BRAKE FRICTION
FRIC1
LDF *+AR5(CARBRAKE),R5 ;ADD IN BRAKE FRICTION
MPYF @BRAKFRICI,R5
NEGF R4
ADDF 1.0,R4 ;BRAKE LOSES EFFECT IN SKID
MPYF R4,R5
LDF 1.0,R4 ;INCREASE BRAKE EFFECTIVENESS AT LO SPD
LDF *+AR5(CARSPEED),R1
CMPF 40,R1
LDFLT 1.5,R4
CMPF 20,R1
LDFLT 2.0,R4
MPYF R4,R5
ADDF R5,R3 ;TOTAL 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
LDI @NFRAMES,RC
CMPI 6,RC ;MAX IT OUT TO BE SAFE
LDIGT 6,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
CMPF 0.5,R5 ;MINIMUM SPEED
LDFLT 0,R5
CMPF 0,R1 ;NO NEGATIVE SPEED
LDFLT 0,R1
MPYF 1.5,R5 ;SPEEDFUDGE
STF R5,*+AR5(CARDIST) ;SAVE YOUR DISTANCE
STF R1,*+AR5(CARSPEED) ;NEW SPEED
RETS
*
*GET BRAKE PEDAL
*RETURNS R0=BRAKE VALUE 0-1 (FLOAT)
*
GETBRAKE:
FLOATP @_pot2,R0
NEGF @BRAKEMN,R1
ADDF R1,R0
CMPF 20,R0
LDFLT 0,R0
BLT BRAKEOFF
ADDF @BRAKEMX,R1 ;ALL DP RAM IN SAME PAGE
CALL DIV_F
CMPF 1.0,R0 ;KEEP IT IN RANGE
LDFGT 1.0,R0
CMPF 0,R0 ;KEEP IT IN RANGE
LDFLT 0,R0
MPYF R0,R0 ;SQUARE IT FOR NON-LINEAR FEEL
PUSHF R0 ;SAVE THE VALUE
LDI @BRAKEON,R0
BNZ GETBX ;BRAKE ALREADY ON
CALL _on_brake ;TURN ON FIRST TIME ONLY
LDI 1,R0
B GETBXX
BRAKEOFF
PUSHF R0 ;SAVE THE VALUE
LDI @BRAKEON,R0
BZ GETBX ;ALREADY OFF DUDES
CALL _off_brake
LDI 0,R0
GETBXX STI R0,@BRAKEON
GETBX
POPF R0
RETS
*----------------------------------------------------------------------------
HIREDI .word HIRED
HIRED RGB 255,0,0
RGB 230,0,0
RGB 215,0,0
RGB 200,0,0
OFFREDI .word OFFRED
OFFRED RGB 127,0,0
RGB 110,0,0
RGB 105,0,0
RGB 100,0,0
*
*TURN ON/OFF BRAKE LIGHTS
*
*PALSET- SETUP PALETTE TRANSFER
*AR2=SOURCE DATA ADDRESSS
*R2 =DEST PALETTE(B8-15), DEST COLOR(B0-7)
*R3 =COUNT
_off_brake:
PUSH AR0
PUSH AR2
PUSH R2
PUSH R3
LDI @BUTTON_STATUS,R2
ANDN BUT_TAILS,R2
STI R2,@BUTTON_STATUS
LDI @OFFREDI,AR2
PUSH AR2
BU L888
_on_brake:
PUSH AR0
PUSH AR2
PUSH R2
PUSH R3
LDI BUT_TAILS,R2
OR @BUTTON_STATUS,R2
STI R2,@BUTTON_STATUS
LDI @HIREDI,AR2
PUSH AR2
L888 LDI @CHOOSENCAR,AR0
MPYI VEHTAB_SIZE,AR0
ADDI @VEHICLE_TABLEI,AR0
LDI *+AR0(VEHTAB_TAILCNT),R3
BZ NO_COLORS
LDI *+AR0(VEHTAB_PAL),AR2
.if DEBUG
CMPI 0,AR2
BEQ $ ;table entry not filled
.endif
CALL PAL_FIND
ADDI 256,R0
SUBI R3,R0
LDI R0,R2
POP AR2
CALL PAL_SET
BRAK_X POP R3
POP R2
POP AR2
POP AR0
RETS
NO_COLORS
POP AR2
BU BRAK_X
*----------------------------------------------------------------------------
*GET GAS PEDAL
*RET R0=GAS PEDAL 0-1 FRACTION
GETPEDAL:
FLOATP @_pot1,R0
NEGF @PEDALMN,R1
ADDF R1,R0
CMPF 5,R0
LDFLT 0,R0 ;GET RID OF CREEP AND NEGATIVES
ADDF @PEDALMX,R1
CALL DIV_F
CMPF 1.0,R0 ;KEEP IT IN RANGE
LDFGT 1.0,R0
RETS
*GET GEAR SHIFT
*AR4=CAR OBJECT
*AR5=CAR STRUCTURE
*RETURNS:
*R0=GEAR SHIFT VALUE 0=neutral,1,2,3,4 (INT)
GETGEAR:
LDI *+AR5(CARTRANS),R0
BNZ GETMAN
LDI @SUSPEND_MODE,R0 ;SUSPEND MODE?
CMPI SM_HALT,R0
BNZ GETAUTO ;NO
LDI *+AR5(CARGEAR),R0 ;YES, DONT SWITCH AUTO TRANS
RETS
*MANUAL
GETMAN:
LDI 0,R0
LDI @SWITCHBUTS,R1
TSTB SW_4TH,R1
LDINZ 4,R0
TSTB SW_3RD,R1
LDINZ 3,R0
TSTB SW_2ND,R1
LDINZ 2,R0
TSTB SW_1ST,R1
LDINZ 1,R0
RETS
*AUTOMATIC
*AR4=CAR OBJECT
*AR5=CAR STRUCTURE
*RETURNS:
*R0=GEAR SHIFT VALUE 0=neutral,1,2,3,4 (INT)
GETAUTO:
LDI 0,R2
LDF *+AR5(CARTHROTTLE),R3 ;TORQUE SENSOR FOR DOWNSHIFT
CMPF 1.0,R3
LDFGT 1.0,R3
MPYF 11,R3
FIX R3
ADDI 12,R3
LDI *+AR5(CARGEAR),R0
FIX *+AR5(CARRPM),R1
CMPI R3,R1
LDILT -1,R2 ;DOWNSHIFT
ADDI 18,R3
CMPI R3,R1
LDIGT 1,R2 ;UPSHIFT
ADDI R2,R0
CMPI 1,R0
LDILT 1,R0
CMPI 4,R0
LDIGT 4,R0 ;MAX OUT AT 4TH
RETS
*----------------------------------------------------------------------------
STEERI .float -0.0013
*GET STEERING ANGLE
*AR5=CAR STRUCTURE
*RET R0= STEERING ANGLE
* SETS CARTURN VALUE
GETSTEER:
LDI ADJ_STEERING_SENSITIVITY,AR2 ;GET DIFFICULTY ADJUST
CALL ADJUSTMENT_READ ;R0 = 0-5 (int)
FLOAT R0,R4
FLOAT R0,R6
SUBRF 5,R4
MPYF 0.06,R4
ADDF 0.5,R4
LDF R4,R5
SUBRF 1.0,R5
FLOAT @_pot0,R0 ;GET POT VALUE
SUBF @STEERCT,R0 ;SUBTRACT CENTER VALUE
LDF @STEERFR,R1
MPYF 0.5,R1
CALL DIV_F
CMPF -1,R0 ;LIMIT CHECK
LDFLT -1,R0
CMPF 1,R0 ;LIMIT CHECK
LDFGT 1,R0
MPYF 0.02,R6 ;DESENSITIZE
ADDF 0.90,R6
MPYF R6,R0
ABSF R0,R1 ;SQUARE IT KEEPING SIGN
MPYF R0,R1
MPYF R4,R1 ;RATIO OF STEERING VALUE SQUARED
MPYF R5,R0 ;RATIO OF REGULAR
; MPYF 0.5,R1 ;AVERAGE WITH REGULAR
; MPYF 0.5,R0
ADDF R1,R0
LDF R0,R1
MPYF -0.3,R1 ;FUDGE FACTOR FOR WHEEL TURN ANGLE
STF R1,*+AR5(CARTURN) ;STORE WHEEL TURN VALUE
LDF *+AR5(CARSPEED),R1
LDF R1,R2
MPYF R1,R1
MPYF 0.0125,R1
CMPF 5,R1 ;LIMIT LO SPEED KICK
LDFGT 5,R1
MPYF 0.0625,R2 ;HIGH SPEED KICK
CMPF 15,R2
LDFGT 15,R2
ADDF R2,R1
MPYF R1,R0
FLOATP @NFRAMES,R1
MPYF R1,R0
MPYF @STEERI,R0
RETS
*
*VIEW SWITCHES
*ZOOM TO FIRST PERSON
*
_VIEW0:
FLOAT PLYPOS1Z,R4 ;Z DIST
FLOAT PLYPOS1Y,R5 ;Y DIST
LDI 0,R2 ;CAMVIEW STATUS
LDI BUT_VIEW1,R3
B ZOOM
_VIEW1:
FLOAT PLYPOS2Z,R4 ;Z DIST
FLOAT PLYPOS2Y,R5 ;Y DIST
LDI 1,R2 ;CAMVIEW STATUS
LDI BUT_VIEW2,R3
B ZOOM
_VIEW2:
FLOAT PLYPOS3Z,R4 ;Z DIST
FLOAT PLYPOS3Y,R5 ;Y DIST
LDI 2,R2 ;CAMVIEW STATUS
LDI BUT_VIEW3,R3
*R2=VIEW (0-2)INT
*R3=BUTTON LITE MASK
*R4=PLYPOSZ FL
*R5=PLYPOSY FL
ZOOM:
LDI @_MODE,R0
AND MMODE,R0
CMPI MGAME,R0
BNE SUICIDE ;DIE IF NOT IN GAME MODE
CMPI @CAMVIEW,R2
BEQ SUICIDE ;DIE IF SAME MODE
LDILT VIEW2IN,AR2
LDIGE VIEW2OUT,AR2
CALL ONESNDFX
LDI @BUTTON_STATUS,R0 ;LITE YOUR LITE
ANDN BUT_VIEWS,R0
OR R3,R0
STI R0,@BUTTON_STATUS
STF R4,@ZOOMDG ;STORE GOAL X
STF R5,@ZOOMHG ;STORE GOAL Y
SUBF @ZOOMD,R4
MPYF ZOOMRATIO,R4
SUBF @ZOOMH,R5
MPYF ZOOMRATIO,R5
LDF 1,R0
ABSF R4,R6
CMPF 25,R6 ;PUMP UP FOR LOW ZOOM RATE
LDFLT 4,R0
MPYF R0,R4
MPYF R0,R5
STF R4,@ZOOMDD
STF R5,@ZOOMHD
LDI @CAMVIEW,R3 ;CHANGE FROM FIRST PERSON ?
STI R2,@CAMVIEW ;SAVE NEW CAMERA VIEW
BNZ ZOOMX ;NO...
LDI @PLYCAR,AR2
LDI *+AR2(OFLAGS),R0 ;CHECK IF ALREADY ON LIST
TSTB O_LIST_M,R0
CALLZ OBJ_INSERT ;INSERT PLAYER OBJECT
ZOOMX
CALL ZOOMUP
BR SUICIDE ;CAN IT DUDES
*----------------------------------------------------------------------------
*UPDATE YOUR ZOOM JIVE
ZOOMUP:
LDF @ZOOMDD,R2
BZ ZOOMUPX ;NO ACTIVE ZOOM, SKIP IT
BND ZOOMUP1
LDF @ZOOMH,R1
ADDF @ZOOMHD,R1
ADDF @ZOOMD,R2
;------->BND ZOOMUP1
CMPF @ZOOMDG,R2
BGE ZOOMDN ;DONE WITH ZOOM
B ZOOMUP3
ZOOMUP1
CMPF @ZOOMDG,R2
BGT ZOOMUP3 ;NOT DONE WITH ZOOM
ZOOMDN LDI @CAMVIEW,R0 ;FIRST PERSON DONE?
BNZ ZOOMDN1 ;NO..
LDI @PLYCAR,AR2
CALL OBJ_PULL ;CAN THE CAR
ZOOMDN1 LDF 0,R0
STF R0,@ZOOMDD ;CLEAR OUT VELOCITIES
STF R0,@ZOOMHD
LDF @ZOOMDG,R2
LDF @ZOOMHG,R1
ZOOMUP3 STF R1,@ZOOMH ;UPDATE POSITION
STF R2,@ZOOMD
ZOOMUPX RETS
*----------------------------------------------------------------------------
*GETTRAK GET NEAREST TRACK SECTION
*PARAMETERS
* AR4 OBJECT
* AR5 STRUCTURE
*RETURNS
* AR0 TRACK SEGMENT STORED IN AR5(CARTRAK)
*CLOBBERS
* AR2,R0,R3,R4
GETTRAK:
LDI 0,AR0 ;CLOSEST ROAD SEGMENT INDEX
LDI @DYNALIST_BEGIN,R0
BZ GETRKX ;NULL LIST DUDES
PUSH IR0
LDI OPOSZ,IR0
FLOAT 7FFFH,R2 ;INITIAL CLOSEST DISTANCE
MPYF R2,R2
LDF *+AR4(OPOSX),R3
LDF *+AR4(OPOSZ),R4
LDI R0,AR2
GETRK
SUBF *+AR2(OPOSX),R3,R0
MPYF R0,R0
SUBF *+AR2(IR0),R4,R1
MPYF R1,R1
ADDF R0,R1
CMPF R1,R2
LDIGT AR2,AR0
LDFGT R1,R2
GETRKL
LDI *+AR2(OLINK4),R0
BNZD GETRK
LDI R0,AR2
NOP
NOP
;----> BNZ GETRK
STI AR0,*+AR5(CARTRAK) ;SAVE TRACK SECTION
POP IR0
GETRKX
RETS
*----------------------------------------------------------------------------
*CHECK IF DRIVING BACKWARDS
*PARAMETERS
* AR4 CAR
* AR5 CAR STRUCTURE
BACKCK
LDI *+AR5(CAR_SPIN),R0
BNE BACKCKX
LDF *+AR5(CARSPEED),R4 ;MUST BE MOVING SOMEWHAT
CMPF 2,R4
BLT BACKCKX
CALL ROADIR ;GET DIRECTIONAL DIFFERENCE
LDF *+AR5(CARVROT),R1
SUBF R1,R0,R2
CALL NORMITS
ABSF R2,R3 ;VELOCITY BACKWARDS?
CMPF 1.75,R3
BLT BACKCKX ;NO...
BACKCK1
LDF 1.0,R0 ;SET RADIAN SPIN COUNT
STF R0,*+AR5(CARSPRAD)
LDF 0.12,R0 ;ROTATE AROUND
LDF R2,R2
LDFN -0.12,R0
LDI 1,R1
BACKCK2
STF R0,*+AR5(CARDROT) ;SPIN HIM BACK
STI R1,*+AR5(CAR_SPIN)
BACKCKX
RETS
*----------------------------------------------------------------------------
*CHECK OUT OF BOUNDS
*PARAMETERS
* AR4 CAR
* AR5 CAR DATA BLOCK
*RETURNS
* CS IF ANY WHEEL OUT OF BOUNDS
* NC IN BOUNDS
*R0 0 = ONROAD
* NE= OFFROAD
*TRASHES R0,R1,RC
CKBND:
PUSH AR3
PUSH AR0
LDI CARVNUM-2,RC ;CHECK ALL WHEELS
LDI AR5,AR3
ADDI CARPCOL+CARVSIZ,AR3
LDI 0,R1
RPTB CURBCKL
LDI *AR3++(CARVSIZ),R0 ;GET ROAD OBJECT INTERSECTING
BZ CURBCKX ;WE GOT NOTHING, COLLIDE 'EM
LDI R0,AR0
LDI *+AR0(OID),R0 ;CHECK OID
AND CLASS_M,R0
CMPI ROAD_C,R0 ;ROAD/SHOULDER TYPE?
CURBCKL LDINZ 1,R1
CLRC
POP AR0
POP AR3
LDI R1,R1
RETS
CURBCKX
SETC
POP AR0
POP AR3
RETS
*----------------------------------------------------------------------------
*CHECK CRAWL UP TUNNEL WALLS
*PARAMETERS
* AR4 CAR OBJECT
* AR5 CAR BLOCK
TUNCHK:
LDI @_MODE,R0 ;IN TUNNEL?
TSTB MINTUNNEL,R0
RETSZ ;NO, EXIT
LDI @WRECKFLG,R0 ;WRECK ON?
RETSNZ ;NO, EXIT
LDF *+AR4(OMAT11),R0 ;PLAYER TOO STEEP?
CMPF 0.50,R0
RETSGT ;NO...
CALL GETNXTRDIR ;YES, SPIN HIM TO CENTER
LDF R0,R2
CALL ROADIR
ADDF R0,R2
MPYF 0.5,R2
CALL NORMITS
STF R2,*+AR5(CARVROT)
CALL ROADIR
SUBF *+AR5(CARYROT),R0
LDF R0,R2
CALL NORMITS
LDF R2,R0
LDF 15,R1
CALL DIV_F
STF R0,*+AR5(CARDROT) ;ROTATE TOWARD ROAD SLOWLY
LDI 15,R0
STI R0,*+AR5(CAR_SPIN)
LDF 0,R0
STF R0,*+AR5(CARSPRAD)
LDF *+AR5(CARSPEED),R0
CMPF 40,R0
LDFLT 40,R0
STF R0,*+AR5(CARSPEED)
TUNCHKX
RETS
*----------------------------------------------------------------------------
*CHECK CURB COLLISION
*KEEP ON ROAD
*PARAMETERS
* AR4 CAR
* AR5 CAR DATA BLOCK
INBOUNDZ:
LDI @_MODE,R1 ;WAITING FOR START?
TSTB MGO,R1
BZ CURBCLX ;YES, EXIT
CALL TUNCHK ;KEEP DUDE OFF TUNNEL WALLS
CALL CKBND
BC CURBCOL0 ;OUT OF BOUNDS
BNE SOFTCURB ;SOFT REPELL OFFROAD
CURBCKLX
RETS
*----------------------------------------------------------------------------
*KEEP DRONE INBOUNDS
*PARAMETERS
* AR4 CAR
* AR5 CAR DATA BLOCK
DRONINBZ:
LDI *+AR4(ODIST),R0
ASH -1,R0
CMPI 32000,R0 ;IS DUDE CLOSE?
BGT DRONINBX ;NO, FORGET IT
LDI @_MODE,R1 ;WAITING FOR START?
TSTB MGO,R1
BZ DRONINBX ;YES, EXIT
CALL CKBND
BC CURBCOL0 ;OUT OF BOUNDS
DRONINBX
RETS
*----------------------------------------------------------------------------
*WE HIT A CURB DUDES
*HARD WALL REFLECT SPIN-OUT
CURBCOL0:
LDI *+AR4(OID),R0 ;PLAYER?
AND CLASS_M,R0
CMPI PLYR_C,R0
BZ CURBCOLP ;YES
*DRONE HIT SOUND
LDI @WALLHITABI,AR2 ;MAKE A DRONE SOUND
LDI 3,R0
CALL DRONESND
LDF *+AR5(CARSPEED),R0 ;SLOW DOWN DRONE
MPYF 0.80,R0
STF R0,*+AR5(CARSPEED)
B CURBCOL
*PLAYER HIT SOUND
CURBCOLP
LDI @WALLHITABI,AR2 ;MAKE A SOUND
LDI 3,R0
CALL RANDSND
CURBCOL
CALL GETNXTRDIR ;DIRECTION CAR TO NEXT ROAD SEG.
LDF R0,R4
CALL ROADIR ;REFLECT VELOCITY
SUBF R4,R0,R2
CALL NORMITS
LDF R2,R3
LDF *+AR5(CARVROT),R1
SUBF R1,R0,R2
CALL NORMITS
*KICK DUDE BACK INSTANTLY
*R0=ROADIR
*R2=ROADIR-CARVROT
PUSHF R2
PUSHF R0
LDF *+AR5(CARSPEED),R2
CMPF 15,R2
LDFLT 15,R2
STF R2,*+AR5(CARSPEED) ;MIN SPEED
FLOATP @NFRAMES,R5
MPYF R2,R5 ;TOTAL DISTANCE TRAVELED
LDF -1.57,R4
LDF R3,R3
LDFN 1.57,R4
ADDF R4,R0,R2 ;REPELL DIRECTION
PUSHF R2
SUBF R1,R2 ;FIND DIFFERENCE
CALL _SINE
ABSF R0
MPYF R0,R5 ;ADJUST VELOCITY FOR PENETRATION ANGLE
POPF R2
CALL _COSI
MPYF R0,R5,R4
CALL _SINE
NEGF R0 ;-SIN
MPYF R0,R5,R5
ADDF *+AR4(OPOSX),R5 ;ADJUST X
STF R5,*+AR4(OPOSX)
ADDF *+AR4(OPOSZ),R4 ;ADJUST Z
STF R4,*+AR4(OPOSZ)
CALL WALL_SPARK
POPF R0
POPF R2
*REFLECT VELOCITY
XOR R2,R3 ;CHECK IF ALREADY GOING THE RIGHT WAY
BN CURBCOL1 ;MOVING IN RIGHT DIRECTION
NEGF R2 ;NEED TO REFLECT VELOCITY
CURBCOL1
LDI *+AR5(CAR_SPIN),R1 ;ALREADY SPINNING?
BNZ CURBSPIN ;YES, SPIN SOME MORE...
ABSF R2,R3
CURBCOL1A
CMPF 1.2,R3
BGT CURBSPIN ;YES, SPIN THE DUDE
CMPF 0.4,R3 ;HARD BOUNCE?
BGT CURBSPN ;YES, SPIN THE DUDE
MPYF 0.3,R2 ;CUT DOWN BOUNCE
MPYF 0.3,R3 ;CUT DOWN BOUNCE
CMPF 0.03,R3 ;MINIMUM KICKOUT
BGE CURBCOL2A
LDF R2,R2
LDFLT -0.03,R2
LDFGT 0.03,R2
CURBCOL2A
CMPF 0.06,R3 ;MAXIMUM KICKOUT
BLE CURBCOL2
LDF R2,R2
LDFLT -0.06,R2
LDFGT 0.06,R2
CURBCOL2
ADDF R0,R2
STF R2,*+AR5(CARVROT)
STF R2,*+AR5(CARYROT) ;ADJUST YROT <--- CARVROT
RETS
*----------------------------------------------------------------------------
CURBSPIN:
ADDF R0,R2
STF R2,*+AR5(CARVROT)
LDF R0,R2
SUBF *+AR5(CARYROT),R2 ;CHECK YROT-ROAD DIRECTION
CALL NORMITS
LDF 0.025,R0 ;RANDOM ROTATION VALUE
CALL FRAND
ADDF 0.075,R0
LDF R2,R2 ;CHECK SIGN
BN CURBSPIN1
NEGF R0
CURBSPIN1
STF R0,*+AR5(CARDROT) ;BODY DELTA
ABSF R2 ;CORRECTION FACTOR
ADDF 0.1,R2
LDF R2,R1
CMPF 1.0,R2 ;HARD HIT?
LDFGT 3.14,R1 ;YES...
LDF *+AR5(CARSPEED),R0
CMPF 30,R0
LDFLT R2,R1
STF R1,*+AR5(CARSPRAD) ;GO AROUND AT LEAST HALFWAY
LDI 1,R1
STI R1,*+AR5(CAR_SPIN)
CURBCLX RETS
*----------------------------------------------------------------------------
*SHORT CORRECTION SPIN
CURBSPN:
ADDF R0,R2
STF R2,*+AR5(CARVROT)
LDF R0,R2
SUBF *+AR5(CARYROT),R2 ;CHECK YROT-ROAD DIRECTION
CALL NORMITS
ABSF R2,R3
STF R3,*+AR5(CARSPRAD) ;SPIN THIS MUCH DUDES
MPYF 0.10,R2
STF R2,*+AR5(CARDROT) ;BODY DELTA
LDI 1,R1
STI R1,*+AR5(CAR_SPIN)
RETS
*----------------------------------------------------------------------------
*SOFT CURB HIT
*
SOFTCURB:
CALL ROADIR
LDF R0,R1
CALL GETNXTRDIR ;DIRECTION CAR TO NEXT ROAD SEG.
SUBF R1,R0,R2
CALL NORMITS
LDF R2,R4 ;CHECK DIRECTION
LDFN -0.1,R5 ;GET RELATIVE ANGLE
LDFNN 0.1,R5
LDI *+AR5(CAR_SPIN),R0 ;ALREADY SPINNING?
BZ SOFTCURB0 ;NO
CMPI 2,R0 ;TIMED SPIN?
BGE SOFTCRB00 ;YES
LDF *+AR5(CARVROT),R0 ;REFLECT THE MOTHER OUT
SUBF R1,R0,R2
CALL NORMITS
ABSF R2
CMPF 0.1,R2 ;MINIMUM REFLECT
LDFLT 0.1,R2
LDF R4,R4
LDFN -1,R5 ;GET RELATIVE ANGLE
LDFNN 1,R5
MPYF R5,R2
ADDF R1,R2
STF R2,*+AR5(CARVROT)
RETS
SOFTCRB00
LDF *+AR5(CARSPEED),R0 ;TIMED SPIN
CMPF 80,R0
BLT SOFTVELX ;SLOW TREECOL FIX
B SOFTVEL ;FAST, NEEDS CORRECTION
*CHECK BODY ROTATION
SOFTCURB0
LDF *+AR5(CARYROT),R0
SUBF R1,R0,R2
CALL NORMITS
LDF R4,R4
BN SOFT10 ;DELTA IS NEGATIVE
SUBF R2,R5,R6
BLT SOFTVEL ;ROTATION IS O.K.
CMPF 0.1,R6 ;MAX DELTA
LDFGT 0.1,R6
B SOFT11
SOFT10
SUBF R2,R5,R6
BGT SOFTVEL ;ROTATION IS O.K.
CMPF -0.1,R6 ;MAX DELTA
LDFLT -0.1,R6
SOFT11
ADDF *+AR5(CARYROT),R6 ;ADD IN ROTATION
STF R6,*+AR5(CARYROT)
*CHECK VELOCITY ROTATION
SOFTVEL LDF *+AR5(CARSPEED),R0 ;MINIMUM SPEED
CMPF 20,R0
LDFLT 20,R0
STF R0,*+AR5(CARSPEED)
LDF *+AR5(CARVROT),R0
SUBF R1,R0,R2
CALL NORMITS
ABSF R2,R3
CMPF 0.6,R3
BLT SOFTV1
LDF R1,R0 ;ROADIR->R0
LDF *+AR5(CARVROT),R1
SUBF R1,R0,R2
B CURBCOL1A
SOFTV1 LDF R4,R4
BN SOFT20 ;DELTA IS NEGATIVE
SUBF R2,R5
BLT SOFTVELX ;ROTATION IS O.K.
CMPF 0.1,R5 ;MAX DELTA
LDFGT 0.1,R5
B SOFT21
SOFT20 SUBF R2,R5
BGT SOFTVELX ;ROTATION IS O.K.
CMPF -0.1,R5 ;MAX DELTA
LDFLT -0.1,R5
SOFT21 ADDF *+AR5(CARVROT),R5 ;ADD IN ROTATION
STF R5,*+AR5(CARVROT)
SOFTVELX
RETS
*----------------------------------------------------------------------------
*GET DIRECTION TO NEXT ROAD SEGMENT FROM CAR
*
GETNXTRDIR:
LDI *+AR5(CARTRAK),AR2 ;GET CLOSEST TRACK PIECE
LDI *+AR2(OLINK4),AR0 ;GET NEXT ONE
LDI AR4,AR2
B GETRD1
*GET ROAD-CAR ANGLE
*AR2=ROAD SEGMENT OBJECT
*AR4=CAR OBJECT
*RET R0 = RADIANS (FLOAT)
*CLOBBERS AR0
GETRDCAR:
LDI AR4,AR0
B GETRD1
*GET ROAD DIRECTION
*AR5=CARBLOCK
*RET R0 = RADIANS (FLOAT)
*CLOBBERS AR0,AR2
ROADIR:
LDI *+AR5(CARTRAK),R0 ;GET CLOSEST TRACK PIECE
BZ ROADIRX ;NO TRACK PIECE, EXIT
LDI R0,AR2
*GET ROAD DIRECTION
*AR2=ROAD SEGMENT OBJECT
*RET R0 = RADIANS (FLOAT)
*CLOBBERS AR0
GETRDIR:
LDI *+AR2(OLINK4),AR0
GETRD1 PUSH R2
PUSH R3
PUSHF R2
PUSHF R3
LDF *+AR0(OPOSX),R2
SUBF *+AR2(OPOSX),R2
LDF *+AR0(OPOSZ),R3
SUBF *+AR2(OPOSZ),R3
CALL ARCTANF
POPF R3
POPF R2
POP R3
POP R2
SUBF HALFPI,R0
ROADIRX RETS
*----------------------------------------------------------------------------
.bss WHLTIM,1
.bss WHLOLD,1
*PLAYER WHEEL ROUTINE
*PARAMETERS
* AR4 OBJECT
* AR5 CAR STRUCTURE
PLYRWHL:
LDF @STEERCT,R4 ;STEERING CENTER
LDI @WHLTIM,R3
LDI @WHLOLD,R5
LDI 0,R2
LDI 0,R1
LDI *+AR5(RF_PCOL),R0 ;Right front collide with curb?
BZ PWHL0
LDI R0,AR0
LDI *+AR0(OID),R0
AND CLASS_M+TYPE_M,R0
CMPI ROAD_C+SHLDR_T,R0
LDIZ 1,R1
PWHL0 LDI *+AR5(LF_PCOL),R0 ;Left front collide with curb?
BZ PWHL1
LDI R0,AR0
LDI *+AR0(OID),R0
AND CLASS_M+TYPE_M,R0
CMPI ROAD_C+SHLDR_T,R0
LDIZ 2,R2
PWHL1 ADDI R1,R2
STI R2,@WHLOLD
BZ PWHLX ;NO SHOULDER ACTIVE
ANDN R5,R2 ;NEW SHOULDER HIT?
BZ PWHLX ;NOT NEW...
*COLLIDED WITH A CURB FIRST TIME
CALL ROADIR ;FIND WHICH SIDE OF ROAD HIT
LDF R0,R2
CALL GETNXTRDIR
SUBF R0,R2
CALL NORMITS
LDF R2,R2
LDFNN 15,R0
LDFN -15,R0
ADDF R0,R4 ;NEW STERRING CENTER FOR FEEDBACK
LDI 4,R3 ;NEW TIMER VALUE
B PWHLX0
PWHLX SUBI 1,R3
LDILT 0,R3
BGT PWHLXX ;When timer reaches -1, Set WHEELPOS = STEERCT
*THIS POINT IS ONLY REACHED WHEN NOT COLLIDING WITH A CURB
*PLACE SKID CORRECT HERE
PWHLX0 STF R4,@WHEELPOS
PWHLXX STI R3,@WHLTIM
*CHECK OFF ROAD STUFF
LDI @WHLOLD,R1 ;OFFROAD?
BZ WHLOFFX ;NO
LDI @WHLTIM,R3 ;TIMER ON?
BNZ WHLOFFX ;NO
LDF @STEERCT,R4 ;STEERING CENTER
LDF R4,R5
ADDF 15,R4
SUBF 15,R5
LDF 2,R0
CMPI 3,R1
LDFZ 4,R0
CALL SFRAND ;If off road offset center by random number
ADDF @WHEELPOS,R0
CMPF R4,R0 ;CHECK YOUR LIMITS
LDFGT R4,R0
CMPF R5,R0
LDFLT R5,R0
STF R0,@WHEELPOS
WHLOFFX RETS
*----------------------------------------------------------------------------
*SOUND TABLES
*PLAYER COLLISION SOUND TABLE
SCOLLTABI .word SCOLLTAB
SCOLLTAB .word SCOLLA,SCOLLB,SCOLLC
*WALL HIT SOUND TABLE
WALLHITABI .word WALLHITAB
WALLHITAB .word WALLHITA,WALLHITB,WALLHITC
*SKID SOUND TABLE
SKIDTABI .word SKIDTAB
SKIDTAB .word SKIDB,SKIDC
PLAIRSNDI .word PLAIRSND
PLAIRSND .word RH_BABEWHOA,GL_WOOLAUGH,CHICKSCREAM
REVSNDTABI .word REVSNDTAB
REVSNDTAB .word SINGLEREV5,SINGLEREV6
;SHIFTSNDTABI .WORD SHIFTSNDTAB
;SHIFTSNDTAB .WORD FIRSTSND,SECONDSND,THIRDSND,FOURTHSND
*----------------------------------------------------------------------------
*PLAYER SOUND EFFECTS TRACKS
*TRACK 0 = MUSIC
*TRACK 1 = DRONE+PLAYER EFFECTS
*TRACK 2 = DRONE+PLAYER EFFECTS
*TRACK 3 = ENGINE
*PARAMETERS
* AR4 PLYR CAR OBJECT
* AR5 CAR BLOCK
PLYR_SNDS:
LDI @_MODE,R0
AND MMODE,R0
CMPI MGAME,R0
RETSNE
CALL GETPEDAL
CMPF 0.75,R0
BLT PSND1
LDI @_MODE,R2
AND MSLINE,R2
BZ PSND0
CREATEC FLAME_PRC,UTIL_C ;make child flames
PSND0
LDI @REVFLG,R0
BNE BACKREV
CREATEC FLAME_PRC,UTIL_C ;make child flames
*MAKE YOUR REV SOUND
*KILL OLDIES
LDI 2,R0
LDI @REVSNDTABI,AR2 ;REVSND ON TRACK 12
CALL RANDSND
LDI 1,R0
B PSND2
PSND1
CMPF 0.50,R0
LDIGE @REVFLG,R0
LDILT 0,R0
PSND2
STI R0,@REVFLG
*CHECK BACKGROUND STARTING LINE REV SOUNDS
BACKREV
LDI @_MODE,R2 ;STARTING LINE MODE?
AND MSLINE,R2
BZ PLAIR ;NOPE
LDI @SNDSTR+SND_SIZ+SND_PRI,R2 ;CHECK TRACK1
BZ BACKREV1
LDI @SNDSTR+(2*SND_SIZ)+SND_PRI,R2 ;CHECK TRACK2
BNZ PLAIR
BACKREV1
SONDFX STARTLINEREVS2 ;START REV WHEN NOTHING
*CHECK IN AIR SPEECH CALL
PLAIR
*CHECK IN AIR SPEECH CALL
LDI @WRECKFLG,R0 ;IGNORE AIR SOUND ON WRECK
BNZ PLYRSND1B
LDI @PLAIRTIM,R0
BNZ PLYRSND1A
LDF *+AR5(CT_PRDYD),R0
CMPF 200,R0
BLT PLYRSND1B
LDI @PLAIRSNDI,AR2
LDI 3,R0
CALL RANDSND
LDI 100,R0
PLYRSND1A
SUBI 1,R0
STI R0,@PLAIRTIM
PLYRSND1B
*CHECK BOTTOM OUT SOUND
LDI *+AR5(CAR_AIRB),R0
BNZ NOBOTTOM
LDI @OLDPLYAIR,R0
BZ BOTX
CALL INIT_SPARK
SONDFX BOTTOMOUT
LDI 0,R0
NOBOTTOM
STI R0,@OLDPLYAIR
BOTX
*CHECK SKID SOUND
LDF *+AR5(CARSKID),R0
CMPF 0.5,R0
BLT NO_SMOKE
CREATEC SMOKE_PROC,UTIL_C ;make child smoke
NO_SMOKE
LDF *+AR5(CARSKID),R0
CMPF 0.25,R0
BLT NOSKID ;NO SKID ACTIVE
FLOAT 115,R1
MPYF R0,R1 ;GET SKID SOUND AMPLITUDE
FIX R1 ;CONVERT TO INT
ADDI 140,R1
*CHECK ALREADY ACTIVE
LDI @SNDSTR+SND_SIZ+SND_IDX,R2 ;CHECK TRACK1
CMPI SKIDB,R2
BEQ SKIDAMP ;ALREADY SKIDDING
CMPI SKIDC,R2
BEQ SKIDAMP ;ALREADY SKIDDING
LDI @SNDSTR+(2*SND_SIZ)+SND_IDX,R2 ;CHECK TRACK2
CMPI SKIDB,R2
BEQ SKIDAMP1 ;ALREADY SKIDDING
CMPI SKIDC,R2
BEQ SKIDAMP1 ;ALREADY SKIDDING
*MAKE NEW SKID SOUND
LDF *+AR5(CARSPEED),R0
CMPF 20,R0
BGT NO_FLAME
CREATEC FLAME_PRC,UTIL_C ;make child flames
NO_FLAME
LDI @SKIDTABI,AR2
LDI 2,R0
CALL RANDVSND ;START A SKID AND EXIT
B SKIDX
SKIDAMP
LDI @SNDSTR+(SND_SIZ)+SND_VOL,R2 ;VOLUME CHANGE?
LDI 1,R0
B SKIDAMP10
SKIDAMP1
LDI @SNDSTR+(2*SND_SIZ)+SND_VOL,R2 ;VOLUME CHANGE?
LDI 2,R0
SKIDAMP10
SUBI R1,R2
ABSI R2
CMPI 10,R2 ;NOT ENOUGH CHANGE FOR CALL
BLT SKIDX
CALL SET_TRACK_VOL ;ADJUST YOUR VOLUME, DUDES
B SKIDX
NOSKID
LDI SKIDB,AR2
CALL KILLSNDFX
LDI SKIDC,AR2
CALL KILLSNDFX
SKIDX
*CHECK HARD BRAKE SOUND
LDF *+AR5(CARBRAKE),R0
CMPF 0.8,R0
BLE NOBRAKSND
LDF *+AR5(CARSPEED),R0 ;SPEED LOW ?
CMPF 1.5,R0
BLT NOBRAKSND ;YES KILL SOUND
CREATEC SMOKE_PROC,UTIL_C ;make child smoke
LDI BRAKSND,AR2
CALL MKFXSND
B BRAKSNDX
NOBRAKSND
LDI BRAKSND,AR2
CALL KILLSNDFX
BRAKSNDX
*ENGINE SPUTTER SOUND
LDF *+AR5(CARTHROTTLE),R0
CMPF 0.15,R0
BGE NOSPUTSND
LDF *+AR5(CARRPM),R0
CMPF 30,R0
BLE NOSPUTSND
LDI @_MODE,R2
AND MSLINE,R2
BNZ NOSPUTSND
LDI SPUTSND,AR2
CMPI @SNDSTR+2*(SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
BZ SPUTSNDX
CALL ONESND
B SPUTSNDX
NOSPUTSND
LDI SPUTSND,AR2
CALL KILLSNDFX
SPUTSNDX
*ROAD EFFECTS: TUNNEL SOUND
LDI @_MODE,R4
TSTB MINTUNNEL,R4
BZ TUNOFF
FIX *+AR5(CARSPEED),R0
CMPI 100,R0 ;CLAMP TO LIMITS
LDILT 100,R0
CMPI 255,R0
LDIGT 255,R0
LDI TUNSND,AR2
CALL MKVFXSND
B TUNSNDX
TUNOFF LDI TUNSND,AR2
CALL KILLSNDFX
TUNSNDX
*ROAD EFFECTS: GRAVEL SOUND
LDI *+AR5(LR_PCOL),AR2
LDI 0,R1
LDI 0,R2
LDI *+AR2(OID),R0
CMPI 300h,R0
LDINZ 127,R1
LDI *+AR5(RR_PCOL),AR2
LDI *+AR2(OID),R0
CMPI 300h,R0
LDINZ 127,R2
ADDI R1,R2,R0
BZ NOGRAV
GRAVEL
LDF *+AR5(CARSPEED),R1
CMPF 1.0,R1
BLT NOGRAV
LDI GRAVELA,AR2
B MKVFXSND
NOGRAV
LDI GRAVELA,AR2
CALL KILLSNDFX
BNC GRAVX
SONDFX BOTTOMOUT
GRAVX
PLSNDX
RETS
*----------------------------------------------------------------------------
*MAKE PLAYER EFFECTS SOUND
*PARAMETERS
* AR2 SOUND
MKFXSND:
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
RETSZ
CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
BNZ ONESNDFX
MKFXSNDX
RETS
*----------------------------------------------------------------------------
*MAKE PLAYER VOLUME EFFECTS BACKGROUND SOUND
*PARAMETERS
* AR2 SOUND
* R0 VOLUME
MKVFXSND:
LDI R0,R1 ;SAVE VOLUME
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
BNZ MKVFX1
SUBPI @SNDSTR+SND_SIZ+SND_VOL,R0 ;CHECK TRACK1 VOLUME
ABSI R0
CMPI 8,R0
RETSLE
LDI 1,R0 ;TRACK #
B SET_TRACK_VOL ;R0=TRACK#,R1=VOL
MKVFX1:
CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
BNZ VOLSNDFX ;DO NEW SOUND DUDES
SUBI @SNDSTR+(2*SND_SIZ)+SND_VOL,R0 ;CHECK TRACK2 VOLUME
ABSI R0
CMPI 8,R0
RETSLE
LDI 2,R0 ;TRACK #
B SET_TRACK_VOL ;R0=TRACK#,R1=VOL
*----------------------------------------------------------------------------
*RANDOM SOUND ROUTINE
*PARAMETERS
* R0 RANDOM RANGE (0->R0-1)
* AR2 TABLE ADDR OF SOUNDS
*TRASHED R0
RANDSND:
PUSH AR2
LDI R0,AR2
CALL RANDU0
POP AR2
ADDI R0,AR2
LDI *AR2,AR2
B ONESNDFX
*RANDOM VOLUME SOUND ROUTINE
*PARAMETERS
* R0 RANDOM RANGE (0->R0-1)
* R1 VOLUME
* AR2 TABLE ADDR OF SOUNDS
*TRASHED R0,AR2
RANDVSND:
PUSH AR2
LDI R0,AR2
CALL RANDU0
POP AR2
ADDI R0,AR2
LDI *AR2,AR2
LDI R1,R0
B VOLSNDFX ;R0=VOLUME, AR2=SOUND
*DRONE SOUND ROUTINE
*PARAMETERS
* R0 RANDOM RANGE (0->R0-1)
* AR2 TABLE ADDR OF SOUNDS
* AR4 DRONE CAR OBJECT
*COMPUTES VOLUME BASED ON DISTANCE
*TRASHED R0
.globl DRONESND,DRONESND1
DRONESND:
PUSH AR2
LDI R0,AR2
CALL RANDU0
POP AR2
ADDI R0,AR2
LDI *AR2,AR2
DRONESND1 ;MAKE ONE DRONE SOUND ONLY...
FLOAT *+AR4(ODIST),R0
RETSN ;BEHIND PLAYER NO SOUND
FLOAT 10000,R1
MPYF 5,R1
CALL DIV_F
SUBRF 1,R0
RETSN
FLOAT 220,R1
MPYF R1,R0
FIX R0
CMPI 220,R0
LDIGT 220,R0
B VOLSNDFX ;R0=VOLUME, AR2=SOUND
*----------------------------------------------------------------------------
*STEERING WHEEL AND GAS PEDAL PARAMETERS
*(VALUES ARE READ FROM CMOS AND COPIED INTO RAM FOR EASY ACCESS)
*(COPIED AT THE START OF EACH GAME)
*ALL FLOATS
PEDALMNI .word PEDALMN
.bss PEDALMN,1 ;GAS PEDAL MIN CMOS 0
.bss PEDALMX,1 ;GAS PEDAL MAX 1
.bss STEERMN,1 ;STEERING MIN 2
.bss STEERMX,1 ;STEERING MAX 3
.bss STEERCT,1 ;STEERING CENTER 4
.bss BRAKEMN,1 ;BRAKE PEDAL MIN 5
.bss BRAKEMX,1 ;BRAKE PEDAL MAX 6
.bss STEERFR,1 ;STEERING FREE
ADJ_COINMODE .set 0
ADJ_GASMIN .set 1
ADJ_GASMAX .set 2
ADJ_STEERMIN .set 3
ADJ_STEERMAX .set 4
ADJ_STEERCENTER .set 5
ADJ_BRAKEMIN .set 6
ADJ_BRAKEMAX .set 7
GETCMOS_VALUES:
PUSH AR3
LDI @PEDALMNI,AR3
LDI ADJ_GASMIN,AR2
LDI 6,RC
RPTB CMOSALP
PUSH AR2
CALL ADJUSTMENT_READ
POP AR2
FLOAT R0
STF R0,*AR3++
CMOSALP ADDI 1,AR2
LDF @STEERMX,R0
SUBF @STEERMN,R0
STF R0,@STEERFR
POP AR3
RETS
*----------------------------------------------------------------------------
*PUSH CAMERA MATRIX
CAMMATSAV:
POP BK
LDI SP,AR0
ADDI 9,SP
LDI @CAMERAMATRIXI,AR1
LDF *AR1++,R0
RPTS 7
LDF *AR1++,R0
|| STF R0,*++AR0
STF R0,*++AR0
B BK
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*CAMERA MATRIX AVERAGE
CAMMATAVG:
POP BK
LDI *+AR5(CAR_SPIN),R0 ;DONT AVG IN SPIN DUDES
CMPI 1,R0
BEQ CAMMATX
LDI SP,AR1
SUBI 8,AR1
LDI @CAMERAMATRIXI,AR0
LDI 8,RC
RPTB CAMAVG
LDF *AR1++,R0
MPYF 0.80,R0
LDF *AR0,R1
MPYF 0.20,R1
ADDF R0,R1
CAMAVG STF R1,*AR0++
CAMMATX SUBI 9,SP
B BK
*----------------------------------------------------------------------------
.END