950 lines
17 KiB
NASM
Executable File
950 lines
17 KiB
NASM
Executable File
.FILE "RROAD.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*
|
|
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
|
|
*ALL RIGHTS RESERVED
|
|
*
|
|
|
|
.include MACS.EQU
|
|
.include OBJ.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 DELTA.EQU
|
|
|
|
|
|
.bss FREEZE_IT,1
|
|
|
|
.bss COLL_POS,3 ;approximate collision position
|
|
.bss THE_TRAIN_SPEED,1 ;FL
|
|
.bss KILL_TRAIN,1 ;UD
|
|
|
|
COLL_DIST .float 117465.0 ;distance to collision from engine start
|
|
|
|
TRAIN_SPEED .set 240
|
|
TRAIN_SPEED_MIN .set 170
|
|
TRAIN_SPEED_MAX .set 280
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
RRSTART_ENGINE:
|
|
|
|
LDI @HEAD2HEAD_ON,R0
|
|
RETSNZ
|
|
|
|
LONGROUT
|
|
|
|
PUSHFL R0
|
|
PUSHFL R1
|
|
PUSHFL R2
|
|
PUSHFL R3
|
|
PUSH AR0
|
|
PUSH AR2
|
|
|
|
|
|
CLRI R0
|
|
STI R0,@FREEZE_IT
|
|
|
|
CREATEL CARFORWARD_ENGINE,DRONE_C|RAILROAD|1
|
|
STI AR0,*+AR4(OPLINK)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
OR *+AR4(OFLAGS),R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
LDI 1,R0
|
|
STI R0,*+AR0(PDATA)
|
|
|
|
;compute the collision point
|
|
|
|
LDF @COLL_DIST,R2
|
|
|
|
LDI @VECTORBI,AR2
|
|
CLRF R0
|
|
STF R0,*+AR2(X)
|
|
STF R0,*+AR2(Y)
|
|
STF R2,*+AR2(Z)
|
|
|
|
LDF *+AR4(ORADY),R2
|
|
LDI @MATRIXBI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
|
|
LDI AR2,R2
|
|
LDI @VECTORBI,AR2
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDF *+AR2(X),R0
|
|
ADDF *+AR4(OPOSX),R0
|
|
STF R0,@COLL_POS+X
|
|
|
|
; LDF *+AR2(Y),R0
|
|
; ADDF *+AR4(OPOSY),R0
|
|
; STF R0,@COLL_POS+Y
|
|
|
|
LDF *+AR2(Z),R0
|
|
ADDF *+AR4(OPOSZ),R0
|
|
STF R0,@COLL_POS+Z
|
|
|
|
FLOAT TRAIN_SPEED,R0
|
|
STF R0,@THE_TRAIN_SPEED
|
|
|
|
|
|
POP AR2
|
|
POP AR0
|
|
POPFL R3
|
|
POPFL R2
|
|
POPFL R1
|
|
POPFL R0
|
|
RETS
|
|
END_LONGROUT
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
RRSTART_BOXCAR:
|
|
|
|
LDI @HEAD2HEAD_ON,R0
|
|
RETSNZ
|
|
|
|
LONGROUT
|
|
|
|
PUSH R0
|
|
PUSH R2
|
|
PUSH AR2
|
|
CREATEL CARFORWARD,DRONE_C|RAILROAD
|
|
STI AR0,*+AR4(OPLINK)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
OR *+AR4(OFLAGS),R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
LDI 0,R0
|
|
STI R0,*+AR0(PDATA)
|
|
|
|
POP AR2
|
|
POP R2
|
|
POP R0
|
|
RETS
|
|
|
|
END_LONGROUT
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
CARFORWARD:
|
|
|
|
LDI DRONE_C|RAILROAD|1,R0
|
|
LDI -1,R1
|
|
CALL PRC_FIND
|
|
LDI AR0,AR2
|
|
CALL PRC_FOLLOW ;FOLLOW THE ENGINE!
|
|
|
|
CARFORWARD_ENGINE:
|
|
LDI *+AR4(OID),IR0
|
|
AND 0Fh,IR0
|
|
STI IR0,*+AR4(OUSR1) ;SAVE INDEX
|
|
|
|
LDI 13,R0
|
|
CALL _CARV0 ;RETURNS BLOCK PTR IN AR0
|
|
BC KKG
|
|
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
LDI *+AR4(OFLAGS),R1
|
|
ANDN R0,R1
|
|
STI R1,*+AR4(OFLAGS)
|
|
DIE
|
|
|
|
KKG LDI AR0,AR5
|
|
|
|
LDI DRONE_C|RAILROAD,R0
|
|
STI R0,*+AR4(OID)
|
|
STI R0,*+AR5(CAR_ID)
|
|
STI R0,*+AR7(PID)
|
|
CALL ADD_DRONE
|
|
|
|
LDI *+AR4(OLINK2),R0
|
|
ADDI 0500h,R0
|
|
STI R0,*+AR7(PDATA+2)
|
|
CLRI R0
|
|
STI R0,*+AR4(OLINK2) ;do not delete
|
|
|
|
CLRF R0
|
|
STF R0,*+AR5(CARBRAKE)
|
|
|
|
LDF *+AR5(CARRDFR),R0
|
|
STF R0,*+AR5(CAROFRDFR)
|
|
|
|
LDF *+AR4(ORADY),R2
|
|
CALL NORMITS
|
|
STF R2,*+AR4(ORADY)
|
|
STF R2,*+AR5(CARYROT)
|
|
STF R2,*+AR5(CARVROT)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
*Initialize the distance to collision point
|
|
|
|
LDF @COLL_DIST,R2
|
|
MPYF 2,R2
|
|
STF R2,*+AR7(DELTA_PLYRDIST)
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*
|
|
CARFLP
|
|
LDI *+AR7(PDATA+2),R0 ;CHECK TO SEE IF IT IS IN THE RANGE
|
|
RS 8,R0
|
|
LDI @SECTIONIDX,R1
|
|
SUBI @DGROUP_COUNT,R1
|
|
CMPI R1,R0
|
|
BLT RROAD_DIE
|
|
|
|
LDI @FREEZE_IT,R0
|
|
BZ NLSLP
|
|
|
|
LDI *+AR7(PDATA),R0 ;lead engine??
|
|
BZ NOTLEAD
|
|
|
|
*CHECK IF WAY PAST CROSSING
|
|
|
|
LDF @COLL_POS+X,R0
|
|
SUBF *+AR4(OPOSX),R0
|
|
LDF @COLL_POS+Z,R2
|
|
SUBF *+AR4(OPOSZ),R2
|
|
MPYF R0,R0
|
|
MPYF R2,R2
|
|
ADDF R0,R2
|
|
CALL SQRT ;R0 distance to collision point
|
|
LDF R0,R2
|
|
LDF *+AR7(DELTA_PLYRDIST),R1
|
|
STF R2,*+AR7(DELTA_PLYRDIST)
|
|
CMPF R1,R2
|
|
BLE REGULAR
|
|
|
|
|
|
FLOAT 15000,R1
|
|
MPYF 6,R1
|
|
CMPF R1,R2
|
|
BLT REGULAR
|
|
|
|
LDI 1,R0
|
|
STI R0,@KILL_TRAIN
|
|
|
|
LDI RR_TRAIN,AR2
|
|
CALL KILLSNDFX
|
|
REGULAR
|
|
|
|
;
|
|
; find ETA to collision with plyr, and with this vehicle
|
|
;
|
|
|
|
PUSHF R2 ;save distance to coll point
|
|
LDI @PLYCAR,AR0
|
|
LDF @COLL_POS+X,R0
|
|
SUBF *+AR0(OPOSX),R0
|
|
LDF @COLL_POS+Z,R2
|
|
SUBF *+AR0(OPOSZ),R2
|
|
MPYF R0,R0
|
|
MPYF R2,R2
|
|
ADDF R0,R2
|
|
CALL SQRT ;R0 distance to collision point
|
|
|
|
LDI @PLYCBLK,AR0
|
|
LDF *+AR0(CARSPEED),R1
|
|
CALL DIV_F30 ;R0 frames to hit collision point
|
|
LDF R0,R2
|
|
|
|
POPF R0 ;retrieve distance to coll point
|
|
FLOAT 25000,R1
|
|
ADDF R1,R0
|
|
LDF @THE_TRAIN_SPEED,R1
|
|
CALL DIV_F30 ;R0
|
|
|
|
|
|
CMPF R2,R0
|
|
BLT SLOWDOWN
|
|
BEQ NOCHANGE
|
|
|
|
LDF 0.03,R0
|
|
MPYF 0.1,R0
|
|
CALL FRAND
|
|
SUBRF 1.01,R0
|
|
|
|
MPYF @THE_TRAIN_SPEED,R0
|
|
|
|
FLOAT TRAIN_SPEED_MAX,R1
|
|
CMPF R1,R0
|
|
LDFGT R1,R0
|
|
STF R0,@THE_TRAIN_SPEED
|
|
BU NOCHANGE
|
|
SLOWDOWN
|
|
|
|
LDF @THE_TRAIN_SPEED,R0
|
|
MPYF 0.99,R0
|
|
|
|
FLOAT TRAIN_SPEED_MIN,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
STF R0,@THE_TRAIN_SPEED
|
|
|
|
NOCHANGE
|
|
LDI RR_TRAIN,AR2
|
|
CALL MKFXSND
|
|
|
|
RANDN 1000
|
|
CMPI 5,R0
|
|
BGT NOTLEAD
|
|
|
|
RANDN 2
|
|
CMPI 0,R0
|
|
LDIEQ RR_HORNL,AR2
|
|
LDINE RR_HORNS,AR2
|
|
CALL MKFXSND
|
|
NOTLEAD
|
|
LDI @KILL_TRAIN,R0
|
|
BNZ RROAD_DIE
|
|
|
|
LDF *+AR4(ORADY),R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
CALL CLR_VECTORA
|
|
LDF @THE_TRAIN_SPEED,R0
|
|
; FLOAT TRAIN_SPEED,R0
|
|
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
STF R0,*+AR2(Z)
|
|
|
|
LDI AR2,R3
|
|
LDI @MATRIXAI,R2
|
|
CALL MATRIX_MUL
|
|
|
|
|
|
LDF *+AR2(X),R0
|
|
STF R0,*+AR4(OVELX)
|
|
ADDF *+AR4(OPOSX),R0
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
LDF *+AR2(Y),R0
|
|
STF R0,*+AR4(OVELY)
|
|
ADDF *+AR4(OPOSY),R0
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
LDF *+AR2(Z),R0
|
|
STF R0,*+AR4(OVELZ)
|
|
ADDF *+AR4(OPOSZ),R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
|
|
CALL GET_CLOSEST_TRAK
|
|
STI AR0,*+AR5(CARTRAK)
|
|
|
|
|
|
|
|
LDF *+AR4(ORADY),R2
|
|
STF R2,*+AR5(CARYROT)
|
|
STF R2,*+AR5(CARVROT)
|
|
|
|
LDF @THE_TRAIN_SPEED,R0
|
|
STF R0,*+AR5(CARSPEED)
|
|
|
|
LDF 2,R0
|
|
STF R0,*+AR5(CARMASS)
|
|
NLSLP
|
|
|
|
SLEEP 1
|
|
B CARFLP
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
RAMPDOWNTRAINSND:
|
|
CREATE RAMPDOWNTRAINSND_PROC,UTIL_C
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
RAMPDOWNTRAINSND_PROC:
|
|
LONGROUT
|
|
|
|
LDI 255,R5
|
|
|
|
RAMPDOWNTRAINSND_LP
|
|
|
|
SUBI 5,R5
|
|
BLT RAMPDOWNTRAINSND_DEATH
|
|
LDI R5,R2
|
|
LDI RR_TRAIN,AR2
|
|
|
|
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
|
|
BEQ RDT1
|
|
CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
|
|
BNE RDTX ;SOUND NOT ACTIVE, LEAVE...
|
|
RDT1
|
|
CALL AMBIENCE_SOUND
|
|
SLEEP 1
|
|
BR RAMPDOWNTRAINSND_LP
|
|
|
|
RAMPDOWNTRAINSND_DEATH
|
|
LDI RR_TRAIN,AR2
|
|
CALL KILLSNDFX
|
|
RDTX
|
|
DIE
|
|
|
|
END_LONGROUT
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*FLYING TRAIN WRECK
|
|
*
|
|
* AR0 POINTS TO PLAYER CAR
|
|
* AR1 POINTS TO CAR TO SEND FLYING
|
|
* AR4 POINTS TO PLAYER CAR BLOCK
|
|
* AR5 POINTS TO DRONE CAR BLOCK
|
|
FLYTRAIN:
|
|
|
|
LONGROUT
|
|
|
|
PUSH AR0
|
|
PUSH AR1
|
|
PUSH AR3
|
|
PUSH AR4
|
|
PUSH AR5
|
|
|
|
; SONDFX TRCOL1SND ;TRAIN CRASH SOUND
|
|
SONDFX TRCOL2SND ;TRAIN CRASH SOUND
|
|
|
|
LDI *+AR0(OCARBLK),AR3
|
|
LDI *+AR1(OCARBLK),AR5
|
|
|
|
LDF *+AR3(CARSPEED),R0
|
|
FLOAT 150,R1
|
|
CMPF R1,R0
|
|
BGT IS_FLYING
|
|
|
|
LDI 1,R0
|
|
STI R0,*+AR5(CAR_BUMP)
|
|
BU FLY1A
|
|
|
|
IS_FLYING
|
|
LDI @PLYCAR,AR0
|
|
LDI 1,R0
|
|
LSH O_PROC_B,R0 ;PROCESS BIT MASK IN OBJECT STRUCT
|
|
TSTB *+AR1(OFLAGS),R0 ;PROCESS ALREADY ACTIVE ?
|
|
BZ FLYCAR0A
|
|
|
|
LDI *+AR1(OPLINK),R0 ;YES, KILL OFF DRONE PROCESS
|
|
BZ FLYCAR0A
|
|
|
|
LDI R0,AR2
|
|
CALL PRC_KILL
|
|
|
|
LDI 0,R0
|
|
STI R0,*+AR1(OPLINK)
|
|
|
|
FLYCAR0A
|
|
LDI *+AR0(OCARBLK),AR3 ;GET PLAYER'S CAR
|
|
LDI *+AR1(OCARBLK),AR5 ;GET DRONE TRAIN BLOCK
|
|
LDI AR1,AR4
|
|
|
|
LDF 0.20,R0 ;ADD RANDOM ROTATION
|
|
CALL FRAND
|
|
ADDF *+AR5(CARVROT),R0
|
|
STF R0,*+AR5(CARVROT)
|
|
|
|
LDF -0.3,R0
|
|
CALL FRAND
|
|
ADDF -0.2,R0
|
|
MPYF 1.5,R0 ;SPEEDFUDGE FACTOR
|
|
MPYF *+AR3(CARSPEED),R0 ;GET CURRENT SPEED
|
|
CMPF -65,R0
|
|
LDFLT -65,R0 ;MAX VERTICAL VELOCITY
|
|
STF R0,*+AR1(OVELY) ;STUFF VERTICAL VELOCITY
|
|
|
|
LDI @FLYTRAINPI,AR2 ;GET SIGN FLY PROCESS
|
|
CALL PRC_CREATE_CHILD ;CREATE A CHILD PROCESS
|
|
|
|
STI AR0,*+AR1(OPLINK) ;SAVE LINK
|
|
|
|
LDI 1,R0
|
|
LSH O_PROC_B,R0 ;PROCESS BIT MASK IN OBJECT STRUCT
|
|
OR *+AR1(OFLAGS),R0 ;SET ATTACHED PROCESS FLAG
|
|
STI R0,*+AR1(OFLAGS)
|
|
|
|
LDI *+AR1(OLINK3),R0 ;ANY MORE CARS???
|
|
BZ FLYDONE ;NO
|
|
|
|
LDI R0,AR1
|
|
|
|
LDI *+AR1(OID),R0
|
|
CMPI DRONE_C|RAILROAD,R0
|
|
BZ IS_FLYING
|
|
|
|
*GET PLAYER CAR VELOCITY, SPIN
|
|
|
|
FLYDONE
|
|
LDF *+AR3(CARSPEED),R0 ;CUT SPEED OF PLAYER
|
|
MPYF 0.5,R0
|
|
STF R0,*+AR3(CARSPEED)
|
|
FLY1A
|
|
LDF *+AR3(CARVROT),R0
|
|
ADDF PI,R0
|
|
STF R0,*+AR3(CARVROT)
|
|
|
|
LDF *+AR3(CARSPEED),R0
|
|
CMPF 80,R0
|
|
LDFLT 80,R0
|
|
STF R0,*+AR3(CARSPEED)
|
|
|
|
LDI 1,R0
|
|
STI R0,*+AR3(CAR_SPIN)
|
|
|
|
LDF 12.0,R0
|
|
STF R0,*+AR3(CARSPRAD)
|
|
|
|
LDF 0.1,R0
|
|
STF R0,*+AR3(CARDROT)
|
|
|
|
FLYCARXA
|
|
POP AR5
|
|
POP AR4
|
|
POP AR3
|
|
POP AR1
|
|
POP AR0
|
|
RETS
|
|
|
|
END_LONGROUT
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
FLYTRAINPI .word FLYTRAINP
|
|
|
|
*
|
|
*FLYING CAR PROCESS
|
|
*AR4=DRONE CAR OBJECT
|
|
*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
|
|
*
|
|
FLYTRAINP:
|
|
|
|
*GET YOUR RADIANS
|
|
|
|
LDF 0.2,R0
|
|
CALL SFRAND
|
|
STF R0,*+AR7(PDATA) ;Z RADIANS
|
|
|
|
LDF 0.05,R0
|
|
CALL SFRAND
|
|
STF R0,*+AR7(PDATA+1) ;Y RADIANS
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR7(PDATA+2) ;X RADIANS (unused)
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR7(PDATA+3) ;Z RADIAN TOTAL
|
|
STF R0,*+AR7(PDATA+5) ;X RADIAN TOTAL
|
|
LDF *+AR5(CARYROT),R0 ;GET CAR Y ROT
|
|
STF R0,*+AR7(PDATA+4)
|
|
|
|
FLYCARP0A
|
|
LDI *+AR4(ODIST),R0 ;OUT OF RANGE ??
|
|
CMPI -6000,R0
|
|
BLT RROAD_DIE ;END THIS FARCE
|
|
|
|
LDI *+AR4(OCARBLK),R3 ;GET CAR DATA AREA
|
|
CALL ROADSCAN
|
|
LDI *+AR4(OCARBLK),AR5 ;GET CAR DATA AREA
|
|
|
|
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)
|
|
|
|
CALL GETFLYMAT_TRAIN ;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
|
|
|
|
FLOAT @NFRAMES,R2
|
|
MPYF 2,R2 ;FRAME ADJUSTED GRAVITY
|
|
ADDF *+AR4(OVELY),R2
|
|
STF R2,*+AR4(OVELY)
|
|
|
|
FLOAT 300,R1 ;GOING DOWN TOO MUCH?
|
|
CMPF R1,R2
|
|
BGT RROAD_DIE ;ABORT THE DUDE...
|
|
|
|
CALL GETTRAK
|
|
|
|
|
|
LDF *+AR4(OVELY),R2 ;GET VERTICAL VELOCITY
|
|
BN FLYCARSLPA ;WERE GOING UP IGNORE IT
|
|
|
|
CALL BOXSCAN ;KEEP FALLING!!!
|
|
BNC FLYCARSLPA
|
|
|
|
*WERE OVER THE ROAD
|
|
|
|
FLYCROADA
|
|
LDF R0,R0
|
|
BGT FLYCARSLPA ;WERE ABOVE GROUND
|
|
|
|
*WE HIT THE GROUND DUDES
|
|
|
|
ADDF *+AR4(OPOSY),R0 ;SET HIM ON THE GROUND
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
LDF *+AR4(OVELY),R2 ;GET VERTICAL VELOCITY
|
|
|
|
CMPF 35,R2 ;CHECK FOR MINIMUM
|
|
BLT FLYCARSTOP0A ;TIME TO STOP
|
|
|
|
FLYCROAD1A
|
|
MPYF -0.5,R2
|
|
STF R2,*+AR4(OVELY)
|
|
|
|
LDF *+AR5(CARSPEED),R0 ;CUT SPEED IN HALF
|
|
MPYF 0.5,R0
|
|
STF R0,*+AR5(CARSPEED)
|
|
|
|
LDF *+AR7(PDATA),R0 ;CUT DOWN SPIN
|
|
MPYF 0.5,R0
|
|
STF R0,*+AR7(PDATA)
|
|
|
|
LDF *+AR7(PDATA+1),R0
|
|
MPYF 0.5,R0
|
|
STF R0,*+AR7(PDATA+1)
|
|
|
|
*MAKE BOUNCE SOUND
|
|
LDI @SCOLLTABI,AR2 ;RANDOM COLLISION CRUNCH
|
|
LDI 3,R0
|
|
CALL DRONESND
|
|
FLYCARSLPA
|
|
SLEEP 1
|
|
B FLYCARP0A
|
|
|
|
|
|
*ROTATE TO QUIESCENT STATE
|
|
*
|
|
FLYCARSTOP0A
|
|
FLYCARSTOPA
|
|
LDI *+AR4(ODIST),R0 ;OUT OF RANGE ??
|
|
CMPI -6000,R0
|
|
BLT RROAD_DIE ;END THIS FARCE
|
|
|
|
FLOAT 500,R0
|
|
STF R0,*+AR4(OVELY) ;FORCE ONTO GROUND
|
|
|
|
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)
|
|
|
|
LDF *+AR5(CARDROT),R0
|
|
STF R0,*+AR7(PDATA+1) ;GET Y SPIN
|
|
|
|
LDI *+AR4(OCARBLK),R3 ;GET CAR DATA AREA
|
|
CALL ROADSCAN
|
|
LDI *+AR4(OCARBLK),AR5 ;GET CAR DATA AREA
|
|
|
|
LDI @NFRAMES,RC ;ADJUST MATRIX FOR FRAME COUNT
|
|
SUBI 1,RC
|
|
|
|
RPTB FLYCSTLA
|
|
|
|
LDF *+AR4(OVELX),R0
|
|
MPYF 0.98,R0 ;DECAY VELOCITY
|
|
STF R0,*+AR4(OVELX)
|
|
ADDF *+AR4(OPOSX),R0
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
LDF *+AR4(OVELY),R0
|
|
ADDF *+AR4(OPOSY),R0
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
LDF *+AR4(OVELZ),R0
|
|
MPYF 0.98,R0 ;DECAY VELOCITY
|
|
STF R0,*+AR4(OVELZ)
|
|
ADDF *+AR4(OPOSZ),R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
LDF *+AR7(PDATA),R0 ;ACCUMULATE X RADIANS
|
|
MPYF 0.96,R0 ;DAMP IT
|
|
STF R0,*+AR7(PDATA) ;CUT DOWN ROCK
|
|
|
|
ADDF *+AR7(PDATA+3),R0
|
|
STF R0,*+AR7(PDATA+3)
|
|
|
|
LDF *+AR7(PDATA+1),R0 ;ACCUMULATE Y RADIANS
|
|
MPYF 0.98,R0 ;DAMP IT
|
|
STF R0,*+AR7(PDATA+1) ;CUT DOWN ROCK
|
|
STF R0,*+AR5(CARDROT) ;STORE IN CAR STRUCTURE
|
|
|
|
ADDF *+AR7(PDATA+4),R0
|
|
STF R0,*+AR7(PDATA+4)
|
|
|
|
LDF *+AR7(PDATA+3),R2 ;CHECK TOTAL X RADIANS
|
|
CALL NORMITS
|
|
ABSF R2,R3
|
|
|
|
LDF *+AR5(CARSPEED),R0 ;DECAY SPEED
|
|
MPYF 0.98,R0
|
|
STF R0,*+AR5(CARSPEED)
|
|
|
|
*CHECK FOR DONE...
|
|
|
|
CMPF 10,R0 ;SPEED DECAYED?
|
|
BGT FLYCSTP0A ;NO, KEEP GOING...
|
|
|
|
ABSF *+AR5(CARDROT),R0 ;GET ROTATE
|
|
|
|
ABSF *+AR7(PDATA),R1 ;ADD IN ROCK
|
|
ADDF R0,R1
|
|
MPYF 10,R1 ;GET IN RANGE
|
|
CMPF 0.02,R1 ;PETERED OUT?
|
|
BGT FLYCSTP0A ;NO, KEEP GOING
|
|
|
|
CMPF 0.2,R3 ;RIGHT SIDE UP?
|
|
BGT FLYCSTP00A ;NOPE...
|
|
|
|
LDF 0,R3 ;STRAIGHTEN HIM UP!!!
|
|
STF R3,*+AR7(PDATA+3)
|
|
LDI 2,R0
|
|
B FLYCCCA ;YES, TIME TO STOP
|
|
|
|
FLYCSTP00A
|
|
CMPF 2.95,R3 ;UPSIDE DOWN?
|
|
BLT FLYCSTP0A ;NOPE
|
|
FLYCSTPA
|
|
LDI 1,R0 ;WERE DONE DUDES...
|
|
B FLYCCCA
|
|
|
|
*ACCELERATE X ROTATION
|
|
|
|
FLYCSTP0A
|
|
LDF R2,R2
|
|
BN FLYCSTP1A
|
|
|
|
CMPF 1.57,R2
|
|
B FLYCSTP2A
|
|
|
|
FLYCSTP1A
|
|
CMPF -1.57,R2
|
|
FLYCSTP2A
|
|
LDFLT -0.01,R0
|
|
LDFGE 0.01,R0
|
|
|
|
MPYF 0.4,R0
|
|
ADDF *+AR7(PDATA),R0
|
|
LDF *+AR7(PDATA),R1
|
|
XOR R0,R1,R2 ;CHECK FOR SIGN CHANGE- MAKE SOUND
|
|
BNN FLYCSTLA ;NO SOUND
|
|
ABSF *+AR7(PDATA+3),R2 ;CHECK IF AMPLITUDE BIG ENOUGH
|
|
CALL NORMITS
|
|
ABSF R2
|
|
CMPF 0.08,R2
|
|
BLT FLYCSTLA ;TOO SMALL OF A ROCK
|
|
CMPF 3.06,R2
|
|
BGT FLYCSTLA ;TOO SMALL OF A UPSIDE DOWN ROCK
|
|
|
|
LDI BOTTOMOUT,AR2 ;MAKE BOTTOMOUT SOUND
|
|
PUSHF R0
|
|
CALL DRONESND1
|
|
POPF R0
|
|
|
|
FLYCSTLA STF R0,*+AR7(PDATA) ;ACCELERATE ROTATION
|
|
|
|
|
|
LDI 0,R0 ;DONE FLAG
|
|
FLYCCCA
|
|
PUSH R0
|
|
CALL GETTRAK
|
|
; CALL DRONINBZ ;CHECK BOUNDS
|
|
|
|
CALL GETFLYMAT_TRAIN
|
|
|
|
CALL BOXSCAN ;KEEP FALLING!!!
|
|
POP R1 ;CLEAN STACK
|
|
BNC FLYCARSTPA
|
|
|
|
ADDF *+AR4(OPOSY),R0 ;SET HIM ON THE GROUND
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
LDI R1,R1 ;DONE
|
|
BNE FLYCARSTPA ;YESSAH
|
|
|
|
SLEEP 1
|
|
B FLYCARSTOPA
|
|
|
|
FLYCARSTPA
|
|
CMPI 2,R1
|
|
BZ DEADCARA ;RIGHT SIDE UP CARCASS
|
|
|
|
*
|
|
*CAR IS UPSIDE DOWN
|
|
*
|
|
LDI *+AR4(OID),R0
|
|
ANDN TYPE_M,R0
|
|
OR DEAD_VEH_T,R0
|
|
|
|
LDF 0,R0 ;CLEAR OUT THE SPEED
|
|
STF R0,*+AR5(CARSPEED)
|
|
|
|
*WAIT FOR OFFSCREEN
|
|
|
|
FLYCARWTA
|
|
SLEEP 1
|
|
LDI *+AR4(ODIST),R0 ;OUT OF RANGE?
|
|
CMPI -6000,R0
|
|
BLT RROAD_DIE ;YES CLEAN IT UP...
|
|
LDF *+AR5(CARSPEED),R0 ;ARE WE HIT???
|
|
BZ FLYCARWTA ;NO, JUST WAIT
|
|
*
|
|
*UPSIDE DOWN CAR IS HIT
|
|
*
|
|
LDF 0.1,R0 ;ROCK HIM A LITTLE
|
|
CALL SFRAND
|
|
STF R0,*+AR7(PDATA) ;X RADIANS RATE
|
|
B FLYCARSTOPA ;GO ROCK AND ROLL
|
|
|
|
*CLEAN UP THE MESS...
|
|
*
|
|
RROAD_DIE:
|
|
CALL FREE_DRONE
|
|
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
LDI *+AR4(OFLAGS),R1
|
|
ANDN R0,R1
|
|
STI R1,*+AR4(OFLAGS)
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_DELETE
|
|
|
|
LDI AR5,AR2
|
|
CALL DELCAR
|
|
DIE
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CAR IS RIGHT SIDE UP
|
|
*
|
|
DEADCARA:
|
|
LDI *+AR4(OID),R0
|
|
ANDN TYPE_M,R0
|
|
OR DEAD_VEH_T,R0
|
|
STI R0,*+AR4(OID)
|
|
STI R0,*+AR5(CAR_ID)
|
|
STI R0,*+AR7(PID)
|
|
|
|
CLRF R0
|
|
STF R0,*+AR5(CARTHROTTLE)
|
|
STF R0,*+AR5(CARDROT)
|
|
STF R0,*+AR5(CARSPEED)
|
|
LDF 1,R0
|
|
STF R0,*+AR5(CARBRAKE)
|
|
|
|
LDF *+AR7(PDATA+4),R0 ;GET Y ROTATION ORIENTATION
|
|
STF R0,*+AR5(CARVROT)
|
|
STF R0,*+AR5(CARYROT)
|
|
|
|
LDI 0,R0
|
|
STI R0,*+AR5(CAR_SPIN) ;CLEAR SPIN
|
|
DEADLPA
|
|
LDI *+AR4(ODIST),R0 ;DIE OFF WHEN OFFSCREEN
|
|
CMPI -6000,R0
|
|
BLT RROAD_DIE
|
|
|
|
|
|
LDF 0,R2 ;NO STEERING
|
|
CALL DRONEGO
|
|
CALL GETTRAK
|
|
DEADSLPA
|
|
SLEEP 1
|
|
B DEADLPA
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*GET MATRIX FOR FLYING CAR
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* PDATA+3,4,5 = Z,Y,XRAD ;PDATA+3,4,5 = X,Y,ZRAD
|
|
* AR4 OBJECT
|
|
* AR7 PROCESS
|
|
*
|
|
*TRASHES
|
|
* R2,R3,AR2
|
|
*
|
|
GETFLYMAT_TRAIN:
|
|
|
|
LONGROUT
|
|
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
LDF *+AR7(PDATA+3),R2
|
|
CALL FIND_ZMATRIX
|
|
|
|
LDI @MATRIXAI,AR2
|
|
LDF *+AR7(PDATA+4),R2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
LDI R2,R3
|
|
BR CONCATMAT ;FORMULATE COMBINED MATRIX
|
|
|
|
END_LONGROUT
|
|
*----------------------------------------------------------------------------
|
|
.END
|