revolution-x/GXHELI.ASM

7137 lines
168 KiB
NASM
Raw Normal View History

2021-04-06 15:02:48 -07:00
.MLIB "GXMACS.LIB"
.FILE "GXHELI.ASM"
.TITLE " <<< REVOLUTION X -- HELICOPTER ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "GXENEMY.INC"
.INCLUDE "GXHELI.H"
.INCLUDE "GXHELI2.H"
.INCLUDE "GXCONTRL.H"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GXHELI.TBL"
* SYMBOLS IN HERE
.DEF SIDE_COPTER_INTRO_INIT
.DEF MAKE_FRONT_COPTER_PROC, MAKE_SIDE_COPTER_PROC
.DEF MAKE_COPTER_ONTOP_PROC, DELETE_COPTER_FRAME
.DEF SCROLL_HOVER_PROC, SND_COPTER_FULL
.DEF SIDE_COPTER_INTRO_COLLISIONS, PICK_ENTRY2
.DEF GET_PCENTRY
.BSS COPTER_OBJ,32 ;FRONT HELICOPTER OBJECT ADDRESS
.BSS COPTER_OBJ2,32 ;SIDE HELICOPTER OBJECT ADDRESS
.BSS LAST_ROCKET,32 ;ROCKET FARTHEST AWAY IN Z
.BSS COPTER_SND,16 ;COPTER SOUND CONTROL
.BSS WING_COUNT,16 ;NUMBER OF WINGS LEFT
.BSS MISSLETIME_TABLE,32 ;TIME OF PLAYER MISSLE TIMES
.BSS ROW_TIME,32 ;TIME OF LAST HIT IN A ROW
.BSS ROW_HITS,16 ;NUMBER OF HITS IN A ROW
.BSS DESTROYING_PARTS,16 ;COUNT OF DESTROYING PARTS
.BSS THREAT_SPEECH_FLAGS,32 ;THREAT SPEECH FLAGS
.BSS DAMAGE_SPEECH_FLAGS,32 ;DAMAGE SPEECH FLAGS
; .BSS FRED_FLINTSTONE,16 ;ALIGN TO 32 BITS
.TEXT
.EVEN
**************************************************************************
* *
* COPTER_SPARK - SPARK ON COPTER *
* *
* A2 = PLAYER *
* A8 = OBJECT *
* *
**************************************************************************
COPTER_SPARK
PUSH B0
MOVI INIT_SPARK,B0
CALLA PASTE_ON_DAMAGE_OFFSET
PULLQ B0
RETS
;**************************************************************************
;* *
;* CCHECK *
;* *
;**************************************************************************
;
;CCHECK
; MOVE *A8(OPART1),A14,L
; JRZ $
; MOVE *A14(OHZFLYTO),A14,L
; JRNZ $
; RETS
**************************************************************************
* *
* SCROLL_HOVER_PROC - SIMULATE HOVERING IN Y *
* *
* PASS: *
* NUTIN' *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
SCROLL_HOVER_PROC
; MOVE @YBASE,A8,L
MOVI 07528000H,A8 ;Y MIDPOINT
MOVI 0800H,A9 ;Y ACCEL SPEED
MOVI 010000H,A10 ;MAX Y SPEED
MOVE A10,A11
NEG A11
; MOVE A11,@YSCROLL,L ;SET INITIAL UP VELOCITY
CLR A14
MOVE A14,@YSCROLL,L ;SET INITIAL UP VELOCITY
SHP_LUPE
MOVE A9,@YSACCEL,L ;SET DOWN ACCEL
SHP_GOIN_DOWN
SLEEP 1
MOVE @YSCROLL,A14,L
CMP A10,A14
JRLT SHP_GOIN_DOWN ;BR=WE HAVEN'T REACHED THE MIDDL
MOVE A9,A14
NEG A14
MOVE A14,@YSACCEL,L ;SET UP ACCEL
SHP_GOIN_UP
SLEEP 1
MOVE @YSCROLL,A14,L
CMP A11,A14
JRGT SHP_GOIN_UP ;BR=WE HAVEN'T REACHED THE MIDDL
MOVE A8,@YBASE,L ;ADJUST Y MIDPOINT IF WE BOGGED
MOVE @SCROLL_FLAG,A14,L
JRZ SHP_LUPE ;BR=KEEP ON HOVERIN'
CLR A14 ;STOP Y MOTION
MOVE A14,@YSCROLL,L
MOVE A14,@YSACCEL,L
MOVE A14,@SCROLL_FLAG,L ;FLAG DONE
DIE
**************************************************************************
* *
* MAKE_COPTER_ONTOP_PROC - MAKE THE HELICOPTER ONTOP OF THE BUILDING *
* AND THE FRAME *
* *
**************************************************************************
ONTOP_ROOF_XBASE EQU 03600000H
GROUP_OFFSET EQU 0680000H
PACK_OFFSET EQU 01C0000H
ONTOP_PACK_TABLE
.LONG ONTOP_ROOF_XBASE-GROUP_OFFSET-PACK_OFFSET
.LONG ONTOP_ROOF_XBASE-GROUP_OFFSET
.LONG ONTOP_ROOF_XBASE-GROUP_OFFSET+PACK_OFFSET
.LONG ONTOP_ROOF_XBASE-PACK_OFFSET
.LONG ONTOP_ROOF_XBASE
.LONG ONTOP_ROOF_XBASE+PACK_OFFSET
.LONG ONTOP_ROOF_XBASE+GROUP_OFFSET-PACK_OFFSET
.LONG ONTOP_ROOF_XBASE+GROUP_OFFSET
.LONG ONTOP_ROOF_XBASE+GROUP_OFFSET+PACK_OFFSET
MAKE_COPTER_ONTOP_PROC
.if BILL
JRUC MCO_TEST
.endif
MOVK 9,A0 ;PUT WEAPON CRATES ON TOP
MOVI ONTOP_PACK_TABLE,A1
MOVI -03E86H,A9 ;UNIVERSE Z
MOVI -021D8000H,A10 ;UNIVERSE Y
MCOP_PUT_PACKS
MOVE *A1+,A11,L
CALLA PUT_PROCK_TIMED
DSJ A0,MCOP_PUT_PACKS ;BR=ANOTHER PACK
; MOVI COPTER_ONTOP_INIT,B0 ;COPTER ON TOP OF BUILDING
MOVI SIDE_COPTER_ONTOP_INIT,B0
CALLA MULTIMAKE
LOCKON Z
CLR A14
MOVE A14,*A8(OSTUTTER),W
MOVI 03578000H,A1
MOVI -02618000H-0100000H,A2
MOVI 0B17AH,A3
CALLA SET_ANIPU
MOVI 0400040H,A9
MCO_LUPE
SLEEP 1
MOVE *A8(OSCALE),A14,L
CMP A9,A14
JRGE MCO_LUPE
; SLEEP 4
; MOVE *A8(OZVAL),A14,L
; MOVE @ZBASE,A0,L
; SUB A0,A14 ;CONVERT TO WORLD
; CMP A9,A14
; JRGE MCO_LUPE ;BR=NOT OFF SCREEN JUST YET
CALLA DELETE_OBJ
MCO_WAIT
SLEEP 1
MOVE @ZSCROLL,A14,L
JRNZ MCO_WAIT ;BR=WE'RE STILL MOVIN'
MCO_TEST
MOVI [SCRTOP+SCORE_HEIGHT+22,SCRLFT],A14
MOVE A14,@SCRNTL,L
CALLA INIT_UCHECK_TBL
MOVI INSIDE_COPTER_INIT,B0 ;INSIDE THE COPTER FRAME
CALLA MULTIMAKE
; LOCKON Z
MOVE *A8(OPAL),A1,W
MOVI [32,-1],A3
MOVI [DMAWNZ,0],A5
MOVI FRAMETOP,A14
CALLA QDMA2 ; OUTPUT THE SUCKER
MOVI [32,200],A3
MOVI [DMAWNZ|M_FLIPH,0],A5
MOVI FRAMETOP,A14
CALLA QDMA2 ; OUTPUT THE SUCKER
DIE
**************************************************************************
* *
* DELETE_COPTER_FRAME *
* *
**************************************************************************
DELETE_COPTER_FRAME
MOVI FGLIST,A0
MOVE A0,A8
MOVI OID_COPTER,A1
MOVK 6,A2
DCF_LUPE
MOVE *A0,A0,L
DCF_CHECK
CMP A0,A8
JREQ DCF_DONE
MOVE *A0(OID),A14,W
CMP A1,A14
JRNE DCF_LUPE ;BR=NOT A FRAME PIECE
MOVE *A0,A3,L ;SAVE NEXT OBJECT
CALLA DELOBJ
DEC A2
JRZ DCF_DONE ;BR=NO MORE FRAME PIECES
MOVE A3,A0 ;CONTINUE WITH NEXT OBJECT
JRUC DCF_CHECK
DCF_DONE
MOVI SCRNST,A14
MOVE A14,@SCRNTL,L
CALLA INIT_UCHECK_TBL
MOVK 1,A14
MOVE A14,@GUNS_OFF,W
ALLPLYR PCURSOR_OFF
RETS
INSIDE_COPTER_INIT
.byte 6, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long FRAMEPAL ;IMGPAL
.word OID_COPTER, OM_SPOS|OM_INSERT
.LONG [54-22,200], -06FFF0000H
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW FRAMECORN, DMAWNZ, M_SCRNOBJ, 0, 0
LWWWW FRAMESIDE, DMAWNZ, M_SCRNOBJ, 0, 0
LWWWW FRAMESIDE, DMAWNZ, M_SCRNOBJ, 0, OM_OPARTS
.LONG [80,0]
LWWWW FRAMECORN, DMAWNZ|M_FLIPH, M_SCRNOBJ, 0, 0
LWWWW FRAMESIDE, DMAWNZ|M_FLIPH, M_SCRNOBJ, 0, 0
LWWWW FRAMESIDE, DMAWNZ|M_FLIPH, M_SCRNOBJ, 0, OM_OPARTS
.LONG [80,0]
**************************************************************************
**************************************************************************
**************************************************************************
SND_BELLY_GUN
.WORD 0F304H,82,0A108H,0
SND_GAT_GUN
.WORD 0F306H,18,0A102H,0
;SND_FUSE_GUN
; .WORD 0F304H,48,0A10BH,0
;SND_NOSE_GUN
; .WORD 0F304H,82,0A102H,0
SND_CLANG_LOW
.word 0F308H,30,0A111H,0
SND_CLANG_HIGH
.word 0F308H,30,0A123H,0
SND_CLANG_GEAR
.word 0F308H,34,0A191H,0
SND_RICOCHET
.word 0F309H,63,0A1A3H,0
SND_ROCKET_LAUNCH
.WORD 0F30CH,94,0A3B0H,0
SND_WINDOW_CRACK
.WORD 0E310H,47,0A32BH,0
SND_GAT_TURN
.WORD 0F318H,21,0A1F7H,0
SND_BELLY_TURN
.WORD 0F318H,22,0A1FAH,0
SND_GRILL_OPENCLOSE
.WORD 0F318H,11,0A42FH,0
SND_THUD
.word 0F320H,69,0A14AH,0
SND_METALLIC_FUCKUP
.word 0F320H,60,0A147H,0
SND_WINDOW_BREAK
.WORD 0F321H,70,0A32EH,0
;FROM GXMONDR2.ASM
;SND_FIRE_HISS
; .WORD 0F340H,36,0A396H,0 ;FireBall hissing
;SND_FB_HIT_SCRN
; .WORD 0F341H,60,0A393H,0 ;FireBall hits the screen
;SND_PROJECTILE_FLY
; .WORD 0F141H,62,0A1A1H,0 ;Projectile gets blown back
;SND_FIRE_BALL
; .WORD 0F342H,44,08292H,0 ;FireBall being launched
SND_ROCKET_HIT
.WORD 0F341H,60,0A390H,0 ;ROCKET HITS SCREEN
SND_EXPLO_COPTER
.WORD 0F343H,60,0A38DH,0
SND_STEP_OUT
.word 0F250H,134,082BFH,0
SND_YOU_HAVE_DIS
.word 0F250H,168,082C0H,0
SND_LAND_OR
.word 0F250H,180,082C1H,0
SND_THIS_IS
.word 0F250H,111,082C2H,180,082C1H,0
SND_YOU_ARE_ILL
.word 0F250H,198,082C3H,0
SND_CAPTURE
.WORD 0F250H,102,082CDH,0
SND_REPEAT_CAPTURE
.WORD 0F250H,50,082CEH,102,082CDH,0
SND_TURN
.WORD 0F250H,74,082CFH,0
SND_REPEAT_TURN
.WORD 0F250H,50,082CEH,74,082CFH,0
SND_GIVE
.WORD 0F250H,73,082D0H,0
SND_REPEAT_GIVE
.WORD 0F250H,50,082CEH,73,082D0H,0
SND_SURRENDER
.WORD 0F250H,81,082D1H,0
SND_REPEAT_SURRENDER
.WORD 0F250H,50,082CEH,81,082D1H,0
SND_MAKE_IT_EASY
.WORD 0F250H,97,082D2H,0
SND_REPEAT_MAKE_IT_EASY
.WORD 0F250H,50,082CEH,97,082D2H,0
SND_YOU_HAVE_NO
.WORD 0F250H,91,082D3H,0
SND_REPEAT_YOU_HAVE_NO
.WORD 0F250H,50,082CEH,91,082D3H,0
SND_NO_ESCAPE
.WORD 0F250H,113,082D4H,0
SND_REPEAT_NO_ESCAPE
.WORD 0F250H,50,082CEH,113,082D4H,0
SND_WHAT_THE
.word 0F251H,63,082D5H,0
SND_SHES_BREAKIN_UP
.word 0F251H,62,082D6H,0
SND_NOT_GOOD
.word 0F251H,49,082D7H,0
SND_WERE_GOIN_DOWN
.word 0F252H,78,082D8H,0
SND_FINAL_EXPLO_COPTER1
.WORD 0E1F0H,88,08303H,0 ;Final explosion sound, channel 1
SND_FINAL_EXPLO_COPTER2
.WORD 0E2F0H,40,0838FH,0 ;Final explosion sound, channel 2
SND_FINAL_EXPLO_COPTER3
.WORD 0E3F0H,88,08390H,0 ;Final explosion sound, channel 3
SND_COPTER_FULL
.word 0F3F0H,60*60*5,0830EH,0
THREAT_SPEECHES EQU 7
THREAT_SPEECH_TABLE
.LONG SND_CAPTURE, SND_TURN, SND_GIVE, SND_SURRENDER
.LONG SND_MAKE_IT_EASY, SND_YOU_HAVE_NO, SND_NO_ESCAPE
DAMAGE_SPEECHES EQU 3
DAMAGE_SPEECH_TABLE
.LONG SND_WHAT_THE, SND_SHES_BREAKIN_UP, SND_NOT_GOOD
**************************************************************************
* *
* PICK_ENTRY2 - PICK ENTRY OUT OF A TABLE *
* *
* PASS: *
* A0 = NUMBER OF TABLE ENTRIES (NEGATIVE IF TABLE OF LONG WORDS) *
* A1 = ENTRY PICKED FLAGS *
* A3 = ROM TABLE *
* *
* RETURN: *
* A0 = NUMBER OF TABLE ENTRIES LEFT (Z SET IF LAST) *
* A1 = UPDATED ENTRY PICKED FLAGS *
* A4 = ENTRY PICKED *
* *
**************************************************************************
PICK_ENTRY2
MMTM SP,A0,A2
MOVE A0,A4
ABS A0
CALLA RAND0 ;GET RANDOM INDEX
MOVI -1,A2
MOVE A2,A14
PE2_FIND
INC A2 ;NEXT TABLE INDEX
BTST A2,A1
JRNZ PE2_FIND ;BR=ENTRY ALREADY PICKED
INC A14 ;NEXT ENTRY COUNT
CMP A0,A14
JRNE PE2_FIND ;BR=NOT THE PICKED ENTRY
MOVK 1,A14
SLL A2,A14
OR A14,A1 ;SET ENTRY PICKED FLAG
MOVE A4,A4
JRN PE2_LONG ;BR=GET LONG ENTRY
SLL 4,A2
ADD A3,A2
MOVE *A2,A4,W ;GET WORLD ENTRY
MMFM SP,A0,A2
JRUC PE2_DONE
PE2_LONG
SLL 5,A2
ADD A3,A2
MOVE *A2,A4,L
MMFM SP,A0,A2
ABS A0
PE2_DONE
DEC A0 ;ONE LESS NUMBER OF ENTRIES
RETS
**************************************************************************
* *
* MAKE_DAMAGE_SPEECH - MAKE RANDOM COPTER DAMAGE SPEECH *
* *
* PASS: *
* NUTIN' *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
MAKE_DAMAGE_SPEECH
MMTM SP,A0,A1,A3,A4,A5
MOVE @DAMAGE_SPEECH_FLAGS,A1,L
MOVE A1,A0
SRL 16,A0
NEG A0 ;FLAG TABLE OF LONG WORDS
ZEXT A1,W
MOVE A1,A5
MOVI DAMAGE_SPEECH_TABLE,A3
CALLR PICK_ENTRY2
JRNZ MDS_SAVE ;BR=NOT LAST ENTRY PICKED
MOVK DAMAGE_SPEECHES-1,A0
XOR A5,A1
MDS_SAVE
SLL 16,A0
OR A0,A1
MOVE A4,A0
CALLA ONESND
JRNZ MDS_NOGOOD ;BR=SANS SOUND
MOVE A1,@DAMAGE_SPEECH_FLAGS,L
MDS_NOGOOD
MMFM SP,A0,A1,A3,A4,A5
RETS
**************************************************************************
* *
* MAKE_THREAT_SPEECH - MAKE RANDOM COPTER THREAT SPEECH *
* *
* PASS: *
* NUTIN' *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
MAKE_THREAT_SPEECH
MMTM SP,A0,A1,A3,A4,A5
MOVE @THREAT_SPEECH_FLAGS,A1,L
MOVE A1,A0
SRL 16,A0
NEG A0 ;FLAG TABLE OF LONG WORDS
ZEXT A1,W
MOVE A1,A5
MOVI THREAT_SPEECH_TABLE,A3
CALLR PICK_ENTRY2
JRNZ MTS_SAVE ;BR=NOT LAST ENTRY PICKED
MOVK THREAT_SPEECHES-1,A0
XOR A5,A1
MTS_SAVE
SLL 16,A0
OR A0,A1
MOVE A4,A0
CALLA ONESND
JRNZ MTS_NOGOOD ;BR=SANS SOUND
MOVE A1,@THREAT_SPEECH_FLAGS,L
MTS_NOGOOD
MMFM SP,A0,A1,A3,A4,A5
RETS
**************************************************************************
* *
* MAKE_SIDE_COPTER_PROC *
* *
**************************************************************************
INIT_SIDE_MISSLETIME_TABLE
.WORD 15, 15, 15
MAKE_SIDE_COPTER_PROC
.if BILL
CLR A8
MOVE A8,@COPTER_OBJ2,L
DIE
.endif
MOVI SIDE_COPTER_INIT,B0
CALLA MULTIMAKE
LOCKON Z
MOVE A8,@COPTER_OBJ2,L
MOVE A8,A0
MOVI 0101H,A1
MOVI [0800H,0800H],A2
MOVI SIDE_COLLISION_TABLE,A3
MSCP_CONST_LUPE
MOVE A1,*A0(OCONST),W
MOVE A2,*A0(OZDEPTH),L
MOVE *A3+,A14,L
MOVE A14,*A0(OCOLLISION),L
MOVE *A0(OPARTS),A0,L
JRNZ MSCP_CONST_LUPE
MOVI GATFLASH_ANIM,A2
MOVI LEFT_GUN,A1
CALLA FINDPART
LOCKON Z
MOVE A2,*A0(OFLASHANIM),L
MOVI 0800H,A14
MOVE A14,*A8(OHXACCEL),W
MOVE A14,*A8(OHYACCEL),W
MOVK 010H,A14
MOVE A14,*A8(OHZACCEL),W
MOVI INIT_SIDE_MISSLETIME_TABLE,A14
MOVE A14,@MISSLETIME_TABLE,L
CLR A14
MOVE A14,*A8(OHZFLYTO),L
MOVE A14,*A8(OCOMMAND),W
MOVE A14,*A8(OSTUTTER),W
CALLR COPTER_OFF
; CREATE PID_IND,COPTER_INTRO_2
DIE
SIDE_COLLISION_TABLE
.LONG COPTER_LCLANG_FLASH_COLLISION, FLIGHT_WEAPON_COLLISION
.LONG FLIGHT_HCOLLISION, FLIGHT_WEAPON_COLLISION
.LONG FLIGHT_HCOLLISION, FLIGHT_LCOLLISION, FLIGHT_LCOLLISION
.LONG FLIGHT_LCOLLISION
.LONG FLIGHT_LCOLLISION, FLIGHT_LCOLLISION, FLIGHT_LCOLLISION
.LONG FLIGHT_LCOLLISION
.LONG FLIGHT_LCOLLISION, FLIGHT_HCOLLISION, FLIGHT_LCOLLISION, 0
.LONG 0, 0, 0, 0
FRONT_COLLISION_TABLE
.LONG COPTER_LCLANG_COLLISION, FLIGHT_WEAPON_COLLISION
.LONG FLIGHT_HCOLLISION, FLIGHT_WEAPON_COLLISION
.LONG FLIGHT_HCOLLISION, FLIGHT_WEAPON_COLLISION
.LONG FLIGHT_HCOLLISION, FLIGHT_LCOLLISION
.LONG FLIGHT_LCOLLISION, FLIGHT_LCOLLISION
.LONG FLIGHT_LCOLLISION, FLIGHT_LCOLLISION
.LONG FLIGHT_LCOLLISION, FLIGHT_LCOLLISION
.LONG FLIGHT_LCOLLISION, FLIGHT_LCOLLISION
.LONG FLIGHT_9S_COLLISION, FLIGHT_9S_COLLISION
.LONG COPTER_HCLANG_COLLISION, COPTER_HCLANG_COLLISION
.LONG COPTER_LCLANG_COLLISION, COPTER_LCLANG_COLLISION
.LONG 0, 0
.LONG 0, 0, 0
FINAL_COPTER_VECTORS_TABLE
.LONG COPTER_LCLANG_GUNVECT, COPTER_LCLANG_COLLISION
.LONG WING_WEAPON_GUNVECT, WING_WEAPON_COLLISION
.LONG WING_WEAPON_GUNVECT, WING_WEAPON_COLLISION
.LONG WING_WEAPON_GUNVECT, WING_WEAPON_COLLISION
.LONG WING_WEAPON_GUNVECT, WING_WEAPON_COLLISION
.LONG BELLY_WEAPON_GUNVECT, BELLY_WEAPON_COLLISION
.LONG COPTER_HCLANG_GUNVECT, COPTER_HCLANG_COLLISION
.LONG ENGINE_GUNVECT, ENGINE_COLLISION
.LONG ENGINE_GUNVECT, ENGINE_COLLISION
.LONG COPTER_LCLANG_GUNVECT, COPTER_LCLANG_COLLISION
.LONG COPTER_LCLANG_GUNVECT, COPTER_LCLANG_COLLISION
.LONG COCKPIT_GUNVECT, COCKPIT_COLLISION
.LONG COCKPIT_GUNVECT, COCKPIT_COLLISION
.LONG FUSEGUN_GUNVECT, FUSEGUN_COLLISION
.LONG FUSEGUN_GUNVECT, FUSEGUN_COLLISION
.LONG COPTER_HCLANG_GUNVECT, COPTER_HCLANG_COLLISION
.LONG COPTER_LCLANG_GUNVECT, COPTER_LCLANG_COLLISION
.LONG COPTER_LCLANG_GUNVECT, COPTER_LCLANG_COLLISION
**************************************************************************
* *
* MAKE_FRONT_COPTER_PROC *
* *
**************************************************************************
INIT_FRONT_MISSLETIME_TABLE
.WORD 30, 30, 30
MAKE_FRONT_COPTER_PROC
MOVK 2,A14
MOVE A14,@WING_COUNT,W
CLR A14
MOVE A14,@LAST_ROCKET,L
MOVE A14,@DESTROYING_PARTS,L
MOVE A14,@ROW_HITS,W
MOVE @WAVEIRQS,A14,L
MOVE A14,@ROW_TIME,L
MOVI FRONT_COPTER_INIT,B0
CALLA MULTIMAKE
LOCKON Z
CALLA INC_ENEMY_COUNT
MOVE A8,@COPTER_OBJ,L
MOVE A13,*A8(OPLINK),L
MOVE A8,A0
MOVI 0101H,A1
MOVI [0800H,0800H],A2
MOVI FRONT_COLLISION_TABLE,A3
MFCP_CONST_LUPE
MOVE A1,*A0(OCONST),W
MOVE A2,*A0(OZDEPTH),L
MOVE *A3+,A14,L
MOVE A14,*A0(OCOLLISION),L
MOVE *A0(OPARTS),A0,L
JRNZ MFCP_CONST_LUPE
MOVI GATFLASH_ANIM,A2
MOVI LEFT_GUN,A1
CALLA FINDPART
LOCKON Z
MOVE A2,*A0(OFLASHANIM),L
MOVI RGHT_GUN,A1
CALLA FINDPART
LOCKON Z
MOVE A2,*A0(OFLASHANIM),L
MOVI 0800H,A14
MOVE A14,*A8(OHXACCEL),W
MOVE A14,*A8(OHYACCEL),W
MOVK 010H,A14
MOVE A14,*A8(OHZACCEL),W
CLR A14
MOVE A14,*A8(OHZFLYTO),L
MOVE A14,*A8(OCOMMAND),W
MOVE A14,*A8(OSTUTTER),W
MOVI INIT_FRONT_MISSLETIME_TABLE,A14
MOVE A14,@MISSLETIME_TABLE,L
.if BILL
CALLR COPTER_OFF
; CREATE PID_IND,COPTER_INTRO_1
.else
CREATE PID_IND,COPTER_INTRO_1
.endif
MFCP_CONTROL_LUPE
SLEEP 2
MOVE @DESTROYING_PARTS,A14,W
JRNZ MFCP_CONTROL_LUPE
MOVE *A8(OCOMMAND),A14,W
BTST B_CFLYTOPT,A14
JRZ MFCP_CHECK_MORE_0 ;BR=NO FLY TO POINT COMMAND
JSRP COPTER_TO_POINT
MOVE *A8(OCOMMAND),A14,W
ANDNI M_CFLYTOPT,A14
MOVE A14,*A8(OCOMMAND),W
JRUC MFCP_CONTROL_LUPE
MFCP_CHECK_MORE_0
BTST B_CHOVER,A14
JRZ MFCP_CHECK_MORE_1 ;BR=NO HOVER COMMAND
; JSRP HOVER_PROC
MFCP_HOVER
SLEEP 1
MOVE @DESTROYING_PARTS,A14,W
JRNZ MFCP_CONTROL_LUPE
MOVI 0A000H,A0
MOVI 06000H,A1
MOVI 0100H,A2
CALLR DO_HOVER
MOVE *A8(OCOMMAND),A14,W
BTST B_CHOVER,A14
JRNZ MFCP_HOVER
JRUC MFCP_CONTROL_LUPE
MFCP_CHECK_MORE_1
BTST B_CCHARGE,A14
JRZ MFCP_CHECK_MORE_2 ;BR=NO CHARGE COMMAND
BTST B_CFINAL,A14
JRZ MFCP_CHARGE
JSRP COPTER_FINAL_CHARGE
JRUC MFCP_CONTROL_LUPE
MFCP_CHARGE
JSRP COPTER_CHARGE
JRUC MFCP_CONTROL_LUPE
MFCP_CHECK_MORE_2
BTST B_CACCTOPT,A14
JRZ MFCP_CHECK_MORE_3 ;BR=NO FLY TO POINT COMMAND
JSRP COPTER_ACCEL_TO_POINT
MOVE *A8(OCOMMAND),A14,W
ANDNI M_CACCTOPT,A14
MOVE A14,*A8(OCOMMAND),W
JRUC MFCP_CONTROL_LUPE
MFCP_CHECK_MORE_3
JRUC MFCP_CONTROL_LUPE
**************************************************************************
**************************************************************************
**************************************************************************
PFTIME EQU PDATA
**************************************************************************
* *
* COPTER_ACCEL_TO_POINT *
* *
**************************************************************************
COPTER_ACCEL_TO_POINT
MOVE *A8(OFLYTIME),A7,W
CALLR DETERMINE_LIMIT_CHECKS
ADD A1,A2 ;Z DESTINATION
ADD A9,A4 ;Y DESTINATION
ADD A11,A6 ;X DESTINATION
CALLR COPTER_ACCEL_SETUP
MOVE @WAVEIRQS,A14,L
MOVE A14,*A13(PFTIME),L
JRUC CTP_LUPE
**************************************************************************
* *
* COPTER_ACCEL_TO_WORLD_POINT *
* *
**************************************************************************
COPTER_ACCEL_TO_WORLD_POINT
MOVE *A8(OFLYTIME),A7,W
CALLR DETERMINE_WORLD_LIMIT_CHECKS
ADD A1,A2 ;Z DESTINATION
ADD A9,A4 ;Y DESTINATION
ADD A11,A6 ;X DESTINATION
CALLR COPTER_ACCEL_WORLD_SETUP
MOVE @WAVEIRQS,A14,L
MOVE A14,*A13(PFTIME),L
JRUC CTWP_LUPE
**************************************************************************
* *
* COPTER_TO_POINT *
* *
**************************************************************************
COPTER_TO_POINT
MOVE *A8(OFLYTIME),A7,W
SRA 1,A7 ;ACCELERATE THE FIRST HALF
CALLR DETERMINE_LIMIT_CHECKS
SRA 1,A1 ;HALFWAY
ADD A1,A2 ;Z DESTINATION
SRA 1,A9 ;HALFWAY
ADD A9,A4 ;Y DESTINATION
SRA 1,A11 ;HALFWAY
ADD A11,A6 ;X DESTINATION
CALLR COPTER_ACCEL_SETUP
MOVE @WAVEIRQS,A14,L
MOVE A14,*A13(PFTIME),L
; JSRP CTP_LUPE
GETPC A14
ADDI 060h,A14
MOVE A14,-*A12,L ;PUSH RET ADDR
JAUC CTP_LUPE
JRC CTP_RETP ;BR=STOP!
MOVE *A8(OFLYTIME),A14,W
SRA 1,A14 ;DECELERATE THE SECOND HALF
MOVE A7,A7
JRN CTP_TIMEOK ;BR=WE LOST TIME
CLR A7
CTP_TIMEOK
ADD A14,A7 ;COMPENSATE FOR LOST TIME
CALLR DETERMINE_LIMIT_CHECKS
ADD A1,A2 ;Z DESTINATION
ADD A9,A4 ;Y DESTINATION
ADD A11,A6 ;X DESTINATION
CALLR COPTER_ACCEL_SETUP
MOVE @WAVEIRQS,A14,L
MOVE A14,*A13(PFTIME),L
; JSRP CTP_LUPE
GETPC A14
ADDI 060h,A14
MOVE A14,-*A12,L ;PUSH RET ADDR
JAUC CTP_LUPE
JRC CTP_RETP ;BR=STOP!
CLR A14 ;STOP VELOCITIES
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
CTP_RETP
RETP
CTP_LUPE
MOVE B0,A1
MOVE B1,A3
MOVE B2,A5
MMTM A12,A1,A2,A3,A4,A5,A6,A7
SLEEP 1
MMFM A12,A1,A2,A3,A4,A5,A6,A7
MOVE @DESTROYING_PARTS,A14,W
JRNZ CTP_ABORT ;BR=STOP WHAT YOUR DOING!
MOVE A1,B0
MOVE A3,B1
MOVE A5,B2
MOVE A8,A14
; ADDI OXVEL,A14
; MMFM A14,A1,A3,A5 ;A5=OXVEL, A3=OYVEL, A1=OZVEL
ADDI OZVEL,A14
MMFM A14,A1,A3,A5 ;A5=OZVEL, A3=OXVEL, A1=OYVEL
ADD A10,A5 ;ADD Z ACCELERATION
ADD A9,A1 ;ADD Y
ADD A11,A3 ;ADD X
MMTM A14,A1,A3,A5 ;A5=OZVEL, A3=OXVEL, A1=OYVEL
MOVE *A13(PFTIME),A14,L
MOVE @WAVEIRQS,A1,L
MOVE A1,*A13(PFTIME),L
SUB A14,A1
SUB A1,A7
JRZ CTP_DONE ;BR=DONE. NO TIME LEFT
JRN CTP_DONE ;BR=EXCEEDED TIME LIMIT
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A1,A3,A5 ;A5=OXVAL, A3=OYVAL, A1=OZVAL
CMP A1,A2
CALL B0
JRZ CTP_DONE ;BR=VIOLATED Z BOUNDARY
CMP A3,A4
CALL B1
JRZ CTP_DONE ;BR=VIOLATED Y BOUNDARY
CMP A5,A6
CALL B2
JRNZ CTP_LUPE ;BR=VIOLATED X BOUNDARY
CTP_DONE
; RETP
CLRC ;SUCCESS!
MMFM A12,A14 ;PULL RETURN ADDR, W/O ZAPPING STAT
EXGPC A14
CTP_ABORT
SETC ;ABORT!
MMFM A12,A14 ;PULL RETURN ADDR, W/O ZAPPING STAT
EXGPC A14
GT_CHECK
JRGT GLTC_Z ;BR=VIOLATED BOUNDARY
MOVK 1,A14
MOVE A14,A14
RETS
LT_CHECK
JRLT GLTC_Z ;BR=VIOLATED BOUNDARY
MOVK 1,A14
MOVE A14,A14
RETS
GLTC_Z
CLR A14
RETS
**************************************************************************
* *
* COPTER_TO_WORLD_POINT *
* *
**************************************************************************
COPTER_TO_WORLD_POINT
MOVE *A8(OFLYTIME),A7,W
SRA 1,A7 ;ACCELERATE THE FIRST HALF
CALLR DETERMINE_WORLD_LIMIT_CHECKS
SRA 1,A1 ;HALFWAY
ADD A1,A2 ;Z DESTINATION
SRA 1,A9 ;HALFWAY
ADD A9,A4 ;Y DESTINATION
SRA 1,A11 ;HALFWAY
ADD A11,A6 ;X DESTINATION
CALLR COPTER_ACCEL_WORLD_SETUP
MOVE @WAVEIRQS,A14,L
MOVE A14,*A13(PFTIME),L
; JSRP CTWP_LUPE
GETPC A14
ADDI 060h,A14
MOVE A14,-*A12,L ;PUSH RET ADDR
JAUC CTWP_LUPE
MOVE *A8(OFLYTIME),A14,W
SRA 1,A14 ;DECELERATE THE SECOND HALF
MOVE A7,A7
JRN CTWP_TIMEOK ;BR=WE LOST TIME
CLR A7
CTWP_TIMEOK
ADD A14,A7 ;COMPENSATE FOR LOST TIME
CALLR DETERMINE_WORLD_LIMIT_CHECKS
ADD A1,A2 ;Z DESTINATION
ADD A9,A4 ;Y DESTINATION
ADD A11,A6 ;X DESTINATION
CALLR COPTER_ACCEL_WORLD_SETUP
MOVE @WAVEIRQS,A14,L
MOVE A14,*A13(PFTIME),L
; JSRP CTWP_LUPE
GETPC A14
ADDI 060h,A14
MOVE A14,-*A12,L ;PUSH RET ADDR
JAUC CTWP_LUPE
MOVI XSCROLL,A14
MMFM A14,A1,A2,A3 ;A3=XSCROLL, A2=YSCROLL, A1=ZSCROLL
MOVE A3,*A8(OXVEL),L ;SET UNIVERSE VELOCITIES
NEG A2
MOVE A2,*A8(OYVEL),L
MOVE A1,*A8(OZVEL),L
RETP
CTWP_LUPE
MOVE B0,A1
MOVE B1,A3
MOVE B2,A5
MMTM A12,A1,A2,A3,A4,A5,A6,A7
SLEEP 1
MOVE A8,A14
; ADDI OXVEL,A14
; MMFM A14,A1,A3,A5 ;A5=OXVEL, A3=OYVEL, A1=OZVEL
ADDI OZVEL,A14
MMFM A14,A1,A3,A5 ;A5=OZVEL, A3=OXVEL, A1=OYVEL
MOVI XSACCEL,A7
MMFM A7,A2,A4,A6 ;A6=XSACCEL, A4=YSACCEL, A2=ZSACCEL
ADD A10,A5 ;ADD Z ACCELERATION
ADD A2,A5
ADD A9,A1 ;ADD Y ACCELERATION
SUB A4,A1
ADD A11,A3 ;ADD X ACCELERATION
ADD A6,A3
MMTM A14,A1,A3,A5 ;A5=OZVEL, A3=OXVEL, A1=OYVEL
MMFM A12,A1,A2,A3,A4,A5,A6,A7
MOVE A1,B0
MOVE A3,B1
MOVE A5,B2
MOVE *A13(PFTIME),A14,L
MOVE @WAVEIRQS,A1,L
MOVE A1,*A13(PFTIME),L
SUB A14,A1
SUB A1,A7
JRZ CTWP_DONE ;BR=DONE. NO TIME LEFT
JRN CTWP_DONE ;BR=EXCEEDED TIME LIMIT
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A1,A3,A5 ;A5=OXVAL, A3=OYVAL, A1=OZVAL
MOVE @ZBASE,A14,L ;TRANSLATE TO WORLD
SUB A14,A1
MOVE @YBASE,A14,L
ADD A14,A3
MOVE @XBASE,A14,L
SUB A14,A5
CMP A1,A2
CALL B0
JRZ CTWP_DONE ;BR=VIOLATED Z BOUNDARY
CMP A3,A4
CALL B1
JRZ CTWP_DONE ;BR=VIOLATED Y BOUNDARY
CMP A5,A6
CALL B2
JRNZ CTWP_LUPE ;BR=VIOLATED X BOUNDARY
CTWP_DONE
; RETP
MMFM A12,A14 ;PULL RETURN ADDR, W/O ZAPPING STAT
EXGPC A14
**************************************************************************
* *
* DETERMINE_WORLD_LIMIT_CHECKS *
* DETERMINE_LIMIT_CHECKS *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* A1 = (OZDEST - OZVAL) *
* A2 = OZVAL *
* A4 = OYVAL *
* A6 = OZVAL *
* A9 = (OYDEST - OYVAL) *
* A11 = (OXDEST - OXVAL) *
* B0 = Z LIMIT CHECK *
* B1 = Y LIMIT CHECK *
* B2 = X LIMIT CHECK *
* *
**************************************************************************
DETERMINE_WORLD_LIMIT_CHECKS
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A2,A4,A6 ;A6=OXVAL, A4=OYVAL, A2=OZVAL
MOVI XBASE,A14
MMFM A14,A1,A9,A11 ;A11=XBASE, A9=YBASE, A1=ZBASE
SUB A1,A2 ;TRANSLATE TO WORLD
ADD A9,A4
SUB A11,A6
JRUC DLC_GO
DETERMINE_LIMIT_CHECKS
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A2,A4,A6 ;A6=OXVAL, A4=OYVAL, A2=OZVAL
DLC_GO
MOVE A8,A14
ADDI OXDEST,A14
MMFM A14,A1,A9,A11 ;A11=OXDEST, A9=OYDEST, A1=OZDEST
MOVI LT_CHECK,B0 ;SET DEFAULT CHECKS
MOVE B0,B1
MOVE B0,B2
MOVI GT_CHECK,B14
SUB A2,A1 ;(OZDEST - OZVAL)
JRNN DLC_SUBY ;BR=USE LESS THAN CHECK
MOVE B14,B0
DLC_SUBY
SUB A4,A9 ;(OYDEST - OYVAL)
JRNN DLC_SUBX ;BR=USE LESS THAN CHECK
MOVE B14,B1
DLC_SUBX
SUB A6,A11 ;(OXDEST - OXVAL)
JRNN DLC_SUBS_DONE ;BR=USE LESS THAN CHECK
MOVE B14,B2
DLC_SUBS_DONE
RETS
**************************************************************************
* *
* COPTER_ACCEL_WORLD_SETUP *
* COPTER_ACCEL_SETUP *
* *
* COMPUTE ACCELERATION FROM: *
* *
* 2 DEST - VAL *
* ACCEL = -------- * ( ---------- - VEL ) *
* DURATION DURATION *
* *
* PASS: *
* A1 = (OZDEST - OZVAL) *
* A7 = DURATION FROM CURRENT POSITION TO DESTINATION *
* A8 = OBJECT *
* A9 = (OYDEST - OYVAL) *
* A11 = (OXDEST - OXVAL) *
* *
* RETURN: *
* A10 = Z ACCELERATION *
* A9 = Y ACCELERATION *
* A11 = X ACCELERATION *
* *
**************************************************************************
COPTER_ACCEL_WORLD_SETUP
MOVE A8,A14
; ADDI OXVEL,A14
; MMFM A14,A3,A5,A10 ;A10=OXVEL, A5=OYVEL, A3=OZVEL
ADDI OZVEL,A14
MMFM A14,A3,A5,A10 ;A10=OZVEL, A5=OXVEL, A3=OYVEL
MOVE @ZSCROLL,A14,L ;TRANSLATE TO WORLD
SUB A14,A10
MOVE @YSCROLL,A14,L
ADD A14,A3
MOVE @XSCROLL,A14,L
SUB A14,A5
JRUC CAS_GO
COPTER_ACCEL_SETUP
MOVE A8,A14
; ADDI OXVEL,A14
; MMFM A14,A3,A5,A10 ;A10=OXVEL, A5=OYVEL, A3=OZVEL
ADDI OZVEL,A14
MMFM A14,A3,A5,A10 ;A10=OZVEL, A5=OXVEL, A3=OYVEL
CAS_GO
DIVS A7,A1 ;DIVIDE DIFFERENCE
DIVS A7,A9
DIVS A7,A11
SUB A10,A1 ;SUBTRACT VELOCITY
SUB A3,A9
SUB A5,A11
SLL 1,A1 ;MULTIPLY BY 2
SLL 1,A9
SLL 1,A11
DIVS A7,A1 ;FINAL DIVIDE
DIVS A7,A9
DIVS A7,A11
MOVE A1,A10
RETS
**************************************************************************
* *
* COPTER_FINAL_CHARGE *
* *
**************************************************************************
COPTER_FINAL_CHARGE
MOVI -01000H,A14 ;SET Z VELOCITY
MOVE A14,*A8(OZVEL),L
MOVI 0D700H,A9 ;Z LIMIT FOR GOIN' DOWN
MOVI 1024,A0
CALLA RAND0
MOVE A0,A10
CMPI 512,A10
JRLT CFC_1ST_LUPE ;BR=FLY DOWN!
MOVI 016000H,A9 ;Z LIMIT FOR GOIN' UP
CFC_1ST_LUPE
MOVK 3,A0
CALLA SET_TRACK_VOLUME_Z
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A4,L
MOVE @ZSCROLL,A14,L
SRA ZFRAC,A14 ;THROW AWAY FRACTION
ADD A14,A4 ;ZBASE ON NEXT TICK
SUBI 0800H,A1
SUB A4,A1
CMP A9,A1
JRLT CFC_2ND_PART ;BR=NOT CLOSE ENOUGH IN Z YET
SLEEP 1
MOVE @COPTER_OBJ,A8,L
JAZ SUCIDE
MOVE @DESTROYING_PARTS,A14,W
JRNZ CFC_ABORT ;BR=STOP WHAT YOUR DOING!
JRUC CFC_1ST_LUPE
CFC_2ND_PART
CMPI 512,A10
JRGE CFC_GO_UP ;BR=FLY UP!
CLR A9 ;INITIAL Y VELOCITY
MOVI 0A0000H,A10 ;FINAL Y VELOCITY
MOVI 020000H,A11 ;Y ACCELERATION
MOVI -0400H,A14 ;SET Z VELOCITY
MOVE A14,*A8(OZVEL),L
JRUC CFC_2ND_START
CFC_GO_UP
CLR A9 ;INITIAL Y VELOCITY
MOVI -080000H,A10 ;FINAL Y VELOCITY
MOVI -010000H,A11 ;Y ACCELERATION
JRUC CFC_2ND_START
CFC_2ND_LUPE
SLEEP 1
MOVE @COPTER_OBJ,A8,L
JAZ SUCIDE
MOVE @DESTROYING_PARTS,A14,W
JRNZ CFC_ABORT ;BR=STOP WHAT YOUR DOING!
CFC_2ND_START
MOVK 3,A0
CALLA SET_TRACK_VOLUME_Z
MOVE @XSCROLL,A14,L
MOVE A14,*A8(OXVEL),L ;UPDATE X VELOCITY
MOVE @YSCROLL,A14,L
CMP A10,A9
JREQ CFC_ADD_Y ;BR=WE REACHED FINAL Y VELOCITY
ADD A11,A9
CFC_ADD_Y
SUB A9,A14 ;TRANSLATE TO UNIVERSE
NEG A14
MOVE A14,*A8(OYVEL),L ;UPDATE Y VELOCITY
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1 ;TRANSLATE TO WORLD
CMPI ZMAX_REAL,A1
JRGE CFC_2ND_LUPE ;BR=NOT PAST YET
CLR A14
MOVE A14,*A8(OCOMMAND),W
MOVE A8,A3 ;FADE DOWN TO QUARTER
CLR A8
MOVI [63,0],A9
MOVK 3,A10
MOVI 28,A11
CREATE PID_GOODIE,TRACK_FADE_PROC
MOVE A3,A8
CFC_ABORT
RETP
**************************************************************************
* *
* COPTER_CHARGE *
* *
**************************************************************************
COPTER_CHARGE
MOVI -0800H,A14 ;SET Z VELOCITY
MOVE A14,*A8(OZVEL),L
MOVI 016000H,A9 ;Z LIMIT
MOVI 030000H,A10 ;X/Y SPEED
MOVI 0400000H,A11 ;YBASE ADJUSTMENT
CC_1ST_LUPE
MOVK 3,A0
CALLA SET_TRACK_VOLUME_Z
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A1,A2,A3 ;A3=OXVAL, A2=OYVAL, A1=OZVAL
MOVI XBASE,A14
MMFM A14,A4,A5,A6 ;A6=XBASE, A5=YBASE, A4=ZBASE
MOVE @ZSCROLL,A14,L
SRA ZFRAC,A14 ;THROW AWAY FRACTION
ADD A14,A4 ;ZBASE ON NEXT TICK
SUBI 0800H,A1
SUB A4,A1
CMP A9,A1
JRLT CC_2ND_PART ;BR=NOT CLOSE ENOUGH IN Z YET
MOVE A10,A7 ;SET DEFAULT X SPEED
MOVE A6,A14
SUB A3,A14 ;WORLD X
MOVE A14,A1
ABS A14 ;ABS(WORLD X)
CMP A7,A14
JRGT CC_GO_X ;BR=VELOCITY OK
MOVE A1,A7 ;USE ABS(WORLD X) AS VELOCITY
JRUC CC_DO_X
CC_GO_X
CMP A6,A3
JRLT CC_DO_X ;BR=VELOCITY DIRECTION OK
NEG A7
CC_DO_X
MOVE @XSCROLL,A14,L
ADD A14,A7 ;TRANSLATE TO UNIVERSE
MOVE A7,*A8(OXVEL),L
MOVE A10,A7 ;SET DEFAULT Y SPEED
NEG A5
ADD A11,A5
CMP A5,A2
JRLT CC_DO_Y ;BR=VELOCITY DIRECTION OK
NEG A7
CC_DO_Y
MOVE @YSCROLL,A14,L
ADD A14,A7 ;TRANSLATE TO UNIVERSE
MOVE A7,*A8(OYVEL),L
SLEEP 1
JRUC CC_1ST_LUPE
CC_2ND_PART
MOVI 050000H,A10 ;Y VELOCITY
MOVI ZMAX_REAL,A11
JRUC CC_2ND_START
CC_2ND_LUPE
SLEEP 1
CC_2ND_START
MOVK 3,A0
CALLA SET_TRACK_VOLUME_Z
MOVE @XSCROLL,A14,L
MOVE A14,*A8(OXVEL),L ;UPDATE X VELOCITY
MOVE @YSCROLL,A14,L
SUB A10,A14
MOVE A14,*A8(OYVEL),L ;UPDATE Y VELOCITY
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1 ;TRANSLATE TO WORLD
CMP A11,A1
JRGE CC_2ND_LUPE ;BR=NOT PAST YET
CALLR COPTER_OFF
MOVE A8,A3 ;FADE DOWN TO OFF
CLR A8
MOVK 3,A10
MOVI 30,A11
CREATE PID_IND,TRACK_FADE_OUT_FULL_PROC
MOVE A3,A8
RETP
**************************************************************************
* *
* DO_HOVER *
* *
* PASS: *
* A0 = X MAXIMUM SPEED *
* A1 = Y MAXIMUM SPEED *
* A2 = Z MAXIMUM SPEED *
* A8 = OBJECT *
* *
**************************************************************************
DO_HOVER
MOVE A0,A0
JRZ DH_DO_Y ;BR=DON'T HOVER IN X
move *A8(OHXACCEL),A14,W
JRZ DH_DO_Y ;BR=DON'T HOVER IN X
move *A8(OXVEL),A3,L
add A14,A3
move A3,*A8(OXVEL),L
abs A3
CMP A0,A3
jrlt DH_DO_Y ;BR=UNDER THE LIMIT
NEGM *A8(OHXACCEL),W ;CHANGE DIRECTION
DH_DO_Y
MOVE A1,A1
JRZ DH_DO_Z ;BR=DON'T HOVER IN Y
move *A8(OHYACCEL),A14,W
JRZ DH_DO_Z ;BR=DON'T HOVER IN Y
move *A8(OYVEL),A3,L
add A14,A3
move A3,*A8(OYVEL),L
abs A3
CMP A1,A3
jrlt DH_DO_Z ;BR=UNDER THE LIMIT
NEGM *A8(OHYACCEL),W ;CHANGE DIRECTION
DH_DO_Z
MOVE A2,A2
JRZ DH_DONE ;BR=DON'T HOVER IN Z
MOVE *A8(OHZFLYTO),A0,L
JRNZ DH_COMEBACK
move *A8(OHZACCEL),A14,W
JRZ DH_DONE ;BR=DON'T HOVER IN Z
move *A8(OZVEL),A3,L
add A14,A3
move A3,*A8(OZVEL),L
ABS A14
CMP A2,A3
JRGE DH_NEG_Z
NEG A2
CMP A2,A3
JRGT DH_DONE
NEG A14
DH_NEG_Z
NEG A14
MOVE A14,*A8(OHZACCEL),W
DH_DONE
RETS
DH_COMEBACK
MOVE *A8(OHZACCEL),A14,W
MOVE *A8(OZVEL),A3,L
ADD A14,A3
NEG A2
CMP A2,A3
JRLT DH_FLYTO_CHK
MOVE A3,*A8(OZVEL),L
DH_FLYTO_CHK
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1
CMP A0,A1
JRGT DH_DONE
CLR A14
MOVE A14,*A8(OHZFLYTO),L
RETS
**************************************************************************
* *
* DO_HOVER_WORLD *
* *
* PASS: *
* A0 = X MAXIMUM SPEED *
* A1 = Y MAXIMUM SPEED *
* A2 = Z MAXIMUM SPEED *
* A8 = OBJECT *
* A9 = OLD ZSCROLL *
* A10 = OLD YSCROLL *
* A11 = OLD XSCROLL *
* *
**************************************************************************
DO_HOVER_WORLD
MOVE A0,A0
JRZ DH_DO_Y ;BR=DON'T HOVER IN X
move *A8(OXVEL),A3,L
SUB A11,A3 ;TRANSLATE TO WORLD
move *A8(OHXACCEL),A14,W
add A14,A3
MOVE A3,A14
MOVE @XSCROLL,A4,L
ADD A4,A3 ;TRANSLATE TO UNIVERSE
move A3,*A8(OXVEL),L
abs A14
CMP A0,A14
jrlt DHW_DO_Y ;BR=UNDER THE LIMIT
NEGM *A8(OHXACCEL),W ;CHANGE DIRECTION
DHW_DO_Y
MOVE A1,A1
JRZ DHW_DO_Z ;BR=DON'T HOVER IN Y
move *A8(OYVEL),A3,L
ADD A10,A3 ;TRANSLATE TO WORLD
move *A8(OHYACCEL),A14,W
add A14,A3
MOVE A3,A14
MOVE @YSCROLL,A4,L
SUB A4,A3 ;TRANSLATE TO UNIVERSE
move A3,*A8(OYVEL),L
abs A14
CMP A1,A14
jrlt DHW_DO_Z ;BR=UNDER THE LIMIT
NEGM *A8(OHYACCEL),W ;CHANGE DIRECTION
DHW_DO_Z
MOVE A2,A2
JRZ DHW_DONE ;BR=DON'T HOVER IN Z
MOVE *A8(OHZFLYTO),A0,L
JRNZ DHW_COMEBACK
move *A8(OZVEL),A3,L
SUB A9,A3 ;TRANSLATE TO WORLD
move *A8(OHZACCEL),A14,W
add A14,A3
MOVE A3,A5
MOVE @ZSCROLL,A4,L
ADD A4,A3 ;TRANSLATE TO UNIVERSE
move A3,*A8(OZVEL),L
ABS A14
CMP A2,A5
JRGE DHW_NEG_Z
NEG A2
CMP A2,A5
JRGT DHW_DONE
NEG A14
DHW_NEG_Z
NEG A14
MOVE A14,*A8(OHZACCEL),W
DHW_DONE
RETS
DHW_COMEBACK
MOVE *A8(OHZACCEL),A14,W
MOVE *A8(OZVEL),A3,L
SUB A9,A3 ;TRANSLATE TO UNIVERSE
ADD A14,A3
NEG A2
CMP A2,A3
JRLT DH_FLYTO_CHK
MOVE @ZSCROLL,A4,L
ADD A4,A3
MOVE A3,*A8(OZVEL),L
JRUC DH_FLYTO_CHK
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
* *
* A_CREATE_FLASH - MAKE A GUN FLASH *
* *
* PASS: *
* A8 = GUN OBJECT *
* AARG+,L = ADDRESS TO JUMP TO IF CAN'T DO IT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_CREATE_FLASH
MOVE *A8(OPART1),A0,L
LOCKON Z
MOVE *A0(OCOMMAND),A14,W
BTST B_CGUNS,A14
JRZ ACF_NOFLASH ;BR=GUNS NOT ACTIVE
; MOVE *A8(OHITS),A14,W
; JRZ ACF_NOFLASH ;BR=DESTROYED
; JRN ACF_NOFLASH ;BR=DESTROYED
MOVE *A8(OFLAGS),A14,W
BTST B_OFSCRN,A14
JRNZ ACF_NOFLASH ;BR=OFF DA SCREEN
MOVE *A8(OFLASH_INIT),A5,L
CALLA CREATE_OBJ
MOVE A0,*A8(OFLASHOBJ),L
JRZ ACF_NOFLASH ;BR=CREATION FAILED
MOVE *A8(OFLASH_OFFSET),A14,L ;OFFSET FROM GUN OBJECT
MOVE *A8(OPARTSXY),A1,L
ADD A14,A1
MOVE A1,*A0(OPARTSXY),L
CALLA GET_HEAD_PART
MOVE *A8(OXVAL),A1,L ;SET POSITION
MOVE *A8(OYVAL),A2,L
MOVE *A8(OZVAL),A3,L
CALLA SETOFFPU
CALLA INSPART ;INSERT
CALLA INSOBJ
RETS
ACF_NOFLASH
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L
RETS
**************************************************************************
* *
* A_DELETE_FLASH - DELETE FLASH UPON RANDOM CHANCE IF NOT THEN JUMP *
* *
* PASS: *
* A8 = GUN OBJECT *
* AARG+,L = ADDRESS TO JUMP TO IF IT DIDN'T HAPPEN *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_DELETE_FLASH
MOVI 768,A0 ;25% CHANCE OF DELETING
CALLA RANDPER
JRNC DELETE_FLASH ;BR=DELETE FLASH
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L ;JUMP!
ADF_NONE
RETS
**************************************************************************
* *
* DELETE_FLASH - DELETE THE FLASH OBJECT *
* *
* PASS: *
* A8 = GUN OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
DELETE_FLASH
MOVE *A8(OFLASHOBJ),A0,L
JRZ ADF_NONE ;BR=NO FLASH OBJECT
;THIS DOES NOT HAVE TO BE DONE TO ALL GUNS!
MOVE *A0(AnimFrm),*A8(OFLASHANIM),L ;SAVE WHERE WE LEFT OFF FOR GAT
CLR A14
MOVE A14,*A8(OFLASHOBJ),L ;NO FLASH OBJECT
CALLA PULLPART ;GET RID OF IT
JAUC DELOBJ
**************************************************************************
* *
* A_FIRE_SND_PAL - MAKE BANG! SOUND *
* *
* PASS: *
* A8 = GUN OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_FIRE_SND_PAL
MOVE *A8(OGUN_SND),A0,L
JRZ AFSP_NOSND
; CALLA ONESND_Z
CALLA ONESND
AFSP_NOSND
JRUC A_HILITE_PAL
**************************************************************************
* *
* A_HILITE_PAL - CHANGE TO BRIGHT GUN PALETTE *
* *
* PASS: *
* A8 = GUN OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_HILITE_PAL
MOVE *A8(OHILITE_PAL),A0,L
JAUC CHANGE_PAL
**************************************************************************
* *
* A_NORMAL_PAL - CHANGE TO NORMAL PALETTE *
* *
* PASS: *
* A8 = GUN OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_NORMAL_PAL
MOVE *A8(ONORMAL_PAL),A0,L
JAUC CHANGE_PAL
**************************************************************************
* *
* A_HIT_FLIP_ON - CHECK PLAYER HIT, TURN THE OBJECT ON, *
* AND DO SOME RANDOM FLIPS *
* *
* A_HIT_ON - CHECK PLAYER HIT AND TURN THE OBJECT ONLY *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_HIT_FLIP_ON
MOVE @RAND,A14,W
ANDI M_FLIPH|M_FLIPV,A14 ;ISOLATE FLIP BITS ONLY
SETF 2,0,0
MOVE A14,*A8(OCTRL+4),0
SETF 16,1,0 ;WORD SIGN EXTEND
A_HIT_ON
CLR A3 ;ZERO OFFSET
; MOVI [1,0],A5 ;DAMAGE
MOVE @BASE_HIT,A5,W
SUBI 800H,A5
SLL 4,A5
MOVE *A8(OPART1),A14,L
LOCKON Z
MOVE *A14(OCOMMAND),A14,W
BTST B_CHITALL,A14
JRNZ AHO_HITALL ;BR=HIT 'EM ALL
CALLA CK_PLAYER_HIT ;CHECK EACH PLAYER
JAUC OBJ_ON_WNZ
AHO_HITALL
ALLPLYR PLAYER_HIT ;HIT 'EM ALL, HARD!
JAUC OBJ_ON_WNZ
**************************************************************************
* *
* GET_PCENTRY - GET PLAYER COUNT TABLE ENTRY *
* *
* PASS: *
* A1 = TABLE ADDRESS *
* .WORD PLAYER ONE VALUE, PLAYER TWO VALUE, PLAYER THREE VALUE *
* RETURN: *
* A14 = TABLE ENTRY *
* *
**************************************************************************
GET_PCENTRY
MOVE @CURPLYRS,A14,W ;GET NUMBER OF CURRENT PLAYERS
DEC A14
JRNN GP_GO
CLR A14
GP_GO
SLL 4,A14 ;TRANSLATE TO TABLE OFFSET
ADD A1,A14 ;OFFSET TABLE
MOVE *A14,A14,W ;GET TIME
RETS
**************************************************************************
* *
* A_LAUNCH_ROCKET *
* *
**************************************************************************
;OATE_ROCKET EQU ODATA
OTARGETX EQU ODATA+020H
OTARGETY EQU ODATA+040H
A_LAUNCH_ROCKET
MOVE *A8(OPART1),A0,L
LOCKON Z
MOVE @MISSLETIME_TABLE,A1,L
CALLR GET_PCENTRY ;LOAD SLEEP TIME
MOVE A14,A1
SLL 8,A14
OR A1,A14
MOVE A14,*A8(AnimSLP),W ;LOAD BOTH SLEEPS
MOVE *A0(OCOMMAND),A14,W
BTST B_CMISSLE,A14
JRZ ALR_DONE
MOVE *A8(OFLAGS),A14,W
BTST B_OFSCRN,A14
JRNZ ALR_DONE
; MOVE *A8(OHITS),A14,W
; JRZ ALR_DONE
; JRN ALR_DONE
MOVE *A8(OIHOFF),A10,W
CMPI 090H,A10
JRGT ALR_DONE
CALLA GETAFARG_LONG ;GET OFFSET FROM PART
MOVE A0,A9
MOVI ROCKET_INIT,A5
CALLA CREATE_OBJ
JRZ ALR_ABORT
MOVI 0101H,A14
MOVE A14,*A0(OCONST),W
MOVI ROCKET_GUNVECT,A14
MOVE A14,*A0(OGUNVECT),L
MOVE *A8(OXVAL),A2,L
MOVE A9,A14
SEXT A14,W
SLL 15,A14
ADD A14,A2
MOVE A2,*A0(OXVAL),L
; MOVE @XBASE,A14,L
; SUB A14,A2
MOVE *A8(OYVAL),A4,L
MOVE A9,A14
SRA 16,A14
SLL 15,A14
ADD A14,A4
MOVE A4,*A0(OYVAL),L
; MOVE @YBASE,A14,L
; ADD A14,A4
MOVE *A8(OZVAL),A5,L
SUBK 2,A5
MOVE A5,*A0(OZVAL),L
MOVE @LAST_ROCKET,A14,L
JRZ ALR_LAST
MOVE *A14(OZVAL),A14,L
CMP A14,A5
JRLT ALR_NOLAST ;BR=THE "LAST" ROCKET IS FARTHER IN Z
ALR_LAST
MOVE A0,@LAST_ROCKET,L
ALR_NOLAST
MOVE @ZBASE,A14,L
SUB A14,A5
MOVI -(08000H-ZMAX_REAL)/(ROCKET_FRAME_TIME*8),A14
MOVE A14,*A0(OZVEL),L
NEG A14
SUBI ZMAX_REAL,A5
DIVU A14,A5
MOVE A8,A11
MOVE A0,A8
MOVE @(UCHECK_TBL+030H+010H),A1,L
MOVE A1,A0
SEXT A1,W
SLL 12,A1 ;UNCOMPRESS TOP WORLD Y
ADDI 08000H,A1
SRA 16,A0
SLL 12,A0 ;UNCOMPRESS BOTTOM WORLD Y
; MOVI -017B000H,A0 ;TOP WORLD Y
; MOVI 0D2000H,A1 ;BOTTOM WORLD Y
CALLA RANGERND ;PICK DA Y
MOVE A0,A3
MOVE A3,*A8(OTARGETY),L
MOVE @YBASE,A14,L
SUB A14,A3
; MOVE @(UCHECK_TBL+030H),A0,W
; SLL 12,A0
; SUBI 060000H,A0
; MOVE A0,A1
; NEG A1
MOVI 768,A0
CALLA RANDPER
JRC ALR_PICK_A_PLAYER
; MOVI -01F8000H,A0 ;LEFT WORLD X
; MOVI 01F8000H,A1 ;RIGHT WORLD X
MOVI LEFT_WORLDX+060000H,A0 ;LEFT WORLD X
MOVI RGHT_WORLDX-060000H,A1 ;RIGHT WORLD X
CALLA RANGERND ;PICK DA X
JRUC ALR_SET_X_TARGET
ALR_PICK_A_PLAYER
CALLA GET_PLAYER_WORLDX_EXTENTS
CALLA RANGERND ;PICK DA X
ALR_SET_X_TARGET
MOVE A0,A1
MOVE A1,*A8(OTARGETX),L
MOVE @XBASE,A14,L
ADD A14,A1
CALLA SLINEVEL_LOAD_2D
MOVE A8,A0
MOVE A11,A8
CALLA INSOBJ
CALLA GETAFARG_WORD ;GET SMOKE FLAG
JRZ ALR_ABORT ;BR=THANK FOR NOT SMOKING
MOVI ROCKET_SMOKE_INIT,A5
CALLA CREATE_OBJ
JRZ ALR_ABORT
MOVE *A8(OPARTSXY),A14,L
ADD A9,A14
MOVE A14,*A0(OPARTSXY),L
MOVB *A8(OZOFF),A14
DEC A14
MOVB A14,*A0(OZOFF)
CALLA GET_HEAD_PART
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
MOVE *A8(OZVAL),A3,L
CALLA SETOFFPU
CALLA INSOBJ
CALLA INSPART
SOUND1 SND_ROCKET_LAUNCH
ALR_ABORT
RETS
ALR_DONE
MOVI 0101H,A14
MOVE A14,*A8(AnimSLP),W ;SET BOTH SLEEPS TO ONE
RETS
**************************************************************************
* *
* A_ROCKET_WATCH *
* *
**************************************************************************
A_ROCKET_WATCH
MOVE *A8(OIHOFF),A14,W
JRNZ ARW_DONE
MOVE *A8(OSCALE),A5,L
MOVI 01000100H,A14
CMP A14,A5
JRGT ARW_DONE
MOVI 01000100H,A14
MOVE A14,*A8(OSCALE),L
MOVE *A8(OIMG),A1,L
MOVE *A1(ISIZE),A14,L
MOVE A14,*A8(OUSIZE),L
MOVE A14,*A8(OSIZE),L
MOVE *A1(IANIOFF),A14,L
MOVE A14,*A8(OUANIOFF),L
MOVE A14,*A8(OANIOFF),L
CALLA SET_ODAG ;COMPUTE ODAG AGAIN
MOVE *A8(OFLAGS),A14,W
ORI M_NOSCALE,A14
MOVE A14,*A8(OFLAGS)
MOVI ROCKET_PART2_ANIM,A14
MOVE A14,*A8(AnimFrm),L
MOVE A14,*A8(AnimScr),L
ARW_DONE
JRUC ROCKET_VEL_UPDATE
**************************************************************************
* *
* ROCKET_VEL_UPDATE *
* *
**************************************************************************
ROCKET_VEL_UPDATE
MOVE *A8(OXVAL),A2,L
MOVE *A8(OYVAL),A4,L
MOVE *A8(OZVAL),A5,L
MOVE @ZBASE,A14,L
SUB A14,A5
MOVE @ZSCROLL,A14,L
SUB A14,A5
MOVE *A8(OZVEL),A14,L
ADD A14,A5
; MOVE *A8(OZVEL),A14,L
NEG A14
SUBI ZMAX_REAL,A5
DIVU A14,A5
JRZ RCU_FUDGE
JRNN RCU_GO
RCU_FUDGE
MOVK 1,A5
RCU_GO
MOVE *A8(OTARGETY),A3,L
MOVE @YBASE,A14,L
SUB A14,A3
MOVE *A8(OTARGETX),A1,L
MOVE @XBASE,A14,L
ADD A14,A1
JAUC SLINEVEL_LOAD_2D
**************************************************************************
* *
* A_CHECK_ROCKET_IMG *
* *
**************************************************************************
A_CHECK_ROCKET_IMG
MOVE *A8(OZVAL),A1,L
MOVE *A8(OZVEL),A14,L
ADD A14,A1
MOVE @ZSCROLL,A14,L
SUB A14,A1
MOVE @ZBASE,A14,L
SUB A14,A1
SUBI 07C92H,A1
NEG A1
JRNN ACRI_DIV
CLR A1
ACRI_DIV
MOVI 09C0H,A14
DIVU A14,A1
CMPK 7,A1
JRGT A_ROCKET_HIT
; JRLE ACRI_GO
; MOVI ROCKET_PART2_HIT,A1
; JRUC ACRI_NEW_FRAME
;ACRI_GO
MOVE A1,A14
SLL 4,A1
SLL 6,A14
ADD A14,A1
ADDI ROCKET_PART2_ANIM,A1
ACRI_NEW_FRAME
MOVE A1,*A8(AnimFrm),L
JRUC ROCKET_VEL_UPDATE
**************************************************************************
* *
* A_ROCKET_8 *
* *
**************************************************************************
A_ROCKET_8
MOVI 0840084H,A1
; MOVI 0800080H,A1
CALLA SET_SCALEM
CALLA SET_ODAG
JRUC A_CHECK_ROCKET_IMG
**************************************************************************
* *
* A_ROCKET_HIT *
* *
**************************************************************************
A_ROCKET_HIT
MOVI ROCKET_PART2_HIT,A1
MOVE A1,*A8(AnimFrm),L
MOVE *A8(OFLAGS),A14,W
ORI M_SCRNOBJ,A14
MOVE A14,*A8(OFLAGS),W
MOVI 0840084H,A1
; MOVI 0800080H,A1
CALLA SET_SCALEM
CALLA SET_ODAG
MOVE *A8(ODAG),A1,L
MOVE A1,A14
SEXT A1,W
SLL 16,A1
MOVE A1,*A8(OXVAL),L
SRA 16,A14
SLL 16,A14
MOVE A14,*A8(OYVAL),L
CLR A14
MOVE A14,*A8(OCVECT),L
MOVE A14,*A8(OGUNVECT),L
CALLA CLR_VEL
MOVE @LAST_ROCKET,A14,L
CMP A14,A8
JRNE ARH_DONE
CLR A14
MOVE A14,@LAST_ROCKET,L
ARH_DONE
RETS
**************************************************************************
* *
* ROCKET GUN AND COLLISION VECTORS *
* *
**************************************************************************
ROCKET_COLL
WWL OID_PROCKET,~MASK_PLAYER,ROCKET_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,ROCKET_EXPLOSION_COLL
WL 0,DUMCRETS
ROCKET_ROCKET_COLL
MOVE A0,*A8(OATE_ROCKET),L ;SAVE ROCKET OBJECT
RETS
ROCKET_EXPLOSION_COLL
MOVE *A8(OATE_ROCKET),A14,L
JRZ RV_DONE ;BR=NO ROCKET COLLISION
CMP A0,A14
JRNE RV_DONE ;BR=DIFFERENT EXPLOSION
MOVE *A0(RL_INTENDED_OBJ),A14,L ;DO WE HAVE THE RIGHT TARGET?
CMP A8,A14
JRNE RV_DONE ;BR=NOPE. NOT THE RIGHT TARGET.
CLRM *A8(OATE_ROCKET),L ;HIT! READY FOR ANOTHER!
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
ROCKET_GUNVECT
CALLA CLR_VEL
MOVE A0,A1
MMTM SP,B1,B2,B4,B5,B6,B8,B9 ;MAKE FRAGMENTS
MOVI 010000H,A0
CLR A3
CALLA PreFrag_Center
DEC B0
MOVI FRAG_ROCKET_EXPLODE,B14
CALLA Fragger
MMFM SP,B1,B2,B4,B5,B6,B8,B9
MOVE A1,A0
MOVE @LAST_ROCKET,A14,L
CMP A14,A0
JANE DELETE_OBJ
CLR A14
MOVE A14,@LAST_ROCKET,L
JAUC DELETE_OBJ
RV_DONE
RETS
FRAG_ROCKET_EXPLODE
.long EXPLO_ANIM,0
.word OID_JUNK,(1 << 11) + (1 << 6) + (FRGNOFLY+FRGNOFLP+FRGPAL)
.long 0
; .long EXPLO_ANIM,0
; .word OID_JUNK,(1 << 11) + (1 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
; .long EXPLO_ANIM,0
; .word OID_JUNK,(1 << 11) + (0 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
; .long 0
ROCKET_LAUNCHER_ANIM
LWLL 1,1|AFunc,A_GOSUB+2,MISSLE_LAUNCH_SUB_ANIM
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
LW 1,0
.long 0
MISSLE_LAUNCH_SUB_ANIM
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CMISSLE,MLSA_RETURN
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,-15*2,5*2,1
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,-6*2,6*2,1
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,8*2,5*2,1
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,18*2,5*2,1
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,-16*2,18*2,1
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,-7*2,19*2,1
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,7*2,19*2,1
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,18*2,18*2,1
MLSA_RETURN
LWL 1,1|AFunc,A_RETURN
ROCKET_SMOKE_INIT
.LONG MSLSMOKE2, 0
.WORD OID_JUNK, DMAWNZ, M_DBLSCL, 0
.LONG C_STRTANIM
.LONG ROCKET_SMOKE_ANIM
ROCKET_SMOKE_ANIM
LW 1,4
LW MSLSMOKE3,4
LW MSLSMOKE4,4
LW MSLSMOKE5,4
LW MSLSMOKE6,4
LWL 1,1|AFunc,DELETE_OBJ
ROCKET_INIT
.LONG mossile1, ROCKET_COLL
.WORD OID_EROCKET, DMAWNZ, 0, 0
.LONG C_STRTANIM
.LONG ROCKET_PART1_ANIM
ROCKET_PART1_ANIM
LWL mossile1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL mossle1b,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL mossle1c,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL mossle1d,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
LWL 1,1|AFunc,A_ROCKET_WATCH
.long 0
ROCKET_FRAME_TIME EQU 4
ROCKET_PART2_ANIM
LWL mossile1,1|AFunc,A_CHECK_ROCKET_IMG
LWL mossile2,1|AFunc,A_CHECK_ROCKET_IMG
LWL mossile3,1|AFunc,A_CHECK_ROCKET_IMG
LWL mossile4,1|AFunc,A_CHECK_ROCKET_IMG
LWL mossile5,1|AFunc,A_CHECK_ROCKET_IMG
LWL mossile6,1|AFunc,A_CHECK_ROCKET_IMG
LWL mossile7,1|AFunc,A_CHECK_ROCKET_IMG
LWL 1,1|AFunc,A_ROCKET_8
ROCKET_PART2_HIT
; LWL 1,1|AFunc,A_ROCKET_HIT
LWL 1,1|AFunc,OBJ_CONST
LWLL 1,1|AFunc,A_SOUND+2,SND_ROCKET_HIT
LWL 1,1|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_ON_WNZ
LWLLL 1,1|AFunc,A_CK_PHIT+4,0,8000H
LWL 1,1|AFunc,OBJ_CONST
LWL 1,2|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_ON_WNZ
LWLLL 1,1|AFunc,A_CK_PHIT+4,0,8000H
LWL 1,2|AFunc,OBJ_CONST
LWL 1,1|AFunc,OBJ_OFF
LWL 1,2|AFunc,OBJ_ON_WNZ
LWL 1,1|AFunc,DELETE_OBJ
**************************************************************************
* *
* A_MAKE_FIREBALL *
* *
* Anim Func to MAKE A FIREBALL FROM THE NOSE GUN. *
* *
* PASS: *
* A8 = NOSE GUN OBJECT *
* AARG+,L = FAILURE ADDRESS TO JUMP *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
;TAKEN FROM GXMONDOR.H
OCHEWEDROCKET EQU ODATA+050H ;UHB Rocket flag (for explosion)
OXACCEL EQU ODATA+090H ;UHW X acceleration
OPROJECT_PARENT EQU ODATA+0190H ;UHL Ptr to the object that spawned us
OPROJECT_TIME EQU ODATA+01B0H ;UHB Travel time for projectile
A_MAKE_FIREBALL
MOVE *A8(OPART1),A9,L ;HEAD OBJECT
LOCKON Z
MOVE @MISSLETIME_TABLE,A1,L
CALLR GET_PCENTRY ;LOAD SLEEP TIME
MOVE A14,A1
SLL 8,A14
OR A1,A14
MOVE A14,*A8(AnimSLP),W ;LOAD BOTH SLEEPS
MOVE *A9(OCOMMAND),A14,W
BTST B_CMISSLE,A14
JRZ AMF_X ;BR=NO MISSLES ALLOWED
MOVE *A8(OFLAGS),A14,W
BTST B_OFSCRN,A14
JRNZ AMF_X ;BR=GENERATOR OFF SCREEN
; MOVE *A8(OHITS),A14,W
; JRZ AMF_X ;BR=GENERATOR DEAD
; JRN AMF_X ;BR=GENERATOR DEAD
MOVI FIRE_BALL_INIT_C,B0
CALLA EASYMAKE
JRZ AMF_X ;No objects available
MOVI [-45*2,0],A3
MOVE A3,*A0(OPARTSXY),L ;Just to position us
MOVE *A9(OXVAL),A1,L
MOVE *A9(OYVAL),A2,L
MOVE *A9(OZVAL),A3,L
SUBK 32,A3
MOVE @LAST_ROCKET,A14,L
JRZ AMF_LAST
MOVE *A14(OZVAL),A14,L
CMP A14,A3
JRLT AMF_NOLAST ;BR=THE "LAST" ROCKET IS FARTHER IN Z
AMF_LAST
MOVE A0,@LAST_ROCKET,L
AMF_NOLAST
CALLA SETOFFPU
MOVE A8,*A0(OPROJECT_PARENT),L ;Tell us our roots
MOVE *A9(OZVEL),A14,L ;Transfer Z velocity only if Enemy
JRP AMF_INSERT ;is not moving away from the screen
MOVE A14,*A0(OZVEL),L
AMF_INSERT
CALLA INSOBJ
RETS
AMF_X
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L
RETS
*Initialize Mondor's fire ball
FIRE_BALL_INIT_C
.LONG LILPLAZ1
.WORD DMAWNZ, M_DBLSCL, OM_OID|OM_COLL|OM_ANIM|OM_CFUNC
.WORD OID_JUNK
.LONG DUMCOLL, ANIM_FIRE_BALL_C, C_FIREBALL
*Animate the fire ball
ANIM_FIRE_BALL_C
LWL 1,1|AFunc,A_FIRE_BALL_TARGET_C
LW LILPLAZ2,2
LW LILPLAZ3,2
LW LILPLAZ1,2
LWL LILPLAZ2,2|AFunc,A_FB_COLLS_ON
ANIM_FB_LOOP_C
LWL LILPLAZ3,2|AFunc,A_CHECK_FB_SCREEN_HIT_C
LWL LILPLAZ1,2|AFunc,A_CHECK_FB_SCREEN_HIT_C
LWL LILPLAZ2,1|AFunc,A_CHECK_FB_SCREEN_HIT_C
LWLL 1,1|AFunc,A_ONSCREEN+2,ANIM_FB_LOOP_C
LWL 1,1|AFunc,DELETE_OBJ_PROC
*FireBall hits the screen
ANIM_FB_HIT_C
LWL 1,1|AFunc,OBJ_CONST
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_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_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_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_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_CK_PHIT+4,0,-8000H
LWL 1,1|AFunc,DELETE_OBJ
**************************************************************************
* *
* A_FIRE_BALL_TARGET_C *
* *
* Anim func to set up the velocities and what not for *
* the fire ball FROM COPTER. *
* *
* A8 = ptr to the fire ball object *
* *
**************************************************************************
A_FIRE_BALL_TARGET_C
MOVI 800,A0
CALLA RANDPER ;This is the chance that we target
JRNC AFBTC_FULL_SCREEN ;BR = Not this time
CALLA GET_PLAYER_EXTENTS
JRUC AFBTC_PICK_TARGET
AFBTC_FULL_SCREEN
MOVI [SCRTOP+SKYTOPOF,SCRLFT],A2
MOVI [SCRBOT,SCRRGT],A3
AFBTC_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
MOVE @WING_COUNT,A14,W
JRNZ AFBTC_NORMAL_ARC ;BR=WE AT LEAST ONE WING
MOVI 90000H,A0
JRUC AFBTC_CALC_ARC
AFBTC_NORMAL_ARC
MOVI 40000H,A0
AFBTC_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_HISS
RETS
**************************************************************************
* *
* A_CHECK_FB_SCREEN_HIT_C *
* *
* Anim func to check if FireBall FROM COPTER hit the screen. *
* *
* A8 = ptr to FireBall *
* *
**************************************************************************
A_CHECK_FB_SCREEN_HIT_C
MOVI SND_FB_HIT_SCRN,A4
MOVI ANIM_FB_HIT_C,A5
JAUC CHECK_SCREEN_HIT
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
* *
* C_INIT_LAUNCHER *
* *
**************************************************************************
C_INIT_LAUNCHER
MOVE *B0+,B14,L
MOVE B14,A1
MOVE A1,*A0(OATTACKANIM),L
CALLA STRTANIM
CLR A14
MOVE A14,*A0(ONORMAL_PAL),L
MOVE A14,*A0(ODAMANIM),L
MOVE A14,*A0(OFLASHOBJ),L
JRUC C_SET_HITS
**************************************************************************
* *
* C_INIT_GUN *
* *
**************************************************************************
C_INIT_GUN
MOVE A0,B14
ADDI ONORMAL_PAL,B14
MOVE *B0+,*B14+,L ;NORMAL PALETTE
MOVE *B0+,*B14+,L ;HILITE PALETTE
MOVE *B0+,B3,L ;ATTACK ANIMATION
MOVE B3,*B14+,L
MOVE *B0+,*B14+,W ;FIRE ANIMATION OFFSET
ADDK 010H,B14
MOVE *B0+,*B14+,L ;SOUND
MOVE *B0+,*B14+,L ;DAMAGE ANIMATION
MOVE *B0+,*B14+,L ;FLASH INIT TABLE
MOVE *B0+,*B14+,L ;FLASH OFFSET
CLR B1
MOVE B1,*B14,L ;CLEAR FLASH OBJECT
MOVE B3,A1
JRZ CIG_DONE
CALLA STRTANIM
CIG_DONE
JRUC C_SET_HITS
**************************************************************************
* *
* C_SET_HITS *
* *
**************************************************************************
C_SET_HITS
MOVE *B0+,B14,W
MOVE B14,A14
MOVE A14,*A0(OHITS),W
CLR A14
MOVE A14,*A0(OHITTIME),L ;CLEAR OHITTIME AND OHITCOUNT
RETS
**************************************************************************
* *
* C_RESTART_GAT_ANIM - RESTART GAT GUN FLASHES WHERE THEY LEFT OFF *
* *
* PASS: *
* A8 = GAT GUN OBJ *
* A0 = FLASH OBJ *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
C_RESTART_GAT_ANIM
MOVE *A8(OFLASHANIM),A1,L
MOVI GATFLASH_ANIM,A14
JAUC STRTANIM_OFF
**************************************************************************
* *
* C_CHANGE_ENGINE_PAL - CREATE A DIFFERENT PALETTE FOR THE ENGINE COLOR *
* CYCLE *
* *
**************************************************************************
C_CHANGE_ENGINE_PAL
MOVE A0,A8
MOVI gGRAD2cy2,A0
CALLA CHANGE_PAL
;A8 GETS RESTORED AFTER WE RETURN
RETS
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
* *
* COPTER FRAGMENTS *
* *
**************************************************************************
FRAG_C1
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(1 << 11) + (0 << 6) + 0
.long 0
FRAG_C2
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(1 << 11) + (1 << 6) + 0
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(1 << 11) + (0 << 6) + 0
.long 0
FRAG_C5
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(1 << 11) + (1 << 6) + 0
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(1 << 11) + (1 << 6) + 0
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(2 << 11) + (1 << 6) + 0
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(1 << 11) + (0 << 6) + 0
.long 0
FRAG_C10
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(2 << 11) + (1 << 6) + 0
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(2 << 11) + (1 << 6) + 0
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(2 << 11) + (1 << 6) + 0
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(2 << 11) + (1 << 6) + 0
.long FRAG_UANIM,F_UFRAG_STUFF_X2
.word OID_JUNK,(2 << 11) + (0 << 6) + 0
.long 0
FRAG_CS4
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(1 << 11) + (1 << 6) + 0
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(1 << 11) + (1 << 6) + 0
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(1 << 11) + (1 << 6) + 0
.long FRAG_SHARD_ANIM,F_UFRAG_STUFF
.word OID_JUNK,(1 << 11) + (0 << 6) + 0
.long 0
YELLOW_METAL_CHUNK:
.word 32
.word 0001fh,051a0h,055c0h,059e0h,06200h,06220h,05e00h,04d80h
.word 06620h,06a40h,06640h,06640h,06a60h,059c0h,06620h,06e80h
.word 072a1h,07ae3h,07281h,06200h,07f04h,07ac2h,076c2h,076a2h
.word 05de0h,07f25h,06e60h,07ac3h,07ee3h,06e60h,07f26h,07febh
GRAY_METAL_CHUNK:
.word 32
.word 0001fh,01063h,01484h,018a5h,020c7h,020e7h,01cc6h,00c42h
.word 024e8h,02909h,02508h,02507h,02929h,01885h,024e7h,02d4ah
.word 0316bh,039adh,0314bh,020c6h,03dceh,0398ch,0358ch,0356ch
.word 01ca6h,041efh,02d2ah,0398dh,03dadh,02d29h,045f0h,05ab5h
;**************************************************************************
;* *
;* F_CFRAG_STUFF *
;* *
;**************************************************************************
;
;F_CFRAG_STUFF
; MOVE *A0(OFLAGS),A14,W
; ORI M_DBLSCL,A14
; MOVE A14,*A0(OFLAGS),W
;
; JAUC F_UFRAG_STUFF ;TAKE CARE OF THE PALETTE STUFF
;**************************************************************************
;* *
;* A_BIG_EXPLO *
;* *
;**************************************************************************
;
;A_BIG_EXPLO
; MOVI EXPLO_INIT,A5
; CALLA CREATE_OBJ
; JRZ ABE_DONE
;
; MOVE *A0(OFLAGS),A14,W
; ORI M_MANSCALE,A14
; MOVE A14,*A0(OFLAGS),W
;
; MOVE *A8(OXVAL),A2,L
; MOVE A2,*A0(OXVAL),L
;
; MOVE *A8(OYVAL),A4,L
; SUBI 60*2 << 15,A4
; MOVE A4,*A0(OYVAL),L
;
; MOVE *A8(OZVAL),A5,L
; SUBK 9,A5
; MOVE A5,*A0(OZVAL),L
;
; MOVE A0,A8
; MOVE @ZBASE,A14,L
; SUB A14,A5
; SRL Z2SCALE+3,A5
; CALLA SET_SCALE_MANUAL
;
; CALLA INSOBJ
;
; SOUND1 SND_CHAN3_OFF
; SOUND1 SND_FINAL_EXPLO_COPTER
;ABE_DONE
; RETS
EXPLO_INIT
.LONG FHKEXPLOB1, 0
; .WORD OID_JUNK, DMAWNZ, M_MANSCALE, 0
.WORD OID_JUNK, DMAWNZ, 0, 0
.LONG C_STRTANIM
.LONG EXPLO_ANIM
**************************************************************************
* *
* A_DELETE_COPTER *
* *
**************************************************************************
A_DELETE_COPTER
; CLR A14
; MOVE A14,@COPTER_OBJ,L
MOVE *A8(OPLAYER),A2,L
JAUC DELETE_ENEMY
SHAKE_SUB_ANIM
LWL 1,2|AFunc,A_SHAKE_COPTER
LWLL 1,1|AFunc,A_Anim_DSJ+2,SHAKE_SUB_ANIM
LWL 1,1|AFunc,A_RETURN
**************************************************************************
* *
* ADD_FIRE - FIRE GOOD! *
* *
* PASS: *
* A5 = FIRE INIT TABLE *
* A8 = OBJECT (PART OR HEAD) *
* A9 = OPARTSXY *
* A10 = FLIP BITS *
* RETURN: *
* A0 = NEW OBJECT *
* *
**************************************************************************
ADD_FIRE
MMTM SP,A2,A8
CALLA CREATE_OBJ
JRZ AF_DONE
MOVE *A0(OCTRL),A14,W
OR A10,A14
MOVE A14,*A0(OCTRL),W
MOVE A9,*A0(OPARTSXY),L
CALLA GET_HEAD_PART
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
MOVE *A8(OZVAL),A3,L
CALLA SETOFFPU
CALLA INSOBJ
CALLA INSPART
AF_DONE
MMFM SP,A2,A8
RETS
**************************************************************************
* *
* A_SIDE_SMOKE - MAKE SMOKE FOR THE SIDE FIRE *
* *
* PASS: *
* A8 = FIRE OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_SIDE_SMOKE
MOVI 768,A0
CALLA RANDPER
JRNC ASS_DONE ;BR=THANK YOU FOR NOT SMOKING
MOVI SIDE_SMOKE_INIT,A5
CALLA CREATE_OBJ
JRZ ASS_DONE ;BR=GOT NO SMOKE
MOVE *A8(OCTRL),A10,W
MOVI 76*2 << 15,A1
BTST B_FLIPH,A10
JRZ ASS_XVAL_OK ;BR=NO FLIP
NEG A1
ASS_XVAL_OK
MOVE *A8(OXVAL),A14,L
SUB A1,A14
MOVE A14,*A0(OXVAL),L
MOVE *A8(OYVAL),A14,L
ADDI 91*2 << 15,A14
MOVE A14,*A0(OYVAL),L
MOVE *A8(OZVAL),A14,L
SUBK 32,A14
MOVE A14,*A0(OZVAL),L
MOVE A0,A7
MOVI 0100000H,A0
MOVI 010000H,A1
CALLA RANGERND
BTST B_FLIPH,A10
JRNZ ASS_XVEL_OK ;BR=NO FLIP
NEG A0
ASS_XVEL_OK
MOVE @XSCROLL,A14,L
ADD A14,A0
MOVE A0,*A7(OXVEL),L
MOVI 010000H,A0
MOVI -010000H,A1
CALLA RANGERND
MOVE @YSCROLL,A14,L
SUB A14,A0
MOVE A0,*A7(OYVEL),L
MOVE A7,A0
MOVE @RAND,A14,W
ANDI M_FLIPH|M_FLIPV,A14
MOVE *A0(OCTRL),A1,W
OR A14,A1
MOVE A1,*A0(OCTRL),W
CALLA INSOBJ
ASS_DONE
RETS
SIDE_SMOKE_INIT
.LONG SMOKTR1, 0
.WORD OID_JUNK, DMAWNZ, M_DBLSCL, 0
.LONG C_STRTANIM
.LONG COPTER_SMOKE_ANIM
SIDE_FIRE_INIT
.LONG FHKE5F1FIRE1, 0
.WORD OID_JUNK, DMAWNZ, M_DBLSCL, -1
.LONG C_STRTANIM
.LONG SIDE_FIRE_ANIM
SIDE_FIRE_ANIM
LWL FHKE5F1FIRE1,1|AFunc,A_SIDE_SMOKE
LW FHKE5F1FIRE2,1
LW FHKE5F1FIRE3,1
LW FHKE5F1FIRE4,1
LW FHKE5F1FIRE5,1
LW FHKE5F1FIRE6,1
.long 0
FUSE_FIRE_START_ANIM
LWLL HFIREA1,3|AFunc,A_CHANGE_PAL+2,FIRE2PAL
FUSE_FIRE_ANIM
LW HFIREA2,3
LW HFIREA3,3
LW HFIREA4,3
LW HFIREA5,3
LW HFIREA6,3
LW HFIREA1,3
.long 0
ENGINE_FIRE_INIT
.LONG HDFLAM1, 0
.WORD OID_JUNK, DMAWNZ, M_DBLSCL, -2
.LONG C_STRTANIM
.LONG ENGINE_FIRE_ANIM
ENGINE_FIRE_ANIM
LWL HDFLAM1,3|AFunc,A_ENGINE_SMOKE
LW HDFLAM2,3
LW HDFLAM3,3
LW HDFLAM4,3
LW HDFLAM5,3
LW HDFLAM6,3
LW HDFLAM7,3
.long 0
**************************************************************************
* *
* A_ENGINE_SMOKE *
* *
**************************************************************************
A_ENGINE_SMOKE
MOVI 010000H,A0
CLR A3
calla PreFrag_Box
INC B0
MOVI COPTER_SMOKE_FRAG,B14
JAUC Fragger
COPTER_SMOKE_FRAG
.long COPTER_SMOKE_ANIM,F_DOUBLE_SCALE
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGBOG+FRGNOFLY+FRGPAL)
.long COPTER_SMOKE_ANIM,F_DOUBLE_SCALE
.word OID_JUNK,(1 << 11) + (3 << 6) + (FRGBOG+FRGNOFLY+FRGPAL)
.long COPTER_SMOKE_ANIM,F_DOUBLE_SCALE
.word OID_JUNK,(1 << 11) + (3 << 6) + (FRGBOG+FRGNOFLY+FRGPAL)
.long COPTER_SMOKE_ANIM,F_DOUBLE_SCALE
.word OID_JUNK,(1 << 11) + (3 << 6) + (FRGBOG+FRGNOFLY+FRGPAL)
.long 0
F_DOUBLE_SCALE
ORIM M_DBLSCL,*A0(OFLAGS),W
RETS
COPTER_SMOKE_ANIM
LW SMOKTR1,3
LW SMOKTR2,3
LW SMOKTR3,3
LW SMOKTR4,4
LW SMOKTR5,4
LW SMOKTR6,4
LWL 1,1|AFunc,DELETE_OBJ
**************************************************************************
* *
* A_CHECK_STUTTER *
* *
**************************************************************************
A_CHECK_STUTTER
MOVK 1,A9
MOVE *A8(OPART1),A2,L
LOCKON Z
MOVE *A2(OSTUTTER),A3,W
JRZ ACS_SET
JRN ACS_SET
MOVE A3,A0
CALLA RANDPER
JRNC ACS_SET
NEG A3
MOVE A3,*A2(OSTUTTER),W
MOVE *A2(OCOMMAND),A14,W
BTST B_CHOVER,A14
JRZ ACS_NOSTOP
CLR A14
MOVE A14,*A2(OXVEL),L
; MOVI 08000H,A14
MOVE A14,*A2(OYVEL),L
MOVE A14,*A2(OZVEL),L
ACS_NOSTOP
MOVK 20,A0
MOVI 10,A1
CALLA RANGERND
MOVE A0,A9
SOUND1 SND_CHAN3_OFF
CREATE PID_IND,RESTART_COPTER_SND_PROC
ACS_SET
MOVB A9,*A8(AnimSLP)
RETS
**************************************************************************
* *
* RESTART_COPTER_SND_PROC *
* *
**************************************************************************
RESTART_COPTER_SND_PROC
INC A9
SLEEPR A9
SOUND0 SND_COPTER_FULL
DIE
**************************************************************************
* *
* A_RESET_STUTTER *
* *
**************************************************************************
A_RESET_STUTTER
MOVE *A8(OPART1),A0,L
LOCKON Z
MOVE *A0(OSTUTTER),A14,W
JRNN ARS_DONE
NEG A14
MOVE A14,*A0(OSTUTTER),W
ARS_DONE
RETS
SHAKE_ANIM
LWL 1,2|AFunc,A_SHAKE_COPTER
LWLL 1,1|AFunc,A_Anim_DSJ+2,SHAKE_ANIM
LWL 1,1|AFunc,PULL_ANIM
**************************************************************************
* *
* A_SHAKE_COPTER *
* *
**************************************************************************
A_SHAKE_COPTER
MOVE *A8(OCOMMAND),A1,W
; MOVE @DESTROYING_PARTS,A14,W
; JRNZ ASC_GO ;BR=SHAKE IF DESTROYING PART
BTST B_CHOVER,A1
JRZ ASC_ABORT ;BR=DON'T SHAKE WERE NOT HOVERIN
MOVB *A8(OSHAKERADIUS),A5
SLL 15,A5 ;WORLD SHAKE RADIUS
;ASC_GO
BTST B_CFINAL,A1
JRNZ ASC_FINAL ;BR=THIS IS THE FINAL BATTLE
; CLR A14
; MOVE A14,*A8(OZVEL),L
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A1,A2,A3
MOVE A3,A4
MOVE A1,A3
;
CLR A0
CLR A1
MOVE A2,A6
MOVE @COPTER_OBJ,A14,L
JRNZ ASC_YGO ;BR=NOT THE FINAL CASE
SUBI 70 << 15,A6
ASC_YGO
MOVE @YBASE,A14,L
ADD A14,A6
JRN ASC_GO_DOWN
;
MOVE A5,A1
NEG A1
;
JRUC ASC_GET_YOFF
ASC_GO_DOWN
;
MOVE A5,A0
;
ASC_GET_YOFF
;
CALLA RANGERND
ADD A0,A2
;
CLR A0
CLR A1
MOVE A4,A6
MOVE @XBASE,A14,L
SUB A14,A6
JRN ASC_GO_RIGHT
;
MOVE A5,A1
NEG A1
;
JRUC ASC_GET_XOFF
ASC_GO_RIGHT
;
MOVE A5,A0
;
ASC_GET_XOFF
;
CALLA RANGERND
ADD A0,A4
MOVE A4,A1
CALLA SET_ANIPU
ASC_ABORT
RETS
ASC_FINAL ;SHAKE DURING FINAL SEQUENCE
CALLR COPTER_ONSCRN
MOVE A0,A6
MOVE A8,A14
ADDI OXVAL,A14
MMFM A14,A1,A2,A3 ;UNIVERSE Y (A2)
MOVE A3,A4 ;UNIVERSE X (A4)
MOVE A1,A3 ;UNIVERSE Z (A3)
MOVE A2,A1 ;TOP UNIVERSE Y
MOVE A2,A0 ;BOTTOM UNIVERSE Y
BTST 2,A6
JRNZ ASC_F_CHECK_BOTTOM ;BR=VIOLATES TOP
SUB A5,A1
ASC_F_CHECK_BOTTOM
BTST 3,A6
JRNZ ASC_F_GET_Y ;BR=VIOLATES BOTTOM
ADD A5,A0
ASC_F_GET_Y
CALLA RANGERND
MOVE A0,A2
MOVE A4,A1 ;LEFT UNIVERSE X
MOVE A4,A0 ;RIGHT UNIVERSE X
BTST 0,A6
JRNZ ASC_F_CHECK_RIGHT ;BR=VIOLATES LEFT
SUB A5,A1
ASC_F_CHECK_RIGHT
BTST 1,A6
JRNZ ASC_F_GET_X ;BR=VIOLATES RIGHT
ADD A5,A0
ASC_F_GET_X
CALLA RANGERND
MOVE A0,A1
CALLA SET_ANIPU
RETS
**************************************************************************
* *
* COPTER_ONSCRN *
* *
* PASS: *
* A8 = HEAD COPTER OBJECT *
* *
* RETURN: *
* A0 = BOUNDARIES VIOLATED *
* LEFT=BIT 0, RIGHT=BIT 1, TOP=BIT 2, BOTTOM=BIT 3 *
* *
**************************************************************************
COPTER_ONSCRN
MOVE *A8(OZVAL),A0,L
CALLR SETUP_OFFSCRN_TABLE_PTR
CLR A0 ;CLEAR BOUNDARY VIOLATIONS
MOVE *A2+,A1,W ;GET PACKED WORLD X BOUNDARY
SLL 12,A1 ;UNPACK WORLD X BOUNDARY
SUBI (144*2) << 15,A1 ;OFFSET FROM EDGE OF BOUNDARY
MOVE *A8(OXVAL),A3,L
MOVE @XBASE,A14,L
SUB A14,A3
CMP A1,A3
JRLT CO_CHECK_LEFT ;BR=WITHIN WORLD RIGHT X
ORI 2,A0
CO_CHECK_LEFT
NEG A1
CMP A1,A3
JRGT CO_CHECK_TB ;BR=WITHIN WORLD LEFT X
ORI 1,A0
CO_CHECK_TB
MOVE *A2,A1,L ;GET PACKED WORLD Y [BOT, TOP]
SEXT A1,W
SLL 12,A1 ;UNPACK WORLD Y TOP BOUNDARY
ADDI (122*2) << 15,A1 ;OFFSET FROM EDGE OF BOUNDARY
MOVE *A8(OYVAL),A3,L
CMPI ABOVE_BUILDING_UNIVY,A3
JRLT CO_CHECK_TOP ;BR=WITHIN WORLD BOTTOM Y
ORI 8,A0
CO_CHECK_TOP
MOVE @YBASE,A14,L
ADD A14,A3
CMP A1,A3
JRGT CO_DONE ;BR=WITHIN WORLD TOP Y
ORI 4,A0
CO_DONE
RETS
FRAG_ONE_EXPLO
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long 0
FRAG_THREE_EXPLO
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (6 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (6 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long 0
FRAG_DAMAGE_EXPLO
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (6 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (6 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (6 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (6 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (6 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (6 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long EXPLO_ANIM,F_ONE_EXPLO_STUFF
.word OID_JUNK,(1 << 11) + (0 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
.long 0
F_ONE_EXPLO_STUFF
MOVE *A0(OFLAGS),A14,W
ORI M_DBLSCL,A14
MOVE A14,*A0(OFLAGS),W
RETS
EXPLO_ANIM
LWLL FHKEXPLOB1,6|AFunc,A_SOUND+2,SND_EXPLO_COPTER
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
**************************************************************************
* *
* DUM_FLASH_PROC - FLASH AN OBJECT BUT DON'T CARE *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
DUM_FLASH_PROC
SETF 4,0,0 ;FIELD 0 IS 4 BITS
MOVE *A8(OCTRL),A14,0
CMPK 8,A14 ;DMACNZ
JREQ DFP_NOFLASH ;BR=WE'RE CONSTANT ALREADY!
MOVK 8,A14 ;DMACNZ
MOVE A14,*A8(OCTRL),0
SETF 16,1,0 ;WORD SIGN EXTEND
SLEEP 3
SETF 4,0,0 ;FIELD 0 IS 4 BITS
MOVK 2,A14 ;DMAWNZ
MOVE A14,*A8(OCTRL),0
DFP_NOFLASH
SETF 16,1,0 ;WORD SIGN EXTEND
DIE
**************************************************************************
* *
* BLOW_PART - DESTROY A PART WITH EXPLOSIONS AND FRAGMENTS *
* *
* PASS: *
* A1 = RIGHT MINIMUM X VELOCITY (LEFT IF UNFLIPPED) *
* A2 = RIGHT MAXIMUM X VELOCITY (LEFT IF UNFLIPPED) *
* A3 = MINIMUM Y VELOCITY *
* A4 = MAXIMUM Y VELOCITY *
* A5 = RIGHT [Y, X] PIXEL OFFSET FROM ANIMATION POINT (LEFT IF UNFLIPPED)*
* A6 = SHAKE RADIUS *
* A7 = FRAGMENT SCRIPT *
* A8 = OBJECT TO DESTROY *
* A9 = NUMBER OF TIME TO BLOW *
* A10= CALL THIS ROUTINE AFTER BLOWN (DELETE PART IF ZERO) *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
DUP_PART
PUSH A1
MOVI DUP_PART_ANIM,A1
JRUC BP_GO
BLOW_PART
PUSH A1
MOVI BLOW_PART_ANIM,A1
BP_GO
CALLA STRT_ANIM
PULLQ A1
MOVE *A8(OPLINK),A0,L
JRZ BP_NOPROC
CALLA KILL
BP_NOPROC
MOVE @DESTROYING_PARTS,A14,W
INC A14
MOVE A14,@DESTROYING_PARTS,W
MOVI DUMRETS,A14
MOVE A14,*A8(OGUNVECT),L
MOVI DUMCOLL,A14
MOVE A14,*A8(OCVECT),L
; CLR A14
; MOVB A14,*A8(OPARTID)
MOVE A8,A14
ADDI OMINXVEL+020H,A14
MMTM A14,A1,A2,A3,A4,A5,A6,A7,A10
MOVB A9,*A8(AnimLoop)
MOVE *A8(OPART1),A0,L
LOCKON Z
MOVE A6,A6
JRZ BP_NOSTOP ;BR=NO SHAKE, NO STOP
CLR A14
MOVE A14,*A0(OXVEL),L
MOVE A14,*A0(OYVEL),L
MOVE A14,*A0(OZVEL),L
MOVE A14,*A0(OYACCEL),W ;YOU BIG DUMMY!
BP_NOSTOP
MOVE *A0(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1
CMPI ZMAX_KLUDGE,A1
JRGT BP_DONE ;BR=NOT BEFORE THE CLOSEST Z
MOVE *A0(OXVAL),A1,L
MOVE *A0(OYVAL),A2,L
MOVI ZMAX_REAL,A3 ;PLACE ON SCREEN
MOVE A8,A4
MOVE A0,A8
CALLA SET_ANIPU ;MOVE COPTER THERE
MOVE A4,A8
BP_DONE
RETS
BLOW_PART_ANIM
LWL 1,0|AFunc,A_BLOW_PART
LWLL 1,1|AFunc,A_Anim_DSJ+2,BLOW_PART_ANIM
LWL 1,1|AFunc,A_BLOWN_PART
DUP_PART_ANIM
LWL 1,0|AFunc,A_BLOW_DUP
LWLL 1,1|AFunc,A_Anim_DSJ+2,DUP_PART_ANIM
LWL 1,1|AFunc,A_BLOWN_PART
**************************************************************************
* *
* A_BLOWN_PART - PART IS BLOWN SO DELETE IT *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_BLOWN_PART
MOVE @DESTROYING_PARTS,A14,W
DEC A14
MOVE A14,@DESTROYING_PARTS,W
MOVE *A8(OBLOWN_ROUTINE),A1,L
JAZ DELETE_OBJ ;BR=NO ROUTINE, JUST DELETE
CALLA PULL_ANIM
JUMP A1
**************************************************************************
* *
* A_BLOW_DUP - BLOW A DUPLICATE PART FROM THE ORIGINAL *
* *
* PASS: *
* A8 = OBJECT TO BLOW *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_BLOW_DUP
MOVI 512,A0
CALLA RANDPER
JRC A_BLOW_PART ;BR=MAKE AN EXPLOSION THIS TIME
MOVE *A8(OZVAL),A9,L
SUBK 32,A9
MOVE @ZBASE,A10,L
SUB A10,A9
CMPI ZMAX_KLUDGE,A9
JRLT ABP_ABORT ;BR=BEFORE CLOSEST Z
MOVE *A8(ODUP_INIT),A5,L
CALLA CREATE_OBJ
JRZ ABP_ABORT
MOVE *A8(OXVAL),*A0(OXVAL),L
MOVE *A8(OYVAL),*A0(OYVAL),L
MOVE *A8(OZVAL),*A0(OZVAL),L
MOVE A0,A7
MOVE A8,A14
ADDI OFRAG_SCRIPT,A14
MMFM A14,A0,A1,A2,A3,A4,A6,A11 ;A4 IS NOT USED
SLL 1,A0
SLL 1,A1
SLL 1,A2
SLL 1,A3
CALLA RANGERND
MOVE *A8(OCTRL),A14,W
ANDI M_FLIPH|M_FLIPV,A14
MOVE *A7(OCTRL),A4,W
OR A14,A4
MOVE A4,*A7(OCTRL),W
BTST B_FLIPH,A4
JRNZ ABD_SET_XVEL ;BR=FLIPPED, DIRECTIONS OK
NEG A0 ;LEFT X VELOCITY
NEG A1 ;LEFT X VELOCITY
NEGX A4 ;LEFT X OFFSET
ABD_SET_XVEL
MOVE A0,*A7(OXVEL),L
MOVE A3,A0
MOVE A2,A1
CALLA RANGERND
MOVE A0,*A7(OYVEL),L
MOVE A7,A0
CALLA INSOBJ
JRUC ABP_FRAG
**************************************************************************
* *
* A_BLOW_PART - MAKE ONE EXPLOSION *
* *
* PASS: *
* A8 = OBJECT TO BLOW *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_BLOW_PART
MOVE A8,A0
CALLA GETHEADPART
MOVE A0,B8
MOVE *A8(OZVAL),A9,L
SUBK 32,A9
MOVE @ZBASE,A10,L
SUB A10,A9
CMPI ZMAX_KLUDGE,A9
JRLT ABP_ABORT ;BR=BEFORE CLOSEST Z
MOVI EXPLO_INIT,A5
CALLA CREATE_OBJ
JRZ ABP_ABORT
MOVE A0,A7
MOVE A8,A14
ADDI OFRAG_SCRIPT,A14
MMFM A14,A0,A1,A2,A3,A4,A6,A11
CALLA RANGERND
MOVE *A8(OCTRL),A5,W
BTST B_FLIPH,A5
JRNZ ABP_SET_XVEL ;BR=FLIPPED, DIRECTIONS OK
NEG A0 ;LEFT X VELOCITY
NEG A1 ;LEFT X VELOCITY
NEGX A4 ;LEFT X OFFSET
ABP_SET_XVEL
MOVE *B8(OXVEL),B14,L
MOVE B14,A14
ADD A14,A0
MOVE A0,*A7(OXVEL),L
MOVE A3,A0
MOVE A2,A1
CALLA RANGERND
MOVE *B8(OYVEL),B14,L
MOVE B14,A14
ADD A14,A0
MOVE A0,*A7(OYVEL),L
MOVE A4,A4
JRNZ ABP_NOBOX ;BR=WE HAVE AN OFFSET
MOVE *A8(OIMG),A1,L ;PICK POINT INSIDE BOX
MOVE *A1(IANIOFF),A2,L
MOVE *A1(ISIZE),A3,L
BTST B_FLIPH,A5
JRZ ABP_NOBOXFLIP ;BR=NO FLIP FOR X
NEGX A2
NEGX A3
ABP_NOBOXFLIP
MOVE *A8(OXVAL),A1,L
MOVE A2,A14
SEXT A14,W
SLL 15+1,A14 ;PLUS ONE FOR DOUBLE SCALE
SUB A14,A1
MOVE A1,A0
MOVE A3,A14
SEXT A14,W
SLL 15+1,A14
ADD A14,A0
CALLA RANGERND
MOVE A0,*A7(OXVAL),L
MOVE *A8(OYVAL),A1,L
SRA 16,A2
SLL 15+1,A2 ;PLUS ONE FOR DOUBLE SCALE
SUB A2,A1
MOVE A1,A0
SRA 16,A3
SLL 15+1,A3
ADD A3,A0
CALLA RANGERND
MOVE A0,*A7(OYVAL),L
MOVE A7,A0
JRUC ABP_SETZ
ABP_NOBOX
MOVE A7,A0
MOVE *A8(OXVAL),A1,L
MOVE A4,A14
SEXT A14,W
SLL 15,A14
ADD A14,A1 ;X OFFSET
MOVE A1,*A0(OXVAL),L
MOVE *A8(OYVAL),A1,L
SRA 16,A4
SLL 15,A4
ADD A4,A1 ;Y OFFSET
MOVE A1,*A0(OYVAL),L
ABP_SETZ
MOVE A9,A5
ADD A10,A9
MOVE A9,*A0(OZVAL),L
MOVE A8,A9
MOVE A0,A8
MOVE *A8(OFLAGS),A14,W
ORI M_MANSCALE,A14
MOVE A14,*A8(OFLAGS),W
SRA Z2SCALE+1,A5
MOVE A5,A14
SRL 4,A14
SUB A14,A5
CALLA SET_SCALE_MANUAL
MOVE A9,A8
CALLA INSOBJ
ABP_FRAG
MOVE A11,B14
JRZ ABP_SHAKE ;BR=NO FRAGMENTS HERE BUDDY
MOVI 040000H,A0
CLR A3
CALLA PreFrag_Box
MOVI -0100H,B9
MOVI -01H,B10
MOVE A11,B14
CALLA Fragger
CMPI FRAG_CS4,A11
JRNE ABP_COPYPAL ;BR=NOT GLASS JUST COPY PALETTE
MOVI SHARDPAL1,A14 ;SILVER PALETTE
MOVE A14,*A0(FPDATA),L ;SET PALETTE
JRUC ABP_SHAKE
ABP_COPYPAL
MOVE *A8(OIMG),A1,L
MOVE *A1(ICMAP),*A0(FPDATA),L ;SET PALETTE
ABP_SHAKE
MOVE A6,A5
JRZ ABP_SLEEP ;BR=NO SHAKE
SLL 15,A5 ;WORLD SHAKE RADIUS
MOVE *A8(OPART1),A8,L
CALLR ASC_FINAL ;SHAKE
MOVE A9,A8
ABP_SLEEP
MOVK 4,A0 ;RANDOM SLEEP
CALLA RANDU
MOVE A0,A14
SLL 8,A14
OR A14,A0
MOVE A0,*A8(AnimSLP),W
ABP_ABORT
RETS
**************************************************************************
* *
* A_FRAG_PART - MAKE FRAGMENTS COME FROM A PART *
* *
* PASS: *
* A8 = PART TO BASE FRAG *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_FRAG_PART
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1
CMPI ZMAX_KLUDGE,A1
JRLT AFP_ABORT
MOVI 040000H,A0
CLR A3
CALLA PreFrag_Box
MOVI -0100H,B9
MOVI -01H,B10
MOVE *A8(OFRAG_SCRIPT),A11,L
MOVE A11,B14
CALLA Fragger
CMPI FRAG_CS4,A11
JRNE AFP_COPYPAL ;BR=NOT GLASS JUST COPY PALETTE
MOVI SHARDPAL1,A14 ;SILVER PALETTE
MOVE A14,*A0(FPDATA),L ;SET PALETTE
RETS
AFP_COPYPAL
MOVE *A8(OIMG),A1,L
MOVE *A1(ICMAP),*A0(FPDATA),L ;SET PALETTE
AFP_ABORT
RETS
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
* *
* COPTER COLLISION AND GUN VECTORS *
* *
**************************************************************************
COPTER_COLL
WWL OID_PROCKET,~MASK_PLAYER,COPTER_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,COPTER_EXPLOSION_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* COPTER_ROCKET_COLL *
* *
* PASS: *
* A0 = ROCKET OBJECT *
* A8 = COPTER PART OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
COPTER_ROCKET_COLL
MOVE A0,*A8(OATE_ROCKET),L ;SAVE ROCKET OBJECT
RETS
**************************************************************************
* *
* COPTER_EXPLOSION_COLL *
* *
* PASS: *
* A0 = EXPLOSION OBJECT *
* A8 = COPTER PART OBJECT *
* RETURN: *
* A0 = ROCKET DAMAGE HIT QUANTITY *
* *
**************************************************************************
COPTER_EXPLOSION_COLL
MOVE *A8(OATE_ROCKET),A14,L
JRZ CV_DONE ;BR=NO ROCKET COLLISION
CMP A0,A14
JRNE CV_DONE ;BR=DIFFERENT EXPLOSION
MOVE *A0(RL_INTENDED_OBJ),A14,L ;DO WE HAVE THE RIGHT TARGET?
CMP A8,A14
JRNE CV_DONE ;BR=NOPE. NOT THE RIGHT TARGET.
COPTER_FLIGHT_EXPLO_COLL
CLRM *A8(OATE_ROCKET),L ;HIT! READY FOR ANOTHER!
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
MOVI ROCKET_DAMAGE,A0,W ;ROCKET DAMAGE
MOVE *A8(OCOLLISION),A14,L
JRZ CC_DONE ;BR=NO COLLSION ROUTINE
JUMP A14
CC_DONE
RETS
**************************************************************************
* *
* COPTER_HIT *
* *
* NOTE: DON'T TRASH A2! *
* NOTE: DON'T TRASH A2! *
* NOTE: DON'T TRASH A2! *
* *
* PASS: *
* A0 = DAMAGE POINTS *
* A8 = OBJECT *
* RETURN: *
* A5 = RESULTING DAMAGE RETURN STATE (0 = 10 GUN HITS OR ROCKET, *
* 1 = SINGLE GUN HIT, *
* 2 = DESTROYED) *
* *
**************************************************************************
COPTER_HIT
.if BILL
JRUC CV_DESTROYED ;BR=COPTER DESTROYED
.endif
MOVE *A8(OHITS),A1,W
SUB A0,A1 ;DO THE DAMAGE
MOVE A1,*A8(OHITS),W
SRA 8,A0 ;THROW AWAY FRACTION
MOVE @ROW_TIME,A4,L ;TIME OF LAST HIT IN A ROW
MOVE @WAVEIRQS,A14,L
MOVE A14,A3
SUB A4,A14
CMPI 60,A14
JRLE CV_ROW ;BR=UNDER MINIMUM TIME
CLR A14 ;RESET TIME
JRUC CV_SAVE_ROW
CV_ROW
MOVE @ROW_HITS,A14,W ;GET CURRENT HITS IN A ROW
ADD A0,A14
CV_SAVE_ROW
MOVE A14,@ROW_HITS,W ;SAVE NUMBER OF HITS IN A ROW
MOVE A3,@ROW_TIME,L ;NEW LAST TIME FOR HIT IN A ROW
CLR A5 ;DEFAULT TO NULL RETURN STATE
MOVE *A8(OPART1),A14,L
.if DEBUG
LOCKON Z
.endif
MOVE *A14(OCOMMAND),A14,W
BTST B_CINVINCIBLE,A14
JRNZ CV_DONE ;BR=NO HURT
DEC A1
JRN CV_DESTROYED ;BR=COPTER DESTROYED
;CV_CHOOSE
; CLR A5 ;DEFAULT TO NULL RETURN STATE
CMPK ROCKET_DAMAGE >> 8,A0
JREQ CV_ROCKET ;BR=COPTER HIT BY FULL ROCKET
CMPK GUN_DAMAGE >> 8,A0
; JANE UNIV_FLASH ;BR=INDIRECT HIT
JRNE CV_DONE ;BR=INDIRECT HIT
CV_GUN
CLR A4 ;DEFAULT TO RESET HIT COUNT
MOVK 1,A5 ;GUN HIT RETURN STATE
MOVE *A8(OHITTIME),A14,W ;GET LAST TIME
MOVE @WAVEDISPS,A3,W ;GET CURRENT TIME
MOVE A3,*A8(OHITTIME),W ;SAVE THIS TIME AS LAST TIME
SUB A3,A14 ;CALCULATE DELTA TIME
NEG A14
CMPK 5,A14
JRGT CV_SAVE_COUNT ;BR=TOO LONG, RESET LAST TIME
MOVE *A8(OHITCOUNT),A4,W ;ANOTHER QUICK HIT
INC A4
CMPK 10,A4
JRLT CV_SAVE_COUNT ;BR=NOT HIT ENOUGH
CLR A0 ;MAKE AN EXPLOSION
CLR A3
CLR A4
CALLA PreFrag_Gun
SUBI 0100H,B0 ;PLACE IN FRONT OF COPTER
MOVI -0400H,B10 ;ZVEL INSURE IN FRONT OF COPTER
MOVE B10,B9
MOVE *A8(OPART1),A1,L
LOCKON Z
; MOVE *A1(OZVEL),A14,L
; JRNN CV_ONE_EXPLO ;BR=FLYING AWAY IN Z
; MOVE A14,B9 ;GIVE FRAGS 1.5*COPTER VELOCITY
; MOVE B9,B10
; SRA 1,B10
; ADD B10,B9
; MOVE B9,B10
;CV_ONE_EXPLO
MOVI FRAG_ONE_EXPLO,B14
CALLA Fragger
MOVE A1,A0 ;HEAD OBJECT
MOVK 10,A3 ;SHAKE RADIUS
MOVE *A0(OFLAGS),A14,W
BTST B_ANIM,A14
JRZ CV_GUN_SHAKE ;BR=NOT ANIMATING
MOVB *A0(OSHAKERADIUS),A14
CMP A3,A14
JRGT CV_NO_GUN_SHAKE ;BR=A BIGGER SHAKE IS GOIN ON
CV_GUN_SHAKE
MOVK 1*3,A14 ;NUMBER OF SHAKES
MOVB A14,*A0(AnimLoop)
MOVB A3,*A0(OSHAKERADIUS)
MOVI SHAKE_ANIM,A1
CALLA STRTANIM
CV_NO_GUN_SHAKE
CLR A5 ;NULL RETURN STATE
CV_SAVE_COUNT
MOVE A4,*A8(OHITCOUNT),W
JAUC UNIV_FLASH ;FLASH AND RETURN
CV_ROCKET
CALLA UNIV_FLASH ;FLASH!
CV_ROCKET_NOFLASH
MMTM SP,B1,B2,B4,B5,B6,B8,B9 ;MAKE 3 EXPLOSIONS
MOVI 020000H,A0
CLR A3
; CALLA PreFrag_Box
CALLA PreFrag_Center
SUBI 0100H,B0 ;PLACE IN FRONT OF COPTER
MOVI -0400H,B10 ;ZVEL INSURE IN FRONT OF COPTER
MOVE B10,B9
MOVE *A8(OPART1),A1,L
LOCKON Z
; MOVE *A1(OZVEL),A14,L
; JRNN CV_THREE_EXPLO ;BR=FLYING AWAY IN Z
; MOVE A14,B9 ;GIVE FRAGS 1.5*COPTER VELOCITY
; MOVE B9,B10
; SRA 1,B10
; ADD B10,B9
; MOVE B9,B10
;CV_THREE_EXPLO
;; MOVI -0FFH,B9
;; MOVI -01H,B10
MOVI FRAG_THREE_EXPLO,B14
CALLA Fragger
MMFM SP,B1,B2,B4,B5,B6,B8,B9
MOVE A1,A0 ;HEAD OBJECT
MOVK 15,A3 ;SHAKE RADIUS
MOVE *A0(OFLAGS),A14,W
BTST B_ANIM,A14
JRZ CV_ROCKET_SHAKE ;BR=NOT ANIMATION
MOVB *A0(OSHAKERADIUS),A14
CMP A3,A14
; JAGT UNIV_FLASH ;BR=A BIGGER SHAKE IN GOIN ON
JRGT CV_DONE ;BR=A BIGGER SHAKE IN GOIN ON
CV_ROCKET_SHAKE
MOVK 3*3,A14 ;NUMBER OF SHAKES
MOVB A14,*A0(AnimLoop)
MOVB A3,*A0(OSHAKERADIUS)
MOVI SHAKE_ANIM,A1
CALLA STRTANIM
; JAUC UNIV_FLASH ;FLASH AND RETURN NULL IN A5
RETS
CV_DESTROYED
MOVK 2,A5 ;DESTROYED RETURN STATE
CV_DONE
RETS
MMTM SP,B1,B2,B4,B5,B6,B8,B9 ;MAKE FRAGMENTS
;
; MOVI 010000H,A0
; CLR A3
;; CALLA PreFrag_Box
; CALLA PreFrag_Center
; SUBI 0100H,B0 ;PLACE IN FRONT OF COPTER
;
; MOVI -0400H,B10
; MOVE B10,B9
;; MOVI -0400H,B9
;
; MOVE *A8(OPART1),A1,L
; LOCKON Z
;
;; MOVE *A1(OZVEL),A14,L
;; JRNN CV_SET_ZVELS ;BR=FLYING AWAY IN Z
;;
;; MOVE A14,B9
;; MOVE B9,B10
;; ADD B9,B9 ;2*COPTER VELOCITY
;; MOVE B10,B14
;; SRA 1,B14
;; ADD B14,B10 ;1.5*COPTER VELOCITY
;;
;;; MOVE A14,B9 ;GIVE FRAGS 1.5*COPTER VELOCITY
;;; MOVE B9,B10
;;; SRA 1,B10
;;; ADD B10,B9
;;; MOVE B9,B10
;;
;; JRUC CV_DAM_EXPLO
;;CV_SET_ZVELS
;; MOVI -0100H,B10
;; MOVI -0200H,B9
;CV_DAM_EXPLO
; MOVI FRAG_DAMAGE_EXPLO,B14
; CALLA Fragger
;
; MMFM SP,B1,B2,B4,B5,B6,B8,B9
;
; MOVE A1,A0 ;HEAD OBJECT
; MOVK 7*3,A14 ;NUMBER OF SHAKES
; MOVB A14,*A0(AnimLoop)
; MOVK 20,A14
; MOVB A14,*A0(OSHAKERADIUS)
; MOVI SHAKE_ANIM,A1
; CALLA STRTANIM
;
; MOVK 2,A5 ;DESTROYED RETURN STATE
;CV_DONE
; RETS
**************************************************************************
**************************************************************************
**************************************************************************
* *
* FLIGHT_GUNVECT *
* FLIGHT_HGUNVECT FLIGHT_LGUNVECT *
* FLIGHT_COLLISION *
* FLIGHT_HCOLLISION FLIGHT_LCOLLISION *
* *
* MAKE SOME NOISE, EXPLOSION EFFECTS, AND/OR GIVE A LITTE PUSH DURING *
* THE FLIGHT TO THE FINAL BATTLE *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
FLIGHT_HGUNVECT
SOUND1 SND_CLANG_HIGH
JRUC FLIGHT_GUNVECT
FLIGHT_LGUNVECT
SOUND1 SND_CLANG_LOW
FLIGHT_GUNVECT
CALLA COPTER_SPARK
JRUC CV_GUN ;CHECK FOR GUN EXPLOSION
FLIGHT_HCOLLISION
SOUND1 SND_METALLIC_FUCKUP
JRUC FLIGHT_COLLISION
FLIGHT_LCOLLISION
SOUND1 SND_THUD
FLIGHT_COLLISION
CALLR PUSHBACK
JRUC CV_ROCKET ;MAKE ROCKET EXPLOSION
**************************************************************************
* *
* FLIGHT_9S_GUNVECT *
* FLIGHT_9S_COLLISION *
* *
* MAKE SOME NOISE, EXPLOSION EFFECTS, AND/OR GIVE A LITTE PUSH DURING *
* THE FLIGHT TO THE FINAL BATTLE *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
FLIGHT_9S_GUNVECT
CALLA COPTER_SPARK
SOUND1 SND_CLANG_LOW
CALLR CV_GUN ;CHECK FOR GUN EXPLOSION
JRUC F9S_GO
FLIGHT_9S_COLLISION
SOUND1 SND_THUD
CALLR PUSHBACK
CALLR CV_ROCKET ;MAKE ROCKET EXPLOSION
F9S_GO
PUSH A8 ;FIND OTHER HALF
MOVB *A8(OPARTID),A14
CMPK LEFT_FUSELAGE,A14
JREQ F9S_NEXT_FLASH ;BR=FLASH NEXT PART (RIGHT HALF)
MOVK LEFT_FUSELAGE,A1
CALLA FINDPART ;FIND LEFT HALF
LOCKON Z
MOVE A0,A8
JRUC F9S_FLASH
F9S_NEXT_FLASH
MOVE *A8(OPARTS),A8,L ;GET RIGHT HALF
F9S_FLASH
CALLA UNIV_FLASH
PULLQ A8
RETS
**************************************************************************
* *
* FLIGHT_WEAPON_GUNVECT *
* FLIGHT_WEAPON_COLLISION *
* *
* MAKE SOME NOISE, EXPLOSION EFFECTS, AND/OR GIVE A LITTE PUSH DURING *
* THE FLIGHT TO THE FINAL BATTLE *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
FLIGHT_WEAPON_GUNVECT
CALLA COPTER_SPARK
SOUND1 SND_CLANG_HIGH
CALLR CV_GUN ;CHECK FOR GUN EXPLOSION
MOVE A5,A5
JRZ FW_GO ;BR=YES, DAMAGE THE GUN
RETS
FLIGHT_WEAPON_COLLISION
SOUND1 SND_METALLIC_FUCKUP
CALLR PUSHBACK
CALLR CV_ROCKET ;MAKE ROCKET EXPLOSION
FW_GO
MOVE *A8(OFLAGS),A14,W
BTST B_ANIM,A14
JRZ FW_DONE ;BR=IT'S NOT ANIMATING
MOVE *A8(ODAMANIM),A1,L
JRZ FW_DONE ;BR=NOT DAMAGE ANIMATION
MOVE *A8(AnimScr),A14,L
CMP A14,A1
JREQ FW_DONE ;BR=WE'RE IN THE DAMAGE ANIM
CALLA DELETE_FLASH ;KILL DA FLASH
MOVE *A8(OATTACKANIM),A3,L ;SET UP FOR RETURN
MOVE A3,*A8(AnimRetScr),L
MOVE *A8(OFIREANIMOFF),A14,W
ADD A14,A3 ;RETURN TO FIRING LUPE FRAME
MOVE A3,*A8(AnimRetFrm),L
CLR A14
MOVB A14,*A8(AnimSlp)
MOVE A1,*A8(AnimScr),L
MOVE A1,*A8(AnimFrm),L
MOVE *A8(ONORMAL_PAL),A0,L
JAUC CHANGE_PAL ;USE NORMAL PALETTE
FW_DONE
RETS
**************************************************************************
* *
* COPTER_LCLANG_FLASH_GUNVECT *
* COPTER_LCLANG_GUNVECT *
* COPTER_LCLANG_FLASH_COLLISION *
* COPTER_LCLANG_COLLISION *
* *
* MAKE SOME NOISE, EXPLOSION EFFECTS, AND/OR GIVE A LITTE PUSH DURING *
* THE FLIGHT TO THE FINAL BATTLE *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
COPTER_I_LCLANG_FLASH_GUNVECT
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
COPTER_LCLANG_FLASH_GUNVECT
CALLA UNIV_FLASH
JRUC COPTER_LCLANG_GUNVECT
COPTER_I_LCLANG_GUNVECT
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
COPTER_LCLANG_GUNVECT
SOUND1 SND_CLANG_LOW
CALLA COPTER_SPARK
RETS
COPTER_LCLANG_FLASH_COLLISION
CALLA UNIV_FLASH
COPTER_LCLANG_COLLISION
CALLR CV_ROCKET_NOFLASH ;MAKE ROCKET EXPLOSION
CALLA PUSHBACK
SOUND1 SND_THUD
RETS
**************************************************************************
* *
* COPTER_HCLANG_FLASH_GUNVECT *
* COPTER_HCLANG_GUNVECT *
* COPTER_HCLANG_FLASH_COLLISION *
* COPTER_HCLANG_COLLISION *
* *
* MAKE SOME NOISE, EXPLOSION EFFECTS, AND/OR GIVE A LITTE PUSH DURING *
* THE FLIGHT TO THE FINAL BATTLE *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
COPTER_I_HCLANG_FLASH_GUNVECT
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
COPTER_HCLANG_FLASH_GUNVECT
CALLA UNIV_FLASH
JRUC COPTER_HCLANG_GUNVECT
COPTER_I_HCLANG_GUNVECT
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
COPTER_HCLANG_GUNVECT
SOUND1 SND_CLANG_HIGH
CALLA COPTER_SPARK
RETS
COPTER_HCLANG_FLASH_COLLISION
CALLA UNIV_FLASH
COPTER_HCLANG_COLLISION
CALLR CV_ROCKET_NOFLASH ;MAKE ROCKET EXPLOSION
CALLA PUSHBACK
SOUND1 SND_METALLIC_FUCKUP
RETS
**************************************************************************
* *
* COPTER_GCLANG_FLASH_GUNVECT *
* COPTER_GCLANG_GUNVECT *
* COPTER_GCLANG_FLASH_COLLISION *
* COPTER_GCLANG_COLLISION *
* *
* MAKE SOME NOISE, EXPLOSION EFFECTS, AND/OR GIVE A LITTE PUSH DURING *
* THE FLIGHT TO THE FINAL BATTLE *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
COPTER_I_GCLANG_FLASH_GUNVECT
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
COPTER_GCLANG_FLASH_GUNVECT
CALLA UNIV_FLASH
JRUC COPTER_GCLANG_GUNVECT
COPTER_I_GCLANG_GUNVECT
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
COPTER_GCLANG_GUNVECT
SOUND1 SND_CLANG_GEAR
CALLA COPTER_SPARK
RETS
COPTER_GCLANG_FLASH_COLLISION
CALLA UNIV_FLASH
COPTER_GCLANG_COLLISION
CALLR CV_ROCKET_NOFLASH ;MAKE ROCKET EXPLOSION
CALLA PUSHBACK
SOUND1 SND_METALLIC_FUCKUP
RETS
**************************************************************************
* *
* COPTER_BCLANG_FLASH_GUNVECT *
* COPTER_BCLANG_GUNVECT *
* COPTER_BCLANG_FLASH_COLLISION *
* COPTER_BCLANG_COLLISION *
* *
* MAKE SOME NOISE, EXPLOSION EFFECTS, AND/OR GIVE A LITTE PUSH DURING *
* THE FLIGHT TO THE FINAL BATTLE *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
COPTER_I_BCLANG_FLASH_GUNVECT
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
COPTER_BCLANG_FLASH_GUNVECT
CALLA UNIV_FLASH
JRUC COPTER_BCLANG_GUNVECT
COPTER_I_BCLANG_GUNVECT
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
COPTER_BCLANG_GUNVECT
SOUND1 SND_RICOCHET
CALLA COPTER_SPARK
RETS
COPTER_BCLANG_FLASH_COLLISION
CALLA UNIV_FLASH
COPTER_BCLANG_COLLISION
CALLR CV_ROCKET_NOFLASH ;MAKE ROCKET EXPLOSION
CALLA PUSHBACK
SOUND1 SND_METALLIC_FUCKUP
RETS
**************************************************************************
* *
* PUSHBACK - PUSH THE COPTER BACK IN Z *
* *
* NOTE: DON'T TRASH A2! *
* NOTE: DON'T TRASH A2! *
* NOTE: DON'T TRASH A2! *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
PUSHBACK
MOVE *A8(OPART1),A1,L
LOCKON Z
MOVE *A1(OCOMMAND),A14,W
BTST B_CHOVER,A14
JRZ PB_DONE ;BR=NOT HOVERING, DON'T TOUCH
MOVE *A1(OZVAL),A5,L
MOVE @ZBASE,A14,L
SUB A14,A5
MOVE *A1(OHZWPOS),A3,L
MOVE A3,A4
CMPI 020000H,A5
JRLE PB_CHECK_RANGE ;BR=WITHIN FARTHEST WORLD Z
CLR A14
JRUC PB_SET_ZVEL
PB_CHECK_RANGE
ADDI 08000H,A3
CMP A3,A5
JRGT PB_DONE ;BR=EXCEEDS THE PUSH RANGE
MOVE *A1(OZVEL),A14,L ;GIVE IT A PUSH
ADDI 0200H,A14
PB_SET_ZVEL
MOVE A14,*A1(OZVEL),L
MOVE A4,*A1(OHZFLYTO),L ;FLAG HOVER ROUTINE TO COME BACK
move *A1(OHZACCEL),A14,W ;NEGATIVE Z HOVER ACCELERATION
ABS A14
NEG A14
MOVE A14,*A1(OHZACCEL),W
PB_DONE
RETS
**************************************************************************
* *
* WING_WEAPON VECTORS *
* *
**************************************************************************
WING_WEAPON_GUNVECT
CALLA COPTER_SPARK
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
SOUND1 SND_CLANG_HIGH
JRUC WWV_GO
WING_WEAPON_COLLISION
CALLR COPTER_HIT
CALLA PUSHBACK
SOUND1 SND_METALLIC_FUCKUP
WWV_GO
CMPK 2,A5
JREQ WWV_DESTROYED ;BR=TRASHED!
MOVE A5,A5
JRNZ WWV_DONE
CALLR FW_GO ;FUCK UP DA DIRECTION
WWV_DONE
RETS
WWV_DESTROYED
MOVI 10000,A1
CALLA SCORE
CALLR MAKE_DAMAGE_SPEECH
MOVK LEFT_GUN,A4
MOVK LEFT_ROCKET,A3
MOVK LEFT_WING,A1
; MOVK LEFT_FUSE_GUN,A5
MOVB *A8(OPARTID),A6
CMP A3,A6
JRLE WWV_CHECK_SIDE ;BR=THIS IS THE LEFT SIDE
MOVK RGHT_GUN,A4
MOVK RGHT_ROCKET,A3
MOVK RGHT_WING,A1
; MOVK RGHT_FUSE_GUN,A5
WWV_CHECK_SIDE
CALLA FINDPART ;GET WING PART
LOCKON Z
MOVE A0,A7 ;SAVE WING PART
MOVE A4,A1 ;GET GUN PART
CMP A1,A6
JRNE WWV_FIND_WEAPON ;BR=THIS IS THE ROCKET LAUNCHER
MOVE A3,A1 ;NO, IT'S THE GAT GUN
WWV_FIND_WEAPON
CALLA FINDPART
JRNZ WWV_SPARKS ;BR=THE OTHER PART STILL EXISTS
; MOVI COPTER_COLL,A14 ;ACTIVATE WING VECTORS
; MOVE A14,*A7(OCVECT),L
MOVI WING_GUNVECT,A14 ;ACTIVATE WING VECTORS
MOVE A14,*A7(OGUNVECT),L
MOVI WING_COLLISION,A14
MOVE A14,*A7(OCOLLISION),L
JRUC WWV_DELETE
; MOVE A5,A1
; CALLA FINDPART
; LOCKON Z
;
; MOVI COPTER_COLL,A14 ;ACTIVATE FUSE GUN VECTORS
; MOVE A14,*A0(OCVECT),L
; MOVI FUSEGUN_GUNVECT,A14
; MOVE A14,*A0(OGUNVECT),L
; MOVI FUSEGUN_COLLISION,A14
; MOVE A14,*A0(OCOLLISION),L
; MOVI PART_FIRE_ANIM,A1 ;AND ANIMATION
; MOVE A1,*A0(OATTACKANIM),L
; CALLA STRTANIM
WWV_SPARKS
MOVE A7,A0
MOVI WING_SPARKS_ANIM,A1
CALLA STRTANIM
WWV_DELETE
; MMTM SP,B1,B2,B4,B5,B6,B8,B9 ;MAKE FRAGMENTS
;
; MOVI 040000H,A0
; CLR A3
; CALLA PreFrag_Box
; MOVI -0FFH,B9
; MOVI -01H,B10
; MOVI FRAG_C5,B14
; CALLA Fragger
;
; MOVE *A8(OIMG),A1,L
; MOVE *A1(ICMAP),*A0(FPDATA),L ;SET PALETTE
;
; MMFM SP,B1,B2,B4,B5,B6,B8,B9
CMPK LEFT_ROCKET,A6
JREQ WWV_NOFLASH ;BR=NO FLASH OBJECT
CMPK RGHT_ROCKET,A6
JREQ WWV_NOFLASH ;BR=NO FLASH OBJECT
CALLR DELETE_FLASH
WWV_NOFLASH
MOVE *A8(ONORMAL_PAL),A0,L
JRZ WWV_DESTROY
CALLA CHANGE_PAL
WWV_DESTROY
PUSH A2
MOVI -040000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI 010000H,A3 ;MIN Y VEL
MOVI 060000H,A4 ;MAX Y VEL
MOVI [15*2,0],A5 ;RIGHT BLOW OFFSET
MOVK 20,A6 ;SHAKE RADIUS
MOVI FRAG_C1,A7 ;FRAGMENT SCRIPT
MOVK 32,A9 ;NUMBER OF BLOWS
CLR A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
CLR A14
MOVB A14,*A8(OPARTID) ;PART IS DEAD
CALLR CHECK_NOSE ;CHECK ON NOSE
RETS
WING_SPARKS_ANIM
LWL 1,1|AFunc,A_WING_SPARKS
.long 0
WING_SPARK_INIT
.LONG FWORKS1, 0
.WORD OID_JUNK, DMAWNZ, M_DBLSCL, -3
.LONG C_STRTANIM
.LONG FRAG_FZZZ_ANIM
**************************************************************************
* *
* A_WING_SPARKS - SPARK HANGING WIRES FROM WING *
* *
* PASS: *
* A8 = WING OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_WING_SPARKS
; RETS
MOVI 60,A1
MOVI 127,A0
CALLA RANGERND
MOVB A0,*A8(AnimSlp)
MOVK LEFT_GUN,A3
MOVI [-56*2,-76*2],A4 ;GUN SPARK OFFSET
MOVK LEFT_ROCKET,A5
MOVI [-67*2,-115*2],A6 ;ROCKET SPARK OFFSET
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ AWS_CHOOSE ;BR=THIS IS THE LEFT
MOVK RGHT_GUN,A3 ;STUFF FOR THE RIGHT WING
NEGX A4
MOVK RGHT_ROCKET,A5
NEGX A6
AWS_CHOOSE
MOVI 512,A0
CALLA RANDPER
JRC AWS_SPARK_ROCKET
AWS_SPARK_GUN
MOVE A3,A1
CALLA FINDPART ;LOOK FOR GAT GUN
JRNZ AWS_SPARK_ROCKET ;BR=GUN EXISTS, SPARK ROCKET
MOVE A4,A9
JRUC AWS_SPARK_GO
AWS_SPARK_ROCKET
MOVE A5,A1
CALLA FINDPART ;LOOK FOR GAT GUN
JRNZ AWS_SPARK_GUN ;BR=ROCKET EXISTS, SPARK GUN
MOVE A6,A9
AWS_SPARK_GO
MOVI WING_SPARK_INIT,A5
MOVE @RAND,A10,W ;RANDOM HFLIP
ANDI M_FLIPH,A10
JRUC ADD_FIRE
**************************************************************************
* *
* WING VECTORS *
* *
**************************************************************************
WING_GUNVECT
CALLA COPTER_SPARK
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
SOUND1 SND_CLANG_LOW
JRUC WV_GO
WING_COLLISION
CALLR COPTER_HIT
CALLA PUSHBACK
SOUND1 SND_THUD
WV_GO
CMPK 2,A5
JREQ WV_DESTROYED_SCORE ;BR=TRASHED!
RETS
WV_DESTROYED_SCORE
MOVI 10000,A1
CALLA SCORE
WV_DESTROYED
CALLR MAKE_DAMAGE_SPEECH
MOVE @WING_COUNT,A14,W ;MINUS ONE WING
DEC A14
MOVE A14,@WING_COUNT,W
PUSH A2
MOVI 010000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI 010000H,A3 ;MIN Y VEL
MOVI 060000H,A4 ;MAX Y VEL
MOVI [-105*2,50*2],A5 ;RIGHT BLOW OFFSET
MOVK 20,A6 ;SHAKE RADIUS
MOVI FRAG_C2,A7 ;FRAGMENT SCRIPT
MOVK 32,A9 ;NUMBER OF BLOWS
CLR A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
CLR A14
MOVB A14,*A8(OPARTID) ;PART IS DEAD
RETS
; MMTM SP,B1,B2,B4,B5,B6,B8,B9 ;MAKE FRAGMENTS
;
; MOVI 040000H,A0
; CLR A3
; CALLA PreFrag_Box
;
; MOVE B5,B6
; ADDI 25 >> (16-15),B6 ;WING BOX AREA
;
; MOVI -0FFH,B9
; MOVI -01H,B10
; MOVI FRAG_C10,B14
; CALLA Fragger
;
; MOVI yGRAD2Yp,A5
; MOVE A5,*A0(FPDATA),L ;SET PALETTE
;
; MMFM SP,B1,B2,B4,B5,B6,B8,B9
; JAUC DEL_PROC_AND_OBJ
**************************************************************************
* *
* BELLY_WEAPON VECTORS *
* *
**************************************************************************
BELLY_WEAPON_GUNVECT
CALLA COPTER_SPARK
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
SOUND1 SND_CLANG_HIGH
JRUC BWV_GO
BELLY_WEAPON_COLLISION
CALLR COPTER_HIT
CALLA PUSHBACK
SOUND1 SND_METALLIC_FUCKUP
BWV_GO
CMPK 2,A5
JREQ BWV_DESTROYED_SCORE ;BR=TRASHED!
MOVE A5,A5
JRNZ BWV_DONE
CALLR FW_GO ;FUCK UP DA DIRECTION
BWV_DONE
RETS
BWV_DESTROYED_SCORE
MOVI 10000,A1
CALLA SCORE
BWV_DESTROYED
CALLR MAKE_DAMAGE_SPEECH
CALLR DELETE_FLASH
MOVE *A8(ONORMAL_PAL),A0,L
JRZ BWV_DESTROY
CALLA CHANGE_PAL
BWV_DESTROY
PUSH A2
MOVI -040000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI 010000H,A3 ;MIN Y VEL
MOVI 060000H,A4 ;MAX Y VEL
MOVI [15*2,0],A5 ;RIGHT BLOW OFFSET
MOVK 20,A6 ;SHAKE RADIUS
MOVI FRAG_C1,A7 ;FRAGMENT SCRIPT
MOVK 32,A9 ;NUMBER OF BLOWS
CLR A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
CLR A14
MOVB A14,*A8(OPARTID) ;PART IS DEAD
; MOVE *A8(OPART1),A0,L ;GET HEAD PART
; LOCKON Z
; CALLA DEL_PROC_AND_OBJ
;; CALLR CHECK_NOSE ;CHECK ON NOSE
RETS
**************************************************************************
* *
* CHECK_NOSE - CHECK IF WE SHOULD ACTIVATE THE NOSE *
* *
* PASS: *
* A8 = PART *
* *
**************************************************************************
FIREBALL_HALF_MISSLETIME_TABLE
.WORD 15, 10, 5
FIREBALL_MISSLETIME_TABLE
.WORD 30, 20, 10
CHECK_NOSE
PUSH A8
MOVE *A8(OPART1),A8,L
LOCKON Z ;NO HEAD. THIS IS BAD!
MOVK LEFT_ROCKET,A1
CALLA FINDPART
JRNZ CN_DONE ;BR=LEFT LAUNCHER STILL ACTIVE
MOVK RGHT_ROCKET,A1
CALLA FINDPART
JRNZ CN_DONE ;BR=RIGHT LAUNCHER STILL ACTIVE
MOVK NOSE_GUN,A1
CALLA FINDPART
JRZ CN_DONE ;BR=NO NOSE! SHOULD NEVER HAPPEN!
MOVE A0,A3
MOVE *A0(OFLAGS),A14,W
BTST B_ANIM,A14
JRNZ CN_GATS ;BR=ALREADY ANIMATIN'
MOVI FIREBALL_MISSLETIME_TABLE,A14
MOVE A14,@MISSLETIME_TABLE,L
MOVI NOSE_GUN_ANIM,A1 ;START NOSE ANIMATION
MOVE A1,*A0(OATTACKANIM),L
CALLA STRTANIM
MOVI 240,A14
MOVB A14,*A0(AnimSlp) ;SLEEP BEFORE SHOOTING
CN_GATS
MOVK LEFT_GUN,A1
CALLA FINDPART
JRNZ CN_DONE ;BR=LEFT GAT GUN STILL ACTIVE
MOVK RGHT_GUN,A1
CALLA FINDPART
JRNZ CN_DONE ;BR=RIGHT GAT GUN STILL ACTIVE
; MOVI COPTER_COLL,A14 ;STUFF VECTORS
; MOVE A14,*A3(OCVECT),L
MOVI DUM_NOSEGUN_GUNVECT,A14 ;ACTIVATE DUM NOSE GUN VECTORS
MOVE A14,*A3(OGUNVECT),L
MOVI DUM_NOSEGUN_COLLISION,A14
MOVE A14,*A3(OCOLLISION),L
MOVK LEFT_FUSELAGE,A1
CALLA FINDPART
JRZ CN_RGHT ;BR=NO LEFT FUSELAGE!
; MOVI COPTER_COLL,A14 ;STUFF VECTORS
; MOVE A14,*A0(OCVECT),L
MOVI FUSELAGE_GUNVECT,A3 ;ACTIVATE FUSELAGE VECTORS
MOVE A3,*A0(OGUNVECT),L
MOVI FUSELAGE_COLLISION,A4
MOVE A4,*A0(OCOLLISION),L
CN_RGHT
MOVK RGHT_FUSELAGE,A1
CALLA FINDPART
JRZ CN_DONE ;BR=NO RIGHT FUSELAGE!
MOVE A3,*A0(OGUNVECT),L
MOVE A4,*A0(OCOLLISION),L
CN_DONE
PULLQ A8
RETS
**************************************************************************
* *
* COCKPIT_GUNVECT *
* *
**************************************************************************
COCKPIT_GUNVECT
CALLA COPTER_SPARK
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
CMPK 2,A5
JREQ CPV_DESTROYED ;BR=TRASHED!
MOVB *A8(OPARTID),A6
MOVI SND_CLANG_HIGH,A3 ;METAL FRAME HIT SOUND
MOVI TOP_COCKPIT_BOX_TBL,A0 ;TOP COCKPIT CHECK
CMPK TOP_COCKPIT,A6
JREQ CPV_CHK_BOX ;BR=THIS IS THE TOP
MOVI BOT_COCKPIT_BOX_TBL,A0 ;BOTTOM COCKPIT CHECK
CPV_CHK_BOX
CALLA TABLE_BOX_CHECK
JRZ CPV_HIT_SND ;BR=DON'T HIT NO WINDOW
MOVI SND_WINDOW_CRACK,A3 ;WINDOW HIT SOUND
CPV_HIT_SND
MOVE A3,A0
; CALLA ONESND_Z
CALLA ONESND
RETS
COCKPIT_COLLISION
CALLR COPTER_HIT
CALLA PUSHBACK
CPV_DESTROYED
MOVI 10000,A1
CALLA SCORE
MOVK 20,A6 ;SHAKE RADIUS
CPV_NOSHAKE_DESTROYED
SOUND1 SND_WINDOW_BREAK
PUSH A2
MOVI -040000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI -040000H,A3 ;MIN Y VEL
MOVI 040000H,A4 ;MAX Y VEL
MOVI [-120*2,0],A5 ;RIGHT BLOW OFFSET FOR TOP
MOVB *A8(OPARTID),A7
CMPK TOP_COCKPIT,A7
JREQ CPV_OFFOK ;BR=THIS IS THE TOP COCKPIT
MOVI [-90*2,0],A5 ;RIGHT BLOW OFFSET FOR BOTTOM
CPV_OFFOK
MOVI FRAG_CS4,A7 ;FRAGMENT SCRIPT
MOVK 4,A9 ;NUMBER OF BLOWS
MOVI CPV_DAMAGE,A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
RETS
CPV_DAMAGE
CLR A14 ;NO MORE COLLISIONS
MOVE A14,*A8(OCVECT),L
MOVI COPTER_HCLANG_GUNVECT,A14 ;CLANG ON METAL FRAME
MOVE A14,*A8(OGUNVECT),L
MOVE *A8(OFLAGS),A14,W ;TURN ON PIXEL SCANNING
ANDNI M_NOPIXSCAN,A14
MOVE A14,*A8(OFLAGS),W
MOVE *A8(OCTRL),A4,W
MOVI CPTFSEC6sd,A1 ;TOP DAMAGE
MOVB *A8(OPARTID),A6
CMPK TOP_COCKPIT,A6
; MOVE *A8(OIMG),A6,L
; CMPI CPTFSEC6s,A6
JREQ CPV_ANI ;BR=THIS IS THE TOP
MOVI CPTFSEC7sd,A1 ;BOTTOM DAMAGE
CPV_ANI
CALLA ANI
CALLA SET_SCALE_WARREN ;SCALE THE MOTHER
CALLA SET_ODAG ;COMPUTE ODAG AGAIN
RETS
; MMTM SP,B1,B2,B4,B5,B6,B8,B9 ;MAKE FRAGMENTS
;
; MOVI 040000H,A0
; CLR A3
; CALLA PreFrag_Center
; MOVI -0FFH,B9
; MOVI -01H,B10
; MOVI FRAG_S10,B14
; CALLA Fragger
;
; MOVI SHARDPAL1,A5 ;SILVER PALETTE
; MOVE A5,*A0(FPDATA),L ;SET PALETTE
;
;; MOVE *A8(OIHOFF),A14,W
;; JRNZ CC_FRAG_DONE ;BR=DON'T MAKE SMALL PIECES
;;
;; MOVI FRAG_SS5,B14
;; CALLA Fragger
;;
;; MOVE A5,*A0(FPDATA),L ;SET PALETTE
;;CC_FRAG_DONE
; MMFM SP,B1,B2,B4,B5,B6,B8,B9
; MOVE A8,A0
; MOVE *A0(OPART1),A8,L
; LOCKON Z
; CALLA PULLPART
; CALLA INSPART
; MOVE A0,A8
;
; RETS
TOP_COCKPIT_BOX_TBL
.LONG [4*2,13*2],[6*2,40*2] ;TOP WINDOW PIECE
.LONG [11*2,16*2],[27*2,37*2] ;MAIN WINDOW
.LONG -1
BOT_COCKPIT_BOX_TBL
.LONG [4*2,11*2],[6*2,42*2] ;TOP WINDOW PIECE
.LONG [9*2,13*2],[20*2,40*2] ;MAIN WINDOW
.LONG -1
**************************************************************************
* *
* INTRO_COCKBLOW_GUNVECT *
* *
**************************************************************************
INTRO_COCKBLOW_GUNVECT
CALLA COPTER_SPARK
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
CMPK 2,A5
JREQ ICV_DESTROYED ;BR=TRASHED!
MOVB *A8(OPARTID),A6
MOVI SND_CLANG_HIGH,A3 ;METAL FRAME HIT SOUND
MOVI SIDE_TOP_COCKPIT_BOX_TBL,A0 ;TOP COCKPIT CHECK
CMPK SIDE_TOP_COCKPIT,A6
JREQ ICV_CHK_BOX ;BR=THIS IS THE TOP
MOVI SIDE_BOT_COCKPIT_BOX_TBL,A0 ;BOTTOM COCKPIT CHECK
ICV_CHK_BOX
CALLA TABLE_BOX_CHECK
JRZ ICV_HIT_SND ;BR=DON'T HIT NO WINDOW
MOVI SND_WINDOW_CRACK,A3 ;WINDOW HIT SOUND
ICV_HIT_SND
MOVE A3,A0
; CALLA ONESND_Z
CALLA ONESND
RETS
INTRO_COCKBLOW_COLLISION
CALLR COPTER_HIT
; CALLA PUSHBACK
ICV_DESTROYED
MOVI 10000,A1
CALLA SCORE
SOUND1 SND_WINDOW_BREAK
PUSH A2
MOVI -020000H,A1 ;MIN X VEL
MOVI 020000H,A2 ;MAX X VEL
MOVI -020000H,A3 ;MIN Y VEL
MOVI 020000H,A4 ;MAX Y VEL
MOVI [-38*2,-71*2],A5 ;RIGHT BLOW OFFSET FOR TOP
CLR A6 ;NO SHAKE
MOVB *A8(OPARTID),A7
CMPK TOP_COCKPIT,A7
JREQ ICV_OFFOK ;BR=THIS IS THE TOP COCKPIT
MOVI [-13*2,-113*2],A5 ;RIGHT BLOW OFFSET FOR BOTTOM
ICV_OFFOK
MOVI FRAG_CS4,A7 ;FRAGMENT SCRIPT
MOVK 4,A9 ;NUMBER OF BLOWS
MOVI ICV_DAMAGE,A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
RETS
ICV_DAMAGE
CLR A14 ;NO MORE COLLISIONS
MOVE A14,*A8(OCVECT),L
MOVI COPTER_HCLANG_GUNVECT,A14 ;CLANG ON METAL FRAME
MOVE A14,*A8(OGUNVECT),L
MOVE *A8(OFLAGS),A14,W ;TURN ON PIXEL SCANNING
ANDNI M_NOPIXSCAN,A14
MOVE A14,*A8(OFLAGS),W
MOVE *A8(OCTRL),A4,W
MOVI CPTSSEC7sd,A1 ;TOP DAMAGE
MOVB *A8(OPARTID),A6
CMPK SIDE_TOP_COCKPIT,A6
; MOVE *A8(OIMG),A6,L
; CMPI CPTFSEC6s,A6
JREQ CPV_ANI ;BR=THIS IS THE TOP
MOVI CPTSSEC8sd,A1 ;BOTTOM DAMAGE
JRUC CPV_ANI
SIDE_TOP_COCKPIT_BOX_TBL
.LONG [9*2,12*2],[21*2,34*2] ;TOP WINDOW PIECE
.LONG [28*2,34*2],[35*2,47*2] ;MAIN WINDOW
.LONG -1
SIDE_BOT_COCKPIT_BOX_TBL
.LONG [11*2,13*2],[17*2,21*2] ;TOP WINDOW PIECE
.LONG [19*2,14*2],[25*2,38*2] ;MAIN WINDOW
.LONG -1
**************************************************************************
* *
* INTRO_PARTBLOW_GUNVECT *
* *
**************************************************************************
INTRO_PARTBLOW_GUNVECT
CALLA COPTER_SPARK
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
MOVB *A8(OPARTID),A6
CMPK 2,A5
JREQ IPV_DESTROYED ;BR=TRASHED!
MOVI SND_CLANG_LOW,A0
CMPK SIDE_ENGINE,A6
JRNE IPV_CLANG ;BR=NOT DA ENGINE
MOVI SND_CLANG_HIGH,A0
IPV_CLANG
CALLA ONESND
RETS
INTRO_PARTBLOW_COLLISION
CALLR COPTER_HIT
MOVI SND_THUD,A0
MOVB *A8(OPARTID),A6
CMPK SIDE_ENGINE,A6
JRNE IPV_BOOM ;BR=NOT DA ENGINE
MOVI SND_METALLIC_FUCKUP,A0
IPV_BOOM
CALLA ONESND
CMPK 2,A5
JREQ IPV_DESTROYED ;BR=TRASHED!
RETS
IPV_DESTROYED
MOVI 10000,A1
CALLA SCORE
PUSH A2
MOVI COPTER_LCLANG_GUNVECT,A1 ;CLANG ON METAL FRAME
CMPK SIDE_FUSELAGE,A6
JRNE IPV_CHECK_TAIL
MOVI CPTSSEC1sdx,A2
MOVI [-60*2,152*2],A3 ;FIRE OFFSET
MOVI [23*2,-127*2],A5 ;RIGHT BLOW OFFSET
MOVK SIDE_NOSE_GUN,A1
CALLA FINDPART
JRZ IPV_BLOW ;BR=NO NOSE GUN
MMTM SP,A1,A2,A3,A5,A8
MOVE A0,A8
CALLR IDV_DESTROYED_NOSCORE ;BLOW AND DELETE NOSE GUN
MMFM SP,A1,A2,A3,A5,A8
JRUC IPV_BLOW
IPV_CHECK_TAIL
MOVI CPTSSEC5sdx,A2
MOVI [-108*2,-166*2],A3 ;FIRE OFFSET
MOVI [-17*2,197*2],A5 ;RIGHT BLOW OFFSET
CMPK SIDE_LONG_TAIL,A6
JREQ IPV_BLOW
MOVI COPTER_HCLANG_GUNVECT,A1 ;CLANG ON METAL FRAME
MOVI CPTSSEC9sd,A2
MOVI [-126*2,-59*2],A3 ;FIRE OFFSET
MOVI [-40*2,80*2],A5 ;RIGHT BLOW OFFSET
IPV_BLOW
CLR A14 ;NO MORE COLLISIONS
MOVE A14,*A8(OCVECT),L
MOVE A1,*A8(OGUNVECT),L
MOVE A2,*A8(ODAMFRAME),L
MOVE A3,*A8(OFIREOFF),L
MOVI -020000H,A1 ;MIN X VEL
MOVI 020000H,A2 ;MAX X VEL
MOVI -020000H,A3 ;MIN Y VEL
MOVI 020000H,A4 ;MAX Y VEL
CLR A6 ;NO SHAKE
MOVI FRAG_C2,A7 ;FRAGMENT SCRIPT
MOVK 10,A9 ;NUMBER OF BLOWS
MOVI IPV_DAMAGE,A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
RETS
IPV_DAMAGE
MOVI SIDE_FIRE_INIT,A5
MOVE *A8(OFIREOFF),A9,L
MOVE *A8(OCTRL),A4,W
MOVE A4,A10
ANDI M_FLIPH,A10
JRZ IPV_FIRE ;FLIP FIRE X
NEGX A9
IPV_FIRE
CALLA ADD_FIRE
MOVE *A8(ODAMFRAME),A1,L
MOVE *A1(ICMAP),A0,L
CALLA CHANGE_PAL
JRUC CPV_ANI
**************************************************************************
* *
* INTRO_DELBLOW_GUNVECT *
* *
**************************************************************************
INTRO_DELBLOWH_GUNVECT
MOVI SND_CLANG_HIGH,A0
JRUC IDG_GO
INTRO_DELBLOWL_GUNVECT
MOVI SND_CLANG_LOW,A0
IDG_GO
CALLA ONESND
CALLA COPTER_SPARK
MOVK GUN_POINTS,A0
CALLA CHECK_FREAK_SPEECH
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
CMPK 2,A5
JREQ IDV_DESTROYED ;BR=TRASHED!
RETS
INTRO_DELBLOWH_COLLISION
MOVI SND_METALLIC_FUCKUP,A0
JRUC IDC_GO
INTRO_DELBLOWL_COLLISION
MOVI SND_THUD,A0
IDC_GO
CALLA ONESND
MOVI ROCKET_DAMAGE,A0,W
CALLR COPTER_HIT
CMPK 2,A5
JREQ IDV_DESTROYED ;BR=TRASHED!
RETS
IDV_DESTROYED
MOVI 10000,A1
CALLA SCORE
IDV_DESTROYED_NOSCORE
MOVB *A8(OPARTID),A1
CMPK SIDE_GUN,A1
JRNE IDV_CHECK_WING
MOVK SIDE_ROCKET,A1
CALLA FINDPART
JRZ IDV_CHECK_WING
MOVI INTRO_DELBLOWH_COLLISION,A14
MOVE A14,*A0(OCOLLISION),L
MOVI INTRO_DELBLOWH_GUNVECT,A14
MOVE A14,*A0(OGUNVECT),L
JRUC IDV_GO
IDV_CHECK_WING
CMPK SIDE_ROCKET,A1
JRNE IDV_GO
MOVK SIDE_WING,A1
CALLA FINDPART
JRZ IDV_GO
MOVI INTRO_DELBLOWL_COLLISION,A14
MOVE A14,*A0(OCOLLISION),L
MOVI INTRO_DELBLOWL_GUNVECT,A14
MOVE A14,*A0(OGUNVECT),L
IDV_GO
CLR A14 ;NO MORE COLLISIONS
MOVE A14,*A8(OCVECT),L
MOVI DUMRETS,A14
MOVE A14,*A8(OGUNVECT),L
PUSH A2
MOVI -020000H,A1 ;MIN X VEL
MOVI 020000H,A2 ;MAX X VEL
MOVI -020000H,A3 ;MIN Y VEL
MOVI 020000H,A4 ;MAX Y VEL
CLR A5 ;DO THE BOX THING
CLR A6 ;NO SHAKE
MOVI FRAG_C2,A7 ;FRAGMENT SCRIPT
MOVK 10,A9 ;NUMBER OF BLOWS
CLR A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
RETS
**************************************************************************
* *
* FUSEGUN VECTORS *
* *
**************************************************************************
FUSEGUN_GUNVECT
CALLA COPTER_SPARK
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
SOUND1 SND_CLANG_LOW
JRUC FGV_GO
FUSEGUN_COLLISION
CALLR COPTER_HIT
CALLA PUSHBACK
SOUND1 SND_THUD
FGV_GO
CMPK 2,A5
JREQ FGV_DESTROYED ;BR=TRASHED!
; MOVE A5,A5
; JRNZ FGV_DONE
; CALLR FW_GO ;FUCK UP DA DIRECTION
;FGV_DONE
RETS
FGV_DESTROYED
MOVI 10000,A1
CALLA SCORE
MOVK 20,A6 ;SHAKE RADIUS
FGV_NOSHAKE_DESTROYED
PUSH A2
MOVI 020000H,A1 ;MIN X VEL
MOVI 080000H,A2 ;MAX X VEL
MOVI -010000H,A3 ;MIN Y VEL
MOVI 060000H,A4 ;MAX Y VEL
MOVI [-31*2,33*2],A5 ;RIGHT BLOW OFFSET
MOVI FRAG_C1,A7 ;FRAGMENT SCRIPT
MOVK 8,A9 ;NUMBER OF BLOWS
MOVI FGV_MAKE_FIRE,A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
RETS
FGV_MAKE_FIRE
; MOVE *A8(OPART1),A0,L ;GET HEAD
; MOVE *A0(OPARTS),A0,L ;GET 2ND PART
; MOVB *A0(OPARTID),A14
; CMPK BELLY_GUN,A14
; JRNE FGV_CHECK_FLIP ;BR=THIS IS NOT THE BELLY GUN
; MOVE *A0(OPARTS),A0,L ;GET NOSE PART
; CALLR CN_START_NOSE ;START NOSE GUN
;FGV_CHECK_FLIP
MOVE *A8(OCTRL),A14,W
ANDI M_FLIPH,A14
MOVI [-79*2,-23*2],A1
BTST B_FLIPH,A14
JRZ FGV_FIRE ;BR=NOT FLIPPED
NEGX A1
FGV_FIRE
MOVE A1,*A8(OPARTSXY),L
; CALLR DELETE_FLASH
;
; CLR A14
; MOVE A14,*A8(OCVECT),L
; MOVI DUMRETS,A14
; MOVE A14,*A8(OGUNVECT),L
;
; MMTM SP,B1,B2,B4,B5,B6,B8,B9 ;MAKE FRAGMENTS
;
; MOVI 040000H,A0
; CLR A3
; CALLA PreFrag_Box
; MOVI -0FFH,B9
; MOVI -01H,B10
; MOVI FRAG_C5,B14
; CALLA Fragger
;
; MOVI yGRAD2Yp,A5
; MOVE A5,*A0(FPDATA),L ;SET PALETTE
;
; MMFM SP,B1,B2,B4,B5,B6,B8,B9
MOVE A8,A0 ;REPLACE WITH FIRE
MOVE A2,A4
CALLA GET_HEAD_PART
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
MOVE *A8(OZVAL),A3,L
CALLA SETOFFPU
MOVE A4,A2
CALLA PULLPART
CALLA INSPART
MOVI FUSE_FIRE_START_ANIM,A1
MOVI FUSE_FIRE_ANIM,A14
JAUC STRTANIM_OFF
**************************************************************************
* *
* NOSEGUN VECTORS *
* *
**************************************************************************
GRILL_MISSLETIME_TABLE
.WORD 20, 15, 15
DUM_NOSEGUN_GUNVECT
CALLA COPTER_SPARK
SOUND1 SND_CLANG_HIGH
CALLR CV_GUN ;CHECK FOR GUN EXPLOSION
MOVI GUN_DAMAGE/8,A3,W
JRUC DNV_GO
DUM_NOSEGUN_COLLISION
SOUND1 SND_METALLIC_FUCKUP
CALLR PUSHBACK
CALLR CV_ROCKET ;MAKE ROCKET EXPLOSION
MOVI ROCKET_DAMAGE/8,A3,W
DNV_GO
MOVI NOSEGUN_DUMMY_DAMAGE_TABLE,A4
MOVK 3,A5
CALLR DUMMY_DAMAGE ;FIND A PART TO DAMAGE
JRNC DNV_DONE ;BR=DAMAGED A PART
MOVI NOSEGUN_GUNVECT,A14 ;ACTIVATE NOSE GUN VECTORS
MOVE A14,*A8(OGUNVECT),L
MOVI NOSEGUN_COLLISION,A14
MOVE A14,*A8(OCOLLISION),L
DNV_DONE
RETS
NOSEGUN_DUMMY_DAMAGE_TABLE
WL LEFT_WING, WV_DESTROYED
WL RGHT_WING, WV_DESTROYED
WL BELLY_GUN, BWV_DESTROYED
NOSEGUN_GUNVECT
CALLA COPTER_SPARK
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
SOUND1 SND_CLANG_HIGH
JRUC NV_GO
NOSEGUN_COLLISION
CALLR COPTER_HIT
CALLA PUSHBACK
SOUND1 SND_METALLIC_FUCKUP
NV_GO
CMPK 2,A5
JREQ NV_DESTROYED ;BR=TRASHED!
MOVE A5,A5
JRNZ NV_DONE
CALLR FW_GO ;FUCK UP DA DIRECTION
NV_DONE
RETS
NV_DESTROYED
MOVI 10000,A1
CALLA SCORE
SOUND1 SND_SHES_BREAKIN_UP
MMTM SP,A2,A8
MOVK 2,A11 ;2 PARTS TO DAMAGE
NV_F_LUPE
MOVE A11,A1
ADDK RGHT_FUSELAGE-2,A1
CALLA FINDPART
LOCKON Z
MOVE A0,A8
MOVI 010000H,A1 ;MIN X VEL
MOVI 060000H,A2 ;MAX X VEL
MOVI -040000H,A3 ;MIN Y VEL
MOVI 040000H,A4 ;MAX Y VEL
MOVI [-55*2,0],A5 ;RIGHT BLOW OFFSET
MOVK 20,A6 ;SHAKE RADIUS
MOVI FRAG_C1,A7 ;FRAGMENT SCRIPT
MOVK 32,A9 ;NUMBER OF BLOWS
MOVI FUSELAGE_DAMAGE,A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
DSJ A11,NV_F_LUPE
MOVI COPDAM2,A8
MOVK 24,A9
MOVK 31,A10
MOVK 4,A11
CREATE PID_COLOR,CYCLE16
MOVI PARTS_TO_FUCKUP_TABLE,A4
CLR A6 ;SHAKE RADIUS
NV_DAM_LUPE
MOVE *SP,A8,L ;GET TOP OF STACK (OBJECT ADDR)
MOVE *A4+,A1,W
JRZ NV_DAM_DONE ;BR=NO MORE
CALLA FINDPART
JRZ NV_DAM_NEXT ;BR=NOT HERE
MOVE A0,A8
MOVE *A4,A14,L
PUSH A4
CALL A14 ;DAMAGE THE PART
PULLQ A4
NV_DAM_NEXT
ADDK 020H,A4
DSJ A5,NV_DAM_LUPE
NV_DAM_DONE
MMFM SP,A2,A8
MOVK GRILL,A1 ;FIND DA GRILL
CALLA FINDPART
LOCKON Z
MOVI FIREBALL_MISSLETIME_TABLE,A14
MOVE A14,@MISSLETIME_TABLE,L
MOVI GRILL_ANIM,A1 ;START IT UP
CALLA STRTANIM
MOVI GRILL_GUNVECT,A14 ;ACTIVATE GRILL VECTORS
MOVE A14,*A0(OGUNVECT),L
MOVI GRILL_COLLISION,A14
MOVE A14,*A0(OCOLLISION),L
JAUC DEL_PROC_AND_OBJ
**************************************************************************
* *
* FUSELAGE_DAMAGE - DAMAGE FUSELAGE PART *
* *
* PASS: *
* A8 = FUSELAGE PART *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
FUSELAGE_DAMAGE
move *A8(OCTRL),A4,W
MOVI CPTFSEC9sd,A1
CALLA ANI
CALLA SET_SCALE_WARREN ;SCALE THE MOTHER
CALLA SET_ODAG ;COMPUTE ODAG AGAIN
MOVI COPDAM2,A0
CALLA CHANGE_PAL
MOVI COPTER_LCLANG_GUNVECT,A14 ;DEACTIVATE DAMAGE VECTORS
MOVE A14,*A8(OGUNVECT),L
MOVI COPTER_LCLANG_COLLISION,A14
MOVE A14,*A8(OCOLLISION),L
RETS
PARTS_TO_FUCKUP_TABLE
WL LEFT_FUSE_GUN, FGV_NOSHAKE_DESTROYED
WL RGHT_FUSE_GUN, FGV_NOSHAKE_DESTROYED
WL LEFT_ENGINE_COVER, EV_NOSHAKE_DESTROYED
WL RGHT_ENGINE_COVER, EV_NOSHAKE_DESTROYED
WL TOP_COCKPIT, CPV_NOSHAKE_DESTROYED
WL BOTTOM_COCKPIT, CPV_NOSHAKE_DESTROYED
.WORD 0
**************************************************************************
* *
* GRILL VECTORS *
* *
**************************************************************************
GRILL_GUNVECT
CALLA COPTER_SPARK
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
SOUND1 SND_CLANG_LOW
JRUC GV_GO
GRILL_COLLISION
CALLR COPTER_HIT
CALLA PUSHBACK
SOUND1 SND_THUD
GV_GO
CMPK 2,A5
JREQ GV_DESTROYED ;BR=TRASHED!
RETS
GV_DESTROYED
MOVI 10000,A1
CALLA SCORE
; MOVK 1,A14
; MOVE A14,@GUNS_OFF,W ;NO MORE SHOOTIN'
SOUND1 SND_WERE_GOIN_DOWN
SOUND1 SND_CHAN3_OFF
MOVE *A8(OPART1),A0,L
LOCKON Z
MOVE A2,*A0(OPLAYER),L
CALLA DEL_PROC_AND_OBJ
MOVE A0,A8
CALLA CLR_VEL
MOVE *A8(OPLINK),A0,L
JRZ GV_NO_PROC ;BR=NO PROCESS HERE
CLR A14
MOVE A14,*A8(OPLINK),L
MOVE A14,@COPTER_OBJ,L
MOVI M_CHOVER,A14
MOVE A14,*A8(OCOMMAND),L ;SHAKE TOWARDS THE CENTER
MOVI 32,A14 ;NUMBER OF SHAKES
MOVB A14,*A8(AnimLoop)
MOVK 25,A14 ;SHAKE RADIUS
MOVB A14,*A8(OSHAKERADIUS)
MOVI FINAL_SHAKE_ANIM,A1
CALLA STRT_ANIM
CALLA KILL
GV_NO_PROC
MMTM SP,A2,A8
CLR A6 ;SHAKE RADIUS
MOVI FRAG_C1,A7 ;FRAGMENT SCRIPT
MOVI 127,A9 ;NUMBER OF BLOWS
MOVI DUMRETS,A10 ;BLOWN ROUTINE
MOVK 2,A11 ;2 PARTS TO DAMAGE
GV_LUPE
MOVE A11,A1
ADDK RGHT_FUSELAGE-2,A1
CALLA FINDPART
LOCKON Z
MOVE A0,A8
MOVI 08000H,A1 ;MIN X VEL
MOVI 060000H,A2 ;MAX X VEL
MOVI -040000H,A3 ;MIN Y VEL
MOVI 060000H,A4 ;MAX Y VEL
MOVI [-55*2,0],A5 ;RIGHT BLOW OFFSET
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
MOVE A11,A1
ADDK RGHT_ENGINE-2,A1
CALLA FINDPART
LOCKON Z
MOVE A0,A8
MOVI 010000H,A1 ;MIN X VEL
MOVI 080000H,A2 ;MAX X VEL
MOVI -040000H,A3 ;MIN Y VEL
MOVI 040000H,A4 ;MAX Y VEL
MOVI [-125*2,50*2],A5 ;RIGHT BLOW OFFSET
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
DSJ A11,GV_LUPE
MOVK GEAR,A1
CALLA FINDPART
LOCKON Z
MOVE A0,A8
MOVI -040000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI -060000H,A3 ;MIN Y VEL
MOVI -010000H,A4 ;MAX Y VEL
MOVI [0,0],A5 ;RIGHT BLOW OFFSET
CLR A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
; MOVK TOP_COCKPIT,A1
; CALLA FINDPART
; LOCKON Z
;
; MOVE A0,A8
; MOVI -040000H,A1 ;MIN X VEL
; MOVI 040000H,A2 ;MAX X VEL
; MOVI -040000H,A3 ;MIN Y VEL
; MOVI 040000H,A4 ;MAX Y VEL
; MOVI [-120*2,0],A5 ;RIGHT BLOW OFFSET FOR TOP
; CLR A7 ;FRAGMENT SCRIPT
; CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
;
; MOVK BOTTOM_COCKPIT,A1
; CALLA FINDPART
; LOCKON Z
;
; MOVE A0,A8
; MOVI -040000H,A1 ;MIN X VEL
; MOVI 040000H,A2 ;MAX X VEL
; MOVI -040000H,A3 ;MIN Y VEL
; MOVI 040000H,A4 ;MAX Y VEL
; MOVI [-90*2,0],A5 ;RIGHT BLOW OFFSET FOR BOTTOM
; CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
MMFM SP,A2,A8
RETS
**************************************************************************
* *
* A_START_DUPING *
* *
**************************************************************************
A_START_DUPING
MOVK 2,A14 ;NUMBER OF SHAKES FOR PART 2
MOVB A14,*A8(AnimLoop)
; MOVE @WAVEIRQS,A14,L
; MOVE A14,*A8(OCDATA),L
MOVK 2,A11 ;2 PARTS TO DAMAGE
ASD_LUPE
MOVE A11,A1
ADDK RGHT_FUSELAGE-2,A1
CALLA FINDPART
LOCKON Z
MOVI FUSELAGE_INIT,A14
MOVE A14,*A0(ODUP_INIT),L
MOVI 040000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI -020000H,A3 ;MIN Y VEL
MOVI 020000H,A4 ;MAX Y VEL
MOVE A0,A14
ADDI OMINXVEL+020H,A14
MMTM A14,A1,A2,A3,A4
MOVI DUP_PART_ANIM,A1
CALLA STRTANIM
MOVE A11,A1
ADDK RGHT_ENGINE-2,A1
CALLA FINDPART
LOCKON Z
MOVI ENGINE_INIT,A14
MOVE A14,*A0(ODUP_INIT),L
MOVI 040000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI -030000H,A3 ;MIN Y VEL
MOVI 020000H,A4 ;MAX Y VEL
MOVE A0,A14
ADDI OMINXVEL+020H,A14
MMTM A14,A1,A2,A3,A4
MOVI DUP_PART_ANIM,A1
CALLA STRTANIM
MOVE A11,A1
ADDK RGHT_TOP_FUSELAGE-2,A1
CALLA FINDPART
LOCKON Z
MOVE A0,A8
MOVI TOP_FUSELAGE_INIT,A14
MOVE A14,*A8(ODUP_INIT),L
MOVI 040000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI -020000H,A3 ;MIN Y VEL
MOVI 030000H,A4 ;MAX Y VEL
MOVI [-105*2,10*2],A5 ;RIGHT BLOW OFFSET
CLR A6 ;SHAKE RADIUS
MOVI FRAG_C1,A7 ;FRAGMENT SCRIPT
MOVI 127,A9 ;NUMBER OF BLOWS
CLR A10 ;BLOWN ROUTINE
CALLR DUP_PART ;MAKE A BIG THING ABOUT IT
DSJ A11,ASD_LUPE
RETS
**************************************************************************
* *
* THROW_EXPLOS *
* *
**************************************************************************
A_THROW_EXPLO
; MOVE *A8(OCDATA),A1,L
; MOVE @WAVEIRQS,A14,L
; MOVE A14,A3
; SUB A1,A14
;
; CMPK 16,A14
; JRLT ATE_DONE
;
; MOVE A3,*A8(OCDATA),L
MOVI EXPLO_INIT,A5
CALLA CREATE_OBJ
JRZ ATE_DONE
MOVE A0,A7
MOVE *A7(OFLAGS),A14,W
ORI M_DBLSCL,A14
MOVE A14,*A7(OFLAGS),W
MOVE *A8(OXVAL),A2,L
MOVE A2,*A7(OXVAL),L
MOVE *A8(OYVAL),A4,L
SUBI 70*2 << 15,A4
MOVE A4,*A7(OYVAL),L
MOVE *A8(OZVAL),A5,L
SUBK 32,A5
MOVE A5,*A7(OZVAL),L
MOVI -0800H,A1
MOVI -0100H,A0
CALLA RANGERND
MOVE A0,*A7(OZVEL),L
MOVI -010000H,A1
MOVI 040000H,A0
CALLA RANGERND
MOVE A0,*A7(OYVEL),L
MOVI -080000H,A1
MOVI 080000H,A0
CALLA RANGERND
MOVE A0,*A7(OXVEL),L
MOVE A7,A0
CALLA INSOBJ
ATE_DONE
RETS
FUSELAGE_INIT
.LONG CPTFSEC9sd, 0
.WORD OID_JUNK, DMAWNZ, M_DBLSCL, 0
.LONG C_STRTANIM
.LONG DUP_TIMEOUT_ANIM
ENGINE_INIT
.LONG CPTFSEC3s, 0
.WORD OID_JUNK, DMAWNZ, M_DBLSCL, 0
.LONG C_STRTANIM
.LONG DUP_TIMEOUT_ANIM
TOP_FUSELAGE_INIT
.LONG CPTFSEC5s, 0
.WORD OID_JUNK, DMAWNZ, M_DBLSCL, 0
.LONG C_STRTANIM
.LONG DUP_TIMEOUT_ANIM
DUP_TIMEOUT_ANIM
LW 1,60
LWL 1,1|AFunc,DELETE_OBJ
FINAL_SHAKE_ANIM
LWL 1,1|AFunc,A_SHAKE_COPTER
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,4
LWLL 1,0|AFunc,A_Anim_DSJ+2,FINAL_SHAKE_ANIM
LWL 1,1|AFunc,A_START_DUPING
FINAL_SHAKE_ANIM_PART2
LWL 1,1|AFunc,A_SHAKE_COPTER
LWL 1,1|AFunc,A_THROW_EXPLO
LWL 1,1|AFunc,A_THROW_EXPLO
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,2
; LWLL 1,0|AFunc,A_AnimFrm+2,FINAL_SHAKE_ANIM_PART2
LWLL 1,0|AFunc,A_Anim_DSJ+2,FINAL_SHAKE_ANIM_PART2
LWL 1,1|AFunc,A_FINAL_EXPLO_COPTER
**************************************************************************
* *
* A_FINAL_EXPLO_COPTER - COPTER GO BOOM! *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_FINAL_EXPLO_COPTER
SOUND1 SND_FINAL_EXPLO_COPTER1
SOUND1 SND_FINAL_EXPLO_COPTER2
SOUND1 SND_FINAL_EXPLO_COPTER3
CREATE PID_IND, PROC_SKY_FLASH
JRUC A_DELETE_COPTER
**************************************************************************
* *
* ENGINE VECTORS *
* *
**************************************************************************
ENGINE_GUNVECT
CALLA COPTER_SPARK
MOVI GUN_DAMAGE,A0,W
CALLR COPTER_HIT
SOUND1 SND_CLANG_LOW
JRUC EV_GO
ENGINE_COLLISION
CALLR COPTER_HIT
CALLA PUSHBACK
SOUND1 SND_THUD
EV_GO
CMPK 2,A5
JREQ EV_DESTROYED ;BR=TRASHED!
RETS
EV_DESTROYED
MOVI 10000,A1
CALLA SCORE
MOVK 20,A6 ;SHAKE RADIUS
EV_NOSHAKE_DESTROYED
MOVE *A8(OPART1),A0,L
LOCKON Z
MOVE *A0(OSTUTTER),A14,W ;INCREASE STUTTER CHANCE
ADDK 32,A14
MOVE A14,*A0(OSTUTTER),W
PUSH A2
MOVI -040000H,A1 ;MIN X VEL
MOVI 040000H,A2 ;MAX X VEL
MOVI -040000H,A3 ;MIN Y VEL
MOVI 040000H,A4 ;MAX Y VEL
MOVI [-117*2,51*2],A5 ;RIGHT BLOW OFFSET
MOVI FRAG_C1,A7 ;FRAGMENT SCRIPT
MOVK 8,A9 ;NUMBER OF BLOWS
MOVI EV_MAKE_FIRE,A10 ;BLOWN ROUTINE
CALLR BLOW_PART ;MAKE A BIG THING ABOUT IT
PULLQ A2
RETS
EV_MAKE_FIRE
MOVB *A8(OPARTID),A14
MOVE A8,A3
MOVI gGRAD2cy,A8 ;LEFT PALETTE
CMPK RGHT_ENGINE_COVER,A14
JRNE EV_ENG_CYCLE ;BR=THIS IS NOT THE RIGHT ONE
MOVI gGRAD2cy2,A8 ;RIGHT PALETTE
EV_ENG_CYCLE
MOVK 18,A9 ;COLOR CYCLE ON ENGINE
MOVK 31,A10
MOVK 2,A11
CREATE PID_COLOR,CYCLE16
MOVE A3,A8
MOVE *A8(OCTRL),A10,W
ANDI M_FLIPH,A10
MOVI [-107*2,-48*2],A9
MOVI ENGINE_FIRE_INIT,A5
BTST B_FLIPH,A10
JRZ EV_FIRE ;BR=NOT FLIPPED
NEGX A9
EV_FIRE
CALLR ADD_FIRE ;FIRE GOOD!
CALLA DELETE_OBJ
RETS
; MMTM SP,B1,B2,B4,B5,B6,B8,B9 ;MAKE FRAGMENTS
;
; MOVI 040000H,A0
; CLR A3
; CALLA PreFrag_Box
; MOVI -0FFH,B9
; MOVI -01H,B10
; MOVI FRAG_C5,B14
; CALLA Fragger
;
; MOVI yGRAD2Yp,A5
; MOVE A5,*A0(FPDATA),L ;SET PALETTE
;
; MMFM SP,B1,B2,B4,B5,B6,B8,B9
;
; JAUC DEL_PROC_AND_OBJ
**************************************************************************
* *
* FUSELAGE VECTORS *
* *
**************************************************************************
FUSELAGE_GUNVECT
CALLA COPTER_SPARK
SOUND1 SND_CLANG_LOW
CALLR CV_GUN ;CHECK FOR GUN EXPLOSION
MOVI GUN_DAMAGE/8,A3,W
JRUC FV_GO
FUSELAGE_COLLISION
SOUND1 SND_THUD
CALLR PUSHBACK
CALLR CV_ROCKET ;MAKE ROCKET EXPLOSION
MOVI ROCKET_DAMAGE/8,A3,W
FV_GO
MOVI FUSELAGE_DUMMY_DAMAGE_TABLE,A4
; MOVK 4,A5
MOVK 3,A5
CALLR DUMMY_DAMAGE ;FIND A PART TO DAMAGE
JRNC FV_DONE ;BR=DAMAGED A PART
MOVI FLIGHT_9S_GUNVECT,A14
MOVE A14,*A8(OGUNVECT),L
MOVI FLIGHT_9S_COLLISION,A14
MOVE A14,*A8(OCOLLISION),L
FV_DONE
JRUC F9S_GO ;FLASH OTHER HALF
FUSELAGE_DUMMY_DAMAGE_TABLE
WL LEFT_WING, WV_DESTROYED
WL RGHT_WING, WV_DESTROYED
WL BELLY_GUN, BWV_DESTROYED
; WL NOSE_GUN, NV_DESTROYED
**************************************************************************
* *
* DUMMY_DAMAGE - DAMAGE A PART INDIRECTLY FROM A TABLE OF POSSIBLE PARTS *
* *
* PASS: *
* A0 = DAMAGE AMOUNT *
* A4 = TABLE *
* A5 = NUMBER OF TABLE ENTRIES *
* A8 = OBJECT *
* RETURN: *
* C SET IF NO PART DAMAGED, CLEAR IF DAMAGE *
* *
**************************************************************************
DUMMY_DAMAGE
PUSH A8
DD_LUPE
MOVE *A4+,A1,W
CALLA FINDPART
JRNZ DD_HIT ;BR=FOUND A PART TO HIT
ADDK 020H,A4
DSJ A5,DD_LUPE
SETC ;FLAG NO DAMAGE
JRUC DD_DONE
DD_HIT
PUSH A4
MOVE A0,A8
MOVE A3,A0
CALLA COPTER_HIT
PULLQ A4
CMPK 2,A5
JRNE DD_NOT_DESTROYED ;BR=NOT TRASHED
MOVE *A4,A14,L
CALL A14
DD_NOT_DESTROYED
CLRC ;FLAG DAMAGE
DD_DONE
PULLQ A8
RETS
**************************************************************************
* *
* ********************************************************************** *
* * *
* * ******************************************************************** *
* * * *
* * * THE FOLLOWING GUN AND COLLISION ROUTINES MUST BE REDONE! *
* * * *
* * ******************************************************************** *
* * *
* ********************************************************************** *
* *
**************************************************************************
;**************************************************************************
;* *
;* COPTER_DUM_GUNVECT *
;* *
;**************************************************************************
;
;COPTER_DUM_GUNVECT
; JRUC CDG_GUNHIT ;THESE INSTRUCTIONS MUST BE THE
; NOP ; LENGTH OF A LONG WORD
;;COLLISION ENTRY POINT
;CDG_COLLISION
; MOVI ROCKET_DAMAGE/4,A0,W
;CDG_GO
; MOVE A8,A1
; PUSH A8
; MOVE *A8(OPART1),A8,L
; LOCKON Z
; MOVE *A8(OPARTS),A8,L
;
; MOVB *A8(OPARTID),A14
; CMPK LEFT_FUSELAGE,A14
; JRGE CDG_NOMORE
;
; .if DEBUG
; CMP A1,A8
; LOCKON EQ
; .endif
;
; MOVE *A8(OGUNVECT),A14,L
; ADDI 020H,A14 ;OFFSET TO COLLISION ENTRY POINT
;
; CALL A14
;
; PULLQ A8
;CDG_DONE
; RETS
;CDG_GUNHIT
; MOVI GUN_DAMAGE/4,A0,W
; JRUC CDG_GO
;CDG_NOMORE
; CLR A14
; MOVE A14,*A1(OCVECT),L
; MOVI DUMRETS,A14
; MOVE A14,*A1(OGUNVECT),L
; PULLQ A8
; RETS
;
;;CDG_CHECK_TIME
;; MOVE *A8(OHITTIME),A14,W ;GET LAST TIME
;; MOVE @WAVEDISPS,A3,W ;GET CURRENT TIME
;; SUB A3,A14 ;CALCULATE DELTA TIME
;; NEG A14
;; CMPK 5,A14
;; JRLE CDG_DONE ;BR=TOO SHORT, DON'T HIT
;; MOVE A3,*A8(OHITTIME),W ;SAVE THIS TIME AS LAST TIME
;; JRUC CDG_GO
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
* *
* A_CHECK_COMMAND - CHECK IF BITS SET IN OCOMMAND WORD, JUMP IF NOT *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = BITS TO CHECK *
* AARG+,L = ADDRESS TO JUMP TO IF NOT SET *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_CHECK_COMMAND
MOVE *A8(OPART1),A1,L
LOCKON Z
MOVE *A1(OCOMMAND),A1,W
CALLA GETAFARG_WORD
AND A0,A1
XOR A0,A1
JRZ ACA_DONE ;BR=BITS ARE SET
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L
ACA_DONE
RETS
**************************************************************************
* *
* A_DAM_RETURN - RETURN FROM DAMAGE SUBROUTINE *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_DAM_RETURN
MOVE *A8(AnimRetScr),A14,L
JAZ PULL_ANIM ;BR=FLAG SET TO PULL ANIMATION
MOVE A14,*A8(AnimScr),L
MOVE *A8(AnimRetFrm),*A8(AnimFrm),L
RETS
**************************************************************************
* *
* A_RESTORE_FLIPH - RETURN FLIPH BIT TO IT'S ORIGINAL VALUE *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_RESTORE_FLIPH
MOVE *A8(OPART1),A0,L
LOCKON Z
MOVE *A0(OCTRL),A14,W
ANDI M_FLIPH,A14 ;GET FLIPH BIT FROM HEAD
MOVE *A8(OCTRL),A1,W
ANDNI M_FLIPH,A1
OR A14,A1 ;GIVE THE PART THE SAME FLIPH
MOVE A1,*A8(OCTRL),W
RETS
**************************************************************************
* *
* A_SET_DOOROFFX - SET DOOR X OFFSET FROM COPTER ANIMATION POINT *
* *
* PASS: *
* A8 = DOOR OBJECT *
* AARG+,W = X OFFSET FOR UNFLIPPED COPTER *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_SET_DOOROFFX
CALLA GETAFARG_WORD ;GET X OFFSET
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ ASD_SET_OPARTSX ;BR=NOT FLIPPED IN X
NEG A0
ASD_SET_OPARTSX
MOVE A0,*A8(OPARTSXY),W
MOVE A8,A0
MOVE *A8(OPART1),A8,L ;NICE HEAD!
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
MOVE *A8(OZVAL),A3,L
JAUC SETOFFPU
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
* *
* SIDE_COPTER_INIT *
* *
**************************************************************************
SIDE_COPTER_INIT
.byte 20, 0, 0, 7 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long yGRAD2Yp ;IMGPAL
.long gGRAD2Gp ;IMGPAL
.long gunGRADp ;IMGPAL
.long gunGRAD2p ;IMGPAL
.long PROPAL1s ;IMGPAL
.long COPDAM2 ;IMGPAL
.LONG PILOT_P ;IMGPAL
;OID, GLOBAL_OPTIONS
.word OID_COPTER, OM_COLL|OM_POS|OM_INSERT
.LONG COPTER_COLL
.LONG 039189B4H, -04000000H, 02742FH
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW CPTSSEC2s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_GUNV
.LONG COPTER_LCLANG_FLASH_GUNVECT
LWWWW CPTGATGN1s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [31*2,21*2]
.LONG FLIGHT_WEAPON_GUNVECT
.LONG C_INIT_GUN
.LONG gunGRAD2p ;NORMAL PAL
.LONG gnGRAD2pX ;HILITE PAL
.LONG GAT_GUN_ANIM0 ;ATTACK ANIMATION
.WORD GGA_LUPE-GAT_GUN_ANIM0 ;FIRE ANIMATION OFFSET
.LONG SND_GAT_GUN ;SOUND
.LONG GAT_SWING_DAM_ANIM ;DAMAGE ANIMATION
.LONG GATFLASH_INIT ;FLASH INIT TABLE
.LONG [18*2,0] ;FLASH OFFSET
.WORD 20 << 8 ;HIT POINTS
LWWWW CPTROKIT1s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [6*2,21*2]
.LONG FLIGHT_HGUNVECT
.LONG C_INIT_LAUNCHER
.LONG LAUNCHER_ANIM
.WORD 20 << 8 ;HIT POINTS
LWWWW CPTNZGN1s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [46*2,-120*2]
.LONG FLIGHT_WEAPON_GUNVECT
.LONG C_INIT_GUN
.LONG gunGRADp ;NORMAL PAL
.LONG gunGRADpb ;HILITE PAL
.LONG BELLY_GUN_ANIM0 ;ATTACK ANIMATION
.WORD BGA_LUPE-BELLY_GUN_ANIM0 ;FIRE ANIMATION OFFSET
.LONG SND_BELLY_GUN ;SOUND
.LONG BELLY_DAM_ANIM ;DAMAGE ANIMATION
.LONG BELLYFLASH_INIT ;FLASH INIT TABLE
.LONG [22*2,0] ;FLASH OFFSET
.WORD 20 << 8 ;HIT POINTS
LWWWW CPTSSEC10s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_GUNV
.LONG FLIGHT_HGUNVECT
LWWWW CPTSSEC11s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_GUNV
.LONG FLIGHT_LGUNVECT
LWWWW CPTSSEC7s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_PRVGUNV
LWWWW CPTSSEC8s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_PRVGUNV
LWWWW CPTSSEC1s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC3s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC4sx, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC5s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC6s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC9s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_GUNV
.LONG FLIGHT_HGUNVECT
LWWWW CPTSDOR1s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_GUNV
; .LONG [13*2,-53*2]
.LONG FLIGHT_LGUNVECT
; LWWWW CPTLNDGR1a, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
; .LONG [52*2,31*2]
; LWWWW CPTLNDGR1b, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
; .LONG [52*2,31*2]
; LWWWW CPTLNDGR1a, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
; .LONG [52*2,-93*2]
; LWWWW CPTLNDGR1b, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
; .LONG [52*2,-93*2]
LWWWW CPTGEAR1s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_COLL|OM_GUNV|OM_ANIM
.LONG [-46*2,-20*2]
.LONG DUMCOLL
.LONG COPTER_GCLANG_GUNVECT
.LONG BLADE_ANIM
LWWWW CPTPROPh1, DMAWNZ|M_FLIPV, M_DBLSCL, 2, OM_OPARTS|OM_COLL|OM_GUNV
.LONG [-72*2,-20*2]
.LONG DUMCOLL
.LONG COPTER_BCLANG_GUNVECT
LWWWW CPTPROPh1, DMAWNZ|M_FLIPH, M_DBLSCL, 2, OM_OPARTS|OM_COLL|OM_PRVGUNV
.LONG [-72*2,-20*2]
.LONG DUMCOLL
LWWWW SIDEPILOT, DMAWNZ|M_FLIPH, 0, 2, OM_OPARTS|OM_COLL|OM_GUNV
.LONG [-27,-135]
.LONG DUMCOLL
.LONG DUMRETS
LWWWW SIDEPILOT, DMAWNZ|M_FLIPH, 0, 1, OM_OPARTS|OM_COLL|OM_PRVGUNV
.LONG [28,-220]
.LONG DUMCOLL
**************************************************************************
* *
* SIDE_COPTER_ONTOP_INIT *
* *
**************************************************************************
SIDE_COPTER_ONTOP_INIT
.byte 18, 0, 0, 6 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long yGRAD2Yp ;IMGPAL
.long gGRAD2Gp ;IMGPAL
.long gunGRADp ;IMGPAL
.long gunGRAD2p ;IMGPAL
.long PROPAL1s ;IMGPAL
.long COPDAM2 ;IMGPAL
;OID, GLOBAL_OPTIONS
.word OID_COPTER, OM_DUMCOLL|OM_INSERT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW CPTSSEC1s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_GUNV
.LONG COPTER_LCLANG_GUNVECT
LWWWW CPTSSEC2s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC3s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC4sx, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC5s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC6s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC9s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_PRVGUNV
LWWWW CPTSSEC11s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_PRVGUNV
LWWWW CPTSSEC7s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_GUNV
.LONG DUMRETS
LWWWW CPTSSEC8s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_PRVGUNV
LWWWW CPTSSEC10s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_GUNV
.LONG COPTER_HCLANG_GUNVECT
LWWWW CPTLNDGR1a, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_GUNV
.LONG [52*2,31*2]
.LONG COPTER_LCLANG_GUNVECT
LWWWW CPTLNDGR1a, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
.LONG [52*2,-93*2]
LWWWW CPTLNDGR1b, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_GUNV
.LONG [52*2,31*2]
.LONG COPTER_GCLANG_GUNVECT
LWWWW CPTLNDGR1b, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
.LONG [52*2,-93*2]
LWWWW CPTGEAR1s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_GUNV|OM_ANIM
.LONG [-46*2,-20*2]
.LONG COPTER_GCLANG_GUNVECT
.LONG BLADE_ANIM
LWWWW CPTPROPh1, DMAWNZ|M_FLIPV, M_DBLSCL, 2, OM_OPARTS|OM_GUNV
.LONG [-72*2,-20*2]
.LONG COPTER_BCLANG_GUNVECT
LWWWW CPTPROPh1, DMAWNZ|M_FLIPH, M_DBLSCL, 2, OM_OPARTS|OM_PRVGUNV
.LONG [-72*2,-20*2]
**************************************************************************
* *
* SIDE_COPTER_INTRO_INIT *
* *
**************************************************************************
SIDE_COPTER_INTRO_INIT
.byte 20, 0, 0, 7 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long yGRAD2Yp ;IMGPAL
.long gGRAD2Gp ;IMGPAL
.long gunGRADp ;IMGPAL
.long gunGRAD2p ;IMGPAL
.long PROPAL1s ;IMGPAL
.long COPDAM2 ;IMGPAL
.LONG PILOT_P ;IMGPAL
;OID, GLOBAL_OPTIONS
.word OID_COPTER, OM_COLL|OM_INSERT
.LONG COPTER_INTRO_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW CPTSSEC2s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_GUNV
.LONG COPTER_I_LCLANG_GUNVECT
LWWWW CPTGATGN1s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [31*2,21*2]
.LONG INTRO_DELBLOWH_GUNVECT
.LONG C_SET_HITS
.WORD 5 << 8
LWWWW CPTROKIT1s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [6*2,21*2]
.LONG COPTER_I_HCLANG_GUNVECT
.LONG C_SET_HITS
.WORD 5 << 8
LWWWW CPTNZGN1s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [46*2,-120*2]
.LONG INTRO_DELBLOWH_GUNVECT
.LONG C_SET_HITS
.WORD 5 << 8
LWWWW CPTSSEC10s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_GUNV|OM_CFUNC
.LONG INTRO_DELBLOWH_GUNVECT
.LONG C_SET_HITS
.WORD 5 << 8
LWWWW CPTSSEC11s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_GUNV|OM_CFUNC
.LONG COPTER_I_LCLANG_GUNVECT
.LONG C_SET_HITS
.WORD 5 << 8
LWWWW CPTSSEC7s, DMAWNZ|M_FLIPH, M_DBLSCL|M_NOPIXSCAN, -1, OM_GUNV|OM_CFUNC
.LONG INTRO_COCKBLOW_GUNVECT
.LONG C_SET_HITS
.WORD 5 << 8
LWWWW CPTSSEC8s, DMAWNZ|M_FLIPH, M_DBLSCL|M_NOPIXSCAN, -1, OM_PRVGUNV|OM_CFUNC
.LONG C_SET_HITS
.WORD 5 << 8
LWWWW CPTSSEC1s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_GUNV|OM_CFUNC
.LONG INTRO_PARTBLOW_GUNVECT
.LONG C_SET_HITS
.WORD 20 << 8
LWWWW CPTSSEC3s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_GUNV
.LONG COPTER_I_LCLANG_GUNVECT
LWWWW CPTSSEC4sx, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_PRVGUNV
LWWWW CPTSSEC5s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_GUNV|OM_CFUNC
.LONG INTRO_PARTBLOW_GUNVECT
.LONG C_SET_HITS
.WORD 20 << 8
LWWWW CPTSSEC6s, DMAWNZ|M_FLIPH, M_DBLSCL, 0, OM_GUNV
.LONG COPTER_I_LCLANG_GUNVECT
LWWWW CPTSSEC9s, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_GUNV|OM_CFUNC
.LONG INTRO_PARTBLOW_GUNVECT
.LONG C_SET_HITS
.WORD 20 << 8
LWWWW CPTSDOR1s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_GUNV|OM_CFUNC
; .LONG [13*2,-53*2]
.LONG INTRO_DELBLOWL_GUNVECT
.LONG C_SET_HITS
.WORD 5 << 8
; .LONG COPTER_DOOR_ANIM
; LWWWW CPTLNDGR1a, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
; .LONG [52*2,31*2]
; LWWWW CPTLNDGR1b, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
; .LONG [52*2,31*2]
; LWWWW CPTLNDGR1a, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
; .LONG [52*2,-93*2]
; LWWWW CPTLNDGR1b, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_PRVGUNV
; .LONG [52*2,-93*2]
LWWWW CPTGEAR1s, DMAWNZ|M_FLIPH, M_DBLSCL, 1, OM_OPARTS|OM_COLL|OM_GUNV|OM_ANIM
.LONG [-46*2,-20*2]
.LONG DUMCOLL
.LONG COPTER_I_GCLANG_GUNVECT
.LONG BLADE_ANIM
LWWWW CPTPROPh1, DMAWNZ|M_FLIPV, M_DBLSCL, 2, OM_OPARTS|OM_COLL|OM_GUNV
.LONG [-72*2,-20*2]
.LONG DUMCOLL
.LONG COPTER_I_BCLANG_GUNVECT
LWWWW CPTPROPh1, DMAWNZ|M_FLIPH, M_DBLSCL, 2, OM_OPARTS|OM_COLL|OM_PRVGUNV
.LONG [-72*2,-20*2]
.LONG DUMCOLL
LWWWW SIDEPILOT, DMAWNZ|M_FLIPH, 0, 2, OM_OPARTS|OM_COLL|OM_GUNV
.LONG [-27,-135]
.LONG DUMCOLL
.LONG DUMRETS
LWWWW SIDEPILOT, DMAWNZ|M_FLIPH, 0, 1, OM_OPARTS|OM_COLL|OM_PRVGUNV
.LONG [28,-220]
.LONG DUMCOLL
SIDE_COPTER_INTRO_COLLISIONS
.LONG COPTER_LCLANG_COLLISION, INTRO_DELBLOWH_COLLISION
.LONG COPTER_HCLANG_COLLISION, INTRO_DELBLOWH_COLLISION
.LONG INTRO_DELBLOWH_COLLISION, COPTER_LCLANG_COLLISION
.LONG INTRO_COCKBLOW_COLLISION, INTRO_COCKBLOW_COLLISION
.LONG INTRO_PARTBLOW_COLLISION, COPTER_LCLANG_COLLISION
.LONG COPTER_LCLANG_COLLISION, INTRO_PARTBLOW_COLLISION
.LONG COPTER_LCLANG_COLLISION, INTRO_PARTBLOW_COLLISION
.LONG INTRO_DELBLOWL_COLLISION, 0, 0, 0, 0, 0
**************************************************************************
* *
* WEAPON FLASH INITS AND ANIMS *
* *
**************************************************************************
GATFLASH_INIT
.LONG GATFIRE1a, 0
.WORD OID_JUNK, DMAGO, M_DBLSCL, -7
.LONG C_RESTART_GAT_ANIM
; .LONG C_STRTANIM
; .LONG GATFLASH_ANIM
GATFLASH_ANIM
LWWL GATFIRE1a,3|AFlip|AFunc,0,A_HIT_ON
LWL 1,3|AFunc,OBJ_OFF
LWWL GATFIRE2a,3|AFlip|AFunc,0,A_HIT_ON
LWL 1,3|AFunc,OBJ_OFF
LWWL GATFIRE3a,3|AFlip|AFunc,0,A_HIT_ON
LWL 1,3|AFunc,OBJ_OFF
LWWL GATFIRE4a,3|AFlip|AFunc,0,A_HIT_ON
LWL 1,3|AFunc,OBJ_OFF
LWWL GATFIRE1a,3|AFlip|AFunc,M_FLIPH|M_FLIPV,A_HIT_ON
LWL 1,3|AFunc,OBJ_OFF
LWWL GATFIRE2a,3|AFlip|AFunc,M_FLIPH|M_FLIPV,A_HIT_ON
LWL 1,3|AFunc,OBJ_OFF
LWWL GATFIRE3a,3|AFlip|AFunc,M_FLIPH|M_FLIPV,A_HIT_ON
LWL 1,3|AFunc,OBJ_OFF
LWWL GATFIRE4a,3|AFlip|AFunc,M_FLIPH|M_FLIPV,A_HIT_ON
LWL 1,3|AFunc,OBJ_OFF
.long 0
NOSEFLASH_INIT
.LONG FNZGNFLWR1, 0
.WORD OID_JUNK, DMAGO, M_DBLSCL, -10
.LONG C_STRTANIM
.LONG GENERIC_FLASH_ANIM
BELLYFLASH_INIT
.LONG COPNZFLWR1, 0
.WORD OID_JUNK, DMAGO, M_DBLSCL, -6
.LONG C_STRTANIM
.LONG GENERIC_FLASH_ANIM
FUSEFLASH_INIT
.LONG SEC8FLWR1, 0
.WORD OID_JUNK, DMAGO, M_DBLSCL, -6
.LONG C_STRTANIM
.LONG GENERIC_FLASH_ANIM
GENERIC_FLASH_ANIM
LWL 1,3|AFunc,A_HIT_FLIP_ON
LWL 1,3|AFunc,OBJ_OFF
.long 0
**************************************************************************
* *
* FRONT_COPTER_INIT *
* *
**************************************************************************
GUN_HIT_POINTS EQU 33 << 8 ; 50 << 8
ROCKET_HIT_POINTS EQU 50 << 8 ; 75 << 8
NOSE_HIT_POINTS EQU 50 << 8 ; 75 << 8
GRILL_HIT_POINTS EQU 66 << 8 ;100 << 8
ENGINE_HIT_POINTS EQU 10 << 8
COCKPIT_HIT_POINTS EQU 5 << 8
SIDE_HIT_POINTS EQU 10 << 8
WING_HIT_POINTS EQU 33 << 8 ; 50 << 8
FRONT_COPTER_INIT
.byte 27, 0, 0, 8 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long yGRAD2Yp ;IMGPAL
.long gGRAD2cy ;IMGPAL
.long gGRAD2Gp ;IMGPAL
.long PROPAL1s ;IMGPAL
.long gunGRADp ;IMGPAL
.long gunGRAD2p ;IMGPAL
.LONG gGRAD2cy2 ;IMGPAL
.LONG PILOT_P ;IMGPAL
;OID, GLOBAL_OPTIONS
.word OID_COPTER, OM_COLL|OM_POS|OM_INSERT
.LONG COPTER_COLL
.LONG 031CA1B4H,-015F13FCH,0189C7H
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW CPTFSEC1s, DMAWNZ, M_DBLSCL, 0, OM_GUNV
.LONG COPTER_LCLANG_GUNVECT
LWWWW CPTGATGN4s, DMAWNZ, M_DBLSCL, -6, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [-65*2,-75*2]
; .LONG WING_WEAPON_GUNVECT
.LONG FLIGHT_WEAPON_GUNVECT
.LONG C_INIT_GUN
.LONG gunGRAD2p ;NORMAL PAL
.LONG gnGRAD2pX ;HILITE PAL
.LONG GAT_PART_FIRE_ANIM ;ATTACK ANIMATION
.WORD 0 ;FIRE ANIMATION OFFSET
.LONG SND_GAT_GUN ;SOUND
.LONG GAT_DAM_ANIM ;DAMAGE ANIMATION
.LONG GATFLASH_INIT ;FLASH INIT TABLE
.LONG [18*2,0] ;FLASH OFFSET
.WORD GUN_HIT_POINTS ;HIT POINTS
LWWWW CPTROKIT4s, DMAWNZ, M_DBLSCL, -7, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [-75*2,-116*2]
; .LONG WING_WEAPON_GUNVECT
.LONG FLIGHT_HGUNVECT
.LONG C_INIT_LAUNCHER
.LONG ROCKET_LAUNCHER_ANIM
.WORD ROCKET_HIT_POINTS ;HIT POINTS
LWWWW CPTGATGN4s, DMAWNZ|M_FLIPH, M_DBLSCL, -6, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [-65*2,75*2]
; .LONG WING_WEAPON_GUNVECT
.LONG FLIGHT_WEAPON_GUNVECT
.LONG C_INIT_GUN
.LONG gunGRAD2p ;NORMAL PAL
.LONG gnGRAD2pX ;HILITE PAL
.LONG GAT_PART_FIRE_ANIM ;ATTACK ANIMATION
.WORD 0 ;FIRE ANIMATION OFFSET
.LONG SND_GAT_GUN ;SOUND
.LONG GAT_DAM_ANIM ;DAMAGE ANIMATION
.LONG GATFLASH_INIT ;FLASH INIT TABLE
.LONG [18*2,0] ;FLASH OFFSET
.WORD GUN_HIT_POINTS ;HIT POINTS
LWWWW CPTROKIT4s, DMAWNZ|M_FLIPH, M_DBLSCL, -7, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [-75*2,116*2]
; .LONG WING_WEAPON_GUNVECT
.LONG FLIGHT_HGUNVECT
.LONG C_INIT_LAUNCHER
.LONG ROCKET_LAUNCHER_ANIM
.WORD ROCKET_HIT_POINTS ;HIT POINTS
LWWWW CPTNZGN4sb, DMAWNZ, M_DBLSCL, -5, OM_OPARTS|OM_GUNV|OM_CFUNC
.LONG [-14*2,0]
; .LONG BELLY_WEAPON_GUNVECT
.LONG FLIGHT_WEAPON_GUNVECT
.LONG C_INIT_GUN
.LONG gunGRADp ;NORMAL PAL
.LONG gunGRADpb ;HILITE PAL
.LONG BELLY_PART_FIRE_ANIM ;ATTACK ANIMATION
.WORD 0 ;FIRE ANIMATION OFFSET
.LONG SND_BELLY_GUN ;SOUND
.LONG BELLY_DAM_ANIM ;DAMAGE ANIMATION
.LONG BELLYFLASH_INIT ;FLASH INIT TABLE
.LONG [22*2,0] ;FLASH OFFSET
.WORD GUN_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC10s, DMAWNZ, M_DBLSCL, -9, OM_GUNV|OM_CFUNC
; .LONG COPTER_DUM_GUNVECT ;COPTER_HCLANG_GUNVECT
.LONG FLIGHT_HGUNVECT
.LONG C_INIT_GUN
.LONG gGRAD2Gp ;NORMAL PAL
.LONG PUDD2Gp ;HILITE PAL
.LONG 0 ;PART_FIRE_ANIM ;ATTACK ANIMATION
.WORD 0 ;FIRE ANIMATION OFFSET
.LONG 0 ;SND_NOSE_GUN ;SOUND
.LONG PART_DAM_ANIM ;DAMAGE ANIMATION
.LONG NOSEFLASH_INIT ;FLASH INIT TABLE
.LONG [-48*2,0] ;FLASH OFFSET
.WORD NOSE_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC4s, DMAWNZ, M_DBLSCL, -4, OM_GUNV|OM_CFUNC
; .LONG ENGINE_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_SET_HITS
.WORD ENGINE_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC4s, DMAWNZ|M_FLIPH, M_DBLSCL, -4, OM_GUNV|OM_CFUNC
; .LONG ENGINE_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_SET_HITS
.WORD ENGINE_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC2s, DMAWNZ, M_DBLSCL, -2, OM_GUNV|OM_CFUNC
; .LONG COPTER_DUM_GUNVECT ;COPTER_LCLANG_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_SET_HITS
.WORD WING_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC2s, DMAWNZ|M_FLIPH, M_DBLSCL, -2, OM_GUNV|OM_CFUNC
; .LONG COPTER_DUM_GUNVECT ;COPTER_LCLANG_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_SET_HITS
.WORD WING_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC6s, DMAWNZ, M_DBLSCL|M_NOPIXSCAN, -8, OM_GUNV|OM_CFUNC
; .LONG COCKPIT_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_SET_HITS
.WORD COCKPIT_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC7s, DMAWNZ, M_DBLSCL|M_NOPIXSCAN, -7, OM_GUNV|OM_CFUNC
; .LONG COCKPIT_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_SET_HITS
.WORD COCKPIT_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC8s, DMAWNZ, M_DBLSCL, -5, OM_GUNV|OM_CFUNC
; .LONG COPTER_DUM_GUNVECT ;COPTER_LCLANG_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_INIT_GUN
.LONG yGRAD2Yp ;NORMAL PAL
.LONG yGRAD2Ypz ;HILITE PAL
.LONG 0 ;PART_FIRE_ANIM ;ATTACK ANIMATION
.WORD 0 ;FIRE ANIMATION OFFSET
.LONG 0 ;SND_FUSE_GUN ;SOUND
.LONG PART_DAM_ANIM ;DAMAGE ANIMATION
.LONG FUSEFLASH_INIT ;FLASH INIT TABLE
.LONG [-38*2,-41*2] ;FLASH OFFSET
.WORD SIDE_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC8s, DMAWNZ|M_FLIPH, M_DBLSCL, -5, OM_GUNV|OM_CFUNC
; .LONG COPTER_DUM_GUNVECT ;COPTER_LCLANG_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_INIT_GUN
.LONG yGRAD2Yp ;NORMAL PAL
.LONG yGRAD2Ypz ;HILITE PAL
.LONG 0 ;PART_FIRE_ANIM ;ATTACK ANIMATION
.WORD 0 ;FIRE ANIMATION OFFSET
.LONG 0 ;SND_FUSE_GUN ;SOUND
.LONG PART_DAM_ANIM ;DAMAGE ANIMATION
.LONG FUSEFLASH_INIT ;FLASH INIT TABLE
.LONG [-38*2,41*2] ;FLASH OFFSET
.WORD SIDE_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC11a, DMAWNZ, M_DBLSCL, -9, OM_GUNV|OM_CFUNC
; .LONG COPTER_DUM_GUNVECT ;COPTER_LCLANG_GUNVECT
.LONG FLIGHT_LGUNVECT
.LONG C_SET_HITS
.WORD GRILL_HIT_POINTS ;HIT POINTS
LWWWW CPTFSEC9s, DMAWNZ, M_DBLSCL, -8, OM_GUNV
; .LONG COPTER_DUM_GUNVECT ;COPTER_LCLANG_GUNVECT
.LONG FLIGHT_9S_GUNVECT
LWWWW CPTFSEC9s, DMAWNZ|M_FLIPH, M_DBLSCL, -8, OM_PRVGUNV
LWWWW CPTFSEC3s, DMAWNZ, M_DBLSCL, -3, OM_GUNV
.LONG COPTER_HCLANG_GUNVECT
LWWWW CPTFSEC3s, DMAWNZ|M_FLIPH, M_DBLSCL, -3, OM_PRVGUNV|OM_CFUNC
.LONG C_CHANGE_ENGINE_PAL
LWWWW CPTFSEC5s, DMAWNZ, M_DBLSCL, -4, OM_GUNV
.LONG COPTER_LCLANG_GUNVECT
LWWWW CPTFSEC5s, DMAWNZ|M_FLIPH, M_DBLSCL, -4, OM_PRVGUNV
LWWWW CPTGEAR1s, DMAWNZ|M_FLIPH, M_DBLSCL, -2, OM_OPARTS|OM_COLL|OM_GUNV|OM_ANIM
.LONG [-140*2,0]
.LONG DUMCOLL
.LONG COPTER_GCLANG_GUNVECT
.LONG BLADE_ANIM
LWWWW CPTPROPh1, DMAWNZ|M_FLIPV, M_DBLSCL, -1, OM_OPARTS|OM_COLL|OM_GUNV
.LONG [-166*2,0]
.LONG DUMCOLL
.LONG COPTER_BCLANG_GUNVECT
LWWWW CPTPROPh1, DMAWNZ|M_FLIPH, M_DBLSCL, -1, OM_OPARTS|OM_COLL|OM_PRVGUNV
.LONG [-166*2,0]
.LONG DUMCOLL
LWWWW FRONTPILOT, DMAWNZ, 0, -5, OM_OPARTS|OM_COLL|OM_GUNV
.LONG [-190,0]
.LONG DUMCOLL
.LONG DUMRETS
LWWWW FRONTPILOT, DMAWNZ, 0, -6, OM_OPARTS|OM_COLL|OM_PRVGUNV
.LONG [-140,0]
.LONG DUMCOLL
;COPTER_DOOR_ANIM
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,43*2
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,33*2
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,23*2
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,13*2
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,3*2
;
; LWL 1,1|AFunc,A_COPTER_DOORBOY
;
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,13*2
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,23*2
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,33*2
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,43*2
; LWLW 1,6|AFunc,A_SET_DOOROFFX+1,53*2
; .long 0
;
;**************************************************************************
;* *
;* A_COPTER_DOORBOY *
;* *
;**************************************************************************
;
;;FROM GXNONBOY.H
;OEFLAGS EQU ODATA+060H ;UHW ENEMY FLAGS
;
;B_BW EQU 2 ;BEHIND WALL
;M_BW EQU 00004H ;BEHIND WALL
;
;B_SIDE EQU 15 ;DIRECTION
; ;0 = HEADON MOTHER FUCKER
; ;1 = SIDEWAYS MELLOW DUDE
;M_SIDE EQU 08000H
;
;A_COPTER_DOORBOY
; MOVE A8,A9
;
; MOVE *A9(ODOORBOY),A14,L
; JRNZ ACD_LUPEANIM ;BR=DOORBOY ALREADY EXISTS
;
; MOVE *A9(OFLAGS),A14,W
; BTST B_OFSCRN,A14
; JRNZ ACD_DONE ;BR=DOOR IS OFF DA SCREEN
;
;; MOVI 1024/2,A0
;; CALLA RANDPER
;; JRNC ACD_DONE ;BR=STOP MAKIN' DOORBOYS
;
; MOVI COPTER_DOORBOY_INIT,A5 ;ALLOCATE OBJECT
; CALLA CREATE_OBJ
; JRZ ACD_LUPEANIM ;BR = ERROR! ERROR!
;
; MOVE A0,A8
; CALLA CLR_ODATA
;
; MOVE A8,*A9(ODOORBOY),L
;
; MOVI COPTER_DOORBOY_ANIM,A1
; CALLA STRT_ANIM ;START ANIMATION
;
; MOVI M_BW|M_SIDE,A14
; MOVE A14,*A8(OEFLAGS),W ;SET TYPE
;
; MOVE @RAND,A0,W
; ANDI M_FLIPH,A0
; CLR A0
; MOVE *A8(OCTRL),A14,W ;SET OCTRL
; OR A0,A14
; MOVE A14,*A8(OCTRL),W
;
; MOVI [100,85],A0
; MOVE *A9(OCTRL),A14,W
; BTST B_FLIPH,A14
; JRZ ACD_SET_OPARTSXY ;BR=COPTER NOT FLIPPED
; NEGX A0
;ACD_SET_OPARTSXY
; MOVE A0,*A8(OPARTSXY),L
;
; MOVI -20 << 15,A14
; MOVE A14,*A8(OGRNDOFF),L ;SET GROUND OFFSET FOR FALL
;
; CALLR INC_ENEMY_COUNT ;COUNT ENEMY
;
; MOVE A8,A0
; MOVE A9,A8
;
; MOVE *A8(OXVAL),A1,L ;SET POSITION
; MOVE *A8(OYVAL),A2,L
; MOVE *A8(OZVAL),A3,L
; CALLA SETOFFPU
;
; CALLA INSPART ;INSERT
; CALLA INSOBJ
;ACD_LUPEANIM
; MOVE *A9(AnimFrm),A14,L
; SUBI 050H,A14
; MOVE A14,*A9(AnimFrm),L
;ACD_DONE
; RETS
;
;COPTER_DOORBOY_INIT
; .LONG G_B5SPxSHA4, DUMCOLL
; .WORD OID_NONBOY, DMAWNZ, 0, 2
; .LONG 0
;
;COPTER_DOORBOY_ANIM
; LW 1,3
; LW G_B5SPxSHA5,3
; LWL G_B5SPxSHA6,3|AFunc,A_TOGGLE_DIR
; LWLWW G_B1SHOOTA1,1|AFunc,A_RAND_AnimSLP+2,5,20
; LW 1,0
;COPTER_DOORBOY_SHOOT_ANIM
; LW G_B1SHOOTA1,1
;; LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-24,-80
; LW 1,5
; LW G_B1SHOOTA2,6
; LWLWL 1,1|AFunc,A_RAND_BRANCH+3,512,COPTER_DOORBOY_SHOOT_ANIM
; LWL G_B5SPxSHA6,3|AFunc,A_TOGGLE_DIR
; LW G_B5SPxSHA5,3
; LW G_B5SPxSHA4,3
; .long 0
;; LWL 1,1|AFunc,A_DEL_NONBOY
GRILL_ANIM
LW 1,127
LWLL 1,127|AFunc,A_AnimScr+2,GRILL_LAUNCH
GRILL_LAUNCH
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CMISSLE,GRILL_LAUNCH
LWLL CPTFSEC11b,4|AFunc,A_SOUNDZ+2,SND_GRILL_OPENCLOSE
LW CPTFSEC11c,4
GRILL_LAUNCH_AGAIN
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,0,-23*2,1 ;-8*2,-23*2,0
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,0,-23*2,0
LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,0,-23*2,1 ;8*2,-23*2,0
LWLWL 1,10|AFunc,A_RAND_BRANCH+3,64,GRILL_LAUNCH_AGAIN
LWLL CPTFSEC11b,4|AFunc,A_SOUNDZ+2,SND_GRILL_OPENCLOSE
LW CPTFSEC11a,30
.long 0
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
; LW CPTFSEC11a,0
; .long 0
BLADE_ANIM
LWWL CPTGEAR2s,1|AMulti|AFlip|AFunc,M_FLIPH,A_CHECK_STUTTER
LWWLL CPTPROPh2,1|AMulti|AFlip|AFunc,M_FLIPV,A_CHANGE_PAL+2,PROPAL1sd
LWW CPTPROPh2,1|AFlip,M_FLIPH
LW 1,0
LWWL CPTGEAR3s,1|AMulti|AFlip|AFunc,0,A_CHECK_STUTTER
LWWLL CPTPROPh1,1|AMulti|AFlip|AFunc,0,A_CHANGE_PAL+2,PROPAL1s
LW CPTPROPh1,1
LW 1,0
LWL CPTGEAR2s,1|AMulti|AFunc,A_CHECK_STUTTER
LW CPTPROPh2,1|AMulti
LWWLL CPTPROPh2,1|AFunc|AFlip,M_FLIPV|M_FLIPH,A_CHANGE_PAL+2,PROPAL1sd
LW 1,0
LWL CPTGEAR1s,1|AMulti|AFunc,A_CHECK_STUTTER
LW CPTPROPh3,1|AMulti
LWWLL CPTPROPh3,1|AFlip|AFunc,M_FLIPH,A_CHANGE_PAL+2,PROPAL1s
LWL 1,0|AFunc,A_RESET_STUTTER
.long 0
BELLY_GUN_ANIM0
LWLL CPTNZGN1s,1|AFunc,A_AnimGo+2,BELLY_GUN_ANIM
BELLY_GUN_ANIM
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CGUNS,BELLY_GUN_ANIM
LWLL CPTNZGN2s,4|AFunc,A_SOUNDZ+2,SND_BELLY_TURN
LW CPTNZGN3s,4
LW CPTNZGN4sb,1
BGA_LUPE
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CGUNS,BGA_TURNBACK
LWLL 1,1|AFunc,A_CREATE_FLASH+2,BGA_NAP
BGA_FIRE
LWL 1,3|AFunc,A_FIRE_SND_PAL
LWL 1,2|AFunc,A_NORMAL_PAL
LWLL 1,1|AFunc,A_DELETE_FLASH+2,BGA_FIRE
BGA_NAP
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
LWLL 1,0|AFunc,A_AnimFrm+2,BGA_LUPE
BGA_TURNBACK
LWLL CPTNZGN3s,4|AFunc,A_SOUNDZ+2,SND_BELLY_TURN
LW CPTNZGN2s,4
LW CPTNZGN1s,1
.long 0
BELLY_DAM_ANIM
LWLW 1,1|AFunc,A_RAND_FLIP_OCTRL+1,M_FLIPH
; LWL CPTNZGN3s,4|AFunc,A_NORMAL_PAL
LW CPTNZGN3s,4
LW CPTNZGN2s,60
LWLL CPTNZGN3s,4|AFunc,A_SOUNDZ+2,SND_BELLY_TURN
LW CPTNZGN4sb,4
LWLW 1,1|AFunc,A_TOGGLE_OCTRL+1,M_FLIPH
LW CPTNZGN3s,4
LW CPTNZGN2s,4
LW CPTNZGN3s,4
LWL 1,1|AFunc,A_RESTORE_FLIPH
LW CPTNZGN4sb,60
LWLWW 1,1|AFunc,A_Set_Rel_Word+2,OHITCOUNT,0
LWL 1,1|AFunc,A_DAM_RETURN
LAUNCHER_ANIM
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CMISSLE,LAUNCHER_ANIM
LWLL CPTROKIT2s,4|AFunc,A_SOUNDZ+2,SND_BELLY_TURN
LW CPTROKIT3s,4
LW CPTROKIT4s,1
LAUNCHER_LUPE
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CMISSLE,LAUNCHER_TURNBACK
LWLL 1,1|AFunc,A_GOSUB+2,MISSLE_LAUNCH_SUB_ANIM
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
LWLL 1,0|AFunc,A_AnimFrm+2,LAUNCHER_LUPE
LAUNCHER_TURNBACK
LWLL CPTROKIT3s,4|AFunc,A_SOUNDZ+2,SND_BELLY_TURN
LW CPTROKIT2s,4
LW CPTROKIT1s,1
.long 0
GAT_GUN_ANIM0
LWLL CPTGATGN1s,1|AFunc,A_AnimGo+2,GAT_GUN_ANIM
GAT_GUN_ANIM
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CGUNS,GAT_GUN_ANIM
LWLL CPTGATGN2s,4|AFunc,A_SOUNDZ+2,SND_GAT_TURN
LW CPTGATGN3s,4
LW CPTGATGN4s,1
GGA_LUPE
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CGUNS,GGA_TURNBACK
LWLL 1,1|AFunc,A_CREATE_FLASH+2,GGA_NAP
GGA_FIRE
LWL 1,3|AFunc,A_FIRE_SND_PAL
LWL 1,2|AFunc,A_NORMAL_PAL
LWLL 1,1|AFunc,A_DELETE_FLASH+2,GGA_FIRE
GGA_NAP
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
LWLL 1,0|AFunc,A_AnimFrm+2,GGA_LUPE
; LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CGUNS,GAT_GUN_TURNBACK
; LWLL 1,1|AFunc,A_GOSUB+2,GAT_FIRE_SUB_ANIM
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
; LWLL 1,0|AFunc,A_AnimFrm+2,GAT_GUN_LUPE
GGA_TURNBACK
LWLL CPTGATGN3s,4|AFunc,A_SOUNDZ+2,SND_GAT_TURN
LW CPTGATGN2s,4
LW CPTGATGN1s,1
.long 0
;GAT_FIRE_ANIM
; LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CGUNS,GAT_FIRE_ANIM
; LWLL 1,1|AFunc,A_GOSUB+2,GAT_FIRE_SUB_ANIM
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
; LW 1,0
; .long 0
;
;GAT_FIRE_SUB_ANIM
; LWLL 1,1|AFunc,A_CREATE_FLASH+2,GFSA_RETURN
;GFSA_FIRE
; LWL 1,3|AFunc,A_FIRE_SND_PAL
; LWL 1,2|AFunc,A_NORMAL_PAL
; LWLL 1,1|AFunc,A_DELETE_FLASH+2,GFSA_FIRE
; LWL 1,1|AFunc,A_HILITE_PAL
;GFSA_RETURN
; LWL 1,1|AFunc,A_RETURN
GAT_DAM_ANIM
; LWL CPTGATGN3s,60|AFunc,A_NORMAL_PAL
LW CPTGATGN3s,60
LWLL CPTGATGN4s,60|AFunc,A_SOUNDZ+2,SND_GAT_TURN
LWLWW 1,1|AFunc,A_Set_Rel_Word+2,OHITCOUNT,0
LWL 1,1|AFunc,A_DAM_RETURN
GAT_SWING_DAM_ANIM
LWLW 1,1|AFunc,A_RAND_FLIP_OCTRL+1,M_FLIPH
; LWL CPTGATGN3s,4|AFunc,A_NORMAL_PAL
LW CPTGATGN3s,4
LW CPTGATGN2s,60
LWLL CPTGATGN3s,4|AFunc,A_SOUNDZ+2,SND_GAT_TURN
LW CPTGATGN4s,4
LWLW 1,1|AFunc,A_TOGGLE_OCTRL+1,M_FLIPH
LW CPTGATGN3s,4
LW CPTGATGN2s,4
LW CPTGATGN3s,4
LWL 1,1|AFunc,A_RESTORE_FLIPH
LW CPTGATGN4s,60
LWLWW 1,1|AFunc,A_Set_Rel_Word+2,OHITCOUNT,0
LWL 1,1|AFunc,A_DAM_RETURN
GAT_PART_FIRE_ANIM
LWLL CPTGATGN4s,1|AFunc,A_AnimGo+2,PART_FIRE_ANIM
BELLY_PART_FIRE_ANIM
LWLL CPTNZGN4sb,1|AFunc,A_AnimGo+2,BELLY_LUPE
BELLY_LUPE
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CFINAL|M_CHOVER,PART_FIRE_ANIM
; LWLWL 1,1|AFunc,A_RAND_BRANCH+3,922,PART_FIRE_ANIM
LWLWL 1,1|AFunc,A_RAND_BRANCH+3,768,PART_FIRE_ANIM
LWLW 1,1|AFunc,A_RAND_FLIP_OCTRL+1,M_FLIPH
LWLL CPTNZGN3s,4|AFunc,A_SOUNDZ+2,SND_BELLY_TURN
LW CPTNZGN2s,4
LW CPTNZGN3s,4
LW CPTNZGN4sb,4
LWLW 1,1|AFunc,A_TOGGLE_OCTRL+1,M_FLIPH
LW CPTNZGN3s,4
LW CPTNZGN2s,4
LW CPTNZGN3s,4
LWL 1,1|AFunc,A_RESTORE_FLIPH
LW CPTNZGN4sb,1
PART_FIRE_ANIM
LWLL 1,1|AFunc,A_CREATE_FLASH+2,PFA_NAP
PFA_FIRE
LWL 1,3|AFunc,A_FIRE_SND_PAL
LWL 1,2|AFunc,A_NORMAL_PAL
LWLL 1,1|AFunc,A_DELETE_FLASH+2,PFA_FIRE
PFA_NAP
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
LW 1,0
.long 0
PART_DAM_ANIM
; LWL 1,120|AFunc,A_NORMAL_PAL
LW 1,120
LWLWW 1,1|AFunc,A_Set_Rel_Word+2,OHITCOUNT,0
LWL 1,1|AFunc,A_DAM_RETURN
NOSE_GUN_ANIM
LWLWL 1,1|AFunc,A_CHECK_COMMAND+3,M_CMISSLE,NOSE_GUN_ANIM
; LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,0,-46*2,1
; LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,0,-46*2,0
; LWLWWW 1,0|AFunc,A_LAUNCH_ROCKET+3,0,-46*2,1
LWLL 1,0|AFunc,A_MAKE_FIREBALL+2,NOSE_GUN_ANIM
LWLL 1,0|AFunc,A_MAKE_FIREBALL+2,NOSE_GUN_ANIM
LWLL 1,0|AFunc,A_MAKE_FIREBALL+2,NOSE_GUN_ANIM
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,30
; LW 1,0
LW 1,30
.long 0
PROPAL1sd:
.word 16
.word 00000h,00000h,00000h,00000h,00000h,00000h,00000h,00000h
.word 00000h,00000h,01484h,01cc6h,00000h,00000h,02508h,00000h
;gunGRD2pd:
; .word 31
; .word 07fffh,0358bh,0316ah,02928h,02507h,020e6h,01cc5h,018a4h
; .word 01483h,01062h,00c41h,00820h,00400h,00000h,00000h,00000h
; .word 00000h,00000h,00000h,00000h,00000h,00000h,00000h,00000h
; .word 00000h,00000h,00000h,00000h,00000h,00000h,00000h
;
;gunGRADpB:
; .word 31
; .word 07fffh,07fbah,07b99h,07357h,06f36h,06b15h,066f4h,062d3h
; .word 05eb2h,05a91h,05670h,0524fh,04e2eh,04a0dh,045ech,041cbh
; .word 03daah,03989h,03568h,03147h,02d26h,02905h,024e4h,020c3h
; .word 00842h,01061h,00000h,00000h,00000h,00000h,00000h
;
;PUDD2Gp:
; .word 31
; .word 00000h,07fffh,07fffh,07fffh,07fffh,07fffh,07fffh,07fffh
; .word 07fffh,07fffh,07fffh,07fffh,07fffh,06f7bh,06318h,05ef7h
; .word 05ad6h,04e73h,04a52h,04631h,04210h,035adh,0318ch,02d6bh
; .word 0294ah,018c6h,014a5h,00c63h,00000h,00000h,03820h ;,07c60h
;
;yGRAD2Ypz:
; .word 31
; .word 00000h,07fafh,07fafh,07f4ch,07b2bh,0770ah,072e9h,06ec8h
; .word 06aa7h,06686h,06265h,05e44h,05a23h,05602h,051e2h,04dc2h
; .word 049a2h,07ee9h,07ec4h,05e42h,05a22h,05602h,051e2h,04dc2h
; .word 049a2h,04582h,04182h,03d82h,03582h,03182h,048a2h ;07ce2h
gnGRAD2pX:
.word 32
.word 00000h,07fffh,07fffh,07fddh,07fdch,0777ah,07758h,07337h
.word 06b16h,066d5h,066f5h,05e92h,06a2ah,051a9h,03148h,02d27h
.word 018a3h,01482h,01062h,00c62h,00c62h,00421h,00421h,00421h
.word 00421h,00421h,00421h,00421h,00421h,00421h,00421h,05272h
gunGRADpb:
.word 32
.word 00000h,07fffh,07b99h,07357h,06f36h,06b15h,066f4h,062d3h
.word 05eb2h,05a91h,05670h,0524fh,04e2eh,04a0dh,045ech,041cbh
.word 03daah,03989h,03568h,03147h,02d26h,02905h,024e4h,020c3h
.word 00842h,01061h,00000h,00000h,00000h,00000h,00000h,07fbah
PUDD2Gp:
.word 32
.word 00000h,07fffh,07fffh,07fffh,07fffh,07fffh,07fffh,07fffh
.word 07fffh,07fffh,07fffh,07fffh,07fffh,06f7bh,06318h,05ef7h
.word 05ad6h,04e73h,04a52h,04631h,04210h,035adh,0318ch,02d6bh
.word 0294ah,018c6h,014a5h,00c63h,00000h,00000h,03820h,07c60h
yGRAD2Ypz:
.word 32
.word 00000h,07fffh,07fafh,07f4ch,07b2bh,0770ah,072e9h,06ec8h
.word 06aa7h,06686h,06265h,05e44h,05a23h,05602h,051e2h,04dc2h
.word 049a2h,07ee9h,07ec4h,05e42h,05a22h,05602h,051e2h,04dc2h
.word 049a2h,04582h,04182h,03d82h,03582h,03182h,048a2h,07ce2h
gGRAD2cy2:
.word 32
.word 00000h,04210h,03defh,039ceh,035adh,0318ch,02d6bh,0294ah
.word 02529h,02108h,01ce7h,018c6h,014a5h,01084h,00c63h,00842h
.word 00421h,00000h,07d60h,07c60h,05c00h,04400h,02820h,01400h
.word 00c00h,00400h,00c00h,01800h,02800h,03800h,06420h,07c60h
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
.end