cruisin-usa/RROAD.ASM

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