revolution-x/GXHELI.ASM

7137 lines
168 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

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

.MLIB "GXMACS.LIB"
.FILE "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