.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