290 lines
5.5 KiB
NASM
Executable File
290 lines
5.5 KiB
NASM
Executable File
.FILE "FLAME.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*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 TEXT.EQU
|
|
|
|
.data
|
|
FLAMEANII .word FLAMEANI
|
|
FLAME_POSI .word FLAME_POS
|
|
|
|
.SECT "THEDATA"
|
|
FLAME_POS
|
|
.word 180,87,-450 ;Vette
|
|
.word 130,105,-586 ;Coope
|
|
.word 140,107,-460 ;Missle
|
|
.word 160,70,-460 ;Ferrari
|
|
.word 180,87,-450 ;JEEP
|
|
.word 190,87,-650 ;SBUSP
|
|
.word 160,155,-500 ;COPCAR
|
|
|
|
FLAMEANI
|
|
.word sparc1,sparc3,sparc5,sparc7,sparc9,sparc7
|
|
.word sparc5,sparc3,sparc1,-1
|
|
|
|
.text
|
|
*----------------------------------------------------------------------------
|
|
* FLAME PROC
|
|
*
|
|
FRAME_ON .set PDATA+1
|
|
CARBODY_MATRIX .set PDATA+2
|
|
|
|
FLAME_PRC:
|
|
LDI PLYR_C|PLYR_FLAMES_S,AR2
|
|
CALL OBJ_FIND_FIRST
|
|
BC FLAME_DIE ;Only one set of flames at a time
|
|
|
|
LDI PLYR_C,AR2
|
|
CALL OBJ_FIND_FIRST
|
|
BNC FLAME_DIE ;IF there is no player object then bail.
|
|
LDI AR0,AR6
|
|
LDI *+AR0(OCARBLK),AR1
|
|
LDI *+AR1(CAR_SPIN),R0
|
|
BNZ FLAME_DIE ;YES, the no flames
|
|
|
|
LDI AR0,AR2
|
|
CALL GETCARBODY
|
|
|
|
STI AR0,*+AR7(CARBODY_MATRIX)
|
|
|
|
LDI 0,R0
|
|
STI R0,*+AR7(FRAME_ON) ;Reset animation counter
|
|
CALL OBJ_GET
|
|
BC FLAME_DIE
|
|
LDI AR0,AR4 ;Left flame
|
|
|
|
; LDI @CHOSEN_VEHICLE,R0
|
|
LDI @CHOOSENCAR,R0
|
|
MPYI 3,R0
|
|
ADDI @FLAME_POSI,R0
|
|
LDI R0,AR0
|
|
FLOAT *+AR0(X),R1
|
|
FLOAT *+AR0(Y),R2
|
|
FLOAT *+AR0(Z),R3
|
|
STF R1,*+AR4(OVELX)
|
|
STF R2,*+AR4(OVELY)
|
|
STF R3,*+AR4(OVELZ)
|
|
|
|
LDI PLYR_C|PLYR_FLAMES_S,R0
|
|
STI R0,*+AR4(OID)
|
|
|
|
|
|
CALL OBJ_GET
|
|
BC FLAME_DIE
|
|
LDI AR0,AR5 ;Right frame
|
|
LDF PI,R0
|
|
STF R0,*+AR5(ORADY)
|
|
FLOAT 180,R0
|
|
NEGF R1 ;opposite side
|
|
STF R1,*+AR5(OVELX)
|
|
STF R2,*+AR5(OVELY)
|
|
STF R3,*+AR5(OVELZ)
|
|
LDI PLYR_C|PLYR_FLAMES_S,R0
|
|
STI R0,*+AR5(OID)
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_INSERT
|
|
LDI AR5,AR2
|
|
CALL OBJ_INSERT
|
|
|
|
LDI 9-1,R5
|
|
FLAME_ANI_LOOP
|
|
LDI *+AR6(OCARBLK),AR1
|
|
LDI *+AR1(CAR_SPIN),R0
|
|
BNZ FLAME_ANIX ;YES, the kill the flames
|
|
|
|
LDI *+AR7(CARBODY_MATRIX),AR2
|
|
LDI AR6,R2
|
|
ADDI OMATRIX,R2
|
|
LDI @MATRIXAI,R3
|
|
CALL CONCATMATV
|
|
|
|
LDI @MATRIXAI,AR3
|
|
LDI AR4,AR0
|
|
LDI *+AR7(FRAME_ON),IR0
|
|
LDI @FLAMEANII,AR1
|
|
CALL animate_child
|
|
|
|
LDI @MATRIXAI,AR3
|
|
LDI *+AR7(FRAME_ON),IR0
|
|
LDI @FLAMEANII,AR1
|
|
LDI AR5,AR0
|
|
CALL animate_child
|
|
STI R0,*+AR7(FRAME_ON)
|
|
|
|
SLEEP 1
|
|
SUBI 1,R5
|
|
BP FLAME_ANI_LOOP
|
|
FLAME_ANIX
|
|
LDI PLYR_C|PLYR_FLAMES_S,AR2
|
|
CALL OBJ_FIND_FIRST
|
|
BNC FLANX1
|
|
LDI AR0,AR2
|
|
CALL OBJ_DELETE
|
|
BR FLAME_ANIX
|
|
FLANX1
|
|
|
|
FLAME_DIE
|
|
DIE
|
|
*----------------------------------------------------------------------------
|
|
*Input
|
|
* AR0 = object to position and ani
|
|
* OVELX/Y/Z = offset from parent
|
|
* AR6 = object to position reletive to
|
|
* AR1 = Animation list
|
|
* IR0 = Frame on
|
|
*OUTPUT
|
|
* IR0 = Next frame
|
|
*TRASHES AR2,R1,R2,R3
|
|
|
|
animate_child:
|
|
;Set the Frame
|
|
set_frame
|
|
LDI *+AR1(IR0),R1
|
|
LDIN 0,IR0
|
|
BN set_frame
|
|
ADDI 1,IR0
|
|
STI R1,*+AR0(OROMDATA)
|
|
PUSH IR0
|
|
;Set the position reletive to the parent object.
|
|
LDI AR3,R2
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL CPYMAT
|
|
|
|
LDI AR0,AR2 ;rotate the position reletive to parent
|
|
ADDI OVELX,AR2
|
|
LDI AR0,R2 ;Source 3X3
|
|
ADDI OMATRIX,R2
|
|
LDI AR0,R3 ;Dest 1X3
|
|
ADDI OPOSX,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDF *+AR6(OPOSX),R2 ;Set the position
|
|
ADDF *+AR0(OPOSX),R2
|
|
STF R2,*+AR0(OPOSX)
|
|
|
|
LDF *+AR6(OPOSY),R2
|
|
ADDF *+AR0(OPOSY),R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
LDF *+AR6(OPOSZ),R2
|
|
ADDF *+AR0(OPOSZ),R2
|
|
STF R2,*+AR0(OPOSZ)
|
|
|
|
LDI @MATRIXBI,AR2
|
|
LDI AR0,R2
|
|
ADDI ORADX,R2
|
|
CALL FIND_MATRIX
|
|
|
|
LDI AR3,AR2
|
|
LDI @MATRIXBI,R2
|
|
LDI AR0,R3
|
|
ADDI OMATRIX,R3
|
|
CALL CONCATMATV
|
|
|
|
POP R0
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CALLED BY ZSORTWT in obj.asm just after the players car is linked in.
|
|
*PUTS THE FLAMES JUST BEHIND THE PLAYERS CAR
|
|
|
|
FLAMESORT:
|
|
LDI @OACTIVE,AR0
|
|
CMPI 0,AR0
|
|
BEQ FLMSORTX ;NO LIST... NO GO
|
|
FLMSORT_LOOP
|
|
LDI PLYR_C|PLYR_FLAMES_S,R1
|
|
CALL FIND_NEXT_OBJ
|
|
BC FLMSORTX
|
|
LDI AR0,AR4
|
|
CALL FIND_NEXT_OBJ
|
|
BC FLMSORTX
|
|
LDI AR0,AR5
|
|
|
|
LDI *+AR4(OFLAGS),R0 ;SAVE the flages
|
|
LDI *+AR5(OFLAGS),R1 ;SAVE the flages
|
|
LDI AR4,AR2
|
|
CALL OBJ_PULL
|
|
LDI AR5,AR2
|
|
CALL OBJ_PULL
|
|
STI R0,*+AR4(OFLAGS) ;RESTORE the flags
|
|
STI R1,*+AR5(OFLAGS) ;RESTORE the flags
|
|
|
|
LDI PLYR_C,AR2
|
|
CALL OBJ_FIND_FIRST
|
|
BNC FLMSORTX ;NO PLAYER?
|
|
|
|
STI AR5,*AR4 ;Link flame2 to flame1
|
|
|
|
LDI *AR0,R0 ;Get link to next object
|
|
STI AR4,*AR0 ;link the flames to the players object
|
|
STI R0,*AR5 ;link back in the object behind the player
|
|
|
|
FLMSORTX
|
|
RETS
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*FIND THE MATRIX IN THE DYNALIST OF THE CAR POINTED TO BY AR2
|
|
*INPUT AR2 = CARS OBJECT
|
|
*OUTPUT AR0 = MATRIX OF THE BODY
|
|
* SCRAMBLES R0,R1
|
|
|
|
GETCARBODY:
|
|
LDI *+AR2(ODYNALIST),R0
|
|
SLOCKON Z,"UTIL\CARPROC dynamic objects not found"
|
|
FBLOOP
|
|
LDI R0,AR0
|
|
LDI *+AR0(DYNAFLAG),R1
|
|
BZ FOUND_BODY ;0 = car body
|
|
LDI *AR0,R0
|
|
BR FBLOOP
|
|
FOUND_BODY
|
|
ADDI DYNAMATRIX,AR0
|
|
RETS
|
|
|
|
FIND_NEXT_OBJ:
|
|
PUSH R0
|
|
PUSHF R0
|
|
PUSH AR5
|
|
|
|
LDI *AR0,AR5
|
|
|
|
OFN LDI AR5,R0
|
|
LDI R0,AR0
|
|
BZ OFNX ;NONE FOUND. This routine is passive
|
|
LDI *AR0,AR5
|
|
LDI *+AR0(OID),R0
|
|
CMPI R1,R0
|
|
BNE OFN
|
|
OFNX
|
|
CLRC
|
|
CMPI 0,AR0
|
|
BNE OFNX1
|
|
SETC
|
|
OFNX1
|
|
POP AR5
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
.END
|