smashtv/WLMAN.ASM

452 lines
7.6 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.

.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