narc/NARC/NARCUTIL.ASM

2348 lines
47 KiB
NASM
Raw Normal View History

2021-04-06 14:36:38 -07:00
.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: