2077 lines
50 KiB
NASM
2077 lines
50 KiB
NASM
.MLIB "GXMACS.LIB"
|
||
.FILE "GXSCORE.ASM"
|
||
.TITLE " <<< GENERATION X -- SCORING ROUTINES >>>"
|
||
.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 "GXSTRING.H"
|
||
.INCLUDE "IMGTBL.GLO"
|
||
.INCLUDE "GXSCORE.TBL"
|
||
|
||
.DEF UPDSL, OUTLIVES, OUTSCR, SUBLIFE
|
||
|
||
.DEF SCORE_GAME_OVER
|
||
.DEF SCORPROC, LEVEL_UPDATE
|
||
.DEF SCORE_IF_ACTIVE
|
||
.DEF G_CRED, G_CREDONLY
|
||
.DEF MARQUEE
|
||
.DEF AWARD_EXTRAS
|
||
.DEF FLASH_PSTATUS, PLAYER_SHIELD
|
||
|
||
*SYMBOLS IN GX.ASM
|
||
.REF ALLOW_CONTINUE
|
||
*SYMBOLS IN GXPOWER.ASM
|
||
.REF DO_HEADS_UP
|
||
*SYMBOLS IN GXRAM.ASM
|
||
.REF BTIME
|
||
*SYMBOLS IN GXPALL.ASM
|
||
.REF PALSET
|
||
*SYMBOLS IN GXCOIN.ASM
|
||
.REF CR_BOTH
|
||
***** from GXD.ASM
|
||
.REF OBJ_CONST_MULTI
|
||
***** from GXWARREN.ASM
|
||
.REF C_OCONST
|
||
|
||
.BSS CANSTRT,16
|
||
.bss filler,16 ; to keep long word aligned
|
||
**** .BSS HISEEN,16 ; HOW MANY "HI"S IN A ROW
|
||
|
||
STATUS_FLASH_COLOR .EQU 2929H ;CONSTANT COLOR FOR HIT FLASH
|
||
.EVEN
|
||
.TEXT
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCORPROC - SIMPLE SCORE PROCESS FOR FLASHING PRESS START *
|
||
* *
|
||
* ENTRY : *
|
||
* A11 POINTER TO PLAYER DATA AREA *
|
||
* *
|
||
* RETURNS : *
|
||
* NEVER EXITS *
|
||
* *
|
||
* NOTE : *
|
||
* A8 MESSAGE PART FLAG *
|
||
* A9 CURRENTLY ACTIVE PALETTE *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SCORPROC:
|
||
CLR A8 ; MESSAGE PART 0
|
||
SCORPLP2
|
||
CALLA CR_BOTH
|
||
MOVE A2,@CANSTRT,W ; START/CONTINUE FLAG
|
||
|
||
MOVE @NPLAYERS,A11,W ; NUMBER OF PLAYERS
|
||
MOVI P1DATA,A2 ; ALWAYS ASSUME AT LEAST 1 PLAYER
|
||
SP_LP
|
||
CALLR SCORMESS
|
||
ADDI PDSIZE,A2
|
||
DEC A11
|
||
JRNN SP_LP
|
||
|
||
SLEEP 40
|
||
NOT A8 ; FLIP MESSAGE
|
||
JRUC SCORPLP2 ; PLOT IT AGAIN, SAM
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCORMESS FIGURE OUT WHAT MESSAGE TO PUT IN THE SCORE BOX *
|
||
* *
|
||
* ENTRY *
|
||
* A2 : POINTER TO CURRENT PLAYER BANK *
|
||
* A8 : 0 IF FIRST PART OF MESSAGE, ~0 IF SECOND PART *
|
||
* A9 : COLOR TO USE IN PALETTE *
|
||
* *
|
||
* RETURN *
|
||
* NOTHING *
|
||
* *
|
||
**************************************************************************
|
||
|
||
SCORMESS:
|
||
MMTM SP,A2,A8,A9,A10,A11
|
||
|
||
SCORMRETRY:
|
||
MOVK 1,A11 ; ASSUME IN STORY MODE
|
||
|
||
MOVE @GAME_STATE,A0,W
|
||
CMPI INAMODE,A0
|
||
JREQ SCORMAMODE
|
||
|
||
CLR A11 ; NOT IN ATTRACT MODE
|
||
MOVE *A2(PDEAD),A0,W ; CHECK FOR DEAD MESSAGE
|
||
JRNZ SCORM3
|
||
|
||
MOVE *A2(POBJ),A0,L ; CHECK TO SEE IF HAS OBJECT
|
||
JRNZ SCORMRET
|
||
MOVE *A2(PENTER),A0,W ; CHECK FOR ENTERING
|
||
JRNZ SCORMRET
|
||
|
||
SCORMAMODE
|
||
|
||
MOVE A8,A8 ; CHECK SEQUENCER
|
||
JRNZ SCORM1 ; WORKING ON SECOND MESSAGE
|
||
|
||
MOVE A11,A11 ;ARE WE IN ATTRACT MODE?
|
||
JRNZ SCD_START_CREDITS ;BR = ALWAYS CHECK FOR STARTING CREDS
|
||
|
||
MOVE *A2(PSCORE),A3,L ;PLAYERS FIRST TIME PLAYING?
|
||
JRNZ SCO1 ;BR = NO
|
||
|
||
SCD_START_CREDITS
|
||
MOVE @CANSTRT,A0,W ;DOES HE HAVE ENOUGH TO START?
|
||
ANDI 1,A0
|
||
JRZ SCOPOOR ;BR = NO, TELL HIM HE NEEDS MORE
|
||
*THIS IS WHERE WE TO PLAYER SPECIFIC MESSAGES OF APPROPRIATE
|
||
SCDNAME
|
||
MOVI T1PRESS,A8
|
||
JRUC SCORMGO
|
||
SCO1
|
||
CALLA ALLOW_CONTINUE
|
||
JRZ SCORM_GAME_OVER
|
||
MOVE @CANSTRT,A0,W
|
||
ANDI 2,A0
|
||
JRNZ SCDNAME ; BR = YES, ENOUGH CONTINUE CREDITS
|
||
|
||
SCOPOOR
|
||
MOVI T1INSERT,A8 ; INSERT COIN
|
||
JRUC SCORMGO
|
||
|
||
SCORM1
|
||
MOVI T1TOPLAY,A8 ; "TO PLAY"
|
||
JRUC SCORMGO
|
||
|
||
SCORM_GAME_OVER
|
||
MOVK 2,A0
|
||
MOVE A0,*A2(PDEAD),W
|
||
SCORM3 ; A0 CONTAINS PDEAD HERE
|
||
CMPI 1,A0,W ; CHECK FOR BLANK
|
||
JRZ SCORMRET ; NOTHING TO PLOT
|
||
CMPI 2,A0,W ; GAME OVER PLOTTED
|
||
JRZ SCORM4
|
||
CLR A0
|
||
MOVE A0,*A2(PDEAD),W ; CLEAR PDEAD CONDITION
|
||
MOVK 1,A10 ; FORCE AN ERASE
|
||
JRUC SCORMRETRY
|
||
SCORM4
|
||
JRUC SCORMRET
|
||
; JRUC SCORMPAL ; BYPASS FLASHING COLOR
|
||
;
|
||
; PLOT THE MESSAGE IN A8 AT THE RIGHT LOCATION
|
||
;
|
||
SCORMGO
|
||
MOVI 0E0EH,A1
|
||
SLL 16,A1 ; THIS IS THE CONSTANT DRAW COLOR
|
||
MOVE *A2(PPALID),A0,L ; LOOKUP THE CURRENT PALETTE
|
||
CALLA FINDPAL ; MAKE SURE IT HAS A PALETTE
|
||
MOVX A0,A1
|
||
|
||
SCORMGOOBJ
|
||
|
||
MOVE *A2(PSCRAD),A3,L
|
||
ADDI SCRCTR,A3 ; START OF TEXT
|
||
MOVE *A8(IANIOFFX),A14,L
|
||
SUB A14,A3 ; ADJUST THE ANIMATION POINT
|
||
|
||
MOVE A8,A14
|
||
MOVI DMAWAL,A5 ; FLAGS
|
||
CALLR SETUP_DMAN
|
||
|
||
CALLA QDMAN2 ; OUTPUT THE SUCKER
|
||
SCORMRET
|
||
MMFM SP,A2,A8,A9,A10,A11
|
||
RETS
|
||
|
||
PDTAB .LONG P1DATA,P2DATA,P3DATA,0
|
||
|
||
|
||
CENSORED_TIME .EQU 120
|
||
**************************************************************************
|
||
* *
|
||
* SCORE_GAME_OVER - PROCESS TO PLACE "GAME OVER" MESSAGE IN THE *
|
||
* PLAYERS SCORE BOX. *
|
||
* A11 = PTR TO PLAYER DATA *
|
||
* *
|
||
**************************************************************************
|
||
SCORE_GAME_OVER
|
||
MOVE *A11(PDEAD),A0,W ;IS THE PLAYER DEAD?
|
||
JRZ SGO_DIE ;BR = NOT ANYMORE
|
||
|
||
MOVE @CURPLYRS,A0,W
|
||
JRZ SGO_NO_HEADS
|
||
|
||
MOVE A11,A2
|
||
|
||
MOVI CENSORED_TAB_3P,A0
|
||
MOVI CENSORED_TAB_2P,A1
|
||
CALLA DO_HEADS_UP
|
||
|
||
SGO_NO_HEADS
|
||
SLEEP CENSORED_TIME
|
||
|
||
CALLA ALLOW_CONTINUE
|
||
JRZ SGO_DIE
|
||
|
||
CALLA ALLOW_CONTINUE
|
||
JRZ SGO_DIE
|
||
|
||
MOVE *A11(PDEAD),A0,W ;IS THE PLAYER DEAD?
|
||
JRZ SGO_DIE ;BR = NOT ANYMORE
|
||
MOVK 3,A0 ; PAUSE DONE, LET SCORPROC SYNC UP
|
||
MOVE A0,*A11(PDEAD),W
|
||
|
||
SGO_DIE:
|
||
DIE
|
||
|
||
*
|
||
*"CENSORED" HEADS_UP DISPLAY for a 3-player model
|
||
*
|
||
CENSORED_TAB_3P
|
||
.WORD 0F5H, CENSORED_TIME
|
||
.LONG RED_CENSORED_INIT, YEL_CENSORED_INIT, BLUE3_CENSORED_INIT
|
||
|
||
*
|
||
*"CENSORED" HEADS_UP DISPLAY for a 2-player model
|
||
*
|
||
CENSORED_TAB_2P
|
||
.WORD 0F5H, CENSORED_TIME
|
||
.LONG RED_CENSORED_INIT, BLUE2_CENSORED_INIT
|
||
|
||
RED_CENSORED_INIT
|
||
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long P_CENSORR ;IMGPAL
|
||
.WORD OID_P1HUP,0
|
||
LWWWW CENSORR, DMAWNZ, M_NOSCALE|M_SCRNOBJ, 0 , 0
|
||
|
||
YEL_CENSORED_INIT
|
||
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long P_CENSORY ;IMGPAL
|
||
.WORD OID_P2HUP,0
|
||
LWWWW CENSORY, DMAWNZ, M_NOSCALE|M_SCRNOBJ, 0 , 0
|
||
|
||
BLUE3_CENSORED_INIT
|
||
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long P_CENSORB ;IMGPAL
|
||
.WORD OID_P3HUP,0
|
||
LWWWW CENSORB, DMAWNZ, M_NOSCALE|M_SCRNOBJ, 0 , 0
|
||
|
||
BLUE2_CENSORED_INIT
|
||
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long P_CENSORB ;IMGPAL
|
||
.WORD OID_P2HUP,0
|
||
LWWWW CENSORB, DMAWNZ, M_NOSCALE|M_SCRNOBJ, 0 , 0
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCORAREA - OUTPUT THE SCORE AREA AND UPDATE ALL PLAYER STATUS *
|
||
* *
|
||
**************************************************************************
|
||
SCORAREA
|
||
CALLR UPSTAT ;UPDATE PLAYERS STATUS
|
||
; CALLR MARQUEE
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* MARQUEE - OUTPUT THE MARQUEE, THIS INCLUDES THE CREDIT/ISLAND MESSAGE *
|
||
* *
|
||
**************************************************************************
|
||
MARQUEE:
|
||
RETS
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A14
|
||
MOVI MARQTAB,A0
|
||
CLR A6
|
||
JRUC SSOUT1
|
||
|
||
**************************************************************************
|
||
* *
|
||
* G_CRED - OUTPUT "CREDITS: xx" DURING GAMEPLAY *
|
||
* A8 = PTR CREDITS STRING, READY FOR STRINGER *
|
||
* *
|
||
**************************************************************************
|
||
*ENTRY TO JUST REFRESH THE CREDIT'S NOT THE BUY-IN TIMER
|
||
G_CREDONLY
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
|
||
JRUC G_CREDG
|
||
*ENTRY CALLED EVERY TIME A COIN IS PUT IN
|
||
G_CRED:
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
|
||
MOVI PID_BUYIN,A0
|
||
CALLA EXISTP_ALL
|
||
JRZ G_CREDG ;THERE IS NO BUY IN AT THIS TIME
|
||
MOVIM BUYTIME,@BTIME,W ;RESET THE BUY-IN TIME
|
||
MOVE A0,A4
|
||
MOVI OID_BTIME,A0
|
||
CALLA EXISTOBJ_ALL
|
||
JRZ G_CREDG ;THERE'S NO PHYSICAL TIMER AS OF YET
|
||
MOVE A4,A0
|
||
MOVI BUYTICK,A11
|
||
CALLA PUTA11 ;RESET THE TICK TIMER
|
||
|
||
*ENTRYPOINT JUST TO UPDATE THE CREDITS MESSAGE
|
||
G_CREDG
|
||
MOVE @GAME_STATE,A0,W
|
||
CMPI INDIAG,A0
|
||
JREQ G_CRED_X
|
||
CMPI INAMODE,A0
|
||
JREQ G_CRED_X
|
||
CMPI ININTRO,A0
|
||
JREQ G_CRED_X
|
||
CMPI INEPILOG,A0
|
||
JREQ G_CRED_X
|
||
|
||
MOVE A8,A14
|
||
CREDIT_LP
|
||
MOVB *A14,A4
|
||
JRZ G_CRED_X ;BR = ERROR IN CREDIT STRING
|
||
CMPI 20H,A4
|
||
JREQ CREDIT_FOUND
|
||
ADDK 8,A14
|
||
JRUC CREDIT_LP
|
||
CREDIT_FOUND
|
||
ADDK 8,A14 ;RID 'O SPACE
|
||
MOVB *A14,A4 ;ARE THE CREDITS NON-EXISTANT?
|
||
JRZ G_CRED_X ;BR = YES
|
||
CMPI 20H,A4
|
||
JREQ CREDIT_FOUND
|
||
|
||
MOVI CRDBOX,A3 ;ERASE CURRENT CREDIT MESSAGE
|
||
MOVI CRDSIZE,A4
|
||
CLR A1
|
||
CALLA FILLAREA2
|
||
|
||
MOVI RD5FONT,A11 ;SET DA SHIT UP
|
||
MOVK 1,A10
|
||
MOVI CRDBOX+CRDTXT,A9
|
||
MOVI 0F0F0101H,A5
|
||
CLR A0
|
||
CLR B1
|
||
JSRP STRCNRM2 ;LET IT RIP
|
||
G_CRED_X:
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
|
||
RETS
|
||
|
||
|
||
.IF GERMAN
|
||
|
||
CREDIT_MESS:
|
||
MESS_MAC RD5FONT,1,0,0,01010000H,STRCNRM2,0
|
||
.STRING "KRED",0
|
||
.EVEN
|
||
FREE_MESS:
|
||
MESS_MAC RD5FONT,1,0,0,0F0F0101H,STRCNRM2,0
|
||
.STRING "FREI",0
|
||
.EVEN
|
||
|
||
.ELSE
|
||
|
||
CREDIT_MESS:
|
||
MESS_MAC RD5FONT,1,0,0,01010000H,STRCNRM2,0
|
||
.STRING "CRED",0
|
||
.EVEN
|
||
FREE_MESS:
|
||
MESS_MAC RD5FONT,1,0,0,0F0F0101H,STRCNRM2,0
|
||
.STRING "FREE",0
|
||
.EVEN
|
||
|
||
.ENDIF
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SSOUT *
|
||
* *
|
||
* Output some Score/Status area pieces via a table. *
|
||
* First entry, is area to blank before plotting. *
|
||
* *
|
||
* A0 = Ptr to table *
|
||
* A2 = Player this belongs to. (0 = No player) *
|
||
* A6 = Offset to add to each piece (DAG for BLNKAREA). *
|
||
* *
|
||
* Returns: *
|
||
* A0 = Pointing to next word after table *
|
||
* *
|
||
**************************************************************************
|
||
SSOUT:
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8
|
||
SSOUT1:
|
||
MOVE *A0+,A4,L
|
||
JRZ SSOUT_BLANK_SKIP
|
||
MOVE A6,A3
|
||
MOVI ERASECOL*10000H,A1
|
||
CALLA FILLAREA2
|
||
|
||
SSOUT_BLANK_SKIP:
|
||
CLR A1 ;CONSTANT:PALETTE
|
||
MOVI DMAWNZ,A5 ;DRAW
|
||
SLL 16,A5
|
||
MOVE A2,A2
|
||
JRZ SSO_NOPLAYER ;BR = No player association
|
||
|
||
MOVE A0,A7
|
||
|
||
MOVE *A2(PPALID),A0,L
|
||
CALLA FINDPAL
|
||
MOVX A0,A1 ;Correct [Constant,Palette]
|
||
|
||
MOVI [0100H,0100H],A0 ;SCALE IS 1:1
|
||
|
||
MOVE *A7+,A8,L
|
||
SSO_P_LOOP
|
||
MOVE *A8(ISIZE),A2,L ;GRAB THE UNSCALED SIZE
|
||
MOVE *A8(ICTRL),A14,W ;GET BPP AND COMPRESSION
|
||
SLL 16,A14
|
||
OR A14,A5
|
||
MOVE *A8(ISAG),A4,L
|
||
|
||
CALLA QDMAN2 ;Q THIS SUCKAH!
|
||
|
||
MOVE *A7+,A8,L
|
||
JRNZ SSO_P_LOOP
|
||
|
||
JRUC SSO_X
|
||
|
||
SSO_NOPLAYER
|
||
MOVE *A0+,A7,L ;KICK IT OFF COUSIN
|
||
SSOUTL:
|
||
MOVE *A0+,A3,L
|
||
ADDXY A6,A3
|
||
CALLA DTIME2 ;DO IT
|
||
MOVE *A0+,A7,L ;GET THE NEXT
|
||
JRNZ SSOUTL ;BR = DO IT AGAIN
|
||
|
||
SSO_X
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8
|
||
RETS
|
||
|
||
MARQTAB
|
||
.LONG 0
|
||
|
||
.LONG 0
|
||
|
||
P1SCOREAREA:
|
||
.LONG PBOXSIZ
|
||
.LONG BOX1d
|
||
.LONG [0,0]
|
||
.LONG 0
|
||
|
||
P2SCOREAREA:
|
||
.LONG PBOXSIZ
|
||
.LONG BOX2d
|
||
.LONG [0,0]
|
||
.LONG 0
|
||
|
||
P3SCOREAREA:
|
||
.LONG PBOXSIZ
|
||
.LONG BOX3d
|
||
.LONG [0,0]
|
||
.LONG 0
|
||
|
||
|
||
*
|
||
*UPDATE ALL PLAYER STATUS AREAS
|
||
UPSTAT
|
||
MMTM SP,A2,A7
|
||
ALLPLYR UPDSL ;USES A7
|
||
MMFM SP,A2,A7
|
||
RETS
|
||
|
||
*
|
||
*UPDATE THE PLAYERS SCORE,LIVES & WHATEVER ELSE.
|
||
*A2 = PLAYER DATA STRUCTURE
|
||
UPDSL
|
||
MMTM SP,A0,A1
|
||
CALLA PSENCL ;FIRST RE-INIT THE AREA
|
||
MOVE *A2(PSCORE),A0,L ;GET THE SCORE IN A0
|
||
CALLR OUTSCR ;AND OUTPUT IT
|
||
CALLR OUT_BOMBS
|
||
|
||
MOVE *A2(POBJ),A0,L
|
||
JRZ UPDSL_X
|
||
*DO THE FOLLOWING ONLY WHEN THE PLAYER IS ALIVE
|
||
; CALLR OUTGUN
|
||
; CALLR OUTENERGYWORD
|
||
CALLR OUTLIVES
|
||
; CALLR OUTGUNWORD
|
||
UPDSL_X:
|
||
MMFM SP,A0,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PSENCL - CREATE THE PLAYER SCORE ENCLOSURE *
|
||
* A2 = PLAYER DATA *
|
||
* *
|
||
**************************************************************************
|
||
PSENCL:
|
||
MMTM SP,A0,A6
|
||
MOVE *A2(PSCRAD),A6,L
|
||
|
||
CMPI P1DATA,A2
|
||
JRNE PSENCL_CKP2
|
||
MOVI P1SCOREAREA,A0
|
||
JRUC PSENCL_BUILD
|
||
PSENCL_CKP2:
|
||
CMPI P2DATA,A2
|
||
JRNE PSENCL_CKP3
|
||
MOVI P2SCOREAREA,A0
|
||
JRUC PSENCL_BUILD
|
||
PSENCL_CKP3:
|
||
CMPI P3DATA,A2
|
||
JRNE PSENCL_X
|
||
MOVI P3SCOREAREA,A0
|
||
|
||
PSENCL_BUILD:
|
||
CALLR SSOUT
|
||
PSENCL_X:
|
||
MMFM SP,A0,A6
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BCDADD - ADD TWO BCD VALUES *
|
||
* A0 = 8 DIGIT BCD VALUE *
|
||
* A1 = 8 DIGIT BCD VALUE *
|
||
* RETURNS *
|
||
* A0 = 8 DIGIT BCD RESULT *
|
||
* NOTE: PACKED BCD FORMAT 4-BITS/ DIGIT *
|
||
* *
|
||
**************************************************************************
|
||
BCDADD:
|
||
MMTM SP,A1,A3,A4,A5,A6
|
||
MOVK 8,A5 ;DO 8 DIGITS
|
||
CLRC ;CLEAR THE CARRY
|
||
MOVK 0Ah,A6
|
||
BCDLP:
|
||
MOVK 0Fh,A3
|
||
MOVK 0Fh,A4
|
||
AND A1,A3 ;MASK GARBAGE
|
||
AND A0,A4
|
||
ADDC A3,A4
|
||
CMP A6,A4 ;NEED TO ADJUST?
|
||
JRLO BCDAD1
|
||
ADDK 6,A4
|
||
SRL 4,A0
|
||
SLL 28,A4
|
||
ADD A4,A0
|
||
SRL 4,A1
|
||
SETC
|
||
DSJS A5,BCDLP
|
||
JRUC BCDADX
|
||
BCDAD1:
|
||
SRL 4,A0
|
||
SLL 28,A4
|
||
ADD A4,A0
|
||
SRL 4,A1
|
||
CLRC
|
||
DSJS A5,BCDLP
|
||
BCDADX:
|
||
MMFM SP,A1,A3,A4,A5,A6
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCORE - PLAYER SCORE ROUTINE *
|
||
* A1 = SCORE VALUE *
|
||
* A2 = PTR TO PLAYER DATA AREA (0 = NO PLAYER, NO SCORE) *
|
||
* *
|
||
**************************************************************************
|
||
SCORE:
|
||
PUSH A0
|
||
MOVE @GAME_STATE,A0,W
|
||
CMPI INAMODE,A0
|
||
JREQ SCOREX ;NO SCORING IN ATTRACT MODE
|
||
CMPI INGAMEOV,A0
|
||
JREQ SCOREX ;NO SCORING IN GAME OVER
|
||
MOVE A2,A2 ;IS THIS A FALSE ALARM?
|
||
JRZ SCOREX ;BR = YES
|
||
MOVE *A2(POBJ),A0,L
|
||
JRZ SCOREX ;NO PLAYER, NO SCORE
|
||
|
||
MOVE *A2(PSCORE),A0,L ;GET SCORE
|
||
ADD A1,A0 ;LET'S GO NORMAL
|
||
CALLR REPCK ;CHECK REPLAY
|
||
MOVE A0,*A2(PSCORE),L ;STORE SCORE
|
||
CALLR OUTSCR ;OUTPUT CURRENT PLAYER SCORE
|
||
SCOREX
|
||
PULLQ A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCORE_IF_ACTIVE - GIVE THE PLAYER THIS SCORE IFF HE IS ACTIVE. *
|
||
* A1 = BCD SCORE VALUE *
|
||
* A2 = PTR TO PLAYER DATA *
|
||
* *
|
||
**************************************************************************
|
||
SCORE_IF_ACTIVE:
|
||
PUSH A0
|
||
MOVE *A2(POBJ),A0,L
|
||
JRZ SCORE_IA_X
|
||
CALLR SCORE
|
||
SCORE_IA_X:
|
||
PULL A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* REPCK - CHECK TO SEE IF A PLAYER HAS SCORED A REPLAY AND IF SO *
|
||
* AWARD A NEW DUDE. *
|
||
* A0 = CURRENT PLAYER SCORE *
|
||
* A2 = PLAYER DATA AREA *
|
||
* RETURNS: *
|
||
* NOTHING *
|
||
* NOTE: DESTROYS A14 *
|
||
* *
|
||
**************************************************************************
|
||
REPCK
|
||
RETS
|
||
|
||
**** MMTM SP,A0,A1,A3,A4
|
||
|
||
**** MOVE *A2(PEXTRAS),A1,W
|
||
**** JRZ REPCKX ;BR = LAST ONE EXTINGUISHED
|
||
|
||
**** MOVE *A2(PNEXTREP),A1,L
|
||
**** JRZ REPCKX ;0 = NO EXTRA DUDES
|
||
|
||
**** CLR A3 ;KEEP COUNT OF HOW MANY LIVES WE OWE
|
||
**** MOVE A0,A4 ;KEEP THE SCORE HERE BECAUSE OF BCDADD
|
||
****REPCKLP:
|
||
**** CMP A1,A4 ;HAVE WE EXCEEDED THIS LEVEL?
|
||
**** JRLO REPCK_CASH_OUT ;BR = NO, CASH OUT
|
||
|
||
**** ADJUST ADJEXTRA ;GET EXTRA MAN EVERY ADJUSTMENT
|
||
|
||
**** ADD A0,A1
|
||
**** DECM *A2(PEXTRAS),W
|
||
**** JRNZ REPCK1
|
||
**** CLR A1 ;NO MORE REPLAYS JOE
|
||
****REPCK1
|
||
**** MOVE A1,*A2(PNEXTREP),L ;NEW REPLAY LEVEL
|
||
**** SOUND1 FREE_SND
|
||
|
||
**** MOVE A4,A0 ;RESTORE THE SCORE
|
||
**** INC A3 ;INCREMENT THE LIFE COUNT
|
||
**** MOVE A1,A1
|
||
**** JRNZ REPCKLP ;CHECK FOR MORE
|
||
****REPCK_CASH_OUT:
|
||
**** MOVE A3,A0
|
||
**** JRZ REPCKX ;WE OWE HIM NOTHING
|
||
**** CALLR ADDNLIFE ;PAY THE MAN
|
||
|
||
**** MOVE A0,A1
|
||
**** MOVI AUDDEARNED,A0
|
||
**** CALLA AUD ;COUNT IT OUT
|
||
****REPCKX:
|
||
**** MMFM SP,A0,A1,A3,A4
|
||
**** RETS
|
||
|
||
****FREE_SND
|
||
**** .WORD 0F3E0H,03CH,08012H,0 ;"WHOOP TE DOOO"
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OUTSCRHI - OUTPUT SCORE TO SCREEN, ALWAYS BRIGHT *
|
||
* A0 = PLAYER SCORE *
|
||
* A2 = PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
OUTSCRHI:
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8
|
||
MOVI 0D0D0000H,A1 ;BRIGHTEN THE SCENE
|
||
JRUC OUTSCRG
|
||
**************************************************************************
|
||
* *
|
||
* OUTSCRLO - OUTPUT SCORE TO SCREEN, ALWAYS DIM *
|
||
* A0 = PLAYER SCORE *
|
||
* A2 = PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
OUTSCRLO:
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8
|
||
MOVI 05050000H,A1 ;DIMMER COLOR
|
||
JRUC OUTSCRG
|
||
**************************************************************************
|
||
* *
|
||
* OUTSCR - OUTPUT SCORE TO SCREEN, BRIGHT OR DIM DEPENDING ON PLAYER *
|
||
* A0 = PLAYER SCORE *
|
||
* A2 = PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
OUTSCR:
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
|
||
|
||
MOVE @GAME_STATE,A14,W
|
||
CMPI INAMODE,A14
|
||
JREQ OUTSCRD
|
||
MOVE *A2(PENTER),A14,W
|
||
JRNZ OUTSCRH ;BR = PLAYER WILL ENTER SOON
|
||
MOVE *A2(POBJ),A14,L
|
||
JRZ OUTSCRD
|
||
OUTSCRH:
|
||
MOVI 0D0D0000H,A1 ;BRIGHTEN THE SCENE
|
||
JRUC OUTSCRG
|
||
OUTSCRD:
|
||
MOVI 05050000H,A1 ;DIMMER COLOR FOR NON-ACTIVE PLAYER
|
||
*
|
||
*OUTSCR - ENTRY POINT WITH FIXED CONSTANT COLOR IN A1
|
||
OUTSCRG:
|
||
MOVK 8,A3 ;DIGIT COUNT
|
||
CALLR SCORE_TO_DEC ;CONVERT THE NUMBER
|
||
|
||
MOVE A3,A6
|
||
MOVE *A2(PSCRAD),A3,L ;PLAYER SCORE AREA ADDRESS
|
||
ADDI PSCOREOF,A3
|
||
|
||
MOVI SCRSPC,A8 ;SPACING BETWEEN DIGITS
|
||
CLR A7 ;INIT BLANKING FLAG
|
||
|
||
MOVE A0,A5 ;STORE THE SCORE HERE
|
||
|
||
MOVE *A2(PPALID),A4,L
|
||
MOVE A4,A0
|
||
CALLA FINDPAL ;MAKE SURE IT HAS A PALETTE
|
||
JRNZ OUTSC01 ;BR = THERE EXISTS A PALETTE
|
||
MOVE A4,A0
|
||
CALLA GETFPAL ;MAKE A PALETTE EXIST
|
||
OUTSC01
|
||
MOVX A0,A1
|
||
|
||
MOVE A5,A9
|
||
MOVI DMAWNZ,A5 ;CONTROL REGISTER
|
||
|
||
*NOTE:A2 GETS DESTROYED UPON THE FIRST ITERATION OF THIS LOOP
|
||
OUTSCL:
|
||
MOVB *A9,A14 ;GET THE FIRST DIGIT
|
||
JRNE OUTSC1 ;NON-ZERO DIGIT
|
||
CMPI 2,A6
|
||
JRLS OUTSC1 ;LAST DIGITS - OUTPUT ANYWAY
|
||
MOVE A7,A7 ;BLANKING OVER?
|
||
JREQ OUTSC2 ;NO
|
||
OUTSC1:
|
||
INC A7 ;BLANKING IS OVER
|
||
|
||
SLL 7,A14 ;MULTIPLY BY 128
|
||
ADDI SNUM0,A14
|
||
|
||
CALLR SETUP_DMAN
|
||
CALLA QDMAN2 ;OUTPUT THE SUCKER
|
||
SRL 16,A5
|
||
|
||
OUTSC2:
|
||
ADDXY A8,A3 ;SPACE TO NEXT DIGIT
|
||
ADDK 8,A9 ;NEXT IN THE BUFFER
|
||
DSJ A6,OUTSCL
|
||
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
|
||
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OUT_BOMBS - OUTPUT THE NUMBER OF BOMBS CURRENTLY HELD BY *
|
||
* THIS PLAYER. *
|
||
* A2 = PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
OUT_BOMBS
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A8,A9
|
||
|
||
MOVE *A2(PBOMB2),A0,W ;DOES HE HAVE A SPECIAL BOMB?
|
||
JRNZ OB_BOMB2 ;BR = YES
|
||
|
||
MOVE *A2(PBOMB1),A0,W ;DEFAULT NORMAL COUNT
|
||
|
||
OB_BOMB2
|
||
CMPI 999,A0 ;MAX DISPLAYABLE?
|
||
JRLS OB_SIZEOK ;BR = NO
|
||
MOVI 999,A0 ;DEFAULT ON MAX
|
||
OB_SIZEOK
|
||
MOVK 3,A3 ;DIGIT COUNT
|
||
CALLR SCORE_TO_DEC ;CONVERT THE NUMBER
|
||
MOVE A3,A6
|
||
MOVE A0,A3 ;STORE THE SCORE HERE
|
||
|
||
MOVE *A2(PPALID),A4,L
|
||
MOVE A4,A0
|
||
CALLA FINDPAL ;MAKE SURE IT HAS A PALETTE
|
||
JRNZ OB_01 ;BR = THERE EXISTS A PALETTE
|
||
MOVE A4,A0
|
||
CALLA GETFPAL ;MAKE A PALETTE EXIST
|
||
OB_01
|
||
MOVX A0,A1
|
||
MOVE A3,A9
|
||
|
||
MOVE *A2(PSCRAD),A3,L ;PLAYER SCORE AREA ADDRESS
|
||
ADDI PBOMBOF,A3
|
||
|
||
MOVI SCRSPC,A8 ;SPACING BETWEEN DIGITS
|
||
MOVI DMAWNZ,A5 ;CONTROL REGISTER
|
||
|
||
*NOTE:A2 GETS DESTROYED UPON THE FIRST ITERATION OF THIS LOOP
|
||
OB_LP
|
||
MOVB *A9,A14 ;GET THE FIRST DIGIT
|
||
|
||
SLL 7,A14 ;MULTIPLY BY 128
|
||
ADDI CNUM0,A14
|
||
|
||
CALLR SETUP_DMAN
|
||
CALLA QDMAN2 ;OUTPUT THE SUCKER
|
||
SRL 16,A5
|
||
|
||
ADDXY A8,A3 ;SPACE TO NEXT DIGIT
|
||
ADDK 8,A9 ;NEXT IN THE BUFFER
|
||
DSJ A6,OB_LP
|
||
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A8,A9
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SETUP_DMAN - ROUTINE TO CORRECT OFFSET DUE TO MIRRORING FOR MANUAL *
|
||
* DMA'S (I.E. THOSE USING DMAN) *
|
||
* A14 = PTR TO IMAGE *
|
||
* A3 = UNFLIPPED DESTINATION *
|
||
* A5 = FLAGS FOR THIS DMA *
|
||
* RETURNS *
|
||
* A0 = SCALE [0100H,0100H] *
|
||
* A2 = OSIZE *
|
||
* A3 = [Y,X] DAG *
|
||
* A4 = SAG *
|
||
* A5 = [CONTROL,OFFSET] *
|
||
* *
|
||
**************************************************************************
|
||
SETUP_DMAN
|
||
MOVI [0100H,0100H],A0
|
||
MOVE *A14(ISIZE),A2,L ;GRAB THE UNSCALED SIZE
|
||
MOVE *A14(ICTRL),A4,W ;GET BPP AND COMPRESSION
|
||
OR A4,A5
|
||
SLL 16,A5
|
||
MOVE *A14(ISAG),A4,L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCORE_TO_DEC - FORMAT A HEXADECIMAL # TO A DECIMAL STRING, LEAD ZERO *
|
||
* FILL IS USED. *
|
||
* A0 = HEXADECIMAL # *
|
||
* A3 = width, MINIMUM # OF CHARACTERS TO OUTPUT *
|
||
* RETURNS: *
|
||
* A0 = PTR TO STRING *
|
||
* *
|
||
**************************************************************************
|
||
SCORE_TO_DEC
|
||
MMTM SP,A1,A3,A4,A9
|
||
|
||
MOVE A3,A4
|
||
DEC A4
|
||
|
||
SLL 3,A4
|
||
ADDI STRNGRAM,A4 ;THIS IS OUR STORAGE BUFFER
|
||
|
||
MOVK 10,A9 ;DIVISOR FOR DECIMAL
|
||
|
||
MOVE A0,A1
|
||
SCTODEC2
|
||
CLR A0
|
||
DIVU A9,A0
|
||
MOVB A1,*A4 ;SAVE HERE
|
||
SUBK 8,A4
|
||
DEC A3 ;DECREMENT THE WIDTH
|
||
MOVE A0,A1
|
||
JRNZ SCTODEC2 ;BR = NOT DONE YET
|
||
|
||
MOVE A3,A3
|
||
JRZ SCTODEC3A ;WIDTH HAS BEEN FULFILLED
|
||
JRN SCTODEC3A ;THANX TI
|
||
CLR A1
|
||
SCTODEC31:
|
||
MOVB A1,*A4 ;STUFF THE LEADER
|
||
SUBK 8,A4
|
||
DSJS A3,SCTODEC31
|
||
SCTODEC3A:
|
||
MOVI STRNGRAM,A0 ;PASS THE NEW STRING BACK
|
||
|
||
MMFM SP,A1,A3,A4,A9
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PLAYER LIFE ROUTINES *
|
||
* *
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* AWARD_EXTRAS - AWARD ONE EXTRA MAN TO ALL ACTIVE PLAYERS. *
|
||
* NOTE: CALL WITH JSRP *
|
||
* *
|
||
**************************************************************************
|
||
AWARD_EXTRAS
|
||
ALLPLYR AWEB
|
||
RETP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* AWEB - AWARD ONE EXTRA MAN TO PLAYER IF ACTIVE AT THE *
|
||
* TIME OF CALLING. *
|
||
* A2 = PTR TO PLAYER DATA *
|
||
* *
|
||
**************************************************************************
|
||
AWEB
|
||
PUSH A0
|
||
MOVE *A2(POBJ),A0,L
|
||
JRZ AWEB_X
|
||
CALLR ADDLIFE
|
||
AWEB_X
|
||
PULL A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* ADD LIFE *
|
||
* A0 = # OF LIVES TO ADD *
|
||
* A2 = PLINDX=PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
*
|
||
*ADD ONE LIFE
|
||
ADDLIFE:
|
||
MOVI [1,0],A0
|
||
*
|
||
*ADD N LIFE(VES)
|
||
ADDNLIFE
|
||
MOVE *A2(POBJ),A14,L ;IS THIS GUY ALIVE?
|
||
JRZ AL_XXX ;BR = NO, THEN DON'T ADD LIFE
|
||
MMTM SP,A0,A1,A3
|
||
MOVE *A2(PLIVES),A1,L ;CURRENT # OF LIVES
|
||
ADD A0,A1
|
||
MOVE A1,*A2(PLIVES),L
|
||
*** CALLR OUTLIVES
|
||
MMFM SP,A0,A1,A3
|
||
AL_XXX
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SUBLIFE - SUBTRACT LIFE ENERGY FROM THE PLAYER. *
|
||
* A0 = ENERGY TO SUBTRACT [INT,FRAC] *
|
||
* A2 = PTR PLAYER DATA AREA *
|
||
* RETURN(S): *
|
||
* C = ENERGY DEPLETED *
|
||
* *
|
||
**************************************************************************
|
||
SUBLIFE:
|
||
MMTM SP,A0,A1,A5
|
||
|
||
.if BILL
|
||
; JRUC SL_CLRC
|
||
.endif
|
||
|
||
.IF NO_DEATH
|
||
JRUC SL_CLRC
|
||
.ENDIF
|
||
|
||
MOVE @GAME_STATE,A1,W
|
||
CMPI INAMODE,A1
|
||
JREQ SL_CLRC
|
||
|
||
MOVE *A2(PINVINCIBLE),A1,W ;IS THIS PLAYER INVINCIBLE?
|
||
JRNZ SL_CLRC ;BR = YES, NO SUBTRACTING
|
||
|
||
MOVE *A2(PSHIELD),A1,L ;Get current shield value
|
||
JRZ SUB_NORM ;BR = No shield
|
||
|
||
SUB A0,A1
|
||
JRGT SUB_STORE_SHIELD ;BR = More shield left
|
||
CLR A1
|
||
CALLR PLAYER_SHIELD_DONE
|
||
SUB_STORE_SHIELD
|
||
MOVE A1,*A2(PSHIELD),L ;Clear the shield value
|
||
JRUC SL_CLRC
|
||
|
||
SUB_NORM
|
||
MOVE *A2(PLIVES),A1,L ;GET REMAINING # OF LIVES
|
||
JRLE SUBLF1 ;WE'VE HIT BOTTOM
|
||
MOVE @BOSS_PUNISH,A14,W
|
||
JRZ SUB_PROTECT ;BR = HAVE MERCY ON THE PLAYER
|
||
SUB A0,A1 ;DO A STRAIGHT SUBTRACT OF LIFE
|
||
JRUC SUB_OK
|
||
SUB_PROTECT
|
||
MOVE *A2(PSECLIFE),A5,L
|
||
MOVE *A2(PTOTTIME),A14,W
|
||
MPYU A14,A5 ;ALLOWED TO LOSE THIS MUCH
|
||
SRL 16,A5
|
||
MOVE *A2(PINITLIFE),A14,W
|
||
SUB A5,A14 ;MIN LEVEL CURRENTLY ALLOWED
|
||
|
||
*A4 = INTEGER MINIMUM ENERGY
|
||
SLL 16,A14
|
||
SUB A0,A1
|
||
CMP A14,A1 ;DID WE GO LOWER THAN THE MINIMUM?
|
||
JRGE SUB_OK ;BR = NO, USE WHAT WE HAVE
|
||
MOVE A14,A1
|
||
*JUMP HERE WHEN YOU HAVE VALUE TO STUFF BACK
|
||
*A1 = LIFE VALUE
|
||
SUB_OK
|
||
MOVE A1,*A2(PLIVES),L
|
||
MOVE A1,A1 ;IS THAT IT?
|
||
JRLE SUBLF1 ;BR = YES
|
||
SL_CLRC
|
||
CLRC
|
||
JRUC SUBLFX
|
||
SUBLF1:
|
||
SETC
|
||
SUBLFX:
|
||
MMFM SP,A0,A1,A5
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* THE FOLLOWING IS THE BASIC LAYOUT OF THE PLAYERS LIFE AND *
|
||
* GUN STATUS OVERLAY. EACH PART IS A DIFFERENT OBJECT. ALL *
|
||
* OBJECT POINTERS ARE STORED IN PDATA. IF A PTR IS ZERO, THE *
|
||
* OBJECT CURRENTLY DOES NOT EXIST. *
|
||
* *
|
||
* <EFBFBD> <EFBFBD> *
|
||
* <EFBFBD> <EFBFBD> *
|
||
* <EFBFBD> <EFBFBD> *
|
||
* <EFBFBD> <EFBFBD> *
|
||
* <EFBFBD> <EFBFBD> *
|
||
* <EFBFBD> <EFBFBD> *
|
||
* <EFBFBD> <EFBFBD> *
|
||
* E E *
|
||
* N N *
|
||
* E E *
|
||
* R R *
|
||
* G G *
|
||
* Y Y *
|
||
* <EFBFBD> GUN:STUN <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GUN: KILL <EFBFBD> *
|
||
* *
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OUTLIVES - OUTPUT PLAYER ENERGY BAR. *
|
||
* A2 = PTR TO PLAYER DATA AREA *
|
||
* RETURNS: *
|
||
* NOTHING *
|
||
* NOTE: TRASHES A14 *
|
||
* *
|
||
**************************************************************************
|
||
OUTLIVES:
|
||
MMTM SP,A0,A1,A2,A3,A4,A7,A8
|
||
MOVE *A2(PLIVES),A1,L ;CURRENT ENERGY LEVEL
|
||
JRUC OUTLIVES_G
|
||
*
|
||
*ENTRYPOINT FOR OUTLIVES, BUT PLOT LEVEL PASSED IN A1
|
||
*
|
||
OUTLIVES_A1
|
||
MMTM SP,A0,A1,A2,A3,A4,A7,A8
|
||
OUTLIVES_G
|
||
MOVE A1,*A2(PLASTLPLOT),L ;KEEP IT AS OUR LAST PLOT
|
||
|
||
MOVE @GAME_STATE,A14,W
|
||
CMPI INAMODE,A14
|
||
JREQ OUTENX ;NO ENERGY OUTPUT DURING ATTRACT MODE
|
||
|
||
MOVE *A2(POBJ),A14,L
|
||
JRZ OUTEN_DEL ;BR = NO LIFE BAR FOR DEAD GUY
|
||
|
||
MOVE A1,A1
|
||
JRZ OUTEN_DEL ;BR = NO ENERGY, DELETE THE OBJECT
|
||
|
||
CLR A4
|
||
MOVE *A2(PEBAROBJ),A8,L ;GET THE ENERGY BAR OBJECT
|
||
JRNZ OL_OBJEXISTS ;BR = GOOD, THE OBJECT EXISTS
|
||
MOVE A4,*A2(PECOLOR),W ;CLEAR THE CURRENT BAR COLOR VALUE
|
||
INC A4
|
||
MOVI PLIFEBAR_TAB,A3
|
||
CALLR MAKE_PSTATUS_MULTI ;CREATE THE STATUS OBJECT
|
||
JRZ OUTENX
|
||
CALLA OBJ_OFF
|
||
CALLA INSERT_OBJ
|
||
MOVE A8,*A2(PEBAROBJ),L
|
||
|
||
OL_OBJEXISTS
|
||
MOVE *A2(PENRGSIZ),A7,L ;GET # OF LIFE UNITS/ENERGY UNIT
|
||
DIVU A7,A1 ;A11 = LIVES/(LIVES/UNIT) = UNITS
|
||
|
||
MOVI NNRGUNIP,A7
|
||
CMP A7,A1 ;ARE WE WITHIN MAX SIZE?
|
||
JRLE OL_MAXOK ;BR = YES
|
||
MOVE A7,A1
|
||
JRUC OL_PLOT
|
||
OL_MAXOK
|
||
CMPI 4,A1 ;ARE WE GREATER THAN THE MIN GUN SIZE
|
||
JRGE OL_PLOT ;BR = YES
|
||
MOVK 4,A1 ;THIS SHALL BE THE MIN
|
||
OL_PLOT
|
||
MOVE A1,A3 ;KEEP THE NEW SIZE
|
||
SUB A1,A7
|
||
ABS A7 ;A7 = LEFT CLIP
|
||
SLL 8,A7
|
||
MOVE A7,*A8(OFSET),W
|
||
|
||
MOVE A4,A4 ;WAS THE OBJECT OFF?
|
||
JRZ OUTEN_COLORS ;BR = NO
|
||
CALLA OBJ_ON
|
||
|
||
*A3 = CURRENT VERTICAL SIZE OF LIFE BAR
|
||
OUTEN_COLORS
|
||
SRL 3,A3 ;DIVIDE SIZE BY 8
|
||
SLL 4,A3
|
||
MOVE A3,A0
|
||
ADDI ENERGY_COLORS,A0
|
||
MOVE *A0,A3
|
||
CMPM *A2(PECOLOR),A3,W ;ARE WE OF THE CORRECT COLOR?
|
||
JREQ OUTEN_COLORED
|
||
|
||
MOVE A3,*A2(PECOLOR),W ;KEEP THE LATEST COLOR CHANGE
|
||
|
||
MOVE A0,A1
|
||
CALLA GPLAYNUM
|
||
INC A0
|
||
SWAP A0,A1
|
||
SLL 8,A1
|
||
ORI 40,A1
|
||
MOVK 1,A2
|
||
CALLA PALSET
|
||
OUTEN_COLORED
|
||
|
||
OUTENX
|
||
MMFM SP,A0,A1,A2,A3,A4,A7,A8
|
||
RETS
|
||
|
||
*DELETE THE ENERGY BAR
|
||
OUTEN_DEL
|
||
CLR A3
|
||
MOVE *A2(PEBAROBJ),A8,L ;PLAYER SCORE ADDRESS
|
||
JRZ OUTEN_COLORS ;BR = ALREADY GONE
|
||
CALLA DELETE_OBJ
|
||
CLRM *A2(PEBAROBJ),L
|
||
JRUC OUTEN_COLORS
|
||
|
||
*
|
||
*PLAYERS LIFE GRADATION BARS
|
||
*
|
||
PLIFEBAR_TAB
|
||
.LONG P1LIFEBAR_INIT,P2LIFEBAR_INIT,P3LIFEBAR_INIT
|
||
|
||
P1LIFEBAR_INIT
|
||
.byte 2, 0, 0, 2 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long REDPLAYR, P_REDHIT ;PAL LIST
|
||
.word OID_P1, OM_COLL
|
||
.LONG DUMCOLL
|
||
|
||
LWWWW X1LIFEBAR1b, DMAWNZ|M_LRCLIP, M_SCRNOBJ, 0, OM_CFUNC
|
||
LW C_OCONST, STATUS_FLASH_COLOR
|
||
LWWWW PLAY_HIT1_R, DMAWNZ, M_SCRNOBJ|M_NOPARTANI|M_NODISP|M_NOSCALE, 0, OM_CFUNC
|
||
LW C_OCONST, 0101H
|
||
|
||
P2LIFEBAR_INIT
|
||
.byte 2, 0, 0, 2 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long YELPLAYR, P_YELHIT ;PAL LIST
|
||
.word OID_P2, OM_COLL
|
||
.LONG DUMCOLL
|
||
|
||
LWWWW X2LIFEBAR1b, DMAWNZ|M_LRCLIP, M_SCRNOBJ, 0, OM_CFUNC
|
||
LW C_OCONST, STATUS_FLASH_COLOR
|
||
LWWWW PLAY_HIT1_Y, DMAWNZ, M_SCRNOBJ|M_NOPARTANI|M_NODISP|M_NOSCALE, 0, OM_CFUNC
|
||
LW C_OCONST, 0101H
|
||
|
||
P3LIFEBAR_INIT
|
||
.byte 2, 0, 0, 2 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long BLUPLAYR, P_BLUHIT ;PAL LIST
|
||
.word OID_P3, OM_COLL
|
||
.LONG DUMCOLL
|
||
|
||
LWWWW X3LIFEBAR1b, DMAWNZ|M_LRCLIP, M_SCRNOBJ, 0, OM_CFUNC
|
||
LW C_OCONST, STATUS_FLASH_COLOR
|
||
LWWWW PLAY_HIT1_B, DMAWNZ, M_SCRNOBJ|M_NOPARTANI|M_NODISP|M_NOSCALE, 0, OM_CFUNC
|
||
LW C_OCONST, 0101H
|
||
|
||
|
||
;P1LIFEBAR_INIT
|
||
; .LONG X1LIFEBAR1b,DUMCOLL
|
||
; .WORD OID_P1,DMAWNZ|M_LRCLIP,M_SCRNOBJ,0
|
||
; .LONG 0
|
||
|
||
;P2LIFEBAR_INIT
|
||
; .LONG X2LIFEBAR1b,DUMCOLL
|
||
; .WORD OID_P2,DMAWNZ|M_LRCLIP,M_SCRNOBJ,0
|
||
; .LONG 0
|
||
|
||
;P3LIFEBAR_INIT
|
||
; .LONG X3LIFEBAR1b,DUMCOLL
|
||
; .WORD OID_P3,DMAWNZ|M_LRCLIP,M_SCRNOBJ,0
|
||
; .LONG 0
|
||
|
||
|
||
ENERGY_COLORS
|
||
.word 07C00H,07C00H,07D20H,07DC0H,07E00H,07E60H
|
||
.word 07EE0H,07F60H,07FE0H,07FE8H,07FEEH,07FF3H
|
||
.word 07FFFH,07FFFH
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OUTENERGYWORD - ROUTINE TO OUTPUT ENERGY WORD. *
|
||
* A2 = PTR TO PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
OUTENERGYWORD
|
||
rets
|
||
MMTM SP,A1,A3,A4,A7,A8
|
||
; MOVI T1ENERENE,A1
|
||
JRUC OUTED_G
|
||
**************************************************************************
|
||
* *
|
||
* OUTDANGERWORD - ROUTINE TO OUTPUT DANGER WORD. *
|
||
* A2 = PTR TO PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
OUTDANGERWORD
|
||
rets
|
||
MMTM SP,A1,A3,A4,A7,A8
|
||
; MOVI T1ENERDAN,A1
|
||
|
||
OUTED_G
|
||
CLR A7
|
||
MOVE *A2(PEWORDOBJ),A8,L ;GET THE ENERGY BAR OBJECT
|
||
JRNZ OED_OBJEXISTS ;BR = GOOD, THE OBJECT EXISTS
|
||
INC A7
|
||
MOVI PLIFEBAR_TAB,A3
|
||
CALLR MAKE_PSTATUS_MULTI ;CREATE THE STATUS OBJECT
|
||
JRZ OED_X
|
||
CALLA OBJ_OFF
|
||
CALLA INSERT_OBJ
|
||
MOVE A8,*A2(PEWORDOBJ),L
|
||
|
||
OED_OBJEXISTS
|
||
MOVE *A8(OFLAGS),A4,W
|
||
CALLA ANI
|
||
MOVE A7,A7
|
||
JRZ OED_X
|
||
CALLA OBJ_ON
|
||
OED_X
|
||
MMFM SP,A1,A3,A4,A7,A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* LEVEL_UPDATE - PROCESS TO UPDATE PLAYER LIFE AND GUN POWER LEVELS *
|
||
* AT A LEVEL RATE. *
|
||
* *
|
||
**************************************************************************
|
||
LEVEL_UPDATE
|
||
; ALLPLYR START_DW
|
||
LU_LP
|
||
ALLPLYR PLOT_LEVELS
|
||
SLOOP 3,LU_LP
|
||
*
|
||
*PLOT_LEVELS - SUBROUTINE FOR LEVEL_UPDATE ONLY, TRASHES ANY REGS
|
||
* IT USES.
|
||
*A2 = PTR TO PLAYER DATA AREA
|
||
*
|
||
PLOT_LEVELS
|
||
MOVE *A2(PLIVES),A0,L
|
||
MOVE *A2(PLASTLPLOT),A1,L
|
||
CMP A0,A1 ;IS THE LIFE LEVEL CORRECT?
|
||
JREQ PL_X ;BR = YES
|
||
SUB A1,A0
|
||
JRLT PL_DROPPING
|
||
*BAR RISING
|
||
CMPI [1,0],A0 ;SMALL JUMP?
|
||
JRLS PL_PADDL ;BR = YES
|
||
MOVI [1,0],A0 ;MELLOW PLOTAGE
|
||
JRUC PL_PADDL
|
||
*BAR DROPPING
|
||
PL_DROPPING
|
||
ABS A0
|
||
CMPI [1,0],A0 ;SMALL JUMP?
|
||
JRLS PL_ADDA0L ;BR = YES
|
||
CMPI [15,0],A0 ;BIG JUMP?
|
||
JRHS PL_ADDA0L ;BR = YES, PLOT IT
|
||
MOVI [1,0],A0 ;MELLOW PLOTAGE
|
||
PL_ADDA0L
|
||
NEG A0
|
||
PL_PADDL
|
||
ADD A0,A1
|
||
CALLR OUTLIVES_A1
|
||
PL_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* START_DW - ROUTINE TO START THE DANGER WATCH PROCESS FOR A PLAYER. *
|
||
* A2 = PTR TO PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
START_DW
|
||
MMTM SP,A0,A1,A7,A11
|
||
MOVE A2,A11
|
||
CREATE PID_IND,DANGER_WATCH
|
||
MMFM SP,A0,A1,A7,A11
|
||
RETS
|
||
|
||
*
|
||
*NUMBER OF LIFE UNITS LEFT AT WHICH THE PLAYER IS IN DANGER
|
||
*
|
||
DANGER_LEVEL .EQU 20
|
||
DANGER_MIN_SLEEP .EQU 6
|
||
**************************************************************************
|
||
* *
|
||
* DANGER_WATCH - PROCESS TO WATCH A PLAYERS LIFE LEVEL AND SCREAM *
|
||
* DANGER! IF HE IS LOW ON LIFE. *
|
||
* A11 = PTR TO PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
DANGER_WATCH
|
||
MOVE A11,A2
|
||
CALLA GPLAYNUM
|
||
SLL 5,A0
|
||
ADDI DANGER_SOUND_TAB,A0
|
||
MOVE *A0,A9,L ;GET SOUND CALL TO MAKE
|
||
|
||
DW_PLAYER_WATCH
|
||
MOVE *A11(POBJ),A14,L
|
||
JRNZ DW_NORMAL_LP
|
||
SLOOP 5,DW_PLAYER_WATCH
|
||
|
||
DW_NORMAL_LP
|
||
MOVE *A11(PLIVES+16),A10,W ;GET THE CURRENT LIFE AMOUNT
|
||
CMPI DANGER_LEVEL,A10 ;TOO LOW?
|
||
JRLE DW_IN_DANGER ;BR = YES, HE'S IN DANGER
|
||
SLOOP 1,DW_NORMAL_LP
|
||
|
||
DW_IN_DANGER
|
||
SLEEP 1
|
||
MOVE A11,A2
|
||
**** MOVI NRGLOW_TAB,A0
|
||
**** CALLA DO_HEADS_UP ;PUT UP THE MESSAGE
|
||
**** CALLR OUTDANGERWORD ;PLOP THE WORD DANGER
|
||
MOVE *A11(PEWORDOBJ),A8,L
|
||
JRNZ DW_DWORD_OK
|
||
SLOOP 1,DW_NORMAL_LP
|
||
|
||
DW_DWORD_OK
|
||
CALLA OBJ_ON
|
||
MOVE *A11(PLIVES),A10,L ;IS THIS PLAYER GONE?
|
||
JRLE DW_PLAYER_WATCH ;BR = YES, NO MORE
|
||
SRL 16,A10
|
||
CMPI DANGER_MIN_SLEEP,A10 ;MINIMUM SLEEP TIME?
|
||
JRHS DW_DSLEEP_OK ;BR = NO
|
||
MOVK DANGER_MIN_SLEEP,A10 ;DEFAULT ON MINIMUM
|
||
DW_DSLEEP_OK
|
||
CMPI DANGER_LEVEL,A10 ;STILL IN DANGER?
|
||
JRHI DW_OUT_OF_DANGER ;BR = NO
|
||
|
||
MOVE @GAME_STATE,A14,W
|
||
CMPI INPLAY,A14
|
||
JRNE DW_SKIP_SND
|
||
MOVE A9,A0
|
||
; CALLA ONESND
|
||
DW_SKIP_SND
|
||
SLEEPR A10
|
||
CALLA OBJ_OFF
|
||
SLOOPR A10,DW_DWORD_OK
|
||
|
||
DW_OUT_OF_DANGER
|
||
MOVE A11,A2
|
||
**** CALLR OUTENERGYWORD ;PLOP THE WORD ENERGY
|
||
SLOOP 1,DW_NORMAL_LP
|
||
|
||
|
||
DANGER_SOUND_TAB
|
||
.LONG P1_DANGER_SND, P2_DANGER_SND
|
||
|
||
P1_DANGER_SND
|
||
.WORD 0F201H,1,08082H,0 ;PLAYER ONE DANGER SOUND
|
||
P2_DANGER_SND
|
||
.WORD 0F201H,1,08083H,0 ;PLAYER TWO DANGER SOUND
|
||
|
||
**************************************************************************
|
||
* *
|
||
* MAKE_PSTATUS_MULTI *
|
||
* *
|
||
* Make a player status object. Treats it as a multi-parter *
|
||
* *
|
||
* A2 = Ptr to player data area *
|
||
* A3 = Table of status obj init tables *
|
||
* *
|
||
* Returns: *
|
||
* Z = Could not create object (A8 = undefined) *
|
||
* NZ = Successfully created (A8 = Un-inserted object) *
|
||
* *
|
||
**************************************************************************
|
||
MAKE_PSTATUS_MULTI
|
||
MMTM SP,A0,A1,A3,A5
|
||
MMTM SP,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
||
|
||
CALLA GPLAYNUM
|
||
|
||
MOVE @NPLAYERS,A14,W
|
||
DEC A14
|
||
JRGT MPM_3PLAY ;BR = This is a three player game
|
||
*
|
||
* This is a funky hack to make player 2, use player 3's colors when
|
||
* we are setup for a two-player max model. Thanx Jack!
|
||
*
|
||
CMPK 1,A0
|
||
JRNE MPM_3PLAY ;BR = This is not player 2
|
||
|
||
INC A0 ;Use player 3's colors
|
||
|
||
MPM_3PLAY
|
||
SLL 5,A0
|
||
ADD A3,A0
|
||
MOVE *A0,A5,L
|
||
MOVE A5,B0 ;Get the proper init table
|
||
CALLA MULTIMAKE
|
||
JRZ MPM_X ;BR = Object(s) not allocated
|
||
|
||
MOVE *A2(PSTATUSXY),A3,L
|
||
MOVE A8,A0
|
||
MPM_POS_LOOP
|
||
CALLA OBJTOPNT
|
||
MOVE *A0(OPARTS),A0,L
|
||
JRNZ MPM_POS_LOOP
|
||
|
||
MOVI (PIZPOS+1) << 16,A1
|
||
CALLA STORE_ZVAL
|
||
|
||
MOVE A8,A8
|
||
MPM_X
|
||
MMFM SP,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
||
MMFM SP,A0,A1,A3,A5
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FLASH_PSTATUS - FLASH THE PLAYERS STATUS BARS. *
|
||
* A2 = PTR TO PLAYER *
|
||
* *
|
||
**************************************************************************
|
||
FLASH_PSTATUS
|
||
MMTM SP,A1,A8
|
||
MOVE *A2(PEBAROBJ),A8,L
|
||
JRZ FP_EW
|
||
|
||
MOVB *A8(OFLAGS+B_ANIM-7),A14
|
||
JRN FP_EW ;BR = Already flashing
|
||
|
||
MOVI FS_UNFLASH,A1
|
||
CALLA STRT_ANIM
|
||
|
||
CALLA OBJ_CONST
|
||
|
||
MOVE *A2(PSHIELD),A14,L
|
||
JRNZ FP_EW ;BR = No HIT while shielded
|
||
|
||
MOVE *A8(OPARTS),A8,L ;Get the HIT object
|
||
|
||
ANDNIM M_NODISP,*A8(OFLAGS),W
|
||
|
||
CALLA OBJ_CONST
|
||
|
||
MOVI FS_HIT_DISSIPATE,A1
|
||
CALLA STRT_ANIM
|
||
|
||
FP_EW
|
||
; MOVE *A2(PEWORDOBJ),A8,L
|
||
; JRZ FP_GB
|
||
; CALLR FLASH_STAT
|
||
;FP_GB
|
||
; MOVE *A2(PGBAROBJ),A8,L
|
||
; JRZ FP_GW
|
||
; CALLA FLASH_STAT
|
||
;FP_GW
|
||
; MOVE *A2(PGWORDOBJ),A8,L
|
||
; JRZ FP_SFLASH
|
||
; CALLA FLASH_STAT
|
||
FP_SFLASH
|
||
MOVE *A2(PSCOREFLASH),A14,W ;ARE WE FLASHING THE SCORE AREA?
|
||
JRNZ FP_X ;BR = YES, DO NOT FLASH AGAIN
|
||
MOVE *A2(PDEAD),A14,W ;IS HE MARKED AS DEAD?
|
||
JRNZ FP_X ;BR = YES, DO NOT FLASH
|
||
|
||
MMTM SP,A0,A2,A3,A4,A5,A7,A11
|
||
|
||
MOVI STATUS_FLASH_COLOR,A1 ;MAKE SCORE AREA THIS COLOR
|
||
SLL 16,A1 ; THIS IS THE CONSTANT DRAW COLOR
|
||
MOVE *A2(PPALID),A0,L ; LOOKUP THE CURRENT PALETTE
|
||
CALLA FINDPAL ; MAKE SURE IT HAS A PALETTE
|
||
MOVX A0,A1
|
||
|
||
MOVE A1,A7
|
||
MOVE *A2(PSCRAD),A3,L ;GET THE SCORE ADDRESS
|
||
MOVI BOX1d,A1 ;THIS IS OUR REFERENCE IMAGE
|
||
MOVI DMACNZ,A5 ;WRITE CONSTANT COLOR ALWAYS
|
||
MOVE A2,A11 ;KEEP PLAYER PTR HERE
|
||
|
||
MOVE A1,A14
|
||
CALLR SETUP_DMAN
|
||
MOVE *A1(IANIOFFX),A14,L
|
||
MOVE A7,A1
|
||
ADDI SCRCTR,A3 ; START OF TEXT
|
||
SUB A14,A3 ; ADJUST THE ANIMATION POINT
|
||
CALLA QDMAN2 ; OUTPUT THE SUCKER
|
||
|
||
MOVKM 1,*A11(PSCOREFLASH),W
|
||
CREATE PID_INDE,SCORE_REPLOT
|
||
|
||
MMFM SP,A0,A2,A3,A4,A5,A7,A11
|
||
|
||
FP_X
|
||
MMFM SP,A1,A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PLAYER_SHIELD *
|
||
* *
|
||
* Bring up the player shield message, in place of HIT. *
|
||
* *
|
||
* A2 = Ptr to player *
|
||
* *
|
||
**************************************************************************
|
||
PLAYER_SHIELD
|
||
MMTM SP,A1,A8
|
||
MOVE *A2(PEBAROBJ),A8,L
|
||
JRZ PS_X
|
||
|
||
MOVE *A8(OPARTS),A8,L ;Get the shield object
|
||
|
||
MOVI FS_SHIELD_START,A1
|
||
CALLA STRT_ANIM
|
||
PS_X
|
||
MMFM SP,A1,A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PLAYER_SHIELD_DONE *
|
||
* *
|
||
* Turn off shield message and put back the HIT. *
|
||
* *
|
||
* A2 = Ptr to player *
|
||
* *
|
||
**************************************************************************
|
||
PLAYER_SHIELD_DONE
|
||
MMTM SP,A1,A8
|
||
MOVE *A2(PEBAROBJ),A8,L
|
||
JRZ PSD_X
|
||
|
||
MOVE *A8(OPARTS),A8,L ;Get the shield object
|
||
|
||
MOVI FS_HIT_START,A1
|
||
CALLA STRT_ANIM
|
||
PSD_X
|
||
MMFM SP,A1,A8
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCORE_REPLOT - PROCESS TO REPLOT THE PLAYERS SCORE AREA AFTER *
|
||
* 4 TICKS. *
|
||
* A11 = PTR TO PLAYER DATA *
|
||
* *
|
||
**************************************************************************
|
||
SCORE_REPLOT
|
||
SLEEP 4
|
||
MOVE A11,A2
|
||
CALLR UPDSL
|
||
CLRM *A2(PSCOREFLASH),W
|
||
DIE
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FLASH_STAT - FLASH A STATUS OBJECT TO ITS CONSTANT COLOR. IF THE *
|
||
* STATUS OBJECT IS ALREADY ANIMATING THEN BAIL. *
|
||
* A1 = OCONST *
|
||
* *
|
||
**************************************************************************
|
||
FLASH_STAT:
|
||
PUSH A1
|
||
movb *A8(OFLAGS+B_ANIM-7),A14 ;already animating??
|
||
jrn FS_X ;YES
|
||
FlashIt
|
||
movi FS_UNFLASH,A1
|
||
calla STRT_ANIM
|
||
move *A8(OCTRL),A14,W
|
||
andni M_WRNONZ|M_WRZERO,A14 ;NO NORMAL WRITING
|
||
ori M_CONNON,A14 ;REPLACE ALL DATA
|
||
move A14,*A8(OCTRL),W
|
||
FS_X
|
||
PULLQ A1
|
||
rets
|
||
|
||
*
|
||
* FLASH ANIM SCRIPT
|
||
*
|
||
FS_UNFLASH
|
||
LW 1,4
|
||
LWL 1,1|AFunc,A_FS_UNFLASH_PULL
|
||
|
||
*
|
||
* HIT marker dissipates
|
||
*
|
||
FS_HIT_DISSIPATE
|
||
LW 1,2
|
||
LWL 1,2|AFunc,A_FS_UNFLASH
|
||
LWL 1,1|AFunc,OBJ_OFF
|
||
LWL 1,1|AFunc,PULL_ANIM
|
||
|
||
*
|
||
* "SHIELD UP" in place of hit
|
||
*
|
||
FS_SHIELD_START
|
||
LWL SHLDUP_R,1|AFunc,OBJ_ON
|
||
LWL 1,1|AFunc,A_FS_UNFLASH_PULL
|
||
|
||
*
|
||
* "HIT" marker resume
|
||
*
|
||
FS_HIT_START
|
||
LWL PLAY_HIT1_R,1|AFunc,OBJ_OFF
|
||
LWL 1,1|AFunc,A_FS_UNFLASH_PULL
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_FS_UNFLASH - ANIM FUNC TO UNFLASH A STATUS OBJECT. *
|
||
* *
|
||
**************************************************************************
|
||
A_FS_UNFLASH_PULL:
|
||
calla PULL_ANIM
|
||
A_FS_UNFLASH
|
||
move *A8(OCTRL),A1,W
|
||
ori M_WRNONZ,A1 ;Do Write Non-Zero Data
|
||
andni M_CONNON|M_CONZER,A1 ;Don't Replace ALL
|
||
move A1,*A8(OCTRL),W
|
||
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PRINT_SCORE - ROUTINE TO PLASTER A SCORE ON A GIVEN OBJECT. *
|
||
* *
|
||
* A1 = SCORE TO GIVE *
|
||
* A2 = PTR TO PLAYER RECIEVING *
|
||
* A8 = OBJECT TO PLASTER IT UPON *
|
||
* A9 = SCREEN OFFSET FROM CENTER OF OBJECT IN [Y,X] FORMAT *
|
||
* *
|
||
**************************************************************************
|
||
PRINT_SCORE:
|
||
MOVE A2,A2
|
||
JRZ PS_XXX
|
||
MMTM SP,A0,A1,A7,A8,A9,A10,A11
|
||
MOVE A1,A10
|
||
SRL 1,A1 ;SHIFT OUT FLAG
|
||
SLL 1,A1
|
||
CALLR SCORE ;AND GIVE SCORE
|
||
MOVE A2,A11 ;ALL IN PROPER PROCESS REGS
|
||
CREATE PID_INDE,SCOREOBJ
|
||
MMFM SP,A0,A1,A7,A8,A9,A10,A11
|
||
PS_XXX
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SCOREOBJ - PROCESS TO CREATE A SCORE OBJECT THEN TAKE IT AWAY. *
|
||
* *
|
||
* A8 = OBJECT TO PLASTER IT UPON *
|
||
* A9 = SCREEN OFFSET FROM CENTER OF OBJECT IN [Y,X] FORMAT *
|
||
* A10 = SCORE TO AWARD (BIT 0 FLAGS UPWARD MOTION ON IMAGE) *
|
||
* A11 = PTR TO PLAYER DATA *
|
||
* *
|
||
**************************************************************************
|
||
SCOREOBJ:
|
||
MOVI SCORETAB,A3
|
||
JRUC SCOBJ_EXE
|
||
*
|
||
*SCORE2XOBJ - SAME AS SCOREOBJ EXCEPT USES A DIFFERENT LOOK-UP TABLE
|
||
SCORE2XOBJ:
|
||
MOVI SCORETAB2X,A3
|
||
JRUC SCOBJ_EXE
|
||
|
||
SCOBJ_EXE
|
||
MOVE A10,A14 ;KEEP THE SCORE HERE
|
||
SRA 1,A14 ;SHIFT OUT FLAG
|
||
SLL 1,A14
|
||
SO_SCLP:
|
||
MOVE *A3+,A4,L
|
||
JRZ SO_DIE ;THE SCORE IMAGE CANNOT BE FOUND
|
||
CMP A4,A14
|
||
JREQ SO_SFOUND ;BR = FOUND A SCORE
|
||
ADDK 32,A1
|
||
JRUC SO_SCLP ;SEARCH AGAIN
|
||
|
||
SO_SFOUND:
|
||
MOVI SCRIMGINIT,A5
|
||
CALLA CREATE_OBJ
|
||
JRZ SO_DIE ;BR=OOPS!
|
||
|
||
; MOVE *A8(OID),A14,W
|
||
; ANDI MASK_TYPE,A14
|
||
; CMPI TYPE_ENEMY & MASK_TYPE,A14
|
||
; JRNE SO_NOENEMY ;BR=NOT AN ENEMY
|
||
|
||
BTST 0,A10
|
||
JRZ SO_NOMO ;BR=DON'T MOVE
|
||
|
||
MOVI -010000H,A14
|
||
MOVE A14,*A0(OYVEL),L ;MOVIN' ON UP
|
||
;SO_NOENEMY
|
||
SO_NOMO
|
||
MOVE *A8(OZVAL),A7,L
|
||
DEC A7 ;PLACE SCORE IN FRONT OF OBJECT
|
||
MOVE A7,*A0(OZVAL),L
|
||
|
||
MOVE *A8(OCTRL),A4,W
|
||
|
||
CALLA GET_CPNTU ;GET UNIV POSITIONS: X IN A2, Y IN A1
|
||
MOVE A9,A14 ;CONVERT SCRN X OFFSET TO WORLD
|
||
SEXT A14,W
|
||
BTST B_FLIPH,A4
|
||
JRZ SO_NOFLIPH ;BR=NO H-FLIP
|
||
NEG A14
|
||
SO_NOFLIPH
|
||
SLL 15,A14
|
||
ADD A14,A2 ;ADD X OFFSET
|
||
MOVE A2,*A0(OXVAL),L
|
||
SRA 16,A9 ;CONVERT SCRN Y OFFSET TO WORLD
|
||
BTST B_FLIPV,A4
|
||
JRZ SO_NOFLIPV ;BR=NO V-FLIP
|
||
NEG A9
|
||
SO_NOFLIPV
|
||
SLL 15,A9
|
||
ADD A9,A1 ;ADD Y OFFSET
|
||
MOVE A1,*A0(OYVAL),L
|
||
|
||
MOVE *A3,A1,L ;GET THE IMAGE
|
||
|
||
MOVE A0,A8
|
||
MOVE *A11(PPALID),A0,L
|
||
CALLA CHANGE_PAL ;CHANGE TO THE CORRECT PALETTE
|
||
|
||
MOVE *A8(OCTRL),A4,W
|
||
|
||
CALLA ANI ;CHANGE THE SCORE IMAGE
|
||
|
||
;THIS CODE IS DIABLED
|
||
;
|
||
; MOVE *A8(OUSIZE),A0,L
|
||
; MOVE *A8(OUANIOFF),A1,L
|
||
;
|
||
; CMPI 0E0H << Z2SCALE,A7
|
||
; JRHI SO_NOT2X ;BR = NOT DOUBLE SCALE
|
||
;;THE FOLLOWING WILL NOT WORK IF WE HAVE NEGATIVE ANIMATION POINTS
|
||
; SLL 1,A0 ;MULTIPLY BY 2
|
||
; SLL 1,A1
|
||
; MOVI 080H,A2
|
||
; JRUC SO_SCALEOK
|
||
;SO_NOT2X
|
||
; CMPI 0200H << Z2SCALE,A7
|
||
; JRLO SO_SCALE1TO1 ;BR = NOT HALF SCALE
|
||
; MOVE A0,A3 ;DIVIDE BY 2
|
||
; SRL 1,A3
|
||
; ZEXT A0,W
|
||
; SRL 1,A0
|
||
; MOVY A3,A0
|
||
; MOVE A1,A3
|
||
; SRL 1,A3
|
||
; ZEXT A1,W
|
||
; SRL 1,A1
|
||
; MOVY A3,A1
|
||
; MOVI 0200H,A2
|
||
;SO_SCALEOK
|
||
; MOVE A0,*A8(OSIZE),L
|
||
; MOVE A1,*A8(OANIOFF),L
|
||
; MOVE A2,*A8(OSCALEX),W
|
||
; MOVE A2,*A8(OSCALEY),W
|
||
;SO_SCALE1TO1
|
||
CALLA INSERT_OBJ
|
||
SLEEP 60 ;PAUSE THE SCORE FOR A SECOND
|
||
CALLA DELETE_OBJ ;RID O' THE OBJECT
|
||
SO_DIE:
|
||
DIE
|
||
|
||
*
|
||
*GENERIC SCORE IMAGE INIT TABLE
|
||
SCRIMGINIT:
|
||
.LONG SCR1000,DUMCOLL
|
||
.WORD OID_JUNK,DMAWNZ,M_NOSCALE|M_NOPIXSCAN,0
|
||
.LONG 0
|
||
|
||
*
|
||
*TABLE OF BCD SCORES AND THEIR ASSOCIATED IMAGES
|
||
* .LONG SCORE, PTR TO IMAGE
|
||
* .LONG 0
|
||
SCORETAB
|
||
SCORETAB2X
|
||
.LONG 500,SCR500
|
||
.LONG 1000,SCR1000,2000,SCR2000,3000,SCR3000,4000,SCR4000
|
||
.LONG 5000,SCR5000,6000,SCR6000,7000,SCR7000,8000,SCR8000
|
||
.LONG 9000,SCR9000,10000,SCR10000,15000,SCR15000
|
||
.LONG 20000,SCR20000,25000,SCR25000,40000,SCR40000
|
||
.LONG 80000,SCR80000,0
|
||
|
||
|
||
.IF 0 ;This is the scrap heap
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OUTGUN - OUTPUT PLAYER GUN ENERGY BAR. *
|
||
* A2 = PTR TO PLAYER DATA AREA *
|
||
* RETURNS: *
|
||
* NOTHING *
|
||
* NOTE: TRASHES A14 *
|
||
* *
|
||
**************************************************************************
|
||
OUTGUN
|
||
rets
|
||
MMTM SP,A1,A2,A3,A4,A5,A7,A8
|
||
MOVE *A2(PGUNPOWER),A1,W ;CURRENT GUN ENERGY LEVEL
|
||
JRUC OUTGUN_G
|
||
*
|
||
*ENTRYPOINT FOR OUTGUN, BUT PLOT LEVEL PASSED IN A1
|
||
*
|
||
OUTGUN_A1
|
||
MMTM SP,A1,A2,A3,A4,A5,A7,A8
|
||
OUTGUN_G
|
||
MOVE A1,*A2(PLASTGPLOT),W ;KEEP IT AS OUR LAST PLOT
|
||
|
||
MOVE @GAME_STATE,A3,W
|
||
CMPI INAMODE,A3
|
||
JREQ OUTGUNX ;NO ENERGY OUTPUT DURING AMODE
|
||
|
||
MOVE *A2(POBJ),A8,L
|
||
JRZ OUTGUN_DEL ;BR = NO GUN BAR FOR DEAD GUY
|
||
|
||
MOVE A1,A1
|
||
JRZ OUTGUN_DEL ;BR = NO GUN, DELETE THE OBJECT
|
||
|
||
CLR A4
|
||
MOVE *A2(PGBAROBJ),A8,L ;GET THE GUN BAR OBJECT
|
||
JRNZ OG_OBJEXISTS ;BR = GOOD, THE OBJECT EXISTS
|
||
INC A4
|
||
MOVI PGUNBAR_TAB,A3
|
||
CALLA MAKE_PSTATUS ;CREATE THE STATUS OBJECT
|
||
JRZ OUTGUNX
|
||
CALLA OBJ_OFF
|
||
CALLA INSERT_OBJ
|
||
MOVE A8,*A2(PGBAROBJ),L
|
||
OG_OBJEXISTS
|
||
|
||
MOVE *A2(PGUNMULT),A7,L ;GET GUN MULTIPLIER
|
||
MPYU A7,A1 ;MAKE OUR SIZE
|
||
SRL 16,A1 ;THIS IS THE HORIZONTAL SIZE WE NEED
|
||
JREQ OUTGUN_DEL ;BR = OOPS WENT TO ZERO
|
||
CMPI GUNENERGY,A1 ;ARE WE BIGGER THAN THE MAX
|
||
JRLS OG_SOK
|
||
MOVI GUNENERGY,A1 ;DEFAULT ON MAX
|
||
OG_SOK
|
||
MOVE *A8(OSIZEX),A3,W
|
||
SUB A1,A3
|
||
|
||
CMPI P1DATA,A2
|
||
JRNE OG_P2
|
||
|
||
MOVE A3,A2
|
||
CLR A3
|
||
JRUC OG_OBJCLIP
|
||
OG_P2
|
||
CLR A2
|
||
OG_OBJCLIP
|
||
CALLR CLIP_GUNBAR
|
||
|
||
MOVE A4,A4 ;WAS THE OBJECT OFF?
|
||
JRZ OUTGUNX ;BR = NO
|
||
CALLA OBJ_ON
|
||
|
||
OUTGUNX
|
||
MMFM SP,A1,A2,A3,A4,A5,A7,A8
|
||
RETS
|
||
|
||
*DELETE THE GUN BAR
|
||
OUTGUN_DEL
|
||
MOVE *A2(PGBAROBJ),A8,L ;GET GUN BAR OBJECT
|
||
JRZ OUTGUNX ;BR = ALREADY GONE
|
||
CALLA DELETE_OBJ
|
||
CLRM *A2(PGBAROBJ),L
|
||
JRUC OUTGUNX
|
||
|
||
*
|
||
*PLAYERS GUN GRADATION BARS
|
||
*
|
||
PGUNBAR_TAB
|
||
.LONG P1GUNBAR_INIT,P2GUNBAR_INIT
|
||
|
||
P1GUNBAR_INIT
|
||
.LONG T1GUNBAR,DUMCOLL
|
||
.WORD OID_JUNK,DMAWNZ|M_SCRNOBJ,0
|
||
.LONG 0
|
||
|
||
P2GUNBAR_INIT
|
||
.LONG T2GUNBAR,DUMCOLL
|
||
.WORD OID_JUNK,DMAWNZ|M_SCRNOBJ,0
|
||
.LONG 0
|
||
|
||
**************************************************************************
|
||
* *
|
||
* CLIP_GUNBAR - ROUTINE TO CLIP GUN BAR OBJECT *
|
||
* A2 = RIGHT CLIP (RELATIVE TO CURRENT SIZE) *
|
||
* A3 = LEFT CLIP (RELATIVE TO CURRENT SIZE) *
|
||
* A8 = OBJECT BLOCK *
|
||
* RETURNS *
|
||
* NOTHINE *
|
||
* *
|
||
**************************************************************************
|
||
CLIP_GUNBAR
|
||
MMTM SP,A0,A2,A3,A4,A9,A11,A12
|
||
MOVE A8,A0
|
||
MOVE *A8(OXPOS),A4,W
|
||
ADDI OFLAGS,A0 ;GET INDEX INTO OBJECT STRUCTURE
|
||
|
||
* A9= VS:HS
|
||
* A11= SAG
|
||
* A12= OFFSET:FLAGS
|
||
MMFM A0,A9,A11,A12
|
||
|
||
*
|
||
*CLIP THE SAG, HS, AND ADJUST OFFSET
|
||
*
|
||
MOVE @NO_MIRROR,A14,W
|
||
JRZ CGB_MIRROR
|
||
|
||
ADD A3,A2 ;RC+LC
|
||
MOVE A9,A14
|
||
SUB A2,A14
|
||
SEXT A14 ;DID WE GO TOO FART?
|
||
JRGT CGB_NM_SOK
|
||
MOVK 1,A14 ;MIN SIZE
|
||
CGB_NM_SOK
|
||
*** SUB A2,A9 ;DECREASE OBJECT SIZE ACCORDINGLY
|
||
MOVX A14,A9
|
||
ADD A3,A4 ;ADD LEFT CLIP TO X POSITION
|
||
|
||
BTST B_FLIPH,A12 ;TEST WHILE NOT MIRRORED
|
||
JREQ CGB_NOFLIP
|
||
JRUC CGB_FLIPPED
|
||
|
||
CGB_MIRROR
|
||
SWAP A2,A3 ;SWAP LEFT AND RIGHT CLIP FOR MIRROR
|
||
ADD A2,A4 ;ADD LEFT CLIP TO X POSITION
|
||
ADD A3,A2 ;RC+LC
|
||
|
||
MOVE A9,A14
|
||
SUB A2,A14
|
||
SEXT A14 ;DID WE GO TOO FART?
|
||
JRGT CGB_M_SOK
|
||
MOVK 1,A14 ;MIN SIZE
|
||
CGB_M_SOK
|
||
*** SUB A2,A9 ;DECREASE OBJECT SIZE ACCORDINGLY
|
||
MOVX A14,A9
|
||
|
||
BTST B_FLIPH,A12 ;TEST WHILE MIRRORING
|
||
JRNE CGB_NOFLIP
|
||
CGB_FLIPPED
|
||
NEG A2 ;NEGATE RC+LC
|
||
NEG A3 ;NEGATE LC
|
||
CGB_NOFLIP
|
||
SLL 3,A3
|
||
ADD A3,A11 ;ADD TO SAG
|
||
SLL 16,A2
|
||
ADDXY A2,A12 ;CHANGE THE OFFSET
|
||
|
||
PUSHST
|
||
DINT
|
||
MMTM A0,A9,A11,A12
|
||
MOVE A4,*A8(OXPOS),W
|
||
POPST
|
||
|
||
MMFM SP,A0,A2,A3,A4,A9,A11,A12
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OUTGUNWORD - ROUTINE TO OUTPUT THE GUN WORD OBJECT. *
|
||
* A2 = PTR TO PLAYER DATA AREA *
|
||
* *
|
||
**************************************************************************
|
||
OUTGUNWORD
|
||
rets
|
||
|
||
MMTM SP,A3,A8
|
||
MOVE *A2(PGWORDOBJ),A8,L ;GET THE CURRENT GUN WORD OBJECT
|
||
JRNZ OGW_X ;BR = GOOD, THE OBJECT EXISTS
|
||
MOVI PGUNWORD_TAB,A3
|
||
CALLA MAKE_PSTATUS ;CREATE THE STATUS OBJECT
|
||
JRZ OGW_X
|
||
CALLA INSERT_OBJ
|
||
MOVE A8,*A2(PGWORDOBJ),L
|
||
OGW_X
|
||
MMFM SP,A3,A8
|
||
RETS
|
||
|
||
|
||
*
|
||
*TABLE OF PLAYER GUN WORD INIT TABLES
|
||
*
|
||
PGUNWORD_TAB
|
||
.LONG P1GUNWORD_INIT,P2GUNWORD_INIT
|
||
|
||
*
|
||
*PLAYER GUN WORD INIT TABLES
|
||
*
|
||
P1GUNWORD_INIT
|
||
.LONG T1GUNGUN,DUMCOLL
|
||
.WORD OID_JUNK,DMAWNZ|M_SCRNOBJ,0
|
||
.LONG 0
|
||
|
||
P2GUNWORD_INIT
|
||
.LONG T2GUNGUN,DUMCOLL
|
||
.WORD OID_JUNK,DMAWNZ|M_SCRNOBJ,0
|
||
.LONG 0
|
||
|
||
*
|
||
* This goes on the end of PLOT_LEVELS
|
||
PL_GUN
|
||
MOVE *A2(PGUNPOWER),A0,W
|
||
MOVE *A2(PLASTGPLOT),A1,W
|
||
CMP A0,A1 ;IS THE GUN LEVEL CORRECT?
|
||
JREQ PL_DONE ;BR = YES
|
||
SUB A1,A0
|
||
MOVE A0,A14
|
||
ABS A0
|
||
CMPI 1,A0
|
||
JRLS PL_ADDA0G
|
||
MOVK 1,A0
|
||
PL_ADDA0G
|
||
MOVE A14,A14
|
||
JRNN PL_PADDG
|
||
NEG A0
|
||
PL_PADDG
|
||
ADD A0,A1
|
||
CALLR OUTGUN_A1
|
||
PL_DONE
|
||
RETS
|
||
|
||
.ENDIF
|
||
|
||
.END
|
||
|
||
|