trog/TROGSCOR.ASM

2403 lines
60 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 "TROGMACS.LIB"
.FILE 'TROGSCOR.ASM'
.TITLE " <<< T R O G -- SCORING ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "DISPEQU.ASM" ;Display processor equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "TROGEQU.ASM"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "TROGSCOR.TBL"
.INCLUDE "STRING.H"
.INCLUDE "TROGSEQU.ASM"
.INCLUDE "TROGAUDN.ASM"
.DEF UPDSL, OUTLIVES, OUTSCR, SUBLIFE, SEND2SCR, SENDOBJ
.DEF P1BOXBONEh, P1BOXBONEv, OUTEGGS
.DEF SCOREHILITE, P0_P1_SCORE, SCOREOBJ
.DEF SCORPROC, GAME_OVER_FLY
.DEF HIGHSCORECHECK, SCORE_IF_ACTIVE
.DEF G_CRED, BCDADD
.DEF ISLAND_NUM, SCIDONE
.DEF LOOKSTICK, LOOKFIRE
.DEF MARQUEE
.DEF SCORE2XOBJ
.DEF AWARD_EXTRAS
.REF CR_STRTP, CR_CONTP, CR_BOTH
.REF P_FORK, GET_CSTR
.REF PCYCLEHI,PCYCLELO
.REF CKHSTD,TRYADD, CHECK_INITS, GPLAYNUM, FAST_TIME
.REF STORY_MODE, ADD_HSHOLD, ALLOW_CONTINUE
.REF gwenegg, spikeegg, bloopegg, rexegg
.REF EGG_LIST, BONUS_WAVE, WAVEEGGS, EGG_SCHEME
.BSS PALINTENS,32 ; FOR PALETTE DECAY
.BSS WORKNUM,16
.BSS FUNKYCOLOR,32
.BSS CANSTRT,16
.BSS HISEEN,16 ; HOW MANY "HI"S IN A ROW
.EVEN
.TEXT
.IF 0
**************************************************************************
* *
* BIG_HSCHECK - CHECK IF A PLAYER MADE IT IN THE HIGH SCORE TAB. *
* AND GIVE HIM BIG INITIALS IF HE DID *
* A2 = PLAYER DATA *
* RETURNS: *
* Z = NO HIGH SCORE *
* NZ = HIGH SCORE CREATED *
* NOTE: TRASHES A14 *
* *
**************************************************************************
BIG_HSCHECK:
MMTM SP,A0,A1,A7,A8,A11
ADJUST ADJHSON
JRZ BHSRET
MOVE *A2(PSCORE),A0,L ; GET THE SCORE
CALLA CKHSTD
JRZ BHSRET ; BR = DIDN'T MAKE IT
MOVE *A2(PPID),A1,W
ORI PINITIALPID,A1
MOVI BIGSCORINIT,A7 ; PROCESS TO LAUNCH
MOVE A2,A11 ; PASS THE PLAYER DATA AREA
CALLA GETPRC ; FIRE AWAY
BHSRET
MMFM SP,A0,A1,A7,A8,A11
RETS
**************************************************************************
* *
* BIGSCORINIT *
* *
* BIGGIE SCORE INITIAL ENTRY THINGIE *
* *
* ENTRY *
* A11 PLAYER DATA AREA *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
BIGSCORINIT:
MOVI BIGINSMESS,A8
PUSH A11
CALLA LM_SETUP
JSRP PRINTF ; KICK IT OUT
PULL A11
MOVI TEXTOID,A0
MOVI JUNKOID,A1
CALLA CHANGOID ; CLEAN OUT ALL THE TEXT THINGS
MOVK 1,A0
MOVE A0,*A13(BIGSCORE),W ; FLAG IT AS "THE BIG TIME"
MOVE A11,A8
JRUC SCORRUN ; HANDLE EVERYTHING
BIGINSMESS:
MESS_MAC RD7FONT,1,197,(180+SKYTOPOF),TROG_PWHITE,STRCNRMO,0
.STRING "Use Up/Down Stick to change letters."
.STRING "\nEnter with BONE button.",0
.EVEN
.ENDIF
**************************************************************************
* *
* HIGHSCORECHECK *
* *
* A ROUTINE THAT IS CALLED WHEN THE PLAYER DIES *
* *
* ENTRY *
* A2 PLAYER DATA AREA *
* *
* EXIT *
* BLAH *
* *
* NOTE: TRASHES A14 *
* *
**************************************************************************
HIGHSCORECHECK:
MMTM SP,A0,A1,A7,A8
ADJUST ADJHSON
JREQ HSRET
MOVE *A2(PSCORE),A0,L ; GET THE SCORE
CALLA CKHSTD
JRZ HSRET ; BR = DIDN'T MAKE IT
MOVE *A2(PPID),A1,W
ORI PINITIALPID,A1
MOVI SCORINIT,A7 ; PROCESS TO LAUNCH
MOVE A2,A8 ; PASS THE PLAYER DATA AREA
CALLA GETPRC ; FIRE AWAY
JRZ HSRET
CLRM *A0(PCOMM),W
HSRET
MMFM SP,A0,A1,A7,A8
RETS
SCORINIT:
CLR A0
MOVE A0,*A13(BIGSCORE),W
JRUC SCORRUN
**************************************************************************
* *
* SCORRUN *
* *
* PROCESS TO SNAG THE PLAYER'S INITIALS *
* *
* ENTRY *
* A8 PLAYER DATA AREA *
* *A13(PCOMM),W = 0 *
* *
* EXIT *
* WOOF WOOF WHO CARES *
* *
* NOTE : *
* *
* PDATA CONTAINS SOME NEAT THINGS LIKE THE INITIALS. *
* *
* PCOMM IS USED AS A FLAG TO EXIT EARLY, IF THIS IS *
* <> 1 UPON WAKE UP THE PLAYER GETS WHAT HE HAS ENTERED. *
* *
* PCOMM MUST BE CLEARED BY THE GUY WHO STARTS THIS PROCESS *
* *
**************************************************************************
INITIAL1 EQU PDATA
INITIAL2 EQU PDATA+8
INITIAL3 EQU PDATA+16
PLANTLET EQU PDATA+32 ; FOR PLANTING STUFF
BDEBOUNCE EQU PLANTLET+32 ; DRAW BUTTON DEBOUNCE
JDIR EQU BDEBOUNCE+16 ; LAST JOYSTICK DIRECTION
JTIMER EQU JDIR+16 ; JOYSTICK TIMER COUNTER
LASTSEC EQU JTIMER+32 ; LAST TIME LOOKED AT
DIRTY EQU LASTSEC+16 ; SET IF HE ENTERED SOMETHING
BIGSCORE EQU DIRTY+16 ; 1 IF THE BIG SCORE ROUTINE
ADDTIMES EQU BIGSCORE+16 ; TIMES LEFT FOR ADDING TO TIME
ENTER_TIME EQU 15
MAX_TIMES EQU 4 ; SOME TOTALLY BOGUS NUMBER HERE
SCORRUN:
MOVE *A13(PROCID),A0,W
MOVI MAX_TIMES,A1
MOVE A1,*A13(ADDTIMES),W ; ONLY RESET TIME 3 TIMES
CLR A1
MOVE A1,*A13(LASTSEC),W ; CLEAR LAST TIME SEEN
MOVE A1,*A13(DIRTY),W ; HASN'T CHANGED ANTYHING
NOT A1
CALLA KILALL ;KILL ANY OTHER INITIAL PROCS FOR THIS PLAYER
MOVK 1,A0
MOVE A0,*A8(PDEAD),W ; TURN OFF SCORPROC
MOVE A8,A2
MOVE *A8(PSCRAD),A3,L
CALLR PSENCL
CLR A4 ; PALETTE 0
MOVE A2,A8
MOVI 20202020H,A0 ; " "
MOVE A0,*A13(INITIAL1),L ; SPACIZE THE INITIALS
MOVI 41H,A1
MOVB A1,*A13(INITIAL1) ; "A "
MOVK 1,A3 ; HIGHLIGHT THE FIRST CHAR
CALLR PLOTINITIALS
MOVK 1,A9 ; WORKING ON THE FIRST INITIAL
CLR A0
MOVE A0,*A13(JDIR),W ; NO PREVIOUS DIRECTION
MOVE A0,*A13(JTIMER),L ; NO TIMER
MOVK ENTER_TIME,A0
MOVE A0,*A8(PITIME),W ; SCORE ENTRY TIME
;
; A8 IS THE PLAYER DATA AREA
; A9 IS NUMBER OF UNDERLINE BEING USED
;
MOVE A8,A2
CALLR ERASEINITIALS ; GET EVERYTHING ERASED
SCILOOP:
SLEEP 3
*
*LEAVE IT THIS WAY, IN CASE WE FEEL GENEROUS SOMEDAY AND GIVE THE GUY
*HIS INITIALS IF HE HITS THE START BUTTON.(G N P)
*
MOVE *A13(PCOMM),A0,W ;DID THE PLAYER START?
JRNZ SCI_DIE ;BR = YES, DON'T ENTER ANYTHING
MOVE A8,A2 ; UPDATE THE PLAYER INFO
MOVE *A8(PITIME),A0,W ; CHECK TO SEE IF TIMED OUT
JRZ SCIDONE ; BR = YES, TRY AND ENTER IT
MOVE *A13(LASTSEC),A1,W ; COMPARE AGAINST LAST TIME
CMP A0,A1
JRZ SCI2
MOVE A0,*A13(LASTSEC),W ; UPDATE THE TIME LAST SEEN
CALLR ERASETIME
CALLR PLOTTIME
SCI2
CALLR LOOKSTICK
MOVE *A13(JDIR),A1,W ; GET LAST DIRECTION
CMP A0,A1 ;
JRZ SCIJD1
MOVE A0,*A13(JDIR),W ; SET NEW DIRECTION
CLR A1
MOVE A1,*A13(JTIMER),L ; CLEAR THE TIMER
JRUC SCIJUDGE
SCIJD1
MOVE *A13(JTIMER),A1,L
ADDI 3,A1
MOVE A1,*A13(JTIMER),L ; INCREMENT THE TIMER
CMPI 9,A1
JRLO SCICK2
CLR A1
MOVE A1,*A13(JTIMER),L ; CLEAR THE TIMER
MOVE A0,A0
JRZ SCICK2 ; NOTHING -- CHECK FIRE BUTTON
SCIJUDGE
CMPI 1,A0 ; UP
JRNZ SCIL0
MOVK 1,A0
MOVE A0,*A13(DIRTY),W ; SET IT
MOVE A9,A3
CLR A4
CALLR FLIPLETTER
JRUC SCIPROC
SCIL0
CMPI 2,A0 ; DOWN
JRNZ SCICK2
MOVK 1,A0
MOVE A0,*A13(DIRTY),W ; SET IT
MOVE A9,A3
MOVK 1,A4
CALLR FLIPLETTER
JRUC SCIPROC
;
SCICK2
CALLR LOOKFIRE ; CHECK THE FIRE BUTTON
JRZ SCICK3 ; NOT DEPRESSED
MOVE *A13(ADDTIMES),A0,W ; CHECK TO SEE IF EXPIRED
JRZ SCICK2WOOF
DEC A0
MOVE A0,*A13(ADDTIMES),W ; DEC AND SET
MOVK ENTER_TIME,A0
MOVE A0,*A8(PITIME),W ; RESET HIS TIME
SCICK2WOOF
MOVE *A13(BDEBOUNCE),A0,W ; GET DEBOUNCE FLAG
JRNZ SCIPROC ; HASN'T LET UP YET
MOVK 1,A0
MOVE A0,*A13(BDEBOUNCE),W
;
; CHECK HERE FOR RUB CHAR
;
MOVE A9,A3 ; LETTER WE ARE ON
DEC A3 ; 0 BASE IT
SLL 3,A3
ADDI INITIAL1,A3 ; GET TO FIRST INITIAL
ADD A13,A3
MOVB *A3,A0 ; GET THE LETTER
CMPI 7FH,A0 ; CHECK FOR RUB
JRNZ SCI3
MMTM A12,A2,A3
MOVE A9,A3
MOVE A8,A2 ; PLAYER DATA AREA
CALLR ERASEONEINITIAL
MMFM A12,A2,A3
MOVK 20H,A0
MOVB A0,*A3 ; CLEAR CHARACTER
DEC A9 ; MOVE LEFT 1
JRNZ SCIPROC
MOVK 1,A9
JRUC SCIPROC
SCI3
INC A9
CMPI 4,A9 ; CHECK FOR FAR RIGHT
JRLO SCIPROC
;
; THE GUY JUST ENTERED HIS INITIALS HERE!
;
JRUC SCIDONE
SCICK3
CLR A0
MOVE A0,*A13(BDEBOUNCE),W ; CLEAR THE DEBOUNCER
JRUC SCIPROC
;
SCIPROC
MOVE A9,A3
MOVE A8,A2
MOVK 1,A1
MOVE A1,*A2(PDEAD),W
; CALLR ERASEINITIALS
CALLR ERASEONEINITIAL
CALLR PLOTINITIALS
JRUC SCILOOP
;
; HERE WE ARE -- INITIALS ARE ENTERED AND EVERYTHING
;
SCIDONE
MOVE *A13(DIRTY),A1,W
JRZ SCINONE ; DIDN'T ENTER ANYTHING -- OUTTA HERE
MOVE A13,A1
ADDI INITIAL1,A1 ; POINT TO FIRST INITIAL
CALLA CHECK_INITS ; CHECK TO SEE IF ALL SPACES
JRZ SCINONE ; BR = STUPID ENTRY
MOVE *A8(PSCORE),A0,L ; GET THE SCORE
CALLA CKHSTD
JRZ SCINONE ; BR = DIDN'T MAKE IT
; CALLA TRYADD ; ADD IT, BABY!
CALLA ADD_HSHOLD ; PUT IT IN TEMPORARY STORAGE
SCINONE
MOVE A8,A2
*** CALLR PSENCL ; CLEAR OUT AREA
MOVE *A13(BIGSCORE),A1,W
JRNZ SCI_DIE ; DON'T UPDATE SCORE AREA
CALLR UPDSL
SCI_DIE:
CLR A0
MOVE A0,*A8(PDEAD),W ; START UP REGULAR PROCESSES
MOVE A0,*A8(PITIME),W
DIE
**************************************************************************
* *
* FLIPLETTER *
* *
* INCREMENT/DECREMENT THE LETTER *
* *
* ENTRY *
* A2 POINTER TO PLAYER DATA AREA *
* A3 WHICH LETTER *
* A4 DIRECTION ( 0 = INCREMENT, 1 = DECREMENT ) *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
FLIPLETTER:
MMTM SP,A0,A1,A5
MOVE A13,A0
CMPI 1,A3
JRNZ FL1
ADDI INITIAL1,A0
JRUC FLGOLET
FL1
CMPI 2,A3
JRNZ FL2
ADDI INITIAL2,A0
JRUC FLGOLET
FL2
ADDI INITIAL3,A0
FLGOLET
MOVB *A0,A1 ; SNAG THE LETTER
CALLR FINDLETTER
MOVE A4,A4
JRNZ FLDEC
;
; INCREMENT THE LETTER
;
ADDI 8,A5 ; MOVE UP IN TABLE
CMPI LASTLEGAL,A5
JRLS FLCOOL
MOVI LEGALCHARS,A5 ; WRAP TO START
JRUC FLCOOL
;
; DECREMENT THE LETTER
;
FLDEC
SUBI 8,A5
CMPI LEGALCHARS,A5
JRHS FLCOOL
MOVI LASTLEGAL,A5 ; END OF TABLE
;
FLCOOL
MOVB *A5,*A0 ; GET THE LETTER
MMFM SP,A0,A1,A5
RETS
**************************************************************************
* *
* FINDLETTER *
* *
* LOOKUP THE LETTER IN A1 IN THE TABLE *
* *
* ENTRY *
* A1 CHAR TO FIND *
* *
* EXIT *
* A5 TABLE ADDRESS *
* *
**************************************************************************
FINDLETTER:
MMTM SP,A0,A2
MOVI LEGALCHARS,A0
FILLOOP
MOVB *A0,A2 ; TABLE LETTER
JRZ FILNOLET ; ENDOFTABLE, NO LETTER
CMP A1,A2
JRZ FILDONE
ADDI 8,A0
JRUC FILLOOP
FILDONE
MOVE A0,A5 ; ADDRESS OF LETTER
JRUC FILRET
FILNOLET
MOVI LEGALLET,A5 ; DEFAULT = 'A'
FILRET
MMFM SP,A0,A2
RETS
LEGALCHARS
.BYTE 20H
LEGALLET
.BYTE 41H,42H,43H,44H,45H,46H,47H,48H
.BYTE 49H,4AH,4BH,4CH,4DH,4EH,4FH,50H
.BYTE 51H,52H,53H,54H,55H,56H,57H,58H
.BYTE 59H, 5AH
.BYTE 21H,2AH,2BH,2EH,2FH,3FH ; SPEC CHARS
LASTLEGAL
.BYTE 7FH ; RUB CHAR
.LONG 0 ; ENDUS MAXIMUS
**************************************************************************
* *
* LOOKSTICK *
* *
* FIGURE OUT WHICH STICK IS THE PLAYERS, DO THE MASKING *
* AND THINGS AND RETURN A NUMBER FROM 0 TO 4 ABOUT WHAT *
* IS GOING ON.. *
* *
* ENTRY *
* A2 PLAYER DATA AREA *
* *
* EXIT *
* A0 STICK VALUE (ZERO FLAG WILL BE SET) *
* 0 = NOTHING *
* 1 = UP *
* 2 = DOWN *
* 3 = LEFT *
* 4 = RIGHT *
* *
* NOTE : THIS IS ONLY FOR JAMMA GAMES! *
* *
**************************************************************************
LOOKSTICK:
PUSH A1
CMPI P1DATA,A2 ; PLAYER 1 DATA AREA
JRNZ LS2
MOVE @SWITCH,A1,L ; GET SWITCHES
ANDI 000FH,A1 ; MASK OFF STICK
JRUC LSOUT
LS2
CMPI P2DATA,A2 ; PLAYER 2 DATA AREA
JRNZ LS3
MOVE @SWITCH,A1,L
ANDI 00F00H,A1 ; MASK OFF STICK
SRL 8,A1
JRUC LSOUT
LS3
CMPI P3DATA,A2 ; PLAYER 3 DATA AREA
JRNZ LS4
MOVE @SWITCH,A1,L
ANDI 78000000H,A1 ; SNAG THAT STICK, BABY!
SRL 27,A1
JRUC LSOUT
LS4
MOVE @SWITCH+32,A1,L
LSOUT
NOT A1
BTST 0,A1 ; UP
JRZ LSO1
MOVK 1,A0
JRUC LSRET
LSO1
BTST 1,A1 ; DOWN
JRZ LSO2
MOVK 2,A0
JRUC LSRET
LSO2
BTST 2,A1 ; LEFT
JRZ LSO3
MOVK 3,A0
JRUC LSRET
LSO3
BTST 3,A1 ; RIGHT
JRZ LSO4
MOVK 4,A0
JRUC LSRET
LSO4
CLR A0
LSRET
PULL A1
MOVE A0,A0 ; MAKE SURE SOME BITS BE SET
RETS
**************************************************************************
* *
* LOOKFIRE *
* *
* CHECK TO SEE IF THE FIRE BUTTON IS DOWN *
* *
* ENTRY *
* A2 PLAYER DATA AREA *
* *
* EXIT *
* .NZ. YES, IT IS *
* *
**************************************************************************
LOOKFIRE:
PUSH A1
CMPI P1DATA,A2 ; PLAYER 1 DATA AREA
JRNZ LF2
MOVE @SWITCH,A1,L ; GET SWITCHES
NOT A1
ANDI 00000010H,A1
JRUC LFOUT
LF2
CMPI P2DATA,A2 ; PLAYER 2 DATA AREA
JRNZ LF3
MOVE @SWITCH,A1,L
NOT A1
ANDI 00001000H,A1
JRUC LFOUT
LF3
CMPI P3DATA,A2 ; PLAYER 3 DATA AREA
JRNZ LF4
MOVE @SWITCH,A1,L
NOT A1
ANDI 80000000H,A1
JRUC LFOUT
LF4
MOVE @SWITCH+32,A1,L
NOT A1
ANDI 00000010H,A1
LFOUT
PULL A1
RETS
**************************************************************************
* *
* PLOTTIME *
* *
* PLOT THE TIME LEFT FOR A GIVEN PLAYER *
* *
* ENTRY *
* A2 PLAYER DATA AREA *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
PLOTTIME:
MMTM SP,A0,A1,A3,A4,A5,A8,A9,A11
MOVE *A13(BIGSCORE),A3,W ; ARE WE IN BIG SCORE MODE?
JRNZ PTBYP1
MOVI RD7FONT,A11
CLR A4
MOVI TROG_LF,A5
MOVI ENTERMESS,A8
MOVI SCIMESS,A9
CALLR SCORSTR ; BLOW OUT THIS ONE
PTBYP1
MOVE *A2(PITIME),A8,W
CALLA HEXTOASC
MOVE *A2(PPALID),A4
MOVI 0E0EH,A5
MOVE *A13(BIGSCORE),A3,W ; ARE WE IN BIG SCORE MODE?
JRZ PTBYP2
;
MOVI [150+SKYTOPOF,197],A9
MOVI RD15FONT,A11
CALLR SCORSTR
MOVI TEXTOID,A0
MOVI BTIMEOID,A1
CALLA CHANGOID
JRUC PTRET
PTBYP2
MOVI SCITIME,A9
CALLR SCORSTR
PTRET
MMFM SP,A0,A1,A3,A4,A5,A8,A9,A11
RETS
**************************************************************************
* *
* PLOTINITIALS *
* *
* PLOT THE PLAYER INITIALS AS THEY CURRENTLY STAND *
* *
* ENTRY *
* A2 PLAYER DATA AREA *
* A3 WHICH ONE TO EMPHASIZE *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
BSCILET1 EQU [117+SKYTOPOF,160]
BSCILET2 EQU [117+SKYTOPOF,197]
BSCILET3 EQU [117+SKYTOPOF,234]
PLOTINITIALS:
MMTM SP,A0,A1,A2,A3,A5,A6,A7,A8,A9
MOVI RD15FONT,A11
MOVE A13,A8
ADDI PLANTLET,A8 ; GET THE PLANT LETTER PLACE
CALLA GPLAYNUM
ADDI PCOLROFFST/16,A0
MOVE A0,A6
SLL 8,A0
OR A0,A6
MOVI 0E0EH,A5 ; COLOR
MOVE *A2(PPALID),A4,L ; PALETTE
CMPI 1,A3
JRNZ PI1
MOVE A6,A5
MOVI PCYCLEPAL,A4
PI1
MOVI SCILET1,A9
MOVE *A13(BIGSCORE),A1,W
JRZ PI1BYP
MOVI RD15FONT,A11
MOVI BSCILET1,A9
PI1BYP
MOVB *A13(INITIAL1),A1
MOVE A1,*A8,W
CALLR SCORSTR
MOVI 0E0EH,A5 ; COLOR
MOVE *A2(PPALID),A4,L ; PALETTE
CMPI 2,A3
JRNZ PI2
MOVE A6,A5
MOVI PCYCLEPAL,A4
PI2
MOVI SCILET2,A9
MOVE *A13(BIGSCORE),A1,W
JRZ PI2BYP
MOVI RD15FONT,A11
MOVI BSCILET2,A9
PI2BYP
MOVB *A13(INITIAL2),A1
MOVE A1,*A8,W
CALLR SCORSTR
MOVI 0E0EH,A5 ; COLOR
MOVE *A2(PPALID),A4,L ; PALETTE
CMPI 3,A3
JRNZ PI3
MOVE A6,A5
MOVI PCYCLEPAL,A4
PI3
MOVI SCILET3,A9
MOVE *A13(BIGSCORE),A1,W
JRZ PI3BYP
MOVI RD15FONT,A11
MOVI BSCILET3,A9
PI3BYP
MOVB *A13(INITIAL3),A1
MOVE A1,*A8,W
CALLR SCORSTR
MOVE *A13(BIGSCORE),A1,W
JRZ PIRET
MOVI TEXTOID,A0
MOVI BMES1OID,A1
CALLA CHANGOID ; CLEAN OUT ALL THE TEXT THINGS
PIRET
MMFM SP,A0,A1,A2,A3,A5,A6,A7,A8,A9
RETS
**************************************************************************
* *
* SCORSTR *
* *
* PLOT A STRING IN THE SCOR AREA *
* *
* ENTRY *
* A2 PLAYER DATA AREA *
* A4 PALETTE TO USE *
* A5 COLOR TO USE ( NOT PALETTIZED ) *
* A8 STRING *
* A9 SCORE AREA OFFSET *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
SCORSTR:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A10,A11
SLL 16,A5 ; THIS IS THE CONSTANT DRAW COLOR
MOVE A4,A4
JRZ NONEED
CMPI PCYCLEPAL,A4 ; PALETTE CYCLER?
JRNZ LOOKUP_PAL ; A REAL MEMORY LOCATION
MOVX A4,A5
JRUC NONEED
LOOKUP_PAL
MOVE *A2(PPALID),A0,L ; LOOKUP THE CURRENT PALETTE
CALLA FINDPAL ; MAKE SURE IT HAS A PALETTE
MOVX A0,A5
NONEED:
MOVB *A8,A0
CMPI 20H,A0 ; CHECK FOR SPACE
JRNZ SCGO
MOVI UNDERLINE,A8
SCGO
CLR A0 ; SLEEP TIME BETWEEN CHARS
MOVK 1,A10 ; SIMPLE SPACING
MOVE *A13(BIGSCORE),A1,W ; CHECK FOR BIG SCORE MODE
JRZ SCLITTLE
JSRP STRCNRMO
JRUC SCRET
SCLITTLE
MOVE *A2(PSCRAD),A1,L ; SCORE BOX CENTER
ADD A1,A9 ; CENTER IT FOR REAL
JSRP STRCNRM
SCRET
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A10,A11
RETS
**************************************************************************
* *
* ERASEINITIALS *
* *
* ERASE THE PLAYER INITIALS AREA *
* *
* ENTRY *
* A2 PLAYER DATA AREA *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
ERASEINITIALS:
MMTM SP,A0,A1,A3,A4,A8
MOVE *A13(BIGSCORE),A3,W
JRZ ERA1
ERASEBIGIES
MOVI BMES1OID,A0 ; INITIALS ARE IN THIS OID
CLR A1
NOT A1
CALLA KILOBJ ; LATER, DUDES!
JRUC ERARET
ERA1
MOVE *A2(PSCRAD),A3,L ; CENTER OF SCORE BOX
ADDI SCIERA,A3 ; ADD ON THE OFFSETS
MOVI SCIERAS,A4 ; SIZE OF SCORE BOX ERASE
CALLA BLNKAREA
ERARET
MMFM SP,A0,A1,A3,A4,A8
RETS
**************************************************************************
* *
* ERASEONEINITIAL *
* *
* ERASE ONLY ONE OF THE LETTERS -- GOTTA STOP THIS GLITCHING SHIT *
* *
* ENTRY *
* A2 PLAYER DATA AREA *
* A3 WHICH ONE IS BEING WORKED ON ( 1 BASED! ) *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALLR *
* *
**************************************************************************
ERASEONEINITIAL
MMTM SP,A0,A1,A3,A4,A8
MOVE *A13(BIGSCORE),A0,W
JRNZ ERASEBIGIES
DEC A3
ANDI 3,A3
SLL 5,A3
ADDI ERAONETAB,A3
MOVE *A3,A0,L
MOVE *A2(PSCRAD),A3,L ; CENTER OF SCORE BOX
ADD A0,A3
SUBI 1000AH,A3 ; GET IT MOVED OVER SOME MORE
MOVI SCILETSIZE,A4 ; SIZE OF SCORE BOX ERASE
CALLA BLNKAREA
MMFM SP,A0,A1,A3,A4,A8
RETS
ERAONETAB
.LONG SCILET1,SCILET2,SCILET3
**************************************************************************
* *
* ERASETIME *
* *
* ERASE THE TIME MESSAGE THAT WAS PUT THERE BY THE COMMUNIST *
* BIG SCORE PROC STUFF *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
ERASETIME:
MMTM SP,A0,A1
MOVE *A13(BIGSCORE),A0,W ; CHECK OUT IF IN BIGSCORE MODE
JRNZ ET1
MOVE *A2(PSCRAD),A3,L ; CENTER OF SCORE BOX
ADDI SCITERA,A3 ; ADD ON THE OFFSETS
MOVI SCITES,A4 ; SIZE OF SCORE BOX ERASE
CALLA BLNKAREA
JRUC ETRET
ET1
MOVI BTIMEOID,A0 ; TIME IS IN THIS OID
CLR A1
NOT A1
CALLA KILOBJ ; LATER, DUDES!
ETRET
MMFM SP,A0,A1
RETS
ENTERMESS:
.STRING "Initials!",0
.EVEN
UNDERLINE:
.STRING "-",0
.EVEN
**************************************************************************
* *
* 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:
CALLR ERASE_MESSAGES ; CLEAR OUT EVERYTHING TO START WITH
MOVK 1,A8
MOVE A8,@HISEEN,W ; GROSS, BUT....
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
CALLR SCORMESS
MOVE A11,A11 ; CHECK FOR 2 PLAYERS
JRZ SCORPLP3
MOVI P2DATA,A2
CALLR SCORMESS
DEC A11 ; CHECK FOR 3 PLAYERS
JRZ SCORPLP3
MOVI P3DATA,A2
CALLR SCORMESS
DEC A11 ; CHECK FOR 4 PLAYERS
JRZ SCORPLP3
MOVI P4DATA,A2
CALLR SCORMESS
SCORPLP3
SLEEPK 2
MOVE @PCYCLELO,A14,W ; CHECK TO SEE IF WE NEED TO ERASE
JRZ SCORPCK2
CLR A14
MOVE A14,@PCYCLELO,W ; GROSS
MOVE A14,@HISEEN,W ; CLEAR OUT WHO PLOTTED LAST
CALLR ERASE_MESSAGES
JRUC SCORPLP3
SCORPCK2
MOVE @PCYCLEHI,A14,W ; CHECK TO SEE IF WE NEED TO REPLOT
JRZ SCORPLP3
MOVE @HISEEN,A14,W
JRZ SCORPCOOL
CALLR ERASE_MESSAGES ; SOMETHING GOT OUT OF SYNC HERE
SCORPCOOL
MOVK 1,A14
MOVE A14,@HISEEN,W
CLR A14
MOVE A14,@PCYCLEHI,W ; NICE RACE CONDITION
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,A8,A9,A10,A11
SCORMRETRY:
MOVK 1,A11 ; ASSUME IN STORY MODE
MOVE @STORY_MODE,A0,W
JRNZ SCORMAMODE
CLR A11 ; NOT IN ATTRACT MODE
MOVE *A2(PDEAD),A0,W ; CHECK FOR DEAD MESSAGE
JRNZ SCORM3
MOVE *A2(PDRONEFLG),A0,W
JRNZ SCORMAMODE
MOVE *A2(POBJ),A0,L ; CHECK TO SEE IF HAS OBJECT
JRNZ SCORMRET
MOVE *A2(PENTER),A0,W ; CHECK FOR ENTERING
JRNZ SCORMRET
SCORMAMODE
; CALLR ERASE_SCORE_MESS
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 ; CHECK THE SCORE
JRNZ SCO1
SCD_START_CREDITS
MOVE @CANSTRT,A0,W ; ENOUGH STARTING CREDITS?
ANDI 1,A0
JRZ SCOPOOR
SCDNAME
CALLA GPLAYNUM ; ( OFF OF A2 )
SLL 5,A0
ADDI DINO_START_TAB,A0
MOVE *A0,A8,L
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 SCORINSERT,A8 ; INSERT COIN
JRUC SCORMGO
;
SCORM1
MOVE A11,A11
JRNZ SCORM10 ; IN ATTRACT MODE -- FORCE START
MOVE @GAME_STATE,A8,W ; CHECK FOR GAME STATE HERE
CMPI INGAMEOV,A8 ; GAME OVER, GOTTA START
JRZ SCORM10
MOVE *A2(PSCORE),A8,L ; CHECK TO SEE IF PREVIOUS SCORE
JRNZ SCORM2 ; YEAH, USE "CONTINUE" MESSAGE
SCORM10
MOVI SCORTOPLAY,A8 ; "TO PLAY"
JRUC SCORMGO
SCORM2
CALLA ALLOW_CONTINUE
JRZ SCORM_GAME_OVER
MOVI SCORCONTINUE,A8 ; "TO CONTINUE"
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
CALLR ERASE_SCORE_MESS
JRUC SCORMRETRY
SCORM4
MOVI SCORGAMEOVER,A8 ; "GAME OVER, DUDE!" MESSAGE
; JRUC SCORMPAL ; BYPASS FLASHING COLOR
;
; PLOT THE MESSAGE IN A8 AT THE RIGHT LOCATION
;
SCORMPLAYERPAL
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
JRUC SCORMGOOBJ
*
SCORMGO
SCORMPAL
CALLA GPLAYNUM
ADDI PCOLROFFST/16,A0
MOVI PCYCLEPAL,A1
SLL 16,A0
MOVY A0,A1
SLL 8,A0
OR A0,A1
SCORMGOOBJ
MOVE *A2(PSCRAD),A3,L ; SCORE BOX CENTER
ADDI SCRCTR,A3 ; START OF TEXT
MOVE *A8(IANIOFFX),A14,L
SUB A14,A3 ; ADJUST THE ANIMATION POINT
MOVE *A8(ISIZE),A2,L ; GET THE SIZE
MOVE *A8(ISAG),A4,L ; GET STARTING ADDRESS
MOVI DMACNZ,A5 ; FLAGS
CALLA DMAN ; OUTPUT THE SUCKER
SCORMRET
MMFM SP,A8,A9,A10,A11
RETS
**************************************************************************
* *
* ERASE_MESSAGES *
* *
* ERASE ALL THE MESSAGES IN THE SCORE AREA OF A GIVEN PLAYER *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
* CALL *
* CALLR *
* *
**************************************************************************
ERASE_MESSAGES
MOVI PDTAB,A14
MOVE @NPLAYERS,A3,W ; NUMBER OF PLAYERS
INC A3
ERASE_M_LOOP
MOVE *A14+,A2,L
JRZ ERASE_RET
DEC A3
JRLT ERASE_RET
MOVE @STORY_MODE,A0,W ; CHECK FOR STORY MODE
JRNZ ERASE_IT
MOVE *A2(PDRONEFLG),A0,W ; CHECK TO SEE IF A DRONE
JRNZ ERASE_IT ; BR = FORCE ERASE
MOVE *A2(POBJ),A0,L ; CHECK TO SEE IF HAS OBJECT
JRNZ ERASE_M_LOOP
MOVE *A2(PENTER),A0,W ; CHECK FOR ENTERING
JRNZ ERASE_M_LOOP
MOVE *A2(PITIME),A0,W
JRNZ ERASE_M_LOOP
MOVE *A2(PDEAD),A0,W ; CHECK FOR DEAD MESSAGE
JRNZ ERASE_M_LOOP
ERASE_IT
CALLR ERASE_SCORE_MESS
JRUC ERASE_M_LOOP
ERASE_RET
RETS
PDTAB .LONG P1DATA,P2DATA,P3DATA,P4DATA,0
DINO_START_TAB:
.LONG SCORREX,SCORBLOOP,SCORSPIKE,SCORGWEN
**************************************************************************
* *
* GAME_OVER_FLY FLY THE GAME OVER BOX UP TO THE PLAYER'S SCORE AREA *
* *
* ENTRY *
* A9 CENTER POINT WHERE DINO DIED *
* A11 PLAYER POINTER *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
GAME_OVER_FLY:
MOVK 1,A0 ; KEEP SCORPROC FROM BEING A PAIN
MOVE A0,*A11(PDEAD),W
;
MOVI GAMEOVERINIT,A14 ; GAME OVER BOX
CALLA GETOBJ
JRZ GAME_OVER_FLY_NOOBJ
MOVE A0,A8 ; GAME OVER OBJECT
MOVE *A11(PPALID),A0,L ; LOOKUP THE CURRENT PALETTE
CALLA FINDPAL ; MAKE SURE IT HAS A PALETTE
MOVE A0,@CURPAL,W ; MAKE STFOBJ PUT THIS IN THE PALETTE
MOVE A8,A0
CALLA STFOBJ
**** MOVI 0E0EH,A1
**** MOVE A1,*A8(OCONST),W ; ONLY IN THIS COLOR
;
MOVE A9,A3
CALLA OBJ_TO_PNT ; CENTER OBJECT ON POINT
CALLA INSOBJ
;
SLEEP 30 ; GIVE PLAYER 1/2 SECOND
MOVI 60,A4 ; CRUISE UP IN 1 SECOND
MOVE A11,A2 ; POINTER TO PLAYER
JSRP FLYTOPL ; ZOOM HIM UP TO TOP OF SCREEN
MOVE A8,A0
CALLA DELOBJ
GAME_OVER_FLY_NOOBJ:
;
; NOW FLASH A GAME OVER UP THERE
;
MOVE *A11(PDEAD),A0,W ;IS THE PLAYER DEAD?
JRZ GAME_OVER_FLY_DIE ;BR = NOT ANYMORE
MOVE *A11(PPID),A0,W
ORI PINITIALPID,A0
CLR A1
NOT A1
CALLA EXISTP ;IS THIS DUDE ENTERING HIS INITIALS?
JRNE GAME_OVER_FLY_DIE ;BR = YES, THEN DON'T BOGE IT OUT
MOVE *A11(PSCRAD),A9,L ; SCORE BOX CENTER
ADDI SCRCTR,A9 ; START OF TEXT
CALLR ERASE_SCORE_MESS ; ERASE THE SCORE MESSAGE AREA
MOVK 2,A0 ; TURN ON THE GAME OVER MESS
MOVE A0,*A11(PDEAD),W
;
MOVI SCORGAMEOVER,A8 ; "GAME OVER, DUDE!" MESSAGE
MOVI 0E0EH,A1
SLL 16,A1 ; THIS IS THE CONSTANT DRAW COLOR
MOVE *A11(PPALID),A0,L ; LOOKUP THE CURRENT PALETTE
CALLA FINDPAL ; MAKE SURE IT HAS A PALETTE
MOVX A0,A1
MOVE *A11(PSCRAD),A3,L ; SCORE BOX CENTER
ADDI SCRCTR,A3 ; START OF TEXT
MOVE *A8(IANIOFFX),A14,L
SUB A14,A3 ; ADJUST THE ANIMATION POINT
MOVE *A8(ISIZE),A2,L ; GET THE SIZE
MOVE *A8(ISAG),A4,L ; GET STARTING ADDRESS
MOVI DMACNZ,A5 ; FLAGS
CALLA DMAN ; OUTPUT THE SUCKER
SLEEP 180
CALLA ALLOW_CONTINUE
JRZ GAME_OVER_FLY_DIE
MOVE *A11(PDEAD),A0,W ;IS THE PLAYER DEAD?
JRZ GAME_OVER_FLY_DIE ;BR = NOT ANYMORE
MOVK 3,A0 ; PAUSE DONE, LET SCORPROC SYNC UP
MOVE A0,*A11(PDEAD),W
GAME_OVER_FLY_DIE:
DIE
GAMEOVERINIT:
.LONG 0,0
.WORD 0,7FFFH
.LONG GAMEOVER,0,DUMCOLL
.WORD DMAWNZ,JUNKOID
**************************************************************************
* *
* ERASE_SCORE_MESS ERASE ANY SCORE AREA MESSAGES *
* *
* ENTRY *
* A2 POINTER TO PLAYER DATA AREA *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
ERASE_SCORE_MESS:
MMTM SP,A3,A4
MOVE *A2(PSCRAD),A3,L ; CENTER OF SCORE BOX
ADDI SCRERA,A3 ; ADD ON THE OFFSETS
MOVI SCRERAS,A4 ; SIZE OF SCORE BOX ERASE
CALLA BLNKAREA
MMFM SP,A3,A4
RETS
**************************************************************************
* *
* SCORAREA - OUTPUT THE SCORE AREA AND UPDATE ALL PLAYER STATUS *
* *
**************************************************************************
SCORAREA
CALLR UPSTAT ;UPDATE PLAYERS STATUS
CALLR MARQUEE
RETS
**************************************************************************
* *
* P0_P1_SCORE - PLOT THE SCORE AREA ON BOTH DISPLAY PAGES. *
* *
**************************************************************************
P0_P1_SCORE:
PUSH A0
CALLR SCORAREA
MOVK 1,A0
MOVE A0,@PAGE,W
CALLR SCORAREA
CLR A0
MOVE A0,@PAGE,W
PULL A0
RETS
**************************************************************************
* *
* SCOREHILITE - HILITE THE PLAYERS SCORE DISPLAY *
* A2 = PTR TO PLAYER DATA BLOCK *
* *
**************************************************************************
SCOREHILITE:
MMTM SP,A0,A1
CALLR PSENCL
MOVE *A2(PSCORE),A0,L
CALLR OUTSCRHI
CALLR OUTLIVES
CALLR OUTEGGS
; CALLA OUTTSHIRT
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* SCORELOLITE - DIM THE PLAYERS SCORE DISPLAY *
* A2 = PTR TO PLAYER DATA BLOCK *
* *
**************************************************************************
SCORELOLITE:
PUSH A0
CALLR PSENCL
MOVE *A2(PSCORE),A0,L
CALLR OUTSCRLO
PULL A0
RETS
**************************************************************************
* *
* MARQUEE - OUTPUT THE MARQUEE, THIS INCLUDES THE CREDIT/ISLAND MESSAGE *
* *
**************************************************************************
MARQUEE:
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 CALLED EVERY TIME A COIN IS PUT IN
G_CRED:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
MOVE @STORY_MODE,A0,W
JRNZ CREDIT_LP
MOVE @GAME_STATE,A0,W
CMPI INDIAG,A0
JREQ G_CRED_X
CMPI INAMODE,A0
JREQ G_CRED_X
CREDIT_LP:
MOVB *A8,A4
JRZ G_CRED_X ;BR = ERROR IN CREDIT STRING
CMPI 20H,A4
JREQ CREDIT_FOUND
ADDK 8,A8
JRUC CREDIT_LP
CREDIT_FOUND:
ADDK 8,A8 ;RID 'O SPACE
MOVB *A8,A4
JRZ G_CRED_X
CMPI 20H,A4
JREQ CREDIT_FOUND
PUSH A8
MOVE @NPLAYERS,A3,W
SLL 5,A3
ADDI CRED_TAB,A3
MOVE *A3,A3,L
PUSH A3 ; PUSH THE BASE LOCATION
; MOVI CRDBOX,A3
MOVI CRDSIZE,A4
CALLA BLNKAREA ;CLEAR THE AREA
ADJUST ADJFREPL
JRZ CREDIT_CREDIT
MOVI FREE_MESS,A8 ;PUT OUT THE WORD "FREE"
JRUC CREDIT_PLOT
CREDIT_CREDIT:
MOVI CREDIT_MESS,A8 ;PUT OUT THE WORD "CREDIT"
CREDIT_PLOT:
CALLA LM_SETUP
PULL A9 ; PULL NEW STARTING LOCATION
PUSH A9 ; SAVE IT AGAIN
ADDI CRDTXT,A9 ; ADD ON TEXT OFFSET
JSRP LM_FINIS
PULL A9
PULL A8
ADDI CRDNUM,A9
*GNP CHANGE 5/24/90
MOVI [0F0FH,0101H],A5
JSRP STRCNRM ;NOW TELL HOW MANY
G_CRED_X:
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
RETS
CREDIT_MESS:
MESS_MAC RD5FONT,1,CRDX,CRDY,01010000H,STRCNRM,0
.STRING "CREDIT",0
.EVEN
FREE_MESS:
*GNP CHANGE 5/24/90
MESS_MAC RD5FONT,1,CRDX,CRDY,0F0F0101H,STRCNRM,0
.STRING "FREE",0
.EVEN
CRED_TAB
.LONG CRD1BOX, CRD2BOX, CRD3BOX, CRD4BOX
**************************************************************************
* *
* ISLAND_NUM - PRINT OUT THE CURRENT ISLAND NUMBER *
* *
**************************************************************************
ISLAND_NUM:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
MOVE @NPLAYERS,A0,W
SLL 5,A0
ADDI ISLE_TAB,A0
MOVE *A0,A3,L ; LOCATION OF ISLE BOX
PUSH A3
; MOVI ISLEBOX,A3
MOVI ISLESIZE,A4
CALLA BLNKAREA ;CLEAR THE AREA
MOVI ISLE_MESS,A8 ;PUT OUT THE WORD "ISLAND"
CALLA LM_SETUP
PULL A9
PUSH A9
ADDI ISLETXT,A9
JSRP LM_FINIS
PULL A9
ADDI ISLENUM,A9
; MOVI ISLENUMXY,A9
*GNP CHANGE 5/24/90
MOVI [0F0FH,0101H],A5
MOVE @WAVE,A8,W
CALLA HEXTOASC
JSRP STRCNRM ;NOW TELL HOW MANY
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
RETS
ISLE_MESS:
MESS_MAC RD5FONT,1,ISLEX,ISLEY,01010000H,STRCNRM,0
.STRING "ISLAND",0
.EVEN
ISLE_TAB:
.LONG ISLE1BOX, ISLE2BOX, ISLE3BOX, ISLE4BOX
**************************************************************************
* *
* SSOUT - OUTPUT SOME SCORE/STATUS AREA PIECES VIA A TABLE. *
* FIRST ENTRY IS AREA TO BLANK *
* A0 = PTR TO TABLE *
* A6 = [Y,X] OFFSET TO ADD TO EVERYTHING (DAG FOR BLNKAREA) *
* RETURNS *
* A0 = PTING TO NEXT WORD AFTER THE TABLE *
* *
**************************************************************************
SSOUT:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A14
SSOUT1:
MOVE *A0+,A4,L
JRZ SSOUT_BLANK_SKIP
MOVE A6,A3
CALLA BLNKAREA
SSOUT_BLANK_SKIP:
CLR A1 ;CONSTANT:PALETTE
MOVI DMAWNZ,A5 ;DRAW
MOVE *A0+,A14,L ;KICK IT OFF COUSIN
SSOUTL:
MOVE *A0+,A3,L
ADDXY A6,A3
CALLA DTIME ;DO IT
MOVE *A0+,A14,L ;GET THE NEXT
JRNZ SSOUTL ;BR = DO IT AGAIN
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A14
RETS
MARQTAB
.LONG 0
.LONG ROCKLINE
.LONG [35,0]
.LONG ROCKLINE
.LONG [35,158]
.LONG ROCKLINE
.LONG [35,316]
.LONG 0
P1SCOREAREA:
.LONG PBOXSIZ
.LONG P1BOXBONEh
.LONG [0,1]
.LONG P1BOXBONEh
.LONG [29,1]
.LONG P1BOXBONEv
.LONG [4,0]
.LONG P1BOXBONEv
.LONG [4,85]
.LONG 0
P2SCOREAREA:
.LONG PBOXSIZ
.LONG P2BOXBONEh
.LONG [0,1]
.LONG P2BOXBONEh
.LONG [29,1]
.LONG P2BOXBONEv
.LONG [4,0]
.LONG P2BOXBONEv
.LONG [4,85]
.LONG 0
P3SCOREAREA:
.LONG PBOXSIZ
.LONG P3BOXBONEh
.LONG [0,1]
.LONG P3BOXBONEh
.LONG [29,1]
.LONG P3BOXBONEv
.LONG [4,0]
.LONG P3BOXBONEv
.LONG [4,85]
.LONG 0
P4SCOREAREA:
.LONG PBOXSIZ
.LONG P4BOXBONEh
.LONG [0,1]
.LONG P4BOXBONEh
.LONG [29,1]
.LONG P4BOXBONEv
.LONG [4,0]
.LONG P4BOXBONEv
.LONG [4,85]
.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
MOVE *A2(PPID),A0,W
ORI PINITIALPID,A0
CLR A1
NOT A1
CALLA EXISTP ;ARE THERE INITIALS BEING ENTERED?
JRNZ UPDSL_X ;BR = YES
CALLA PSENCL ;FIRST RE-INIT THE AREA
MOVE *A2(PSCORE),A0,L ;GET THE SCORE IN A0
CALLA OUTSCR ;AND OUTPUT IT
CALLA OUTLIVES
CALLR OUTEGGS
; CALLA OUTTSHIRT
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
MOVI PBOXOF,A0
ADDXY A0,A6 ;STARTING BOX POINT
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_CKP4
MOVI P3SCOREAREA,A0
JRUC PSENCL_BUILD
PSENCL_CKP4:
CMPI P4DATA,A2
JRNE PSENCL_X
MOVI P4SCOREAREA,A0
PSENCL_BUILD:
CALLR SSOUT
PSENCL_X:
MMFM SP,A0,A6
RETS
*
*EUGENE'S SCORE ROUTINES
*
*BCD ADD ROUTINE
*A0=SCORE (8 DIGIT BCD) 32 BITS
*A1=NUMBER TO ADD TO A0 (8 DIGIT BCD)
*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
*
*PLAYER SCORE ROUTINE
*A1=SCORE VALUE
*A2=PLAYER INDEX
SCORE:
MMTM SP,A0,A2
MOVE @GAME_STATE,A0,W
CMPI INAMODE,A0
JREQ SCOREX ;NO SCORING IN ATTRACT MODE
MOVE *A2(PDRONEFLG),A0,W
JRNZ SCOREX
MOVE *A2(PSCORE),A0,L ;GET SCORE
CALLR BCDADD ;ADD IN NEW VALUE
CALLR REPCK ;CHECK REPLAY
MOVE A0,*A2(PSCORE),L ;STORE SCORE
CALLR CHECK_INITIALS ;ARE INITIALS BEING ENTERED
JRNZ SCOREX ;BR = YES, THEN DON'T SCORE
CALLR OUTSCR ;OUTPUT CURRENT PLAYER SCORE
SCOREX
MMFM SP,A0,A2
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
**************************************************************************
* *
* CHECK_INITIALS - DETERMINE IF A PLAYER IS ENTERING HIS INITIALS IN *
* HIS SCORE DISPLAY. *
* A2 = PTR TO PLAYER DATA AREA *
* RETURNS: *
* Z = NOT ENTERING *
* NZ = ENTERING *
* *
**************************************************************************
CHECK_INITIALS:
MMTM SP,A0,A1
MOVE *A2(PPID),A0,W
ORI PINITIALPID,A0
CLR A1
NOT A1
CALLA EXISTP
MMFM SP,A0,A1
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
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
CALLR BCDADD
MOVE 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
INCM *A2(PEXTRAEARN),W ;ADD ONE TO THE EXTRA MEN EARNED THIS WAVE
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 >F3E0,>3C,>80B3,0 ;FREE MAN SOUND
**************************************************************************
* *
* 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,A14
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,A14
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,A14
MOVE @STORY_MODE,A14,W
JRNZ 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,A6 ;DIGIT COUNT
MOVE *A2(PSCRAD),A3,L ;PLAYER SCORE ADDRESS
MOVE @PAGE,A14,W
JRZ OUTSCRP0
MOVI PAGE1XY,A14
ADDXY A14,A3 ;OFFSET TO PAGE 1
OUTSCRP0
MOVI SCRSPC,A8 ;SPACING BETWEEN DIGITS
CLR A7 ;INIT BLANKING FLAG
MOVI 9|8000H,A5 ;CONTROL REGISTER
MOVE A0,A14 ;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
*NOTE:A2 GETS DESTROYED UPON THE FIRST ITERATION OF THIS LOOP
OUTSCL:
MOVE A14,A0
SRL 28,A0
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,A0 ;MULTIPLY BY 128
ADDI SPFONT0,A0 ;ADDRESS OF IMAGE HEADER
MOVE *A0(ISAG),A4,L ;GET STARTING ADDRESS
MOVE *A0(ISIZE),A2,L ;GET THE SIZE
CALLA DMAN ;OUTPUT THE SUCKER
OUTSC2:
ADDXY A8,A3 ;SPACE TO NEXT DIGIT
SLL 4,A14
DSJ A6,OUTSCL
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A14
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:
MOVK 1,A0
*
*ADD N LIFE(VES)
ADDNLIFE
MMTM SP,A0,A1,A3
MOVE *A2(PLIVES),A1,W ;CURRENT # OF LIVES
ADD A0,A1
MOVE A1,*A2(PLIVES),W
CALLR OUTLIVES
; CALLR OUTTSHIRT
MMFM SP,A0,A1,A3
RETS
**************************************************************************
* *
* SUBxLIFE SUBTRACT LIFE(VES) *
* A0 = # OF LIVES TO SUBTRACT *
* A2 = PLINDX=PLAYER DATA AREA *
* RETURN(S): *
* CARRY SET=NO MORE LIVES *
* *
**************************************************************************
*
*SUBTRACT ONE LIFE
SUBLIFE:
MOVK 1,A0
*
*SUBTRACT N LIFE(VES)
SUBNLIFE
MMTM SP,A0,A1
MOVE *A2(PLIVES),A1,W ;GET REMAINING # OF LIVES
JRLE SUBLF1 ;WE'VE HIT BOTTOM
SUB A0,A1
MOVE A1,*A2(PLIVES),W
CALLR OUTLIVES ;AND DISPLAY THE REST
; CALLR OUTTSHIRT
MOVE A1,A1 ;IS THAT IT?
JRLE SUBLF1 ;BR = YES
CLRC
JRUC SUBLFX
SUBLF1:
SETC
SUBLFX:
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* OUTPUT NUMBER OF PLAYER LIVES *
* A2=PLINDX=PLAYER DATA AREA *
* *
**************************************************************************
OUTLIVES:
MMTM SP,A0,A3,A4,A5,A6,A7,A10,A14
MOVE @STORY_MODE,A0,W
JRNZ OUTLIVEX
MOVE *A2(PDRONEFLG),A0,W
JRNZ OUTLIVEX
MOVE @PAGE,A14,W
JRZ OUTLIVESP0
MOVI PAGE1XY,A10
JRUC OUTLIVESGO
OUTLIVESP0:
CLR A10
OUTLIVESGO:
MOVE *A2(PLICON),A14,L ;GET THE ICON
MOVE *A2(PSCRAD),A3,L ;PLAYER SCORE ADDRESS
MOVI PLIFECOF,A0
ADDXY A0,A3 ;ADD OFFSET FOR ACCOUNT CLEAR
ADDXY A10,A3 ;ADD THE PAGE OFFSET
MOVI PLIFESIZ,A4 ;SIZE OF LIFE ACCOUNTING AREA
CALLA BLNKAREA ;ZAP IT
*OUTPUT THE CURRENT # OF LIVES
MOVE *A2(PLIVES),A7,W ;CURRENT # OF LIVES
JRLE OUTLIVEX ;BR = NO LIVES
MOVE *A2(PDINOCNT),A0,W
SUB A0,A7 ;NOW ADJUST FOR THE NUMBER OF DINOS
JRLE OUTLIVEX ;BR = DEFINITELY OUT OF LIVES NOW
**** MOVE *A2(PPALID),A0,L
**** CALLA FINDPAL ;MAKE SURE IT HAS A PALETTE
**** JRNZ OUTLIVPL ;BR = THERE EXISTS A PALETTE
**** MOVE *A2(PPALID),A0,L
**** CALLA GETFPAL ;MAKE A PALETTE EXIST
****OUTLIVPL:
CALLR GET_ICON_PAL
MOVE *A2(PSCRAD),A3,L ;PLAYER SCORE ADDRESS
MOVI PLIFEOF,A0
ADDXY A0,A3 ;A3 = STARTING SCREEN ADDRESS OF LIVES
ADDXY A10,A3 ;ADD PAGE OFFSET
MOVI LIFESPC,A4 ;SPACING BETWEEN LIVES
MOVK NLIVES,A6
MOVI DMAWNZ,A5
OUTLIVE5
CALLA DTIME ;DMA THE NEW LIFE COUNT
ADDXY A4,A3
DEC A6 ;MAX ROCKET COUNT
DSJNE A7,OUTLIVE5
OUTLIVEX
MMFM SP,A0,A3,A4,A5,A6,A7,A10,A14
RETS
**************************************************************************
* *
* GET_ICON_PAL - ROUTINE TO GET THE NUMBER OF THE ICON PALETTE FOR *
* THIS PLAYER. IF IT DOES NOT EXIST, MAKE IT. *
* A2 = PTR TO PLAYER *
* RETURNS *
* A0 = PALETTE NUMBER FOR USE IN OPAL *
* *
**************************************************************************
GET_ICON_PAL
MOVE *A2(PPALID),A0,L
CALLA FINDPAL ;MAKE SURE IT HAS A PALETTE
JRNZ GIP_X ;BR = THERE EXISTS A PALETTE
MOVE *A2(PPALID),A0,L
CALLA GETFPAL ;MAKE A PALETTE EXIST
GIP_X
RETS
**************************************************************************
* *
* SENDOBJ - SEND AN OBJECT TO A PLAYERS SCORE AREA AND AWARD A SCORE *
* A0 = SOUND TO MAKE (IF = 0 THEN NO SOUND) *
* A1 = SCORE TO GIVE (IF = 0 THEN NO SCORE) *
* A2 = PTR TO THE PLAYER DATA AREA *
* A8 = PTR TO THE OBJECT *
* *
**************************************************************************
SENDOBJ
PUSH A1
CALLR SCORE
CLR A1
CALLR SEND2SCR
PULL A1
RETS
**************************************************************************
* *
* SEND2SCR - SEND AN OBJECT AND IT'S SCORE TO A PLAYERS SCORE AREA. *
* A0 = SOUND TO MAKE (IF = 0 THEN NO SOUND) *
* A1 = SCORE TO GIVE (IF = 0 THEN NO SCORE) *
* A2 = PTR TO PLAYER DATA *
* A8 = OBJECT *
* RETURNS: *
* REGS INTACT *
* *
**************************************************************************
SEND2SCR:
MMTM SP,A0,A1,A7,A9,A10,A11
MOVE A0,A9
MOVE A1,A10
MOVE A2,A11 ;ALL IN PROPER PROCESS REGS
CREATE INDPIDE,OBJSCORE
JRNE SEND2OK ;BR = PROCESS WAS CREATED W/SUCCESS
CALLA DELETE_OBJ ;JUST DELETE THE OBJECT
MOVE A10,A1
JRZ S2_NOSCORE ;BR = NO SCORE TO GIVE
CALLR SCORE ;SCORE THE POINTS MAN
S2_NOSCORE:
MOVE A9,A0
JRZ SEND2OK ;BR = NO SOUND TO MAKE
CALLA ONESND ;AND MAKE A SOUND
SEND2OK:
MMFM SP,A0,A1,A7,A9,A10,A11
RETS
**************************************************************************
* *
* OBJSCORE - PROCESS TO SEND AN OBJECT TO THE PLAYERS SCORE AREA *
* ALONG WITH A VISIBLE SCORE VALUE. *
* A8 = OBJECT *
* A9 = SOUND (IF = 0 THEN NO SOUND) *
* A10 = SCORE TO AWARD (IF = 0 THEN NO SCORE) *
* A11 = PTR TO PLAYER DATA *
* *
* NOTE: OBJECT PASSED MUST BE OFF ALL SUPPLEMENTAL LISTS *
* CREATE AS A WAVE-END-WAIT PROCESS *
* *
**************************************************************************
OBJSCORE:
MOVE A8,A5
MOVE *A5(ODMAXY),A8,L
MOVE *A5(OSIZEX),A4,W
SRL 1,A4
ADDXY A4,A8
MOVE A11,A2
CREATE INDPIDE,SCOREOBJ
JRNZ OBJSCRFLY ;O.K. WE'VE CREATED THE SCORE SEND
MOVE A10,A1 ;FAILURE TO CREATE
JRZ OS_NOSCORE ;BR = NO SCORE
CALLA SCORE ;JUST SCORE
OS_NOSCORE:
MOVE A9,A0
JRZ OBJSCRFLY ;BR = NO SOUND
CALLA ONESND ;AND SOUND
OBJSCRFLY:
MOVE A5,A8
MOVI 40,A4 ;1/2 SECOND AIR TIME
JSRP FLYTOPLC
CALLA DELETE_OBJ
DIE
**************************************************************************
* *
* SCOREOBJ - PROCESS TO CREATE A SCORE OBJECT AND FLOAT IT TO THE PLAYER *
* SCORE AREA. THIS PROCESS MAKES THE SOUND AND ALL. *
* A8 = [Y,X] POSITION TO START SCORE OBJECT *
* A9 = SOUND (IF = 0 THEN NO SOUND) *
* A10 = SCORE TO AWARD (IF = 0 THEN NO SCORE) *
* A11 = PTR TO PLAYER DATA *
* *
*NOTE: CREATE AS A WAVE-END-WAIT PROCESS *
* *
**************************************************************************
SCOREOBJ:
MOVI SCORETAB,A1
JRUC SCOBJ_EXE
*
*SCORE2XOBJ - SAME AS SCOREOBJ EXCEPT USES A DIFFERENT LOOK-UP TABLE
SCORE2XOBJ:
MOVI SCORETAB2X,A1
JRUC SCOBJ_EXE
SCOBJ_EXE
MOVE A9,A0
CALLA ONESND ;LET'S MAKE SOME NOISE
MOVE A10,A10
JRZ SO_DIE ;BR = NO SCORE TO MAKE
MOVE A10,A9 ;KEEP THE SCORE HERE
SO_SCLP:
MOVE *A1+,A4,L
JRZ SO_SCORE ;THE SCORE IMAGE CANNOT BE FOUND
CMP A4,A9
JREQ SO_SFOUND ;BR = FOUND A SCORE
ADDK 32,A1
JRUC SO_SCLP ;SEARCH AGAIN
SO_SFOUND:
MOVE *A1,A1,L ;GET THE IMAGE
MOVE A8,A10
CALLA GETOBJ ;GET AN OBJECT FOR THE SCORE
JRZ SO_SCORE
MOVE A0,A8
MOVE *A11(PPALID),A0,L
CALLA GETFPAL
MOVE A0,@CURPAL,W
MOVE A8,A0
MOVI SCRIMGINIT,A14
CALLA STFOBJ
MOVE *A8(OFLAGS),A4,W
CALLA ANI ;ANIMATE IN THE SCORE
MOVE A10,A3
CALLA OBJ_TO_PNT
CALLA INSOBJ
SLEEP 20 ;PAUSE THE SCORE FOR A SECOND
MOVE A11,A2 ;GET THE PLINDX
MOVI 100,A4
JSRP FLYTOPLC
CALLA DELETE_OBJ ;RID O' THE OBJECT
SO_SCORE
MOVE A9,A1
MOVE A11,A2 ;GET THE PLINDX
CALLA SCORE ;TALLY THIS SCORE
SO_DIE:
DIE
*
*GENERIC SCORE IMAGE INIT TABLE
SCRIMGINIT:
.LONG 0,0
.WORD 0,2000H
.LONG SCR1000,0,DUMCOLL
.WORD DMAWNZ,JUNKOID
*
*TABLE OF BCD SCORES AND THEIR ASSOCIATED IMAGES
* .LONG BCD SCORE, PTR TO IMAGE
* .LONG 0
SCORETAB
*GNP CHANGE 5/25/90
.LONG 500H,SCR500
.LONG 1000H,SCR1000,2000H,SCR2000,3000H,SCR3000,4000H,SCR4000
.LONG 5000H,SCR5000,6000H,SCR6000,7000H,SCR7000,8000H,SCR8000
.LONG 9000H,SCR9000,10000H,SCR10000,15000H,SCR15000
.LONG 20000H,SCR20000,25000H,SCR25000,40000H,SCR40000
.LONG 80000H,SCR80000,0
SCORETAB2X
*GNP CHANGE 5/25/90
.LONG 500H,SCR500
.LONG 1000H,SCR1000,2000H,SCR2000,3000H,SCR3000,4000H,SCR4000
.LONG 5000H,SCR5000,6000H,SCR6000,7000H,SCR7000,8000H,SCR8000
.LONG 9000H,SCR9000,10000H,SCR10000,15000H,SCR15000
.LONG 20000H,SCR2X10K,25000H,SCR25000,40000H,SCR2X20K
.LONG 80000H,SCR2X40K,160000H,SCR2X80K,0
**************************************************************************
* *
* FLYTOPL - SEND AN OBJECT TO THE PLAYER STATUS AREA. *
* A2 = PTR TO PLAYER DATA *
* A4 = TRAVEL TIME IN TICKS *
* A8 = PTR TO OBJECT *
* RETURNS WHEN THE OBJECT HAS MADE IT. *
* NOTE: CALL WITH JSRP *
* *
**************************************************************************
FLYTOPL
CLR A0
JRUC FLYTOPLG
FLYTOPLC
MOVI PBOXSIZ,A0
MOVY A0,A1
ZEXT A0
SRL 1,A0
SRL 17,A1
SLL 16,A1
MOVY A1,A0
JRUC FLYTOPLG
*ENTRYPOINT:
*A0 = [Y,X] OFFSET TO ADD TO PSCRAD
FLYTOPLG
PUSHP A2
CALLA PSTOP
MOVE *A2(PSCRAD),A3,L ;SET UP FOR EFFECT
ADDXY A0,A3
MOVE A8,A0
CALLA GSCRNREL
SRL 16,A1
MOVX A1,A2
CALLA SLINEVEL ;GET THE VELOCITIES
FLYTOP1
MOVE A1,*A8(OXVEL),L
MOVE A2,*A8(OYVEL),L ;STUFF THE VELOCITIES
MMTM A12,A1,A2
MOVE A8,A0
CALLA SCRNRELV ;MAKE THE VELOCITIES SCREEN RELATIVE
SLEEP 1
MMFM A12,A1,A2
CALLA SCRTST ;CHECK FOR OFF SCREEN
JREQ FLYTOP1
PULLP A2
RETP
**************************************************************************
* *
* OUTEGGS - ROUTINE TO OUTPUT THE NUMBER OF PLAYER EGGS LEFT. *
* A2 = PTR TO PLAYER DATA AREA *
* *
**************************************************************************
OUTEGGS
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
MOVE @STORY_MODE,A14,W
JRNZ OUTEGGX
MOVE @EGG_SCHEME,A14,W ;ARE WE IN COMPLEX EGG MODE?
JRZ OUTEGGX ;BR = NO
MOVE *A2(PSCRAD),A3,L ;PLAYER SCORE ADDRESS
MOVI PEGGCOF,A0
ADDXY A0,A3 ;ADD OFFSET FOR ACCOUNT CLEAR
MOVI PEGGSIZ,A4 ;SIZE OF LIFE ACCOUNTING AREA
CALLA BLNKAREA ;ZAP IT
MOVE @EGG_LIST,A14,L ;NO EGG PLOT IF THERE IS A SPECIFIC
JRNZ OUTEGGX ;LIST!
MOVE @BONUS_WAVE,A14,W ;BONUS WAVE?
JRNZ OUTEGGX ;BR = NO EGG OUTPUT
MOVE *A2(POBJ),A14,L
JRZ OUTEGGX
CALLA GPLAYNUM
SLL 5,A0
ADDI DINO_EGG_TAB,A0
MOVE *A0,A14,L
MOVE *A14(ISIZEX),A9,W
ADDI [3,2],A9 ;START NUMBERS HERE
ADDXY A3,A9
MOVI DMAWNZ,A5
CALLA DTIME ;PLOP THE EGG THING
*OUTPUT THE CURRENT # OF EGGS LEFT
MOVE @WAVEEGGS,A8,W
MOVE *A2(PEGGS),A14,W
SUB A14,A8
JRGE OUTEGG_NUM
CLR A8
OUTEGG_NUM
CALLR GET_ICON_PAL ;GET THE CORRECT PALETTE FOR THIS
MOVI 0E0E0000H,A5
MOVX A0,A5
MOVK 1,A10
MOVI RD7FONT,A11
CALLA HEXTOASC ;CONVERT
CLR A0
JSRP STRLNRM
OUTEGGX
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
RETS
DINO_EGG_TAB
.LONG rexegg,bloopegg,spikeegg,gwenegg
*STOP WATCH CODE COMMENTED OUT 8/24/90
.IF 0
**************************************************************************
* *
* STOP_WATCH - PROCESS TO OUPUT THE NUMBER OF SECONDS LEFT FOR FAST *
* FINISH. *
* *
**************************************************************************
STOP_WATCH:
ALLPLYR UPDATE_TIME
SLOOP 60,STOP_WATCH
**************************************************************************
* *
* OUT_TIME - SPECIAL ROUTINE TO OUTPUT THE TIMER. THIS ONE PUSHES *
* REGISTERS. TO BE CALLED BY ANYONE *
* NOTE: A14 IS TRASHED *
* *
**************************************************************************
OUT_TIME:
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A8,A9,A10,A11
CALLR UPDATE_TIME
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A8,A9,A10,A11
RETS
**************************************************************************
* *
* OUT_TIME - OUTPUT A PLAYERS CURRENT TIME *
* A2 = PLAYER DATA *
* NOTE: TRASHES A-FILE REGISTERS EXCEPT A7. *
* *
**************************************************************************
UPDATE_TIME:
MOVE *A2(POBJ),A14,L
JRZ UP_TIME_X
MOVE @STORY_MODE,A14,W
JRNZ UP_TIME_X
MOVE *A2(PDRONEFLG),A14,W
JRNZ UP_TIME_X
*
MOVE *A2(PINSTRUCT),A14,W
JRNZ UP_TIME_X
MOVE *A2(PSCRAD),A3,L
ADDI STOPW,A3 ;THIS IS WHERE WE'LL PUT IT
MOVE A3,A9
SUBK 1,A9
MOVI STOPWSIZ,A4
CALLA BLNKAREA
*GNP CHANGES 5/14/90
**** MOVI 1923,A8
MOVE @FAST_TIME,A8,W
*END GNP CHANGES
MOVE *A2(PWAVETIME),A0,L
SUB A0,A8
JRN UP_TIME_X
SRL 6,A8 ;DIVIDE ROUGHLY BY 62.5 FOR SECONDS
MOVE *A2(PPALID),A0,L
CALLA FINDPAL ;MAKE SURE IT HAS A PALETTE
MOVI 0E0E0000H,A5
MOVX A0,A5
MOVK 1,A10
MOVI RD5FONT,A11
CALLA HEXTOASC ;CONVERT
MOVI ':',A0
MOVE A8,A1
UP_TIME_INSLP:
MOVB *A1,A3
MOVB A0,*A1
ADDK 8,A1
MOVE A3,A0
JRNZ UP_TIME_INSLP
MOVB A0,*A1 ;STUFF THAT NULL BACK ON
CLR A0
PUSH A7
JSRP STRLNRM
PULL A7
UP_TIME_X:
RETS
.ENDIF
.END