1674 lines
29 KiB
NASM
Executable File
1674 lines
29 KiB
NASM
Executable File
.FILE "CHOPPER.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*CHOPPER IN THE SKY
|
|
*
|
|
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
|
|
*ALL RIGHTS RESERVED
|
|
*
|
|
|
|
.include MACS.EQU
|
|
.include MPROC.EQU
|
|
.include OBJ.EQU
|
|
.include VUNIT.EQU
|
|
.include CMOS.EQU
|
|
.include SYSID.EQU
|
|
.include SYS.EQU
|
|
.include GLOBALS.EQU
|
|
.include SNDTAB.EQU
|
|
.include PALL.EQU
|
|
.include OBJECTS.EQU
|
|
.include TEXT.EQU
|
|
.include DELTA.EQU
|
|
|
|
.bss HELI_ABORT,1 ;P abort chopper routine?
|
|
|
|
*
|
|
* !!!!NO JSRPing!!!!
|
|
*
|
|
|
|
*LOCALS (AFTER DELTA EQUATES)
|
|
CD_ANIPROC .set PDATA+18
|
|
CD_MODE .set PDATA+19
|
|
CD_ACC .set PDATA+20 ;acceleration
|
|
CD_SPEED .set PDATA+21 ;current speed
|
|
CD_BOMBTIK .set PDATA+22 ;bomb pause
|
|
CD_TSPEED .set PDATA+23 ;true speed (x/y/z)
|
|
CD_TSPEED_OLD .set PDATA+24 ;old true speed (x/y/z)
|
|
CD_FLYTDIR .set PDATA+25 ;breakaway theta
|
|
CD_DHEIGHT .set PDATA+26 ;FL desired height value
|
|
CD_ODHEIGHT .set PDATA+27 ;FL old desired height value
|
|
CD_CLOSEROAD .set PDATA+28 ;UD closest road object
|
|
CD_AHEADP .set PDATA+29 ;UD flag ahead of player?
|
|
CD_PASS_COUNT .set PDATA+30
|
|
CD_BOMB_COUNT .set PDATA+31
|
|
CD_MAX_PASSES .set PDATA+32
|
|
CD_MAX_BOMBS .set PDATA+33
|
|
CD_LASTPASS .set PDATA+34 ;P
|
|
CD_DOATTACK .set PDATA+35 ;P
|
|
*NO MORE UNLESS NOT JSRPing
|
|
|
|
*CHOPPER MODE
|
|
CM_CU .set 1 ;CATCH UP
|
|
CM_DB .set 2 ;DROP BOMBS
|
|
CM_FA .set 3 ;FLY AWAY
|
|
|
|
CRADZ .set OUSR1
|
|
|
|
MAX_SPEED .set 667 ;about 180 mph
|
|
|
|
*----------------------------------------------------------------------------
|
|
CHOPPERDYNA
|
|
.word 1 ;#OF DYNAS-1
|
|
|
|
.float 0,-206,14 ;blades
|
|
.word 3 ;VERTS-1
|
|
.word 1 ;DYNAFLAG
|
|
|
|
.float 0,0,0 ;main body
|
|
.word 94 ;VERTS-1
|
|
.word 1 ;DYNAFLAG
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*---------------------------------------------------------------------------
|
|
*
|
|
*go straight for the plyrs car
|
|
*
|
|
*(already close by)
|
|
*branched to from oncoming buzz
|
|
*
|
|
*
|
|
DIRECT_ATTACK:
|
|
|
|
;
|
|
;DEBUG only attack player when he is in the first position
|
|
;
|
|
LDI @POSITION,R0
|
|
CMPI 1,R0
|
|
BNE FLYAWAY
|
|
;
|
|
;
|
|
|
|
|
|
CALL DIST_TO_PLYR
|
|
LDF *+AR7(DELTA_PLYRDIST),R1
|
|
STF R0,*+AR7(DELTA_PLYRDIST)
|
|
STF R1,*+AR7(DELTA_OPLYRDIST)
|
|
|
|
|
|
CALL HELI_SND
|
|
|
|
;see if we should track the next piece
|
|
CHECK_DIST28:
|
|
LDI *+AR7(DELTA_LAST_OID),R0 ;CHECK TO SEE IF IT IS IN THE RANGE
|
|
RS 8,R0
|
|
LDI @SECTIONIDX,R1
|
|
SUBPI @DGROUP_COUNT,R1
|
|
CMPI R1,R0
|
|
BLE FLYAWAY ;CHOPPER_DIE
|
|
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDI *+AR2(OBLINK4),R0
|
|
BZ FLYAWAY ;CHOPPER_DIE
|
|
|
|
LDI @PLYCBLK,AR2
|
|
LDF *+AR2(CARDIST2CNTR),R0
|
|
STF R0,*+AR7(DELTA_XLANE)
|
|
|
|
CALL GET_TRACK_POS_RVS_XLANE ;CHECK IF WE SHOULD ADVANCE
|
|
FLOAT 5000,R1 ;TO THE NEXT ROADPIECE
|
|
CMPF R1,R0
|
|
BGT THIS_PIECE28
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDI *+AR2(OBLINK4),R0
|
|
STI R0,*+AR7(DELTA_TPIECE)
|
|
LDI R0,AR0
|
|
LDI *+AR0(OUSR1),R0
|
|
STI R0,*+AR7(DELTA_LAST_OID) ;SAVE THE LAST KNOWN VALID OID
|
|
BU CHECK_DIST28
|
|
THIS_PIECE28
|
|
|
|
|
|
FLOATP @NFRAMES,R1
|
|
MPYF *+AR7(CD_TSPEED),R1
|
|
LDFLE 30,R1 ;if 0 or less assume 30 voxel per frame
|
|
CALL DIV_F ;R0/R1 (distance to piece/speed) -> # frames to achieve
|
|
FIX R0,R7
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDP @_VECTORA ;lane position
|
|
LDF *+AR2(OPOSX),R2 ;X
|
|
SUBF *+AR4(OPOSX),R2
|
|
ADDF @_VECTORA+X,R2
|
|
LDF *+AR2(OPOSZ),R3 ;Z
|
|
SUBF *+AR4(OPOSZ),R3
|
|
ADDF @_VECTORA+Z,R3
|
|
SETDP
|
|
|
|
|
|
|
|
;find the theta delta to this position
|
|
;
|
|
CALL ARCTANF ;-> R0
|
|
SUBF HALFPI,R0 ;R0 DESIRED THETA (float)
|
|
|
|
LDF *+AR4(ORADY),R2 ;R2 CURRENT THETA
|
|
CALL GETTHETADIFF ;->R0 THETA DELTA (float)
|
|
FLOAT R7,R1 ;theta / number of turns to achieve
|
|
SUBF 1,R1
|
|
BLE NODIV8
|
|
CALL DIV_F ;-> R0
|
|
NODIV8
|
|
CMPF 0.3926,R0 ;PI/8 (maximum turning radius)
|
|
LDFGT 0.3926,R0
|
|
CMPF -0.3926,R0
|
|
LDFLT -0.3926,R0
|
|
STF R0,*+AR7(DELTA_RADYDELTA)
|
|
|
|
|
|
PUSH AR4
|
|
ADDI OPOSX,AR4
|
|
CALL CAMSCAN
|
|
POP AR4
|
|
BNC LLK28
|
|
|
|
NEGF R0
|
|
FLOAT -300,R1
|
|
SUBF R1,R0
|
|
NEGF R0
|
|
ADDF *+AR4(OPOSY),R0
|
|
STF R0,*+AR7(CD_DHEIGHT)
|
|
LLK28
|
|
|
|
LDF *+AR7(CD_SPEED),R0
|
|
ADDF *+AR7(CD_ACC),R0
|
|
FLOAT MAX_SPEED,R1
|
|
CMPF R1,R0
|
|
LDFGT R1,R0
|
|
STF R0,*+AR7(CD_SPEED)
|
|
|
|
LDF *+AR7(DELTA_RADYDELTA),R2
|
|
LDF *+AR7(CD_SPEED),R3
|
|
CALL FSL_MOVE
|
|
|
|
SLEEP 1
|
|
BU DIRECT_ATTACK
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*Take the helicopter, and buzz (@ 200 MPH) right over the players car
|
|
*exit when start of the world is hit
|
|
*
|
|
*
|
|
*
|
|
ONCOMMING_BUZZ:
|
|
LDF 0,R0
|
|
STF R0,*+AR4(ORADX)
|
|
STF R0,*+AR4(ORADY)
|
|
STF R0,*+AR4(CRADZ)
|
|
|
|
STF R0,*+AR4(OVELX)
|
|
STF R0,*+AR4(OVELY)
|
|
STF R0,*+AR4(OVELZ)
|
|
|
|
|
|
;
|
|
;find where player is
|
|
|
|
LDI @PLYCBLK,AR2
|
|
LDF *+AR2(CARDIST2CNTR),R0
|
|
STF R0,*+AR7(DELTA_XLANE)
|
|
|
|
LDI @DYNALIST_END,AR2
|
|
LDI *+AR2(OBLINK4),AR2
|
|
LDI *+AR2(OBLINK4),AR2
|
|
STI AR2,*+AR7(DELTA_TPIECE)
|
|
LDI *+AR2(OUSR1),R0
|
|
STI R0,*+AR7(DELTA_LAST_OID)
|
|
CALL SUB_FUNCTION_RVS_XLANE ;MATRIXA,VECTORA,R2
|
|
|
|
LDP @_VECTORA
|
|
LDF *+AR2(OPOSX),R0
|
|
ADDF @_VECTORA+X,R0
|
|
STF R0,*+AR4(OPOSX)
|
|
LDF *+AR2(OPOSY),R0
|
|
FLOAT 1000,R1
|
|
SUBF R1,R0
|
|
ADDF @_VECTORA+Y,R0
|
|
STF R0,*+AR4(OPOSY)
|
|
LDF *+AR2(OPOSZ),R0
|
|
ADDF @_VECTORA+Z,R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
SETDP
|
|
|
|
|
|
;initialize Ytheta to the intentional direction
|
|
STF R2,*+AR4(ORADY)
|
|
STF R2,*+AR7(DELTA_RADYDELTA)
|
|
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
|
|
ONBUZZ_L
|
|
|
|
CALL DIST_TO_PLYR
|
|
LDF *+AR7(DELTA_PLYRDIST),R1
|
|
STF R0,*+AR7(DELTA_PLYRDIST)
|
|
STF R1,*+AR7(DELTA_OPLYRDIST)
|
|
|
|
|
|
FLOAT 22000,R2
|
|
CMPF R2,R0
|
|
BLE FLYAWAY
|
|
|
|
CALL HELI_SND
|
|
|
|
|
|
;see if we should track the next piece
|
|
CHECK_DIST2:
|
|
LDI *+AR7(DELTA_LAST_OID),R0 ;CHECK TO SEE IF IT IS IN THE RANGE
|
|
RS 8,R0
|
|
LDI @SECTIONIDX,R1
|
|
SUBPI @DGROUP_COUNT,R1
|
|
CMPI R1,R0
|
|
BLE CHOPPER_DIE
|
|
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDI *+AR2(OBLINK4),R0
|
|
BZ CHOPPER_DIE
|
|
|
|
LDI @PLYCBLK,AR2
|
|
LDF *+AR2(CARDIST2CNTR),R0
|
|
STF R0,*+AR7(DELTA_XLANE)
|
|
|
|
CALL GET_TRACK_POS_RVS_XLANE ;CHECK IF WE SHOULD ADVANCE
|
|
FLOAT 5000,R1 ;TO THE NEXT ROADPIECE
|
|
CMPF R1,R0
|
|
BGT THIS_PIECE2
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDI *+AR2(OBLINK4),R0
|
|
STI R0,*+AR7(DELTA_TPIECE)
|
|
LDI R0,AR0
|
|
LDI *+AR0(OUSR1),R0
|
|
STI R0,*+AR7(DELTA_LAST_OID) ;SAVE THE LAST KNOWN VALID OID
|
|
BU CHECK_DIST2
|
|
THIS_PIECE2
|
|
|
|
|
|
FLOATP @NFRAMES,R1
|
|
MPYF *+AR7(CD_TSPEED),R1
|
|
LDFLE 30,R1 ;if 0 or less assume 30 voxel per frame
|
|
CALL DIV_F ;R0/R1 (distance to piece/speed) -> # frames to achieve
|
|
FIX R0,R7
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDP @_VECTORA ;lane position
|
|
LDF *+AR2(OPOSX),R2 ;X
|
|
SUBF *+AR4(OPOSX),R2
|
|
ADDF @_VECTORA+X,R2
|
|
LDF *+AR2(OPOSZ),R3 ;Z
|
|
SUBF *+AR4(OPOSZ),R3
|
|
ADDF @_VECTORA+Z,R3
|
|
SETDP
|
|
|
|
|
|
|
|
;find the theta delta to this position
|
|
;
|
|
CALL ARCTANF ;-> R0
|
|
SUBF HALFPI,R0 ;R0 DESIRED THETA (float)
|
|
|
|
LDF *+AR4(ORADY),R2 ;R2 CURRENT THETA
|
|
CALL GETTHETADIFF ;->R0 THETA DELTA (float)
|
|
FLOAT R7,R1 ;theta / number of turns to achieve
|
|
SUBF 1,R1
|
|
BLE NODIV
|
|
CALL DIV_F ;-> R0
|
|
NODIV
|
|
CMPF 0.3926,R0 ;PI/8 (maximum turning radius)
|
|
LDFGT 0.3926,R0
|
|
CMPF -0.3926,R0
|
|
LDFLT -0.3926,R0
|
|
STF R0,*+AR7(DELTA_RADYDELTA)
|
|
|
|
|
|
|
|
PUSH AR4
|
|
ADDI OPOSX,AR4
|
|
CALL CAMSCAN
|
|
POP AR4
|
|
BNC LLK2
|
|
|
|
NEGF R0
|
|
FLOAT -1300,R1
|
|
SUBF R1,R0
|
|
NEGF R0
|
|
ADDF *+AR4(OPOSY),R0
|
|
STF R0,*+AR7(CD_DHEIGHT)
|
|
LLK2
|
|
|
|
LDF *+AR7(CD_SPEED),R0
|
|
ADDF *+AR7(CD_ACC),R0
|
|
FLOAT MAX_SPEED,R1
|
|
CMPF R1,R0
|
|
LDFGT R1,R0
|
|
STF R0,*+AR7(CD_SPEED)
|
|
|
|
LDF *+AR7(DELTA_RADYDELTA),R2
|
|
LDF *+AR7(CD_SPEED),R3
|
|
CALL FSL_MOVE
|
|
|
|
SLEEP 1
|
|
BU ONBUZZ_L
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
;
|
|
;*----------------------------------------------------------------------------
|
|
;*
|
|
;*
|
|
;*
|
|
;*
|
|
;CIRCLE_BUZZ:
|
|
; LDF 0,R0
|
|
; STF R0,*+AR4(ORADX)
|
|
; STF R0,*+AR4(ORADY)
|
|
; STF R0,*+AR4(CRADZ)
|
|
;
|
|
; STF R0,*+AR4(OVELX)
|
|
; STF R0,*+AR4(OVELY)
|
|
; STF R0,*+AR4(OVELZ)
|
|
;
|
|
;
|
|
; ;
|
|
; ;find where player is
|
|
;
|
|
; LDI @PLYCBLK,AR2
|
|
; NEGF *+AR2(CARDIST2CNTR),R0
|
|
; STF R0,*+AR7(DELTA_XLANE)
|
|
; LDI *+AR2(CARTRAK),AR2
|
|
; LDI *+AR2(OBLINK4),AR2
|
|
;
|
|
; STI AR2,*+AR7(DELTA_TPIECE)
|
|
; LDI *+AR2(OUSR1),R0
|
|
; STI R0,*+AR7(DELTA_LAST_OID)
|
|
; CALL DELTA_SUB_FUNCTION ;MATRIXA,VECTORA,R2
|
|
;
|
|
; LDP @_VECTORA
|
|
; LDF *+AR2(OPOSX),R0
|
|
; ADDF @_VECTORA+X,R0
|
|
; STF R0,*+AR4(OPOSX)
|
|
; LDF *+AR2(OPOSY),R0
|
|
; FLOAT 1000,R1
|
|
; SUBF R1,R0
|
|
; ADDF @_VECTORA+Y,R0
|
|
; STF R0,*+AR4(OPOSY)
|
|
; LDF *+AR2(OPOSZ),R0
|
|
; ADDF @_VECTORA+Z,R0
|
|
; STF R0,*+AR4(OPOSZ)
|
|
; SETDP
|
|
;
|
|
;
|
|
; ;initialize Ytheta to the intentional direction
|
|
; STF R2,*+AR4(ORADY)
|
|
; STF R2,*+AR7(DELTA_RADYDELTA)
|
|
;
|
|
; LDI AR4,AR2
|
|
; ADDI OMATRIX,AR2
|
|
; CALL FIND_YMATRIX
|
|
;
|
|
;
|
|
;CIRCLE_JOIN
|
|
; CLRF R6
|
|
; LDI @CIRCLE_SI,AR5
|
|
;
|
|
;CIRCL_L
|
|
; LDI @PLYCBLK,AR0
|
|
; LDF *+AR0(CARSPEED),R0
|
|
; CMPF 40,R0
|
|
; BLT ISOK55
|
|
; RETP
|
|
;ISOK55
|
|
;
|
|
;
|
|
; CALL DIST_TO_PLYR
|
|
; LDF *+AR7(DELTA_PLYRDIST),R1
|
|
; STF R0,*+AR7(DELTA_PLYRDIST)
|
|
; STF R1,*+AR7(DELTA_OPLYRDIST)
|
|
;
|
|
; CALL HELI_SND
|
|
;
|
|
; .data
|
|
;CIRCLE_SI .word CIRCLE_S
|
|
;CIRCLE_S ; X,Z
|
|
; .float 4000,2200
|
|
; .float 2500,5000
|
|
; .float 0,9000
|
|
; .float -2500,5000
|
|
; .float -4000,2200
|
|
; .float -1
|
|
; .text
|
|
;
|
|
;
|
|
;JKKU
|
|
; LDI @PLYCBLK,AR2
|
|
; LDI *+AR2(CARTRAK),AR2
|
|
; LDI *+AR2(OLINK4),AR0
|
|
; LDF *+AR0(OPOSX),R2
|
|
; SUBF *+AR2(OPOSX),R2
|
|
; LDF *+AR0(OPOSZ),R3
|
|
; SUBF *+AR2(OPOSZ),R3
|
|
; CALL ARCTANF
|
|
; SUBF HALFPI,R0
|
|
; LDF R0,R2 ;FIND THETA
|
|
; LDI @MATRIXAI,AR2
|
|
; CALL FIND_YMATRIX
|
|
;
|
|
;
|
|
; CALL CLR_VECTORA
|
|
; LDF *AR5,R4
|
|
; LDF *+AR5(1),R5
|
|
; STF R4,*+AR2(X)
|
|
; STF R5,*+AR2(Z)
|
|
;
|
|
;
|
|
; LDI @MATRIXAI,R2
|
|
; LDI AR2,R3
|
|
; CALL MATRIX_MUL
|
|
;
|
|
;
|
|
; LDI @PLYCAR,AR3
|
|
; LDF *+AR3(OPOSX),R4
|
|
; ADDF *+AR2(X),R4
|
|
; LDF *+AR3(OPOSZ),R5
|
|
; ADDF *+AR2(Z),R5 ;R4,R5 contains X/Z position
|
|
;
|
|
;
|
|
; LDF *+AR4(OPOSX),R2
|
|
; SUBF R4,R2
|
|
; MPYF R2,R2
|
|
; LDF *+AR4(OPOSZ),R1
|
|
; SUBF R5,R1
|
|
; ADDF R1,R2
|
|
; CALL SQRT ;R0 <- distance to new position
|
|
;
|
|
;
|
|
; FLOAT 2000,R1
|
|
; CMPF R1,R0
|
|
; BGT KKK
|
|
; LDF *++AR5(2),R0
|
|
; CMPF -1,R0
|
|
; BNE JKKU
|
|
; LDI @CIRCLE_SI,AR5
|
|
; BU JKKU
|
|
;KKK
|
|
;
|
|
;
|
|
;
|
|
; PUSHF R4
|
|
; PUSHF R5
|
|
;
|
|
; FLOAT @NFRAMES,R1
|
|
; MPYF *+AR7(CD_TSPEED),R1
|
|
; LDFLE 30,R1 ;if 0 or less assume 30 voxel per frame
|
|
; CALL DIV_F ;R0/R1 (distance to piece/speed) -> # frames to achieve
|
|
; FIX R0,R7
|
|
;
|
|
; POPF R5
|
|
; POPF R4
|
|
;
|
|
; LDF R4,R2 ;X
|
|
; SUBF *+AR4(OPOSX),R2
|
|
; LDF R5,R3 ;Z
|
|
; SUBF *+AR4(OPOSZ),R3
|
|
;
|
|
;
|
|
;
|
|
; ;find the theta delta to this position
|
|
; ;
|
|
; CALL ARCTANF ;-> R0
|
|
; SUBF HALFPI,R0 ;R0 DESIRED THETA (float)
|
|
;
|
|
; LDF *+AR4(ORADY),R2 ;R2 CURRENT THETA
|
|
; CALL GETTHETADIFF ;->R0 THETA DELTA (float)
|
|
; FLOAT R7,R1 ;theta / number of turns to achieve
|
|
; SUBF 1,R1
|
|
; BLE NODIV3
|
|
; CALL DIV_F ;-> R0
|
|
;NODIV3
|
|
; CMPF 0.06926,R0 ;PI/8 (maximum turning radius)
|
|
; LDFGT 0.06926,R0
|
|
; CMPF -0.06926,R0
|
|
; LDFLT -0.06926,R0
|
|
; STF R0,*+AR7(DELTA_RADYDELTA)
|
|
;
|
|
;
|
|
; PUSH AR4
|
|
; ADDI OPOSX,AR4
|
|
; CALL CAMSCAN
|
|
; POP AR4
|
|
; BNC LLK23
|
|
;
|
|
; NEGF R0
|
|
; FLOAT -1300,R1
|
|
; SUBF R1,R0
|
|
; NEGF R0
|
|
; ADDF *+AR4(OPOSY),R0
|
|
; STF R0,*+AR7(CD_DHEIGHT)
|
|
;LLK23
|
|
;
|
|
;
|
|
; LDF *+AR7(CD_SPEED),R3
|
|
; ADDF *+AR7(CD_ACC),R3
|
|
;
|
|
; FLOAT 300,R1 ;MAX speed
|
|
;
|
|
; CMPF R1,R3
|
|
; LDFGT R1,R3
|
|
; STF R3,*+AR7(CD_SPEED)
|
|
;
|
|
;
|
|
;
|
|
; LDF *+AR7(DELTA_RADYDELTA),R2
|
|
; CALL FSL_MOVE
|
|
;
|
|
;
|
|
; SLEEP 1
|
|
; BU CIRCL_L
|
|
;*----------------------------------------------------------------------------
|
|
;
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CHOPPER SEQUENCE:
|
|
*
|
|
*
|
|
* come from behind and overhead and zoom ahead of player
|
|
* rotate tilted forward (moving with player)
|
|
* radio noise and such
|
|
* zoom off to left or right
|
|
* pull obj and sleep for awhile
|
|
* reinsert objects and redo sequence
|
|
*
|
|
*
|
|
*
|
|
*
|
|
CHOPPER:
|
|
;BEGIN INITIALIZATION CODE
|
|
;
|
|
LDI @(_plyr1+PLY_PROC),AR2 ;FIRST SETUP THAT WE FOLLOW THE PLAYERS PROC
|
|
CALL PRC_FOLLOW
|
|
|
|
CALL OBJ_GET
|
|
BC SUICIDE
|
|
|
|
LDI AR0,AR4
|
|
LDIL helli,R0
|
|
STI R0,*+AR4(OROMDATA)
|
|
CLRF R0
|
|
STF R0,*+AR4(OPOSX)
|
|
FLOAT -20,R0
|
|
STF R0,*+AR4(OPOSY)
|
|
FLOAT 3500,R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_INSERT
|
|
|
|
CALL _CARV0
|
|
LDI *+AR4(OCARBLK),AR5
|
|
|
|
|
|
CALL SETDYNAOBJ
|
|
|
|
LDF 0,R2
|
|
STF R2,*+AR4(ORADX)
|
|
STF R2,*+AR4(ORADY)
|
|
STF R2,*+AR4(CRADZ)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
CLRI R0
|
|
STI R0,*+AR7(CD_PASS_COUNT)
|
|
STI R0,*+AR7(CD_BOMB_COUNT)
|
|
|
|
LDI DRONE_C|HELICOPTER,R0
|
|
STI R0,*+AR4(OID)
|
|
STI R0,*+AR7(PID)
|
|
STI AR7,*+AR4(OPLINK)
|
|
|
|
|
|
RANDN 2
|
|
ADDI 1,R0
|
|
STI R0,*+AR7(CD_MAX_PASSES)
|
|
|
|
CLRI R0
|
|
STI R0,*+AR7(CD_DOATTACK)
|
|
;
|
|
;END OF INITIALIZATION CODE
|
|
|
|
CLRI R0
|
|
STI R0,*+AR7(CD_LASTPASS)
|
|
|
|
|
|
;what type of pass to make?
|
|
CHOPPER_PASS:
|
|
LDI @HELI_ABORT,R0
|
|
BNZ CHOPPER_DIE
|
|
|
|
LDI *+AR7(CD_LASTPASS),R0
|
|
BNZ CHOPPER_DIE
|
|
|
|
LDI *+AR7(CD_PASS_COUNT),R0
|
|
INC R0
|
|
CMPI *+AR7(CD_MAX_PASSES),R0
|
|
BGT DOTHEMOVE
|
|
STI R0,*+AR7(CD_PASS_COUNT)
|
|
|
|
BU ONCOMMING_BUZZ
|
|
DOTHEMOVE
|
|
|
|
LDI 1,R0
|
|
STI R0,*+AR7(CD_LASTPASS)
|
|
|
|
RANDN 2
|
|
STI R0,*+AR7(CD_DOATTACK)
|
|
LDI R0,R0
|
|
BNZ ONCOMMING_BUZZ
|
|
|
|
|
|
|
|
FORWARD_BUZZ:
|
|
;FORWARD BUZZ INIT. CODE
|
|
;
|
|
RANDN 20
|
|
ADDI 20,R0
|
|
STI R0,*+AR7(CD_MAX_BOMBS)
|
|
|
|
|
|
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR4(ORADX)
|
|
STF R0,*+AR4(ORADY)
|
|
STF R0,*+AR4(CRADZ)
|
|
|
|
STF R0,*+AR4(OVELX)
|
|
STF R0,*+AR4(OVELY)
|
|
STF R0,*+AR4(OVELZ)
|
|
|
|
|
|
;
|
|
;find where player is
|
|
|
|
LDI @PLYCBLK,AR2
|
|
NEGF *+AR2(CARDIST2CNTR),R0
|
|
STF R0,*+AR7(DELTA_XLANE)
|
|
LDI *+AR2(CARTRAK),AR2
|
|
LDI *+AR2(OBLINK4),AR2
|
|
|
|
STI AR2,*+AR7(DELTA_TPIECE)
|
|
LDI *+AR2(OUSR1),R0
|
|
STI R0,*+AR7(DELTA_LAST_OID)
|
|
CALL DELTA_SUB_FUNCTION ;MATRIXA,VECTORA,R2
|
|
|
|
LDP @_VECTORA
|
|
LDF *+AR2(OPOSX),R0
|
|
ADDF @_VECTORA+X,R0
|
|
STF R0,*+AR4(OPOSX)
|
|
LDF *+AR2(OPOSY),R0
|
|
FLOAT 1000,R1
|
|
SUBF R1,R0
|
|
ADDF @_VECTORA+Y,R0
|
|
STF R0,*+AR4(OPOSY)
|
|
LDF *+AR2(OPOSZ),R0
|
|
ADDF @_VECTORA+Z,R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
SETDP
|
|
|
|
|
|
;initialize Ytheta to the intentional direction
|
|
STF R2,*+AR4(ORADY)
|
|
STF R2,*+AR7(DELTA_RADYDELTA)
|
|
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
|
|
FLOAT 60,R0
|
|
STF R0,*+AR7(CD_ACC)
|
|
LDI 0,R0
|
|
STI R0,*+AR7(CD_BOMBTIK)
|
|
|
|
LDI CM_DB,R0
|
|
STI R0,*+AR7(CD_MODE)
|
|
;
|
|
;END FORWARD BUZZ INIT. CODE
|
|
|
|
|
|
CHOPPER_L: ;FORWARD BUZZ LOOP
|
|
LDI @HELI_ABORT,R0
|
|
BNZ FLYAWAY
|
|
|
|
LDI @PLYCBLK,AR2
|
|
NEGF *+AR2(CARDIST2CNTR),R0
|
|
STF R0,*+AR7(DELTA_XLANE)
|
|
|
|
; LDF *+AR2(CARSPEED),R1
|
|
; CMPF 60,R1
|
|
; BGT NOCIRC
|
|
; JSRP CIRCLE_JOIN
|
|
;NOCIRC
|
|
|
|
|
|
CALL DIST_TO_PLYR
|
|
LDF *+AR7(DELTA_PLYRDIST),R1
|
|
STF R0,*+AR7(DELTA_PLYRDIST)
|
|
STF R1,*+AR7(DELTA_OPLYRDIST)
|
|
|
|
FLOAT 10000,R2
|
|
CMPF R2,R0
|
|
BGT FLYAWAY
|
|
|
|
CALL HELI_SND
|
|
|
|
|
|
;see if we should track the next piece
|
|
CHECK_DIST:
|
|
LDI *+AR7(DELTA_LAST_OID),R0 ;CHECK TO SEE IF IT IS IN THE RANGE
|
|
RS 8,R0
|
|
LDI @SECTIONIDX,R1
|
|
SUBI @DGROUP_COUNT,R1
|
|
CMPI R1,R0
|
|
BLE CHOPPER_DIE
|
|
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDI *+AR2(OLINK4),R0
|
|
BZ CHOPPER_SLP
|
|
|
|
|
|
;old xlane determination code position
|
|
|
|
CALL DELTA_GET_TRACK_POS ;CHECK IF WE SHOULD ADVANCE
|
|
FLOAT 5000,R1 ;TO THE NEXT ROADPIECE
|
|
CMPF R1,R0
|
|
BGT THIS_PIECE
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDI *+AR2(OLINK4),R0
|
|
STI R0,*+AR7(DELTA_TPIECE)
|
|
LDI R0,AR0
|
|
LDI *+AR0(OUSR1),R0
|
|
STI R0,*+AR7(DELTA_LAST_OID) ;SAVE THE LAST KNOWN VALID OID
|
|
BU CHECK_DIST
|
|
THIS_PIECE
|
|
|
|
|
|
|
|
|
|
FLOAT @NFRAMES,R1
|
|
MPYF *+AR7(CD_TSPEED),R1
|
|
LDFLE 30,R1 ;if 0 or less assume 30 voxel per frame
|
|
CALL DIV_F ;R0/R1 (distance to piece/speed) -> # frames to achieve
|
|
FIX R0,R7
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDP @_VECTORA ;lane position
|
|
LDF *+AR2(OPOSX),R2 ;X
|
|
SUBF *+AR4(OPOSX),R2
|
|
ADDF @_VECTORA+X,R2
|
|
LDF *+AR2(OPOSZ),R3 ;Z
|
|
SUBF *+AR4(OPOSZ),R3
|
|
ADDF @_VECTORA+Z,R3
|
|
SETDP
|
|
|
|
|
|
|
|
;find the theta delta to this position
|
|
;
|
|
CALL ARCTANF ;-> R0
|
|
SUBF HALFPI,R0 ;R0 DESIRED THETA (float)
|
|
|
|
LDF *+AR4(ORADY),R2 ;R2 CURRENT THETA
|
|
CALL GETTHETADIFF ;->R0 THETA DELTA (float)
|
|
FLOAT R7,R1 ;theta / number of turns to achieve
|
|
SUBF 1,R1
|
|
BLE NODIV2
|
|
CALL DIV_F ;-> R0
|
|
NODIV2
|
|
CMPF 0.3926,R0 ;PI/8 (maximum turning radius)
|
|
LDFGT 0.3926,R0
|
|
CMPF -0.3926,R0
|
|
LDFLT -0.3926,R0
|
|
STF R0,*+AR7(DELTA_RADYDELTA)
|
|
|
|
|
|
|
|
CALL GET_CLOSEST_TRAK
|
|
STI AR0,*+AR7(CD_CLOSEROAD)
|
|
|
|
|
|
LDF *+AR7(CD_ODHEIGHT),R0
|
|
STF R0,*+AR7(CD_DHEIGHT)
|
|
|
|
LDI *+AR7(CD_CLOSEROAD),AR0
|
|
FIX *+AR0(OPOSY),R0
|
|
SUBI 1300,R0
|
|
FLOAT R0
|
|
STF R0,*+AR7(CD_DHEIGHT)
|
|
|
|
|
|
|
|
LDI *+AR7(CD_CLOSEROAD),AR0
|
|
LDI *+AR0(OUSR1),R0
|
|
LDI @PLYCBLK,AR1
|
|
LDI *+AR1(CARTRAK),AR2
|
|
LDI *+AR2(OUSR1),R1
|
|
CMPI R1,R0
|
|
BLT ISBEND
|
|
BGT ISAHED
|
|
|
|
;tied case, must be exact
|
|
;
|
|
LDI *+AR2(OLINK4),AR2
|
|
LDI @PLYCAR,AR0
|
|
LDF *+AR0(OPOSX),R0
|
|
SUBF *+AR2(OPOSX),R0
|
|
MPYF R0,R0
|
|
LDF *+AR0(OPOSZ),R1
|
|
SUBF *+AR2(OPOSZ),R1
|
|
MPYF R1,R1
|
|
ADDF R1,R0
|
|
|
|
LDF *+AR4(OPOSX),R2
|
|
SUBF *+AR2(OPOSX),R2
|
|
MPYF R2,R2
|
|
LDF *+AR4(OPOSZ),R1
|
|
SUBF *+AR2(OPOSZ),R1
|
|
MPYF R1,R1
|
|
ADDF R2,R1
|
|
|
|
CMPF R0,R1
|
|
BGT ISBEND
|
|
|
|
|
|
|
|
ISAHED ;is ahead of
|
|
LDI 1,R0
|
|
STI R0,*+AR7(CD_AHEADP)
|
|
|
|
LDF *+AR7(DELTA_PLYRDIST),R1
|
|
FLOAT 1750,R2
|
|
CMPF R2,R1
|
|
BLT LITTLE
|
|
|
|
LDF *+AR7(CD_SPEED),R0
|
|
|
|
LDF R0,R2
|
|
MPYF 1.1,R2
|
|
LDF *+AR1(CARSPEED),R1
|
|
ADDF *+AR7(CD_ACC),R0
|
|
MPYF 1.5,R1
|
|
CMPF R1,R0
|
|
LDFGT R1,R0
|
|
|
|
CMPF R2,R0 ;never rad change on our vel.
|
|
LDFGT R2,R0
|
|
|
|
STF R0,*+AR7(CD_SPEED)
|
|
BU L88
|
|
|
|
ISBEND
|
|
CLRI R0
|
|
STI R0,*+AR7(CD_AHEADP)
|
|
|
|
LDF *+AR7(DELTA_PLYRDIST),R1
|
|
FLOAT 3500,R2
|
|
CMPF R2,R1
|
|
BLT LITTLE
|
|
|
|
LDF *+AR1(CARSPEED),R0
|
|
MPYF 3,R0
|
|
FLOAT 600,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
STF R0,*+AR7(CD_SPEED)
|
|
BU L88
|
|
|
|
LITTLE
|
|
LDF *+AR7(CD_SPEED),R2
|
|
MPYF 1.1,R2
|
|
|
|
LDF *+AR1(CARSPEED),R0
|
|
MPYF 2.0,R0
|
|
FLOAT 500,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
CMPF R2,R0
|
|
LDFGT R2,R0
|
|
STF R0,*+AR7(CD_SPEED)
|
|
|
|
L88 LDF *+AR7(DELTA_RADYDELTA),R2
|
|
LDF *+AR7(CD_SPEED),R3
|
|
CALL FSL_MOVE
|
|
|
|
|
|
|
|
|
|
|
|
LDI *+AR7(CD_MODE),R4
|
|
CMPI CM_DB,R4
|
|
BNE NO_BOMBS
|
|
|
|
|
|
LDI *+AR7(CD_BOMBTIK),R0
|
|
DEC R0
|
|
STI R0,*+AR7(CD_BOMBTIK)
|
|
BGT NO_BOMBS
|
|
|
|
LDI *+AR7(CD_AHEADP),R0
|
|
BZ NO_BOMBS
|
|
|
|
|
|
|
|
LDI @POSITION,R0
|
|
CMPI 1,R0
|
|
BNE FLYAWAY
|
|
|
|
|
|
|
|
FLOAT 2300,R0
|
|
CMPF *+AR7(DELTA_PLYRDIST),R0
|
|
BGT NO_BOMBS
|
|
|
|
|
|
RANDN 10
|
|
ADDI 10,R0
|
|
STI R0,*+AR7(CD_BOMBTIK)
|
|
LDI R0,R4
|
|
|
|
|
|
LDI *+AR7(CD_BOMB_COUNT),R0
|
|
INC R0
|
|
CMPI *+AR7(CD_MAX_BOMBS),R0
|
|
BGT FLYAWAY ;NO_BOMBS
|
|
STI R0,*+AR7(CD_BOMB_COUNT)
|
|
|
|
; CREATE BOMB_PROC,3434
|
|
NO_BOMBS
|
|
|
|
|
|
CHOPPER_SLP
|
|
SLEEP 1
|
|
B CHOPPER_L
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
FLYAWAY:
|
|
CLRI AR6 ;flag
|
|
LDI 100,AR5
|
|
LDF -10,R7
|
|
|
|
|
|
LDF 0.015,R0
|
|
CALL SFRAND
|
|
LDF R0,R0
|
|
BLT KKII
|
|
ADDF 0.01,R0
|
|
BU KKUU
|
|
KKII SUBF 0.01,R0
|
|
KKUU STF R0,*+AR7(CD_FLYTDIR)
|
|
|
|
|
|
|
|
FLYAWAY_LP
|
|
CALL DIST_TO_PLYR
|
|
STF R0,*+AR7(DELTA_PLYRDIST)
|
|
|
|
CALL HELI_SND
|
|
|
|
|
|
SUBF 3,R7
|
|
CMPF -95,R7
|
|
LDFLT -95,R7
|
|
|
|
LDF *+AR7(CD_DHEIGHT),R1
|
|
ADDF R7,R1
|
|
STF R1,*+AR7(CD_DHEIGHT)
|
|
|
|
|
|
LDF *+AR7(CD_SPEED),R0
|
|
ADDF *+AR7(CD_ACC),R0
|
|
FLOAT MAX_SPEED,R1
|
|
CMPF R1,R0
|
|
LDFGT R1,R0
|
|
STF R0,*+AR7(CD_SPEED)
|
|
LDF *+AR7(CD_SPEED),R3
|
|
|
|
LDF *+AR7(CD_FLYTDIR),R2
|
|
CALL FSL_MOVE
|
|
|
|
SLEEP 1
|
|
DBU AR5,FLYAWAY_LP
|
|
BU CHOPPER_PASS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
CHOPPER_DIE:
|
|
LDI *+AR4(OCARBLK),AR2
|
|
CALL DELCAR
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_DELETE
|
|
|
|
LDI HELI_SNDLP,AR2 ;may want to add in volume effects
|
|
CALL KILLSNDFX
|
|
|
|
LDI *+AR7(CD_ANIPROC),AR2
|
|
CALL PRC_KILL
|
|
DIE
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*PARAMETERS
|
|
* AR4 OBJECT
|
|
*
|
|
FIND_YX_MATRIX:
|
|
LDF *+AR4(ORADY),R2
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDI @MATRIXAI,AR2
|
|
LDF *+AR4(ORADX),R2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI @MATRIXAI,R2
|
|
LDI AR4,R3
|
|
ADDI OMATRIX,R3
|
|
LDI R3,AR2
|
|
CALL CONCATMAT
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
SETDYNAOBJ:
|
|
LDI O_DYNAMIC,R0 ;MAKE PARENT OBJECT DYNAMIC
|
|
OR *+AR4(OFLAGS),R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
LDL CHOPPERDYNA,AR2
|
|
|
|
LDI AR4,AR3
|
|
ADDI ODYNALIST,AR3
|
|
|
|
*INIT DYNA OBJECTS
|
|
LDI *AR2++,RC ;GET DYNAMIC OBJECT COUNT
|
|
RPTB CHOPLP
|
|
|
|
CALL GETDYNA ;LINK HIM INTO LIST
|
|
STI AR0,*AR3
|
|
|
|
LDF *AR2++,R0
|
|
STF R0,*+AR0(DYNACENTERX)
|
|
STF R0,*+AR0(DYNATRANSX)
|
|
LDF *AR2++,R0
|
|
STF R0,*+AR0(DYNACENTERY)
|
|
STF R0,*+AR0(DYNATRANSY)
|
|
LDF *AR2++,R0
|
|
STF R0,*+AR0(DYNACENTERZ)
|
|
STF R0,*+AR0(DYNATRANSZ)
|
|
LDI *AR2++,R0
|
|
STI R0,*+AR0(DYNANVERTS)
|
|
LDI *AR2++,R0
|
|
STI R0,*+AR0(DYNAFLAG)
|
|
STI AR4,*+AR0(DYNAPARENT)
|
|
CHOPLP LDI AR0,AR3
|
|
|
|
LDI 0,R0
|
|
STI R0,*AR3 ;LAST LINK IS ZERO, DUDES
|
|
|
|
LDI AR3,AR0
|
|
ADDI DYNAMATRIX,AR0
|
|
CALL INITMAT
|
|
|
|
|
|
LDL CHOPPERANI,AR2
|
|
LDI DRONE_C|ANI_T,R2
|
|
CALL PRC_CREATE_CHILD
|
|
STI AR0,*+AR7(CD_ANIPROC)
|
|
STI AR0,*+AR4(ORADZ)
|
|
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
CHOPPERANI:
|
|
LONGROUT
|
|
CLRF R6
|
|
CANILP
|
|
LDI *+AR4(ODYNALIST),R0
|
|
LDI R0,AR0
|
|
LDF R6,R2
|
|
|
|
FLOAT @NFRAMES,R0
|
|
MPYF 0.6,R0
|
|
ADDF R0,R2
|
|
CALL NORMITS
|
|
LDF R2,R6
|
|
LDI AR0,AR2
|
|
ADDI DYNAMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
SLEEP 1
|
|
BU CANILP
|
|
|
|
END_LONGROUT
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*FSL_MOVE Frictionless Movement
|
|
*
|
|
*PARAMETERS
|
|
* R2 THETA DELTA (CHANGE IN THETA)
|
|
* R3 SPEED
|
|
*
|
|
FSL_MOVE:
|
|
|
|
; LDP @NFRAMES
|
|
; FLOAT @NFRAMES,R0
|
|
; MPYF R0,R3
|
|
|
|
;
|
|
;move to better y height
|
|
;
|
|
LDF *+AR7(CD_DHEIGHT),R0
|
|
SUBF *+AR4(OPOSY),R0
|
|
LDF *+AR4(OVELY),R1
|
|
MPYF 0.85,R1
|
|
MPYF 0.15,R0
|
|
ADDF R0,R1
|
|
|
|
CMPF 60,R1
|
|
LDFGT 60,R1
|
|
CMPF -60,R1
|
|
LDFLT -60,R1
|
|
|
|
STF R1,*+AR4(OVELY)
|
|
|
|
|
|
PUSHF R2
|
|
ADDF *+AR4(ORADY),R2
|
|
STF R2,*+AR4(ORADY)
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
|
|
LDI AR2,R2
|
|
CALL CLR_VECTORA
|
|
STF R3,*+AR2(Z)
|
|
LDF *+AR4(OVELY),R0
|
|
STF R0,*+AR2(Y)
|
|
|
|
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDF *+AR2(X),R0
|
|
LDF *+AR4(OVELX),R1
|
|
MPYF 0.1,R0
|
|
MPYF 0.9,R1
|
|
ADDF R1,R0
|
|
STF R0,*+AR4(OVELX)
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
ADDF *+AR4(OPOSX),R0
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
LDF *+AR2(Y),R0
|
|
LDF *+AR4(OVELY),R1
|
|
MPYF 0.9,R0
|
|
MPYF 0.1,R1
|
|
ADDF R1,R0
|
|
STF R0,*+AR4(OVELY)
|
|
; FLOAT @NFRAMES,R1
|
|
; MPYF R1,R0
|
|
ADDF *+AR4(OPOSY),R0
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
LDF *+AR2(Z),R0
|
|
LDF *+AR4(OVELZ),R1
|
|
MPYF 0.1,R0
|
|
MPYF 0.9,R1
|
|
ADDF R1,R0
|
|
STF R0,*+AR4(OVELZ)
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
ADDF *+AR4(OPOSZ),R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
LDF *+AR4(ORADY),R2 ;R2 CURRENT THETA
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
|
|
LDF *+AR7(CD_TSPEED),R0
|
|
|
|
|
|
LDF *+AR4(ORADX),R2
|
|
LDI @MATRIXBI,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
POPF R2
|
|
|
|
|
|
MPYF 25,R2
|
|
LDF *+AR4(CRADZ),R0
|
|
MPYF 0.1,R2
|
|
MPYF 0.9,R0
|
|
ADDF R0,R2
|
|
|
|
CMPF 0.4,R2
|
|
LDFGT 0.4,R2
|
|
CMPF -0.4,R2
|
|
LDFLT -0.4,R2
|
|
STF R2,*+AR4(CRADZ)
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_ZMATRIX
|
|
|
|
LDI @MATRIXBI,AR2
|
|
LDI @MATRIXAI,R2
|
|
LDI AR2,R3
|
|
CALL CONCATMATV ;X * Z -> matA
|
|
|
|
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
LDI R2,R3
|
|
CALL CONCATMATV
|
|
|
|
|
|
|
|
|
|
;FIND WHAT OUR SPEED ACTUAL IS
|
|
LDF *+AR4(OVELX),R2
|
|
MPYF R2,R2
|
|
LDF *+AR4(OVELY),R1
|
|
MPYF R1,R1
|
|
ADDF R1,R2
|
|
LDF *+AR4(OVELZ),R1
|
|
MPYF R1,R1
|
|
ADDF R1,R2
|
|
CALL SQRT
|
|
LDF *+AR7(CD_TSPEED),R1
|
|
STF R0,*+AR7(CD_TSPEED)
|
|
STF R1,*+AR7(CD_TSPEED_OLD)
|
|
|
|
CALL DIV_F30
|
|
CMPF 1.0,R0
|
|
LDFGT 1.0,R0
|
|
MPYF 0.2,R0
|
|
STF R0,*+AR4(ORADX)
|
|
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
;
|
|
;*----------------------------------------------------------------------------
|
|
;*
|
|
;*PARAMETERS
|
|
;* AR4 CHOPPER OBJECT
|
|
;*
|
|
;BOMB_PROC:
|
|
; LDI AR4,AR5
|
|
; CALL OBJ_GET
|
|
; BC SUICIDE
|
|
;
|
|
; LDI AR0,AR4
|
|
; LDF *+AR5(OPOSX),R0
|
|
; STF R0,*+AR4(OPOSX)
|
|
; LDF *+AR5(OPOSY),R0
|
|
; STF R0,*+AR4(OPOSY)
|
|
; LDF *+AR5(OPOSZ),R0
|
|
; STF R0,*+AR4(OPOSZ)
|
|
;
|
|
; STI AR7,*+AR4(OPLINK)
|
|
;
|
|
; LDF *+AR2(ORADY),R2
|
|
; LDI AR4,AR2
|
|
; ADDI OMATRIX,AR2
|
|
; CALL FIND_YMATRIX
|
|
;
|
|
; LDIL bomb,AR0
|
|
; STI AR0,*+AR4(OROMDATA)
|
|
;
|
|
; LDI 1,R1
|
|
; LS O_PROC_B,R1
|
|
; LDI 1,R0
|
|
; LS O_3DROT_B,R0
|
|
; OR R1,R0
|
|
; OR *+AR4(OFLAGS),R0
|
|
; STI R0,*+AR4(OFLAGS)
|
|
;
|
|
; LDF HALFPI,R2
|
|
; LDI AR4,AR2
|
|
; ADDI OMATRIX,AR2
|
|
; CALL FIND_XMATRIX
|
|
;
|
|
; LDI AR4,AR2
|
|
; CALL OBJ_INSERT
|
|
;
|
|
;
|
|
; LDF HALFPI,R0
|
|
; STF R0,*+AR4(ORADX)
|
|
;
|
|
;
|
|
; LDF *+AR5(OVELX),R0
|
|
; STF R0,*+AR4(OVELX)
|
|
; LDF *+AR5(OVELY),R0
|
|
; STF R0,*+AR4(OVELY)
|
|
; LDF *+AR5(OVELZ),R0
|
|
; STF R0,*+AR4(OVELZ)
|
|
;
|
|
; CALL ADD_RDDEBRIS
|
|
; LDI TSIGN_C|TSC_HARD,R0
|
|
; STI R0,*+AR4(OID)
|
|
;
|
|
;
|
|
;
|
|
; LDI 120,AR6
|
|
;BOMB_L
|
|
; DEC AR6
|
|
; CMPI 0,AR6
|
|
; BLE BOMBDIE
|
|
;
|
|
; PUSH AR4
|
|
; ADDI OPOSX,AR4
|
|
; CALL CAMSCAN
|
|
; POP AR4
|
|
; BNC BOMBDIE
|
|
;
|
|
; FLOAT 100,R1
|
|
; CMPF R1,R0
|
|
; BLE BOMBDIE
|
|
;
|
|
;
|
|
; LDF *+AR4(OVELX),R0
|
|
; MPYF 0.99,R0
|
|
; STF R0,*+AR4(OVELX)
|
|
; LDF *+AR4(OVELY),R0
|
|
; ADDF 5,R0
|
|
; FLOAT 50,R1
|
|
; CMPF R1,R0
|
|
; LDFGT R1,R0
|
|
; STF R0,*+AR4(OVELY)
|
|
; LDF *+AR4(OVELZ),R0
|
|
; MPYF 0.99,R0
|
|
; STF R0,*+AR4(OVELZ)
|
|
;
|
|
; FLOAT @NFRAMES,R2
|
|
;
|
|
; LDF *+AR4(OVELX),R0
|
|
; MPYF R2,R0
|
|
; ADDF *+AR4(OPOSX),R0
|
|
; STF R0,*+AR4(OPOSX)
|
|
;
|
|
; LDF *+AR4(OVELY),R0
|
|
; MPYF R2,R0
|
|
; ADDF *+AR4(OPOSY),R0
|
|
; STF R0,*+AR4(OPOSY)
|
|
;
|
|
; LDF *+AR4(OVELZ),R0
|
|
; MPYF R2,R0
|
|
; ADDF *+AR4(OPOSZ),R0
|
|
; STF R0,*+AR4(OPOSZ)
|
|
;
|
|
;
|
|
; LDF *+AR4(ORADX),R2
|
|
; MPYF 0.80,R2
|
|
; STF R2,*+AR4(ORADX)
|
|
; LDI @MATRIXAI,AR2
|
|
; CALL FIND_XMATRIX
|
|
;
|
|
;
|
|
; LDF *+AR4(ORADY),R2
|
|
; ADDF 0.3,R2
|
|
; CALL NORMITS
|
|
; STF R2,*+AR4(ORADY)
|
|
;
|
|
; LDI AR4,AR2
|
|
; ADDI OMATRIX,AR2
|
|
; CALL FIND_YMATRIX
|
|
;
|
|
; LDI @MATRIXAI,AR2
|
|
; LDI AR4,R2
|
|
; ADDI OMATRIX,R2
|
|
; LDI R2,R3
|
|
; CALL CONCATMATV
|
|
;
|
|
; SLEEP 1
|
|
; BU BOMB_L
|
|
;
|
|
;BOMBDIE
|
|
; LDI @EXP_ANII,AR5
|
|
;
|
|
; LDI *AR5,AR0
|
|
; STI AR0,*+AR4(OROMDATA)
|
|
;
|
|
; ORM O_POSTER,*+AR4(OFLAGS)
|
|
;
|
|
; LDI *+AR4(OFLAGS),R0
|
|
; ANDN O_1PAL,R0
|
|
; OR O_POSTER,R0
|
|
; STI R0,*+AR4(OFLAGS)
|
|
;
|
|
; BU EXLJ
|
|
;*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
;EXP_ANII .word EXP_ANI
|
|
;EXP_ANI
|
|
; ;.word exp1,exp2,exp3,exp4,exp5,exp6,exp7,-1
|
|
; ;.word dexplo1,dexplo2,dexplo3,dexplo4,dexplo5
|
|
; ;.word dexplo6,dexplo7,dexplo8,dexplo9,dexplo10,dexplo11,-1
|
|
;
|
|
; .word blast1,blast2,blast3,blast4,blast5
|
|
; .word blast6,blast7,blast8,blast9,blast10,-1
|
|
;
|
|
;
|
|
;
|
|
;EXPLO_SOUNDSI .word EXPLO_SOUNDS
|
|
;EXPLO_SOUNDS .word EXP1,EXP2,EXP3
|
|
;
|
|
;EXP_NMPUFF:
|
|
; LDI AR4,AR6
|
|
; CALL OBJ_GET
|
|
; BC SUICIDE
|
|
; LDI AR0,AR4
|
|
; LDI @EXP_ANII,AR5
|
|
;
|
|
; LDI *AR5,AR0
|
|
; STI AR0,*+AR4(OROMDATA)
|
|
;
|
|
; LDF *+AR6(OPOSX),R0
|
|
; STF R0,*+AR4(OPOSX)
|
|
; LDF *+AR6(OPOSY),R0
|
|
; STF R0,*+AR4(OPOSY)
|
|
; LDF *+AR6(OPOSZ),R0
|
|
; STF R0,*+AR4(OPOSZ)
|
|
; ORM O_POSTER,*+AR4(OFLAGS)
|
|
; LDI AR4,AR2
|
|
; CALL OBJ_INSERT
|
|
;EXLJ
|
|
;
|
|
;;explosions must get louder
|
|
;;
|
|
;; RANDN 3
|
|
; LDI @EXPLO_SOUNDSI,AR2
|
|
;; ADDI R0,AR2
|
|
; LDI *AR2,AR2
|
|
; CALL ONESNDFX
|
|
;
|
|
; ;collidable explosion
|
|
;
|
|
;EXP_NMPUFFLP
|
|
; LDI *AR5++,AR0
|
|
; CMPI -1,AR0
|
|
; BEQ EXP_DIE
|
|
; STI AR0,*+AR4(OROMDATA)
|
|
;
|
|
; SLEEP 1
|
|
; BU EXP_NMPUFFLP
|
|
;
|
|
;EXP_DIE
|
|
; LDI 1,R1
|
|
; LS O_PROC_B,R1
|
|
; NOT R1
|
|
; LDI *+AR4(OFLAGS),R0
|
|
; AND R1,R0
|
|
; STI R0,*+AR4(OFLAGS)
|
|
;
|
|
;
|
|
; LDI AR4,AR2
|
|
; CALL OBJ_DELETE
|
|
; DIE
|
|
;*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
HELI_SND:
|
|
LDI HELI_SNDLP,AR2 ;may want to add in volume effects
|
|
|
|
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
|
|
BEQ IS_T1
|
|
CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
|
|
BEQ IS_T2
|
|
CALL ONESNDFX
|
|
|
|
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
|
|
BNE NOT_T1
|
|
IS_T1
|
|
LDF *+AR7(DELTA_PLYRDIST),R0
|
|
FLOAT 20000,R1
|
|
CMPF R1,R0
|
|
LDFGT R1,R0
|
|
|
|
SUBRF R1,R0
|
|
MPYFL 0.00005,R0
|
|
; MPYF 64,R0
|
|
; ADDF 191,R0
|
|
|
|
MPYF 127,R0
|
|
ADDF 128,R0
|
|
|
|
FIX R0,R1
|
|
LDI 1,R0
|
|
CALL SET_TRACK_VOL
|
|
BU HEND
|
|
|
|
NOT_T1 CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
|
|
BNE NOT_T2
|
|
IS_T2
|
|
LDF *+AR7(DELTA_PLYRDIST),R0
|
|
FLOAT 20000,R1
|
|
CMPF R1,R0
|
|
LDFGT R1,R0
|
|
|
|
SUBRF R1,R0
|
|
MPYFL 0.00005,R0
|
|
; MPYF 64,R0
|
|
; ADDF 191,R0
|
|
|
|
MPYF 127,R0
|
|
ADDF 128,R0
|
|
|
|
FIX R0,R1
|
|
LDI 2,R0
|
|
CALL SET_TRACK_VOL
|
|
BU HEND
|
|
NOT_T2
|
|
HEND
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*RETURNS
|
|
* AR0 ROAD OBJECT
|
|
*
|
|
GET_CLOSEST_TRAK:
|
|
LDI @DRIVE_LIST,R0
|
|
BZ GETRKX ;NULL LIST DUDES
|
|
|
|
LDI 0,AR0 ;CLOSEST ROAD SEGMENT INDEX
|
|
FLOAT 7FFFH,R2 ;INITIAL CLOSEST DISTANCE
|
|
MPYF R2,R2
|
|
|
|
LDF *+AR4(OPOSX),R3
|
|
LDF *+AR4(OPOSZ),R4
|
|
LDI R0,AR2
|
|
GETRK
|
|
LDI *+AR2(OID),R0 ;IS THIS REAL ROAD?
|
|
AND 0FF0H,R0
|
|
CMPI 300H,R0
|
|
BNE GETRKL ;NOPE...
|
|
|
|
LDF R3,R0
|
|
SUBF *+AR2(OPOSX),R0
|
|
MPYF R0,R0
|
|
|
|
LDF R4,R1
|
|
SUBF *+AR2(OPOSZ),R1
|
|
MPYF R1,R1
|
|
ADDF R0,R1
|
|
|
|
CMPF R1,R2
|
|
BLE GETRKL
|
|
LDI AR2,AR0
|
|
LDF R1,R2
|
|
GETRKL
|
|
LDI *+AR2(OLINK3),R0
|
|
BNZD GETRK
|
|
|
|
LDI R0,AR2
|
|
NOP
|
|
NOP
|
|
;----> BNZ GETRK
|
|
; STI AR0,*+AR5(CARTRAK) ;SAVE TRACK SECTION
|
|
GETRKX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
.END
|