revolution-x/GXBONUS.ASM

2790 lines
70 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

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

.MLIB "GXMACS.LIB"
.FILE "GXBONUS.ASM"
.TITLE "<<< REVOLUTION X -- BONUS STUFF AN'NAT >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1993 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "IMGTBL.GLO"
.INCLUDE "BGNDTBL.GLO"
.INCLUDE "GX.INC"
.INCLUDE "GXSTRING.H"
.INCLUDE "GXBONUS.TBL"
.INCLUDE "GXBOOSH.TBL"
*
*Symbols from Bonusing
*
.DEF GO_BONUS,INIT_ZERO_UNIVERSE
.DEF SETUP_TEST ,JAKE_BOX
.DEF BONUS_SET_X, NUMBER_RACKS
.DEF AERO_WINGS_INIT
*
*Symbols from around the GLOBE
*
*FROM GX
.REF MYOINIT,DUXNOFADE, PLAYER_BONUS_RESTART
.REF SND_DIR_CHOSEN,SND_DIR_INACTIVE
.REF GUNS_OFF,FADEOUT_PAL
.REF CREATE_MULTI_COPY
***** from GXCONTRL.ASM
.REF PLAYER_CURSOR
.REF CURSOR_OFF
*FROM GXFADE.ASM
.REF GO_NORMAL,GO_WHITE
***** from GXKERRI.ASM
.REF PROC_KERRI_KISS
*FROM GXRAM
.REF ENEMIES_TOTAL
.REF ENEMIES_P1
.REF ENEMIES_P2
.REF ENEMIES_P3
.REF BONUS_ONCE
.REF CALCULATE_HORIZON
.REF CR_STRTP
*number storage
.BSS NUM_DATA,32 ;USED TO STORE NUMBERS TEMPORARILY
.BSS NUM_DATA_2,32 ;USED TO STORE NUMBERS TEMPORARILY
.BSS NUM_DATA_3,32 ;USED TO STORE BONUS FOR EACH RACK UP
.BSS NUMBER_RACKS,32 ;ARE WE 2 OR 3 PLAYERS
.BSS WAVES_DONE,32
.BSS DIR_SELECTED,32
PBLK_STOR .EQU PDATA+0200H ;STORE AWAY THE PLAYER BLOCK IN A PROCESS
.TEXT
;**************************************************************************
;* *
;* Actually start the bonus routine. *
;* input *
;* - A1 0 - bring on from top of screen and ignore dash board stuff *
;* 1 - bring on from bottom of screen and include dash *
;* 2 - bring on from left of screen and include dash *
;* 3 - bring on from right of screen and include dash *
;* *
;**************************************************************************
GO_BONUS
SETUP_TEST
MOVE A1,A1
JRNN GB_GO_GO_GO ;BR = OK to do bonus
RETP
GB_GO_GO_GO
PUSH A1
CALLA MYOINIT ;initialize evreyfink
CALLA INIT_ZERO_UNIVERSE ;set up dummy universe
CALLA KILL_THAT_FUCKING_BUG
MOVIM -1,@GAMERASE,W ;make us erase all
MOVIM SCRNST,@SCRNTL,L
MOVI [0FDH,450],A1
MOVE A1,@SCRNBR,L
MOVI [20H,-18H],A1
MOVE A1,@SCRNTL,L
MOVE @NPLAYERS,A10,W ;how many players are able to play
DEC A10
SLL 5,A10
MOVE A10,@NUMBER_RACKS ;0 - 2 players ; 10h - 3 players
SOUND1 WOOSH_SND
DISPON
PULLQ A1 ;now, where were we ?
MOVE A1,A2 ;oh yeah, depending on what A1 is,
SLL 5,A1 ;jump to a specific scroll on
ADDI WHERE_TO_START,A1 ;routine
MOVE *A1,A1,L
JUMP A1
*Which way to bring on bonus screen
*
WHERE_TO_START
.LONG BRING_ON_FROM_TOP
.LONG BRING_ON_FROM_BOT
.LONG BRING_ON_FROM_LEFT
.LONG BRING_ON_FROM_RIGHT
;**************************************************************************
;* *
;* Create us a universe with the horizon at the bottom of the screen *
;* *
;**************************************************************************
INIT_ZERO_UNIVERSE
MOVIM 0FEH,@YHALF,W ;YHALF = MidScreen
MOVIM 70000H,@ZFAR,L
MOVIM 0H,@YWORLD,L
CLRM @GROUNDCOLOR,W
CLRM @SKYCOLOR,W
JAUC CALCULATE_HORIZON
;**************************************************************************
;* *
;* Bring the screen on from the top, do the rack up stuff and *
;* then just exit the bonus screen *
;* *
;**************************************************************************
BRING_ON_FROM_TOP
ADDI BONUS_BGND_T,A10 ;start us high
MOVE *A10,A10,L ;which background, 2 or 3 player ?
CALLA StrtBgnd
SLEEP 3 ;on with one plane
MOVIM 0240000H,@YSCROLL,L
SLEEP 50 ;zap us down
CLRM @YSCROLL,L
SLEEP 50 ;stop us moving
JSRP CONTINE_BONUS ;do rest of rack up
JRUC EXIT_BONUS ;now run away home ....
;**************************************************************************
;* *
;* Bring the screen on from the bottom, do the rack up stuff and *
;* then do the dash board stuff. Then run home to mommy *
;* input -
;* A10 contains
;* *
;**************************************************************************
BRING_ON_FROM_BOT
MOVIM 07000000H,@YBASE,L ;start us high
ADDI BONUS_BGND_B,A10 ;which background, 2 or 3 player ?
MOVE *A10,A10,L
CALLA StrtBgnd ;on with one plane
SLEEP 3
MOVIM -0220000H,@YSCROLL,L ;zap us down
SLEEP 50
CLRM @YSCROLL,L ;stop us moving
JSRP CONTINE_BONUS ;do rest of rack up
JRUC DO_DASH ;you're soooooo dashing !
;**************************************************************************
;* *
;* Bring the screen on from the right, do the rack up stuff and *
;* then do the dash board stuff. Then run home to mommy *
;* *
;**************************************************************************
BRING_ON_FROM_RIGHT
MOVIM 07000000H,@YBASE,L ;start us high
ADDI BONUS_BGND_R,A10 ;which background, 2 or 3 player ?
MOVE *A10,A10,L
CALLA StrtBgnd ;on with one plane
SLEEP 3
MOVIM 080000H,@XSCROLL,L ;zap us right
SLEEP 50
CLRM @XSCROLL,L ;stop us moving
JSRP CONTINE_BONUS ;do rest of rack up
JRUC DO_DASH ;you're soooooo dashing !
;**************************************************************************
;* *
;* Bring the screen on from the left, do the rack up stuff and *
;* then do the dash board stuff. Then run home to mommy *
;* *
;**************************************************************************
BRING_ON_FROM_LEFT
MOVIM 07000000H,@YBASE,L ;start us high
ADDI BONUS_BGND_L,A10 ;which background, 2 or 3 player ?
MOVE *A10,A10,L
CALLA StrtBgnd ;on with one plane
SLEEP 3
MOVIM -080000H,@XSCROLL,L ;zap us left
SLEEP 50
CLRM @XSCROLL,L ;stop us moving
JSRP CONTINE_BONUS ;do rest of rack up
JRUC DO_DASH ;you're soooooo dashing !
;**************************************************************************
;* *
;* With the screen in place, start the bonus rackup *
;* *
;**************************************************************************
CONTINE_BONUS
JSRP HACK_IT ;put up hacking message and do SFX
MOVI P1DATA,A10
CREATE PID_ATT,SET_UP_EACH_PLAYER ;set up plyr1 for rack up
MOVI P2DATA,A10
CREATE PID_ATT,SET_UP_EACH_PLAYER ;set up plyr2 for rack up
MOVI P3DATA,A10
CREATE PID_ATT,SET_UP_EACH_PLAYER ;set up plyr3 for rack up
MOVI PID_BONUS,A0
CALLA KILLPROC_ALL
MOVI CHECK_ENEMIES_TABLE,A11 ;grab enemy check table
NEXT_RACK
MOVI P1DATA,A10 ;set up player1 data block
MOVI ENEMIES_P1,A9 ;set up player1 counter
CREATE PID_BONUS,DO_EACH_RACKUP ;rack up enemys for plyr1
MOVI P2DATA,A10 ;set up player2 data block
MOVI ENEMIES_P2,A9 ;set up player2 counter
CREATE PID_BONUS,DO_EACH_RACKUP ;rack up enemys for plyr2
MOVI P3DATA,A10 ;set up player3 data block
MOVI ENEMIES_P3,A9 ;set up player3 counter
CREATE PID_BONUS,DO_EACH_RACKUP ;rack up enemys for plyr3
MOVI 10000,A9
RACKUP_NOT_DONE_YET
SLEEP 1
DEC A9
JRZ TIME_OUT_ZOOM
MOVI PID_BONUS,A0 ;is plyr1 rack up still going ?
CALLA EXISTP_ALL
JRNZ RACKUP_NOT_DONE_YET
TIME_OUT_ZOOM
MOVE *A11+,A0,L ;get next enemy to check against
MOVE *A11+,A0,L
MOVE *A11+,A0,L
MOVE *A11,A0,L
INC A0 ;have we reached the last enemy ?
JRNZ NEXT_RACK
SLEEP 40 ;finished racking up sub bonuses
* GEORGE, THIS IS WHERE YOUR HOOK WILL GO
MOVE @P1DATA+POBJ,A1,L
MOVE @P2DATA+POBJ,A2,L
MOVE @P3DATA+POBJ,A3,L
CLR A4
MOVE A1,A1
JRZ CHECK_A2
INC A4
CHECK_A2
MOVE A2,A2
JRZ CHECK_A3
INC A4
CHECK_A3
MOVE A3,A3
JRZ CHECK_A4
INC A4
CHECK_A4
CMPI 2,A4
JRLT NO_GIRL
MOVI P1DATA,A1,L
MOVE @P1DATA+PBONUSCORE,B1,L
MOVI P2DATA,A2,L
MOVE @P2DATA+PBONUSCORE,B2,L
MOVI P3DATA,A3,L
MOVE @P3DATA+PBONUSCORE,B3,L
CMP B1,B2
JRLT NO_SWITCH_B2
MOVE B2,B1
MOVE A2,A1
NO_SWITCH_B2
CMP B1,B3
JRLT NO_SWITCH_B3
MOVE B3,B1
MOVE A3,A1
NO_SWITCH_B3
MOVE A1,A2
MOVE B1,B1
JRZ NO_GIRL
;THIS IS THE HOOK - A2 POINTS AT GUY TO DO
; JSRP ????
PUSH A11
MOVE A2,A11
CREATE PID_IND,PROC_KERRI_KISS
PULLQ A11
SLEEP 100
NO_GIRL
SOUND1 SCORE_GOES_UP
MOVI P1DATA,A10 ;set up stuff ready for score zoom
MOVE @P1DATA+PBONUSOBJ,A8,L
CREATE PID_GOODIE,ZOOM_BONUS_UP ;make score zoom up
MOVI P2DATA,A10 ;set up stuff ready for score zoom
MOVE @P2DATA+PBONUSOBJ,A8,L
CREATE PID_GOODIE,ZOOM_BONUS_UP ;make score zoom up
MOVI P3DATA,A10 ;set up stuff ready for score zoom
MOVE @P3DATA+PBONUSOBJ,A8,L
CREATE PID_GOODIE,ZOOM_BONUS_UP ;make score zoom up
ZOOM_NOT_DONE_YET
SLEEP 1
MOVI PID_GOODIE,A0 ;has score finished zooming yet ?
CALLA EXISTP_ALL
JRNZ ZOOM_NOT_DONE_YET
MOVE @P1DATA+PBONUSCORE,A0,L ;add p1 total bonus to real score
MOVE @P1DATA+PSCORE,A1,L
ADD A0,A1
MOVE A1,@P1DATA+PSCORE,L
MOVE @P2DATA+PBONUSCORE,A0,L ;add p2 total bonus to real score
MOVE @P2DATA+PSCORE,A1,L
ADD A0,A1
MOVE A1,@P2DATA+PSCORE,L
MOVE @P3DATA+PBONUSCORE,A0,L ;add p3 total bonus to real score
MOVE @P3DATA+PSCORE,A1,L
ADD A0,A1
MOVE A1,@P3DATA+PSCORE,L
CALLA SCORAREA ;update score are with new score
MOVI OID_TEXT,A0 ;kill all rack up text
CALLA KILOBJ_ALL
MOVI OID_P2TEXT,A0 ;kill TOTAL BONUS text
CALLA KILOBJ_ALL
MOVI OID_P1MOTEXT,A0 ;kill TOTAL BONUS score
CALLA KILOBJ_ALL
RETP
;**************************************************************************
;* *
;* Make bonus zoom up into score box *
;* *
;**************************************************************************
ZOOM_BONUS_UP
MOVE A8,A8 ;if no bonus already there
JRZ NO_BONUS_SO_NO_WORRY ;dont delete it
CALLA DELETE_OBJ
MOVE A10,*A13(PBLK_STOR),L ;grab plyr block data address
MOVE *A10(PBONUSCORE),A0,L ;get bonus score from data area
MOVE A0,@NUM_DATA,L ;store it ready to to be displayed
MOVI TOTAL_NUM2,A8
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE A2,A8 ;store away the score object
MOVI [-5,0],A1 ;set up zoom up velocity
MOVE A1,*A8(OYVEL),L
MOVI 20,A11 ;create 20 copies
COPY_ZOOM_OBJ
CALLA CREATE_MULTI_COPY ;copy score object
PUSH A8 ;store away original score object
MOVE A0,A8 ;move new score object into a8
CLR A0
MOVE A0,*A8(OYVEL),L ;stop new score object from moving
CALLA INSERT_OBJ ;insert new object
CREATE PID_GOODIE,KILL_SOON ;set up routine to fade and kill
PULLQ A8 ;get pointer to original back again
SLEEP 2 ;sleep a bit
DSJS A11,COPY_ZOOM_OBJ ;go create another copy
NO_BONUS_SO_NO_WORRY
DIE
KILL_SOON ;sleep a bit and change constant
SLEEP 3 ;color so we go through gray to
MOVI 0909H,A1 ;black, then kill object
CALLR SET_CONST
SLEEP 3
MOVI 0A0AH,A1
CALLR SET_CONST
SLEEP 3
MOVI 0B0BH,A1
CALLR SET_CONST
SLEEP 3
MOVI 0C0CH,A1
CALLR SET_CONST
SLEEP 3
MOVI 0D0DH,A1
CALLR SET_CONST
SLEEP 3
CALLA DELETE_OBJ
DIE
SET_CONST
MOVE A8,A0 ;set a constant color for a multi
SET_NEXT_CONST ;part object
MOVE A1,*A0(OCONST)
MOVE *A0(OPARTS),A0,L
JRNZ SET_NEXT_CONST
RETS
;**************************************************************************
;* *
;* Do dash board bit of bonus and then exit *
;* *
;**************************************************************************
DO_DASH
MOVI PID_ATT,A0 ;kill the process allowing someone
CALLA KILLPROC_ALL ;to join in at this time
; SOUND1 WOOSH_SND ;do screen woosh on
MOVE @WAVE,A1 ;should we put up CD ?
.IF DEBUG
DEC A1
.ENDIF
CMPI 2,A1 ;if we aren't at the end of the
JRNE AVOID_DOING_STEVE ;chopper, don't do the steve stuff
SOUND1 WOOSH_SND ;do screen woosh on
CLRM @WAVES_DONE,L ;clear out which waves have been done
MOVI CD_INIT,B0 ;create the CD
CALLA EASYMAKE
MOVE A0,A8
MOVI -050000H,A1 ;scroll the screen and the CD on
MOVE A1,*A8(OYVEL),L
MOVI -0220000H,A1
MOVE A1,@YSCROLL,L ;move us from bonus screen
SLEEP 50 ;to dash board below
CLR A1
MOVE A1,*A8(OYVEL),L
MOVE A1,@YSCROLL,L ;STOP !!!!
MOVI 05C0000H,A1 ;make sure screen and CD get to the
MOVE A1,@YBASE,L ;right spot, avoiding sleep errors
MOVI 00DD0000H,A1
MOVE A1,*A8(OYVAL),L
SLEEP 10
SOUND1 CD_DASH_SND ;do CD slide sound
MOVI DISC2124,A1 ;grab CD SAG
MOVE *A1(ISAG),A9,L
MOVI 145*7,A11 ;set up width of CD img in pixels
MOVI 40,A10 ;set up height of CD
MOVE_DISK_IN
SLEEP 1 ;add CD width to SAG
ADD A11,A9
MOVE A9,*A8(OSAG),L
MOVE *A8(OUSIZEY),A1 ;decrement Y size so it appears to move up
DEC A1
MOVE A1,*A8(OUSIZEY)
MOVE A1,*A8(OSIZEY)
DSJS A10,MOVE_DISK_IN ;do it 40 times
SLEEP 1
CALLA DELETE_OBJ ;delete the CD object
MOVI LEDPAL1,A8 ;make LED's flash
MOVK 1,A9
MOVK 2,A10
MOVK 4,A11
CREATE PID_DAMCC,CYCLE16
MOVI STEVEN_STUFF,A8 ;put up steven saying "LOOKS LIKE YOU.."
JSRP SLAP_UP_GUYS
JRUC GO_TO_CHOICE ;jump to dir selection
AVOID_DOING_STEVE
MOVE @WAVES_DONE,A1 ;have all waves been done ?
CMPK 7,A1
JRNE DASH_DOODOO ;BR = All waves not selected
MOVE @WAVE,A14,W
CMPK LAST_WAVE,A14
JRHS EXIT_BONUS ;BR = We've done it all
DASH_DOODOO
SOUND1 WOOSH_SND ;do screen woosh on
MOVI -0220000H,A1
MOVE A1,@YSCROLL,L ;move us from bonus screen
SLEEP 50 ;to dash board below
CLR A1
MOVE A1,@YSCROLL,L ;STOP !!!!
MOVI LEDPAL1,A8 ;make LED's flash
MOVK 1,A9
MOVK 2,A10
MOVK 4,A11
CREATE PID_DAMCC,CYCLE16
CLR A8
MOVK 5,A1 ;set up wave as though we have finished
MOVE @WAVES_DONE,A2 ;have all waves been done ?
CMPI 7,A2
JREQ WHICH_GUY_SET
GO_TO_CHOICE
SOUND1 SND_SWEET_VOCALS
JSRP SLAP_UP_OBJECTIVE ;put up objectives on the screen
MOVE @WAVES_DONE,A1,L ;reset waves done to clear top 16 bits
MOVE A1,A2
SLL 16,A2
SRL 16,A2
MOVE A2,@WAVES_DONE,L
SRL 16,A1 ;this is wave selected
WHICH_GUY_SET
SLL 6,A1
ADDI WHICH_WAVE_AND_GUY_TABLE-040H,A1
MOVE *A1+,A8,L
MOVE *A1+,A3
.IF DEBUG
INC A3
.ENDIF
MOVE A3,@WAVE ;store us a new wave to do
JSRP SLAP_UP_GUYS ;put up which ever guy should be there
* Finish bonus / selection, lets go home
*
EXIT_BONUS
MOVI PID_DAMCC,A0
CALLA KILLPROC_ALL
MOVI DUXNOFADE,A0 ;fade us out
CALLA FADEOUTF
SLEEP 12
CLR A0
CLR A1
CALLA KILL_DESTRUCTIBLES ;kill background procs
CALLA OINIT ;kill objects
RETP
WHICH_WAVE_AND_GUY_TABLE
.LONG PERRY_STUFF,2
.LONG BRAD_STUFF,3
.LONG 0,0
.LONG KRAMER_STUFF,4 ;this is where mid east guy will go
.LONG TOM_STUFF,5 ;this is where end wave guy will go
;**************************************************************************
;* *
;* Put up fancy hacking images whilst hacking message displayed *
;* *
;**************************************************************************
HACK_IT
MOVE @BONUS_ONCE,A14,W
JRZ HT_DO_GEEKNESS ;BR = Haven't hooked up yet
MOVI ATP4_MESS,A8 ;Still connected
CALLA LM_SETUP
MOVK 1,A0
JSRP PRINTF
JRUC HT_LOOKUP ;Go scan the data base
HT_DO_GEEKNESS
MOVKM 1,@BONUS_ONCE,W
SOUND1 MODEM_SND
MOVI ATP_MESS,A8 ;DISPLAY "HACKING..."
CALLA LM_SETUP
MOVK 1,A0
JSRP PRINTF
SLEEP 200 ;wait for connexion
MOVI ATP2_MESS,A8 ;we have connected !!
CALLA LM_SETUP
MOVK 1,A0
JSRP PRINTF
MOVI ATP3_MESS,A8 ;print up geek stuff
CALLA LM_SETUP
MOVK 1,A0
JSRP PRINTF
HT_LOOKUP
MOVE @NUMBER_RACKS,A3 ;are we 2 or 3 players
ADDI HACK_IT_TABLE,A3 ;add to num of boxes table
MOVE *A3,A3,L
MOVI P1DATA,A9 ;set up for player 1
DO_NEXT_HACK
MOVE *A3+,A0,L ;are we at end of box table ?
JRZ LAST_HACK
MOVE A0,A8 ;grabed box defintion for player
CREATE PID_JUNK,HACK_IT_ON ;set up box scale proc
ADDI PDSIZE,A9 ;next player
JRUC DO_NEXT_HACK
LAST_HACK
SLEEP 10
SOUND1 HACK_DATA_SND
WAIT_LAST_HACK
SLEEP 3
MOVI PID_JUNK,A0 ;wait until box procs are dead
CALLA EXISTP_ALL
JRNZ WAIT_LAST_HACK
SLEEP 5
MOVI OID_TEXT,A0 ;kill hacking message
CALLA KILOBJ_ALL
SLEEP 10
RETP
;**************************************************************************
;* *
;* Stick hack box up on screen, then do cool shit with it, then *
;* delete it *
;* *
;**************************************************************************
HACK_IT_ON
MOVE A8,B0
CALLA EASYMAKE ;create box
MOVE A0,A8
MOVE *A8(OYVAL),A3,L ;store initial Y/X pos in storage
MOVE *A8(OXPOS),A4 ;for use later in avoiding that
MOVX A4,A3 ;incredibly stupid anim point fuck up
MOVE A3,*A8(ODATA),L
MOVE *A9(PPID),A1 ;get player PID
SLL 8,A1
ADDI PID_IND,A1
MOVI SCALE_BOX_ON,A7 ;scale box up from small
CALLA GETPRC
MOVE A1,A9 ;keep PID around
IS_BOX_STILL_COMING_ON_H
SLEEP 1
MOVE A9,A0 ;is box proc still going ?
CALLA EXISTP_ALL
JRNZ IS_BOX_STILL_COMING_ON_H
* do fancy flickering graphics for hacking database
*
MOVI CHECK_ENEMIES_TABLE,A11
NEXT_HACK
SLEEP 10
MOVE *A11(040H),A1,L
JRZ NO_HACK_BOX
MOVE *A1(ICMAP),A0,L
CALLA CHANGE_PAL
MOVE *A8(OCTRL),A4
MOVE *A1(IANIOFF),*A8(OUANIOFF),L
CALLA ANI
MOVI 0100H,A9
CALLR RESET_DAG_FOR_SCALE
NO_HACK_BOX
MOVE *A11+,A0,L ;get next enemy to check against
MOVE *A11+,A0,L
MOVE *A11+,A0,L
MOVE *A11,A0,L
INC A0 ;have we reached the last enemy ?
JRNZ NEXT_HACK
SLEEP 10
MOVE A9,A1 ;scale box down to small and kill it
MOVI SCALE_BOX_OFF,A7
CALLA GETPRC
DIE
;**************************************************************************
;* *
;* Set up the screen for rack up *
;* If this player is playing then .. *
;* Put up TOTAL BONUS text, as well as TOTAL BONUS score *
;* Else *
;* Put up the join in message, and then wait until the player *
;* buys in, in which case, replace join in with stand by *
;* *
;**************************************************************************
SET_UP_EACH_PLAYER
CLR A8
CLR A9
MOVE A10,*A13(PBLK_STOR),L ;stor plyr block data address
MOVE *A10(POBJ),A6,L ;is this player playing ?
JRZ PUT_UP_JOIN_IN
MOVI TOTAL_MESS,A8 ;yep, so put up TOTAL BONUS
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
CLR A1
MOVE A1,*A10(PBONUSCORE),L ;clear out TOTAL bonus score
MOVE A1,@NUM_DATA,L ;also clear out num to be displayed
MOVI TOTAL_NUM,A8 ;display total bonus score
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE A2,*A10(PBONUSOBJ),L ;store Total bonus score obj
DIE
;**************************************************************************
;* *
;* Display the join in message, whilst waiting to put *
;* up the stand by message *
;* *
;**************************************************************************
PUT_UP_JOIN_IN
MOVI JOIN_IN_MESS,A6 ;Set up press start mess
CALLA CR_STRTP
JRHS JOIN_IN_MESS_RIGHT ;have we credits enuff ?
MOVI COIN_IN_MESS,A6 ;set up insert coin mess
JOIN_IN_MESS_RIGHT
PUSH A6 ;save mess type
CMP A6,A9
JREQ NO_NEW_MESS ;is it same as last mess ?
MOVE A8,A8 ;no, can we delete last mess
JRZ NO_MESS_TO_DELETE
CALLA DELETE_OBJ ;yes, delete last mess
NO_MESS_TO_DELETE
CLR A2
MOVE A6,A8 ;set up join in mess
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE A2,A8 ;keep join in mess obj around
NO_NEW_MESS
PULLQ A9 ;restore this tick mess
WAIT_FOR_PLAYER_ENTRY
SLEEP 1
MOVE *A10(PENTER),A1 ;has player bought in ?
JRZ PUT_UP_JOIN_IN
CALLA DELETE_OBJ ;delete join in mess
MOVI STAND_BY_MESS,A8 ;stick up stand by mess
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
DIE
;**************************************************************************
;* *
;* Do the actual racking up for each enemy and/or damage *
;* and/or casualties *
;* *
;**************************************************************************
DO_EACH_RACKUP
MOVE A10,*A13(PBLK_STOR),L ;stor plyr block data address
CLR A1
MOVE A1,*A10(PBONUSYNCH) ;clear out plyr synch bits in case
MOVE *A10(POBJ),A6,L ;is this player playing ?
JRZ THIS_GUY_NOT_PLAYING
MOVK 1,A1 ;yes, so set synch bit so other
MOVE A1,*A10(PBONUSYNCH) ;plyr procs will wait for us
MOVE *A11(020H),A1,L ;get type of rack up routine
JUMP A1 ;from enemy check table
;**************************************************************************
;* *
;* Normal rack up with number wiped out, % accuracy, and bonus *
;* *
;**************************************************************************
DISPLAY_NORMAL_RACK
MOVE *A11,A0,L ;grab enemy table offset
MOVE A0,A1 ;from enemy check table
ADD A9,A1 ;add player counter table to offset
MOVE *A1,A1 ;and get number killed from table
MOVE A1,@NUM_DATA,L
ADDI ENEMIES_TOTAL,A0 ;add enemy total counter to offset
MOVE *A0,A0 ;and get number of enemies spawned
JRZ THIS_GUY_NOT_PLAYING ;if none, then this rackup is OVER
MOVE *A11(040H),A6,L ;get box image from enemies table
PUSH A6 ;save for later
CALLR GETPERCENT ;figure out what % player hit
MOVE A1,@NUM_DATA_2,L
MOVI STAT0_MESS,A8 ;put up number wiped out
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVI STAT1_MESS,A8 ;put up % hit
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE @NUM_DATA,A1 ;bonus = number hit * 1000
MOVI 01000,A3
MPYU A1,A3
MOVE A3,@NUM_DATA_3,L
MOVI STAT2_MESS,A8 ;put up bonus number
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
JRUC CONTINUE_THIS_RACK
;**************************************************************************
;* *
;* Rescued rack up with number rescued, % accuracy, and bonus *
;* *
;**************************************************************************
DISPLAY_RESCUE_RACK
MOVE @WAVE,A10 ;if playing from club to heli, miss this
.IF DEBUG
DEC A10 ;counter debug thing
.ENDIF
CMPK 2,A10 ;are we at roof in wave 1 ?
JREQ THIS_GUY_NOT_PLAYING
MOVE *A11(040H),A6,L ;get box image from enemies table
PUSH A6 ;save for later
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE *A10(PGIRLS_SAVED),A1 ;get no of babes player rescued
MOVE A1,@NUM_DATA,L
MOVI STAT0A_MESS,A8 ;put up number wiped out
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE @NUM_DATA,A1 ;bonus = number hit * 1000
MOVI 010000,A3
MPYU A1,A3
MOVE A3,@NUM_DATA_3,L
MOVI STAT2_MESS,A8 ;put up bonus number
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
JRUC CONTINUE_THIS_RACK
;**************************************************************************
;* *
;* WINGS rack up with wings earned *
;* *
;**************************************************************************
DISPLAY_WINGS_RACK
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE *A10(PWINGS),A9
JRZ NO_WINGS_EARNED
MOVI WINGS_MESS,A8 ;put up number wiped out
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVI WING_BONUS_MESS_2,A8 ;put up number wiped out
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE *A10(PBONUSCORE),A11,L ;grab bonus score ready for multiplying
CLR A1
MOVE A1,*A10(PBONUSCORE) ;clear out number of wings earned
CLR A8 ;no wings earned yet
MOVE *A10(PWINGS),A9
INC A9
DISPLAY_NEXT_WING
MMTM A12,A9,A11 ;store away registers to be corrupted
MOVE A8,A8
JRZ IGNORE_WING_DELETE
CALLA DELETE_OBJ ;delete bonus multiplier object
IGNORE_WING_DELETE
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE *A10(PBONUSCORE),A2 ;have to use bonus score as storage
INC A2 ;for number of wings earned cos we got
MOVE A2,*A10(PBONUSCORE) ;nothing else to use
MOVE A2,@NUM_DATA_2,L
DEC A2
JRZ NO_WINGS_DISPLAYED ;no wings on screen yet
MOVI AERO_WINGS_INIT,B0
CALLA EASYMAKE
SLL 5,A2
ADDI WINGPOS_TABLE-20H,A2
MOVE *A2,A9,L
CALLR BONUS_SET_X
MOVE A9,*A0(ODAG),L
MOVE A9,*A0(OXPOS)
SRL 16,A9
MOVE A9,*A0(OYPOS)
MOVI 02000200H,A1
MOVE A1,*A0(OSCALE),L
MOVI 6000H,A1
MOVE A1,*A0(OZVAL),L
NO_WINGS_DISPLAYED
MOVE @NUM_DATA_2,A1 ;increment number of wings earned
MPYU A11,A1 ;multiply bonus score by wings earned
MOVE A1,@NUM_DATA,L
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE *A10(PBONUSOBJ),A8,L
CALLA DELETE_OBJ ;delete bonus total number object
MOVI TOTAL_NUM,A8 ;put up bonus number
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE A2,*A10(PBONUSOBJ),L
MOVE A2,A8 ;put up a box around the bonus score
MOVI [6,6],A4
MOVI COLOR_WHITE,A7
CALLR JAKE_BOX
MOVE A6,A8
CREATE PID_JUNK,KILL_BOX_SOON ;set up routine to kill highlite box
SOUND1 SCORE_MUL_SND
MOVI WING_BONUS_MESS,A8 ;put up bonus number
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE A2,A8 ;store away bonus multiplyer object
MOVE @NUM_DATA,A10,L
SLEEP 50
MMFM A12,A9,A11 ;recover registers corrupted by print
DEC A9
JRNZ DISPLAY_NEXT_WING ;more wings earned ?
MOVE A10,A1
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE A1,*A10(PBONUSCORE),L ;store new bonus in bonus total
CLR A8
MOVE A8,@P1DATA+PBONUS_STOR,L
MOVE A8,@P2DATA+PBONUS_STOR,L
MOVE A8,@P3DATA+PBONUS_STOR,L
JRUC UPDATING_SCORE_DONE ;bypass normal rackup
KILL_BOX_SOON
SLEEP 20 ;kill hilite box after 15 tixs
CALLA DELETE_OBJ
DIE
WINGPOS_TABLE
.LONG [80,20]
.LONG [80,74]
.LONG [105,46]
.LONG [130,20]
.LONG [130,74]
NO_WINGS_EARNED
MOVI NO_WING_BONUS_MESS,A8 ;put up bonus number
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
SLEEP 40 ;kill hilite box after 15 tixs
CLR A8
MOVE A8,@P1DATA+PBONUS_STOR,L
MOVE A8,@P2DATA+PBONUS_STOR,L
MOVE A8,@P3DATA+PBONUS_STOR,L
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
JRUC UPDATING_SCORE_DONE ;bypass normal rackup
;**************************************************************************
;* *
;* Casualty bonus, if no casualties then say so, otherwise *
;* set up -bonus *
;* *
;**************************************************************************
DISPLAY_CASUALTIES
MOVE *A11(040H),A6,L ;get box image from enemies table
PUSH A6 ;save for later
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE *A10(PCASUALTY),A1 ;get player casualties
MOVE A1,@NUM_DATA,L
JRZ NO_CASUALTIES ;did we actaully kill anyone ?
MOVI HC_MESS,A8 ;display number of dead un's
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVI HUMAN_MESS,A8 ;display WE GOT DEAD UN's
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MOVE @NUM_DATA,A1,L ;-bonus = casualties * 50000
MOVI 050000,A3
MPYU A3,A1
NEG A1
MOVE A1,@NUM_DATA_3,L ;stored in bonus var
MOVI PEN_MESS,A8
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
JRUC CONTINUE_THIS_RACK
NO_CASUALTIES
CLRM @NUM_DATA_3,L ;clear out bonus var
MOVI HC_MESS,A8 ;put up NO CASUALTIES mess
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
MOVI NOHCSTR,A8
JSRP PRINTF
JRUC CONTINUE_THIS_RACK
;**************************************************************************
;* *
;* Damage rackup *
;* *
;**************************************************************************
DISPLAY_DAMAGE_RACK
MOVE *A11(040H),A6,L ;get box image from enemies table
PUSH A6 ;save for later
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE *A10(PDAMAGE),A1 ;grab plyr damage
MOVI 01000,A3 ;times by 100000
MPYU A3,A1 ;and store in bonus
MOVE A1,@NUM_DATA_3,L
MOVI DAM_MESS,A8
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
JRUC CONTINUE_THIS_RACK
;**************************************************************************
;* *
;* Mammys rackup *
;* *
;**************************************************************************
DISPLAY_MAMMYS_RACK
MOVE *A11(040H),A6,L ;get box image from enemies table
PUSH A6 ;save for later
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
; MOVK 2,A1
MOVE *A10(PMAMMY),A1 ;grab plyr mammys
MOVI 050000,A3 ;times by 100000
MPYU A3,A1 ;and store in bonus
MOVE A1,@NUM_DATA_3,L
MOVI MAM_MESS,A8
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
;**************************************************************************
;* *
;* Now that the rack up info has been displayed, put up the info box *
;* and add the bonus to the TOTAL BONUS score *
;* *
;**************************************************************************
CONTINUE_THIS_RACK
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE @NUMBER_RACKS,A6 ;are we 2 or 3 players ?
MOVE A10,A2
CALLA GPLAYNUM ;which player are we ?
SLL 6,A0
ADD A6,A0 ;work out which box going where
ADDI WHAT_WHERE_BOX,A0 ;based on player number and
MOVE *A0,A0,L ;total number of players
MOVE A0,B0
CALLA EASYMAKE ;create relevant info box
MOVE A0,A8
MOVE *A8(OYVAL),A3,L ;store it a little higher than norm
SUBI [0104,0],A3
MOVE A3,*A8(OYVAL),L
MOVE *A8(OXPOS),A4 ;store initial Y/X pos in storage
MOVX A4,A3 ;for use later in avoiding that
MOVE A3,*A8(ODATA),L ;incredibly stupid anim point fuck up
PULLQ A1
MOVE *A1(ICMAP),A0,L ;change pallette on new info box
CALLA CHANGE_PAL
MOVE *A8(OCTRL),A4
MOVE *A1(IANIOFF),*A8(OUANIOFF),L
CALLA ANI
MOVI 0100H,A9
CALLR RESET_DAG_FOR_SCALE
MOVE *A10(PPID),A1
SLL 8,A1
ADDI PID_IND,A1 ;create scale box up proc
MOVI SCALE_BOX_ON,A7
CALLA GETPRC
MOVE A1,A9
MOVE @NUM_DATA_3,A11,L ;pick up bonus score from info disp.
IS_BOX_STILL_COMING_ON
SLEEP 1
MOVE A9,A0 ;has box finished appearing yet ?
CALLA EXISTP_ALL
JRNZ IS_BOX_STILL_COMING_ON
MOVE A11,A11 ;is there any bonus to add to TOTAL ?
JRNZ WE_HAVE_UPDATING_TO_DO
MOVE A11,*A10(PBONUS_STOR),L
SLEEP 50 ;nope, so just hang around a while
JRUC UPDATING_SCORE_DONE ;cos we lookin' at NO CASUALTIES !
WE_HAVE_UPDATING_TO_DO
SLEEP 30
MOVI 1000,A9 ;heres what we increment Total by
CMPI 1000000,A11 ;if bonus > 1000000 then.....
JRLT INC_NUMBER_SET
MOVI 10000,A9 ;make increment 10000
INC_NUMBER_SET
MOVI RACKUP_SND,A0 ;set up rackup sound
MOVE A11,A11 ;if bonus is - then make increment -
JRNN WAIT_FOR_UPDATING
MOVI RACKDOWN_SND,A0 ;make rackdown sound
NEG A9
WAIT_FOR_UPDATING
CALLA ONESND ;do the rack sound
SLEEP 10 ;give it time to start
MOVE A11,*A10(PBONUS_STOR),L
KEEP_UPDATING
MMTM SP,A9,A8,A11 ;store box obj so we dont lose it
MOVE *A10(PBONUSOBJ),A8,L
CALLA DELETE_OBJ
MOVE *A10(PBONUSCORE),A0,L
ADD A9,A0 ;add increment to score
JRNN NO_ZERO_WORRIES
CLR A0 ;cant be less than 0 !
NO_ZERO_WORRIES
MOVE A0,*A10(PBONUSCORE),L
MOVE A0,@NUM_DATA,L
MOVI TOTAL_NUM,A8
CALLA LM_SETUP
CALLA BONUS_SET_X ;set player x offset
JSRP PRINTF
MMFM SP,A9,A8,A11 ;get store object back in A8
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE A2,*A10(PBONUSOBJ),L
SUB A9,A11 ;sub increment from bonus
JRZ UPDATING_SCORE_DONE ;are we at zero yet ?
CMPI 10000,A9
JRNE MORE_UPDATING
CMPI 10000,A11
JRGE MORE_UPDATING
MOVI 1000,A9
MORE_UPDATING
SLEEP 1
JRUC KEEP_UPDATING
UPDATING_SCORE_DONE
CLR A1 ;since we are done updating
MOVE A1,*A10(PBONUSYNCH) ;bonus, let others know
OTHERS_NOT_DONE
SLEEP 1
MOVE @P1DATA+PBONUSYNCH,A1 ;has plyr1 finished updating bonus
MOVE @P2DATA+PBONUSYNCH,A2 ;has plyr2 finished updating bonus
MOVE @P3DATA+PBONUSYNCH,A3 ;has plyr3 finished updating bonus
OR A1,A2 ;is anyone still updating bonus ?
OR A2,A3
JRNZ OTHERS_NOT_DONE
MOVI STOP_RACKUP_SND,A0 ;set up rackup sound
MOVE A11,A11 ;if bonus is - then make increment -
JRNN STOP_RACK_SOUND
MOVI STOP_RACKDOWN_SND,A0 ;make rackdown sound
STOP_RACK_SOUND
CALLA ONESND ;do the rack sound
MOVI PBOMBPID,A0
CALLA EXISTP_ALL
JRNZ FLASHING_X_GOING
CREATE PBOMBPID,FLASH_X
FLASHING_X_GOING
SLEEP 30
MOVE A8,A8 ;is this rackup one with no box
JRZ NO_BOX_FOR_RACKUP
MOVE A9,A1 ;we are all done, so scale
MOVI SCALE_BOX_OFF,A7 ;info box off screen
CALLA GETPRC
IS_BOX_STILL_COMING_OFF
SLEEP 1
MOVE A9,A0
CALLA EXISTP_ALL ;has box proc finished yet ?
JRNZ IS_BOX_STILL_COMING_OFF
NO_BOX_FOR_RACKUP
MOVI OID_P1TEXT,A0 ;yes, so kill rackup text
CALLA KILOBJ_ALL
THIS_GUY_NOT_PLAYING
DIE
;**************************************************************************
;* *
;* Make big X in bakground flash for whoever got most bonus *
;* *
;**************************************************************************
FLASH_X
CLR A1
CLR A2
CLR A3
CLR A4
CLR A5
CLR A6
MOVE @P1DATA+POBJ,A0,L
JRZ NO_FLASH_X_1
MOVE @P1DATA+PBONUS_STOR,A1,L
JRZ NO_FLASH_X_1
MOVI XREGP1r,A4
NO_FLASH_X_1
MOVE @P2DATA+POBJ,A0,L
JRZ NO_FLASH_X_2
MOVE @P2DATA+PBONUS_STOR,A2,L
JRZ NO_FLASH_X_2
MOVI XREGP2y,A5
NO_FLASH_X_2
MOVE @P3DATA+POBJ,A0,L
JRZ NO_FLASH_X_3
MOVE @P3DATA+PBONUS_STOR,A3,L
JRZ NO_FLASH_X_3
MOVI XREGP3b,A6
NO_FLASH_X_3
MOVE @NUMBER_RACKS,A7 ;are we playing 2 or 3 players ?
JRNZ WE_HAVE_3
CLR A3
CLR A6
MOVE A5,A5
JRZ WE_HAVE_3
MOVI XREGP3b,A5
WE_HAVE_3
CMP A1,A2
JRLT P1_BIGGEST
JREQ P1_P2_SAME
MOVE A2,A1
MOVE A5,A4
P1_BIGGEST
CLR A5
P1_P2_SAME
CMP A1,A3
JRLT P1A_BIGGEST
JREQ P1_P3_SAME
MOVE A3,A1
MOVE A6,A4
P1A_BIGGEST
CLR A6
P1_P3_SAME
MOVE A4,A8
JRZ NO_FLASH_PAL_1
CREATE PINITIALPID,FLASH_THAT_PAL
NO_FLASH_PAL_1
MOVE A5,A8
JRZ NO_FLASH_PAL_2
CREATE PINITIALPID,FLASH_THAT_PAL
NO_FLASH_PAL_2
MOVE A6,A8
JRZ NO_FLASH_PAL_3
CREATE PINITIALPID,FLASH_THAT_PAL
NO_FLASH_PAL_3
DIE
FLASH_THAT_PAL
MOVE A8,A0
CALLA GO_WHITE
SLEEP 6
MOVE A8,A0
CALLA GO_NORMAL
SLEEP 6
MOVE A8,A0
CALLA GO_WHITE
SLEEP 6
MOVE A8,A0
CALLA GO_NORMAL
SLEEP 6
MOVE A8,A0
CALLA GO_WHITE
SLEEP 6
MOVE A8,A0
CALLA GO_NORMAL
DIE
;**************************************************************************
;* *
;* Scale box onto screen from small to 100% *
;* *
;**************************************************************************
SCALE_BOX_ON
MOVI 05000500H,A9 ;start scale
MOVI 00800080H,A10 ;increment
MOVI 01000100H,A11 ;limit small
ZAP_BOX_UP
MOVE A9,*A8(OSCALE),L
CALLR RESET_DAG_FOR_SCALE ;redo dag to avoid anim point fuck up
SLEEP 1
SUB A10,A9 ;subtract increment
CMPXY A11,A9
JRXGT ZAP_BOX_UP ;have we reached limit ?
MOVE A11,*A8(OSCALE),L
MOVE A11,A9
CALLR RESET_DAG_FOR_SCALE ;redo dag to avoid anim point fuck up
DIE
;**************************************************************************
;* *
;* Scale box off screen from 100% to small *
;* *
;**************************************************************************
SCALE_BOX_OFF
MOVI 01000100H,A9 ;start scale
MOVI 00800080H,A10 ;increment
MOVI 05000500H,A11 ;limit large
ZAP_BOX_DOWN
MOVE A9,*A8(OSCALE),L
CALLR RESET_DAG_FOR_SCALE ;redo dag to avoid anim point fuck up
SLEEP 1
ADD A10,A9 ;add increment
CMPXY A11,A9
JRXLT ZAP_BOX_DOWN ;have we reached limit
CALLA DELETE_OBJ ;kill box object
DIE
;**************************************************************************
;* *
;* Get X position offset for player and add it message X pos *
;* *
;**************************************************************************
BONUS_SET_X
MMTM SP,A0,A1,A2
MOVE *A13(PBLK_STOR),A2,L ;grab plyr block data address
CALLA GPLAYNUM ;get player number
SLL 4,A0 ;use it as offset into x offset table
MOVE @NUMBER_RACKS,A1 ;are we playing 2 or 3 players ?
JRZ SET_X_FOR_2
ADDI BONUS_3_X_OFFSET,A0 ;ahhh... 3 players
JRUC OFFSET_X_SET
SET_X_FOR_2
ADDI BONUS_2_X_OFFSET,A0 ;hmmmm... 2 players
OFFSET_X_SET
MOVE *A0,A0 ;grab x offset from table
ADDXY A0,A9 ;add it to message x value
MMFM SP,A0,A1,A2
RETS
;**************************************************************************
;* *
;* When scaling a screen rel object with animation points, *
;* Use this routine to place it on screen. *
;* - Assumes real Y/X position stored in object ODATA long word *
;* *
;**************************************************************************
RESET_DAG_FOR_SCALE
MOVE *A8(OUSIZE),A5,L ;Unscaled size in a1
MOVE *A8(OUANIOFF),A1,L ;Unscaled animation pnt in A1
CLR A7
MOVX A9,A7
MOVI 10000H,A3 ; for inverse scale computation
DIVU A7,A3 ;Inverse of scale in a3
SETF 12,1,1 ; change FS1 to quicken multiplies
CLR A7
MOVX A5,A7
MPYU A3,A7 ; result in a11
SRL 8,A7
SRL 8,A5
MPYU A3,A5
MOVX A7,A5
MOVE A1,A7
SEXT A7
MPYS A3,A7 ; result in a11
SRA 8,A7
SRA 16,A1
MPYS A3,A1
SLL 8,A1
MOVX A7,A1
SETF 32,0,1 ; restore FS1 !!!
MOVE A1,*A8(OANIOFF),L
MOVE A5,*A8(OSIZE),L
MOVE *A8(ODATA),A3,L ;grab real Y/X pos from storage
SUBXY A1,A3 ;subtract new anioff from real Y/X
MOVE A3,*A8(ODAG),L
MOVY A3,A4
MOVE A4,*A8(OYVAL),L ;store away in YPOS & XPOS for Veladd
MOVE A3,*A8(OXPOS) ;to use as DAG
RETS
**************************************************
* *
* GETPERCENT *
* *
* RETURNS INTEGER PORTION OF A PERCENTAGE *
* *
* *
* IN: A0, DIVISOR *
* A1, DIVIDEND *
* *
* OUT: A1, INTEGER PERCENT *
* *
**************************************************
GETPERCENT
MOVI 100,A14 ; total * 100
MPYU A14,A1 ;-------------
DIVU A0,A1 ; number shot
RETS
*x offset tables
*
BONUS_3_X_OFFSET
.WORD 0
.WORD 138
.WORD 271
BONUS_2_X_OFFSET
.WORD 0
.WORD 271
.WORD -138
;**************************************************************************
;* *
;* Do the where you go is up to you sound call *
;* *
;**************************************************************************
CALL_WHERE
SOUND1 WHERE_YOU_GO
RETS
CALL_MAGGOTS
SOUND1 MAGGOTS_SND
RETS
CALL_KEMMITECH
SOUND1 KEMMITECH
RETS
CALL_TEAR_DOWN_THE_WALL
SOUND1 TEAR_DOWN_THE_WALL
RETS
CALL_STOP_THE_BUS
SOUND1 STOP_THE_BUS
RETS
;**************************************************************************
;* *
;* Put up the direction select stuff on the screen, turn on the *
;* guns and wait for a direction to go in *
;* *
;**************************************************************************
SLAP_UP_OBJECTIVE
MOVI OBJECTIVE_TEXT_INIT,A10 ;get the cd text going
CREATE PID_JUNK,DISPLAY_DASH_TEXT
SLEEP 30
CREATE PID_JUNK,DISPLAY_CD_TIME ;start the cd timer going
; MOVI WAVEOFF_P,A0 ;get non selectable obj pal
; CALLA GETFPAL
;
; MOVI WAVEOFF_P,A8 ;make X inside obj col cycle
; MOVK 1,A9
; MOVK 7,A10
; MOVK 4,A11
; CREATE PID_DAMCC,CYCLE16
MOVI DEST1A_INIT,B0 ;put up "USE GUNS" text
CALLA MULTIMAKE
MOVE *A0(OPART1),A11,L ;store object for later
*THIS IS TO FIX SOMETHING THAT BLOODY MULTIMAKE SHOULD DO IN THE FIRST
*FUCKING PLACE ! INFACT IT THINKS IT DOES DO IT, ONLY ITS F*U*L*L O*F
*B*U*G*S !!!!!
MOVI 37H,A0
MOVE A0,*A11(OYPOS)
MOVI 88H,A0
MOVE A0,*A11(OXPOS)
MOVI [37H,88H],A0
MOVE A0,*A11(ODAG),L
MOVE *A11(OPARTS),A14,L
MOVI 85H,A0
MOVE A0,*A14(OYPOS)
MOVI 82H,A0
MOVE A0,*A14(OXPOS)
MOVI [85H,82H],A0
MOVE A0,*A14(ODAG),L
MOVE @WAVES_DONE,A10 ;get which waves are already done
MOVI DEST2A_INIT,B0 ;set up amazon as shootable object
SRL 1,A10 ;has amazon been done ?
JRNC DEST2_SET
MOVI DEST2B_INIT,B0 ;yes so set wave as unshootable
DEST2_SET
CALLA EASYMAKE
MOVK 1,A1 ;set which wave this object is
MOVE A1,*A0(OVAR9)
MOVI 303H,A1
MOVE A1,*A0(OCONST) ;set up const ready for flashing
MOVE A0,A8 ;store object for later
MOVI DEST3A_INIT,B0 ;set up japan as shootable object
SRL 1,A10 ;has japan been done ?
JRNC DEST3_SET
MOVI DEST3B_INIT,B0 ;yes so set wave as unshootable
DEST3_SET
CALLA EASYMAKE
MOVK 2,A1 ;set which wave this object is
MOVE A1,*A0(OVAR9)
MOVI 303H,A1
MOVE A1,*A0(OCONST) ;set up const ready for flashing
MOVE A0,A9 ;store object for later
MOVI DEST4A_INIT,B0 ;set up mid east as shootable object
SRL 1,A10 ;has mid east been done ?
JRNC DEST4_SET
MOVI DEST4B_INIT,B0 ;yes so set wave as unshootable
DEST4_SET
CALLA EASYMAKE
MOVK 4,A1 ;set which wave this object is
MOVE A1,*A0(OVAR9)
MOVI 303H,A1
MOVE A1,*A0(OCONST) ;set up const ready for flashing
MOVE A0,A10 ;store object for later
MMTM SP,A8,A9,A10,A11 ;save object pointers, just incase
MOVIM INBONUS,@GAME_STATE,W ;\
CREATEP PID_CURSOR,PLAYER_CURSOR; - CAUTION: NO SLEEPING DURING THESE.
ALLPLYR PLAYER_BONUS_RESTART ;/
MMFM SP,A8,A9,A10,A11 ;get object pointers back
SLEEP 50
CLR A1
MOVE A1,@GUNS_OFF,W ;turn guns on
MOVE A1,@DIR_SELECTED,L ;set up wave selected as nothing
MMTM A12,A11 ;save object pointer cos we need a11
MOVI 1000,A11 ;set up time out
NO_CHOICE_MADE
SLEEP 1
DEC A11 ;decrement time out
JRNZ NOT_TIMED_OUT_YET ;timed out yet ?
CALLR GET_OUR_OWN_DIR ;yes, so get a dir anyway
NOT_TIMED_OUT_YET
MOVE @DIR_SELECTED,A6,L ;wait for wave object to be shot
JRZ NO_CHOICE_MADE
MMFM A12,A11 ;retrieve a11 again
MMTM SP,A8,A9,A10,A11 ;save object pointers, just incase
MOVIM 1,@GUNS_OFF,W ;turn off guns
MOVIM INGAME,@GAME_STATE,W ;set game state back to in game
MOVI PID_CURSOR,A0
CALLA KILLPROC_ALL ;KILL THE CURSOR DOOLIES
ALLPLYR CURSOR_OFF ;turnoff the cursors
SOUND1 SND_DIR_CHOSEN ;sound it !
MMFM SP,A8,A9,A10,A11 ;get object pointers back
MOVE *A6(OVAR9),A5 ;get from wave object shot, which wave it is
MOVE @WAVES_DONE,A1,L ;put it in waves done for next time
OR A5,A1
SLL 16,A5 ;also store it alone in top bits of wave done
OR A5,A1
MOVE A1,@WAVES_DONE,L
CMP A6,A8 ;is object shot amazon ?
JREQ NO_DELETE_MISSION_1
CALLA DELETE_OBJ ;no, so delete this wave option
NO_DELETE_MISSION_1
CMP A6,A9 ;is object shot japan ?
JREQ NO_DELETE_MISSION_2
MOVE A9,A8 ;no, so delete this wave option
CALLA DELETE_OBJ
NO_DELETE_MISSION_2
CMP A6,A10 ;is object shot mid east ?
JREQ NO_DELETE_MISSION_3
MOVE A10,A8 ;no, so delete this wave option
CALLA DELETE_OBJ
NO_DELETE_MISSION_3
MOVE A11,A8 ;delete USE GUNS text
CALLA DELETE_OBJ
MOVE A6,A8 ;make box flash around wave object selected
MOVK 4,A9
CREATE PID_DAMCC,FLASH_BOX
MOVE A0,A8
SLEEP 70 ;sleep, then kill flashing box routine
MOVE A8,A0
CALLA KILL
MOVI OID_P2MOTEXT,A0 ;kill all outstanding text
MOVI -1,A1
CALLR BKILOBJ
MOVI OID_P1MOTEXT,A0 ;kill dash text and cd timer
MOVI -1,A1
CALLR BKILOBJ
SLEEP 10
RETP
;**************************************************************************
;* *
;* Get what ever direction is first free *
;* *
;**************************************************************************
GET_OUR_OWN_DIR
MOVE A8,A6 ;set up amazon as selection
CALLR IS_DIR_VALID ;has it already been done ?
JRZ DIR_GOT
MOVE A9,A6 ;set up kemmitech as selection
CALLR IS_DIR_VALID ;has it already been done ?
JRZ DIR_GOT
MOVE A10,A6 ;set up mid east as selection
DIR_GOT
MOVE A6,@DIR_SELECTED,L ;set up new selection
RETS
IS_DIR_VALID
MOVE *A6(OVAR9),A1 ;pick up which wave we selected
MOVE @WAVES_DONE,A2
AND A2,A1 ;is it already in waves done ?
RETS
;**************************************************************************
;* *
;* Make selected wave object flash by turning it from *
;* write non zero to write constant alternatly *
;* A8 - object to flash - one parter *
;* A9 - delay between flashes *
;* *
;**************************************************************************
FLASH_BOX
MOVI 0101h,A1
MOVE A1,*A8(OCONST)
MOVE *A8(OCTRL),A1 ;get ctrl bits
ANDI 0FFFFH-DMAWNZ,A1 ;or out write on non zero
ORI DMACNZ,A1 ;set up write constant
MOVE A1,*A8(OCTRL) ;save it away
MOVE A9,A0
CALLA PRCSLP ;sleeeeeeeeeeeeep
MOVE *A8(OCTRL),A1 ;get ctrl bits
ANDI 0FFFFH-DMACZ,A1 ;or out write constant non zero
ORI DMAWNZ,A1 ;set up write on non zero
MOVE A1,*A8(OCTRL) ;save it away
MOVE A9,A0
CALLA PRCSLP ;sleeeeeeeeeeeeep
JRUC FLASH_BOX
;**************************************************************************
;* *
;* Put guys animations up on the screen and wait until done *
;* *
;**************************************************************************
SLAP_UP_GUYS
MOVE A8,A8
JRZ NO_GUY_TO_PUT_UP ;check if we create someone
MOVE *A8+,A10,L
CREATE PID_JUNK,DISPLAY_DASH_TEXT ;setup dash text
SLEEP 30
CREATE PID_JUNK,DISPLAY_CD_TIME ;setup cd timer going
MOVK 1,A1 ;create anims at balcj
MOVE A1,@BLACKOUT
MOVE *A8+,A0,L ;get background from table
MOVE A0,B0
CALLA EASYMAKE ;create background
MOVE A0,A9
MOVE *A9(OIMG),A1,L ;set up img pallette to be faded in
MOVE *A1(ICMAP),A10,L
MOVE A10,A0
CALLA FADEIN_PAL
MOVE *A8+,A0,L ;get guy from table
MOVE *A8,A2
MOVE A0,B0 ;create guy
CALLA EASYMAKE
MOVE A0,A8 ;set up img pallette to be faded in
MOVE *A8(OIMG),A1,L
MOVE *A1(ICMAP),A11,L
MOVE A11,A0
CALLA FADEIN_PAL
CLR A1
MOVE A1,@BLACKOUT
MOVE A2,A0 ;wait for anim to be done
CALLA PRCSLP
MOVE A11,A0 ;fade us all out again
CALLA FADEOUT_PAL
MOVE A10,A0
CALLA FADEOUT_PAL
SLEEP 17 ;wait until faded out
CALLA DELETE_OBJ ;delete both background and guy
MOVE A9,A8
CALLA DELETE_OBJ
MOVI OID_P2MOTEXT,A0 ;kill dash text and cd timer
MOVI -1,A1
CALLR BKILOBJ
SLEEP 10
NO_GUY_TO_PUT_UP
RETP
;**************************************************************************
;* *
;* Display the cd text on the dash board *
;* *
;**************************************************************************
DISPLAY_DASH_TEXT
MOVI DASH_ARROW_INIT,B0 ;create the arrow
CALLA EASYMAKE
MOVE A0,A8
MOVI 3,A11
FLASH_ARROW
SLEEP 6 ;flash it three times by turning on/off
MOVI M_SCRNOBJ|M_NOSCALE|M_NODISP,A1
MOVE A1,*A8(OFLAGS)
SLEEP 6
MOVI M_SCRNOBJ|M_NOSCALE,A1
MOVE A1,*A8(OFLAGS)
DSJS A11,FLASH_ARROW
MOVE A10,B0 ;create text
CALLA EASYMAKE
DIE
; MOVE A0,A8 ;slide dash text on from left
; MOVE *A8(OCTRL),A1
; ORI M_LRCLIP,A1
; MOVE A1,*A8(OCTRL)
; MOVE *A8(OSIZEX),A9
; DEC A9
; DEC A9
; MOVE A9,*A8(OFSET)
; MOVE *A8(OIMG),A1,L
; MOVE *A1(ISAG),A10,L
; MOVE A9,A1
; MOVE A1,*A8(OFSET)
;NEW_TEXT_SAG
; SLEEP 1
; MOVE A9,A1
; MOVE A1,*A8(OFSET)
; SUBK 2,A9
; JRNN NEW_TEXT_SAG
; CLR A1
; MOVE A1,*A8(OFSET)
; DIE
;**************************************************************************
;* *
;* Put up the CD time on the dash board *
;* *
;**************************************************************************
DISPLAY_CD_TIME
MOVI NAMEZ1,A0 ;find the pallete for the text numbers
CALLA GETFPAL
MOVE A0,A10 ;store it away
CLR A9 ;clear ticks
CLR A8 ;clear object
NEXT_TIME
CALLA UPDATE_TIME ;update the time on the screen
SLEEP 6 ;sleep one tenth of a second
INC A9 ;increment tick count
CMPI 100,A9 ;is > than 100
JRNE NEXT_TIME
CLR A9 ;yes , so reset to 0
JRUC NEXT_TIME
UPDATE_TIME
MMTM SP,A8,A9,A10 ;store away important registers
MOVE A9,@NUM_DATA,L ;store display number in string
MOVI TIME_MESS,A8
MOVE A10,A2 ;new pallette for string
CALLA LM_SETUP
MOVE A2,A5 ;display numbers
JSRP PRINTF ;get important registers back
MMFM SP,A8,A9,A10
MOVE A8,A8 ;was there a number object last time ?
JRZ NO_SET_UP_YET
CALLA DELETE_OBJ ;yep so delete it
NO_SET_UP_YET
MOVE A2,A8 ;store this process in the new time object
MOVE A13,*A8(OPLINK),L ;so when this obj is killed, so is this proc
RETS
**************************************************************************
* *
* KILOBJ - KILL A CLASS OF OBJECTS ON ALL FOREGROUND PLANES *
* A0 = OID (16 BITS) *
* A1 = MASK: MASK BITS OF ZERO ARE DONT CARES (16 BITS) *
* *
**************************************************************************
BKILOBJ
MMTM SP,A0,A2,A3,A8
MOVI FGLIST,A8
MOVE A0,A2
SEXT A2
AND A1,A2 ;FORM MATCH
MOVE A8,A0
JRUC BKO_TST
BKO_LP
MOVE *A0(OID),A14,W
AND A1,A14 ;CAN DONT CARE BITS
CMP A2,A14 ;MATCH?
JRNE BKO_TST ;NO
MOVE *A0,A3,L
PUSH A8
MOVE A0,A8
CALLA DEL_PROC_AND_OBJ
PULLQ A8
MOVE A3,A0
JRUC BKO_TST2
BKO_TST
MOVE *A0,A0,L
BKO_TST2
CMP A0,A8
JRNE BKO_LP
MMFM SP,A0,A2,A3,A8
RETS
;**************************************************************************
;* *
;* Kill off all bonuses from last rackup *
;* *
;**************************************************************************
KILL_THAT_FUCKING_BUG
CLR A2
MOVE A2,@P1DATA+PBONUSCORE,L
MOVE A2,@P1DATA+PBONUSOBJ,L
MOVE A2,@P2DATA+PBONUSCORE,L
MOVE A2,@P2DATA+PBONUSOBJ,L
MOVE A2,@P3DATA+PBONUSCORE,L
MOVE A2,@P3DATA+PBONUSOBJ,L
RETS
BONUS_GUN_VECT
MOVE @DIR_SELECTED,A14,L
JRNZ BGV_X
MOVE A8,@DIR_SELECTED,L
BGV_X
RETS
NON_BONUS_GUN_VECT
SOUND1 SND_DIR_INACTIVE
RETS
*Which enemies to check, in this ID order
* long offset in counter tables, type of bonus rackup for enemy type
* -1 to end
*
CHECK_ENEMIES_TABLE
.LONG 030H,DISPLAY_NORMAL_RACK,BOYBOX1
.LONG 040H,DISPLAY_NORMAL_RACK,BERZBOX1
.LONG 050H,DISPLAY_NORMAL_RACK,YELJBOX
.LONG 070H,DISPLAY_NORMAL_RACK,SKATEBOX1
; .LONG 080H,DISPLAY_NORMAL_RACK,KEMTEKKBOX
.LONG 0A0H,DISPLAY_NORMAL_RACK,EVERBOX1x
.LONG 0C0H,DISPLAY_NORMAL_RACK,NATIVBOX1
.LONG 0D0H,DISPLAY_NORMAL_RACK,NONINBOX
; .LONG 0E0H,DISPLAY_NORMAL_RACK,BOYBOX1
.LONG 0,DISPLAY_RESCUE_RACK,HOSTAGEBOX
.LONG 0,DISPLAY_DAMAGE_RACK,DAMAGEBOX1
.LONG 0,DISPLAY_MAMMYS_RACK,MAMMYBOX1
.LONG 0,DISPLAY_WINGS_RACK,0
.LONG -1
*
*BACKGROUND TABLE FOR BONUS SCREEN
*
BONUS_BGND_R
.LONG BONUS_BGND_2_R
.LONG BONUS_BGND_3_R
BONUS_BGND_3_R
;***** BONUS BACKGROUND
.LONG GXPL1BMOD ;module
.WORD 5+400,-260 ;x start , y offset from horizon
.LONG GXPL2BMOD ;module
.WORD 138+400,-261 ;x start , y offset from horizon
.LONG GXPL3BMOD ;module
.WORD 271+400,-261 ;x start , y offset from horizon
.LONG DASHBMOD ;module
.WORD 0+400,0 ;x start , y offset from horizon
.LONG 0FFFFFFFFH ;end of module list
.LONG 010000H ;XRATE [16,16]
.LONG 0 ;End of Planes marker
.long DUMRETS
BONUS_BGND_2_R
;***** BONUS BACKGROUND
.LONG GXPL1BMOD ;module
.WORD 5+400,-260 ;x start , y offset from horizon
.LONG GXPL2ABMOD ;module
.WORD 270+400,-261 ;x start , y offset from horizon
.LONG DASHBMOD ;module
.WORD 0+400,0 ;x start , y offset from horizon
.LONG 0FFFFFFFFH ;end of module list
.LONG 010000H ;XRATE [16,16]
.LONG 0 ;End of Planes marker
.long DUMRETS
BONUS_BGND_L
.LONG BONUS_BGND_2_L
.LONG BONUS_BGND_3_L
BONUS_BGND_3_L
;***** BONUS BACKGROUND
.LONG GXPL1BMOD ;module
.WORD 5-400,-260 ;x start , y offset from horizon
.LONG GXPL2BMOD ;module
.WORD 138-400,-261 ;x start , y offset from horizon
.LONG GXPL3BMOD ;module
.WORD 271-400,-261 ;x start , y offset from horizon
.LONG DASHBMOD ;module
.WORD 0-400,0 ;x start , y offset from horizon
.LONG 0FFFFFFFFH ;end of module list
.LONG 010000H ;XRATE [16,16]
.LONG 0 ;End of Planes marker
.long DUMRETS
BONUS_BGND_2_L
;***** BONUS BACKGROUND
.LONG GXPL1BMOD ;module
.WORD 5-400,-260 ;x start , y offset from horizon
.LONG GXPL2ABMOD ;module
.WORD 270-400,-261 ;x start , y offset from horizon
.LONG DASHBMOD ;module
.WORD 0-400,0 ;x start , y offset from horizon
.LONG 0FFFFFFFFH ;end of module list
.LONG 010000H ;XRATE [16,16]
.LONG 0 ;End of Planes marker
.long DUMRETS
BONUS_BGND_T
.LONG BONUS_BGND_2_T
.LONG BONUS_BGND_3_T
BONUS_BGND_3_T
;***** BONUS BACKGROUND
.LONG GXPL1BMOD ;module
.WORD 5,-260 ;x start , y offset from horizon
.LONG GXPL2BMOD ;module
.WORD 138,-261 ;x start , y offset from horizon
.LONG GXPL3BMOD ;module
.WORD 271,-261 ;x start , y offset from horizon
.LONG 0FFFFFFFFH ;end of module list
.LONG 010000H ;XRATE [16,16]
.LONG 0 ;End of Planes marker
.long DUMRETS
BONUS_BGND_2_T
;***** BONUS BACKGROUND
.LONG GXPL1BMOD ;module
.WORD 5,-260 ;x start , y offset from horizon
.LONG GXPL2ABMOD ;module
.WORD 270,-261 ;x start , y offset from horizon
.LONG 0FFFFFFFFH ;end of module list
.LONG 010000H ;XRATE [16,16]
.LONG 0 ;End of Planes marker
.long DUMRETS
BONUS_BGND_B
.LONG BONUS_BGND_2_B
.LONG BONUS_BGND_3_B
BONUS_BGND_3_B
;***** BONUS BACKGROUND
.LONG GXPL1BMOD ;module
.WORD 5,-260 ;x start , y offset from horizon
.LONG GXPL2BMOD ;module
.WORD 138,-261 ;x start , y offset from horizon
.LONG GXPL3BMOD ;module
.WORD 271,-261 ;x start , y offset from horizon
.LONG DASHBMOD ;module
.WORD 0,0 ;x start , y offset from horizon
.LONG 0FFFFFFFFH ;end of module list
.LONG 010000H ;XRATE [16,16]
.LONG 0 ;End of Planes marker
.long DUMRETS
BONUS_BGND_2_B
;***** BONUS BACKGROUND
.LONG GXPL1BMOD ;module
.WORD 5,-260 ;x start , y offset from horizon
.LONG GXPL2ABMOD ;module
.WORD 270,-261 ;x start , y offset from horizon
.LONG DASHBMOD ;module
.WORD 0,0 ;x start , y offset from horizon
.LONG 0FFFFFFFFH ;end of module list
.LONG 010000H ;XRATE [16,16]
.LONG 0 ;End of Planes marker
.long DUMRETS
*2 or 3 boxes for initial HACKING.... message
*
HACK_IT_TABLE
.LONG HACK_IT_2
.LONG HACK_IT_3
HACK_IT_2
.LONG EMPTY_BONUS_BOX_INIT_1_2
.LONG EMPTY_BONUS_BOX_INIT_2_2
.LONG 0
HACK_IT_3
.LONG EMPTY_BONUS_BOX_INIT_1_3
.LONG EMPTY_BONUS_BOX_INIT_2_3
.LONG EMPTY_BONUS_BOX_INIT_3_3
.LONG 0
*Placement of boxes on screen for combinations of 2 or 3 players
WHAT_WHERE_BOX
.LONG EMPTY_BONUS_BOX_INIT_1_2
.LONG EMPTY_BONUS_BOX_INIT_1_3
.LONG EMPTY_BONUS_BOX_INIT_2_2
.LONG EMPTY_BONUS_BOX_INIT_2_3
.LONG EMPTY_BONUS_BOX_INIT_3_2
.LONG EMPTY_BONUS_BOX_INIT_3_3
EMPTY_BONUS_BOX_INIT_1_3
EMPTY_BONUS_BOX_INIT_1_2
.LONG BOYBOX1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_OID|OM_INSERT|OM_SPOS
.WORD OID_DAMAGE
.LONG [225,5+62+40+15],0
EMPTY_BONUS_BOX_INIT_2_3
.LONG BOYBOX1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_OID|OM_INSERT|OM_SPOS
.WORD OID_DAMAGE
.LONG [225,138+62+40+15],0
EMPTY_BONUS_BOX_INIT_2_2
EMPTY_BONUS_BOX_INIT_3_3
EMPTY_BONUS_BOX_INIT_3_2
.LONG BOYBOX1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_OID|OM_INSERT|OM_SPOS
.WORD OID_DAMAGE
.LONG [225,271+62+40+15],0
*Screen messages for bonus rackup
*
ATP_MESS:
MESS_MAC RD15FONT,3,196,70,COLOR_PWHITE,STRCNRMOS,10000H|OID_TEXT
.STRING "HACKING NEW ORDER DATABASE...",0
.EVEN
ATP2_MESS:
MESS_MAC RD15FONT,3,196,95,COLOR_PWHITE,STRCNRMOS,10000H|OID_TEXT
.STRING "CONNECTED........",0
.EVEN
ATP3_MESS:
MESS_MAC RD11FONT,3,196,120,COLOR_PWHITE,STRCNRMOS,10000H|OID_TEXT
.STRING "57600/REL, V76.bis",0
.EVEN
ATP4_MESS:
MESS_MAC RD15FONT,3,196,110,COLOR_PWHITE,STRCNRMOS,10000H|OID_TEXT
.STRING "STILL CONNECTED.....",0
.EVEN
WINGS_MESS
MESS_MAC RD11FONT,3,62+5,50,COLOR_PWHITE,STRCNRMOS,10000H|OID_P1TEXT
.STRING "WINGS EARNED.",0
.EVEN
NO_WING_BONUS_MESS
MESS_MAC RD11FONT,3,62+5,110,COLOR_PWHITE,STRCNRMOS,10000H|OID_P1TEXT
.STRING "NO WINGS EARNED.",0
.EVEN
WING_BONUS_MESS
MESS_MAC RD15FONT,3,62+5,175,COLOR_PYELLOW,STRCNRMOS,10000H|OID_P1TEXT
.STRING "X %ld",0
.LONG NUM_DATA_2
.EVEN
WING_BONUS_MESS_2
MESS_MAC RD11FONT,2,62+5,160,COLOR_PYELLOW,STRCNRMOS,10000H|OID_P1TEXT
.STRING "BONUS MULTIPLIER",0
.EVEN
STAT0A_MESS:
MESS_MAC RD11FONT,2,62+5,SKYTOPOF+69+25,COLOR_PWHITE,STRCNRMOS,OID_P1TEXT
.STRING "%ld Rescued.",0
.LONG NUM_DATA
.EVEN
TOTAL_NUM2:
MESS_MAC RD20FONT,2,62+5,SKYTOPOF+190,COLOR_PWHITE,STRCNRMO,OID_P1MOTEXT
.STRING "%,ld",0
.LONG NUM_DATA
.EVEN
STAT0_MESS:
MESS_MAC RD11FONT,2,62+5,SKYTOPOF+69+25,COLOR_PWHITE,STRCNRMOS,OID_P1TEXT
.STRING "%ld Wiped Out.",0
.LONG NUM_DATA
.EVEN
STAT1_MESS:
MESS_MAC RD11FONT,2,62+5,SKYTOPOF+89+25,COLOR_PWHITE,STRCNRMOS,OID_P1TEXT
.STRING "Accuracy = %ld@",0
.LONG NUM_DATA_2
.EVEN
STAT2_MESS:
MESS_MAC RD15FONT,2,62+5,SKYTOPOF+114+19,COLOR_PYELLOW,STRCNRMOS,OID_P1TEXT
.STRING "BONUS\n\f%,ld",0
.LONG [-5,0]
.LONG NUM_DATA_3
.EVEN
HC_MESS:
MESS_MAC RD11FONT,2,62+5,SKYTOPOF+80,COLOR_PLF,STRCNRMOS,OID_P1TEXT
.STRING "%ld",0
.LONG NUM_DATA
NOHCSTR .STRING "\nNO\nHUMAN\nCASUALTIES",0
.EVEN
HUMAN_MESS:
MESS_MAC RD11FONT,2,62+5,SKYTOPOF+80,COLOR_PRED,STRCNRMOS,OID_P1TEXT
.STRING "\nHUMAN\nCASUALTIES",0
.EVEN
PEN_MESS:
MESS_MAC RD15FONT,2,62+5,SKYTOPOF+140,COLOR_PYELLOW,STRCNRMOS,OID_P1TEXT
.STRING "PENALTY\n%,ld",0
.LONG NUM_DATA_3
.EVEN
DAM_MESS:
MESS_MAC RD15FONT,2,62+5,08AH,COLOR_PYELLOW,STRCNRMOS,OID_P1TEXT
.STRING "DAMAGE\nBONUS\n\f%,ld",0
.LONG [-5,0]
.LONG NUM_DATA_3
.EVEN
MAM_MESS:
MESS_MAC RD15FONT,2,62+5,08AH,COLOR_PYELLOW,STRCNRMOS,OID_P1TEXT
.STRING "MAMMY\nBONUS\n\f%,ld",0
.LONG [-5,0]
.LONG NUM_DATA_3
.EVEN
TOTAL_MESS:
MESS_MAC RD15FONT,2,62+5,SKYTOPOF+171,COLOR_PWHITE,STRCNRMOS,OID_TEXT
.STRING "TOTAL BONUS",0
.EVEN
TOTAL_NUM:
MESS_MAC RD20FONT,2,62+5,SKYTOPOF+190,COLOR_PLF,STRCNRMOS,OID_P1MOTEXT
.STRING "%,ld",0
.LONG NUM_DATA
.EVEN
JOIN_IN_MESS
MESS_MAC RD15FONT,2,58+5,SKYTOPOF+65,COLOR_PWHITE,STRCNRMOS,OID_P2TEXT
.STRING "PRESS START\nTo Join The\nRevolution !",0
.EVEN
COIN_IN_MESS
MESS_MAC RD15FONT,2,58+5,SKYTOPOF+65,COLOR_PWHITE,STRCNRMOS,OID_P2TEXT
.STRING "INSERT COIN\nTo Join The\nRevolution !",0
.EVEN
STAND_BY_MESS
MESS_MAC RD15FONT,2,58+5,SKYTOPOF+65,COLOR_PWHITE,STRCNRMOS,OID_P2TEXT
.STRING "STAND BY\nTo Join The\nRevolution !",0
.EVEN
TIME_MESS
MESS_MAC DASH_TIME_FONT,0000FFFEH,260,187,COLOR_PYELLOW,STRLNCO,OID_P2MOTEXT
.STRING ":%02ld",0
.LONG NUM_DATA
.EVEN
;SOUND SCRIPTS
MODEM_SND
.WORD 0F380H,020H,0836BH ;dial tone
.WORD 0F380H,008H,0836EH ;button
.WORD 0F380H,008H,0837AH ;button
.WORD 0F380H,008H,0836EH ;button
.WORD 0F380H,008H,08377H ;button
.WORD 0F380H,008H,08377H ;button
.WORD 0F380H,008H,08371H ;button
.WORD 0F380H,008H,08374H ;button
.WORD 0F380H,020H,08367H ;phone ring
.WORD 0F380H,020H,08092H ;modem tick
.WORD 0F380H,050H,08093H ;modem connect
.word 0F3FFh,1,43E6h ;Kill track 3
.WORD 0
SCORE_MUL_SND
.WORD 0F280H,078H,0409BH ;rackup sound
.WORD 0
HACK_DATA_SND
.WORD 0F380H,078H,08094H ;hacking images
.word 0F3FFh,1,43E6h ;Kill track 3
.WORD 0
RACKUP_SND
.WORD 0F380H,078H,04095H ;rackup sound
.WORD 0
RACKDOWN_SND
.WORD 0F380H,078H,04096H ;rackdown sound
.WORD 0
STOP_RACKDOWN_SND
.word 0F380h,1,4098h ;Kill track 3
.WORD 0
STOP_RACKUP_SND
.word 0F380h,1,4097h ;Kill track 3
.WORD 0
STOP_RACK_SND
.word 0F3FFh,1,43E6h ;Kill track 3
.WORD 0
STOP_ALL_SND
.word 0F0FFh,1,43E3h ;Kill track 3
.word 0F1FFh,1,43E4h ;Kill track 3
.word 0F2FFh,1,43E5h ;Kill track 3
.word 0F3FFh,1,43E6h ;Kill track 3
.WORD 0
CD_DASH_SND
.WORD 0F380H,078H,041fdH ;move cd into dash
.WORD 0
WHERE_YOU_GO
.WORD 0F380H,078H,0482EH ;where you go now is up to you
.WORD 0
SCORE_GOES_UP
.WORD 0F380H,078H,0434DH ;where you go now is up to you
.WORD 0
MAGGOTS_SND
.WORD 0F380H,078H,04831H ;they're maggots
.WORD 0
KEMMITECH
.WORD 0F380H,180,04843H ;destroy kemmitech
.WORD 0
TEAR_DOWN_THE_WALL
.WORD 0F380H,180,0483EH ;destroy kemmitech
.WORD 0
STOP_THE_BUS
.WORD 0F380H,180,04834H ;destroy kemmitech
.WORD 0
WOOSH_SND
.WORD 0F380H,078H,0409AH ;WOOSH THE SCREEN ON
.WORD 0
SND_SWEET_VOCALS
.WORD 0F0FDH,1,08021H,0
AERO_WINGS_INIT
.LONG RXLOGO_vda
.WORD DMAWNZ, M_SCRNOBJ
.WORD OM_INSERT|OM_OID
.WORD OID_P1TEXT
DEST1A_INIT
.BYTE 2,0,0,2
.LONG GUNON_P
.LONG WHITTIT_P
.WORD OID_P2MOTEXT,OM_INSERT|OM_SPOS|OM_GUNV
.LONG NON_BONUS_GUN_VECT
.LONG [104,198]
.LONG USEGUN
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE|M_NOPIXSCAN,0,0
.LONG WHITETIT
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE|M_NOPIXSCAN,0,0
DEST2A_INIT
.LONG AMAON
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE|M_NOPIXSCAN
.WORD OM_INSERT|OM_SPOS|OM_OID|OM_GUNV
.WORD OID_P1MOTEXT
.LONG BONUS_GUN_VECT
.LONG [104,198],0
DEST2B_INIT
.LONG AMAOFF
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE|M_NOPIXSCAN
.WORD OM_INSERT|OM_SPOS|OM_OID|OM_GUNV
.WORD OID_P2MOTEXT
.LONG NON_BONUS_GUN_VECT
.LONG [104,198],0
DEST3A_INIT
.LONG PACON
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE|M_NOPIXSCAN
.WORD OM_INSERT|OM_SPOS|OM_OID|OM_GUNV
.WORD OID_P1MOTEXT
.LONG BONUS_GUN_VECT
.LONG [104,198],0
DEST3B_INIT
.LONG PACOFF
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE|M_NOPIXSCAN
.WORD OM_INSERT|OM_SPOS|OM_OID|OM_GUNV
.WORD OID_P2MOTEXT
.LONG NON_BONUS_GUN_VECT
.LONG [104,198],0
DEST4A_INIT
.LONG MIDON
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE|M_NOPIXSCAN
.WORD OM_INSERT|OM_SPOS|OM_OID|OM_GUNV
.WORD OID_P1MOTEXT
.LONG BONUS_GUN_VECT
.LONG [104,198],0
DEST4B_INIT
.LONG MIDOFF
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE|M_NOPIXSCAN
.WORD OM_INSERT|OM_SPOS|OM_OID|OM_GUNV
.WORD OID_P2MOTEXT
.LONG NON_BONUS_GUN_VECT
.LONG [104,198],0
OBJECTIVE_TEXT_INIT
.LONG TXTNONOBJ1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_OID
.WORD OID_P2MOTEXT
.LONG [180,130],0
CD_INIT
.LONG DISC2124
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS
.LONG [470,200],1
DASH_ARROW_INIT
.LONG TXTARROW1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_OID
.WORD OID_P2MOTEXT
.LONG [187,123],0
STEVE_TEXT_INIT
.LONG STEVETXT1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_OID
.WORD OID_P2MOTEXT
.LONG [180,130],0
ST_WALL_INIT
.LONG TWAL
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS
.LONG [095H,0C7H],1
STEVEN_TYLER_INIT
.LONG S471sa4
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_ANIM
.LONG STEVE_ANIM
.LONG [039h,0a0h],0
BRAD_TEXT_INIT
.LONG BRADTXT1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_OID
.WORD OID_P2MOTEXT
.LONG [180,130],0
BRAD_WALL_INIT
.LONG BRADWAL
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS
.LONG [095H,0C7H],1
BRAD_INIT
.LONG B241SA10
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_ANIM
.LONG BRAD_ANIM
.LONG [03ah,090h],0
PERRY_TEXT_INIT
.LONG JOETXT1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_OID
.WORD OID_P2MOTEXT
.LONG [180,130],0
PERRY_WALL_INIT
.LONG PERRYWAL
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS
.LONG [095H,0C7H],1
JOE_PERRY_INIT
.LONG J321SA10
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_ANIM
.LONG PERRY_ANIM
.LONG [03ah,08ch],0
KRAMER_TEXT_INIT
.LONG JOEYTXT1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_OID
.WORD OID_P2MOTEXT
.LONG [180,130],0
KRAMER_WALL_INIT
.LONG DESRT
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS
.LONG [095H,0C7H],1
KRAMER_INIT
.LONG KRAM04
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_ANIM
.LONG KRAMER_ANIM
.LONG [095h,0C7h],0
TOM_TEXT_INIT
.LONG TOMTXT1
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_OID
.WORD OID_P2MOTEXT
.LONG [180,130],0
TOM_WALL_INIT
.LONG TVWALL
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS
.LONG [095H,0C7H],1
TOM_INIT
.LONG TOMHAM06
.WORD DMAWNZ, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_SPOS|OM_ANIM
.LONG TOM_ANIM
.LONG [095h,0C7h],0
STEVE_ANIM
LW S471sa4,24
LWL S471sa5,6|AFunc,CALL_WHERE
LW S471sa6,6
LW S471sa7,6
LW S471sa8,6
LW S471sa9,6
LW S471sa10,6
LW S471sa11,6
LW S471sa12,6
LW S471sa13,7
LW S471sa14,9
LW S471sa15,9
LW S471sa16,8
LW S471sa17,7
LW S471sa18,7
LW S471sa19,7
LW S471sa20,6
LW S471sa21,7
LW S471sa22,7
LW S471sa23,0BH
LW S471sa24,6
LW S471sa25,8
LW S471sa26,0AH
LW S471sa27,8
LW S471sa28,8
LW S471sa29,120
.LONG 0
BRAD_ANIM
LW B241SA10,12
LW B241SA11,12
LW B241SA12,1
LWL 1,5|AFunc,CALL_KEMMITECH
LW B241SA13,6
LW B241SA14,6
LW B241SA15,6
LW B241SA16,6
LW B241SA17,6
LW B241SA18,6
LW B241SA19,6
LW B241SA20,6
LW B241SA21,6
LW B241SA22,6
LW B241SA23,6
LW B241SA24,6
LW B241SA25,5
LW B241SA26,6
LW B241SA27,5
LW B241SA28,6
LW B241SA29,6
LW B241SA30,6
LW B241SA31,7
LW B241SA32,5
LW B241SA33,6
LW B241SA34,6
LW B241SA35,6
LW B241SA36,6
LW B241SA37,6
LW B241SA38,6
LW B241SA39,6
LW B241SA40,6
LW B241SA41,6
LW B241SA42,120
.LONG 0
PERRY_ANIM
LW J321SA10,24
LW J321SA11,1
LWL 1,5|AFunc,CALL_MAGGOTS
LW J321SA12,6
LW J321SA13,6
LW J321SA14,5
LW J321SA15,5
LW J321SA16,6
LW J321SA17,6
LW J321SA18,5
LW J321SA19,6
LW J321SA20,6
LW J321SA21,6
LW J321SA22,6
LW J321SA23,6
LW J321SA24,6
LW J321SA25,6
LW J321SA26,6
LW J321SA27,6
LW J321SA28,6
LW J321SA29,6
LW J321SA30,6
LW J321SA31,6
LW J321SA32,6
LW J321SA33,6
LW J321SA34,6
LW J321SA35,6
LW J321SA36,6
LW J321SA37,6
LW J321SA38,6
LW J321SA39,6
LW J321SA40,120
.LONG 0
KRAMER_ANIM
LW KRAM04,24
LWL KRAM04,4|AFunc,CALL_STOP_THE_BUS
LW KRAM05,4
LW KRAM06,6
LW KRAM07,6
LW KRAM08,6
LW KRAM09,6
LW KRAM10,6
LW KRAM11,6
LW KRAM12,6
LW KRAM13,6
LW KRAM14,6
LW KRAM15,6
LW KRAM16,6
LW KRAM17,4
LW KRAM18,6
LW KRAM19,6
LW KRAM20,120
LW 1,120
.LONG 0
TOM_ANIM
LW TOMHAM06,24
LWL TOMHAM07,6|AFunc,CALL_TEAR_DOWN_THE_WALL
LW TOMHAM08,6
LW TOMHAM09,6
LW TOMHAM10,6
LW TOMHAM11,6
LW TOMHAM12,6
LW TOMHAM13,6
LW TOMHAM14,6
LW TOMHAM15,6
LW TOMHAM16,6
LW TOMHAM17,6
LW TOMHAM18,120
.LONG 0
DASH_TIME_FONT
.LONG COLTXT1,COLTXT1,COLTXT1,COLTXT1,COLTXT1
.LONG COLTXT1,COLTXT1,COLTXT1,COLTXT1,COLTXT1
.LONG COLTXT1,COLTXT1,COLTXT1,COLTXT1,COLTXT1
.LONG TXT0,TXT1,TXT2,TXT3,TXT4,TXT5,TXT6
.LONG TXT7,TXT8,TXT9
.LONG COLTXT1
.LONG TXT2,TXT2,TXT2,TXT2,TXT2,TXT2
.LONG TXT2,TXT2,TXT2,TXT2,TXT2,TXT2,TXT2,TXT2
.LONG TXT2,TXT2,TXT2,TXT2,TXT2,TXT2,TXT2,TXT2
STEVEN_STUFF
.LONG STEVE_TEXT_INIT,ST_WALL_INIT,STEVEN_TYLER_INIT
.WORD 229
PERRY_STUFF
.LONG PERRY_TEXT_INIT,PERRY_WALL_INIT,JOE_PERRY_INIT
.WORD 229
BRAD_STUFF
.LONG BRAD_TEXT_INIT,BRAD_WALL_INIT,BRAD_INIT
.WORD 250
KRAMER_STUFF
.LONG KRAMER_TEXT_INIT,KRAMER_WALL_INIT,KRAMER_INIT
.WORD 150
TOM_STUFF
.LONG TOM_TEXT_INIT,TOM_WALL_INIT,TOM_INIT
.WORD 100
;**************************************************************************
;* *
;* CREATE BOX BEHIND ANOTHER OBJECT, CAN BE BEHIND LOTS OF MULTIPARTERS *
;* WILL CREATE A ZPOS 1 BEHIND MAIN OBJECT *
;* ASSUMES FIRST OBJECT IN MULTIPARTER, FAR LEFT AND TOP *
;* ASSUMES LAST OBJECT IN MULTIPARTER, FAR RIGHTAND BOTTOM *
;* *
;* COMING IN *
;* A8 - EXISTING OBJECTS YOU WANT BOX AROUND (CAN BE MULTIPARTERS) *
;* A4 - EXTRA PIXEL OVERSPILL Y/X *
;* A7 - COLOUR *
;* RETURNS *
;* A6 - BOX OBJECT *
;* *
;**************************************************************************
JAKE_BOX
MMTM SP,A8
MOVI STATIC_BOX_INIT,B0 ;create a static object
CALLA EASYMAKE
MOVE A0,A6
MOVE *A8(ODAG),A0,L ;get initial object dag
SRL 1,A4 ;divide pixel surround by 1
ANDI 0FFFF7FFFH,A4
SUBXY A4,A0 ;sub pixel surround from dag
MOVE A8,A3
GET_NEXT_BOX_PART
MOVE A3,A2 ;find last piece (if multiparter)
MOVE *A2(OPARTS),A3,L
JRNZ GET_NEXT_BOX_PART
MOVE *A2(ODAG),A1,L ;get last piece dag
MOVE *A2(OSIZE),A3,L ;get last piece size
ADDXY A3,A1 ;add initial object size to br dag
ADDXY A4,A1 ;add pixel surround to br dag
SUBXY A0,A1 ;sub box dag from br dag to get size
MOVE A1,*A6(OSIZE),L ;store new box size
MOVE A1,*A6(OUSIZE),L
MOVE A0,*A6(ODAG),L ;store dag
MOVE A0,*A6(OXPOS) ;store x & ypos in object registers
SRL 16,A0
MOVE A0,*A6(OYPOS)
MOVE A7,*A6(OCONST) ;store pixel constant
MOVE *A8(OZVAL),A1,L ;grab initial object zpos
INC A1 ;make box 1 behind
MOVE A1,*A6(OZVAL),L
MMFM SP,A8
RETS
STATIC_BOX_INIT
.LONG STATIC_BOX1
.WORD DMACAL, M_SCRNOBJ|M_NOSCALE
.WORD OM_INSERT|OM_OID
.WORD OID_P2MOTEXT
.long TEXTPAL
STATIC_BOX1
.word 0100CH,10,10
.long 0f800000H
.word 0,0
.END