724 lines
19 KiB
NASM
724 lines
19 KiB
NASM
|
.MLIB "GXMACS.LIB"
|
|||
|
.FILE "GXPLAYER.ASM"
|
|||
|
.TITLE "<<< GENERATION X ---- PLAYER UTILITY ROUTINES >>>"
|
|||
|
.WIDTH 132
|
|||
|
.OPTION B,D,L
|
|||
|
.MNOLIST
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
|
|||
|
* ALL RIGHTS RESERVED. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
.INCLUDE "GX.INC"
|
|||
|
|
|||
|
***** In THIS file
|
|||
|
|
|||
|
.DEF A_CK_FLSH_HIT, ANY_BOMBS, GET_PLAYER_EXTENTS
|
|||
|
.DEF GET_PLAYER_WORLDX_EXTENTS, VALID_PLAYER, PLAYER_AWARD_GIRL
|
|||
|
.DEF P_LED_ON, P_LED_OFF
|
|||
|
|
|||
|
*SYMBOLS IN GX.ASM
|
|||
|
.REF GPLAYD, LAST_PRAISE, ARNOLD_SPEAK
|
|||
|
*SYMBOLS IN GXSCORE.ASM
|
|||
|
.REF SUBLIFE, FLASH_PSTATUS
|
|||
|
*SYMBOLS IN GXGUN.ASM
|
|||
|
.REF ENEMYP_COLL
|
|||
|
***** from GXRAM.ASM
|
|||
|
.REF BASE_HIT
|
|||
|
|
|||
|
.TEXT
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* P_LED_ON *
|
|||
|
* *
|
|||
|
* Turn players LED on. *
|
|||
|
* *
|
|||
|
* A2 = Ptr to player data area *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
P_LED_ON
|
|||
|
PUSH A0
|
|||
|
CALLA GPLAYNUM
|
|||
|
SLL 3,A0
|
|||
|
ADDI TAB_P_LEDS,A0
|
|||
|
MOVB *A0,A0
|
|||
|
|
|||
|
ADDI [0FFH,0],A0
|
|||
|
CALLA COIL_DRIVE
|
|||
|
|
|||
|
PULLQ A0
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* P_LED_OFF *
|
|||
|
* *
|
|||
|
* Turn players LED off. *
|
|||
|
* *
|
|||
|
* A2 = Ptr to player data area *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
P_LED_OFF
|
|||
|
PUSH A0
|
|||
|
CALLA GPLAYNUM
|
|||
|
SLL 3,A0
|
|||
|
ADDI TAB_P_LEDS,A0
|
|||
|
MOVB *A0,A0
|
|||
|
|
|||
|
ADDI [0FEH,0],A0
|
|||
|
CALLA COIL_DRIVE
|
|||
|
|
|||
|
PULLQ A0
|
|||
|
RETS
|
|||
|
|
|||
|
TAB_P_LEDS
|
|||
|
.BYTE P1_LED, P2_LED, P3_LED, P3_LED
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* VALID_PLAYER *
|
|||
|
* *
|
|||
|
* Check to see if player pointer is valid. Locks on a *
|
|||
|
* non-valid player pointer. Used for debug. *
|
|||
|
* *
|
|||
|
* A2 = Ptr to player *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
VALID_PLAYER
|
|||
|
CMPI P1DATA,A2
|
|||
|
JREQ VP_X
|
|||
|
CMPI P2DATA,A2
|
|||
|
JREQ VP_X
|
|||
|
CMPI P3DATA,A2
|
|||
|
LOCKON NE
|
|||
|
VP_X
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PLAYER_AWARD_GIRL *
|
|||
|
* *
|
|||
|
* Award a girl to the player for bonus. *
|
|||
|
* *
|
|||
|
* A2 = Ptr to player *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PLAYER_AWARD_GIRL
|
|||
|
MOVE A2,A2
|
|||
|
JRZ PAG_X ;BR = A non-player
|
|||
|
INCM *A2(PGIRLS_SAVED),W ;Give him another
|
|||
|
PAG_X
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_PLAYER_EXTENTS *
|
|||
|
* *
|
|||
|
* Return the area of the screen, in screen coords, that *
|
|||
|
* encompasses all of the active players hit boxes. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* A2 = UL [Y,X] *
|
|||
|
* A3 = LR [Y,X] *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GET_PLAYER_EXTENTS
|
|||
|
MMTM SP,A4,A6
|
|||
|
MOVI [SCRBOT,SCRRGT],A2 ;Initialize the returns
|
|||
|
CLR A3
|
|||
|
|
|||
|
MOVI P1DATA,A4
|
|||
|
MOVI MAXPLAYERS,A6
|
|||
|
GPE_LOOP
|
|||
|
MOVE *A4(POBJ),A14,L
|
|||
|
JRZ GPE_NEXT
|
|||
|
MOVE *A4(PHITBOXUL),A14,L ;First check Upper Left
|
|||
|
CMPXY A14,A2 ;Check against what we've got
|
|||
|
JRXLE GPE_CK_UL_U ;BR = Left boundry is already O.K.
|
|||
|
MOVX A14,A2 ;Give us the new Left
|
|||
|
GPE_CK_UL_U
|
|||
|
JRYLE GPE_CK_LR ;BR = Upper boundry is already O.K.
|
|||
|
MOVY A14,A2 ;Give us the new Upper
|
|||
|
GPE_CK_LR
|
|||
|
MOVE *A4(PHITBOXLR),A14,L ;Now check Lower Right
|
|||
|
CMPXY A14,A3
|
|||
|
JRXGE GPE_CK_LR_L ;BR = Right boundry is already O.K.
|
|||
|
MOVX A14,A3 ;Set new Right
|
|||
|
GPE_CK_LR_L
|
|||
|
JRYGE GPE_NEXT ;BR = Lower boundry is already O.K.
|
|||
|
MOVY A14,A3 ;Set new Lower
|
|||
|
GPE_NEXT
|
|||
|
ADDI PDSIZE,A4
|
|||
|
DSJ A6,GPE_LOOP
|
|||
|
MMFM SP,A4,A6
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_PLAYER_WORLDX_EXTENTS *
|
|||
|
* *
|
|||
|
* Return the X area of the screen, in WORLD coords, that *
|
|||
|
* encompasses all of the active players hit boxes. *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* A0 = LEFT WORLD X *
|
|||
|
* A1 = RIGHT WORLD X *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
|
|||
|
P1_LWX2 EQU LEFT_WORLDX
|
|||
|
P1_RWX2 EQU LEFT_WORLDX+(RGHT_WORLDX-LEFT_WORLDX)/2
|
|||
|
P2_LWX2 EQU LEFT_WORLDX+(RGHT_WORLDX-LEFT_WORLDX)/2
|
|||
|
P2_RWX2 EQU RGHT_WORLDX
|
|||
|
|
|||
|
P1_LWX3 EQU LEFT_WORLDX
|
|||
|
P1_RWX3 EQU LEFT_WORLDX+(RGHT_WORLDX-LEFT_WORLDX)/3
|
|||
|
P2_LWX3 EQU LEFT_WORLDX+(RGHT_WORLDX-LEFT_WORLDX)/3
|
|||
|
P2_RWX3 EQU LEFT_WORLDX+(RGHT_WORLDX-LEFT_WORLDX)*2/3
|
|||
|
P3_LWX3 EQU LEFT_WORLDX+(RGHT_WORLDX-LEFT_WORLDX)*2/3
|
|||
|
P3_RWX3 EQU RGHT_WORLDX
|
|||
|
|
|||
|
GET_PLAYER_WORLDX_EXTENTS
|
|||
|
MMTM SP,A2,A3,A4,A6,A7
|
|||
|
MOVI RGHT_WORLDX,A0
|
|||
|
MOVI LEFT_WORLDX,A1
|
|||
|
|
|||
|
MOVI P1DATA,A4
|
|||
|
MOVI MAXPLAYERS,A6
|
|||
|
MOVE @NPLAYERS,A6,W
|
|||
|
INC A6
|
|||
|
MOVI PLAYER3_WORLDX_TABLE,A7
|
|||
|
CMPK 3,A6
|
|||
|
JREQ GPWXE_LOOP
|
|||
|
MOVI PLAYER2_WORLDX_TABLE,A7
|
|||
|
GPWXE_LOOP
|
|||
|
MOVE *A7+,A2,L ;LEFT WORLD X
|
|||
|
MOVE *A7+,A3,L ;RIGHT WORLD X
|
|||
|
MOVE *A4(POBJ),A14,L
|
|||
|
JRZ GPWXE_NEXT
|
|||
|
CMP A0,A2
|
|||
|
JRGE GPWXE_CK_R ;BR = Left boundry is already O.K.
|
|||
|
MOVE A2,A0 ;Give us the new Left
|
|||
|
GPWXE_CK_R
|
|||
|
CMP A1,A3
|
|||
|
JRLE GPWXE_NEXT ;BR = Right boundry is already O.K.
|
|||
|
MOVE A3,A1 ;Set new Right
|
|||
|
GPWXE_NEXT
|
|||
|
ADDI PDSIZE,A4
|
|||
|
DSJ A6,GPWXE_LOOP
|
|||
|
MMFM SP,A2,A3,A4,A6,A7
|
|||
|
RETS
|
|||
|
|
|||
|
PLAYER2_WORLDX_TABLE
|
|||
|
.LONG P1_LWX2, P1_RWX2, P2_LWX2, P2_RWX2
|
|||
|
|
|||
|
PLAYER3_WORLDX_TABLE
|
|||
|
.LONG P1_LWX3, P1_RWX3, P2_LWX3, P2_RWX3, P3_LWX3, P3_RWX3
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* ANY_BOMBS *
|
|||
|
* *
|
|||
|
* This will tell you if any active players have any of their *
|
|||
|
* special weapons left (i.e. Rockets, CDs, Shotguns) *
|
|||
|
* *
|
|||
|
* Returns: *
|
|||
|
* Z = No specials to be found *
|
|||
|
* NZ = Someone still has something *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
ANY_BOMBS
|
|||
|
MMTM SP,A2,A3,A6
|
|||
|
|
|||
|
CLR A3 ;Accumulate here
|
|||
|
|
|||
|
MOVI P1DATA,A2
|
|||
|
MOVI MAXPLAYERS,A6 ;This many players possible
|
|||
|
AB_LOOP
|
|||
|
MOVE *A2(POBJ),A14,L ;Is this player active?
|
|||
|
JRZ AB_NEXT ;BR = No, then don't check
|
|||
|
|
|||
|
ADDM *A2(PBOMB1),A3,W ;Add his counts
|
|||
|
ADDM *A2(PBOMB2),A3,W
|
|||
|
|
|||
|
AB_NEXT
|
|||
|
ADDI PDSIZE,A2 ;Next player
|
|||
|
DSJ A6,AB_LOOP ;If there is one
|
|||
|
|
|||
|
MOVE A3,A3 ;Tell us what you found
|
|||
|
|
|||
|
MMFM SP,A2,A3,A6
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PCURSOR_OFF - TURN THE PLAYERS CURSOR "OFF" *
|
|||
|
* A2 = PTR TO PDATA *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PCURSOR_OFF
|
|||
|
PUSH A8
|
|||
|
MOVE *A2(POBJ),A8,L
|
|||
|
JRZ PO_X
|
|||
|
CALLA OBJ_OFF
|
|||
|
PO_X
|
|||
|
PULLQ A8
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* SUB_ENERGY - SUBTRACT PLAYER ENERGY. SETS THE PDEAD FLAG IF IT *
|
|||
|
* IS REQUIRED. *
|
|||
|
* A0 = AMOUNT OF ENERGY TO SUBTRACT *
|
|||
|
* A2 = PTR TO PLAYER *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
SUB_ENERGY
|
|||
|
MOVE *A2(POBJ),A14,L ;IS HE EVEN ALIVE?
|
|||
|
JRZ SE_X ;BR = NO
|
|||
|
CALLA SUBLIFE
|
|||
|
JRNC SE_X
|
|||
|
MOVKM 1,*A2(PDEAD),W ;DOINK THE PLAYER
|
|||
|
SE_X
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DELAYED_PRAISE - ROUTINE TO CREATE A DELAYED PLAYER PRAISE *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DELAYED_PRAISE
|
|||
|
MMTM SP,A0,A1,A7
|
|||
|
CREATE PID_IND,PRAISE_PROC
|
|||
|
MMFM SP,A0,A1,A7
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PRAISE_PROC - PROCESS TO SLEEP THEN CALL PRAISE TO A PLAYER. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PRAISE_PROC
|
|||
|
SLEEP 60
|
|||
|
CALLR PLAYER_PRAISE
|
|||
|
DIE
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PLAYER_PRAISE - ROUTINE TO PRAISE THE PLAYER WITH ARNOLD SPEECH *
|
|||
|
* AND FRIEND CHEERS. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PLAYER_PRAISE
|
|||
|
MMTM SP,A0,A5,A9
|
|||
|
|
|||
|
MOVE @LAST_PRAISE,A14,L
|
|||
|
JRZ PP_DOIT
|
|||
|
|
|||
|
MOVE @WAVETIME,A0,L
|
|||
|
SUB A14,A0
|
|||
|
CMPI 200,A0 ;BEEN THIS LONG SINCE LAST
|
|||
|
JRHI PP_DOIT ;BR = YES
|
|||
|
JRUC PP_X
|
|||
|
|
|||
|
PP_DOIT
|
|||
|
MOVE @WAVETIME,@LAST_PRAISE,L ;WE'RE DOIN' IT NOW
|
|||
|
CLRM @PRAISE_FLAG,W
|
|||
|
|
|||
|
MOVE @ARNOLD_SPEAK,A9,W
|
|||
|
|
|||
|
PCB_PRAISE_RESET
|
|||
|
MOVK 8,A5
|
|||
|
|
|||
|
PCB_TRY_PRAISE_AGAIN
|
|||
|
MOVK NUM_PRAISES,A0 ;Do a little praising
|
|||
|
CALLA RAND0
|
|||
|
|
|||
|
BTST A0,A9 ;Have we praised this yet?
|
|||
|
JRZ PCB_PRAISE_OK ;BR = No
|
|||
|
|
|||
|
DSJS A5,PCB_TRY_PRAISE_AGAIN
|
|||
|
*
|
|||
|
* Here we have failed to randomly praise, we'll just select
|
|||
|
*
|
|||
|
MOVK NUM_PRAISES,A5
|
|||
|
CLR A0 ;Walk down praise list until we get one
|
|||
|
PCB_WALK_PRAISE
|
|||
|
BTST A0,A9 ;Is this a good one?
|
|||
|
JRZ PCB_PRAISE_OK ;BR = Yes, then use it
|
|||
|
INC A0 ;Next
|
|||
|
DSJS A5,PCB_WALK_PRAISE
|
|||
|
|
|||
|
* We've done them all, so start over
|
|||
|
|
|||
|
CLR A9
|
|||
|
JRUC PCB_PRAISE_RESET
|
|||
|
|
|||
|
PCB_PRAISE_OK
|
|||
|
BSET A0,A9 ;Flag this as praised
|
|||
|
|
|||
|
MOVE A9,@ARNOLD_SPEAK,W
|
|||
|
|
|||
|
PCB_DO_PRAISE
|
|||
|
SLL 5,A0
|
|||
|
ADDI PRAISE_TABLE,A0
|
|||
|
MOVE *A0,A0,L ;Grab the proper phrase
|
|||
|
CALLA ONESND ;And sound it
|
|||
|
|
|||
|
PP_X
|
|||
|
MMFM SP,A0,A5,A9
|
|||
|
RETS
|
|||
|
|
|||
|
*SPEECH CALLS FOR ACKNOWLEDGMENT OF COOL ACTIONS
|
|||
|
NUM_PRAISES .EQU 7
|
|||
|
|
|||
|
PRAISE_TABLE
|
|||
|
.LONG SND_PP1, SND_PP2, SND_PP3, SND_PP4, SND_PP5, SND_PP6, SND_PP7
|
|||
|
|
|||
|
SND_PP1
|
|||
|
.WORD 0F3D0H,41,08818H,0 ;"Awesome"
|
|||
|
SND_PP2
|
|||
|
.WORD 0F3D0H,58,08817H,0 ;"Way to go"
|
|||
|
SND_PP3
|
|||
|
.WORD 0F3D0H,54,08816H,0 ;"Yeah!"
|
|||
|
SND_PP4
|
|||
|
.WORD 0F3D0H,56,0881AH,0 ;"Alright!"
|
|||
|
SND_PP5
|
|||
|
.WORD 0F3D0H,69,08812H,0 ;"Good shot"
|
|||
|
SND_PP6
|
|||
|
.WORD 0F3D0H,67,08813H,0 ;"Nice shot"
|
|||
|
SND_PP7
|
|||
|
.WORD 0F3D0H,61,08814H,0 ;"Great shot"
|
|||
|
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* POID_TO_PDATA - ROUTINE TO RETURN THE CORRECT PLAYER DATA AREA *
|
|||
|
* GIVEN AN OID. *
|
|||
|
* A0 = OID TO CONVERT *
|
|||
|
* RETURNS *
|
|||
|
* A2 = PLAYER DATA, IF BOGUS, THEN A2 = 0 AND Z SET. *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
POID_TO_PDATA
|
|||
|
PUSH A0
|
|||
|
SLL SL_POID,A0
|
|||
|
SRL SR_POID,A0
|
|||
|
DEC A0
|
|||
|
JRNN PTP_CALL
|
|||
|
PULLQ A0
|
|||
|
CLR A2
|
|||
|
RETS
|
|||
|
PTP_CALL
|
|||
|
CALLA GPLAYD
|
|||
|
PULLQ A0
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* GET_POID - GET THE CORRECT PLAYER OID BASED ON PLAYER DATA PTR. *
|
|||
|
* A2 = PTR TO PLAYER DATA AREA (IF NULL, OID_JUNK IS PASSED BACK) *
|
|||
|
* RETURNS: *
|
|||
|
* A0 = OID *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
GET_POID
|
|||
|
MOVE A2,A2 ;DID WE GET VALIDITY?
|
|||
|
JRNZ GP_IS_COOL ;BR = YES
|
|||
|
MOVI OID_JUNK,A0 ;JUST PASS BACK THE JUNKSTER
|
|||
|
RETS
|
|||
|
GP_IS_COOL
|
|||
|
CALLA GPLAYNUM
|
|||
|
SLL 4,A0
|
|||
|
ADDI PLAYER_OID_TAB,A0
|
|||
|
MOVE *A0,A0,W
|
|||
|
RETS
|
|||
|
|
|||
|
*
|
|||
|
*TABLE OF PLAYER OIDs
|
|||
|
*
|
|||
|
PLAYER_OID_TAB
|
|||
|
.WORD OID_P1,OID_P2,OID_P3
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* START_INVINCIBILITY - ROUTINE TO START THE PLAYER INVINCIBILITY PROCES *
|
|||
|
* A2 = PTR TO THE PLAYER DATA AREA *
|
|||
|
* A10 = INVINCIBILITY TIME *
|
|||
|
* NOTE: TRASHES A14 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
START_INVINCIBILITY
|
|||
|
MOVE *A2(PINVINCIBLE),A14,W ;GET CURRENT INVINCIBLE TIME
|
|||
|
ADD A10,A14
|
|||
|
CMPI 1000,A14 ;HAS IT TOPPED OUT?
|
|||
|
JRLS SI_NOTOP ;BR = NO
|
|||
|
MOVI 1000,A14 ;LEVEL IT OFF
|
|||
|
SI_NOTOP
|
|||
|
MOVE A14,*A2(PINVINCIBLE),W
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* A_CK_FLSH_HIT - ANIM FUNC TO CHECK IF A GUN FLASH HIT A PLAYER. *
|
|||
|
* A8 = PTR TO GUN FLASH *
|
|||
|
* AARG+,L = [INT,FRAC] ENERGY POINTS TO SUBTRACT *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
A_CK_FLSH_HIT
|
|||
|
CALLA GETAFARG_LONG
|
|||
|
MOVE A0,A5
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CK_GFLASH_HIT - ROUTINE TO CHECK IF A GUN FLASH HIT ANY PLAYER. *
|
|||
|
* A5 = # OF ENERGY POINTS TO SUBTRACT [INT,FRAC] *
|
|||
|
* A8 = PTR TO ENEMY OBJECT *
|
|||
|
* RETURNS: *
|
|||
|
* A2 = PDATA OF PLAYER HIT *
|
|||
|
* Z = NO HIT SCORED *
|
|||
|
* C = No hit because shot was offscreen or blocked *
|
|||
|
* NC = No hit because he plain missed *
|
|||
|
* NZ = HIT SCORED *
|
|||
|
* NOTE: TRASHES A14 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CK_GFLASH_HIT
|
|||
|
MMTM SP,A1,A3,A6,A7
|
|||
|
|
|||
|
CLR A6 ;CLEAR HIT COUNTER
|
|||
|
|
|||
|
MOVE *A8(OXVAL),A3,L
|
|||
|
MOVE *A8(OYVAL),A7,L
|
|||
|
MOVE *A8(OZVAL),A2,L ;Z UNIVERSE
|
|||
|
|
|||
|
jruc CPH_hook
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* A_CK_PHIT *
|
|||
|
* *
|
|||
|
* Anim func to check if an enemy object hit a player *
|
|||
|
* *
|
|||
|
* A8 = Ptr to enemy object *
|
|||
|
* AARG+,L = [Y,X] screen firing offset *
|
|||
|
* AARG+,L = Hit point amount to add to BASE_HIT *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
A_CK_PHIT
|
|||
|
CALLA GETAFARG_LONG
|
|||
|
MOVE A0,A3
|
|||
|
CALLA GETAFARG_LONG
|
|||
|
MOVE @BASE_HIT,A5,W
|
|||
|
SLL 4,A5
|
|||
|
|
|||
|
; MOVE A0,A5
|
|||
|
ADD A0,A5
|
|||
|
|
|||
|
JRUC CK_PLAYER_HIT
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CK_PLAYER_HIT - ROUTINE TO CHECK IF AN ENEMY OBJECT HIT ANY PLAYER. *
|
|||
|
* A3 = [Y,X] SCREEN FIRING OFFSET (IF ZERO, DAG MUST BE SET) *
|
|||
|
* A5 = # OF ENERGY POINTS TO SUBTRACT [INT,FRAC] *
|
|||
|
* A8 = PTR TO ENEMY OBJECT *
|
|||
|
* RETURNS: *
|
|||
|
* A2 = PDATA OF PLAYER HIT *
|
|||
|
* Z = NO HIT SCORED *
|
|||
|
* C = No hit because shot was offscreen or blocked *
|
|||
|
* NC = No hit because he plain missed *
|
|||
|
* NZ = HIT SCORED *
|
|||
|
* NOTE: TRASHES A14 *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CK_PLAYER_HIT
|
|||
|
MMTM SP,A1,A3,A6,A7
|
|||
|
|
|||
|
CLR A6 ;CLEAR HIT COUNTER
|
|||
|
|
|||
|
MOVE A3,A7
|
|||
|
JRNZ CPH_TRANSLATE ;BR=OFFSET NON-ZERO, TRANSLATE
|
|||
|
MOVE *A8(ODAG),A3,L ;NO TRANSLATION NECESSARY, USE DAG
|
|||
|
MOVE *A8(OANIOFF),A14,L
|
|||
|
ADDXY A14,A3 ;DA POINT TO CHECK
|
|||
|
JRUC CPH_DOIT
|
|||
|
CPH_TRANSLATE
|
|||
|
SEXT A3,W
|
|||
|
SLL 15,A3 ;X WORLD OFFSET
|
|||
|
SRA 16,A7
|
|||
|
SLL 15,A7 ;Y WORLD OFFSET
|
|||
|
MOVE *A8(OCTRL),A14,W ;ADJUST FIRING OFFSET IF NECESSARY
|
|||
|
BTST B_FLIPH,A14
|
|||
|
JREQ CPH_CKV ;BR=NO HORIZONTAL FLIP
|
|||
|
NEG A3
|
|||
|
CPH_CKV
|
|||
|
BTST B_FLIPV,A14
|
|||
|
JREQ CPH_OFF ;BR=NO VERTICAL FLIP
|
|||
|
NEG A7
|
|||
|
CPH_OFF
|
|||
|
MOVE *A8(OXVAL),A14,L
|
|||
|
ADD A14,A3 ;X UNIVERSE
|
|||
|
MOVE *A8(OYVAL),A14,L
|
|||
|
ADD A14,A7 ;Y UNIVERSE
|
|||
|
MOVE *A8(OZVAL),A2,L ;Z UNIVERSE
|
|||
|
CPH_hook:
|
|||
|
UTOSXY A2,A3,A7 ;UNIVERSE X,Y TO SCREEN X,Y TRANSLATION
|
|||
|
SLL 16,A7
|
|||
|
ZEXT A3,W
|
|||
|
ADDXY A7,A3 ;A3 IN [Y,X] FORMAT
|
|||
|
CPH_DOIT
|
|||
|
calla ENEMYP_COLL ;SEE IF HIS SHOT IS BLOCKED
|
|||
|
jrnz CPH_Block_X ;BR = 'twas blocked
|
|||
|
|
|||
|
movi [50,50],A2 ;This is our out of range buffer
|
|||
|
|
|||
|
move @SCRNTL,A7,L
|
|||
|
subxy A2,A7 ;Bufferin
|
|||
|
cmpxy A7,A3 ;Out of range?
|
|||
|
jrxlt CPH_Block_X ;BR = Yes, to the left
|
|||
|
jrylt CPH_Block_X ;BR = Yes, on top
|
|||
|
move @SCRNBR,A7,L
|
|||
|
addxy A2,A7 ;Bufferin
|
|||
|
cmpxy A7,A3 ;Out of range?
|
|||
|
jrxgt CPH_Block_X ;BR = Yes, to the right
|
|||
|
jrygt CPH_Block_X ;BR = Yes, below
|
|||
|
|
|||
|
MOVE @GAME_STATE,A7,W
|
|||
|
CMPI INPLAY,A7 ;ARE WE PLAYING?
|
|||
|
JRNE CPH_X ;BR = NO
|
|||
|
|
|||
|
MOVE @NPLAYERS,A7,W
|
|||
|
MOVI P1DATA,A2
|
|||
|
CPH_PLAYER_LP
|
|||
|
CALLR CHECK_HIT
|
|||
|
JRZ CPH_NXT_PLAYER
|
|||
|
*ENEMY SCORED A HIT
|
|||
|
JRNC CPH_PLAYER_HIT ;BR = PLAYER NOT OUT OF LIFE
|
|||
|
MOVKM 1,*A2(PDEAD),W ;MARK THE PLAYER DEAD, NOW!
|
|||
|
CPH_PLAYER_HIT
|
|||
|
INC A6 ;SHOW THE HIT
|
|||
|
CPH_NXT_PLAYER
|
|||
|
ADDI PDSIZE,A2
|
|||
|
DEC A7
|
|||
|
JRNN CPH_PLAYER_LP
|
|||
|
CPH_X
|
|||
|
MOVE A6,A6 ;SET STATUS
|
|||
|
clrc ;Shot not blocked or offscreen
|
|||
|
MMFM SP,A1,A3,A6,A7
|
|||
|
RETS
|
|||
|
*Exit point if shot was blocked or offscreen
|
|||
|
CPH_Block_X
|
|||
|
move A6,A6
|
|||
|
setc ;Shot was blocked or offscreen
|
|||
|
mmfm SP,A1,A3,A6,A7
|
|||
|
rets
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* PLAYER_HIT - ROUTINE TO HIT THE PLAYER FOR SOME ENERGY. *
|
|||
|
* A2 = PTR TO PLAYER DATA AREA *
|
|||
|
* A5 = ENERGY TO SUBTRACT [INT,FRAC] *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
PLAYER_HIT
|
|||
|
MOVE A2,A2 ;IS IT COOL
|
|||
|
JRZ PH_X
|
|||
|
MOVE *A2(POBJ),A14,L ;IS THE PLAYER ALIVE?
|
|||
|
JRZ PH_X ;BR = NO
|
|||
|
CALLR DO_HIT
|
|||
|
JRZ PH_X ;BR = No hit scored
|
|||
|
JRNC PH_X ;BR = Player not dead yet
|
|||
|
MOVKM 1,*A2(PDEAD),W ;MARK THE PLAYER DEAD, NOW!
|
|||
|
PH_X
|
|||
|
RETS
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* DO_HIT - ROUTINE TO SCORE A PLAYER HIT NO MATTER WHAT! *
|
|||
|
* A2 = PTR TO PLAYER DATA AREA *
|
|||
|
* A5 = ENERGY TO SUBTRACT [INT,FRAC] *
|
|||
|
* RETURNS *
|
|||
|
* Z = NO HIT SCORED *
|
|||
|
* NZ & NC = SCORED A PLAYER HIT AND PLAYER IS STILL ALIVE *
|
|||
|
* NZ & C = SCORED A PLAYER HIT AND PLAYER IS NOW DEAD *
|
|||
|
* NOTE: MAKE SURE PLAYER IS ALIVE WHEN CALLING THIS ON HIM *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
DO_HIT
|
|||
|
PUSH A0
|
|||
|
JRUC CHECK_HIT_G
|
|||
|
|
|||
|
**************************************************************************
|
|||
|
* *
|
|||
|
* CHECK_HIT - ROUTINE TO DETERMINE IF A PLAYER HAS RECIEVED A HIT. *
|
|||
|
* A2 = PTR TO PLAYER DATA AREA *
|
|||
|
* A3 = POINT TO CHECK *
|
|||
|
* A5 = ENERGY TO SUBTRACT [INT,FRAC] *
|
|||
|
* RETURNS *
|
|||
|
* Z = NO HIT SCORED *
|
|||
|
* NZ & NC = SCORED A PLAYER HIT AND PLAYER IS STILL ALIVE *
|
|||
|
* NZ & C = SCORED A PLAYER HIT AND PLAYER IS NOW DEAD *
|
|||
|
* *
|
|||
|
**************************************************************************
|
|||
|
CHECK_HIT
|
|||
|
PUSH A0
|
|||
|
MOVE *A2(POBJ),A0,L ;IS THE PLAYER ALIVE?
|
|||
|
JRZ CH_X ;BR = NO
|
|||
|
MOVE *A2(PHITBOXUL),A0,L
|
|||
|
CMPXY A0,A3
|
|||
|
JRXLT CH_FL
|
|||
|
JRYLT CH_FL
|
|||
|
MOVE *A2(PHITBOXLR),A0,L
|
|||
|
CMPXY A0,A3
|
|||
|
JRXGT CH_FL
|
|||
|
JRYGT CH_FL
|
|||
|
|
|||
|
; CALLA ENEMYP_COLL ;SEE IF HIS SHOT IS BLOCKED
|
|||
|
; JRNZ CH_FL
|
|||
|
|
|||
|
CHECK_HIT_G
|
|||
|
MOVE *A2(PINVINCIBLE),A0,W ;IS THIS PLAYER INVINCIBLE?
|
|||
|
JRNZ CH_FL ;BR = YES, NO FLASH
|
|||
|
MOVE A5,A5 ;Is no energy being taken?
|
|||
|
JRZ CH_NOFLASH ;BR = Correct, do not flash
|
|||
|
; JRNZ CH_NOFLASH ;BR = YES, NO FLASH
|
|||
|
|
|||
|
CALLA FLASH_PSTATUS
|
|||
|
|
|||
|
; CALLA GPLAYNUM ;GET THE PLAYERS NUMBER
|
|||
|
; SLL 5,A0
|
|||
|
; ADDI FLASH_TAB,A0
|
|||
|
; MOVE *A0,A0,L ;GET HIS TABLE OF FLASH LAMPS
|
|||
|
; MOVB *A2(PLASTFLASH),A14
|
|||
|
; INC A14 ;THIS IS THE NEXT FLASHER TO GO
|
|||
|
; CMPI N_PFLASHERS,A14
|
|||
|
; JRLO CH_FLASHIT ;BR = STILL IN RANGE.
|
|||
|
; CLR A14 ;RESET TO ZERO FLASHER
|
|||
|
;CH_FLASHIT
|
|||
|
; MOVB A14,*A2(PLASTFLASH)
|
|||
|
; SLL 5,A14
|
|||
|
; ADD A14,A0
|
|||
|
; MOVE *A0,A0,L ;PULL FLASHER FROM TABLE
|
|||
|
; CALLA FLASH_LAMP ;AND DO IT
|
|||
|
;
|
|||
|
CH_NOFLASH
|
|||
|
|
|||
|
MOVE A5,A0
|
|||
|
|
|||
|
CALLA SUBLIFE
|
|||
|
|
|||
|
CLRZ ;FLAG THE TAG
|
|||
|
JRUC CH_X
|
|||
|
CH_FL
|
|||
|
SETZ
|
|||
|
CH_X
|
|||
|
PULL A0
|
|||
|
RETS
|
|||
|
|
|||
|
.END
|
|||
|
|