cruisin-usa/RHO.ASM

934 lines
16 KiB
NASM
Executable File

.FILE "RHO.ASM"
*----------------------------------------------------------------------------
*RHO (ONCOMING TRAFFIC)
*
*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
.include COMM.EQU
RHO_WEAVER .set 1 ;DRUNK ONCOMER
*
*YELL B4 HIT TO PLAYER
B4HIT_SIZE .set 6
B4HIT_TABLEI .word B4HIT_TABLE
B4HIT_TABLE .word RH_GOFORIT,RH_TAKEHIM,RH_BABESCREAM1
.word RH_BABEWHOA,RH_HURRYUP,RH_GONNACRASH
*RHO FLAGS (RF_)
*
*
RF_WEAVER .set 001h ;may this become a weaver (SUICIDE)
RF_LONG .set 002h ;Eugenes system can't handle long vehicles under circumstances
RT_VEHIDX .set 0
RT_FLAG .set 1
RT_ONSCREAM .set 2
RT_SIZE .set 3
.bss NOLONG_VEHICLES,1
*
*RHO_TABLE
* .word VEHICLE_INDEX,RHO_FLAG
* .word ONCOMESCREAM ;either fixed or general
*
; .word SBUS_MOD,RF_LONG,BUSDOPL
RHO_TABLE_LENGTH .set 17
RHO_TABLEI .word RHO_TABLE
RHO_TABLE:
.word GTRUCK_MOD,0,DIESEL_DOPPLER
.word FTRUCK_MOD,RF_LONG,TRUCKHORN_BLAST
.word CBUS_MOD,RF_LONG,BUSDOPL
.word COPCAR_MOD,0,CARDOPL2
.word MUSCLE_MOD,RF_WEAVER,CARDOPL3
.word CARAVAN_MOD,0,CARDOPL3
.word SBUS_MOD,RF_LONG,BUSDOPL
.word PTRUCKG_MOD,0,SEMIDOPL
.word MUSTANG_MOD,0,CARDOPL2
.word JEEP_MOD,0,CARDOPL1
.word GTRUCK_MOD,0,DIESEL_DOPPLER
; .word CBUS_MOD,RF_LONG,BUSDOPL
.word COPCAR_MOD,0,CARDOPL2
.word MUSCLE_MOD,RF_WEAVER,CARDOPL3
.word CARAVAN_MOD,0,CARDOPL3
.word PTRUCKG_MOD,0,SEMIDOPL
.word MUSTANG_MOD,0,CARDOPL2
; .word SBUS_MOD,RF_LONG,BUSDOPL
.word JEEP_MOD,0,CARDOPL1
*----------------------------------------------------------------------------
*RHO DRONE ONCOMING TRAFFIC DRONE
*
*allocated standard drone
*
*starting position = end of the current universe (up ahead)
*
*in lane 0 or 1 accelerate past the player
*when rho has reached the begining of the universe
*
*
*RHO may be allocated as a suicide vehicle
*but in general plays a straight game as an
*oncomer.
*
.bss RHOFLAG,1
.bss RHOPAL,1
.GLOBL RHO_START
.GLOBL OM_DRONE
*
*RHO STARTER
*R4= VEHICLE INDEX
*R5= VEHICLE ID
*
*ENTRY POINT FOR RHO START BY OTHER GAME
RHO_START
STI AR6,@RHOPAL
STI R4,@RHOFLAG ;SAVE CAR ID #
LDI R5,R0 ;INDEX #
B IBOIBO
RHO_DRONE:
LDI 0,R5
STI R5,@RHOFLAG
RANDN RHO_TABLE_LENGTH ;INDEX #
IBOIBO
CLRI R4
LDI R0,R5 ;SAVE INDEX#
LDI R0,AR2
STI R0,*+AR7(RHO_INIT)
MPYI RT_SIZE,AR2
ADDI @RHO_TABLEI,AR2
LDI @NOLONG_VEHICLES,R0
BZ NONOLONG
LDI *+AR2(RT_FLAG),R0
TSTB RF_LONG,R0
BZ NONOLONG
LDI 5,R0
BU IBOIBO
NONOLONG
LDI *+AR2(RT_VEHIDX),R0
LDI R0,AR2
STI R0,*+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 DRONE_C|VEHICLE_T|DRNE_RHO,R0
STI R0,*+AR4(OID)
LDI *+AR7(DELTA_MODEL),AR2
CALL VEHICLE_ANI_INIT ;UTIL.ASM
CALL DELTA_OINIT
LDF MAX_ACCEL_INIT,R0
STF R0,*+AR5(CARMAXACCEL) ;SET ACCEL POWER
LDI *+AR4(OID),R0
STI R0,*+AR5(CAR_ID)
STI R0,*+AR7(PID)
CALL SET_DRONE_PAL
RANDN 2
ADDI 2,R0
STI R0,*+AR7(DELTA_STATUS)
;init position at 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_RVS
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(RHO_NOISE)
STI R0,*+AR7(RHO_YELL)
STI R0,*+AR7(DELTA_PLAYIT)
;is this a weaver? (drunk driver?)
;
;
;
LDI *+AR7(RHO_INIT),AR2
MPYI RT_SIZE,AR2
ADDI @RHO_TABLEI,AR2
LDI *+AR2(RT_FLAG),R0
TSTB RF_WEAVER,R0
BZ NOT_WEAVER
LDF @GAME_TIMER,R0 ;first minute - dont swerve
CMPF 1.1,R0
BLT NOT_WEAVER
; RANDN 10 ;1 in 10 chance
; CMPI 0,R0
; BNE NOT_WEAVER
LDI RHO_WEAVER,R0
STI R0,*+AR7(DELTA_PLAYIT)
FLOAT 576,R0
STF R0,*+AR7(DELTA_XLANE)
LDI 30,R0
STI R0,*+AR7(DELTA_PSTAT)
LDF 0.1,R0
CALL FRAND
ADDF 0.25,R0
STF R0,*+AR7(RHO_THETA_DELTA)
FLOAT 520,R0
CALL FRAND
FLOAT 2600,R1
ADDF R1,R0
STF R0,*+AR7(RHO_AMP)
FLOAT 576,R0
CALL SFRAND
STF R0,*+AR7(RHO_XHEAD)
CLRF R6 ;SIN
NOT_WEAVER
LDI @RHOFLAG,R0 ;CREATED BY OTHER MACHINE?
BZ RHOLL1 ;NO...
STI R0,*+AR5(CARNUM) ;YES, SAVE ID NUMBER
LDI @RHOPAL,R0 ;GET PALETTE
STI R0,*+AR4(OPAL)
LDI 1,R0
STI R0,*+AR5(CAR_OM) ;OTHER MACHINE IS IN CONTROL
B OM_DRONE ;GO DRONE IT
RHOLL1
.GLOBL DRONE_PTR_ADD
CALL DRONE_PTR_ADD
.globl SEND_RHO_CREATE
CALL SEND_RHO_CREATE
*----------------------------------------------------------------------------
*
*
*----------------------------------------------------------------------------
*
*
*
RHO_LP:
LDI @SUSPEND_MODE,R0
CMPI SM_HALT,R0
BEQ RHO_SLP
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
; CMPI *+AR1(CARTRAK),AR1
; LDI *+AR1(OUSR1),R0
; BLE RHO_DIE
;
;NOTBEHIND_PLAYER
;
;DRUNK ONCOMER?
;
LDI *+AR7(DELTA_PLAYIT),R0
CMPI RHO_WEAVER,R0
BNE NOT_WEAVER_LP
;
;
;
LDI @POSITION,R0
CMPI 5,R0
BGT ABORTWEAVE
;
;
LDI *+AR7(DELTA_TPIECE),AR2
CALL GET_LANES
CMPI 1,R0
BEQ DONTABORT
;if at any point we come into a 2 lane
;situation, ABORT weaver and go into
;straight mode
ABORTWEAVE
CLRI R0
STI R0,*+AR7(DELTA_PLAYIT)
RANDN 2
ADDI 2,R0
STI R0,*+AR7(DELTA_STATUS)
BU NOT_WEAVER_LP
DONTABORT
LDI 100,AR2
CALL RANDPER
BNC III
LDF 0.1,R0
CALL FRAND
ADDF 0.25,R0
STF R0,*+AR7(RHO_THETA_DELTA)
FLOAT 520,R0
CALL FRAND
FLOAT 2600,R1
ADDF R1,R0
STF R0,*+AR7(RHO_AMP)
III
LDI 200,AR2
CALL RANDPER
BNC III4
FLOAT 576,R0
CALL SFRAND
STF R0,*+AR7(RHO_XHEAD)
III4
LDF *+AR7(RHO_THETA),R2
ADDF *+AR7(RHO_THETA_DELTA),R2
CALL NORMIT
STF R2,*+AR7(RHO_THETA)
CALL _SINE
MPYF *+AR7(RHO_AMP),R0
ADDF *+AR7(RHO_XHEAD),R0
STF R0,*+AR7(DELTA_XLANE)
NOT_WEAVER_LP
;check to see if collision has occurred
LDI *+AR5(CAR_BUMP),R0
BNZ RHO_ISHIT
;make sure to check for relative speed for
;2x sound calls
;(once sounds are received)
LDI *+AR7(RHO_NOISE),R0
BNZ NONOISE
LDF *+AR7(DELTA_PLYRDIST),R0
STF R0,*+AR7(DELTA_OPLYRDIST)
CALL DIST_TO_PLYR
STF R0,*+AR7(DELTA_PLYRDIST)
LDI *+AR7(DELTA_PSTAT),R3 ;IN FRONT OF PLAYER?
BZ NONOISE
FLOAT 7500,R1
CMPF R1,R0
BGT NONOISE
LDI 1,R0
STI R0,*+AR7(RHO_NOISE)
LDI *+AR7(DELTA_MODEL),AR2
MPYI VEHTAB_SIZE,AR2
ADDI @VEHICLE_TABLEI,AR2
LDI *+AR2(VEHTAB_PASSBY),AR2
CMPI 0,AR2
BEQ NONOISE
CALL ONESNDFX
NONOISE
CALL CKCAROFF ;OFF THE UNIVERSE ???
BZ RHO_DIE ;YES
;
;simply drive towards the start of the universe by walking
;through the universe backwards
;
;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
.if DEBUG
BLT $ ;SEARCHING INVALID (/DELETED?) OBJECT
.endif
RS 8,R0
LDI @SECTIONIDX,R1
SUBI @DGROUP_COUNT,R1
CMPI R1,R0
BGT ALLOK66
BU $ ;probably RHO_DIE
ALLOK66
LDI *+AR7(DELTA_TPIECE),AR2
LDI *+AR2(OBLINK4),R0
BZ RHO_DIE ;should we kill ourselves
LDI *+AR7(DELTA_PLAYIT),R0
CMPI RHO_WEAVER,R0
BNE NOT_WEAVER_LP2
CALL GET_TRACK_POS_RVS_XLANE
BU L9999
NOT_WEAVER_LP2
CALL GET_TRACK_POS_RVS ;CHECK IF WE SHOULD ADVANCE
L9999 FLOAT 5000,R1 ;TO THE NEXT ROADPIECE
CMPF R1,R0
BGT THIS_PIECE
LDI *+AR7(DELTA_TPIECE),AR2
LDI *+AR2(OBLINK4),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)
LDI *+AR7(RHO_YELL),R0
BNZ NOTPRECOL
CALL PRECOLLIDE_PLYR
BNC NOTPRECOL
CALL PLYR_RIDE_RIGHT
BC NOTPRECOL
LDI *+AR7(DELTA_PSTAT),R0 ;IN FRONT OF PLAYER?
BZ NOTPRECOL
LDI 1,R0
STI R0,*+AR7(RHO_YELL)
RANDN 10
CMPI 7,R0
BGT IIIL
LDI *+AR7(RHO_INIT),AR2
MPYI RT_SIZE,AR2
ADDI @RHO_TABLEI,AR2
LDI *+AR2(RT_ONSCREAM),AR2
CMPI 0,AR2
CALL ONESNDFX
LDIC 1,R0
LDINC 0,R0
STI R0,*+AR7(RHO_YELL)
BU NONOISE
LDI *+AR7(RHO_INIT),R0
MPYI RT_SIZE,R0
ADDI @RHO_TABLEI,R0
LDI R0,AR2
LDI *+AR2(RT_ONSCREAM),R0
BZ NOLOAD
LDI R0,AR2
BU LLL88
IIIL
NOLOAD
RANDN B4HIT_SIZE
LDI R0,AR2
ADDI @B4HIT_TABLEI,AR2
LDI *AR2,AR2
LLL88 CALL ONESNDFX
LDIC 1,R0
LDINC 0,R0
STI R0,*+AR7(RHO_YELL)
LDF *+AR7(DELTA_THROTTLE),R2
MPYF 0.01,R2
STF R2,*+AR5(CARTHROTTLE)
BU L99
NOTPRECOL
;set throttle
CLRF R2
STF R2,*+AR5(CARBRAKE)
LDF *+AR7(DELTA_THROTTLE),R2
MPYF 1.01,R2
CMPF MIN_THROTTLE,R2
LDFLT MIN_THROTTLE,R2
CMPF MAX_THROTTLE,R2
LDFGT MAX_THROTTLE,R2
STF R2,*+AR7(DELTA_THROTTLE)
STF R2,*+AR5(CARTHROTTLE)
L99
LDF *+AR7(DELTA_RADYDELTA),R2
MPYF 2.50,R2 ;depending on plyr.asm this may have to
CALL DRONEGO
CALL GETTRAK
RHO_SLP:
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
.GLOBL SEND_RHO_POS
CALLNZ SEND_RHO_POS ;SEND YOUR POSITION TO LINKED GAME
CALL CKCAROFF ;OFF THE UNIVERSE ???
BZ RHO_DIE ;YES
SLEEP 1
BU RHO_LP
*----------------------------------------------------------------------------
*
*CHECK IF OFF THE UNIVERSE
*RET EQ (R0=0) IF OFF UNIVERSE, NE (R0=1) IF IN BOUNDS
*AR7=DRONE PROCESS
*
CKCAROFF
LDI *+AR7(DELTA_TPIECE),R0
LDI @DYNALIST_TRUEBEGIN,AR0
CMPI AR0,R0
BEQ CKCXFAIL
LDI *+AR0(OUSR1),R0
LDI *+AR7(DELTA_LAST_OID),R1
CMPI R0,R1
BLE CKCXFAIL
LDI @DYNALIST_END,AR0 ;GET FURTHEST ROAD ID
LDI *+AR0(OUSR1),R0
CMPI R0,R1
BLT CKCXPASS
CKCXFAIL
LDI 0,R0
RETS
CKCXPASS
LDI 1,R0
RETS
*----------------------------------------------------------------------------
*FREE UP THE ALLOCATED STRUCTURES, DELINK THE LINKS, AND
*KILL THE PROCESS
*
RHO_DIE:
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
BZ RHO_DIE1 ;NO, BLOW OUT...
CALL COMPTRAK
BLE RHO_DIE0
CALL SEND_RHO_XSFER
B OM_DRONE ;CONTROL SWAPS TO OTHER MACHINE
RHO_DIE0
LDI *+AR5(CARNUM),R0 ;GET ID
CALL SEND_RHO_KILL ;KILL OFF THE UTHA MACHINES MUTHA
RHO_DIE1
CALL FREE_DRONE
LDI AR5,AR2
CALL DELCAR
LDI 1,R0
LS O_PROC_B,R0
LDI *+AR4(OFLAGS),R1
ANDN R0,R1
STI R1,*+AR4(OFLAGS)
LDI *+AR4(OFLAGS),R0
TSTB O_DYNAMIC,R0
BZ NODYNALEAN
LDI *+AR4(ORADZ),AR2
CALL PRC_KILL
NODYNALEAN
LDI AR4,AR2
CALL OBJ_DELETE
DIE
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*THE RHO HAS BEEN HIT NOW CHOOSE
*
* uneffected (if low intensity)?
* smoke out death?
* flame out?
* flame burst?
* total explosion?
* geometric expansion?
* star trek fadeout?
* defender pixelate?
* lawnmower-man ping pong?
* toaster smear?
* other ridiculas event?
*
*
;COLTABI .word COLTAB
;COLTAB .word SCOLLA,SCOLLB,SCOLLC
RHO_ISHIT:
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)
; INCM @CAR_COLLS
CREATEC SMOKE_PUFF,SPAWNER_C
CREATEC EXP_PUFF,SPAWNER_C
LDI 10,AR6
RHO_ISHITLP
LDI @SUSPEND_MODE,R0
CMPI SM_HALT,R0
BEQ RHOISHIT_SLP
DEC AR6
CMPI 0,AR6
BLT NOSMK
CREATEC SMOKE_PUFF,SPAWNER_C
NOSMK
;dont disolve
;
;
LDI *+AR5(CARTRAK),R0
STI R0,*+AR7(DELTA_TPIECE)
;find piece which points to piece if it is not found
;or it is the initial piece exit rho code and commit
;suicide
LDI *+AR5(CARTRAK),AR1
LDI @DYNALIST_TRUEBEGIN,AR0
CMPI AR0,AR1
BEQ RHO_DIE
LDI *+AR0(OUSR1),R0
LDI *+AR1(OUSR1),R1
CMPI R0,R1
BLT RHO_DIE
;for now we die out
CLRF R2
STF R2,*+AR7(DELTA_THROTTLE)
STF R2,*+AR5(CARTHROTTLE)
; LDF *+AR7(DELTA_RADYDELTA),R2
STF R2,*+AR7(DELTA_RADYDELTA)
CALL DRONEGO
CALL GETTRAK
RHOISHIT_SLP
SLEEP 1
LDI @HEAD2HEAD_ON,R0 ;HEAD 2 HEAD RACE???
CALLNZ SEND_RHO_POS ;SEND YOUR POSITION TO LINKED GAME
BU RHO_ISHITLP
*----------------------------------------------------------------------------
*
*TRANSFER CAR TO OTHER MACHINE
*AR4=CAR
*AR5=CAR BLOCK
*AR7=PROCESS
*
SEND_RHO_XSFER:
LDI CB_RHO_XSFER,R0 ;MESSAGE HEADER
*SEND MESSAGE HEADER
LDI @COMMQ_TMP_BUFFI,AR2
STI R0,*AR2
*SEND CAR ID #
LDI *+AR5(CARNUM),R0
STI R0,*+AR2(1)
*SEND CAR STATE, 1=HIT
LDI *+AR4(OID),R0
AND DEAD_VEH_T,R0
STI R0,*+AR2(2)
LDI 3-1,RC
CALL MESSAGE_ADD
POP R0 ;CLEAN OFF STACK
LDI 1,R0
STI R0,*+AR5(CAR_OM)
B OM_DRONE ;NOW CONTROLLED BY OTHER MACHINE
*
*GET A CAR FROM OTHER MACHINE
*AR4=CAR
*AR5=CAR BLOCK
*AR7=PROCESS
*
*NOTE SHOULD ADD IN FUTURE: CAR_SPIN,CARSPRAD,CARGEAR,CARRPM,CARSKID
.GLOBL DECODE_RACER_XSFER
DECODE_RHO_XSFER:
LDI @IGNORE_UPDATES,R0 ;RACE OVER?
BNZ DECRHOX2 ;YES, NO UPDATES ALLOWED...
CALL FIND_DRONE ;FIND CAR ID #
BNZ DECRHOX ;CAR NOT FOUND
*INITIALIZE SHIT
LDI AR0,AR4 ;SAVE CAR INDEX
LDI *+AR4(OCARBLK),AR5 ;GET CAR BLOCK
LDI *+AR4(OPLINK),AR7 ;GET PROCESS
LDI @RHO_ACTIVE_XSFERI,R2
STI R2,*+AR7(PWAKE) ;CHANGE WAKE-UP ADDR
LDI *AR2++,R0 ;GET CAR STATE 1=HIT, 0=ACTIVE
STI R0,*+AR7(PR4) ;SAVE CODE IN REGISTER
RETS
DECRHOX2
ADDI 2,AR2 ;UPDATES NOT ALLOWED
RETS
DECRHOX
ADDI 1,AR2 ;COULDN'T FIND CAR ERROR
RETS
*
*TRANSFER ACTIVE RHO
*
RHO_ACTIVE_XSFERI .WORD RHO_ACTIVE_XSFER
RHO_ACTIVE_XSFER:
LDI 0,R0
STI R0,*+AR5(CAR_OM) ;CAR BELONGS TO ME NOW!!!
LDI *+AR5(CARTRACK_ID),R2 ;GET TRACK ID
STI R2,*+AR7(DELTA_LAST_OID) ;SAVE IT HERE ALSO
LDI @DYNALIST_END,AR0 ;GET FURTHEST ROAD ID
LDI *+AR0(OUSR1),R0
CMPI R0,R2
BGT RHO_DIE0 ;TOO FAR OUT, DIE
LDI @DYNALIST_TRUEBEGIN,AR0
LDI *+AR0(OUSR1),R0
CMPI R0,R2
BLT RHO_DIE0 ;BEHIND US KILL HIM
CALL FIND_DYNA ;GET TRACKING PIECE POINTER
STI AR2,*+AR7(DELTA_TPIECE)
LDF 0,R0
STF R0,*+AR5(CARDROT) ;CLEAN UP REENTRY
STF R0,*+AR5(CARSPRAD)
STF R0,*+AR5(CARSKID)
LDI 0,R0
STI R0,*+AR5(CAR_SPIN)
LDI R4,R4 ;CHECK HIT RHO
BZ RHO_LP
LDI 0,AR6 ;WERE HIT, GO TO DEAD LOOP
LDI *+AR4(OID),R0 ;MAKE 'EM DEAD
ANDN TYPE_M,R0
OR DEAD_VEH_T,R0
STI R0,*+AR4(OID)
STI R0,*+AR5(CAR_ID)
STI R0,*+AR7(PID)
CALL GETTRAK
LDF 0,R0
STF R0,*+AR7(DELTA_RADYDELTA) ;CLEAR THIS BULLSHIT
B RHO_ISHITLP
*
*KILL OFF RHO MESSAGE
*R0=ID
*
SEND_RHO_KILL:
LDI @COMMQ_TMP_BUFFI,AR2
LDI CB_RHO_KILL,R1
STI R1,*AR2
STI R0,*+AR2(1)
LDI 2-1,RC
CALL MESSAGE_ADD
RETS
*
*KILL OFF RHO
*
DECODE_RHO_KILL:
LDI @IGNORE_UPDATES,R0
BNZ DRKXX
CALL FIND_DRONE ;GET DRONE OBJ IN AR0
BNZ DRKX
LDI *+AR0(OPLINK),AR7
LDI @RHO_DIE1I,R2 ;KILL THE SOMBITCH
STI R2,*+AR7(PWAKE) ;CHANGE WAKE-UP ADDR
DRKX
RETS
DRKXX
INC AR2
RETS
RHO_DIE1I .WORD RHO_DIE1
.GLOBL DECODE_RHO_KILL,DECODE_RHO_XSFER
.GLOBL COMPTRAK,FIND_DRONE,FIND_DYNA
*----------------------------------------------------------------------------
.END