revolution-x/GXMONDR2.ASM

4360 lines
108 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 "GXMONDR2.ASM"
.TITLE "<<< REVOLUTION X -- MONDOR THE CARNIVOROUS ROCKER PT.2 >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1993 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "GXENEMY.INC" ;SYSTEM EQUATES
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GXCONTRL.H"
.INCLUDE "GXMONDOR.H"
.INCLUDE "GXSTRING.H"
.INCLUDE "GXS.H"
.INCLUDE "GXAUDN.H"
.INCLUDE "GXMONDR2.TBL"
*
*Symbols to share with the other Mondor module
*
.DEF FRAG_EXPLOSION, FRAG_GUN_FLY, F_CHUNK
.DEF A_JEANS_CHUNK, A_RANDOM_MULTI_CHUNK, A_SHIRT_CHUNK
.DEF FRAG_FINAL_EXPLOSION, FIRE_BALL_INIT, A_SPAWN_PROJECTILE
.DEF GRENADE_INIT, BLOW_PART, PROC_SKY_FLASH, A_DELETE_MONDOR
.DEF A_VELOCITY_WATCH, A_MOVE_AROUND, FRAG_EXPLOSION_SMALL
.DEF TALK_SCRIPTS, FRAG_FINAL_RAIN, INIT_POD_FIRE
.DEF A_SPAWN_BLOOD, A_RAND_SPAWN_BLOOD, SPAWN_BLOOD, MONDOR_PROC
.DEF A_ARM_FIRE_FNC, A_INIT_BLOOD_DROP, PROC_TEMP_ENDING
.DEF A_CHUNK_ONSCREEN, A_CHECK_MISSLE_SCREEN_HIT
.DEF PROJECTILE_ROCKET_COLL, PART_EXPLOSION, F_CHUNK_RAIN
.DEF ANIM_JOSH_MORPH, AXE_INIT, NSPEAR_INIT, F_BLOOD_GLOB
.DEF NSTAR_INIT, MCHUNK_COLL, F_GUN_CHUNK, MONDOR_START_FLAG
.DEF EXPLO_BLOW_INIT
.DEF BUS_EXPLOSION,BUS_EXPLOSION_SMALL, FRAG_EXPLOSION_ONE
* SYMBOLS IN HERE FOR GXHELI.ASM
.DEF LILPLAZ1, LILPLAZ2, LILPLAZ3
.DEF C_FIREBALL, CHECK_SCREEN_HIT, A_FB_COLLS_ON
.DEF SND_FB_HIT_SCRN, SND_FIRE_HISS
***** from GX.ASM
.REF WAVE_END, XSCROLL, WAVE_END_IMM
***** from GXRAM.ASM
.REF IRQSKYE, IRQGNDE, GROUNDCOLOR, SKYCOLOR, WAVETIME
.REF P1DATA, BUYIN_SECS, GUNS_OFF, BONUS_DIRECTION, BASE_HIT
.REF NUM_SPEARS, NUM_NSTARS, LAB_RAT, VIOLENCE_LEVEL
***** from GXAFUNC.ASM
.REF A_INIT_AnimSLP, SetAnim, A_SOUND, A_SOUNDZ, A_TAB_SOUNDZ
.REF A_Set_AnimLoop, A_Anim_DSJ, A_Set_Var_Word, A_Set_Rel_Long
.REF A_Set_Rel_Word_Head, A_PreFrag_Center, A_CREATEP
***** from GXSND.ASM
.REF ONESND_Z, ONESND, SND_BGND1_OFF, SND_BGND2_OFF
***** from GXD.ASM
.REF SETOFFPU, EASYMAKE, XBASE, YBASE, ZBASE, YHALF, OBJ_UNIV_TO_SCRN
.REF SETANIPU, GETHEADPART, GET_SHAD_MULTI, SET_SCRN_POS, YSCROLL
.REF DELETE_OBJ_PROC, SET_SCALE_MANUAL, SET_ANIPU, SET_SCALEM
.REF WORLD_GRNDOFF
***** from GXUTIL.ASM
.REF SLINEVEL_LOAD_3D
***** from GXPLAYER.ASM
.REF CK_PLAYER_HIT, GET_PLAYER_EXTENTS
***** from GXENEMY.ASM
.REF INSERT_ENEMY, CREATE_ENEMY, EGUN_FLASH_MULTI, DELETE_ENEMY
***** from GXPALL.ASM
.REF A_CHANGE_PAL
***** from GXMONDOR.ASM
.REF MONDOR_INIT, NUM_HEAD, MAKE_MONDOR_SCREAM, MONDOR_TOTAL
.REF ANIM_MORPH_FINISH, C_GREEN_STRTANIM
.REF MONDOR_MORPH_FLAG, A_GREEN_IF_NEC
***** from GXDESK.ASM
.REF F_EXPLOSION_OUT,F_EXPLOSION_OUT_2X
***** from GXUNIJAP.ASM
.REF OFFICE_DAMAGE_FLAG
***** from GXMISC.ASM
.REF CYCLE16
***** from GXBLOOD.ASM
.REF P_BLOODGR
*
* More Mondor RAM
*
.BSS MONDOR_START_FLAG,16
.BSS UNUSED_WORD,16
.TEXT
**************************************************************************
* *
* MONDOR_PROC - PROCESS TO CREATE MONDOR *
* *
* PASS: *
* A8 = INITIAL SLEEP BEFORE CREATION *
* A9 = UNIV X *
* A10 = UNIV Y *
* A11 = UNIV Z *
* *
**************************************************************************
MONDOR_PROC
SLEEPR A8
MOVI OID_MONDOR,A0
CALLA GET_ENEMY_COUNT
CMPK 1,A0
JAHS SUCIDE
MOVI MONDOR_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JAZ SUCIDE ;NOTHING CLEAN, RIGHT.
CLR A14
MOVE A14,@MONDOR_TOTAL,W ;Clear the total destruction flag
MOVE A14,@MONDOR_MORPH_FLAG,W ;Clear
MOVE A14,@MONDOR_START_FLAG,W ;Clear the starting flag
MOVKM 1,@OFFICE_DAMAGE_FLAG,W
MMTM SP,A0,A1,A7,A8,A9,A10,A11
MOVI FHEDcc1,A8
MOVI 57,A9
MOVI 63,A10
MOVK 3,A11
MOVI PID_DAMCC,A1
MOVI CYCLE16,A7
CALLA GETPRC
MOVI FHEDcc2,A8
CALLA GETPRC
MOVI FHEDcc3,A8
CALLA GETPRC
MMFM SP,A0,A1,A7,A8,A9,A10,A11
MOVE A9,A1
MOVE A10,A2
MOVE A11,A3
CALLA SET_ANIPU
; MOVI 8000H,A11
; UNIVZ A11
;
; MOVI [-50,200],A1
; CALLA SET_SCRN_POS ;AND PUT THE GUY THERE
;
; MOVIM 80000H,*A8(OYVEL),L ;Blow him up and outta here
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
; CALLA GET_SHAD_MULTI ;Setup his shadow
*
*We will hang here and motor him around
*
MOVE A13,*A8(OPLINK),L
CLRM @BUYIN_SECS,W ;Clear any held over buyin seconds
MOVE @WAVETIME,A14,L
MOVE A14,*A13(PDATA),L ;Save the create time
MOVI NUM_HEAD,A1
CALLA FINDPART
MOVE A0,*A13(PDATA+20H),L ;Save a pointer to the head
MOVK 20,A10 ;Update accelerators every x ticks
MONDOR_WATCH_LOOP
DEC A10
JRGT MONDOR_EVERY_TICK
MOVK 20,A10
MOVE @WAVETIME,A14,L
MOVE *A13(PDATA),A1,L
SUB A14,A1
SRA 3,A1
ADDI 900,A1
CMPI 100,A1
JRGE MWL_FB_PERC_OK
MOVI 100,A1
MWL_FB_PERC_OK
MOVE *A13(PDATA+20H),A0,L
MOVE A1,*A0(OFB_PERC),W
*
*Shit to do every tick. Don't trash A10.
*
MONDOR_EVERY_TICK
MOVE @BUYIN_SECS,A14,W ;Did any buy-ins occur?
JRZ MET_HEAD_0 ;BR = No
CLR A14
MOVB A14,*A8(OPROJ_HIT) ;Clear any remaining hit checkers
MOVE A14,@BUYIN_SECS,W ;Don't need these 'til next time
MOVI NUM_HEAD,A1
CALLA FINDPART
MOVIB TNUM_MORE,*A0(OTALK_FLAG) ;Make him say, "Back for more, eh?"
MET_HEAD_0
MOVE A8,A0
;Stuff for head part only
MOVB *A0(OCLRNOSETZVEL),A14 ;Clear the NOSET_ZVEL flag?
JRZ MET_HEAD_1 ;BR = Not timing currently
DEC A14 ;Down a tick
MOVB A14,*A0(OCLRNOSETZVEL) ;Save it
JRNZ MET_HEAD_1 ;BR = Didn't hit 0 yet
MOVB A14,*A0(ONOSET_ZVEL) ;Clear dat flag
MET_HEAD_1
MOVB *A0(OXBURN),A14 ;Clear the X acceleration?
JRZ MET_HEAD_2 ;BR = Not timing currently
DEC A14 ;Down a tick
MOVB A14,*A0(OXBURN) ;Save it
JRNZ MET_HEAD_2 ;BR = Didn't hit 0 yet
MOVE A14,*A0(OXACCEL),W ;Clear that acceleration
MET_HEAD_2
MOVB *A0(OYBURN),A14 ;Clear the Y acceleration?
JRZ MET_HEAD_3 ;BR = Not timing currently
DEC A14 ;Down a tick
MOVB A14,*A0(OYBURN) ;Save it
JRNZ MET_HEAD_3 ;BR = Didn't hit 0 yet
MOVE A14,*A0(OYACCEL),W ;Clear that acceleration
MET_HEAD_3
MOVB *A0(OZBURN),A14 ;Clear the Z acceleration?
JRZ MET_HEAD_4 ;BR = Not timing currently
DEC A14 ;Down a tick
MOVB A14,*A0(OZBURN) ;Save it
JRNZ MET_HEAD_4 ;BR = Didn't hit 0 yet
MOVE A14,*A0(OZACCEL),W ;Clear that acceleration
MET_HEAD_4
MOVB *A0(OCLRCENTER),A14 ;Clear the Center flag?
JRZ MET_HEAD_5 ;BR = Not timing currently
DEC A14 ;Down a tick
MOVB A14,*A0(OCLRCENTER) ;Save it
JRNZ MET_HEAD_5 ;BR = Didn't hit 0 yet
MOVE A14,*A0(OCENTER_FLAG),W ;Clear that flag
MET_HEAD_5
MOVE *A0(OTALK_WAIT),A14,W ;Are we waiting to talk again?
JRZ MET_HEAD_6 ;BR = No
DEC A14 ;Decrement the wait timer
MOVE A14,*A0(OTALK_WAIT),W
MET_HEAD_6
MOVB *A0(OCLRFDAM),A14 ;Clear the FDAM_GOING flag?
JRZ MET_HEAD_7 ;BR = Not timing currently
DEC A14 ;Down a tick
MOVB A14,*A0(OCLRFDAM) ;Save it
JRNZ MET_HEAD_7 ;BR = Didn't hit 0 yet
MOVB A14,*A0(OFDAM_GOING) ;Clear that flag
MET_HEAD_7
MOVB *A0(OPROJ_CK_TIME),A14 ;Check for a projectile hit?
JRZ MET_HEAD_7a ;BR = Not timing currently
DEC A14 ;Down one
MOVB A14,*A0(OPROJ_CK_TIME) ;Save it
JRNZ MET_HEAD_8 ;BR = Not time to check yet
MOVB *A0(OPROJ_HIT),A14 ;Did any projectiles score a hit?
JRZ MET_HEAD_8 ;BR = No
PUSH A0
MOVI NUM_HEAD,A1
CALLA FINDPART
MOVE A0,A6
MOVK NUM_TAUNTS,A0 ;Do a little taunting
CALLA RAND0
SLL 3,A0
ADDI TAUNT_TABLE,A0
MOVB *A0,A0
MOVB A0,*A6(OTALK_FLAG)
PULLQ A0
CLR A14
MET_HEAD_7a
MOVB A14,*A0(OPROJ_HIT)
MET_HEAD_8
MOVE *A0(OARM_WAIT),A14,W ;Are we waiting to do another arm action?
JRZ MET_HEAD_9 ;BR = No
DEC A14 ;Decrement the wait timer
MOVE A14,*A0(OARM_WAIT),W
MET_HEAD_9
MOVB *A0(OARMS_GONE),A14
CMPK 2,A14 ;Are both his arms missing?
JRLO MET_HEAD_10 ;BR = No
INCM *A0(ONOARM_TIME),W
MET_HEAD_10
;Check all parts for un-tick
MET_ALL_PARTS
MOVK NUM_MONDOR_PARTS,A6 ;Double check number 'cause of gun flashes
CLR A5 ;Offscreen counter
MET_TICK_LOOP
MOVB *A0(OFLASHTIME),A14 ;Is this part flashing?
JRZ MET_FLASH_NEXT ;BR = No
DEC A14 ;Decrement the flash time
MOVB A14,*A0(OFLASHTIME) ;Stuff it back for future
JRNZ MET_FLASH_NEXT ;BR = Not time to unflash
MOVB A14,*A0(O_BEING_DAMAGED) ;No longer being damaged
CALLA OBJWNZ ;Unflash
MET_FLASH_NEXT
MOVB *A0(OCLRROCKETHIT),A14 ;Do we need to clear this part?
JRZ MET_ROCKHIT_NEXT ;BR = No
DEC A14 ;Decrement the clear time
MOVB A14,*A0(OCLRROCKETHIT) ;Stuff it back for future
JRNZ MET_ROCKHIT_NEXT ;BR = Not time to clear
MOVB A14,*A0(OROCKETHIT) ;No longer being hit by a rocket
MET_ROCKHIT_NEXT
MOVB *A0(OFLAGS),A14
JRNN MET_OFFSCREEN_NEXT
INC A5 ;Click another part offscreen
MET_OFFSCREEN_NEXT
MOVE *A0(OPARTS),A0,L ;Get the next part
JRZ MET_SLEEP ;BR = We've lost parts somehow?
DSJ A6,MET_TICK_LOOP
MET_SLEEP
CLR A4 ;Assume onscreen
CMPK NUM_MONDOR_PARTS,A5 ;Are all of the parts offscreen?
JRLO MET_SOME_ONSCREEN ;BR = No
MOVE *A8(OFFSCRN_TIME),A4,W
INC A4 ;Click another tick offscreen
MET_SOME_ONSCREEN
MOVE A4,*A8(OFFSCRN_TIME),W
SLOOP 1,MONDOR_WATCH_LOOP ;Here we wait for shit to happen
NUM_TAUNTS .EQU 3
TAUNT_TABLE
.BYTE TNUM_TAKE, TNUM_BOOM, TNUM_LAUGH
.EVEN
SND_SWEET_EMOTION
.WORD 0F0FDH,1,0801FH,0 ;Sweet emotion direct start
**************************************************************************
* *
* PROC_TEMP_ENDING *
* *
* Temporary ending for Mondor *
* *
**************************************************************************
PROC_TEMP_ENDING
SLEEP 350 ;Wait for the end of the rain
SOUND1 SND_SWEET_EMOTION
AUDIT AUDJAEND
MOVKM 3,@BONUS_DIRECTION,W
JAUC WAVE_END_IMM
DIE
**************************************************************************
* *
* A_DELETE_MONDOR *
* *
* Anim Func to delete the whole Mondor multi-parter, *
* no matter what part is calling. *
* *
* A8 = Ptr to any part *
* *
**************************************************************************
A_DELETE_MONDOR
CALLA GET_HEAD_PART
SOUND1 SND_BGND1_OFF ;Kill the thruster sounds
SOUND1 SND_BGND2_OFF
JAUC DELETE_ENEMY ;Now rid yourself of Mondor
**************************************************************************
* *
* A_DELETE_MULTI *
* *
* Anim Func to delete the whole multi-parter, no matter what *
* part is calling. *
* *
* A8 = Ptr to any part *
* *
**************************************************************************
A_DELETE_MULTI
CALLA GET_HEAD_PART
JAUC DELETE_OBJ
**************************************************************************
* *
* A_HEAD_OBJOFF *
* *
* Anim Func to turn just the head object of a multi-parter off. *
* *
* A8 = Ptr to any part *
* *
**************************************************************************
A_HEAD_OBJOFF
CALLA GET_HEAD_PART
JAUC OBJ_OFF
**************************************************************************
* *
* A_VELOCITY_WATCH *
* *
* Anim Func to watch the Mondor craft accelerations and *
* do boundry checks. *
* *
* A8 = Ptr to any Mondor part. *
* *
**************************************************************************
A_VELOCITY_WATCH
CALLA GET_HEAD_PART ;First things first
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A0,A1,A3 ;LOAD A3:OXPOS, A1:OYPOS, A0:OZPOS
MOVI XBASE,A14
MMFM A14,A2,A4,A5 ;LOAD A5:XBASE, A4:YBASE, A2:ZBASE
sub A5,A3 ;Universe to World X
add A4,A1 ;Universe to World Y
sub A2,A0 ;Universe to World Z
MOVE A8,A14
ADDI OZVEL,A14
MMFM A14,A4,A5,A6 ;LOAD A6:OZVEL, A5:OXVEL, A4:OYVEL
CLR A2 ;Use this to clear whatever we need to clear
*Do Z boundry check
MOVB *A8(OCENTER_FLAG),A14 ;Time to center?
JRNZ AVW_STOP_AT_CENTER
CMPI MONDOR_ZMAX,A0 ;Did we go too far back?
JRGE AVW_HIT_ZMAX ;BR = Yes
CMPI MONDOR_ZMIN,A0 ;Did we come too far forward?
JRGT AVW_NO_Z_VIOLATION ;BR = No, no violations in Z
AVW_HIT_ZMIN
MOVE *A8(OZACCEL),A7,W
; JRGE AVW_HZMIN_1
JREQ AVW_HZMIN_1
JRGT AVW_ADD_Z
CLR A7
MOVE A2,*A8(OZACCEL),W
AVW_HZMIN_1
MOVE A6,A6
JRGE AVW_ADD_Z
; MOVE A2,*A8(OZVEL),L
SRA SLED_ZBRAKE_SRA,A6
JRZ AVW_CLEARZ
ABS A6
MOVI SLED_ZBRAKE,A7
MOVE A7,*A8(OZACCEL),W
MOVB A6,*A8(OZBURN)
JRUC AVW_ADD_Z
AVW_HIT_ZMAX
MOVE *A8(OZACCEL),A7,W
; JRLE AVW_HZMAX_1
JREQ AVW_HZMAX_1
JRLT AVW_ADD_Z
CLR A7
MOVE A2,*A8(OZACCEL),W
AVW_HZMAX_1
MOVE A6,A6
JRLE AVW_ADD_Z
; MOVE A2,*A8(OZVEL),L
SRA SLED_ZBRAKE_SRA,A6
JRZ AVW_CLEARZ
ABS A6
MOVI -SLED_ZBRAKE,A7
MOVE A7,*A8(OZACCEL),W
MOVB A6,*A8(OZBURN)
JRUC AVW_ADD_Z
AVW_CLEARZ
MOVE A2,*A8(OZVEL),L
JRUC AVW_ADD_Z
AVW_NO_Z_VIOLATION
MOVE *A8(OZACCEL),A7,W
AVW_ADD_Z
ADDRM A7,*A8(OZVEL),L
*Do X boundry check
SRA 16,A3 ;Easier to do the integer
CMPI MONDOR_XMAX,A3 ;Did we go too far to the right?
JRGE AVW_HIT_XMAX ;BR = Yes
CMPI MONDOR_XMIN,A3 ;Did we go too far to the left?
JRGT AVW_NO_X_VIOLATION ;BR = No, no violations in X
AVW_HIT_XMIN
MOVE *A8(OXACCEL),A7,W
; JRGE AVW_HXMIN_1
JREQ AVW_HXMIN_1
JRGT AVW_ADD_X
CLR A7
MOVE A2,*A8(OXACCEL),W
AVW_HXMIN_1
MOVE A5,A5
JRGE AVW_ADD_X
; MOVE A2,*A8(OXVEL),L
SRA SLED_XYBRAKE_SRA,A5
JRZ AVW_CLEARX
ABS A5
MOVI SLED_XYBRAKE,A7
MOVE A7,*A8(OXACCEL),W
MOVB A5,*A8(OXBURN)
JRUC AVW_ADD_X
AVW_HIT_XMAX
MOVE *A8(OXACCEL),A7,W
; JRLE AVW_HXMAX_1
JREQ AVW_HXMAX_1
JRLT AVW_ADD_X
CLR A7
MOVE A2,*A8(OXACCEL),W
AVW_HXMAX_1
MOVE A5,A5
JRLE AVW_ADD_X
; MOVE A2,*A8(OXVEL),L
SRA SLED_XYBRAKE_SRA,A5
JRZ AVW_CLEARX
ABS A5
MOVI -SLED_XYBRAKE,A7
MOVE A7,*A8(OXACCEL),W
MOVB A5,*A8(OXBURN)
JRUC AVW_ADD_X
AVW_CLEARX
MOVE A2,*A8(OXVEL),L
JRUC AVW_ADD_X
AVW_NO_X_VIOLATION
MOVE *A8(OXACCEL),A7,W
AVW_ADD_X
ADDRM A7,*A8(OXVEL),L
*Do Y boundry check
SRA 16,A1
CMPI MONDOR_YMAX,A1 ;Did we go too far down?
JRGE AVW_HIT_YMAX ;BR = Yes
CMPI MONDOR_YMIN,A1 ;Did we go too far up?
JRGT AVW_DONE ;BR = No, no violations in Y
MOVE *A8(OYACCEL),A7,W
; JRGE AVW_HYMIN_1
JREQ AVW_HYMIN_1
JRGT AVW_DONE
MOVE A2,*A8(OYACCEL),W
AVW_HYMIN_1
MOVE A4,A4
JRGE AVW_DONE
JRUC AVW_YREFLECT
; MOVE A2,*A8(OYVEL),L
SRA SLED_XYBRAKE_SRA,A4
JRZ AVW_CLEARY
ABS A4
INC A4
MOVIM SLED_XYBRAKE,*A8(OYACCEL),W
MOVB A4,*A8(OYBURN)
JRUC AVW_DONE
AVW_HIT_YMAX
MOVE *A8(OYACCEL),A7,W
; JRLE AVW_HYMAX_1
JREQ AVW_HYMAX_1
JRLT AVW_DONE
MOVE A2,*A8(OYACCEL),W
AVW_HYMAX_1
MOVE A4,A4
JRLE AVW_DONE
AVW_YREFLECT
NEG A4
SRA 1,A4
MOVE A4,*A8(OYVEL),L
JRUC AVW_DONE
AVW_CLEARY
MOVE A2,*A8(OYVEL),L
AVW_DONE
AVW_X
RETS
*
*Come here when you want a no nonsense stop at the center of
*the screen.
*A2 = 0 for clearing
*
AVW_STOP_AT_CENTER
*Do Z boundry check
CMPI MONDOR_ZMAX_C,A0 ;Did we go too far back?
JRGE AVW_SC_HIT_ZMAX ;BR = Yes
CMPI MONDOR_ZMIN_C,A0 ;Did we come too far forward?
JRGT AVW_SC_NO_Z_VIOLATION ;BR = No, no violations in Z
*Object is less than Z boundry
AVW_SC_HIT_ZMIN
MOVE *A8(OZVEL),A7,L ;Are we moving towards the boundry?
JRGE AVW_SC_NO_Z_VIOLATION ;BR = Yes, so let it go
JRUC AVW_SC_CLEARZ
AVW_SC_HIT_ZMAX
MOVE *A8(OZVEL),A7,L
JRLE AVW_SC_NO_Z_VIOLATION
AVW_SC_CLEARZ
MOVE A2,*A8(OZVEL),L
AVW_SC_NO_Z_VIOLATION
*Do X boundry check
SRA 16,A3 ;Easier to do the integer
CMPI MONDOR_XMAX_C,A3 ;Did we go too far to the right?
JRGE AVW_SC_HIT_XMAX ;BR = Yes
CMPI MONDOR_XMIN_C,A3 ;Did we go too far to the left?
JRGT AVW_SC_NO_X_VIOLATION ;BR = No, no violations in X
*Object is less than X boundry
MOVE *A8(OXVEL),A7,L ;Are we moving towards the boundry
JRGE AVW_SC_NO_X_VIOLATION ;BR = Yes, so let it get there
JRUC AVW_SC_CLEARX ;Otherwise, stop it
*Object is greater than X boundry
AVW_SC_HIT_XMAX
MOVE *A8(OXVEL),A7,L ;Are we moving towards the boundry
JRLE AVW_SC_NO_X_VIOLATION ;BR = Yes, so let it get there
AVW_SC_CLEARX
MOVE A2,*A8(OXVEL),L
AVW_SC_NO_X_VIOLATION
*Do Y boundry check
SRA 16,A1
CMPI MONDOR_YMAX_C,A1 ;Did we go too far down?
JRGE AVW_SC_HIT_YMAX ;BR = Yes
CMPI MONDOR_YMIN_C,A1 ;Did we go too far up?
JRGT AVW_SC_NO_Y_VIOLATION ;BR = No, no violations in Y
*Object is less than Y boundry
MOVE *A8(OYVEL),A7,L ;Are we moving towards the boundry
JRGE AVW_SC_NO_Y_VIOLATION ;BR = Yes, so let it get there
JRUC AVW_SC_CLEARY ;Otherwise, stop it
*Object is greater than Y boundry
AVW_SC_HIT_YMAX
MOVE *A8(OYVEL),A7,L ;Are we moving towards the boundry
JRLE AVW_SC_NO_Y_VIOLATION ;BR = Yes, so let it get there
AVW_SC_CLEARY
MOVE A2,*A8(OYVEL),L
AVW_SC_NO_Y_VIOLATION
RETS
**************************************************************************
* *
* A_MOVE_AROUND *
* *
* Anim Func to deal with movin' this crate around. *
* *
**************************************************************************
A_MOVE_AROUND
; RETS
CALLA GET_HEAD_PART ;Velocity only works on the head
; MOVB *A8(OCENTER_FLAG),A14 ;Time to center?
; MOVE A14,B1
; JRNZ AMA_NEXT_MOVE
MOVE *A8(OFFSCRN_TIME),A14,W
CMPI 60,A14 ;Has he been offscreen awhile?
JRLT AMA_ONSCREEN ;BR = No
*Mondor is way offscreen, time to scare the player
MOVB *A8(OFDAM_GOING),A14 ;Is major damage going?
JRNE AMA_ONSCREEN ;BR = Yes, no scaring
MOVK 1,A3 ;Scream direction
MOVI SND_KAMIKAZE,A4 ;Scream sound
MOVI 75,A5 ;Scream duration
MOVK 1,A6 ;Scream severity
CALLA MAKE_MONDOR_SCREAM ;Kamikaze
MOVE @ZBASE,A3,L
MOVI 200,A1
STOUY A3,A1
MOVE A1,A2
MOVE @XBASE,A1,L
; MOVE @YBASE,A2,L
; MOVE @WORLD_GRNDOFF,A14,L
; SUB A14,A2
CALLA SET_ANIPU
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A4,A5,A6 ;LOAD A6:OXPOS, A5:OYPOS, A4:OZPOS
MOVI XBASE,A14
MMFM A14,A1,A2,A3 ;LOAD A3:XBASE, A2:YBASE, A1:ZBASE
SUB A3,A6 ;Universe to World X
ADD A2,A5 ;Universe to World Y
SUB A1,A4 ;Universe to World Z
MOVI 10000H,A11
CLR A9
CLR A7
MOVI 80,A10
MOVIM -720,*A8(OFFSCRN_TIME),W ;This gives us time to get back
JRUC AMA_THRUST
AMA_ONSCREEN
MOVB *A8(OMOVE_TIMER),A14
JRZ AMA_NEXT_MOVE
DEC A14
MOVB A14,*A8(OMOVE_TIMER)
JRNZ AMA_X
AMA_NEXT_MOVE
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A4,A5,A6 ;LOAD A6:OXPOS, A5:OYPOS, A4:OZPOS
MOVI XBASE,A14
MMFM A14,A1,A2,A3 ;LOAD A3:XBASE, A2:YBASE, A1:ZBASE
SUB A3,A6 ;Universe to World X
ADD A2,A5 ;Universe to World Y
SUB A1,A4 ;Universe to World Z
CLR B0 ;This is the emergency register for Z vel
MOVB *A8(OCENTER_FLAG),A14 ;Time to center?
JRNZ AMA_CENTER_NOW ;BR = Yes
CMPI MONDOR_ZMAX-100H,A4 ;Did he get put waydafucbac?
JRLT AMA_NO_EMERGENCY_Z ;BR = No, then don't call 911
MOVB *A8(OSPITTING_FIRE),A14
JRNZ AMA_NO_EMERGENCY_Z
MOVB *A8(OTHROWING_BOMB),A14
JRNZ AMA_NO_EMERGENCY_Z
MOVKB 1,*A8(OSHAKE_FIST)
INC B0 ;Sound the alarm
MOVI 8000h,A0 ;Get Mondor up front now!
MOVI 6000H,A1
CALLA RANGERND
MOVE A0,A11
JRUC AMA_SELECT_X
AMA_NO_EMERGENCY_Z
CLRB *A8(OSHAKE_FIST)
CMPI MONDOR_ZMIN,A4
JRGT AMA_FULL_Z
AMA_BACK_UP_Z
MOVI MONDOR_ZMIN+4000H,A1
JRUC AMA_RAND_Z
AMA_FULL_Z
MOVI MONDOR_ZMIN,A1
AMA_RAND_Z
MOVI 10000h,A0
CALLA RANGERND
MOVE A0,A11 ;Random Z
AMA_SELECT_X
MOVB *A8(OARMS_GONE),A14
CMPK 2,A14 ;Are both his arms missing?
JRLO AMA_FULL_X ;BR = No, do normal targeting
MOVI 40,A0
MOVK 10,A1
CALLA RANGERND ;Random Duration, end of battle
MOVE A0,A10
AMA_FULL_X
*First select duration. This is during normal operation
MOVI 120,A0
MOVK 20,A1
CALLA RANGERND ;Random Duration
MOVE A0,A10
MOVI MONDOR_XMAX,A0
MOVI MONDOR_XMIN,A1
AMA_DO_RAND_X
CALLA RANGERND
MOVE A0,A9 ;Random X
SLL 16,A9
MOVI MONDOR_YMAX,A0
MOVI MONDOR_YMIN,A1
CALLA RANGERND
MOVE A0,A7 ;Random Y
SLL 16,A7
*
*World target points selected, now get us there
*A4 = World Z, A5 = World Y, A6 = World X
*A11 = Target world Z, A9 = Target world X, A7 = Target world Y
*A10 = Duration
*
AMA_THRUST
MOVE B0,B0
JRNZ AMA_SETZ
MOVB *A8(ONOSET_ZVEL),A14 ;Can I set the ZVEL?
JRNZ AMA_SKIPZ ;BR = No
AMA_SETZ
SUB A4,A11 ;Get the Z distance
DIVS A10,A11 ;Dis'll give us the Z velocity
MOVI SLED_ZACCEL,A4
SRA SLED_ZACCEL_SRA,A11
JRNN AMA_ZPLUS
NEG A4
JRUC AMA_STUFFZ
AMA_ZPLUS
JRZ AMA_SKIPZ
AMA_STUFFZ
ABS A11
MOVB A11,*A8(OZBURN)
MOVE A4,*A8(OZACCEL),W
AMA_SKIPZ
SUB A6,A9 ;Get the X distance
DIVS A10,A9 ;Dis'll give us the X velocity
MOVI SLED_XYACCEL,A4
SRA SLED_XYACCEL_SRA,A9
JRNN AMA_XPLUS
NEG A4
JRUC AMA_STUFFX
AMA_XPLUS
JRZ AMA_SKIPX
AMA_STUFFX
ABS A9
MOVB A9,*A8(OXBURN)
MOVE A4,*A8(OXACCEL),W
AMA_SKIPX
SUB A5,A7 ;Get the Y distance
DIVS A10,A7 ;Dis'll give us the Y velocity
MOVI SLED_XYACCEL,A4
SRA SLED_XYACCEL_SRA,A7
JRNN AMA_YPLUS
NEG A4
JRUC AMA_STUFFY
AMA_YPLUS
JRZ AMA_SKIPY
AMA_STUFFY
ABS A7
MOVB A7,*A8(OYBURN)
MOVE A4,*A8(OYACCEL),W
AMA_SKIPY
MOVE A10,A0
MOVK 10,A1
CALLA RANGERND ;Random Duration
MOVB A0,*A8(OMOVE_TIMER) ;Set the duration
AMA_X
RETS
*
*Come here when you want to get to the center right away.
*No accelerations are used, just straight velocity
*
AMA_CENTER_NOW
MOVI 0A000H,A11
CLR A9
MOVI MONDOR_YMAX,A0
MOVI MONDOR_YMIN,A1
CALLA RANGERND
MOVE A0,A7 ;Random Y
SLL 16,A7
MOVI 10,A10
SUB A4,A11 ;Get the Z distance
DIVS A10,A11 ;Dis'll give us the Z velocity
MOVE A11,*A8(OZVEL),L
SUB A6,A9 ;Get the X distance
DIVS A10,A9 ;Dis'll give us the X velocity
MOVE A9,*A8(OXVEL),L
SUB A5,A7 ;Get the Y distance
DIVS A10,A7 ;Dis'll give us the Y velocity
MOVE A7,*A8(OYVEL),L
MOVB A10,*A8(OMOVE_TIMER) ;Set the duration
CLR A14
MOVE A14,*A8(OXACCEL),W
MOVE A14,*A8(OYACCEL),W
MOVE A14,*A8(OZACCEL),W
RETS
**************************************************************************
* *
* A_ARM_FIRE_FNC *
* *
* Anim Func for arm part firing on the player(s). *
* *
* A8 = Ptr to arm part doing the firing. *
* AARG+,L = [Y,X] firing offset for barrel #1 *
* AARG+,L = [Y,X] firing offset for barrel #2 *
* *
**************************************************************************
A_ARM_FIRE_FNC
MOVB *A8(O_BEING_DAMAGED),A14 ;Object being damaged?
JRN AFF_X ;BR = Yes
CALLA GETAFARG_LONG ;Get the firing offset for barrel 1
MOVB *A8(OBARREL),A14
JRZ AAFF_BARREL1
CALLA GETAFARG_LONG ;Get firing offset for barrel 2
CLR A14
JRUC AAFF_FLASH_IT
AAFF_BARREL1
MOVK 1,A14
AAFF_FLASH_IT
MOVB A14,*A8(OBARREL)
MOVE A0,A3
CALLA EGUN_FLASH_MULTI ;Make a gun flash
INCB *A8(OSHOTS_TAKEN)
; MOVI [2,0],A5
MOVE @BASE_HIT,A5,W
ADDI 800H,A5
SLL 4,A5
CALLA CK_PLAYER_HIT
JRNZ AFF_HIT ;BR = Successful hit on Player(s)
JRNC AFF_NOHIT ;BR = No hit, but he was visible
JRUC AFF_NOHIT_NO_SOUND ;He did'nt hit because he was not visible
AFF_HIT
CLRB *A8(OMISSES)
SOUNDZ SND_MONDOR_GUN
JRUC AFF_X
AFF_NOHIT
SOUNDZ SND_MONDOR_GUN
AFF_NOHIT_NO_SOUND
INCB *A8(OMISSES)
AFF_X
RETS
**************************************************************************
* *
* A_RANDOM_MULTI_CHUNK *
* *
* Anim Func to call a fragger script for chunks randomly *
* pick from MULTI_CHUNK_TAB. *
* *
* A8 = Ptr to object creating chunks *
* *
**************************************************************************
A_RANDOM_MULTI_CHUNK
MOVK 4,A0
CALLA RAND0
SLL 5,A0
ADDI MULTI_CHUNK_TAB,A0
MOVE *A0,A0,L
MOVE A0,B14
MOVI [2,0],A0
MOVI 400H,A3
MOVI [5,5],A4
CALLA PreFrag_Box
JAUC Fragger
**************************************************************************
* *
* A_SHIRT_CHUNK *
* *
* Anim Func to call a fragger script for shirt chunks. *
* *
* A8 = Ptr to object creating chunks *
* *
**************************************************************************
A_SHIRT_CHUNK
MOVI MONDOR_SHIRT_MULTI,B14
MOVI [2,0],A0
MOVI 400H,A3
MOVI [5,5],A4
CALLA PreFrag_Box
JAUC Fragger
**************************************************************************
* *
* A_JEANS_CHUNK *
* *
* Anim Func to call a fragger script for jeans chunks. *
* *
* A8 = Ptr to object creating chunks *
* *
**************************************************************************
A_JEANS_CHUNK
MOVI MONDOR_JEANS_MULTI,B14
MOVI [2,0],A0
MOVI 400H,A3
MOVI [5,5],A4
CALLA PreFrag_Box
JAUC Fragger
**************************************************************************
* *
* A_RAND_SPAWN_BLOOD *
* *
* Same as A_SPAWN_BLOOD except there's a 50/50 chance of *
* not getting blood. *
* *
**************************************************************************
A_RAND_SPAWN_BLOOD
MOVI 512,A0
CALLA RANDPER
JRNC ASB_X ;BR = Even, no blood
**************************************************************************
* *
* A_SPAWN_BLOOD *
* *
* Anim Func to spawn some blood. Makes blood part of the *
* multi-parter. *
* *
* AARG+,L = Init table to create. *
* AARG+,L = [Y,X] offset *
* *
**************************************************************************
A_SPAWN_BLOOD
CALLA GETAFARG_LONG
MOVE A0,A5
CALLA GETAFARG_LONG
MOVE A0,A3
*
*Entrypoint: You provide the init table and the offsets.
*A3 = [Y,X] Offset
*A5 = Init table
*Note: trashes much register
*
SPAWN_BLOOD
CALLA CREATE_OBJ
JRZ ASB_X ;No objects available
MOVE *A8(OCTRL),A7,W ;ADJUST OFFSET IF NECESSARY
BTST B_FLIPH,A7
JRZ ASB_CHECKV
NEGX A3
ASB_CHECKV
BTST B_FLIPV,A7
JRZ ASB_NOV ;BR=NO FLIP ADJUSTMENT
NEGY A3
ASB_NOV
MOVE *A8(OPARTSXY),A14,L ;Grab the masters OPARTSXY
ADDXY A14,A3
MOVE A3,*A0(OPARTSXY),L
MOVE *A8(OZVAL),A3,L
MOVB *A8(OZOFF),A5
SUB A5,A3 ;This calculation will make the
MOVB *A0(OZOFF),A14 ;OZOFF for the gun flash relative
ADD A5,A14 ;to the base ZVAL of the multi-parter.
MOVB A14,*A0(OZOFF)
MOVE *A8(OCTRL),A5,W
ANDI M_FLIPH,A5 ;ISOLATE FLIP BITS ONLY
MOVE *A0(OCTRL),A14,W
OR A5,A14 ;Match flip to spawing object
MOVE A14,*A0(OCTRL),W
CALLA GET_HEAD_PART ;Use the head part as a good source
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
CALLA SETOFFPU
CALLA INSPART
CALLA INSOBJ
ASB_X
RETS
**************************************************************************
* *
* BLOW_PART *
* *
* Anim func entrypoint to blow a part of the enemy. *
* *
* A1 = MIN XVEL *
* A2 = MAX XVEL *
* A3 = MIN YVEL *
* A4 = MAX YVEL *
* B0 = Init table *
* *
* Note: trashes much register *
* *
**************************************************************************
BLOW_PART
MOVI 900,A0
CALLA RANDPER
JRC BP_DO_WHAT_I_TOLD_YOU
MOVI EXPLO_BLOW_INIT,B0 ;Substitute this thang
BP_DO_WHAT_I_TOLD_YOU
MOVE A1,A5
CALLA EASYMAKE
JRZ BP_X ;No objects available
MOVE A5,A1
MOVE *A8(OCTRL),A5,W
ANDI M_FLIPH|M_FLIPV,A5 ;ISOLATE FLIP BITS ONLY
MOVE *A0(OCTRL),A14,W
OR A14,A5 ;Match flip to spawing object
MOVE A5,*A0(OCTRL),W
MOVE A0,A6
MOVE A2,A0
CALLA RANGERND
BTST B_FLIPH,A5
JRNZ BP_X_POS
NEG A0
BP_X_POS
MOVE A0,*A6(OXVEL),L
MOVE A4,A0
MOVE A3,A1
CALLA RANGERND
MOVE A0,*A6(OYVEL),L
MOVE A6,A0
CALLA GET_HEAD_PART ;Use the head part as a good source
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
MOVE *A8(OZVAL),A3,L
CALLA SETANIPU
CALLA INSOBJ
BP_X
RETS
**************************************************************************
* *
* PROC_SKY_FLASH *
* *
* Process to flash the sky and ground white, then restore. *
* *
**************************************************************************
PROC_SKY_FLASH
SLEEP 3
MOVIM 07FFFH,@IRQSKYE,W
MOVIM 07FFFH,@IRQGNDE,W
SLEEP 2
MOVE @SKYCOLOR,@IRQSKYE,W
MOVE @GROUNDCOLOR,@IRQGNDE,W
SLEEP 2
MOVIM 07FFFH,@IRQSKYE,W
MOVIM 07FFFH,@IRQGNDE,W
SLEEP 2
MOVE @SKYCOLOR,@IRQSKYE,W
MOVE @GROUNDCOLOR,@IRQGNDE,W
SLEEP 2
MOVIM 07FFFH,@IRQSKYE,W
MOVIM 07FFFH,@IRQGNDE,W
SLEEP 2
MOVE @SKYCOLOR,@IRQSKYE,W
MOVE @GROUNDCOLOR,@IRQGNDE,W
DIE
**************************************************************************
* *
* PROC_SKY_FLASH_ONCE *
* *
* Process to flash the sky and ground white, then restore. *
* *
**************************************************************************
PROC_SKY_FLASH_ONCE
MOVIM 07FFFH,@IRQSKYE,W
MOVIM 07FFFH,@IRQGNDE,W
SLEEP 2
MOVE @SKYCOLOR,@IRQSKYE,W
MOVE @GROUNDCOLOR,@IRQGNDE,W
DIE
**************************************************************************
* *
* FB_GUNVECT *
* *
* Gun vector for Mondor's fire ball. *
* *
* A2 = Ptr to player shooting the fire ball. *
* A8 = Ptr to the fire ball object. *
* *
**************************************************************************
FB_GUNVECT
CALLA COLLS_OFF
MOVIM -8,*A8(OYVEL+16),L
MOVIM 800H,*A8(OZVEL),L
SOUNDZ SND_PROJECTILE_FLY
MOVI 250,A1
CALLA SCORE ;Score points for neutralizing
MOVI ANIM_FB_FLYAWAY,A1
JAUC SetAnim
**************************************************************************
* *
* GREN_GUNVECT *
* *
* Gun vector for Mondor's Grenade. *
* *
* A2 = Ptr to player shooting the Grenade. *
* A8 = Ptr to the Grenade object. *
* *
**************************************************************************
GREN_GUNVECT
CALLA COLLS_OFF
CALLA CLR_VEL
MOVI ANIM_GREN_EXPLODE,A1
CALLA SetAnim
SOUNDZ SND_GREN_EXPLODE
MOVI 100,A1
JAUC SCORE ;Score points for neutralizing
**************************************************************************
* *
* AXE_GUNVECT *
* *
* Gun vector for Berzerker's axe. *
* *
* A2 = Ptr to player shooting the axe. *
* A8 = Ptr to the axe object. *
* *
**************************************************************************
AXE_GUNVECT
CALLA COLLS_OFF
MOVIM -8,*A8(OYVEL+16),L
MOVIM 800H,*A8(OZVEL),L
SOUNDZ SND_AXE_FLY
MOVI 250,A1
CALLA SCORE ;Score points for neutralizing
MOVI ANIM_AXE_FLYAWAY,A1
JAUC SetAnim
**************************************************************************
* *
* SPEAR_GUNVECT *
* *
* Gun vector for Native's spear. *
* *
* A2 = Ptr to player shooting the spear. *
* A8 = Ptr to the spear object. *
* *
**************************************************************************
SPEAR_GUNVECT
CALLA COLLS_OFF
MOVIM -8,*A8(OYVEL+16),L
MOVIM 800H,*A8(OZVEL),L
SOUNDZ SND_SPEAR_FLY
MOVI 250,A1
CALLA SCORE ;Score points for neutralizing
DECM @NUM_SPEARS,W
MOVI ANIM_SPEAR_FLYAWAY,A1
JAUC SetAnim
**************************************************************************
* *
* NSTAR_GUNVECT *
* *
* Gun vector for Ninja's star. *
* *
* A2 = Ptr to player shooting the star. *
* A8 = Ptr to the star object. *
* *
**************************************************************************
NSTAR_GUNVECT
CALLA COLLS_OFF
MOVIM -8,*A8(OYVEL+16),L
MOVIM 800H,*A8(OZVEL),L
SOUNDZ SND_AXE_FLY
MOVI 250,A1
CALLA SCORE ;Score points for neutralizing
DECM @NUM_NSTARS,W
MOVI ANIM_NSTAR_FLYAWAY,A1
JAUC SetAnim
**************************************************************************
* *
* FB_CVECT *
* *
* Collision vector table for the FireBall *
* *
**************************************************************************
FB_CVECT
WWL OID_PROCKET,~MASK_PLAYER,PROJECTILE_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,FB_EXPLOSION_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* PROJECTILE_ROCKET_COLL - Collision vector with Player rocket bomb. *
* A0 = Ptr to rocket object *
* A8 = Ptr to projectile object *
* *
**************************************************************************
PROJECTILE_ROCKET_COLL
MOVE *A0(RL_INTENDED_OBJ),A14,L
CMP A14,A8 ;Is this the object we are after?
JRNE PRC_X ;BR = No
MOVK 1,A14
MOVB A14,*A8(OCHEWEDROCKET) ;Flag for the explosion
PRC_X
RETS
**************************************************************************
* *
* FB_EXPLOSION_COLL *
* *
* Explosion service for FireBall *
* *
* A0 = ptr to explosion object *
* A8 = ptr to FireBall object *
* *
**************************************************************************
FB_EXPLOSION_COLL
MOVB *A8(OCHEWEDROCKET),A14 ;Did he really take a rocket?
JRZ FEC_X ;BR = No, so bail
MOVE *A0(OID),A0,W ;We can find out who did this
CALLA POID_TO_PDATA ;by getting the Player's data area.
JRUC FB_GUNVECT
FEC_X
RETS
**************************************************************************
* *
* AXE_CVECT *
* *
* Collision vector table for the axe *
* *
**************************************************************************
AXE_CVECT
WWL OID_PROCKET,~MASK_PLAYER,PROJECTILE_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,AXE_EXPLOSION_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* AXE_EXPLOSION_COLL *
* *
* Explosion service for axe *
* *
* A0 = ptr to explosion object *
* A8 = ptr to axe object *
* *
**************************************************************************
AXE_EXPLOSION_COLL
MOVB *A8(OCHEWEDROCKET),A14 ;Did he really take a rocket?
JRZ AEC_X ;BR = No, so bail
MOVE *A0(OID),A0,W ;We can find out who did this
CALLA POID_TO_PDATA ;by getting the Player's data area.
JRUC AXE_GUNVECT
AEC_X
RETS
**************************************************************************
* *
* SPEAR_CVECT *
* *
* Collision vector table for the spear *
* *
**************************************************************************
SPEAR_CVECT
WWL OID_PROCKET,~MASK_PLAYER,PROJECTILE_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,SPEAR_EXPLOSION_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* SPEAR_EXPLOSION_COLL *
* *
* Explosion service for spear *
* *
* A0 = ptr to explosion object *
* A8 = ptr to spear object *
* *
**************************************************************************
SPEAR_EXPLOSION_COLL
MOVB *A8(OCHEWEDROCKET),A14 ;Did he really take a rocket?
JRZ SEC_X ;BR = No, so bail
MOVE *A0(OID),A0,W ;We can find out who did this
CALLA POID_TO_PDATA ;by getting the Player's data area.
JRUC SPEAR_GUNVECT
SEC_X
RETS
**************************************************************************
* *
* NSTAR_CVECT *
* *
* Collision vector table for the star *
* *
**************************************************************************
NSTAR_CVECT
WWL OID_PROCKET,~MASK_PLAYER,PROJECTILE_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,NSTAR_EXPLOSION_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* NSTAR_EXPLOSION_COLL *
* *
* Explosion service for star *
* *
* A0 = ptr to explosion object *
* A8 = ptr to star object *
* *
**************************************************************************
NSTAR_EXPLOSION_COLL
MOVB *A8(OCHEWEDROCKET),A14 ;Did he really take a rocket?
JRZ NEC_X ;BR = No, so bail
MOVE *A0(OID),A0,W ;We can find out who did this
CALLA POID_TO_PDATA ;by getting the Player's data area.
JRUC NSTAR_GUNVECT
NEC_X
RETS
**************************************************************************
* *
* A_SPAWN_PROJECTILE *
* *
* Anim Func to spawn a projectile from a part. *
* *
* AARG+,L = Init table to create. *
* AARG+,L = [Y,X] offset *
* *
**************************************************************************
A_SPAWN_PROJECTILE
CALLA GETAFARG_LONG
MOVE A0,B0
CALLA GETAFARG_LONG
MOVE A0,A3
CALLA EASYMAKE
JRZ ASP_X ;No objects available
MOVE *A8(OCTRL),A7,W ;Adjust offset if necessary
BTST B_FLIPH,A7
JRZ ASP_CHECKV
NEGX A3
ASP_CHECKV
BTST B_FLIPV,A7
JRZ ASP_NOV ;BR=NO FLIP ADJUSTMENT
NEGY A3
ASP_NOV
MOVE A3,*A0(OPARTSXY),L ;Just to position us
MOVE *A8(OCTRL),A5,W
ANDI M_FLIPH|M_FLIPV,A5 ;ISOLATE FLIP BITS ONLY
MOVE *A0(OCTRL),A14,W
OR A14,A5 ;Match flip to spawing object
MOVE A5,*A0(OCTRL),W
CALLA GET_HEAD_PART ;Use the head part as a good source
;This needs to be done by each individual projectile, if necessary
; MOVIB 60,*A8(OPROJ_CK_TIME) ;Check for hits after this much time
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
MOVE *A8(OZVAL),A3,L
SUBK 32,A3
CALLA SETOFFPU
MOVE *A0(OFLAGS),A14,W
BTST B_MANSCALE,A14 ;Is this a manual scaling object?
JREQ ASP_NO_MANUALZ ;BR = No
MOVE *A0(OZVAL),A5,L ;We must compute our own scale
MOVE @ZBASE,A14,L
SUB A14,A5 ;Current world Z
SRA 8,A5 ;compute pseudo Z
MOVI 380h,A6
MPYS A6,A5
SUBI 9000h,A5
SRA Z2SCALE,A5 ;compute scale from pseudo Z
MOVE A5,A9
MOVE A8,B1
MOVE A0,A8
CALLA SET_SCALE_MANUAL
MOVE B1,A8
ASP_NO_MANUALZ
MOVE A8,*A0(OPROJECT_PARENT),L ;Tell us our roots
MOVE *A8(OZVEL),A14,L ;Transfer Z velocity only if Enemy
JRP ASP_INSERT ;is not moving away from the screen
MOVE A14,*A0(OZVEL),L
ASP_INSERT
CALLA INSOBJ
ASP_X
RETS
**************************************************************************
* *
* A_PROJ_CK_PHIT *
* *
* Anim Func to check if one of Mondor's projectiles hit *
* a player. *
* *
* A8 = Ptr to projectile *
* AARG+,L = [Y,X] Firing offset *
* AARG+,L = [INT,FRAC] amount to add to BASE_HIT *
* *
**************************************************************************
A_PROJ_CK_PHIT
CALLA GETAFARG_LONG
MOVE A0,A3
MOVE @BASE_HIT,A5,W
SLL 4,A5
CALLA GETAFARG_LONG
; MOVE A0,A5
ADD A0,A5
CALLA CK_PLAYER_HIT
JRZ APCP_X
MOVE *A8(OPROJECT_PARENT),A0,L ;Get the guy that created us
JRZ APCP_X ;BR = He's anonymous
.IF DEBUG
CALLA IsAnObj ;Sanity check
.ENDIF
CALLA GETHEADPART ;Get some head
ADDKB 1,*A0(OPROJ_HIT)
APCP_X
RETS
**************************************************************************
* *
* A_FIRE_BALL_TARGET *
* *
* Anim func to set up the velocities and what not for *
* the fire ball. *
* *
* A8 = ptr to the fire ball object *
* *
**************************************************************************
A_FIRE_BALL_TARGET
MOVI 800,A0
CALLA RANDPER ;This is the chance that we target
JRNC AFBT_FULL_SCREEN ;BR = Not this time
CALLA GET_PLAYER_EXTENTS
JRUC AFBT_PICK_TARGET
AFBT_FULL_SCREEN
MOVI [SCRTOP+SKYTOPOF,SCRLFT],A2
MOVI [SCRBOT,SCRRGT],A3
AFBT_PICK_TARGET
MOVY A2,A0
MOVY A3,A1
CALLA RANGERND
SRA 16,A0
MOVE A0,A5
MOVX A2,A0
SEXT A0
MOVX A3,A1
SEXT A1
CALLA RANGERND
MOVE A0,A1
MOVE A5,A3
MOVE @ZBASE,A5,L
ADDI ZMAX_REAL2,A5
STOUXY A5,A1,A3
MOVE *A8(OXVAL),A2,L
MOVE *A8(OYVAL),A4,L
MOVE *A8(OZVAL),A6,L
MOVI 45,A7
MOVB A7,*A8(OPROJECT_TIME)
CALLA SLINEVEL_LOAD_3D
MOVE *A8(OPROJECT_PARENT),A0,L ;Get the guy that created us
CALLA GETHEADPART ;Get some head
MOVE *A0(OZVAL),A14,L
CMP A14,A6 ;Is fireball already behind Mondor?
JAGT DELETE_OBJ_PROC ;BR = Yes
MOVE *A8(OZVEL),A1,L
MOVE *A0(OZVEL),A14,L
CMP A14,A1 ;Is Mondor moving faster than the fireball?
JAGT DELETE_OBJ_PROC ;BR = Yes, delete
MOVIB 60,*A0(OPROJ_CK_TIME) ;Store for talk back
MOVE *A0(ONOARM_TIME),A14,W
CMPI NOARMS_PISSED,A14 ;Has it been a while with no arms?
JRLO AFBT_NORMAL_ARC ;BR = No
MOVI 90000H,A0
JRUC AFBT_CALC_ARC
AFBT_NORMAL_ARC
MOVI 40000H,A0
AFBT_CALC_ARC
CALLA SRAND
ADDRM A0,*A8(OXVEL),L
MOVE A0,A1
MOVI 45/2,A0
DIVS A0,A1
NEG A1
MOVE A1,*A8(OXACCEL),W
SOUNDZ SND_FIRE_BALL
SOUNDZ SND_FIRE_HISS
RETS
**************************************************************************
* *
* A_FB_COLLS_ON *
* *
* Anim func to turn on collsions for the FireBall. *
* *
* A8 = Ptr to FireBall *
* *
**************************************************************************
A_FB_COLLS_ON
MOVIM FB_GUNVECT,*A8(OGUNVECT),L
MOVIM FB_CVECT,*A8(OCVECT),L
MOVI OID_EROCKET,A1
CALLA CHANGE_OID
RETS
**************************************************************************
* *
* A_GREN_COLLS_ON *
* *
* Anim func to turn on collsions for the Grenade. *
* *
* A8 = Ptr to Grenade *
* *
**************************************************************************
A_GREN_COLLS_ON
MOVIM GREN_GUNVECT,*A8(OGUNVECT),L
MOVIM FB_CVECT,*A8(OCVECT),L
MOVI OID_EROCKET,A1
CALLA CHANGE_OID
RETS
**************************************************************************
* *
* A_AXE_COLLS_ON *
* *
* Anim func to turn on collsions for the axe. *
* *
* A8 = Ptr to Axe *
* *
**************************************************************************
A_AXE_COLLS_ON
MOVIM AXE_GUNVECT,*A8(OGUNVECT),L
MOVIM AXE_CVECT,*A8(OCVECT),L
MOVI OID_EROCKET,A1
CALLA CHANGE_OID
RETS
**************************************************************************
* *
* A_NSTAR_COLLS_ON *
* *
* Anim func to turn on collsions for the Ninja star. *
* *
* A8 = Ptr to Axe *
* *
**************************************************************************
A_NSTAR_COLLS_ON
MOVIM NSTAR_GUNVECT,*A8(OGUNVECT),L
MOVIM NSTAR_CVECT,*A8(OCVECT),L
MOVI OID_EROCKET,A1
CALLA CHANGE_OID
RETS
**************************************************************************
* *
* A_GRENADE_TARGET *
* *
* Anim func to set up the velocities and what not for *
* the Grenade. *
* *
* A8 = ptr to the Grenade object *
* *
**************************************************************************
A_GRENADE_TARGET
MOVB *A8(OFLAGS),A14 ;Are we onscreen?
JAN DELETE_OBJ_PROC ;BR = No, delete immeadiately
; MOVE *A8(OZVAL),A6,L ;Get the grenades current Z position
; MOVE *A8(OXVAL),A2,L ;We need X here for velocity calc
; MOVE A2,A1 ;Copy for screen conversion
; MOVE *A8(OYVAL),A4,L ;We need Y here for velocity calc
; UTOSX A6,A1 ;Get the screen X
; CMPI SCRLFT+75,A1 ;Is this point too far left?
; JRGE AGT_SXL_OK ;BR = No, use it as is
; MOVI SCRLFT+75,A1 ;Otherwise fix it
; JRUC AGT_RAND_SX
;AGT_SXL_OK
; CMPI SCRRGT-75,A1 ;How about too far right?
; JRLE AGT_RAND_SX ;BR = No, you can use it
; MOVI SCRRGT-75,A1 ;Otherwise make it right boundry
;AGT_RAND_SX
; MOVI 50,A0
; CALLA SRAND ;Some random range
; ADD A0,A1 ;Got X screen target
; MOVI (SCRBOT-SCRTOP)/2,A0
; MOVI SCRBOT-20,A1
; CALLA RANGERND
; MOVE A0,A3 ;Got Y screen target
MOVI 800,A0
CALLA RANDPER ;This is the chance that we target
JRNC AGT_FULL_SCREEN ;BR = Not this time
CALLA GET_PLAYER_EXTENTS
MOVI (SCRBOT-SCRTOP)/3,A14
SLL 16,A14
MOVY A14,A2 ;1/3 screen line is the top
JRUC AGT_PICK_TARGET
AGT_FULL_SCREEN
MOVI [(SCRBOT-SCRTOP)/3,SCRLFT],A2
MOVI [SCRBOT,SCRRGT],A3
AGT_PICK_TARGET
MOVY A2,A0
MOVY A3,A1
CALLA RANGERND
SRA 16,A0
MOVE A0,A5
MOVX A2,A0
SEXT A0
MOVX A3,A1
SEXT A1
CALLA RANGERND
MOVE A0,A1
MOVE A5,A3
MOVE @ZBASE,A5,L
ADDI ZMAX_REAL,A5
STOUXY A5,A1,A3
MOVE *A8(OXVAL),A2,L
MOVE *A8(OYVAL),A4,L
MOVE *A8(OZVAL),A6,L
MOVI 45,A7
MOVB A7,*A8(OPROJECT_TIME)
CALLA SLINEVEL_LOAD_3D
MOVE *A8(OPROJECT_PARENT),A0,L ;Get the guy that created us
CALLA GETHEADPART ;Get some head
MOVE *A0(OZVAL),A14,L
CMP A14,A6 ;Is grenade already behind Mondor?
JAGT DELETE_OBJ_PROC ;BR = Yes
MOVE *A8(OZVEL),A1,L
MOVE *A0(OZVEL),A14,L
CMP A14,A1 ;Is Mondor moving faster than the grenade?
JAGT DELETE_OBJ_PROC ;BR = Yes, delete
MOVIB 60,*A0(OPROJ_CK_TIME) ;Store for talk back
ADDIM -20000H,*A8(OYVEL),L
MOVIM 20000H/(45/2),*A8(OYACCEL),W
SOUNDZ SND_GREN_THROW
RETS
**************************************************************************
* *
* A_AXE_TARGET *
* *
* Anim func to set up the velocities and what not for *
* the axe. *
* *
* A8 = ptr to the axe object *
* *
**************************************************************************
A_AXE_TARGET
MOVB *A8(OFLAGS),A14 ;Are we onscreen?
JAN DELETE_OBJ_PROC ;BR = No, delete immediately
MOVI SCRTOP+100,A0
MOVI SCRBOT-50,A1
CALLA RANGERND
MOVE A0,A3 ;Got Y screen target
MOVE *A8(OZVAL),A6,L ;Get the current Z position
MOVE *A8(OXVAL),A2,L ;We need X here for velocity calc
MOVE A2,A1 ;Copy for screen conversion
MOVE *A8(OYVAL),A4,L ;We need Y here for velocity calc
UTOSX A6,A1 ;Get the screen X
CMPI SCRLFT+10,A1 ;Is this point too far left?
JRGE AGT_SXL_OK ;BR = No, use it as is
MOVI SCRLFT+10,A1 ;Otherwise fix it
JRUC AGT_RAND_SX
AGT_SXL_OK
CMPI SCRRGT-10,A1 ;How about too far right?
JRLE AGT_RAND_SX ;BR = No, you can use it
MOVI SCRRGT-10,A1 ;Otherwise make it right boundry
AGT_RAND_SX
MOVE @ZBASE,A5,L
ADDI ZMAX_REAL,A5
STOUXY A5,A1,A3
MOVI 45,A7
MOVB A7,*A8(OPROJECT_TIME)
CALLA SLINEVEL_LOAD_3D
; ADDIM -20000H,*A8(OYVEL),L
MOVIM 20000H/(45/2),*A8(OYACCEL),W
MOVE @YSCROLL,A1,L
NEG A1
ADDI -20000H,A1
ADDRM A1,*A8(OYVEL),L
RETS
**************************************************************************
* *
* A_SPEAR_TARGET *
* *
* Anim func to set up the velocities and what not for *
* the spear. *
* *
* A8 = ptr to the spear object *
* *
**************************************************************************
A_SPEAR_TARGET
MOVB *A8(OFLAGS),A14 ;Are we onscreen?
JAN DELETE_OBJ_PROC ;BR = No, delete immediately
INCM @NUM_SPEARS,W ;Increment the active spear count
MOVI SCRTOP+100,A0
MOVI SCRBOT-50,A1
CALLA RANGERND
MOVE A0,A3 ;Got Y screen target
MOVE *A8(OZVAL),A6,L ;Get the current Z position
MOVE *A8(OXVAL),A2,L ;We need X here for velocity calc
MOVE A2,A1 ;Copy for screen conversion
MOVE *A8(OYVAL),A4,L ;We need Y here for velocity calc
UTOSX A6,A1 ;Get the screen X
CMPI SCRLFT+10,A1 ;Is this point too far left?
JRGE AST_SXL_OK ;BR = No, use it as is
MOVI SCRLFT+10,A1 ;Otherwise fix it
JRUC AST_RAND_SX
AST_SXL_OK
CMPI SCRRGT-10,A1 ;How about too far right?
JRLE AST_RAND_SX ;BR = No, you can use it
MOVI SCRRGT-10,A1 ;Otherwise make it right boundry
AST_RAND_SX
MOVE @ZBASE,A5,L
ADDI ZMAX_REAL,A5
STOUXY A5,A1,A3
MOVI 60,A7
MOVB A7,*A8(OPROJECT_TIME)
CALLA SLINEVEL_LOAD_3D
move *a8(OXVEL),a14,L
move @XSCROLL,a1,L
add a1,a14
move a14,*a8(OXVEL),L
ADDIM -18000H,*A8(OYVEL),L
MOVIM 18000H/(60/2),*A8(OYACCEL),W
RETS
**************************************************************************
* *
* A_CHUNK_ONSCREEN *
* *
* Anim func to determine if a chunk is on screen or off. *
* If it is off, then check to see if it is below the *
* ground level. If it is then fall through. *
* If all velocities and accels go to zero, then we fall *
* through. *
* *
* A8 = Ptr to object *
* AARG+,L = Branch *
* *
**************************************************************************
A_CHUNK_ONSCREEN
CALLA GETAFARG_LONG
CALLA GET_HEAD_PART
MOVE *A8(OYACCEL),A4,W
MOVE *A8(OYVEL),A5,L ;We'll need these
MOVB *A8(OFLAGS),A14
JRNN ACO_BRANCH ;BR = Object is on screen
MOVE A4,A14
JRLE ACO_NOBRANCH ;BR = Accelerating in the wrong dir
MOVE A5,A14
JRN ACO_NO_BOTCK ;BR = We are movin' up
* See if we are off of the bottom of the screen
MOVE *A8(ODAGY),A1,W
MOVE @(SCRNBR+16),A14,W
CMP A14,A1
JRGT ACO_NOBRANCH ;BR = Off of the bottom of the screen
ACO_NO_BOTCK
CALLA DIST_FROM_GROUND ;See if it is above
JRLT ACO_NOBRANCH ;BR = it is below
ACO_BRANCH
* This is a sanity check to make sure things are still moving
MOVE A5,A14
JRNZ ACO_BRANCH_OK ;BR = We are moving, this is good
MOVE A4,A14
JRZ ACO_NOBRANCH ;BR = No vertical movement, bail
ACO_BRANCH_OK
MOVE A0,A1
JAUC STRT_ANIM
ACO_NOBRANCH
RETS
**************************************************************************
* *
* A_CHECK_FB_SCREEN_HIT *
* *
* Anim func to check if FireBall hit the screen. *
* *
* A8 = ptr to FireBall *
* *
**************************************************************************
A_CHECK_FB_SCREEN_HIT
MOVI SND_FB_HIT_SCRN,A4
MOVI ANIM_PROJ_HIT,A5
JRUC CHECK_SCREEN_HIT
**************************************************************************
* *
* A_CHECK_GREN_SCREEN_HIT *
* *
* Anim func to check if Grenade hit the screen. *
* *
* A8 = ptr to Grenade *
* *
**************************************************************************
A_CHECK_GREN_SCREEN_HIT
MOVI SND_GREN_HIT_SCRN,A4
MOVI ANIM_PROJ_HIT,A5
JRUC CHECK_SCREEN_HIT
**************************************************************************
* *
* A_CHECK_MISSLE_SCREEN_HIT *
* *
* Anim func to check if Missle hit the screen. *
* *
* A8 = ptr to Missle *
* *
**************************************************************************
A_CHECK_MISSLE_SCREEN_HIT
MOVI SND_GREN_HIT_SCRN,A4
MOVI ANIM_MISSLE_HIT,A5
JRUC CHECK_SCREEN_HIT
**************************************************************************
* *
* A_CHECK_AXE_SCREEN_HIT *
* *
* Anim func to check if Axe hit the screen. *
* *
* A8 = ptr to Axe *
* *
**************************************************************************
A_CHECK_AXE_SCREEN_HIT
MOVI SND_AXE_HIT_SCRN,A4
MOVI ANIM_AXE_HIT,A5
JRUC CHECK_SCREEN_HIT
**************************************************************************
* *
* A_CHECK_SPEAR_SCREEN_HIT *
* *
* Anim func to check if Spear hit the screen. *
* *
* A8 = ptr to Spear *
* *
**************************************************************************
A_CHECK_SPEAR_SCREEN_HIT
MOVI SND_SPEAR_HIT_SCRN,A4
MOVI ANIM_SPEAR_HIT,A5
JRUC CHECK_SCREEN_HIT
**************************************************************************
* *
* A_CHECK_NSTAR_SCREEN_HIT *
* *
* Anim func to check if Ninja star hit the screen. *
* *
* A8 = ptr to Axe *
* *
**************************************************************************
A_CHECK_NSTAR_SCREEN_HIT
MOVI SND_AXE_HIT_SCRN,A4
MOVI ANIM_NSTAR_HIT,A5
JRUC CHECK_SCREEN_HIT
**************************************************************************
* *
* A_KILL_MAN_SCALE *
* *
* Anim func to kill the manual scale for this object. *
* *
* A8 = Ptr to object *
* *
**************************************************************************
A_KILL_MAN_SCALE
ANDNIM M_MANSCALE,*A8(OFLAGS),W
JAUC OBJPROC_KILL
**************************************************************************
* *
* A_MAKE_MORPH_SND *
* *
* Anim func to fire off the 2 morph sounds *
* *
**************************************************************************
A_MAKE_MORPH_SND
SOUND1 SND_MORPH2
SOUND1 SND_MORPH3
RETS
*
*Entrypoint: This does a screen hit check for an object.
* Assumption is made that object is animating.
*A4 = Sound to make upon hit
*A5 = Animation to jump to upon hit
*
CHECK_SCREEN_HIT
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A3,L
SUB A3,A1 ;Get the World Z position
MOVE *A8(OFLAGS),A14,W
BTST B_DBLSCL,A14
JRZ CSH_NORMAL_SCALE
* Do this for 2-scale objects
CMPI ZMAX_REAL2+400H,A1 ;Did he hit the front?
JRGT CSH_CHECK_Z ;BR = No
CALLA CLR_VEL ;Stop this crazy thing
MOVI ZMAX_REAL2+100H,A1
JRUC CSH_STUFF_FRONT
CSH_NORMAL_SCALE
CMPI ZMAX_REAL+400H,A1 ;Did he hit the front?
JRGT CSH_CHECK_Z ;BR = No
CALLA CLR_VEL ;Stop this crazy thing
MOVI ZMAX_REAL,A1
CSH_STUFF_FRONT
ADD A3,A1
MOVE A1,*A8(OZVAL),L ;Set it right at the front
CALLA COLLS_OFF ;Too late to hit this bitch
MOVB *A8(OFLAGS),A14
JRN CSH_NOSND ;BR = Offscreen
MOVE A4,A0
CALLA ONESND ;hit us with best shot preeese
CSH_NOSND
CALLA OBJPROC_KILL ;Kill any straggling process
CALLA OBJ_ON ;Make sure the object is on
MOVE A5,A1 ;Run this animation
JAUC SetAnim
*See if we've fallen behind the object that created us.
*If so, then delete.
CSH_CHECK_Z
MOVE *A8(OPROJECT_PARENT),A0,L ;Get the guy that created us
.IF DEBUG
CALLA IsAnObj ;Sanity check
.ENDIF
CALLA GETHEADPART ;Get some head
MOVE *A0(OZVAL),A14,L ;Parent Z
MOVE *A8(OZVAL),A1,L ;Projectile Z
CMP A14,A1 ;Is the projectile in front?
JRLE CSH_X ;BR = Yes, so it may be spared
MOVE *A8(OZVEL),A14,L ;Is it moving towards the rear?
JRP CSH_X ;BR = Yes
CLRM *A8(OPROJECT_PARENT),L
JAUC DELETE_OBJ_PROC ;Kind of harsh, don't you think?
CSH_X
RETS
**************************************************************************
* *
* C_GRENADE *
* *
* Create func for Mondor's Grenade *
* *
* A0 = ptr to un-inserted Grenade *
* *
**************************************************************************
C_GRENADE
MMTM SP,A0,A8
MOVE A0,A8
CREATE PID_IND,PROC_MAN_SCALE
MOVE A0,*A8(OPLINK),L
MMFM SP,A0,A8
JRUC C_PROJECTILE
**************************************************************************
* *
* C_FIREBALL *
* *
* Create func for Mondor's FireBall *
* *
* A0 = ptr to un-inserted FireBall *
* *
**************************************************************************
C_FIREBALL
MMTM SP,A0,A8
MOVE A0,A8
CREATE PID_IND,PROC_PROJECTILE_FLASH
MOVE A0,*A8(OPLINK),L
MMFM SP,A0,A8
CLR A14
MOVB A14,*A0(OCHEWEDROCKET)
MOVIM 0101H,*A0(OCONST),W
RETS
**************************************************************************
* *
* C_PROJECTILE *
* *
* Create function for Mondor's projectiles *
* *
* A0 = ptr to un-inserted projectile object *
* *
**************************************************************************
C_PROJECTILE
CLR A14
MOVB A14,*A0(OCHEWEDROCKET)
MOVIM 3F3FH,*A0(OCONST),W
RETS
**************************************************************************
* *
* C_AXE *
* *
* Create func for Berzerker's axe *
* *
* A0 = ptr to un-inserted Axe *
* *
**************************************************************************
C_AXE
CLR A14
MOVB A14,*A0(OCHEWEDROCKET)
MOVIM 0101H,*A0(OCONST),W
RETS
**************************************************************************
* *
* C_SPEAR *
* *
* Create func for Native's spear *
* *
* A0 = ptr to un-inserted Spear *
* *
**************************************************************************
C_SPEAR
CLR A14
MOVB A14,*A0(OCHEWEDROCKET)
MOVIM 3F3FH,*A0(OCONST),W
RETS
**************************************************************************
* *
* C_NSTAR *
* *
* Create func for Ninja's star *
* *
* A0 = ptr to un-inserted star *
* *
**************************************************************************
C_NSTAR
CLR A14
MOVB A14,*A0(OCHEWEDROCKET)
MOVIM 0505H,*A0(OCONST),W
MOVE @LAB_RAT,A14,W
JRNZ CNS_X
MMTM SP,A0,A8
MOVE A0,A8
MOVI REDWEAPN,A0
CALLA CHANGE_PAL
MMFM SP,A0,A8
CNS_X
RETS
**************************************************************************
* *
* PROC_PROJECTILE_FLASH *
* *
* Process to flash the projectile. *
* *
* A8 = Ptr to projectile object. *
* *
**************************************************************************
PROC_PROJECTILE_FLASH
MOVE *A8(OXACCEL),A1,W
ADDRM A1,*A8(OXVEL),L
SLEEP 1
MOVE *A8(OXACCEL),A1,W
ADDRM A1,*A8(OXVEL),L
SLEEP 1
CALLA OBJ_OFF
MOVE *A8(OXACCEL),A1,W
ADDRM A1,*A8(OXVEL),L
SLEEP 1
CALLA OBJ_ON
JRUC PROC_PROJECTILE_FLASH
**************************************************************************
* *
* PROC_MAN_SCALE *
* *
* Process to handle the manual scaling of an object. *
* *
* A8 = Ptr to object *
* *
**************************************************************************
PROC_MAN_SCALE
CLR A9
PMS_LOOP
CALLR MAN_SCALE_CORE
SLOOP 3,PMS_LOOP
*
*Subroutine to be used by Manual Scaling processes
*A8 = Object
*A9 = Last scale set
*note: Trashes A0,A5
MAN_SCALE_CORE
MOVE *A8(OZVAL),A5,L
MOVE @ZBASE,A14,L
SUB A14,A5 ; WORLD Z
SRA 8,A5 ; compute pseudo Z
MOVI 380h,A0
MPYS A0,A5
SUBI 9000h,A5
SRA Z2SCALE,A5 ; compute scale from pseudo Z
CMP A5,A9
JREQ PMS_NOTNEW
MOVE A5,A9
CALLA SET_SCALE_MANUAL
PMS_NOTNEW
RETS
*Initialize Mondor's fire ball
FIRE_BALL_INIT
.LONG LILPLAZ1
.WORD DMAWNZ, M_DBLSCL, OM_OID|OM_COLL|OM_ANIM|OM_CFUNC
.WORD OID_JUNK
.LONG DUMCOLL, ANIM_FIRE_BALL, C_FIREBALL
*Animate the fire ball
ANIM_FIRE_BALL
LWL 1,1|AFunc,A_FIRE_BALL_TARGET
LW LILPLAZ2,2
LW LILPLAZ3,2
LW LILPLAZ1,2
LWL LILPLAZ2,2|AFunc,A_FB_COLLS_ON
ANIM_FB_LOOP
LWL LILPLAZ3,2|AFunc,A_CHECK_FB_SCREEN_HIT
LWL LILPLAZ1,2|AFunc,A_CHECK_FB_SCREEN_HIT
LWL LILPLAZ2,1|AFunc,A_CHECK_FB_SCREEN_HIT
LWLL 1,1|AFunc,A_ONSCREEN+2,ANIM_FB_LOOP
LWL 1,1|AFunc,DELETE_OBJ_PROC
ANIM_FB_FLYAWAY
LWLW 1,1|AFunc,A_Set_AnimLoop+1,4
AFBF_LOOP
LW LILPLAZ3,2
LW LILPLAZ1,2
LWLL LILPLAZ2,2|AFunc,A_Anim_DSJ+2,AFBF_LOOP
LWL 1,1|AFunc,DELETE_OBJ_PROC
*Initialize Mondor's Grenade
GRENADE_INIT
.LONG GREN1
.WORD DMAWNZ, M_MANSCALE, OM_OID|OM_COLL|OM_GUNV|OM_ANIM|OM_CFUNC
.WORD OID_JUNK
.LONG DUMCOLL, DUMRETS, ANIM_GRENADE, C_GRENADE
*Animate the Grenade
ANIM_GRENADE
LWL 1,1|AFunc,A_GRENADE_TARGET
LW GREN1,2
LW GREN2,2
LW GREN3,2
LWL GREN4,2|AFunc,A_GREN_COLLS_ON
ANIM_GREN_LOOP
LW GREN5,2
LWL GREN6,2|AFunc,A_CHECK_GREN_SCREEN_HIT
LW GREN7,2
LWL GREN1,2|AFunc,A_CHECK_GREN_SCREEN_HIT
LW GREN2,2
LWL GREN3,2|AFunc,A_CHECK_GREN_SCREEN_HIT
LWLL GREN4,2|AFunc,A_ONSCREEN+2,ANIM_GREN_LOOP
LWL 1,1|AFunc,DELETE_OBJ_PROC
*
* Generic projectile screen hit
*
ANIM_PROJ_HIT
LWL 1,1|AFunc,OBJ_CONST
ANIM_STICK_IT
LWL 1,1|AFunc,OBJ_UNIV_TO_SCRN ;Make this stick
LWL 1,1|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_ON_WNZ
LWLLL 1,1|AFunc,A_PROJ_CK_PHIT+4,0,-8000H
LWL 1,2|AFunc,OBJ_CONST
LWL 1,1|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_ON_WNZ
LWLLL 1,1|AFunc,A_PROJ_CK_PHIT+4,0,-8000H
LWL 1,2|AFunc,OBJ_CONST
LWL 1,1|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_ON_WNZ
LWLLL 1,1|AFunc,A_PROJ_CK_PHIT+4,0,-8000H
LWL 1,2|AFunc,OBJ_CONST
LWL 1,1|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_ON_WNZ
LWLLL 1,1|AFunc,A_PROJ_CK_PHIT+4,0,-8000H
LWL 1,2|AFunc,OBJ_CONST
LWL 1,1|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_ON_WNZ
LWLLL 1,1|AFunc,A_PROJ_CK_PHIT+4,0,-8000H
LWL 1,1|AFunc,DELETE_OBJ
*Grenade explodes in mid-air
ANIM_GREN_EXPLODE
LWLL FHKEXPLOB1,3|AFunc,A_CHANGE_PAL+2,FX2
LWL 1,1|AFunc,A_KILL_MAN_SCALE
;; LWL 1,4|AFunc,CLR_VEL
LW FHKEXPLOB2,4
LW FHKEXPLOB3,4
LW FHKEXPLOB4,4
; LW FHKEXPLOB5,4
; LW FHKEXPLOB6,3
; LW FHKEXPLOB7,3
; LW FHKEXPLOB8,2
; LW FHKEXPLOB9,2
; LW FHKEXPLOB10,2
; LW FHKEXPLOB11,2
;; LWL 1,1|AFunc,A_KILL_MAN_SCALE
LWL 1,1|AFunc,DELETE_OBJ
*
* Initialize Berzerker's axe
*
AXE_INIT
.LONG ZAXVERT1
.WORD DMAWNZ, 0, OM_OID|OM_COLL|OM_GUNV|OM_ANIM|OM_CFUNC
.WORD OID_JUNK
.LONG DUMCOLL, DUMRETS, ANIM_AXE, C_AXE
*
* Animate the axe
*
ANIM_AXE
LWL 1,1|AFunc,A_AXE_TARGET
LWLL ZAXVERT1,2|AFunc,A_SOUNDZ+2,SND_AXE_WHOOSH
LW ZAXVERT2,2
LW ZAXVERT3,2
LWL ZAXVERT4,2|AFunc,A_AXE_COLLS_ON
ANIM_AXE_LOOP
LWLL ZAXVERT5,2|AFunc,A_SOUNDZ+2,SND_AXE_WHOOSH
LWL ZAXVERT6,2|AFunc,A_CHECK_AXE_SCREEN_HIT
LW ZAXVERT7,2
LWL ZAXVERT8,2|AFunc,A_CHECK_AXE_SCREEN_HIT
LWLL ZAXVERT9,2|AFunc,A_SOUNDZ+2,SND_AXE_WHOOSH
LWL ZAXVERT10,2|AFunc,A_CHECK_AXE_SCREEN_HIT
LW ZAXVERT11,2
LWL ZAXVERT12,2|AFunc,A_CHECK_AXE_SCREEN_HIT
LWLL ZAXVERT1,2|AFunc,A_SOUNDZ+2,SND_AXE_WHOOSH
LWL ZAXVERT2,2|AFunc,A_CHECK_AXE_SCREEN_HIT
LW ZAXVERT3,2
LWLL ZAXVERT4,2|AFunc,A_ONSCREEN+2,ANIM_AXE_LOOP
LWL 1,1|AFunc,DELETE_OBJ_PROC
*
* Axe hits the screen
*
ANIM_AXE_HIT
LWL ZAXVERT12,1|AFunc,A_CREATE_SCREEN_AXE
ANIM_AXE_HIT_FINISH
LWL 1,1|AFunc,OBJ_CONST
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPROJECT_PARENT,0
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_STICK_IT
**************************************************************************
* *
* A_CREATE_SCREEN_NSTAR *
* *
* Anim func to create the cool looking screen STAR. *
* *
* A8 = Ptr old axe. *
* *
**************************************************************************
A_CREATE_SCREEN_NSTAR
MOVI NINJASTAR1,A1
MOVI ANIM_NSTAR_HIT_FINISH,A2
JRUC A_SCR_PROJ_G
**************************************************************************
* *
* A_CREATE_SCREEN_AXE *
* *
* Anim func to create the cool looking screen axe. *
* *
* A8 = Ptr old axe. *
* *
**************************************************************************
A_CREATE_SCREEN_AXE
MOVI ZLGAXE,A1
MOVI ANIM_AXE_HIT_FINISH,A2
A_SCR_PROJ_G
MMTM SP,A1,A2
CALLA CREATE_COPY
JRZ ACSA_X ;BR = Couldn't create it
CALLA DELETE_OBJ
MOVE A0,A8
MOVI 1000100H,A1
CALLA SET_SCALEM
ORIM M_NOSCALE,*A8(OFLAGS),W
MMFM SP,A1,A2
MOVE *A8(OCTRL),A4,W
CALLA ANI
MOVI P_GXLAX,A0
CALLA CHANGE_PAL
MOVE A2,A1
CALLA STRT_ANIM
JAUC INSERT_OBJ
ACSA_X
MMFM SP,A1,A2
RETS
*
* Axe flys away cause it was hit by a bullet
*
ANIM_AXE_FLYAWAY
LW ZAXVERT12,2
LW ZAXVERT11,2
LW ZAXVERT10,2
LW ZAXVERT9,2
LW ZAXVERT8,2
LW ZAXVERT7,2
LW ZAXVERT6,2
; LW ZAXVERT5,2
; LW ZAXVERT4,2
; LW ZAXVERT3,2
; LW ZAXVERT2,2
; LW ZAXVERT1,2
LWL 1,1|AFunc,DELETE_OBJ_PROC
*
* Initialize Native's spear
*
NSPEAR_INIT
.LONG ARROW8
.WORD DMAWNZ, 0, OM_OID|OM_COLL|OM_GUNV|OM_ANIM|OM_CFUNC
.WORD OID_EROCKET
.LONG SPEAR_CVECT, SPEAR_GUNVECT, ANIM_SPEAR, C_SPEAR
*
* Animate the spear
*
ANIM_SPEAR
LWL 1,1|AFunc,A_SPEAR_TARGET
LWLL 1,15|AFunc,A_SOUNDZ+2,SND_SPEAR_COMING
LW ARROW9,15
LWL ARROW10,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL ARROW11,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL ARROW12,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
ANIM_SPEAR_LOOP
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWL 1,2|AFunc,A_CHECK_SPEAR_SCREEN_HIT
LWLL 1,2|AFunc,A_ONSCREEN+2,ANIM_SPEAR_LOOP
LWLL 1,1|AFunc,A_DEC_VAR_WORD+2,NUM_SPEARS
LWL 1,1|AFunc,DELETE_OBJ_PROC
*
* Spear hits the screen
*
ANIM_SPEAR_HIT
LWL 1,1|AFunc,OBJ_CONST
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPROJECT_PARENT,0
LWLL 1,1|AFunc,A_DEC_VAR_WORD+2,NUM_SPEARS
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_STICK_IT
*
* Spear flys away cause it was hit by a bullet
*
ANIM_SPEAR_FLYAWAY
LW 1,15
LWL 1,1|AFunc,DELETE_OBJ_PROC
*
* Missle hits the screen
*
ANIM_MISSLE_HIT
LWL 1,1|AFunc,OBJ_CONST
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPROJECT_PARENT,0
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_STICK_IT
*
* Initialize Ninja's star
*
NSTAR_INIT
.LONG STARQUAR01
.WORD DMAWNZ, M_NOPIXSCAN, OM_OID|OM_COLL|OM_GUNV|OM_ANIM|OM_CFUNC
.WORD OID_JUNK
.LONG DUMCOLL, DUMRETS, ANIM_NSTAR, C_NSTAR
*
* Animate the star
*
ANIM_NSTAR
LWL 1,1|AFunc,A_AXE_TARGET
LWLL 1,1|AFunc,A_INC_VAR_WORD+2,NUM_NSTARS
LWLL STARQUAR01,2|AFunc,A_SOUNDZ+2,SND_SPEAR_COMING
LW STARQUAR02,2
LW STARQUAR03,2
LWL STARQUAR04,2|AFunc,A_NSTAR_COLLS_ON
ANIM_NSTAR_LOOP
LW STARQUAR05,2
LWL STARQUAR06,2|AFunc,A_CHECK_NSTAR_SCREEN_HIT
LW STARQUAR07,2
LWL STARQUAR08,2|AFunc,A_CHECK_NSTAR_SCREEN_HIT
LW STARQUAR01,2
LWL STARQUAR02,2|AFunc,A_CHECK_NSTAR_SCREEN_HIT
LW STARQUAR03,2
LWLL STARQUAR04,2|AFunc,A_ONSCREEN+2,ANIM_NSTAR_LOOP
LWLL 1,1|AFunc,A_DEC_VAR_WORD+2,NUM_NSTARS
LWL 1,1|AFunc,DELETE_OBJ_PROC
*
* Nstar hits the screen
*
ANIM_NSTAR_HIT
LWLL 1,1|AFunc,A_DEC_VAR_WORD+2,NUM_NSTARS
LWL 1,1|AFunc,A_CREATE_SCREEN_NSTAR
ANIM_NSTAR_HIT_FINISH
LWL 1,1|AFunc,OBJ_CONST
LWLWL 1,1|AFunc,A_Set_Rel_Long+3,OPROJECT_PARENT,0
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_STICK_IT
*
* Ninja star flys away cause it was hit by a bullet
*
ANIM_NSTAR_FLYAWAY
LW STARQUAR08,2
LW STARQUAR07,2
LW STARQUAR06,2
LW STARQUAR05,2
LW STARQUAR04,2
LW STARQUAR03,2
LW STARQUAR02,2
LW STARQUAR01,2
LWL 1,1|AFunc,DELETE_OBJ_PROC
REDWEAPN:
.word 16
.word 00000h,01c00h,07c20h,079b2h,07a5bh,07adfh,04000h,04400h
.word 04c00h,05000h,05800h,06000h,06400h,06c00h,07000h,07800h
**************************************************************************
* *
* A_INC_VAR_WORD *
* *
* Anim func to INCrement a given variable of length word. *
* *
* AARG+,L = Address of variable *
* *
**************************************************************************
A_INC_VAR_WORD
CALLA GETAFARG_LONG
INCM *A0,W
RETS
**************************************************************************
* *
* A_DEC_VAR_WORD *
* *
* Anim func to decrement a given variable of length word. *
* *
* AARG+,L = Address of variable *
* *
**************************************************************************
A_DEC_VAR_WORD
CALLA GETAFARG_LONG
DECM *A0,W
RETS
**************************************************************************
* *
* A_STAY_TIL_TRUE *
* *
* Anim func to stay until a given Word variable is true. *
* *
* AARG+,L = Address of variable *
* *
**************************************************************************
A_STAY_TIL_TRUE
CALLA GETAFARG_LONG
MOVE *A0,A14,W
JRNZ ASTT_X ;BR = Variable is true
MOVE *A8(AnimFrm),A14,L ; otherwise, stay here
SUBI 70h,A14
MOVE A14,*A8(AnimFrm),L
ASTT_X
RETS
*
* Some Mondor fire
*
INIT_POD_FIRE
.LONG HFIREA1
.WORD DMAWNZ, M_DEAD|M_NOPARTANI|M_OPARTSXY, OM_ANIM
.LONG ANIM_POD_FIRE
ANIM_POD_FIRE
LWLW 1,1|AFunc,A_Set_AnimLoop+1,4
ANIM_PF_LOOP
LW HFIREA1,4
LW HFIREA2,4
LW HFIREA3,4
LW HFIREA4,4
LW HFIREA5,4
LW HFIREA6,3
LWLL 1,1|AFunc,A_Anim_DSJ+2,ANIM_PF_LOOP
LWL 1,1|AFunc,DELETE_OBJ
.LONG 0
*
*Josh morphing. Everything up to the final frame
*
MORF_TICK .EQU 5
ANIM_JOSH_MORPH
LWLL 1,1|AFunc,A_STAY_TIL_TRUE+2,MONDOR_START_FLAG
LWLLW 1,5|AFunc,A_Set_Var_Word+3,GUNS_OFF,1
LWL 1,1|AMulti|AFunc,OBJ_ON
LWL 1,1|AMulti|AFunc,OBJ_ON
LWL 1,1|AMulti|AFunc,OBJ_ON
LWL 1,1|AMulti|AFunc,OBJ_ON
LWL 1,1|AMulti|AFunc,OBJ_ON
LWL 1,MORF_TICK|AFunc,A_MAKE_MORPH_SND
LW HELMON1_02A,1|AMulti
LW HELMON1_02B,1|AMulti
LW HELMON1_02C,1|AMulti
LW HELMON1_02D,1|AMulti
LW HELMON1_02E,MORF_TICK
LW HELMON1_03A,1|AMulti
LW HELMON1_03B,1|AMulti
LW HELMON1_03C,1|AMulti
LW HELMON1_03D,1|AMulti
LW HELMON1_03E,MORF_TICK
LW HELMON1_04A,1|AMulti
LW HELMON1_04B,1|AMulti
LW HELMON1_04C,1|AMulti
LW HELMON1_04D,1|AMulti
LW HELMON1_04E,MORF_TICK
LW HELMON1_05A,1|AMulti
LWLLLL HELMON1_05B,1|AMulti|AFunc,A_PreFrag_Center+6,FRAG_JOSH_SUIT_UL,400h,60000h
LWLLLL HELMON1_05C,1|AMulti|AFunc,A_PreFrag_Center+6,FRAG_JOSH_SHIRT,400h,60000h
LWLLLL HELMON1_05D,1|AMulti|AFunc,A_PreFrag_Center+6,FRAG_JOSH_SUIT_UR,400h,60000h
LWL HELMON1_05E,1|AMulti|AFunc,OBJ_ON
LWL HELMON1_05F,1|AMulti|AFunc,OBJ_ON
LWL HELMON1_05G,MORF_TICK|AFunc,OBJ_ON
LW HELMON1_06FA,1|AMulti
LW HELMON1_06FB,1|AMulti
LW HELMON1_06FC,1|AMulti
LW HELMON1_06FD,1|AMulti
LW HELMON1_06FE,1|AMulti
LWW HELMON1_06FA,1|AMulti|AFlip,M_FLIPH
LWW HELMON1_06FB,1|AMulti|AFlip,M_FLIPH
LWWL HELMON1_06FC,1|AMulti|AFlip|AFunc,M_FLIPH,OBJ_ON
LWWL HELMON1_06FD,1|AMulti|AFlip|AFunc,M_FLIPH,OBJ_ON
LWWL HELMON1_06FE,MORF_TICK|AFlip|AFunc,M_FLIPH,OBJ_ON
LW HELMON1_07FA,1|AMulti
LW HELMON1_07FB,1|AMulti
LW HELMON1_07FC,1|AMulti
LW HELMON1_07FD,1|AMulti
LW HELMON1_07FE,1|AMulti
LW HELMON1_07FA,1|AMulti
LW HELMON1_07FB,1|AMulti
LW HELMON1_07FC,1|AMulti
LW HELMON1_07FD,1|AMulti
LW HELMON1_07FE,MORF_TICK
LW HELMON1_08FA,1|AMulti
LW HELMON1_08FB,1|AMulti
LW HELMON1_08FC,1|AMulti
LW HELMON1_08FD,1|AMulti
LW HELMON1_08FE,1|AMulti
LW HELMON1_08FA,1|AMulti
LW HELMON1_08FB,1|AMulti
LW HELMON1_08FC,1|AMulti
LW HELMON1_08FD,1|AMulti
LW HELMON1_08FE,MORF_TICK
; LWLWW HELMON1_09FA,1|AMulti|AFunc,A_Set_Rel_Word_Head+2,OYACCEL,-1000H
LW HELMON1_09FA,1|AMulti
LW HELMON1_09FB,1|AMulti
LW HELMON1_09FC,1|AMulti
LW HELMON1_09FD,1|AMulti
LW HELMON1_09FE,1|AMulti
LW HELMON1_09FA,1|AMulti
LW HELMON1_09FB,1|AMulti
LW HELMON1_09FC,1|AMulti
LW HELMON1_09FD,1|AMulti
LW HELMON1_09FE,MORF_TICK-1
LWLL 1,1|AFunc,A_AnimFrm+2,ANIM_MORPH_FINISH
**************************************************************************
* *
* More Sounds for Mondor *
* *
**************************************************************************
SND_MONDOR_GUN
.WORD 0E320H,10,0A108H,0 ;Mondor fires upon your ass
SND_PART_EXPLODE
.WORD 0F341H,60,0A38DH,0 ;Explosion used by much
SND_FIRE_BALL
.WORD 0F342H,44,08292H,0 ;FireBall being launched
SND_FIRE_HISS
.WORD 0F340H,36,0A396H,0 ;FireBall hissing
SND_FB_HIT_SCRN
.WORD 0F341H,60,0A393H,0 ;FireBall hits the screen
SND_GREN_THROW
.WORD 0F342H,73,0A1A6H,0 ;Sound of a Grenade being thrown
SND_GREN_HIT_SCRN
.WORD 0F342H,60,0A390H,0 ;Grenade hits the screen
SND_GREN_EXPLODE
.WORD 0F341H,80,0A38DH,0 ;Grenade blows up in mid-air
SND_AXE_WHOOSH
.WORD 0F342H,15,0A489H,0 ;Sound of an axe being thrown
SND_AXE_HIT_SCRN
.WORD 0F342H,71,0A48CH,0 ;Axe hits the screen
SND_AXE_FLY
.WORD 0F342H,62,0A1A3H,0 ;Axe gets blown back
SND_SPEAR_FLY
.WORD 0F342H,62,0A1A3H,0 ;Spear gets blown out of the air
SND_SPEAR_HIT_SCRN
.WORD 0F343H,67,0A48Fh,0
SND_SPEAR_COMING
.WORD 0F342H,46,0A41AH,0
SND_PROJECTILE_FLY
.WORD 0F141H,62,0A1A1H,0 ;Projectile gets blown back
SND_GUN_BOUNCE
.WORD 0F304H,19,0A3A0H,0 ;Gun bounces off of the ground
SND_RIP_HEAD
.WORD 0E344H,133,0828EH,0 ;"I'll rip your head off! For that."
SND_SUSHI
.WORD 0E3D1H,89,08290H,0 ;"Ahhh Sushi"
SND_TAKE_THAT
.WORD 0E342H,49,0828DH,0 ;"Take that"
SND_CMON
.WORD 0E342H,102,0828CH,0 ;"C'mon! Whaddya, scared?"
SND_PRAY
.WORD 0E342H,108,0829DH,0 ;"Pray for a fast death"
SND_NIGHT
.WORD 0E342H,131,0829BH,0 ;"I'm your worst nightmare."
SND_DEVOUR
.WORD 0E342H,109,082A5H,0 ;"I will devour you."
SND_NOTHING
.WORD 0E342H,99,082A2H,0 ;"You are nothing."
SND_LAUGH
.WORD 0E342H,82,08291H,0 ;Mondor laughs
SND_FLESH_WOUND
.WORD 0E344H,90,08287H,0 ;"It's only a flesh wound."
SND_BOOM
.WORD 0E342H,46,0828AH,0 ;"Boom!"
SND_GUTS_SOY
.WORD 0E342H,131,0828FH,0 ;"I'll eat your guts with soy sauce!"
SND_COWARD
.WORD 0E342H,59,0829EH,0 ;"Coward"
SND_MOMMY
.WORD 0E342H,113,0829FH,0 ;"Go on, run to mommy"
SND_MONDOR
.WORD 0E342H,84,082A0H,0 ;"I am Mondor!"
SND_DONE
.WORD 0E342H,69,082A1H,0 ;"You are done!"
SND_KAMIKAZE
.WORD 0E343H,95,082A4H,0 ;Kamikaze scream
SND_WORSE
.WORD 0E344H,63,082A7H,0 ;"I've had worse"
SND_GETUP
.WORD 0E344H,78,082A3H,0 ;"Don't make me get up"
SND_MORE
.WORD 0E342H,86,08299H,0 ;"Back for more, huh?"
SND_MORPH2
.WORD 0E24AH,95,0832FH,0 ;Josh morphs into Mondor TRACK 2
SND_MORPH3
.WORD 0E34AH,95,08330H,0 ;Josh morphs into Mondor TRACK 3
TAB_BLOOD_SPLAT
.LONG SND_BLOOD_SPLAT1, SND_BLOOD_SPLAT2, SND_BLOOD_SPLAT3
SND_BLOOD_SPLAT1
.WORD 0E300H,10,0A1A9H,0 ;Blood drops #1
SND_BLOOD_SPLAT2
.WORD 0E300H,10,0A1ACH,0 ;Blood drops #2
SND_BLOOD_SPLAT3
.WORD 0E300H,11,0A1AFH,0 ;Blood drops #3
**************************************************************************
* *
* Talk Scripts *
* ------------ *
* *
* Talk scripts are used to give the talk animation it's *
* counts so that it can sync to the given speech. *
* *
* A script looks like this: *
* *
* .BYTE syllable_count, intial_pause *
* .LONG sound_script1 *
* .BYTE syllable1_open_time, syllable1_close_time *
* . *
* . *
* . *
* .LONG sound_scriptN *
* .BYTE syllableN_open_time, syllableN_close_time *
* *
**************************************************************************
TALK_SCRIPTS
.LONG TSCRIPT_TAKE_THAT, TSCRIPT_SUSHI, TSCRIPT_RIP_HEAD
.LONG TSCRIPT_LAUGH, TSCRIPT_CMON, TSCRIPT_PRAY
.LONG TSCRIPT_NIGHT, TSCRIPT_DEVOUR, TSCRIPT_NOTHING
.LONG TSCRIPT_FLESH_WOUND, TSCRIPT_BOOM, TSCRIPT_GUTS_SOY
.LONG TSCRIPT_COWARD, TSCRIPT_MOMMY, TSCRIPT_MONDOR, TSCRIPT_DONE
.LONG TSCRIPT_WORSE, TSCRIPT_GETUP, TSCRIPT_MORE
TSCRIPT_TAKE_THAT
.BYTE 2,40
.LONG SND_TAKE_THAT
.BYTE 14,6
.BYTE 20,1
.EVEN
TSCRIPT_SUSHI
.BYTE 3,10
.LONG SND_SUSHI
.BYTE 30,22
.BYTE 10,3
.BYTE 10,1
.EVEN
TSCRIPT_RIP_HEAD
.BYTE 7,60
.LONG SND_RIP_HEAD
.BYTE 13,8
.BYTE 10,5
.BYTE 15,6
.BYTE 11,4
.BYTE 15,8
.BYTE 12,4
.BYTE 15,1
.EVEN
TSCRIPT_LAUGH
.BYTE 6,10
.LONG SND_LAUGH
.BYTE 2,2
.BYTE 18,2
.BYTE 12,2
.BYTE 12,2
.BYTE 12,2
.BYTE 18,2
TSCRIPT_PRAY
.BYTE 5,10
.LONG SND_PRAY
.BYTE 20,4
.BYTE 10,4
.BYTE 6,4
.BYTE 15,12
.BYTE 16,1
TSCRIPT_NIGHT
.BYTE 5,10
.LONG SND_NIGHT
.BYTE 13,18
.BYTE 18,6
.BYTE 18,12
.BYTE 18,7
.BYTE 25,1
TSCRIPT_DEVOUR
.BYTE 6,10
.LONG SND_DEVOUR
.BYTE 10,4
.BYTE 12,6
.BYTE 10,4
.BYTE 10,4
.BYTE 8,4
.BYTE 14,1
TSCRIPT_NOTHING
.BYTE 4,10
.LONG SND_NOTHING
.BYTE 19,4
.BYTE 22,6
.BYTE 12,5
.BYTE 16,1
TSCRIPT_FLESH_WOUND
.BYTE 5,60
.LONG SND_FLESH_WOUND
.BYTE 10,4
.BYTE 10,4
.BYTE 10,2
.BYTE 16,4
.BYTE 16,1
TSCRIPT_BOOM
.BYTE 1,10
.LONG SND_BOOM
.BYTE 21,1
TSCRIPT_CMON
.BYTE 5,10
.LONG SND_CMON
.BYTE 5,2
.BYTE 24,4
.BYTE 10,2
.BYTE 15,6
.BYTE 30,1
TSCRIPT_GUTS_SOY
.BYTE 7,10
.LONG SND_GUTS_SOY
.BYTE 12,6
.BYTE 10,3
.BYTE 10,4
.BYTE 12,4
.BYTE 12,6
.BYTE 16,4
.BYTE 18,1
TSCRIPT_COWARD
.BYTE 2,10
.LONG SND_COWARD
.BYTE 11,4
.BYTE 32,1
TSCRIPT_MOMMY
.BYTE 6,30
.LONG SND_MOMMY
.BYTE 12,3
.BYTE 20,14
.BYTE 12,4
.BYTE 12,4
.BYTE 10,3
.BYTE 16,1
TSCRIPT_MONDOR
.BYTE 4,10
.LONG SND_MONDOR
.BYTE 12,4
.BYTE 10,6
.BYTE 14,6
.BYTE 18,1
TSCRIPT_DONE
.BYTE 3,1
.LONG SND_DONE
.BYTE 18,5
.BYTE 14,6
.BYTE 12,1
TSCRIPT_WORSE
.BYTE 3,60
.LONG SND_WORSE
.BYTE 10,5
.BYTE 12,6
.BYTE 12,6
TSCRIPT_GETUP
.BYTE 5,60
.LONG SND_GETUP
.BYTE 12,5
.BYTE 11,5
.BYTE 8,4
.BYTE 10,4
.BYTE 11,1
TSCRIPT_MORE
.BYTE 4,60
.LONG SND_MORE
.BYTE 8,9
.BYTE 11,8
.BYTE 15,8
.BYTE 15,1
**************************************************************************
* *
* Fragger Scripts *
* *
**************************************************************************
**************************************************************************
* *
* F_CHUNK - Frag Func for MONDOR chunk. *
* A0 = Ptr to un-inserted object. *
* *
* Note: Frag funcs must preserve A8-A11 and all B-File regs. *
* *
**************************************************************************
F_CHUNK
; MOVE *A0(OZVEL),A14,L
; ABS A14
; NEG A14
; MOVE A14,*A0(OZVEL),L
MOVIM MCHUNK_COLL,*A0(OCVECT),L ;Set up chunk with Vectors
RETS
**************************************************************************
* *
* F_CHUNK_FINAL - Frag Func for MONDOR chunk participating in the final *
* Mondor explosion. *
* A0 = Ptr to un-inserted object. *
* *
* Note: Frag funcs must preserve A8-A11 and all B-File regs. *
* *
**************************************************************************
F_CHUNK_FINAL
MOVE *A0(OZVEL),A14,L
ABS A14
NEG A14
MOVE A14,*A0(OZVEL),L
MOVIM MCHUNK_COLL,*A0(OCVECT),L ;Set up chunk with Vectors
RETS
**************************************************************************
* *
* F_JOSH_CHUNK_UR *
* *
* Frag func for Josh shirt/suit chunks that go up and right. *
* *
* A0 = Ptr to un-inserted chunk *
* *
* Note: Frag funcs must preserve A8-A11 and all B-file regs. *
* *
**************************************************************************
F_JOSH_CHUNK_UR
MOVE *A0(OXVEL),A14,L
ABS A14
MOVE A14,*A0(OXVEL),L
JRUC F_JOSH_CHUNK
**************************************************************************
* *
* F_JOSH_CHUNK_UL *
* *
* Frag func for Josh shirt/suit chunks that go up and left. *
* *
* A0 = Ptr to un-inserted chunk *
* *
* Note: Frag funcs must preserve A8-A11 and all B-file regs. *
* *
**************************************************************************
F_JOSH_CHUNK_UL
MOVE *A0(OXVEL),A14,L
ABS A14
NEG A14
MOVE A14,*A0(OXVEL),L
JRUC F_JOSH_CHUNK
**************************************************************************
* *
* F_JOSH_CHUNK *
* *
* Frag func for Josh shirt/suit chunks. *
* *
* A0 = Ptr to un-inserted chunk *
* *
* Note: Frag funcs must preserve A8-A11 and all B-file regs. *
* *
**************************************************************************
F_JOSH_CHUNK
MOVE *A0(OYVEL),A14,L
ABS A14
NEG A14
MOVE A14,*A0(OYVEL),L
MOVIM JCHUNK_COLL,*A0(OCVECT),L ;Set up chunk with Vectors
RETS
**************************************************************************
* *
* JOSH CHUNK Collision Vector Table *
* *
* *
**************************************************************************
JCHUNK_COLL
WWL OID_GRND,0FFFFH,MCGC_DEL
WL 0,DUMCRETS
**************************************************************************
* *
* MONDOR CHUNK Collision Vector Table *
* *
* *
**************************************************************************
MCHUNK_COLL
WWL OID_GRND,0FFFFH,MCHUNK_GROUND_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* MCHUNK_GROUND_COLL - Collision routine for MONDOR CHUNK. *
* A8 = Ptr Chunk Object *
* *
**************************************************************************
MCHUNK_GROUND_COLL
MOVB *A8(OFLAGS),A14 ;Are we out of Range?
JRN MCGC_DEL ;BR = Yes
MOVE *A8(OYVEL),A14,L
MOVE A14,A1
SRA 1,A14 ;Knock off 25% for the bounce.
SUB A14,A1
CMPI 4000H,A1 ;Have we hit the minimum?
JRLE MCGC_DEL ;BR = Yes, delete the object.
; CMPI 40000H,A1 ;Will it bounce too high?
; JRLE MCGC_BOUNCE ;BR = No, let it bounce.
; MOVI 40000H,A1 ;Cap the rebound velocity
MCGC_BOUNCE
NEG A1 ;Turn it up
MOVE A1,*A8(OYVEL),L
RETS
MCGC_DEL
JAUC DELETE_OBJ
**************************************************************************
* *
* F_BLOOD_GLOB *
* *
* Fragment init function for blood (global). *
* *
* A0 = Ptr to un-inserted blood object. *
* *
**************************************************************************
F_BLOOD_GLOB
MOVIM BLOOD_DROP_CVECT,*A0(OCVECT),L ;Set up blood vectors
RETS
**************************************************************************
* *
* GLOOD_PAL *
* *
* Change blood objects palette to green. To be used with *
* create funcs. *
* *
* A0 = Ptr to uninserted object *
* *
**************************************************************************
GLOOD_PAL
MMTM SP,A0,A8
MOVE A0,A8
MOVI GLOOD_P,A0
CALLA CHANGE_PAL
MMFM SP,A0,A8
RETS
**************************************************************************
* *
* F_BLOOD *
* *
* Fragment init function for blood. *
* *
* A0 = Ptr to un-inserted blood object. *
* *
**************************************************************************
F_BLOOD
MOVE @VIOLENCE_LEVEL,A14,W
DEC A14
JRP FB_RED
CALLR GLOOD_PAL
FB_RED
MOVIM BLOOD_DROP_CVECT,*A0(OCVECT),L ;Set up blood vectors
RETS
**************************************************************************
* *
* F_BLOOD_FINAL *
* *
* Fragment init function for blood participating in the final *
* Mondor explosion. *
* *
* A0 = Ptr to un-inserted blood object. *
* *
**************************************************************************
F_BLOOD_FINAL
MOVE @VIOLENCE_LEVEL,A14,W
DEC A14
JRP FBF_RED
CALLR GLOOD_PAL
FBF_RED
MOVE *A0(OZVEL),A14,L
ABS A14
NEG A14
MOVE A14,*A0(OZVEL),L
MOVIM BLOOD_DROP_CVECT,*A0(OCVECT),L ;Set up blood vectors
RETS
**************************************************************************
* *
* F_CHUNK_UP *
* *
* Fragment init function for chunk to go straight up. *
* *
* A0 = Ptr to un-inserted chunk object. *
* *
**************************************************************************
F_CHUNK_UP
MOVIM MCHUNK_COLL,*A0(OCVECT),L ;Set up chunk with Vectors
JRUC F_UP_THE_BUTT
**************************************************************************
* *
* F_BLOOD_UP *
* *
* Fragment init function for blood to go straight up. *
* *
* A0 = Ptr to un-inserted blood object. *
* *
**************************************************************************
F_BLOOD_UP
MOVE @VIOLENCE_LEVEL,A14,W
DEC A14
JRP FBU_RED
CALLR GLOOD_PAL
FBU_RED
MOVIM BLOOD_DROP_CVECT,*A0(OCVECT),L ;Set up blood vectors
JRUC F_UP_THE_BUTT
F_UP_THE_BUTT
MMTM SP,A0,A1
MOVI -100000H,A0
MOVI -080000H,A1
CALLA RANGERND
MOVE A0,A14
MMFM SP,A0,A1
MOVE A14,*A0(OYVEL),L
MOVE *A0(OXVEL+16),A14,W
CMPK 1,A14
JRLE FBU_LOWX
MOVK 1,A14
JRUC FBU_FINISHX
FBU_LOWX
CMPI -1,A14
JRGE FBU_XOK
MOVK 1,A14
NEG A14
FBU_FINISHX
MOVE A14,*A0(OXVEL+16),W
FBU_XOK
RETS
**************************************************************************
* *
* F_CHUNK_RAIN *
* *
* Fragment init function for raining chunk. *
* *
* A0 = Ptr to un-inserted chunk object. *
* *
**************************************************************************
F_CHUNK_RAIN
MOVIM MCHUNK_COLL,*A0(OCVECT),L ;Set up chunk with Vectors
JRUC F_RAIN_MAN
**************************************************************************
* *
* F_BLOOD_RAIN *
* *
* Fragment init function for raining blood. *
* *
* A0 = Ptr to un-inserted blood object. *
* *
**************************************************************************
F_BLOOD_RAIN
MOVE @VIOLENCE_LEVEL,A14,W
DEC A14
JRP FBR_RED
CALLR GLOOD_PAL
FBR_RED
MOVIM BLOOD_DROP_CVECT,*A0(OCVECT),L ;Set up blood vectors
JRUC F_RAIN_MAN
F_RAIN_MAN
MMTM SP,A0,A1
MOVI -100000H,A0
MOVI -080000H,A1
CALLA RANGERND
MOVE A0,A14
MMFM SP,A0,A1
MOVE A14,*A0(OYVEL),L
CLRM *A0(OXVEL),L
RETS
**************************************************************************
* *
* Blood stuff -- OOO Scary! *
* *
**************************************************************************
**************************************************************************
* *
* A_INIT_BLOOD_DROP *
* *
* Anim Func to initialize the blood drop created by the spurt. *
* *
* A8 = Ptr to spurt about to become a drop. *
* *
**************************************************************************
A_INIT_BLOOD_DROP
MOVIM 20000H,*A8(OYVEL),L
MOVI 20000H,A1
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRNZ AIBD_ADDX
NEG A1
AIBD_ADDX
ADDRM A1,*A8(OXVEL),L
ORIM M_GCOLL,*A8(OFLAGS),W
MOVIM BLOOD_CVECT,*A8(OCVECT),L
RETS
**************************************************************************
* *
* A_BLOOD_SOUND *
* *
* Anim func to determine if we need to make a blood *
* splat sound. *
* *
* A8 = Ptr to object *
* AARG+,L = Table of sound calls *
* AARG+,W = # of sound calls in table *
* *
**************************************************************************
A_BLOOD_SOUND
MOVB *A8(OFLAGS),A14 ;Are we onscreen?
JANN A_TAB_SOUNDZ ;BR = Yes
RETS
**************************************************************************
* *
* MONDOR Blood Drop Collision Vector Table *
* *
* *
**************************************************************************
BLOOD_DROP_CVECT
; WWL OID_GRND,0FFFFH,BLOOD_DROP_GROUND_COLL
WWL OID_GRND,0FFFFH,BLOOD_GROUND_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* BLOOD_DROP_GROUND_COLL - Collision routine for MONDOR blood. *
* A8 = Ptr blood Object *
* *
**************************************************************************
BLOOD_DROP_GROUND_COLL
MOVIM DUMCOLL,*A8(OCVECT),L
ANDNIM M_GCOLL,*A8(OFLAGS),W
CALLA CLR_VEL
CLR A3
MOVI BLOOD_SPLAT_INIT,A5
JRUC SPAWN_BLOOD
**************************************************************************
* *
* MONDOR Blood spray Collision Vector Table *
* *
* *
**************************************************************************
BLOOD_CVECT
WWL OID_GRND,0FFFFH,BLOOD_GROUND_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* BLOOD_GROUND_COLL - Collision routine for MONDOR blood. *
* A8 = Ptr blood Object *
* *
**************************************************************************
BLOOD_GROUND_COLL
MOVIM DUMCOLL,*A8(OCVECT),L
ANDNIM M_GCOLL,*A8(OFLAGS),W
CALLA CLR_VEL
MOVE *A8(OPARTSXY),A5,L ;Must compensate for OPARTS
JRNZ BLOOD_SPRAY_DROP
CLR A3
JRUC BLOOD_DO_SPLAT
BLOOD_SPRAY_DROP
MOVI [18,-130],A3 ;This is the real offset
MOVE *A8(OCTRL),A14
BTST B_FLIPH,A14 ;Is this blood flipped?
JRZ BGC_NOXFLIP ;BR = No, do nothing
NEGX A5
BGC_NOXFLIP
SUBXY A5,A3 ;Offset for OPARTS
BLOOD_DO_SPLAT
MOVE *A8(OPAL),A0,W
CALLA GET_PALID
CMPI P_BLOODGR,A0
JRNE BGC_NORMAL
MOVI GOO_SPLAT_INIT,A5
JRUC SPAWN_BLOOD
BGC_NORMAL
MOVI BLOOD_SPLAT_INIT,A5
JRUC SPAWN_BLOOD
BLOOD_SPLAT_INIT
.LONG BLOOD_SPLAT_1,DUMCOLL
.WORD OID_JUNK,DMAWNZ,M_DEAD|M_NOPARTANI|M_OPARTSXY,-1
.LONG C_GREEN_STRTANIM,GLOOD_P,ANIM_BLOOD_SPLAT
GOO_SPLAT_INIT
.LONG GOO_SPLAT_1,DUMCOLL
.WORD OID_JUNK,DMAWNZ,M_DEAD|M_NOPARTANI|M_OPARTSXY,-1
.LONG C_STRTANIM,ANIM_BLOOD_SPLAT
ANIM_BLOOD_SPLAT
LWL BLOOD_SPLAT_1,1|AFunc,A_HEAD_OBJOFF
LWLLW 1,2|AFunc,A_BLOOD_SOUND+3,TAB_BLOOD_SPLAT,3
LW BLOOD_SPLAT_2,3
LW BLOOD_SPLAT_3,3
LW BLOOD_SPLAT_4,3
LW BLOOD_SPLAT_5,3
LW BLOOD_SPLAT_6,3
LWL 1,1|AFunc,A_DELETE_MULTI
*
*Table for random pick of single chunks
*
;SINGLE_CHUNK_TAB
; .LONG MONDOR_CHUNK_A,MONDOR_CHUNK_B,MONDOR_CHUNK_C
*
*Table for random pick of multi chunks
*
MULTI_CHUNK_TAB
.LONG MONDOR_CHUNK_MULTI_A,MONDOR_CHUNK_MULTI_B,MONDOR_CHUNK_MULTI_C
.LONG MONDOR_CHUNK_MULTI_D
*
*Give a little piece of Mondor
*
;MONDOR_CHUNK_A
; .long CHUNK_A,F_CHUNK
; .word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
; .long 0
MONDOR_CHUNK_MULTI_A
.long CHUNK_A,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+6*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_B,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_C,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long 0
;MONDOR_CHUNK_B
; .long CHUNK_B,F_CHUNK
; .word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
; .long 0
MONDOR_CHUNK_MULTI_B
.long CHUNK_B,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+6*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_D,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_C,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long 0
;MONDOR_CHUNK_C
; .long CHUNK_C,F_CHUNK
; .word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
; .long 0
MONDOR_CHUNK_MULTI_C
.long CHUNK_C,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+6*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_A,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_D,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long 0
MONDOR_CHUNK_MULTI_D
.long CHUNK_D,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+6*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_B,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_A,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long 0
*
*Piece of Mondor's shirt
*
MONDOR_SHIRT_MULTI
.long CHUNK_SHIRT,F_CHUNK
.word OID_JUNK,2*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_D,F_CHUNK
.word OID_JUNK,3*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+3*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_SHIRT,F_CHUNK
.word OID_JUNK,2*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_C,F_CHUNK
.word OID_JUNK,3*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+3*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_SHIRT,F_CHUNK
.word OID_JUNK,2*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long 0
*
*Piece of Mondor's jeans
*
MONDOR_JEANS_MULTI
.long CHUNK_JEANS,F_CHUNK
.word OID_JUNK,2*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_D,F_CHUNK
.word OID_JUNK,3*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+3*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_JEANS,F_CHUNK
.word OID_JUNK,2*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_A,F_CHUNK
.word OID_JUNK,3*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+3*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long CHUNK_JEANS,F_CHUNK
.word OID_JUNK,2*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,8*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP+FRGRND
.long 0
*
*Pieces of Josh's dress shirt
*
FRAG_JOSH_SHIRT
.long CHUNK_JOSH_SUIT,F_JOSH_CHUNK_UL
.word OID_JUNK,7*800H+1*40H+FRGPAL+FRGGCOL
.long 0
*
*Pieces of Josh's suit (left and up)
*
FRAG_JOSH_SUIT_UL
.long CHUNK_JOSH_SUIT,F_JOSH_CHUNK_UL
.word OID_JUNK,7*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_JOSH_SHIRT,F_JOSH_CHUNK
.word OID_JUNK,2*800H+1*40H+FRGPAL+FRGGCOL
.long 0
*
*Pieces of Josh's suit (right and up)
*
FRAG_JOSH_SUIT_UR
.long CHUNK_JOSH_SUIT,F_JOSH_CHUNK_UR
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_JOSH_SHIRT,F_JOSH_CHUNK
.word OID_JUNK,2*800H+1*40H+FRGPAL+FRGGCOL
.long 0
CHUNK_A
LWLL CHUNK_A_1,1|AFunc,A_GREEN_IF_NEC+2,CHIN_GRN
LWLW 1,1|AFunc,A_INIT_AnimSLP+1,1
CHUNK_A_LOOP
LW CHUNK_A_2,0
LW CHUNK_A_3,0
LW CHUNK_A_4,0
LW CHUNK_A_5,0
LW CHUNK_A_6,0
LW CHUNK_A_7,0
LWLW CHUNK_A_8,0|AFunc,A_INC_AnimSLP+1,5
LWLL CHUNK_A_1,0|AFunc,A_CHUNK_ONSCREEN+2,CHUNK_A_LOOP
LWL 1,1|AFunc,DELETE_OBJ
CHUNK_B
LWLL CHUNK_B_1,1|AFunc,A_GREEN_IF_NEC+2,CHIN_GRN
LWLW 1,1|AFunc,A_INIT_AnimSLP+1,1
CHUNK_B_LOOP
LW CHUNK_B_2,0
LW CHUNK_B_3,0
LW CHUNK_B_4,0
LW CHUNK_B_5,0
LW CHUNK_B_6,0
LW CHUNK_B_7,0
LWLW CHUNK_B_8,0|AFunc,A_INC_AnimSLP+1,5
LWLL CHUNK_B_1,0|AFunc,A_CHUNK_ONSCREEN+2,CHUNK_B_LOOP
LWL 1,1|AFunc,DELETE_OBJ
CHUNK_C
LWLL CHUNK_C_1,1|AFunc,A_GREEN_IF_NEC+2,CHIN_GRN
LWLW 1,1|AFunc,A_INIT_AnimSLP+1,1
CHUNK_C_LOOP
LW CHUNK_C_2,0
LW CHUNK_C_3,0
LW CHUNK_C_4,0
LW CHUNK_C_5,0
LW CHUNK_C_6,0
LW CHUNK_C_7,0
LWLW CHUNK_C_8,0|AFunc,A_INC_AnimSLP+1,5
LWLL CHUNK_C_1,0|AFunc,A_CHUNK_ONSCREEN+2,CHUNK_C_LOOP
LWL 1,1|AFunc,DELETE_OBJ
CHUNK_D
LWLL CHNK1,1|AFunc,A_GREEN_IF_NEC+2,CHIN_GRN
LWLW 1,1|AFunc,A_INIT_AnimSLP+1,1
CHUNK_D_LOOP
LW CHNK2,0
LW CHNK3,0
LW CHNK4,0
LW CHNK5,0
LW CHNK6,0
LW CHNK7,0
LW CHNK8,0
LWLW CHNK9,0|AFunc,A_INC_AnimSLP+1,5
LWLL CHNK1,0|AFunc,A_CHUNK_ONSCREEN+2,CHUNK_D_LOOP
LWL 1,1|AFunc,DELETE_OBJ
CHUNK_JOSH_SHIRT
LWLW J_SHRT,1|AFunc,A_Set_AnimLoop+1,3
LWLL 1,1|AFunc,A_AnimFrm+2,CHUNK_JOSH_LOOP
CHUNK_JOSH_SUIT
LWLW SHRT1,1|AFunc,A_Set_AnimLoop+1,3
CHUNK_JOSH_LOOP
LW SHRT2,4
LW SHRT3,4
LW SHRT4,4
LW SHRT5,4
LW SHRT6,4
LW SHRT7,4
LW SHRT8,4
LW SHRT9,4
LWLL SHRT1,4|AFunc,A_Anim_DSJ+2,CHUNK_JOSH_LOOP
LWL 1,1|AFunc,DELETE_OBJ
CHUNK_JEANS
; LWLW JEANS,1|AFunc,A_INIT_AnimSLP+1,1
; LWLL 1,1|AFunc,A_AnimFrm+2,CHUNK_SHIRT_LOOP
CHUNK_SHIRT
LWLW SHRT1,1|AFunc,A_INIT_AnimSLP+1,1
CHUNK_SHIRT_LOOP
LW SHRT2,0
LW SHRT3,0
LW SHRT4,0
LW SHRT5,0
LW SHRT6,0
LW SHRT7,0
LW SHRT8,0
LWLW SHRT9,0|AFunc,A_INC_AnimSLP+1,5
LWLL SHRT1,0|AFunc,A_CHUNK_ONSCREEN+2,CHUNK_SHIRT_LOOP
LWL 1,1|AFunc,DELETE_OBJ
CHUNK_BLOOD
LW BLOOD_DROP,20
LWLL 1,1|AFunc,A_CHUNK_ONSCREEN+2,CHUNK_BLOOD
LWL 1,1|AFunc,DELETE_OBJ
*
*Generic explosion show
*
FRAG_EXPLOSION
.long PART_EXPLOSION,0
.word OID_JUNK,3*800H+5*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,0
.word OID_JUNK,3*800H+15*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,0
.word OID_JUNK,3*800H+15*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,0
.word OID_JUNK,3*800H+1*40H+FRGPAL+FRGNOFLY
.long 0
FRAG_EXPLOSION_SMALL
.long PART_EXPLOSION,0
.word OID_JUNK,1*800H+5*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,0
.word OID_JUNK,1*800H+5*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,0
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGNOFLY
.long 0
FRAG_EXPLOSION_ONE
.long PART_EXPLOSION,0
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGNOFLY
.long 0
BUS_EXPLOSION
.long PART_EXPLOSION,F_EXPLOSION_OUT
.word OID_JUNK,3*800H+5*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,F_EXPLOSION_OUT
.word OID_JUNK,3*800H+15*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,F_EXPLOSION_OUT
.word OID_JUNK,3*800H+15*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,F_EXPLOSION_OUT
.word OID_JUNK,3*800H+1*40H+FRGPAL+FRGNOFLY+FRGBOG
.long 0
BUS_EXPLOSION_SMALL
.long PART_EXPLOSION,F_EXPLOSION_OUT_2X
.word OID_JUNK,1*800H+5*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,F_EXPLOSION_OUT_2X
.word OID_JUNK,1*800H+5*40H+FRGPAL+FRGNOFLY
.long PART_EXPLOSION,F_EXPLOSION_OUT_2X
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGNOFLY+FRGBOG
.long 0
PART_EXPLOSION
LWLL FHKEXPLOB1,6|AFunc,A_SOUND+2,SND_PART_EXPLODE
LW FHKEXPLOB2,8
LW FHKEXPLOB3,6
LW FHKEXPLOB4,4
LW FHKEXPLOB5,4
LW FHKEXPLOB6,3
LW FHKEXPLOB7,3
LW FHKEXPLOB8,2
LW FHKEXPLOB9,2
LW FHKEXPLOB10,2
LW FHKEXPLOB11,2
LWL 1,1|AFunc,DELETE_OBJ
*
*Explosion sometimes used by BLOW_PART
*
EXPLO_BLOW_INIT
.LONG FHKEXPLOB1
.WORD DMAWNZ, 0, OM_ANIM|OM_DUMCOLL
.LONG PART_EXPLOSION
*
*The final blast
*
FRAG_FINAL_EXPLOSION
.long PART_EXPLOSION,F_EXPLOSION_OUT
.word OID_JUNK,10*800H+1*40H+FRGPAL+FRGNOFLY
.long CHUNK_BLOOD,F_BLOOD_FINAL
.word OID_JUNK,15*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long PART_EXPLOSION,F_EXPLOSION_OUT
.word OID_JUNK,10*800H+1*40H+FRGPAL+FRGNOFLY
.long CHUNK_A,F_CHUNK_FINAL
.word OID_JUNK,5*800H+0*40H+FRGPAL+FRGGCOL
.long CHUNK_B,F_CHUNK_FINAL
.word OID_JUNK,5*800H+0*40H+FRGPAL+FRGGCOL
.long CHUNK_D,F_CHUNK_FINAL
.word OID_JUNK,5*800H+5*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,20*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long PART_EXPLOSION,F_EXPLOSION_OUT
.word OID_JUNK,10*800H+1*40H+FRGPAL+FRGNOFLY
.long CHUNK_SHIRT,F_CHUNK_FINAL
.word OID_JUNK,10*800H+0*40H+FRGPAL+FRGGCOL
.long CHUNK_C,F_CHUNK
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_UP
.word OID_JUNK,10*800H+0*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,10*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_A,F_CHUNK
.word OID_JUNK,5*800H+0*40H+FRGPAL+FRGGCOL
.long CHUNK_B,F_CHUNK_UP
.word OID_JUNK,5*800H+0*40H+FRGPAL+FRGGCOL
.long CHUNK_D,F_CHUNK_UP
.word OID_JUNK,5*800H+5*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_UP
.word OID_JUNK,10*800H+0*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD
.word OID_JUNK,10*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_JEANS,F_CHUNK
.word OID_JUNK,10*800H+0*40H+FRGPAL+FRGGCOL
.long CHUNK_A,F_CHUNK_UP
.word OID_JUNK,5*800H+15*40H+FRGPAL+FRGGCOL
; .long CHUNK_BLOOD,F_BLOOD_UP
; .word OID_JUNK,10*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD_UP
; .word OID_JUNK,10*800H+0*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD
; .word OID_JUNK,5*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD_UP
; .word OID_JUNK,10*800H+0*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD
; .word OID_JUNK,5*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD_UP
; .word OID_JUNK,10*800H+0*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD
; .word OID_JUNK,5*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD
; .word OID_JUNK,5*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD_UP
; .word OID_JUNK,10*800H+0*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD_UP
; .word OID_JUNK,10*800H+5*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_B,F_CHUNK_FINAL
; .word OID_JUNK,5*800H+0*40H+FRGPAL+FRGGCOL
; .long CHUNK_C,F_CHUNK_FINAL
; .word OID_JUNK,5*800H+0*40H+FRGPAL+FRGGCOL
; .long CHUNK_D,F_CHUNK_FINAL
; .word OID_JUNK,5*800H+5*40H+FRGPAL+FRGGCOL
; .long CHUNK_BLOOD,F_BLOOD_FINAL
; .word OID_JUNK,20*800H+1*40H+FRGPAL+FRGGCOL+FRGNOFLP
.LONG 0
*
*The final blast aftermath
*
FRAG_FINAL_RAIN
*Pause
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
*End of pause
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,10*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_A,F_CHUNK_RAIN
.word OID_JUNK,3*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_JEANS,F_CHUNK_RAIN
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_B,F_CHUNK_RAIN
.word OID_JUNK,3*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_SHIRT,F_CHUNK_RAIN
.word OID_JUNK,5*800H+1*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_C,F_CHUNK_RAIN
.word OID_JUNK,3*800H+10*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_B,F_CHUNK_RAIN
.word OID_JUNK,3*800H+10*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_SHIRT,F_CHUNK_RAIN
.word OID_JUNK,5*800H+10*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_A,F_CHUNK_RAIN
.word OID_JUNK,3*800H+10*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+15*40H+FRGPAL+FRGGCOL+FRGNOFLP
*Pause
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
; .long CHUNK_BLOOD,F_BLOOD_RAIN
; .word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
*End Pause
.long CHUNK_A,F_CHUNK_RAIN
.word OID_JUNK,3*800H+10*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,10*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,10*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,10*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,10*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_B,F_CHUNK_RAIN
.word OID_JUNK,3*800H+10*40H+FRGPAL+FRGGCOL
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,15*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,10*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,10*800H+10*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,10*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
*Pause
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
*End Pause
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,3*800H+20*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,2*800H+20*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,1*800H+20*40H+FRGPAL+FRGGCOL+FRGNOFLP
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,1*800H+20*40H+FRGPAL+FRGGCOL+FRGNOFLP
*Pause
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,0*800H+30*40H+FRGPAL+FRGGCOL+FRGNOFLP
*End Pause
.long CHUNK_BLOOD,F_BLOOD_RAIN
.word OID_JUNK,1*800H+20*40H+FRGPAL+FRGGCOL+FRGNOFLP
.LONG 0
*
*Script to make the gun fly from Mondor's hand
*
FRAG_GUN_FLY
.long GUN_FLY,F_GUN_CHUNK
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
.LONG 0
**************************************************************************
* *
* F_GUN_CHUNK - Frag Func for MONDOR gun. *
* A0 = Ptr to un-inserted object. *
* *
* Note: Frag funcs must preserve A8-A11 and all B-File regs. *
* *
**************************************************************************
F_GUN_CHUNK
MOVE *A0(OZVEL),A14,L
ABS A14
NEG A14
MOVE A14,*A0(OZVEL),L
MOVE *A0(OYVEL),A14,L
ABS A14
ADDI 20000H,A14
NEG A14
MOVE A14,*A0(OYVEL),L
; CLR A14
; MOVE A14,*A0(OXVEL),L
MOVIM GUN_CHUNK_COLL,*A0(OCVECT),L ;Set up chunk with Vectors
RETS
GUN_CHUNK_COLL
WWL OID_GRND,0FFFFH,GUN_CHUNK_GROUND_COLL
WL 0,DUMCRETS
GUN_CHUNK_GROUND_COLL
MOVB *A8(OFLAGS),A14 ;Are we out of Range?
JRN GCGC_DEL ;BR = Yes
SOUNDZ SND_GUN_BOUNCE
; MOVE *A8(OYVEL),A14,L
; MOVE A14,A1
; SRA 1,A14 ;Knock off 25% for the bounce.
; SUB A14,A1
MOVE *A8(OYVEL),A1,L
SRA 2,A1
CMPI 4000H,A1 ;Have we hit the minimum?
JRLE GCGC_DEL ;BR = Yes, delete the object.
CMPI 24000H,A1 ;Will it bounce too high?
JRLE GCGC_BOUNCE ;BR = No, let it bounce.
MOVI 24000H,A1 ;Cap the rebound velocity
GCGC_BOUNCE
NEG A1 ;Turn it up
MOVE A1,*A8(OYVEL),L
RETS
GCGC_DEL
JAUC DELETE_OBJ
GUN_FLY
LWLW GUNF_1,1|AFunc,A_INIT_AnimSLP+1,1
GUN_FLY_LOOP
LW GUNF_2,0
LW GUNF_3,0
LW GUNF_4,0
LW GUNF_5,0
LW GUNF_6,0
LW GUNF_7,0
LWLW GUNF_8,0|AFunc,A_INC_AnimSLP+1,5
LWLL GUNF_1,0|AFunc,A_CHUNK_ONSCREEN+2,GUN_FLY_LOOP
LWL 1,1|AFunc,DELETE_OBJ
*
* Green palette for skin pieces
*
CHIN_GRN:
.word 32
.word 00000h,00c61h,018a4h,001c0h,001e0h,00100h,02d27h,03989h
.word 00200h,003e0h,045cbh,002a0h,043e5h,05a4dh,066afh,05563h
.word 072d1h,002e1h,035c3h,014c1h,00129h,02962h,07f53h,04645h
.word 00120h,03147h,03568h,03e06h,039a6h,02d81h,03160h,01d01h
.END