524 lines
9.4 KiB
NASM
Executable File
524 lines
9.4 KiB
NASM
Executable File
.FILE "SIGMA.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
|
|
|
|
|
|
*SIGMA_STARTUP STRUCT
|
|
SS_MODEL .set 0
|
|
SS_FLAG .set 1
|
|
*ENDSTRUCT
|
|
|
|
SS_COPCAR .set 1
|
|
SS_LONG .set 2
|
|
|
|
SIGT_GTRUCK .set 0
|
|
SIGT_CBUS .set 1
|
|
SIGT_COPCAR .set 2
|
|
SIGT_MUSCLE .set 3
|
|
SIGT_CARAVAN .set 4
|
|
SIGT_SBUS .set 5
|
|
SIGT_PTRUCKG .set 6
|
|
SIGT_JEEP .set 7
|
|
|
|
|
|
|
|
SIGMA_LIST_LEN .set 16
|
|
|
|
SIGMA_LISTI .word SIGMA_LIST
|
|
SIGMA_LIST
|
|
.word GTRUCK_MOD,0
|
|
.word CBUS_MOD,SS_LONG
|
|
.word COPCAR_MOD,SS_COPCAR
|
|
.word MUSTANG_MOD,0
|
|
.word MUSCLE_MOD,0
|
|
|
|
.word CARAVAN_MOD,0
|
|
.word SBUS_MOD,SS_LONG
|
|
.word PTRUCKG_MOD,0
|
|
.word JEEP_MOD,0
|
|
.word GTRUCK_MOD,0
|
|
|
|
.word COPCAR_MOD,SS_COPCAR
|
|
.word MUSTANG_MOD,0
|
|
.word MUSCLE_MOD,0
|
|
.word CARAVAN_MOD,0
|
|
.word PTRUCKG_MOD,0
|
|
|
|
.word JEEP_MOD,0
|
|
|
|
|
|
SIGMA_PSYCHO .set 1
|
|
|
|
*----------------------------------------------------------------------------
|
|
*SIGMA IS A BIG FAT PIG THAT STARTS UP AHEAD OF THE PLAYER
|
|
*AND MOVES RATHER SLOWLY AKIN TO A CTA BUS, OR A COMBINE VEHICLE.
|
|
*IN ANY INSTANCE THE DRONE DISAPPEARS ONCE IT IS TRACKING BENEATH THE WORLD.
|
|
*THERE CAN ONLY BE ONE SIGMA IN THE UNIVERSE AT ONCE.
|
|
*SIGMA TRAVELS IN THE SAME DIRECTION AS THE PLAYER.
|
|
*
|
|
*
|
|
SIGMA_DRONE:
|
|
LDI @DD_MAX_DRONES,R0
|
|
BNZ GOAHEAD
|
|
SLEEP 1
|
|
BU SIGMA_DRONE
|
|
GOAHEAD
|
|
|
|
LDI SIGMA_LIST_LEN,AR2
|
|
CALL RANDU0
|
|
|
|
|
|
CMPI SIGT_COPCAR,R0 ;ONLY 1 COPCAR ACTIVE AT A TIME
|
|
BNE NOT_COP
|
|
; LDI @COP_ACTIVE,R1
|
|
; LDINZ SIGT_MUSCLE,R0
|
|
NOT_COP
|
|
|
|
WORIT ;RETURN FROM LONG VEHICLE IGNORE
|
|
|
|
; LDI SIGT_COPCAR,R0 ;COPCAR DEBUG
|
|
|
|
STI R0,*+AR7(SIGMA_MODEL)
|
|
MPYI 2,R0
|
|
LDI @SIGMA_LISTI,AR2
|
|
ADDI R0,AR2
|
|
LDI *+AR2(SS_FLAG),R0
|
|
STI R0,*+AR7(SIGMA_FLAG)
|
|
; CMPI SS_COPCAR,R0
|
|
; BEQ COPCAR_DRONE
|
|
|
|
LDI *AR2,AR2
|
|
|
|
LDI @NOLONG_VEHICLES,R1
|
|
BZ DONTWORRY
|
|
|
|
TSTB SS_LONG,R0
|
|
BZ DONTWORRY
|
|
|
|
LDI SIGT_GTRUCK,R0
|
|
BU WORIT
|
|
|
|
DONTWORRY
|
|
STI AR2,*+AR7(DELTA_MODEL)
|
|
MPYI VEHTAB_SIZE,AR2
|
|
ADDI @VEHICLE_TABLEI,AR2
|
|
LDI *+AR2(VEHTAB_MODEL),AR2
|
|
STI R4,*+AR7(DELTA_INIT)
|
|
|
|
CALL OBJ_GETE
|
|
BC SUICIDE ;abort process if no object available
|
|
LDI AR0,AR4
|
|
|
|
LDI *+AR7(DELTA_MODEL),AR2
|
|
CALL VEHICLE_ANI_INIT
|
|
|
|
CALL DELTA_OINIT
|
|
LDI DRONE_C|VEHICLE_T|DRNE_SIGMA,R0
|
|
STI R0,*+AR5(CAR_ID)
|
|
STI R0,*+AR4(OID)
|
|
STI R0,*+AR7(PID)
|
|
|
|
CALL SET_DRONE_PAL
|
|
|
|
RANDN 2
|
|
ADDI 2,R0
|
|
STI R0,*+AR7(DELTA_STATUS)
|
|
|
|
|
|
;init position at two pieces before end of universe
|
|
;
|
|
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 ;MATRIXA,VECTORA,R2
|
|
|
|
LDP @_VECTORA
|
|
LDF *+AR2(OPOSX),R0
|
|
ADDF @_VECTORA+X,R0
|
|
STF R0,*+AR4(OPOSX)
|
|
LDF *+AR2(OPOSY),R0
|
|
SUBF *+AR5(CARWHLTAB+1),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)
|
|
STF R2,*+AR5(CARYROT)
|
|
STF R2,*+AR5(CARVROT)
|
|
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
CLRI R0
|
|
STI R0,*+AR7(SIGMA_ONCE)
|
|
STI R0,*+AR7(SIGMA_YELL)
|
|
STI R0,*+AR7(DELTA_PLAYIT)
|
|
|
|
|
|
;Weaving SIGMA????
|
|
RANDN 10 ;1 in 10 chance
|
|
CMPI 0,R0
|
|
BNE NOTWEAVER
|
|
|
|
LDI SIGMA_PSYCHO,R0
|
|
STI R0,*+AR7(DELTA_PLAYIT)
|
|
|
|
RANDN 50
|
|
ADDI 20,R0
|
|
STI R0,*+AR7(DELTA_PSTAT)
|
|
NOTWEAVER
|
|
|
|
|
|
|
|
|
|
*
|
|
*
|
|
*
|
|
SIGMA_LP:
|
|
LDI @SUSPEND_MODE,R0
|
|
CMPI SM_HALT,R0
|
|
BEQ SIGMASLP
|
|
|
|
CALL AHEAD_OF_PLAYER_P
|
|
LDIC 1,R0
|
|
LDINC 0,R0
|
|
STI R0,*+AR7(DELTA_PSTAT)
|
|
|
|
|
|
; ;CHECK TO SEE IF...
|
|
; ; WE ARE FAR ENOUGH BEHIND THE PLYR THAT
|
|
; ; WE CAN KILL OURSELVES
|
|
; ;
|
|
; CMPI 0,R0
|
|
; BNE NOTBEHIND_PLAYER
|
|
;
|
|
; LDI *+AR5(CARTRAK),AR0
|
|
; LDI *+AR0(OUSR1),R0
|
|
; LDI @PLYCBLK,AR1
|
|
; ADDI 4,R0
|
|
; LDI *+AR1(CARTRAK),AR1
|
|
; CMPI *+AR1(OUSR1),R0
|
|
; BLE SIGMA_DIE
|
|
;
|
|
;NOTBEHIND_PLAYER
|
|
|
|
|
|
|
|
|
|
;Weaver?
|
|
LDI *+AR7(DELTA_PLAYIT),R0
|
|
CMPI SIGMA_PSYCHO,R0
|
|
BNE NOTPSYCHO_LP
|
|
|
|
LDI *+AR7(DELTA_PSTAT),R0
|
|
DEC R0
|
|
STI R0,*+AR7(DELTA_PSTAT)
|
|
CMPI 0,R0
|
|
BGT NOTPSYCHO_LP
|
|
|
|
LDI *+AR7(DELTA_STATUS),R0
|
|
CMPI 2,R0
|
|
LDIEQ 3,R0
|
|
LDINE 2,R0
|
|
STI R0,*+AR7(DELTA_STATUS)
|
|
|
|
RANDN 50
|
|
ADDI 30,R0
|
|
STI R0,*+AR7(DELTA_PSTAT)
|
|
NOTPSYCHO_LP
|
|
|
|
|
|
|
|
|
|
;if all 4 wheels are off then effective breakdown
|
|
LDI *+AR5(RF_PCOL),AR0
|
|
LDI *+AR0(OID),R0
|
|
IFI R0,EQ,300h,NOSL2DIE
|
|
LDI *+AR5(LF_PCOL),AR0
|
|
LDI *+AR0(OID),R0
|
|
IFI R0,EQ,300h,NOSL2DIE
|
|
LDI *+AR5(RR_PCOL),AR0
|
|
LDI *+AR0(OID),R0
|
|
IFI R0,EQ,300h,NOSL2DIE
|
|
LDI *+AR5(LR_PCOL),AR0
|
|
LDI *+AR0(OID),R0
|
|
IFI R0,EQ,300h,NOSL2DIE
|
|
LDI *+AR7(SIGMA_ONCE),R0
|
|
BZ NOSL2DIE2
|
|
BU BREAKDOWN
|
|
NOSL2DIE
|
|
LDI 1,R0
|
|
STI R0,*+AR7(SIGMA_ONCE)
|
|
NOSL2DIE2
|
|
|
|
|
|
LDI *+AR5(CAR_BUMP),R0
|
|
BZ NOBUMP
|
|
CLRI R0
|
|
STI R0,*+AR5(CAR_BUMP)
|
|
|
|
; INCM @CAR_COLLS
|
|
|
|
.globl EXP_PUFF
|
|
CREATEC EXP_PUFF,SPAWNER_C
|
|
NOBUMP
|
|
|
|
|
|
|
|
|
|
;it the plyr is zooming by
|
|
;
|
|
LDI *+AR7(SIGMA_YELL),R0
|
|
BNZ NOYELL
|
|
|
|
LDI *+AR7(DELTA_PSTAT),R0 ;IN FRONT OF PLAYER?
|
|
BZ NOYELL
|
|
|
|
CALL DIST_TO_PLYR
|
|
LDF *+AR7(DELTA_PLYRDIST),R1
|
|
STF R1,*+AR7(DELTA_OPLYRDIST)
|
|
STF R0,*+AR7(DELTA_PLYRDIST)
|
|
|
|
FLOAT 5000,R2
|
|
CMPF R2,R0 ;<5000
|
|
BGT NOYELL
|
|
|
|
CMPF R0,R1
|
|
BLT NOYELL
|
|
|
|
LDI @PLYCBLK,AR0
|
|
LDF *+AR0(CARSPEED),R0
|
|
CMPF 127,R0
|
|
BLT NOYELL
|
|
|
|
LDI 1,R0
|
|
STI R0,*+AR7(SIGMA_YELL)
|
|
|
|
LDI *+AR7(DELTA_MODEL),AR2
|
|
MPYI VEHTAB_SIZE,AR2
|
|
ADDI @VEHICLE_TABLEI,AR2
|
|
LDI *+AR2(VEHTAB_PASSBY),AR2
|
|
CMPI 0,AR2
|
|
BEQ NOYELL
|
|
CALL ONESNDFX
|
|
NOYELL
|
|
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDI *+AR2(OLINK4),AR0
|
|
CMPI 0,AR0
|
|
BEQ SIGMASLP ;IF AT END OF WORLD DONT MOVE!
|
|
|
|
;find piece which points to piece if it is not found
|
|
;or it is the initial piece exit rho code and commit
|
|
;suicide
|
|
|
|
LDI *+AR7(DELTA_TPIECE),R0
|
|
LDI @DYNALIST_TRUEBEGIN,AR0
|
|
CMPI AR0,R0 ;BR-> WE ARE ATTACKING THE START OF UNIVERSE
|
|
BEQ SIGMA_DIE
|
|
|
|
LDI *+AR2(OUSR1),R0
|
|
LDI *+AR7(DELTA_LAST_OID),R1
|
|
CMPI R0,R1 ;BR-> WE ARE UNDER THE START OF UNIVERSE
|
|
BLT SIGMA_DIE
|
|
|
|
|
|
|
|
;
|
|
;simply drive slowly forward until we are below the section list
|
|
;
|
|
;
|
|
|
|
|
|
;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
|
|
SUBPI @DGROUP_COUNT,R1
|
|
CMPI R1,R0
|
|
BLE SIGMA_DIE
|
|
|
|
LDI *+AR7(DELTA_TPIECE),AR2
|
|
LDI *+AR2(OLINK4),R0
|
|
BZ SIGMASLP
|
|
|
|
|
|
CALL 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
|
|
.if DEBUG
|
|
BZ $ ;HOW DID WE MISS THIS?
|
|
.endif
|
|
STI R0,*+AR7(DELTA_TPIECE)
|
|
LDI R0,AR0
|
|
LDI *+AR0(OUSR1),R0
|
|
.if DEBUG
|
|
BLT $
|
|
.endif
|
|
STI R0,*+AR7(DELTA_LAST_OID) ;SAVE THE LAST KNOWN VALID OID
|
|
BU CHECK_DIST
|
|
|
|
THIS_PIECE
|
|
LDF *+AR5(CARSPEED),R1
|
|
LDFLE 30,R1 ;if 0 or less assume 30 mph
|
|
FLOATP @NFRAMES,R2
|
|
MPYF R2,R1
|
|
CALL DIV_F ;R0/R1 (distance to piece/speed) -> # frames to achieve
|
|
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
|
|
JOINUP998
|
|
|
|
|
|
;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 ;DBG
|
|
BZ NODIV
|
|
CALL DIV_F ;-> R0
|
|
NODIV STF R0,*+AR7(DELTA_RADYDELTA)
|
|
|
|
|
|
|
|
CALL PRECOLLIDE_PLYR
|
|
BNC NOTPRECOL
|
|
|
|
LDF *+AR7(DELTA_THROTTLE),R2
|
|
MPYF 0.01,R2
|
|
STF R2,*+AR5(CARTHROTTLE)
|
|
BU L99
|
|
|
|
NOTPRECOL
|
|
|
|
;set throttle
|
|
|
|
LDF *+AR7(DELTA_THROTTLE),R2
|
|
MPYF 1.01,R2
|
|
CMPF MIN_THROTTLE,R2
|
|
LDFLT MIN_THROTTLE,R2
|
|
CMPF MAX_SIGMA_THROTTLE,R2
|
|
LDFGT MAX_SIGMA_THROTTLE,R2
|
|
STF R2,*+AR7(DELTA_THROTTLE)
|
|
STF R2,*+AR5(CARTHROTTLE)
|
|
L99
|
|
LDF *+AR7(DELTA_RADYDELTA),R2
|
|
MPYF 1.95,R2 ;depending on plyr.asm this may have to
|
|
|
|
|
|
CALL DRONE_RIDE_RIGHT ;FIND DISTANCE TO CENTER OF ROAD
|
|
STF R0,*+AR5(CARDIST2CNTR)
|
|
|
|
CALL DRONEGO
|
|
CALL GETTRAK
|
|
; CALL PTS
|
|
|
|
SIGMASLP
|
|
SLEEP 1
|
|
B SIGMA_LP
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*
|
|
*In the case of a 'breakdown' we simply wait until the universe has passed
|
|
*us up, and then goto SIGMA_DIE.
|
|
*
|
|
*
|
|
BREAKDOWN:
|
|
; 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)
|
|
|
|
CREATEC SMOKE_PUFF,2
|
|
|
|
LDI 10,AR6
|
|
BREAKDOWNLP
|
|
LDI @SUSPEND_MODE,R0
|
|
CMPI SM_HALT,R0
|
|
BEQ BREAKDNSLP
|
|
|
|
DEC AR6
|
|
CMPI 0,AR6
|
|
BLT NOSMK
|
|
CREATEC SMOKE_PUFF,2
|
|
NOSMK
|
|
|
|
|
|
LDI *+AR5(CARTRAK),AR0
|
|
LDI *+AR0(OUSR1),R0
|
|
RS 8,R0
|
|
LDI @(DGROUPS+DGRP_IDX),R1
|
|
CMPI R1,R0
|
|
BLT SIGMA_DIE
|
|
|
|
CLRF R2
|
|
STF R2,*+AR5(CARTHROTTLE)
|
|
CALL DRONEGO
|
|
CALL GETTRAK
|
|
|
|
BREAKDNSLP
|
|
SLEEP 1
|
|
BU BREAKDOWNLP
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
SIGMA_DIE:
|
|
BU RHO_DIE
|
|
*----------------------------------------------------------------------------
|
|
.END
|