total-carnage/LAYER.ASM

2789 lines
50 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.

**************************************************************
*
* Software: Mark Turmell
* Initiated: 3/28/91
*
* Modified: !
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 1/9/92 18:40
**************************************************************
.FILE 'LAYER.ASM'
.TITLE 'TOTAL CARNAGE GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GAME.EQU"
;
;SOUNDS EXTERNAL
;
.REF ALTEXP4,MECH1,ALTXP1A,AGLSEXP,GLSEXP,MTING,ONESNDOVR
;SYMBOLS EXTERNALLY DEFINED
;
.REF GETSND,GETCOS,GETSIN,CLNICN,STATUS,SHK_ON
.REF DO_DIFF2,RANDOM,INTO12,RANDPER,RANGRAND,SCRTSTG,FRANIM,WFLG
.REF GET_WVADDR,HALT,ENEMY_RECT,PCNT,PIT2,DO_PUNISH,GPALOBJ
.REF SCORE_IT,FAME4,FAME2,FAME3,FLASHME,TBLST,FIREEXP,SHAKER
.REF missile_firexy,GETFPAL,SCRADD2,P1DATA,P2DATA,WAVE,FIXEDA
.REF PLYROBJS,FRANIMQ,RUNIN,LOWZ,SBOMB,missile_firexy_slow
.ref RNDRNG0
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF SPAWN_LYR,MAXLYR,LYR_CNT,KILL_LY,YKIL_RNG,SENDGRN,SENDGRN2
.DEF FLAME_LAY,YKIL_LAY,LAY_EXP,PHASE1,LHLPS
.DEF XVL,YVL,STRT_ALAY,BIGBLU,SPAWN_MISL
.DEF DOYV1,DOYV,DOYVP,BOLTS,HLPON,LSHIT,LSDMG
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS LYR_CNT,16 ;TOTAL TANKS ON SCREEN
.BSS TNK_DN,16
.BSS MAXLYR,16 ;MAX NUMBER OF TANKS ALLOWED ON SCRN
.BSS PTMP,16
.BSS TEMP,32
;
;EQUATES FOR THIS FILE
;
;TANK DATA STRUCTURE
;
CNTR .EQU PDATA ;DELAY FOR OID SWAPPING
SPDY .EQU PDATA+16
DIR .EQU PDATA+32 ;UHW OBJECT DIRECTION
;MYPLYR .EQU PDATA+48 ;UHW PLAYER 1 OR 2 FIRED ME
SK_DIR .EQU PDATA+64 ;SEEK DIR FOR SPIN
LEVEL .EQU PDATA+80 ;DIFFICULTY LEVEL FOR SPEEDS ETC.
HSPD .EQU PDATA+96
H2SPD .EQU PDATA+128
VSPD .EQU PDATA+160
V2SPD .EQU PDATA+192
TOTMN .EQU PDATA+224 ;UHW
WAY01 .EQU PDATA+240 ;UHW
ABSRB .EQU PDATA+256 ;UHW
;ABSRB IS DEFINED IN FIEND.ASM
CFLAGS .EQU PDATA+272 ;UHW CONTROL FLAGS FOR OBJECT
MYPATRN .EQU PDATA+288 ;UHL PATTERN LIST ADDRESS
KPANTOBJ .EQU PDATA+320 ;UHL ANTENNA IMG PNTR
LAYTMR .EQU PDATA+352 ;UHW
MRAM .EQU PDATA+368 ;UHL 32*POINTER TO RAM LIST
KPMRAM .EQU PDATA+400 ;UHL CALLA FREEOBJ WITH THIS LATER
DIS .EQU PDATA+432 ;UHW OBJECT DISTANCE COUNT
MYANT .EQU PDATA+448 ;UHL ANTENNA PROC POINTER
;
;
;ANTENNA DATA STRUCTURE
;
;
;EQUATES
;
HSPEED .EQU 07000H ;INITIAL SPEED FOR MINE LAYER
HSPEED2 .EQU HSPEED*2 ;INITIAL SPEED FOR MINE LAYER
HITLAY .EQU 20*30
;
;EQUATES
;
MAXHITS .EQU 10 ;HELPER BLADE DIFFICULTY SETTING
ADLTA .EQU 0381BH ;(411775/(160/2))
;
; LASER/BLADES DATA STRUCTURE
;
PTRX .EQU PDATA ;UHW ;LAST X
PTRY .EQU PDATA+16 ;UHW ;LAST Y
;ANIMTIK .EQU PDATA+32 ;UHL ;FRAME SLEEP TIME
THETA .EQU PDATA+64 ;SHL ;CURRENT PROGRESSION
DELTA .EQU PDATA+96 ;SHL ;DELTA ANGLE
LEG .EQU PDATA+128 ;UHL LEG OF PLAYER WHO COLLECTED ME
HITS .EQU PDATA+160 ;UHW ;HIT CNTR
.TEXT
HELP .WORD >F97E,>24,>80C1,0 ;"HELP"
HLPON:
MMTM SP,A1,A7,A9,A10
; MOVE A0,A9 ;A9=LEG
MOVE *A0(OPLINK),A0,L
MOVE *A0(LEG_PTR),A9,L
MOVE *A0(LSRPTR),A0,L
JRZ SKP
MOVE *A0(OPLINK),A0,L
CLR A1
MOVE A1,*A0(HITS)
JRUC SKP2
SKP CREATE0 LASER
SKP2 CALLA CLNICN
MOVI GETSND,A0
CALLA ONESND
MMFM SP,A1,A7,A9,A10
RETS
; DO LASER MOVEMENT LOGIC
LASER:
;A9=LEG IMG PNTR OF PLAYER WHO TOUCHED ME
CLR A0
MOVE A0,*A13(MYPLYR) ;THIS BLADE WILL NOT SCORE PTS
;VEHICHLES USE THE BLADE OID FOR KILLING GRUNTS, ETC.
;SO THE HELPER BLADE WILL NOT SCORE PTS FOR THE PLAYER
CLR A0
MOVE A0,*A13(HITS)
MOVI ADLTA,A0
MOVE A0,*A13(DELTA),L
MOVI INITAB,A14
CALLA GPALOBJ ;ALLOCATE A COLOR PALETTE
CALLA STFOBJ ;STUFF OBJECT DATA
MOVE A13,*A0(OPLINK),L
CALLA ADJSTWTL ;PUT US IN THE WORLD
CALLA INSOBJ ;INSERT OBJECT INTO LIST
MOVE A0,A10
;A9=CORRECT LEG PTR
MOVE A9,*A13(LEG),L
;A7=A7 ALREADY?
MOVE *A9(OPLINK),A7,L ;LEGS HAVE SAME OPLINK AS TORSO!
;A7 NOW EQUALS TORSO PROC OF PLAYER WHO PICKED UP HELPER ICON
MOVE A0,*A7(LSRPTR),L
;THIS OKAY?
MOVE A9,A8
CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3
MOVE A10,A8
ADDI [3,0],A2
MOVE A2,*A8(OYVAL),L
SUBI [10,0],A3
MOVE A3,*A8(OXVAL),L
CLR A0
MOVE A0,*A13(PTRX),W ;OLD X,Y VALUES
MOVE A0,*A13(PTRY),W
MOVE A0,*A13(THETA),L
;
ENCIRCLE:
; MAKE LASER MOVE IN A CIRCLE AROUND PLAYER
CALLR ALIGNXY ;KEEP OBJECT ALIGNED WITH PLAYER
MOVE *A13(THETA),A2,L ;PROGRESSIVE THETA
MOVE *A13(DELTA),A0,L ;NEXT DELTA ANGLE
ADD A2,A0
CALLA GETCOS
MOVE A0,A11
MOVK 3,A0
MPYS A0,A11
MOVE A14,*A13(THETA),L
MOVE A14,A0
CALLA GETSIN
MOVE A0,A3
MOVK 3,A0
MPYS A0,A3
MOVE A3,A10
MOVE *A8(OXVAL),A3,L
MOVE *A8(OYVAL),A4,L
ADD A11,A3
ADD A10,A4
MOVE A3,*A8(OXVAL),L
MOVE A4,*A8(OYVAL),L
SLOOP 1,ENCIRCLE
LASERDIE:
MOVE A11,*A8(OXVEL),L
MOVE A10,*A8(OYVEL),L
FLYER:
CALLA SCRTST
JRNZ LSER
SLOOP 30,FLYER
LSER jauc DELOBJDIE
ALIGNXY:
; KEEP LASER WITHIN X CENTERPOINT OF PLAYER
; PARMS:
;
; A8 = PTR TO PLINDX
;
MOVE *A13(PTRX),A4,W ;OLD X,Y VALUES
MOVE *A13(PTRY),A5,W
MOVE A8,A10
MOVE *A13(LEG),A8,L
CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3
MOVE A10,A8
SWAP A2,A3
SRL 16,A2
SRL 16,A3
MOVE A4,A4
JRZ PK
DIFF:
CMP A4,A2
JREQ DOY
JRGT ADDX ;NEW X POS > OLD X POS
SUBX:
SUB A2,A4
MOVE *A8(OXPOS),A6
SUB A4,A6
MOVE A6,*A8(OXPOS)
JRUC DOY
ADDX:
SUB A2,A4
NEG A4
MOVE *A8(OXPOS),A6
ADD A4,A6
MOVE A6,*A8(OXPOS)
DOY:
CMP A5,A3
JREQ PK ;NO DIFFERENCES IN X,Y BYE!
JRGT ADDY ;NEW Y POS > OLD Y POS
SUBY:
SUB A3,A5
MOVE *A8(OYPOS),A6
SUB A5,A6
MOVE A6,*A8(OYPOS)
JRUC PK
ADDY:
SUB A3,A5
NEG A5
MOVE *A8(OYPOS),A6
ADD A5,A6
MOVE A6,*A8(OYPOS)
PK:
MOVE A2,*A13(PTRX),W
MOVE A3,*A13(PTRY),W
RETS
LSDMG:
MMTM SP,A1,A13
MOVE *A8(OPLINK),A13,L ;GET PROCESS ID BACK
MOVE *A13(HITS),A1
INC A1
MOVE A1,*A13(HITS)
CMPI MAXHITS,A1
JRNZ HO
;BLADE TO FLY OFF
;RESET HERE
CALLR LSHIT
HO MMFM SP,A1,A13
RETS
LSHIT:
;CALLED FROM COLLISION ROUTINE
;ALSO CALLED FROM ROBO WHEN PLAYER DIES
;A8=HELPER IMG PNTR
MMTM SP,A0,A7,A13
;PUSHING ENOUGH STUFF HERE?
MOVE *A8(OPLINK),A13,L ;GET PROCESS ID BACK
;HELPER TO FLY OFF
;RESET HERE
MOVE *A13(LEG),A0,L ;GET LEG I SURROUND
MOVE *A0(OPLINK),A0,L ;GET PLAYER PROC
CLR A7
MOVE A7,*A0(LSRPTR),L ;ZERO PLAYER PROC LASER PNTR
MOVE A13,A0
MOVI LASERDIE,A7
CALLA PUTA7 ;THIS HLPR WILL NOW WAKE UP AT A7 ADDR
MMFM SP,A0,A7,A13
RETS
INITAB:
.LONG 0,0,BLADE
.WORD 158,DMAWNZ,CLSPLYR|TYPHLPR
.LONG 0,0
BOLTS
MOVK 10,A10
BLT1 CREATE FUTUREPID,ONEBOLT
DSJS A10,BLT1
MOVE @WORLDTLX+16,A10
ADDI 70,A10
;A10=TARGET FOR CHANGING @RUNIN TO 1
SETR SLEEPK 20
MOVE @WORLDTLX+16,A0,L
CMP A10,A0
JRLT SETR
MOVK 1,A0
MOVE A0,@RUNIN
DIE
ONEBOLT SLEEPK 10
MOVE @WORLDTLX+16,A0
CMPI 580H,A0
JANC SUCIDE
MOVI BOLTX-16,A1
MOVE A10,A2
SLL 4,A2
ADD A2,A1
MOVE *A1,A1,W
CMP A1,A0
JRNC ONEBOLT
ADDI 400,A0
CMP A1,A0
JRC ONEBOLT
;BOLT IS ON SCRN
ADDI BOLTNUM-16,A2
MOVE *A2,A11,W
MOVE A1,A0
SLL 16,A0
MOVE A0,A9
MOVI [559H,0],A1
MOVI VBOLT1,A2
MOVI 150,A3
MOVI DMAWNZ,A4
MOVI CLSNEUT|TYPBOLT,A5
CLR A6
CLR A7
CALLA BEGINOBJ2
CREATE0 DOIT
MOVI ELECSND1,A0
CALLA ONESND
MOVE A9,A0
MOVI [5B2H,0],A1
MOVI VBOLT1,A2
MOVI 150,A3
MOVI DMAWNZ,A4
MOVI CLSNEUT|TYPBOLT,A5
CLR A6
CLR A7
CALLA BEGINOBJ2
MOVI ELECSND2,A0
CALLA ONESND
BL1 MOVI BOLTVF,A9
JSRP FRANIMQ
DSJS A11,BL1
MOVI ELECSND2,A0
CALLA ONESND
MOVE A8,A0
CALLA DELOBJ
MOVE A10,A0
SLL 4,A0
ADDI SLPTIM-16,A0
MOVE *A0,A0,W
CALLA PRCSLP
JRUC ONEBOLT
DOIT
MOVI BOLTVF,A9
JSRP FRANIMQ
DSJS A11,DOIT
MOVE A8,A0
CALLA DELOBJ
DIE
ELECSND1
.WORD >F0E5,>18,>811E,0
ELECSND2
.WORD >F5E5,20,>811F,0
BOLTNUM .WORD 2,5,5,4,2,5,5,2,5,1
SLPTIM .WORD 45,72,45,60,70,45,46,41,53,69
BOLTX .WORD 0E3H,017EH,1ffh,25CH,32AH,3B9H,42EH,4BBH,584H,59CH
BOLTVF
.LONG VBOLT1
.WORD FLIPBITS|3,0
.LONG VBOLT2
.WORD 3
.LONG VBOLT3
.WORD 3
.LONG VBOLT1
.WORD FLIPBITS|3,M_FLIPH
.LONG VBOLT2
.WORD 3
.LONG VBOLT3
.WORD 3
.LONG VBOLT1
.WORD FLIPBITS|3,M_FLIPV
.LONG VBOLT2
.WORD 3
.LONG VBOLT3
.WORD 3
.LONG VBOLT1
.WORD FLIPBITS|3,M_FLIPV|M_FLIPH
.LONG VBOLT2
.WORD 3
.LONG VBOLT3
.WORD 3
.LONG 0
DOYV1 ;FROM TOP OF SCRN DOWN
MOVI -3000H,A0 ;12
MOVE A0,*A8(OYVEL),L
SLEEPK 10
MOVI -1000H,A0 ;12
MOVE A0,*A8(OYVEL),L
SLEEPK 3
MOVI 5000H,A0 ;12
MOVE A0,*A8(OYVEL),L
SLEEPK 15
MOVI 0F000H,A0 ;12
MOVE A0,*A8(OYVEL),L
SLEEPK 015H
MOVI 016000H,A0 ;12
MOVE A0,*A8(OYVEL),L
SLEEPK 0CH
MOVI 01C000H,A0 ;12
MOVE A0,*A8(OYVEL),L
DIE
DOYV MOVI -8000H,A0 ;FROM RIGHT OF SCRN DOWN
MOVE A0,*A8(OYVEL),L
SLEEPK 15
MOVI -4000H,A0
MOVE A0,*A8(OYVEL),L
SLEEPK 15
MOVI 3000H,A0
MOVE A0,*A8(OYVEL),L
SLEEPK 15
MOVI 0C000H,A0
MOVE A0,*A8(OYVEL),L
SLEEPK 15
MOVI 15000H,A0
MOVE A0,*A8(OYVEL),L
DIE
DOYVP MOVI 0FFFE7000H,A0 ;FOR HULK JUMPING UP AND OUT OF PIT
MOVE A0,*A8(OYVEL),L
SLEEPK 18
MOVI 159,A0
MOVE A0,*A8(OZPOS)
SLEEPK 7
MOVI 0FFFF6000H,A0
MOVE A0,*A8(OYVEL),L
SLEEPK 15
MOVI 08000H,A0
MOVE A0,*A8(OYVEL),L
SLEEPK 7
MOVI 0F000H,A0
MOVE A0,*A8(OYVEL),L
SLEEPK 7
MOVI 15000H,A0
MOVE A0,*A8(OYVEL),L
DIE
LHLPS
MOVI HELP,A0
CALLA ONESND
SLEEP 40
MOVI HELP,A0
CALLA ONESND
SLEEP 40
MOVI HELP,A0
CALLA ONESND
SLEEP 40
MOVI HELP,A0
CALLA ONESND
DIE
PHASE1
CLR A1
MOVE A1,*A8(OXVEL),L
MOVE A1,*A8(OYVEL),L
DEC A9
SLL 5,A9
ADDI PLYROBJS,A9
MOVE *A9,A0,L
MOVE *A0(OYPOS),A2 ;A2=Y OF PLYR I HIT
MOVE *A0(OXPOS),A1 ;A1=X
MOVE *A8(OYPOS),A3 ;A3=THIS HULKS' Y
MOVE *A8(OXPOS),A4 ;A4=THIS HULKS' X
CMP A3,A2
RETS
SPAWN_MISL
;SPAWN MISL
MOVI EXCUSE,A0
CALLA ONESND
CREATE BOSSPID,SPM
RETS
SPM SLEEP 50
CALLA FIXEDA
CMPI 5,A10
JRNZ SPFZ
ADDI [-25,42],A9
;A8=CHOSEN RECTANGLE INFO
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
SPFZ
MOVI MISL,A2
CALLA GET_WVADDR
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS MISL GROUP
DEC A1
MOVE A1,*A0(16),W
MOVI msllnchsnd,A0
CALLA ONESND
CLR A8
movx a9,a8
SRL 16,a9
MOVI 300,A11
SLL 3,A10
ADDI DTBL,A10
MOVB *A10,A10
;A8=X, A9=Y, A10=Dir, A11=Fuel
JAUC missile_firexy ;START ONE MISL
********************************
* Launch slow tough missile against good player (Process)
* A9=*Plyr leg obj
.DEF SPAWN_MISL_GOOD
SPAWN_MISL_GOOD
movi 60*4,a0
calla RNDRNG0
addk 30,a0
calla PRCSLP ;Sleep random
MOVI EXCUSE,A0
CALLA ONESND
SLEEP 60
MOVI msllnchsnd,A0
CALLA ONESND
MOVE A9,A7 ;*Plyr
MOVE @WORLDTLX+16,A8 ;X
MOVE @WORLDTLY+16,A9 ;Y
addi 200,a8
addi 260,a9
clr a10 ;Dir
movi 500,a11 ;Fuel
jauc missile_firexy_slow
;msllnchsnd .word >f290,10,>812C,0 ;Missile launch
;msllnchsnd .word >f290,10,>80b6,0 ;Missile launch
msllnchsnd .word >f290,10,>80b9,0 ;Missile launch
EXCUSE .word >f9F0,10,>814F,0 ;EXCUSE ME
DTBL .BYTE 0,0,0,8,0,16,0,24,0
.EVEN
KILL_LY
;A8=MINE LAYER IMAGE TO SMART BOMB
;A9=P1DATA OR P2DATA FOR SCORE UPDATE
;SMART BOMB ENTRY
;ENTER HERE WITH SMART BOMB
CREATE0 HSMRT
MOVI CLSDEAD,A0
MOVE A0,*A8(OID)
MOVE *A8(OPLINK),A0,L
MOVI NBLOWME2,A7
CLR A1
CALLA XFERPROC
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
HSMRT
MOVE A9,A2
;A2=P1DATA OR P2DATA
MOVI HLKPT,A1 ;AMOUNT OF SCORE FOR MINE LAYER!
CALLA SCRADD2 ;DO IT!
MOVE *A8(OYPOS),A2
ADDK 20,A2 ;A2=Y OFFSET
MOVE A2,*A8(OYPOS)
MOVI 300,A0 ;200
MOVE A0,*A8(OZPOS)
MOVI XBOOM2,A9 ;BOOM3 CHANGES PALETTE TO EXPLOSION!
jauc FRQDELDIE
XBOOM2
.LONG XPLD1
.WORD NEWPALET|4
.LONG GRNBOOM
.LONG XPLD2
.WORD 4
.LONG XPLD3
.WORD 4
.LONG XPLD4
.WORD 4
.LONG XPLD5
.WORD 4
.LONG XPLD6
.WORD 4
.LONG XPLD7
.WORD 6
.LONG XPLD8
.WORD 6
.LONG XPLD9
.WORD 6
.LONG XPLD10
.WORD 6
.LONG 0
FLAME_LAY
;MINE LAYER HIT BY BULLET
MMTM SP,A1,A2,A3,A7,A9,A10
PUSH A0
MOVI HITLAY,A3
CALLA DO_PUNISH
PULL A0
JRLT PFT
;KILL MINE LAYER!
;TURN OFF COLLISIONS FOR THIS MINE LAYER
;XFERPROC THIS MINE LAYER TO CODE WHICH TURNS ON SOME FLAMES
;THAT CODE WILL LET IT FLAME FOR AWHILE THEN PUT A FEW EXPLOSIONS
;ON TOP OF IT AND KILL EVERYTHING
;THAT CODE WILL ALSO EXPLODE ALL LAND MINES THIS MINE LAYER HAS LAYED DOWN
;A8=MINE LAYER
;
MOVE *A0(OPLINK),A0,L ;PLAYER PROCESS
MOVI LAYPT,A1
CALLA SCORE_IT ;SCORES SAME AS FIEND
MOVE *A8(OFLAGS),A4
ORI M_NOCOLL,A4 ;NO COLLISIONS
MOVE A4,*A8(OFLAGS)
MOVE *A8(OPLINK),A0,L
MOVI LAY_EXP,A7
CLR A1
CALLA XFERPROC
MMFM SP,A1,A2,A3,A7,A9,A10
RETS
PFT
;FLASH THIS MINE LAYER
MOVI 03F3F0000H,A9
CREATE0 FLASHME
MMFM SP,A1,A2,A3,A7,A9,A10
RETS
YKIL_RNG
;A8=MINE LAYER IMG PNTR
MMTM SP,A1,A2,A7
MOVE *A0(OPLINK),A0,L
MOVI P1DATA,A2
MOVE *A0(PNUM),A0
CMPI 1,A0
JREQ J5
MOVI P2DATA,A2
;A2=P1DATA OR P2DATA
J5 MOVI LAYPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2
JRUC CONT
YKIL_LAY
;KILL MINE LAYER BECAUSE OF COLLISION WITH RING OR TIME BOMB
;EXTER HERE FROM COLLISION ROUTINE - RINGS KILL MINE LAYER
;A8=MINE LAYER IMG PNTR
MMTM SP,A1,A2,A7
MOVE *A0(OPLINK),A0,L
MOVI LAYPT,A1
CALLA SCORE_IT
CONT
MOVE *A8(OFLAGS),A0
ORI M_NOCOLL,A0
MOVE A0,*A8(OFLAGS)
MOVE *A8(OPLINK),A0,L
MOVI LAY_EXP,A7 ;END OF MINE LAYER DEATH - NO FLAMES
CLR A1
CALLA XFERPROC
MMFM SP,A1,A2,A7
RETS
;
SPAWN_LYR:
;SPAWN TANK IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
;BAD GUYS THROUGHOUT A WAVE
MOVE @HALT,A0
JRNZ TANK_OUT
MOVE @LYR_CNT,A2 ;MOVE BYTE (# TANKS ON SCRN) TO A2
MOVE @MAXLYR,A3
CMP A3,A2 ;TANKS MAXED OUT?
JRGE TANK_OUT ;
CREATE LAYPID,ATNK ;START ONE MINE LAYER
TANK_OUT:
RETS
LOCK LOCKUP
CLRTNK
MOVE A0,*A13(MRAM),L ;CALL FREEOBJ LATER
MOVE A0,*A13(KPMRAM),L
CLR A0
MOVE A0,*A13(MYPLYR) ;FOR WHEN LAYER KILLS GRUNTS!
MOVE A0,*A13(SPDY)
MOVE A0,*A13(TOTMN)
MOVE A0,*A13(ABSRB)
MOVE A0,*A13(CFLAGS)
MOVE A0,*A13(SK_DIR)
MOVK 25,A0
MOVE A0,*A13(CNTR)
MOVE A0,*A13(LAYTMR)
RETS
STRT_ALAY ;A8=*MINE LAYER
MOVI CLSDEAD,A0
MOVE A0,*A8(OID)
; movi LAYPID,a0
; move a0,*a13(PROCID)
move a13,*a8(OPLINK),L
MOVI 2*60,B0 ;3
MOVI 18*60,B1 ;12
CALLA RANGRAND
CALLA PRCSLP
CALLA GETOBJ
JRZ LOCK ;NO FREE OBJECT SPACE
CALLR CLRTNK
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
;8 1 2
;7 3
;6 5 4
MOVE *A8(OXPOS),A9
SUBK 15,A9
MOVE *A8(OYVAL),A1,L
MOVY A1,A9
MOVE *A8(OIMG),A0,L
MOVE *A0(32),A0,L ;DATA ADDR
MOVI MTNK6,A1
MOVE *A1(64),A1,L ;DATA ADDR
CMP A0,A1
JRZ SG1
MOVI MTNK9,A1
JRUC SG2
SG1
;LEFT/RGT GUN PIT
;TURN ON GUNNER DUDE
MOVI MTNK6,A1
SG2 MOVE A1,*A8(OIMG),L
MOVK 5,A10
MOVE *A8(OIMG),A0,L
CMPI MTNK9,A0
JRNZ JIN
MOVK 7,A10
MOVE *A8(OFLAGS),A0
BTST B_FLIPH,A0
JRZ JIN
MOVK 3,A10
JIN MOVK 2,A1
MOVE A1,*A13(LEVEL),W
CALLA DELOBJA8
CALLR JINHR ;TURN ON IMG, SET LOCATION, DIRECTION
MOVE @LYR_CNT,A0
INC A0
MOVE A0,@LYR_CNT
JRUC ATNK2
ATNK:
;YES A NEW MINE LAYER WILL APPEAR
;UPDATE WAVE_INFO RAM TABLE TO REFLECT THIS NEW ENTRY!
;THIS TANK WAS SPAWNED FROM 'WAVE OVERLORD' CODE
CALLA GETOBJ
JRZ LOCK ;NO FREE OBJECT SPACE
CALLR CLRTNK
CALLR INIT_TNK ;TURN ON IMG, SET LOCATION, DIRECTION
CALLR SETUP_TNK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
ATNK2 MOVI 500,A0
CALLA RANDPER
JRNC NORED
;RED MINE LAYER
MOVK 4,A0
MOVE A0,*A13(LAYTMR)
MOVI MTNKP2,A0 ;GRNTB,A0 ;GRNTP ;ALWAYS SOLDIER
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
MOVI HSPEED2,A1 ;TANK SPEED
MOVE A0,*A13(SPDY)
JRUC ARED
NORED MOVI HSPEED,A1 ;TANK SPEED
ARED CALLA DO_DIFF2
CLR A0
move A0,*a8(OCONST)
MOVE *A13(DIR),A0
CALLA INTO12
CALLR GET_RUN ;GET FIRST FRANIM PNTR FOR
;THIS TANKS DIRECTION
;SELECT A RANDOM PATTERN FOR MINE LAYER ENTERING FROM THIS DIRECTION
MOVE *A13(DIR),A0
SLL 5,A0
ADDI PATLST,A0
MOVE *A0,A0,L
MOVE @PTMP,A1
INC A1
MOVE A1,@PTMP
ANDI 03H,A1
SLL 5,A1
ADD A1,A0
MOVE *A0,A0,L
MOVE *A0+,A1,W ;GET FIRST DISTANCE CNT
MOVE *A13(SPDY),A3
JRZ NOSPD0
;SPEEDY MINE LAYER
SRL 1,A1
NOSPD0
MOVE A0,*A13(MYPATRN),L
MOVE A1,*A13(DIS)
;
; LOOP TOP FOR TANKS
;
MOVE A13,A10
CREATE0 ANTENNA
MOVE A0,*A13(MYANT),L ;KEEP FOR WHEN MINE LAYER DIES
; MOVI MECH1,A0 ;MECHANICAL ARRIVAL SND
; CALLA ONESND
;BEEP BEEP HORN SND
LUP_TP:
;TOP OF TANK LOGIC
MOVE @HALT,A0
JRZ TMV
SLEEPK 1
JRUC LUP_TP
TMV
MOVE *A13(CNTR),A3
ANDI 07H,A3
DEC A3
JRNZ TMV3
;SWAP THIS MINE LAYER OID BETWEEN PLAYER/HELPER AND MINE LAYER
MOVK 1,A3
MOVI CLSPLYR|TYPHLPR|SUBLAY,A1
MOVE *A8(OID),A0
ANDI 0FFFFH,A0
CMPI CLSENMY|TYPLAYR,A0
JRZ TMV2
MOVK 3,A3
MOVI CLSENMY|TYPLAYR,A1
TMV2 MOVE A1,*A8(OID)
TMV3
MOVE A3,*A13(CNTR)
MOVE *A13(CFLAGS),A0
BTST 0,A0
JRZ NOSPN
;THIS TANK IS SPINNING, DO SPIN
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CALLR WAY
JRC DIT ;INC
;DEC=CLRC
CLR A1 ;MOVI 0,A1
MOVE A1,*A13(WAY01)
JRUC DIT0
DIT MOVK 1,A1
MOVE A1,*A13(WAY01)
DIT0
MOVE A0,*A13(DIR),W
CALLR GET_STAND ;DOES ANI OF CORRECT VIEW
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CMP A0,A1
JREQ GOODNEWS
;ANI IN NEW STAND/SPIN DIR
SLEEPK 4
JRUC LUP_TP
GOODNEWS:
SLEEPK 20
CALLR GET_RUN ;ZEROS STAND FLAG ALSO
MOVE *A13(DIR),A0
CALLA INTO12 ;GET PROPER VELOCITY FOR THIS DIR
SLEEPK 1
JRUC LUP_TP
NOSPN: MOVE *A13(DIS),A0 ;UPDATE DISTANCE COUNT
DEC A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRNZ DOTNK ;BR=CONTINUE CURRENT DIRECTION
;TIME TO GET NEW DISTANCE AND NEW DIRECTION
MOVE *A13(MYPATRN),A10,L
MOVE *A10+,A11,W ;GET NEW DIRECTION
JRZ PATDN ;BR=PATTERN FINISHED
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
SLEEPK 20
MOVE *A10+,A2,W ;GET NEW DIS
MOVE *A13(SPDY),A3
JRZ NOSPD
;SPEEDY MINE LAYER
SRL 1,A2
NOSPD MOVE A2,*A13(DIS) ;STUFF NEW COUNT
MOVE A10,*A13(MYPATRN),L
MOVE A11,*A13(SK_DIR)
;TANK WILL SEEK TO A 45 DEGREE ANGLE (1,4,7,10)
MOVK 1,A0 ;TANK WILL SPIN TO SK_DIR
MOVE A0,*A13(CFLAGS) ;I WILL SPIN!
MOR SLEEPK 1
JRUC LUP_TP
PATDN
;PATTERN FINISHED
;DELETE ANTENNA, MINE LAYER
;DIE
CALLA SCRTST
JRNZ NBLOWME
;I AM STILL ON SCRN! CONTINUE IN THIS DIRECTION
MOVK 20,A0
MOVE A0,*A13(DIS)
JRUC MOR
NBLOWME
;I AM OFF SCRN
CALLA DELOBJA8
NBLOWME2 ;ENTRY FOR SMART BOMB
MOVE *A13(MYANT),A0,L
CALLA KILL
MOVE *A13(KPANTOBJ),A0,L
CALLA DELOBJ
MOVE @LYR_CNT,A0
DEC A0
MOVE A0,@LYR_CNT
MOVE *A13(KPMRAM),A10,L
MOVE *A13(TOTMN),A0 ;FLAG FOR I HAVE ALREADY
JRNN EXPEM ;KILLED MY LAND MINES
EXP_2_MANY
DIE
EXPEM
MOVK 12,A11
MOVE A10,A9
ND0 DEC A11
JRZ EXP_2_MANY
MOVE *A9+,A0,L
JRZ NDN
CALLA ISOBJ
JRZ ND0
MOVE *A0(OIMG),A1,L
CMPI M1,A1 ;LAND MINE
JRNZ ND0
MOVI DMAWNZ|M_NOCOLL,A1 ;LAND MINE NO COLLIDE ON
MOVE A1,*A0(OFLAGS)
MOVE A0,A8
MOVI MTING,A0 ;LAND MINE EXPLOSION SND
CALLA ONESND
CREATE0 KMINE
SLEEPK 6
JRUC ND0
NDN MOVE A10,A0 ;MOVE *A13(KPMRAM),A0,L
CALLA FREEOBJ
DIE
KMINE
MOVE A8,A10
CREATE0 KM2
CREATE0 KM2
CREATE0 KM2
SLEEPK 4 ;KILL ORIGINAL LAND MINE
move a10,a8
jauc DELOBJDIE
KM2
MOVI -08000H,B0
MOVI 08000H,B1
CALLA RANGRAND
MOVE A0,A6
MOVI -08000H,B0
MOVI 08000H,B1
CALLA RANGRAND
MOVE A0,A7
MOVI FIREEXP,A9
MOVE *A8(OXVAL),A0,L
MOVE *A8(OYVAL),A1,L
ADDI [5,0],A0
ADDI [5,0],A1
MOVI 292,A3 ;241 ;282
MOVI DMAWNZ|M_NOCOLL,A4 ;NON-ZERO VALUE
MOVI CLSNEUT|TYPNEUT,A5
MOVI CLD1,A2
CALLA BEGINOBJ2
;CREATE EXPLOSION, AND THEN DIE
jauc FRQDELDIE
DOTNK:
;MINE LAYER JUST CRUISING ALONG!
;CHECK FOR WALL BORDERS!
MOVE @WAVE,A0
CMPI 22,A0
JRNZ DT2
MOVE *A13(DIR),A0
CMPI 1,A0
JRNZ DT2
MOVE *A8(OYPOS),A0
CMPI 10CH,A0
JRNC DT2
;TURN ME AROUND
CLR A0
MOVE A0,*A8(OYVEL),L
MOVK 7,A11
MOVE A11,*A13(SK_DIR)
;TANK WILL SEEK TO A 45 DEGREE ANGLE (1,4,7,10)
MOVK 1,A0 ;TANK WILL SPIN TO SK_DIR
MOVE A0,*A13(CFLAGS) ;I WILL SPIN!
MOVK 30,A0
MOVE A0,*A13(DIS)
DT2
MOVE *A13(LAYTMR),A0
DEC A0
MOVE A0,*A13(LAYTMR)
JRNZ KS
MOVE *A13(TOTMN),A0
JRN KS
CMPI 11,A0
JRNC KS2
;LAY DOWN A LAND MINE
INC A0
MOVE A0,*A13(TOTMN)
MOVK 7,A0
MOVE A0,*A13(LAYTMR)
MOVE *A13(DIS),A0
CMPI 5,A0 ;5
JRC KS
CALLR LAYIT
KS
CLR A1
JSRP FRANIM
JRNC LUP_TP ;BR=NOT AT END OF SCRIPT YET
CALLR GET_RUN
JRUC LUP_TP
KS2 MOVI 0FFFFH,A0 ;FLAG FOR MINE LAYER TO KNOW
MOVE A0,*A13(TOTMN) ;TO NOT KILL HIS LAND MINES
MOVE *A13(KPMRAM),A10,L ;AT DEATH
CREATE0 EXPEM
JRUC KS
BIGBLU
.LONG XPLD1
.WORD 4
.LONG XPLD2
.WORD 4
.LONG XPLD3
.WORD 4
.LONG XPLD4
.WORD 4
.LONG XPLD5
.WORD 4
.LONG XPLD6
.WORD 4
.LONG XPLD7
.WORD 4
.LONG XPLD8
.WORD 4
.LONG XPLD9
.WORD 4
.LONG XPLD10
.WORD 4
.LONG 0
;BIGGRN
; .LONG XPLD1
; .WORD 4
; .LONG XPLD2
; .WORD 4
; .LONG XPLD3
; .WORD 4
; .LONG XPLD4
; .WORD 4
; .LONG XPLD5
; .WORD 4
; .LONG XPLD6
; .WORD 4
; .LONG XPLD7
; .WORD 4
; .LONG XPLD8
; .WORD 4
; .LONG XPLD9
; .WORD 4
; .LONG XPLD10
; .WORD 4
; .LONG 0
SENDGRN
;SEND GREEN EXPLOSIONS FROM JEEP
;A8=JEEP
; MOVI ALTEXP4,A0
; CALLA ONESND
MOVK 8,A11
MOVE A8,A10
LE2
CREATE0 KM2B
DSJS A11,LE2
DIE
BGLSEXP .WORD >FDF8,20,>80DB,0 ;ALT CHAN GLASS SHATTER
SENDGRN2
;SEND GREEN EXPLOSIONS FROM WARP DISC LOCATION
;A8=WARP DISC
MOVI BGLSEXP,A0
CALLA ONESNDOVR
MOVK 8,A11
MOVE A8,A10
BLE2
CREATE0 KM2C
DSJS A11,BLE2
DIE
ZKBM2
.LONG 0,0,X1BLU
.WORD 293,DMAWNZ+M_NOCOLL,CLSDEAD
.LONG 0H,0H
ZKBM3
.LONG 0,0,X1GRN
.WORD 293,DMAWNZ+M_NOCOLL,CLSDEAD
.LONG 0H,0H
LAY_EXP
;A8=MINE LAYER IMG
;COVER TIME
MOVI AGLSEXP,A0
CALLA ONESND
MOVK 8,A11
MOVE A8,A10
LE1
CREATE0 KM2A
DSJS A11,LE1
SLEEPK 6
MOVI GLSEXP,A0
CALLA ONESND
MOVE A10,A8
JRUC NBLOWME
KBM ;ARM RGT
.LONG 0,0,T72BLAST1 ;FIRE1
.WORD 293,DMAWNZ+M_FLIPH+M_NOCOLL,CLSDEAD
.LONG 0H,0H
SAVE1
CALLA GPALOBJ ;ALLOCATE A COLOR PALETTE
CALLA STFOBJ ;STUFF OBJECT DATA
CALLA INSOBJ ;INSERT OBJECT INTO LIST
MOVE A0,A9 ;A8
MOVE *A9(OPAL),A0,L
ANDI 0FFFFH,A0
MOVE A0,*A9(OPAL),L
MOVE A10,A8
CALLA GETANIXY
MOVE A9,A0
MOVE *A0(OFLAGS),A4,W ;SAME FLAGS AS BEFORE
RETS
KM2B
;TURN ON BURST EXP
;SEND IT OUT AT CORRECT ANGLE
;KILL OFF
;A10=MINE LAYER IMG
;A11=BURST #
MOVI ZKBM2,A14 ;DEATH FOR JEEP
CALLR SAVE1
ADDI 0500000H,A2 ;Y
; MOVE *A10(OIMG),A7,L
; CMPI JEEP4,A7
; JRNZ NOTHZ
; ADDI 0340000H,A3 ;X
;NOTHZ
CALLA GANISAG
MOVE A9,A8
MOVI BIGBLU,A9
JRUC CONTS
KM2C
;TURN ON BURST EXP
;SEND IT OUT AT CORRECT ANGLE
;KILL OFF
;A10=WARP DISC
;A11=BURST #
MOVI ZKBM3,A14 ;INTRO FOR WARP DISC
CALLR SAVE1
ADDI 0200000H,A2 ;Y
ADDI 0A0000H,A3 ;X
CALLA GANISAG
MOVE A9,A8
MOVI BIGBLU,A9 ;GRN,A9
JRUC CONTS
KM2A
;TURN ON BURST EXP
;SEND IT OUT AT CORRECT ANGLE
;KILL OFF
;A10=MINE LAYER IMG
;A11=BURST #
MOVI KBM,A14 ;BLOOD
CALLR SAVE1
SUBI 0F0000H,A2 ;1C
CALLA GANISAG
MOVE A9,A8
MOVI TBLST,A9
CONTS SLL 5,A11
MOVI XVL,A0
ADD A11,A0
MOVE *A0,A0,L
MOVE A0,*A8(OXVEL),L
MOVI YVL,A0
ADD A11,A0
MOVE *A0,A0,L
MOVE A0,*A8(OYVEL),L
;FROM MINE LAYER DEATH
jauc FRQDELDIE
XVL .LONG 0,0,14000H,18000H,14000H,0,-14000H,-18000H,-14000H
YVL .LONG 0,-16000H,-14000H,0,14000H,16000H,14000H,0,-14000H
;812
;7 3
;654
LAYIT
;A8=MINE LAYER
MOVE *A13(DIR),A10
MOVE *A8(OXVAL),A0,L
MOVE *A8(OYVAL),A1,L
SLL 5,A10
ADDI MYX,A10
MOVE *A10,A10,L
ADD A10,A1
SLL 16,A10
ADD A10,A0
;A0 & A1 ARE SET UP
MOVI M1,A2 ;DOES NOT MATTER
MOVI 69,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSNEUT|TYPMINE,A5
CLR A6
CLR A7
PUSH A8
CALLA BEGINOBJ2
CLR A0
MOVE A0,*A8(OPLINK),L
;PUT THIS IMG PNTR INTO A RAM LIST FOR THIS MINE LAYER
MOVE *A13(MRAM),A0,L
MOVE A8,*A0+,L
CLR A1
MOVE A1,*A0,L ;ZERO NEXT ENTRY
MOVE A0,*A13(MRAM),L
PULL A8
RETS
MYX .LONG 0,[6,10H],0,0,[12H,18H],0,0,[10H,0FH],0,0,[10H,18H],0,0
; 1
; 12 2
; 11 3
; 10 4 ;MINE LAYER 12 ANGLES
; 9 5
; 8 6
; 7
SETUP_TNK:
;UPDATE WAVE RAM CNT FOR TANKS ON THIS WAVE
;SET LEVEL FOR THIS TANK
;
; UPDATE TNK COUNT
;
MOVE @LYR_CNT,A0
INC A0
MOVE A0,@LYR_CNT
MOVI TANK,A2
CALLA GET_WVADDR
MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL
MOVE A1,*A13(LEVEL),W
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS TANK
DEC A1
MOVE A1,*A0(16),W
JRNZ BZ
;END OF THIS WAVES TANK CNT
MOVK 1,A1
MOVE A1,@TNK_DN
BZ
RETS
ANTENNA
;A8=MINE LAYER UNDER ANTENNA
;A10=MINE LAYER PROCESS UNDER ME
;TURN ON AN ANTENNA IMAGE OVER MINE LAYER
;SIT ON TOP OF TANK
;ADJUST FOR SPINNING MINE LAYING TANK!
MOVE A8,*A13(PDATA),L ;TANK OBJECT PNTR
CALLA GETANIXY
CLR A6
CLR A7
MOVE A2,A1
MOVE A3,A0
MOVI 160,A3 ;133
MOVI DMAWNZ|M_NOCOLL,A4
MOVI CLSNEUT,A5
MOVI ANT,A2 ;ANTENNA IMG
CALLA BEGINOBJ2
MOVE A8,*A10(KPANTOBJ),L ;STORE IN MINE LAYER PROC FOR KILLING
MOVE *A8(OPAL),A0,L
ANDI 0FFFFH,A0
MOVE A0,*A8(OPAL),L
ANTTOP SLEEPK 1
CALLR SIT
JRUC ANTTOP
; 1
; 12 2
; 11 3
; 10 4 ;MINE LAYER 12 ANGLES
; 9 5
; 8 6
; 7
SIT:
MOVE A8,A0
MOVE *A13(PDATA),A8,L ;MINE LAYER IMG PNTR
CALLA GETANIXY
;A2=Y,A3=X
MOVE *A10(DIR),A4 ;MINE LAYER DIR
SLL 5,A4
ADDI ADLST,A4
MOVE *A4,A4,L
ADD A4,A2
SLL 16,A4
ADD A4,A3
MOVE *A0(OFLAGS),A4,W
CALLA GANISAG ;ADJUSTS TORSO
MOVE A0,A8
RETS
;Y,X ADD IN FOR ANTENNA AT DIFFERENT ANGLES
ADLST .LONG 0,[-26,2],[-27,-8],[-29,-8],[-31,-2],[-30,-2],[-30,0]
.LONG [-28,-6],[-30,-4],[-30,-2],[-32,-2],[-29,4],[-29,-2]
WAY:
;SPIN LEFT OR RIGHT
;A1=SEEK DIR
;A0=DIR IMAGE IS FACING NOW
; 1
; 12 2
; 11 3
; 10 4 ;MINE LAYER 12 ANGLES
; 9 5
; 8 6
; 7
;812
;7 3 ;NORMAL GRUNT
;654
; 01
; 16 02
; 15 03
; 14 04
; 13 05 ;16 ANGLE TANK, ETC
; 12 06
; 11 07
; 10 08
; 09
SUB A0,A1
MOVE A1,A2
ABS A1
CMPI 7,A1 ;9;5
JRLT N0
NEG A2
N0: BTST 31,A2
JRZ IC
INHERE: DEC A0
JRP TDEC
MOVK 12,A0 ;16;8
TDEC CLRC ;MEANS DEC
RETS
IC: INC A0 ;ROTATE TOWARD PLAYER
CMPI 13,A0 ;17;9
JRNE T1
MOVK 1,A0
T1: SETC ;MEANS INC
RETS
GET_RUN:
;GET FRANIM BASE ADDRESS FOR THIS TANKS DIRECTION
; 1
; 12 2
; 11 3
; 10 4
; 9 5
; 8 6
; 7
MOVE *A13(DIR),A4
DEC A4
SLL 5,A4 ;*32 FOR LONG WORD LOOKUP TABLE
ADDI WALK_LIST,A4 ;CALCULATE OFFSET IN TABLE
MOVE *A4,A9,L ;MOVE TABLE VALUE INTO A9
;NEW ANIMATION SCRIPT
MOVE *A13(CFLAGS),A0
ANDI 0FFFEH,A0 ;
MOVE A0,*A13(CFLAGS) ;ZERO STANDING/SPIN FLAG
RETS
; 1
; 12 2
; 11 3
; 10 4
; 9 5
; 8 6
; 7
SPINFRMS:
.LONG MTNK12,MTNK11,MTNK10,MTNK9,MTNK8,MTNK7,MTNK6
.LONG MTNK7,MTNK8,MTNK9,MTNK10,MTNK11
TK_SPINFLGS:
.WORD DMAWNZ,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH
.WORD DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ
.WORD DMAWNZ
.WORD DMAWNZ,DMAWNZ,DMAWNZ
.WORD DMAWNZ
GET_STAND:
;ANI ONTO SCREEN THIS TANKS STANDING POSITION
MOVE *A13(DIR),A0 ;CURRENT DIR TANK IS FACING
DEC A0
ANDI 0FH,A0
MOVE A0,A2
SLL 5,A0
ADDI SPINFRMS,A0
MOVE *A0,A1,L ;NEW OIMG
SLL 4,A2
ADDI TK_SPINFLGS,A2
MOVE *A2,A4,W ;NEW OFLAGS
CALLA ANI
RETS
INTOL .LONG 0,60H,0C0H,120H,180H,1E0H,240H,2A0H
INIT_TNK:
;TURN ON TANK AT ONE OF THE 8 LOCATIONS HULKS CAN GENERATE FROM
;SET HIS DIR ACCORDINGLY
CALLA RANDOM
ANDI 07H,A0
; MOVK 2,A0 ;0=UP,2=RGT,4=LFT,6=DWN
SLL 5,A0
ADDI INTOL,A0
MOVE *A0,A0,L
MOVE @ENEMY_RECT,A8,L
ADD A0,A8
ADDK 16,A8 ;SKIP TYPE OF RELEASE RECTANGLE
MOVE *A8+,A10,W ;DIRECTION
MOVE *A8+,A0,W
MOVE A0,B0
MOVE *A8+,A2
MOVE *A8+,A0
MOVE A0,B1
CALLA RANGRAND
MOVE A0,A9
MOVE A2,B0
MOVE *A8,A0
MOVE A0,B1
CALLA RANGRAND
SLL 16,A0
MOVY A0,A9
JINHR
;A8=CHOSEN RECTANGLE INFO
;A9=[Y,X] OF SPOT TO START FROM
;A10=DIRECTION
;8 1 2
;7 3
;6 5 4
;NEED
; 1
; 12 2
; 11 3
; 10 4
; 9 5
; 8 6
; 7
SLL 5,A10
MOVI XYOFST,A0
ADD A10,A0
MOVE *A0,A0,L
ADD A0,A9
MOVI NEWD,A0
ADD A10,A0
MOVE *A0,A0,L
MOVE A0,*A13(DIR)
MOVI TIMG,A0
ADD A10,A0
MOVE *A0,A2,L ;IMG TO START WITH
MOVI TFLP,A0
ADD A10,A0
MOVE *A0,A4,L ;IMG TO START WITH
MOVI 159,A3 ;158
MOVI CLSENMY|TYPLAYR,A5
CLR A6
CLR A7
CLR A1
MOVY A9,A1
SLL 16,A9
MOVE A9,A0
CALLA BEGINOBJ2
RETS
XYOFST .LONG 0,[0,25],0,[15,0],0,[0,25],0,[15,0],0
NEWD .LONG 0,1,1,4,4,7,7,10,10,10,10
TIMG .LONG 0,MTNK12,MTNK12,MTNK9,MTNK9,MTNK6,MTNK6,MTNK9,MTNK9,MTNK9
TFLP .LONG 0,DMAWNZ,DMAWNZ,DMAWNZ|M_FLIPH,DMAWNZ|M_FLIPH,DMAWNZ
.LONG DMAWNZ,DMAWNZ,DMAWNZ,DMAWNZ
; 1
; 12 2
; 11 3
; 10 4
; 9 5
; 8 6
; 7
WALK_LIST:
.LONG TNK01,0,0,TNK04,0,0,TNK07
.LONG 0,0,TNK10,0,0
;
;TANK ANIMATION TABLES
;
TNK01: ;GO UP
.LONG MTNK12
.WORD FLIPBITS|05,0
.LONG MTNK12B
.WORD 05
.LONG MTNK12
.WORD 05
.LONG MTNK12B
.WORD 05
.LONG MTNK12
.WORD 05
.LONG MTNK12B
.WORD 05
.LONG MTNK12
.WORD 05
.LONG MTNK12B
.WORD 05
.LONG MTNK12
.WORD 05
.LONG MTNK12B
.WORD 05
.LONG MTNK12
.WORD 05
.LONG MTNK12B
.WORD 05
.LONG 0
TNK04: ;GO RIGHT
.LONG MTNK9
.WORD FLIPBITS|05,(M_FLIPH)
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG 0
TNK07: ;GO DOWN
.LONG MTNK6
.WORD FLIPBITS|05,0
.LONG MTNK6B
.WORD 05
.LONG MTNK6
.WORD 05
.LONG MTNK6B
.WORD 05
.LONG MTNK6
.WORD 05
.LONG MTNK6B
.WORD 05
.LONG MTNK6
.WORD 05
.LONG MTNK6B
.WORD 05
.LONG MTNK6
.WORD 05
.LONG MTNK6B
.WORD 05
.LONG MTNK6
.WORD 05
.LONG MTNK6B
.WORD 05
.LONG 0
TNK10: ;GO LEFT
.LONG MTNK9
.WORD FLIPBITS|05,0
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG MTNK9
.WORD 05
.LONG MTNK9B
.WORD 05
.LONG 0
PATLST
; 1
; 12 2
; 11 3
; 10 4 ;MINE LAYER 12 ANGLES
; 9 5
; 8 6
; 7
;
.LONG 0,UPLST,0,0,RGTLST,0,0,DWNLST,0,0,LFTLST,0,0
;
UPLST .LONG UPL1,UPL2,UPL3,UPL4
RGTLST .LONG RGTL1,RGTL2,RGTL3,RGTL4
DWNLST .LONG DWNL1,DWNL2,DWNL3,DWNL4
LFTLST .LONG LFTL1,LFTL2,LFTL3,LFTL4
;INTO MYPATRN PDATA AREA VARIABLE
;DISTANCE,NEW DIR,DISTANCE,NEW DIR
;NEW DIR=0=TANK HAS FINISHED PATTERN (IS OFF SCRN), DIE OFF
UPL1 .WORD 60,4,30,7,12H,10,32H,1,30H,0,0,0
UPL2 .WORD 40,10,30,1,16H,4,60H,0,0,0
UPL3 .WORD 40,4,10,1,38H,0,0,0
UPL4 .WORD 30,10,1AH,1,30,4,30H,1,20H,0,0,0
;
RGTL1 .WORD 84H,0,0,0 ;GO RGT 100, DIE
RGTL2 .WORD 55H,7,38H,0,0,0
RGTL3 .WORD 30,1,12H,4,30H,7,12H,10,48H,0,0,0
RGTL4 .WORD 50H,1,30H,0,0,0
;
DWNL1 .WORD 03CH,4,1AH,10,40,7,10H,1,50H,0,0,0
DWNL2 .WORD 68H,0,0,0 ;GO DWN 100, DIE
DWNL3 .WORD 50,10,60,0,0,0
DWNL4 .WORD 38,4,45,7,30,10,40,7,10,1,40,10,40H,0,0,0
;
LFTL1 .WORD 84H,0,0,0 ;GO LFT 100, DIE
LFTL2 .WORD 60H,4,68H,0,0,0
LFTL3 .WORD 44H,1,2CH,0,0,0
LFTL4 .WORD 20H,7,20,10,40,1,48H,0,0,0
;
.DEF DO_HURRY,SEND_NEUT,SHORT_NOTE
.REF CNTDIG1,CNTDIG2,WARP_KIL,RD15FONT,WRLD,STRCNRMO,STRLNRMO
.REF PLYRPRCS,STRCNRM,SLOW_DWN
.BSS KEEP2,16
.BSS KEEP3,16
.BSS KEEP2L,16
.BSS KEEP3L,16
SHORT_NOTE
;WARPED OR TOOK SHORTCUT TO ORCUS!
SLEEP 90
MOVE @PLYROBJS,A9,L
JRNZ WS12
MOVE @PLYROBJS+32,A9,L
WS12
;SET OFF SMART BOMB
;A9=PLYR IMG PTR WHO GOT ME
CREATE0 SBOMB
MOVI P1DATA,A2
move @PLYRPRCS,A0,L
JRZ SHADD1
MOVI >50000,A1 ;100,000 PNTS FOR SHORTCUT
MOVE @STATUS,A4
CMPI 3,A4
JRNZ SXZ
MOVI >25000,A1 ;100,000 PNTS FOR SHORTCUT
SXZ CALLA SCRADD2 ;
SHADD1 MOVI P2DATA,A2
move @PLYRPRCS+32,A0,L
JRZ SHADD2
MOVI >50000,A1
MOVE @STATUS,A4
CMPI 3,A4
JRNZ SXZ2
MOVI >25000,A1 ;100,000 PNTS FOR SHORTCUT
SXZ2 CALLA SCRADD2 ;
SHADD2
move @PLYRPRCS,A0,L
JRZ SHADD3
MOVE @P1DATA+THSTGS,A0
ADDI 100,A0
MOVE A0,@P1DATA+THSTGS
MOVE @P1DATA+CASHCNT,A0
ADDI 100,A0
MOVE A0,@P1DATA+CASHCNT
MOVE @P1DATA+TFLAGS,A0
ADDI 100,A0
MOVE A0,@P1DATA+TFLAGS
MOVK 5,A1
MOVE @STATUS,A2
SUBK 3,A2
JRZ SHD2
MOVK 10,A1
SHD2
MOVE @P1DATA+TKEYS,A0
ADD A1,A0
MOVE A0,@P1DATA+TKEYS
SHADD3
move @PLYRPRCS+32,A0,L
JRZ SHADD4
MOVE @P2DATA+THSTGS,A0
ADDI 100,A0
MOVE A0,@P2DATA+THSTGS
MOVE @P2DATA+CASHCNT,A0
ADDI 100,A0
MOVE A0,@P2DATA+CASHCNT
MOVE @P2DATA+TFLAGS,A0
ADDI 100,A0
MOVE A0,@P2DATA+TFLAGS
MOVK 5,A1
MOVE @STATUS,A2
SUBK 3,A2
JRZ SHD2A
MOVK 10,A1
SHD2A
MOVE @P2DATA+TKEYS,A0
ADD A1,A0
MOVE A0,@P2DATA+TKEYS
SHADD4
JSRP SHKIN
MOVI 3E3EH,A6
MOVI [81,0200],A9 ;SCRN Y/X
MOVI RD15FONT,A11 ;FONT TABLE
CLR A0
MOVE A0,@WRLD
MOVK 2,A10 ;Y,X SPACING BETWEEN CHARCTERS
CLR A0
MOVI CUT0,A8
JSRP STRCNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [115,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT1,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [135,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT2,A8
JSRP STRLNRMO
JSRP SHKIN
MOVI [135,314],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT6,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
JSRP SHKIN
MOVI [155,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT3,A8
JSRP STRLNRMO
JSRP SHKIN
MOVI [155,314],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT6,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [175,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT4,A8
JSRP STRLNRMO
JSRP SHKIN
MOVI [175,314],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT6,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [195,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT5,A8
JSRP STRLNRMO
JSRP SHKIN
MOVI [195,328],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI CUT7,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEP 2*60 ;+40
.REF FLYERS
CREATE0 FLYERS
SLEEP 5*60
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA KILOBJ
MOVI COLRPID,A0
CALLA KIL1C
RETP
SHKIN SLEEPK 1
MOVE @SHK_ON,A0
JRNZ SHKIN
RETP
.DEF WEASEL_NOTE
;TOOK WEASEL WARP
WEASEL_NOTE
SLEEP 90
MOVE @PLYROBJS,A9,L
JRNZ WS1
MOVE @PLYROBJS+32,A9,L
WS1
;SET OFF SMART BOMB
;A9=PLYR IMG PTR WHO GOT ME
CREATE0 SBOMB
MOVI P1DATA,A2
move @PLYRPRCS,A0,L
JRZ WSHADD1
MOVI >40000,A1 ;100,000 PNTS FOR SHORTCUT
MOVE @STATUS,A4
CMPI 3,A4
JRNZ WSXZ
MOVI >20000,A1 ;100,000 PNTS FOR SHORTCUT
WSXZ CALLA SCRADD2 ;
WSHADD1 MOVI P2DATA,A2
move @PLYRPRCS+32,A0,L
JRZ WSHADD2
MOVI >40000,A1
MOVE @STATUS,A4
CMPI 3,A4
JRNZ WSXZ2
MOVI >20000,A1 ;100,000 PNTS FOR SHORTCUT
WSXZ2 CALLA SCRADD2 ;
WSHADD2
move @PLYRPRCS,A0,L
JRZ WSHADD3
MOVE @P1DATA+THSTGS,A0
ADDI 50,A0
MOVE A0,@P1DATA+THSTGS
MOVE @P1DATA+CASHCNT,A0
ADDI 50,A0
MOVE A0,@P1DATA+CASHCNT
MOVE @P1DATA+TFLAGS,A0
ADDI 50,A0
MOVE A0,@P1DATA+TFLAGS
MOVK 5,A1
MOVE @STATUS,A2
SUBK 3,A2
JRZ WSHD2
MOVK 10,A1
WSHD2
MOVE @P1DATA+TKEYS,A0
ADD A1,A0
MOVE A0,@P1DATA+TKEYS
WSHADD3
move @PLYRPRCS+32,A0,L
JRZ WSHADD4
MOVE @P2DATA+THSTGS,A0
ADDI 50,A0
MOVE A0,@P2DATA+THSTGS
MOVE @P2DATA+CASHCNT,A0
ADDI 50,A0
MOVE A0,@P2DATA+CASHCNT
MOVE @P2DATA+TFLAGS,A0
ADDI 50,A0
MOVE A0,@P2DATA+TFLAGS
MOVK 5,A1
MOVE @STATUS,A2
SUBK 3,A2
JRZ WSHD2A
MOVK 10,A1
WSHD2A
MOVE @P2DATA+TKEYS,A0
ADD A1,A0
MOVE A0,@P2DATA+TKEYS
WSHADD4
JSRP SHKIN
MOVI 3E3EH,A6
MOVI [81,0200],A9 ;SCRN Y/X
MOVI RD15FONT,A11 ;FONT TABLE
CLR A0
MOVE A0,@WRLD
MOVK 2,A10 ;Y,X SPACING BETWEEN CHARCTERS
CLR A0
MOVI WCUT0,A8
JSRP STRCNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [115,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT1,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [135,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT2,A8
JSRP STRLNRMO
JSRP SHKIN
MOVI [135,315+8],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT6,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [155,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT3,A8
JSRP STRLNRMO
JSRP SHKIN
MOVI [155,315+8],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT6,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [175,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT4,A8
JSRP STRLNRMO
JSRP SHKIN
MOVI [175,315+8],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT6,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEPK 10
;
JSRP SHKIN
MOVI [195,061],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT5,A8
JSRP STRLNRMO
JSRP SHKIN
MOVI [195,323+6],A9 ;SCRN Y/X
CLR A0
MOVI 3E3EH,A6
MOVI WCUT7,A8
JSRP STRLNRMO
MOVI JMPSND,A0
CALLA ONESND
SLEEP 2*60 ;+40
.REF FLYERS
CREATE0 FLYERS
SLEEP 5*60
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA KILOBJ
MOVI COLRPID,A0
CALLA KIL1C
RETP
DO_HURRY
SLEEP 20*60
DOH1 SLEEPK 2
MOVE @SHK_ON,A0
JRNZ DOH1
MOVE @WORLDTLY,A2,L
CMPI [127EH,0],A2
JANZ SUCIDE
MOVE @HALT,A0
JRNZ DO_HURRY
CALLR SEND_NEUT
JRUC DOH1
SEND_NEUT
MOVE @CNTDIG1,A0
MOVE @CNTDIG2,A1
OR A0,A1
MOVE A1,A1
JRNZ NODLY2
MOVE @SLOW_DWN,A0
INC A0
MOVE A0,@SLOW_DWN
CMPI 190,A0
JRNZ SNW1
CREATE FUTUREPID,HURRY
RETS
SNW1 CMPI 280,A0
JRLO PAUSE2X2
;PLAYER HAS DILLY DALLIED, SEND A BOMB DOWN AT HIM
MOVI yousuck,A0
CALLA ONESND
MOVE @PLYRPRCS,A0,L
JRZ NODLY
MOVE *A0(DEAD),A7
JRNZ NODLY
MOVE *A0(DELYDET),A7
JRNZ NODLY
MOVE A0,A7
CLR A2
CALLA WARP_KIL
NODLY
MOVE @PLYRPRCS+32,A0,L
JRZ NODLY2
MOVE *A0(DEAD),A7
JRNZ NODLY2
MOVE *A0(DELYDET),A7
JRNZ NODLY2
MOVE A0,A7
CLR A2
CALLA WARP_KIL
NODLY2
CLR A0
MOVE A0,@SLOW_DWN
PAUSE2X2
RETS
SLD
CLR A0
MOVE A0,@SLOW_DWN
DIE
.DEF LEAVE
LEAVE
;LEAVE THIS AREA
MOVE @HALT,A0
JANZ SUCIDE
MOVK 5,A0
MOVE A0,@KEEP3L
MOVI TXTSND1,A0
CALLA ONESND
LTOP0 MOVK 19,A0
MOVE A0,@KEEP2L
MOVI JMPSND,A0
CALLA ONESND
LTOP
MOVE @HALT,A0
JANZ SUCIDE
MOVI 0C0CH,A6
MOVI [69,0200],A9 ;SCRN Y/X
MOVI RD15FONT,A11 ;FONT TABLE
CLR A0
MOVE A0,@WRLD
MOVK 2,A10 ;Y,X SPACING BETWEEN CHARCTERS
CLR A0
MOVI EXITAREA,A8
JSRP STRCNRM
SLEEPK 1
MOVE @KEEP2L,A0
DEC A0
MOVE A0,@KEEP2L
JRNN LTOP
SLEEPK 10
MOVE @KEEP3L,A0
DEC A0
MOVE A0,@KEEP3L
JRNN LTOP0
MOVI TXTSND2,A0
CALLA ONESND
DIE
HURRY
MOVE @HALT,A0
JRNZ SLD
MOVK 7,A0
MOVE A0,@KEEP3
MOVI TXTSND1,A0
CALLA ONESND
TOP0 MOVK 19,A0
MOVE A0,@KEEP2
MOVI JMPSND,A0
CALLA ONESND
TOP
MOVE @HALT,A0
JRNZ SLD
MOVI 0C0CH,A6
MOVI [80,0200],A9 ;SCRN Y/X
MOVI RD15FONT,A11 ;FONT TABLE
CLR A0
MOVE A0,@WRLD
MOVK 2,A10 ;Y,X SPACING BETWEEN CHARCTERS
CLR A0
MOVI HURY,A8
JSRP STRCNRM
SLEEPK 1
MOVE @KEEP2,A0
DEC A0
MOVE A0,@KEEP2
JRNN TOP
SLEEPK 10
MOVE @KEEP3,A0
DEC A0
MOVE A0,@KEEP3
JRNN TOP0
MOVI TXTSND2,A0
CALLA ONESND
DIE
TXTSND1 .WORD >F3F7,>8,>80AE,0
TXTSND2 .WORD >F3F7,>8,>80B1,0
JMPSND .WORD >F48E,>18,>813D,0 ;FIEND JUMP SND
yousuck .word >f9a0,10,>80c5,0 ;You suck at this game!
HURY .BYTE "HURRY UP!",0
EXITAREA .BYTE "EXIT THIS AREA!",0
CUT0 .BYTE "ORCUS WARP BONUS",0
CUT1 .BYTE "POINTS AWARDED 50,000",0
CUT2 .BYTE "HOSTAGES",0
CUT3 .BYTE "FLAGS",0
CUT4 .BYTE "GEMS",0
CUT5 .BYTE "KEYS",0
CUT6 .BYTE "100",0
CUT7 .BYTE "10",0
WCUT0 .BYTE "WEASEL WARP BONUS",0
WCUT1 .BYTE "POINTS AWARDED 40,000",0
WCUT2 .BYTE "HOSTAGES",0
WCUT3 .BYTE "FLAGS",0
WCUT4 .BYTE "GEMS",0
WCUT5 .BYTE "KEYS",0
WCUT6 .BYTE "50",0
WCUT7 .BYTE "10",0
HSURE1 .BYTE "BOMBS SHOULD BE",0
HSURE2 .BYTE "USED TO BLOW UP",0
HSURE3 .BYTE "BIG STUFF LIKE",0
HSURE4 .BYTE "TRUCKS AND TANKS.",0
HSURE5 .BYTE "BOMBS ALSO BLOW",0
HSURE6 .BYTE "UP LAND MINES AND",0
HSURE7 .BYTE "BARRELS. YOU ALSO",0
HSURE8 .BYTE "BECOME INVULNERABLE",0
HSURE9 .BYTE "FOR 1 SECOND AFTER",0
HSURE10 .BYTE "DROPPING A BOMB.",0
KSURE1 .BYTE "COLLECTING 220 KEYS",0
KSURE1B .BYTE "COLLECTING 200 KEYS",0
KSURE2 .BYTE "ALLOWS ENTRY INTO",0
KSURE3 .BYTE "THE PLEASURE DOMES",0
KSURE4 .BYTE "AT THE END OF THE",0
KSURE5 .BYTE "GAME. KEYS ALSO",0
KSURE6 .BYTE "OPEN UP SECRET PATHS",0
KSURE7 .BYTE "HIDDEN IN THE GAME!",0
WSURE1 .BYTE "INSTANT WARPS APPEAR",0
WSURE2 .BYTE "THROUGHOUT THE GAME.",0
WSURE3 .BYTE "THEY WILL WARP YOU",0
WSURE4 .BYTE "TO A NEW AREA AND A",0
WSURE5 .BYTE "FREE MAN. AFTER YOU",0
WSURE6 .BYTE "CLEAR THAT AREA, YOU",0
WSURE7 .BYTE "WILL WARP RIGHT BACK",0
WSURE8 .BYTE "TO WHERE YOU STARTED.",0
SURE1 .BYTE "PASSWORDS ARE FOUND",0
SURE2 .BYTE "THROUGHOUT THE GAME.",0
SURE3 .BYTE "DO YOU HAVE ONE?",0
SURE4 .BYTE "NO",0
SURE5 .BYTE "YES",0
.EVEN
BRGHT .EQU >0C0C ;GREEN IN SCOREPAL
COLORS .EQU >2525 ;WHITE IN SCOREPAL
COLORA .EQU >3E3E ;COLOR CYCLE IN SCOREPAL
SCRNTOP .EQU 100
.REF OWINDOW,CWINDOW,RD7FONT,CYCSPECT,OBJPTR,BEEP1,P1CTRL,P2CTRL
.REF sleep_var,INEXP
.DEF R_U_SURE,BMB_HELP,KEY_HELP
BMB_HELP2
SLEEP 180
BMB_HELP
MOVE @WORLDTLY+16,A0
CMPI 11A0H-60,A0
JALT SUCIDE
SLEEPK 1
MOVI BMBPID,A0
CLR A1
NOT A1
CALLA EXISTP
* Z BIT SET = NO MATCH, A0 = 0
JRZ BMB_HELP
MOVE @WORLDTLY+16,A0
CMPI 11A0H-60,A0
JALT SUCIDE
MOVE @PLYRPRCS,A0,L
JRZ BMH1
MOVE *A0(DEAD),A0
JRNZ BMB_HELP2
BMH1 MOVE @PLYRPRCS+32,A0,L
JRZ BMH2
MOVE *A0(DEAD),A0
JRNZ BMB_HELP2
BMH2 SLEEPK 1
MOVE @SHK_ON,A0
JRNZ BMH2
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA EXISTOBJ
JRNZ BMH2
MOVE @WFLG,A0
JRNZ BMH2
SLEEPK 10
XBMH2 SLEEPK 1
MOVE @SHK_ON,A0
JRNZ XBMH2
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA EXISTOBJ
JRNZ XBMH2
MOVE @WFLG,A0
JRNZ XBMH2
MOVI HELPPID,A0
CLR A1
NOT A1
CALLA EXISTP
JRNZ XBMH2
MOVI HELPPID,A0
MOVE A0,*A13(PROCID)
.REF SLIDEIN
MOVI SLIDEIN,A0
CALLA ONESND
MOVK 1,A0
MOVE A0,@HALT
MOVI [41+SCRNTOP,200],A10
MOVI >00860093,A8
JSRP OWINDOW ;OPEN THE WINDOW
MOVE A8,@OBJPTR,L
MOVI [0100-18,0200],A9 ;SCRN Y/X
MOVI HSURE1,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
MOVI RD7FONT,A11 ;BIG OLD LETTERS
MOVI [0,1],A10 ;ONE SPACE BETWEEN LETTERS
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0112-18,0200],A9 ;SCRN Y/X
MOVI HSURE2,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0124-18,0200],A9 ;SCRN Y/X
MOVI HSURE3,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0136-18,0200],A9 ;SCRN Y/X
MOVI HSURE4,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6 ;BRIGHT COLOR
JSRP STRCNRMO
MOVI [0148-18,0200],A9 ;SCRN Y/X
MOVI HSURE5,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0160-18,0200],A9 ;SCRN Y/X
MOVI HSURE6,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0172-18,0200],A9 ;SCRN Y/X
MOVI HSURE7,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0184-18,0200],A9 ;SCRN Y/X
MOVI HSURE8,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0196-18,0200],A9 ;SCRN Y/X
MOVI HSURE9,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0208-18,0200],A9 ;SCRN Y/X
MOVI HSURE10,A8
BMBOUT
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI 60*9+30,a0
CALLA sleep_var
* TIME IS UP!
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA KILOBJ
MOVI SLIDEIN,A0
CALLA ONESND
MOVE @OBJPTR,A8,L
JSRP CWINDOW
CLR A0
MOVE A0,@HALT
DIE
WARP_HELP
.DEF WARP_HELP
SLEEP 270
WBMH2 SLEEPK 1
MOVE @SHK_ON,A0
JRNZ WBMH2
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA EXISTOBJ
JRNZ WBMH2
MOVE @WFLG,A0
JRNZ WBMH2
SLEEPK 10
WKBMH2 SLEEPK 1
MOVE @SHK_ON,A0
JRNZ WKBMH2
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA EXISTOBJ
JRNZ WKBMH2
MOVE @WFLG,A0
JRNZ WBMH2
MOVI HELPPID,A0
CLR A1
NOT A1
CALLA EXISTP
JRNZ WBMH2
MOVI HELPPID,A0
MOVE A0,*A13(PROCID)
MOVI SLIDEIN,A0
CALLA ONESND
MOVK 1,A0
MOVE A0,@HALT
MOVI [41+SCRNTOP,200],A10
MOVI >0070009D,A8
JSRP OWINDOW ;OPEN THE WINDOW
MOVE A8,@OBJPTR,L
MOVI [0100-6,0200],A9 ;SCRN Y/X
MOVI WSURE1,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
MOVI RD7FONT,A11 ;BIG OLD LETTERS
MOVI [0,1],A10 ;ONE SPACE BETWEEN LETTERS
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0112-6,0200],A9 ;SCRN Y/X
MOVI WSURE2,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0124-6,0200],A9 ;SCRN Y/X
MOVI WSURE3,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0136-6,0200],A9 ;SCRN Y/X
MOVI WSURE4,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6 ;BRIGHT COLOR
JSRP STRCNRMO
MOVI [0148-6,0200],A9 ;SCRN Y/X
MOVI WSURE5,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0160-6,0200],A9 ;SCRN Y/X
MOVI WSURE6,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0172-6,0200],A9 ;SCRN Y/X
MOVI WSURE7,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0184-6,0200],A9 ;SCRN Y/X
MOVI WSURE8,A8
JRUC BMBOUT
KEY_HELP
SLEEPK 2
MOVE @P1DATA+TKEYS,A0
MOVE @P2DATA+TKEYS,A1
OR A0,A1
JRZ KEY_HELP
CMPI 4,A1
JAGE SUCIDE
KBMH2 SLEEPK 1
MOVE @SHK_ON,A0
JRNZ KBMH2
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA EXISTOBJ
JRNZ KBMH2
MOVE @WFLG,A0
JRNZ KBMH2
SLEEPK 10
XKBMH2 SLEEPK 1
MOVE @SHK_ON,A0
JRNZ XKBMH2
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA EXISTOBJ
JRNZ XKBMH2
MOVE @WFLG,A0
JRNZ KBMH2
MOVI HELPPID,A0
CLR A1
NOT A1
CALLA EXISTP
JRNZ KBMH2
MOVI HELPPID,A0
MOVE A0,*A13(PROCID)
MOVI SLIDEIN,A0
CALLA ONESND
MOVK 1,A0
MOVE A0,@HALT
MOVI [41+SCRNTOP,200],A10
MOVI >00660093,A8
JSRP OWINDOW ;OPEN THE WINDOW
MOVE A8,@OBJPTR,L
MOVI [0100,0200],A9 ;SCRN Y/X
MOVI KSURE1,A8
move @SWITCH+>30,a7
btst 7,a7
jrnz abl2500 ;BR=220 KEYS
MOVI KSURE1B,A8
abl2500
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
MOVI RD7FONT,A11 ;BIG OLD LETTERS
MOVI [0,1],A10 ;ONE SPACE BETWEEN LETTERS
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0112,0200],A9 ;SCRN Y/X
MOVI KSURE2,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0124,0200],A9 ;SCRN Y/X
MOVI KSURE3,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0136,0200],A9 ;SCRN Y/X
MOVI KSURE4,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6 ;BRIGHT COLOR
JSRP STRCNRMO
MOVI [0148,0200],A9 ;SCRN Y/X
MOVI KSURE5,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0160,0200],A9 ;SCRN Y/X
MOVI KSURE6,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
MOVI [0172,0200],A9 ;SCRN Y/X
MOVI KSURE7,A8
JRUC BMBOUT
R_U_SURE
MOVE A9,@TEMP,L
MOVI COLRPID,A0
CALLA KIL1C
CREATE COLRPID,CYCSPECT ;START COLOR CYCLE PROCESS
MOVI [41+SCRNTOP,200],A10
SLEEPK 32
MOVK 1,A0
MOVE A0,@HALT
MOVI SLIDEIN,A0
CALLA ONESND
MOVI >00660093,A8
JSRP OWINDOW ;OPEN THE WINDOW
MOVE A8,@OBJPTR,L
MOVI [097,0200],A9 ;SCRN Y/X
MOVI SURE1,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORA,A6 ;BRIGHT COLOR
MOVI RD7FONT,A11 ;BIG OLD LETTERS
MOVI [0,1],A10 ;ONE SPACE BETWEEN LETTERS
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0110-3,0200],A9 ;SCRN Y/X
MOVI SURE2,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORA,A6 ;BRIGHT COLOR
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0125-3,0200],A9 ;SCRN Y/X
MOVI SURE3,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORA,A6 ;BRIGHT COLOR
JSRP STRCNRMO ;OUTPUT "PRESS START" OR "INSERT COIN"
MOVI [0141-1,0220],A9 ;SCRN Y/X
MOVI SURE4,A8
MOVI RD15FONT,A11 ;BIG OLD LETTERS
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6 ;BRIGHT COLOR
JSRP STRCNRMO
MOVI [0165,0220],A9 ;SCRN Y/X
MOVI SURE5,A8
MOVK 1,A0
MOVE A0,@LOWZ
CLR A0
MOVI COLORS,A6
JSRP STRCNRMO
* TIME IS UP!
MOVI [160,0],A0
MOVI [136-3,0],A1
MOVI RGTARRW,A2
MOVI >7FFE,A3
MOVI DMAWNZ|M_NOCOLL,A4
MOVI CLSNEUT|TYPTEXT|SUBTXT,A5
CLR A6
CLR A7
CALLA BEGINOBJ
MOVE @TEMP,A9,L
MOVI BEEP1,A0
CALLA ONESND
MOVI 10*60,A10
CLR A11
ARWTOP SLEEPK 1
DEC A10
JRN SELECT
CALLR GETJ
JRNZ SELECT
ANDI 0FH,A2
JRNZ A_MV
; STICK IS NOT BEING TOUCHED
JRUC ARWTOP
GETJ MOVE *A9(OPLINK),A0,L
MOVE *A0(PNUM),A0
CMPI 1,A0
JRNZ GETJ2
MOVE @SWITCH,A2 ;MOVE PLAYER SWITCHES TO A5 (32 BIT PORT)
NOT A2
move @SWITCH+16,a1 ;Chk for impatience
not a1
BTST 2,A1
RETS
GETJ2 MOVE @SWITCH,A2 ;MOVE PLAYER SWITCHES TO A5 (32 BIT PORT)
NOT A2
SRL 8,A2
move @SWITCH+16,a1 ;Chk for impatience
not a1
BTST 5,A1
RETS
A_MV:
BTST BMPDOWN,A2
JRZ PLYR_UP
;MOVE DOWN TO YES
MOVE A11,A11
JRNZ ARWTOP
AMC MOVE *A8(OYPOS),A1
MOVE @WORLDTLY+16,A0
SUB A0,A1
CMPI 133,A1
JRZ AMC1
MOVI 133,A1
ADD A0,A1
JRUC AMC2
AMC1 MOVI 133+18H,A1
ADD A0,A1
AMC2 MOVE A1,*A8(OYPOS)
XORI 1,A11
MOVI BEEP1,A0
CALLA ONESND
JRUC ARWTOP
PLYR_UP:
BTST BMPUP,A2
JRZ ARWTOP
MOVE A11,A11
JRZ ARWTOP
;MOVE UP TO NO
JRUC AMC
SELECT
MOVI CLSNEUT|TYPTEXT|SUBTXT,A0
CLR A1
NOT A1
CALLA KILOBJ
MOVI SLIDEIN,A0
CALLA ONESND
MOVE @OBJPTR,A8,L
MOVE A11,@TEMP
MOVE A9,-*A12,L
JSRP CWINDOW
MOVE *A12+,A9,L
MOVE @TEMP,A11
CLR A0
MOVE A0,@HALT
RETP
.END