cruisin-usa/SIGMA.ASM

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