2348 lines
47 KiB
NASM
2348 lines
47 KiB
NASM
.FILE 'NARCUTIL.ASM'
|
||
.TITLE " <<< NARC - TODD'S UTILITIES >>>"
|
||
.WIDTH 132
|
||
.OPTION B,D,L
|
||
.MNOLIST
|
||
|
||
* GET THE SYSTEM STUFF
|
||
.INCLUDE "\video\mprocEQU.ASM" ;MPROC equates
|
||
.INCLUDE "\video\DISPEQU.ASM" ;Display processor equates
|
||
.INCLUDE "\video\GSP.INC" ;GSP assembler equates
|
||
.INCLUDE "\video\SYS.INC" ;Zunit system equates
|
||
.INCLUDE "\video\MACROS.HDR" ;Macros, Yeah!
|
||
* LOCAL STUFF
|
||
.INCLUDE "NARCEQU.ASM" ;NARC Equates
|
||
.INCLUDE "IMGTBL.GLO" ;Image Label Equates
|
||
.INCLUDE "NARCFRAG.GLO"
|
||
.INCLUDE "NARCTEQU.ASM"
|
||
.INCLUDE "NARCAUDN.ASM"
|
||
|
||
; .GLOBL FLYTOPL
|
||
.GLOBAL GET_ADJ
|
||
|
||
.TEXT
|
||
Y_NEAR .set 10
|
||
|
||
|
||
**************************************************************************
|
||
MovePlyr:
|
||
;A0 - player data obj
|
||
;A1 - X offset
|
||
move *A0(POBJ),A2,L
|
||
jrz NoPMv
|
||
move *A2(OXPOS),A3,W
|
||
add A1,A3
|
||
move A3,*A2(OXPOS),W
|
||
|
||
move *A2(OSHAD),A4,L
|
||
jrz SkShad1
|
||
move *A4(OXPOS),A3,W
|
||
add A1,A3
|
||
move A3,*A4(OXPOS),W
|
||
SkShad1:
|
||
|
||
move *A0(PLOBJ),A2,L
|
||
jrz NoPMv
|
||
move *A2(OXPOS),A3,W
|
||
add A1,A3
|
||
move A3,*A2(OXPOS),W
|
||
|
||
move *A2(OSHAD),A4,L
|
||
jrz SkShad2
|
||
move *A4(OXPOS),A3,W
|
||
add A1,A3
|
||
move A3,*A4(OXPOS),W
|
||
SkShad2:
|
||
|
||
NoPMv:
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
SetAniP:
|
||
;Parms
|
||
;A8 ptr to BASE OBJ
|
||
;A0 ptr to obj which is to have its position set so that its anim pt
|
||
;is at the same coors as the BASE OBJ
|
||
|
||
mmtm SP,A1,A2,A3,A4,A5,A6,A7
|
||
;* get POSITION from first obj..
|
||
move *A8(OIMG),A1,L
|
||
move *A8(OSIZE),A2,L
|
||
move *A8(OFLAGS),A4,W
|
||
*GANIOF: A1=OIMG, A2=H:W, A4=OFLAGS -> A6=X ANIOFF<<16, A7=Y ANIOFF<<16
|
||
calla GANIOF
|
||
move *A8(OXVAL),A3,L
|
||
add A6,A3 ;A3 XANI pos
|
||
move *A8(OYVAL),A5,L
|
||
add A7,A5 ;A5 YANI pos
|
||
|
||
move *A0(OIMG),A1,L
|
||
move *A0(OSIZE),A2,L
|
||
move *A0(OFLAGS),A4,W
|
||
*GANIOF: A1=OIMG, A2=H:W, A4=OFLAGS -> A6=X ANIOFF<<16, A7=Y ANIOFF<<16
|
||
calla GANIOF
|
||
sub A3,A6
|
||
neg A6
|
||
move A6,*A0(OXVAL),L
|
||
sub A5,A7
|
||
neg A7
|
||
move A7,*A0(OYVAL),L
|
||
mmfm SP,A1,A2,A3,A4,A5,A6,A7
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ZCHEK:
|
||
move *A8(OZPOS),A1,W
|
||
move @PLZMIN,A0,W
|
||
addk 5,A0
|
||
sub A0,A1
|
||
jrnn ZMinOK
|
||
move A0,*A8(OZPOS),W
|
||
move *A8(OYPOS),A0,W
|
||
sub A1,A0
|
||
move A0,*A8(OYPOS),W
|
||
move *A8(OZVEL),A0,L ;* want to check sign
|
||
jrnn ZMaxOK
|
||
jruc SETZV
|
||
ZMinOK:
|
||
move *A8(OZPOS),A1,W
|
||
move @PLZMAX,A0,W
|
||
subk 3,A0
|
||
sub A0,A1
|
||
jrn ZMaxOK
|
||
move A0,*A8(OZPOS),W
|
||
move *A8(OYPOS),A0,W
|
||
sub A1,A0
|
||
move A0,*A8(OYPOS),W
|
||
move *A8(OZVEL),A0,L ;* want to check sign
|
||
jrn ZMaxOK
|
||
jrz ZMaxOK
|
||
SETZV:
|
||
move *A8(OYVEL),A1,L
|
||
sub A0,A1
|
||
move A1,*A8(OYVEL),L
|
||
clr A0
|
||
move A0,*A8(OZVEL),L ;set Z velocity
|
||
ZMaxOK:
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
**************************************************************************
|
||
WHATCOLL:
|
||
;* decide which collision vector should be taken
|
||
;* PARMS A1 - obj ID of item collided with
|
||
;* RETURNS A1 - offset for a jump table of collision vectors
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
***************************************************************************
|
||
ShadOn:
|
||
move *A8(OSHAD),A0,L
|
||
jaz SHADST
|
||
rets
|
||
***************************************************************************
|
||
|
||
***************************************************************************
|
||
ShadOff:
|
||
move *A8(OSHAD),A0,L
|
||
jrz NoShad
|
||
move A8,A0
|
||
jauc DELSHAD
|
||
NoShad:
|
||
rets
|
||
***************************************************************************
|
||
|
||
***************************************************************************
|
||
GetPLZMID:
|
||
mmtm SP,A1
|
||
move @PLZMIN,A0,W
|
||
move @PLZMAX,A1,W
|
||
add A1,A0
|
||
srl 1,A0
|
||
mmfm SP,A1
|
||
rets
|
||
***************************************************************************
|
||
|
||
**************************************************************************
|
||
* DFrmGrnd - RETURNS THE DIST FROM THE BOT OF OBJ TO THE "GROUND." *
|
||
* A0 = OBJECT BLOCK *
|
||
* RETURN(S) *
|
||
* A1 = DISTANCE FROM GROUND (16 BITS) *
|
||
* STATUS BITS SET ACCORDING TO THE SIGN OF A1 *
|
||
* NOTE: MAX ACCEPTABLE Y = +32K, MIN ACCEPTABLE Y = -32K *
|
||
DFrmGrnd:
|
||
PUSH A2
|
||
move *A0(OYPOS),A1,W
|
||
move *A0(OSIZEY),A2,W
|
||
add A1,A2 ;A2 = BOTTOM Y
|
||
move *A0(OZPOS),A1,W
|
||
sub A2,A1
|
||
addi ZORIGIN,A1
|
||
mmfm SP,A2
|
||
RETS
|
||
**************************************************************************
|
||
|
||
*************************** Get Player Data *******************************
|
||
OidToDat:
|
||
;* entry point that takes players OID in A0
|
||
mmtm SP,A1,A2
|
||
move A0,A1
|
||
jruc GotOid
|
||
GetPData:
|
||
;* PARMS : A0 - ptr to a players Object
|
||
;* RETS : A0 - ptr to players DATA Block, rets 0 if neither
|
||
mmtm SP,A1,A2
|
||
move *A0(OID),A1,W
|
||
GotOid:
|
||
move A1,A2
|
||
andi P1OID,A1
|
||
jrz GetP2Dat
|
||
movi P1DATA,A0
|
||
jruc GotPData
|
||
GetP2Dat:
|
||
andi P2OID,A2
|
||
jrz NoPDat
|
||
movi P2DATA,A0
|
||
jruc GotPData
|
||
NoPDat:
|
||
clr A0
|
||
GotPData:
|
||
mmfm SP,A1,A2
|
||
rets
|
||
***************************************************************************
|
||
|
||
***************************************************************************
|
||
BulToDat:
|
||
;* PARMS : A0 - ptr to a bullet Object
|
||
;* RETS : A0 - ptr to firing players DATA Block, rets 0 if neither
|
||
mmtm SP,A1,A2
|
||
move *A0(OID),A1,W
|
||
srl 4,A1
|
||
sll 4,A1
|
||
cmpi B1OID,A1
|
||
jrnz BP2Dat
|
||
movi P1DATA,A0
|
||
jruc GotBPDat
|
||
BP2Dat:
|
||
cmpi B2OID,A1
|
||
jrnz NoBPDat
|
||
movi P2DATA,A0
|
||
jruc GotBPDat
|
||
NoBPDat:
|
||
clr A0
|
||
GotBPDat:
|
||
mmfm SP,A1,A2
|
||
rets
|
||
***************************************************************************
|
||
|
||
****************************** Get Mid Z **********************************
|
||
GetMidZ:
|
||
;PARMS ptr to obj in A0
|
||
;RETURNS middle Z val in A0
|
||
mmtm SP,A1,A2
|
||
move *A0(OZSIZ),A2,W
|
||
move A2,A1
|
||
srl 16,A2
|
||
zext A1,W
|
||
neg A1
|
||
add A1,A2
|
||
sra 1,A2
|
||
move *A0(OZPOS),A0,W
|
||
add A2,A0
|
||
mmfm SP,A1,A2
|
||
rets
|
||
***************************************************************************
|
||
|
||
***************************************************************************
|
||
CentDist:
|
||
mmtm SP,A1
|
||
move @(WORLDTLX+16),A0,W
|
||
addi 240,A0 ;deducting 1/2 avg. width of char
|
||
move *A8(OXPOS),A1,W
|
||
sub A1,A0
|
||
abs A0
|
||
mmfm SP,A1
|
||
rets
|
||
***************************************************************************
|
||
|
||
************************** Get On Screen **********************************
|
||
GetOnScr:
|
||
; set dest to be just past current screen bounds
|
||
move *A8(OXPOS),A1,W
|
||
|
||
move @WORLDTL,A3,W
|
||
zext A3,W
|
||
|
||
move @SCRNTL,A2,W ;GET SCREEN LEFT
|
||
add A3,A2
|
||
addi 120,A2
|
||
cmp A2,A1
|
||
jrge SkLf
|
||
move A2,A1
|
||
jruc SkRt
|
||
SkLf:
|
||
|
||
move @SCRNLR,A2,W ;GET SCREEN RT.
|
||
add A3,A2
|
||
subi 120,A2
|
||
cmp A2,A1
|
||
jrle SkRt
|
||
move A2,A1
|
||
SkRt:
|
||
|
||
;* set z dest to be same as current Z
|
||
; move *A8(OZPOS),A3,W
|
||
; move @PLZMIN,A2,W ;check top
|
||
; cmp A2,A3
|
||
; jrge SkTp
|
||
; move A2,A3
|
||
; jruc SkBt
|
||
;SkTp:
|
||
; move @PLZMAX,A2,W ;check bottom
|
||
; cmp A2,A3
|
||
; jrle SkBt
|
||
; move A2,A3
|
||
;SkBt:
|
||
; move A3,A0
|
||
|
||
move @PLZMIN,B0,W ;check top
|
||
move @PLZMAX,B1,W ;check bottom
|
||
calla RANGRAND
|
||
sll 16,A0
|
||
movy A0,A1
|
||
|
||
move A1,*A13(DEST),L
|
||
|
||
move *A13(FUNCS),A0,L ;* choose appropriate godest func
|
||
addi GODEST,A0
|
||
move *A0,A0,L
|
||
call A0
|
||
|
||
movk OFFSCR_T,A0
|
||
movb A0,*A13(DEST_TAG)
|
||
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************** Dest OK *************************************
|
||
DestOk:
|
||
; make sure dest is still within bounds, else clear destination
|
||
movb *A13(DEST_TAG),A0
|
||
jrz DestGood
|
||
cmpi ESCAPE_T,A0
|
||
jreq DestGood
|
||
|
||
move *A13(DEST),A1,L
|
||
move @WORLDTL,A2,W ;sub off world base from position
|
||
zext A2,W
|
||
subxy A2,A1
|
||
|
||
move @SCRNTL,A2,W ;GET SCREEN LEFT
|
||
subk 25,A2 ; give a little padding
|
||
cmpxy A2,A1
|
||
jrxlt DestBad
|
||
|
||
move @SCRNLR,A2,W ;GET SCREEN RT.
|
||
addk 25,A2 ; give a little padding
|
||
cmpxy A2,A1
|
||
jrxgt DestBad
|
||
|
||
move @PLZMIN,A2,W ;check top
|
||
sll 16,A2
|
||
cmpxy A2,A1
|
||
jrylt DestBad
|
||
|
||
move @PLZMAX,A2,W ;check bottom
|
||
sll 16,A2
|
||
cmpxy A2,A1
|
||
jrygt DestBad
|
||
|
||
DestGood:
|
||
clrc
|
||
jruc DestOkX
|
||
|
||
DestBad:
|
||
clr A0
|
||
movb A0,*A13(DEST_TAG)
|
||
movb A0,*A13(DESTTIKS)
|
||
movb A0,*A13(BRAINTIKS)
|
||
move A0,*A13(DEST),L
|
||
move A0,*A13(WANTOBJ),L
|
||
setc
|
||
|
||
DestOkX:
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
**************************************************************************
|
||
SCRNCLIP:
|
||
;PARMS A0-Z:X coor
|
||
;RETS A0-Z:X clipped to screen bounds
|
||
mmtm SP,A2,A3
|
||
move @WORLDTL,A3,W
|
||
zext A3,W
|
||
|
||
move @SCRNTL,A2,W ;GET SCREEN LEFT
|
||
add A3,A2
|
||
addk 10,A2
|
||
cmpxy A2,A0
|
||
jrxge SkClipLf
|
||
movx A2,A0
|
||
jruc SkClipRt
|
||
SkClipLf:
|
||
|
||
move @SCRNLR,A2,W ;GET SCREEN RT.
|
||
add A3,A2
|
||
subk 10,A2
|
||
cmpxy A2,A0
|
||
jrxle SkClipRt
|
||
movx A2,A0
|
||
SkClipRt:
|
||
|
||
move @PLZMIN,A2,W ;check top
|
||
sll 16,A2
|
||
cmpxy A2,A0
|
||
jryge SkClipTp
|
||
movy A2,A0
|
||
jruc SkClipBt
|
||
SkClipTp:
|
||
|
||
move @PLZMAX,A2,W ;check bottom
|
||
sll 16,A2
|
||
cmpxy A2,A0
|
||
jryle SkClipBt
|
||
movy A2,A0
|
||
SkClipBt:
|
||
mmfm SP,A2,A3
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************** Clip Dest ***********************************
|
||
ClipDest:
|
||
; clip dest to be within screen bounds
|
||
PUSH A0
|
||
move *A13(DEST),A0,L
|
||
callr SCRNCLIP
|
||
move A0,*A13(DEST),L
|
||
PULL A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************** Clip Z Dest *********************************
|
||
ClipZDst:
|
||
; clip dest to be within screen Z bounds
|
||
PUSH A0
|
||
move *A13(DEST),A0,L
|
||
callr SCRNZCLP
|
||
move A0,*A13(DEST),L
|
||
PULL A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
SCRNZCLP:
|
||
;PARMS A0-Z:X coor
|
||
;RETS A0-Z:X clipped to screen Z bounds
|
||
PUSH A2
|
||
move @PLZMIN,A2,W ;check top
|
||
sll 16,A2
|
||
cmpxy A2,A0
|
||
jryge SkClpTp2
|
||
movy A2,A0
|
||
jruc SkClpBt2
|
||
SkClpTp2:
|
||
|
||
move @PLZMAX,A2,W ;check bottom
|
||
sll 16,A2
|
||
cmpxy A2,A0
|
||
jryle SkClpBt2
|
||
movy A2,A0
|
||
SkClpBt2:
|
||
PULL A2
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
**************************** CkDest **************************************
|
||
CkDest:
|
||
;* RETURNS setc if within tolerance of destination
|
||
move *A13(DEST),A2,W
|
||
jrz AtDest
|
||
|
||
move *A13(TEMPDEST),A1,W ;want just X component
|
||
jrnz TDest
|
||
move A2,A1
|
||
TDest:
|
||
calla GETANIX
|
||
sub A0,A1 ;A1 is dist to be traveled to reach dest
|
||
|
||
;* Get X velocity
|
||
move *A13(FUNCS),A0,L
|
||
addi GETXVEL,A0
|
||
move *A0,A0,L
|
||
call A0 ;A0 is velocity
|
||
|
||
move *A8(OFLAGS),A2
|
||
BTST B_FLIPH,A2
|
||
jrz FaceRt
|
||
;* Facing left
|
||
move A0,A0
|
||
jrp GoingL
|
||
jruc GoingR
|
||
FaceRt:
|
||
move A0,A0
|
||
jrn GoingL
|
||
jruc GoingR
|
||
|
||
GoingL:
|
||
;* we are heading left, have we passed the destination
|
||
addk 5,A1 ;allow 5 pixel tolerance to reach dest
|
||
jrn DestX
|
||
jruc AtDest
|
||
|
||
GoingR:
|
||
subk 5,A1
|
||
jrp DestX
|
||
|
||
AtDest:
|
||
move *A13(TEMPDEST),A0,W
|
||
jrz MadeIt
|
||
move *A13(FUNCS),A0,L
|
||
addi GODEST,A0
|
||
move *A0,A0,L
|
||
call A0
|
||
jruc DestX
|
||
MadeIt:
|
||
setc
|
||
rets
|
||
|
||
DestX:
|
||
clrc
|
||
rets
|
||
**************************************************************************
|
||
|
||
*************************** GO DEST Delta ********************************
|
||
GoDestD:
|
||
;* calculates z motion as value for ZPER
|
||
mmtm SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10
|
||
|
||
;* Get MaxXZAngle
|
||
move *A13(FUNCS),A10,L
|
||
move *A10(MAXXZANGLE),A10,L ;A10 is .16
|
||
|
||
;* Get X velocity
|
||
move *A13(FUNCS),A0,L
|
||
addi GETXVEL,A0
|
||
move *A0,A0,L
|
||
call A0
|
||
move A0,A9
|
||
|
||
move *A13(DEST),A5,L
|
||
movy A5,A1 ;A5 = Zdest:Xdest
|
||
sra 16,A1
|
||
move *A8(OZPOS),A2,W
|
||
sub A2,A1 ;A1 = Zdelta = Zdest - Zpos
|
||
movx A5,A2
|
||
sext A2,W
|
||
calla GETANIX
|
||
sub A0,A2 ;A2 = Xdelta = Xdest - Xpos
|
||
|
||
;* make sure we're facing the correct way..
|
||
jrn GoLeft2
|
||
;*** need to go RIGHT
|
||
move A9,A9
|
||
jrp NoFlip
|
||
jruc YesFlip
|
||
GoLeft2:
|
||
;*** need to go LEFT
|
||
move A9,A9
|
||
jrn NoFlip
|
||
jruc YesFlip
|
||
|
||
NoFlip:
|
||
callr Ck_NOYFLP
|
||
jrc SetZVel2 ;Flip succeeded
|
||
jruc FlipFail
|
||
YesFlip:
|
||
callr Ck_YFLP
|
||
jrc SetZVel2 ;Flip Succeeded
|
||
|
||
FlipFail:
|
||
;* flip failed
|
||
movb *A13(FLIPTIKS),A1
|
||
sll 24,A1
|
||
srl 24,A1 ;* Flip tiks is always positive
|
||
movb A1,*A13(DESTTIKS)
|
||
mpys A9,A1
|
||
sra 16,A1
|
||
addxy A1,A5
|
||
move A5,*A13(TEMPDEST),L
|
||
clr A5
|
||
movb A5,*A13(ZPER)
|
||
jruc GoDestX2
|
||
|
||
SetZVel2:
|
||
;* can a straight course be set for the dest
|
||
;** A4 = (abs Zdelta) - (abs Xdelta)*(MaxXZAngle)
|
||
; if A4 positive, need a temp dest
|
||
move A2,A4
|
||
abs A4 ;A4 is 16. (abs Xdelta)
|
||
move A10,A3 ;A3 - MaxXZAngle is .16
|
||
mpyu A4,A3 ; result is 16.16
|
||
srl 16,A3 ;A3 is 16.
|
||
move A1,A4
|
||
abs A4 ;(abs Zdelta)
|
||
sub A3,A4 ;A4 = Zdist left to travel
|
||
jrp MkTmpDest2
|
||
|
||
;* Head straight for the destination
|
||
clr A3
|
||
move A3,*A13(TEMPDEST),L
|
||
move A2,A4
|
||
abs A4 ;(abs Xdelta)
|
||
move A4,A7
|
||
sll 7,A1 ;(A1 = Zdelta) Zper has 7 signifcant digits
|
||
divs A4,A1 ;A4 is 16. A1 is 16
|
||
movb A1,*A13(ZPER)
|
||
|
||
sll 16,A7 ;A7 16. -> 32.
|
||
divu A9,A7 ;A9 is 16.16, A7 is 32.
|
||
;A7 -> 16.
|
||
jruc SetSlp
|
||
|
||
MkTmpDest2:
|
||
;* calculate Z part of TEMPDEST
|
||
srl 1,A4 ;travel half of Zdist left to go
|
||
move A10,A7 ;A7 - MaxXZAngle
|
||
srl 9,A7 ;Zper has 7 significant digits
|
||
move A1,A1
|
||
jrp ZdeltaP2
|
||
neg A7
|
||
neg A4
|
||
ZdeltaP2:
|
||
movb A7,*A13(ZPER)
|
||
movy A5,A3
|
||
sra 16,A3
|
||
sub A4,A3
|
||
|
||
;* calculate X part of TEMPDEST
|
||
move A10,A6 ;A6 is .16
|
||
move A4,A7 ;A4 is 16.
|
||
abs A7
|
||
sll 16,A7 ;A7 is 32.
|
||
divu A6,A7 ;A7 is 16.
|
||
move A2,A2
|
||
jrp XdeltaP2
|
||
neg A7
|
||
XdeltaP2:
|
||
clr A6
|
||
movx A5,A6
|
||
add A7,A6
|
||
move A6,A7
|
||
|
||
sll 16,A3
|
||
movy A3,A6
|
||
move A6,*A13(TEMPDEST),L
|
||
|
||
calla GETANIX
|
||
subxy A0,A7
|
||
abs A7
|
||
sll 16,A7
|
||
|
||
divu A9,A7
|
||
SetSlp:
|
||
movi >FF,A1
|
||
cmp A1,A7
|
||
jrle SlpOk
|
||
move A1,A7
|
||
SlpOk:
|
||
movb A7,*A13(DESTTIKS)
|
||
|
||
GoDestX2:
|
||
mmfm SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10
|
||
rets
|
||
**************************************************************************
|
||
|
||
*************************** GO DEST Velocity *****************************
|
||
GoDestV:
|
||
;* calculates Z motion as a velocity
|
||
mmtm SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10
|
||
|
||
;* Get X velocity
|
||
move *A13(FUNCS),A0,L
|
||
addi GETXVEL,A0
|
||
move *A0,A0,L
|
||
call A0
|
||
move A0,A9 ;A9 = signed XVEL
|
||
|
||
move *A13(DEST),A5,L
|
||
movy A5,A1 ;A5 = Zdest:Xdest
|
||
sra 16,A1
|
||
move *A8(OZPOS),A2,W
|
||
sub A2,A1 ;A1 = Zdelta = Zdest - Zpos
|
||
movx A5,A2
|
||
sext A2,W
|
||
calla GETANIX
|
||
move A0,A10 ;A10 = current Xpos
|
||
sub A0,A2 ;A2 = Xdelta = Xdest - Xpos
|
||
move A2,A3
|
||
move A9,A9
|
||
jrp SkNegDlt
|
||
neg A3
|
||
SkNegDlt:
|
||
;* make sure we're facing the correct way..
|
||
move A3,A3
|
||
jrp GoRgt
|
||
neg A9 ;going to be flipped, so neg XVEL
|
||
callr Ck_YFLP
|
||
jrc SetZVel
|
||
jruc FlpFail
|
||
GoRgt:
|
||
callr Ck_NOYFLP
|
||
jrc SetZVel
|
||
FlpFail:
|
||
;* flip failed
|
||
neg A9 ;not going direction we wanted.
|
||
movb *A13(FLIPTIKS),A1
|
||
movb A1,*A13(DESTTIKS)
|
||
sll 24,A1
|
||
srl 24,A1
|
||
mpys A9,A1
|
||
srl 16,A1
|
||
add A0,A1
|
||
movy A5,A1
|
||
move A1,*A13(TEMPDEST),L
|
||
clr A5
|
||
move A5,*A8(OZVEL),L
|
||
move A5,*A8(OYVEL),L
|
||
jruc GoDestX
|
||
|
||
SetZVel:
|
||
;* can a straight course be set for the dest
|
||
move A2,A4
|
||
abs A4 ;A4=xdist is 16.
|
||
move *A13(FUNCS),A3,L
|
||
move *A3(MAXXZANGLE),A3,L ;A3 is .16
|
||
mpyu A4,A3 ; result is 16.16
|
||
srl 16,A3 ;A3=zdist travelable is 16.
|
||
move A1,A4
|
||
abs A4 ;A4=zdist
|
||
sub A3,A4 ;A4 = Zdist left to travel
|
||
jrp MkTmpDest
|
||
|
||
;* Head straight for the destination
|
||
clr A3
|
||
move A3,*A13(TEMPDEST),L
|
||
move A2,A7
|
||
mpys A9,A1 ;A1 is 16. -> 16.16
|
||
divs A2,A1 ;A4 is 16. A1 is 16.16
|
||
move A1,*A8(OZVEL),L
|
||
move A1,*A8(OYVEL),L
|
||
sll 16,A7 ;A7=(xdelt) 16. -> 32.
|
||
divs A9,A7 ;A9 is 16.16, A7 is 32.
|
||
;A7 -> 16.
|
||
jruc SetSlp2
|
||
|
||
MkTmpDest:
|
||
;* calculate Z part of TEMPDEST
|
||
move A4,A0
|
||
srl 2,A0
|
||
sub A0,A4 ;lets travel 3/4 zdist left to go
|
||
move *A13(FUNCS),A7,L
|
||
move *A7(MAXXZANGLE),A7,L ;A7 is .16
|
||
move A9,A3
|
||
abs A3
|
||
srl 8,A3
|
||
srl 8,A7
|
||
mpyu A3,A7 ;A7 is 16.16 Zvel = Xvel*MaxXZAngle
|
||
move A1,A1
|
||
jrp ZdeltaP
|
||
neg A7
|
||
neg A4
|
||
neg A0 ;portion of zdelta not travelled
|
||
ZdeltaP:
|
||
move A7,*A8(OZVEL),L
|
||
move A7,*A8(OYVEL),L
|
||
movy A5,A3
|
||
sra 16,A3
|
||
sub A0,A3 ;A3 = Z part of tempdest
|
||
|
||
;* calculate X part of TEMPDEST
|
||
move *A13(FUNCS),A6,L
|
||
move *A6(MAXXZANGLE),A6,L ;A6 is .16
|
||
move A4,A7 ;A4 is 16.
|
||
abs A7
|
||
sll 16,A7 ;A7 is 32.
|
||
divu A6,A7 ;A7 is 16. 1/2 Zdist to travel / XZang
|
||
neg A7
|
||
move A2,A2
|
||
jrp XdeltaN
|
||
neg A7
|
||
XdeltaN:
|
||
clr A6
|
||
movx A5,A6
|
||
sub A7,A6
|
||
move A6,A7
|
||
|
||
sll 16,A3
|
||
movy A3,A6
|
||
move A6,*A13(TEMPDEST),L
|
||
|
||
subxy A10,A7 ;A10 = ret from GETANIX
|
||
sll 16,A7
|
||
divs A9,A7
|
||
SetSlp2:
|
||
move A7,A7
|
||
jrn FixSlp
|
||
movi >FF,A1
|
||
cmp A1,A7
|
||
jrle SlpOk2
|
||
move A1,A7
|
||
SlpOk2:
|
||
movb A7,*A13(DESTTIKS)
|
||
|
||
GoDestX:
|
||
callr UpdShadV
|
||
mmfm SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10
|
||
rets
|
||
FixSlp:
|
||
movk 2,A7
|
||
jruc SlpOk2
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
T_YFLP:
|
||
mmtm SP,A0
|
||
move *A8(OFLAGS),A0,W
|
||
btst B_FLIPH,A0
|
||
jrnz NOFLP3
|
||
|
||
move *A13(FUNCS),A0,L
|
||
movb *A0(FLIPCT),*A13(FLIPTIKS)
|
||
calla YFLP
|
||
|
||
;* set veloctiy for skaters
|
||
move *A8(OXVEL),A0,L
|
||
neg A0
|
||
move A0,*A8(OXVEL),L
|
||
callr UpdShadV
|
||
|
||
NOFLP3:
|
||
mmfm SP,A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
T_NOYFLP:
|
||
mmtm SP,A0
|
||
move *A8(OFLAGS),A0,W
|
||
btst B_FLIPH,A0
|
||
jrz NOFLP4
|
||
|
||
move *A13(FUNCS),A0,L
|
||
movb *A0(FLIPCT),*A13(FLIPTIKS)
|
||
callA NOYFLP
|
||
|
||
;* set veloctiy for skaters
|
||
move *A8(OXVEL),A0,L
|
||
neg A0
|
||
move A0,*A8(OXVEL),L
|
||
callr UpdShadV
|
||
|
||
NOFLP4:
|
||
mmfm SP,A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
Ck_YFLP:
|
||
mmtm SP,A0
|
||
move *A8(OFLAGS),A0,W
|
||
btst B_FLIPH,A0
|
||
jrnz NOFLP0
|
||
|
||
movb *A13(FLIPTIKS),A0
|
||
jrnz CANTFLP0
|
||
|
||
move *A13(FUNCS),A0,L
|
||
movb *A0(FLIPCT),*A13(FLIPTIKS)
|
||
calla YFLP
|
||
|
||
;* set veloctiy for skaters
|
||
move *A8(OXVEL),A0,L
|
||
neg A0
|
||
move A0,*A8(OXVEL),L
|
||
callr UpdShadV
|
||
|
||
NOFLP0:
|
||
mmfm SP,A0
|
||
setc
|
||
rets
|
||
CANTFLP0:
|
||
mmfm SP,A0
|
||
clrc
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
Ck_NOYFLP:
|
||
mmtm SP,A0
|
||
move *A8(OFLAGS),A0,W
|
||
btst B_FLIPH,A0
|
||
jrz NOFLP1
|
||
|
||
movb *A13(FLIPTIKS),A0
|
||
jrnz CANTFLP1
|
||
|
||
move *A13(FUNCS),A0,L
|
||
movb *A0(FLIPCT),*A13(FLIPTIKS)
|
||
calla NOYFLP
|
||
|
||
;* set veloctiy for skaters
|
||
move *A8(OXVEL),A0,L
|
||
neg A0
|
||
move A0,*A8(OXVEL),L
|
||
callr UpdShadV
|
||
|
||
NOFLP1:
|
||
mmfm SP,A0
|
||
setc
|
||
rets
|
||
CANTFLP1:
|
||
mmfm SP,A0
|
||
clrc
|
||
rets
|
||
**************************************************************************
|
||
|
||
****************************** Z OFF *************************************
|
||
ZOFF:
|
||
;A8 - obj ptr
|
||
;A9 - anim ptr
|
||
;*A13(ZPER) - signed byte, zoff = zper * Xoff >> 7
|
||
mmtm SP,A0,A9
|
||
|
||
move *A9+,A0,L ;FRAME
|
||
jreq ZoffX ;No Frame -> No Xoff -> no Zoff
|
||
move *A9+,A0,W ;BITS|Sleep Time
|
||
btst BDELTAXZ,A0
|
||
jrz ZoffX ;No Xoff -> no Zoff
|
||
btst BSPAWNP,A0
|
||
jrz SPAWNSk2
|
||
addi >50,A9
|
||
SPAWNSk2:
|
||
btst BFLIPBIT,A0
|
||
jrz FLIPSk2
|
||
addi 16,A9
|
||
FLIPSk2:
|
||
btst BNEWPAL,A0
|
||
jrz PALSk2
|
||
addk 16,A9
|
||
PALSk2:
|
||
movb *A9,A0 ;X offset
|
||
abs A0
|
||
movb *A13(ZPER),A1
|
||
mpys A0,A1
|
||
sll 9,A1 ;had 7 bits frac, want 16
|
||
move *A8(OZVAL),A0,L
|
||
add A1,A0
|
||
move A0,*A8(OZVAL),L
|
||
move *A8(OYVAL),A0,L
|
||
add A1,A0
|
||
move A0,*A8(OYVAL),L
|
||
|
||
ZoffX:
|
||
mmfm SP,A0,A9
|
||
rets
|
||
**************************************************************************
|
||
|
||
*************************************************************************
|
||
;* This routine looks for the nearest bullet heading toward an enemy.
|
||
;* PARMS:
|
||
;* A8 - Enemy obj ptr
|
||
;* RETURNS:
|
||
;* A5 - ptr to bullet obj (0 if no threatening bullets)
|
||
;* A6 - X distance to bullet
|
||
NEAR_BUL:
|
||
push A9
|
||
clr A5 ;A5 will be pointer to nearest bullet
|
||
move @PLAYER_BULLETS,A1,L
|
||
jrz NO_BULL
|
||
movi 1000,A6 ;A6 is distance of nearest bullet
|
||
move *A8(OZPOS),A4,W
|
||
calla GETANIX
|
||
move A0,A3
|
||
subi 9,A3 ;* 1/2 width of bullet (kluge to cmp w/ mid point)
|
||
move *A8(OYPOS),A7,W
|
||
move *A8(OSIZEY),A9,W
|
||
add A7,A9
|
||
addk Y_NEAR,A9 ;* clearance below feet
|
||
subk 3*Y_NEAR,A7 ;* clearance above head
|
||
|
||
BULL_LP:
|
||
move *A1(OXPOS),A2,W
|
||
sub A3,A2
|
||
jrgt BULL_RGT
|
||
;* Bullet on the left
|
||
move *A1(OXVEL+16),A0,W
|
||
jrn BULL_MIS
|
||
jruc BULL_XOK
|
||
BULL_RGT:
|
||
move *A1(OXVEL+16),A0,W
|
||
jrp BULL_MIS
|
||
|
||
BULL_XOK:
|
||
abs A2 ;A2 is X distance from bullet
|
||
cmp A6,A2 ;is this bullet closer than last?
|
||
jrge BULL_MIS
|
||
|
||
;* check if Z rng is ok
|
||
move *A1(OZPOS),A0,W
|
||
sub A4,A0
|
||
abs A0
|
||
cmpi 15,A0
|
||
jrgt BULL_MIS
|
||
;* check Y rng
|
||
move *A1(OYPOS),A0,W
|
||
cmp A7,A0
|
||
jrlt BULL_MIS ;* bullet will pass above head
|
||
cmp A9,A0
|
||
jrgt BULL_MIS ;* bullet will pass below feet
|
||
|
||
GOT_BULL:
|
||
move A1,A5 ;new closest bullet
|
||
move A2,A6 ;new distance
|
||
BULL_MIS:
|
||
move *A1(OSLINK),A1,L ;* get next bullet and try again
|
||
jrnz BULL_LP
|
||
NO_BULL:
|
||
pull A9
|
||
rets
|
||
*******************************************************************
|
||
|
||
**************************************************************************
|
||
FACINGOB:
|
||
;* ptr to obj in A0
|
||
;* enemy in A8
|
||
;* return setc if facing object
|
||
move *A0(OSIZEX),A1,W
|
||
srl 1,A1
|
||
move *A0(OXPOS),A0,W
|
||
add A0,A1
|
||
calla GETANIX
|
||
sub A0,A1 ;A1 = objX - Xpos
|
||
move *A8(OFLAGS),A0,W
|
||
andi M_FLIPH,A0
|
||
jrz SkFlpN
|
||
neg A1
|
||
SkFlpN:
|
||
move A1,A1
|
||
jrp ISFACING
|
||
|
||
clrc
|
||
rets
|
||
|
||
ISFACING:
|
||
setc
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
FACEOBJ:
|
||
;* ptr to obj in A0
|
||
;* enemy in A8
|
||
;** make Enemy face object
|
||
move *A0(OSIZEX),A1,W
|
||
srl 1,A1
|
||
move *A0(OXPOS),A0,W
|
||
add A0,A1
|
||
calla GETANIX
|
||
cmp A1,A0
|
||
jrgt T_YFLP
|
||
jruc T_NOYFLP
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
FaceObj:
|
||
;* ptr to obj in A0
|
||
;* enemy in A8
|
||
;** make Enemy face object if fliptiks allow...
|
||
move *A0(OSIZEX),A1,W
|
||
srl 1,A1
|
||
move *A0(OXPOS),A0,W
|
||
add A0,A1
|
||
calla GETANIX
|
||
cmp A1,A0
|
||
jrgt Ck_YFLP
|
||
jruc Ck_NOYFLP
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
FACEBULL:
|
||
;* ptr to bullet in A0
|
||
;* enemy in A8
|
||
;** make Enemy face object
|
||
movb *A0(OXVEL+24),A1
|
||
jrnn T_YFLP
|
||
jruc T_NOYFLP
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
FACEAWAY:
|
||
;* ptr to obj in A0
|
||
;* enemy in A8
|
||
;** make Enemy face away from object
|
||
mmtm SP,A0,A1
|
||
move *A0(OSIZEX),A1,W
|
||
srl 1,A1
|
||
move *A0(OXPOS),A0,W
|
||
add A0,A1
|
||
calla GETANIX
|
||
cmp A1,A0
|
||
mmfm SP,A0,A1
|
||
jrlt T_YFLP
|
||
jruc T_NOYFLP
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
FACEFWD:
|
||
;* enemy obj in A8
|
||
;** make Enemy face Forward
|
||
move *A8(OXVEL+16),A0,W
|
||
jrn T_YFLP
|
||
jruc T_NOYFLP
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
FACEBKWD:
|
||
;* enemy obj in A8
|
||
;** make Enemy face Backward
|
||
move *A8(OXVEL+16),A0,W
|
||
jrn T_NOYFLP
|
||
jruc T_YFLP
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
NEARPLYR:
|
||
;Get disp obj of nearest person to shoot at
|
||
; RETURNS A0 - ptr to disp obj or Zero (with Z flag set)
|
||
; DESTROYS A1,A2,A3,A4,A5
|
||
clr A4 ;* A4 is ptr to player to chase
|
||
movi 1000,A5 ;* X distance to first player
|
||
move *A8(OZPOS),A2,W
|
||
move *A8(OXPOS),A3,W
|
||
movi P1DATA,A0
|
||
move *A0(POBJ),A0,L
|
||
jrz TRYP2
|
||
move *A0(OZPOS),A1,W
|
||
sub A2,A1
|
||
abs A1
|
||
cmpi 18,A1
|
||
jrgt TRYP2
|
||
move A0,A4
|
||
move *A0(OXPOS),A5,W
|
||
sub A3,A5
|
||
abs A5
|
||
TRYP2:
|
||
movi P2DATA,A0
|
||
move *A0(POBJ),A0,L
|
||
jrz WhichP
|
||
move *A0(OZPOS),A1,W
|
||
sub A2,A1
|
||
abs A1
|
||
cmpi 20,A1
|
||
jrgt WhichP
|
||
move *A0(OXPOS),A1,W
|
||
sub A3,A1
|
||
abs A1
|
||
cmp A5,A1
|
||
jrgt WhichP
|
||
move A0,A4 ;* player 2 is closer
|
||
WhichP:
|
||
move A4,A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ClosestP:
|
||
;* return A0 - the object pointer of the Closest Player
|
||
mmtm SP,A1,A2,A3,A4,A5,A6
|
||
move *A8(OXPOS),A2,W
|
||
move *A8(OZPOS),A3,W
|
||
|
||
movi >7FFF,A4 ;so P2 can be selected if no P1
|
||
movi P1DATA,A1
|
||
move *A1(POBJ),A1,L
|
||
jrz TryP2
|
||
|
||
move *A1(OXPOS),A4,W
|
||
move *A1(OZPOS),A5,W
|
||
sub A2,A4
|
||
sub A3,A5
|
||
abs A4
|
||
abs A5
|
||
add A5,A4
|
||
|
||
TryP2:
|
||
movi P2DATA,A0
|
||
move *A0(POBJ),A0,L
|
||
jrz ItsP1
|
||
|
||
move *A0(OXPOS),A6,W
|
||
move *A0(OZPOS),A5,W
|
||
sub A2,A6
|
||
sub A3,A5
|
||
abs A6
|
||
abs A5
|
||
add A5,A6
|
||
|
||
cmp A4,A6
|
||
jrle GotCP
|
||
|
||
ItsP1:
|
||
move A1,A0
|
||
GotCP:
|
||
mmfm SP,A1,A2,A3,A4,A5,A6
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
**************************************************************************
|
||
ClosestFP:
|
||
;* return A0 - the object pointer of the Closest Player that is being faced.
|
||
; 0 if neither player is being faced.
|
||
|
||
mmtm SP,A1,A2,A3,A4,A5,A6,A7
|
||
move *A8(OXPOS),A2,W
|
||
move *A8(OZPOS),A3,W
|
||
|
||
movi >7FFF,A4 ;so P2 can be selected if no P1
|
||
movi P1DATA,A1
|
||
move *A1(POBJ),A1,L
|
||
jrz NotP1
|
||
|
||
move *A1(OXPOS),A4,W
|
||
sub A2,A4
|
||
;* are we facing this player
|
||
jrn PonLft1
|
||
;player is to the right
|
||
move *A8(OFLAGS),A7,W
|
||
btst B_FLIPH,A7
|
||
jrnz NotP1
|
||
jruc Fok1
|
||
PonLft1:
|
||
move *A8(OFLAGS),A7,W
|
||
btst B_FLIPH,A7
|
||
jrz NotP1
|
||
Fok1:
|
||
|
||
move *A1(OZPOS),A5,W
|
||
sub A3,A5
|
||
abs A4
|
||
abs A5
|
||
add A5,A4
|
||
jruc FTryP2
|
||
NotP1:
|
||
clr A1
|
||
FTryP2:
|
||
movi P2DATA,A0
|
||
move *A0(POBJ),A0,L
|
||
jrz FItsP1
|
||
|
||
move *A0(OXPOS),A6,W
|
||
sub A2,A6
|
||
;* are we facing this player
|
||
jrn PonLft2
|
||
;player is to the right
|
||
move *A8(OFLAGS),A7,W
|
||
btst B_FLIPH,A7
|
||
jrnz NotP2
|
||
jruc Fok2
|
||
PonLft2:
|
||
move *A8(OFLAGS),A7,W
|
||
btst B_FLIPH,A7
|
||
jrz NotP2
|
||
Fok2:
|
||
|
||
move *A0(OZPOS),A5,W
|
||
sub A3,A5
|
||
abs A6
|
||
abs A5
|
||
add A5,A6
|
||
|
||
cmp A4,A6
|
||
jrle FGotCP
|
||
|
||
NotP2:
|
||
FItsP1:
|
||
move A1,A0
|
||
FGotCP:
|
||
mmfm SP,A1,A2,A3,A4,A5,A6,A7
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
**************************** Flee **************************************
|
||
Flee:
|
||
;* Goes through DestTbl looking for the offset from the enemy which
|
||
;* places the enemy furthest from any players. This offset is then
|
||
;* added to current coors to generate a dest, and course is set for the dest.
|
||
|
||
;* TRASHES B0,B1,B2,B3,B4,B5
|
||
mmtm SP,A0,A1,A2,A3,A4,A5,A6,A7,A11,A14
|
||
|
||
move A8,A7 ;save pimps obj ptr
|
||
|
||
;* stuff B2 = PIMP Z:X
|
||
calla GETANIX
|
||
move *A8(OZPOS),A1,W
|
||
sll 16,A1
|
||
movy A1,A0
|
||
move A0,B2
|
||
|
||
;* stuff A1 = Plyr1 Z:X
|
||
movi P1DATA,A8
|
||
move *A8(POBJ),A8,L
|
||
jrz NoP1
|
||
calla GETANIX
|
||
move *A8(OZPOS),A1,W
|
||
sll 16,A1
|
||
movx A0,A1
|
||
jruc GetP2
|
||
NoP1:
|
||
clr A1
|
||
|
||
GetP2:
|
||
;* stuff A2 = Plyr2 Z:X
|
||
movi P2DATA,A8
|
||
move *A8(POBJ),A8,L
|
||
jrz NoP2
|
||
calla GETANIX
|
||
move *A8(OZPOS),A2,W
|
||
sll 16,A2
|
||
movx A0,A2
|
||
jruc GotP2
|
||
NoP2:
|
||
clr A2
|
||
GotP2:
|
||
move A7,A8 ;restore pimps obj ptr
|
||
|
||
;* stuff B3 = Top Left Z:X
|
||
;* stuff B4 = Bot Right Z:X
|
||
move @(WORLDTLX+16),B3,W
|
||
move B3,B4
|
||
move @PLZMIN,B0,W
|
||
sll 16,B0
|
||
movy B0,B3
|
||
addi 511,B4
|
||
move @PLZMAX,B0,W
|
||
sll 16,B0
|
||
movy B0,B4
|
||
|
||
clr A5 ;Best distance for dest (big is good)
|
||
movk 6,B0 ;# times to check for flee dest
|
||
movi DestTbl,B5
|
||
movk 12,A0
|
||
calla RANDU
|
||
dec A0
|
||
sll 5,A0
|
||
move A0,B1
|
||
add B1,B5 ;B5 1st entry in dest tbl to check
|
||
|
||
FleeLp:
|
||
callr GenFleeD ;rets dest in A0
|
||
callr EvFleeD ;rets A0 unchanged, A7 - dist to near plyr
|
||
cmp A5,A7
|
||
jrle NxtFD
|
||
;* Got a Better Dest
|
||
move A0,A6
|
||
move A7,A5
|
||
NxtFD:
|
||
dsjs B0,FleeLp
|
||
|
||
;* A6 is Best dest..
|
||
move A6,*A13(DEST),L
|
||
move *A13(FUNCS),A0,L
|
||
addi GODEST,A0
|
||
move *A0,A0,L
|
||
call A0
|
||
mmfm SP,A0,A1,A2,A3,A4,A5,A6,A7,A11,A14
|
||
rets
|
||
|
||
|
||
;***************************
|
||
GenFleeD:
|
||
; generate a valid destination to flee toward.
|
||
; return as A0
|
||
;NEEDS B2 - Pimp Z:X
|
||
; B3 - playfield TL Z:X
|
||
; B4 - playfield BR Z:X
|
||
; B5 - DestTbl
|
||
|
||
movk 5,A0 ;Max # times to check for on screen
|
||
|
||
GetDstLp:
|
||
dec A0
|
||
jrz GotFD
|
||
cmpi DestTblX,B5
|
||
jrnz SkRstDT
|
||
movi DestTbl,B5
|
||
SkRstDT:
|
||
move *B5+,B1,L
|
||
addxy B2,B1
|
||
cmpxy B3,B1 ;Compare against TL
|
||
jrxlt GetDstLp
|
||
jrylt GetDstLp
|
||
cmpxy B4,B1 ;Compare against BR
|
||
jrxgt GetDstLp
|
||
jrygt GetDstLp
|
||
GotFD:
|
||
move B1,A0
|
||
rets
|
||
|
||
EvFleeD:
|
||
;* evaluate a flee destination
|
||
; the value is the nearest distance to a player
|
||
; check distance at midpoint and endpoint..
|
||
|
||
; A0 - flee dest
|
||
; A1 - Plyr 1 Z:X
|
||
; A2 - Plyr 2 Z:X
|
||
;
|
||
;returns dist to nearest plyr in A7
|
||
|
||
movi >7FFF,A7
|
||
move A1,A14
|
||
jrz GetP2Dst
|
||
subxy A0,A14
|
||
move A14,A7
|
||
sext A7,W
|
||
abs A7
|
||
sra 16,A14
|
||
abs A14
|
||
add A14,A7
|
||
|
||
GetP2Dst:
|
||
move A2,A14
|
||
jrz EvFDX
|
||
subxy A0,A14
|
||
move A14,A11
|
||
sext A11,W
|
||
abs A11
|
||
sra 16,A14
|
||
abs A14
|
||
add A14,A11
|
||
|
||
cmp A11,A7
|
||
jrle EvFDX
|
||
move A11,A7
|
||
|
||
EvFDX:
|
||
rets
|
||
**************************************************************************
|
||
|
||
|
||
**************************************************************************
|
||
FleeObj:
|
||
;* ptr to obj to flee in A0
|
||
move *A8(OXPOS),A1,W
|
||
move *A8(OZPOS),A2,W
|
||
move *A0(OXPOS),A3,W
|
||
move *A0(OZPOS),A4,W
|
||
|
||
movi 100,A0
|
||
calla RANDU
|
||
addi 50,A0
|
||
move A3,A5
|
||
sub A1,A5
|
||
jrn NoNegX
|
||
neg A0
|
||
NoNegX:
|
||
add A1,A0
|
||
move A0,A6 ;A6 - New X Dest
|
||
|
||
;* generate Z dest
|
||
movi 40,A0
|
||
calla RANDU
|
||
addk 20,A0
|
||
move A4,A5
|
||
sub A2,A5
|
||
jrn NoNegZ
|
||
neg A0
|
||
NoNegZ:
|
||
add A2,A0
|
||
|
||
move @PLZMIN,A1,W
|
||
addk 5,A1
|
||
move @PLZMAX,A2,W
|
||
subk 5,A2
|
||
cmp A1,A0
|
||
jrle SetEvZ
|
||
cmp A2,A0
|
||
jrlt ZSet
|
||
SetEvZ:
|
||
; add A2,A1
|
||
; srl 1,A1
|
||
; move A1,A0
|
||
move A1,B0
|
||
move A2,B1
|
||
calla RANGRAND
|
||
ZSet:
|
||
sll 16,A0
|
||
movx A6,A0
|
||
move A0,*A13(DEST),L
|
||
move *A13(FUNCS),A0,L
|
||
addi GODEST,A0
|
||
move *A0,A0,L
|
||
call A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
HuntObj:
|
||
;* chase after the object in WANTOBJ
|
||
move *A13(WANTOBJ),A0,L
|
||
HuntObj0:
|
||
move *A0(OXPOS),A1,W
|
||
move *A0(OSIZEX),A2,W
|
||
srl 1,A2
|
||
add A2,A1
|
||
move *A0(OZPOS),A2,W
|
||
sll 16,A2
|
||
movy A2,A1
|
||
move A1,*A13(DEST),L
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ShortXDest:
|
||
;* reduce Xdes by amount in A0
|
||
move *A13(DEST),A1,W ;Get X portion of destination
|
||
move *A8(OXPOS),A2,W
|
||
sub A1,A2
|
||
jrn ShortOK
|
||
neg A0
|
||
ShortOK:
|
||
sub A0,A1 ;reduce X destination
|
||
move A1,*A13(DEST),W
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
MAX:
|
||
;* returns max of A0,A1 in A0
|
||
cmp A1,A0
|
||
jrge GotMax
|
||
move A1,A0
|
||
GotMax:
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
MIN:
|
||
;* returns min of A0,A1 in A0
|
||
cmp A1,A0
|
||
jrle GotMin
|
||
move A1,A0
|
||
GotMin:
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ABSMAX:
|
||
;* returns A1 Clipped at the value A0 in either pos or neg direction
|
||
;parm A0 must be pos
|
||
;A0 will be negated if A1 is neg
|
||
move A1,A1
|
||
jrn NegMax
|
||
cmp A0,A1
|
||
jrle MAXOK
|
||
move A0,A1
|
||
rets
|
||
NegMax:
|
||
neg A0
|
||
cmp A0,A1
|
||
jrge MAXOK
|
||
move A0,A1
|
||
MAXOK:
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ABSINC:
|
||
move A0,A0
|
||
jrn DECX
|
||
inc A0
|
||
rets
|
||
DECX:
|
||
dec A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ABSDEC:
|
||
move A0,A0
|
||
jrz ABSDECX
|
||
jrn INCX
|
||
dec A0
|
||
rets
|
||
INCX:
|
||
inc A0
|
||
ABSDECX:
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ABSSUB:
|
||
;* absolutely subtracts A1 from A0, A0 can't change signs
|
||
move A0,A0
|
||
jrz ABSSUBX
|
||
jrn SUBX
|
||
sub A1,A0
|
||
jrp SUBX1
|
||
clr A0
|
||
SUBX1:
|
||
rets
|
||
SUBX:
|
||
add A1,A0
|
||
jrn SUBX2
|
||
clr A0
|
||
SUBX2:
|
||
ABSSUBX:
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ABSADD:
|
||
;* absolutely ADD A1 to A0
|
||
move A0,A0
|
||
jrn ADDX
|
||
add A1,A0
|
||
rets
|
||
ADDX:
|
||
sub A1,A0
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
XTOZSIZE:
|
||
mmtm SP,A0,A1
|
||
move *A8(OSIZEX),A0,W
|
||
srl 1,A0
|
||
move A0,A1
|
||
sll 16,A1
|
||
add A1,A0
|
||
move A0,*A8(OZSIZ),L
|
||
mmfm SP,A0,A1
|
||
rets
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
ClrVel:
|
||
clr A0
|
||
move A0,*A8(OXVEL),L
|
||
move A0,*A8(OYVEL),L
|
||
move A0,*A8(OZVEL),L
|
||
rets
|
||
**************************************************************************
|
||
|
||
*************************************************************************
|
||
UpdShadV:
|
||
mmtm SP,A0,A1
|
||
move *A8(OSHAD),A0,L
|
||
jrz UpdShX
|
||
move *A8(OXVEL),A1,L
|
||
move A1,*A0(OXVEL),L
|
||
move *A8(OZVEL),A1,L
|
||
move A1,*A0(OYVEL),L
|
||
move A1,*A0(OZVEL),L
|
||
UpdShX:
|
||
mmfm SP,A0,A1
|
||
rets
|
||
*************************************************************************
|
||
|
||
*************************************************************************
|
||
;* This routine looks for the nearest object of type obj Id
|
||
;* PARMS:
|
||
;* A0 - Obj Id
|
||
;* NEAR_OBJ entry pt, A1 - SLIST to search
|
||
;* RETURNS:
|
||
;* A0 - ptr to obj (0 if no close objs)
|
||
NEAR_BTY:
|
||
move @BOOTY,A1,L
|
||
NEAR_OBJ:
|
||
move A1,A1
|
||
jrz NOBOOTY
|
||
clr A5 ;A5 will be pointer to nearest obj
|
||
move A0,A3
|
||
zext A3,W ;A3 obj ID
|
||
movi 1000,A6 ;A6 is distance of nearest booty
|
||
calla GETANIX
|
||
BOOTY_LP:
|
||
move *A1(OID),A2,W
|
||
zext A2,W
|
||
cmp A2,A3
|
||
jrnz BOOTYMIS
|
||
move *A1(OPLINK),A2,L ;if booty has a proc (flying), skip it..
|
||
jrnz BOOTYMIS
|
||
move *A1(OXPOS),A2,W
|
||
sub A0,A2
|
||
abs A2
|
||
cmp A6,A2
|
||
jrgt BOOTYMIS
|
||
GOTBOOTY:
|
||
move A1,A5 ;new closest booty
|
||
move A2,A6 ;new distance
|
||
BOOTYMIS:
|
||
move *A1(OSLINK),A1,L ;* get next item and try again
|
||
jrnz BOOTY_LP
|
||
BOOTYX:
|
||
move A5,A0
|
||
jrz NOBOOTY
|
||
setc
|
||
rets
|
||
NOBOOTY:
|
||
clrc
|
||
rets
|
||
*******************************************************************
|
||
|
||
*************************************************************************
|
||
;* Check if obj A0 is on supplemental list A1
|
||
;* PARMS:
|
||
;* A0 - Obj ptr, A1 - supplemental list
|
||
;* RETURNS:
|
||
;* setc if obj on list
|
||
ON_SLIST:
|
||
move A1,A1
|
||
jrz OffList
|
||
CK_LP:
|
||
cmp A0,A1
|
||
jrz OnList
|
||
move *A1(OSLINK),A1,L ;* get next item and try again
|
||
jrnz CK_LP
|
||
OffList:
|
||
clrc
|
||
rets
|
||
OnList:
|
||
setc
|
||
rets
|
||
*******************************************************************
|
||
|
||
*******************************************************************
|
||
CLROBJ:
|
||
mmtm SP,A1,A2,A3
|
||
move A0,A1
|
||
movi OBSIZ/16,A2
|
||
clr A3
|
||
ClrObjLp:
|
||
move A3,*A1+,W
|
||
dsjs A2,ClrObjLp
|
||
mmfm SP,A1,A2,A3
|
||
rets
|
||
*******************************************************************
|
||
|
||
*******************************************************************
|
||
BullSlp:
|
||
;* generate Sleep Time for Bullet Before striking wall or
|
||
;* Going off bottom of screen
|
||
;* PARMS A0 - MAX Sleep Time if Bullet doesn't hit wall or go off screen
|
||
;* RETS A0 - SLEEP TIME
|
||
; A11 - cleared if bullet doesn't strike bgnd wall, else set
|
||
|
||
mmtm SP,A1,A2,A3
|
||
clr A11 ;A11 set if bullet strikes bgnd
|
||
move *A8(OZVEL),A1,L
|
||
move A1,A2
|
||
abs A2
|
||
srl 8,A2
|
||
jrz GotBSlp
|
||
move A1,A1
|
||
jrn BHitWall
|
||
|
||
;* bullet going off Bot of Screen
|
||
move @PLZMAX,A3,W
|
||
addi 60,A3
|
||
move *A8(OZPOS),A1,W
|
||
sub A1,A3
|
||
jruc CalcBSlp
|
||
|
||
BHitWall: ;* bullet has neg Z, it will hit the wall
|
||
movk 1,A11 ;hit wall flag
|
||
move *A8(OZPOS),A3,W
|
||
move @PLZMIN,A1,W
|
||
sub A1,A3
|
||
|
||
CalcBSlp:
|
||
sll 16,A3
|
||
divu A2,A3
|
||
srl 8,A3
|
||
cmp A0,A3
|
||
jrls SkUseMax
|
||
clr A11 ;clear wall hit flag
|
||
move A0,A3
|
||
SkUseMax:
|
||
move A3,A0
|
||
GotBSlp:
|
||
mmfm SP,A1,A2,A3
|
||
rets
|
||
*******************************************************************
|
||
|
||
*******************************************************************
|
||
SyncAnim:
|
||
;PARMS A0 ptr to animation script
|
||
; A1 # tiks of anim to skip
|
||
;RETURNS A0 ptr to frame to be animated
|
||
; A1 # tiks to sleep on that frame
|
||
mmtm SP,A7,A9,A10,A11
|
||
move A0,A10
|
||
clr A7
|
||
FrstFrme:
|
||
move A10,A9
|
||
GetSlpLp:
|
||
move *A9,A0,L ;FRAME
|
||
jrnz GotNxtFr
|
||
AniDcLp:
|
||
cmp A7,A1
|
||
jrlt FrstFrme
|
||
sub A7,A1
|
||
jruc AniDcLp
|
||
GotNxtFr:
|
||
move A9,A11 ;hang onto frame ptr
|
||
addk 32,A9
|
||
move *A9+,A0,W ;BITS|Sleep Time
|
||
btst BSPAWNP,A0
|
||
jrz SPAWNSk1
|
||
addi >50,A9
|
||
SPAWNSk1:
|
||
btst BFLIPBIT,A0
|
||
jrz FLIPSk1
|
||
addi 16,A9
|
||
FLIPSk1:
|
||
btst BNEWPAL,A0
|
||
jrz PALSk1
|
||
addk 16,A9
|
||
PALSk1:
|
||
andi >FFF,A0
|
||
cmp A1,A0
|
||
jrgt GotFrm
|
||
sub A0,A1
|
||
add A0,A7
|
||
jruc GetSlpLp
|
||
GotFrm:
|
||
sub A1,A0
|
||
move A0,A1 ;sleep for remaining tiks of frame
|
||
move A11,A0 ;get ptr to the frame
|
||
mmfm SP,A7,A9,A10,A11
|
||
rets
|
||
*******************************************************************
|
||
|
||
*******************************************************************
|
||
SumSlp:
|
||
;PARMS A0 ptr to animation script
|
||
;RETURNS A0 sum of sleep times for animation script
|
||
mmtm SP,A1,A9
|
||
move A0,A9
|
||
clr A1 ;A1 sum up sleep times
|
||
SlpSumLp:
|
||
move *A9+,A0,L ;FRAME
|
||
jreq SlpSumX ;BR = END WAS HIT
|
||
move *A9+,A0,W ;BITS|Sleep Time
|
||
btst BSPAWNP,A0
|
||
jrz SPAWNSk
|
||
addi >50,A9
|
||
SPAWNSk:
|
||
btst BFLIPBIT,A0
|
||
jrz FLIPSk
|
||
addi 16,A9
|
||
FLIPSk:
|
||
btst BNEWPAL,A0
|
||
jrz PALSk
|
||
addk 16,A9
|
||
PALSk:
|
||
andi >FFF,A0
|
||
add A0,A1
|
||
jruc SlpSumLp
|
||
SlpSumX:
|
||
move A1,A0
|
||
mmfm SP,A1,A9
|
||
rets
|
||
*******************************************************************
|
||
|
||
|
||
*******************************************************************
|
||
SPLTCOLBOX:
|
||
.WORD B1OID|BULLETID
|
||
.LONG SPLTCOL0
|
||
.WORD B1OID|ROCKETID
|
||
.LONG SPLTCOL0
|
||
.WORD B2OID|BULLETID
|
||
.LONG SPLTCOL0
|
||
.WORD B2OID|ROCKETID
|
||
.LONG SPLTCOL0
|
||
.WORD 0
|
||
.LONG DUMRTSG
|
||
*******************************************************************
|
||
*MAKE MORE BLOOD COLLSION ROUTINE
|
||
*A0 = PTR TO ENEMY OBJECT
|
||
*A8 = PTR TO OBJECT THAT SMASHED HIM
|
||
SPLTCOL0:
|
||
MOVE *A8(OID),A11,W
|
||
move *A8(OYPOS),A9,W
|
||
MOVI 0EDh,A1
|
||
movi SPLATBOX,A7
|
||
MOVE A0,A8 ;PASS WASTED GUYS POINTER
|
||
CALLA GETPRC
|
||
|
||
CLRC ;Don't delete in Coll routine
|
||
rets
|
||
*******************************************************************
|
||
|
||
*******************************************************************
|
||
SPLTCOLANI:
|
||
.WORD B1OID|BULLETID
|
||
.LONG SPLTCOL1
|
||
.WORD B1OID|ROCKETID
|
||
.LONG SPLTCOL1
|
||
.WORD B2OID|BULLETID
|
||
.LONG SPLTCOL1
|
||
.WORD B2OID|ROCKETID
|
||
.LONG SPLTCOL1
|
||
.WORD 0
|
||
.LONG DUMRTSG
|
||
*******************************************************************
|
||
*MAKE MORE BLOOD COLLSION ROUTINE
|
||
*A0 = PTR TO ENEMY OBJECT
|
||
*A8 = PTR TO OBJECT THAT SMASHED HIM
|
||
SPLTCOL1:
|
||
MOVE *A8(OID),A11,W
|
||
move *A8(OYPOS),A9,W
|
||
MOVI 0EDh,A1
|
||
movi SPLATANI,A7
|
||
MOVE A0,A8 ;PASS WASTED GUYS POINTER
|
||
CALLA GETPRC
|
||
|
||
CLRC ;Don't delete in Coll routine
|
||
rets
|
||
*******************************************************************
|
||
|
||
**************************************************************************
|
||
* BLOOD SPLATTER PROCESS x positioning on animation pt.
|
||
* A8 = Obj ptr of guy hit
|
||
* A9 = Y POS of killer
|
||
* A11 - OID of killer
|
||
SPLATANI:
|
||
ADJUST ADJGORE
|
||
JRNZ NOSPLAT
|
||
|
||
move A8,A10 ;keep ptr to victims obj
|
||
SLL 28,A11
|
||
SRL 28,A11
|
||
CMPI ROCKETID,A11,W
|
||
JREQ NOSPLAT ;DEATH BY ROCKET
|
||
CMPI EXPLODID,A11,W
|
||
JREQ NOSPLAT ;DEATH BY EXPLOSION
|
||
calla GETOBJ
|
||
jrz NOSPLAT
|
||
movi SPLTINIT,A14
|
||
calla STFOBJ
|
||
move A0,A8
|
||
move A9,*A8(OYPOS),W
|
||
move *A10(OYPOS),A1,W
|
||
sub A1,A9
|
||
sll 16,A9
|
||
move *A10(OSIZEY),A1,W
|
||
divu A1,A9
|
||
move A9,A11
|
||
clr A9
|
||
move A9,*A8(OPAL),W
|
||
|
||
clr A0
|
||
move A0,*A8(OZPOS),W
|
||
move A0,*A8(OXPOS),W
|
||
movb A0,*A13(ANIMTIKS)
|
||
movi BSPLAT,A9
|
||
move A8,A0
|
||
calla INSOBJ
|
||
SpltLp:
|
||
move *A10(OZPOS),A1,W
|
||
inc A1
|
||
move *A8(OZPOS),A3,W
|
||
jrz StfZ0
|
||
sub A1,A3
|
||
abs A3
|
||
cmpi 64,A3
|
||
jrgt SpltX
|
||
StfZ0:
|
||
move A1,*A8(OZPOS),W
|
||
move A8,A7
|
||
move A10,A8
|
||
calla GETANIX
|
||
move A7,A8
|
||
move *A8(OSIZEX),A2,W
|
||
srl 1,A2
|
||
sub A2,A0
|
||
move *A8(OXPOS),A3,W
|
||
jrz StfX0
|
||
sub A0,A3
|
||
abs A3
|
||
cmpi 64,A3
|
||
jrgt SpltX
|
||
StfX0:
|
||
move A0,*A8(OXPOS),W
|
||
move *A10(OSIZEY),A1,W
|
||
mpyu A11,A1
|
||
srl 16,A1
|
||
move *A10(OYPOS),A2,W
|
||
add A2,A1
|
||
move *A8(OSIZEY),A2,W
|
||
srl 1,A2
|
||
sub A2,A1
|
||
move *A8(OYPOS),A3,W
|
||
sub A1,A3
|
||
abs A3
|
||
cmpi 64,A3
|
||
jrgt SpltX
|
||
move A1,*A8(OYPOS),W
|
||
|
||
movb *A13(ANIMTIKS),A0
|
||
jrnz AnimX
|
||
movk 4,A1 ;* one frame, no sleepin
|
||
jsrp FRANIM
|
||
move *A9,A1,L
|
||
jrz SpltX
|
||
AnimX:
|
||
dec A0
|
||
movb A0,*A13(ANIMTIKS)
|
||
movk 1,A0
|
||
calla PRCSLP
|
||
jruc SpltLp
|
||
|
||
SpltX:
|
||
move A8,A0
|
||
calla DELOBJ
|
||
NOSPLAT:
|
||
DIE
|
||
**********************************************************************
|
||
|
||
**************************************************************************
|
||
* BLOOD SPLATTER PROCESS X positioning on middle of frames
|
||
* A8 = Obj ptr of guy hit
|
||
* A9 = Y POS of killer
|
||
* A11 - OID of killer
|
||
SPLATBOX:
|
||
ADJUST ADJGORE
|
||
JRNZ NOSPLAT1
|
||
|
||
move A8,A10 ;keep ptr to victims obj
|
||
SLL 28,A11
|
||
SRL 28,A11
|
||
CMPI ROCKETID,A11,W
|
||
JREQ NOSPLAT1 ;DEATH BY ROCKET
|
||
CMPI EXPLODID,A11,W
|
||
JREQ NOSPLAT1 ;DEATH BY EXPLOSION
|
||
calla GETOBJ
|
||
jrz NOSPLAT1
|
||
movi SPLTINIT,A14
|
||
calla STFOBJ
|
||
move A0,A8
|
||
move A9,*A8(OYPOS),W
|
||
move *A10(OYPOS),A1,W
|
||
sub A1,A9
|
||
sll 16,A9
|
||
move *A10(OSIZEY),A1,W
|
||
divu A1,A9
|
||
move A9,A11
|
||
clr A9
|
||
move A9,*A8(OPAL),W
|
||
|
||
clr A0
|
||
move A0,*A8(OZPOS),W
|
||
move A0,*A8(OXPOS),W
|
||
movb A0,*A13(ANIMTIKS)
|
||
movi BSPLAT,A9
|
||
move A8,A0
|
||
calla INSOBJ
|
||
SpltLp1:
|
||
move *A10(OZPOS),A1,W
|
||
inc A1
|
||
move *A8(OZPOS),A3,W
|
||
jrz StfZ1
|
||
sub A1,A3
|
||
abs A3
|
||
cmpi 64,A3
|
||
jrgt SpltX1
|
||
StfZ1:
|
||
move A1,*A8(OZPOS),W
|
||
move *A10(OXPOS),A1,W
|
||
move *A10(OSIZEX),A2,W
|
||
srl 1,A2
|
||
add A2,A1
|
||
move *A8(OSIZEX),A2,W
|
||
srl 1,A2
|
||
sub A2,A1
|
||
move *A8(OXPOS),A3,W
|
||
jrz StfX1
|
||
sub A1,A3
|
||
abs A3
|
||
cmpi 64,A3
|
||
jrgt SpltX1
|
||
StfX1:
|
||
move A1,*A8(OXPOS),W
|
||
move *A10(OSIZEY),A1,W
|
||
mpyu A11,A1
|
||
srl 16,A1
|
||
move *A10(OYPOS),A2,W
|
||
add A2,A1
|
||
move *A8(OSIZEY),A2,W
|
||
srl 1,A2
|
||
sub A2,A1
|
||
move *A8(OYPOS),A3,W
|
||
sub A1,A3
|
||
abs A3
|
||
cmpi 64,A3
|
||
jrgt SpltX1
|
||
move A1,*A8(OYPOS),W
|
||
|
||
movb *A13(ANIMTIKS),A0
|
||
jrnz AnimX1
|
||
movk 4,A1 ;* one frame, no sleepin
|
||
jsrp FRANIM
|
||
move *A9,A1,L
|
||
jrz SpltX1
|
||
AnimX1:
|
||
dec A0
|
||
movb A0,*A13(ANIMTIKS)
|
||
movk 1,A0
|
||
callA PRCSLP
|
||
jruc SpltLp1
|
||
|
||
SpltX1:
|
||
move A8,A0
|
||
calla DELOBJ
|
||
NOSPLAT1:
|
||
DIE
|
||
**********************************************************************
|
||
|
||
**************************************
|
||
* STATIC BLOOD SPLATTER PROCESS
|
||
* A9 = Y:X OFFSET FROM KILLER OBJECT
|
||
* A8 = killer OBJECT
|
||
**************************************
|
||
SPLATS:
|
||
ADJUST ADJGORE
|
||
JRNZ NOSPLATS
|
||
CALLA GETANIXY
|
||
SRL 16,A3
|
||
ADDXY A9,A2
|
||
MOVE *A8(OFLAGS),A0,W
|
||
BTST B_FLIPH,A0
|
||
JREQ SPLATS0
|
||
NEG A9
|
||
SPLATS0:
|
||
ADDXY A9,A3
|
||
MOVY A2,A3
|
||
calla GETOBJ
|
||
jrz NOSPLATS
|
||
movi SPLTINIT,A14
|
||
calla STFOBJ
|
||
MOVE *A8(OZPOS),A1,W
|
||
ADDI 6,A1
|
||
MOVE A1,*A0(OZPOS),W
|
||
move A0,A8
|
||
MOVE A3,A0
|
||
MOVE *A8(OSIZEX),A1
|
||
SRL 1,A1
|
||
SUB A1,A0 ;SUBTRACT 1/2 WIDTH
|
||
MOVE A0,*A8(OXPOS),W
|
||
SRL 16,A3
|
||
MOVE A3,*A8(OYPOS),W
|
||
clr A9
|
||
move A9,*A8(OPAL),W
|
||
|
||
move A8,A0
|
||
calla INSOBJ
|
||
movi BSPLAT,A9
|
||
movk 1,A1 ;DO IT UNTIL THE END
|
||
jsrp FRANIM
|
||
move A8,A0
|
||
calla DELOBJ
|
||
NOSPLATS:
|
||
DIE
|
||
**********************************************************************
|
||
|
||
|
||
*************************************************************************
|
||
;* THESE ROUTINES WILL PUT THE BONUS OUT CENTERED ON THE BOTTOM OF THE
|
||
;* OBJECT IN A8
|
||
; ptr to player data in A2
|
||
PUT1K:
|
||
mmtm SP,A0,A1,A7,A8,A9,A10,A11
|
||
movi K1IMG,A11
|
||
jruc MAKEBON
|
||
PUT2x5K:
|
||
mmtm SP,A0,A1,A7,A8,A9,A10,A11
|
||
movi K2x5IMG,A11
|
||
jruc MAKEBON
|
||
PUT5K:
|
||
mmtm SP,A0,A1,A7,A8,A9,A10,A11
|
||
movi K5IMG,A11
|
||
jruc MAKEBON
|
||
PUT10K:
|
||
mmtm SP,A0,A1,A7,A8,A9,A10,A11
|
||
movi K10IMG,A11
|
||
jruc MAKEBON
|
||
PUT25K:
|
||
mmtm SP,A0,A1,A7,A8,A9,A10,A11
|
||
movi K25IMG,A11
|
||
; jruc MAKEBON
|
||
MAKEBON:
|
||
calla GETANIX
|
||
move A0,A9
|
||
move *A8(OYPOS),A10,W
|
||
move *A8(OSIZEY),A0,W
|
||
srl 1,A0
|
||
add A0,A10
|
||
|
||
move A2,A8
|
||
CREATE INDPID,PUTBONUS
|
||
|
||
mmfm SP,A0,A1,A7,A8,A9,A10,A11
|
||
rets
|
||
*************************************************************************
|
||
|
||
*************************************************************************
|
||
PUTBONUS:
|
||
;PARMS
|
||
; A8 ptr to player data
|
||
; A9-XPOS for center of bonus
|
||
; A10-YPOS for top of bonus
|
||
; A11-ptr to frame to use for bonus
|
||
move A8,A2
|
||
;* create bonus image
|
||
calla GETOBJ
|
||
jrz BONUSX
|
||
move A0,A8
|
||
movi BONINIT,A14
|
||
calla STFOBJ
|
||
move A13,*A0(OPLINK),L
|
||
|
||
;* allocate palette
|
||
MOVI NARCS,A0
|
||
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
|
||
jrz NoPal
|
||
MOVE A0,*A8(OPAL),W
|
||
|
||
movi >8000|M_WRNONZ|M_NOCOLL,A4
|
||
move A11,A1
|
||
calla ANI
|
||
|
||
;Set The Coors
|
||
move *A8(OSIZEX),A0,W
|
||
srl 1,A0
|
||
sub A0,A9
|
||
move A9,*A8(OXPOS),W
|
||
move A10,*A8(OYPOS),W
|
||
movi 1000,A0
|
||
move A0,*A8(OZPOS),W
|
||
|
||
move A8,A0
|
||
calla INSOBJ
|
||
|
||
movi 120,A4
|
||
jsrp FLYTOPL
|
||
|
||
;* delete bonus image
|
||
move *A8(OPAL),A0,W
|
||
calla FREEPAL
|
||
move A8,A0
|
||
calla DELOBJ
|
||
BONUSX:
|
||
DIE
|
||
NoPal:
|
||
;* must free the obj
|
||
move A8,A0
|
||
calla FREEOBJ
|
||
jruc BONUSX
|
||
*************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FLYTOPL - SEND AN OBJECT TO THE PLAYER STATUS AREA. *
|
||
* A2 = PTR TO PLAYER DATA *
|
||
* A4 = TRAVEL TIME IN TICKS *
|
||
* A8 = PTR TO OBJECT *
|
||
* RETURNS WHEN THE OBJECT HAS MADE IT. *
|
||
* NOTE: CALL WITH JSRP *
|
||
* *
|
||
**************************************************************************
|
||
FLYTOPL
|
||
PUSHP A2
|
||
CALLA PSTOP
|
||
MOVE *A2(PSCRAD),A3,L ;SET UP FOR EFFECT
|
||
|
||
MOVE A8,A0
|
||
CALLA GSCRNREL
|
||
SRL 16,A1
|
||
MOVX A1,A2
|
||
CALLA SLINEVEL ;GET THE VELOCITIES
|
||
FLYTOP1
|
||
MOVE A1,*A8(OXVEL),L
|
||
MOVE A2,*A8(OYVEL),L ;STUFF THE VELOCITIES
|
||
MMTM A12,A1,A2
|
||
MOVE A8,A0
|
||
CALLA SCRNRELV ;MAKE THE VELOCITIES SCREEN RELATIVE
|
||
SLEEP 1
|
||
MMFM A12,A1,A2
|
||
CALLA SCRTST ;CHECK FOR OFF SCREEN
|
||
JREQ FLYTOP1
|
||
PULLP A2
|
||
RETP
|
||
**************************************************************************
|
||
|
||
|
||
SPLTINIT:
|
||
.LONG 0,0,0,0
|
||
.WORD 0,0
|
||
.LONG blood1,0,DUMCOLL
|
||
.WORD DMAWNZ,JUNKOID
|
||
.LONG 0
|
||
BONINIT:
|
||
.LONG 0,0,0,0
|
||
.WORD 0,0
|
||
.LONG K1IMG,0,DUMCOLL
|
||
.WORD DMAWNZ,JUNKOID
|
||
.LONG 0
|
||
|
||
|
||
|
||
BSPLAT:
|
||
.long blood1
|
||
.word 6
|
||
.long blood2
|
||
.word 6
|
||
.long blood3a
|
||
.word 6
|
||
.long blood2
|
||
.word 6
|
||
LONGNULL
|
||
|
||
DestTbl:
|
||
;* x offset, z offset
|
||
.word 80, 0
|
||
.word -80, 0
|
||
.word 60, 20
|
||
.word 60,-20
|
||
.word -60, 20
|
||
.word -60,-20
|
||
.word 60, 40
|
||
.word 60,-40
|
||
.word -60, 40
|
||
.word -60,-40
|
||
.word 0, 60
|
||
.word 0,-60
|
||
DestTblX:
|
||
|