3803 lines
78 KiB
NASM
3803 lines
78 KiB
NASM
.MLIB "GXMACS.LIB"
|
||
.FILE "GXWARREN.ASM"
|
||
.TITLE "<<< GENERATION X -- WARREN'S ROUTINES >>>"
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
**************************************************************************
|
||
* *
|
||
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
|
||
* ALL RIGHTS RESERVED. *
|
||
* *
|
||
**************************************************************************
|
||
|
||
* GET THE SYSTEM STUFF
|
||
.INCLUDE "GX.INC"
|
||
.INCLUDE "IMGTBL.GLO"
|
||
.INCLUDE "GXBTR.TBL"
|
||
.include GXNONBOY.h
|
||
.include GXCONTRL.h
|
||
|
||
.def HIT_SCREEN,BTR_HANG_TIME,S_SHOCKER, BTR_DEAD
|
||
.def MAKE_EXPLOSION,MAKE_SAFE_EXPLOSION
|
||
.DEF A_SLP_Based_CURPLYRS,DOWN_THE_HATCH, C_OCONST
|
||
.DEF ANIM_PART_EXPLOSIONS, BLOW_BTR_PART
|
||
|
||
.rEF A_STAY_TIL_SY_LT ; from gxafunc
|
||
.ref A_RANDOM_MULTI_CHUNK ; from gxmondr2.asm
|
||
.ref ATTACK_TIME ; from gxjungle
|
||
.ref BOX_CHECK_OBJ2 ; from gxuniv1.asm
|
||
.ref NONBOY_ROCKET_COLL,OUTCLUB_GUNVECT,OUTCLUB_CVECT
|
||
.ref DO_FLASH_DINK,A_OFFSCRN_DEL
|
||
.ref Do_Dink,PROC_BZERK_JMP_WRLD,SET_WAVE
|
||
.ref REXPLOA4h,REXPLOA6h,REXPLOA8h,REXPLOA9h
|
||
.ref REXPLOA10h,REXPLOA11h,REXPLOA12h
|
||
.ref DGV_FRAG_SPARK,TAB_SOUND,BG_TO_FG
|
||
|
||
***** From GXAFUNC
|
||
.REF SetAnim_AFARG, A_Set_Rel_Long, A_RAND_REL_BYTE
|
||
.ref A_SET_SCALE, A_BRANCH_IF_TRUE
|
||
|
||
***** From GXDESK
|
||
.REF SND_FINAL_EXPLODE1, SND_FINAL_EXPLODE2, SND_FINAL_EXPLODE3
|
||
.REF FRAG_DESK_EXPLOSION, FRAG_DESK_METAL, FRAG_DESK_RAIN
|
||
.REF A_MULTI_METAL_CHUNK, F_EXPLOSION_OUT
|
||
|
||
***** from GXMONDR2.ASM
|
||
.REF FRAG_EXPLOSION, PART_EXPLOSION, EXPLO_BLOW_INIT
|
||
.REF FRAG_EXPLOSION_SMALL
|
||
|
||
***** From GXUNIJP2.ASM
|
||
.REF METAL_GUNVECT
|
||
|
||
***** from GXRAM.ASM
|
||
.REF HOLD_ENEMY_DISPATCH, BASE_HIT
|
||
|
||
***** from GXPLAYER.ASM
|
||
.REF DELAYED_PRAISE
|
||
|
||
***** from GXNONBOY.ASM
|
||
.REF NONBOY_SBOMB
|
||
|
||
OLD_WAY .set 0
|
||
KILL_BTR .set 0
|
||
|
||
.bss BTR_HANG_TIME,16 ; TIME BTR STAYS STOPPED ON SCREEN
|
||
.bss BTR_GONE,16
|
||
.BSS BTR_DEAD,16 ;Flag if BTR has been killed
|
||
.BSS UNUSED_WORD,16
|
||
|
||
.TEXT
|
||
.even
|
||
|
||
OHITCNT .set ODATA
|
||
OTOTHITS .set ODATA+10h
|
||
OMISSOBJ .set ODATA+20h
|
||
OBAYOPEN .set ODATA+40h
|
||
OROCKTIM .set ODATA+50h
|
||
OIDLETIM .set ODATA+60h ; time for missle to just sit there
|
||
OPART_FINAL_CONT .EQU ODATA+80H ;UHL Jump vector after part explosion
|
||
OCHEWEDROCKET .EQU ODATA+0A0H ;UHB I just ate a rocket
|
||
OPARTEXPLODING .EQU ODATA+0A8H ;UHB A part is currently exploding
|
||
ORAPIDCNT .EQU ODATA+0B0H ;UHB Rapid fire count
|
||
OBLOW_AFUNC .EQU ODATA+0C0H ;UHL Anim func to blow this part
|
||
|
||
BTR_Z .set 0a000h
|
||
|
||
BTR_HITS .set 50 ; hits to destroy a piece
|
||
RHITS_TUR .set 2 ; each rocket hit on turret counts as this
|
||
RHITS_BTR .set 3 ; each rocket hit on other piece
|
||
|
||
;
|
||
; BTR CHECKLIST...
|
||
; Explode each piece turret (fire, blow away)
|
||
; fires nonboys jump out
|
||
; blow out wheels missles... steer to player, explode at player
|
||
; TOTAL BTR Destruction
|
||
|
||
|
||
|
||
|
||
*
|
||
* Troop Transport will move onto screen, stop, start,
|
||
* go off other side , then repeat in reverse.
|
||
*
|
||
CREATE_TROOPTRANS:
|
||
clr a14
|
||
move a14,@BTR_GONE
|
||
MOVE A14,@BTR_DEAD,W
|
||
MOVKM 1,@BTR_HANG_TIME,W ; don't hang first time through
|
||
|
||
movi BTR_INIT,b0
|
||
CALLA MULTIMAKE
|
||
jrz TT_abt
|
||
|
||
CLRM *a8(OTOTHITS),W
|
||
MOVB A14,*A8(OPARTEXPLODING)
|
||
|
||
move *a8(OYVAL),a14,L ; compute ground offset
|
||
move @YBASE,a0,L
|
||
sub a0,a14
|
||
move @YWORLD,a0,L
|
||
sub a14,a0
|
||
move a0,*a8(OGRNDOFF),L
|
||
|
||
move a13,*a8(OPLINK),L
|
||
|
||
clr a14
|
||
move a14,*a8(OBAYOPEN) ; bay is closed
|
||
move *a8(OPART1),a0,L
|
||
CLR A1
|
||
clrlp:
|
||
MOVIM BTR_HITS,*a0(OHITCNT),W ; 20 hits to blast each piece
|
||
MOVB A1,*A0(OCHEWEDROCKET) ;Clear some valuable stuff
|
||
move *a0(OPARTS),a0,L
|
||
jrnz clrlp
|
||
|
||
MOVIB 70,*a8(AnimSLP) ; time for missle to sit in bay.
|
||
|
||
movi -8000h,a14
|
||
move a14,*a8(OXVEL),L
|
||
|
||
; move a8,a3
|
||
; movi mosspal,a8
|
||
; movi 112,a9
|
||
; movi 125,a10
|
||
; movk 4,a11
|
||
; CREATE PID_TCYCLE,CYCLE16
|
||
; move a3,a8
|
||
|
||
CREATE PID_IND,TRANS_LAUNCH
|
||
move a0,a10
|
||
|
||
SOUND1 SND_BTR_ARRIVE
|
||
SOUND1 SND_BTR_BGND
|
||
*
|
||
*
|
||
*
|
||
nostopyet:
|
||
sleep 2*60
|
||
move *a8(OXPOS),a0
|
||
move @XBASE+16,a1
|
||
sub a1,a0
|
||
abs a0
|
||
subi 80,a0 ; when gets to center of screen, stop
|
||
jrge nostopyet
|
||
*
|
||
* SLOW DOWN AND STOP!!!!
|
||
*
|
||
MOVE A8,A0
|
||
STPTT_lp:
|
||
movb *a0(OZOFF),a14
|
||
addk 2,a14
|
||
jrnz not_a_tire0
|
||
move *a0(AnimScr),a1,L ; Switch to slowdown
|
||
addi tirerotStop-tirerot,a1
|
||
move a1,*a0(AnimScr),L
|
||
not_a_tire0:
|
||
MOVE *A0(OPARTS),A0,L
|
||
JRNZ STPTT_lp
|
||
|
||
move *a8(OXVEL),a9,L
|
||
sra 7,a9
|
||
SOUND1 SND_BTR_STOP
|
||
SOUND1 SND_BGND3_OFF
|
||
slowdown:
|
||
sleep 1
|
||
move *a8(OXVEL),a0,L
|
||
sub a9,a0
|
||
move a0,*a8(OXVEL),L
|
||
jrnz slowdown
|
||
*
|
||
* START UP AGAIN
|
||
*
|
||
move @BTR_HANG_TIME,a0 ; stick around time.
|
||
calla PRCSLP
|
||
|
||
SOUND1 SND_BTR_START
|
||
SOUND1 SND_BTR_BGND
|
||
MOVK NUM_TIRE1,A1
|
||
CALLA FINDPART
|
||
movi tirerotStart,a1
|
||
move a9,a9 ; acceleration
|
||
jrnn goin_rt
|
||
movi tirerotlftStart,a1
|
||
goin_rt:
|
||
; MOVE A8,A0
|
||
MOVK 4,A5
|
||
STTT_lp:
|
||
; movb *a0(OZOFF),a14
|
||
; addk 2,a14
|
||
; jrnz not_a_tire1
|
||
calla STRTANIM
|
||
not_a_tire1:
|
||
MOVE *A0(OPARTS),A0,L
|
||
; JRNZ STTT_lp
|
||
JRZ strtup
|
||
DSJS A5,STTT_lp
|
||
|
||
strtup:
|
||
sleep 1
|
||
move *a8(OXVEL),a0,L
|
||
add a9,a0
|
||
move a0,*a8(OXVEL),L
|
||
abs a0
|
||
cmpi 8000h,a0
|
||
jrlt strtup
|
||
|
||
sleep 4*60
|
||
TT_abt:
|
||
sleep 20
|
||
|
||
move *a8(ODAGX),a1
|
||
subi HALFX,a1
|
||
abs a1
|
||
cmpi 200,a1
|
||
jrlt TT_abt
|
||
|
||
SOUND1 SND_BTR_LEAVE
|
||
SOUND1 SND_BGND3_OFF
|
||
|
||
TT_abt2:
|
||
sleep 20
|
||
|
||
move *a8(ODAGX),a1 ; wait til its time to mark
|
||
subi HALFX,a1
|
||
abs a1
|
||
cmpi 350,a1
|
||
jrlt TT_abt2 ; as gone
|
||
|
||
movk 1,a0
|
||
move a0,@BTR_GONE
|
||
|
||
; SOUND1 SND_BGND3_OFF
|
||
|
||
TT_abt3:
|
||
sleep 20
|
||
|
||
move *a8(ODAGX),a1
|
||
subi HALFX,a1
|
||
abs a1
|
||
cmpi 500,a1
|
||
jrlt TT_abt3
|
||
|
||
|
||
.if KILL_BTR==1 ; test purposes, always kill
|
||
|
||
jruc BTR_GO_AWAY
|
||
|
||
.elseif KILL_BTR==2 ; test purposes, always come back
|
||
|
||
move *a8(OXVEL),a11,L
|
||
clr a14
|
||
move a14,*a8(OXVEL),L
|
||
move a14,@BTR_GONE
|
||
jruc BTR_RETURN
|
||
|
||
.endif
|
||
|
||
*
|
||
* reverse
|
||
*
|
||
|
||
move *a8(OXVEL),a11,L
|
||
clr a14
|
||
move a14,*a8(OXVEL),L
|
||
|
||
wait_4_ret_signal:
|
||
sleep 100
|
||
move @BTR_GONE,a14 ; if somebody resets BTR_GONE to 0
|
||
jrz BTR_GO_AWAY ; kill it.
|
||
jrnn wait_4_ret_signal ; if it gets set to 0, kill
|
||
; if neg, idle until return signal
|
||
*
|
||
* KILL MISSLE LAUNCHER PROCESS
|
||
*
|
||
move a10,a0 ; missle launcher process
|
||
calla KILL
|
||
|
||
CALLR DEL_HATCH_BOY
|
||
|
||
*
|
||
* Remove BTR from object list
|
||
*
|
||
PUSHST
|
||
DINT
|
||
move a8,a0
|
||
pullnxt:
|
||
movb *A0(OFLAGS+B_ANIM-7),A14
|
||
jrnn notanim
|
||
calla PULLANIM
|
||
ORIM M_ANIM,*a0(OFLAGS),W ; keep marked for return
|
||
notanim:
|
||
calla PULLOBJ
|
||
move *a0(OPARTS),a0,L
|
||
jrnz pullnxt
|
||
POPST
|
||
|
||
|
||
BTR_IDLE:
|
||
move @ZSCROLL,a14,L
|
||
jrnz zmoving
|
||
move @BTR_GONE,a14 ; return signal is BTR_GONE = 0
|
||
jrz BTR_RETURN
|
||
zmoving:
|
||
sloop 20,BTR_IDLE ;wait until ZSCROLL stops
|
||
|
||
BTR_RETURN:
|
||
*
|
||
* Set off to side in universe
|
||
*
|
||
move @ZBASE,a3,L
|
||
addi BTR_Z,a3 ; univ z
|
||
move @YWORLD,a2,L
|
||
MOVE *A8(OGRNDOFF),A14,L
|
||
SUB A14,A2
|
||
movi 1200000h,a1
|
||
move a11,a11 ; check last vel
|
||
jrnn keepXpos
|
||
neg a1 ; X neg if we moved off left
|
||
keepXpos:
|
||
move @XBASE,a14,L
|
||
add a14,a1 ; univ X
|
||
*
|
||
* turn into delta for parts
|
||
*
|
||
move *a8(OXVAL),a14,L
|
||
move a1,*a8(OXVAL),L
|
||
sub a14,a1
|
||
move *a8(OYVAL),a14,L
|
||
move a2,*a8(OYVAL),L
|
||
sub a14,a2
|
||
move *a8(OZVAL),a14,L
|
||
move a3,*a8(OZVAL),L
|
||
sub a14,a3
|
||
|
||
move *a8(OPARTS),a0,L
|
||
set_pos_lp:
|
||
move *a0(OXVAL),a14,L
|
||
add a1,a14
|
||
move a14,*a0(OXVAL),L
|
||
move *a0(OYVAL),a14,L
|
||
add a2,a14
|
||
move a14,*a0(OYVAL),L
|
||
move *a0(OZVAL),a14,L
|
||
add a3,a14
|
||
move a14,*a0(OZVAL),L
|
||
move *a0(OPARTS),a0,L
|
||
jrnz set_pos_lp
|
||
|
||
*
|
||
* Put it back in the list
|
||
*
|
||
PUSHST
|
||
DINT
|
||
move a8,a0
|
||
calla INSOBJ ; for first only to find place
|
||
movb *A0(OFLAGS+B_ANIM-7),A14
|
||
jrnn btr_ins_lp
|
||
ANDNIM M_ANIM,*a0(OFLAGS),W ; clr flag for return
|
||
calla INSANIM
|
||
btr_ins_lp:
|
||
move *a0(OPARTS),a1,L
|
||
jrz its_back
|
||
|
||
move *a0,a2,L ; old fwd link of prev obj
|
||
|
||
move a0,*a1(OBLINK),L
|
||
move a2,*a1,L
|
||
move a1,*a0,L
|
||
move a1,*a2(OBLINK),L
|
||
|
||
move a1,a0
|
||
|
||
calla INSSUPP ;INSERT ON SUPPLEMENTAL LIST
|
||
|
||
movb *A0(OFLAGS+B_ANIM-7),A14
|
||
jrnn btr_ins_lp
|
||
ANDNIM M_ANIM,*a0(OFLAGS),W ; clr flag for return
|
||
calla INSANIM
|
||
|
||
jruc btr_ins_lp
|
||
its_back:
|
||
POPST
|
||
CREATE PID_IND,TRANS_LAUNCH
|
||
move a0,a10
|
||
*
|
||
* Get the wheels a rollin'
|
||
*
|
||
movi tirerotlftStart,a1
|
||
neg a11
|
||
move a11,*a8(OXVEL),L
|
||
jrn goin_lft
|
||
movi tirerotStart,a1
|
||
goin_lft:
|
||
MOVE A8,A0
|
||
RTT_lp:
|
||
movb *a0(OZOFF),a14
|
||
addk 2,a14
|
||
jrnz not_a_tire2
|
||
move a1,*a0(AnimScr),L
|
||
|
||
not_a_tire2:
|
||
MOVE *A0(OPARTS),A0,L
|
||
JRNZ RTT_lp
|
||
|
||
CREATE PID_IND,BTR_WALL_BLAST
|
||
|
||
SOUND1 SND_BTR_ARRIVE
|
||
SOUND1 SND_BTR_BGND
|
||
|
||
jruc nostopyet ; to loop back
|
||
|
||
*
|
||
* This process contains the BTR head in a8
|
||
* and the missle launcher process in a10
|
||
*
|
||
BTR_DEATH:
|
||
move a10,a0 ; missle launcher process
|
||
calla KILL
|
||
|
||
*
|
||
* PLACE BTR DEATH EFFECT HERE
|
||
*
|
||
|
||
.if DEBUG
|
||
move *a8(OPART1),a14,L ; hang if not deleting head
|
||
cmp a8,a14
|
||
LOCKON NE
|
||
.endif
|
||
|
||
MOVI ANIM_FINAL_EXPLOSION,A1
|
||
CALLA STRT_ANIM
|
||
|
||
CLRM *a8(OPLINK),L
|
||
|
||
SOUND1 SND_BGND3_OFF
|
||
SOUND1 SND_CHAN3_OFF
|
||
|
||
MOVKM 1,@BTR_DEAD,W ;The BTR is officially dead!!
|
||
|
||
; movk 1,a14
|
||
; move a14,@BTR_GONE
|
||
; calla DELETE_OBJ
|
||
DIE
|
||
|
||
|
||
|
||
BTR_GO_AWAY:
|
||
move a10,a0 ; missle launcher process
|
||
calla KILL
|
||
movk 1,a14
|
||
move a14,@BTR_GONE
|
||
|
||
CALLR DEL_HATCH_BOY
|
||
|
||
.if DEBUG
|
||
move *a8(OPART1),a14,L ; hang if not deleting head
|
||
cmp a8,a14
|
||
LOCKON NE
|
||
.endif
|
||
|
||
calla DELETE_OBJ
|
||
DIE
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DEL_HATCH_BOY *
|
||
* *
|
||
* Delete the Non-boy in the hole. *
|
||
* *
|
||
* A8 = Ptr to any part of BTR *
|
||
* *
|
||
**************************************************************************
|
||
DEL_HATCH_BOY
|
||
MMTM SP,A1,A8
|
||
MOVI OID_NONBOY,A1
|
||
CALLA EXIST_PART
|
||
JRZ DHB_X ;BR = No NonBoys around
|
||
|
||
MOVE A0,A8
|
||
CALLA PULL_PART
|
||
CALLR DOWN_THE_HATCH
|
||
CALLA DEL_ENEMY_NOAUD
|
||
|
||
DHB_X
|
||
MMFM SP,A1,A8
|
||
RETS
|
||
|
||
*
|
||
* Process to launch a missle out of the BTR
|
||
*
|
||
* a8 = head of btr
|
||
*
|
||
TRANS_DELAY:
|
||
sleep 10
|
||
TRANS_LAUNCH:
|
||
move *a8(OXVAL),a0,L
|
||
move @XBASE,a1,L
|
||
sub a1,a0 ; world X position
|
||
abs a0
|
||
cmpi 190*BTR_Z,a0
|
||
jrgt notok2shoot
|
||
*
|
||
* FIRE MISSLE
|
||
*
|
||
move *a8(OBAYOPEN),a14 ; bay door open?
|
||
jrnz TRANS_DELAY
|
||
movi tdoor,a1
|
||
move a8,a0
|
||
calla STRTANIM
|
||
notok2shoot:
|
||
movi 30,a0
|
||
movi 170,a1
|
||
calla RANGERND ; result in a0
|
||
movi TRANS_LAUNCH,a7
|
||
jauc PRCLSP
|
||
|
||
|
||
BTR_CVECT
|
||
WWL OID_PROCKET,~MASK_PLAYER,BTR_ROCKET_COLL
|
||
WWL OID_PEXPLOSION,~MASK_PLAYER,BTR_EXPLOSION_COLL
|
||
WWL OID_BLOWUP,0FFFFH,BTR_SBOMB_COLLVECT
|
||
WWL OID_GRND,0FFFFH,BTR_GROUND_COLL
|
||
WL 0,DUMCRETS
|
||
|
||
TURRET_CVECT
|
||
WWL OID_GRND,0FFFFH,TUR_GROUND_COLL
|
||
WL 0,DUMCRETS
|
||
|
||
BTR_HOLE_CVECT
|
||
WWL OID_PROCKET,~MASK_PLAYER,BTR_ROCKET_COLL
|
||
WWL OID_PEXPLOSION,~MASK_PLAYER,BTR_HOLE_COLL
|
||
WL 0,DUMCRETS
|
||
|
||
BTR_HOLE_COLL:
|
||
MOVB *A8(OCHEWEDROCKET),A14
|
||
JRZ BTR_GV_XIT ;BR = We really didn't get hit
|
||
CLRB *A8(OCHEWEDROCKET)
|
||
mmtm sp,a0,a8
|
||
move *a8(OPART1),a5,L ; get head of BTR
|
||
move *a5(OBAYOPEN),a14
|
||
jrz HOLE_X ; door is not open
|
||
|
||
*
|
||
* determine if rocket hit opening
|
||
*
|
||
move *a0(OXVAL),a7,L
|
||
move *a0(OYVAL),a1,L
|
||
|
||
move *a5(OXVAL),a3,L ; check X first
|
||
move a3,a4
|
||
addi 16*BTR_Z,a4 ; xoffset changes with FLIPH
|
||
subi 16*BTR_Z,a3
|
||
|
||
cmp a7,a3 ; is rocket within X limits?
|
||
jrgt HOLE_X
|
||
cmp a7,a4
|
||
jrlt HOLE_X
|
||
|
||
move *a5(OYVAL),a3,L
|
||
move a3,a4
|
||
addi -21*BTR_Z,a4
|
||
addi -52*BTR_Z,a3
|
||
|
||
cmp a1,a3 ; is rocket within X limits?
|
||
jrgt HOLE_X
|
||
cmp a1,a4
|
||
jrlt HOLE_X
|
||
|
||
move *a5(OTOTHITS),a14
|
||
cmpk 10,a14 ; if 10 parts not hit
|
||
jrlt BTR_JUMP ; don't bother
|
||
|
||
|
||
* If it did, blow up BTR
|
||
*
|
||
* a8 = bottom part
|
||
* a5 = head of BTR
|
||
* a0 = rocket becomes a3
|
||
*
|
||
BLOW_UP_BTR:
|
||
move a0,a3
|
||
move *a5(OMISSOBJ),a8,L
|
||
jrz no_missle
|
||
CLRM *a5(OMISSOBJ),L
|
||
calla DELETE_OBJ ; trash missle
|
||
no_missle:
|
||
move a5,a8
|
||
|
||
CALLA OBJ_OFF
|
||
|
||
; move *a8(OCTRL),a4
|
||
; movi MISFLA,a1
|
||
; calla ANI ; change door to inside flame
|
||
|
||
; movi MISFLAME,a0
|
||
; CALLA CHANGE_PAL
|
||
|
||
; movi MISFLAME,a8
|
||
; movi 1,a9
|
||
; movi 13,a10
|
||
; movk 2,a11
|
||
; CREATE PID_TCYCLE,CYCLE16
|
||
|
||
SOUND1 SND_MISSLE_HIT ; really loud explo
|
||
|
||
move a5,a8 ; head of BTR into a8
|
||
move *a8(OPLINK),a0,L
|
||
MOVIM BTR_DEATH,*a0(PWAKE),L ; tell control process to kill btr
|
||
MOVKM 1,*a0(PTIME),W
|
||
|
||
|
||
; calla ALL_COLLS_OFF ; nomo colls
|
||
|
||
MMTM SP,A6,A8
|
||
MOVK NUM_BTR_PARTS,A6
|
||
BUB_COLLS_OFF
|
||
CALLA COLLS_OFF
|
||
MOVE *A8(OPARTS),A8,L
|
||
DSJS A6,BUB_COLLS_OFF
|
||
MMFM SP,A6,A8
|
||
|
||
clr a14
|
||
move a14,*a8(OXVEL),L ; stop moving
|
||
*
|
||
* stop tires if moving and turret if still there
|
||
*
|
||
pulanilp:
|
||
move *a5(OID),a14
|
||
cmpi OID_BTR,a14
|
||
jrne nopull
|
||
move a5,a0
|
||
move *a5(OFLAGS),a14
|
||
btst B_ANIM,a14
|
||
jrz nopull
|
||
calla PULLANIM ; stop all animations
|
||
nopull:
|
||
move *a5(OPARTS),a5,L
|
||
jrnz pulanilp
|
||
|
||
HOLE_X:
|
||
mmfm sp,a0,a8
|
||
rets
|
||
|
||
|
||
BTR_JUMP:
|
||
move *a5(OYACCEL),a14,W
|
||
jrnz doinit
|
||
MOVIM -40000h,*a5(OYVEL),L ; make it jump a bit
|
||
movim 7800h,*a5(OYACCEL),W
|
||
ORIM M_GCOLL,*a5(OFLAGS),W
|
||
*
|
||
* for tires (whose OZOFF is -2) add to their pos
|
||
*
|
||
move a5,a0
|
||
movi 80000h,a3
|
||
callr AdjustTires
|
||
doinit:
|
||
SOUNDZ SND_HOLE_HIT
|
||
MOVE A5,A8
|
||
MMTM SP,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10 ;MAKE FRAGMENTS
|
||
MOVI 040000H,A0
|
||
MOVI 1000H,A3
|
||
CALLA PreFrag_Center
|
||
MOVI FRAG_MISSLE_DOOR,B14 ;Use this fragment script
|
||
CALLA Fragger
|
||
MMFM SP,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
||
mmfm sp,a0,a8
|
||
rets
|
||
|
||
|
||
BTR_GROUND_COLL
|
||
PUSH a8
|
||
move *a8(OPART1),a8,L
|
||
clr a14
|
||
move a14,*a8(OYVEL),L
|
||
move a14,*a8(OYACCEL),W
|
||
move *a8(OFLAGS),a14
|
||
andni M_GCOLL,a14
|
||
move a14,*a8(OFLAGS)
|
||
|
||
move a0,a5
|
||
move a8,a0
|
||
movi -80000h,a3
|
||
callr AdjustTires
|
||
move a5,a0 ; restore a0
|
||
ignoregc:
|
||
PULLQ a8
|
||
rets
|
||
|
||
*
|
||
* a0 = head of BTR
|
||
* a3 = Y delta
|
||
*
|
||
AdjustTires:
|
||
movb *a0(OZOFF),a14
|
||
addk 2,a14
|
||
jrnz not_a_tire3
|
||
move *a0(OYVAL),a14,L
|
||
add a3,a14
|
||
move a14,*a0(OYVAL),L
|
||
not_a_tire3:
|
||
MOVE *A0(OPARTS),A0,L
|
||
JRNZ AdjustTires
|
||
rets
|
||
|
||
|
||
|
||
|
||
MISSLE_INIT:
|
||
LWWWW mossile1,DMAWNZ, M_MANSCALE, OM_OID | OM_COLL | OM_GUNV, OID_EROCKET
|
||
.long MISSLE_CVECT,MISSLE_GUNVECT
|
||
|
||
MISSLE_CVECT
|
||
WWL OID_PROCKET,~MASK_PLAYER,MISSLE_COLL
|
||
WL 0,DUMCRETS
|
||
|
||
|
||
CREATE_MISSLE:
|
||
movi MISSLE_INIT,b0
|
||
calla EASYMAKE
|
||
JRZ CM_X
|
||
move *a8(OXVAL),a14,L
|
||
move a14,*a0(OXVAL),L
|
||
move *a8(OYVAL),a14,L
|
||
subi (48<<15),a14
|
||
move a14,*a0(OYVAL),L
|
||
move *a8(OZVAL),a5,L
|
||
move a5,*a0(OZVAL),L
|
||
|
||
calla INSOBJ
|
||
calla INSPART
|
||
move a0,*a8(OMISSOBJ),L ; save missle obj in door obj
|
||
|
||
movi 100h,a5
|
||
calla SET_SCALE_MANUAL
|
||
|
||
SOUNDZ SND_BAY_OPEN
|
||
CM_X
|
||
rets
|
||
|
||
|
||
BAY_CLOSED:
|
||
clr a14
|
||
move a14,*a8(OBAYOPEN)
|
||
rets
|
||
|
||
|
||
BAY_OPEN:
|
||
movk 1,a14
|
||
move a14,*a8(OBAYOPEN)
|
||
rets
|
||
|
||
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<< SET_TARG_VEL >>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||
*
|
||
* Set X and Y velocities to get from current position to supplied target
|
||
* in about 32 ticks
|
||
*
|
||
* a0 = object
|
||
* a3 = X target
|
||
* a4 = Y target
|
||
*
|
||
SetTargVel:
|
||
move *a0(OXVAL),a5,L
|
||
move *a0(OYVAL),a6,L
|
||
sub a5,a3
|
||
sub a6,a4 ; Compute delta from current to target
|
||
sra 7,a3
|
||
move a3,a14
|
||
sra 1,a14
|
||
add a14,a3 ; assume 48 tiks to destination
|
||
sra 7,a4 ; div by 32
|
||
move a4,a14
|
||
sra 1,a14 ; then add half of that back
|
||
add a14,a4
|
||
move a3,*a0(OXVEL),L
|
||
move a4,*a0(OYVEL),L ; Store velocities
|
||
|
||
rets
|
||
|
||
|
||
LAUNCH_MISSLE:
|
||
move *a8(OMISSOBJ),a0,L ; retrive missle obj
|
||
jrz got_hit
|
||
|
||
calla PULLPART
|
||
clr a14
|
||
move a14,*a8(OMISSOBJ),L ; clear out OMISSOBJ field
|
||
|
||
move *a0(OFLAGS),a14
|
||
btst B_OFSCRN,a14
|
||
janz DELOBJ ; goombye if offscreen
|
||
|
||
movi (ZMAX_REAL-BTR_Z)/66,a3 ; basis for ZVEL
|
||
move a3,*a0(OZVEL),L
|
||
movi MISSL,a1
|
||
calla STRTANIM
|
||
move @XBASE,a3,L
|
||
clr a4
|
||
movi -300000h,a4
|
||
MOVIM 400h,*a0(OYACCEL),W
|
||
callr SetTargVel ; set X and Y velocities to take it there
|
||
|
||
movb *a8(AnimSLP),a14
|
||
subk 4,a14
|
||
movb a14,*a8(AnimSLP)
|
||
|
||
move a8,a5
|
||
move a0,a8
|
||
CREATE PID_IND,SPIN_MISSLE
|
||
move a0,*a8(OPLINK),L
|
||
move a5,a8
|
||
|
||
SOUND1 SND_MISSLE_LAUNCH
|
||
got_hit:
|
||
rets
|
||
|
||
|
||
|
||
SpiralTab: ; Mag = 30
|
||
.long 0177eah,0ffffdf26h
|
||
.long 01717bh,0ffff9e02h
|
||
.long 0164bah,0ffff5e8bh
|
||
.long 0151dfh,0ffff21d8h
|
||
.long 01393bh,0fffee8f1h
|
||
.long 011b3ch,0fffeb4d1h
|
||
.long 0f863h,0fffe865bh
|
||
.long 0d14bh,0fffe5e5ch
|
||
.long 0a69eh,0fffe3d82h
|
||
.long 07917h,0fffe245dh
|
||
.long 0497eh,0fffe135bh
|
||
.long 018a3h,0fffe0ac8h
|
||
.long 0ffffe75dh,0fffe0ac8h
|
||
.long 0ffffb682h,0fffe135bh
|
||
.long 0ffff86e9h,0fffe245dh
|
||
.long 0ffff5962h,0fffe3d82h
|
||
.long 0ffff2eb5h,0fffe5e5ch
|
||
.long 0ffff079dh,0fffe865bh
|
||
.long 0fffee4c4h,0fffeb4d1h
|
||
.long 0fffec6c5h,0fffee8f1h
|
||
.long 0fffeae21h,0ffff21d8h
|
||
.long 0fffe9b46h,0ffff5e8bh
|
||
.long 0fffe8e85h,0ffff9e02h
|
||
.long 0fffe8816h,0ffffdf26h
|
||
.long 0fffe8816h,020dah
|
||
.long 0fffe8e85h,061feh
|
||
.long 0fffe9b46h,0a175h
|
||
.long 0fffeae21h,0de28h
|
||
.long 0fffec6c5h,01170fh
|
||
.long 0fffee4c4h,014b2fh
|
||
.long 0ffff079dh,0179a5h
|
||
.long 0ffff2eb5h,01a1a4h
|
||
.long 0ffff5962h,01c27eh
|
||
.long 0ffff86e9h,01dba3h
|
||
.long 0ffffb682h,01eca5h
|
||
.long 0ffffe75dh,01f538h
|
||
.long 018a3h,01f538h
|
||
.long 0497eh,01eca5h
|
||
.long 07917h,01dba3h
|
||
.long 0a69eh,01c27eh
|
||
.long 0d14bh,01a1a4h
|
||
.long 0f863h,0179a5h
|
||
.long 011b3ch,014b2fh
|
||
.long 01393bh,01170fh
|
||
.long 0151dfh,0de28h
|
||
.long 0164bah,0a175h
|
||
.long 01717bh,061feh
|
||
.long 0177eah,020dah
|
||
|
||
*
|
||
* SPIN_MISSLE as it heads to player
|
||
* we start with missle at left
|
||
*
|
||
SPIN_MISSLE
|
||
movi 48,a10
|
||
move a10,a0
|
||
calla RAND0
|
||
move a0,a11
|
||
movi SpiralTab,a9
|
||
|
||
SPIN_MISSL_lp
|
||
inc a11
|
||
cmp a10,a11
|
||
jrne SM_ok
|
||
clr a11
|
||
SM_ok:
|
||
move a11,a0 ; Y Offset
|
||
sll 6,a0
|
||
add a9,a0
|
||
move *a0+,a2,L ; Y delta
|
||
move *a0,a1,L ; X delta
|
||
|
||
move *a8(OXVAL),a3,L
|
||
add a1,a3
|
||
move a3,*a8(OXVAL),L
|
||
move *a8(OYVAL),a4,L
|
||
add a2,a4
|
||
move a4,*a8(OYVAL),L
|
||
|
||
sloop 1,SPIN_MISSL_lp
|
||
|
||
|
||
|
||
.if 0 ; OLD?
|
||
|
||
* a8 = object
|
||
* Compute proper OSIZE and OANIOFF from SCALE FACTOR.
|
||
* Should be used only for NOSCALE objects which you want
|
||
* to scale manually.
|
||
*
|
||
* Unlike SET_SCALE_M, this works only on a single object
|
||
*
|
||
SET_SCALED_SIZE:
|
||
mmtm sp,a1,a2,a3
|
||
move *a8(OSCALE),a14,L
|
||
movy a14,a2
|
||
srl 16,a2 ; YSCALE in a2
|
||
zext a14 ; XSCALE in a14
|
||
|
||
move *a8(OUSIZE),a1,L
|
||
movy a1,a3
|
||
srl 16,a3 ; UYSIZE in a3
|
||
zext a1 ; UXSIZE in a1
|
||
sll 8,a3
|
||
divu a2,a3 ; YSIZE in a3
|
||
sll 8,a1
|
||
divu a14,a1 ; XSIZE in a1
|
||
sll 16,a3
|
||
movy a3,a1
|
||
move a1,*a8(OSIZE),L
|
||
|
||
move *a8(OUANIOFF),a1,L
|
||
movy a1,a3
|
||
srl 16,a3 ; UYSIZE in a3
|
||
sext a1 ; UXSIZE in a1
|
||
sll 8,a3
|
||
divs a2,a3 ; YSIZE in a3
|
||
sll 8,a1
|
||
divs a14,a1 ; XSIZE in a1
|
||
sll 16,a3
|
||
movy a3,a1
|
||
move a1,*a8(OANIOFF),L
|
||
|
||
mmfm sp,a1,a2,a3
|
||
rets
|
||
|
||
.endif
|
||
|
||
*
|
||
* a0 = scale factor for explosion
|
||
*
|
||
MAKE_SAFE_EXPLOSION:
|
||
movi MSAFEXP_INIT,b0 ; player destroys before being hit
|
||
move a0,a6 ; scale in to a6
|
||
calla PSTOP
|
||
calla COLLS_OFF
|
||
|
||
calla EASYMAKE ; explosion obj in a0
|
||
JRZ MSE_X
|
||
move a8,a7
|
||
addi OXVAL,a7
|
||
mmfm a7,a1,a3,a5 ; get univ position of missle
|
||
subk 4,a1
|
||
|
||
move a0,a2
|
||
move a6,*a2(ONuManScl)
|
||
addi OXVAL+060h,a2
|
||
mmtm a2,a1,a3,a5
|
||
|
||
calla INSOBJ
|
||
MSE_X
|
||
rets
|
||
|
||
|
||
MAKE_EXPLOSION:
|
||
movi MEXP_INIT,b0 ; hits player
|
||
move a0,a6 ; scale into a6
|
||
calla PSTOP
|
||
calla COLLS_OFF
|
||
move a8,a4 ; save missle obj in a4
|
||
|
||
calla MULTIMAKE
|
||
move a4,a7 ; save missle obj in a7
|
||
addi OXVAL,a4
|
||
mmfm a4,a1,a3,a5 ; get univ position of missle
|
||
subk 4,a1
|
||
|
||
move a8,a2
|
||
move a6,*a2(ONuManScl)
|
||
addi OXVAL+060h,a2
|
||
mmtm a2,a1,a3,a5
|
||
|
||
move *a8(OPARTS),a2,L
|
||
move a6,*a2(ONuManScl)
|
||
addi OXVAL+060h,a2
|
||
mmtm a2,a1,a3,a5
|
||
|
||
calla INSERT_OBJ
|
||
|
||
move a8,a0 ; save new object
|
||
move a7,a8 ; restore missle obj
|
||
rets
|
||
|
||
|
||
*
|
||
* called from missle anim when missle explodes
|
||
*
|
||
A_MISSLE_EXPL:
|
||
movi [0b0h,0b0h],a0
|
||
callr MAKE_EXPLOSION
|
||
|
||
*
|
||
* check for player hit and enery drain
|
||
*
|
||
clr a3
|
||
; movi [8,0],a5
|
||
MOVE @BASE_HIT,A5,W
|
||
ADDI 6800H,A5
|
||
SLL 4,A5
|
||
|
||
calla CK_PLAYER_HIT
|
||
|
||
CLRM *a8(OYVEL),L
|
||
move a14,*a8(OXVEL),L
|
||
move a14,*a8(OYACCEL),W
|
||
|
||
calla OBJPROC_KILL
|
||
|
||
move *a8(OZVAL),a14,L
|
||
subk 30,a14
|
||
move a14,*a8(OZVAL),L
|
||
calla GETAFARG_WORD
|
||
move a0,a1
|
||
callr HIT_SCREEN
|
||
|
||
SOUND1 SND_MISSLE_HIT
|
||
|
||
rets
|
||
|
||
|
||
|
||
MISSLE_COLL:
|
||
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
|
||
CALLA POID_TO_PDATA ;GET PDATA IN A2
|
||
mmtm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,B10
|
||
callr MISSLE_GUNVECT
|
||
mmfm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10
|
||
rets
|
||
|
||
|
||
*
|
||
* MISSLE Gun Vector
|
||
*
|
||
* PASS:
|
||
* A2 = PTR TO PLAYER
|
||
* A8 = PTR TO OBJECT
|
||
*
|
||
MISSLE_GUNVECT:
|
||
move *a8(OPART1),a5,L ; still part of BTR?
|
||
jrz MISOK
|
||
* Detach from BTR
|
||
CLRM *a5(OMISSOBJ),L ; tell it it's gone
|
||
calla PULL_PART
|
||
|
||
MISOK:
|
||
move *a8(OZVAL),a0,L
|
||
move @ZBASE,a14,L
|
||
sub a14,a0
|
||
subi 0d55h,a0
|
||
movi 51ch,a1
|
||
mpys a0,a1
|
||
move a1,a0
|
||
sra 16,a1
|
||
movx a1,a0
|
||
PUSH a2
|
||
calla MAKE_SAFE_EXPLOSION
|
||
PULLQ a2
|
||
movi 1000,a1
|
||
calla SCORE
|
||
calla DELETE_OBJ_PROC ; delete the missle and controlling proc
|
||
SOUND1 SND_MISSLE_EXPLODE
|
||
|
||
MISGUNX:
|
||
rets
|
||
|
||
|
||
;EXP_ENT .MACRO TYP,NUM,ST
|
||
; .if ($symcmp(TYP,"C") = 0)
|
||
; .word (:NUM:<<8)|(:ST:)|080h
|
||
; .else
|
||
; .word (:NUM:<<8)|(:ST:)
|
||
; .endif
|
||
; .ENDM
|
||
|
||
;EXP_PC .MACRO X,Y
|
||
; .word (:X:)*(BTR_Z>>8),(:Y:)*(BTR_Z>>8)
|
||
; .ENDM
|
||
|
||
|
||
;BTR_explo:
|
||
; EXP_ENT B,2,0 ; EXPLO TYP, NUMBER, START
|
||
; EXP_ENT B,1,2
|
||
; .word 0
|
||
; EXP_ENT B,1,3
|
||
; EXP_ENT B,2,4
|
||
; EXP_ENT B,1,6
|
||
; EXP_ENT B,1,7
|
||
; EXP_ENT C,3,8
|
||
; EXP_ENT B,2,11
|
||
; EXP_ENT B,2,13
|
||
; EXP_ENT B,1,15
|
||
; .word 0,0,0,0
|
||
|
||
|
||
;EXPLO_PCS:
|
||
;; Part 1:
|
||
; EXP_PC 8,-24
|
||
; EXP_PC -15,-18
|
||
;; Part 2:
|
||
; EXP_PC -1,-6
|
||
;; Part 4:
|
||
; EXP_PC -4,-18
|
||
;; Part 5:
|
||
; EXP_PC 14,-16
|
||
; EXP_PC -15,-27
|
||
;; Part 6:
|
||
; EXP_PC -13,-37
|
||
;; Part 7:
|
||
; EXP_PC -1,-15
|
||
;; Part 8:
|
||
; EXP_PC -4,-26
|
||
; EXP_PC 3,-18
|
||
; EXP_PC 6,-9
|
||
;; Part 9:
|
||
; EXP_PC -23,-15
|
||
; EXP_PC 4,-15
|
||
;; Part 10:
|
||
; EXP_PC 15,-11
|
||
; EXP_PC -23,-18
|
||
;; Part 11:
|
||
; EXP_PC 11,-37
|
||
|
||
|
||
;TUREXPTAB:
|
||
; EXP_PC -25,-8 ;2
|
||
; EXP_PC 23,-7 ;3
|
||
; EXP_PC -1,-19 ;-9
|
||
|
||
TUR_GROUND_COLL:
|
||
CALLA CLR_VEL
|
||
MOVI ANIM_TUR_GROUND,A1
|
||
CALLA STRT_ANIM
|
||
ANDNIM M_GCOLL,*a8(OFLAGS),W
|
||
MOVIM DUMCOLL,*a8(OCVECT),L
|
||
; calla DELETE_OBJ
|
||
;
|
||
; movi FHKEXB_INIT,a6
|
||
; movi TUREXPTAB,a5
|
||
; movk 3,a4
|
||
; mmtm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,B10
|
||
; callr BTRGlp
|
||
; mmfm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10
|
||
rets
|
||
|
||
;BTR_dam_tbl:
|
||
; .long DAMN1,DAMN2,DAMN3,DAMN4,DAMN5,DAMN6,DAMN7,DAMN8
|
||
; .long DAMN9,DAMN10,DAMN11,TIREFL,TIREFL,TIREFL,TIREFL
|
||
*
|
||
* Table of damage animations for parts of the BTR
|
||
*
|
||
BTR_dam_tbl:
|
||
.long ANIM_DAMN1,ANIM_DAMN2,ANIM_DAMN3,ANIM_DAMN4,ANIM_DAMN5
|
||
.LONG ANIM_DAMN6,ANIM_DAMN7,ANIM_DAMN8,ANIM_DAMN9,ANIM_DAMN10
|
||
.LONG ANIM_DAMN11
|
||
.LONG ANIM_TIREFL,ANIM_TIREFL,ANIM_TIREFL,ANIM_TIREFL
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BTR_ROCKET_COLL *
|
||
* *
|
||
* Collision vector for any BTR part and a player rocket. *
|
||
* *
|
||
* A0 = Ptr to rocket *
|
||
* A8 = Ptr to BTR part *
|
||
* *
|
||
**************************************************************************
|
||
BTR_ROCKET_COLL
|
||
MOVE *A0(RL_INTENDED_OBJ),A14,L
|
||
CMP A14,A8 ;Is this the object we are after?
|
||
JRNE BRC_X ;BR = No
|
||
MOVK 1,A14
|
||
MOVB A14,*A8(OCHEWEDROCKET) ;Flag for the explosion
|
||
BRC_X
|
||
RETS
|
||
*
|
||
* BTR gets whacked by a smart bomb
|
||
* A2 = Ptr to smart player
|
||
* A8 = Ptr to object
|
||
*
|
||
BTR_SBOMB_COLLVECT
|
||
MMTM SP,B0,B3,B4,B5
|
||
|
||
MOVI BTR_CVECT,B3
|
||
MOVE A8,B0
|
||
MOVE *B0(OPART1),B4,L ;Keep head
|
||
|
||
MOVI HATCHBOY_CVECT,B5 ;We'll look for the hatch boy also
|
||
|
||
MOVE *B0(OPARTS),B0,L
|
||
JRUC BSC_DO_BOMB
|
||
BSC_TEST
|
||
MOVE *B0(OCVECT),B14,L
|
||
MOVE B0,A8
|
||
MOVE *B0(OPARTS),B0,L
|
||
CMP B5,B14
|
||
JRNE BSC_CHECK_PART
|
||
CALLR HATCHBOY_SBOMB
|
||
JRUC BSC_NEXT
|
||
|
||
BSC_CHECK_PART
|
||
CMP B3,B14
|
||
JRNE BSC_NEXT
|
||
BSC_DO_BOMB
|
||
CLR B14
|
||
MOVB B14,*B4(OPARTEXPLODING)
|
||
CALLR BTR_SBOMB_PART
|
||
BSC_NEXT
|
||
MOVE B0,B0
|
||
JRNZ BSC_TEST
|
||
|
||
MMFM SP,B0,B3,B4,B5
|
||
RETS
|
||
|
||
|
||
BTR_SBOMB_PART
|
||
MOVE *A8(OHITCNT),a3 ; how many times hit?
|
||
JRZ BTR_GV_XIT ;BR = Part already dead
|
||
CLR A3
|
||
MOVE A3,*A8(OHITCNT)
|
||
MOVB *A8(OPARTID),A14
|
||
CMPK 3,A14
|
||
JRNE NORM_PART_SBOMB ;BR = This is not the turret
|
||
|
||
move *a8(OPART1),a1,L ; get head
|
||
move *a1(OTOTHITS),a14
|
||
JRUC TURRET_SBOMB
|
||
|
||
|
||
;BTR_ROCKET_COLL:
|
||
BTR_EXPLOSION_COLL:
|
||
MOVB *A8(OCHEWEDROCKET),A14
|
||
JRZ BTR_GV_XIT ;BR = We really didn't take it
|
||
|
||
; move @WAVEIRQS,a5 ; current int num
|
||
; move *a8(OROCKTIM),a14 ; int num of last rocket
|
||
; jrz ok2rock ; if 0, we're cool
|
||
; sub a5,a14
|
||
; addk 8,a14
|
||
; jrnn BTR_GV_XIT ; if we're within 8 ticks, no way
|
||
;ok2rock:
|
||
; move a5,*a8(OROCKTIM)
|
||
CLRB *A8(OCHEWEDROCKET) ;Reset for next rocket
|
||
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
|
||
CALLA POID_TO_PDATA ;GET PDATA IN A2
|
||
|
||
SOUNDZ SND_HIT_BY_ROCKET
|
||
|
||
movb *a8(OPARTID),a14
|
||
cmpi 3,a14 ; is this the turret?
|
||
jrne btr_rocket1
|
||
move *a8(OHITCNT),a3
|
||
subk RHITS_TUR,a3
|
||
jrnn notneg1
|
||
clr a3
|
||
notneg1:
|
||
move a3,*a8(OHITCNT)
|
||
; jrnz BTR_GV_XIT
|
||
JRZ BTR_BLOW_TURRET
|
||
|
||
BTR_SPIN_TURRET
|
||
SOUND1 SND_TURRET_HIT
|
||
|
||
MOVI ANIM_TURRET_HIT,A1
|
||
CALLA STRT_ANIM ;Make the turret spin
|
||
JRUC BTR_GV_XIT
|
||
*
|
||
* Blow off turret
|
||
*
|
||
* Adjust total btr pieces destroyed
|
||
*
|
||
BTR_BLOW_TURRET
|
||
move *a8(OPART1),a1,L ; get head
|
||
move *a1(OTOTHITS),a14
|
||
CMPK 4,A14
|
||
JRLO BTR_SPIN_TURRET ;BR = He did not kill enough other pts
|
||
TURRET_SBOMB
|
||
inc a14
|
||
move a14,*a1(OTOTHITS) ; tell head another part trashed
|
||
*
|
||
* Pull from multiparter, change OID, clear GUNVECT
|
||
*
|
||
calla PULL_PART
|
||
|
||
movi OID_JUNK,a1
|
||
calla CHANGE_OID
|
||
|
||
*
|
||
* Start fragment script
|
||
*
|
||
MMTM SP,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10 ;MAKE FRAGMENTS
|
||
MOVI 040000H,A0
|
||
MOVI 80H,A3
|
||
CALLA PreFrag_Center
|
||
MOVI FRAG_TURRET,B14 ;Use this fragment script
|
||
CALLA Fragger
|
||
MMFM SP,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
|
||
|
||
*
|
||
* Start animation
|
||
*
|
||
movi TURBLOW,a1
|
||
calla STRT_ANIM
|
||
*
|
||
* Give a velocity
|
||
*
|
||
MOVI -40000h,A14
|
||
move a14,*a8(OYVEL),L
|
||
movi 0c000h,a0
|
||
movi -0c000h,a1
|
||
calla RANGERND
|
||
move a0,*a8(OXVEL),L
|
||
MOVI 1800h,A14
|
||
move a14,*a8(OYACCEL)
|
||
ORIM M_GCOLL,*a8(OFLAGS),W
|
||
MOVIM DUMRETS,*a8(OGUNVECT),L
|
||
MOVIM TURRET_CVECT,*a8(OCVECT),L
|
||
|
||
; ADDSOUND turret flying off
|
||
; movi TURRET_BLAST_SND_TAB,A0
|
||
; calla PLAYER_SND
|
||
rets
|
||
|
||
|
||
btr_rocket1:
|
||
move *a8(OHITCNT),a3 ; how many times hit?
|
||
jrz BTR_GV_XIT
|
||
subk RHITS_BTR,a3
|
||
jrnn not_neg
|
||
clr a3
|
||
not_neg:
|
||
move a3,*a8(OHITCNT)
|
||
jrnz BTR_GV_XIT
|
||
NORM_PART_SBOMB
|
||
mmtm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,B10
|
||
callr ROCK_HOOK
|
||
mmfm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,B10
|
||
rets
|
||
|
||
|
||
Do_BTR_Dink:
|
||
calla DGV_FRAG_SPARK
|
||
|
||
movi BTRHITSND,a1
|
||
movk 3,a0
|
||
jauc TAB_SOUND
|
||
|
||
|
||
BTRHITSND
|
||
.long BTRHIT_S1,BTRHIT_S2,BTRHIT_S3
|
||
|
||
BTRHIT_S1 .word 0f334h,24,0a1e3h,0
|
||
BTRHIT_S2 .word 0f334h,13,0a1e0h,0
|
||
BTRHIT_S3 .WORD 0F334H,21,0A1e6H,0
|
||
|
||
|
||
*
|
||
* Troop Transport Gun Vector
|
||
*
|
||
* PASS:
|
||
* A2 = PTR TO PLAYER
|
||
* A8 = PTR TO OBJECT
|
||
*
|
||
BTR_GUNVECT:
|
||
move *a8(OHITCNT),a3 ; how many times hit?
|
||
; jrz BTR_GV_XIT
|
||
JAZ Do_Dink
|
||
|
||
MOVE *A2(PPLASMASHOTS),A14,W
|
||
JRZ BGV_NORM ;BR = Shooting normal gun
|
||
|
||
SUBK 10,A3
|
||
JRGT BGV_HITOK
|
||
CLR A3
|
||
MOVE A3,*A8(OHITCNT),W
|
||
JRUC ROCK_HOOK
|
||
|
||
BGV_NORM
|
||
dec a3
|
||
CMPK 1,A3
|
||
JRHS BGV_HITOK
|
||
MOVK 1,A3
|
||
BGV_HITOK
|
||
move a3,*a8(OHITCNT)
|
||
; janz DO_FLASH_DINK
|
||
JAUC DO_FLASH_DINK
|
||
ROCK_HOOK:
|
||
movb *a8(OPARTID),a5
|
||
move a5,a7
|
||
subk 6,a5
|
||
jrn BTR_GV_XIT
|
||
sll 5,a5
|
||
move *a8(OPART1),a6,L ; get head
|
||
MOVB *A6(OPARTEXPLODING),A14
|
||
JRZ BGV_XPLODE_IT ;BR = O.K. to explode this part
|
||
MOVKM 1,*A8(OHITCNT),W ;Reset to allow kill again
|
||
JRUC BTR_GV_XIT
|
||
BGV_XPLODE_IT
|
||
move *a6(OTOTHITS),a14
|
||
inc a14
|
||
move a14,*a6(OTOTHITS) ; tell head another part trashed
|
||
move a5,a1
|
||
addi BTR_dam_tbl,a1
|
||
move *a1,a1,L
|
||
jrz BTR_GV_XIT
|
||
|
||
MOVKB 1,*A6(OPARTEXPLODING)
|
||
|
||
; move *a8(OFLAGS),a14
|
||
; btst B_ANIM,a14
|
||
; jrz skpanistop
|
||
; calla PULL_ANIM
|
||
;skpanistop:
|
||
; move *a8(OCTRL),a4
|
||
; calla ANI
|
||
|
||
CALLA OBJ_ON_WNZ ;Make sure this malaka is on
|
||
CALLA STRT_ANIM
|
||
*
|
||
* get explosion/fire table
|
||
*
|
||
; srl 1,a5 ; word index
|
||
; addi BTR_explo,a5
|
||
; move *a5,a5 ; NUM (8 bits), Typ (1 bit)
|
||
; jrz BTR_GV_XIT
|
||
; movi FHKEXB_INIT,a6
|
||
; btst 7,a5
|
||
; jrz B_ok
|
||
; movi FHKEXC_INIT,a6
|
||
;B_ok:
|
||
; move a5,a4
|
||
; srl 8,a4 ; num of explos in a4
|
||
; sll 26,a5
|
||
; srl 21,a5
|
||
; addi EXPLO_PCS,a5 ; start of explo offsets
|
||
;BTRGlp:
|
||
; move a6,b0
|
||
; calla EASYMAKE
|
||
; move *a5+,a1,L
|
||
; movx a1,a3 ; X world offset
|
||
; sext a3
|
||
; sll 8,a3
|
||
; move *a8(OXVAL),a14,L
|
||
; add a3,a14
|
||
; move a14,*a0(OXVAL),L
|
||
; sra 16,a1
|
||
; sll 8,a1 ; Y world offset
|
||
; move *a8(OYVAL),a14,L
|
||
; add a1,a14
|
||
; move a14,*a0(OYVAL),L
|
||
; move *a8(OZVAL),a14,L
|
||
; subk 4,a14
|
||
; move a14,*a0(OZVAL),L
|
||
|
||
; calla INSOBJ
|
||
; dsj a4,BTRGlp
|
||
*
|
||
; cmpi 7,a7 ; is this the pipe on top?
|
||
; jrne BTR_GV_XIT
|
||
*
|
||
* add a fire
|
||
*
|
||
; movi BTR_FIRE_INIT,b0
|
||
; calla EASYMAKE
|
||
; jrz BTR_GV_XIT
|
||
; PUSH a8
|
||
; move *a8(OPART1),a8,L
|
||
; move *a8(OXVAL),a1,L ; set fire position
|
||
; addi 115*BTR_Z,a1
|
||
; move a1,*a0(OXVAL),L
|
||
; move *a8(OYVAL),a1,L
|
||
; subi 103*BTR_Z,a1
|
||
; move a1,*a0(OYVAL),L
|
||
; move *a8(OZVAL),a1,L
|
||
; addk 6,a1
|
||
; move a1,*a0(OZVAL),L
|
||
; calla INSOBJ
|
||
; calla INSPART
|
||
; PULLQ a8
|
||
BTR_GV_XIT:
|
||
rets
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TIRE_GUNVECT *
|
||
* *
|
||
* Gun vector for the BTR's tires. *
|
||
* *
|
||
* A2 = Ptr to player shooting *
|
||
* A8 = Ptr to tire *
|
||
* *
|
||
**************************************************************************
|
||
TIRE_GUNVECT
|
||
SOUNDZ SND_TIRE_HIT
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TURRET_GUNVECT *
|
||
* *
|
||
* Gun vector for the BTR's turret. *
|
||
* *
|
||
* A2 = Ptr to player shooting *
|
||
* A8 = Ptr to turret *
|
||
* *
|
||
**************************************************************************
|
||
TURRET_GUNVECT
|
||
MOVE *A2(PPLASMASHOTS),A14,W
|
||
JRNZ BTR_SPIN_TURRET
|
||
DORBOM_GUNVECT
|
||
JAUC DO_FLASH_DINK
|
||
|
||
|
||
|
||
;
|
||
; something new - velocities!
|
||
;
|
||
move a0,a5
|
||
clr a0
|
||
movi -080h,a1
|
||
calla RANGRAND
|
||
move a0,*a5(OZVEL),L
|
||
move a5,a0
|
||
|
||
|
||
|
||
;BTR_FIRE_INIT
|
||
; .long F1R1
|
||
; .word DMAWNZ,M_NOSCALE|M_NOPARTANI,OM_ANIM
|
||
; .long BTR_FIRE_ANIM
|
||
|
||
;BTR_FIRE_ANIM
|
||
; LW F1R1,3
|
||
; LW F1R2,3
|
||
; LW F1R3,3
|
||
; LW F1R4,3
|
||
; LW F1R5,3
|
||
; LW F1R6,3
|
||
; LW F1R7,3
|
||
; LW F1R8,3
|
||
; LW F1R9,3
|
||
; LW F1R10,3
|
||
; .long 0
|
||
|
||
|
||
|
||
|
||
.if 0 ; replaced by Do_Dink
|
||
*
|
||
* richochet
|
||
*
|
||
BTR_GV_rik:
|
||
* compute position of sparks
|
||
* Fire up sparks, then let em die
|
||
*
|
||
move *a2(PCURSORXY),a5,L
|
||
move @ZBASE,a6,L
|
||
move *a8(OZVAL),a4,L
|
||
subk 4,a4
|
||
sub a6,a4 ; world Z in a4
|
||
|
||
move a5,a3
|
||
zext a3
|
||
TOWORLDX a4,a3
|
||
srl 16,a5
|
||
TOWORLDY a4,a5
|
||
add a6,a4 ; univ Z in a4
|
||
movi SPARK_INIT,b0
|
||
calla EASYMAKE
|
||
move @XBASE,a14,L
|
||
add a14,a3
|
||
move @YBASE,a14,L
|
||
add a14,a5
|
||
move a3,*a0(OXVAL),L
|
||
move a5,*a0(OYVAL),L
|
||
move a4,*a0(OZVAL),L
|
||
calla INSOBJ
|
||
|
||
rets
|
||
|
||
.endif
|
||
|
||
|
||
|
||
*
|
||
* Turn next frame into start of script
|
||
*
|
||
|
||
MEXP_INIT
|
||
.byte 2,0,0,1
|
||
.long REXPLO
|
||
.word OID_BLOWUP, 0
|
||
LWWWW REXPLOA4h, DMAWNZ, M_MANSCALE|M_NOSCALE,0,OM_ANIM
|
||
.long misexplo
|
||
LWWWW REXPLOA4h, DMAWNZ|M_FLIPH, M_MANSCALE|M_NOSCALE,0,OM_PRVANIM
|
||
|
||
|
||
misexplo:
|
||
LW REXPLOA4h,2
|
||
LW REXPLOA6h,2
|
||
LW REXPLOA8h,2
|
||
LW REXPLOA9h,2
|
||
LW REXPLOA10h,2
|
||
LW REXPLOA11h,2
|
||
LW REXPLOA12h,2
|
||
LWL 1,3|AFunc,DELETE_OBJ
|
||
|
||
|
||
MSAFEXP_INIT
|
||
.long FHKEXPLOB1
|
||
.word DMAWNZ, M_MANSCALE|M_NOSCALE, OM_ANIM|OM_OID
|
||
.word OID_BLOWUP
|
||
.long safmisexplo
|
||
|
||
|
||
safmisexplo:
|
||
LW FHKEXPLOB1,2
|
||
LW FHKEXPLOB2,2
|
||
LW FHKEXPLOB3,2
|
||
LW FHKEXPLOB4,2
|
||
LW FHKEXPLOB5,2
|
||
LW FHKEXPLOB6,2
|
||
LW FHKEXPLOB7,2
|
||
LW FHKEXPLOB8,2
|
||
LW FHKEXPLOB9,2
|
||
LW FHKEXPLOB10,2
|
||
LW FHKEXPLOB11,2
|
||
LWL 1,1|AFunc,DELETE_OBJ
|
||
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_TURRET_FIRE_FNC *
|
||
* *
|
||
* Anim func for the turret gun fire. *
|
||
* *
|
||
* A8 = Ptr to part firing *
|
||
* AARG+,L = [Y,X] firing offset *
|
||
* *
|
||
**************************************************************************
|
||
A_TURRET_FIRE_FNC
|
||
MOVB *A8(OFLAGS),A14
|
||
JRN ATFF_X ;BR = Object offscreen
|
||
|
||
MOVE *A8(OXVAL),A3,L
|
||
MOVE @XBASE,A5,L
|
||
SUB A5,A3 ;Universe to World X
|
||
|
||
ABS A3
|
||
SRL 16,A3
|
||
CMPI 120,A3
|
||
JRGT ATFF_X ;BR = Too far to the side
|
||
|
||
CALLA GETAFARG_LONG ;GET THE FIRING OFFSET
|
||
MOVE A0,A3
|
||
CALLA EGUN_FLASH_MULTI ;MAKE A GUN FLASH
|
||
|
||
SOUND1 SND_BTR_FIRE
|
||
|
||
; MOVI [2,0],A5
|
||
MOVE @BASE_HIT,A5,W
|
||
ADDI 800H,A5
|
||
SLL 4,A5
|
||
ALLPLYR PLAYER_HIT ;HIT 'EM ALL
|
||
ATFF_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_RAPIDFIRE_DECISION *
|
||
* *
|
||
* Anim func to decide if we should fire again. *
|
||
* *
|
||
* A8 = Ptr to firing part *
|
||
* AARG+,L = Animation branch to fire again *
|
||
* *
|
||
**************************************************************************
|
||
A_RAPIDFIRE_DECISION
|
||
MOVB *A8(ORAPIDCNT),A14
|
||
DEC A14
|
||
MOVB A14,*A8(ORAPIDCNT)
|
||
JANZ SetAnim_AFARG
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* C_OCONST *
|
||
* *
|
||
* Create func to set the OCONST field of an object. *
|
||
* *
|
||
* A0 = Ptr to uninserted object *
|
||
* *B0+,W = OCONST value *
|
||
* *
|
||
**************************************************************************
|
||
C_OCONST
|
||
MOVE *B0+,B14,W
|
||
MOVE B14,A14
|
||
MOVE A14,*A0(OCONST),W
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* C_BTR_BODY *
|
||
* *
|
||
* Create func to setup the BTR body part. *
|
||
* *
|
||
* A0 = Ptr to uninserted object *
|
||
* *B0+,L = Blow func *
|
||
* *
|
||
**************************************************************************
|
||
C_BTR_BODY
|
||
MOVE *B0+,B14,L
|
||
MOVE B14,A14
|
||
MOVE A14,*A0(OBLOW_AFUNC),L
|
||
MOVIM 0101H,*A0(OCONST),W
|
||
RETS
|
||
|
||
NUM_BTR_PARTS .EQU 20
|
||
|
||
BTR_INIT
|
||
.byte NUM_BTR_PARTS, 0, 0, 7 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long P_BTRTUR1,P_BTR1,P_BTR2,P_BTR3,P_BTR4
|
||
.LONG TIREPAL,P_BHATCH ;PALS
|
||
.word OID_BTR, OM_COLL | (OM_WPOS | OM_GRND) | OM_INSERT
|
||
; world position, call INSERT_OBJ when done
|
||
.long BTR_CVECT
|
||
.long 1800000h,-090000H,BTR_Z ; X,Y,Z
|
||
*
|
||
* .long IMG
|
||
* .word DMAFLAGS, OFLAGS, OZOFF, OPTION_BITS
|
||
*
|
||
LWWWW DORBOM1, DMAWNZ|M_FLIPH, M_NOSCALE, -3, OM_GUNV | OM_CFUNC
|
||
.long DORBOM_GUNVECT
|
||
LW C_OCONST, 0101H
|
||
LWWWW HATCHC6, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_ANIM | OM_CFUNC | OM_PRVGUNV
|
||
.word 20,-94
|
||
.long btrhatch
|
||
LW C_OCONST, 0101H
|
||
LWWWW TURST1, DMAWNZ|M_FLIPH, M_NOSCALE, -1, OM_OPARTS | OM_GUNV | OM_ANIM | OM_CFUNC
|
||
.word -75,-96
|
||
.LONG TURRET_GUNVECT
|
||
.long btrturret
|
||
LW C_OCONST, 0101H
|
||
LWWWW BTOrt, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_GUNV | OM_COLL | OM_CFUNC
|
||
.word -79,5
|
||
.long BTR_HOLE_CVECT
|
||
.LONG METAL_GUNVECT
|
||
LW C_OCONST, 0101H
|
||
LWWWW BTOrt, DMAWNZ, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_COLL | OM_CFUNC
|
||
.word 79,5
|
||
.long BTR_HOLE_CVECT
|
||
LW C_OCONST, 0101H
|
||
NUM_BODY .EQU 6
|
||
LWWWW clea1, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_GUNV | OM_OPARTS | OM_CFUNC
|
||
.word -(51-251),47-99
|
||
.long BTR_GUNVECT
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN1
|
||
LWWWW clea2, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(34-148),10-104
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN234
|
||
LWWWW clea3, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(5-69),18-111
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN234
|
||
LWWWW clea4, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(29-168),54-102
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN234
|
||
LWWWW clea5, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(42-113),47-96
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN5
|
||
LWWWW clea6, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(46-252),56-54
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN6
|
||
LWWWW clea7, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(31-34),45-95
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN7
|
||
LWWWW clea8, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(19+24),46-95
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN8
|
||
LWWWW clea9, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(47+59),46-95
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN9
|
||
LWWWW clea10, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(52+148),50-98
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN10
|
||
LWWWW clea11, DMAWNZ|M_FLIPH, M_NOSCALE, 0, OM_OPARTS | OM_PRVGUNV | OM_CFUNC
|
||
.word -(41+158),53-50
|
||
.LONG C_BTR_BODY, A_BLOW_DAMN11
|
||
NUM_TIRE1 .EQU 17
|
||
LWWWW TIROT1, DMAWNZ|M_FLIPH, M_NOSCALE, -2, OM_OPARTS | OM_COLL | OM_GUNV | OM_ANIM
|
||
.word -8fh, -15
|
||
.LONG DUMCOLL
|
||
.LONG TIRE_GUNVECT
|
||
.long tirerotlftStart
|
||
LWWWW TIROT1, DMAWNZ|M_FLIPH, M_NOSCALE, -2, OM_OPARTS | OM_COLL | OM_PRVANIM | OM_PRVGUNV
|
||
.word -35h, -15
|
||
.LONG DUMCOLL
|
||
LWWWW TIROT1, DMAWNZ|M_FLIPH, M_NOSCALE, -2, OM_OPARTS | OM_COLL | OM_PRVANIM | OM_PRVGUNV
|
||
.word 39h, -15
|
||
.LONG DUMCOLL
|
||
LWWWW TIROT1, DMAWNZ|M_FLIPH, M_NOSCALE, -2, OM_OPARTS | OM_COLL | OM_PRVANIM | OM_PRVGUNV
|
||
.word 92h, -15
|
||
.LONG DUMCOLL
|
||
|
||
*
|
||
* Turret firing animation
|
||
*
|
||
btrturret:
|
||
LWLWWW TURST1,1|AFunc,A_RAND_REL_BYTE+3,2,6,ORAPIDCNT
|
||
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,30
|
||
LW 1,0
|
||
TURRET_RAPID_FIRE
|
||
LWLWW 1,1|AFunc,A_TURRET_FIRE_FNC+2,-4,-12
|
||
LWLL TURST2,4|AFunc,A_CHANGE_PAL+2,P_BTRTUR2
|
||
|
||
LWLL TURST1,1|AFunc,A_CHANGE_PAL+2,P_BTRTUR1
|
||
TURRET_RETURN
|
||
LWLL 1,4|AFunc,A_RAPIDFIRE_DECISION+2,TURRET_RAPID_FIRE
|
||
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,btrturret
|
||
|
||
|
||
; LW TUR2,4
|
||
;trt3:
|
||
; LW TUR3,4
|
||
; LWLL TUR4,4|AFunc,A_RANDBRANCH+2,tbk4
|
||
; LW TUR5,4
|
||
;trt6:
|
||
; LW TUR6,4
|
||
; LW TUR7,4
|
||
; LWLL TUR8,4|AFunc,A_RANDBRANCH+2,tbk8
|
||
; LW TUR9,4
|
||
; LW TUR10,4
|
||
; LW TUR11,4
|
||
;trt12:
|
||
; LW TUR12,4
|
||
; LW TUR13,4
|
||
; LWLL TUR14,4|AFunc,A_RANDBRANCH+2,tbk14
|
||
; LW TUR15,4
|
||
; LWLL TUR16,4|AFunc,A_BRANCH+2,btrturret
|
||
; .long 0
|
||
|
||
*
|
||
* Animation to spin turret when hit by a rocket
|
||
*
|
||
ANIM_TURRET_HIT
|
||
LWLL TUR5,1|AFunc,A_CHANGE_PAL+2,P_BTRTUR1
|
||
LWL 1,40|AFunc,OBJ_WNZ
|
||
LWLL TUR4,4|AFunc,A_SOUND+2,SND_TURRET_SPIN
|
||
LW TUR3,4
|
||
LW TUR2,4
|
||
|
||
LWLL TURST1,1|AFunc,A_AnimFrm+2,TURRET_RETURN
|
||
|
||
AU_CREATE_HATCHBOY:
|
||
MOVE @HOLD_ENEMY_DISPATCH,A14,W
|
||
JRNZ AUC_H_X
|
||
|
||
move *a8(OFLAGS),a14
|
||
btst B_OFSCRN,a14
|
||
jrnz AUC_H_X
|
||
|
||
MOVE A8,A9
|
||
MOVI WINBOY_INIT,B0 ;ALLOCATE OBJECT
|
||
CALLA CREATE_ENEMY
|
||
JRZ AUC_H_X ;BR = ERROR! ERROR!
|
||
|
||
MOVK M_WINDOW,A11 ;SET TYPE
|
||
MOVE A11,*A8(OEFLAGS),W ;SAVE TYPE
|
||
|
||
MOVE @RAND,A0,W ;LEFTY OR RIGHTY?
|
||
ANDI M_FLIPH,A0
|
||
MOVE *A8(OCTRL),A10,W
|
||
OR A0,A10
|
||
MOVE A10,*A8(OCTRL),W
|
||
|
||
movi 4<<15,a2
|
||
|
||
BTST B_FLIPH,A10 ;Is it flipped?
|
||
JRZ AU_CW_NOROM ;BR = No horiz flip to worry about
|
||
movi -8<<15,a2
|
||
AU_CW_NOROM
|
||
|
||
MOVE *A9(OXVAL),A1,L
|
||
ADD A2,A1 ;OFFSET X
|
||
MOVE *A9(OYVAL),A2,L
|
||
addi 115<<15,a2
|
||
MOVE A2,*A8(OYSTART),L
|
||
MOVE *A9(OZVAL),A3,L
|
||
addk 5,A3 ;OFFSET Z FROM GENERATOR
|
||
CALLA SET_ANIPU
|
||
|
||
move a9,*a8(OGenObj),L ; hold on to guy that created me
|
||
|
||
MOVI HATCHBOY_ANIM,A1
|
||
CALLA STRT_ANIM ;START ANIMATION
|
||
|
||
MOVI -20 << 15,A14
|
||
MOVE A14,*A8(OGRNDOFF),L ;GROUND OFFSET UPON FALL
|
||
|
||
MOVK 1,A14
|
||
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
|
||
|
||
movk 10,a14
|
||
movb a14,*a8(AnimLoop)
|
||
|
||
MOVK 20,A0 ;RANDOM DELAY BEFORE SHOOTING UP
|
||
MOVK 5,A1
|
||
CALLA RANGRAND
|
||
MOVB A0,*A8(AnimSLP)
|
||
MOVE A0,A3
|
||
|
||
MOVI 220,A0 ;RANDOM LIFE TIME
|
||
MOVI 50,A1
|
||
CALLA RANGRAND
|
||
ADD A3,A0 ;EXTRA DELAY BEFORE SHOOTING UP
|
||
SUBK 21,A0 ;POPUP AND POPDOWN TIME
|
||
MOVE A0,*A8(OETIME),W
|
||
MOVIB 127,*a9(AnimSLP)
|
||
|
||
MOVIM HATCHBOY_GUNVECT,*a8(OGUNVECT),L
|
||
MOVIM HATCHBOY_CVECT,*a8(OCVECT),L
|
||
|
||
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
|
||
|
||
move a8,a0
|
||
move a9,a8
|
||
calla INSPART
|
||
|
||
AUC_H_X:
|
||
rets
|
||
|
||
HATCHBOY_CVECT
|
||
WWL OID_PROCKET,~MASK_PLAYER,HATCHBOY_ROCKET_COLL
|
||
WL 0,DUMCRETS
|
||
|
||
HATCHBOY_ROCKET_COLL:
|
||
calla PULL_PART
|
||
callr DOWN_THE_HATCH
|
||
movi OUTCLUB_CVECT,a14
|
||
move a14,*a8(OCVECT),L
|
||
MOVIM OUTCLUB_GUNVECT,*a8(OGUNVECT),L
|
||
|
||
jauc NONBOY_ROCKET_COLL
|
||
|
||
|
||
HATCHBOY_GUNVECT:
|
||
calla PULL_PART
|
||
callr DOWN_THE_HATCH
|
||
movi OUTCLUB_CVECT,a14
|
||
move a14,*a8(OCVECT),L
|
||
MOVIM OUTCLUB_GUNVECT,*a8(OGUNVECT),L
|
||
|
||
jauc OUTCLUB_GUNVECT
|
||
|
||
HATCHBOY_SBOMB
|
||
calla PULL_PART
|
||
movi OUTCLUB_CVECT,a14
|
||
move a14,*a8(OCVECT),L
|
||
MOVIM OUTCLUB_GUNVECT,*a8(OGUNVECT),L
|
||
|
||
jauc NONBOY_SBOMB
|
||
|
||
|
||
DOWN_THE_HATCH:
|
||
move *a8(OZVAL),a14,L
|
||
addk 2,a14
|
||
move a14,*a8(OZVAL),L ; make sure we're behind hatch
|
||
|
||
move *a8(OGenObj),a5,L
|
||
jrz hclosing ; if 0, hatch is closing now
|
||
MOVKB 20,*a5(AnimSlp) ; start hatch closing
|
||
MOVKB 1,*a5(AnimSLP) ; start hatch closing
|
||
CLRM *a8(OGenObj),L
|
||
hclosing:
|
||
rets
|
||
|
||
btrhatch:
|
||
LWL HATCHC6,8|AFunc,A_STAY_TIL_ONSCRN
|
||
LW HATCHC5,4
|
||
; LW HATCHC4,3
|
||
LWL HATCHC3,4|AFunc,AU_CREATE_HATCHBOY
|
||
; LW HATCHC2,3
|
||
LW HATCHC1,4
|
||
LW 1,0
|
||
LW 1,0
|
||
; LW HATCHC2,3
|
||
LW HATCHC3,4
|
||
; LW HATCHC4,3
|
||
LW HATCHC5,4
|
||
LWLWW HATCHC6,10|AFunc,A_RAND_AnimSLP+2,30,130
|
||
LW 1,0
|
||
.long 0
|
||
|
||
|
||
;turback:
|
||
; LW TUR16,4
|
||
; LW TUR15,4
|
||
;tbk14:
|
||
; LW TUR14,4
|
||
; LW TUR13,4
|
||
; LWLL TUR12,4|AFunc,A_RANDBRANCH+2,trt12
|
||
; LW TUR11,4
|
||
; LW TUR10,4
|
||
; LW TUR9,4
|
||
;tbk8:
|
||
; LW TUR8,4
|
||
; LW TUR7,4
|
||
; LWLL TUR6,4|AFunc,A_RANDBRANCH+2,trt6
|
||
; LW TUR5,4
|
||
;tbk4:
|
||
; LW TUR4,4
|
||
; LWLL TUR3,4|AFunc,A_RANDBRANCH+2,trt3
|
||
; LW TUR2,4
|
||
; LWLL TUR1,4|AFunc,A_BRANCH+2,turback
|
||
; .long 0
|
||
|
||
A_RANDBRANCH:
|
||
calla RANDOM ; branch on random condition
|
||
btst 5,a0
|
||
janz A_BRANCH
|
||
rets
|
||
|
||
A_BRANCH_TRUE:
|
||
calla GETAFARG_LONG ; address of word to test into a0
|
||
move *a0,a0
|
||
janz A_BRANCH
|
||
rets
|
||
|
||
tirerotStart:
|
||
LW TIROT3,20
|
||
LW TIROT2,18
|
||
LW TIROT1,16
|
||
LW TIROT3,14
|
||
LW TIROT2,12
|
||
LW TIROT1,10
|
||
LW TIROT3,8
|
||
LW TIROT2,7
|
||
LW TIROT1,6
|
||
LW TIROT3,5
|
||
LW TIROT2,4
|
||
LWLL TIROT1,3|AFunc,A_BRANCH+2,tirerot
|
||
|
||
tirerot:
|
||
LW TIROT3,3
|
||
LW TIROT2,3
|
||
LW TIROT1,3
|
||
.long 0
|
||
|
||
tirerotStop:
|
||
LW TIROT3,3
|
||
LW TIROT2,4
|
||
LW TIROT1,5
|
||
LW TIROT3,6
|
||
LW TIROT2,7
|
||
LW TIROT1,8
|
||
LW TIROT3,10
|
||
LW TIROT2,12
|
||
LW TIROT1,14
|
||
LW TIROT3,16
|
||
LW TIROT2,18
|
||
LWL TIROT1,20|AFunc,PULL_ANIM
|
||
|
||
|
||
|
||
tirerotlftStart:
|
||
LW TIROT1,20
|
||
LW TIROT2,17
|
||
LW TIROT3,14
|
||
LW TIROT1,12
|
||
LW TIROT2,10
|
||
LW TIROT3,9
|
||
LW TIROT1,8
|
||
LW TIROT2,7
|
||
LW TIROT3,6
|
||
LW TIROT1,5
|
||
LW TIROT2,4
|
||
LWLL TIROT3,3|AFunc,A_BRANCH+2,tirerotlft
|
||
|
||
tirerotlft:
|
||
LW TIROT1,3
|
||
LW TIROT2,3
|
||
LW TIROT3,3
|
||
.long 0
|
||
|
||
|
||
tirerotlftStop:
|
||
LW TIROT1,3
|
||
LW TIROT2,4
|
||
LW TIROT3,5
|
||
LW TIROT1,6
|
||
LW TIROT2,7
|
||
LW TIROT3,8
|
||
LW TIROT1,9
|
||
LW TIROT2,10
|
||
LW TIROT3,12
|
||
LW TIROT1,14
|
||
LW TIROT2,17
|
||
LWL TIROT3,20|AFunc,PULL_ANIM
|
||
|
||
|
||
|
||
tdoor:
|
||
LWL DORBOM1,8|AFunc,A_STAY_TIL_ONSCRN
|
||
; LWL DORBOM2,3|AFunc,CREATE_MISSLE
|
||
LWL DORBOM3,4|AFunc,CREATE_MISSLE
|
||
; LWL DORBOM4,3|AFunc,BAY_OPEN
|
||
; LW DORBOM5,3
|
||
LWL DORBOM6,4|AFunc,BAY_OPEN
|
||
LW 1,0
|
||
LWL 1,5|AFunc,LAUNCH_MISSLE
|
||
; LW DORBOM5,3
|
||
; LW DORBOM4,3
|
||
LWL DORBOM3,4|AFunc,BAY_CLOSED
|
||
; LWL DORBOM2,3|AFunc,BAY_CLOSED
|
||
LWL DORBOM1,3|AFunc,PULL_ANIM
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,30,70
|
||
LW 1,0
|
||
.long 0
|
||
|
||
|
||
MISSL:
|
||
LW mossile1,14
|
||
LW mossile2,11
|
||
LW mossile3,9
|
||
LW mossile4,8
|
||
LW mossile5,7
|
||
LW mossile6,6
|
||
LW mossile7,5
|
||
LWLW 1,3|AFunc,A_SET_SCALE+1,80h
|
||
LWLW 1,1|AFunc,A_MISSLE_EXPL+1,0101h
|
||
|
||
|
||
.if 0 ;*****************************not used
|
||
|
||
BOLT:
|
||
LW bolt1,2
|
||
LW bolt2,2
|
||
LW bolt3,2
|
||
LW bolt4,2
|
||
LW bolt3,2
|
||
LW bolt4,2
|
||
LW bolt5,2
|
||
LW bolt6,3
|
||
LW bolt4,2
|
||
LW bolt5,2
|
||
LW bolt6,2
|
||
LW bolt7,2
|
||
LWL bolt8,2|AFunc,DELETE_OBJ
|
||
.long 0
|
||
|
||
|
||
SPARK:
|
||
LW spark1,2
|
||
LW spark2,2
|
||
LW spark3,2
|
||
LW spark4,2
|
||
LW spark5,2
|
||
LW spark6,2
|
||
LW spark7,2
|
||
LWL 1,2|AFunc,DELETE_OBJ
|
||
.long 0
|
||
|
||
|
||
SPARK_INIT:
|
||
.long spark1
|
||
.word DMAWNZ,M_NOSCALE|M_NOCOLL
|
||
.word OM_ANIM
|
||
.long SPARK
|
||
|
||
.endif ;*********************************************
|
||
|
||
;FHKEXB_INIT:
|
||
; .long FHKEXPLOB1
|
||
; .word DMAWNZ,M_NOCOLL
|
||
; .word OM_ANIM
|
||
; .long FHKEXB
|
||
|
||
;FHKEXC_INIT:
|
||
; .long FHKEXPLOC1
|
||
; .word DMAWNZ,M_NOSCALE|M_NOCOLL
|
||
; .word OM_ANIM
|
||
; .long FHKEXC
|
||
|
||
;SMCHNK:
|
||
; LW FHKI1SHRAPB1,3
|
||
; LW FHKI1SHRAPB2,3
|
||
; LW FHKI1SHRAPB3,3
|
||
; LW FHKI1SHRAPB4,4
|
||
; LW FHKI1SHRAPB5,4
|
||
; LW FHKI1SHRAPB6,5
|
||
; LW FHKI1SHRAPB7,5
|
||
; LWL 1,1|AFunc,DELETE_OBJ
|
||
; .long 0
|
||
|
||
;BIGCHNK:
|
||
; LW FHKEF1CHUNK1,3
|
||
; LW FHKEF1CHUNK2,3
|
||
; LW FHKEF1CHUNK3,3
|
||
; LW FHKEF1CHUNK4,4
|
||
; LW FHKEF1CHUNK5,4
|
||
; LW FHKEF1CHUNK6,4
|
||
; LW FHKEF1CHUNK7,5
|
||
; LW FHKEF1CHUNK8,5
|
||
; LWL 1,1|AFunc,DELETE_OBJ
|
||
; .long 0
|
||
|
||
|
||
;BtrChunks
|
||
; .long BIGCHNK,0
|
||
; .word OID_JUNK,(2<<11)+(3<<6)+FRGPAL
|
||
|
||
; .long SMCHNK,0
|
||
; .word OID_JUNK,(4<<11)+(3<<6)+FRGPAL
|
||
|
||
; .long BIGCHNK,0
|
||
; .word OID_JUNK,(1<<11)+(4<<6)+FRGPAL
|
||
|
||
; .long SMCHNK,0
|
||
; .word OID_JUNK,(3<<11)+FRGPAL
|
||
|
||
; .long 0
|
||
|
||
;FHKEXB:
|
||
; LWLL FHKEXPLOB1,3|AFunc,A_SOUND+2,SND_BTR_PRTEXP
|
||
; LWLLLL FHKEXPLOB2,3|AFunc,A_PreFrag_Center+6,BtrChunks,300h,60000h
|
||
; LW FHKEXPLOB3,3
|
||
; LW FHKEXPLOB4,3
|
||
; LW FHKEXPLOB5,4
|
||
; LW FHKEXPLOB6,4
|
||
; LW FHKEXPLOB7,4
|
||
; LW FHKEXPLOB8,4
|
||
; LW FHKEXPLOB9,4
|
||
; LW FHKEXPLOB10,4
|
||
; LW FHKEXPLOB11,4
|
||
; LWL 1,1|AFunc,DELETE_OBJ
|
||
; .long 0
|
||
|
||
;FHKEXC:
|
||
; LWLL FHKEXPLOC1,2|AFunc,A_SOUND+2,SND_BTR_PRTEXP ; ADDSOUND btr part explosion
|
||
; LW FHKEXPLOC2,2
|
||
; LW FHKEXPLOC3,2
|
||
; LW FHKEXPLOC4,2
|
||
; LW FHKEXPLOC5,2
|
||
; LW FHKEXPLOC6,2
|
||
; LW FHKEXPLOC7,2
|
||
; LW FHKEXPLOC8,2
|
||
; LW FHKEXPLOC9,3
|
||
; LW FHKEXPLOC10,3
|
||
; LW FHKEXPLOC11,3
|
||
; LWL 1,1|AFunc,DELETE_OBJ
|
||
; .long 0
|
||
|
||
|
||
|
||
DEC_ZPOS:
|
||
move *a8(OZVAL),a14,L
|
||
dec a14
|
||
move a14,*a8(OZVAL),L
|
||
rets
|
||
|
||
TURBLOW:
|
||
LWL TURBLO9,4|AFunc,OBJ_WNZ
|
||
; LW TURBLO8,2
|
||
LWL TURBLO7,4|AFunc,DEC_ZPOS
|
||
; LWL TURBLO6,2|AFunc,DEC_ZPOS
|
||
LW TURBLO5,4
|
||
; LW TURBLO4,2
|
||
LWL TURBLO3,4|AFunc,DEC_ZPOS
|
||
; LWL TURBLO2,2|AFunc,DEC_ZPOS
|
||
LW TURBLO1,4
|
||
; LW TURBLO10,2
|
||
.long 0
|
||
|
||
*
|
||
* BTR Sounds
|
||
*
|
||
SND_MISSLE_LAUNCH
|
||
.WORD 0F140H,93,0A3AEH,0 ;Missle launching
|
||
SND_MISSLE_EXPLODE
|
||
.WORD 0F141H,80,0A38BH,0 ;Missle blows up in mid-air
|
||
SND_MISSLE_EXPLHIP
|
||
.WORD 0F170H,30,0A309H,0 ;Missle launch sound Track skip
|
||
SND_MISSLE_HIT
|
||
.WORD 0F142H,60,0A38EH,0 ;Missle hits the screen
|
||
|
||
SND_BAY_OPEN
|
||
.WORD 0F126H,36,081fBH,0 ;servo
|
||
|
||
;TURRET_BLAST_SND_TAB
|
||
; .LONG SND_TURRET_BLAST1,SND_TURRET_BLAST2
|
||
;SND_TURRET_BLAST1
|
||
; .WORD 0F342H,30,0a084H,0 ;TURRET BLAST sound Chan P1
|
||
;SND_TURRET_BLAST2
|
||
; .WORD 0F242H,100,0a386H,0 ;TURRET BLAST sound Chan P2
|
||
|
||
SND_BTR_ARRIVE
|
||
.word 0F350h,3*60,834Fh,0
|
||
SND_BTR_STOP
|
||
.word 0F351h,51,08351h,0
|
||
SND_BTR_START
|
||
.word 0F350h,3*60,0834Fh,0
|
||
SND_BTR_LEAVE
|
||
.word 0F351h,260,08350h,0
|
||
SND_BTR_BGND
|
||
.word 0F300h,1,5354h,0 ;Make the BTR background sound
|
||
;SND_BTR_PRTEXP
|
||
; .word 0F340H,60,0A302H,0
|
||
SND_HOLE_HIT
|
||
.WORD 0E342H,88,0A390H,0 ;Hole took a square hit
|
||
SND_TIRE_HIT
|
||
.WORD 0F134H,20,0A37EH,0 ;Tire gets hit
|
||
SND_BTR_FIRE
|
||
.WORD 0F110H,39,0A326H,0 ;BTR fire sound
|
||
SND_HIT_BY_ROCKET
|
||
.WORD 0E340H,40,0A38DH,0 ;BTR takes a hit by the players rocket
|
||
SND_TURRET_SPIN
|
||
.WORD 0F141H,10,0A42DH,0 ;Turret spin
|
||
SND_TURRET_HIT
|
||
.WORD 0F141H,56,0A133H,0 ;Turret takes a CD hit
|
||
|
||
|
||
|
||
************************* New scroll acceleration routines
|
||
|
||
MAXACC .set 10000h
|
||
MAXZACC .set 10h
|
||
|
||
|
||
|
||
* .long X,Y,Z ; target in universe
|
||
*
|
||
*
|
||
*
|
||
*
|
||
S_STEER_TOWARD_TARGET:
|
||
MOVI 40h,A9
|
||
mmfm a11,a0,a1,a2 ; Z,Y,X
|
||
steerlp:
|
||
mmtm a12,a0,a1,a2 ; save in proc block
|
||
move @ZBASE_HR,a3,L
|
||
move @YBASE,a4,L
|
||
move @XBASE,a5,L
|
||
sub a3,a0
|
||
sub a4,a1
|
||
sub a5,a2
|
||
SRA 8,A0
|
||
SRA 10,A0
|
||
SRA 10,A2
|
||
|
||
movi MAXZACC,a3
|
||
movi MAXACC,a4
|
||
|
||
move a3,a14 ; max Z acc
|
||
move a0,a6
|
||
jrnn str0
|
||
neg a14 ; if acc is neg
|
||
neg a6
|
||
str0:
|
||
cmp a3,a6
|
||
jrle usez
|
||
move a14,a0
|
||
usez:
|
||
|
||
move a4,a14 ; max y acc
|
||
move a1,a6
|
||
jrnn str1
|
||
neg a14 ; if acc is neg
|
||
neg a6
|
||
str1:
|
||
cmp a4,a6
|
||
jrle usey
|
||
move a14,a1
|
||
usey:
|
||
|
||
move a4,a14 ; max x acc
|
||
move a2,a6
|
||
jrnn str2
|
||
neg a14 ; if acc is neg
|
||
neg a6
|
||
str2:
|
||
cmp a4,a6
|
||
jrle usex
|
||
move a14,a2
|
||
usex:
|
||
|
||
move a0,@ZSACCEL,L
|
||
move a1,@YSACCEL,L
|
||
move a2,@XSACCEL,L
|
||
|
||
sleep 1
|
||
mmfm a12,a0,a1,a2
|
||
dsj a9,steerlp
|
||
|
||
clr a14
|
||
move A14,@XSACCEL,L
|
||
move A14,@YSACCEL,L
|
||
move A14,@ZSACCEL,L
|
||
JAUC SCRL_DISPATCHER
|
||
|
||
|
||
|
||
*
|
||
* P_EBUTS colors 24 (up arrow) and 16 (down arrow)
|
||
* 2a0h 6c00h
|
||
*
|
||
*
|
||
|
||
*
|
||
* CONTROL FLASHING WHEN SOMETHING HITS SCREEN
|
||
*
|
||
* a1 = constant color
|
||
* a8 = object
|
||
*
|
||
HIT_SCREEN:
|
||
move a1,*a8(OCONST)
|
||
move *a8(OFLAGS),a14
|
||
movi FLASH_ANIM,a1
|
||
btst B_ANIM,a14
|
||
jrz no_pull
|
||
move a1,*a8(AnimFrm),L
|
||
move a1,*a8(AnimScr),L
|
||
jruc HShook
|
||
no_pull:
|
||
calla STRT_ANIM
|
||
HShook:
|
||
movk 5,a14
|
||
movb a14,*a8(AnimLoop)
|
||
movk 1,a14
|
||
movb a14,*a8(AnimSlp)
|
||
rets
|
||
|
||
FLASH_ANIM:
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,3
|
||
LWL 1,1|AFunc,WARREN_FLASH
|
||
LW 1,0
|
||
LWL 1,1|AFunc,WARREN_UNFLASH
|
||
LW 1,0
|
||
LWLL 1,1|AFunc,A_Anim_DSJ+2,FLASH_ANIM
|
||
LWL 1,1|AFunc,DELETE_OBJ
|
||
|
||
|
||
WARREN_FLASH:
|
||
move *A8(OCTRL),A14,W
|
||
andni M_WRNONZ,A14 ;Don't Write Non-Zero Data
|
||
ori M_CONNON,A14 ;Do Replace Non-Zero Data with constant
|
||
move A14,*A8(OCTRL),W
|
||
rets
|
||
|
||
|
||
WARREN_UNFLASH:
|
||
move *A8(OCTRL),A1,W
|
||
ori M_WRNONZ,A1 ;Do Write Non-Zero Data
|
||
andni M_CONNON,A1 ;Don't Replace Non-Zero Data with constant
|
||
move A1,*A8(OCTRL),W
|
||
rets
|
||
|
||
*
|
||
* Set AnimSLP based on the number of players
|
||
* WORD ARG 1 = param. A
|
||
* WORD ARG 2 = param. B
|
||
*
|
||
* AnimSLP = B - (A << CURPLYRS)
|
||
*
|
||
A_SLP_Based_CURPLYRS
|
||
move @CURPLYRS,a1 ; random sleep time based on # plyrs
|
||
calla GETAFARG_WORD ; param. A
|
||
sll a1,a0
|
||
movk 1,a1 ; minimum = 1
|
||
CALLA RANGRAND
|
||
move a0,a1
|
||
calla GETAFARG_WORD ; param. B
|
||
sub a1,a0
|
||
movb a0,*a8(AnimSLP)
|
||
rets
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BTR REENTRANCE WALL EXPLODE EFFECT *
|
||
* *
|
||
**************************************************************************
|
||
SND_PREBUST
|
||
.WORD 0F3F0H,130,0a305H,0 ;PRE-BUST EXPLOSION
|
||
|
||
|
||
NUM_BRICK_GROUPS EQU 6
|
||
NUM_BRICKS EQU 12
|
||
|
||
BTR_WALL_BLAST:
|
||
SOUND1 SND_PREBUST
|
||
MOVK NUM_BRICK_GROUPS,A10
|
||
|
||
MOVI WALL_FRAGMENT_TABLE,A11
|
||
WE_MASTER_LUPE
|
||
MOVK NUM_BRICKS,A6
|
||
WE_LUPE
|
||
MOVK 5,A0 ;GET RANDOM TABLE INDEX
|
||
CALLA RAND0
|
||
SLL 5,A0
|
||
ADD A11,A0
|
||
MOVE *A0,A5,L ;GET TABLE ENTRY
|
||
move a5,b0
|
||
CALLA EASYMAKE
|
||
JRZ WE_NEXT
|
||
MOVE A0,A8
|
||
|
||
move @YWORLD,a0,L
|
||
subi 30000h,a0
|
||
MOVI -100000h,A1 ;GET RANDOM Y PIXEL OFFSET
|
||
CALLA RANGRAND
|
||
MOVE A0,*A8(OYVAL),L
|
||
movi -10000h,a0
|
||
movi -60000h,a1
|
||
calla RANGRAND
|
||
MOVE A0,*A8(OYVEL),L
|
||
MOVIM 2400h,*a8(OYACCEL),W
|
||
|
||
MOVI -210*BTR_Z,a5
|
||
|
||
move @XBASE,a14,L
|
||
add a14,a5
|
||
move a5,*A8(OXVAL),L
|
||
movi 80000h,a0
|
||
movi 10000h,a1
|
||
calla RANGRAND
|
||
MOVE A0,*A8(OXVEL),L
|
||
|
||
move @ZBASE,a14,L
|
||
addi BTR_Z,a14
|
||
move a14,*A8(OZVAL),L ;SET Z
|
||
|
||
MOVI 020h,A0 ;RANDOM Z VELOCITY
|
||
MOVI -120h,A1
|
||
CALLA RANGERND
|
||
MOVE A0,*A8(OZVEL),L
|
||
|
||
CALLA RANDOM ;RANDOM FLIPPING
|
||
ANDI M_FLIPV|M_FLIPH,A0
|
||
MOVE *A8(OCTRL),A14,W
|
||
OR A0,A14
|
||
MOVE A14,*A8(OCTRL),W
|
||
|
||
CALLA INSERT_OBJ
|
||
WE_NEXT
|
||
DSJ A6,WE_LUPE
|
||
SLEEP 1
|
||
DSJ A10,WE_MASTER_LUPE
|
||
DIE
|
||
|
||
|
||
WALL_FRAGMENT_TABLE
|
||
.LONG BRIK_INIT,GXBRIK_INIT,CBRIK_INIT,CBRIK_INIT, EXPLO_BLOW_INIT
|
||
; NOSHRED_INIT
|
||
|
||
|
||
BRIK_INIT
|
||
.LONG BRIK1
|
||
.word DMAWNZ,M_GCOLL,OM_ANIM|OM_COLL
|
||
.LONG BRICK_CVECT,BRIK_ANIM
|
||
|
||
GXBRIK_INIT
|
||
.LONG GXBRIK1
|
||
.word DMAWNZ,M_GCOLL,OM_ANIM|OM_COLL
|
||
.LONG BRICK_CVECT,GXBRIK_ANIM
|
||
|
||
CBRIK_INIT
|
||
.LONG CBRIK1
|
||
.word DMAWNZ,M_GCOLL,OM_ANIM|OM_COLL
|
||
.LONG BRICK_CVECT,CBRIK_ANIM
|
||
|
||
|
||
;NOSHRED_INIT
|
||
; .LONG NOSHRED1, 0
|
||
; .WORD OID_JUNK, DMAWNZ, M_GCOLL, 0
|
||
; .LONG C_STRTANIM
|
||
; .LONG NOSHRED_ANIM
|
||
|
||
BRICK_CVECT
|
||
.WORD OID_GRND,0FFFFH
|
||
.LONG BRICK_COLLVECT
|
||
.WORD 0
|
||
.LONG DUMCOLL
|
||
|
||
BRICK_COLLVECT
|
||
CLR A14 ;STOP, DROP, AND ROLL!
|
||
MOVE A14,*A8(OZVEL),L
|
||
MOVE A14,*A8(OYACCEL),W
|
||
MOVE A14,*A8(OYVEL),L
|
||
MOVE *A8(OFLAGS),A14,W
|
||
ANDNI M_GCOLL,A14
|
||
MOVE A14,*A8(OFLAGS),W
|
||
RETS
|
||
|
||
|
||
BRIK_ANIM
|
||
LW BRIK1,2
|
||
LW BRIK3,2
|
||
LW BRIK5,2
|
||
LW BRIK7,2
|
||
LW BRIK9,2
|
||
LW BRIK11,2
|
||
LW BRIK12,2
|
||
LW BRIK14,2
|
||
LW BRIK16,2
|
||
LW BRIK18,2
|
||
LW BRIK21,2
|
||
LW BRIK23,2
|
||
LWL BRIK25,2|AFunc,A_OFFSCRN_DEL
|
||
.long 0
|
||
|
||
GXBRIK_ANIM
|
||
LW GXBRIK1,2
|
||
LW GXBRIK2,2
|
||
LW GXBRIK3,2
|
||
LW GXBRIK4,2
|
||
LW GXBRIK5,2
|
||
LW GXBRIK6,2
|
||
LW GXBRIK7,2
|
||
LW GXBRIK8,2
|
||
LW GXBRIK9,2
|
||
LW GXBRIK10,2
|
||
LWL GXBRIK11,2|AFunc,A_OFFSCRN_DEL
|
||
.long 0
|
||
|
||
CBRIK_ANIM
|
||
LW CBRIK1,2
|
||
LW CBRIK2,2
|
||
LW CBRIK3,2
|
||
LW CBRIK4,2
|
||
LW CBRIK5,2
|
||
LW CBRIK6,2
|
||
LW CBRIK7,2
|
||
LW CBRIK8,2
|
||
LW CBRIK9,2
|
||
LW CBRIK10,2
|
||
LW CBRIK11,2
|
||
LWL CBRIK12,2|AFunc,A_OFFSCRN_DEL
|
||
.long 0
|
||
|
||
;NOSHRED_ANIM
|
||
; LW NOSHRED1,2
|
||
; LW NOSHRED2,2
|
||
; LW NOSHRED3,2
|
||
; LW NOSHRED4,2
|
||
; LW NOSHRED5,2
|
||
; LW NOSHRED6,2
|
||
; LW NOSHRED7,2
|
||
; LW NOSHRED8,2
|
||
; LW NOSHRED9,2
|
||
; LW NOSHRED10,2
|
||
; LW NOSHRED11,2
|
||
; LWL NOSHRED12,2|AFunc,A_OFFSCRN_DEL
|
||
; .long 0
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BTR Destruction stuff *
|
||
* *
|
||
**************************************************************************
|
||
**************************************************************************
|
||
* *
|
||
* A_DELETE_BTR *
|
||
* *
|
||
* Anim Func to delete the whole BTR multi-parter, *
|
||
* no matter what part is calling. *
|
||
* *
|
||
* A8 = Ptr to any part *
|
||
* *
|
||
**************************************************************************
|
||
A_DELETE_BTR
|
||
CALLA GET_HEAD_PART
|
||
|
||
CALLR DEL_HATCH_BOY
|
||
|
||
movk 1,a0
|
||
move a0,@BTR_GONE ; tell the world to move on.
|
||
|
||
JAUC DELETE_ENEMY ;Now rid yourself of the desk
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CONTINUE_PART_FINAL *
|
||
* *
|
||
* Anim func to grab OPART_FINAL_CONT and anim jump to it. *
|
||
* Unless it is 0, then fall through. *
|
||
* *
|
||
* A8 = Ptr to part finally exploding *
|
||
* *
|
||
**************************************************************************
|
||
A_CONTINUE_PART_FINAL
|
||
MOVE *A8(OPART1),A0,L
|
||
CLRB *A0(OPARTEXPLODING)
|
||
MOVE *A8(OPART_FINAL_CONT),A1,L
|
||
JANZ SetAnim
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_START_PARTS *
|
||
* *
|
||
* Anim func to start all relevent parts animating. *
|
||
* *
|
||
**************************************************************************
|
||
A_START_PARTS
|
||
CALLA GETAFARG_LONG
|
||
MOVE A0,A2
|
||
MOVK NUM_BODY,A1
|
||
CALLA FINDPART
|
||
MOVK 11,A6
|
||
MOVE A2,A1
|
||
ASP_LOOP
|
||
CALLA STRTANIM
|
||
MOVE *A0(OPARTS),A0,L
|
||
DSJS A6,ASP_LOOP
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN *
|
||
* *
|
||
* Anim func to blow out a body part. *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN
|
||
MOVE *A8(OBLOW_AFUNC),A14,L
|
||
JUMP A14
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN1 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN1
|
||
MOVI 80000H,A1
|
||
MOVE A1,A2
|
||
MOVI -80000H,A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN234 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN234
|
||
MOVI 20000H,A1
|
||
MOVI 60000H,A2
|
||
MOVI -80000H,A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN5 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN5
|
||
MOVI 20000H,A1
|
||
MOVE A1,A2
|
||
MOVI -80000H,A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN6 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN6
|
||
MOVI 80000H,A1
|
||
MOVE A1,A2
|
||
CLR A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN7 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN7
|
||
CLR A1
|
||
MOVE A1,A2
|
||
MOVI -80000H,A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN8 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN8
|
||
MOVI -20000H,A1
|
||
MOVE A1,A2
|
||
MOVI -80000H,A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN9 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN9
|
||
MOVI -40000H,A1
|
||
MOVE A1,A2
|
||
MOVI -80000H,A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN10 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN10
|
||
MOVI -80000H,A1
|
||
MOVE A1,A2
|
||
MOVI -80000H,A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BLOW_DAMN11 *
|
||
* *
|
||
* Anim func to blow damage piece. *
|
||
* *
|
||
* A8 = Ptr to damage piece *
|
||
* *
|
||
**************************************************************************
|
||
A_BLOW_DAMN11
|
||
MOVI -80000H,A1
|
||
MOVE A1,A2
|
||
CLR A3
|
||
MOVE A3,A4
|
||
JRUC BLOW_BTR_PART
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BLOW_BTR_PART *
|
||
* *
|
||
* Anim func entrypoint to blow a part of the desk. *
|
||
* *
|
||
* A1 = MIN XVEL *
|
||
* A2 = MAX XVEL *
|
||
* A3 = MIN YVEL *
|
||
* A4 = MAX YVEL *
|
||
* A8 = Ptr to object we are blowing *
|
||
* *
|
||
* Note: trashes much register *
|
||
* *
|
||
**************************************************************************
|
||
BLOW_BTR_PART
|
||
CALLA CREATE_COPY
|
||
JRZ BBP_X ;No objects available
|
||
|
||
MOVE *A0(OCTRL),A5,W
|
||
|
||
MOVE A0,A6
|
||
|
||
MOVE A2,A0
|
||
CALLA RANGERND
|
||
BTST B_FLIPH,A5
|
||
JRNZ BBP_X_POS
|
||
NEG A0
|
||
BBP_X_POS
|
||
MOVE A0,*A6(OXVEL),L
|
||
|
||
MOVE A4,A0
|
||
MOVE A3,A1
|
||
CALLA RANGERND
|
||
MOVE A0,*A6(OYVEL),L
|
||
|
||
MOVE A6,A0
|
||
|
||
ANDNIM M_NODISP,*A0(OFLAGS),W
|
||
|
||
MOVI ANIM_BLOW_SCREEN,A1
|
||
CALLA STRTANIM
|
||
|
||
CALLA INSOBJ
|
||
BBP_X
|
||
RETS
|
||
|
||
*
|
||
* Turret hits the ground
|
||
*
|
||
ANIM_TUR_GROUND
|
||
LWL 1,1|AFunc,OBJ_OFF
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Box+6,FRAG_EXPLOSION,80h,40000h
|
||
LWL 1,1|AFunc,A_MULTI_METAL_CHUNK
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Box+6,FRAG_EXPLOSION,80h,40000h
|
||
LWL 1,1|AFunc,DELETE_OBJ
|
||
|
||
ANIM_DAMN1
|
||
LWLL DAMN1,1|AFunc,A_CHANGE_PAL+2,P_BTRD1
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN2
|
||
LWLL DAMN2,1|AFunc,A_CHANGE_PAL+2,P_BTRD1
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN3
|
||
LWLL DAMN3,1|AFunc,A_CHANGE_PAL+2,P_BTRD2
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN4
|
||
LWLL DAMN4,1|AFunc,A_CHANGE_PAL+2,P_BTRD4
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN5
|
||
LWLL DAMN5,1|AFunc,A_CHANGE_PAL+2,P_BTRD3
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN6
|
||
LWLL DAMN6,1|AFunc,A_CHANGE_PAL+2,P_BTRD2
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN7
|
||
LWLL DAMN7,1|AFunc,A_CHANGE_PAL+2,P_BTRD3
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN8
|
||
LWLL DAMN8,1|AFunc,A_CHANGE_PAL+2,P_BTRD3
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN9
|
||
LWLL DAMN9,1|AFunc,A_CHANGE_PAL+2,P_BTRD3
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN10
|
||
LWLL DAMN10,1|AFunc,A_CHANGE_PAL+2,P_BTRD1
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
ANIM_DAMN11
|
||
LWLL DAMN11,1|AFunc,A_CHANGE_PAL+2,P_BTRD1
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
|
||
ANIM_TIREFL
|
||
; LWLWL TIREFL,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPART_FINAL_CONT,0
|
||
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_BIG_SHIT_EXPLOSION
|
||
|
||
ANIM_BIG_SHIT_EXPLOSION
|
||
LWLLL 1,1|AFunc,A_BRANCH_IF_TRUE+4,HOLD_ENEMY_DISPATCH,ANIM_LITTLE_SHIT
|
||
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Box+6,FRAG_EXPLOSION,80h,40000h
|
||
LWL 1,1|AFunc,A_MULTI_METAL_CHUNK
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Box+6,FRAG_EXPLOSION,80h,40000h
|
||
; LWL 1,1|AFunc,A_START_MEDIUM_SHAKE
|
||
LWL 1,26|AFunc,A_MULTI_METAL_CHUNK
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Box+6,FRAG_EXPLOSION,80h,40000h
|
||
; LWL 1,1|AFunc,A_START_MEDIUM_SHAKE
|
||
LWL 1,16|AFunc,A_MULTI_METAL_CHUNK
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,10
|
||
LW 1,0
|
||
; LWL 1,1|AFunc,A_CHECK_IF_FINAL
|
||
LWL 1,1|AFunc,A_CONTINUE_PART_FINAL
|
||
LWL 1,1|AFunc,PULL_ANIM
|
||
|
||
ANIM_LITTLE_SHIT
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,10
|
||
LW 1,0
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Box+6,FRAG_EXPLOSION,80h,40000h
|
||
LWL 1,1|AFunc,A_MULTI_METAL_CHUNK
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,10
|
||
LW 1,0
|
||
LWL 1,1|AFunc,A_CONTINUE_PART_FINAL
|
||
LWL 1,1|AFunc,PULL_ANIM
|
||
|
||
*
|
||
* BTR final explosion
|
||
* Start this on the head part
|
||
*
|
||
ANIM_FINAL_EXPLOSION
|
||
LWLW 1,1|AFunc,A_Set_AnimLoop+1,3
|
||
AFE_LOOP
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_EXPLOSION,0400h,40000h
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_EXPLOSION,0400h,40000h
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,10,25
|
||
LWLL 1,0|AFunc,A_Anim_DSJ+2,AFE_LOOP
|
||
|
||
LWLL 1,1|AFunc,A_START_PARTS+2,ANIM_PART_EXPLOSIONS
|
||
|
||
LWLW 1,1|AFunc,A_Set_AnimLoop+1,8
|
||
AFE_CRAFT_BLOW
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_EXPLOSION,0400h,40000h
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,10
|
||
LWLL 1,0|AFunc,A_Anim_DSJ+2,AFE_CRAFT_BLOW
|
||
|
||
LWLL 1,1|AFunc,A_SOUND+2,SND_FINAL_EXPLODE3
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_DESK_EXPLOSION,01000h,80000h
|
||
LWLL 1,1|AFunc,A_SOUND+2,SND_FINAL_EXPLODE2
|
||
LWLL 1,1|AFunc,A_SOUND+2,SND_FINAL_EXPLODE1
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_DESK_METAL,01000h,80000h
|
||
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Rain+6,FRAG_TIRES,0,40000H
|
||
|
||
LWLL 1,1|AFunc,A_START_PARTS+2,ANIM_DAMN_BLOW
|
||
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Rain+6,FRAG_DESK_RAIN,80H,40000H
|
||
|
||
LWL 1,1|AFunc,DELAYED_PRAISE
|
||
|
||
LWL 1,60|AFunc,OBJ_OFF_MULTI
|
||
|
||
LWL 1,1|AFunc,A_DELETE_BTR
|
||
|
||
*
|
||
* Explosions from a given part
|
||
*
|
||
ANIM_PART_EXPLOSIONS
|
||
LWLW 1,1|AFunc,A_Set_AnimLoop+1,5
|
||
APE_LOOP
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_EXPLOSION_SMALL,0100h,40000h
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,20
|
||
LWLL 1,0|AFunc,A_Anim_DSJ+2,APE_LOOP
|
||
LWL 1,1|AFunc,PULL_ANIM
|
||
|
||
*
|
||
*Final blow animations
|
||
*
|
||
ANIM_DAMN_BLOW
|
||
LWLW 1,1|AFunc,A_Set_AnimLoop+1,5
|
||
ANIM_D1_LOOP
|
||
LWL 1,5|AFunc,A_BLOW_DAMN
|
||
LWLL 1,1|AFunc,A_Anim_DSJ+2,ANIM_D1_LOOP
|
||
LWL 1,1|AFunc,PULL_ANIM
|
||
|
||
*Simple animation to check if we are off screen and delete.
|
||
ANIM_BLOW_SCREEN
|
||
LWLL 1,5|AFunc,A_ONSCREEN+2,ANIM_BLOW_SCREEN
|
||
LWL 1,1|AFunc,DELETE_OBJ
|
||
|
||
**************************************************************************
|
||
* *
|
||
* BTR Fragment scripts and such *
|
||
* *
|
||
**************************************************************************
|
||
FRAG_MISSLE_DOOR
|
||
.long PART_EXPLOSION,F_EXPLOSION_OUT
|
||
.word OID_JUNK,10*800H+5*40H+FRGPAL+FRGNOFLY
|
||
.long PART_EXPLOSION,F_EXPLOSION_OUT
|
||
.word OID_JUNK,10*800H+5*40H+FRGPAL+FRGNOFLY
|
||
.long PART_EXPLOSION,F_EXPLOSION_OUT
|
||
.word OID_JUNK,10*800H+5*40H+FRGPAL+FRGNOFLY
|
||
.long 0
|
||
|
||
FRAG_TURRET
|
||
.long PART_EXPLOSION,F_EXPLOSION_UP
|
||
.word OID_JUNK,10*800H+5*40H+FRGPAL+FRGNOFLY
|
||
.long PART_EXPLOSION,F_EXPLOSION_UP
|
||
.word OID_JUNK,10*800H+5*40H+FRGPAL+FRGNOFLY
|
||
.long PART_EXPLOSION,F_EXPLOSION_UP
|
||
.word OID_JUNK,10*800H+5*40H+FRGPAL+FRGNOFLY
|
||
.long 0
|
||
|
||
FRAG_TIRES
|
||
.long tirerotlft,F_TIRE
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP
|
||
|
||
.long tirerotlft,F_TIRE
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP
|
||
|
||
.long tirerotlft,F_TIRE
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP
|
||
|
||
.long tirerotlft,F_TIRE
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP
|
||
|
||
.LONG 0
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* F_EXPLOSION_UP *
|
||
* *
|
||
* Frag func that makes an explosion fly up. *
|
||
* *
|
||
* A0 = Ptr to un-inserted object. *
|
||
* *
|
||
* Note: Frag funcs must preserve A8-A11 and all B-File regs. *
|
||
* *
|
||
**************************************************************************
|
||
F_EXPLOSION_UP
|
||
MOVE *A0(OYVEL),A14,L
|
||
ABS A14
|
||
NEG A14
|
||
MOVE A14,*A0(OYVEL),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* F_TIRE *
|
||
* *
|
||
* Frag func for the BTR tire. *
|
||
* *
|
||
* A0 = Ptr to un-inserted object. *
|
||
* *
|
||
* Note: Frag funcs must preserve A8-A11 and all B-File regs. *
|
||
* *
|
||
**************************************************************************
|
||
F_TIRE
|
||
MOVI M_FLIPH,A14
|
||
CALLA RANDFLIP ;Flip it left or right
|
||
|
||
MOVE *A0(OXVEL),A1,L
|
||
ABS A1
|
||
CMPI 8000H,A1
|
||
JRHS FT_VELOK
|
||
MOVI 8000H,A1
|
||
FT_VELOK
|
||
MOVE *A0(OCTRL),A14,W
|
||
BTST B_FLIPH,A14
|
||
JRZ FT_NOFLIP
|
||
NEG A1
|
||
FT_NOFLIP
|
||
MOVE A1,*A0(OXVEL),L
|
||
|
||
MOVIM FRAG_TIRE_CVECT,*A0(OCVECT),L
|
||
|
||
ORIM M_NOSCALE,*A0(OFLAGS),W
|
||
|
||
MOVE @RAND,A1,L
|
||
SLL 24,A1
|
||
SRL 24,A1
|
||
ADDI 0A000H,A1 ;Give a slightly unique Z
|
||
MOVE @ZBASE,A14,L
|
||
ADD A14,A1
|
||
MOVE A1,*A0(OZVAL),L
|
||
|
||
PUSH A0
|
||
MOVI -60000H,A0
|
||
MOVI -40000H,A1
|
||
CALLA RANGERND
|
||
MOVE A0,A1
|
||
PULLQ A0
|
||
|
||
MOVE A1,*A0(OYVEL),L
|
||
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FRAG_TIRE_CVECT *
|
||
* *
|
||
* BTR tire collision vector table *
|
||
* *
|
||
**************************************************************************
|
||
FRAG_TIRE_CVECT
|
||
WWL OID_GRND,0FFFFH,TIRE_GROUND_COLL
|
||
WL 0,DUMCRETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* TIRE_GROUND_COLL - Collision routine for tire fragment. *
|
||
* A8 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
TIRE_GROUND_COLL
|
||
MOVB *A8(OFLAGS),A14 ;Are we out of Range?
|
||
JAN DELETE_OBJ ;BR = Yes
|
||
|
||
MOVE *A8(OYVEL),A14,L
|
||
MOVE A14,A1
|
||
SRA 1,A14 ;Knock off 25% for the bounce.
|
||
SUB A14,A1
|
||
NEG A1 ;Turn it up
|
||
MOVE A1,*A8(OYVEL),L
|
||
RETS
|
||
|
||
*
|
||
* DETERMINE IF A BERZERKER SHOULD BE UNLEASHED UPON EXITING THE
|
||
* ELEVATOR
|
||
*
|
||
S_SHOCKER
|
||
MOVKM 1,@WAVE_WAIT,W
|
||
MOVE a14,@ENEMY_QUOTA,W
|
||
move @PLYR_SEEN,a14
|
||
jaz skipparm ; forget it if vidcam shot
|
||
calla SET_WAVE
|
||
jauc SCRL_DISPATCHER
|
||
|
||
skipparm:
|
||
move *a11+,a14,L ; skip over dispatch table
|
||
jauc SCRL_DISPATCHER
|
||
|
||
|
||
|
||
.IF 0 ;Snake graveyard
|
||
|
||
.DEF CREATE_A_SNAKE
|
||
|
||
.bss SNAKEPOS,4*16 ; table of occupied snake positions
|
||
|
||
***************************************************
|
||
*
|
||
* POP UP SNAKE
|
||
*
|
||
***************************************************
|
||
TngWrldZ .set 5000h
|
||
TngHitZ .set 3800h
|
||
TngStScl .set 20000h>>Z2SCALE
|
||
TngEndScl .set 0d0h
|
||
TngTiks .set 13
|
||
TngZVel .set (TngHitZ-TngWrldZ)/TngTiks
|
||
TngSlope .set ((TngStScl-TngEndScl)*10000h)/(TngWrldZ-TngHitZ)
|
||
TngIntrcpt .set ((TngStScl<<16)-(TngSlope*TngWrldZ))>>16
|
||
|
||
OBODYTNG .set ODATA+40h ; xlink between snake body and tongue
|
||
|
||
SNAKE_INIT:
|
||
.byte 4,0,0,1
|
||
.long COBRA1_P
|
||
.word OID_DESK, OM_COLL|OM_POS|OM_SPOS|OM_INSERT
|
||
.long SNAKE_CVECT
|
||
.long [300,45],TngWrldZ
|
||
|
||
.long COBRAHED1
|
||
.word DMAWNZ, M_NOSCALE, 0, OM_ANIM | OM_GUNV
|
||
.long DUMRETS
|
||
.long SNAKEMTHOPN
|
||
.long COBRAHED1
|
||
.word DMAWNZ| M_FLIPH, M_NOSCALE, 0, OM_PRVGUNV
|
||
.long COBRABOD1
|
||
.word DMAWNZ, M_NOSCALE, 2, OM_PRVGUNV
|
||
.long COBRABOD1
|
||
.word DMAWNZ|M_FLIPH, M_NOSCALE, 2, OM_PRVGUNV
|
||
|
||
|
||
TUNG_INIT:
|
||
.byte 4,0,0,1
|
||
.long COBRAT_P
|
||
.word OID_CAT, OM_COLL
|
||
.long TUNG_CVECT
|
||
|
||
.long COBTUNG2A
|
||
.word DMAWNZ, M_MANSCALE, -4, OM_ANIM |OM_GUNV
|
||
.long TUNG_GUNVECT
|
||
.long SNAKETNG
|
||
|
||
.long COBTUNG2A
|
||
.word DMAWNZ| M_FLIPH, M_MANSCALE, -4, OM_PRVGUNV
|
||
|
||
.long COBTUNG1
|
||
.word DMAWNZ, M_MANSCALE, -2, OM_GUNV
|
||
.long DUMRETS
|
||
|
||
.long COBTUNG1
|
||
.word DMAWNZ|M_FLIPH, M_MANSCALE, -2, OM_PRVGUNV
|
||
|
||
|
||
SNAKEMTHOPN:
|
||
LWLL 1,3|AFunc,A_SET_OYVEL+2,-60000h
|
||
|
||
LWLW 1,1|AFunc,A_STAY_TIL_SY_LT+1,155
|
||
|
||
LWLL 1,1|AFunc,A_SET_OYVEL+2,0
|
||
|
||
LWL 1,1|AFunc,A_SET_ATTACK_TIME
|
||
LW 1,0
|
||
|
||
LW COBRAHED2,3|AMulti
|
||
LW COBRAHED2,3
|
||
|
||
LW COBRAHED3,3|AMulti
|
||
LW COBRAHED3,3
|
||
|
||
LW COBRAHED4,3|AMulti
|
||
LW COBRAHED4,3
|
||
|
||
LWL 1,1|AFunc,SNAKE_ATTACK
|
||
|
||
SNAKEMTHCLO:
|
||
LWLL COBRAHED3,3|AMulti|AFunc,A_SET_OYVEL+2,48000h
|
||
LW COBRAHED3,3
|
||
|
||
LW COBRAHED2,3|AMulti
|
||
LW COBRAHED2,3
|
||
|
||
LW COBRAHED1,3|AMulti
|
||
LW COBRAHED1,3
|
||
|
||
LWL 1,7|AFunc,A_AnimGo+2,SNAKE_WAIT
|
||
|
||
|
||
SNAKETNG:
|
||
LW COBTUNG2B,2|AMulti
|
||
LW COBTUNG2B,2
|
||
|
||
LW COBTUNG2C,2|AMulti
|
||
LW COBTUNG2C,2
|
||
|
||
LW COBTUNG2B,2|AMulti
|
||
LW COBTUNG2B,2
|
||
|
||
LW COBTUNG2A,2|AMulti
|
||
LW COBTUNG2A,2
|
||
|
||
.long 0
|
||
|
||
SNAKE_WAIT:
|
||
LWL 1,7|AFunc,A_OFF_DELETE_OBJ
|
||
.long 0
|
||
|
||
|
||
A_SET_ATTACK_TIME:
|
||
move @ATTACK_TIME,a14
|
||
movb a14,*a8(AnimSLP)
|
||
cmpk 5,a14
|
||
jrlt lvit
|
||
subk 4,a14
|
||
move a14,@ATTACK_TIME
|
||
lvit:
|
||
rets
|
||
|
||
|
||
TUNG_GUNVECT:
|
||
PUSH a8
|
||
move *a8(OPART1),a8,L ; get tongue head
|
||
move *a8(ODATA),a14,L ; Z vel
|
||
jrz markit ; if stinging
|
||
jrnn noeffect ; if retracting
|
||
|
||
movi TngWrldZ,a5 ; set it back
|
||
move a5,*a8(ODATA+20h),L ; new world Z
|
||
*
|
||
* Store new tongue ZPOS
|
||
*
|
||
move @ZBASE,a14,L
|
||
move a5,a1
|
||
add a14,a1 ; new univ Z in a1
|
||
calla STORE_ZVALH ; set new Z of TONGUE
|
||
|
||
noeffect:
|
||
PULLQ a8
|
||
rets
|
||
|
||
markit:
|
||
movk 1,a14 ; if stinging player,
|
||
move a14,*a8(ODATA+60h) ; mark as hit
|
||
jruc noeffect
|
||
|
||
SNAKE_CVECT
|
||
TUNG_CVECT
|
||
WWL OID_PROCKET,~MASK_PLAYER,SNAKE_COLL
|
||
WWL OID_PEXPLOSION,~MASK_PLAYER,SNAKE_COLL
|
||
WL 0,DUMCRETS
|
||
|
||
|
||
SNAKEBLOWCHK:
|
||
move *a8(OID),a14
|
||
cmpi OID_DESK,a14
|
||
jrne notbody
|
||
MMTM SP,B1,B2,B4,B5,B6,B8,B9,B10
|
||
move *a8(OPART1),a8,L ; spurt if body
|
||
move *a8(OPARTS),a8,L
|
||
move *a8(OPARTS),a8,L
|
||
calla A_RANDOM_MULTI_CHUNK ; do both halves of body
|
||
move *a8(OPARTS),a8,L
|
||
calla A_RANDOM_MULTI_CHUNK
|
||
MMFM SP,B1,B2,B4,B5,B6,B8,B9,B10
|
||
notbody:
|
||
move *a8(OPART1),a0,L ; leave head in a0 regardless
|
||
rets
|
||
|
||
SNAKE_COLL:
|
||
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
|
||
CALLA POID_TO_PDATA ;GET PDATA IN A2
|
||
|
||
PUSH a8
|
||
callr SNAKEBLOWCHK
|
||
move *a0(OBODYTNG),a8,L ; if snake body hit,
|
||
jrz skipit ; tongue may be gone already
|
||
PUSH a0
|
||
callr SNAKEBLOWCHK
|
||
move a0,a8
|
||
calla DELETE_OBJ_PROC
|
||
PULLQ a0
|
||
skipit:
|
||
move a0,a8
|
||
calla DELETE_OBJ_PROC
|
||
PULLQ a8
|
||
rets
|
||
|
||
|
||
SNAKE_PARTS:
|
||
LW COBCHNK1A,2
|
||
LW COBCHNK1B,2
|
||
LW COBCHNK1C,2
|
||
LW COBCHNK1D,2
|
||
LW COBCHNK1E,2
|
||
LW COBCHNK1F,2
|
||
LW COBCHNK1G,2
|
||
LWL COBCHNK1H,2|AFunc,A_OFF_DELETE_OBJ
|
||
.long 0
|
||
|
||
*
|
||
* don't create snake near an object which is really close
|
||
*
|
||
* Exit: Carry clear - okay to create
|
||
* Carry set - don't create near UNIV X in a1
|
||
*
|
||
CHECK_CLOSE:
|
||
movi FGLIST,a0
|
||
movi 5200h,a2 ; limit
|
||
move @ZBASE,a3,L
|
||
add a3,a2 ; get universe limit
|
||
move @XBASE,a3,L
|
||
move @YWORLD,a5,L
|
||
move @YBASE,a14,L
|
||
add a14,a5
|
||
subi 30000h,a5 ; buffer zone in Y
|
||
CC_lp:
|
||
move *a0(OLINK),a0,L
|
||
move *a0(OFLAGS),a14
|
||
jrn CC_lp ; ignore SCRNOBJs
|
||
move *a0(OZVAL),a14,L
|
||
cmp a14,a2
|
||
jrlt scan_over
|
||
move *a0(OYVAL),a4,L ; is it near ground
|
||
cmp a4,a5
|
||
jrgt CC_lp ; if no, keep looking
|
||
|
||
move *a0(OXVAL),a1,L ; keep away from this place
|
||
sub a3,a1 ; get in world
|
||
move @XSCROLL,a14,L
|
||
xor a1,a14 ; positive if scroll neg and world neg or
|
||
btst 31,a14 ; scroll pos and world pos
|
||
jrnz scan_over
|
||
|
||
setc ; don't do it if blocking obj is crossing screen
|
||
rets
|
||
|
||
|
||
scan_over:
|
||
clrc
|
||
rets
|
||
|
||
|
||
killme:
|
||
dec a1
|
||
move a1,@SCROLLKILL
|
||
DIE
|
||
|
||
|
||
* a9 = lower sleep time
|
||
* a10 = upper sleep time
|
||
*
|
||
CREATE_A_SNAKE:
|
||
movi 340,a9
|
||
movi 900,a10
|
||
CRESNK:
|
||
move @RAND,a3
|
||
andi 31,a3
|
||
cmpk 3,a3
|
||
jrgt normslp
|
||
sloop 30,skpa10adj ; periodically do another quick one
|
||
|
||
normslp:
|
||
RANDSLPR a9,a10
|
||
cmpk 18,a9
|
||
jrle skpa9adj
|
||
subk 5,a9
|
||
skpa9adj:
|
||
cmpi 100,a10
|
||
jrle skpa10adj
|
||
subk 18,a10
|
||
skpa10adj:
|
||
|
||
move @SCROLLKILL,a1
|
||
jrnz killme
|
||
|
||
move @XSACCEL,a14,L
|
||
abs a14
|
||
cmpi 34000h,a14
|
||
jrgt CRESNK ; don't create if SCROLLING too fast
|
||
|
||
callr CHECK_CLOSE ; don't create if an object is really close
|
||
jrc CRESNK
|
||
|
||
movi SNAKE_INIT,b0
|
||
calla MULTIMAKE
|
||
|
||
movi 160*TngWrldZ*2,a0
|
||
calla RAND0 ; random adjustment to X
|
||
move *a8(OXVAL),a14,L
|
||
add a14,a0
|
||
move a8,a5 ;
|
||
CSnxtprt:
|
||
move a0,*a5(OXVAL),L ; adjust X VAL accordingly
|
||
|
||
move *a5(OPARTS),a5,L
|
||
jrnz CSnxtprt
|
||
|
||
move @XSCROLL,a14,L
|
||
move a14,*a8(OXVEL),L
|
||
|
||
jruc CRESNK
|
||
|
||
|
||
|
||
*
|
||
* called from Snake body animation when fully popped up
|
||
*
|
||
SNAKE_ATTACK:
|
||
PUSH a8 ; save snake obj
|
||
movi TUNG_INIT,b0
|
||
calla MULTIMAKE
|
||
jrz TUNGX
|
||
PULLQ a10
|
||
|
||
move a8,a0
|
||
movi 1b1bh,a14
|
||
partslp:
|
||
MOVE a14,*a0(OCONST),W
|
||
move *a0(OPARTS),a0,L
|
||
jrnz partslp
|
||
|
||
move a10,*a8(OBODYTNG),L ; cross link body and tongue
|
||
move a8,*a10(OBODYTNG),L
|
||
|
||
movi TngWrldZ,a5 ; world Z in a5
|
||
move a5,*a8(ODATA+20h),L
|
||
callr SetTonguePos ; match tongue position to body's
|
||
|
||
move a10,a0
|
||
calla PULLANIM ; snake body no longer animating
|
||
|
||
movi TngStScl,a5
|
||
calla SET_SCALE_MANUAL
|
||
|
||
calla INSERT_OBJ ; insert new multiparter
|
||
|
||
CREATE PID_IND,TUNG_ADJ_SCL
|
||
move a0,*a8(OPLINK),L
|
||
|
||
movi TngZVel,a3 ; send tongue off in Z
|
||
move a3,*a8(ODATA),L
|
||
|
||
CREATEP PID_IND,TUNG_ADJ_POS
|
||
move a0,*a10(OPLINK),L
|
||
|
||
SOUND1 SND_SNAKE_HISS
|
||
|
||
TUNGX:
|
||
rets
|
||
|
||
SND_SNAKE_HISS .word 0f341h,86,0a3b6h,0
|
||
|
||
|
||
*
|
||
* Set objects velocity to match scroll velocities
|
||
*
|
||
MatchScrollVel:
|
||
move @XSCROLL,a14,L
|
||
move a14,*a8(OXVEL),L
|
||
|
||
move @ZSCROLL,a14,L
|
||
sra ZFRAC,a14 ; convert to lores
|
||
move a14,*a8(OZVEL),L
|
||
rets
|
||
|
||
|
||
* ENTRY:
|
||
* a10 = obj of body
|
||
* a8 = obj of tongue
|
||
* a5 = world Z of tongue (Set Tongue only)
|
||
*
|
||
ComputeTonguePos:
|
||
move *a8(ODATA+20h),a5,L ; world Z
|
||
move *a8(ODATA),a14,L ; Z VEL
|
||
add a14,a5
|
||
move a5,*a8(ODATA+20h),L ; new world Z
|
||
SetTonguePos:
|
||
move @ZBASE,a2,L
|
||
move a5,a1
|
||
add a2,a1 ; new univ Z in a1
|
||
calla STORE_ZVALH ; set new Z of TONGUE
|
||
|
||
movi TngWrldZ,a1
|
||
add a2,a1 ; keep snake at constant world Z
|
||
move a8,a2 ; set new Z of Snake BODY
|
||
move a10,a8
|
||
calla STORE_ZVALH
|
||
move a2,a8
|
||
|
||
move *a10(ODAG),a0,L
|
||
move *a10(OANIOFF),a14,L
|
||
addxyi [-3,0],a14 ; kludge adjustment
|
||
addxy a14,a0 ; get anim pt SCRN X
|
||
move a0,a1
|
||
sext a0
|
||
sra 16,a1 ; get anim pt SCRN Y
|
||
|
||
move @YHALF,a14
|
||
sub a14,a1
|
||
subi HALFX,a0
|
||
setf 16,1,1
|
||
move a5,a3
|
||
mpys a5,a1 ; world Y
|
||
mpys a0,a3 ; world X
|
||
setf 32,0,1
|
||
move @XBASE,a14,L
|
||
add a14,a3
|
||
move @XSCROLL,a14,L
|
||
add a14,a3
|
||
move @YBASE,a14,L
|
||
add a14,a1
|
||
|
||
move a8,a0
|
||
CTPlp:
|
||
move a3,*a0(OXVAL),L
|
||
move a1,*a0(OYVAL),L
|
||
move *a0(OPARTS),a0,L
|
||
jrnz CTPlp
|
||
|
||
rets
|
||
|
||
|
||
* a10 = obj of body
|
||
* a8 = obj of tongue
|
||
TUNG_ADJ_POS:
|
||
callr ComputeTonguePos
|
||
sloop 1,TUNG_ADJ_POS
|
||
|
||
|
||
|
||
* a8 = tung
|
||
* a10 = body
|
||
TUNG_ADJ_SCL:
|
||
movi TngSlope,a9
|
||
movi TngIntrcpt,a11
|
||
TAS1:
|
||
move *a8(OZVAL),a5,L
|
||
move @ZBASE,a14,L
|
||
sub a14,a5 ; world Y in a14
|
||
mpys a9,a5
|
||
sra 16,a5 ; lose fraction
|
||
add a11,a5 ; get scale factor
|
||
cmpi TngEndScl,a5
|
||
jrlt sting
|
||
calla SET_SCALE_MANUAL
|
||
|
||
sloop 1,TAS1
|
||
|
||
sting:
|
||
CLRM *a8(ODATA),L ; stop Z motion of tongue
|
||
*
|
||
* 10 TIKS OF IN YOUR FACE
|
||
*
|
||
sleep 10
|
||
|
||
*
|
||
* 56 TIKS OF FLASH AND STING IN YOUR FACE
|
||
*
|
||
movk 7,a11
|
||
stinglp:
|
||
clr a3
|
||
movi [1,4000h],a5
|
||
calla CK_PLAYER_HIT
|
||
|
||
move a8,a4
|
||
callA UNIV_FLASH ; flash 1st part
|
||
move *a8(OPARTS),a8,L
|
||
callA UNIV_FLASH ; flash flipped other half
|
||
move a4,a8
|
||
|
||
movk 8,a9
|
||
waitlp:
|
||
move *a8(ODATA+60h),a14 ; nonzero means hit by bullet
|
||
jrz nosave
|
||
CLRM *a8(ODATA+60h),W ; reset hit flag
|
||
subk 3,a11 ; save some zapping
|
||
jrgt nosave
|
||
movk 1,a11 ; for last dsjs
|
||
nosave:
|
||
sleep 1
|
||
dsjs a9,waitlp
|
||
|
||
dsj a11,stinglp
|
||
*
|
||
* START WITHDRAWING
|
||
*
|
||
movi -TngZVel,a3
|
||
move a3,*a8(ODATA),L
|
||
|
||
calla ALL_COLLS_OFF ; for tongue only
|
||
movi TngSlope,a9
|
||
movi TngIntrcpt,a11
|
||
|
||
TAS0:
|
||
move *a8(OZVAL),a5,L
|
||
move @ZBASE,a14,L
|
||
sub a14,a5 ; world Z in a5
|
||
mpys a9,a5
|
||
sra 16,a5 ; lose fraction
|
||
add a11,a5 ; get scale factor
|
||
cmpi TngStScl,a5
|
||
jagt TAS2
|
||
calla SET_SCALE_MANUAL
|
||
|
||
sloop 1,TAS0
|
||
|
||
TAS2:
|
||
CLRM *a8(OPLINK),L
|
||
move *a10(OPLINK),a0,L ; kill TUNG_ADJ_POS
|
||
move a14,*a10(OPLINK),L
|
||
move a14,*a10(OBODYTNG),L ; remove link to tongue
|
||
calla KILL
|
||
|
||
calla DELETE_OBJ ; get rid of the tongue
|
||
|
||
move a10,a0 ; pop snake down
|
||
movi SNAKEMTHCLO,a1
|
||
calla STRTANIM
|
||
|
||
DIE
|
||
|
||
******************************************* END OF SNAKE
|
||
|
||
.ENDIF
|
||
.END
|
||
|