smashtv/POW1.ASM

296 lines
6.0 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 'POW1.ASM (BLADE ATTACK)'
.TITLE 'ROBO-RAMA GAME PROGRAM'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: APRIL 26,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"
;
;SOUND HEADERS USED
;
.REF ICON,BLDS,YAMOFF,TING
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF ALIGNXY
.REF GETANIXY,AFONT0
.REF GPALOBJ,STFOBJ,INSOBJ,ADJSTWTL
.REF FRANIM,KILOBJ
.REF SCRTSTG,PUTA7
.REF DELOBJ
.REF GETCOS
.REF GETSIN
.REF DO_BND
.REF EXISTP
.REF KILALL
.REF KILL,ICNFLG
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF POW1ON,CHAINHIT,FLYSLUP,CHAINHIT2,PCNT
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS PCNT,8
;
;EQUATES
;
MAXHITS .EQU 5 ;MAXIMUM HITS PER CHNSW CAN TAKE
ADLTA .EQU (411775/(160/3)) ;RADIUS OF CIRCLE
;
;EQUATES FOR THIS FILE
;
;
.TEXT
;
POW1ON:
;CHECK HERE FOR COLL2 USAGE OF THESE REGISTERS! DO_BND?!?!
MMTM SP,A1,A7
MOVE A0,A9
MOVE *A0(OPLINK),A0,L
MOVB *A0(PNUM),A10 ;A10=1 OR 2
MOVK 1,A1
MOVB A1,*A0(BLDFLG) ;BLADES ON FLAG FOR THIS PLAYER
MOVB A1,@ICNFLG ;ICON GOT FLAG
CREATE 0,DOSAWS ;PASS PLAYER PNTR WHO TOUCHED ME
MOVE A8,A0
CALLA DELOBJ
MOVI BLDS,A0
CALLA ONESND
MMFM SP,A1,A7
RETS
;
DOSAWS:
;A9=PLAYER PNTR WHO TOUCHED ME
MOVE A10,A8
MOVE *A9(OPLINK),A10,L
MOVK 2,A1 ;BLADES INTO BNDTYP
MOVB A1,*A10(BNDTYP)
MOVE A10,A7 ;DO BND NEEDS PLYR PRC IN A7
CALLA DO_BND
MOVK 5,A11 ;5 ORBITING OBJECTS
SAWLUP:
SLEEP >B
CREATE CHNSWPID,CHAINSAW
DSJS A11,SAWLUP
; MOVI BLDS,A0
; CALLA ONESND
DIE
;
; DO CHNSW MOVEMENT LOGIC
;A11 = OFFSET FOR STARTING POSITION OF CHNSW
;A10=THIS PLAYER PROCESS PTR
;A8=PNUM 1 OR 2
CHAINSAW:
CLR A0
MOVB A8,*A13(MYPLYR) ;PLAYER # I SURROUND
MOVE A10,*A13(PLYRPC),L ;KEEP PLAYER PROCESS PTR
MOVB A0,*A13(HITS)
MOVB A0,*A13(ANIMTIK)
MOVI ADLTA,A0
MOVE A0,*A13(DELTA),L
CALLA SETPOINT
;
ENCIRCLE:
; MAKE CHNSW MOVE IN A CIRCLE AROUND PLAYER
CALLR ANICHNSW ;ANIMATE CHNSW
; MOVB @PCNT,A0
; ANDI 1,A0
; JRZ IP
CALLA ALIGNXY ;KEEP OBJECT ALIGNED WITH PLAYER
;IP
MOVE *A13(THETA),A2,L ;PROGRESSIVE THETA
MOVE *A13(DELTA),A0,L ;NEXT DELTA ANGLE
ADD A2,A0
CALLA GETCOS
MOVE A0,A11
MOVK 5,A0
MPYS A0,A11
MOVE A14,*A13(THETA),L
MOVE A14,A0
CALLA GETSIN
MOVE A0,A3
MOVK 5,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
FLYSLUP2:
;COLLISION ROUTINE SENDS BLADE HERE
NEG A11
NEG A10
MOVE A11,*A8(OXVEL),L
MOVE A10,*A8(OYVEL),L
MOVI TING,A0
CALLA ONESND
JRUC FLY1
FLYSLUP:
;COLLISION ROUTINE SENDS BLADE HERE
MOVE A11,*A8(OXVEL),L
MOVE A10,*A8(OYVEL),L
FLY1:
CALLR ANICHNSW ;ANIMATE FAST SAW
MOVI [>23,>21],A2
MOVI [>FC,>171],A3
CALLA SCRTSTG
JRNZ CHNSWDIE
SLOOP 1,FLY1
CHNSWDIE:
MOVE A8,A0
CALLA DELOBJ ;KILL CHAINSAW IMAGE
CLR A1
NOT A1 ;MASK FOR PROCESS EXIST ROUTINE
MOVK 2,A3 ;ASSUME CHAINSAW'S BOUNDARY
;
;MAKE THIS JUST A CHECK OF A FLAG FOR EFFICIENCY!
;
MOVE *A13(PROCID),A2,W ;SAVE CURRENT PROCESS ID
MOVI DUM_ID,A0
MOVE A0,*A13(PROCID),W ;REPLACE ID FOR THIS PROCESS
MOVI CHNSWPID,A0 ;CHAINSAW PROCESS
CALLA EXISTP
JRNZ DNBL ;BR = STILL A BLADE AROUND
;TURN OFF BLADE SOUND
MOVI YAMOFF,A0
CALLA ONESND
;RESET BLADE FLAG FOR THIS PLAYER
MOVE *A13(PLYRPC),A7,L ;GET PLAYER PRC THESE BLADES SURROUND
CLR A0
MOVB A0,*A7(BLDFLG)
MOVK 1,A3 ;ASSUME HELPER BOUNDARY
MOVE *A13(PLYRPC),A7,L ;GET PLAYER PRC THESE BLADES SURROUND
MOVI LSRPID,A0 ;CHNSW PROCESS ID
CLR A1
NOT A1
CALLA EXISTP
JRNZ SETBND ;BR = DOES EXIST
CLR A3 ;ASSUME NORMAL BOUNDARY
JRUC SET2
SETBND:
;SOMEONE HAS A HELPER, IS IT ME?
MOVE *A0(TORSO),A1,L ;PLAYER THIS HELPER SURROUNDS
MOVE *A1(OPLINK),A1,L
CMP A1,A7
JREQ SET2 ;BR=YES! I HAVE HELPER ALSO!
CLR A3
SET2
MOVB A3,*A7(BNDTYP)
CLR A2
MOVB A2,*A7(PRVBND)
CALLA DO_BND
DNBL
DIE
;
;ANIMATE CHNSW ROUTINE
;
ANICHNSW:
MOVB *A13(ANIMTIK),A0
DEC A0
MOVB A0,*A13(ANIMTIK)
JRNN NOTNEXT
;FALLS HERE IF NEGATIVE
MOVK 4,A1
JSRP FRANIM ;1 FRAME STEP
MOVB A0,*A13(ANIMTIK) ;SAVE SLEEP TIME BETWEEN FRAMES
JRNC NOTNEXT
MOVI BLADES,A9
NOTNEXT:
RETS
;
SETPOINT:
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,A8
MOVE A8,A10
;A9=PLAYER WHO TURNED ME ON
MOVE *A9(OPLINK),A0,L
MOVE *A0(TSO_PTR),A8,L
MOVE A8,*A13(TORSO),L ;PLACE TORSO PTR INTO BLADE PDATA
CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3
MOVE A10,A8
SUBI [13,0],A2
SUBI [4,0],A3
MOVE A2,*A8(OYVAL),L ;INITIAL POSITION OFFSET OF OBJECT
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
MOVI BLADES,A9
RETS
CHAINHIT2:
;CALLED FROM COLLISION ROUTINE
MOVE *A8(OPLINK),A0,L ;GET PROCESS ID BACK
;BLADE TO FLY OFF
;RESET HERE
MOVI FLYSLUP2,A7
CALLA PUTA7 ;THIS BLADE WILL NOW WAKE UP AT A7 ADDR
RETS
;
CHAINHIT:
;CALLED FROM COLLISION ROUTINE
MMTM SP,A1,A13
MOVE *A8(OPLINK),A13,L ;GET PROCESS ID BACK
MOVB *A13(HITS),A1
INC A1
MOVB A1,*A13(HITS)
CMPI MAXHITS,A1
JRLT HO
;BLADE TO FLY OFF
;RESET HERE
MOVE A13,A0
MOVI FLYSLUP,A7
CALLA PUTA7 ;THIS BLADE WILL NOW WAKE UP AT A7 ADDR
HO MMFM SP,A1,A13
RETS
INITAB:
.LONG 0,0,BLD1
.WORD 170,DMAWNZ,CLSPLYR|TYPPRSM
.LONG 0,0
;
;ANIMATION TABLE FOR CHAINSAW
;
BLADES .LONG BLD4
.WORD 1
.LONG BLD3
.WORD 1
.LONG BLD2
.WORD 1
.LONG BLD1
.WORD 1
.LONG 0
.END