revolution-x/GXUNIFX.ASM

2599 lines
58 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

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

.MLIB "GXMACS.LIB"
.FILE "GXUNIFX.ASM"
.TITLE " <<< GENERATION X -- UNIVERSE FX ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "GX.INC"
.INCLUDE "GXHELI.H"
.INCLUDE "GXCONTRL.H"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GXKLUDGE.H"
.INCLUDE "GXUNIFX.TBL"
* SYMBOLS IN HERE
.DEF COPTER_INTRO_CVECT, CHECK_FREAK_SPEECH
.DEF WALL_EXPLODE
.DEF MAKE_CAT_PROC, CAT_DONE, GITTEN_KITTEN, GOT_TROG, MAKE_TROG_PROC
.DEF MAKE_INTRO_COPTER_PROC
.DEF MAKE_ROPE_LADDER
.DEF MAKE_CEILING_SMOKE,MAKE_CEILING_DEBRIS
.DEF PROC_AIR_RAID_SIREN
.DEF START_SIGN_FLASH
* SYMBOLS FROM GXHELI.ASM
.REF SIDE_COPTER_INTRO_INIT, SND_COPTER_FULL
.REF SIDE_COPTER_INTRO_COLLISIONS
* SYMBOLS IN GXKLUDGE.H
.REF ROPLAD4, NEONCX2, GLAMPH2, FLASHBULB1
***** From GXAFUNC.ASM
.REF A_BRANCH_IF_FALSE
***** from GXBLOOD.ASM
.REF SMALL_BLOOD_HIT
.BSS WALL_FLAG,8 ;WALL STATE FLAG
.BSS CAT_DONE,8 ;ARE WE DONE FUCKIN' WITH THE CAT? FLAG
.bss GITTEN_KITTEN,16 ;If 1, then he killed the cat
.BSS GOT_TROG,16 ;If 1, then he killed TROG
.BSS TROG_ALIVE,16 ;Means Trog has been created
; .bss filler,16 ; to keep long word aligned
.TEXT
.EVEN
**************************************************************************
* *
* START_SIGN_FLASH - FIND SIGN FLASH OBJECTS AND START THEIR ANIMATIONS *
* *
* PASS: *
* NUTIN' *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
START_SIGN_FLASH
MOVI FGLIST,A2
MOVE A2,A8
MOVI NEONCX2,A3 ;IMAGES TO FIND
MOVI GLAMPH2,A4
MOVI FLASHBULB1,A5
MOVK 3,A6 ;ANIMATE THIS NUMBER OF IMAGES
SSF_LUPE
MOVE *A8,A8,L
CMP A2,A8
JREQ SSF_DONE ;BR=END OF LIST
MOVE *A8(OIMG),A14,L
CMP A3,A14
JREQ SSF_ANIM ;BR=MATCH
CMP A4,A14
JREQ SSF_ANIM ;BR=MATCH
CMP A5,A14
JRNE SSF_LUPE ;BR=NO MATCH
SSF_ANIM
MOVE *A8(OULINK),A0,L
MOVE *A0(MAP_IMG),A1,L
ANDNI M_IF_DANIM,A1
MOVE A1,*A0(MAP_IMG),L
BTST B_IF_DAM,A1
JRZ SSF_GO ;BR=NO DAMAGE TABLE
SRL 4,A1
SLL 4,A1
MOVE *A1,A1,L
SSF_GO
SRL 4,A1
SLL 4,A1
CALLA STRT_ANIM
DEC A6
JRNZ SSF_LUPE
SSF_DONE
RETS
**************************************************************************
* *
* MAKE_CEILING_DEBRIS - CEILING CAVE-IN WITH SMOKE AND CEILING CHUNKS *
* *
**************************************************************************
MAKE_CEILING_DEBRIS
MOVI 07C760H,B0 ;OZVAL
MOVI 08H,B1 ;MIN X
MOVI 0A8H,B2 ;MAX X
CLR B3 ;MIN X VEL
CLR B4 ;MAX X VEL
MOVI -06AH,B5 ;MIN Y
MOVI -06AH,B6 ;MAX Y
MOVI 08000H,B7 ;MIN Y VEL
MOVI 040000H,B8 ;MAX Y VEL
CLR B9 ;MIN Z VEL
MOVI 0100H,B10 ;MAX Z VEL
MOVI DEBRIS_SMOKE_FRAG,B14 ;SCRIPT
CALLA Fragger
CLR B9 ;MIN Z VEL
CLR B10 ;MAX Z VEL
MOVI DEBRIS_SMOKE_FRAG,B14 ;SCRIPT
CALLA Fragger
MOVI 07C75FH,B0 ;OZVAL
CLR B7 ;MIN Y VEL
MOVI 0800H,B8 ;MAX Y VEL
MOVI DEBRIS_CCHUNK_FRAG,B14 ;SCRIPT
CALLA Fragger
SOUND1 SND_PREBUST ;MAKE BOOM SOUND!
DIE
**************************************************************************
* *
* F_CCHUNK_STUFF - STUFF GRAVITY AND GROUND COLLISION *
* *
* A0 = Ptr to un-inserted object. *
* *
* Note: Frag funcs must preserve A8-A11 and all B-File regs. *
* *
**************************************************************************
F_CCHUNK_STUFF
MOVI 03000H,A14
MOVE A14,*A0(OYACCEL),W
MOVI CCHUNK_COLL,A14
MOVE A14,*A0(OCVECT),L ;Set up chunk with Vectors
RETS
**************************************************************************
* *
* CCHUNK COLLISION TABLE *
* *
**************************************************************************
CCHUNK_COLL
WWL OID_GRND,0FFFFH,CCHUNK_GROUND_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* CCHUNK_GROUND_COLL - GROUND COLLISION ROUTINE *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
CCHUNK_GROUND_COLL
JAUC DELETE_OBJ
; CLR A14
; MOVE A14,*A8(OYACCEL),W
; MOVE A14,*A8(OYVEL),L
; MOVE A14,*A8(OZVEL),L
; JAUC SET_ONGRND
**************************************************************************
* *
* DEBRIS FRAGMENT TABLES AND ANIMS *
* *
**************************************************************************
DEBRIS_SMOKE_FRAG
.long SMOKE_ANIM,0
.word OID_JUNK,(15 << 11) + (1 << 6) + (FRGNOFLY+FRGPAL)
.long 0
DEBRIS_CCHUNK_FRAG
.long CCHUNK1_ANIM,F_CCHUNK_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGNOFLY+FRGPAL+FRGGCOL)
.long CCHUNK2_ANIM,F_CCHUNK_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGNOFLY+FRGPAL+FRGGCOL)
.long CCHUNK3_ANIM,F_CCHUNK_STUFF
.word OID_JUNK,(5 << 11) + (1 << 6) + (FRGNOFLY+FRGPAL+FRGGCOL)
.long 0
CCHUNK1_ANIM
LWL RFCHUNK1,1|AFunc,PULL_ANIM
CCHUNK2_ANIM
LWL RFCHUNK2,1|AFunc,PULL_ANIM
CCHUNK3_ANIM
LWL RFCHUNK3,1|AFunc,PULL_ANIM
**************************************************************************
* *
* MAKE_CEILING_SMOKE - CREATE SMOKE FOR TRANSITION THROUGH CEILING *
* *
**************************************************************************
MAKE_CEILING_SMOKE
MOVI 07DD98H,B0 ;OZVAL
MOVI 08H,B1 ;MIN X
MOVI 0A8H,B2 ;MAX X
CLR B3 ;MIN X VEL
CLR B4 ;MAX X VEL
MOVI -090H,B5 ;MIN Y
MOVI -08AH,B6 ;MAX Y
MOVI -020000H,B7 ;MIN Y VEL
MOVI -08000H,B8 ;MAX Y VEL
MOVI -0200,B9 ;MIN Z VEL
CLR B10 ;MAX Z VEL
MOVI SMOKE_FRAG,B14 ;SCRIPT
CALLA Fragger
MOVI -080000H,B7 ;MIN Y VEL
MOVI -010000H,B8 ;MAX Y VEL
MOVI SMOKE_FRAG,B14 ;SCRIPT
CALLA Fragger
DIE
**************************************************************************
* *
* SMOKE FRAGMENT TABLE AND ANIM *
* *
**************************************************************************
SMOKE_FRAG
.long SMOKE_ANIM,0
.word OID_JUNK,(20 << 11) + (1 << 6) + (FRGNOFLY+FRGPAL)
.long 0
SMOKE_ANIM
LW SMOKTR1,3
LW SMOKTR2,3
LW SMOKTR3,3
LW SMOKTR4,4
LW SMOKTR5,4
LW SMOKTR6,4
LW SMOKTR1,3
LW SMOKTR2,3
LW SMOKTR3,3
LW SMOKTR4,4
LW SMOKTR5,4
LW SMOKTR6,4
LWL 1,1|AFunc,DELETE_OBJ
**************************************************************************
* *
* MAKE_ROPE_LADDER - CREATE SEGMENTS AND MAKE ROPE LADDER FALL *
* *
**************************************************************************
MAKE_ROPE_LADDER
MOVI ROPLAD4,A2 ;STATIC ROPE LADDER IMAGE
MOVI -0228000H,A3 ;UNIVERSE X
; MOVI 05D9DAH,A4 ;UNIVERSE Z
MOVI 067000H,A4 ;UNIVERSE Z
MOVE @UNIV_ID,A5 ;GET ID
MOVI 080000000H,A6
MOVK 3,A7 ;NUMBER OF LADDER PARTS - 1
MOVI ROPE_Y_TABLE,A8 ;TABLE OF UNIVERSE Y VALUES
CLR A9 ;MAP_FLAGS
MRL_LUPE
CALLA GET_FREE_LINK ;GET-A-LINK
.if DEBUG
LOCKON Z
.else
JAZ SUCIDE
.endif
MOVE A9,*A0(MAP_FLAGS),L ;INITIALIZE LINK FLAGS
CMPK 1,A7
JRNE MRL_GO ;BR=THIS IS NOT THE ANIMATION
MOVI ROPE_LADDER_ANIM+M_IF_SEQ,A2 ;ANIMATING FALL DOWN LADDER
MRL_GO
MOVE A2,*A0(MAP_IMG),L ;SET IMAGE
MOVE A3,*A0(MAP_X),L ;SET UNIVERSE POSITION
MOVE *A8+,A14,W
SLL 12,A14
MOVE A14,*A0(MAP_Y),L
MOVE A4,*A0(MAP_Z),L
MOVE A5,*A0(MAP_ID),W ;SET ID
MOVE A6,*A0(MAP_OBJ),L ;RESET OBJECT
CALLA INSERT_LINK
DSJ A7,MRL_LUPE
MOVK 1,A0
MOVE A0,@UNIVERR,W ;FORCE CREATION BY UPDATE_UNIV
DIE
ROPE_Y_TABLE
.WORD -0E40H,-09C0H,-0538H,-0140H
ROPE_LADDER_ANIM
LWLL ROPLAD1,4|AFunc,A_SOUND+2,SND_ROPE_LADDER
LW ROPLAD2,4
LW ROPLAD3,4
LWL ROPLAD4,1|AFunc,PULL_ANIM
SND_ROPE_LADDER
.WORD 0F341H,19,083A0H,0 ;Rope ladder falls
**************************************************************************
* *
* WALL_EXPLODE - MAKE WALL GO BOOM! NOTE: THIS IS A PROCESS NOW! *
* *
**************************************************************************
NUM_BRICK_GROUPS EQU 8
NUM_BRICKS EQU 16
WALL_EXPLODE
CLR A14
MOVB A14,@WALL_FLAG ;RESET WALL_FLAG
MOVI FGLIST,A9
MOVE A9,A0
WE_FIND_WALL_LUPE ;FIND WALL OBJECT
MOVE *A9,A9,L
CMP A0,A9
LOCKON EQ ;PROBLEM, IF IT DOESN'T EXIST
MOVE *A9(OID),A14,W
CMPI (OID_UNIV|ID_5)&(MASK_TYPE|MASK_ID),A14
JRNE WE_FIND_WALL_LUPE ;BR=NO OID MATCH
CREATE PID_IND,EXPLOSION_4_WALL ;FINISH IT UP!
SLEEP 5
MOVK NUM_BRICK_GROUPS,A10
MOVI WALL_FRAGMENT_TABLE,A11
WE_MASTER_LUPE
MOVE *A9(OYVAL),A2,L
MOVE *A9(OXVAL),A3,L
MOVE *A9(OZVAL),A4,L
DEC A4 ;Z IN FRONT OF THE WALL
MOVK NUM_BRICKS,A6
WE_LUPE
MOVK 4,A0 ;GET RANDOM TABLE INDEX
CALLA RAND0
SLL 5,A0
ADD A11,A0
MOVE *A0,A5,L ;GET TABLE ENTRY
CALLA CREATE_OBJ
JRZ WE_NEXT
MOVE A0,A8
MOVI 158,A0 ;GET RANDOM Y PIXEL OFFSET
MOVK 23,A1
CALLA RANGRAND
SLL 15,A0 ;CONVERT TO WORLD
MOVE A2,A14 ;GET WALL OYVAL
SUB A0,A14 ;COMPUTE BRICK OYVAL
MOVE A14,*A8(OYVAL),L
SUBI 90 << 15,A0 ;COMPUTE OYVEL
NEG A0
SRA 6,A0
MOVE A0,*A8(OYVEL),L
MOVI 73,A0 ;GET RANDOM X PIXEL OFFSET
MOVI -63,A1
CALLA RANGERND
SLL 15,A0 ;CONVERT TO WORLD
MOVE A3,A14 ;GET WALL OXVAL
ADD A0,A14 ;COMPUTE BRICK OXVAL
MOVE A14,*A8(OXVAL),L
SRA 6,A0 ;COMPUTE OYVEL
MOVE A0,*A8(OXVEL),L
MOVE A4,*A8(OZVAL),L ;SET Z
MOVI -1,A0 ;RANDOM Z VELOCITY
MOVI -4,A1
CALLA RANGERND
SLL 7,A0
MOVE A0,*A8(OZVEL),L
CALLA RANDOM ;RANDOM FLIPPING
ANDI M_FLIPV|M_FLIPH,A0
MOVE *A8(OCTRL),A14,W
OR A0,A14
MOVE A14,*A8(OCTRL),W
CALLA INSERT_OBJ
WE_NEXT
DSJ A6,WE_LUPE
CMPI NUM_BRICK_GROUPS-1,A10
JRNE WE_NOPE ;BR=DON'T DO IT
CREATE PID_IND,FINISH_WALL_EXPLODE ;FINISH IT UP!
WE_NOPE
SLEEP 1
DSJ A10,WE_MASTER_LUPE
DIE
**************************************************************************
* *
* EXPLOSION_4_WALL - PROCESS TO FIRE OFF A PRE-EXPLOSION FOR THE WALL. *
* A9 = WALL OBJECT *
* *
**************************************************************************
EXPLOSION_4_WALL
MOVI PREBUST_EXPLO_INIT,B0 ;CREATE EXPLOSION
CALLA MULTIMAKE
JAZ SUCIDE ;NO ALLOCATION
MOVE A8,A0
E4W_EXPLO_LUPE
MOVE *A9(OXVAL),*A0(OXVAL),L ;SET POSITION
MOVE *A9(OYVAL),A14,L
SUBI 87*08000H,A14
MOVE A14,*A0(OYVAL),L
MOVE *A9(OZVAL),A14,L
SUBK 17,A14
MOVE A14,*A0(OZVAL),L
MOVE *A0(OPARTS),A0,L
JRNZ E4W_EXPLO_LUPE
MOVI PRE_BUST_ANIM,A1
CALLA STRT_ANIM
CALLA INSERT_OBJ
SOUND1 SND_PREBUST
DIE
SND_PREBUST
.WORD 0F2F0H,100,08304H,0 ;PRE-BUST EXPLOSION
**************************************************************************
* *
* FINISH_WALL_EXPLODE - MAKE EXPLOSION AND EXTRA BRICKS *
* *
* PASS: *
* A9 = WALL OBJECT *
* *
**************************************************************************
EXPLO_TIME EQU 3
NUM_FINAL_BRICKS EQU 10
BRICK_TEMPLATE
.LONG 0, BRICK_CVECT
.WORD OID_JUNK, DMAWNZ, M_GCOLL, 0
.LONG C_STRTANIM
.LONG BRICK_DEBRIS_ANIM
FINISH_WALL_EXPLODE
MOVI EXPLOSION_INIT,B0 ;CREATE EXPLOSION
CALLA MULTIMAKE
JRZ FWE_FINAL_BRICKS
; MOVE A8,A0
;FWE_EXPLO_LUPE
; MOVE *A9(OXVAL),*A0(OXVAL),L ;SET POSITION
;
; MOVE *A9(OYVAL),A14,L
; SUBI 87*08000H,A14
; MOVE A14,*A0(OYVAL),L
;
; MOVE *A9(OZVAL),A14,L
; SUBK 17,A14
; MOVE A14,*A0(OZVAL),L
;
; MOVE *A0(OPARTS),A0,L
; JRNZ FWE_EXPLO_LUPE
MOVE *A9(OXVAL),A1,L
MOVE *A9(OYVAL),A2,L
SUBI 87*08000H,A2
MOVE *A9(OZVAL),A3,L
SUBK 17,A3
CALLA SET_ANIPU ;SET POSITION
MOVI EXPLOSION_ANIM,A1
CALLA STRT_ANIM
CALLA INSERT_OBJ
FWE_WAIT0 ;WAIT UNTIL EXPLOSION HUGE
SLEEP EXPLO_TIME
MOVB @WALL_FLAG,A14
JRZ FWE_WAIT0 ;BR=NO YET!
CLR A14
MOVB A14,@WALL_FLAG
CLR A2
MOVE A9,A8
CLR A5
CLR A7
PUSH A9
CLR A9
CALLA UNIV_DAMAGE_HANDLER ;DAMAGE WALL
PULLQ A9
FWE_FINAL_BRICKS
MOVE A13,A10
ADDI PDATA,A10
MOVE A10,A1 ;COPY OBJECT SCRIPT TO PDATA
MOVI BRICK_TEMPLATE,A0
MOVK 6,A14
FWE_COPY
MOVE *A0+,*A1+,L
DSJS A14,FWE_COPY
MOVE *A9(OYVAL),A2,L
MOVE *A9(OXVAL),A3,L
MOVE *A9(OZVAL),A4,L
MOVI BRICK_TABLE,A6
MOVK NUM_FINAL_BRICKS,A11 ;NUMBER OF BRICKS
FWE_LUPE
MOVK 15,A0
CALLA RAND0
SLL 5,A0
ADD A6,A0
MOVE *A0,*A10,L
MOVE A10,A5
CALLA CREATE_OBJ
JRZ FWE_NEXT
MOVE A0,A8
MOVI 158,A0 ;GET RANDOM Y PIXEL OFFSET
MOVK 23,A1
CALLA RANGRAND
SLL 15,A0 ;CONVERT TO WORLD
MOVE A2,A14 ;GET WALL OYVAL
SUB A0,A14 ;COMPUTE BRICK OYVAL
MOVE A14,*A8(OYVAL),L
MOVI 73,A0 ;GET RANDOM X PIXEL OFFSET
MOVI -63,A1
CALLA RANGERND
SLL 15,A0 ;CONVECT TO WORLD
MOVE A3,A14 ;GET WALL OXVAL
ADD A0,A14 ;COMPUTE BRICK OXVAL
MOVE A14,*A8(OXVAL),L
MOVI 16,A0 ;GET RANDOM Z OFFSET
CALLA RANDU
MOVE A4,A14 ;GET WALL OZVAL
SUB A0,A14 ;COMPUTE BRICK OZVAL
MOVE A14,*A8(OZVAL),L
MOVI 10,A0 ;RANDOM X VELOCITY
MOVI -10,A1
CALLA RANGERND
SLL 14,A0
MOVE A0,*A8(OXVEL),L
MOVI 10,A0 ;RANDOM Y VELOCITY
MOVK 4,A1
CALLA RANGRAND
SLL 13,A0
MOVE A0,*A8(OYVEL),L
MOVI 01000H,A14
MOVE A14,*A8(OYACCEL),W
CALLA RANDOM ;RANDOM FLIPPING
ANDI M_FLIPV|M_FLIPH,A0
MOVE *A8(OCTRL),A14,W
OR A0,A14
MOVE A14,*A8(OCTRL),W
MOVI BRICK_CVECT,A14
MOVE A14,*A8(OCVECT),L
CALLA INSERT_OBJ
FWE_NEXT
DSJ A11,FWE_LUPE
FWE_WAIT1 ;WAIT UNTIL EXPLOSION CLEARS
SLEEP EXPLO_TIME
MOVB @WALL_FLAG,A14
JRZ FWE_WAIT1 ;BR=NOT YET!
SLEEP 60
; MOVI -1,A14
; MOVE A14,@OBJENEMIES,W ;ACTIVATE ALL ENEMIES
DIE
**************************************************************************
* *
* BRICK COLLISION TABLE AND ROUTINE *
* *
**************************************************************************
BRICK_CVECT
.WORD OID_GRND,0FFFFH
.LONG BRICK_COLLVECT
.WORD 0
.LONG DUMCRETS
BRICK_COLLVECT
CLR A14 ;STOP, DROP, AND ROLL!
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYACCEL),W
MOVE A14,*A8(OYVEL),L
MOVE *A8(OFLAGS),A14,W
ANDNI M_GCOLL,A14
MOVE A14,*A8(OFLAGS),W
RETS
**************************************************************************
* *
* A_DEL_BEYONDZ - DELETE AN OBJECT WHEN IT EXCEEDS ZMAX_REAL *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_DEL_BEYONDZ
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1
CMPI ZMAX_REAL,A1
JALT DELETE_OBJ ;BR=OUT OF Z RANGE
RETS
**************************************************************************
* *
* A_SET_WALL_FLAG - SET THE DAMN WALL FLAG *
* *
**************************************************************************
A_SET_WALL_FLAG
MOVK 1,A14
MOVB A14,@WALL_FLAG
RETS
**************************************************************************
* *
* WALL EXPLODE TABLES AND ANIMATIONS *
* *
**************************************************************************
BRICK_TABLE
.LONG BRIK1,BRIK7,BRIK9,BRIK18,BRIK23,BRIK25,GXBRIK1,GXBRIK3,GXBRIK5
.LONG CBRIK3,CBRIK4,CBRIK5,CBRIK9,CBRIK10,CBRIK11
WALL_FRAGMENT_TABLE
.LONG BRIK_INIT,GXBRIK_INIT,CBRIK_INIT,NOSHRED_INIT
BRIK_INIT
.LONG BRIK1, 0
.WORD OID_JUNK, DMAWNZ, 0, 0
.LONG C_STRTANIM
.LONG BRIK_ANIM
GXBRIK_INIT
.LONG GXBRIK1, 0
.WORD OID_JUNK, DMAWNZ, 0, 0
.LONG C_STRTANIM
.LONG GXBRIK_ANIM
CBRIK_INIT
.LONG CBRIK1, 0
.WORD OID_JUNK, DMAWNZ, 0, 0
.LONG C_STRTANIM
.LONG CBRIK_ANIM
NOSHRED_INIT
.LONG NOSHRED1, 0
.WORD OID_JUNK, DMAWNZ, 0, 0
.LONG C_STRTANIM
.LONG NOSHRED_ANIM
EXPLOSION_INIT
.byte 2, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long REXPLO ;IMGPAL
.word OID_JUNK, 0 ;OID, GLOBAL_OPTIONS
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW REXPLOA1h, DMAWNZ, 0, 0, 0
LWWWW REXPLOA1h, DMAWNZ|M_FLIPH, 0, 0, 0
PREBUST_EXPLO_INIT
.byte 2, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long REXPLO ;IMGPAL
.word OID_JUNK, 0 ;OID, GLOBAL_OPTIONS
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW REXPLOA8h, DMAWNZ, 0, 0, 0
LWWWW REXPLOA8h, DMAWNZ|M_FLIPH, 0, 0, 0
BRICK_DEBRIS_ANIM
LWL 1,60|AFunc,A_DEL_BEYONDZ
.long 0
BRIK_ANIM
LW BRIK1,1
LW BRIK3,1
LW BRIK5,1
LW BRIK7,1
LW BRIK9,1
LW BRIK11,1
LW BRIK12,1
LW BRIK14,1
LW BRIK16,1
LW BRIK18,1
LW BRIK21,1
LW BRIK23,1
LWL BRIK25,1|AFunc,A_DEL_BEYONDZ
.long 0
GXBRIK_ANIM
LW GXBRIK1,1
LW GXBRIK2,1
LW GXBRIK3,1
LW GXBRIK4,1
LW GXBRIK5,1
LW GXBRIK6,1
LW GXBRIK7,1
LW GXBRIK8,1
LW GXBRIK9,1
LW GXBRIK10,1
LWL GXBRIK11,1|AFunc,A_DEL_BEYONDZ
.long 0
CBRIK_ANIM
LW CBRIK1,1
LW CBRIK2,1
LW CBRIK3,1
LW CBRIK4,1
LW CBRIK5,1
LW CBRIK6,1
LW CBRIK7,1
LW CBRIK8,1
LW CBRIK9,1
LW CBRIK10,1
LW CBRIK11,1
LWL CBRIK12,1|AFunc,A_DEL_BEYONDZ
.long 0
NOSHRED_ANIM
LW NOSHRED1,1
LW NOSHRED2,1
LW NOSHRED3,1
LW NOSHRED4,1
LW NOSHRED5,1
LW NOSHRED6,1
LW NOSHRED7,1
LW NOSHRED8,1
LW NOSHRED9,1
LW NOSHRED10,1
LW NOSHRED11,1
LWL NOSHRED12,1|AFunc,A_DEL_BEYONDZ
.long 0
EXPLOSION_ANIM
LW REXPLOA1h,1|AMulti
LW REXPLOA1h,EXPLO_TIME
LW REXPLOA3h,1|AMulti
LW REXPLOA3h,EXPLO_TIME
LW REXPLOA4h,1|AMulti
LW REXPLOA4h,EXPLO_TIME
LW REXPLOA5h,1|AMulti
LW REXPLOA5h,EXPLO_TIME
LW REXPLOA6h,1|AMulti
LW REXPLOA6h,EXPLO_TIME
PRE_BUST_ANIM
LW REXPLOA8h,1|AMulti
LW REXPLOA8h,EXPLO_TIME
LW REXPLOA9h,1|AMulti
LW REXPLOA9h,EXPLO_TIME-1
LWL 1,1|AFunc,A_SET_WALL_FLAG
LW REXPLOA10h,1|AMulti
LW REXPLOA10h,EXPLO_TIME
LW REXPLOA11h,1|AMulti
LW REXPLOA11h,EXPLO_TIME
LW REXPLOA12h,1|AMulti
LW REXPLOA12h,EXPLO_TIME-1
LWL 1,1|AFunc,A_SET_WALL_FLAG
LWL 1,1|AFunc,DELETE_OBJ
**************************************************************************
* *
* MAKE_CAT_PROC - CREATE DA CAT *
* *
**************************************************************************
OSCORE EQU ODATA ;UHL NEXT SCORE
OASTADDR EQU ODATA+020H ;UHL ANIM SPEED TABLE ADDRESS
OCHEWEDROCKET EQU ODATA+040H ;UHB Flag for rocket contact
OHITSND EQU ODATA+060H ;UHL Sound to make upon hit
ODEATHSND EQU ODATA+080H ;UHL Sound to make upon death
ODEATHANIM EQU ODATA+0A0H ;UHL Anim for death
OTROG_MASTER EQU ODATA+0C0H ;UHL Master object that spawned us
SCORE_INC EQU 1000
**************************************************************************
* *
* MAKE_TROG_PROC *
* *
* Process to create the Trog that flies from an object to the *
* top of the wall. *
* *
* A8 = Ptr to object creating *
* *
**************************************************************************
MAKE_TROG_PROC
MOVI TROG_INIT,B0
JRUC MCP_CREATE
**************************************************************************
* *
* MAKE_CAT_PROC *
* *
* Process to make the wall walking cat *
* *
**************************************************************************
MAKE_CAT_PROC
CLR A14
MOVE A14,@CAT_DONE,W ;IT HAS ONLY JUST BEGUN.
MOVE A14,@GITTEN_KITTEN,W
MOVE A14,@GOT_TROG,W
MOVE A14,@TROG_ALIVE,W
MOVI CAT_INIT,B0
MCP_CREATE
CALLA EASYMAKE
JRZ MCP_NOCAT ;BR=OOPS!
MOVE A8,*A0(OTROG_MASTER),L
MOVE A0,A8
MOVI 0358A000H,A0 ;DEFAULT TO THE LEFT SIDE
MOVI 0D000H,A1
MOVE @RAND,A14,W
JRN MCP_OK ;BR=IT'S NOT GONNA HAPPEN
MOVI 0465A000H,A0 ;COME FROM THE RIGHT SIDE
NEG A1
MOVE *A8(OCTRL),A14,W
ORI M_FLIPH,A14
MOVE A14,*A8(OCTRL),W
MCP_OK
MOVE A0,*A8(OXVAL),L ;SET VALUES
MOVE A1,*A8(OXVEL),L
MOVI -0408000H,A14
MOVE A14,*A8(OYVAL),L
MOVI -0F54BH,A14
MOVE A14,*A8(OZVAL),L
; MOVI CAT_GUNVECT,A14
; MOVE A14,*A8(OGUNVECT),L
MOVI SCORE_INC,A14
MOVE A14,*A8(OSCORE),L
MOVI ANIM_SPEED_TABLE,A14
MOVE A14,*A8(OASTADDR),L
CLRB *A8(OCHEWEDROCKET)
CALLA INSERT_OBJ
MOVK 5,A14
MOVB A14,*A8(AnimSLP) ;INITIAL SLEEP BETWEEN FRAMES
MOVK 1,A14
MOVE A14,@GUN_ONE_SHOT,W ;SET ONE SHOT MODE
MCP_WAIT
SLEEP 1
MOVE @GUN_ONE_SHOT,A14,W
JRNZ MCP_WAIT ;BR=WE'RE NOT DONE WITH THIS CAT
MCP_NOCAT
MOVK 1,A14
MOVB A14,@CAT_DONE ;CAT IS DONE FLAG
DIE
**************************************************************************
* *
* CAT_GUNVECT *
* *
* Cat gun vector makes cat reverse direction and speed up. *
* Unless, of course, it's time to kill him. *
* *
* A2 = Ptr to player that hit us. *
* A8 = Ptr to the pussy object. *
* *
**************************************************************************
CAT_GUNVECT
MOVE *A8(OFLAGS),A14,W
BTST B_DEAD,A14 ;Is the object dead?
JRNZ CGV_X ;BR = Yes, then do nothing
; CALLA SMALL_BLOOD_HIT
MOVE *A8(OSCORE),A1,L ;HE SCORES!
CLR A9 ;NO OFFSET
CALLA PRINT_SCORE
ADDI SCORE_INC,A1
MOVE A1,*A8(OSCORE),L ;INCREASE SCORE
MOVE *A8(OHITSND),A0,L
CALLA ONESND
MOVE *A8(OXVEL),A3,L ;SPEED UP VELOCITY
ABS A3
GETST A14 ;SAVE STATUS TO RESTORE SIGN
ADDI 0B000H,A3
PUTST A14
JRNN CG_SIGNOK ;BR=SIGN IS FINE
NEG A3 ;RESTORE TO NEGATIVE STATE
CG_SIGNOK
MOVE *A8(OASTADDR),A0,L
MOVE *A0+,A1,W
JRZ CG_WIN ;BR=WE HAVE A WINNER!
MOVE A0,*A8(OASTADDR),L
MOVB A1,*A8(AnimSLP)
MOVE A3,*A8(OXVEL),L
MOVE *A8(OCTRL),A14,W
XORI M_FLIPH,A14 ;FLIP IT
MOVE A14,*A8(OCTRL),W
CGV_X
RETS
CG_WIN
MOVI DUMRETS,A14
MOVE A14,*A8(OGUNVECT),L
MOVI OID_JUNK,A1 ;He's no longer alive
CALLA CHANGE_OID
ORIM M_GCOLL|M_DEAD,*A8(OFLAGS),W ;Make him ground collidable and dead
MOVE *A8(ODEATHSND),A0,L
CALLA ONESND
MOVE *A8(ODEATHANIM),A1,L
jauc SetAnim
ANIM_SPEED_TABLE
.WORD 4,4,3,3
.WORD 2,2,1,1
.WORD 0 ;9TH HIT
SND_MEOW
.WORD 0F330H,24,0A3A4H,0
SND_MEOW2
.WORD 0F330H,25,0A3A7H,0
SND_Cat_Explode
; .WORD 0F230H,60,08085H,0
.WORD 0F141H,60,0A38BH,0 ;Explosion used by much
SND_TROG_OUCH
.WORD 0F330H,46,0A3AAH,0
SND_TROG_YELL
.WORD 0F330H,74,0A3ADH,0
CAT_INIT
.LONG K_B3WKC1
.WORD DMAWNZ, 0, OM_OID|OM_COLL|OM_GUNV|OM_ANIM|OM_CFUNC
.WORD OID_CAT
.LONG CVect_Cat, CAT_GUNVECT, CAT_ANIM, C_CAT
;CAT_INIT
; .LONG K_B3WKC1, CVect_Cat
; .WORD OID_CAT, DMAWNZ, 0, 0
; .LONG 0
TROG_INIT
.LONG TRWAP4F1
.WORD DMAWNZ, M_DBLSCL, OM_OID|OM_ANIM|OM_CFUNC
.WORD OID_CAT
.LONG ANIM_TROG_FLY, C_TROG
;TROG_INIT
; .LONG TRWAP4F1, CVect_Cat
; .WORD OID_CAT, DMAWNZ, 0, 0
; .LONG 0
**************************************************************************
* *
* C_CAT *
* *
* Create func for Cat target *
* *
* A0 = Ptr to un-inserted object *
* *
**************************************************************************
C_CAT
MOVIM SND_MEOW,*A0(OHITSND),L
MOVIM SND_MEOW2,*A0(ODEATHSND),L
MOVIM ANIM_CAT_DEATH,*A0(ODEATHANIM),L
RETS
**************************************************************************
* *
* C_TROG *
* *
* Create func for Trog target *
* *
* A0 = Ptr to un-inserted object *
* *
**************************************************************************
C_TROG
MOVIM SND_TROG_OUCH,*A0(OHITSND),L
MOVIM SND_TROG_YELL,*A0(ODEATHSND),L
MOVIM ANIM_TROG_DEATH,*A0(ODEATHANIM),L
MOVKM 1,@TROG_ALIVE,W
RETS
*
*Collision vector table for the Kitty Kat
*
CVect_Cat
WWL OID_PROCKET,~MASK_PLAYER,CAT_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,CAT_EXPLOSION_COLL
WWL OID_GRND,0FFFFH,Coll_Ground_Cat
WL 0,DUMCRETS
**************************************************************************
* *
* CAT_ROCKET_COLL *
* *
* Collision service vector for the cat with a player rocket. *
* *
* A0 = Ptr to rocket object *
* A8 = Ptr to Cat object *
* *
**************************************************************************
CAT_ROCKET_COLL
MOVE *A0(RL_INTENDED_OBJ),A14,L
CMP A14,A8 ;Is this the object we are after?
JRNE CRC_X ;BR = No
MOVK 1,A14
MOVB A14,*A8(OCHEWEDROCKET) ;Flag for the explosion
CRC_X
RETS
**************************************************************************
* *
* CAT_EXPLOSION_COLL *
* *
* Collision service vector for Cat and player explosion. *
* *
* A0 = Ptr to explosion object *
* A8 = Ptr to Cat object *
* *
**************************************************************************
CAT_EXPLOSION_COLL
MOVB *A8(OCHEWEDROCKET),A14 ;Did he really take a rocket?
JRZ CAEC_X ;BR = No, so bail
MOVE *A0(OID),A0,W ;We can find out who did this
CALLA POID_TO_PDATA ;by getting the Player's data area.
CLRB *A8(OCHEWEDROCKET) ;Clear the rocket flag
JRUC CAT_GUNVECT ;Use the gun vector code
CAEC_X
RETS
**************************************************************************
* *
* Coll_Ground_Cat *
* *
* Collision routine for the Cat when it hits the ground. *
* *
* A8 = Ptr Cat Object *
* *
**************************************************************************
Coll_Ground_Cat
calla CLR_VEL ;Stop him now!
ANDNIM M_GCOLL,*A8(OFLAGS),W ;Clear the ground collision flag
CLRM *A8(OCVECT),L ;Clear the collision vector
rets
**************************************************************************
* *
* A_CHECK_CAT - CHECK IF IT RAN OFF THE SCREEN *
* *
* PASS: *
* A8 = DA CAT OBJECT *
* *
**************************************************************************
A_CHECK_CAT
MOVE *A8(OCTRL),A0,W
MOVE *A8(OXVAL),A14,L
CMPI 0358A000H,A14
JRLE ACC_GONE ;BR=OFF THE RIGHT SIDE
ACC_CHECK_RIGHT
CMPI 0465A000H,A14
JRLT ACC_DONE ;BR=INSIDE LEFT BORDER
ACC_GONE
CALLA DELETE_OBJ ;IT'S GONE
CLR A14
MOVE A14,@GUN_ONE_SHOT,W ;RETURN TO AUTO-FIRE
ACC_DONE
RETS
**************************************************************************
* *
* A_Set_Cat_Vels - Set the Cat's falling off wall velocities. *
* A8 = Ptr to cat *
* *
**************************************************************************
A_Set_Cat_Vels
CLRM *A8(OXVEL),L
MOVIM -40000H,*A8(OYVEL),L ;SEND HIM UP
MOVIM 4000H,*A8(OYACCEL),W ;AND MAKE HIM COME DOWN
MOVIM -01H,*A8(OZVEL),L ;Make him go forward, just a little.
rets
**************************************************************************
* *
* A_YVel_Nonzero - Anim func to branch animation script if the Y velocit *
* is nonzero *
* A8 = PTR TO OBJECT *
* AARG+,L = BRANCH *
* *
**************************************************************************
A_YVel_Nonzero
calla GETAFARG_LONG
calla GET_HEAD_PART
move *A8(OYVEL),A14,L
jrz AYN_NoBranch
move A0,A1
jauc STRT_ANIM
AYN_NoBranch
rets
**************************************************************************
* *
* A_BRANCH_IF_YVEL_ZERO *
* *
* Anim func to branch if an objects OYVEL is zero. *
* *
* A8 = Ptr to object *
* AARG+,L = Branch if zero *
* *
**************************************************************************
A_BRANCH_IF_YVEL_ZERO
CALLA GETAFARG_LONG
CALLA GET_HEAD_PART
MOVE *A8(OYVEL),A14,L
JRNZ ABIYZ_NOBRANCH
MOVE A0,A1
JAUC STRT_ANIM
ABIYZ_NOBRANCH
RETS
**************************************************************************
* *
* A_START_TROG_FLY *
* *
* Anim func to position Trog on his master object and *
* then start him flying to the wall. *
* *
**************************************************************************
A_START_TROG_FLY
MOVE *A8(OTROG_MASTER),A0,L
MOVE *A0(OXVAL),A1,L
MOVI -408000H,A2 ;Put it at this Y
MOVE *A0(OZVAL),A3,L
CALLA SET_ANIPU
MOVE A3,A6
MOVI -0F54BH,A5 ;Z target set
MOVE A2,A4
MOVE A2,A3 ;Y target set
MOVE A1,A2
ADDI 200000H,A1 ;X target set
MOVI 45,A7
CALLA SLINEVEL_LOAD_3D
MOVB A7,*A8(AnimSLP)
MOVI 40000H,A1
MOVE A1,A2
MOVI 45/2,A0
DIVU A0,A1
MOVE A1,*A8(OYACCEL),W
NEG A2
MOVE A2,*A8(OYVEL),L
SOUND1 SND_TROG_YELL
RETS
**************************************************************************
* *
* A_TROG_FLY_END *
* *
* Anim func to handle the end of Trog's flying stuff. *
* *
* A8 = Ptr to Trog *
* *
**************************************************************************
A_TROG_FLY_END
CALLA CLR_VEL
MOVI -0408000H,A14
MOVE A14,*A8(OYVAL),L
MOVIM 0D000H,*A8(OXVEL),L
MOVIM CAT_GUNVECT,*A8(OGUNVECT),L
MOVIM CVect_Cat,*A8(OCVECT),L
MOVKB 5,*A8(AnimSLP) ;Setup initial sleep
MOVI TROG_ANIM,A1
JAUC SetAnim ;Start him to walkin'
CAT_ANIM
LW K_B3WKC1,0
LW K_B3WKC2,0
LW K_B3WKC3,0
LW K_B3WKC4,0
LWL K_B3WKC5,0|AFunc,A_CHECK_CAT
.long 0
ANIM_CAT_DEATH
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_Cat,0h,0h
LWL K_B3FE1,7|AFunc,A_Set_Cat_Vels
LWLLW K_B3FE2,4|AFunc,A_Set_Var_Word+3,GITTEN_KITTEN,1
LW K_B3FE3,16
LWL K_B3FE4,20|AFunc,DELAYED_PRAISE
ANIM_CAT_WAIT
LWLL 1,1|AFunc,A_YVel_Nonzero+2,ANIM_CAT_WAIT
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_Cat,0h,0h
LWL 1,80|AFunc,OBJ_OFF
LWLLL 1,1|AFunc,A_BRANCH_IF_FALSE+4,TROG_ALIVE,ANIM_CAT_NO_TROG
LWL 1,1|AFunc,DELETE_OBJ
ANIM_CAT_NO_TROG
LWLLW 1,2|AFunc,A_Set_Var_Word+3,GUN_ONE_SHOT,0
LWL 1,1|AFunc,DELETE_OBJ
*
* This will make Trog fly to the wall from the palm tree
*
ANIM_TROG_FLY
LWWL TRWAP4F1,1|AFlip|AFunc,0,A_START_TROG_FLY
LW 1,0
LWL 1,1|AFunc,A_TROG_FLY_END
TROG_ANIM
LW TRWAP4F1,0
LW TRWAP4F2,0
LW TRWAP4F3,0
LW TRWAP4F4,0
LW TRWAP4F5,0
LW TRWAP4F6,0
LWL TRWAP4F7,0|AFunc,A_CHECK_CAT
.long 0
ANIM_TROG_DEATH
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_Cat,0h,0h
LWL TRYLP4F1,7|AFunc,A_Set_Cat_Vels
LWLLW TRYLP4F2,4|AFunc,A_Set_Var_Word+3,GOT_TROG,1
LW TRYLP4F3,4
LW TRYLP4F4,4
LWL TRYLP4F5,4|AFunc,DELAYED_PRAISE
ANIM_TROG_WAIT
LWLL TRYLP4F3,3|AFunc,A_BRANCH_IF_YVEL_ZERO+2,ANIM_TROG_BLOW
LWLL TRYLP4F4,3|AFunc,A_BRANCH_IF_YVEL_ZERO+2,ANIM_TROG_BLOW
LWLL TRYLP4F5,2|AFunc,A_BRANCH_IF_YVEL_ZERO+2,ANIM_TROG_BLOW
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_TROG_WAIT
ANIM_TROG_BLOW
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,FRAG_Cat,0h,0h
LWLLW 1,2|AFunc,A_Set_Var_Word+3,GUN_ONE_SHOT,0
LWL 1,1|AFunc,DELETE_OBJ
*
*Cat kill fragger script
*
FRAG_Cat
.long FHK_Explosion,F_Cat_Explosion
.word OID_JUNK,1*800H+1*40H+FRGPAL
.long 0
*
*Cat fragger init func
*
F_Cat_Explosion
jauc CLRVEL ;Just make sure it is stopped
FHK_Explosion
LWLL FHKEXPLOB1,6|AFunc,A_SOUND+2,SND_Cat_Explode
LW FHKEXPLOB2,8
LW FHKEXPLOB3,6
LW FHKEXPLOB4,4
LW FHKEXPLOB5,4
LW FHKEXPLOB6,3
LW FHKEXPLOB7,3
LW FHKEXPLOB8,2
LW FHKEXPLOB9,2
LW FHKEXPLOB10,2
LW FHKEXPLOB11,2
LWL 1,1|AFunc,DELETE_OBJ
**************************************************************************
* *
* PROC_AIR_RAID_SIREN - Wait and make the Siren. Created from *
* a scroll table. *
* *
**************************************************************************
PROC_AIR_RAID_SIREN
SLEEP 60*6
SOUND1 SND_AIR_RAID
DIE
**************************************************************************
* *
* MAKE_INTRO_COPTER_PROC - CREATE INTRO COPTER AND MAKE IT FLY! *
* *
**************************************************************************
SND_AIR_RAID
.word 0F2F0H,407,08313H,0
SND_PILOT_FREAK
.word 0F2C0H,139,0820FH,0
SND_HIT_COPTER
.word 0F310H,30,0A111H,0
SND_ROCKET_COPTER
.word 0F320H,69,0A14AH,0
SND_DIE_COPTER
.word 0F340H,30,0A30BH,30,0A30BH,60,0A30BH,0
NO_FREAK_AFTER_TIME .EQU 530 ;Do NOT make the freak sound after
;this amount of WAVEIRQS.
PYACCEL EQU PDATA ;UHL Y MOTION EFFECT (ACCELERATION)
PHOVERSTART EQU PDATA+020H ;UHL WAVEIRQ AT BEGINNING OF HOVER
STARTING_POINTS EQU 100
RADIO_AT EQU 90
MAKE_SMOKE_AT EQU 50
MORE_SMOKE_AT EQU 25
BOMB_POINTS EQU 10
MAKE_INTRO_COPTER_PROC
MOVI COPDAM2,A8
MOVK 24,A9
MOVK 31,A10
MOVK 10,A11
CREATE PID_DAMCC, CYCLE16
MOVI SIDE_COPTER_INTRO_INIT,B0
CALLA MULTIMAKE
LOCKON Z
CALLA CLR_ODATA
MOVI 015912000H,A1
MOVI -036D7000H,A2
MOVI 03971H,A3
CALLA SET_ANIPU
MOVI STARTING_POINTS,A14
MOVE A14,*A8(OHIT_POINTS),W
; MOVE A13,*A8(OPLINK),L
MOVI -0100000H,A14 ;SET UP INITIAL MOTION PARMS
MOVE A14,*A8(OXVEL),L
; MOVI 0100000H,A14
MOVI 070000H,A14
MOVE A14,*A8(OYVEL),L
; MOVI -07000H,A14
MOVI -02000H,A14
MOVE A14,*A8(OYACCEL),W
MOVE A8,A0
MOVI 0101H,A1
MOVI [0800H,0800H],A2
MOVI SIDE_COPTER_INTRO_COLLISIONS,A3
MOVK 20,A4
MCP_CONST_STUFF_LUPE
MOVE A1,*A0(OCONST),L
MOVE A2,*A0(OZDEPTH),L
MOVE *A3+,A14,L
MOVE A14,*A0(OCOLLISION),L
MOVE *A0(OPARTS),A0,L
DSJS A4,MCP_CONST_STUFF_LUPE
; MOVE @WAVEIRQS,A14,L
; MOVE A14,*A8(ODROPTIME),L
SOUND0 SND_COPTER_FULL
MOVE A8,A4
CLR A8 ;FULL UP
MOVK 3,A10
MOVI 60,A11
CREATE PID_IND,TRACK_FADE_IN_FULL_PROC
MOVE A4,A8
MCOP_WAIT ;WAIT TILL ON THE LEFT SIDE
SLEEP 1
MOVE *A8(OXVAL),A14,L
CMPI 012D12000H,A14
JRGT MCOP_WAIT ;BR=NOT YET!
MOVK 1,A14
MOVE A14,@SCROLL_FLAG,W
; MOVI 03000H,A14
; MOVE A14,*A8(OYACCEL),W
CLR A14
MOVE A14,*A8(OYACCEL),W
MOVE A14,*A8(OYVEL),L
CLR A14
MOVE A14,*A13(PYACCEL),L
MOVE A14,*A13(PHOVERSTART),L
;CONTINUE WITH COPTER_STAGE1_PROC
**************************************************************************
* *
* COPTER_STAGE1_PROC - FLY BACK TO THE MIDDLE OF THE SCREEN *
* *
**************************************************************************
; MOVI 0100000H,A9
CLR A9
COPTER_STAGE1_PROC
MOVE *A8(OXVAL),A0,L
MOVE @XBASE,A14,L
SUB A14,A0
; ABS A0
; CMP A9,A0
; JRLE COPTER_STAGE2_PROC ;BR=WE'RE THERE!
JRP COPTER_STAGE2_PROC ;BR=WE'RE THERE!
MOVI 01800H,A0
MOVI 01800H,A1
MOVI 02000H,A2
CALLR FLY_EFFECT2 ;FLY AROUND SOME
MOVE *A8(OXVEL),A14,L
ADDI 010000H,A14 ;DECELERATE TO THE RIGHT
MOVE A14,*A8(OXVEL),L
SLEEP 2
JRUC COPTER_STAGE1_PROC
**************************************************************************
* *
* FLY_EFFECT - FLYING PARAMETERS ON THE WAY TO CLUB *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
;FLY_EFFECT
MOVE *A8(OYVAL),A0,L
MOVE *A8(OYVEL),A1,L
CLR A2
CMPI -02965000H,A0
JRLT FE_CHECK_UPPER_Y ;BR=ABOVE LOWER Y LIMIT
MOVE A1,A1
JRN FE_GO_UP ;BR=WE'RE GOING UP ALREADY!
MOVI -03000H,A2 ;CORRECT DIRECTION: STOP GOING DOWN!
JRUC FE_Y_DONE
FE_GO_UP
MOVI -02000H,A2 ;GO UP!
JRUC FE_Y_DONE
FE_CHECK_UPPER_Y
; CMPI -02965000H,A0
CMPI -02AEA000H,A0
JRGT FE_Y_DONE ;BR=BELOW UPPER Y LIMIT
MOVE A1,A1
JRNN FE_GO_DOWN ;BR=WE'RE GOING DOWN ALREADY!
MOVI 03000H,A2 ;CORRECT DIRECTION: STOP GOING UP!
JRUC FE_Y_DONE
FE_GO_DOWN
MOVI 02000H,A2 ;GO DOWN!
JRUC FE_Y_DONE
FE_Y_DONE
MOVE A2,*A8(OYACCEL),W ;SET Y ACCELERATION
; MOVE @XSCROLL,A14,L
; MOVE A14,*A8(OXVEL),L
; RETS
MOVE *A8(OXVAL),A0,L
MOVE *A8(OXVEL),A1,L
MOVI 0C000H,A2
MOVI 0280H,A3
MOVE @XBASE,A14,L
SUB A14,A0
CMPI 0400000H,A0
JRLT FE_CHECK_LEFT_X
SUB A2,A1
MOVE A1,*A8(OXVEL),L
MOVE A3,*A8(OZVEL),L
RETS
FE_CHECK_LEFT_X
CMPI -0400000H,A0
JRGT FE_X_DONE
MOVE A1,A1
JRP FE_X_DONE
ADD A2,A1
NEG A3
MOVE A1,*A8(OXVEL),L
MOVE A3,*A8(OZVEL),L
FE_X_DONE
RETS
**************************************************************************
* *
* FLY_EFFECT2 - FLYING PARAMETERS AT THE CLUB *
* *
* PASS: *
* A0 = MAX Y ACCEL *
* A1 = MIN Y ACCEL *
* A2 = REVERSE Y ACCEL *
* A8 = OBJECT *
* *
**************************************************************************
FLY_EFFECT2
MOVE *A8(OYVAL),A5,L
MOVE *A8(OYVEL),A6,L
CLR A7 ;FLAG ACCEL RESET
CMPI -02C00000H,A5
JRLT FE2_CHECK_UPPER_Y ;BR=ABOVE DA Y
MOVE A6,A6
JRN FE2_GO_UP ;BR=ALREADY GOING UP!
MOVE A2,A0 ;CORRECT DIRECTION: STOP GOING DOWN!
NEG A0
JRUC FE2_Y_DONE
FE2_GO_UP
MOVE *A13(PYACCEL),A14,L
JRNZ FE2_DONE ;BR=ACCEL ALREADY SET
NEG A0 ;NEGATE LIMITS FOR GOING UP
NEG A1
CALLA RANGERND ;GET RANDOM ACCEL
JRUC FE2_SET
FE2_CHECK_UPPER_Y
; CMPI -02C00000H,A5
; JRGT FE2_Y_DONE
MOVE A6,A6
JRNN FE2_GO_DOWN ;BR=ALREADY GOING DOWN!
MOVE A2,A0 ;CORRECT DIRECTION: STOP GOING UP!
JRUC FE2_Y_DONE
FE2_GO_DOWN
MOVE *A13(PYACCEL),A14,L
JRNZ FE2_DONE ;BR=ACCEL ALREADY SET
CALLA RANGERND ;GOING DOWN! GET RANDOM ACCEL
FE2_SET
MOVE A0,A7 ;FLAG ACCEL SET
FE2_Y_DONE
MOVE A0,*A8(OYACCEL),W
MOVE A7,*A13(PYACCEL),L
FE2_DONE
RETS
**************************************************************************
* *
* COPTER_STAGE2_PROC - FLY AROUND, FLY OFF SCREEN, AND COME BACK *
* *
**************************************************************************
COPTER_DEST_TABLE
.WORD 1,SCREEN_WIDTH/3,SCREEN_WIDTH*2/3
COPTER_STAGE2_PROC
CLR A14
MOVE A14,@SCROLL_FLAG,W
; MOVE A14,*A8(OYACCEL),W
; MOVE A14,*A8(OYVEL),L
CS2P_LUPE
SLEEP 1
MOVI 01800H,A0
MOVI 01800H,A1
MOVI 02000H,A2
CALLR FLY_EFFECT2 ;FLY AROUND SOME
MOVE *A8(OXVEL),A14,L
SUBI 010000H,A14
MOVE A14,*A8(OXVEL),L
MOVE @XSCROLL,A0,L
SUB A0,A14
JRNN CS2P_LUPE
MOVE @XSCROLL,A5,L
SUBI 010000H,A5
; MOVI 09600000H,A9 ;END LOOP AT THIS XBASE
MOVI 05759800H,A9 ;END LOOP AT THIS XBASE
CLR A10 ;LEFT X OF DESTINATION QUADRANT
CLR A11 ;ESCAPE X ACCELERATION
CS2P_LUPE2 ;FLY AROUND UNTIL WE GET TO A9
SLEEP 1
MOVE @XBASE,A3,L
MOVE *A8(OHIT_POINTS),A14,W
CMPI RADIO_AT,A14
JRGT CS2P_Y_FLY ;BR=NOT ENOUGH DAMAGE
MOVE A10,A2
JRZ CS2P_PLAYER_CHECK
BTST 0,A11
JRZ CS2P_NO_STOP ;BR=WE'RE NOT STOPPING YET
MOVE A11,A14
NEG A14
GETST A2
MOVE *A8(OXVEL),A1,L
ADD A14,A1
MOVE A1,A14
MOVE @XSCROLL,A5,L
SUB A5,A14
GETST A14
XOR A14,A2
MOVE A2,A2
JRN CS2P_DONT_STOP ;BR=STILL SLOWING DOWN
CLR A10 ;WE'RE STOPPING
CLR A11
MOVE A5,A1
CS2P_DONT_STOP
MOVE A1,*A8(OXVEL),L
JRUC CS2P_Y_FLY
CS2P_NO_STOP
MOVE *A8(OZVAL),A1,L
MOVE *A8(OXVAL),A5,L
UTOSX A1,A5
CMP A10,A5
JRLT CS2P_KEEP_GOIN ;BR=OUTSIDE OF LEFT X BOUNDARY
ADDI SCREEN_WIDTH/3,A2
CMP A2,A5
JRGT CS2P_KEEP_GOIN ;BR=OUTSIDE OF RIGHT X BOUNDARY
INC A11 ;FLAG STOP
JRUC CS2P_Y_FLY
CS2P_KEEP_GOIN
MOVE *A8(OXVEL),A1,L
MOVE A1,A14
MOVE @XSCROLL,A2,L
SUB A2,A14
ABS A14
CMPI 0E0000H,A14
JRGT CS2P_Y_FLY ;BR=WE EXCEEDED THE SPEED LIMIT
ADD A11,A1
MOVE A1,*A8(OXVEL),L
JRUC CS2P_Y_FLY
CS2P_PLAYER_CHECK
MOVE *A8(OFLAGS),A14,W
BTST B_OFSCRN,A14
JRNZ CS2P_Y_FLY ;BR=WE'RE OFFSCREEN DON'T WORRY
CALLA GET_TSUL_SCRN
ADD A0,A1
MOVE @NPLAYERS,A7,W
MOVI P1DATA,A2
CS2P_PLAYER_LUPE
MOVE *A2(POBJ),A4,L ;IS THE PLAYER ALIVE?
JRZ CS2P_NEXT_PLAYER ;BR = NO
MOVE *A2(PCURSORXY),A4,L
CMPXY A0,A4
JRXLT CS2P_NEXT_PLAYER ;BR=X ABOVE
JRYLT CS2P_NEXT_PLAYER ;BR=Y LEFT
CMPXY A1,A4
JRXGT CS2P_NEXT_PLAYER ;BR=X BELOW
JRYGT CS2P_NEXT_PLAYER ;BR=Y RIGHT
MOVE *A8(OZVAL),A1,L ;BR=SOMEONE'S TRACKING DA COPTER
MOVE *A8(OXVAL),A5,L
UTOSX A1,A5
MOVI 010000H,A11 ;DEFAULT X ACCELERATION
CS2P_TRY_AGAIN
MOVK 3,A0
CALLA RANDU ;GET RANDOM INDEX
DEC A0
SLL 4,A0
ADDI COPTER_DEST_TABLE,A0
MOVE *A0,A10,W
MOVE A10,A14
ADDI SCREEN_WIDTH/3,A14
CMP A10,A5
JRLT CS2P_Y_FLY ;BR=WE'RE LEFT OF THE LEFT X BOUNDARY
CMP A14,A5
JRLE CS2P_TRY_AGAIN ;BR=WE'RE LEFT OF THE RIGHT X BOUNDARY
NEG A11 ;ACCELERATE OTHER X DIRECTION
JRUC CS2P_Y_FLY
CS2P_NEXT_PLAYER
ADDI PDSIZE,A2 ;NEXT PLAYER DATA AREA
DEC A7
JRNN CS2P_PLAYER_LUPE ;BR=NO MORE PLAYERS
CS2P_Y_FLY
MOVI 01800H,A0
MOVI 01800H,A1
MOVI 02000H,A2
CALLR FLY_EFFECT2 ;FLY AROUND SOME
CS2P_CHECK_XBASE
CMP A9,A3
; JRUC CS2P_LUPE2 ;BR=WE'RE NOT THERE YET
JRGT CS2P_LUPE2 ;BR=WE'RE NOT THERE YET
JRUC COPTER_STAGE3_PROC
CLR A14
MOVE A14,*A8(OZVEL),L
MOVI -0C000H,A9 ;ACCELERATE TO THE LEFT
CS2P_GO_OFF_LUPE ;FLY OFF THE SCREEN
SLEEP 1
CALLA SCRTST
JRNE CS2P_WERE_OFF ;BR=WE'RE OFF THE SCREEN
MOVI 04000H,A0
MOVI 02000H,A1
MOVI 03000H,A2
CALLR FLY_EFFECT2
MOVE *A8(OXVEL),A14,L
ADD A9,A14 ;ACCELERATE
MOVE A14,*A8(OXVEL),L
JRUC CS2P_GO_OFF_LUPE
CS2P_WERE_OFF
MOVE @XBASE,A1,L
SUBI 01F00000H,A1
MOVI -02C00000H,A2
MOVI 03971H,A3
CALLA SET_ANIPU ;REPOSITION COPTER
MOVE @XSCROLL,A14,L ;SET AND RESET MOTION STUFF
MOVE A14,*A8(OXVEL),L
CLR A14
MOVE A14,*A8(OYACCEL),W
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
CS2P_STAY_OFF
SLEEP 1
MOVE @XBASE,A0,L
; CMPI 070D9800H,A0
CMPI 074D9800H,A0
JRGT CS2P_STAY_OFF
CS2P_COME_BACK ;COME BACK ON
SLEEP 1
MOVI 04000H,A0
MOVI 02000H,A1
MOVI 03000H,A2
CALLR FLY_EFFECT2
MOVE *A8(OXVEL),A14,L
ADDI 0C000H,A14
MOVE A14,*A8(OXVEL),L
MOVE @XBASE,A0,L
CMPI 068D0000H,A0
JRGT CS2P_COME_BACK
;CONTINUE WITH COPTER_STAGE3_PROC
**************************************************************************
* *
* COPTER_STAGE3_PROC - FLY OFF THE SCREEN AGAIN DROPPING NONBOYS *
* *
**************************************************************************
COPTER_STAGE3_PROC
MOVE @WAVEIRQS,A10,L
MOVK 2,A11 ;NONBOY DROP TIME INTERVAL
CS3P_LUPE
MOVE *A8(OXVAL),A0,L
CMPI 01600000H,A0
JRGT CS3P_NOT_DONE ;BR=NOT OFF YET!
MOVK 8,A14
MOVE A14,@OBJENEMIES,W ;SET BUILDING POP-UPS
JRUC COPTER_STAGE4_PROC
CS3P_NOT_DONE
MOVE *A8(OXVEL),A14,L
ADDI -08000H,A14 ;ACCELERATE TO THE LEFT
MOVE A14,*A8(OXVEL),L
MOVE *A8(OXVAL),A4,L
CALLR DROP_NONBOYS ;DROP-A-NONBOY
MOVI 04000H,A0
MOVI 02000H,A1
MOVI 03000H,A2
CALLR FLY_EFFECT2 ;FLY!
SLEEP 1
JRUC CS3P_LUPE
**************************************************************************
* *
* COPTER_STAGE4_PROC - FLY AROUND ABOVE THE BUILDING *
* *
**************************************************************************
COPTER_STAGE4_PROC
CLR A9 ;INIT X ACCELERATION
MOVK 8,A11 ;NONBOY DROP TIME INTERVAL
MOVE *A8(OHIT_POINTS),A14,W
JRP CS4P_HEAD_LUPE
MOVK 11,A14
MOVE A14,*A8(OHIT_POINTS),W
CS4P_HEAD_LUPE
; JRUC CS4P_GO ;DON'T DIE!
;
; MOVE *A8(OHIT_POINTS),A14,W
; JRP CS4P_GO
;
; MOVK 1,A14
; MOVE A14,@SCROLL_FLAG,W
;
; MOVI 04000H,A14
; MOVE A14,*A8(OYACCEL),W
;
; CLR A14
; MOVE A14,*A8(OXVEL),L
; MOVE A14,*A8(OZVEL),L
;
; CALLA PULL_ANIM_ALL
;
; SOUNDZ SND_DIE_COPTER
;
;CS4P_TIME_TO_DIE
;
;* B0 = OZVAL *
;* B1 = min Xpos *
;* B2 = max Xpos *
;* B3 = min Xvel *
;* B4 = max Xvel *
;* B5 = min Ypos *
;* B6 = max Ypos *
;* B7 = min Yvel *
;* B8 = max Yvel *
;* B9 = min Zvel *
;* B10 = max Zvel *
;* B14 = Ptr to explosion script *
;
; MOVE A8,B14
;
; MOVE *B14(OZVAL),B0,L
;
; MOVE *B14(OXPOS),B1,W
; MOVE B1,B2
;
; MOVE *B14(OYPOS),B5,W
; MOVE B5,B6
;
; MOVE *B14(OXVEL),B3,L
; MOVE B3,B4
; SUBI 040000H,B3
; ADDI 040000H,B4
;
; MOVE *B14(OYVEL),B7,L
; MOVE B7,B8
; SUBI 040000H,B7
; ADDI 040000H,B8
;
;; MOVE *B14(OZVEL),B9,L
;; MOVE B9,B10
;; SUBI 01000H,B9
; CLR B9
; CLR B10
;
; MOVI COPTER_DEATH_FRAG,B14
; CALLA Fragger
;
;; CALLA SCRTST
;; JRNZ CS4P_DIE
; MOVE *A8(OYVAL),A14,L
; CMPI -019325DFH,A14
; JRGT CS4P_DIE
; SLEEP 2
; JRUC CS4P_TIME_TO_DIE
;CS4P_GO
MOVE *A8(OYVAL),A0,L
MOVE @YBASE,A14,L
ADD A14,A0
CMPI -01320000H,A0
JRGT CS4P_ALIVE ;BR=NOT FAR ENOUGH OFF SCREEN YET
CS4P_DIE
MOVE A8,A0
JRUC CS4P_START ;THE BEGINNING OF THE END
CS4P_LUPE
MOVE *A8(OPARTS),A8,L
JRZ CS4P_ZAP ;BR=NO MORE PARTS
CS4P_START
MOVE *A8(OID),A14,W
CMPI OID_NONBOY,A14
JRNE CS4P_LUPE ;BR=NOT A NONBOY
CALLA DEC_ENEMY_COUNT ;FOR THE NONBOY BEING DELETED
CS4P_ZAP
MOVE A0,A8 ;BYE, BYE
MOVE *A8(OPLINK),A0,L
JRZ CS4P_NO_PROC
CLR A14
MOVE A14,*A8(OPLINK),L
CALLA KILL ;KILL GUNVECT PROC
CS4P_NO_PROC
CALLA DELETE_OBJ
CLR A8 ;FULL DOWN
MOVK 3,A10
MOVI 60,A11
CREATE PID_IND,TRACK_FADE_OUT_FULL_PROC
DIE
CS4P_ALIVE
MOVE *A8(OXVEL),A3,L
MOVE *A8(OXVAL),A4,L
MOVE A9,A9
JRZ CS4P_NO_HOVER ;BR=NO HOVERING
ADD A9,A3 ;ADD X ACCELERATION
MOVE A3,*A8(OXVEL),L
MOVI 03000H,A0
MOVI 02000H,A1
MOVI 03000H,A2
CALLR FLY_EFFECT2 ;FLY AROUND SOME
BTST 0,A9
JRNZ CS4P_GET_OFF ;BR=LEAVING THE SCREEN
MOVE A9,A0
GETST A1 ;GET ACCELERATION SIGN
ABS A0
CMPI 03000H,A0
JRNE CS4P_NO_INIT ;BR=NOT STOPPING
MOVE A3,A3
GETST A2 ;GET VELOCITY SIGN
XOR A1,A2
MOVE A2,A2
JRN CS4P_DROP_NOW ;BR=SAME SIGNS, STILL GOING SAME DIR
CS4P_NO_INIT
; MOVE *A8(OXVAL),A0,L
CMPI 03D20000H-0A00000H,A4
JRGT CS4P_CHECK_RIGHT_HOVER ;BR=WITHIN LEFT HOVER LIMIT
MOVE A3,A3
JRNN CS4P_DROP_NOW ;BR=MOVIN' TOWARD THE RIGHT
MOVI 04000H,A9 ;MOVE TO THE RIGHT, NOW!
JRUC CS4P_DROP_NOW
CS4P_CHECK_RIGHT_HOVER
CMPI 03D20000H+0A00000H,A4
JRLT CS4P_CHECK_THIS ;BR=WITHIN RIGHT HOVER LIMIT
MOVE A3,A3
JRN CS4P_DROP_NOW ;BR=MOVIN' TOWARD THE LEFT
MOVI -04000H,A9 ;MOVE TO THE LEFT, NOW!
JRUC CS4P_DROP_NOW
CS4P_CHECK_THIS
MOVI 0800H,A0 ;GET NORMAL FLYING ACCELERATION
MOVE A9,A9
JRNN CS4P_NOT_NEG ;BR=WE'RE POSITION RIGHT NOW
NEG A0
CS4P_NOT_NEG
MOVE A0,A9
MOVE *A13(PHOVERSTART),A14,L ;CHECK HOVERING TIME
MOVE @WAVEIRQS,A0,L
SUB A14,A0
CMPI 180,A0
JRLT CS4P_HOVER_OK ;BR=UNDER LIMIT
CALLA TAKE_OFF_NOW ;YOU HOVERED ENOUGH NOW GIT!
JRUC CS4P_DROP_NOW
CS4P_HOVER_OK
MOVI 256,A0
CALLA RANDPER
JRNC CS4P_DROP_NOW ;BR=DON'T WANNA REVERSE
NEG A9 ;REVERSE X ACCELERATION
MOVI 256,A0
CALLR TAKE_OFF ;CHECK IF WE WANNA TAKE OFF
JRUC CS4P_DROP_NOW
CS4P_NO_HOVER ;FLYING HIGH AGAIN
MOVI 01800H,A0
MOVI 01800H,A1
MOVI 02000H,A2
CALLR FLY_EFFECT2 ;FLY AROUND SOME
CS4P_GET_OFF
; MOVE *A8(OXVAL),A0,L
CMPI 01600000H,A4
JRGT CS4P_CHECK_RIGHT ;BR=WITHIN LEFT LIMIT
MOVI 01600001H,A1 ;NEW POSITION
MOVI 080000H,A2 ;NEW VELOCITY
JRUC CS4P_SET
CS4P_CHECK_RIGHT
CMPI 06440000H,A4
JRLT CS4P_DROP ;BR=WITHIN RIGHT LIMIT
MOVI 0643FFFFH,A1 ;NEW POSITION
MOVI -080000H,A2 ;NEW VELOCITY
CS4P_SET
MOVI 512,A0
CALLA RANDPER
JRNC CS4P_NO_STOP ;BR=NOT GOIN' TO STOP ON THIS PASS
INC A2
CS4P_NO_STOP
MOVE A1,*A8(OXVAL),L ;SET HEAD'S X
MOVE A2,*A8(OXVEL),L
MOVI -02C00000H,A14
MOVE A14,*A8(OYVAL),L ;SET HEAD'S Y
CLR A9 ;RESET Y MOTION
MOVE A9,*A8(OYACCEL),W
MOVE A9,*A8(OYVEL),L
MOVE A9,*A13(PYACCEL),L
MOVK M_FLIPH,A0
CALLA TOGGLE_FLPS ;FLIP THE MOTHER
JRUC CS4P_NAP
CS4P_DROP
BTST 0,A9
JRNZ CS4P_DROP_NOW ;BR=LEAVING THE SCREEN
; MOVE *A8(OXVEL),A14,L
BTST 0,A3
JRNZ CS4P_DROP_NOW ;BR=NOT GOIN' TO STOP
; MOVE *A8(OXVAL),A0,L ;CHECK IF WE CAN STOP
MOVE @XBASE,A14,L
SUB A4,A14
ABS A14
CMPI 0A00000H,A14
JRGE CS4P_DROP_NOW ;BR=CAN'T STOP YET
MOVI 256,A0
CALLA RANDPER
JRNC CS4P_DROP_NOW ;BR=DON'T WANNA STOP
MOVE @WAVEIRQS,A14,L
MOVE A14,*A13(PHOVERSTART),L
MOVI 03000H,A9
; MOVE *A8(OXVEL),A14,L
MOVE A3,A3
JRN CS4P_DROP_NOW ;BR=X ACCEL SET FOR CURRENT NEG MOTION
NEG A9
CS4P_DROP_NOW
CALLR DROP_NONBOYS ;DROP-A-NONBOY
CS4P_NAP
SLEEP 1
JRUC CS4P_HEAD_LUPE
;COPTER_DEATH_FRAG
; .long COPTER_EXPLO_ANIM,0
; .word OID_JUNK,(5 << 11) + (1 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
; .long 0
**************************************************************************
* *
* TAKE_OFF - LEAVE THE SCREEN IF RANDOM EVENT OCCURS *
* TAKE_OFF_NOW - LEAVE THE SCREEN NOW *
* *
* PASS: *
* A0 = PROBABILITY FOR TAKE_OFF (0-1023) P(A0=1024) = 1; P(A0=1) = 1/102 *
* A8 = HELICOPTER OBJECT *
* A9 = CURRENT X ACCELERATION *
* *
**************************************************************************
TAKE_OFF
CALLA RANDPER
JRNC TO_NOPE ;BR=DON'T WANNA TAKE OFF JUST YET
TAKE_OFF_NOW
MOVE *A8(OCTRL),A0,L
MOVE A9,A9
JRN TO_OTHER_CHECK ;BR=CHECK DA OTHER DIRECTION
BTST B_FLIPH,A0
JRNZ TO_GO ;BR=FACING DIRECTION, TAKE OFF!
RETS
TO_OTHER_CHECK
BTST B_FLIPH,A0
JRNZ TO_NOPE ;BR=NOT FACING TAKE OFF DIRECTION
TO_GO
SLL 4,A9 ;INCREASE X ACCELERATION
INC A9 ;FLAG TAKE OFF
TO_NOPE
RETS
**************************************************************************
* *
* COPTER_INTRO_CVECT - Collision vector table for the intro copter. *
* *
**************************************************************************
COPTER_INTRO_CVECT
WWL OID_PROCKET,~MASK_PLAYER,COPTER_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,COPTER_EXPLOSION_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* COPTER_ROCKET_COLL - Rocket collision for the intro copter. *
* A0 = Ptr to rocket object *
* A8 = Ptr to copter part *
* *
**************************************************************************
COPTER_ROCKET_COLL
; CALLA GETHEADPART
MOVE A0,*A8(OATE_ROCKET),L
RETS
**************************************************************************
* *
* COPTER_EXPLOSION_COLL - Explosion collision for the intro copter. *
* A0 = Ptr to explosion object. *
* A8 = Ptr to the copter part. *
* *
**************************************************************************
COPTER_EXPLOSION_COLL
move *A8(OATE_ROCKET),A14,L
jrz CEC_X ;BR=NO ROCKET COLLISION
CMP A0,A14
JRNE CEC_X ;BR=DIFFERENT EXPLOSION
MOVE *A0(RL_INTENDED_OBJ),A14,L ;DO WE HAVE THE RIGHT TARGET?
CMP A8,A14
JRNE CEC_X ;BR=NOPE. NOT THE RIGHT TARGET.
; CALLA CV_ROCKET
;
; SOUND1 SND_ROCKET_COPTER
;
; CLRM *A8(OATE_ROCKET),L ;Need another rocket
;
; MOVE A0,B14
;
; MMTM SP,B1,B2,B4,B5,B6,B8,B9
;
; MOVE *A0(OZVAL),A1,L
; MOVE A1,B0
;
; MOVE *A0(OXVAL),A3,L
; MOVE A3,B1
; SRA 16,B1
; MOVE B1,B2
;
; MOVE *A0(OYVAL),A5,L
; MOVE A5,B5
; SRA 16,B5
; MOVE B5,B6
;
; MOVI -040000H,B3
; MOVI 040000H,B4
;
; MOVE *B14(OYVEL),B7,L
; MOVE B7,B8
; ADDI -040000H,B7
; ADDI 060000H,B8
;
; MOVE *B14(OZVEL),B9,L
; MOVE B9,B10
; SUBI 0C00H,B9
;
; MOVE @SCRNTL,A7,L
; MOVE A7,A9
; SEXT A7,W
; SRA 16,A9
;
; STOUXY A1,A7,A9
;
; CMP A7,A3
; JRGE CEC_T
; SRA 16,A7
; MOVE A7,B1
; MOVE A7,B2
; CLR B3
; SLL 2,B4
;CEC_T
; CMP A9,A5
; JRGE CEC_BR
; SRA 16,A5
; MOVE A5,B5
; MOVE A5,B6
; CLR B7
; ADDI 060000H,B8
;CEC_BR
; MOVE @SCRNBR,A7,L
; MOVE A7,A9
; SEXT A7,W
; SRA 16,A9
;
; STOUXY A1,A7,A9
;
; CMP A7,A3
; JRLE CEC_B
; SRA 16,A7
; MOVE A7,B1
; MOVE A7,B2
; SLL 2,B3
; CLR B4
;CEC_B
; CMP A9,A5
; JRLE CEC_FRAG
; SRA 16,A5
; MOVE A5,B5
; MOVE A5,B6
; ADDI -040000H,B7
; CLR B8
;
;CEC_FRAG
; MOVI COPTER_EXPLO_FRAG,B14 ;SCRIPT
; CALLA Fragger
; MMFM SP,B1,B2,B4,B5,B6,B8,B9
MOVE A0,A1
MOVK BOMB_POINTS,A0
CALLR CHECK_FREAK_SPEECH
MOVE A1,A0
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 CEC_X ;BR=NO COLLSION ROUTINE
JUMP A14
CEC_X
RETS
**************************************************************************
* *
* CHECK_FREAK_SPEECH - CHECK IF WE SHOULD MAKE FREAK OUT SPEECH *
* *
* PASS: *
* A0 = DAMAGE POINTS *
* A8 = PART OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
CHECK_FREAK_SPEECH
MMTM SP,A0,A1,A8
calla GET_HEAD_PART
MOVE *A8(OHIT_POINTS),A14,W
SUB A0,A14
MOVE A14,*A8(OHIT_POINTS),W
CMPK BOMB_POINTS,A0
JREQ CFS_GO ;BR=HIT BY A BOMB
CMPI RADIO_AT,A14
JRGT CFS_X ;BR=NOT READY FOR SPEECH
CFS_GO
MOVK 2,A0
MOVI 0F0H,A1
CALLA CKSNDPRI ;Still timing the radio chatter?
JRC CFS_X ;BR = Yes
move @WAVEIRQS,A14,L
cmpi NO_FREAK_AFTER_TIME,A14 ;Is it too late for the sound?
jrhs CFS_X ;BR = Yes
move *A8(OFREAKED),A14,W ;Have we freaked already?
jrnz CFS_X ;BR = Yes
move *A8(OHIT_COUNT),A14,W
inc A14
move A14,*A8(OHIT_COUNT),W
cmpi 1,A14
jrlo CFS_X
*Need to get FREAK snd on channel 1
SOUND1 SND_PILOT_FREAK ;Kick that freaky sound
jrnz CFS_Sound_Fail ;BR = Did not get made
MOVKM 1,*A8(OFREAKED),W
JRUC CFS_X
CFS_Sound_Fail
CLRM *A8(OHIT_COUNT),W ;Clear the count on failure
CFS_X
MMFM SP,A0,A1,A8
RETS
;COPTER_EXPLO_FRAG
; .long COPTER_EXPLO_ANIM,0
; .word OID_JUNK,(15 << 11) + (1 << 6) + (FRGBOG+FRGNOFLY+FRGNOFLP+FRGPAL)
; .long 0
;
;COPTER_EXPLO_ANIM
; LW FHKEXPLOB1,6
; 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
**************************************************************************
* *
* DROP_NONBOYS - DROP 'EM FROM DA COPTER *
* *
* PASS: *
* A4 = OXVAL OF COPTER *
* A8 = OBJECT *
* A10 = WAVEIRQS AT LAST DROP *
* A11 = NONBOY DROP TIME INTERVAL *
* *
**************************************************************************
DROP_NONBOYS
; MOVE *A8(OXVAL),A0,L
SUBI 03D40000H,A4
ABS A4
; CMPI 0C00000H,A4
CMPI 0A00000H,A4
JRGT DN_NO_CAN_DO ;BR=CAN'T DROP 'EM HERE!
; MOVE @WAVEIRQS,A14,L
; MOVE *A8(ODROPTIME),A0,L
; SUB A0,A14
; CMPI 5,A14
; JRLT DN_NO_CAN_DO
; ADD A14,A0
; MOVE A0,*A8(ODROPTIME),L
MOVI OID_NONBOY,A0
CALLA GET_ENEMY_COUNT
CMPI 10,A0
JRHS DN_NO_CAN_DO ;BR=MAX NONBOYS
MOVE @WAVEIRQS,A14,L
MOVE A14,A0
SUB A10,A14
CMP A11,A14
JRLT DN_NO_CAN_DO ;BR=NOT ENOUGH TIME YET
MOVE A0,A10
MMTM SP,A9,A10,A11 ;REGISTERS, SAVE 'EM
MOVE *A8(OZVAL),A11,L ;GET COPTER'S Z
ADDK 17,A11 ;PUT NONBOY IN BACK
MOVI -02180000H,A10 ;TOP OF BUILDING Y
MOVE *A8(OYVAL),A9,L ;GET COPTER'S Y
ADDI 75 << 15,A9 ;OFFSET IT SOME
MOVE *A8(OCTRL),A0,W
MOVI 65 << 15,A14 ;DEFAULT X OFFSET
BTST B_FLIPH,A0
JRZ DN_X_OK ;BR=WE'RE NOT FLIPPED
NEG A14 ;WE'RE FLIPPED, NEGATE OFFSET
DN_X_OK
MOVE A8,A2
MOVE *A8(OXVAL),A8,L ;GET COPTER'S X
SUB A14,A8 ;OFFSET X
CREATE PID_IND,CREATE_HELIDROP_NONBOY0
MOVE A2,A8
MMFM SP,A9,A10,A11 ;GET 'EM BACK
DN_NO_CAN_DO
RETS
**************************************************************************
* *
* A_CHECK_SMOKE - SHOULD WE MAKE SOME SMOKE? *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_CHECK_SMOKE
CALLA GET_HEAD_PART
MOVE *A8(OHIT_POINTS),A1,W
CMPI MAKE_SMOKE_AT,A1
JRGT ACS_NO_SMOKE
* B0 = OZVAL *
* B1 = min Xpos *
* B2 = max Xpos *
* B3 = min Xvel *
* B4 = max Xvel *
* B5 = min Ypos *
* B6 = max Ypos *
* B7 = min Yvel *
* B8 = max Yvel *
* B9 = min Zvel *
* B10 = max Zvel *
* B14 = Ptr to explosion script *
MOVE A8,B14
MOVE *B14(OZVAL),B0,L
MOVI 024H,B7
MOVI 080000H,B8
MOVI -014H,A2
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ ACS_NO_FLIPH
NEG B7
NEG B8
NEG A2
ACS_NO_FLIPH
MOVE *B14(OXPOS),B1,W
ADD B7,B1
MOVE B1,B2
MOVE *B14(OYPOS),B5,W
ADDI -022H,B5
MOVE B5,B6
MOVE *B14(OXVEL),B3,L
MOVE B3,B4
ADD B8,B4
MOVE *B14(OYVEL),B7,L
MOVE B7,B8
MOVE *B14(OZVEL),B9,L
MOVE B9,B10
ADDI 0100H,B9
SUBI 0100H,B10
MOVI COPTER_SMOKE_FRAG,B14
CALLA Fragger
CMPI MORE_SMOKE_AT,A1
JRGT ACS_NO_SMOKE
MOVE A8,B14
SUBK 2,B0
MOVE *B14(OXPOS),B1,W
MOVE A2,B2
ADD B2,B1
MOVE B1,B2
MOVE *B14(OYPOS),B5,W
ADDI -025H,B5
MOVE B5,B6
MOVE *B14(OZVEL),B10,L
MOVI COPTER_SMOKE_FRAG,B14
CALLA Fragger
ACS_NO_SMOKE
RETS
COPTER_SMOKE_FRAG
.long COPTER_SMOKE_ANIM,0
.word OID_JUNK,(3 << 11) + (1 << 6) + (FRGBOG+FRGNOFLY+FRGPAL+FRGRND)
.long 0
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
.def KCAGE_EXPLO_INIT
KCAGE_EXPLO_INIT
.byte 2, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long REXPLO ;IMGPAL
.word OID_JUNK, 0 ;OID, GLOBAL_OPTIONS
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW REXPLOA1h, DMAWNZ, M_MANSCALE|M_NOSCALE, 0, OM_ANIM
.long KCAGE_EXPLO_ANIM
LWWWW REXPLOA1h, DMAWNZ|M_FLIPH, M_MANSCALE|M_NOSCALE, 0, 0
KCAGE_EXPLO_ANIM
LW REXPLOA1h,1|AMulti
LW REXPLOA1h,2
LW REXPLOA3h,1|AMulti
LW REXPLOA3h,2
LW REXPLOA4h,1|AMulti
LW REXPLOA4h,2
LW REXPLOA5h,1|AMulti
LW REXPLOA5h,2
LW REXPLOA6h,1|AMulti
LW REXPLOA6h,2
LW REXPLOA8h,1|AMulti
LW REXPLOA8h,2
LW REXPLOA9h,1|AMulti
LW REXPLOA9h,2
LW REXPLOA10h,1|AMulti
LW REXPLOA10h,2
LW REXPLOA11h,1|AMulti
LW REXPLOA11h,2
LW REXPLOA12h,1|AMulti
LW REXPLOA12h,2
LWL 1,1|AFunc,DELETE_OBJ_PROC
.END