1816 lines
35 KiB
NASM
Executable File
1816 lines
35 KiB
NASM
Executable File
.FILE "ATTRDRNE.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*
|
|
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
|
|
*ALL RIGHTS RESERVED
|
|
*
|
|
|
|
.include C30.EQU
|
|
.include MACS.EQU
|
|
.include MPROC.EQU
|
|
.include VUNIT.EQU
|
|
.include CMOS.EQU
|
|
.include SYSID.EQU
|
|
.include SYS.EQU
|
|
.include OBJ.EQU
|
|
.include GLOBALS.EQU
|
|
.include SNDTAB.EQU
|
|
.include PALL.EQU
|
|
.include OBJECTS.EQU
|
|
.include TEXT.EQU
|
|
.include DIRQ.EQU
|
|
.include DELTA.EQU
|
|
|
|
|
|
.data
|
|
|
|
_CAMERAPOSI .word _CAMERAPOS
|
|
VIEWLISTI .word VIEWLIST
|
|
ATTR_WAVETABI .word ATTR_WAVETAB
|
|
|
|
pbss ATTRWAVE,1
|
|
.global CAMVIEW
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* CAMERA variable space
|
|
*
|
|
|
|
CUT_PAN .set PDATA+1
|
|
ZOOMVEL .set PDATA+2
|
|
CAMERA_XYZR .set PDATA+3 ;4 long
|
|
NEWCAMERA_XYZR .set PDATA+7 ;4 long
|
|
NEW_POSX .set PDATA+11
|
|
NEW_POSY .set PDATA+12
|
|
NEW_POSZ .set PDATA+13
|
|
NEW_RADX .set PDATA+14
|
|
NEW_RADY .set PDATA+15
|
|
NEW_RADZ .set PDATA+16
|
|
NEW_MATRIX .set PDATA+17 ;9 long
|
|
CAMERA_VIEW .set PDATA+26
|
|
CAMERA_VEL .set PDATA+27
|
|
CAROBJ .set PDATA+28
|
|
CARDIS .set PDATA+29
|
|
CAMERA_ACCEL .set PDATA+30
|
|
CAMERA_INFIN .set PDATA+31
|
|
TEMP_DATA .set PDATA+32 ;10 long
|
|
LIST_NUM .set PDATA+42
|
|
CAMERA_LANE .set PDATA+43
|
|
OBJINS .set PDATA+44
|
|
CAMYOFF .set PDATA+45
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
; .data
|
|
;STARTXPOS .float -1754318
|
|
;STARTYPOS .float 2345
|
|
;STARTZPOS .float 1314000
|
|
.text
|
|
|
|
ATTRACT_DELTA:
|
|
LDI 0,R0
|
|
STI R0,*+AR7(OBJINS)
|
|
LDI @ATTRWAVE,R4
|
|
LSH -1,R4
|
|
STI R4,*+AR7(LIST_NUM)
|
|
CALL INIT_ATTR_LEG
|
|
|
|
|
|
LDI 4,R0
|
|
STI R0,@NOSWAP
|
|
|
|
CREATE LOGO_PROC,UTIL_C
|
|
|
|
LDI @_MODE,R0
|
|
OR MGO,R0
|
|
STI R0,@_MODE
|
|
|
|
LDI -1,R0
|
|
STI R0,*+AR7(CUT_PAN)
|
|
|
|
LDI 1,R0 ;SET GAME FRAME RATE
|
|
STI R0,@FRAMRATE
|
|
STI R0,@TIMECLR
|
|
STI R0,@DRONE_DISPATCH_P
|
|
|
|
SLEEP 1
|
|
LDI @PLYCAR,AR4
|
|
LDI *+AR4(PAR5),AR5
|
|
LDI *+AR4(PAR4),AR4
|
|
LDI *+AR5(PAR5),AR0
|
|
STI AR4,@PLYCAR
|
|
STI AR0,@PLYCBLK
|
|
|
|
LDI 90,R0
|
|
STI R0,@_countdown
|
|
|
|
LDI 1,R0
|
|
STI R0,*+AR7(CUT_PAN)
|
|
|
|
CALL GET_LIST_ADDR
|
|
BR DELTA_LOOP_ENTRY
|
|
|
|
aDELTA_LOOP
|
|
LDI *AR6,AR0
|
|
CALLU AR0
|
|
|
|
ADELTA2
|
|
CALL UPDATE_CAMERA
|
|
SLEEP 1
|
|
|
|
LDI @NOSWAP,R0
|
|
BEQ ADELTA2A
|
|
SUBI 1,R0 ;OK Now we have a valid frame
|
|
STI R0,@NOSWAP
|
|
ADELTA2A
|
|
|
|
CMPI 0,AR5
|
|
BGT aDELTA_LOOP
|
|
|
|
ADDI 1,AR6 ;Advance to next mode
|
|
DELTA_LOOP_ENTRY
|
|
LDI *AR6,AR0
|
|
CMPI 0,AR0
|
|
BNE sDELTA_LOOP
|
|
; CALL GET_LIST_ADDR
|
|
; BU $
|
|
SUBI 3,AR6 ;Loop on last entry
|
|
|
|
sDELTA_LOOP
|
|
LDI *+AR7(OBJINS),R0
|
|
BEQ NO_OBJINS
|
|
LDI R0,AR2
|
|
CALL OBJ_INSERT ;INSERT PLAYER OBJECT
|
|
LDI 0,R0
|
|
STI R0,*+AR7(OBJINS)
|
|
NO_OBJINS
|
|
LDI *AR6++,AR0
|
|
CALLU AR0
|
|
|
|
LDI *AR6++,AR5
|
|
B ADELTA2
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*CREATE THE OBJECT 'CRUISIN USA' FOR OVERLAY DURING ATTRACT MODE
|
|
*
|
|
LOGO_STARTZ .set 10000
|
|
LOGO_ENDX .set -120
|
|
LOGO_ENDY .set -85
|
|
LOGO_ENDZ .set 368
|
|
LOGO_FLYIN_FRAMES .set 125
|
|
LOGO_WHOOSH_FRAMES .set 462
|
|
LOGO_SPINZ .set 18.85 ;3 revolutions
|
|
|
|
LOGO_PROC:
|
|
CALL OBJ_GET
|
|
BC LOGOX
|
|
LDI AR0,AR4
|
|
LDIL logo,R0
|
|
STI R0,*+AR0(OROMDATA)
|
|
LDI O_IROT|O_NOROT|O_NOUROT|O_NOUNIV,R0
|
|
OR *+AR0(OFLAGS),R0
|
|
STI R0,*+AR0(OFLAGS)
|
|
|
|
|
|
LDI UTIL_C|LOGO_T,R0
|
|
STI R0,*+AR0(OID)
|
|
|
|
|
|
FLOAT LOGO_STARTZ,R0
|
|
STF R0,*+AR0(OPOSZ)
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERTP
|
|
|
|
LDF LOGO_SPINZ,R0
|
|
STF R0,*+AR4(ORADX)
|
|
|
|
LDF 0,R7 ;SPEED FACTOR
|
|
LDI LOGO_FLYIN_FRAMES,AR5
|
|
LOGO_LOOP1
|
|
SLEEP 1
|
|
FLOAT @NFRAMES,R6
|
|
|
|
FLOAT LOGO_ENDY,R0
|
|
CMPF *+AR4(OPOSY),R0
|
|
BEQ LOGO2
|
|
|
|
FLOAT LOGO_ENDX,R0
|
|
SUBF *+AR4(OPOSX),R0
|
|
MPYF R7,R0
|
|
MPYF R6,R0
|
|
ADDF *+AR4(OPOSX),R0
|
|
FLOAT LOGO_ENDX,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
FLOAT LOGO_ENDY,R0
|
|
SUBF *+AR4(OPOSY),R0
|
|
MPYF R7,R0
|
|
MPYF R6,R0
|
|
ADDF *+AR4(OPOSY),R0
|
|
FLOAT LOGO_ENDY,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
ADDF 0.03,R7
|
|
|
|
LOGO2
|
|
FLOAT LOGO_ENDZ-LOGO_STARTZ,R0
|
|
FLOAT LOGO_FLYIN_FRAMES,R1
|
|
CALL DIV_F
|
|
MPYF R6,R0
|
|
LDF *+AR4(OPOSZ),R1
|
|
ADDF R1,R0
|
|
FLOAT LOGO_ENDZ,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
LDF LOGO_SPINZ,R0
|
|
FLOAT LOGO_FLYIN_FRAMES,R1
|
|
CALL DIV_F
|
|
MPYF R6,R0
|
|
LDF *+AR4(ORADX),R2
|
|
SUBF R0,R2
|
|
LDFN 0,R2
|
|
STF R2,*+AR4(ORADX)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_ZMATRIX
|
|
|
|
SUBI @NFRAMES,AR5
|
|
CMPI 0,AR5
|
|
BP LOGO_LOOP1
|
|
|
|
LOGOX
|
|
DIE
|
|
|
|
*----------------------------------------------------------------------------
|
|
GET_LIST_ADDR:
|
|
LDI *+AR7(LIST_NUM),AR6
|
|
ADDI @VIEWLISTI,AR6
|
|
LDI *AR6,AR6
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
|
|
.SECT "THEDATA"
|
|
VIEWLIST
|
|
.word GGPARK_LIST
|
|
.word BEVHILL_LIST
|
|
.word GCANYON_LIST
|
|
.word CHICAGO_LIST
|
|
.word GGPARK_LIST
|
|
.word BEVHILL_LIST
|
|
.word GCANYON_LIST
|
|
.word CHICAGO_LIST
|
|
|
|
GGPARK_LIST
|
|
*THE first call is to intialize
|
|
.word INIT_STARTING,70,ROAD_VIEW
|
|
.word INIT_LEAD,80,LEAD_VIEW
|
|
.word INIT_WATCH,1214h,240,WATCH_VIEW
|
|
.word CUT_TO_VIEW2,1404h,SMOOTH_VIEW
|
|
.word INITVIEW1_VIEW,17FBh,SMOOTH_VIEW
|
|
.word INIT_LEAD,80,LEAD_VIEW
|
|
.word 0,0
|
|
|
|
BEVHILL_LIST
|
|
*THE first call is to intialize
|
|
.word INIT_STARTING,80,ROAD_VIEW
|
|
.word CUT_TO_VIEW2,14AFBh,SMOOTH_VIEW
|
|
.word INITVIEW1_VIEW,14DF3h,SMOOTH_VIEW
|
|
.word INIT_STARTING,100,ROAD_VIEW
|
|
.word 0,0
|
|
|
|
|
|
GCANYON_LIST
|
|
*THE first call is to intialize
|
|
.word INIT_STARTING,70,ROAD_VIEW
|
|
.word INIT_WATCH,2E20Ah,220,WATCH_VIEW
|
|
.word CUT_TO_VIEW2,2E800h,SMOOTH_VIEW
|
|
.word INITVIEW1_VIEW,2EC00h,SMOOTH_VIEW
|
|
.word INIT_WATCH,2EF00h,240,WATCH_VIEW
|
|
.word CUT_TO_VIEW2,30000h,SMOOTH_VIEW
|
|
.word 0,0
|
|
|
|
CHICAGO_LIST
|
|
*THE first call is to intialize
|
|
.word INIT_STARTING,80,ROAD_VIEW
|
|
.word INIT_REVERS_CUP,60,REV_ROAD_VIEW
|
|
.word CUT_TO_VIEW2,3AA0Eh,SMOOTH_VIEW
|
|
.word INITVIEW1_VIEW,3C00Ah,SMOOTH_VIEW
|
|
.word INIT_WATCH,3C5F5h,240,WATCH_VIEW
|
|
.word INIT_LEAD,80,LEAD_VIEW
|
|
.word 0,0
|
|
|
|
.text
|
|
*----------------------------------------------------------------------------
|
|
INIT_STARTING:
|
|
LDI -350,R0
|
|
FLOAT R0,R1
|
|
STF R1,*+AR7(CAMYOFF)
|
|
LDI 4,R0 ;direction to search in
|
|
LDI 1,R1 ;distance to start with
|
|
LDI 8,R2 ;Position to follow
|
|
LDF 0,R3 ;RADY OFFSET
|
|
|
|
CALL INITROAD_VIEW
|
|
LDF 1,R2
|
|
CALL SET_LANE
|
|
CALL INIT_LANE
|
|
CALL ROAD_VIEW
|
|
|
|
CALL UPDATE_CAMERA
|
|
CALL RESCAN
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
INIT_WATCH:
|
|
LDI 1,R0
|
|
STI R0,*+AR7(CUT_PAN)
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR7(CAMERA_XYZR+3) ;Reset the offset
|
|
LDI *AR6++,R2 ;READ the track ID from the VIEWLIST
|
|
CALL FIND_MAP
|
|
INIW1
|
|
LDI *+AR4(3),R2 ;Get ID
|
|
CALL FIND_TRACK ;MAKE DAMN SURE WE ARE ON A LOADED TRACK SECTION!!!
|
|
CMPI 0,AR2
|
|
BNE INIW2
|
|
SUBI 4,AR4
|
|
BR INIW1
|
|
INIW2
|
|
PUSH AR4
|
|
LDI 4,R2
|
|
CALL FIND_RACER
|
|
STI AR4,*+AR7(CAROBJ)
|
|
STI AR4,@PLYCAR
|
|
LDI *+AR4(OCARBLK),AR0
|
|
STI AR0,@PLYCBLK
|
|
POP AR4
|
|
|
|
LDI -300,R0
|
|
FLOAT R0,R1
|
|
STF R1,*+AR7(CAMYOFF)
|
|
ADDI *+AR4(Y),R0
|
|
FLOAT R0
|
|
STF R0,*+AR7(NEW_POSY)
|
|
|
|
FLOAT *+AR4(X),R0
|
|
STF R0,*+AR7(NEW_POSX)
|
|
|
|
FLOAT *+AR4(Z),R0
|
|
STF R0,*+AR7(NEW_POSZ)
|
|
|
|
LDI AR4,AR2
|
|
ADDI -4,AR2
|
|
|
|
LDI *+AR2(X),R0
|
|
SUBI *+AR4(X),R0
|
|
FLOAT R0
|
|
MPYF R0,R0
|
|
LDI *+AR2(Z),R1
|
|
SUBI *+AR4(Z),R1
|
|
FLOAT R1
|
|
MPYF R1,R1
|
|
ADDF R0,R1,R2
|
|
CALL SQRT
|
|
LDF R0,R2
|
|
|
|
LDI *+AR2(Y),R3
|
|
SUBI *+AR4(Y),R3
|
|
FLOAT R3
|
|
MPYF 1.8,R3
|
|
CALL ARCTANF
|
|
CALL NORM_VECTOR
|
|
NEGF R0
|
|
ADDF 0.09,R0 ;Offset for VIEWX
|
|
STF R0,*+AR7(NEW_RADX)
|
|
|
|
FLOAT -2500,R3
|
|
CALL DO_LANE_POS
|
|
|
|
LDF -100,R6 ;SMALL number for a rad
|
|
CALL WATCH_VIEW
|
|
LDF *+AR7(NEW_RADY),R6 ;Save initial value
|
|
|
|
CALL UPDATE_CAMERA
|
|
PUSHF R6
|
|
CALL RESCAN ;This hoses all RX registers
|
|
POPF R6
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
INIT_REVERS_CUP:
|
|
LDI -350,R0
|
|
FLOAT R0,R1
|
|
STF R1,*+AR7(CAMYOFF)
|
|
LDI 4,R0 ;direction to search in
|
|
LDI 1,R1 ;distance to start with
|
|
LDI 5,R2 ;Position to follow
|
|
LDF PI,R3
|
|
CALL INITROAD_VIEW
|
|
LDF 1,R2
|
|
CALL SET_LANE
|
|
CALL INIT_LANE
|
|
CALL REV_ROAD_VIEW
|
|
|
|
CALL UPDATE_CAMERA
|
|
CALL RESCAN
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
INIT_CATCHUP:
|
|
LDI -350,R0
|
|
FLOAT R0,R1
|
|
STF R1,*+AR7(CAMYOFF)
|
|
LDI 4,R0 ;direction to search in
|
|
LDI 1,R1 ;distance to start with
|
|
LDI 5,R2 ;Position to follow
|
|
LDF 0,R3
|
|
CALL INITROAD_VIEW
|
|
LDF 1,R2
|
|
CALL SET_LANE
|
|
CALL INIT_LANE
|
|
CALL ROAD_VIEW
|
|
CALL UPDATE_CAMERA
|
|
CALL RESCAN
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
INIT_LEAD:
|
|
LDI -300,R0
|
|
FLOAT R0,R1
|
|
STF R1,*+AR7(CAMYOFF)
|
|
LDI -4,R0
|
|
LDI 1,R1
|
|
LDI 0,R2
|
|
LDF PI,R3
|
|
CALL INITROAD_VIEW
|
|
LDF 1,R2
|
|
CALL SET_LANE
|
|
CALL INIT_LANE
|
|
CALL LEAD_VIEW
|
|
CALL UPDATE_CAMERA
|
|
CALL RESCAN
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
INITROAD_VIEW:
|
|
STI R0,*+AR7(CAMERA_XYZR)
|
|
STI R1,*+AR7(CAMERA_XYZR+1)
|
|
STI R2,*+AR7(CAMERA_XYZR+2)
|
|
STF R3,*+AR7(CAMERA_XYZR+3)
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR7(CAMERA_ACCEL)
|
|
|
|
LDI 1,R0
|
|
STI R0,*+AR7(CUT_PAN)
|
|
|
|
LDI *+AR7(CAMERA_XYZR+2),R2 ;Position to find
|
|
CALL FIND_RACER
|
|
|
|
LDI AR4,AR0
|
|
STI AR4,*+AR7(CAROBJ)
|
|
STI AR4,@PLYCAR
|
|
LDI *+AR4(OCARBLK),AR1
|
|
STI AR1,@PLYCBLK
|
|
|
|
CALL GET_MAP_CARBLK
|
|
|
|
LDI *+AR7(CAMERA_XYZR+1),R0
|
|
MPYI *+AR7(CAMERA_XYZR),R0
|
|
SUBI R0,AR4 ;Start this many track sections behind first place
|
|
LDI @NOSWAP,R0
|
|
CMPI 0,R0 ;Don't check during init
|
|
BNE OK_FOUNDIT
|
|
TRY_AGAIN
|
|
LDI *+AR4(3),R2 ;Get ID
|
|
CALL FIND_TRACK
|
|
CMPI 0,AR2
|
|
BNE OK_FOUNDIT
|
|
ADDI *+AR7(CAMERA_XYZR),AR4
|
|
BR TRY_AGAIN
|
|
OK_FOUNDIT
|
|
CALL GET_ROAD_RADY
|
|
STF R0,*+AR7(NEW_RADY)
|
|
|
|
FLOAT *+AR4(X),R0
|
|
STF R0,*+AR7(NEW_POSX)
|
|
|
|
FIX *+AR7(CAMYOFF),R0
|
|
ADDI *+AR4(Y),R0
|
|
FLOAT R0
|
|
STF R0,*+AR7(NEW_POSY)
|
|
|
|
FLOAT *+AR4(Z),R0
|
|
STF R0,*+AR7(NEW_POSZ)
|
|
|
|
RETS
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
WATCH_VIEW:
|
|
|
|
LDI *+AR7(CAROBJ),AR0
|
|
LDF *+AR0(OPOSX),R2 ;Get the direction of the car relative to
|
|
SUBF *+AR7(NEW_POSX),R2 ;the direction the camera is moving in.
|
|
LDF *+AR0(OPOSZ),R3
|
|
SUBF *+AR7(NEW_POSZ),R3
|
|
CALL ARCTANF
|
|
CALL NORM_VECTOR
|
|
SUBF HALFPI,R0
|
|
CALL NORM_VECTOR
|
|
NEGF R0
|
|
STF R0,*+AR7(NEW_RADY)
|
|
WV1
|
|
LDI AR7,R2
|
|
ADDI NEW_RADX,R2
|
|
LDI AR7,AR2
|
|
ADDI NEW_MATRIX,AR2
|
|
CALL FIND_MATRIX
|
|
|
|
LDI @NFRAMES,R0
|
|
SUBI R0,AR5 ;Will count frames in this case
|
|
|
|
LDI @ATTRWAVE,R0
|
|
CMPI 2,R0 ;preincremented will actually be GGPARK
|
|
BNE NO_WHOOSH
|
|
READADJ ADJ_ATTRACT_MODE_SOUND
|
|
CMPI 0,R0
|
|
BEQ NO_WHOOSH
|
|
LDF R6,R0
|
|
SUBF *+AR7(NEW_RADY),R0
|
|
CMPF 0.18,R0 ;9deg diff
|
|
BLT NO_WHOOSH
|
|
LDF -100,R6 ;do only once
|
|
SOND1 WHOOSH
|
|
NO_WHOOSH
|
|
|
|
RETS
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
REV_ROAD_VIEW:
|
|
LDI *+AR7(CAROBJ),AR0
|
|
LDI *+AR0(OCARBLK),AR1
|
|
LDF *+AR1(CARSPEED),R0
|
|
MPYF 1.8,R0
|
|
STF R0,*+AR7(CAMERA_VEL) ;Set initial camera velocity
|
|
LDF 0.6,R2
|
|
CALL SET_LANE
|
|
CALL MOVE_ROAD_CAMERA
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
.data
|
|
ACCEL_RATE .float 0.000002
|
|
.text
|
|
ROAD_VIEW:
|
|
CALL FIND_CLOSEST_RACER
|
|
CMPI 0,AR1
|
|
LDIZ 0,AR5 ;PASSED FIRST PLACE CHANGE MODES (AR5 = frame to switch)
|
|
BEQ RV1
|
|
|
|
CMPI *+AR7(CAROBJ),AR1
|
|
BEQ RV1A
|
|
LDF 0,R2
|
|
STF R2,*+AR7(CAMERA_ACCEL)
|
|
|
|
|
|
STI AR1,*+AR7(CAROBJ) ;FOUND a NEW CAR
|
|
STI AR1,@PLYCAR
|
|
LDI *+AR1(OCARBLK),AR0
|
|
STI AR0,@PLYCBLK
|
|
STF R0,*+AR7(CARDIS)
|
|
RV1A
|
|
|
|
LDF @ACCEL_RATE,R3
|
|
LDF *+AR7(CAMERA_ACCEL),R2
|
|
LDF *+AR7(CARDIS),R1
|
|
MPYF 0.6,R1
|
|
CMPF R0,R1 ;Are we half way there yet?
|
|
BLT RV1B
|
|
NEGF R3
|
|
RV1B
|
|
ADDF R3,R2
|
|
LDFLT 0,R2
|
|
STF R2,*+AR7(CAMERA_ACCEL)
|
|
MPYF R0,R2 ;Factor in overall distance
|
|
ADDF 1.6,R2
|
|
|
|
LDI *+AR1(OCARBLK),AR0
|
|
LDF *+AR0(CARSPEED),R0
|
|
MPYF R2,R0
|
|
STF R0,*+AR7(CAMERA_VEL) ;Set initial camera velocity
|
|
RV1
|
|
LDF 0.6,R2
|
|
CALL SET_LANE
|
|
CALL MOVE_ROAD_CAMERA
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
LEAD_VIEW:
|
|
LDI *+AR7(CAROBJ),AR0
|
|
LDI *+AR0(OCARBLK),AR1
|
|
LDF *+AR1(CARSPEED),R0
|
|
MPYF 1.51,R0
|
|
STF R0,*+AR7(CAMERA_VEL) ;Set initial camera velocity
|
|
|
|
LDF 0.6,R2
|
|
CALL SET_LANE
|
|
CALL MOVE_ROAD_CAMERA
|
|
RETS
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
MOVE_ROAD_CAMERA:
|
|
LDI @NOSWAP,R0 ;If noswap is on definatly do it
|
|
BNE MRC1
|
|
LDI @SUSPEND_MODE,R0 ;This stops the shimmer at the start of bevhills
|
|
CMPI SM_HALT,R0
|
|
BEQ MRCX
|
|
MRC1
|
|
CALL GETCAMDIR
|
|
|
|
LDI @VECTORBI,AR2
|
|
LDF *+AR7(NEW_RADX),R0
|
|
STF R0,*+AR2(X)
|
|
LDF *+AR7(NEW_RADZ),R0
|
|
STF R0,*+AR2(Z)
|
|
|
|
LDF *+AR7(NEW_RADY),R0
|
|
SUBF *+AR7(CAMERA_XYZR+3),R0 ;LOOSE the Offset rad for viewing
|
|
CALL NORM_VECTOR
|
|
NEGF R0 ;Move in oposite direction looking?
|
|
STF R0,*+AR2(Y)
|
|
|
|
LDI @VECTORBI,R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_MATRIX
|
|
|
|
LDI @VECTORAI,AR2
|
|
LDF 0,R0
|
|
STF R0,*+AR2(X)
|
|
STF R0,*+AR2(Y)
|
|
LDF *+AR7(CAMERA_VEL),R0
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
STF R0,*+AR2(Z)
|
|
LDI @VECTORBI,R3
|
|
LDI @MATRIXAI,R2
|
|
CALL MATRIX_MUL
|
|
|
|
LDI @VECTORBI,AR2
|
|
LDF *+AR2(X),R0
|
|
ADDF *+AR7(NEW_POSX),R0
|
|
STF R0,*+AR7(NEW_POSX)
|
|
|
|
LDF *+AR2(Z),R0
|
|
ADDF *+AR7(NEW_POSZ),R0
|
|
STF R0,*+AR7(NEW_POSZ)
|
|
|
|
PUSH AR4
|
|
LDI AR7,AR4
|
|
ADDI NEW_POSX,AR4
|
|
CALL CAMSCAN
|
|
POP AR4
|
|
BNC USE_SLOPE
|
|
LDF *+AR7(CAMYOFF),R1
|
|
ADDF R1,R0
|
|
ADDF *+AR7(NEW_POSY),R0
|
|
STF R0,*+AR7(NEW_POSY)
|
|
BR NO_SLOPE
|
|
USE_SLOPE
|
|
;This code should really never get used
|
|
LDI AR4,AR2
|
|
ADDI 4,AR2
|
|
LDI *+AR2(Z),R0
|
|
SUBI *+AR4(Z),R0
|
|
FLOAT R0
|
|
MPYF R0,R0
|
|
LDI *+AR2(X),R1
|
|
SUBI *+AR4(X),R1
|
|
FLOAT R1
|
|
MPYF R1,R1
|
|
ADDF3 R0,R1,R2 ;R= SQRT (X^2 + Z^2)
|
|
CALL SQRT
|
|
LDF R0,R1
|
|
|
|
LDI *+AR2(Y),R0
|
|
SUBI *+AR4(Y),R0
|
|
FLOAT R0
|
|
MPYF 1.05,R0 ;FUDGE FACTOR
|
|
CALL DIV_F
|
|
LDI @VECTORAI,AR0
|
|
LDF *+AR0(Z),R1
|
|
MPYF R1,R0
|
|
ADDF *+AR7(NEW_POSY),R0
|
|
STF R0,*+AR7(NEW_POSY)
|
|
|
|
LDI -400,R1 ;at 1000 above the road
|
|
ADDI *+AR4(Y),R1
|
|
FLOAT R1
|
|
SUBF *+AR7(NEW_POSY),R1
|
|
MPYF 0.04,R1
|
|
ADDF *+AR7(NEW_POSY),R1
|
|
STF R1,*+AR7(NEW_POSY)
|
|
NO_SLOPE
|
|
|
|
LDI AR7,R2
|
|
ADDI NEW_RADX,R2
|
|
LDI AR7,AR2
|
|
ADDI NEW_MATRIX,AR2
|
|
CALL FIND_MATRIX
|
|
|
|
CALL NEXT_ROAD
|
|
MRCX
|
|
RETS
|
|
*---------------------------------------------------------------------------
|
|
* Updates AR4 to point to the road segment that the camera is on
|
|
* NOTE: uses Stealth mode
|
|
* INPUT AR4 = segment on
|
|
* OUTPUT AR4 = segment on (updated)
|
|
*
|
|
|
|
NEXT_ROAD:
|
|
FLOAT *+AR4(X),R0
|
|
SUBF *+AR7(NEW_POSX),R0
|
|
MPYF R0,R0
|
|
FLOAT *+AR4(Z),R1
|
|
SUBF *+AR7(NEW_POSZ),R1
|
|
MPYF R1,R1
|
|
ADDF R1,R0
|
|
|
|
LDI AR4,AR2
|
|
ADDI 4,AR2
|
|
FLOAT *+AR2(X),R1
|
|
SUBF *+AR7(NEW_POSX),R1
|
|
MPYF R1,R1
|
|
FLOAT *+AR2(Z),R2
|
|
SUBF *+AR7(NEW_POSZ),R2
|
|
MPYF R2,R2
|
|
ADDF R2,R1
|
|
|
|
CMPF R1,R0
|
|
BLE fcrx ;didn't move
|
|
ADDI 4,AR4
|
|
; .if DEBUG
|
|
; LDI *+AR4(3),R2
|
|
; CALL FIND_TRACK
|
|
; CMPI 0,AR2
|
|
; BNE fcr1
|
|
; LOCKUP ;TRACK not loaded yet
|
|
;fcr1
|
|
; .endif
|
|
DEC AR5 ;AR5 is the number of road segments before swithching
|
|
BR NEXT_ROAD ;See if the road segment beyond is even closer
|
|
fcrx
|
|
RETS
|
|
|
|
*---------------------------------------------------------------------------
|
|
* Sets the cameras RADY based on the next track segments reletive position
|
|
* NOTE: uses stealth mode
|
|
* No I/O
|
|
* Sets CAMERA_RADY = (CAMERA_XYZR+3)+ RAD to next track section
|
|
|
|
GETCAMDIR:
|
|
LDF *+AR7(CAMERA_VEL),R0 ;Adjust the smothing factor to speed
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
FLOAT 5000,R1
|
|
CALL DIV_F
|
|
LDF R0,R4
|
|
|
|
CALL GET_ROAD_RADY ;Calculate the offset for lane position
|
|
NEGF R0 ;based on the roads direction
|
|
LDF R0,R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDI @VECTORAI,AR2
|
|
LDF 0,R0
|
|
STF R0,*+AR2(Y)
|
|
STF R0,*+AR2(Z)
|
|
LDF *+AR7(CAMERA_LANE),R0
|
|
STF R0,*+AR2(X)
|
|
LDI @VECTORBI,R3
|
|
LDI @MATRIXAI,R2
|
|
CALL MATRIX_MUL
|
|
|
|
LDI AR4,AR1
|
|
ADDI 4*2,AR1
|
|
|
|
LDI @VECTORBI,AR2 ;Factor in the desired location to be at
|
|
FLOAT *+AR1(Z),R2 ;reletive to where we are
|
|
ADDF *+AR2(Z),R2
|
|
SUBF *+AR7(NEW_POSZ),R2
|
|
FLOAT *+AR1(X),R3
|
|
ADDF *+AR2(X),R3
|
|
SUBF *+AR7(NEW_POSX),R3
|
|
CALL ARCTANF
|
|
CALL NORM_VECTOR
|
|
ADDF *+AR7(CAMERA_XYZR+3),R0 ;Offset for VIEW
|
|
CALL NORM_VECTOR
|
|
SUBF *+AR7(NEW_RADY),R0
|
|
LDF R4,R2
|
|
CALL SMOOTH_VECTOR
|
|
ADDF *+AR7(NEW_RADY),R0
|
|
STF R0,*+AR7(NEW_RADY)
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR7(NEW_RADX)
|
|
STF R0,*+AR7(NEW_RADZ)
|
|
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*INPUT R2 = FL smoothing
|
|
SET_LANE:
|
|
LDI *+AR7(CAROBJ),AR0
|
|
LDI *+AR0(OPLINK),AR0
|
|
FLOAT 1000,R1 ;Offset to center of right lanes
|
|
LDF *+AR0(ROADOFFSET),R0
|
|
BP SL1
|
|
NEGF R1
|
|
SL1
|
|
SUBF R1,R0
|
|
; MPYF 0.40,R0 ;Move to just inside where the car is.
|
|
MPYF 0.30,R0 ;Move to just inside where the car is.
|
|
ADDF R1,R0
|
|
CMPF 1.0,R2
|
|
BEQ SL2
|
|
SUBF *+AR7(CAMERA_LANE),R0
|
|
MPYF R2,R0
|
|
ADDF *+AR7(CAMERA_LANE),R0
|
|
STF R0,*+AR7(CAMERA_LANE)
|
|
SL2
|
|
STF R0,*+AR7(CAMERA_LANE)
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
INIT_LANE:
|
|
LDF *+AR7(CAMERA_LANE),R3
|
|
CALL DO_LANE_POS
|
|
RETS
|
|
|
|
*---------------------------------------------------------------------------
|
|
*INPUT R2 = RADIANS to offset for doing the lanes
|
|
* R3 = Distance from center +/-
|
|
|
|
DO_LANE_POS:
|
|
PUSHF R3
|
|
LDI AR4,AR1
|
|
ADDI 4*2,AR1
|
|
|
|
CALL GET_ROAD_RADY
|
|
NEGF R0
|
|
LDF R0,R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDI @VECTORAI,AR2
|
|
LDF 0,R0
|
|
STF R0,*+AR2(Y)
|
|
STF R0,*+AR2(Z)
|
|
POPF R0
|
|
STF R0,*+AR2(X)
|
|
|
|
LDI @VECTORBI,R3
|
|
LDI @MATRIXAI,R2
|
|
CALL MATRIX_MUL
|
|
|
|
LDI @VECTORBI,AR2
|
|
LDF *+AR2(X),R0
|
|
ADDF *+AR7(NEW_POSX),R0
|
|
STF R0,*+AR7(NEW_POSX)
|
|
|
|
LDF *+AR2(Z),R0
|
|
ADDF *+AR7(NEW_POSZ),R0
|
|
STF R0,*+AR7(NEW_POSZ)
|
|
RETS
|
|
|
|
*---------------------------------------------------------------------------
|
|
*INPUT AR4 = POINTER to LEG_MAP where road is
|
|
*OUTPUT R0 = DIRECTION of road
|
|
GET_ROAD_RADY:
|
|
PUSH AR1
|
|
PUSH R2
|
|
PUSHF R2
|
|
PUSH R3
|
|
PUSHF R3
|
|
|
|
LDI AR4,AR1
|
|
ADDI 4*2,AR1
|
|
|
|
LDI *+AR1(Z),R2
|
|
SUBI *+AR4(Z),R2
|
|
FLOAT R2
|
|
LDI *+AR1(X),R3 ;Get the direction of the road
|
|
SUBI *+AR4(X),R3
|
|
FLOAT R3
|
|
CALL ARCTANF
|
|
CALL NORM_VECTOR
|
|
|
|
POPF R3
|
|
POP R3
|
|
POPF R2
|
|
POP R2
|
|
POP AR1
|
|
RETS
|
|
|
|
*---------------------------------------------------------------------------
|
|
*This algorithm is based on a bubble sort
|
|
*Find the RACER DRONE IN FIRST PLACE based on position in LEG_MAP
|
|
*INPUT R2 = Position to find
|
|
*OUTPUT AR4 = OBJ of the racer
|
|
*
|
|
*
|
|
FIND_RACER:
|
|
LDI AR7,AR3 ;clear the list
|
|
ADDI TEMP_DATA,AR3
|
|
LDI 0,R0
|
|
RPTS 9
|
|
STI R0,*AR3++
|
|
LDI AR7,AR3
|
|
ADDI TEMP_DATA,AR3
|
|
|
|
LDI 0,IR0
|
|
LDI 0,AR1
|
|
LDI 7FFFh,R3
|
|
MPYI R3,R3 ;BIG number
|
|
FR0
|
|
LDI 0,R4
|
|
LDI @CAR_LISTI,AR0 ;Scan the list of car objects
|
|
SUBI OLINK3,AR0
|
|
|
|
FR1
|
|
LDI *+AR0(OLINK3),AR0 ;They are linked by OLINK3
|
|
CMPI 0,AR0
|
|
BEQ FRX
|
|
|
|
LDI *+AR0(OID),R0 ;Is this a racer?
|
|
CMPI DRONE_C|VEHICLE_T|DRNE_RACER,R0
|
|
BNE FR1
|
|
|
|
CALL GET_MAP_CARBLK
|
|
|
|
CMPI AR4,R3 ;Best position looking for
|
|
BLT FR1
|
|
CMPI AR4,R4 ;Greatest entry in the LEG_MAP wins
|
|
BGT FR1
|
|
|
|
LDI IR0,IR1 ;WHILE ((IR0>0) && (*+AR3(IR1++) != AR0))
|
|
FR2A
|
|
SUBI 1,IR1
|
|
CMPI 0,IR1
|
|
BN FR2B
|
|
FR2
|
|
CMPI *+AR3(IR1),AR0 ;IF THIS CAR IS ALLREADY ON LIST, Then Get NEXT
|
|
BEQ FR1
|
|
BR FR2A
|
|
FR2B
|
|
LDI AR4,R4
|
|
LDI AR0,AR1 ;Set the pointer to the cars obj
|
|
BU FR1
|
|
FRX
|
|
STI AR1,*+AR3(IR0)
|
|
ADDI 1,IR0
|
|
LDI R4,R3
|
|
SUBI 1,R2
|
|
BP FR0 ;Find the next best
|
|
CMPI 0,AR1
|
|
BNE FRXX
|
|
LOCKUP ;No RACERS?
|
|
FRXX
|
|
LDI AR1,AR4
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*This algorithm is based on a single pass bubble sort
|
|
*OUTPUT
|
|
* R0 = Distance to the closest Racer Drone
|
|
* AR1 = Pointer to the Closest Racer Drone in front of the camera
|
|
* AR1 = 0, If no Racer Drones in front of the camera
|
|
*
|
|
|
|
|
|
FIND_CLOSEST_RACER:
|
|
FLOAT 30000,R5
|
|
MPYF R5,R5
|
|
MPYF R5,R5
|
|
MPYF R5,R5
|
|
MPYF R5,R5 ;BIG F'N NUMBER
|
|
|
|
LDI @CAR_LISTI,AR0 ;Scane the linked list of cars
|
|
SUBI OLINK3,AR0
|
|
LDI 0,AR1
|
|
FCR1
|
|
LDI *+AR0(OLINK3),AR0
|
|
CMPI 0,AR0
|
|
BEQ FCRX
|
|
|
|
LDI *+AR0(OID),R0
|
|
CMPI DRONE_C|VEHICLE_T|DRNE_RACER,R0 ;Racer drones only
|
|
BNE FCR1
|
|
|
|
LDF *+AR0(OPOSZ),R2
|
|
SUBF *+AR7(NEW_POSZ),R2
|
|
LDF *+AR0(OPOSX),R3 ;Get the direction of the car relative to
|
|
SUBF *+AR7(NEW_POSX),R3 ;the direction the camera is moving in.
|
|
CALL ARCTANF
|
|
CALL NORM_VECTOR
|
|
SUBF *+AR7(NEW_RADY),R0 ;DEG from camera
|
|
CALL NORM_VECTOR
|
|
SUBF *+AR7(CAMERA_XYZR+3),R0 ;LOOSE the Offset rad for viewing
|
|
CALL NORM_VECTOR
|
|
ABSF R0
|
|
CMPF 0.78,R0 ;Within +/- 45deg?
|
|
BGT FCR1 ;Nop this car is beside us or behind us
|
|
|
|
LDF *+AR0(OPOSX),R0 ;Now compute the distance to the car
|
|
SUBF *+AR7(NEW_POSX),R0 ;D = SQRT((X2-X1)^2+(Y2-Y1)^2)
|
|
MPYF R0,R0
|
|
LDF *+AR0(OPOSZ),R1
|
|
SUBF *+AR7(NEW_POSZ),R1
|
|
MPYF R1,R1
|
|
ADDF R0,R1,R2
|
|
CALL SQRT
|
|
CMPF R0,R5
|
|
LDFGT R0,R5
|
|
LDIGT AR0,AR1
|
|
BU FCR1
|
|
FCRX
|
|
LDF R5,R0
|
|
RETS
|
|
|
|
*---------------------------------------------------------------------------
|
|
*
|
|
*GET OBJECT POINTER TO ROAD SEG ID IN R2
|
|
*INPUTS R2=OUSR1
|
|
*OUPTUTS AR2=POINTER TO OBJECT
|
|
* AR2=0 not found
|
|
FIND_TRACK:
|
|
LDI @DYNALIST_TRUEBEGIN,AR2
|
|
FDL
|
|
LDI *+AR2(OUSR1),R0
|
|
CMPI R0,R2
|
|
BZ FDLX
|
|
LDI *+AR2(OLINK4),AR2
|
|
CMPI 0,AR2 ;CHECK END OF THE LINE
|
|
BNZ FDL
|
|
FDLX
|
|
RETS
|
|
|
|
*---------------------------------------------------------------------------
|
|
*
|
|
*GET POINTER TO MAP_LEG, FOR THE CAR IN AR4
|
|
*INPUTS AR0=POINTER TO CARBLK
|
|
*OUPTUTS AR4=POINTER TO place in LEG_MAP
|
|
*SETS CAROBJ IF GET_MAP_SEGMENT is called
|
|
|
|
GET_MAP_CARBLK: ;INPUT is AR0=POINTER TO THE CARBLK
|
|
PUSH R2
|
|
LDI *+AR0(OPLINK),AR2
|
|
LDI *+AR2(DELTA_SPTR),AR4
|
|
LDI *+AR2(STEALTHMODE),R0 ;ARE YOU A STEALTHY BITCH?
|
|
BNZ GMSX
|
|
LDI *+AR0(OCARBLK),AR4
|
|
LDI *+AR4(CARTRAK),AR4 ;Get the track piece the car is on
|
|
LDI *+AR4(OUSR1),R2
|
|
|
|
CALL FIND_MAP
|
|
|
|
GMSX
|
|
POP R2
|
|
RETS
|
|
|
|
*---------------------------------------------------------------------------
|
|
*
|
|
*GET POINTER TO MAP_LEG, ID IN R2
|
|
*INPUTS R2=OUSR1
|
|
*OUPTUTS AR4=POINTER TO place in LEG_MAP
|
|
|
|
FIND_MAP:
|
|
LDI @LEG_MAPI,AR4 ;FIND THE POSITION IN THE MAP
|
|
ADDI 3,AR4 ;OFFSET TO ID
|
|
FIND_LP
|
|
LDI *AR4++(4),R0
|
|
CMPI R2,R0
|
|
BLT FIND_LP
|
|
FINDX
|
|
SUBI 7,AR4
|
|
RETS
|
|
|
|
INITVIEW1_VIEW:
|
|
LDI 0,R1
|
|
STI R0,*+AR7(CAMERA_VIEW)
|
|
LDI @PLYCAR,AR4
|
|
LDF 0,R0
|
|
FLOAT -150,R1
|
|
FLOAT 0,R2
|
|
LDF 0,R3
|
|
BR SET_SMOOTH_VIEW
|
|
|
|
CUT_TO_VIEW2:
|
|
LDI 1,R0 ;Don't smooth while spinning
|
|
STI R0,*+AR7(CUT_PAN)
|
|
|
|
LDI 4,R2 ;FOLOW 3rd place
|
|
CALL FIND_RACER
|
|
STI AR4,@PLYCAR
|
|
LDI *+AR4(OCARBLK),AR0
|
|
STI AR0,@PLYCBLK
|
|
CALL INITVIEW2_VIEW
|
|
CALL UPDATE_CAMERA
|
|
CALL RESCAN
|
|
RETS
|
|
|
|
INITVIEW2_VIEW:
|
|
LDI @PLYCAR,AR4
|
|
|
|
LDI 1,R0
|
|
STI R0,*+AR7(CAMERA_VIEW)
|
|
LDF 0,R0
|
|
FLOAT -400,R1
|
|
FLOAT -2200,R2
|
|
LDF 0,R3
|
|
BR SET_SMOOTH_VIEW
|
|
|
|
INITVIEW3_VIEW:
|
|
LDI BUT_VIEW3,R1
|
|
STI R0,*+AR7(CAMERA_VIEW)
|
|
LDF 0,R0
|
|
FLOAT -900,R1
|
|
FLOAT -3840,R2
|
|
LDF 0,R3
|
|
BR SET_SMOOTH_VIEW
|
|
|
|
*----------------------------------------------------------------------------
|
|
.ref CAMYADJ
|
|
|
|
FACE_FRONT:
|
|
PUSH AR5
|
|
|
|
LDI *+AR4(OCARBLK),AR5
|
|
LDI *+AR4(OFLAGS),R0 ;CHECK IF CAR IS DISPLAYED
|
|
TSTB O_LIST_M,R0
|
|
BNZ SECOND_PERSON
|
|
FIRST_PERSON ;NO, Then in first person
|
|
LDI 0,R0
|
|
STI R0,@CAMVIEW
|
|
|
|
LDI AR7,AR2
|
|
ADDI NEW_MATRIX,AR2
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
CALL CPYIMAT ;Copy the cars matrix into NEW_MATRIX
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR5(CARROT) ;NO OVERROTATION IN CORNER
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR7(NEW_RADY) ;NOTE this is not used for first person
|
|
|
|
LDF *+AR5(CARXLEAN),R0
|
|
MPYF -0.7,R0 ;NEGATE AND SCALE
|
|
SUBF *+AR7(NEW_RADX),R0
|
|
LDF 0.20,R2
|
|
CALL SMOOTH_VECTOR
|
|
ADDF *+AR7(NEW_RADX),R0
|
|
STF R0,*+AR7(NEW_RADX) ;NOTE this is not used for first person
|
|
|
|
LDF *+AR5(CARZLEAN),R0 ;GET Z LEAN FACTOR
|
|
MPYF -0.5,R0 ;NEGATE AND SCALE
|
|
STF R0,*+AR7(NEW_RADZ)
|
|
|
|
LDI @MATRIXCI,AR2
|
|
LDI AR7,R2
|
|
ADDI NEW_RADX,R2
|
|
CALL FIND_MATRIX
|
|
|
|
LDI AR7,AR2
|
|
ADDI NEW_MATRIX,AR2
|
|
LDI AR2,R3
|
|
LDI @MATRIXCI,R2
|
|
CALL CONCATMAT
|
|
|
|
NEGF *+AR5(CARYROT),R0 ;SAVE this for switching out of first person
|
|
STF R0,*+AR7(NEW_RADY) ;NOTE this is not used for first person
|
|
|
|
LDI *+AR5(CAR_SPIN),R0 ;SPINNING?
|
|
BZ FFX
|
|
LDI 1,R0 ;Don't smooth while spinning
|
|
STI R0,*+AR7(CUT_PAN)
|
|
BR FFX
|
|
|
|
SECOND_PERSON
|
|
LDI 1,R0
|
|
STI R0,@CAMVIEW
|
|
LDI *+AR5(CAR_SPIN),R0 ;SPINNING?
|
|
BNZ FFX ;YES, DONT mess WITH CAMERA ANGLE
|
|
|
|
LDF *+AR4(OVELX),R3
|
|
LDF *+AR4(OVELZ),R2
|
|
ADDF3 R3,R2,R1
|
|
CMPF 0,R1
|
|
BNE FFX1
|
|
NEGF *+AR5(CARYROT),R0 ;If stopped don't use the velocity
|
|
BR FFX2
|
|
FFX1
|
|
CALL ARCTANF
|
|
FFX2
|
|
CALL NORM_VECTOR
|
|
ADDF *+AR7(CAMERA_XYZR+3),R0
|
|
|
|
LDI *+AR7(CUT_PAN),R2
|
|
CMPI 0,R2
|
|
BNE FFX3 ;NO smoothing in a cut
|
|
SUBF *+AR7(NEW_RADY),R0
|
|
LDF 0.10,R2
|
|
; LDF 0.20,R2
|
|
CALL SMOOTH_VECTOR
|
|
|
|
ADDF *+AR7(NEW_RADY),R0
|
|
FFX3
|
|
STF R0,*+AR7(NEW_RADY)
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR7(NEW_RADX)
|
|
STF R0,*+AR7(NEW_RADZ)
|
|
FFX4
|
|
LDI AR7,R2
|
|
ADDI NEW_RADX,R2
|
|
LDI AR7,AR2
|
|
ADDI NEW_MATRIX,AR2
|
|
CALL FIND_MATRIX
|
|
|
|
LDI AR7,AR0
|
|
ADDI NEW_POSX,AR0
|
|
CALL CAMYADJ ;MAKE sure the camera doesn't go below the road
|
|
|
|
FFX
|
|
POP AR5
|
|
RETS
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*Does averaging
|
|
*INPUT
|
|
* R2 = average 0.20
|
|
* R0 = difference between the two angles
|
|
*OUTPUT
|
|
* R0 = SMOOTHED difference
|
|
SMOOTH_VECTOR:
|
|
CALL NORM_VECTOR
|
|
|
|
LDI *+AR5(CAR_SPIN),R3 ;SPINNING?
|
|
CMPI 1,R3
|
|
BEQ SV1 ;Yes then don't smooth
|
|
LDF R0,R3 ;Save of the non smoothed value
|
|
|
|
MPYF R2,R0 ;ANGLE SMOOTHING
|
|
|
|
ABSF R3,R2
|
|
CMPF 0.78,R2 ;Is this within 45 degrees?
|
|
BLT SVX
|
|
LDF R3,R0 ;NO, Then don't smooth the pig (PROBABLY JUST CHANGED CAMERA ANGLE)
|
|
SV1
|
|
LDI 1,R3
|
|
STI R3,*+AR7(CUT_PAN) ;This is a cut, Don't smooth the matrix
|
|
SVX
|
|
RETS
|
|
|
|
SERIOUSLY_NORMALIZE: ;For those crazy wacked out vectors that are more than 360deg
|
|
ABSF R0,R1
|
|
CMPF @TWOPII,R1
|
|
BLT NORM_VECTOR
|
|
LDF @TWOPII,R1
|
|
PUSHF R0
|
|
CALL DIV_F
|
|
FIX R0,R1
|
|
FLOAT R1
|
|
MPYF @TWOPII,R1 ;MOD 6.28
|
|
POPF R0
|
|
SUBF R1,R0
|
|
NORM_VECTOR:
|
|
LDF 0,R1 ;NORMALIZE DIFFERENCE
|
|
CMPF 3.14,R0
|
|
LDFGT -6.28,R1
|
|
|
|
CMPF -3.14,R0
|
|
LDFLT 6.28,R1
|
|
ADDF R1,R0
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
|
|
SET_SMOOTH_VIEW:
|
|
LDI 0,AR5 ;Set AR5 for init
|
|
|
|
STF R0,*+AR7(NEWCAMERA_XYZR)
|
|
STF R1,*+AR7(NEWCAMERA_XYZR+1)
|
|
STF R2,*+AR7(NEWCAMERA_XYZR+2)
|
|
STF R3,*+AR7(NEWCAMERA_XYZR+3)
|
|
|
|
LDF 0,R4
|
|
STF R4,*+AR7(ZOOMVEL)
|
|
|
|
LDI *+AR7(CUT_PAN),R4
|
|
BEQ SMOOTH_VIEW
|
|
;DO A CUT
|
|
STF R0,*+AR7(CAMERA_XYZR)
|
|
STF R1,*+AR7(CAMERA_XYZR+1)
|
|
STF R2,*+AR7(CAMERA_XYZR+2)
|
|
STF R3,*+AR7(CAMERA_XYZR+3)
|
|
|
|
SMOOTH_VIEW:
|
|
CALL ZOOM_CAMERA
|
|
CALL FACE_FRONT
|
|
|
|
LDI AR7,AR2
|
|
ADDI CAMERA_XYZR,AR2
|
|
LDI AR7,R2
|
|
ADDI NEW_MATRIX,R2
|
|
LDI AR7,R3
|
|
ADDI NEW_POSX,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDF *+AR4(OPOSX),R0
|
|
SUBF *+AR7(NEW_POSX),R0
|
|
STF R0,*+AR7(NEW_POSX)
|
|
|
|
LDF *+AR4(OPOSY),R0
|
|
ADDF *+AR7(NEW_POSY),R0
|
|
STF R0,*+AR7(NEW_POSY)
|
|
|
|
LDF *+AR4(OPOSZ),R0
|
|
ADDF *+AR7(NEW_POSZ),R0
|
|
STF R0,*+AR7(NEW_POSZ)
|
|
|
|
LDI *+AR4(OCARBLK),AR0
|
|
LDI *+AR0(CARTRAK),AR0
|
|
LDI *+AR0(OUSR1),R1
|
|
CMPI AR5,R1
|
|
RETSLT
|
|
LDI 0,AR5
|
|
|
|
;Put car back if it was removed
|
|
LDI *+AR4(OFLAGS),R0 ;CHECK IF ALREADY ON LIST
|
|
TSTB O_LIST_M,R0
|
|
BNZ SMOOTH_VIEWX ;YES, DONT INSERT
|
|
|
|
STI AR4,*+AR7(OBJINS)
|
|
; LDI AR4,AR2
|
|
; CALL OBJ_INSERT ;INSERT PLAYER OBJECT
|
|
|
|
SMOOTH_VIEWX
|
|
RETS
|
|
|
|
ZOOMACCEL .float 0.006
|
|
|
|
ZOOM_CAMERA:
|
|
LDI *+AR7(CUT_PAN),R0
|
|
BNE ZOOMX
|
|
LDF *+AR7(ZOOMVEL),R0
|
|
ADDF @ZOOMACCEL,R0
|
|
CMPF 0.2,R0
|
|
LDFGT 0.2,R0
|
|
STF R0,*+AR7(ZOOMVEL)
|
|
LDI AR7,AR0
|
|
ADDI CAMERA_XYZR,AR0
|
|
LDI AR7,AR1
|
|
ADDI NEWCAMERA_XYZR,AR1
|
|
LDI 3,RC
|
|
|
|
RPTB ZOOMLP
|
|
LDF *AR1++,R2
|
|
SUBF *AR0,R2
|
|
MPYF R0,R2
|
|
ADDF *AR0,R2
|
|
ZOOMLP STF R2,*AR0++
|
|
|
|
LDI *+AR7(CAMERA_VIEW),R0
|
|
CMPI 0,R0
|
|
BNE ZOOM1
|
|
ABSF *+AR7(CAMERA_XYZR+2),R0
|
|
CMPF 100,R0
|
|
BGT ZOOMX
|
|
LDI *+AR4(OFLAGS),R0 ;CHECK IF ALREADY OFF LIST
|
|
TSTB O_LIST_M,R0
|
|
BZ ZOOMX ;YES, DONT DELETE
|
|
LDI AR4,AR2 ;IN first person
|
|
CALL OBJ_PULL
|
|
BR ZOOMX
|
|
ZOOM1
|
|
ABSF *+AR7(CAMERA_XYZR+2),R0
|
|
CMPF 100,R0
|
|
BLT ZOOMX
|
|
LDI *+AR4(OFLAGS),R0 ;CHECK IF ALREADY ON LIST
|
|
TSTB O_LIST_M,R0
|
|
BNZ ZOOMX ;YES, DONT INSERT
|
|
LDI AR4,AR2
|
|
CALL OBJ_INSERT ;INSERT PLAYER OBJECT
|
|
LDI 1,R0
|
|
STI R0,*+AR7(CUT_PAN)
|
|
ZOOMX
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
|
|
*----------------------------------------------------------------------------
|
|
* UPDATE_CAMERA
|
|
* INPUT NEW_POSx/y/z,NEW_RADx/y/z,NEW_MATRIX
|
|
* OUTPUT _CAMERAPOS,_CAMERAMATRIX,_CAMERARAD
|
|
*
|
|
UPDATE_CAMERA:
|
|
LDI @_CAMERAPOSI,AR0
|
|
LDF *+AR7(NEW_POSX),R0
|
|
STF R0,*AR0
|
|
LDF *+AR7(NEW_POSY),R0
|
|
STF R0,*+AR0(Y)
|
|
LDF *+AR7(NEW_POSZ),R0
|
|
STF R0,*+AR0(Z)
|
|
|
|
LDP @_CAMERARAD
|
|
LDF *+AR7(NEW_RADX),R0
|
|
STF R0,@_CAMERARAD
|
|
LDF *+AR7(NEW_RADY),R0
|
|
STF R0,@_CAMERARAD+Y
|
|
LDF *+AR7(NEW_RADZ),R0
|
|
STF R0,@_CAMERARAD+Z
|
|
SETDP
|
|
|
|
LDI @CAMERAMATRIXI,AR0
|
|
LDI AR7,AR1
|
|
ADDI NEW_MATRIX,AR1
|
|
|
|
LDI *+AR7(CUT_PAN),R0
|
|
BEQ SMOOTH_MATRIX
|
|
|
|
LDI 8,RC
|
|
RPTB loopA
|
|
LDF *AR1++,R1
|
|
loopA STF R1,*AR0++
|
|
BR UPCAMX
|
|
|
|
SMOOTH_MATRIX
|
|
LDI 8,RC
|
|
RPTB loop
|
|
LDF *AR0,R0
|
|
MPYF 0.20,R0
|
|
LDF *AR1++,R1
|
|
MPYF 0.80,R1
|
|
ADDF R0,R1
|
|
loop STF R1,*AR0++
|
|
|
|
UPCAMX
|
|
CALL CAMERA_HORIZON_PROJECTION
|
|
LDI 0,R0
|
|
STI R0,*+AR7(CUT_PAN) ;Ok to smooth after this
|
|
RETS
|
|
|
|
|
|
;*----------------------------------------------------------------------------
|
|
;* MOVE_CAMERA
|
|
;*
|
|
;* INPUT CAMERA_SPEED,CAMERA_VEC
|
|
;*
|
|
;
|
|
;MOVE_CAMERA
|
|
; LDF @NEW_CAMERA+CAMERA_SPEED,R0
|
|
; BEQ no_movment
|
|
; LDI @NEW_CAMERAI,R2
|
|
; ADDI CAMERA_VECX,R2
|
|
; LDI @MATRIXAI,AR2
|
|
; CALL FIND_MATRIX
|
|
;
|
|
; LDF 0,R0
|
|
; STF R0,@VECTORA
|
|
; STF R0,@VECTORA+1
|
|
; LDF @NEW_CAMERA+CAMERA_SPEED,R0
|
|
; STF R0,@VECTORA+2
|
|
;
|
|
; LDI @MATRIXAI,R2
|
|
; LDI @VECTORAI,AR2
|
|
; LDI AR2,R3
|
|
; CALL MATRIX_MUL
|
|
;
|
|
; LDF @VECTORA,R0
|
|
; ADDF @NEW_CAMERA+CAMERAX,R0
|
|
; STF R0,@NEW_CAMERA+CAMERAX
|
|
;
|
|
; LDF @VECTORA+1,R0
|
|
; ADDF @NEW_CAMERA+CAMERAY,R0
|
|
; STF R0,@NEW_CAMERA+CAMERAY
|
|
;
|
|
; LDF @VECTORA+2,R0
|
|
; ADDF @NEW_CAMERA+CAMERAZ,R0
|
|
; STF R0,@NEW_CAMERA+CAMERAZ
|
|
;no_movment
|
|
; RETS
|
|
;
|
|
*----------------------------------------------------------------------------
|
|
CAMERA_HORIZON_PROJECTION:
|
|
LDF *+AR7(NEW_RADX),R2
|
|
CALL _SINE
|
|
|
|
FLOAT 512,R1
|
|
MPYF R1,R0
|
|
ADDF *+AR7(CAMERA_INFIN),R0
|
|
STF R0,@INFIN_CORRECT
|
|
|
|
RETS
|
|
|
|
.SECT "THEDATA"
|
|
ATTR_WAVETAB
|
|
.word 0,0
|
|
.word L_LEG5_BEGIN+1,4
|
|
.word L_LEG9_BEGIN+1,8
|
|
.word L_LEG11_BEGIN+1,10
|
|
.word 0,0
|
|
.word L_LEG5_BEGIN+1,4
|
|
.word L_LEG9_BEGIN+1,8
|
|
.word L_LEG11_BEGIN+1,10
|
|
|
|
ATTR_WAVETAB_LEN .set $-ATTR_WAVETAB-1
|
|
.text
|
|
|
|
INIT_ATTR_LEG:
|
|
LDI @ATTRWAVE,R0
|
|
BNE NO_MUSIC
|
|
|
|
;Wed Mar 8 11:02:10 1995
|
|
;
|
|
;
|
|
;if COMMP ON && SLAVE then no music
|
|
;if COMMP ON && MASTER then send_attrsnd
|
|
;if COMMP OFF do regular
|
|
;
|
|
;
|
|
LDI @DIPRAM,R0
|
|
TSTB DIP_COMMP,R0
|
|
BNZ DOTEST
|
|
TSTB CMDP_MASTER,R0
|
|
BNZ NO_MUSIC
|
|
|
|
CALL SEND_ATTRSND
|
|
|
|
DOTEST
|
|
;
|
|
;
|
|
;
|
|
|
|
READADJ ADJ_ATTRACT_MODE_SOUND
|
|
CMPI 0,R0
|
|
BEQ NO_MUSIC
|
|
SOND1 ATTR_THEME
|
|
NO_MUSIC
|
|
|
|
LDI MATTR|MINFIN,R0
|
|
STI R0,@_MODE
|
|
|
|
LDL press_PALETTES,AR2 ;make sure these are gone
|
|
CALL dealloc_section
|
|
|
|
LDI 0,R0 ;NO CHALLENGE RACES IN ATTRACT MODE
|
|
STI R0,@CHALLENGE_RACE
|
|
|
|
LDI @ATTR_WAVETABI,AR1
|
|
ADDI @ATTRWAVE,AR1
|
|
|
|
|
|
LDI *AR1++,R0
|
|
STI R0,@NEXT_STARTUP
|
|
LDI *AR1,R1
|
|
STI R1,@BONUS_WAVE
|
|
|
|
LDI @BONUS_WAVE,AR0
|
|
ADDI @FULLSETUP_TABLEI,AR0
|
|
LDI *AR0,R0
|
|
CALLU R0
|
|
|
|
LDF @INFIN_CORRECT,R0
|
|
STF R0,*+AR7(CAMERA_INFIN)
|
|
|
|
CALL OBJ_INIT
|
|
CALL INIT_DRONES ;init DRONE tracker system
|
|
CALL DYNAOBJ_INIT ;init DYNAMIC OBJECTS
|
|
CALL CARB_INIT ;init CAR BLOCKS
|
|
CALL INIT_RDDEBRIS ;initialize ROAD DEBRIS list(s)
|
|
|
|
;
|
|
;RE INITIALIZE TRACK...
|
|
;
|
|
LDI @BONUS_WAVE,AR0
|
|
ADDI @BONUS_POSTLAUNCHI,AR0
|
|
LDI *AR0,R0
|
|
CALLU R0
|
|
|
|
LDI @NEXT_STARTUP,R0
|
|
STI R0,@STARTSECTION
|
|
CALL BGD_INIT
|
|
|
|
PUSH AR7
|
|
LDI UTIL_C|BACKGRND_T,R0
|
|
LDI -1,R1
|
|
CALL PRC_FIND
|
|
LDI AR0,AR7
|
|
LDI 3,R0
|
|
STI R0,*+AR7(PTIME)
|
|
POP AR7
|
|
|
|
LDI *+AR7(PDATA),R0
|
|
STI R0,@BGNDCOLA
|
|
|
|
LDI 1,R0
|
|
STI R0,@NOAERASE
|
|
CLRI R0
|
|
STI R0,@OHIGH_PRIORITY
|
|
|
|
CREATE WAVEFLAG,UTIL_C|MONKEY_T
|
|
|
|
CALL ATTR_INIT_GAMELEG
|
|
|
|
LDI MAX_DRONES,R0
|
|
STI R0,@DD_MAX_DRONES
|
|
|
|
LDI @ATTRWAVE,R0
|
|
ADDI 2,R0
|
|
CMPI ATTR_WAVETAB_LEN-1,R0
|
|
LDIGT 0,R0
|
|
STI R0,@ATTRWAVE
|
|
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
ATTR_INIT_GAMELEG:
|
|
CREATE RHO_DISPATCHER,SPAWNER_C|TRAFFIC_T
|
|
CREATE SIGMA_DISPATCHER,SPAWNER_C|TRAFFIC_T
|
|
CREATE CPOINT_LIGHT,SPAWNER_C|COLORCYC_T
|
|
CREATE POSITION_FINDER,SPAWNER_C|TRAFFIC_T
|
|
|
|
LDI SM_HALT,R0
|
|
STI R0,@SUSPEND_MODE
|
|
|
|
LDI 0,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
LDI 1,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
|
|
LDI 2,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
|
|
LDI 3,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
|
|
LDI 4,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
STI AR0,@PLYCAR
|
|
|
|
LDI 5,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
|
|
LDI 6,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
LDI 7,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
|
|
LDI 9,R4
|
|
CREATE RACER_DRONE,DRONE_C
|
|
|
|
RETS
|
|
;*----------------------------------------------------------------------------
|
|
;
|
|
LOAD_ATTR_LEG:
|
|
LDI @ATTRWAVE,AR0
|
|
ADDI @ATTR_WAVETABI,AR0
|
|
LDI *+AR0(1),AR0
|
|
|
|
.if DEBUG
|
|
CMPI 0,AR0
|
|
LDILT 0,AR0
|
|
CMPI 13,AR0
|
|
LDIGT 13,AR0
|
|
.endif
|
|
|
|
ADDI @LOADSECTION_TABLEI,AR0
|
|
LDI *AR0,R0
|
|
CALLU R0
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*OLD CODE THAT I DEARLY LIKE TO REFFERENCE
|
|
|
|
;*----------------------------------------------------------------------------
|
|
;*TURN CAMERA TO FOLLOW OBJECT IN AR4
|
|
;*
|
|
;*PARAMETERS
|
|
;* AR4 OBJECT TO 'WATCH'
|
|
;*
|
|
;WATCH_OBJ:
|
|
; LDF *+AR4(OPOSX),R2
|
|
; SUBF @NEW_CAMERA+CAMERAX,R2
|
|
; LDF *+AR4(OPOSZ),R3
|
|
; SUBF @NEW_CAMERA+CAMERAZ,R3
|
|
; CALL ARCTANF
|
|
; SUBF HALFPI,R0
|
|
;
|
|
; NEGF R0,R2
|
|
; STF R2,@NEW_CAMERA+CAMERARADY
|
|
;
|
|
; LDF *+AR4(OPOSZ),R0
|
|
; SUBF @NEW_CAMERA+CAMERAZ,R0
|
|
; MPYF R0,R0
|
|
; LDF *+AR4(OPOSX),R1
|
|
; SUBF @NEW_CAMERA+CAMERAX,R1
|
|
; MPYF R1,R1
|
|
; ADDF3 R0,R1,R2 ;R= SQRT (X^2 + Z^2)
|
|
; CALL SQRT
|
|
; LDF R0,R3
|
|
;
|
|
; LDF *+AR4(OPOSY),R2
|
|
; SUBF @NEW_CAMERA+CAMERAY,R2
|
|
;
|
|
; CALL ARCTANF
|
|
;
|
|
; SUBF HALFPI,R0
|
|
;
|
|
; STF R0,@NEW_CAMERA+CAMERARADX
|
|
;
|
|
; LDI @NEW_CAMERAI,R2
|
|
; ADDI CAMERARADX,R2
|
|
; LDI @NEW_CAMERAI,AR2
|
|
; ADDI CAMERA_MATRIX,AR2
|
|
; CALL FIND_MATRIX
|
|
;
|
|
; CAll CAMERA_HORIZON_PROJECTION
|
|
;
|
|
; RETS
|
|
;*----------------------------------------------------------------------------
|
|
;INITFLYBY_VIEW:
|
|
; LDI -1,R0
|
|
; STI R0,*+AR7(CUT_PAN)
|
|
;
|
|
; FLOAT -4300,R0
|
|
; STF R0,@NEW_CAMERA+CAMERA_SPEED
|
|
;
|
|
;FLYBY_VIEW:
|
|
; LDF @NEW_CAMERA+CAMERA_SPEED,R0
|
|
; FLOAT 150,R1
|
|
; ADDF R1,R0
|
|
; STF R0,@NEW_CAMERA+CAMERA_SPEED
|
|
;
|
|
; LDF *+AR4(OPOSY),R0
|
|
; STF R0,@NEW_CAMERA+CAMERAY
|
|
;
|
|
; LDF *+AR4(ORADY),R2
|
|
; ADDF -1.54,R2
|
|
; CALL _SINE
|
|
; FLOAT 500,R2
|
|
; MPYF R0,R2
|
|
; LDF *+AR4(OPOSX),R0
|
|
; ADDF R2,R0
|
|
; STF R0,@NEW_CAMERA+CAMERAX
|
|
;
|
|
; LDF *+AR4(ORADY),R2
|
|
; ADDF -1.54,R2
|
|
; CALL _COSI
|
|
; FLOAT 500,R2
|
|
; MPYF R0,R2
|
|
; LDF *+AR4(OPOSZ),R0
|
|
; ADDF R2,R0
|
|
; STF R0,@NEW_CAMERA+CAMERAZ
|
|
;
|
|
; LDF *+AR4(ORADY),R0
|
|
; SUBF 0.10,R0
|
|
; STF R0,@NEW_CAMERA+CAMERA_VECY
|
|
;
|
|
; LDF 0.3,R0
|
|
; STF R0,@NEW_CAMERA+CAMERA_VECX
|
|
;
|
|
; LDF *+AR4(ORADZ),R0
|
|
; STF R0,@NEW_CAMERA+CAMERA_VECZ
|
|
;
|
|
; CALL MOVE_CAMERA
|
|
;
|
|
; LDF *+AR4(OPOSY),R0
|
|
; FLOAT -1500,R1 ;FIX ELEVATION
|
|
; ADDF R1,R0
|
|
; STF R0,@NEW_CAMERA+CAMERAY
|
|
;passed
|
|
; CALL WATCH_OBJ
|
|
;
|
|
; RETS
|
|
|
|
.END
|