revolution-x/GXUNIV1.ASM

1399 lines
36 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

.MLIB "GXMACS.LIB"
.FILE "GXUNIV1.ASM"
.TITLE " <<< GENERATION X -- GENERAL UNIVERSE ROUTINES PART 1 >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "GX.INC"
.INCLUDE "GXCONTRL.H"
.INCLUDE "IMGTBL.GLO"
.include "univtbl.glo"
; .INCLUDE "GXUNIV1.TBL"
* SYMBOLS IN HERE
.def BOX_CHECK_OBJ2,FLOAT_ZFAR, F_UFRAG_STUFF_X2
.DEF FRAG_SHARD_ANIM
.DEF FRAG_ONE_CLOUD, FRAG_ONE_CLOUD_X2, GOLD_DUST_PAL
.DEF FRAG_DUST_CLOUD_ANIM
.DEF FRAG_DUST_CLOUD_ANIM,MAKE_EXPLO_OFF
.DEF FRAG_U1_X2
* SYMBOLS FROM GXAFUNC.ASM
.REF A_DELETE_ZBOT
MAX_RAND_TBL EQU 11
.BSS RAND_RAM_TBL,(MAX_RAND_TBL+1)*010H
; .bss filler,16 ; to keep long word aligned
**************************************************************************
* *
* FLOAT_ZFAR *
* *
* This process adjusts ZFAR to keep it just beyond a UNIVERSE Z. *
* This is useful if you have one universe with a room behind the *
* room you're in. *
* *
* a8 = UNIV Z to track (relative to local universe) *
* *
**************************************************************************
FLOAT_ZFAR:
addi 800h,a8 ; buffer zone
move @ZREL_OFF,a14,L
sra ZFRAC,a14 ; convert to lores
add a14,a8 ; absolute universe
move @ZFAR,a9,L ; keep to restore
FZF_lp:
move @ZBASE,a0,L
sub a8,a0
neg a0 ; world Z
move a0,@ZFAR,L
move @SCROLLKILL,a1 ; terminated when SCROLLKILL non-zero
jrnz im_dead
sloop 3,FZF_lp
im_dead:
move a9,@ZFAR,L
dec a1
move a1,@SCROLLKILL
DIE
**************************************************************************
* *
* GROUND_COLLVECT *
* *
**************************************************************************
GROUND_COLLVECT
WWL OID_GRND,0FFFFH,DEL_PROC_AND_OBJ
WL 0,DUMCRETS
**************************************************************************
* *
* DEL_PROC_AND_OBJ - DELETE PROCESS AND OBJECT *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
DEL_PROC_AND_OBJ
PUSH A0
MOVE *A8(OPLINK),A0,L
JRZ DPAO_DEL ;BR=NO PROCESS
CLR A14
MOVE A14,*A8(OPLINK),L
CALLA KILL
DPAO_DEL
CALLA DELETE_OBJ
PULLQ A0
RETS
**************************************************************************
* *
* UNIV_ROCKET_COLL - ROCKET COLLISION WITH UNIVERSE OBJECT *
* *
* PASS: *
* A0 = ROCKET OBJECT *
* A8 = UNIVERSE OBJECT *
* *
**************************************************************************
UNIV_ROCKET_COLL
CALLA GETHEADPART ;OF ROCKET
MOVE A0,*A8(OATEROCKET),L
RETS
**************************************************************************
* *
* UNIV_COLL_CHECK - CHECK IF PLAYER'S EXPLOSION HIT AN UNIVERSE OBJECT *
* *
* PASS: *
* A0 = EXPLOSION OBJECT *
* A8 = UNIVERSE OBJECT *
* RETURN: *
* Z, IF HIT IS VALID *
* *
**************************************************************************
UNIV_COLL_CHECK
CALLA GETHEADPART ;OF EXPLOSION
MOVE *A8(OATEROCKET),A14,L
JRZ UCC_NOHIT ;BR=NO ROCKET COLLISION
CMP A0,A14
JRNE UCC_NOHIT ;BR=DIFFERENT EXPLOSION
MOVE *A0(RL_INTENDED_OBJ),A14,L ;DO WE HAVE THE RIGHT TARGET?
CMP A8,A14
JRNE UCC_NOHIT ;BR=NOPE. NOT THE RIGHT TARGET.
; MOVE *A0(RL_TARGET_OBJ),A14,L ;DO WE HAVE THE RIGHT TARGET?
; JRZ UCC_NOHIT ;BR=NO SIGHT OBJECT
; MOVE *A14(SIGHT_TARGET_OBJ),A14,L
; CMP A8,A14
; JRNE UCC_NOHIT ;BR=NOPE. NOT THE RIGHT TARGET.
CLRM *A8(OATEROCKET),L ;HIT! READY FOR ANOTHER!
RETS
UCC_NOHIT
CLR A14
NOT A14 ;RESET Z FOR NO HIT
RETS
**************************************************************************
* *
* DUMMY VECTORS *
* *
**************************************************************************
DUM_COLLVECT
.WORD 0
.LONG DUM_CVECT
DUM_CVECT
DUM_GUNVECT
RETS
**************************************************************************
* *
* COPY_ROMTBL - COPY ZERO TERMINATED ROM TABLE TO RAM AND COUNT IT *
* *
* PASS: *
* A1 = ZERO TERMINATED TABLE *
* *
* RETURN: *
* A0 = NUMBER OF TABLE ENTRIES *
* *
**************************************************************************
COPY_ROMTBL
MMTM SP,A1,A2
CLR A0
MOVI RAND_RAM_TBL,A2
CR_LUPE
MOVE *A1+,A14,W ;READ ROM TABLE ENTRY
CMPK MAX_RAND_TBL,A0
JRNE CR_GO ;BR=WE STILL HAVE SPACE LEFT
CLR A14 ;NO SPACE LEFT, SET ZERO TERMINATOR
CR_GO
MOVE A14,*A2+,W ;WRITE RAM TABLE ENTRY
MOVE A14,A14
JRZ CR_DONE ;BR=NOT THE ZERO TERMINATOR
INC A0 ;COUNT IT
JRUC CR_LUPE
CR_DONE
MMFM SP,A1,A2
RETS
**************************************************************************
* *
* PICK_ENTRY - PICK ENTRY OUT OF A TABLE *
* *
* PASS: *
* A0 = NUMBER OF TABLE ENTRIES *
* *
* RETURN: *
* A0 = NUMBER OF TABLE ENTRIES LEFT (Z SET IF LAST) *
* A2 = ENTRY PICKED *
* *
**************************************************************************
PICK_ENTRY
MMTM SP,A0,A3
CALLA RAND0 ;GET RANDOM INDEX
SLL 4,A0 ;CONVERT TO OFFSET
ADDI RAND_RAM_TBL,A0 ;ADD OFFSET TO BEGINNING OF TABLE
MOVE *A0,A2,W ;GET ENTRY
MOVE A0,A3 ;NOW MOVE PROCEDING ENTRIES
ADDK 010H,A3
PE_LUPE
MOVE *A3+,A14,W ;READ NEXT TABLE ENTRY
MOVE A14,*A0+,W ;WRITE IT ONE UP
JRNZ PE_LUPE ;BR=NOT THE ZERO TERMINATOR
MMFM SP,A0,A3
DEC A0 ;ONE LESS NUMBER OF ENTRIES
RETS
**************************************************************************
* *
* A_SET_MAP_IMG *
* *
* A8 = OBJECT *
* AARG+,L = SET MAP_IMG TO THIS *
* *
**************************************************************************
A_SET_MAP_IMG
CALLA GETAFARG_LONG
MOVE *A8(OULINK),A14,L
MOVE A0,*A14(MAP_IMG),L
RETS
**************************************************************************
* *
* BOX_CHECK_OBJ - CHECK IF PLAYER'S CURSOR POINTS TO AN AREA OF AN OBJ. *
* THIS AREA IS DEFINED BY A OFFSET BOX. *
* *
* PASS: *
* A2 = PLAYER DATA *
* A3 = UPPER LEFT BOX OFFSET [Y, X] FROM THE ANIM PT OF THE OBJ *
* A4 = LOWER RIGHT BOX OFFSET [Y, X] FROM THE ANIM PT OF THE OBJ *
* *
* NOTE: offsets must be doubled if image is double-scaled *
* *
* A8 = OBJECT *
* RETURN: *
* Z IS CLEAR, IF PLAYER'S CURSOR IS IN THE BOX *
* *
* CURSOR UNIV POSITION IS LEFT IS a1 (Y) AND a7 (X) *
* *
**************************************************************************
BOX_CHECK_OBJ
MMTM SP,A0,A3,A4,A5,A6
clr a0
BCO_hk:
MOVE A3,A5
SEXT A3,W
SLL 15,A3 ;WORLD LEFT X OFFSET
SRA 16,A5
SLL 15,A5 ;WORLD UPPER Y OFFSET
MOVE A4,A6
SEXT A4,W
SLL 15,A4 ;WORLD RIGHT X OFFSET
SRA 16,A6
SLL 15,A6 ;WORLD LOWER Y OFFSET
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ BCO_NOFLIPH ;BR=NO FLIPH
NEG A3
NEG A4
SWAP a3,a4 ;SWAP LEFT AND RIGHT
BCO_NOFLIPH
BTST B_FLIPV,A14
JRZ BCO_NOFLIPV ;BR=NO FLIPV
NEG A5
NEG A6
SWAP a5,a6 ;SWAP UPPER AND LOWER
BCO_NOFLIPV
MOVE *A8(OXVAL),A14,L
ADD A14,A3 ;UNIVERSE LEFT X BOUNDARY
ADD A14,A4 ;UNIVERSE RIGHT X BOUNDARY
MOVE *A8(OYVAL),A14,L
ADD A14,A5 ;UNIVERSE UPPER Y BOUNDARY
ADD A14,A6 ;UNIVERSE LOWER Y BOUNDARY
move a0,a0 ; check to see if a point was
jrnz got_pt ; supplied. No? get player cursor
MOVE *A2(PCURSORXY),A7,L
MOVE A7,A1
SEXT A7,W ; X in a7
SRA 16,A1 ; Y in a1
MOVE *A8(OZVAL),A0,L
STOUXY A0,A7,A1 ;CONVERT SCREEN TO UNIVERSE
got_pt: ;
CMP A3,A7
JRLT BCO_FAIL ;BR=LEFT
CMP A4,A7
JRGT BCO_FAIL ;BR=RIGHT
CMP A5,A1
JRLT BCO_FAIL ;BR=ABOVE
CMP A6,A1
JRGT BCO_FAIL ;BR=BELOW
MOVK 1,A14 ;INSIDE DA BOX
JRUC BCO_DONE
BCO_FAIL
CLR A14 ;OUTSIDE DA BOX
BCO_DONE
MMFM SP,A0,A3,A4,A5,A6
RETS
**************************************************************************
* *
* BOX_CHECK_OBJ2- CHECK IF A SUPPLIED POINT IS INSIDE AN AREA OF AN OBJ. *
* THIS AREA IS DEFINED BY AN OFFSET BOX. *
* *
* PASS: *
* A7 = UNIV X POS *
* A1 = UNIV Y POS *
* A3 = UPPER LEFT BOX OFFSET [Y, X] FROM THE ANIM PT OF THE OBJ *
* A4 = LOWER RIGHT BOX OFFSET [Y, X] FROM THE ANIM PT OF THE OBJ *
* *
* NOTE: offsets must be doubled if image is double-scaled *
* *
* A8 = OBJECT *
* RETURN: *
* Z IS CLEAR, IF POINT IS IN THE BOX *
* *
**************************************************************************
BOX_CHECK_OBJ2:
MMTM SP,A0,A3,A4,A5,A6
movk 1,a0 ; signal point already there
jruc BCO_hk
**************************************************************************
* *
* TABLE_BOX_CHECK - CHECK IF PLAYER'S CURSOR POINTS TO AN AREA OF AN OBJ.*
* THE POSSIBLE AREAS ARE DEFINED BY A TABLE OF OFFSET *
* BOXES. *
* *
* PASS: *
* A0 = TABLE OF OFFSET BOXES *
* TABLE FORMAT: *
* .LONG [UPPER Y OFFSET, LEFT X], [LOWER Y, RIGHT X] ;BOX #1 *
* . *
* . *
* . *
* .LONG -1 ;TERMINATE LIST *
* *
* A2 = PLAYER DATA *
* A8 = OBJECT *
* RETURN: *
* A1 = BOX INDEX, IF NO BOX, THEN A1 = 0 AND Z IS SET *
* *
**************************************************************************
TABLE_BOX_CHECK
MMTM SP,A0,A3,A4,A5,A6,A7,A9,A10,A11
MOVE *A8(OIMG),A14,L
MOVE *A14(IANIOFF),A14,L
MOVE A14,A4
SEXT A14,W
SLL 15,A14 ;WORLD ANIOFFX
MOVE A4,A5
SRA 16,A5
SLL 15,A5 ;WORLD ANIOFFY
MOVE *A8(OFLAGS),A1,W
BTST B_DBLSCL,A1
JRZ TABC_NODUB ;BR=NO DOUBLE SCALE ACTION
SLL 1,A14
SLL 1,A5
TABC_NODUB
MOVE *A8(OCTRL),A1,W
BTST B_FLIPH,A1
JRZ TABC_NOAFLIPH ;BR=NO FLIPH
NEG A14 ;NEGATE X OFFSET
TABC_NOAFLIPH
MOVE *A8(OXVAL),A3,L
SUB A14,A3 ;LEFT (RIGHT) X OF OBJECT
BTST B_FLIPV,A1
JRZ TABC_NOAFLIPV ;BR=NO FLIPV
NEG A5 ;NEGATE Y OFFSET
TABC_NOAFLIPV
MOVE *A8(OYVAL),A4,L
SUB A5,A4 ;UPPER (LOWER) Y OF OBJECT
MOVE *A2(PCURSORXY),A5,L
MOVE A5,A7
SEXT A5,W
SRA 16,A7
MOVE *A8(OZVAL),A6,L
STOUXY A6,A5,A7 ;CONVERT SCREEN TO UNIVERSE
CLR A14
TABC_LUPE
MOVE *A0+,A6,L ;GET [UPPER Y, LEFT X] OFFSET
JRN TABC_FAIL
INC A14
MOVE A6,A9
SEXT A6,W
SLL 15,A6 ;WORLD LEFT X OFFSET
SRA 16,A9
SLL 15,A9 ;WORLD UPPER Y OFFSET
MOVE *A0+,A10,L ;GET [LOWER Y, RIGHT X] OFFSET
MOVE A10,A11
SEXT A10,W
SLL 15,A10 ;WORLD RIGHT X OFFSET
SRA 16,A11
SLL 15,A11 ;WORLD LOWER Y OFFSET
BTST B_FLIPH,A1
JRZ TABC_NOFLIPH ;BR=NO FLIPH
NEG A6
NEG A10
XOR A6,A10 ;SWAP LEFT AND RIGHT
XOR A10,A6
XOR A6,A10
TABC_NOFLIPH
BTST B_FLIPV,A1
JRZ TABC_NOFLIPV ;BR=NO FLIPV
NEG A9
NEG A11
XOR A9,A11 ;SWAP UPPER AND LOWER
XOR A11,A9
XOR A9,A11
TABC_NOFLIPV
ADD A3,A6 ;UNIVERSE LEFT X BOUNDARY
ADD A3,A10 ;UNIVERSE RIGHT X BOUNDARY
ADD A4,A9 ;UNIVERSE UPPER Y BOUNDARY
ADD A4,A11 ;UNIVERSE LOWER Y BOUNDARY
CMP A6,A5
JRLT TABC_LUPE ;BR=LEFT
CMP A10,A5
JRGT TABC_LUPE ;BR=RIGHT
CMP A9,A7
JRLT TABC_LUPE ;BR=ABOVE
CMP A11,A7
JRGT TABC_LUPE ;BR=BELOW
JRUC TABC_DONE
TABC_FAIL
CLR A14 ;OUTSIDE DA BOXES
TABC_DONE
MMFM SP,A0,A3,A4,A5,A6,A7,A9,A10,A11
MOVE A14,A1 ;RETURN INDEX OR SET Z FLAG
RETS
**************************************************************************
* *
* MAKE_ONE_EXPLOSION - MAKE AN EXPLOSION ON AN OBJECT AT IT'S ANIMP *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* Z IS SET, IF WE FAILED *
* *
**************************************************************************
MAKE_ONE_EXPLOSION
MMTM SP,A0,A3,A4,A5
MOVI ONE_EXPLO_INIT,A5 ;MAKE DA EXPLOSION
CALLA CREATE_OBJ
JRZ MOE_DONE ;BR=WHOOPS!
MOVE A8,A14
ADDI OXVAL,A14 ;GET POSITION
MMFM A14,A3,A4,A5 ;A5,A4,A3 = OXVAL, OYVAL, OZVAL
MOE_HOOK:
DEC A3
MOVE A0,A14
ADDI OZVAL+020H,A14 ;SET POSITION
MMTM A14,A3,A4,A5 ;A5,A4,A3 = OXVAL, OYVAL, OZVAL
CALLA INSOBJ
MOE_DONE
MMFM SP,A0,A3,A4,A5
RETS
.ref FragCenterCoors
.DEF MAKE_EXPLO_GUN,MAKE_EXPLO_CENTER
*
* Make an explosion at the player's cursor
* a2 = player
* a3 = 0 or M_DBLSCL
* a8 = object
*
MAKE_EXPLO_GUN:
MMTM SP,A0,A3,A4,A5
MOVI ONE_EXPLO_INIT,A5 ;MAKE DA EXPLOSION
CALLA CREATE_OBJ
JRZ MOE_DONE ;BR=WHOOPS!
move *a0(OFLAGS),a14
or a3,a14
move a14,*a0(OFLAGS)
move *A2(PCURSORXY),A3,L ;Get [Y,X] Screen relative point.
movx A3,A5
sext A5
sra 16,A3 ;Now we have 16.16 screen X
MOVE *A8(OZVAL),A1,L ; Z of explo
subk 4,a1
STOUXY A1,A5,A3 ;UNIV X in a5, Y in a3
move a3,a4
move a1,a3
MOE_HOOK_V:
move *a8(OPART1),a14,L
jrnz MEGmulti
move a8,a14
MEGmulti:
move *a14(OXVEL),a1,L ; X vel
move a1,*a0(OXVEL),L
jruc MOE_HOOK
*
* Make an explosion at the center of an object
* a3 = 0 or M_DBLSCL
* a8 = object
*
MAKE_EXPLO_CENTER:
MMTM SP,A0,A3,A4,A5
MOVI ONE_EXPLO_INIT,A5 ;MAKE DA EXPLOSION
CALLA CREATE_OBJ
JRZ MOE_DONE ;BR=WHOOPS!
move *a0(OFLAGS),a14
or a3,a14
move a14,*a0(OFLAGS)
MMTM SP,B1,B2,B5,B6,B8
calla FragCenterCoors ;leaves X in B1, Y in B5
move b5,a4
sll 16,a4
move b1,a5
sll 16,a5
MMfM SP,B1,B2,B5,B6,B8
MOVE *A8(OZVAL),A3,L ; Z of explo
subk 4,a3
jruc MOE_HOOK_V
*
* Make an explosion with offsets from object's animation point
* a1 = X off (world)
* a2 = Y off (world)
* a3 = 0 or M_DBLSCL
*
MAKE_EXPLO_OFF:
MMTM SP,A0,A3,A4,A5
MOVI ONE_EXPLO_INIT,A5 ;MAKE DA EXPLOSION
CALLA CREATE_OBJ
JRZ MOE_DONE ;BR=WHOOPS!
move *a0(OFLAGS),a14
or a3,a14
move a14,*a0(OFLAGS)
MOVE A8,A14
ADDI OXVAL,A14 ;GET POSITION
MMFM A14,A3,A4,A5 ;A5,A4,A3 = OXVAL, OYVAL, OZVAL
add a2,a4
add a1,a5
jruc MOE_HOOK
ONE_EXPLO_INIT
.LONG FHKEXPLOB1, 0
.WORD OID_JUNK, DMAWNZ, 0, 0
.LONG C_STRTANIM
.LONG ONE_EXPLO_ANIM
ONE_EXPLO_ANIM
LW FHKEXPLOB1,6
LW FHKEXPLOB2,8
LW FHKEXPLOB3,6
LW FHKEXPLOB4,4
LW FHKEXPLOB5,4
LW FHKEXPLOB6,3
LW FHKEXPLOB7,3
LW FHKEXPLOB8,2
LW FHKEXPLOB9,2
LW FHKEXPLOB10,2
LW FHKEXPLOB11,2
LWL 1,1|AFunc,DELETE_OBJ
**************************************************************************
* *
* THING_FLY_START - LAUNCH A UNIVERSE OBJECT INTO THE AIR, PLAY *
* PING-PONG, AND DELETE IT WHEN IN LANDS *
* *
* PASS: *
* A0 = POINTER TO SCRIPT *
* A3 = CURSOR POSITION FROM GUN COLLISION OR FLAG ZERO FOR ROCKET COLLIS *
* A8 = OBJECT *
* *
* THING FLY SCRIPT: *
* .WORD OFLYSCORE, OFLYSCOREINC *
* .LONG OFLYHITSND, OFLYYVEL *
* .WORD OFLYXSLL, OYACCEL, OZVEL *
* *
* OFLYSCORE = INITIAL SCORE ON NEXT HIT *
* OFLYSCOREINC = INCREMENT SCORE FOR NEXT HIT *
* OFLYHITSND = SOUND ON HIT *
* OFLYYVEL = Y VELOCITY ON HIT *
* OFLYXSLL = X VELOCITY SHIFT VALUE ON HIT *
* OYACCEL = INITIAL Y ACCELERATION *
* OZVEL = INITIAL Z VELOCITY *
* *
**************************************************************************
OFLYSCORE EQU ODATA ;UHW NEXT SCORE
OFLYSCOREINC EQU ODATA+010H ;UHW SCORE INCREMENT
OFLYHITSND EQU ODATA+020H ;UHL HIT SOUND
OFLYYVEL EQU ODATA+040H ;UHL Y VELOCITY
OFLYXVELMAX EQU ODATA+060H ;UHL MAXIMUM X VELOCITY
OFLYXSLL EQU ODATA+080H ;UHW X VELOCITY LEFT SHIFT VALUE
THING_FLY_START
MMTM SP,A0,A1,A4,A5
MMFM A0,A1,A4,A5 ;READ SCRIPT
MOVE A8,A14
ADDI ODATA+020H*3,A14
MMTM A14,A1,A4,A5 ;LOAD PARAMETERS
MOVE *A0+,A1,W
MOVE A1,*A8(OFLYXSLL),W
MOVE *A0(0),*A8(OYACCEL),W
ADDK 010H,A0
MOVE *A0,A14,W
MOVE A14,*A8(OZVEL),L
MOVE *A8(OIMG),A14,L ;COMPUTE MAXIMUM X VELOCITY
MOVE *A14(ISIZEX),A14,W
DEC A1
SLL A1,A14
MOVE A14,*A8(OFLYXVELMAX),L
MOVE *A8(OULINK),A0,L ;REMOVE FROM UNIVERSE
CLR A14
MOVE A14,*A8(OULINK),L
CALLA REMOVE_AND_FREE_LINK
MOVI THING_FLY_COLLVECT,A14 ;NEW VECTORS
MOVE A14,*A8(OCVECT),L
MOVI THING_FLY_GUNVECT,A14
MOVE A14,*A8(OGUNVECT),L
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14 ;SET GROUND COLL FLAG
MOVE A14,*A8(OFLAGS),W
CALLR TFG_GO ;LAUNCH!
MMFM SP,A0,A1,A4,A5
RETS
THING_FLY_COLLVECT
WWL OID_GRND,0FFFFH,DEL_PROC_AND_OBJ
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,THING_FLY_CVECT
WL 0,DUMCRETS
THING_FLY_CVECT
CALLR UNIV_COLL_CHECK
JRNZ TF_ABORT
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
CLR A3 ;NO CURSOR POSITION, FLY RANDOM
THING_FLY_GUNVECT
MOVE *A8(OFLYSCORE),A1,W ;SCORE
CLR A9
CALLA PRINT_SCORE
CALLA UNIV_FLASH ;FLASH IT!
MOVE *A8(OFLYSCOREINC),A14,W ;SET NEXT SCORE
ADD A14,A1
MOVE A1,*A8(OFLYSCORE),W
TFG_GO
MOVE *A8(OFLYHITSND),A0,L ;MAKE SOME NOISE!
CALLA ONESND_Z
MOVE *A8(OFLYYVEL),*A8(OYVEL),L ;SET Y VELOCITY
SEXT A3,W
JRNZ TFG_XOK ;BR=NO RANDOM DIRECTION
MOVE *A8(OFLYXVELMAX),A0,L
MOVE A0,A1
NEG A1
CALLA RANGERND ;GET RANDOM X VELOCITY
MOVE A0,A1
JRUC TFG_XSET
TFG_XOK
MOVE *A8(ODAGX),A1,W ;COMPUTE VELOCITY FROM OFFSET
MOVE *A8(OSIZEX),A14,W ; FROM THE CENTER OF THE OBJ
SRA 1,A14
ADD A14,A1 ;CENTER OF THE LID (SCREEN X)
SUB A3,A1 ;DIFFERENCE FROM GUN (SCREEN X)
MOVE *A8(OFLYXSLL),A14,W
SLL A14,A1 ;CONVERT TO VELOCITY
MOVE *A8(OZVAL),A4,L
MOVE @ZBASE,A14,L
SUB A14,A4
SRA Z2SCALE,A4
SETF 16,1,1
MPYS A4,A1 ;SCALE X VELOCITY
SETF 32,1,1
SRA 8,A1
TFG_XSET
MOVE A1,*A8(OXVEL),L ;SET X VELOCITY
TF_ABORT
RETS
**************************************************************************
* *
* FRAGMENT STUFF *
* *
**************************************************************************
;UNIVERSAL FRAGMENT
FRAG_U1
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGGCOL)
.long 0
FRAG_U2
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(2 << 11) + (0 << 6) + (FRGGCOL)
.long 0
FRAG_U3
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(3 << 11) + (0 << 6) + (FRGGCOL)
.long 0
FRAG_U5
.long FRAG_UANIM,F_UFRAG_STUFF
; .word OID_JUNK,(3 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
.word OID_JUNK,(3 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
; .word OID_JUNK,(2 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
.word OID_JUNK,(2 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U10
.long FRAG_UANIM,F_UFRAG_STUFF
; .word OID_JUNK,(6 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
.word OID_JUNK,(6 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
; .word OID_JUNK,(4 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
.word OID_JUNK,(4 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U1_X2
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGGCOL)
.long 0
FRAG_U10_X2
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(6 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(4 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U10_MIX
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(6 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(4 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U20
; .long FRAG_UANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
; .long FRAG_UANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(8 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(8 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U20_X2
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U20_MIX
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U30
; .long FRAG_UANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(18 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(18 << 11) + (0 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
; .long FRAG_UANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U40
; .long FRAG_UANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(24 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(24 << 11) + (0 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
; .long FRAG_UANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(16 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(16 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_U40_X2
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_UANIM
LW FHKI1SHRAPB1,3
LW FHKI1SHRAPB2,3
LW FHKI1SHRAPB3,3
LW FHKI1SHRAPB4,3
LW FHKI1SHRAPB5,3
LW FHKI1SHRAPB6,3
LWL FHKI1SHRAPB7,3|AFunc,A_DELETE_ZBOT
.long 0
;LARGE GLASS SHARD FRAGMENT
FRAG_S10
; .long FRAG_SHARD_ANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(6 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(6 << 11) + (0 << 6) + (FRGGCOL)
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
; .word OID_JUNK,(4 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
.word OID_JUNK,(4 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_S20
; .long FRAG_SHARD_ANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGGCOL)
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
; .long FRAG_SHARD_ANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(8 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(8 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_SHARD_ANIM
LW fshard2,1
LW fshard3,1
LW fshard4,1
LW fshard5,1
LW fshard6,1
LW fshard7,1
LW fshard8,1
LW fshard9,1
LWL fshard10,1|AFunc,A_DELETE_ZBOT
.long 0
;SMALL GLASS SHARD FRAGMENT
FRAG_SS5
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
; .word OID_JUNK,(3 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
.word OID_JUNK,(3 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
; .word OID_JUNK,(2 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
.word OID_JUNK,(2 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_SS10
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
; .word OID_JUNK,(6 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
; .word OID_JUNK,(4 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
.word OID_JUNK,(4 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_SS20
; .long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
; .word OID_JUNK,(8 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_SS30
; .long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(18 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(18 << 11) + (0 << 6) + (FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGGCOL)
; .long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
;; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGBOG+FRGGCOL+FRGNOFLY)
; .word OID_JUNK,(12 << 11) + (0 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long FRAG_SMALL_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGGCOL)
.long 0
FRAG_SMALL_SHARD_ANIM
LW SMSHRD1,1
LW SMSHRD2,1
LW SMSHRD3,1
LW SMSHRD4,1
LW SMSHRD5,1
LW SMSHRD6,1
LW SMSHRD7,1
LW SMSHRD8,1
LW SMSHRD9,1
LWL SMSHRD10,1|AFunc,A_DELETE_ZBOT
.long 0
FRAG_ONE_SPARK
.long FRAG_SPARK_ANIM,0
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGNOFLP+FRGPAL)
.long 0
FRAG_SPARK_ANIM
LW FWORKS1,4
LW FWORKS2,4
LW FWORKS3,4
LW FWORKS4,4
LW FWORKS5,4
LWL 1,1|AFunc,DELETE_OBJ
FRAG_ONE_CLOUD
.long FRAG_DUST_CLOUD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY+FRGNOFLP)
.long 0
FRAG_ONE_CLOUD_X2
.long FRAG_DUST_CLOUD_ANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGGCOL+FRGNOFLY+FRGNOFLP)
.long 0
FRAG_DUST_CLOUD_ANIM
LW dstcld1,4
LW dstcld2,4
LW dstcld3,4
LW dstcld4,4
LW dstcld5,4
LW dstcld6,4
LW dstcld7,4
LW dstcld8,4
LWL 1,1|AFunc,DELETE_OBJ
;DUST CLOUD PALETTES
;
;use P_DUSTCLD for a gray cloud
GOLD_DUST_PAL:
.word 64
.word 0001fh,038c0h,02840h,03080h,04100h,03ce0h,034a0h,05180h
.word 04520h,034a0h,02c60h,04940h,059c2h,038c0h,03080h,04d60h
.word 06204h,03ce0h,038c0h,07288h,06a46h,07acah,055a1h,05de3h
.word 06625h,07f0bh,05182h,04940h,04100h,03080h,03ce0h,02c65h
.word 059c4h,04524h,07f4bh,05de4h,06205h,059c3h,06e67h,05de5h
.word 04100h,05181h,055a2h,06206h,04d65h,038c0h,05187h,06a48h
.word 076a9h,06626h,04d61h,0308ah,05deah,04d60h,06627h,02847h
.word 04943h,05de8h,055a9h,06a47h,03ce0h,07f8bh,076a7h,07ee9h
**************************************************************************
* *
* F_UFRAG_STUFF - DO STUFF *
* *
* A0 = Ptr to un-inserted object. *
* *
* Note: Frag funcs must preserve A8-A11 and all B-File regs. *
* *
**************************************************************************
**************************************************************************
* *
* F_UFRAG_STUFF_X2 *
* *
* Frag create func to make the fragment X2 scale then *
* jump to the usual UFRAG_STUFF *
* *
* A0 = Ptr to un-inserted object. *
* *
**************************************************************************
F_UFRAG_STUFF_X2
ORIM M_DBLSCL,*A0(OFLAGS),W
F_UFRAG_STUFF
MOVI FRAG_UCOLL,A14
MOVE A14,*A0(OCVECT),L ;Set up chunk with Vectors
move A0,A2
MOVE *A13(FPDATA),A0,L ;GET PALETTE
JRZ FUS_NOPAL ;BR = NO PALETTE TO SET!
calla GETFPAL
JRNZ FUS_PAL ;BR = WE HAVE PALETTE!
CLR A0
FUS_PAL
move A0,*A2(OPAL),W
FUS_NOPAL
move A2,A0
RETS
FRAG_UCOLL
WWL OID_GRND,0FFFFH,FRAG_UGRND_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* FRAG_UGRND_COLL - FRAGMENT GROUND COLLISION VECTOR *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
FRAG_UGRND_COLL
MOVE *A8(OYVEL),A14,L
JAN DELETE_OBJ ;BR=GOING UP
JAZ DELETE_OBJ ;BR=STOPPED
; MOVE A14,A0
; SRA 2,A0
; SUB A0,A14 ;OYVEL=OYVEL*3/4
; SRA 1,A14 ;OYVEL=OYVEL/2
SRA 2,A14 ;OYVEL=OYVEL/4
CMPI 010000H,A14
JALT DELETE_OBJ ;BR=BELOW MINIMUM VELOCITY
NEG A14 ;REVERSE VELOCITY
MOVE A14,*A8(OYVEL),L
RETS
**************************************************************************
* *
* STOP_ENEMIES - TERMINATE AN ENEMY GENERATOR *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
STOP_ENEMIES
PUSH A0
MOVE *A8(OULINK),A0,L
MOVE *A0(MAP_FLAGS),A14,W
JRNN SE_NOENEMY ;BR=NOT AN ENEMY GENERATOR
ANDNI 1 << B_BF_ENEMY,A14
MOVE A14,*A0(MAP_FLAGS),W
MOVE *A0(MAP_IMG),A14,L ;TURN OFF FLAGS
ANDNI M_IF_DANIM|M_IF_SEQ,A14
MOVE A14,*A0(MAP_IMG),L
MOVE *A8(OFLAGS),A14,W
BTST B_ANIM,A14
JRZ SE_IDLE ;BR=NOT ANIMATING
CALLA PULL_ANIM
JRUC SE_DONE
SE_IDLE
MOVE @ENEMYDATA0,A0,L
SE_DEL_ENEMY_LUPE
MOVE *A0+,A14,L
.if DEBUG
LOCKON Z
.else
JRZ SE_DONE
.endif
CMP A8,A14
JRNE SE_DEL_ENEMY_LUPE ;BR=NO MATCH
move @ENEMYDATA,a14,L
cmp a0,a14
jreq SE_last
move *-a14,*-a0,L
addk 20h,a14
SE_last:
clr a0
move a0,*-a14,L
move a14,@ENEMYDATA,L
SE_NOENEMY
SE_DONE
PULLQ A0
RETS
**************************************************************************
* *
* 500 POINT AWARD VECTORS *
* *
**************************************************************************
PTS_500_COLLVECT
.WORD 0
.LONG PTS_500_CVECT
PTS_500_COLLVECTR
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,PTS_500_CVECTR
WL 0,DUMCRETS
PTS_500_CVECTR
CALLR UNIV_COLL_CHECK
JRNZ PTS_500_DONE
PTS_500_CVECT
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
MOVK M_NOMORE|M_LASTFRM|M_FLASHOBJ,A7 ;LAST FRAME AND FLASH
JRUC PTS_500_GO
PTS_500_GUNVECT
MOVK M_NOMORE|M_FLASHOBJ,A7 ;FLASH
PTS_500_GO
MOVI 500,A5 ;500 POINTS
CLR A9 ;NO OFFSET
CALLA UNIV_DAMAGE_HANDLER
; JRNC PTS_500_DONE
PTS_500_DONE
RETS
**************************************************************************
* *
* PORTAL DAMAGE VECTORS *
* *
**************************************************************************
PORTAL_DAMAGE_COLLVECT
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,PORTAL_DAMAGE_CVECT
WL 0,DUMCRETS
PORTAL_DAMAGE_CVECT
CALLR UNIV_COLL_CHECK
JRNZ PD_DONE
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
PORTAL_DAMAGE_GUNVECT
MOVI 1000,A5 ;500 POINTS
MOVK M_NOMORE|M_FLASHOBJ,A7 ;NO MORE DAMAGE AND FLASH
CLR A9 ;NO OFFSET
CALLA UNIV_DAMAGE_HANDLER
JRNC PD_DONE
JAUC PORTAL_GUNVECT
PD_DONE
RETS
**************************************************************************
* *
* OBJ_KILL_ENEMIES - KILL ALL ENEMIES IN AN AREA DEFINED BY X AND Y *
* BOUNDARIES FROM THE ANIMATION POINT EITHER IN *
* FRONT OF OR BEHIND THE OBJECT *
* *
* PASS: *
* *
* A1 = Z WORLD BOUNDARY OFFSET (USE NEGATIVE FOR IN FRONT OF OBJECT, *
* POSITIVE FOR BEHIND OBJECT) *
* A8 = DA OBJECT *
* A9 = [Y TOP, Y BOTTOM] SCREEN BOUNDARY OFFSET FROM ANIMATION POINT *
* A11 = [X LEFT, X RIGHT] SCREEN BOUNDARY OFFSET FROM ANIMATION POINT *
* *
**************************************************************************
OBJ_KILL_ENEMIES
PUSH A8
MOVI FGLIST,A0
MOVE A11,A3
SRA 16,A11
SLL 15,A11 ;X LEFT OFFSET
SEXT A3,W
SLL 15,A3 ;X RIGHT OFFSET
MOVE A9,A10
SRA 16,A9
SLL 15,A9 ;Y TOP OFFSET
SEXT A10,W
SLL 15,A10 ;Y BOTTOM OFFSET
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ OKE_CHECK_FLIPV ;BR = NO HORIZONTAL FLIP
SWAP A11,A3 ;3 XORS
NEG A11
NEG A3
OKE_CHECK_FLIPV
BTST B_FLIPV,A14
JRZ OKE_GET_BOUNDS ;BR = NO VERTICAL FLIP
SWAP A9,A10 ;3 XORS
NEG A9
NEG A10
OKE_GET_BOUNDS
MOVE *A8(OXVAL),A14,L
ADD A14,A11 ;LEFT BOUNDARY
ADD A14,A3 ;RIGHT BOUNDARY
MOVE *A8(OYVAL),A14,L
ADD A14,A9 ;TOP BOUNDARY
ADD A14,A10 ;BOTTOM BOUNDARY
MOVI MASK_TYPE|MASK_SUPP,A4
MOVI TYPE_ENEMY,A5
MOVE *A8(OZVAL),A6,L
MOVI OKE_BEHIND_CHECK,A7
ABS A1
JRN OKE_NEXT ;BR = CHECK BEHIND
MOVI OKE_INFRONT_CHECK,A7
JRUC OKE_NEXT
OKE_LUPE
MOVE *A8(OZVAL),A14,L
SUB A6,A14
ABS A14
CMP A1,A14
JRGT OKE_DONE ;BR = OUT OF Z RANGE
MOVE *A8(OID),A14,L
AND A4,A14
CMP A5,A14
JRNE OKE_NEXT ;BR = NOT AN ENEMY
MOVE *A8(OXVAL),A14,L
CMP A11,A14
JRLT OKE_NEXT ;BR = OUT OF LEFT BOUNDS
CMP A3,A14
JRGT OKE_NEXT ;BR = OUT OF RIGHT BOUNDS
MOVE *A8(OYVAL),A14,L
CMP A9,A14
JRLT OKE_NEXT ;BR = OUT OF TOP BOUNDS
CMP A10,A14
JRGT OKE_NEXT ;BR = OUT OF BOTTOM BOUNDS
MOVE *A8(OGUNVECT),A14,L
;WFD start 6/14/1994
JRZ OKE_NEXT ;BR = NO GUN VECTOR
;WFD end 6/14/1994
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
CALL A14 ;CALL GUN VECTOR
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
OKE_NEXT
CALL A7
CMP A0,A8
JRNE OKE_LUPE ;BR=NOT END OF LIST
OKE_DONE
PULLQ A8
RETS
OKE_BEHIND_CHECK
MOVE *A8,A8,L ;NEXT FARTHER OBJECT
RETS
OKE_INFRONT_CHECK
MOVE *A8(OBLINK),A8,L ;NEXT CLOSER OBJECT
RETS
.END