cruisin-usa/BACKGRND.ASM

2462 lines
44 KiB
NASM
Executable File

.FILE "BACKGRND.ASM"
*----------------------------------------------------------------------------
*BACKGROUND ALLOCATION/DEALLOCATION SYSTEM
*
*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 CORNOBJ.EQU
.text
.bss STARTSECTION,1 ;Section index to start game at
.bss START_POS,3 ;Section X Y Z start (if DEBUGSECTION != 0)
.bss START_RADY,1 ;Section Y Radian (if DEBUG SECTION != 0)
.bss DRIVE_LIST,1 ;OBJECTs which can be driven over (road/shoulder)
.bss CAR_LIST,1 ;OBJECTs which are vehicles (drones/player car)
.bss SIGN_LIST,1 ;OBJECTs which are signs (posts, road signs, trees etc)
.bss GROUND_LIST,1 ;OBJECTs which define the the ground but are not ROAD_C or SHLDR_C
*----------------------------------------------------------------------------
*DYNAMIC fLEX OBJECTS (THE ACTUAL ROAD OBJECTS (LIST))
*
* OLINK2 GROUP SUBLINK (standard)
* OLINK4 DYNATRACK fLEX LINK
* OBLINK4 DYNATRACK fLEX BACK LINK (== OPLINK)
* OUSR1 fLEX code
*
*
NEW_GROUPI
.word NEW_GROUP
.bss NEW_GROUP,1 ;TEMP PTR TO START OF NEW DGROUP LIST
DGROUPSI
.word DGROUPS
.bss DGROUPS,DGRP_SIZE*MAX_DGROUPS
.bss DGROUP_COUNT,1 ;NUMBER OF ACTIVE BACKGRNDS (on DYNA LIST)
.bss DGROUP_AW,1 ;activate watch pointer (->TYCO.ASM)
.bss DYNALIST_TRUEBEGIN,1 ;FIRST ELEMENT OF DYNAFLEX LIST
.bss DYNALIST_BEGIN,1 ;FIRST ELEMENT OF DYNAFLEX LIST (SECOND SET)
.bss DYNALIST_END,1 ;LAST ELEMENT OF DYNAFLEX LIST
.bss SUBLIST_BEGIN,1 ;FIRST ELEMENT OF SUBLIST (OLINK 3)
.bss SUBLIST_END,1 ;LAST ELEMENT OF SUBLIST (OLINK 4)
.bss STARTS,1
*----------------------------------------------------------------------------
.bss SECTIONIDX,1 ;section index (of next to activate)
.bss TYCO_TRACK,1
.bss TYCO_TRACK_NTL,1
.bss TYCO_NTL_IDX,1
ATTRACT_ACTIVATE_DIST .float 15000
ACTIVATE_DIST .float 5000 ;to activate
DACT_DIST .float 80000 ;dynamic activate distance
DDACT_DIST .float 15000 ;dynamic activate distance (+ radius)
;ATTR_DDACT_DIST .float 35000 ;dynamic deactivate distance (+ radius)
ATTR_DDACT_DIST .float 45000 ;dynamic deactivate distance (+ radius)
*----------------------------------------------------------------------------
FIND_STARTING_VALUES:
LDI @TYCO_TRKI,AR1
LDI @STARTSECTION,R0 ;first time dont do the crime
CMPI 0,R0
BEQ NOWARP
LDI R0,AR0
DEC AR0
LPP LDI *AR1++(6),R1
TSTB 1,R1
BZ NOOVER
ADDI 1,AR1
NOOVER TSTB SC_REVERSE,R1
BZ CNT
NOP *AR1++(4)
CNT TSTB SC_OVER2,R1
BZ CNTN
NOP *AR1++ ;OVERLAY 2
CNTN DBU AR0,LPP
NOWARP
STI AR1,@TYCO_TRACK
STI AR1,@DGROUP_AW
STI R0,@SECTIONIDX
STI R0,@TYCO_NTL_IDX
LDF *++AR1,R0
STF R0,@START_POS
LDF *++AR1,R0
STF R0,@START_POS+Y
LDF *++AR1,R0
STF R0,@START_POS+Z
LDF *++AR1,R2
STF R2,@START_RADY
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*INITIALIZE the background system for the game
*
*
BGD_INIT:
CLRI R0
STI R0,@DGROUP_COUNT
STI R0,@DYNALIST_END
STI R0,@DYNALIST_BEGIN
STI R0,@SIGN_LIST
STI R0,@TYCO_NTL_IDX
; LDI @_MODE,R1
; AND MMODE,R1
; CMPI MATTR,R1
; BEQ REGULAR_START ;START AT WORLD BEGINING
; .if DEBUG
; .globl DEBUG_STARTSECTION
; .data
;DEBUG_STARTSECTION .word 0
; .text
; LDI @DEBUG_STARTSECTION,R0
; BZ L17
; STI R0,@STARTSECTION
; .globl SECTION_SETUP
; CALLNZ SECTION_SETUP
;L17
; .endif
CALL FIND_STARTING_VALUES
BU KKTIL
REGULAR_START ;kept for attract mode only
CLRI R0
STI R0,@SECTIONIDX
STI R0,@TYCO_NTL_IDX
LDI @TYCO_TRKI,R0
STI R0,@TYCO_TRACK
STI R0,@DGROUP_AW
CLRF R0
STF R0,@START_POS+X
STF R0,@START_POS+Y
STF R0,@START_POS+Z
STF R0,@START_RADY
KKTIL
LDI @DGROUP_AW,AR2
LDI AR2,AR0
CALL BGD_ACTIVATE_TYCOGROUP ;returns top pointer in R0
LDI @DGROUPSI,AR1
STI R0,*+AR1(DGRP_HEAD) ;lead object (link by OLINK3)
STI AR0,*+AR1(DGRP_BIN) ;rom struct ptr
LDI @STARTS,R0
STI R0,*+AR1(DGRP_FSTART)
LDI @SECTIONIDX,R0
STI R0,*+AR1(DGRP_IDX) ;SAVE THE INDEX #
STI R0,@TYCO_NTL_IDX
LDI @TYCOFLAG,R0
STI R0,*+AR1(DGRP_FLAG) ;SAVE THE TYCOFLAG
INCM @DGROUP_COUNT
LDI @DGROUP_AW,AR0
STI AR0,@TYCO_TRACK_NTL
LDI *AR0++(6),R1
TSTB 1,R1
BZ NOOVERD
ADDI 1,AR0
NOOVERD
TSTB SC_REVERSE,R1
BZ CNT55a
NOP *AR0++(4)
CNT55a TSTB SC_OVER2,R1
BZ NOO2a
ADDI 1,AR0
NOO2a STI AR0,@DGROUP_AW
.if DEBUG
LDI @DGROUP_COUNT,R0
CMPI 1,R0
SLOCKON NE,"DGROUP\BACKGRND_INIT ERROR"
.endif
PUSH AR6
LDI @DGROUPSI,AR1
LDI 3,AR6
LPP5
LDI @DGROUP_AW,AR2
LDI AR2,AR0
CALL BGD_ACTIVATE_TYCOGROUP ;returns top pointer in R0
STI R0,*+AR1(DGRP_HEAD+DGRP_SIZE) ;lead object (link by OLINK3)
STI AR0,*+AR1(DGRP_BIN+DGRP_SIZE) ;rom struct ptr
LDI @STARTS,R0
STI R0,*+AR1(DGRP_FSTART+DGRP_SIZE)
LDI @SECTIONIDX,R0
STI R0,*+AR1(DGRP_IDX+DGRP_SIZE) ;SAVE THE INDEX #
LDI @TYCOFLAG,R0
STI R0,*+AR1(DGRP_FLAG+DGRP_SIZE) ;SAVE THE TYCOFLAG
INCM @DGROUP_COUNT
LDI @DGROUP_AW,AR0
LDI *AR0++(6),R1
TSTB 1,R1
BZ NOOVERE
ADDI 1,AR0
NOOVERE TSTB SC_REVERSE,R1
BZ CNT55d
NOP *AR0++(4)
CNT55d TSTB SC_OVER2,R1
BZ NOO2d
ADDI 1,AR0
NOO2d STI AR0,@DGROUP_AW
ADDI DGRP_SIZE,AR1
DBU AR6,LPP5
POP AR6
CREATE BGD_WATCHER,UTIL_C|BACKGRND_T
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*CONTROLLING PROCESS FOR THE DYNAMIC TRACK ALLOCATION SYSTEM
*
* CONTROLS:
* 1) WHEN ROUTINE IS CALLED
* 2) WHEN NEW SECTION IS LOADED
* 3) WHEN OLD SECTION IS DELETED
*
*
BGD_SLP
SLEEP 1
BGD_WATCHER:
LDI @_MODE,R0
AND MMODE,R0
CMPI MGAME,R0
BEQ LLKK
CMPI MATTR,R0
BNE BGD_SLP
LLKK
;--------------------------------------------------------------------
;CHECK #1: HAVE WE CROSSED A THRESHOLD?
;
;if (distance_to(THRESHOLD_POS) < ACTIVATE_DIST)
; CALL routine
; increment THRESHOLD CHECK PTR
;
;New Method::
; if Closest Road Piece ROAD_ID (OUSR1) > Checkpoint ROAD_ID
; CALL routine
; increment THRESHOLD CHECK PTR
;
LDI @_MODE,R0
AND MMODE,R0
CMPI MGAME,R0
BNE NO_ACTIVATION
LDI @PLYCBLK,AR0
LDI *+AR0(CARTRAK),AR0
LDI *+AR0(OUSR1),R0
LDI @TYCO_NTL_IDX,R1
LS 8,R1
CMPI R1,R0
BLT NO_ACTIVATION
;blah.asm
LDI @TYCO_TRACK_NTL,AR2
LDI *AR2,AR0
RS 16,AR0
AND 0FFh,AR0
LDI AR0,R0
CALLNZ SECTION_ROUTINE
LDI @TYCO_NTL_IDX,R0
INC R0
STI R0,@TYCO_NTL_IDX
LDI @TYCO_TRACK_NTL,AR1
LDI *AR1++(6),R1
TSTB 1,R1
BZ NOOVERA
ADDI 1,AR1
NOOVERA TSTB SC_REVERSE,R1
BZ CNTFF
NOP *AR1++(4)
CNTFF TSTB SC_OVER2,R1
BZ NOO2FF
ADDI 1,AR1
NOO2FF STI AR1,@TYCO_TRACK_NTL
;in the end we probably want this check to insure we dont
;continue trying to allocated beyond the end of the defined game
;although this can also be done by a routine...
;
; LDI @SECTIONIDX,R1
; LDI @TYCO_LENGTH,R0
; CMPI R0,R1
; BGE SUICIDE
NO_ACTIVATION
;--------------------------------------------------------------------
;CHECK #2: SHOULD THE NEXT SECTION BE ACTIVATED?
;
;if (distance_to(DGROUP_AW) < DACT_DIST)
; CALL BGD_ACTIVATE_TYCOGROUP(AR2 <- GROUP_POINTER)
; SETUP DGROUP STRUCTURE (APPEND TO END OF LIST)
; INCM @DGROUP_COUNT
; increment DGROUP_AW //DGROUP ACTIVATE WATCH
;
;
LDI @DGROUP_AW,AR0
LDI AR0,AR2
ADDI 1,AR2
LDI @CAMERAPOSI,R2
CALL GET_XZ_DISTANCE
CMPF @DACT_DIST,R0
BGT NOACT
LDI AR0,AR2
CALL BGD_ACTIVATE_TYCOGROUP ;returns top pointer in R0
LDI @DGROUP_COUNT,AR1
MPYI DGRP_SIZE,AR1
ADDI @DGROUPSI,AR1
STI R0,*+AR1(DGRP_HEAD) ;lead object (link by OLINK3)
STI AR0,*+AR1(DGRP_BIN) ;rom struct ptr
LDI @SECTIONIDX,R0
STI R0,*+AR1(DGRP_IDX) ;SAVE THE INDEX #
LDI @TYCOFLAG,R0
STI R0,*+AR1(DGRP_FLAG) ;SAVE THE TYCOFLAG
LDI @STARTS,R0
STI R0,*+AR1(DGRP_FSTART)
INCM @DGROUP_COUNT
LDI *AR0++(6),R1
TSTB 1,R1
BZ NOOVERB
ADDI 1,AR0
NOOVERB TSTB SC_REVERSE,R1
BZ CNT55
NOP *AR0++(4)
CNT55 TSTB SC_OVER2,R1
BZ NOO2
ADDI 1,AR0
NOO2 STPI AR0,@DGROUP_AW
NOACT ;end of activation routine
;--------------------------------------------------------------------
;CHECK #3: SHOULD THE OLDEST SECTION BE DEACTIVATED?
;
;if (distance_to(THRESHOLD_POS) < DACT_DIST)
; CALL GROUP_DELETE
; PACK DGROUP STRUCTURES
; DECM @DGROUP_COUNT
; increment DGROUP_AW //DGROUP ACTIVATE WATCH
;
;
LDI @(DGROUPS+DGRP_BIN),AR2
INC AR2
LDI @CAMERAPOSI,R2
CALL GET_XZ_DISTANCE
LDI @(DGROUPS+DGRP_BIN),AR0
LDI *+AR0(TB_GROUP),AR0
SUBF *AR0,R0
LDI @_MODE,R1
AND MMODE,R1
CMPI MATTR,R1
BNE GAMECHK
CMPF @ATTR_DDACT_DIST,R0
BLT NODEACT
BU DO_DEL
GAMECHK CMPF @DDACT_DIST,R0
BLT NODEACT
DO_DEL
LDI @(DGROUPS+DGRP_HEAD),AR2
CALL GROUP_DELETE
LDI @(DGROUPS+DGRP_SIZE+DGRP_FSTART),AR2
STI AR2,@DYNALIST_BEGIN
STI AR2,@DYNALIST_TRUEBEGIN
CLRI R0
STI R0,*+AR2(OBLINK4) ;NULL TERMINATE BACK LINK ON LIST
;REPACK DGROUP SECTIONS
;
;for i = 1 to dgroup_count
; memcpy(dgroup[i-1], dgroup[i], sizeof(dgroup))
;
LDI @DGROUP_COUNT,RC
SUBI 2,RC
.if DEBUG
CMPI 0,RC
SLOCKON LT,"BACKGRND\LBACK_WATCH ERROR"
.endif
BLT SHIFT1
LDI @DGROUPSI,AR0
LDI AR0,AR1
ADDI DGRP_SIZE,AR1
RPTB LL45
SHIFT1 LDI *AR1++,R0
STI R0,*AR0++
LDI *AR1++,R0
STI R0,*AR0++
LDI *AR1++,R0
STI R0,*AR0++
LDI *AR1++,R0
STI R0,*AR0++
LDI *AR1++,R0
LL45 STI R0,*AR0++
DECM @DGROUP_COUNT
NODEACT
.if DEBUG
;DEBUGGING CHECK TO VERIFY THAT WE NEVER EXCEED
;THE AMOUNT OF DGROUPs WE CAN HANDLE
;
LDI @DGROUP_COUNT,R0
SLOCKON LE,"BACKGRND\LBACK_WATCH ERRONEOUS DGROUP_COUNT LE"
CMPI MAX_DGROUPS,R0
SLOCKON GE,"BACKGRND\LBACK_WATCH ERRONEOUS DGROUP_COUNT GE"
.endif
SLEEP 3
B BGD_WATCHER
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*ACTIVATE A TYCO GROUP (ROAD PIECES ARE LINKED, ETC.)
*
*PARAMETERS
* AR2 PTR TO TYCO BLOCK
*
*
*
NEWSUBLIST_TOP .word NEWSUBLIST_TOPB
.bss NEWSUBLIST_TOPB,1 ;POINTER TO TOP OF SUBLIST (OF GROUP)
.bss GROUP_RADY,1 ;CURRENT SUBLIST Y RADIAN
.bss TYCOFLAG,1 ;CURRENT SUBLIST TYCOFLAG (FROM ROM)
.bss PASS1,1 ;CURRENT PASS INDEX (0,1) (USED WHEN ACTIVATING AN OVERLAY)
.bss SECRADY,1 ;SECTION RADIAN Y
BGD_ACTIVATE_TYCOGROUP:
PUSH R4
PUSH R5
PUSH AR0
PUSH AR1
PUSH AR2
PUSH AR4
PUSH AR5
PUSH AR7
LDI @SECTIONIDX,R0
INC R0
STI R0,@SECTIONIDX
*CORNFLAKE CHECK
CMPI 4,R0
BNE NOTCORNFLAKE
PUSH AR4
LDL cornpops,AR2
LDI 6700,R2
LDI -4250,R3
LDI 32600,RC
.data
LVAL .word 151720
.text
ADDI @LVAL,RC
CALL OBJ_QMAKE
LDI AR0,AR4
LDF -0.2,R2
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL FIND_YMATRIX
LDI *+AR4(OFLAGS),R0
OR O_1PAL,R0
STI R0,*+AR4(OFLAGS)
LDL CORNPAL,AR2
CALL PAL_FIND_RAW
STI R0,*+AR4(OPAL)
LDI AR4,AR2
CALL OBJ_INSERT
LDI @SECTIONIDX,R0
LS 8,R0
OR 0AAh,R0
STI R0,*+AR4(OLINK2)
POP AR4
NOTCORNFLAKE
*CORNFLAKE END CHECK
LDI -1,R0
STI R0,@SUBLIST_BEGIN
CLRI R0
STI R0,@PASS1
STI R0,@NEW_GROUP
LDI @TYCO_TRACK,AR2
LDI AR2,AR7 ;DEDICATED POINTER
LDI *AR7,R0 ;LOAD FLAG
STI R0,@TYCOFLAG
TSTB SC_OVERLAY,R0
BZ NOVRDD
ADDI 1,AR2
NOVRDD TSTB SC_REVERSE,R0
BZD REG_LD
NOP
ADDI TB_REGSIZE-1,AR2
STI AR2,@TYCO_TRACK
;----> BZD REG_LD
ADDI TB_RVSSIZE-TB_REGSIZE,AR2 ;REVERSED SECTION HAS LARGER STRUCTURE
STI AR2,@TYCO_TRACK
REG_LD TSTB SC_OVER2,R0 ;hopefully...
BZ NOEXTRA
LDI @TYCO_TRACK,R0
INC R0
STI R0,@TYCO_TRACK
NOEXTRA
LDF *+AR7(TB_RADY),R0
STF R0,@SECRADY
LDI @MATRIXAI,AR2 ;Group rotation matrix
LDF @SECRADY,R2
CALL HPFIND_YMATRIX ;require High Precision
LDI *+AR7(TB_GROUP),AR5 ;Group pointer
ADDI 1,AR5 ;skip radius
LDI @SECTIONIDX,R0
LS 8,R0
OR 0AAh,R0
STI R0,@NEWSUBLIST_TOPB
PUSH R0
LDI *AR5++,R4 ;get number of objects to load
SLOCKON LE,"BACKGRND 1"
SUBI 1,R4
CMPI @OFREECNT,R4
SLOCKON GT,"BACKGRND\ACTIVATE TYCOGROUP OUT OF OBJECTS"
L12
LDI *AR5++,AR2 ;GET MODEL PTR
CALL OBJ_GETE
SLOCKON C,"BACKGRND\ACTIVATE DANGER ERROR *FATAL*"
BC ACTIVATE_X
;INTERNAL LINK (FOR DEALLOCATION)
LDI AR0,AR4 ;SET OBJECT ROM PTR
POP R0 ;GET LAST BACK LINK
STI R0,*+AR4(OLINK2)
PUSH R0
FLOAT *AR5++,R1 ;GET X POSITION
STF R1,*+AR4(OPOSX)
FLOAT *AR5++,R1 ;GET Y POSITION
LDI @TYCOFLAG,R0
TSTB SC_REVERSE,R0
BZD NOTREVERSED
STF R1,*+AR4(OPOSY)
FLOAT *AR5++,R1 ;GET Z POSITION
STF R1,*+AR4(OPOSZ)
;---->BZD NOTREVERSED
;
; SPECIAL REVERSED CASE
;
PUSH AR7
TSTB SC_OVERLAY,R0
BNZ ISOVER
DEC AR7
ISOVER
LDF *+AR7(TB_RVS_POSX),R0 ;TRANSLATE BY THE NEGATIVE OFFSET
ADDF *+AR4(OPOSX),R0 ;POSITION (THIS BLOCKS ENDING POSITION)
STF R0,*+AR4(OPOSX)
LDF *+AR7(TB_RVS_POSY),R0
ADDF *+AR4(OPOSY),R0
STF R0,*+AR4(OPOSY)
LDF *+AR7(TB_RVS_POSZ),R0
ADDF *+AR4(OPOSZ),R0
STF R0,*+AR4(OPOSZ)
POP AR7
LDI @MATRIXAI,R2
LDI AR4,AR2
ADDI OPOSX,AR2
LDI @VECTORAI,R3
CALL MATRIX_MUL ;rotation by occurance matrix
LDI @VECTORAI,AR0
LDF *AR0++,R1
ADDF *+AR7(TB_POSX),R1
STF R1,*+AR4(OPOSX)
LDF *AR0++,R1
ADDF *+AR7(TB_POSY),R1
STF R1,*+AR4(OPOSY)
LDF *AR0++,R1
ADDF *+AR7(TB_POSZ),R1
STF R1,*+AR4(OPOSZ)
LDF *AR5++,R2 ;GET Y ROT
ADDF @SECRADY,R2
STF R2,*+AR4(ORADY)
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL HPFIND_YMATRIX
BU JOIN_UP
NOTREVERSED
LDI @MATRIXAI,R2
LDI AR4,AR2
ADDI OPOSX,AR2
LDI R2,R3
LDI @VECTORAI,R3
CALL MATRIX_MUL ;ROTATION BY OCCURANCE MATRIX
LDI @VECTORAI,AR0
LDF *AR0++,R1
ADDF *+AR7(TB_POSX),R1
STF R1,*+AR4(OPOSX)
LDF *AR0++,R1
ADDF *+AR7(TB_POSY),R1
STF R1,*+AR4(OPOSY)
LDF *AR0++,R1
ADDF *+AR7(TB_POSZ),R1
STF R1,*+AR4(OPOSZ)
LDF *AR5++,R2 ;SET THE RADIANS FOR THE OBJECT
ADDF @SECRADY,R2
STF R2,*+AR4(ORADY)
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL HPFIND_YMATRIX
JOIN_UP
LDI *AR5++,R1 ;LOAD OBJECT ID (GENV STYLE)
LDI R1,R2
AND CLASS_M|TYPE_M|SUBTYPE_M,R1
STI R1,*+AR4(OID)
;TEST TO SEE IF WE SHOULD CALL A SPECIAL ROUTINE
;OR PALETTE SHIFT
;
TSTB BGD_ROUTINE,R2
CALLNZ BGD_OROUTINE
LDI R2,R0
RS 16,R2
AND O_GENVSPEC,R2 ;make sure list data is not ORed in
TSTB BGD_BIGOBJ,R0 ;BIG OBJECT TEST
BZ NOTBIGOBJ
LDI 1,R0
LS O_BIGOBJECT_B,R0
OR R0,R2
NOTBIGOBJ
OR *+AR4(OFLAGS),R2 ;or in the flags
STI R2,*+AR4(OFLAGS)
LDI AR4,AR2
CALL OBJ_INSERT ;INSERT THE BABE
;NOW FIND IF THE OBJECT BELONGS IN A SUPPLIMENTAL
;LIST.
;OID = x3xx -> DRIVE_SUPP
; x4xx -> BUILD_SUPP
;
LDI *+AR4(OID),R0
AND CLASS_M,R0
CMPI ROAD_C,R0
BNE NOTDRIVE
LDI @DRIVE_LIST,AR0
STI AR0,*+AR4(OLINK3)
STI AR4,@DRIVE_LIST
LDI 1,R1
BUD DONELISTS
LS 28,R1 ;O_ROAD_SUPP
OR *+AR4(OFLAGS),R1
STI R1,*+AR4(OFLAGS)
NOTDRIVE
CMPI GROUND_C,R0
BNE NOTGROUND
LDI @GROUND_LIST,AR0
STI AR0,*+AR4(OLINK3)
STI AR4,@GROUND_LIST
LDI 1,R1
LS O_GROUND_B,R1
OR *+AR4(OFLAGS),R1
STI R1,*+AR4(OFLAGS)
B DONELISTS
NOTGROUND
CMPI TSIGN_C,R0
BNE NOTSIGN
LDI @SIGN_LIST,AR0
STI AR0,*+AR4(OLINK3)
STI AR4,@SIGN_LIST
LDI 1,R1
LS O_SIGN_SUPP_B,R1
OR *+AR4(OFLAGS),R1
STI R1,*+AR4(OFLAGS)
B DONELISTS
NOTSIGN
CMPI 0B00h,R0
BNE NOTDYNAROAD
;
;add this element to dynamic fLEX list
;
LDI @SECTIONIDX,R1
LS 8,R1
LDI *+AR4(OID),R0
AND 0FFh,R0
LDI @TYCOFLAG,R2 ;in the case of reversed track
TSTB SC_REVERSE,R2 ;we say the index value is
BZ NOTRVSTRK ;255 - index
SUBRI 255,R0 ;
NOTRVSTRK ;
OR R1,R0
STI R0,*+AR4(OUSR1)
LDI 0300h,R0
STI R0,*+AR4(OID)
LDI @DRIVE_LIST,AR0
STI AR0,*+AR4(OLINK3)
STI AR4,@DRIVE_LIST
LDI 1,R1
LS O_DRIVE_SUPP_B,R1
OR *+AR4(OFLAGS),R1
STI R1,*+AR4(OFLAGS)
CALL ADD_TO_NEWLIST
BU DONELISTS
NOTDYNAROAD
DONELISTS
SUBI 1,R4
BGE L12
ACTIVATE_X
POP AR0 ;clear stack of last item
LDI @PASS1,R0
BNZ CHECK2
LDI 1,R0
STI R0,@PASS1
LDI *AR7,R0 ;load flag
TSTB SC_OVERLAY,R0
BZ CHECK2II
LDI *+AR7(TB_GROUPOVERLAY),AR5 ;Group pointer
ADDI 1,AR5 ;skip radius
LDI @NEWSUBLIST_TOPB,R0
PUSH R0
LDI *AR5++,R4 ;get number of objects to load
SLOCKON LE,"BACKGRND ERRONEOUS GROUP LOADED"
SUBI 1,R4
CMPI @OFREECNT,R4
SLOCKON GT,"BACKGRND\ACTIVATE TYCOGROUP OUT OF OBJECTS 2"
BU L12
CHECK2
CMPI 2,R0
BEQ NOOVERLAYGROUP
LDI 2,R0
STI R0,@PASS1
LDI *AR7,R0 ;load flag
TSTB SC_OVER2,R0
BZ NOOVERLAYGROUP
PUSH IR0
TSTB SC_REVERSE,R0
LDIZ TB_GROUPOVERLAY+1,IR0
LDINZ TB_GROUPOVERLAY+5,IR0
LDI *+AR7(IR0),AR5 ;Group pointer
ADDI 1,AR5 ;skip radius
TSTB SC_REVERSE,R0
BZ UHNO2
TSTB SC_OVERLAY,R0
LDIZ TB_RVS_RADY-1,IR0
LDINZ TB_RVS_RADY,IR0
LDF *+AR7(IR0),R0
STPF R0,@SECRADY
UHNO2
POP IR0
LDI @TYCOFLAG,R0 ;overlay 2 is not reversed - EVER!
ANDN SC_REVERSE,R0
STI R0,@TYCOFLAG
LDI @NEWSUBLIST_TOPB,R0
PUSH R0
LDI *AR5++,R4 ;get number of objects to load
SLOCKON LE,"BACKGRND ERRONEOUS GROUP LOADED OVER2"
SUBI 1,R4
CMPI @OFREECNT,R4
SLOCKON GT,"BACKGRND\ACTIVATE TYCOGROUP OUT OF OBJECTS 2"
BU L12
CHECK2II
CMPI 2,R0
BEQ NOOVERLAYGROUP
LDI 2,R0
STI R0,@PASS1
LDI *AR7,R0 ;load flag
TSTB SC_OVER2,R0
BZ NOOVERLAYGROUP
PUSH IR0
TSTB SC_REVERSE,R0
LDIZ TB_GROUPOVERLAY,IR0
LDINZ TB_GROUPOVERLAY+4,IR0
LDI *+AR7(IR0),AR5 ;Group pointer
TSTB SC_REVERSE,R0
BZ UHNO
TSTB SC_OVERLAY,R0
LDIZ TB_RVS_RADY-1,IR0
LDINZ TB_RVS_RADY,IR0
LDF *+AR7(IR0),R0
STPF R0,@SECRADY
UHNO
POP IR0
ADDI 1,AR5 ;skip radius
LDI @TYCOFLAG,R0 ;overlay 2 is not reversed - EVER!
ANDN SC_REVERSE,R0
STI R0,@TYCOFLAG
LDI @NEWSUBLIST_TOPB,R0
PUSH R0
LDI *AR5++,R4 ;get number of objects to load
SLOCKON LE,"BACKGRND ERRONEOUS GROUP LOADED OVER2"
SUBI 1,R4
CMPI @OFREECNT,R4
SLOCKON GT,"BACKGRND\ACTIVATE TYCOGROUP OUT OF OBJECTS 2"
BU L12
NOOVERLAYGROUP
;*NOW DO THE FANCY MESS OF:
;*
;* 1) DO WE LOAD A NEW OVERLAY INTO A SECTION?
;* 2) WHICH SECTION DO WE OVERLAY IT INTO (1 OR 2)?
;* 3) WHICH LOOK DO WE PLACE INTO THE SECTION (DESERT..)?
;*
;*
LDI @TYCOFLAG,R0
TSTB SC_LDSECT,R0
BZ NO_NEWLOAD
NO_NEWLOAD
CALL FIND_SUBLIST_START_END
CALL APPEND_NEWLIST
LDI @NEWSUBLIST_TOPB,R0 ;return pointer to 1st object
POP AR7
POP AR5
POP AR4
POP AR2
POP AR1
POP AR0
POP R5
POP R4
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*ADD AN ELEMENT (OBJECT) TO THE NEW LIST BEING CREATED
*SEARCH ON ITS OID SO THAT IT IS IN ORDER
*
*
*PARAMETERS
* AR4 POINTER TO OBJECT
* *AR4(OUSR1) INDEX (lower 2 nybbles of OID)
*
*
*PLACE IN ASCENDING ORDER IN THE LIST
*
*
ADD_TO_NEWLIST:
LDI @NEW_GROUPI,AR1
LDI *AR1,R0
BNZ REGADD
STI AR4,*AR1
CLRI R0
STI R0,*+AR4(OLINK4)
STI R0,*+AR4(OBLINK4)
RETS
REGADD
SUBI OLINK4,AR1
LDI AR1,AR2
LDI *+AR4(OUSR1),R0 ;GET fLEX index number
ADDNOBJL
LDI AR1,AR0 ;AR0 IS PREVIOUS LINK
LDI *+AR1(OLINK4),R1 ;CHECK END OF LIST
BZ ADDNOBJ_AT_END
LDI R1,AR1
CMPI *+AR1(OUSR1),R0
BGT ADDNOBJL
ADDNOBJ_AT_END
STI R1,*+AR4(OLINK4) ;LINK TO NEXT (SUBLIST LINK)
STI AR4,*+AR0(OLINK4) ;LINK FROM PREVIOUS (SUBLIST LINK)
CMPI AR2,AR0 ;IS IT THE HEAD OF LIST WE LOAD AT
LDIEQ 0,AR0
STI AR0,*+AR4(OBLINK4) ;BACK LINK
CMPI 0,R1 ;IS THE NEXT ELEMENT NULL
BEQ ISZERO
LDI R1,AR0 ;IF NOT THE NEXT ELEMENTS BACK LINK
STI AR4,*+AR0(OBLINK4) ; MUST POINT TO NEW ELEMENT
ISZERO
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
FIND_SUBLIST_START_END:
PUSH R1
PUSH AR0
LDI @NEW_GROUP,AR0
.if DEBUG
CMPI 0,AR0
SLOCKON EQ,"BACKGRND\FIND_SUBLIST_START_END"
.endif
STPI AR0,@SUBLIST_BEGIN
FSLP
LDI *+AR0(OLINK4),R1 ;CHECK END OF LIST
BZ FSDN
LDI R1,AR0
BU FSLP
FSDN
STPI AR0,@SUBLIST_END ;ALWAYS NAME IT AS THE END
POP AR0
POP R1
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*APPEND THE NEW LIST TO THE OLD LIST
*
*LINKED VIA OLINK4
*
* DONT FORGET THE BACK LINK
*
* if (DYNALIST empty) {
* DYNALIST_END <- SUBLIST_END
* DYNALIST_TRUE_BEGIN <- SUBLIST_BEGIN
* DYNALIST_BEGIN <- SUBLIST_BEGIN
* STARTS <- SUBLIST_BEGIN
* }
* else {
* *(DYNALIST_END+OLINK4) <- SUBLIST_BEGIN
* DYNALIST_END <- SUBLIST_END new end of list pointer
* STARTS <- SUBLIST_BEGIN
* }
*
*
APPEND_NEWLIST:
LDI @DYNALIST_END,R0
BZ SHINY_NEWLIST
LDI R0,AR0
LDI @SUBLIST_BEGIN,R0
STI R0,*+AR0(OLINK4)
LDI @SUBLIST_END,AR1
STPI AR1,@DYNALIST_END
LDI R0,AR1
STI AR0,*+AR1(OBLINK4)
STPI R0,@STARTS
RETS
SHINY_NEWLIST:
LDI @SUBLIST_END,R0
STPI R0,@DYNALIST_END
LDI @SUBLIST_BEGIN,R0 ;new line, check it out...
STPI R0,@DYNALIST_TRUEBEGIN
LDI @SUBLIST_BEGIN,R0
SLOCKON Z,"BACKGRND\SHINY_NEWLIST"
STPI R0,@DYNALIST_BEGIN
STPI R0,@STARTS
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*DELETE GROUP LIST FROM OBJECT LIST
*
* CYCLE OUT THE LRU IN ACTIVE GROUPS
*
*PARAMETERS
* AR2 ID OF ELEMENTS WITHIN THE LIST
*
*search for items in active
*search for items in idle
*
*
GROUP_DELETE:
PUSH R0
PUSH R1
PUSH AR0
PUSH AR1
LDI @OACTIVEI,R1
CALL DELLP
LDI @IDLE_LISTI,R1
CALL DELLP
POP AR1
POP AR0
POP R1
POP R0
RETS
DELLP LDI R1,AR1 ;WE MUST FIND DEAD OBJECT TO LINK AROUND
LDI *AR1,R1
BZ NXTCHK
LDI R1,AR0
CMPI *+AR0(OLINK2),AR2
BNE DELLP
LDI *AR0,R0 ;find link from delete-e
STI R0,*AR1 ;LINK AROUND
PUSH AR2
LDI AR0,AR2
;Mirror these checks in OBJ.ASM
; 'OBJ_DELETE'
;
LDI *+AR2(OFLAGS),R0 ;KILL PROC ASSOCIATED WITH OBJ
RS (O_DEBRIS_B+1),R0
CALLC FREE_RDDEBRIS
LDI *+AR2(OFLAGS),R0 ;KILL PROC ASSOCIATED WITH OBJ
RS (O_PROC_B+1),R0
CALLC OBJ_FREE_PROC
LDI *+AR2(OFLAGS),R0 ;DELINK IN CASE OF DRIVE LIST
RS (O_DRIVE_SUPP_B+1),R0
CALLC OBJ_FREE_DRIVE
LDI *+AR2(OFLAGS),R0 ;DELINK IN CASE OF GROUND LIST
RS (O_GROUND_B+1),R0
CALLC OBJ_FREE_GROUND
LDI *+AR2(OFLAGS),R0 ;DELINK IN CASE OF SIGN LIST
RS (O_SIGN_SUPP_B+1),R0
CALLC OBJ_FREE_SIGN
POP AR2
CLRI R0
STI R0,*+AR0(OLINK2) ;CLEAR SEARCH ID
STI R0,*+AR0(OFLAGS)
LDI @OFREE,R0
STI R0,*AR0 ;place delete-e on free
STI AR0,@OFREE
LDI @OFREECNT,R0 ;INCREMENT FREE OBJECT COUNT
ADDI 1,R0
STI R0,@OFREECNT
LDI AR1,R1
BU DELLP
NXTCHK
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*PARAMETERS
* AR2 VECTOR V1
* R2 VECTOR V2
*RETURNS
* R0 (FLOAT) DISTANCE FROM V1 TO V2
* (FROM X/Z ONLY)
*
*
GET_XZ_DISTANCE:
PUSH AR0
PUSH R3
LDI R2,AR0
LDF *AR0++(2),R3
SUBF *AR2++(2),R3
LDF *AR0++,R2
SUBF *AR2++,R2
MPYF R3,R3
MPYF R2,R2
ADDF R3,R2
CALL SQRT
POP R3
POP AR0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*BGD_OROUTINE
* The object has (or will have) a routine associated with it, search the
* ID of the object vs the list and call any routine nessesary.
*
*
*
*PARAMETERS
* AR4 OBJECT (NOT INSERTED)
*
*
*NOTE
* ALL REGISTERS MUST BE SAVED
*
BGD_OROUTINE:
PUSH R0
PUSH R1
PUSH AR0
LDI *+AR4(OID),R0
LDI @ROUTINE_TABI,AR0
BGDORLP CMPI *AR0,R0
BEQ BGD_RFND
LDI *AR0++(2),R1
BNZ BGDORLP
POP AR0
POP R1
POP R0
RETS
BGD_RFND
LDI *+AR0,R0
CALLU R0
POP AR0
POP R1
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
OVERCAR:
PUSH R0
PUSH R2
PUSH AR2
CREATE CARFORWARD,22
STI AR0,*+AR4(OPLINK)
LDI SPAWNER_C,R0
STI R0,*+AR0(PID)
LDI 1,R0
LS O_PROC_B,R0
OR *+AR4(OFLAGS),R0
ANDN O_1PAL,R0
STI R0,*+AR4(OFLAGS)
RANDN 4
ADDI @OVERCARLISTI,R0
LDI R0,AR2
LDI *AR2,AR2
STI AR2,*+AR4(OROMDATA)
POP AR2
POP R2
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
OVERCARLISTI .word OVERCARLIST
OVERCARLIST .word dcbus,dgtruck,dsbus,dcbus
CARFORWARD:
RANDN 50
CMPI 25,R0
BLT CARSUP
CALL CLR_VECTORA
FLOAT 16000,R0
STF R0,*+AR2(Z)
LDI AR2,R3
LDI AR4,R2
ADDI OMATRIX,R2
CALL MATRIX_MUL
LDF *+AR4(OPOSX),R0
ADDF *+AR2(X),R0
STF R0,*+AR4(OPOSX)
LDF *+AR4(OPOSY),R0
ADDF *+AR2(Y),R0
STF R0,*+AR4(OPOSY)
LDF *+AR4(OPOSZ),R0
ADDF *+AR2(Z),R0
STF R0,*+AR4(OPOSZ)
LDF *+AR4(ORADY),R2
ADDF PI,R2
STF R2,*+AR4(ORADY)
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL FIND_YMATRIX
CARSUP
RANDN 500
FLOAT R0
CALL CLR_VECTORA
STF R0,*+AR2(Z)
LDI AR2,R3
LDI AR4,R2
ADDI OMATRIX,R2
CALL MATRIX_MUL
LDF *+AR4(OPOSX),R0
ADDF *+AR2(X),R0
STF R0,*+AR4(OPOSX)
LDF *+AR4(OPOSY),R0
ADDF *+AR2(Y),R0
STF R0,*+AR4(OPOSY)
LDF *+AR4(OPOSZ),R0
ADDF *+AR2(Z),R0
STF R0,*+AR4(OPOSZ)
RANDN 30
FLOAT R0
LDF R0,R6
ADDF 50,R6
RANDN 3
ADDI 1,R0
FLOAT R0
MPYF R0,R6
CARFORWARDLP
CALL CLR_VECTORA
LDF R6,R0
MPYF @NFRAMES,R0
STF R0,*+AR2(Z)
LDI AR2,R3
LDI AR4,R2
ADDI OMATRIX,R2
CALL MATRIX_MUL
LDF *+AR4(OPOSX),R0
ADDF *+AR2(X),R0
STF R0,*+AR4(OPOSX)
LDF *+AR4(OPOSY),R0
ADDF *+AR2(Y),R0
STF R0,*+AR4(OPOSY)
LDF *+AR4(OPOSZ),R0
ADDF *+AR2(Z),R0
STF R0,*+AR4(OPOSZ)
SLEEP 1
BU CARFORWARDLP
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
ROAD_DEBRIS_CREATE_55GAL:
PUSH R0
CALL ADD_RDDEBRIS
LDI 0731h,R0
STI R0,*+AR4(OID)
POP R0
RETS
ROAD_DEBRIS_CREATE:
BU ADD_RDDEBRIS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
SMOKE_STACK:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
BUD MAKEPPP
PUSH R2
NOP
LDI @SMOKE_ANII,AR6
;----> BUD MAKEPPP
CAR_FIRE:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
BUD MAKEPPP
PUSH R2
NOP
LDI @CAR_FIRE_ANII,AR6
;----> BUD MAKEPPP
SMOKE_ANII .word SMOKE_ANI
SMOKE_ANI .word smoa,smob,smoc,smod,smoe,smof
.word -1
;eug1,eug2,eug3,eug4,eug5,eug6
CAR_FIRE_ANII .word CAR_FIRE_ANI
CAR_FIRE_ANI
.word rdflm1,rdflm2,rdflm3,rdflm4,rdflm5,rdflm6
.word rdflm7,rdflm8,rdflm9,rdflm10,rdflm11,rdflm12
.word -1
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
DC_MINIFOUNTAIN_ANII .word DC_MINIFOUNTAIN_ANI
DC_MINIFOUNTAIN_ANI
.word aft1,aft2,aft3,aft4,aft5,aft6,-1
DC_MINIFOUNTAIN:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
PUSH R2
LDI @DC_MINIFOUNTAIN_ANII,AR6
CREATE WATERANI_PROC,SPAWNER_C|ANIMATION_T
BC FWL1A
BU J262
DC_FOUNTAIN_ANII .word DC_FOUNTAIN_ANI
DC_FOUNTAIN_ANI
.word ft2,ft3,ft4,ft5,ft6,-1
DC_FOUNTAIN:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
PUSH R2
LDI @DC_FOUNTAIN_ANII,AR6
CREATE WATERANI_PROC,SPAWNER_C|ANIMATION_T
BC FWL1A
BU J262
*----------------------------------------------------------------------------
WATERFALL_ANII .word WATERFALL_ANI
WATERFALL_ANI .word w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,-1
WATERFALL:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
PUSH R2
CREATE WATERFALL_SND,SPAWNER_C|ANIMATION_T
LDI @WATERFALL_ANII,AR6
CREATE WATERANI_PROC,SPAWNER_C|ANIMATION_T
BC FWL1A
J262 STI AR0,*+AR4(OPLINK)
LDI 1,R0
LS O_PROC_B,R0
OR *+AR4(OFLAGS),R0
STI R0,*+AR4(OFLAGS)
FWL1A POP R2
POP AR6
POP AR5
POP AR2
POP AR0
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*AR6 START OF SCRIPT
*
*the big difference is that this *MUST* handle the sound animation also...
*
*
WATERANI_PROC:
LDI AR6,AR5
WATERANI_LP
LDI *AR5++,R0
BLT WATERANI_PROC
STI R0,*+AR4(OROMDATA)
RANDN 4
LDI R0,R0
LDIZ 1,AR2
LDINZ 2,AR2
CALL PRC_SLEEP
BU WATERANI_LP
*----------------------------------------------------------------------------
*
*----------------------------------------------------------------------------
*
*AR4=WATERFALL OBJECT
*
WATERFALL_SND:
SLEEP 1
LDI *+AR4(ODIST),R0
LDFN 4.0,R1
LDFNN 1.0,R1
CMPI -20000,R0
BGT WF1
LDI @CAMVIEW,R2
BNE WF0
LDI @PLYCBLK,AR0
LDI *+AR0(CAR_SPIN),R2
BNE WF1
WF0
LDI WATERFALLSND,AR2 ;KILL OFF SOUND
CALL KILLSNDFX
DIE
WF1
FLOAT R0,R2
MPYF R1,R2
ABSF R2
MPYF 0.01,R2
MPYF 0.1,R2 ;0-50
SUBRF 75,R2
BN WATERFALL_SND
MPYF 7,R2
FIX R2
CMPI 255,R2
LDIGT 255,R2
LDI WATERFALLSND,AR2
CALL AMBIENCE_SOUND
BU WATERFALL_SND
*----------------------------------------------------------------------------
*
*----------------------------------------------------------------------------
*
*PARAMETERS
* AR2 SOUND
* R2 VOLUME (0-255)
*
AMBIENCE_SOUND:
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
LDI R2,R1 ;volume
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
LDI R2,R1
LDI 2,R0
CALL SET_TRACK_VOL
NOT_T2
HEND
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
FLAGANII .word FLAGANI
FLAGANI .word bflag1,bflag2,bflag3,bflag4,bflag5
.word bflag6,bflag7,bflag9,bflag10,-1
FLAGANITALLI .word FLAGANITALL
FLAGANITALL .word aflag1,aflag2,aflag3,aflag4,aflag5
.word aflag6,aflag7,aflag9,aflag10,-1
.globl RUT_ANISI
.globl HUNGH_ANISI
RUT_ANISI .word RUT_ANIS
RUT_ANIS .word rut,rut2,rut3,-1
HUNGH_ANISI .word HUNGH_ANIS
HUNGH_ANIS .word hungh1,hungh2,hungh3,hungh4,hungh5,hungh6,hungh7,-1
*----------------------------------------------------------------------------
.global BABE_PALISTI
BABE_PALISTI .word BABE_PALIST
romdata
BABE_PALIST
.word ungh1_blue,logo_p,ungh1_green,nintendo_p,ungh1_silver,map1_p
.word ungh1_yellow,lift_p,ungh1_skin,bvwall_p
.text
.globl HUNGH_ANI
HUNGH_ANI:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
PUSH R2
PUSH AR2
READAUD ADJ_GIRLS
POP AR2
CMPI 0,R0
BEQ DORUT_ANI
LDI @HUNGH_ANISI,AR6
LDI *+AR4(OFLAGS),R0
; ANDN O_1PAL,R0
OR O_POSTER,R0
STI R0,*+AR4(OFLAGS)
LDI 5,AR2
CALL RANDU0
CMPI 4,R0
BEQ HUNGH_NOPAL
MPYI 2,R0
ADDI @BABE_PALISTI,R0
LDI R0,AR5
LDI *+AR5,AR2
CALL PAL_FIND
BC HUNGH_NOPAL
LDI R0,R2
LDI *AR5,AR2
LDI *AR2++,R3
CALL PAL_SET
STI R0,*+AR4(OPAL)
HUNGH_NOPAL
CALL PLACE_ON_ROAD
LDI RDDEBRIS_C|TSC_IGNORE|TSC_BABE_S,R0
STI R0,*+AR4(OID)
LDI AR6,AR5
CREATE PLAINANI_LP_SLOW,SPAWNER_C|ANIMATION_T|7
BC FWL1
BU J2
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
.global HUNGH_ANI_REENTER
HUNGH_ANI_REENTER:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
PUSH R2
LDI @HUNGH_ANISI,AR6
LDI *+AR4(OFLAGS),R0
; ANDN O_1PAL,R0
OR O_POSTER,R0
STI R0,*+AR4(OFLAGS)
LDI AR6,AR5
CREATE PLAINANI_LP_SLOW,SPAWNER_C|ANIMATION_T|7
BC FWL1
BU J2
romdata
.include babe.pal
.text
PLACE_ON_ROAD:
CALL ADD_RDDEBRIS
PUSH AR4
ADDI OPOSX,AR4
CALL CAMSCAN
POP AR4
FIX R0,R1 ;Check for dude in the sign
CMPI 1000,R1
BGT PORX
LDF *+AR4(OPOSY),R1
ADDF R1,R0
SUBF 45,R0
STF R0,*+AR4(OPOSY)
PORX
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
.globl RUT_ANI
RUT_ANI:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
PUSH R2
DORUT_ANI
LDI @RUT_ANISI,AR6
LDI *+AR4(OFLAGS),R0
ANDN O_1PAL,R0
OR O_POSTER,R0
STI R0,*+AR4(OFLAGS)
CALL PLACE_ON_ROAD
LDI RDDEBRIS_C|TSC_IGNORE|TSC_DUDE_S,R0
STI R0,*+AR4(OID)
LDI AR6,AR5
CREATE PLAINANI_LP_SLOW,SPAWNER_C|ANIMATION_T|7
BC FWL1
BU J2
*----------------------------------------------------------------------------
PLAINANI_PROC_SLOW:
LDI AR6,AR5
PLAINANI_LP_SLOW
LDI *AR5++,R0
BLT PLAINANI_PROC_SLOW
STI R0,*+AR4(OROMDATA)
RANDN 4
LDI R0,R0
LDIZ 1,AR2
LDINZ 2,AR2
ADDI 1,AR2
CALL PRC_SLEEP
BU PLAINANI_LP_SLOW
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
FLAGWAVE_TALL:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
PUSH R2
LDI @FLAGANITALLI,AR6
LDI *+AR4(OFLAGS),R0
ANDN O_1PAL,R0
STI R0,*+AR4(OFLAGS)
RANDN 7
LDI AR6,AR5
ADDI R0,AR5
CREATE PLAINANI_LP,SPAWNER_C|ANIMATION_T
BC FWL1
BU J2
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
FLAGWAVE:
PUSH R0
PUSH AR0
PUSH AR2
PUSH AR5
PUSH AR6
PUSH R2
LDI @FLAGANII,AR6
LDI *+AR4(OFLAGS),R0
ANDN O_1PAL,R0
STI R0,*+AR4(OFLAGS)
RANDN 7
LDI AR6,AR5
ADDI R0,AR5
CREATE PLAINANI_LP,SPAWNER_C|ANIMATION_T
BC FWL1
BU J2
MAKEPPP
CREATE PLAINANI_PROC,SPAWNER_C|ANIMATION_T
BC FWL1
J2 STI AR0,*+AR4(OPLINK)
LDI 1,R0
LS O_PROC_B,R0
OR *+AR4(OFLAGS),R0
STI R0,*+AR4(OFLAGS)
FWL1 POP R2
POP AR6
POP AR5
POP AR2
POP AR0
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*AR6 START OF SCRIPT
*
PLAINANI_PROC:
LDI AR6,AR5
PLAINANI_LP
LDI *AR5++,R0
BLT PLAINANI_PROC
STI R0,*+AR4(OROMDATA)
RANDN 4
LDI R0,R0
LDIZ 1,AR2
LDINZ 2,AR2
CALL PRC_SLEEP
BU PLAINANI_LP
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*ABSOLUTE LOAD INTO OBJECT LIST FOR A SINGLE SECTION
*
*
*PARAMETERS
* AR2 POINTER TO ROM GROUP (OBJECTS.EQU)
*
*RETURNS
* R0 PTR TO THE FIRST OBJECT IN GROUP
*
.bss SINGLE_SECTION_TEMPPTR,1
LOAD_SINGLE_SECTION:
PUSH R4
PUSH R5
PUSH AR0
PUSH AR2
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
LDL SINGLE_SECTION_TEMPPTR,AR6
SUBI OLINK2,AR6
LDI AR2,AR5
INC AR5
LDI *AR5++,R4 ;get number of objects to load
SLOCKON LE,"BACKGRND\LOAD_SINGLE_SECTION GROUP ERROR"
DEC R4
CMPI @OFREECNT,R4
SLOCKON GT,"BACKGRND\LOAD_SINGLE_SECTION OUT OF OBJECTS"
LS_L12
LDI *AR5++,AR2 ;GET MODEL PTR
CALL OBJ_GETE
SLOCKON C,"BACKGRND\LOAD_SINGLE_SECTION OUT OF OBJECTS *FATAL*"
BC LS_ACTIVATE_X
LDI AR0,AR4
STI AR4,*+AR6(OLINK2)
LDI AR4,AR6
FLOAT *AR5++,R1 ;GET X POSITION
STF R1,*+AR4(OPOSX)
FLOAT *AR5++,R1 ;GET Y POSITION
STF R1,*+AR4(OPOSY)
FLOAT *AR5++,R1 ;GET Z POSITION
STF R1,*+AR4(OPOSZ)
LDF *AR5++,R2 ;SET THE RADIANS FOR THE OBJECT
STF R2,*+AR4(ORADY)
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL HPFIND_YMATRIX
LDI *AR5++,R1 ;LOAD OBJECT ID (GENV STYLE)
LDI R1,R2
AND CLASS_M|TYPE_M|SUBTYPE_M,R1
STI R1,*+AR4(OID)
LDI AR4,AR2
CALL OBJ_INSERT ;INSERT THE BABE
SUBI 1,R4
BGE LS_L12
LS_ACTIVATE_X
CLRI R0
STI R0,*+AR6(OLINK2)
LDI @SINGLE_SECTION_TEMPPTR,R0
POP AR7
POP AR6
POP AR5
POP AR4
POP AR2
POP AR0
POP R5
POP R4
RETS
*----------------------------------------------------------------------------
;*----------------------------------------------------------------------------
;OIL_PUMP:
; PUSH AR0
; PUSH AR2
; PUSH R2
; CREATE OILWELL,UTIL_C
; POP R2
; POP AR2
; POP AR0
; RETS
;
;OILWELL_DYNA
; .word 2 ;#OF DYNAS-1
;
;; .float -1197,0,0 ;WHEEL
; .float 0,-538,0 ;WHEEL
; .word 41 ;VERTS-1
; .word 2 ;DYNAFLAG
;
; .float -1276,-2325,0 ;HAMMER
; .word 38 ;VERTS-1
; .word 3 ;DYNAFLAG
;
; .float 0,0,0 ;main body
; .word 56 ;VERTS-1
; .word 1 ;DYNAFLAG
;
;*
;*PARAMETERS
;* AR4 OILWELL OBJECT
;*
;*
;OILWELL:
; STI AR7,*+AR4(OPLINK)
;
; LDI 1,R0
; LS O_PROC_B,R0
; OR *+AR4(OFLAGS),R0
; OR O_DYNAMIC,R0 ;MAKE PARENT OBJECT DYNAMIC
; STI R0,*+AR4(OFLAGS)
;
; LDL OILWELL_DYNA,AR2
;
; LDI AR4,AR3
; ADDI ODYNALIST,AR3
;
;*INIT DYNA OBJECTS
; LDI *AR2++,RC ;GET DYNAMIC OBJECT COUNT (-1)
; RPTB OWINLP
;
; 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)
;
; CMPI 2,R0 ;
; BNE H75
; STI AR0,*+AR7(PDATA) ;WHEEL
;H75
;
; CMPI 3,R0 ;
; BNE H76
; STI AR0,*+AR7(PDATA+1) ;HAMMER
;H76
;
; STI AR4,*+AR0(DYNAPARENT)
;OWINLP LDI AR0,AR3
;
; LDI 0,R0
; STI R0,*AR3 ;LAST LINK IS ZERO, DUDES
;
; LDI AR3,AR0
; ADDI DYNAMATRIX,AR0
; CALL INITMAT
;
; CLRF R6
; CLRF R7
;
; LDF 0.1,R0
; STF R0,*+AR7(PDATA+2)
;
;*
;*
;* R6 THETA FOR THE WHEELS
;* R7 THETA FOR THE HAMMER
;*
;OILWELLP
;
; ADDF 0.1,R6
; LDF R6,R2
; CALL NORMITS
; LDF R2,R6
; LDI *+AR7(PDATA),AR2
; ADDI DYNAMATRIX,AR2
; CALL FIND_ZMATRIX
;
;
; LDF *+AR7(PDATA+2),R0
; NEGF R0,R1
;
; CMPF PI,R7
; BLT NC1
; LDF R1,R0
; BU IRV
;NC1
; CMPF -PI,R7
; BGT IRV
; LDF R1,R0
;IRV
; ADDF R0,R7
; STF R0,*+AR7(PDATA+2)
;
; LDF R0,R2
; LDI *+AR7(PDATA+1),AR2
; ADDI DYNAMATRIX,AR2
; CALL FIND_ZMATRIX
;
; SLEEP 1
; BU OILWELLP
;*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
OHARE_PLANE:
PUSH AR0
PUSH AR2
PUSH R2
SONDFX JETFLYBY
CREATE PLANE_FWRD,UTIL_C
STI AR0,*+AR4(OPLINK)
LDI 1,R0
LS O_PROC_B,R0
OR *+AR4(OFLAGS),R0
STI R0,*+AR4(OFLAGS)
POP R2
POP AR2
POP AR0
RETS
PLANE_FWRD:
FLOAT 250,R7
FLOAT 32000,R6
MPYF 4,R6
*
*
PLANE_FWL
LDF *+AR4(ORADY),R2
ADDF HALFPI,R2
LDI @MATRIXAI,AR2
CALL FIND_YMATRIX
CALL CLR_VECTORA
LDF R7,R0
FLOAT @NFRAMES,R1
MPYF R1,R0
STF R0,*+AR2(Z)
LDI @MATRIXAI,R2
LDI AR2,R3
CALL MATRIX_MUL
LDI @VECTORAI,AR2
LDF *+AR4(OPOSX),R0
ADDF *+AR2(X),R0
STF R0,*+AR4(OPOSX)
LDF *+AR4(OPOSY),R0
ADDF *+AR2(Y),R0
ADDF 50,R0
STF R0,*+AR4(OPOSY)
LDF *+AR4(OPOSZ),R0
ADDF *+AR2(Z),R0
STF R0,*+AR4(OPOSZ)
ABSF R7,R0
FLOAT @NFRAMES,R1
MPYF R1,R0
SUBF R0,R6
BLT TRAINX
SLEEP 1
BU PLANE_FWL
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
TRAIN_FWRD_MAKEB:
PUSH AR0
PUSH AR2
PUSH R2
CREATE TRAIN_FWRDB,UTIL_C
STI AR0,*+AR4(OPLINK)
LDI 1,R0
LS O_PROC_B,R0
OR *+AR4(OFLAGS),R0
STI R0,*+AR4(OFLAGS)
BU J87
TRAIN_FWRD_MAKE:
PUSH AR0
PUSH AR2
PUSH R2
CREATE TRAIN_FWRD,UTIL_C
STI AR0,*+AR4(OPLINK)
LDI 1,R0
LS O_PROC_B,R0
OR *+AR4(OFLAGS),R0
STI R0,*+AR4(OFLAGS)
J87 POP R2
POP AR2
POP AR0
RETS
TRAIN_FWRDB:
LDI *+AR4(OUSR1),R0
ADDI 5,R0 ;kludge to delete later than loaded
STI R0,*+AR4(OUSR1)
FLOAT -150,R7
FLOAT 32000,R6
MPYF 8,R6
BU J765
TRAIN_FWRD:
FLOAT 150,R7
FLOAT 32000,R6
MPYF 3,R6
J765
*
*
TRAIN_FWL
CALL CLR_VECTORA
LDF R7,R0
FLOAT @NFRAMES,R1
MPYF R1,R0
STF R0,*+AR2(Z)
LDI AR4,R2
ADDI OMATRIX,R2
LDI AR2,R3
CALL MATRIX_MUL
LDI @VECTORAI,AR2
LDF *+AR4(OPOSX),R0
ADDF *+AR2(X),R0
STF R0,*+AR4(OPOSX)
LDF *+AR4(OPOSY),R0
ADDF *+AR2(Y),R0
STF R0,*+AR4(OPOSY)
LDF *+AR4(OPOSZ),R0
ADDF *+AR2(Z),R0
STF R0,*+AR4(OPOSZ)
ABSF R7,R0
FLOAT @NFRAMES,R1
MPYF R1,R0
SUBF R0,R6
BLT TRAINX
SLEEP 1
BU TRAIN_FWL
TRAINX
CLRI R0
STI R0,*+AR4(OPLINK)
LDI 1,R0
LS O_PROC_B,R0
LDI *+AR4(OFLAGS),R1
ANDN R0,R1
STI R1,*+AR4(OFLAGS)
DIE
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*
*PARAMETERS
* AR2 SECTION POINTER
*
* OFFSET BY START_POS
*
*
LOAD_SINGLE_SECTION_OFFSET:
PUSH R4
PUSH R5
PUSH AR0
PUSH AR2
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
LDL SINGLE_SECTION_TEMPPTR,AR6
SUBI OLINK2,AR6
LDI AR2,AR5
INC AR5
LDI *AR5++,R4 ;get number of objects to load
SLOCKON LE,"BACKGRND\LOAD_SINGLE_SECTION GROUP ERROR"
DEC R4
LDF @START_RADY,R2
LDI @MATRIXAI,AR2
CALL HPFIND_YMATRIX
CMPI @OFREECNT,R4
SLOCKON GT,"BACKGRND\LOAD_SINGLE_SECTION OUT OF OBJECTS"
LS_L12O
LDI *AR5++,AR2 ;GET MODEL PTR
CALL OBJ_GETE
SLOCKON C,"BACKGRND\LOAD_SINGLE_SECTION OUT OF OBJECTS *FATAL*"
BC LS_ACTIVATE_XO
LDI AR0,AR4
STI AR4,*+AR6(OLINK2)
LDI AR4,AR6
LDI @VECTORAI,AR2
FLOAT *AR5++,R1 ;GET X POSITION
STF R1,*+AR2(X)
FLOAT *AR5++,R1 ;GET Y POSITION
STF R1,*+AR2(Y)
FLOAT *AR5++,R1 ;GET Z POSITION
STF R1,*+AR2(Z)
LDI @MATRIXAI,R2
LDI AR2,R3
CALL MATRIX_MUL
LDF *+AR2(X),R1
ADDF @START_POS+X,R1
STF R1,*+AR4(OPOSX)
LDF *+AR2(Y),R1
ADDF @START_POS+Y,R1
STF R1,*+AR4(OPOSY)
LDF *+AR2(Z),R1
ADDF @START_POS+Z,R1
STF R1,*+AR4(OPOSZ)
LDF *AR5++,R2 ;GET THE RADIANS FOR THE OBJECT
ADDF @START_RADY,R2
STF R2,*+AR4(ORADY)
LDI AR4,AR2
ADDI OMATRIX,AR2
CALL HPFIND_YMATRIX
LDI *AR5++,R1 ;GET OBJECT ID (GENV STYLE)
LDI R1,R2
AND CLASS_M|TYPE_M|SUBTYPE_M,R1
STI R1,*+AR4(OID)
LDI AR4,AR2
CALL OBJ_INSERT ;INSERT THE BABE
SUBI 1,R4
BGE LS_L12O
LS_ACTIVATE_XO
CLRI R0
STI R0,*+AR6(OLINK2)
LDI @SINGLE_SECTION_TEMPPTR,R0
POP AR7
POP AR6
POP AR5
POP AR4
POP AR2
POP AR0
POP R5
POP R4
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*USE ACTUAL ID (0FFFh)
*
.globl RRSTART_ENGINE,RRSTART_FLATBED,RRSTART_BOXCAR
.globl COPBLOCK,COPBLOCK2
ROUTINE_TABI .word ROUTINE_TAB
ROUTINE_TAB:
.word 40Ah,FLAGWAVE
.word 460h,ROAD_DEBRIS_CREATE
.word 461h,ROAD_DEBRIS_CREATE_55GAL
.word 462h,ROAD_DEBRIS_CREATE_55GAL ;actually TOXIC
.word 463h,ROAD_DEBRIS_CREATE_55GAL ;actually CONE
.word 465h,FLAGWAVE ;short flag
.word 466h,FLAGWAVE_TALL ;tall flag
;
.word 467h,WATERFALL
.word 469h,OVERCAR ;LA & CHICAGO, FREEWAY OVERPASS CAR
.word 470h,RRSTART_ENGINE
.word 471h,RRSTART_BOXCAR
.word 472h,RRSTART_BOXCAR
.word 473h,RRSTART_BOXCAR
.word 474h,RRSTART_BOXCAR
.word 475h,RRSTART_BOXCAR
.word 476h,RRSTART_BOXCAR
;
.word 481h,SMOKE_STACK
.word 482h,CAR_FIRE
;
; .word 485h,TRAIN_FWRD_MAKEB ;CHICAGO TRAIN FORWARD SPECIFIED DISTANCE BOXCAR (BRIDGE)
; .word 486h,TRAIN_FWRD_MAKEB ;CHICAGO TRAIN FORWARD SPECIFIED DISTANCE ENGINE (BRIDGE)
; .word 487h,OIL_PUMP ;RUSHMORE OIL PUMP
; .word 495h,TRAIN_FWRD_MAKE ;CHICAGO TRAIN FORWARD SPECIFIED DISTANCE BOXCAR
; .word 496h,TRAIN_FWRD_MAKE ;CHICAGO TRAIN FORWARD SPECIFIED DISTANCE ENGINE
.word 498h,OHARE_PLANE ;CHICAGO AIRPLANE
;
.word 741h,RUT_ANI
.word 742h,HUNGH_ANI
.word 4A1h,DC_FOUNTAIN
.word 4A2h,DC_MINIFOUNTAIN
.word 0 ;END OF TABLE ID
*----------------------------------------------------------------------------
.END