smashtv/WLMAN.ASM

452 lines
7.6 KiB
NASM
Raw Normal View History

2021-04-06 15:09:56 -07:00
.FILE 'WLMAN.ASM'
.TITLE 'ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: JAN 6, 1989
; MODIFIED: !
; SOFTWARE: MARK TURMELL
;
; COPYRIGHT (C) 1989 WILLIAMS ELECTRONICS GAMES, INC.
;
;
; GET THE SYSTEM STUFF
.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 "ROBO.EQU"
;
;SOUNDS
.REF EXP3HI
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF GET_STANDT2,WAY
.REF FRANIM,GAMSTATE,EHALT,BOOM2,GETFPAL,GET_WVADDR,BEGINOBJ2
.REF WAVEYX,PCNT,RANGRAND,PLYROBJS,HALT
.REF XYSKOBJ,GETHDR,CVRT,ABALL,RANDPER,DOBLO,P1DATA,P2DATA
.REF TSO_EXP2,FLASHME,GETUGH
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF KILL_WLMN,ONSCRN_WLMN,RECOIL,DIOFF
;
;UNINITIALIZED RAM DEFINITIONS
;
;
;EQUATES/STRUCURES FOR THIS FILE TO FOLLOW
;
HITWLM .EQU 35 ;61
;
;WLMAN DATA STRUCTURE
;
SPDLY .EQU PDATA ;UHB
WAY01 .EQU PDATA+8 ;UHB
TDIR .EQU PDATA+16 ;UHW
TSK_DIR .EQU PDATA+32 ;UHW
MODE .EQU PDATA+48 ;UHB
FIRED .EQU PDATA+56 ;UHB
SLOW .EQU PDATA+64 ;UHB
ABSRB .EQU PDATA+72 ;UHB
LEVEL .EQU PDATA+80 ;DIFFICULTY LEVEL FOR SPEEDS ETC.
;
;
.TEXT
;
WX .LONG [117,0],[285,0]
WY .LONG [-25,0],[-25,0]
;
ONSCRN_WLMN:
;A2=# OF ORBS TO CREATE ON SCREEN AT START OF WAVE
MOVE A2,A10
OH1 PUSH A10 ;CREATE A BUNCH OF THEM
CREATE WLMNPID,OWLMN
PULL A10
DSJNE A10,OH1
RETS
;
OWLMN:
;A10=1 OR 2
;A0 & A1 ARE SET UP
;ADD IN OFFSETS FOR THIS PARTICULAR ARENA
DEC A10
SLL 5,A10
MOVI WX,A0
ADD A10,A0
MOVE *A0,A0,L
MOVI WY,A1
ADD A10,A1
MOVE *A1,A1,L
;
MOVE @GAMSTATE,A2
CMPI INAMODE,A2
JREQ DMD
MOVE @WAVEYX,A2,L
; A2=PACKED OFFSETS
MOVX A2,A3
SLL 16,A3
ADD A3,A0 ;ADJUSTED A0 XVAL!
ANDI 0FFFF0000H,A2
ADD A2,A1 ;ADJUSTED A1 YVAL!
;
DMD
;A0,A1 ARE SETUP.
CALLR IH1 ;INIT WLMN (BEGINOBJ)
CALLA BEGINOBJ2 ;STUFF OBJ
;CHANGE TO PURPLE PALETTE
MOVI PURPTK,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
ANDI 0FFFFH,A0
MOVE A0,*A8(OPAL),L ;STORE THE NEW PALETTE
CALLR SETUP_WLMN ;INC WLMN_CNT
CLR A0
MOVB A0,*A13(MODE)
MOVB A0,*A13(SPDLY)
MOVB A0,*A13(FIRED)
MOVB A0,*A13(ABSRB)
MOVK 9,A0
MOVE A0,*A13(TDIR)
;
; LOOP TOP FOR WLMNS
;
LUP_TOP:
;TOP OF WLMN LOGIC
MOVE @HALT,A0
JRNZ WZ
MOVE @EHALT,A0
JRZ MV ;BR=HALT ALL WLMNS!!
;PLAYER IS WALKING INTO ARENA SO DO NOT ALLOW MOVEMENT!
WZ SLEEP 2
JRUC LUP_TOP
MV:
;SEE IF ANY PLAYER IS WITHIN X DISTANCE.
;IF SO, SEEK TO MOST APPROPRIATE ANGLE AND X% OF TIME FIRE FLAMES AT PLAYER.
;STOP/SLEEP
TLP_TOP:
MOVB *A13(MODE),A1
JREQ SIT
CMPI 1,A1
JREQ SPN
CMPI 2,A1
JREQ SHT
; JRUC $
SIT MOVI 120,B0
MOVI 250,B1
CALLA RANGRAND
CMPI 150,A0
JRNC SPP
;NO SITTING
MOVI 2,A0
SPP
CALLA PRCSLP
MOVK 1,B0
MOVK 3,B1
CALLA RANGRAND
DEC A0
MOVB A0,*A13(MODE)
CMPI 1,A0
JREQ R1
CMPI 2,A0
JRNE TAG
;SHOOT
MOVK 2,A0
MOVB A0,*A13(FIRED)
JRUC TAG
R1
;WILL SPIN TO PLAYER
MOVB @PCNT,A3
INC A3
MOVB A3,@PCNT
ANDI 01,A3
SLL 5,A3
MOVI PLYROBJS,A2
ADD A3,A2
MOVE *A2,A0,L ;GET FIRST ENTRY
JRNZ PX
XORI 32,A3
ADDI PLYROBJS,A3
MOVE *A3,A0,L
PX CALLA XYSKOBJ
MOVE A5,A1
MOVE A6,A2
CALLA GETHDR
SLL 3,A0
ADDI CVRT,A0
MOVB *A0,A0
;DIR TO FACE IN A0
;A0=DIR TO SEEK TO FACE PLAYER
MOVE *A13(TDIR),A1
CMP A0,A1
JREQ AIM2
;NOT =
; CMPI 5,A0
; JRLT $
; CMPI 14,A0
; JRLT TYU
; MOVK 13,A0
;TYU
MOVE A0,*A13(TSK_DIR),W
MOVE A0,A1
MOVE *A13(TDIR),A0,W
CALLA WAY
JRC DIT ;INC
;DEC=CLRC
CLR A1
MOVB A1,*A13(WAY01)
JRUC DIT0
DIT MOVK 1,A1
MOVB A1,*A13(WAY01)
DIT0
JRUC TAG
;DIE OFF
DIOFF:
;CALLED FROM ENDWAVE
CREATE 0,TSO_EXP2
SLEEP 2
MOVE A8,A0
CALLA DELOBJ
DIE
AIM2
;ALREADY HERE!
MOVK 2,A0
MOVB A0,*A13(MODE)
MOVK 4,B0
MOVK 10,B1
CALLA RANGRAND
MOVB A0,*A13(FIRED)
JRUC TAG
SPN MOVB *A13(SPDLY),A1
CMPI 7,A1
JRLT AF
MOVI 2,A1
AF
DEC A1
MOVB A1,*A13(SPDLY)
JRNN TAG
MOVK 2,A0
MOVB A0,*A13(SPDLY)
MOVB *A13(WAY01),A1
JRNZ INCIT
;TANK IS DEC TO LEFT!
DECIT MOVE *A13(TDIR),A0,W
DEC A0
; CMPI 4,A0
; JREQ OUT2
; CALLA INHERE
MOVE A0,*A13(TDIR),W
JRUC OUT
INCIT
;TANK IS ROTATING TO RIGHT
MOVE *A13(TDIR),A0,W
INC A0
; CMPI 14,A0
; JREQ OUT2
; CALLA IC
MOVE A0,*A13(TDIR),W
OUT
MOVE *A13(TDIR),A0
PUSH A0
CALLA GET_STANDT2 ;DOES ANI OF CORRECT VIEW
PULL A0
MOVE *A13(TSK_DIR),A1
CMP A0,A1
JRNE TAG
;REACHED CORRECT SEEK ANGLE.
;SHOOT AT PLAYER NOW
MOVI 300,A0
CALLA RANDPER
JRC OUT3 ;DON'T FIRE
OUT2
MOVK 2,A0
MOVB A0,*A13(MODE)
MOVK 1,B0
MOVK 3,B1
CALLA RANGRAND
MOVB A0,*A13(FIRED)
JRUC TAG
SHT
; MOVB *A13(SLOW),A0
; CALLA PRCSLP
SLEEP 6
MOVE *A13(TDIR),A9
CREATE 0,ABALL
CREATE 0,RECOIL
MOVB *A13(FIRED),A0
ANDI 0FH,A0
DEC A0
MOVB A0,*A13(FIRED)
JRNZ TAG
OUT3
CLR A0
MOVB A0,*A13(MODE)
; MOVB @PCNT,A0
; ANDI 01,A0
; SLL 4,A0
; ADDI SLOCNT,A0
; MOVE *A0,A0
; MOVE A0,*A13(SLOW)
; JRUC TAG
TAG
SLEEP 1
JRUC LUP_TOP
;SLOCNT .WORD 03,0AH
RECOIL MOVE A9,A0
SLL 4,A0
MOVI XCHG,A1
ADD A0,A1
MOVE *A1,A10,W ;X MOD
MOVI YCHG,A2
ADD A0,A2
MOVE *A2,A9,W
MOVE *A8(OYPOS),A0
ADD A9,A0
MOVE A0,*A8(OYPOS)
MOVE *A8(OXPOS),A0
ADD A10,A0
MOVE A0,*A8(OXPOS)
SLEEP 2
MOVE *A8(OYPOS),A0
SUB A9,A0
MOVE A0,*A8(OYPOS)
MOVE *A8(OXPOS),A0
SUB A10,A0
MOVE A0,*A8(OXPOS)
DIE
XCHG: .WORD 0,0,-1,-2,-2,-2,-2,-2,-1,0,1,2,2,2,2,2,1
YCHG: .WORD 0,2,2,2,1,0,-1,-2,-2,-2,-2,-2,-1,0,1,2,2
;WAY:
;SPIN LEFT OR RIGHT
;A1=SEEK DIR
;A0=DIR IMAGE IS FACING NOW
;812
;7 3
;654
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
; SUB A0,A1
; MOVE A1,A2
; ABS A1
; CMPI 9,A1 ;5
; JRLT N0
; NEG A2
;N0: BTST 31,A2
; JRZ IC
;INHERE: DEC A0
; JRP TDEC
; MOVK 16,A0 ;8
;TDEC CLRC ;MEANS DEC
; RETS
;IC: INC A0 ;ROTATE TOWARD PLAYER
; CMPI 17,A0 ;9
; JRNE T1
; MOVK 1,A0
;T1: SETC ;MEANS INC
; RETS
;
IH1: ;ENTER HERE IF ON SCRN TANK
;STUFF NEEDED SHIT
;A0=OXVAL
;A1=OYVAL
MOVI MTK6,A2 ;(OIMG) DOES NOT MATTER
MOVI 230,A3 ;(OZPOS)
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
MOVI CLSNEUT|TYPWLMN,A5 ;(OID)
CLR A6 ;(OXVEL)
CLR A7 ;(OYVEL)
RETS
;
SETUP_WLMN:
MOVI WLMN,A2
CALLA GET_WVADDR
; MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL FOR THIS WLMN
; MOVE A1,*A13(LEVEL),W
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS WLMN
DEC A1
MOVE A1,*A0(16),W
RETS
KILL_WLMN:
;CALLED FROM COLL2.ASM WHEN A WLMN COLLIDES WITH SOMETHING.
;VICTIM PNTR IN A8
;A8=WLMN IMAGE PTR
MMTM SP,A1,A7,A10
MOVE *A8(OPLINK),A10,L
MOVE *A0(OID),A7,W ;KILLERS OID
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK TANK!
ANDI F_SUBT,A7
DEC A7
SLL 3,A7
ADDI PUNISHT,A7
MOVB *A7,A7
MOVB *A10(ABSRB),A1
ANDI 0FFH,A1
ADD A7,A1
MOVB A1,*A10(ABSRB)
CMPI HITWLM,A1
;IF LESS THAN, START COLOR CYCLE PROCESS HERE
JRLT KPY
;ABSORBED ENOUGH HITS TO DESTROY IT
MOVE *A0(OPLINK),A10,L
CREATE 0,WLMN_EXP ;BULLETS DIR WILL BE IN A10
MOVE *A8(OPLINK),A0,L
CALLA KILL ;KILLS PROCESS IN A0
MOVE A8,A0
CALLA DELOBJ
MMFM SP,A1,A7,A10
RETS
KPY PUSH A9
CALLA GETUGH
MOVI 018180000H,A9
CREATE 0,FLASHME
PULL A9
MMFM SP,A1,A7,A10
RETS
PUNISHT:
.BYTE 3,3,5,20,20
.EVEN
WLMN_EXP:
;WLMN MUST KNOW WHO SHOT IT!
MOVI EXP3HI,A0
CALLA ONESND
MOVB *A10(MYPLYR),A0
; JAUC TSO_EXP
;A0=1 OR 2
MOVI WALPT,A1 ;AMOUNT OF SCORE
JAUC DOBLO
.END