revolution-x/GXBEEK2.ASM

4099 lines
80 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

.MLIB "GXMACS.LIB"
.FILE "GXBEEK1.ASM"
.TITLE " <<< GENERATION X -- BEEKEEPER ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1993 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "GXENEMY.INC"
.INCLUDE "IMGTBL.GLO"
.include gxnonboy.h
.include "univtbl.glo"
.include "gxbeek2.tbl"
.include "gxnatv.h"
.INCLUDE "GXCONTRL.H"
.text
OLD_WAY .set 0
**
** The following .refs replace .include gxglo.h
**
.ref A_Anim_DSJ,A_SOUND,EASYMAKE,A_RAND_OXVEL,CK_PLAYER_HIT
.ref BG_TO_FG,ONESND,UNIV_DAMAGE_HANDLER,A_CHNG_SCRL_TBL,END_JUNGLE
.ref UNIV_ROCKET_COLL,NUM_OUT_THERE,UNIV_FLASH,ZBASE_HR,MAX_ALLOWED
.ref A_OFF_KILL_OBJ,RAND,UNIV_COLL_CHECK,XBASE,SET_SCALE_MANUAL
.ref YBASE,CURPLYRS,ZBASE,A_RAND_HFLIP,YHALF,A_Set_AnimLoop
.ref FADE_ONE,GET_SPARE_PAL,ONESND_Z,UNIV_DISAB_ENEMY_GEN
.ref LAVA_SHATTER_HOOK,LAVADAM2,LAVADAM3,LAVADAM4,LAVADAM5,LAVADAM6
.ref A_CHANGE_PAL,PALSET,PALRAM,A_CLR_OZVEL,DELETE_OBJ_PROC
.ref JUNGDIECALL,SET_ANIPU,YWORLD,XSCROLL,PROCK_AWARD,SCROLLKILL
.ref NONBOY_SBOMB,INSERT_ENEMY,CREATE_ENEMY, WVSTRT_CHANCE
.ref HIT_SCREEN,WAVEIRQS,A_STAY_TIL_ZW_LT,YSCROLL,EGUN_FLASH
.ref A_SET_OYACCEL,A_STAY_TIL_GRND_HIT,SCROLL_FLAG,CHNG_SCRL_TBL
.ref SCRL_DISPATCHER,HOLD_ENEMY_DISPATCH,A_SOUNDZ_ONSCREEN
.ref DEL_ENEMY_NOAUD,DELETE_ENEMY,OBJENEMIES,PLAYER_AWARD_GIRL
.ref DROP_A_MASK_GUY,SND_MUSICOFF,A_TAB_SOUNDZ,SET_FLPS
**
** End of gxglo.h
**
.DEF ROPE_BRIDGE,BRIDGE_STATE,KER_SND_TAB
.DEF KERRI_GUNVECT,FLAMBUSH_CVECT,A_Unlink_Enemy
.DEF TRKDR_GUNVECT,TRKDR_CVECT,CURPLYR_ADJ
.DEF MAGDR_GUNVECT,MAGDR_CVECT,NOTICE_DAMAGE,CHECK4_CHEM_DAM
.DEF CHECK_ENEMY_DISAB,ENAB3DRS,ENEMY_ZW_MAX
.DEF AU_CREATE_BUGEYZ,AU_CREATE_NATIVE,LAST_CHEM_DAMAGE
.DEF IN_SECRET,BUB_CVECT,BUB_GUNVECT,HONEY_DESTROY
.DEF MACH_FIRE,GLOW_BLUE,AU_CREATE_BUSHGUY,AU_CREATE_TREEGUY
.DEF RUSTLE_GUNVECT,RUSTLE_CVECT,BIG_EXPLOSIONS,KER3RUN
.def TTOP4_CVECT,TTOP4_GUNV,LILP2_CVECT,LILP2_GUNV,S_INIT_NATIVES
.def PALM_GUNVECT,RUSTLE2_GUNVECT,MAX_SPEARS_ALLOWED
.DEF KERRI_RUNAWAY_ANIM
.ref SKY_SND_TAB,FRG_GL_10 ; from gxjungle
.REF METAL_DR_GUNVECT
.ref CHECK_HOST_ANIM ; from gxnonboy
.ref THROW_CD_WARREN ; from gxpower
.ref A_Set_LOOP_STRT ; from gxafunc
.REF SUCK_ME_IN,BLOW_GLASS_OUT ; scroll table in gxscrol2
**** from GXAFUNC.ASM
.REF A_CREATEP_R, A_BRANCH_IF_FALSE, A_Set_Rel_Long, A_SET_OXVEL
.REF A_SOUNDZ, A_PreFrag_Center, A_INIT_AnimSLP
**** from GXRAM.ASM
.REF NUM_SPEARS,ENEMY_QUOTA
**** from GXBZERK.ASM
.REF PROC_BZERK_HEADON_OFFSET
**** from GXD.ASM
.REF GET_SHAD_MULTI
***** from GXMONDR2.ASM
.REF A_SPAWN_PROJECTILE, NSPEAR_INIT
***** from GXNONBOY.ASM
.REF N_CHUNK
***** from GXUNIV1.ASM
.REF BOX_CHECK_OBJ
***** from GXBLOOD.ASM
.REF BLOODY_BULLET_HIT, A_BLOOD_SPLORCH, A_SBOMB_BLOOD
.bss LAST_CHEM_DAMAGE,32 ; when last chem damage occured
.bss LAST_SPEAR_IRQ,32 ; When did he throw it?
.bss ENEMY_ZW_MAX,32 ; Max ZW that enemy can exist
.bss IN_SECRET,16 ; 1 if you are in a secret room, else 0
.bss ENAB3DRS,16 ; if non-zero, collision with doors ok to process
.bss LAST_SPEAR_X,16 ; DAG of native who threw last spear
.bss MAX_SPEARS_ALLOWED,16 ; how many spears allowed?
.bss BRIDGE_STATE,16 ; for rope bridge
.bss filler,16 ; to keep long word aligned
**********************************************************************
*
* ROPE_BRIDGE
*
**********************************************************************
;
; BRIDGE_STATE - a 1 indicates a pile that is destroyed
;
; bits 3 2 1 0
; far lft far rt close lft close rt
;
ROPE_BRIDGE:
move @BRIDGE_STATE,a0
movk 1,a3 ; a bit
move *a8(OXVAL),a1,L
move @XBASE,a2,L
sub a2,a1 ; pile world X
jrnn onrt
sll 1,a3 ; shift bit if pile is on right
onrt:
move *a8(OZVAL),a1,L
cmpi -20000h,a1
jrlt close
sll 2,a3
close:
or a3,a0
move a0,@BRIDGE_STATE
move a0,a1
srl 2,a0
movk 1,a9 ; signal FAR fall
cmpk 3,a0
jreq MakeItFall
sll 30,a1
srl 30,a1
neg a9 ; signal NEAR fall
cmpk 3,a1
jrne SkipFall
MakeItFall:
CREATEP PID_IND,ROPE_BRIDGE_FALL_PROC
SkipFall:
rets
SND_BRIDGE_OUT
.word 0f380h,248,8555h,0
ROPE_BRIDGE_FALL_PROC:
SOUND1 SND_MUSICOFF
sleep 4
SOUND1 SND_BRIDGE_OUT
clr a0
dec a0
move a0,@BRIDGE_STATE ; neg means it's going down
movi (3<<BIT_ID)|(OID_UNIV & ~MASK_SUPP),a10 ; LOG ID
movi (4<<BIT_ID)|(OID_UNIV & ~MASK_SUPP),a11 ; PILE ID
move a9,a9
jrn fwd_loop
bak_loop:
movi MASK_SUPP,a3
clr a2 ; found count
bak_srch:
move *a8(OBLINK),a8,L
cmpi FGLIST,a8
jreq end_srch
move *a8(OID),a0
andn a3,a0
cmp a0,a10 ; is it a log?
jreq bgotalog
cmp a0,a11
jrne bak_srch
*
* end search with far pile
*
move *a8(OZVAL),a14,L
cmpi -20000h,a14
jrgt bak_srch
jruc end_srch
bgotalog:
callr TOSS_LOG
cmpk 2,a2
jrlt bak_srch
sloop 2,bak_loop
fwd_loop:
movi MASK_SUPP,a3
clr a2 ; found count
fwd_srch:
move *a8,a8,L
move *a8(OID),a0
andn a3,a0
cmp a0,a10 ; is it a log?
jreq fgotalog
cmp a0,a11
jrne fwd_srch
*
* end search with far pile
*
move *a8(OZVAL),a14,L
cmpi -20000h,a14
jrlt fwd_srch
end_srch:
movi END_JUNGLE,a0
calla CHNG_SCRL_TBL
DIE
fgotalog:
callr TOSS_LOG
cmpk 2,a2
jrlt fwd_srch
sloop 2,fwd_loop
TOSS_LOG:
calla BG_TO_FG
MOVIM -2c000h,*a8(OYVEL),L
MOVIM 1c00h,*a8(OYACCEL),W
CREATE PID_IND,OFFSCRN_DELETE
inc a2
rets
OFFSCRN_DELETE:
sleep 25
move *a8(OFLAGS),a14
btst B_OFSCRN,a14
jrz OFFSCRN_DELETE
calla DELETE_OBJ
DIE
********************************************************
*
* BUBBLER
*
********************************************************
BUB_CVECT
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,BUB_COLLVECT
WL 0,DUMCRETS
BUB_COLLVECT:
CALLA UNIV_COLL_CHECK
JRNZ BUB_DONE
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
movi M_NOMORE|M_NEXTFRM,a7
jruc bub_hk
BUB_GUNVECT:
MOVI M_NOMORE|M_FLASHOBJ,A7
bub_hk:
MOVI 100,A5
CLR A9 ;NO OFFSET
CALLA UNIV_DAMAGE_HANDLER
jrc bigexpsnd
move a10,a10
jrz BUB_DONE
SOUNDZ SND_LAVA_CRACK
BUB_DONE:
rets
*
* reached last frame
*
bigexpsnd:
callr NOTICE_DAMAGE
MOVI 1000,A1
CLR A9
CALLA PRINT_SCORE
PUSH a8
MMTM SP,B1,B2,B4,B5,B6,B8,B9,b10
movi BUBSPLSH_INIT,b0
calla MULTIMAKE ; splash in a8
MMfM SP,B1,B2,B4,B5,B6,B8,B9,b10
jrz BUBX
move *sp,a0,L ; orig in a0 (and still on stack)
move *a0(OXVAL),*a8(OXVAL),L
move *a0(OYVAL),*a8(OYVAL),L
move *a0(OZVAL),a1,L
addk 3,a1
calla STORE_ZVAL
move *a8(OPARTS),a14,L
move *a8(OXVAL),*a14(OXVAL),L
move *a8(OYVAL),*a14(OYVAL),L
calla INSERT_OBJ
movi BUBDAMP,a11
CREATE PID_IND,BUB_SHATTER_PROC ; do frags and bubbles
BUBX:
PULLQ a8
RETS
BUB_SHATTER_PROC
SOUNDZ SND_LAVA_SHATTER
jauc LAVA_SHATTER_HOOK
SND_LAVA_CRACK
.WORD 0E344H,47,0A32BH,0
SND_LAVA_SHATTER
.WORD 0F346H,64,0A316H,0
BUBSPLSH_INIT
.byte 2,0,0,1
.long BUBDAMP
.word OID_JUNK,0
LWWWW LAVADAM2,DMAWNZ,0,0,OM_ANIM
.long BUBSPLSH
LWWWW LAVADAM2,DMAWNZ|M_FLIPH,0,0,0
BUBSPLSH:
LWLL LAVADAM2,1|AMulti|AFunc,A_CHANGE_PAL+2,BUBDAMP
LWLL LAVADAM2,6|AFunc,A_CHANGE_PAL+2,BUBDAMP
LW LAVADAM3,1|AMulti
LW LAVADAM3,5
LW LAVADAM4,1|AMulti
LW LAVADAM4,4
LW LAVADAM5,1|AMulti
LW LAVADAM5,4
LW LAVADAM6,1|AMulti
LW LAVADAM6,4
LWL 1,1|AFunc,DELETE_OBJ
*========================================================================
TRKDR_CVECT
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,TRKDR_COLLVECT
WL 0,DUMCRETS
MAGDR_CVECT
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,MAGDR_COLLVECT
WL 0,DUMCRETS
TRKDR_COLLVECT:
CALLA UNIV_COLL_CHECK
JRNZ TRKCX
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
TRKDR_GUNVECT:
move @ENAB3DRS,a14
; jrz TRKCX
JRZ TGV_SND
movi TRICK_DRSW,a1
calla STRT_ANIM
CLRM @ENAB3DRS,W
TGV_SND
JAUC METAL_DR_GUNVECT
TRKCX:
rets
MAGDR_COLLVECT:
CALLA UNIV_COLL_CHECK
JRNZ MAGCX
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
MAGDR_GUNVECT:
move @ENAB3DRS,a14
; jrz MAGCX
JRZ MGV_SND
MOVE @ENEMY_QUOTA,A14,W
JRZ MD_OPEN_EASY ;BR = We are not done
MOVI [-77, 24],A3
MOVI [-72, 46],A4
CALLA BOX_CHECK_OBJ
JRZ MGV_SND ;BR = Not the latch
MD_OPEN_EASY
movi MAGIC_DRSW2,a1
calla STRT_ANIM
CLRM @ENAB3DRS,W
MGV_SND
JAUC METAL_DR_GUNVECT
MAGCX:
rets
TRICK_DRSW:
LWLL DOORSWING1,1|AFunc,A_SOUND+2,SND_UNLATCH
LW DOORSWING2,4
LW DOORSWING3,4
LW DOORSWING4,4
TRICK_SUPRISE
LWLWL DOORSWING5,30|AFunc,A_CREATEP_R+9,PID_BZERK,PROC_BZERK_HEADON_OFFSET
.LONG [0,0],0,2
LW DOORSWING4,4
LW DOORSWING3,4
LWLL DOORSWING2,4|AFunc,A_SOUND+2,SND_LATCH
LWL DOORSWING1,1|AFunc,ENABLE_3DOORS
LWL 1,1|AFunc,PULL_ANIM
MAGIC_DRSW2:
LWLL DOORSWING1,1|AFunc,A_SOUND+2,SND_UNLATCH
LW DOORSWING2,4
LW DOORSWING3,4
LW DOORSWING4,4
; LWLL DOORSWING5,3|AFunc,A_CHNG_SCRL_TBL+2,SUCK_ME_IN
LWLLL DOORSWING5,1|AFunc,A_BRANCH_IF_FALSE+4,ENEMY_QUOTA,TRICK_SUPRISE
LWLL 1,3|AFunc,A_CHNG_SCRL_TBL+2,SUCK_ME_IN
LWL 1,1|AFunc,PULL_ANIM
SND_UNLATCH
.WORD 0F320H,28,0A45AH,0
SND_LATCH
.WORD 0F320H,16,0A45DH,0
DISABLE_3DOORS:
CLRM @ENAB3DRS,W
rets
ENABLE_3DOORS:
MOVKM 1,@ENAB3DRS,W
rets
***********************************************
*
* Bug Eyes in Honeycombs
*
***********************************************
BUGEYE_INIT
.long bugeye1
.word DMAWNZ,M_MANSCALE|M_NOPIXSCAN,OM_GUNV | OM_OID | OM_COLL
.word OID_BUGBOY ; OID
.long BUGI_CVECT ; COLL
.LONG DUMRETS ; GUNV
FEYBUG:
.word 16
.word 00H,0400H,0400H,0400H,0400H,0400H,0400H,0400H
.word 0400H,0400H,0400H,0400H,0400H,0400H,0400H,0400H
STSCL .set 370h ; start scale for bugeye
SCLCHG .set 18 ; chg to scale each iteration
SCLIT .set 26 ; number of iterations to change
SCLLIM .set STSCL-((3*SCLCHG*SCLIT)/4)
BUGI_CVECT:
WL 0,DUMCRETS
BUGI_GUNVECT:
; move *a8(OIHOFF),a3,W
; jrnz BUGIX
; move *a8(OSCALE),a3,W
; cmpi SCLLIM,a3
; jrgt BUGIX ; if bugeye not big...
; ignore hit
move *a8(OGenObj),a9,L ; obj that generated me.
.if DEBUG
jrz $
.endif
clr a14
move a14,*a9(UEGenObj),L ; let it create another
move *a8(ODATA+40h),a0,L
jrz noflsh
.if DEBUG
jrn $
.endif
move a14,*a8(ODATA+40h),L
move a14,*a0(ODATA+40h),L
move a14,*a8(OGUNVECT),L
calla DELOBJ ; delete flash
move *a8(OZVAL),a10,L
move *a8(OXVAL),a9,L
sra 12,a9
move *a8(OYVAL),a11,L
sll 4,a11
movx a9,a11
movi [30,200],a9 ; point on screen powerup heads to
CREATE PID_IND,THROW_CD_WARREN
clr a14
noflsh:
*
* Throw out some splooge
*
SOUND1 SND_GOOSH
movi DEDBUG_INIT,b0
calla EASYMAKE
jrz sploog_abt
move *a8(OXVAL),*a0(OXVAL),L
move *a8(OYVAL),*a0(OYVAL),L
move *a8(OZVAL),a14,L
dec a14
move a14,*a0(OZVAL),L
MOVIM -0c0h,*a0(OZVEL),L
movim 2000h,*a0(OYACCEL),W
calla INSOBJ
sploog_abt:
move *a8(OPLINK),a0,L
jrz nokill
move a14,*a8(OPLINK),L
calla KILL
nokill:
calla DELETE_OBJ
move @NUM_OUT_THERE,a14
dec a14
move a14,@NUM_OUT_THERE ; dec eye count
BUGIX:
rets
AU_CREATE_BUGEYZ:
move *a8(UEGenObj),a14,L ; Am I linked to an object?
jrnz CRE_BUGI_DONE ; If so, don't gen another
CALLA CHECK_HOST_ANIM
JRC CRE_BUGI_DONE ;BR=HOST ANIM OFF SCREEN
move @HOLD_ENEMY_DISPATCH,a14
jrnz CRE_BUGI_DONE
move @OBJENEMIES,a14
btst B_OF_HONEY,a14
jrz CRE_BUGI_DONE
movi BUGEYE_INIT,B0
calla EASYMAKE
JRZ CRE_BUGI_DONE ;BR = No object created
calla DELPAL ; need a unique pal.
move a8,*a0(OGenObj),L ; link generating object
move a0,*a8(UEGenObj),L ; and generated object
clr a14
move a14,*a0(ODATA+40h),L ; no gun flash yet
move a8,a9
move a0,a1
CALLA GETAFARG_LONG ;GET Y:X pixel offset
move a1,a8
move a0,a1
sext a0 ; X
sra 16,a1 ; Y
sll 15,a0 ; convert from pixel to world
sll 15,a1 ; convert from pixel to world
MOVE *A9(OCTRL),A10,W
btst B_FLIPH,a10 ; adjust offset for flipped univ blocks
jrz negh
neg a0
negh:
btst B_FLIPV,a10
jrz negv
neg a1
negv:
move *a9(OXVAL),a14,L
add a0,a14
move a14,*a8(OXVAL),L
move *a9(OYVAL),a14,L
add a1,a14
move a14,*a8(OYVAL),L
move *a9(OZVAL),a14,L
subk 3,a14
move a14,*a8(OZVAL),L
move *a9(UENumber),a5 ; num recreations
inc a5
move a5,*a9(UENumber)
movi EYBUG,a0
calla GET_SPARE_PAL
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
movi EYBUG,a0
movi FadeBlak,A11
calla FADE_ONE
movi 260h,a5
calla SET_SCALE_MANUAL
move a8,a0
calla INSOBJ
CREATE PID_IND,MON_BUGEYE
move a0,*a8(OPLINK),L
CRE_BUGI_DONE:
rets
FadeBlak: .word 0,0FFFFh
DEDBUG_INIT:
.long BGSPLAT1
.word DMAWNZ,0,OM_ANIM
.long DEDBUG_ANIM
DEDBUG_ANIM:
LWL BGSPLAT1,7|AFunc,SEND_OUT_BUG_PARTS
LW BGSPLAT2,7
LW BGSPLAT3,6
LWL 1,1|AFunc,DELETE_OBJ
SEND_OUT_BUG_PARTS:
movi 30000h,a0
movi 100h,a3
calla PreFrag_Center
sub b10,b9
clr b10
MOVI FRG_BUGPARTS,B14
calla Fragger
rets
SND_GOOSH .word 0f3c8h,30,0a14dh,100,081c8h,0
FRG_BUGPARTS:
.long BUGLEG_ANIM,0
.word OID_JUNK,(2 << 11) + (1 << 6) + (FRGPAL)
.long BUGSPIT_ANIM,0
.word OID_JUNK,(3 << 11) + (1 << 6) + (FRGPAL)
.long BUGDROP_ANIM,0
.word OID_JUNK,(3 << 11) + (1 << 6) + (FRGPAL)
.long 0
BUGLEG_ANIM:
LW BGLEGs1,6
LW BGLEGs2,6
LW BGLEGs3,6
LW BGLEGs4,6
LW BGLEGs6,6
LWL BGLEGs7,6|AFunc,A_OFFSCRN_DEL
.long 0
BUGSPIT_ANIM:
LW SPIT4,2
LW SPIT5,2
LW SPIT6,2
LW SPIT7,2
LW SPIT6,2
LWL SPIT5,2|AFunc,A_OFFSCRN_DEL
.long 0
BUGDROP_ANIM
LWL BGDROP1,30|AFunc,A_OFFSCRN_DEL
.long 0
*
* a8 = BUGEYE obj
* a9 = BG OBJ that created it
MON_BUGEYE:
RANDSLP 2,9
move *a8(OGenObj),a0,L ; get enemy generator
move *a0(OCTRL),a14
btst B_INUSE,a14 ; did generator get deleted?
jrz MB_DELETE
move @OBJENEMIES,a14 ; did this get disabled?
btst B_OF_HONEY,a14
jrz MB_DELETE
MOVE *A8(OFLAGS),A14 ; ARE WE ON SCREEN?
BTST B_OFSCRN,A14
JRNZ MB_wait ; IF NOT, DON'T TRY TO FADE IN
callr CAN_I_CREATE
jrnc MB_wait
move @NUM_OUT_THERE,a0
; cmpk 8,a0
; jrge MB_wait ; too many, wait some more
inc a0
move a0,@NUM_OUT_THERE
movi BUGI_GUNVECT,a14
move a14,*a8(OGUNVECT),L ; shootable
movi EYBUG,a0
movi IFadeIn,A11
calla FADE_ONE
movi STSCL,a11
movk SCLIT,a10
grow_lp:
sleep 2
subk SCLCHG,a11
move a11,*a8(ONuManScl)
ANDNIM M_NOSCALE,*a8(OFLAGS),W
dsjs a10,grow_lp
move *a8(OGenObj),a0,L ; get enemy generator
move *a0(OCTRL),a14
btst B_INUSE,a14 ; did generator get deleted?
jrz MB_DELETE_A ; dec count and delete
move *a8(OFLAGS),a14 ; IF OFSCRN, DON'T SHOOT
btst B_OFSCRN,a14
jrnz no_shoot
; movb @NUM_OUT_THERE+8,a0
; move @CURPLYRS,a1
; addk 2,a1
; cmp a1,a0
; jrge no_shoot
; inc a0
; movb a0,@NUM_OUT_THERE+8 ; write hi byte (spit count)
movk 3,a1
movk 8,a0
calla RANGRAND ; number of iterations of flashing
move a0,a5
movi [8,0],a4 ; offset of gun flash
calla EGUN_FLASH
; CREATE PID_IND,LAUNCH_SPIT
wait_for_eoflash:
sleep 8
move *a8(ODATA+40h),a14,L
jrnz wait_for_eoflash
; sleep 90 ; time eyes are up full
shoot_hook:
move a11,a10 ; save ending scale
movi EYBUG,a0
movi IFadeOut,A11
calla FADE_ONE
MOVE @NUM_OUT_THERE,a0 ; dec before shrink starts
dec a0
move a0,@NUM_OUT_THERE
movi DUMRETS,a14 ;
move a14,*a8(OGUNVECT),L ; not shootable
move a10,a11
movk SCLIT,a10
shrnk_lp:
sleep 2
addk SCLCHG,a11
move a11,*a8(ONuManScl)
ANDNIM M_NOSCALE,*a8(OFLAGS),W
dsjs a10,shrnk_lp
move *a8(OGenObj),a0,L ; get enemy generator
move *a0(OCTRL),a14
btst B_INUSE,a14 ; did generator get deleted?
jrnz MB_DELETE
MB_wait
jruc MON_BUGEYE
no_shoot:
sleep 10
jruc shoot_hook
*
* If this section done...
*
MB_DELETE_A:
move @NUM_OUT_THERE,a0 ; dec before shrink starts
dec a0
move a0,@NUM_OUT_THERE
MB_DELETE:
clr a14
move a14,*a0(UEGenObj),L ; no object here
lose_me:
clr a14
move a14,*a8(OPLINK),L ; gonna die now
calla DELETE_OBJ
DIE
IFadeIn .word 8,16,24,32,40,48,56,64,72,80,88,96,104,112
.word 120,128,0FFFFh
;IFadeIn .word 5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100
; .word 105,110,115,120,128,0FFFFh
;IFadeOut .word 120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,40
; .word 35,30,25,20,15,10,5,0,0FFFFh
IFadeOut .word 128,120,113,106,100,94,86,78,72,66,60,54,48,42
.word 36,30,24,18,12,6,0,0FFFFh
*
* called from COLL routine when rocket smashes honeycomb
*
HONEY_DESTROY:
move @OBJENEMIES,a14 ; is this section done?
btst B_OF_HONEY,a14 ; ignore this if we're moving on
jrz Ubozo2 ; ignore this if we're moving on
mmtm sp,a0,a8
calla UNIV_DISAB_ENEMY_GEN
move *a8(UEGenObj),a1,L ; are we connected to a bug?
jrz HD_nobug
move *a1(OGUNVECT),a14,L
jrz HD_notout
cmpi DUMRETS,a14 ;
jreq HD_notout ;
move @NUM_OUT_THERE,a14
dec a14
move a14,@NUM_OUT_THERE
HD_notout:
move *a1(ODATA+40h),a0,L
jrz HD_noflsh
LOCKON N
clr a14
move a14,*a1(ODATA+40h),L
move a14,*a0(ODATA+40h),L
move a14,*a1(OGUNVECT),L
calla DELOBJ ; delete flash
HD_noflsh:
move *a1(OPLINK),a0,L
jrz HD_nokill
clr a14
move a14,*a1(OPLINK),L
calla KILL
HD_nokill:
move a1,a8
calla DELETE_OBJ ; delete bug
HD_nobug:
move @ENAB3DRS,a14
inc a14
move a14,@ENAB3DRS
cmpk 25,a14
jrlt Ubozo ; not into the secret room
*
* ENTER STAINED GLASS ROOM --- YAH! INTO DA SECRET ROOM WITH YE!
*
movi BLOW_GLASS_OUT,a0
calla CHNG_SCRL_TBL
Ubozo:
mmfm sp,a0,a8
Ubozo2:
rets
*
* Disable enemy if a particular word is false
*
*
CHECK_ENEMY_DISAB
calla GETAFARG_LONG
move *a0,a14
jrnz CED_keepon
calla UNIV_DISAB_ENEMY_GEN
CED_keepon:
rets
**************************************************************************
* *
* FREE KERRI *
* *
**************************************************************************
KERRI_GUNVECT:
* PASS:
* A2 = PTR TO PLAYER
* A8 = PTR TO OBJECT
* A1 = DAG of kerri
*
movi 0fff0fffh,a4
move *a8(OZVAL),a3,L
move @ZBASE,a14,L
sub a14,a3 ; world Z
cmpi 014000h,a3 ; won't work if she's too far away
jrge free_kerri_X
move *a2(PCURSORXY),a7,L ; where did we hit her?
*
* compute valid box (top 1/8 in Y) (center 1/4 in X)
*
move *a8(OSIZE),a5,L
srl 2,a5 ; 1/4 size y and x in a5
move a5,a3
srl 1,a3 ; 1/8 size y and x in a3
zext a5
movy a3,a5 ; offset top by 1/8 y
and a4,a5
and a4,a3
addxy a5,a1 ; shift origin by 1/4 X & 1/8 y
zext a3 ; 1/8 X in a3
addxy a3,a1 ; shift origin by addl 1/8 X
addxy a1,a5 ; lower right
*
* POINT INSIDE A BOX COLLISION
*
* a7 = point
* a1 = upper left, box
* a5 = lower right, box
*
cmpxy a7,a1
jrxgt free_kerri_X
jrygt free_kerri_X
cmpxy a5,a7
jrxgt free_kerri_X
jrygt free_kerri_X
*
* She is free
*
movi 8000,a1
move @IN_SECRET,a14 ; is she worth more?
jrz notsecret
movk 15,a1
calla PROCK_AWARD ; give bombs for freeing her
MOVI 40000,A1
notsecret:
CALLA PRINT_SCORE
calla BG_TO_FG
CLRM *a8(OGUNVECT),L ; can't hit her no more
movi kerfree,a1
move a1,*a8(AnimFrm),L
move a1,*a8(AnimScr),L
MOVKB 1,*a8(AnimSlp)
move *a8(OZVAL),a14,L
subk 4,a14
move a14,*a8(OZVAL),L
CALLA PLAYER_AWARD_GIRL
free_kerri_X:
rets
kerfree:
LWLL KERSHT2,6|AFunc,A_CHANGE_PAL+2,KSTRES_P
LW KERSHT3,6
LW KERSHT4,6
LW KERSHT5,6
LW KERSHT6,6
LW KERSHT7,6
LW KERSHT8,5
LW KERSHT9,4
LW KERSHT10,25
KERRI_RUNAWAY_ANIM
LWLL TRANS1,2|AFunc,A_RAND_HFLIP_CHANGE_PAL+2,KSTRES_P
LWLLW 1,1|AFunc,A_TAB_SOUNDZ+3,KER_SND_TAB,6
LWLLL TRANS2,4|AFunc,A_RAND_OXVEL+4,24000h,38000h
LWL TRANS3,4|AFunc,A_Set_LOOP_STRT
KER3RUN:
LWLL RN3J01,4|AFunc,A_DEL_ZW_GT+2,1c000h
LW RN3J02,4
LW RN3J03,4
LWLL RN3J04,4|AFunc,A_DEL_ZW_GT+2,1c000h
LW RN3J05,4
LWL RN3J06,4|AFunc,A_OFF_KILL_OBJ
.long 0
A_RAND_HFLIP_CHANGE_PAL
CALLA A_CHANGE_PAL
JAUC A_RAND_HFLIP
SND_THANK_YOU
.WORD 0E2a4H,47,0A532H,0
SND_FREE_AT_LAST
.WORD 0E2a4H,79,0A53BH,0
SND_BEST
.WORD 0E2a4H,80,0A547H,0
SND_MYHERO
.WORD 0E2a4H,82,0A54aH,0
KER_SND_TAB
.long SND_THANK_YOU,SND_FREE_AT_LAST,SND_THANK_YOU
.long SND_BEST,SND_THANK_YOU,SND_MYHERO
*
* DELETE if Z world is greater than
*
* This parameter can be an immediate value supplied *
* in the animation OR *
* you can supply an ADDRESS in the animation and the *
* desired Z will be taken from that address! *
* *
A_DEL_ZW_GT:
calla GETAFARG_LONG
cmpi 10000000h,a0
jrlt assum_val
move *a0,a0,L ; if address, get target Z
assum_val:
move @ZBASE,a1,L
move *a8(OZVAL),a2,L
sub a1,a2
cmp a0,a2
jagt DELETE_OBJ_PROC
rets
****************************************
*
* LEAF / RUSTLE
*
****************************************
FRG_LF_4:
.long LEAFA_ANIM,L_STUFF
.word OID_JUNK,(1 << 11) + (1 << 6) + (FRGPAL|FRGGCOL)
; .long LEAFB_ANIM,L_STUFF
; .word OID_JUNK,(1 << 11) + (1 << 6) + (FRGPAL|FRGGCOL)
; .long LEAFA_ANIM,L_STUFF
; .word OID_JUNK,(1 << 11) + (1 << 6) + (FRGBOG|FRGPAL|FRGGCOL)
; .long LEAFB_ANIM,L_STUFF
; .word OID_JUNK,(1 << 11) + (0 << 6) + (FRGBOG|FRGPAL|FRGGCOL)
.long 0
LEAF_COLL
WWL OID_GRND,0FFFFH,DELETE_OBJ
WL 0,DUMCRETS
L_STUFF:
move *a0(OZVAL),a14,L
subk 8,a14
move a14,*a0(OZVAL),L
MOVI LEAF_COLL,A14
MOVE A14,*A0(OCVECT),L ;Set up chunk with Vectors
ORIM M_NOCOLL,*A8(OFLAGS),W ;Keeps CDs from colliding with us
RETS
A_LF_CHG_OYACCEL:
move *a8(OYVEL),a14,L
jrn lvalon
MOVIM 500h,*a8(OYACCEL),W
CLRM *a8(OZVEL),L
move *a8(AnimFrm),a14,L
addk 32,a14
move a14,*a8(AnimFrm),L
move a14,*a8(AnimScr),L
lvalon:
rets
LEAFA_ANIM:
LWL LEAFA2,6|AFunc,A_LF_CHG_OYACCEL
.long 0
LEAFA_ANIM2:
LW LEAFA1,10
LW LEAFA2,5
LW LEAFA3,5
LW LEAFA4,5
LW LEAFA5,10
LW LEAFA4,5
LW LEAFA3,5
LW LEAFA2,5
.long 0
LEAFB_ANIM:
LWL LEAFB2,6|AFunc,A_LF_CHG_OYACCEL
.long 0
LEAFB_ANIM2:
LW LEAFB1,7
LW LEAFB2,6
LW LEAFB3,5
LW LEAFB4,6
LW LEAFB5,7
LW LEAFB4,6
LW LEAFB3,5
LW LEAFB2,6
.long 0
RUSTLE_CVECT
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,RUSTLE_COLLVECT
WL 0,DUMCRETS
FLAMBUSH_CVECT
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,FLAMBUSH_COLLVECT
WL 0,DUMCRETS
LILP2_CVECT:
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,LILP2_COLLVECT
WL 0,DUMCRETS
TTOP4_CVECT:
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,TTOP4_COLLVECT
WL 0,DUMCRETS
LILP2_COLLVECT:
movi -15<<16,a7 ; y offset
movi FIRE2_INIT,a6 ; flame init table
jruc FlmBushHk
TTOP4_COLLVECT:
movi -36<<16,a7 ; y offset
movi FIRE3_INIT,a6 ; flame init table
jruc FlmBushHk
FLAMBUSH_COLLVECT:
movi -13<<16,a7 ; y offset
movi BURNBUSH_INIT,a6 ; flame init table
FlmBushHk:
CALLA UNIV_COLL_CHECK
JRNZ FLAMBUSH_DONE
mmtm a12,a6,a7 ; save params for flame
PUSH a0
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
movi M_NEXTFRM|M_NOMORE,a7 ; might be enemy gen
*
* Set UNIV LINK for correct recreation if we scroll off and on again
*
move *a8(OULINK),a3,L
move *a3(MAP_IMG),a5,L
srl 4,a5
sll 4,a5
addi 60h,a5 ; points to full frame (not skeleton)
move *a5,a6,L
srl 4,a6
sll 4,a6
move *a3(MAP_FLAGS),a4
btst B_BF_ENEMY,a4 ; is this guy generating enemies?
jrz noengen
ori M_NOSTOPANIM,a7
*
* turn into a static enemy generator (no longer damagable)
*
addk 32,a5 ; get to enemy gen
move *a5,a6,L ; a7 is the enemy gen animation
subi 30h,a6 ; have it include an image
ori M_IF_DANIM|M_IF_SEQ,a6 ; mark it properly
noengen:
MOVI 0,A5
CLR A9 ;NO OFFSET
CALLA UNIV_DAMAGE_HANDLER
move a6,*a3(MAP_IMG),L ; set for recreation
*
* Clr Collisions and Set OID = 0
*
movi DUMCRETS,a14
move a14,*a8(OCVECT),L
movi DUMRETS,a14
move a14,*a8(OGUNVECT),L
andni M_BF_ID,a4 ; clear out OID for recreation
move a4,*a3(MAP_FLAGS)
movi OID_UNIV&(~SUPP_4),a1
calla CHANGE_OID
SOUNDZ SND_TREE_TORCH
mmtm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11
mmfm a12,a6,a7
move a6,b0
calla EASYMAKE
jrz FLAMBUSH_ABT ; cant make
move *a8(OXVAL),*a0(OXVAL),L
move *a8(OYVAL),a14,L
add a7,a14
move a14,*a0(OYVAL),L
move *a8(OZVAL),a3,L
addk 2,a3
move a3,*a0(OZVAL),L
move *a0(OFLAGS),a14
ori M_DBLSCL,a14
move a14,*a0(OFLAGS)
calla INSOBJ
FLAMBUSH_ABT:
mmfm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11
PULLQ a0
FLAMBUSH_DONE
rets
SND_TREE_TORCH
.WORD 0F327H,85,0A33EH,0
;exception:
; CLRM *a8(OCVECT),L
; rets
;
;RUSTLE_COLLVECT:
; move *a8(OIMG),a14,L ; which image?
; cmpi PALM1top,a14
; jreq exception
RUSTLE_COLLVECT:
CALLA UNIV_COLL_CHECK
JRNZ RUSTLE_DONE
PUSH a0
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
movi M_LASTFRM|M_NOMORE,a7
MOVI 0,A5
CLR A9 ;NO OFFSET
CALLA UNIV_DAMAGE_HANDLER
PUSH a2
*
* cover replacement with explosion
*
move *a8(ODAG),a0,L ; upper left in a1
move *a8(OSIZE),a4,L
addxy a0,a4 ; lower right in a4
move *a8(OZVAL),a3,L
move a3,a6
sll ZFRAC,a3
move @ZBASE_HR,a14,L
sub a14,a3 ; get world Z for computation
move a3,a5
move a3,a7
move a3,a1
setf 10,1,1
move a0,a2 ; save Y top in a2
sext a0 ; screen left in a0
subi HALFX,a0
mpys a0,a1 ; world left in a1
sra ZFRAC,a1
move a4,a0
sext a0 ; screen right in a0
subi HALFX,a0
mpys a0,a3 ; --> world right in a3
sra ZFRAC,a3
sra 16,a2 ; screen Y top in a2
sra 16,a4 ; screen Y bot in a4
move @YHALF,a14
sub a14,a4
sub a14,a2
mpys a2,a7 ; --> world Y top in a7
mpys a4,a5 ; --> world Y bot in a5
sra ZFRAC,a5
sra ZFRAC,a7
move a1,a4 ; --> world left in a4
setf 32,0,1
move @XBASE,a14,L
add a14,a4
add a14,a3
move @YBASE,a14,L
add a14,a5
add a14,a7
subk 8,a6
PULLQ a2
PULLQ a0
mmtm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11
PUSH a0
movk 4,a10 ; num to create
callr BIG_EXPLOSIONS ; start some explosions
noexplo:
PULL a0
move *a0(OXVAL),a5,L
move *a0(OYVAL),a7,L
movi FIRE3_INIT,b0 ; pick one of two fires
move @RAND,b14
btst 6,b14
jrnz RCduh
movi FIRE2_INIT,b0
RCduh:
calla EASYMAKE
jrz nofire
move a5,*a0(OXVAL),L
move a7,*a0(OYVAL),L
move a6,*a0(OZVAL),L
calla INSOBJ
nofire:
mmfm sp,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11
RUSTLE_DONE
rets
*
* start some explosions
* a3 and a4 form an X range
* a5 and a7 form a Y range
* a6 = ZVAL
* a10 = number of explosions
* trashes a9
*
BIG_EXPLOSIONS:
movi EXPLO_INIT,b0
calla EASYMAKE
jrz noexplo
move a0,a9
move a3,a0
move a4,a1
calla RANGERND
move a0,*a9(OXVAL),L
move a5,a0
move a7,a1
calla RANGERND
move a0,*a9(OYVAL),L
move a6,*a9(OZVAL),L
move a9,a0
calla INSOBJ
dsjs a10,BIG_EXPLOSIONS
rets
*
* start fires in damaged control panel parts
* a8 = object
*
MACH_FIRE:
movk 2,a9 ; number of fires
move *a8(OYVAL),a7,L
subi 6<<15,a7 ; Y of first fire in a7
move *a8(OZVAL),a6,L
addk 3,a6 ; Z of fires in a6
Mfirelp:
movi 15<<15,a0
move a0,a1
neg a1
calla RANGRAND ; get random X offset in X
move *a8(OXVAL),a5,L
add a0,a5 ; final X of this fire in a5
move @RAND+4,b14 ; get a skewed random number
andi 60h,b14 ; turn into an index
addi RandFireTab,b14
move *b14,b0,L
calla EASYMAKE
jrz noMfire
move a5,*a0(OXVAL),L
move a7,*a0(OYVAL),L
move a6,*a0(OZVAL),L
calla INSOBJ
movi 75<<15,a0
movi 50<<15,a1
calla RANGRAND
sub a0,a7 ; get Y of next fire
dsj a9,Mfirelp
noMfire:
rets
RandFireTab:
.long FIRE3_INIT,FIRE2_INIT,FIRE2_INIT,FIRE3_INIT
PALM_GUNVECT:
movi PalmTopAnim,a1
jruc TRchkZ
LILP2_GUNV:
movi Lilplant2Anim,a1
jruc TRchkZ
TTOP4_GUNV:
movi Tree4Anim,a1
TRchkZ:
move *a8(OZVAL),a14,L
move @ZBASE,a0,L
sub a0,a14 ; world Z
cmpi 1c000h,a14 ; ignore if furthur in world than this
jrlt foundtree2
rets
RUSTLE2_GUNVECT:
move *a8(OZVAL),a14,L
move @ZBASE,a0,L
sub a0,a14 ; world Z
cmpi 1c000h,a14 ; ignore if furthur in world than this
jrge notree
movb *A8(OFLAGS+B_ANIM-7),A14
jrn notree ; already animating
move *a8(OIMG),a0,L ; which image?
movk 5,a1
cmpi TREETOP1S,a0 ;5
jreq foundtree
inc a1
cmpi TREETOP2S,a0 ;6
jreq foundtree
inc a1
cmpi LILPLANT1S,a0 ;7
jrne notree
jruc foundtree
*
* make bushes rustle
*
RUSTLE_GUNVECT:
move *a8(OZVAL),a14,L
move @ZBASE,a0,L
sub a0,a14 ; world Z
cmpi 1c000h,a14 ; ignore if furthur in world than this
jrge notree
movb *A8(OFLAGS+B_ANIM-7),A14
jrn notree ; already animating
move *a8(OIMG),a0,L ; which image?
clr a1
cmpi TREETOP3S,a0 ;0
jreq foundtree
inc a1
cmpi BPLANT1S,a0 ;1
jreq foundtree
inc a1
cmpi BPLANT2S,a0 ;2
jreq foundtree
inc a1
cmpi LILPLANT3S,a0 ;3
jreq foundtree
inc a1
cmpi TREEB1CS,a0 ;4
jrne notree
foundtree:
sll 5,a1
addi RUSSTAB,a1
move *a1,a1,L
foundtree2:
calla STRT_ANIM
SOUNDZ SND_RUSTLE ;Make a little shake sound
MOVI 030000H,A0
MOVI 028H,A3
CLR A4
; CALLA PreFrag_Box
CALLA PreFrag_Gun
; sra 1,b3 ; limit X Vel a bit
; sra 1,b4
MOVI -60000H,B3 ;MIN X VEL
MOVI 60000H,B4 ;MAX X VEL
sub b10,b9 ; z alway negative
movi -1,b10
; sub b8,b7 ; y always negative
; movi -18000h,b8
MOVI -18000H,B7
MOVI -60000H,B8
MOVI FRG_LF_4,B14
CALLA Fragger
notree:
rets
END_RUSTLE:
jauc PULL_ANIM ; simple case for now
SND_RUSTLE
.WORD 0F220H,62,0A41FH,0
RUSSTAB:
.long Tree3Anim,Bplant1Anim,Bplant2Anim,Lilplant3Anim
.long TreeB1CAnim,Tree1Anim,Tree2Anim,Lilplant1Anim
TreeB1CAnim
LWLW TREEB1CRS,3|AFunc,A_Set_AnimLoop+1,2
TreeB1CLp:
LWLWW TREEB1CS,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW TREEB1CRS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,TreeB1CLp
LWL TREEB1CS,1|AFunc,END_RUSTLE
Tree1Anim
LWLW TREETOP1RS,3|AFunc,A_Set_AnimLoop+1,2
Tree1Lp:
LWLWW TREETOP1S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW TREETOP1RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Tree1Lp
LWL TREETOP1S,1|AFunc,END_RUSTLE
Tree2Anim
LWLW TREETOP2RS,3|AFunc,A_Set_AnimLoop+1,2
Tree2Lp:
LWLWW TREETOP2S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW TREETOP2RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Tree2Lp
LWL TREETOP2S,1|AFunc,END_RUSTLE
Tree3Anim
LWLW TREETOP3RS,3|AFunc,A_Set_AnimLoop+1,2
Tree3Lp:
LWLWW TREETOP3S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW TREETOP3RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Tree3Lp
LWL TREETOP3S,1|AFunc,END_RUSTLE
Tree4Anim
LWLW TREETOP4RS,3|AFunc,A_Set_AnimLoop+1,2
Tree4Lp:
LWLWW TREETOP4S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW TREETOP4RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Tree4Lp
LWL TREETOP4S,1|AFunc,END_RUSTLE
Bplant1Anim
LWLW BPLANT1RS,3|AFunc,A_Set_AnimLoop+1,2
Bplant1Lp:
LWLWW BPLANT1S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW BPLANT1RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Bplant1Lp
LWL BPLANT1S,1|AFunc,END_RUSTLE
Bplant2Anim:
LWLW BPLANT2RS,3|AFunc,A_Set_AnimLoop+1,2
Bplant2Lp:
LWLWW BPLANT2S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW BPLANT2RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Bplant2Lp
LWL BPLANT2S,1|AFunc,END_RUSTLE
Lilplant1Anim:
LWLW LILPLANT1RS,3|AFunc,A_Set_AnimLoop+1,2
Lilplant1Lp:
LWLWW LILPLANT1S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW LILPLANT1RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Lilplant1Lp
LWL LILPLANT1S,1|AFunc,END_RUSTLE
Lilplant3Anim:
LWLW LILPLANT3RS,3|AFunc,A_Set_AnimLoop+1,2
Lilplant3Lp:
LWLWW LILPLANT3S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW LILPLANT3RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Lilplant3Lp
LWL LILPLANT3S,1|AFunc,END_RUSTLE
Lilplant2Anim:
LWLW LILPLANT2RS,3|AFunc,A_Set_AnimLoop+1,2
Lilplant2Lp:
LWLWW LILPLANT2S,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW LILPLANT2RS,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,Lilplant2Lp
LWL LILPLANT2S,1|AFunc,END_RUSTLE
PalmTopAnim:
LWLW PALM1topR,3|AFunc,A_Set_AnimLoop+1,2
PalmtopLp:
LWLWW PALM1top,1|AFunc,A_RAND_AnimSLP+2,2,7
LW 1,0
LWLWW PALM1topR,1|AFunc,A_RAND_AnimSLP+2,2,7
LWLL 1,0|AFunc,A_Anim_DSJ+2,PalmtopLp
LWL PALM1top,1|AFunc,END_RUSTLE
FIRE2_INIT:
.long TFIRE1A
.word DMAWNZ,0,OM_ANIM|OM_CFUNC
.long FIRE2_Anim
.long RAND_HFLIP
FIRE3_INIT:
.long TFIRE2A
.word DMAWNZ,0,OM_ANIM|OM_CFUNC
.long FIRE3_Anim
.long RAND_HFLIP
FIRE1_INIT:
.long HFIREA1
.word DMAWNZ,0,OM_ANIM|OM_CFUNC
.long FIRE1_Anim
.long RAND_HFLIP
BURNBUSH_INIT:
.long BSHBRN1
.word DMAWNZ,0,OM_ANIM|OM_CFUNC
.long BRNBSHANIM
.long RAND_HFLIP
RAND_HFLIP:
move a0,a1
calla RANDOM ; generate a new RAND
andi M_FLIPH,a0 ; isolate hflip bit
move *a1(OCTRL),a14
andni M_FLIPH,a14 ; clear old hflip
or a0,a14 ; set new
move a14,*a1(OCTRL) ; and store
move a1,a0
rets
EXPLO_INIT:
.long FHKEXPLOB1
.word DMAWNZ,M_DBLSCL|M_NODISP,OM_ANIM
.long BushBlow
BushBlow:
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,2,18 ; initial delay
LW 1,0
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,3,7
LWL 1,1|AFunc,OBJ_ON
LW 1,0
LW FHKEXPLOB2,4
LW FHKEXPLOB3,4
LWLWW FHKEXPLOB4,1|AFunc,A_RAND_AnimSLP+2,3,7
LW 1,0
LW FHKEXPLOB5,4
LWLWW FHKEXPLOB6,1|AFunc,A_RAND_AnimSLP+2,3,7
LW 1,0
LW FHKEXPLOB7,4
LWLWW FHKEXPLOB8,1|AFunc,A_RAND_AnimSLP+2,3,7
LW 1,0
LW FHKEXPLOB9,5
LWLWW FHKEXPLOB10,1|AFunc,A_RAND_AnimSLP+2,4,10
LW 1,0
LW FHKEXPLOB11,7
LWL 1,1|AFunc,DELETE_OBJ
******************************
* FIRES *
******************************
FIRE2_Anim:
LW TFIRE1A,3
LW TFIRE1B,3
LW TFIRE1C,3
LW TFIRE1D,3
LWL TFIRE1E,3|AFunc,A_OFFSCRN_DEL
.long 0
FIRE3_Anim:
LW TFIRE2A,3
LW TFIRE2B,3
LW TFIRE2C,3
LW TFIRE2D,3
LWL TFIRE2E,3|AFunc,A_OFFSCRN_DEL
.long 0
FIRE1_Anim:
LW HFIREA1,3
LW HFIREA2,3
LW HFIREA3,3
LW HFIREA4,3
LW HFIREA5,3
LWL HFIREA6,3|AFunc,A_OFFSCRN_DEL
.long 0
BRNBSHANIM:
LW BSHBRN1,3
LW BSHBRN2,3
LW BSHBRN3,3
LW BSHBRN4,3
LW BSHBRN5,3
LW BSHBRN6,3
LW BSHBRN7,3
LW BSHBRN8,3
LW BSHBRN9,3
LW BSHBRN10,3
LW BSHBRN11,3
LW BSHBRN12,3
LW BSHBRN13,3
LW BSHBRN14,3
LW BSHBRN15,3
LWL BSHBRN16,3|AFunc,A_OFFSCRN_DEL
.long 0
BUBDAMP:
.word 126
.word 01ce7h,0329fh,0221fh,0151fh,0151fh,014bfh,02e5fh,02a3fh
.word 032bfh,01dbfh,014bfh,01ddfh,014bfh,032dfh,014ffh,014bfh
.word 0159fh,014dfh,014dfh,014bfh,0195fh,0195fh,0153fh,01d7fh
.word 0195fh,0223fh,01d9fh,03b3fh,029bfh,025dfh,0153fh,036dfh
.word 014dfh,018dfh,01d7fh,014bfh,0153fh,014ffh,0253fh,0213fh
.word 014bfh,014dfh,014bfh,0255fh,02e1fh,02a5fh,042dfh,029ffh
.word 036ffh,03a5fh,0437fh,0155fh,0221fh,029dfh,035dfh,01e3fh
.word 01ddfh,0151fh,014bfh,01cbfh,01cbfh,03e9fh,0437fh,014bfh
.word 03a7fh,01d7fh,01cdfh,03f5fh,014bfh,014bfh,014bfh,028bfh
.word 018bfh,028bfh,024bfh,028ffh,014bfh,014bfh,028bfh,014bfh
.word 014bfh,015bfh,014bfh,014ffh,014bfh,014bfh,014bfh,0297fh
.word 0155fh,015bfh,01d1fh,0367fh,014dfh,0155fh,0151fh,028dfh
.word 0357fh,041ffh,042dfh,042ffh,03e5fh,029ffh,03ddfh,03d3fh
.word 0417fh,03d7fh,0437fh,0437fh,018bfh,024bfh,028ffh,0419fh
.word 040dfh,0365fh,0427fh,0419fh,0417fh,034ffh,024bfh,034dfh
.word 039dfh,014bfh,02a3fh,0429fh,0317fh,0437fh
GLOW_BLUE:
mmtm sp,a5,a9
move *a0(OPAL),a5
sll 24,a5
srl 24,a5 ; slot of palette
move a5,a9
sll 6,a5 ; since PALRSIZ = 40h
ADDI PALRAM,A5
move *a5(PALCNT),a14
cmpk 1,a14 ; is this first use of palette?
jrne already_glowing
mmtm sp,a0,a1,a7,a8,a10
move *a5(PALID),a8,L
movk 21,a10
CREATE PID_TCYCLE,GLOW_BLUE_PROC
mmfm sp,a0,a1,a7,a8,a10
already_glowing:
mmfm sp,a5,a9
rets
**************************************************************
*
* GLOW_BLUE_PROC - make a palette glow BLUE by
* increasing its blue
*
* a8 = PALID (passed when created)
* a9 = palette slot : number of colors (slot passed when created)
* a10 = CUR : max delta before reversing (passed when created)
* a11 = direction (1 or -1) shifted to upper 6 bits
*
**************************************************************
GLOW_BLUE_PROC:
movi 1<<26,a11 ; initial delta
sll 16,a9 ; slot # in upper half
move a8,a14
move *a14+,a5 ; numcols in a5
movx a5,a9 ; a9 = slot : num_cols
*
* MAIN LOOP
*
GG_lp1:
*
* Is palette still allocated?
*
move a9,a5
srl 16-6,a5 ; since PALRSIZ = 40h
ADDI PALRAM,A5
move *a5(PALID),a14,L
cmp a14,a8
jane SUCIDE ; diff PALID, die
move *a5(PALCNT),a14
jaz SUCIDE ; count 0 , die
;;;; move *a5(PALTIME),a14
;;;; janz SUCIDE ; TIME not zero, die
*
* adjust palette and set up transfer
*
move a8,a6
addk 16,a6 ; pointer to source data
move a13,a4
addi PDATA+10h,a4 ; RAM location of palette's current state
move a4,a0 ; for PALSET
move a9,a5
zext a5 ; # colors in a5
clr a7
movy a10,a7 ; current delta
GG_lp2:
move *a6+,a1
; move a1,a2
move a1,a3
sll 32-5,a1 ; blue
srl 1,a1 ; leave a sign bit
add a7,a1
jrnn nosatblue
move a7,a1
sra 31,a1
not a1
srl 1,a1
nosatblue:
srl 32-6,a1 ; final blue
; sll 32-15,a2 ; red
; srl 1,a2 ; leave a sign bit
; sub a7,a2
; jrnn nosatred
; move a7,a2
; sra 31,a2
; srl 1,a2
;nosatred:
; srl 32-6,a2
; sll 10,a2 ; final red
; add a2,a1
andi 03e0h+07c00h,a3
add a3,a1
move a1,*a4+
dsjs a5,GG_lp2
clr a1
clr a2
movy a9,a1 ; slot : st color in a1
srl 8,a1 ; slot in bits 8-15
movx a9,a2 ; num colors in a2
calla PALSET
*
* check direction of glow and adjust if necessary
*
addxy a11,a10 ; a10 = cur count : max count
move a10,a14
sra 26,a14
abs a14
cmpxy a10,a14
jrxne skpa11adj ; if cur count = max, make a11 neg
adja11:
neg a11
skpa11adj:
sloop 1,GG_lp1
*******************************************************************
*
* NATIVE GUY
*
*******************************************************************
.DEF PROC_RELEASE_NATIVE
.ref WORLD_GRNDOFF
* a9 = UNIV Z
* a10 = UNIV X enter left
* a11 = UNIV X enter right
*
PROC_RELEASE_NATIVE:
MOVI OID_NATIVE,A0
CALLA GET_ENEMY_COUNT
CMPK 4,A0
JAHS SUCIDE
MOVI BUSHGUY_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JAZ SUCIDE ;BR = ERROR! ERROR!
CLRM *a8(OGenObj),L ; no generating object
move a10,a1
calla RANDOM
btst 2,a0
jrz PRN_duh
move a11,a1
movi M_FLIPH,a0
calla SET_FLPS
PRN_duh:
sll 16,a1
move @WORLD_GRNDOFF,a2,L
move @YWORLD,a14,L
add a14,a2
move a9,a3 ; univ Z
CALLA SET_ANIPU
movi NATIVE_DEATH,a14
move a14,*a8(OEDEATH),L
CALLA GET_SHAD_MULTI ;Setup his shadow
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVKM 2,*a8(OEFLAGS),W ; mark this guy as different
calla INSERT_ENEMY ;INSERT AND COUNT ENEMY
DIE
S_INIT_NATIVES:
clr a14
move a14,@NUM_OUT_THERE ; clear counts
move a14,@NUM_SPEARS
move *a11+,a0
move a0,@MAX_ALLOWED ; set maximums
move *a11+,a0
move a0,@MAX_SPEARS_ALLOWED
move @WAVEIRQS,@LAST_SPEAR_IRQ,L
jauc SCRL_DISPATCHER
* creates NATIVES in main corridor leading to Stone wall
* can be controlled by setting any or all of the following words.
*
* MAX_ALLOWED ; maximum number of them allowed out there
* MAX_SPEARS_ALLOWED ; same for spears
* ENEMY_ZW_MAX ; World Z which they are created at (or less than)
*
AU_CREATE_TREEGUY:
callr CAN_I_CREATE
jrnc AU_CN_DONE
move @OBJENEMIES,a14
btst B_OF_TREE,a14
jrz AU_CN_DONE
MOVI TREEGUY_INIT,B0 ;ALLOCATE OBJECT
callr CREATE_NATIVE
jrnc AU_CN_DONE
MOVE *A9(OXVAL),A1,L
MOVE *A9(OYVAL),A2,L
MOVE *A9(OZVAL),A3,L
addk 20,a3
CALLA SET_ANIPU
jauc INSERT_ENEMY ;INSERT AND COUNT ENEMY
*
* creates NATIVES in main corridor leading to Stone wall
* can be controlled by setting any or all of the following words.
*
* MAX_NUM_OUT_THERE ; maximum number of them allowed out there
* MAX_SPEARS_ALLOWED ; same for spears
JUMPOUT_Z .set 20000h ; world Z past which they won't jump out
AU_CREATE_NATIVE:
callr CAN_I_CREATE
jrnc AU_CN_DONE
move @OBJENEMIES,a14
btst B_OF_CNATV,a14
jrz AU_CN_DONE
move @XBASE+10h,a14 ; can only create these guys when
subi 2c8h,a14 ; 1) XBASE is between 2c8h and 38fh
cmpi 38fh-2c8h,a14 ; 2) SCROLL_FLAG is non-zero
jrnb AU_CN_DONE
; move @SCROLL_FLAG,a14,L
; jrz AU_CN_DONE
MOVI CENTER_INIT,B0 ;ALLOCATE OBJECT
callr CREATE_NATIVE
jrnc AU_CN_DONE
move a9,*a8(OGenObj),L ; save generating object
move a8,*a9(UEGenObj),L
movi 160000h,a0 ; x delta from block to native
movi 130000h,a1 ; x delta from block to native
calla RANGRAND
move a8,a3 ; get head in a3
MOVE *A9(OCTRL),A14,W
andi M_FLIPH,a14
jrz AUCN_flplp
neg a0
AUCN_flplp:
move *a3(OCTRL),a10
OR A14,A10
MOVE A10,*A3(OCTRL),W
move *a3(OPARTS),a3,L
jrnz AUCN_flplp
MOVE *A9(OXVAL),A1,L
add a0,a1 ; get off center a bit
move @YWORLD,a2,L
MOVE *A9(OZVAL),A3,L
addk 8,a3
CALLA SET_ANIPU
MOVKM 1,*a8(OEFLAGS),W ; mark this guy as different
jauc INSERT_ENEMY ;INSERT AND COUNT ENEMY
*
* BUSH GUYS are created from bushes on the ground
*
AU_CREATE_BUSHGUY:
callr CAN_I_CREATE
jrnc AU_CN_DONE
move @OBJENEMIES,a14
btst B_OF_BUSH,a14
jrz AU_CN_DONE
MOVI BUSHGUY_INIT,B0 ;ALLOCATE OBJECT
callr CREATE_NATIVE
jrnc AU_CN_DONE
move a9,*a8(OGenObj),L ; save generating object
move a8,*a9(UEGenObj),L
movi -0e0000h,a3 ; delta X for bushguy
MOVE @RAND,A14,W ;LEFTY OR RIGHTY?
ANDI M_FLIPH,A14
jrz adj_xdelta
neg a3
adj_xdelta:
move a8,a0
AUCB_flplp:
MOVE *A0(OCTRL),A10,W
OR A14,A10
MOVE A10,*A0(OCTRL),W
move *a0(OPARTS),a0,L
jrnz AUCB_flplp
MOVE *A9(OXVAL),A1,L
add a3,a1 ; get off center a bit
move @YWORLD,a2,L
MOVE *A9(OZVAL),A3,L
addk 20,a3
CALLA SET_ANIPU
jauc INSERT_ENEMY ;INSERT AND COUNT ENEMY
AU_CN_DONE
RETS
*
* CREATE_NATIVE - core routine to create tree and bush guys
* b0 = init table
* Return: C set if guy created, NC if not
*
CREATE_NATIVE:
move *a8(OFLAGS),a14
btst B_OFSCRN,a14
JRNZ CN_leave ;BR=HOST ANIM OFF SCREEN
move *a8(OZVAL),a9,L
move @ZBASE,a14,L
sub a14,a9 ; world Z in a9
move *a8(UEGenObj),a14,L ; Am I linked to an object?
jrnz CN_leave
move @ENEMY_ZW_MAX,a14,L
cmp a14,a9
jrge CN_leave ; skip if generating obj too far away
MOVE A8,A9
CALLA CREATE_ENEMY
JRZ CN_leave ;BR = ERROR! ERROR!
movi NATIVE_DEATH,a14
move a14,*a8(OEDEATH),L
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
CLRM *a8(OEFLAGS),W ; clear EFLAGS for all natives
move @NUM_OUT_THERE,a14
inc a14
move a14,@NUM_OUT_THERE
CALLA GET_SHAD_MULTI ;Setup his shadow
setc
rets
*
* if guy exists, delete him if his Z becomes too far
*
CN_leave:
clrc ; nobody was created
rets
BUSHGUY_CVECT
WWL OID_PROCKET,~MASK_PLAYER,NATV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,NATV_EXPLOSION_COLL
WWL OID_BLOWUP,0FFFFH,NATV_SBOMB_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* NONBOY_ROCKET_COLL - Collision vector for Player rocket bomb. *
* A0 = Ptr to rocket object *
* A8 = Ptr to NON-BOY object *
* *
**************************************************************************
NATV_ROCKET_COLL
MOVE *A0(RL_INTENDED_OBJ),A14,L
CMP A14,A8 ;Is this the object we are after?
JRNE NRC_X ;BR = No
CALLA GET_HEAD_PART
ORIM M_ATEROCKET,*A8(OEFLAGS),W ;Flag the rocket touch
NRC_X
RETS
BUSH_EXPLODE_SBOMB
LWLLL 1,1|AFunc,A_SBOMB_BLOOD+4,0,40000H
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_BUSH_EXP_NOBLOOD
BUSH_EXPLODE_ANIM
LWLLL 1,1|AFunc,A_BLOOD_SPLORCH+4,0,0
LWL 1,3|AFunc,CLR_VEL
.IF AUSTRALIA
ANIM_BUSH_EXP_NOBLOOD
LWL 1,1|AFunc,A_DEL_NATIVE
.ELSE
ANIM_BUSH_EXP_NOBLOOD
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,NATIVE_PARTS_1,80h,60000h
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,NATIVE_PARTS_2,500h,50000h
; LWL 1,5|AFunc,A_PreFrag_BUSH
LWL 1,1|AFunc,A_DEL_NATIVE
.ENDIF
; - Delete
;A_PreFrag_BUSH:
; movi 080h,a3 ; Abs v Z
; movi 40000h,a0 ; Abs v X and Y
; calla PreFrag_Center
; sra 1,b10 ; halve max Z
; sll 1,b9 ; double min Z
; sll 1,b7 ; double min Y
; clr b8 ; y go up only
; movi BEEK_PARTS,b14
; JAUC Fragger ;And get it goin' Boy
**************************************************************************
* *
* NATV_SBOMB_COLL *
* *
* Smart bomb service for Native *
* *
* A2 = Ptr to player that smart bombed *
* A8 = Ptr to Native *
* *
**************************************************************************
NATV_SBOMB_COLL
CALLA GET_HEAD_PART
ORIM M_ATEROCKET,*A8(OEFLAGS),W ;This will make him blow up
MOVI BUSH_EXPLODE_SBOMB,A3 ;Hit directly by the rocket
JRUC NATV_GEN_COLL
**************************************************************************
* *
* NATV_EXPLOSION_COLL - Collision vector for Player explosion. *
* A0 = Ptr to explosion object *
* A8 = Ptr to NATIVE object *
* *
**************************************************************************
NATV_EXPLOSION_COLL:
CALLA GET_HEAD_PART
MOVE *A8(OEFLAGS),A14,W
BTST B_ATEROCKET,A14
JRZ NEC_NO_EXP_OFF ;BR = Not hit directly
SWAP A0,A8
CALLA GET_HEAD_PART
CALLA OBJ_OFF_MULTI
SWAP A0,A8
NEC_NO_EXP_OFF
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA ;GET PDATA IN A2
MOVI BUSH_EXPLODE_ANIM,A3 ;Hit directly by the rocket
*
* Entrypoint for all explosion stuff
* A8 = Ptr to Native head part
* A3 = Animation script if exploding
*
NATV_GEN_COLL
PUSH A3
callr A_Unlink_Enemy
PULLQ A3
move *a8(OPLINK),a0,L ; if he was shooting, kill proc
jrz noproc1
clr a14
move a14,*a8(OPLINK),L ; he ain't pissed no more.
calla KILL
noproc1:
CALLA ALL_COLLS_OFF ;Turn all collisions off now!
MOVE A2,*A8(OPLAYER),L ;Hang on to this address
MOVI 1000,A1
CALLA SCORE ;Explosions are always good for points
CALLA COUNT_PLAYER_KILL
SOUNDZ SND_NATIVE_EXPLODE ;Blow him up proper
MOVE *A8(OEFLAGS),A14,W
BTST B_ATEROCKET,A14
JRZ NEC_HIT_BY_EXPLOSION
MOVE A3,A1 ;Hit directly by the rocket
jruc SetAnimNow
NEC_HIT_BY_EXPLOSION
move *a8(OFLAGS),a14 ; renable ground coll for head part
ori M_GCOLL,a14
andni M_NOCOLL,a14
move a14,*a8(OFLAGS)
MOVIM FLYBOY_CVECT,*a8(OCVECT),L
MOVIM -1,*a8(OZVEL),L
MOVIM 5000h,*a8(OYACCEL),W
MOVIM -0a6000h,*a8(OYVEL),L
MOVI -20000h,a1
movi 20000h,a0
calla RANGERND
move a0,*a8(OXVEL),L
MOVk 14,a14
movb a14,*a8(AnimSLP) ; slow fall back
movi NTV_DTH_ANIM,a1
SOUNDZ SND_NATIVE_SCREAM ;Make him scream
SetAnimNow:
movk 1,a14
movb a14,*a8(AnimSlp)
MOVE A1,*A8(AnimFrm),L
MOVE A1,*A8(AnimScr),L
RETS
FLYBOY_CVECT
WWL OID_GRND,0FFFFH,NATIVE_GRND_COLL
WL 0,DUMCRETS
NATIVE_GRND_COLL:
SOUNDZ SND_GROUND_HIT
calla COLLS_OFF
calla PSTOP
movk 1,a14
movb a14,*a8(AnimSLP)
movb a14,*a8(AnimSlp)
rets
NTV_DTH_CVECT
WWL OID_GRND,0FFFFH,NTV_DTH_GRND_COLL
WL 0,DUMCRETS
NTV_DTH_GRND_COLL:
SOUNDZ SND_GROUND_HIT
ANDNIM M_GCOLL,*A8(OFLAGS),W ;Disable ground coll
CALLA PSTOP
RETS
NATIVE_GUNVECT:
move *a8(OPART1),a8,L ; get head
callr A_Unlink_Enemy
MOVE A2,*A8(OPLAYER),L
SOUND1 SND_BODY_THUD
CALLA BLOODY_BULLET_HIT
jauc NONBOY_SBOMB
A_Unlink_Enemy:
move *a8(OGenObj),a3,L ; Enemy Generator Object
jrz notlnked
clr a14
move a14,*a8(OGenObj),L
.if DEBUG
move *a3(UEGenObj),a4,L
cmp a4,a8
LOCKON NE
.endif
move a14,*a3(UEGenObj),L
notlnked:
rets
*
* delete an enemy if off screen or too far away in Z
*
CheckNativeOffScrn:
move @WORLD_GRNDOFF+10h,a14
jrnz notlnked
move *a8(OFLAGS),a14 ; unlink and delete native
btst B_OFSCRN,a14 ; if offscreen
jrnz delete_him
move *a8(OZVAL),a1,L
move @ZBASE,a14,L
sub a14,a1 ; world Z in a9
move @ENEMY_ZW_MAX,a0,L
cmp a0,a1
jrge delete_him
rets
delete_him:
callr A_Unlink_Enemy
move @NUM_OUT_THERE,a14 ;
dec a14 ;
move a14,@NUM_OUT_THERE ;
jauc DEL_ENEMY_NOAUD
*
* DELETE NATIVE FROM DEATH ANIMATION
*
A_DEL_NATIVE:
callr A_Unlink_Enemy ;
move @NUM_OUT_THERE,a14 ;
dec a14 ;
move a14,@NUM_OUT_THERE ;
JAUC DELETE_ENEMY ;
**************************************************************************
* *
* A_START_TREE_SHAD *
* *
* Anim func to start a shadow for the tree guy. It first *
* clears the NOSHADOW flag for all parts. *
* *
* A8 = Ptr to any part of Native *
* *
**************************************************************************
A_START_TREE_SHAD
MOVI M_NOSHADOW,A2
MOVE *A8(OPART1),A0,L
ASTS_LOOP
MOVE *A0(OFLAGS),A14,W
ANDN A2,A14
MOVE A14,*A0(OFLAGS),W ;Turn off all NOSHADOW flags
MOVE *A0(OPARTS),A0,L
JRNZ ASTS_LOOP
JAUC GET_SHAD_MULTI ;And start the shadow
**************************************************************************
* *
* A_CHECK_SHAD_START *
* *
* Anim func to check if we need to start a shadow. *
* *
* A8 = Ptr to any part of Native *
* *
**************************************************************************
A_CHECK_SHAD_START
MOVE *A8(OFLAGS),A14,W
BTST B_NOSHADOW,A14
JRNZ A_START_TREE_SHAD ;BR = No shadow currently exists
RETS
CENTER_INIT:
.byte 5,0,0,1
.long NI28
.word OID_NATIVE,OM_COLL
.long BUSHGUY_CVECT
LWWWW peek1rl,DMAWNZ,M_NODISP|M_NOSHADOW,0,OM_ANIM|OM_GUNV
.long NATIVE_GUNVECT
.long BUSHGUY_ANIM
LWWWW peek1ll,DMAWNZ,M_NODISP|M_NOSHADOW,0,OM_PRVGUNV
LWWWW peek1ra,DMAWNZ,M_NODISP|M_NOSHADOW,0,OM_PRVGUNV
LWWWW peek1la,DMAWNZ,M_NODISP|M_NOSHADOW,0,OM_PRVGUNV
LWWWW peek1m,DMAWNZ,M_NODISP|M_NOSHADOW,0,OM_PRVGUNV
BUSHGUY_INIT:
.byte 5,0,0,1
.long NI28
.word OID_NATIVE,OM_COLL
.long BUSHGUY_CVECT
LWWWW peek1rl,DMAWNZ,M_NODISP,0,OM_ANIM|OM_GUNV
.long NATIVE_GUNVECT
.long BUSHGUY_ANIM
LWWWW peek1ll,DMAWNZ,M_NODISP,0,OM_PRVGUNV
LWWWW peek1ra,DMAWNZ,M_NODISP,0,OM_PRVGUNV
LWWWW peek1la,DMAWNZ,M_NODISP,0,OM_PRVGUNV
LWWWW peek1m,DMAWNZ,M_NODISP,0,OM_PRVGUNV
TREEGUY_INIT:
.byte 5,0,0,1
.long NI28
.word OID_NATIVE,OM_COLL
.long BUSHGUY_CVECT
LWWWW jmtr1rl,DMAWNZ,M_NOSHADOW,0,OM_ANIM|OM_GUNV
.long NATIVE_GUNVECT
.long TREEGUY_ANIM
LWWWW jmtr1ll,DMAWNZ,M_NOSHADOW,0,OM_PRVGUNV
LWWWW jmtr1ra,DMAWNZ,M_NOSHADOW,0,OM_PRVGUNV
LWWWW jmtr1la,DMAWNZ,M_NOSHADOW,0,OM_PRVGUNV
LWWWW jmtr1m,DMAWNZ,M_NOSHADOW,0,OM_PRVGUNV
TREEGUY_ANIM:
LWLWW 1,40|AFunc,A_RAND_AnimSLP+2,2,120
LW 1,0
LWLW 1,1|AFunc,A_SET_OYACCEL+1,3000h
LWL 1,1|AFunc,A_START_TREE_SHAD
LWL 1,1|AFunc,A_STAY_TIL_GRND_HIT
LWLL jmtr2rf,1|AMulti|AFunc,A_SOUNDZ+2,SND_GROUND_HIT
LW jmtr2lf,1|AMulti
LW jmtr2ra,1|AMulti
LW jmtr2la,1|AMulti
; LWL jmtr2m,3|AFunc,OBJ_OFF
LW jmtr2m,3
LW jmtr3rl,1|AMulti
LW jmtr3ra,1|AMulti
LW jmtr3la,1|AMulti
; LW jmtr3m,3
LW jmtr3m,1|AMulti
LWL 1,3|AFunc,OBJ_OFF
LW jmtr4ll,1|AMulti
LW jmtr4ra,1|AMulti
LW jmtr4la,1|AMulti
LW jmtr4m,3
LW jmtr5rl,1|AMulti
LW jmtr5ra,1|AMulti
LW jmtr5m,1|AMulti
LWL 1,3|AFunc,OBJ_OFF
LW jmtr6rl,1|AMulti
LW jmtr6ra,1|AMulti
LW jmtr6la,1|AMulti
LWL jmtr6m,3|AFunc,OBJ_ON
LWL jmtr7rl,1|AMulti|AFunc,A_Unlink_Enemy
LW jmtr7ra,1|AMulti
LW jmtr7la,1|AMulti
LW jmtr7m,2
LWL 1,1|AFunc,A_Set_LOOP_STRT
BUSHGUY_ANIM:
LW 1,5 ;This is a hack to wait for Zsort to catch up
LWL peek1rl,1|AMulti|AFunc,OBJ_ON
LWL peek1ll,1|AMulti|AFunc,OBJ_ON
LWL peek1ra,1|AMulti|AFunc,OBJ_ON
LWL peek1la,1|AMulti|AFunc,OBJ_ON
LWL peek1m,3|AFunc,OBJ_ON
BUSHWAIT:
LWL 1,1|AFunc,CheckNativeOffScrn
LWL 1,1|AFunc,WHAT_TO_DO
LW peek2rl,1|AMulti
LW peek2ll,1|AMulti
LW peek2ra,1|AMulti
LW peek2la,1|AMulti
LW peek2m,3
LW peek3rl,1|AMulti
LW peek3ll,1|AMulti
LW peek3ra,1|AMulti
LW peek3la,1|AMulti
LW peek3m,3
LW peek4rl,1|AMulti
LW peek4ll,1|AMulti
LW peek4ra,1|AMulti
LW peek4la,1|AMulti
LW peek4m,3
LW peek5rl,1|AMulti
LW peek5ll,1|AMulti
LW peek5ra,1|AMulti
LW peek5la,1|AMulti
LW peek5m,60
LW peek4rl,1|AMulti
LW peek4ll,1|AMulti
LW peek4ra,1|AMulti
LW peek4la,1|AMulti
LW peek4m,3
LW peek3rl,1|AMulti
LW peek3ll,1|AMulti
LW peek3ra,1|AMulti
LW peek3la,1|AMulti
LW peek3m,3
LW peek2rl,1|AMulti
LW peek2ll,1|AMulti
LW peek2ra,1|AMulti
LW peek2la,1|AMulti
LW peek2m,3
LW peek1rl,1|AMulti
LW peek1ll,1|AMulti
LW peek1ra,1|AMulti
LW peek1la,1|AMulti
LW peek1m,3
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,20,100
LW 1,0
LW 1,0
.long 0
BUSHJMP_ANIM
LW jmpo1ra,1|AMulti
LW jmpo1m,1|AMulti
LW jmpo1la,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,3|AFunc,OBJ_OFF
LW jmpo2rl,1|AMulti
LW jmpo2ra,1|AMulti
LW jmpo2la,1|AMulti
LWL jmpo2m,3|AFunc,OBJ_ON
LWLL jmpo3rl,1|AMulti|AFunc,A_SET_OXVEL+2,-40000H
LW jmpo3ll,1|AMulti
LW jmpo3ra,1|AMulti
LW jmpo3la,1|AMulti
LWL jmpo3m,3|AFunc,OBJ_ON
LW jmpo4rl,1|AMulti
LW jmpo4ll,1|AMulti
LW jmpo4ra,1|AMulti
LW jmpo4la,1|AMulti
LW jmpo4m,3
LW jmpo5rl,1|AMulti
LW jmpo5ll,1|AMulti
LW jmpo5ra,1|AMulti
LW jmpo5la,1|AMulti
LW jmpo5m,3
LW jmpo6rl,1|AMulti
LW jmpo6ll,1|AMulti
LW jmpo6ra,1|AMulti
LW jmpo6la,1|AMulti
LW jmpo6m,3
LW jmpo7rl,1|AMulti
LW jmpo7ll,1|AMulti
LW jmpo7ra,1|AMulti
LW jmpo7la,1|AMulti
LW jmpo7m,3
LW jmpo8rl,1|AMulti
LW jmpo8ll,1|AMulti
LW jmpo8ra,1|AMulti
LW jmpo8la,1|AMulti
LW jmpo8m,3
LWL jmpo9rl,1|AMulti|AFunc,A_Unlink_Enemy
LW jmpo9ll,1|AMulti
LW jmpo9ra,1|AMulti
LW jmpo9la,1|AMulti
LW jmpo9m,3
LWLWL jmpo10rl,1|AMulti|AFunc,A_Set_Rel_Long+3,OXVEL,0
LW jmpo10ll,1|AMulti
LW jmpo10ra,1|AMulti
LW jmpo10la,1|AMulti
LW jmpo10m,3
LW jmpo11rl,1|AMulti
LW jmpo11ll,1|AMulti
LW jmpo11ra,1|AMulti
LW jmpo11la,1|AMulti
LW jmpo11m,2
; LWL 1,1|AFunc,NatvAdjXJmp
.long 0
NATV_THRW_ANIM:
LW throw2rl,1|AMulti
LW throw2ll,1|AMulti
LW throw2ra,1|AMulti
LW throw2la,1|AMulti
LW throw2m,6
LW throw3rl,1|AMulti
LW throw3ll,1|AMulti
LW throw3ra,1|AMulti
LW throw3la,1|AMulti
LW throw3m,6
LW throw4rl,1|AMulti
LW throw4ll,1|AMulti
LW throw4ra,1|AMulti
LW throw4la,1|AMulti
LW throw4m,6
LW throw5rl,1|AMulti
LW throw5ll,1|AMulti
LW throw5ra,1|AMulti
LW throw5la,1|AMulti
LW throw5m,6
; LWL throw6rl,1|AMulti|AFunc,THROW_SPEAR
LWLLWW throw6rl,1|AMulti|AFunc,A_SPAWN_PROJECTILE+4,NSPEAR_INIT,-21,-108
LWLL throw6ll,1|AMulti|AFunc,A_SOUNDZ+2,SND_CHUCK_IT
LW throw6ra,1|AMulti
LW throw6la,1|AMulti
LW throw6m,6
LW throw7rl,1|AMulti
LW throw7ll,1|AMulti
LW throw7la,1|AMulti
LW throw7la,1|AMulti
LW throw7m,5
LW throw8rl,1|AMulti
LW throw8ll,1|AMulti
LW throw8ra,1|AMulti
LW throw8la,1|AMulti
LW throw8m,5
LW throw9rl,1|AMulti
LW throw9ll,1|AMulti
LW throw9ra,1|AMulti
LW throw9la,1|AMulti
LW throw9m,5
LW throw10rl,1|AMulti
LW throw10ll,1|AMulti
LW throw10ra,1|AMulti
LW throw10la,1|AMulti
LW throw10m,5
LW ano2rl,1|AMulti
LW ano2ll,1|AMulti
LW ano2ra,1|AMulti
LW ano2la,1|AMulti
LW ano2m,5
LW ano3rl,1|AMulti
LW ano3ll,1|AMulti
LW ano3ra,1|AMulti
LW ano3m,1|AMulti
LWL 1,5|AFunc,OBJ_OFF
LW ano4rl,1|AMulti
LW ano4ll,1|AMulti
LW ano4ra,1|AMulti
LW ano4la,1|AMulti
LWL ano4m,5|AFunc,OBJ_ON
; LW ano5rl,1|AMulti
; LW ano5ll,1|AMulti
; LW ano5ra,1|AMulti
; LW ano5la,1|AMulti
; LW ano5m,5
LW ano6rl,1|AMulti
LW ano6ll,1|AMulti
LW ano6ra,1|AMulti
LW ano6la,1|AMulti
LW ano6m,5
LW ano7rl,1|AMulti
LW ano7ll,1|AMulti
LW ano7ra,1|AMulti
LW ano7la,1|AMulti
LW ano7m,5
.long 0
; LWLL 1,1|AFunc,A_AnimFrm+2,BUSHGUY_ANIM
*
* Native sounds
*
SND_GROUND_HIT
.WORD 0F330H,26,0A1D1H,0 ;Thud when hitting ground
SND_BODY_THUD
.WORD 0E10AH,26,0A1CFH,0 ;Thud for getting shot
SND_CHUCK_IT
.WORD 0F141H,13,0A47EH,0 ;Sound for throwing the spear
SND_NATIVE_GRUNT
.WORD 0E341H,26,0A47DH,0 ;Native grunts for appear
SND_NATIVE_EXPLODE
.WORD 0F342H,60,0A38DH,0 ;Explosion used by much
SND_NATIVE_SCREAM
.WORD 0F142H,74,0A3ABH,0 ;Scream flying explode guy
NATV_RUN_ANIM:
LW rdru1rl,1|AMulti
LW rdru1ll,1|AMulti
LW rdru1ra,1|AMulti
LW rdru1la,1|AMulti
LW rdru1m,4
LW rdru2rl,1|AMulti
LW rdru2ll,1|AMulti
LW rdru2ra,1|AMulti
LW rdru2la,1|AMulti
LW rdru2m,4
LW rdru3rl,1|AMulti
LW rdru3ll,1|AMulti
LW rdru3m,1|AMulti
LW rdru3la,1|AMulti
LWL 1,4|AFunc,OBJ_OFF
NATV_RUN_LP:
LWLL run1ll,1|AMulti|AFunc,A_SET_OZVEL+2,-0e0h
LW run1rl,1|AMulti
LW run1ra,1|AMulti
LW run1m,1|AMulti
LWL run1la,4|AFunc,OBJ_ON
LW run2ll,1|AMulti
LW run2rl,1|AMulti
LW run2ra,1|AMulti
LW run2m,1|AMulti
LW run2la,4
LW run3ll,1|AMulti
LW run3rl,1|AMulti
LW run3ra,1|AMulti
LW run3m,1|AMulti
LW run3la,4
LW run4ll,1|AMulti
LW run4rl,1|AMulti
LW run4ra,1|AMulti
LW run4m,1|AMulti
LW run4la,4
LW run5ll,1|AMulti
LW run5rl,1|AMulti
LW run5ra,1|AMulti
LW run5m,1|AMulti
LW run5la,4
LW run6ll,1|AMulti
LW run6rl,1|AMulti
LW run6ra,1|AMulti
LW run6m,1|AMulti
LW run6la,4
LW run7ll,1|AMulti
LW run7rl,1|AMulti
LW run7ra,1|AMulti
LW run7m,1|AMulti
LW run7la,4
LW run8ll,1|AMulti
LW run8rl,1|AMulti
LW run8ra,1|AMulti
LW run8m,1|AMulti
LW run8la,4
LW run9ll,1|AMulti
LW run9rl,1|AMulti
LW run9ra,1|AMulti
LW run9m,1|AMulti
LW run9la,4
LW run10ll,1|AMulti
LW run10rl,1|AMulti
LW run10ra,1|AMulti
LW run10m,1|AMulti
LW run10la,3
LWL 1,1|AFunc,HES_RUNNING
NATV_RUN_HALT:
LW rurd1rl,1|AMulti
LW rurd1ll,1|AMulti
LW rurd1ra,1|AMulti
LW rurd1la,1|AMulti
LW rurd1m,4
LWL rurd2rl,1|AMulti|AFunc,A_CLR_OZVEL
LW rurd2ll,1|AMulti
LW rurd2ra,1|AMulti
LW rurd2la,1|AMulti
LW rurd2m,4
.long 0
*
* called from NONBOY_GUNVECTOR
*
NATIVE_DEATH:
movk 3,a14
movb a14,*a8(AnimSLP) ; normal speed for gun death
MOVE *A8(OYVEL),A14,L
JRNZ ND_NO_NEW_YVEL
MOVIM -28000H,*A8(OYVEL),L ;Make him fly up
ND_NO_NEW_YVEL
MOVIM 3000H,*A8(OYACCEL),W ;Drop him
move *a8(OFLAGS),a14 ; renable ground coll for head part
ori M_GCOLL,a14
andni M_NOCOLL,a14
move a14,*a8(OFLAGS)
MOVIM NTV_DTH_CVECT,*a8(OCVECT),L
movi NTV_DTH_ANIM,a1
jruc SetAnimNow
NTV_DTH_ANIM
LW det1m,1|AMulti
LW det1rl,1|AMulti
LW det1ll,1|AMulti
LWL det1ra,1|AMulti|AFunc,OBJ_ON
LWL det1la,0|AFunc,OBJ_ON
; To improve bog problems, no shadow added on death
; LWL det2m,1|AMulti|AFunc,A_CHECK_SHAD_START
LW det2m,1|AMulti
LW det2rl,1|AMulti
LW det2ll,1|AMulti
LW det2ra,1|AMulti
LW det2la,0
LW det3m,1|AMulti
LW det3rl,1|AMulti
LW det3ll,1|AMulti
LW det3ra,1|AMulti
LW det3la,0
LW det4m,1|AMulti
LW det4rl,1|AMulti
LW det3ll,1|AMulti
LW det4ra,1|AMulti
LW det4la,0
LW det5m,1|AMulti
LW det5rl,1|AMulti
LW det5ll,1|AMulti
LW det5ra,1|AMulti
LW det5la,0
LW det6la,1|AMulti
LW det6rl,1|AMulti
LW det6ra,1|AMulti
LWL 1,1|AFunc|AMulti,OBJ_OFF
LWL 1,0|AFunc,OBJ_OFF
LWL 1,1|AFunc,A_STAY_TIL_GRND_HIT
LWL det7la,1|AMulti|AFunc,A_NATIVE_HIT_SND
LW det7rl,1|AMulti
LW det7ra,0
LWLWL det8ll,1|AMulti|AFunc,A_Set_Rel_Long+3,OXVEL,0
LW det8ra,1|AMulti
LW det8la,0
LW det9rl,1|AMulti
LW det9ll,1|AMulti
LW det9la,0
LW det10la,1|AMulti
LW det10rl,1|AMulti
LW det10ll,34
LWL 1,1|AFunc,A_DEL_NATIVE
*
* Native blows up a little bit
*
NATIVE_PARTS_1
.long ARM_SPIN,N_CHUNK
.word OID_JUNK,1*800H+0*40H+FRGPAL+FRGGCOL
.long LEG_SPIN,N_CHUNK
.word OID_JUNK,1*800H+0*40H+FRGPAL+FRGGCOL
.long 0
*
* Native blows up some more
*
NATIVE_PARTS_2
.long ARM_SPIN2,N_CHUNK
.word OID_JUNK,1*800H+0*40H+FRGPAL+FRGGCOL
.long HEAD_SPIN,N_CHUNK
.word OID_JUNK,1*800H+0*40H+FRGPAL+FRGGCOL
.long LEG_SPIN,N_CHUNK
.word OID_JUNK,1*800H+0*40H+FRGPAL+FRGGCOL
.long 0
**************************************************************************
* *
* Fragment Animation Scripts - These are used by the Fragger Scripts *
* *
**************************************************************************
*
* Native arm spin animation
*
ARM_SPIN
LWLW ARMTOR1,1|AFunc,A_INIT_AnimSLP+1,1
ARM_SPIN_LOOP
LW ARMTOR2,0
LW ARMTOR3,0
LW ARMTOR4,0
LW ARMTOR5,0
LW ARMTOR6,0
LW ARMTOR7,0
LW ARMTOR8,0
LW ARMTOR1,0
LW ARMTOR2,0
LW ARMTOR3,0
LW ARMTOR4,0
LW ARMTOR5,0
LW ARMTOR6,0
LW ARMTOR7,0
LWLW ARMTOR8,0|AFunc,A_INC_AnimSLP+1,4
LWLL ARMTOR1,0|AFunc,A_AnimFrm+2,ARM_SPIN_LOOP
ARM_SPIN2
LWLW ARMRIP1,1|AFunc,A_INIT_AnimSLP+1,1
ARM_SPIN2_LOOP
LW ARMRIP2,0
LW ARMRIP3,0
LW ARMRIP4,0
LW ARMRIP5,0
LW ARMRIP6,0
LW ARMRIP7,0
LW ARMRIP8,0
LW ARMRIP1,0
LW ARMRIP2,0
LW ARMRIP3,0
LW ARMRIP4,0
LW ARMRIP5,0
LW ARMRIP6,0
LW ARMRIP7,0
LWLW ARMRIP8,0|AFunc,A_INC_AnimSLP+1,4
LWLL ARMRIP1,0|AFunc,A_AnimFrm+2,ARM_SPIN2_LOOP
*
* Native leg spin animation
*
LEG_SPIN
LWLW LEGRIP1,1|AFunc,A_INIT_AnimSLP+1,3
LEG_SPIN_LOOP
LW LEGRIP2,0
LW LEGRIP3,0
LW LEGRIP4,0
LW LEGRIP5,0
LW LEGRIP6,0
LW LEGRIP7,0
LW LEGRIP8,0
LW LEGRIP1,0
LW LEGRIP2,0
LW LEGRIP3,0
LW LEGRIP4,0
LW LEGRIP5,0
LW LEGRIP6,0
LW LEGRIP7,0
LWLW LEGRIP8,0|AFunc,A_INC_AnimSLP+1,8
LWLL LEGRIP1,0|AFunc,A_AnimFrm+2,LEG_SPIN_LOOP
*
* Native head spin animation
*
HEAD_SPIN
LWLW MASKBLOW1,1|AFunc,A_INIT_AnimSLP+1,3
HEAD_SPIN_LOOP
LW MASKBLOW2,0
LW MASKBLOW3,0
LW MASKBLOW4,0
LW MASKBLOW5,0
LW MASKBLOW6,0
LW MASKBLOW7,0
LW MASKBLOW8,0
LW MASKBLOW1,0
LW MASKBLOW2,0
LW MASKBLOW3,0
LW MASKBLOW4,0
LW MASKBLOW5,0
LW MASKBLOW6,0
LW MASKBLOW7,0
LWLW MASKBLOW8,0|AFunc,A_INC_AnimSLP+1,8
LWLL MASKBLOW1,0|AFunc,A_AnimFrm+2,HEAD_SPIN_LOOP
**************************************************************************
* *
* A_NATIVE_HIT_SND *
* *
* Anim func to make the ground hit sound for the native. *
* *
* A8 = Ptr to native head part *
* *
**************************************************************************
A_NATIVE_HIT_SND
MOVI SND_GROUND_HIT,A0
MOVE *A8(OYVEL),A14,L
JAZ ONESND_Z
RETS
********************************************************
* *
* NATIVE BRANCH ROUTINES *
* *
* AFuncs to decide what to do next based on what *
* he just did *
* *
* *
********************************************************
*
* GENERAL DECISION ROUTINE
*
WHAT_TO_DO:
move *a8(OEFLAGS),a14 ; normal or building guy?
jrz normalguy
cmpk 1,a14
jreq jumpoutguy
*
* FINALE GUY, jump sideways to get on screen, try to throw
*
movb *a8(OFLAGS),a14
jrnn do_throw
movi M_FLIPH,a0
move *a8(ODAGX),a14
jrn jump_right
clr a0
jump_right:
calla SET_FLPS
jruc do_jump
normalguy:
move *a8(OGenObj),a14,L ; is he behind a bush?
jrz out_from_bush
*
* Either peek or jump out or wait
*
behind_bush:
movi BUSHWAIT,a1
movi 100,a0 ; wait (small prob)
calla RANDPER
jrc set4
calla WVSTRT_CHANCE ; peek at first, then jump more
jrnc keepon
MOVB *A8(OFLAGS),A14
JRN WTD_NOSND ;BR = Offscreen
SOUNDZ SND_NATIVE_GRUNT ;Make the appear sound
WTD_NOSND
movi BUSHJMP_ANIM,a1
set4:
move a1,*a8(AnimFrm),L
keepon:
rets
*
* This guy is coming out of building
* His intelligence is slightly different.
* He jumps out, then tries to throw until he gets too close,
* then he runs forward and off
jumpoutguy:
move *a8(OZVAL),a0,L
move @ZBASE,a14,L
sub a14,a0
cmpi JUMPOUT_Z,a0 ; if too far, then wait
jrgt do_wait
cmpi 07000h,a0 ; if close, run
jrlt do_run
move *a8(OGenObj),a14,L
jrnz do_jump ; if attached, jump
callr TRY_TO_THROW ; else try to throw
jrc success
do_wait:
movi BUSHWAIT,a1
move a1,*a8(AnimFrm),L
rets
*
* In ready position... either throw or run
*
out_from_bush:
calla WVSTRT_CHANCE ; early on, try to run 1st,
jrc try_to_throw1st ; later, try to throw 1st
try_to_run1st:
callr TRY_TO_RUN
jrc success
callr TRY_TO_THROW
jrc success
do_jump:
movi BUSHJMP_ANIM,a1
move a1,*a8(AnimFrm),L
success:
rets
try_to_throw1st:
callr TRY_TO_THROW
jrc success
callr TRY_TO_RUN
jrc success
jruc do_jump
TRY_TO_THROW:
callr SHOULD_I_THROW
jrnc nono
callr CAN_I_THROW
jrnc nono
do_throw:
move *a8(ODAGX),a14
move a14,@LAST_SPEAR_X
move @WAVEIRQS,@LAST_SPEAR_IRQ,L
movi NATV_THRW_ANIM,a1
move a1,*a8(AnimFrm),L
setc
rets
TRY_TO_RUN:
callr SHOULD_I_RUN
jrnc nono
callr CAN_I_RUN
jrnc nono
do_run:
movi NATV_RUN_ANIM,a1
move a1,*a8(AnimFrm),L
yesyes:
setc
rets
nono:
clrc
rets
HES_RUNNING:
callr SHOULD_I_RUN
jrnz closenuf
movi NATV_RUN_LP,a1 ; keep running or stop
movi 800,a0
calla RANDPER ; small chance of stopping anyway
jrc set5
closenuf:
movi NATV_RUN_HALT,a1
set5:
move a1,*a8(AnimFrm),L
rets
*
* SHOULD_I_SIDE - He decides if he is offscreen and should come
* back on
*
* Carry set means do it
* Carry clr means don't
*
;SHOULD_I_SIDE:
; move *a8(ODAGX),a14 ; am I off screen left?
; jrnn SIS_chkleft
; move @XSCROLL,a4,L
; jrgt side_right ; get back on screen
; callr SHOULD_I_RUN
; jrz throw_again
;
;SIS_chkleft:
; subi HALFX*2,a14
; jrnn side_left
*
* SHOULD_I_RUN - He decides to run if he is too far back
* Carry set means run
* Carry clr means don't
*
SHOULD_I_RUN:
move *a8(OZVAL),a1,L
move @ZBASE,a14,L
sub a14,a1
cmpi 8000h,a1 ; close enuf, don't run
jrle nono
cmpi 0e000h,a1 ; far enuf, do run
jrgt yesyes
movi 512,a0
jauc RANDPER ;
*
* CAN_I_RUN - He sees if there is something in front of him
* (like a tree)
* Carry set means yes, you can
* Carry clr means no, you can't
*
CAN_I_RUN:
jruc yesyes
*
* SHOULD_I_THROW - Would piercing this invader be a good idea?
* Carry set means yes, you can
* Carry clr means no, you can't
*
SHOULD_I_THROW:
jruc yesyes
*
* CAN_I_THROW - He sees if another guy threw a spear at a close X
* or recently
* Carry set means yes, you can
* Carry clr means no, you can't
*
CAN_I_THROW:
callr CAN_I_CREATE_SPEAR
jrnc nono
move @LAST_SPEAR_IRQ,a14,L
move @WAVEIRQS,a1,L
sub a14,a1
cmpk 25,a1 ; don't throw another within some tiks
jrlt nono
move *a8(OZVAL),a14,L
move @ZBASE,a1,L
sub a1,a14 ; world Z
cmpi 014000h,a14 ; don't throw if further than this
jrgt nono
movi -41,a5 ; spear pixel offset from thrower
mpys a14,a5 ; world Z delta
sra 15,a5 ; pixels at that Z
move *a8(OCTRL),a14
btst B_FLIPH,a14
jrz CIT_noflp
neg a5
CIT_noflp:
move *a8(ODAGX),a3
add a3,a5 ; proposed DAG of spear
subk 8,a5
jrn nono
subi SCREEN_WIDTH-8,a5
jrnn nono
; move @LAST_SPEAR_X,a14
; sub a3,a14 ; a3 still contains ODAGX
; abs a14
; cmpk 30,a14
; jrlt nono
jruc yesyes
*
* An enemy generator can call this routine to see if it should
* actually generate the enemy.
*
CAN_I_CREATE:
move @HOLD_ENEMY_DISPATCH,a14
jrnz nono
*
* determine max allowed based on CURPLYRS and MAX_ALLOWED
*
move @MAX_ALLOWED,a0
callr CURPLYR_ADJ
move @NUM_OUT_THERE,a14
jrge itsok
clr a14
move a14,@NUM_OUT_THERE
itsok:
cmp a0,a14
jrge nono
jruc yesyes
CAN_I_CREATE_SPEAR:
move @HOLD_ENEMY_DISPATCH,a14
jrnz nono
move @OBJENEMIES,a14 ; did this get disabled?
andi M_OF_BUSH|M_OF_TREE|M_OF_CNATV,a14
jrz nono
*
* determine max allowed based on CURPLYRS and MAX_ALLOWED
*
move @MAX_SPEARS_ALLOWED,a0
move a0,a1
srl 1,a1 ; half of max
move @CURPLYRS,a14
dec a0
jrle Sadj_done
add a1,a0
dec a0
jrle adj_done
add a1,a0
Sadj_done:
move @NUM_SPEARS,a14
cmp a0,a14
jrge nono
jruc yesyes
* ENTRY: a0 = some limit
*
* EXIT: a0 = the limit adjusted based on
* CURPLYRS
* (Formula: for each player, the limit is increase by
* 50%)
* **** NOTE!!!! THIS TRASHES A1 and A14 !
*
CURPLYR_ADJ:
move a0,a1
srl 1,a1 ; half of max
move @CURPLYRS,a14
dec a14
jrle adj_done
add a1,a0
dec a14
jrle adj_done
add a1,a0
adj_done:
rets
*
* This routine makes a note that damage has been done in the
* chem plant. (If it isnt, beekeepers will be dispatched to
* fuck up the player)
*
NOTICE_DAMAGE:
move @WAVEIRQS,@LAST_CHEM_DAMAGE,L
rets
*
* This process checks to make sure that damage is being done in the
* chemical plant. If not, it dispatches nasty beekeepers
*
CHECK4_CHEM_DAM
callr NOTICE_DAMAGE ; initialize
CHK_CHMDAM_lp:
sleep 60
move @SCROLLKILL,a4
jrz CCD0
dec a4
move a4,@SCROLLKILL
DIE
CCD0:
move @WAVEIRQS,a3,L
move @LAST_CHEM_DAMAGE,a1
sub a1,a3
movi 4*60,a0 ; 4 (was 10) seconds for 1 player
move @CURPLYRS,a14
dec a14
jrz CCD1
subi 60,a0 ; 3 (was 8) seconds for 2 players
dec a14
jrz CCD1
subi 60,a0 ; 2 (was 6) seconds for 3 players
CCD1:
cmp a0,a3 ; if too long, fall through
jrlt CHK_CHMDAM_lp
*
* Dispatch a bad guy
*
calla DROP_A_MASK_GUY
callr NOTICE_DAMAGE ; reset
jruc CHK_CHMDAM_lp
.IF 0
SPEAR_INIT:
LWWWW ARROW1,DMAWNZ,0,OM_ANIM|OM_OID|OM_GUNV|OM_COLL, OID_EROCKET
.long SPEAR_CVECT ; COLL
.LONG SPEAR_GUNVECT ; GUNV
.long SPEAR_ANIM
SPEAR_CVECT
WWL OID_PROCKET,~MASK_PLAYER,SPEAR_COLLVECT ;
WL 0,DUMCRETS
SPEAR_FALL_CVECT
WWL OID_GRND,0FFFFH,SPEAR_GRND_COLL
WL 0,DUMCRETS
SPEAR_GRND_COLL:
clr a14
move a14,*a8(OYACCEL),W
jauc DELETE_OBJ
SPEAR_COLLVECT:
move @NUM_SPEARS,a14
dec a14
move a14,@NUM_SPEARS
calla DELETE_OBJ_PROC
rets
SPEAR_GUNVECT:
CLRM *a8(OZVEL),L
calla PULL_ANIM
CALLA COLLS_OFF ;Turn all collisions off now!
calla OBJPROC_KILL
move *a8(OFLAGS),a14
ori M_GCOLL,a14
andni M_NOCOLL,a14
move a14,*a8(OFLAGS)
MOVIM SPEAR_FALL_CVECT,*a8(OCVECT),L
SOUNDZ SND_SPEAR_DEFLECT
move @NUM_SPEARS,a14
dec a14
move a14,@NUM_SPEARS
clr a14
move a14,*a8(OXVEL),L
movi 100h,a14
move a14,*a8(OZVEL),L
movi -30000h,a14
move a14,*a8(OYVEL),L
movi 3000h,a14
move a14,*a8(OYACCEL),W
tooclose:
rets
SND_SPEAR_DEFLECT:
.WORD 0F342H,62,0A1A3H,0 ;Spear gets blown out of the air
SND_SPEAR_HIT:
.WORD 0F342H,67,0A48Fh,0
SND_SPEAR_LAND:
.WORD 0E341H,46,0A41AH,0
SPEAR_ANIM:
LW ARROW1,8
LW ARROW4,8
LW ARROW7,8
LW ARROW8,10
LWLL ARROW9,2|AFunc,A_STAY_TIL_ZW_LT+2,SPEAR_DEST_Z-(40*SPEAR_ZVEL)
LWLL ARROW10,24|AFunc,A_SOUND+2,SND_SPEAR_LAND
LW ARROW11,7
LW ARROW12,4
LWL ARROW13,3|AFunc,COLLS_OFF
LW ARROW14,2
LWL 1,1|AFunc,HIT_BY_SPEAR
INTO_SCRNOBJ:
move *a8(OFLAGS),a14
ori M_SCRNOBJ,a14
move a14,*a8(OFLAGS)
move *a8(ODAG),a1,L
clr a2
movy a1,a2
sll 16,a1
move a1,*a8(OXVAL),L
move a2,*a8(OYVAL),L
rets
SPEAR_DEST_Z .set 4800h
SPEAR_ZVEL .set -180h
THROW_SPEAR:
movi SPEAR_INIT,b0
calla EASYMAKE
jrz nospear
move *a8(OXVAL),a1,L
move *a8(OYVAL),a2,L
move *a8(OZVAL),a3,L
movi -41<<15,a4
movi -100<<15,a5
move *a8(OCTRL),a14
btst B_FLIPH,a14
jrz nooffadj
neg a4 ; adjust X offset
nooffadj:
add a4,a1
add a5,a2
dec a3
move a1,*a0(OXVAL),L
move a2,*a0(OYVAL),L
move a3,*a0(OZVAL),L
move @NUM_SPEARS,a14
inc a14
move a14,@NUM_SPEARS
MOVI SPEAR_ZVEL,a10
MOVE @ZBASE,A14,L
sub a14,a3 ; src WORLD Z in a3
sll ZFRAC,a10 ; hi res ZVEL in a10
move a0,a8
move a3,a9
sll ZFRAC,a9 ; hi res world Z in a9
move @OBJENEMIES,a14 ; are we outside main entrance?
btst B_OF_CNATV,a14 ; if yes, move spear in X
jrnz varyX
CREATE PID_IND,SPEAR_ADJ_ZX ; keep X same screen rel.
move a0,*a8(OPLINK),L
move a8,a0
calla INSOBJ
nospear:
rets
varyX:
move a1,a5 ; save OXVAL in a5
CREATE PID_IND,SPEAR_ADJ_Z ; allow motion in X
move a0,*a8(OPLINK),L
move @XBASE,a0,L ; compute an XVEL
move a0,a1
addi 185*ZMAX_REAL,a0
subi 185*ZMAX_REAL,a1
calla RANGRAND
sub a5,a0 ; target - current
sra 7,a0
move a0,*a8(OXVEL),L
move a8,a0
calla INSOBJ
rets
*
* If player is hit by spear
*
HIT_BY_SPEAR:
move @NUM_SPEARS,a14
dec a14
move a14,@NUM_SPEARS ; log it.
move *a8(OFLAGS),a14
btst B_OFSCRN,a14
janz DELETE_OBJ_PROC
calla PSTOP
calla OBJPROC_KILL
callr INTO_SCRNOBJ
calla COLLS_OFF
clr a3
movi [8,0],a5
MOVE @BASE_HIT,A5,W
ADDI 6800H,A5
SLL 4,A5
calla CK_PLAYER_HIT
SOUND1 SND_SPEAR_HIT
movi (63<<8)+63,a1
calla HIT_SCREEN
rets
*
* To keep spear relative to world, override automatic calc
*
* a8 = obj
* a9 = UNIV Z POS (Hi res world)
* a10 = ZVEL
*
SPEAR_ADJ_ZX:
sleep 1
move *a8(ODAGX),a11
SAZX_lp
move @ZBASE_HR,a0,L
move a0,a4
add a10,a9
add a9,a0
sra ZFRAC,a0
move a0,*a8(OZVAL),L ; counteract ZSCROLL
*
* Keep X at same DAG
*
move *a8(ODAGX),a1
sub a11,a1
jreq xsame
mpys a9,a1 ; hi res world Z * pixels
neg a1
sra ZFRAC,a1 ; convert to lo res
move *a8(OXVAL),a2,L ; adjust X accordingly
add a1,a2
move a2,*a8(OXVAL),L
xsame:
sloop 1,SAZX_lp
SPEAR_ADJ_Z:
sleep 1
move *a8(ODAGX),a11
SAZ_lp
move @ZBASE_HR,a0,L
move a0,a4
add a10,a9
add a9,a0
sra ZFRAC,a0
move a0,*a8(OZVAL),L ; counteract ZSCROLL
sloop 1,SAZ_lp
.ENDIF
.if 0 ; can't shoot the stained glass no mo
STAIN_CVECT
WWL OID_PROCKET,~MASK_PLAYER,UNIV_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,STAIN_COLLVECT
WL 0,DUMCRETS
STAIN_COLLVECT:
CALLA UNIV_COLL_CHECK
JRNZ STAIN_DONE
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
movi M_LASTFRM|M_NOMORE,a7
MOVI 0,A5
CLR A9 ;NO OFFSET
CALLA UNIV_DAMAGE_HANDLER
move a10,a10
jrz STAIN_DONE
MMTM SP,B1,B2,B4,B5,B6,B8,B9,B10
movi SKY_SND_TAB,a1
movk 3,a0
CALLA RAND0
SLL 5,A0
ADD A0,A1
MOVE *A1,A0,L
calla ONESND_Z
MOVI 0dc00H,A0
MOVI 0180H,A3
CALLA PreFrag_Box
subi 200h,b9
subi 200h,b10 ; adjust ZVEL to be neg always
MOVI FRG_GL_10,B14
subk 10h,b0 ; adjust ZVAL
CALLA Fragger
MOVE *A8(OIMG),A1,L
MOVE *A1(ICMAP),*A0(FPDATA),L ;SET PALETTE
MMFM SP,B1,B2,B4,B5,B6,B8,B9,B10
STAIN_DONE
rets
.endif
.if 0 ; SPIT STUFF
OSPITCHN .set ODATA+40h ; forward link for spit chain
SND_SPIT_LAUNC .word 0f3a4h,54,0a396h,0
SND_SPIT_HIT .word 0f3a8h,60,0a14dh,0
SPIT_ANIM:
LW SPIT1,2
LW SPIT2,2
LW SPIT3,2
LW SPIT4,2
LW SPIT5,2
LW SPIT6,2
LW SPIT7,2
LW SPIT8,2
LWL SPIT9,2|AFunc,A_OFF_KILL_SPIT
.long 0
SPIT_HIT_ANIM:
LWLL ISPLAT2,22|AFunc,A_SOUND+2,SND_SPIT_HIT
LWL ISPLAT3,16|AFunc,UNIV_FLASH
LWL ISPLAT4,12|AFunc,UNIV_FLASH
LW ISPLAT5,10
LW ISPLAT6,9
LW ISPLAT7,9
LW ISPLAT8,11
LWL ISPLAT9,14|AFunc,A_DEC_NUM
LWL 1,1|AFunc,DELETE_OBJ
A_DEC_NUM:
move @NUM_OUT_THERE+8,a0
dec a0
move a0,@NUM_OUT_THERE+8
rets
SPIT_INIT:
.long SPIT1
.word DMAWNZ,0,OM_GUNV|OM_COLL|OM_ANIM
.long SPIT_CVECT, SPIT_GUNVECT, SPIT_ANIM
SPIT_CVECT
; WWL OID_PROCKET,~MASK_PLAYER,SPIT_ALLCOLL
WWL OID_PEXPLOSION,~MASK_PLAYER,SPIT_COLLVECT
WL 0,DUMCRETS
SPIT_COLLVECT:
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA ;GET PDATA IN A2
SPIT_GUNVECT:
move *a8(OPLINK),a5,L
LOCKON Z
CLRM *a8(OZVEL),L
calla OBJPROC_KILL
calla COLLS_OFF
movi 38000h,a0
calla RAND0
addi 18000h,a0
move @RAND,a14
btst 7,a14
jrz spg0
neg a0
spg0:
move a0,*a8(OXVEL),L
movi 18000h,a0
calla RAND0
addi 8000h,a0
neg a0
move a0,*a8(OYVEL),L
MOVIM 1000h,*a8(OYACCEL),W
movb @NUM_OUT_THERE+8,a0
dec a0
movb a0,@NUM_OUT_THERE+8
rets
ZSPLAT .set 3800h
*
* process to launch spit pieces
* pieces are chained through OSPTCHN (ODATA+40h)
*
* a8 = obj creating spit
LAUNCH_SPIT:
move *a8(OFLAGS),a14
btst B_OFSCRN,a14
janz SUCIDE
move *a8(OYVAL),a9,L ; starting Y pos
move *a8(OZVAL),a10,L
subk 2,a10 ; starting Z pos
move *a8(OXVAL),a8,L ; starting X pos
.if OLD_WAY
clr a11 ; last obj in stream
move @ZBASE,a4,L ; COMPUTE ZVEL OF SPIT
addi ZSPLAT,a4
sub a10,a4
sra 6,a4 ; Z vel
addi 50h,a4 ; fudge factor
movi 150*ZSPLAT,a3 ; used for getting targets
move @XBASE,a0,L
move a0,a1
add a3,a0
sub a3,a1
calla RANGRAND ; get random X target
sub a8,a0 ; delta X
sra 6,a0
move a0,a6
; move a3,a0
; calla RAND0 ; random Y target in a0
move @YBASE,a0,L
neg a0
sub a9,a0 ; delta Y
sra 6,a0
move a0,a2
clr a3 ; counter
mmtm a12,a2,a3,a4,a6
LAUNCH_lp:
movi SPIT_INIT,b0
calla EASYMAKE
jaz DIE
move a11,a11
jrz nolink1
move a0,*a11(OSPITCHN),L ; link this to prev. (exc first time)
nolink1:
move a0,a5
mmfm a12,a2,a3,a4,a6
move a4,*a5(OZVEL),L ; hit screen in 64 ticks.
move a10,*a5(OZVAL),L
move a6,*a5(OXVEL),L
move a8,*a5(OXVAL),L
move a9,*a5(OYVAL),L
move a2,*a5(OYVEL),L
MOVI 2800H,A14
MOVE A14,*A5(OYACCEL),W ;SET GRAVITY
move a14,*a5(OSPITCHN),L ; clear fwd link for this block (next piece will set this)
PUSH a8
move a5,a8
CREATE PID_IND,MON_SPIT
move a0,*a8(OPLINK),L
PULLQ a8
move a5,a0
calla INSOBJ
SOUND1 SND_SPIT_LAUNC
mmtm a12,a2,a3,a4,a6
move a5,a11 ; save for next one
sloop 2,LAUNCH_lp
.else
move @ZBASE,a5,L ; COMPUTE ZVEL OF SPIT
addi ZSPLAT,a5
sub a10,a5
sra 6,a5 ; Z vel
movi 140*ZSPLAT,a0 ; pos and neg range
move a0,a1
neg a1
calla RANGERND ; random world X target
move a0,a3 ; is in a3
movi -90*ZSPLAT,a1 ; pos and neg range
clr a0
calla RANGERND ; random world Y target
move a0,a4 ; is in a4
move @XBASE,a14,L
add a14,a3
move @YBASE,a14,L
sub a14,a4
sub a8,a3 ; turn target into X velocity
sra 6,a3
sub a9,a4 ; turn target into Y velocity
sra 6,a4
movi SPIT_INIT,b0
calla EASYMAKE
jaz DIE
move a5,*a0(OZVEL),L ; hit screen in 64 ticks.
move a10,*a0(OZVAL),L
move a3,*a0(OXVEL),L
move a8,*a0(OXVAL),L
move a4,*a0(OYVEL),L
move a9,*a0(OYVAL),L
; MOVI 0800H,A14
; MOVE A14,*A0(OYACCEL),W ;SET GRAVITY
move a0,a8
CREATE PID_IND,MON_SPIT
move a0,*a8(OPLINK),L
move a8,a0
calla INSOBJ
SOUND1 SND_SPIT_LAUNC
DIE
.endif
A_OFF_KILL_SPIT:
move *a8(OFLAGS),a14
btst B_OFSCRN,a14
jrz SpitOn
callr A_DEC_NUM ; adjust accounting
jauc DELETE_OBJ_PROC
SpitOn:
rets
* a8 = spit obj
* a11 = obj block of prev spit in stream (0=first)
MON_SPIT:
move *a8(OZVEL),a9,L
movi ZSPLAT,a10
MON_SPIT_LP:
sleep 1
move *a8(OXVAL),a14,L
move @XSCROLL,a0,L
add a0,a14
move a14,*a8(OXVAL),L ; counteract addition of XSCROLL
move *a8(OYVAL),a14,L
move @YSCROLL,a0,L
sub a0,a14
move a14,*a8(OYVAL),L ; counteract addition of YSCROLL
move *a8(OZVAL),a0,L
move @ZBASE,a14,L
sub a14,a0
add a9,a0
cmp a10,a0 ; compare against target to splat at
jrgt MON_SPIT_LP
*
* hit player
*
movi SPIT_HIT_ANIM,a0
move a0,*a8(AnimFrm),L
move a0,*a8(AnimScr),L
calla PSTOP
calla COLLS_OFF
clr a3
; movi [4,0],a5
MOVE @BASE_HIT,A5,W
ADDI 2800H,A5
SLL 4,A5
calla CK_PLAYER_HIT
MOVIM 1414h,*a8(OCONST),W
calla UNIV_FLASH
sleep 7
movi 500h,a14
move a14,*a8(OYACCEL)
clr a14
move a14,*a8(OPLINK),L
DIE
.endif
.END