revolution-x/GXBUG.ASM

3639 lines
74 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 "GXBUG.ASM"
.TITLE " <<< GENERATION X -- JUNGLE BOSS BUG ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
.INCLUDE "GXENEMY.INC"
.INCLUDE "GXCONTRL.H"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "UNIVTBL.GLO"
.INCLUDE "GXBUG.TBL"
NUM_NECK_SEGS EQU 7 ;NUMBER OF NECK SEGMENTS
.BSS BUG_HEAD_OBJ,32
.BSS BUG_NECK_OBJS,32*NUM_NECK_SEGS
.BSS BUG_BODY_OBJ,32
.bss ATTACK_WAIT,16 ; replaces MIN_TIME_BETWEEN_ATTACKS
.bss MAX_BUG_VEL,16 ; replaces constant
.bss ZCLOSEST_WORLD,32 ; replaces constant
;;;;;; .BSS HUCKLEBERRY_HOUND,16 ;FOR LONG ALIGNMENT
* SYMBOLS IN HERE
.DEF BLOW_COVER_PROC, START_BUG_PROC, SET_OCONST, SORT_OBJ
* SYMBOLS FROM GXD.ASM
.REF XBASE, YBASE, ZBASE, XSCROLL, ZSCROLL
.REF SET_ANIPZU, SET_ANIPU, A_SET_OYVEL, STRTANIM_OFF
* SYMBOLS FROM GXUNILNK.ASM
.REF REMOVE_AND_FREE_LINK
* SYMBOLS FROM GXD.ASM
.REF REPOS_OBJ, SET_SCALE_WARREN, SET_ODAG, GET_SHAD, GET_SHAD_MULTI
* SYMBOLS FROM GXPLAYER.ASM
.REF PLAYER_HIT, GET_PLAYER_WORLDX_EXTENTS
* SYMBOLS FROM GXSCROLL.ASM
.REF SCROLL_FLAG, ZREL_OFF
* SYMBOLS FROM GXSND.ASM
.REF ONESND, SND_CHAN3_OFF, SND_MUSICOFF
* SYMBOLS FROM GXUNIV.ASM
.REF UNIV_FLASH
* SYMBOLS FROM GXRAM.ASM
.REF WAVEIRQS, WAVE_UNIV, CURPLYRS
* SYMBOLS FROM GXUTIL.ASM
.REF SLINEVEL_3D, SLINEVEL_LOAD_3D
* SYMBOLS FROM GXAFUNC.ASM
.REF A_SOUND, A_AnimFrm_DSJ
* SYMBOLS FROM GXCOG.ASM
.REF HIT_ENEMY
* SYMBOLS FROM GXBEEK2.ASM
.REF CURPLYR_ADJ,BRIDGE_STATE
.TEXT
.EVEN
HEAD_ZOFF EQU 040H
NECK_ZOFF EQU 010H
LEGS_2ND_ZOFF EQU 01000H
BUTT_ZOFF EQU 02000H
;MAX_BUG_VEL EQU -0190H ;MAXIMUM FORWARD VELOCITY
BUG_CHARGE_VEL EQU 0eH ;FORWARD VELOCITY CHANGE
BUG_RECOVER_VEL EQU 018H ;FORWARD RECOVER VELOCITY CHANGE
ROCKET_HIT_VEL EQU 03c1H ;ROCKET HIT VELOCITY CHANGE
GUN_HIT_VEL EQU BUG_CHARGE_VEL*3 ;GUN HIT VELOCITY CHANGE
MAX_REVERSE_BUG_VEL EQU 03c0H ;MAXIMUM REVERSE VELOCITY
;MAX_BUG_VEL EQU -0120H ;MAXIMUM FORWARD VELOCITY
;BUG_CHARGE_VEL EQU 0aH ;FORWARD VELOCITY CHANGE
;BUG_RECOVER_VEL EQU 012H ;FORWARD RECOVER VELOCITY CHANGE
;ROCKET_HIT_VEL EQU 0301H ;ROCKET HIT VELOCITY CHANGE
;GUN_HIT_VEL EQU BUG_CHARGE_VEL*3 ;GUN HIT VELOCITY CHANGE
;MAX_REVERSE_BUG_VEL EQU 0300H ;MAXIMUM REVERSE VELOCITY
BODY_ZMIN_ATTACK EQU 05200H ;MINIMUM ATTACK Z
BODY_ZMAX_ATTACK EQU 015200H ;MAXIMUM ATTACK Z
;ZCLOSEST_WORLD EQU 04e00H ;CLOSEST Z ALLOWED
PULL_HEAD_HITS EQU 5 ;PULL BACK HEAD AFTER GUN HITS
MIN_HEAD_HIT_TIME EQU 30 ;MININUM TIME BETWEEN HEAD HITS
MIN_TIME_BETWEEN_ATTACKS EQU 40 ;MININUM TIME BETWEEN HEATBUTTS
;MIN_TIME_BETWEEN_ATTACKS EQU 60 ;MININUM TIME BETWEEN HEATBUTTS
BJ_YVEL equ -40000h
BJ_YACCEL equ 2800h
;OPARTIDs
NECK_SEG EQU 1
SMALL_SEG_R EQU 2
SMALL_SEG_L EQU 3
BIG_SEG_R EQU 4
BIG_SEG_L EQU 5
LEG_PARTS EQU 6
;EVERYBODY'S ODATA
OATE_ROCKET EQU ODATA ;UHL ROCKET OBJECT
;BODY ODATA
OBFLAGS EQU ODATA+020H ;UHW BODY FLAGS
;ONOTUSED EQU ODATA+030H ;UHW
OLASTZSCROLL EQU ODATA+040H ;UHL ZSCROLL FROM LAST TICK
OZFARTHEST EQU ODATA+060H ;UHL FARTHEST PUSH Z
OCHARGEVEL EQU ODATA+080H ;UHW CHARGING FORWARD VELOCITY
ORECOVERVEL EQU ODATA+090H ;UHW RECOVERING FORWARD VELOCITY
;HEAD ODATA
OHFLAGS EQU ODATA+020H ;UHW HEAD FLAGS
;ONOTUSED EQU ODATA+030H ;UHW
OHEADXACCEL EQU ODATA+040H ;UHL HEAD X ACCELERATION
OHEADYACCEL EQU ODATA+060H ;UHL HEAD Y ACCELERATION
OATTACKTIME EQU ODATA+080H ;UHL TIME SINCE LAST ATTACK
OHITS EQU ODATA+0A0H ;UHL GUN HITS ON HEAD PER PLAYER
OLASTHITTIME EQU ODATA+0C0H ;UHL TIME AT LAST GUN HIT
OAMINDELAY EQU ODATA+0E0H ;UHW MINIMUM ATTACK DELAY
;OAMAXDELAY EQU ODATA+0F0H ;UHW MAXIMUM ATTACK DELAY
;NECK ODATA
OUPDATETIME EQU ODATA+020H ;UHW UPDATE TIME FOR NECK PIECE
OUPDATECOUNT EQU ODATA+030H ;UHW CURRENT UPDATE TIME COUNT
ONECKY0 EQU ODATA+040H ;UHL FAR (IN Z) Y POSITION
ONECKY1 EQU ODATA+060H ;UHL CLOSE (IN Z) Y POSITION
ONECKX0 EQU ODATA+080H ;UHL FAR (IN Z) X POSITION
ONECKX1 EQU ODATA+0A0H ;UHL CLOSE (IN Z) X POSITION
;BODY FLAGS
M_STOPLEGS EQU 1 ;STOP LEG ANIMATIONS
M_NOMOVEZ EQU 2 ;DON'T MOVE FORWARD
M_NOPUSH EQU 4 ;DISABLE PUSHING BACK
M_NOBITE EQU 8 ;DISABLE BITING
B_STOPLEGS EQU 0
B_NOMOVEZ EQU 1
B_NOPUSH EQU 2
B_NOBITE EQU 3
;HEAD FLAGS
M_HOME EQU 001H ;SAFE AT HOME
M_GOHOME EQU 002H ;GO HOME
M_RANDOM EQU 004H ;RANDOM MOTION
M_HIT EQU 008H ;HITING DA PLAYERS
M_ATTACK EQU 010H ;ATTACKING
M_DAMAGE EQU 020H ;TOOK PLAYER DAMAGE
M_BITE EQU 040H ;BITING DA PLAYERS
M_PULL EQU 080H ;PULLED FROM OBJECT LIST
M_SORTED EQU 0100H ;HEAD WAS SORTED
B_HOME EQU 0
B_GOHOME EQU 1
B_RANDOM EQU 2
B_HIT EQU 3
B_ATTACK EQU 4
B_DAMAGE EQU 5
B_BITE EQU 6
B_PULL EQU 7
B_SORTED EQU 8
SND_COVER_BLOWN
.WORD 0F380H,89,0A390H,0
SND_GUN_HIT
.WORD 0F310H,9,0A483H,0
SND_ROCKET_HIT
; .WORD 0F320H,31,0A486H,0
.WORD 0F342H,31,0A302H,0
SND_NECK_STRETCH_ATTACK
.WORD 0F280H,87,08178H,0
SND_NECK_STRETCH_ATTACK_HIT
.WORD 0F281H,17,08451H,0
SND_GREETING_SCREAM
.WORD 0F283H,59,0844CH,0
SND_SCREAM_0
.WORD 0F282H,62,08446H,0
SND_SCREAM_1
.WORD 0F282H,62,08447H,0
SND_SCREAM_2
.WORD 0F282H,83,08448H,0
SND_SCREAM_3
.WORD 0F282H,35,08449H,0
SND_SCREAM_4
.WORD 0F282H,36,0844AH,0
SND_SCREAM_5
.WORD 0F282H,41,0845BH,0
SND_BITE
.WORD 0F283H,65,08456H,0
SND_POOL_SPLASH
.WORD 0F2F0H,109,08440H,0
SND_POOL_WALK
.WORD 0F3F1H,60*60*5,0843FH,0
SND_POOL_JUMP
.WORD 0F3F0H,101,0844DH,0
SND_JUMP
.WORD 0F3F0H,25,0844EH,0
SND_LAND
.WORD 0F3F0H,28,0844FH,0
SND_WALK
.WORD 0F3F0H,60*60*5,08441H,0
SND_LEG_1
.WORD 0F3F0H,13,08442H,0
SND_LEG_2
.WORD 0F3F0H,13,08443H,0
SND_LEG_3
.WORD 0F3F0H,13,08444H,0
SND_LEG_4
.WORD 0F3F0H,13,08445H,0
SND_TYLER_NO
.word 0f3f2h,67,08803h,0
LEGSND_TABLE
.LONG SND_LEG_1, SND_LEG_2, SND_LEG_3, SND_LEG_4
SCREAM_TABLE
.LONG SND_SCREAM_0, SND_SCREAM_1, SND_SCREAM_2, SND_SCREAM_3
.LONG SND_SCREAM_4, SND_SCREAM_5
SND_BUG_FINALE
.word 0f1f0h,162,8556h,0
SND_DEATH_SCREAM
.word 0f2f0h,187,859bh,0
**************************************************************************
* SORT_OBJ
* PLACES OBJECT IN SORTED LIST POSITION
* IF HEAD OF MULTI-PARTER, ENTIRE MULTI-PARTER SORTED
* IF SUB-PART OF MULTI-PARTER, JUST SUB-PART SORTED
*
* A8 = OBJ to be SORTED, DUMMY
* RETS nothing
SORT_OBJ:
MMTM SP,A0,A1,A2,A3,A4,A5
move *A8(OPART1),A0,L
jrz SO_SkMulti
cmp A0,A8 ;Is Part Head Obj
jrne SO_SkMulti
SO_Multi ;* TO PULL A HEAD OBJECT, PULL ANY SUBPARTS FIRST
move *A0(OPARTS),A0,L
jrz SO_SkMulti
CALLR SORTOBJECT
jruc SO_Multi
SO_SkMulti
move A8,A0
CALLR SORTOBJECT
MMFM SP,A0,A1,A2,A3,A4,A5
rets
SORTOBJECT
;ERROR CHECKS
calla IsAnObj
move *A0(OLINK),A14,L ;IS OBJ INSERTED?
jrz SO_SkPULLOBJ
PUSHST
DINT ;Interrupts off now
move *A0(OBLINK),A1,L ;A1 - Prev Obj
move *A0,A14,L ;A14 - Next Obj
move A14,*A1,L ;LINK FORWARD AROUND OBJ A0
move A1,*A14(OBLINK),L ;LINK BACKWARD AROUND OBJ A0
clr A14
move A14,*A0(OLINK),L ;OBJ NOT INSERTED
POPST
; move *A0,A4,L
; jrnz SO_INSOBJX ;obj is already inserted
movi FGLIST,A3
SO_InsGotPln
move A3,A4
move *A0(OZVAL),A1,L ; GET Z POSITION
SO_ins_zloop:
move *A3,A3,L
cmp A3,A4
jreq SO_do_ins ; bra if at end of list
MOVE *A3(ONOT_SORTED),A2,W
JRNZ SO_ins_zloop ;BR = Don't base off un-sorted object
move *A3(OZVAL),A2,L ; ZPOS in A3
cmp A2,A1
jrgt SO_ins_zloop
jrlt SO_do_ins
move *A0(OYVAL),A5,L ; GET Y POSITION
jruc SO_ins_ytest
SO_ins_yloop
move *A3,A3,L
cmp A3,A4
jreq SO_do_ins ; bra if at end of list
move *A3(OZVAL),A2,L ; ZPOS in A3
cmp A2,A1
jrlt SO_do_ins
SO_ins_ytest
move *A3(OYVAL),A2,L ;TEST Y POSITION
cmp A2,A5
jrlt SO_ins_yloop
SO_do_ins
PUSHST
DINT
move *A3(OBLINK),A2,L ; get ptr to previous
move A3,*A0,L ;IF BACK LINKS USED FROM INTERRUPT
move A0,*A2,L ; THIS WILL NEED TO BE DINT
move A0,*A3(OBLINK),L ;
move A2,*A0(OBLINK),L ;
POPST
;SO_INSOBJX
SO_SkPULLOBJ
RETS
**************************************************************************
* *
* BLOW_COVER_PROC *
* *
**************************************************************************
COVER_CVECT
WWL OID_GRND,0FFFFH,DELETE_OBJ
WL 0,DUMCRETS
BLOW_COVER_PROC
MOVIM 4e00h,@ZCLOSEST_WORLD,L
MOVIM MIN_TIME_BETWEEN_ATTACKS,@ATTACK_WAIT,W
MOVI FGLIST,A7
MOVE A7,A8
MOVI DRAIN,A1
MOVI -0100H,A2 ;Z VELOCITY
MOVI -048000H,A3 ;Y VELOCITY
MOVI 03800H,A4 ;Y ACCELERATION
MOVI COVER_CVECT,A5
MOVI -67 << 15,A6
MOVI 010000H,A9
BCP_FIND_LUPE
MOVE *A8(OIMG),A14,L
CMP A1,A14
JRNE BCP_FIND_NEXT ;BR=NOT DRAIN PIECE
MOVE *A8(OULINK),A0,L
CLR A14
MOVE A14,*A8(OULINK),L
CALLA REMOVE_AND_FREE_LINK
MOVE A2,*A8(OZVEL),L
MOVE A3,*A8(OYVEL),L
MOVE A4,*A8(OYACCEL),L
ABS A9
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ BCP_SET_XVEL ;BR=RIGHT HALF
NEG A9
BCP_SET_XVEL
MOVE A9,*A8(OXVEL),L
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14
MOVE A14,*A8(OFLAGS),W
MOVE A6,*A8(OGRNDOFF),L
MOVE A5,*A8(OCVECT),L
BCP_FIND_NEXT
MOVE *A8,A8,L
CMP A7,A8
JRNE BCP_FIND_LUPE ;BR=NOT END OF LIST
SOUND1 SND_COVER_BLOWN
SLEEP 60
MOVE @BUG_BODY_OBJ,A8,L
.if DEBUG
JRZ $
.endif
CREATE PID_BOSSBUG,BUG_BODY_PROC ;START BUG MOTION
MOVE A0,*A8(OPLINK),L
sleep 20
SOUND1 SND_TYLER_NO
sleep 15
SOUND1 SND_MUSICOFF
DIE
**************************************************************************
* *
* START_BUG_PROC - START DA BUG *
* *
**************************************************************************
START_BUG_PROC
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
MOVI 031D0000H,A1
MOVI -0340000H,A2
MOVI 014C9EH-NECK_ZOFF,A3
ADD A14,A3
MOVI 0101H,A4
MOVK NUM_NECK_SEGS,A9 ;DO THE NECK
MOVI BUG_NECK_OBJS,A10
MOVI BUG_NECK_UPDATE_TIME_TABLE,A11
SBP_NECK_LUPE
MOVI BUG_NECK_INIT,B0
CALLA MULTIMAKE
LOCKON Z
MOVE A4,*A8(OCONST),W
CALLA SET_ANIPU
CALLA INSERT_OBJ
MOVE A8,*A10+,L
CALLA CLR_ODATA
MOVE *A11+,A14,W ;SET UPDATE TIME
MOVE A14,*A8(OUPDATETIME),W
DSJ A9,SBP_NECK_LUPE
CREATEP PID_BOSSBUG,BUG_NECK_PROC ;NECK CONTROL
MOVI BUG_HEAD_INIT,B0 ;DO THE HEAD
CALLA MULTIMAKE
LOCKON Z
CALLR SET_OCONST
MOVI 031D0000H,A1
SUBI HEAD_ZOFF-NECK_ZOFF,A3
CALLA SET_ANIPU
CALLA INSERT_OBJ
; MOVI 0800H,A14
; MOVE A14,*A8(OZFRNT),W
CALLA CLR_ODATA
MOVK M_HOME,A14 ;WE'RE AT HOME
MOVE A14,*A8(OHFLAGS),W
MOVK 6,A14
MOVE A14,*A8(OAMINDELAY),W
; MOVI 30,A14
; MOVE A14,*A8(OAMAXDELAY),W
CREATEP PID_BOSSBUG,BUG_HEAD_PROC ;HEAD CONTROL
MOVE A0,*A8(OPLINK),L
MOVE A8,@BUG_HEAD_OBJ,L
MOVI BUG_BODY_INIT,B0 ;DO THE BODY
CALLA MULTIMAKE
LOCKON Z
CALLR SET_OCONST
MOVE A3,A1
ADDI HEAD_ZOFF,A1
MOVI 031D0000H,A3
CALLA REPOS_OBJ
CALLA INSERT_OBJ
CALLA CLR_ODATA
; MOVE @ZSCROLL,A14,L
; MOVE A14,*A8(OZVEL),L
; MOVE A14,*A8(OLASTZSCROLL),L
MOVK M_NOPUSH,A14
MOVE A14,*A8(OBFLAGS),W
MOVI BUG_CHARGE_VEL,A14
MOVE A14,*A8(OCHARGEVEL),W
MOVI BUG_RECOVER_VEL,A14
MOVE A14,*A8(ORECOVERVEL),W
MOVI (54-15) << 15,A0
MOVE A0,*A8(OGRNDOFF),L
MOVE A8,@BUG_BODY_OBJ,L
; CREATEP PID_BOSSBUG,BUG_BODY_PROC ;BODY CONTROL
; MOVE A0,*A8(OPLINK),L
DIE
BUG_NECK_UPDATE_TIME_TABLE
.WORD 2,3,4,5,6,7,8
**************************************************************************
* *
* SET_OCONST - SET OCONST FIELD. IF HEAD, THEN SET ALL PARTS ELSE *
* JUST SET THE ONE OBJECT *
* *
* PASS: *
* A4 = CONSTANT (i.e. 0101H FOR COLOR #1) *
* A8 = HEAD OR PART *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
SET_OCONST
PUSH A0
MOVE A4,*A8(OCONST),W
MOVE *A8(OPART1),A0,L
CMP A8,A0
JRNE SO_DONE ;BR=NOT DA HEAD
SO_LUPE
MOVE *A0(OPARTS),A0,L
JRZ SO_DONE ;BR=NO MORE PARTS
MOVE *A0(OFLAGS),A14,W
BTST B_SHAD,A14
JRNZ SO_LUPE ;BR=NO CONSTANT ON NO SHADOW
MOVE A4,*A0(OCONST),W
JRUC SO_LUPE
SO_DONE
PULLQ A0
RETS
**************************************************************************
* *
* PULL_BUG - PULL THE BUG OBJECTS FROM THE OBJECT LIST *
* *
* PASS: *
* NUTIN' *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
PULL_BUG
move @ATTACK_WAIT,a14 ; lower ticks to wait between attacks
subk 8,a14 ; adjust each time bug goes off
jrn PB0
move a14,@ATTACK_WAIT
PB0:
MMTM SP,A1,A2,A8
MOVK NUM_NECK_SEGS,A1 ;DO THE NECK
MOVI BUG_NECK_OBJS,A2
PB_NECK_LUPE
MOVE *A2+,A8,L
CALLA PULL_OBJ
MOVE *A8(OFLAGS),A14,W
BTST B_ANIM,A14
JRZ PB_NL_NEXT ;BR=NO NECK ANIM
CALLA PULL_ANIM
PB_NL_NEXT
DSJ A1,PB_NECK_LUPE
MOVE @BUG_HEAD_OBJ,A8,L ;DO THE HEAD
MOVI M_PULL,A14
MOVE A14,*A8(OHFLAGS),W
CALLA PULL_OBJ
MOVE *A8(OFLAGS),A14,W
BTST B_ANIM,A14
JRZ PB_BODY ;BR=NO HEAD ANIM
CALLA PULL_ANIM
PB_BODY
MOVE @BUG_BODY_OBJ,A8,L ;DO THE BODY
CLR A14 ;STOP DA BODY
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
MOVE A14,*A8(OYACCEL),W
CALLA PULL_OBJ
CALLA PULL_ANIM_ALL
PB_DONE
MMFM SP,A1,A2,A8
RETS
**************************************************************************
* *
* SET_BUG_POSITION - POSITION THE BUG IN THE UNIVERSE *
* *
* PASS: *
* A1 = UNIVERSE X *
* A2 = UNIVERSE Y *
* A3 = UNIVERSE Z (rel to local univ) *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
SET_BUG_POSITION
MMTM SP,A1,A3,A4,A8,A9,A10
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A3
SUBK NECK_ZOFF,A3 ;Z OFFSET FOR NECKS
MOVK NUM_NECK_SEGS,A9 ;DO THE NECK
MOVI BUG_NECK_OBJS,A10
SBPO_NECK_LUPE
MOVE *A10+,A8,L
CALLA SET_ANIPU
MOVE A8,A0
SBPO_NECK_OFF_LUPE
MOVE *A0(OFLAGS),A14,W
ORI M_OFSCRN,A14
MOVE A14,*A0(OFLAGS),W
MOVE *A0(OPARTS),A0,L
JRNZ SBPO_NECK_OFF_LUPE ;BR=PARTS IS PARTS
CALLA INSERT_OBJ
DSJ A9,SBPO_NECK_LUPE
SUBI HEAD_ZOFF-NECK_ZOFF,A3 ;Z OFFSET FOR THE HEAD
MOVE @BUG_HEAD_OBJ,A8,L ;DO THE HEAD
; CLR A14
MOVK M_HOME,A14
MOVE A14,*A8(OHFLAGS),W ;RESET HEAD FLAGS
CALLA SET_ANIPU
CALLA INSERT_OBJ
MOVE A1,A9
MOVI BITE1,A1 ;RESET HEAD
SBPO_HEAD_LUPE
MOVE *A8(OFLAGS),A14,W
ORI M_OFSCRN,A14
MOVE A14,*A8(OFLAGS),W
BTST B_SHAD,A14
JRNZ SBPO_HEAD_NEXT ;BR=DON'T ANI A SHADOW
MOVE *A8(OCTRL),A4,W
ANDI M_FLIPH,A4
ORI DMAWNZ,A4
CALLA ANI
; CALLA SET_SCALE_WARREN ;SCALE THE MOTHER
; CALLA SET_ODAG ;COMPUTE ODAG AGAIN
SBPO_HEAD_NEXT
MOVE *A8(OPARTS),A8,L
JRNZ SBPO_HEAD_LUPE ;BR=PARTS IS PARTS
ADDI HEAD_ZOFF,A3 ;CLEAR OFFSET FOR BODY
MOVE A3,A1
MOVE A9,A3
MOVE @BUG_BODY_OBJ,A8,L ;DO THE BODY
CALLA REPOS_OBJ
CALLA INSERT_OBJ
SBPO_BODY_LUPE
MOVE *A8(OFLAGS),A14,W
ORI M_OFSCRN,A14
MOVE A14,*A8(OFLAGS),W
MOVE *A8(OPARTS),A8,L
JRNZ SBPO_BODY_LUPE ;BR=PARTS IS PARTS
MMFM SP,A1,A3,A4,A8,A9,A10
RETS
**************************************************************************
* *
* BUG_BODY_PROC *
* *
**************************************************************************
BUG_BODY_PROC
MOVK LEG_PARTS,A1
CALLA FINDPART
.if DEBUG
JRZ $
.endif
MOVIM -1c0h,@MAX_BUG_VEL,W
MOVI BUG_LEGS_SPRING_ANIM,A1 ;BOING!
CALLA STRTANIM
BBP_DRAIN_SPRING_WAIT
SLEEP 1
MOVE *A8(OFLAGS),A14,W
BTST B_GCOLL,A14
JRZ BBP_DRAIN_SPRING_WAIT ;BR=NOT CLEARED YET
SOUND1 SND_JUMP
MOVI -0100H,A14 ;JUMP OUT OF DRAIN
MOVE A14,*A8(OZVEL),L
MOVI BJ_YVEL,A14
MOVE A14,*A8(OYVEL),L
MOVI BJ_YACCEL,A14
MOVE A14,*A8(OYACCEL),W
BBP_DRAIN_LEAP_WAIT
SLEEP 1
MOVE *A8(OFLAGS),A14,W
BTST B_GCOLL,A14
JRNZ BBP_DRAIN_LEAP_WAIT ;BR=NOT OUT OF DRAIN
MOVK LEG_PARTS,A1
CALLA FINDPART
.if DEBUG
JRZ $
.endif
MOVE A0,A9
MOVI BUG_LEGS_SPRING_ANIM,A1 ;BOING!
CALLA STRTANIM
SOUND1 SND_POOL_SPLASH
BBP_DRAIN_LAND_WAIT
SLEEP 1
MOVE *A9(OFLAGS),A14,W
BTST B_ANIM,A14
JRNZ BBP_DRAIN_LAND_WAIT ;BR=NOT ON DA GROUND
SOUND1 SND_POOL_WALK
CREATE PID_BOSSBUG,BUG_START_WALK_PROC ;START MOVIN'
MOVI NECK_ANIM,A1
CALLA STRT_ANIM
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_RANDOM,A14
MOVE A14,*A0(OHFLAGS),W
BBP_WALK_WAIT
SLEEP 1
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1
CMPI 08000H,A1
JRGT BBP_WALK_WAIT ;BR=NOT AT EDGE
SOUND1 SND_CHAN3_OFF
MOVIM -120h,@MAX_BUG_VEL,W
CLR A14
MOVE A14,*A8(OZVEL),L ;STOP MOVIN'
CALLA PULL_ANIM
MOVE *A8(OBFLAGS),A14,W
ORI M_STOPLEGS,A14
MOVE A14,*A8(OBFLAGS),W
; CREATE PID_BOSSBUG,BUG_HEAD_INTRO_PROC ;INTRODUCE DA HEAD
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVI HEAD_GREETING_ANIM,A1
MOVI HEAD_SCREAM_GO_ANIM,A14
CALLA STRTANIM_OFF
SLEEP 40
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_GOHOME,A14
MOVE A14,*A0(OHFLAGS),W
BBP_HEAD_HOME_WAIT
SLEEP 1
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OHFLAGS),A14,W
BTST B_HOME,A14
JRZ BBP_HEAD_HOME_WAIT ;BR=NOT READY TO JUMP
MOVK LEG_PARTS,A1
CALLA FINDPART
.if DEBUG
JRZ $
.endif
MOVI BUG_LEGS_SPRING_ANIM,A1 ;BOING!
CALLA STRTANIM
BBP_POOL_SPRING_WAIT
SLEEP 1
MOVE *A8(OFLAGS),A14,W
BTST B_GCOLL,A14
JRZ BBP_POOL_SPRING_WAIT ;BR=NOT CLEARED YET
SOUND1 SND_POOL_JUMP
MOVK 1,A14
MOVE A14,@SCROLL_FLAG,L
MOVI -0100H,A14 ;JUMP OUT OF POOL
MOVE A14,*A8(OZVEL),L
MOVI -038000H,A14
MOVE A14,*A8(OYVEL),L
MOVI 02800H,A14
MOVE A14,*A8(OYACCEL),W
CALLA GET_SHAD_MULTI
MOVE A8,A1
MOVE @BUG_HEAD_OBJ,A8,L
.if DEBUG
JRZ $
.endif
CALLA GET_SHAD_MULTI
MOVK NUM_NECK_SEGS,A2
MOVI BUG_NECK_OBJS,A3
BBP_SHADOW_NECK_LUPE
MOVE *A3+,A8,L
.if DEBUG
JRZ $
.endif
CALLA GET_SHAD
DSJ A2,BBP_SHADOW_NECK_LUPE
MOVE A1,A8
BBP_POOL_LEAP_WAIT
SLEEP 1
MOVE *A8(OFLAGS),A14,W
BTST B_GCOLL,A14
JRNZ BBP_POOL_LEAP_WAIT ;BR=NOT OUT OF POOL
MOVK LEG_PARTS,A1
CALLA FINDPART
.if DEBUG
JRZ $
.endif
MOVI BUG_LEGS_SPRING_ANIM,A1 ;BOING!
CALLA STRTANIM
MOVE A0,A9
SOUND1 SND_LAND
BBP_POOL_LAND_WAIT
SLEEP 1
MOVE *A9(OFLAGS),A14,W
BTST B_ANIM,A14
JRNZ BBP_POOL_LAND_WAIT ;BR=NOT ON DA GROUND
; SOUND1 SND_WALK
MOVI NECK_ANIM,A1
CALLA STRT_ANIM
MOVI -04000H-BUTT_ZOFF-0100H,A1
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A1
MOVE A1,*A8(OZFARTHEST),L ;SET PUSH LIMIT
CLR A14
MOVE A14,*A8(OBFLAGS),W
CREATE PID_BOSSBUG,BUG_START_WALK_PROC
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_RANDOM,A14
MOVE A14,*A0(OHFLAGS),W
MOVI -05010H,A9
MOVI -01B52FH,A10
CREATE PID_BOSSBUG,BUG_HEAD_ATTACK_PROC
MOVE @XBASE,A9,L
BBP_FIRST_TURN_WAIT
SLEEP 1
MOVE @XSCROLL,A14,L
JRZ BBP_FIRST_TURN_WAIT ;BR=NOT AT FIRST TURN
MOVK M_NOBITE,A14
MOVE A14,*A8(OBFLAGS),W
BBP_FIRST_OFFSCREEN_WAIT
SLEEP 1
MOVE @XBASE,A14,L
SUB A9,A14
ABS A14
CMPI 0E0C552H,A14
JRLT BBP_FIRST_OFFSCREEN_WAIT ;BR=NOT OFFSCREEN
CALLR PULL_BUG
BBP_FIRST_PORTAL_WAIT
SLEEP 1
MOVE @WAVE_UNIV,A14,L
CMPI GXHALL3M,A14
JRNE BBP_FIRST_PORTAL_WAIT ;BR=NOT THROUGH PORTAL
MOVE @XBASE,A1,L
MOVE *A8(OYVAL),A2,L
MOVI 022001H,A3 ; Z Relative to GXHALL3M (was 21001)
CALLR SET_BUG_POSITION
sleep 30 ; wait for doors to open
CLR A14
MOVE A14,*A8(OBFLAGS),W
MOVI 020000H-BUTT_ZOFF-0100H,A1
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A1
MOVE A1,*A8(OZFARTHEST),L ;SET PUSH LIMIT
MOVI 01FFF0H,A9
MOVI -0F00H,A10
CREATE PID_BOSSBUG,BUG_HEAD_ATTACK_PROC
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_HOME,A14
MOVE A14,*A0(OHFLAGS),W
MOVI NECK_ANIM,A1
CALLA STRT_ANIM
CREATE PID_BOSSBUG,BUG_START_WALK_PROC
BBP_SECOND_TURN_WAIT
SLEEP 1
MOVE @XSCROLL,A14,L
JRZ BBP_SECOND_TURN_WAIT ;BR=NOT AT SECOND TURN
MOVK M_NOBITE,A14
MOVE A14,*A8(OBFLAGS),W
MOVE @XBASE,A9,L
BBP_SECOND_OFFSCREEN_WAIT
SLEEP 1
MOVE @XBASE,A14,L
SUB A9,A14
ABS A14
CMPI 0BEF581H,A14
JRLT BBP_SECOND_OFFSCREEN_WAIT ;BR=NOT OFFSCREEN
CALLR PULL_BUG
MOVE @XSCROLL,A11,L ;SAVE DIRECTION
BBP_ELEVATOR_TURN_WAIT
SLEEP 1
MOVE @SCROLL_FLAG,A14,L
JRZ BBP_ELEVATOR_TURN_WAIT ;BR=NOT AT ELEVATOR
MOVI 08000H-BUTT_ZOFF-0100H,A1
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A1
MOVE A1,*A8(OZFARTHEST),L ;SET PUSH LIMIT
MOVI 01000000H,A14 ;LEFT X OFFSET
MOVI -040000H,A9 ;LEFT X VELOCITY
MOVE A11,A11
JRN BBP_SET_OFF_ELEVATOR ;BR=COMIN' FROM DA RIGHT
NEG A14 ;RIGHT X OFFSET
NEG A9 ;RIGHT X VELOCITY
BBP_SET_OFF_ELEVATOR
MOVE @XBASE,A1,L
ADD A14,A1
MOVE *A8(OYVAL),A2,L
MOVI 08001H-BUTT_ZOFF-010H,A3
CALLR SET_BUG_POSITION
CLR A14
MOVE A14,*A8(OBFLAGS),W
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_HOME,A14
MOVE A14,*A0(OHFLAGS),W
MOVI NECK_ANIM,A1
CALLA STRT_ANIM
CREATE PID_BOSSBUG,BUG_START_WALK_PROC
CLR A14 ;NO Z MOVEMENT
MOVE A14,*A8(OZVEL),L
MOVK M_NOMOVEZ|M_NOPUSH,A14
MOVE A14,*A8(OBFLAGS),W
MOVE A9,*A8(OXVEL),L ;X SLIDE VELOCITY
ABS A9
GETST A10
BBP_ELEVATOR_WAIT
SLEEP 1
MOVE @XBASE,A1,L
MOVE *A8(OXVAL),A2,L
SUB A2,A1
GETST A14
XOR A10,A14
MOVE A14,A14
JRNN BBP_ELEVATOR_PAST ;BR=PAST DA MIDPOINT
ABS A1
CMP A9,A1
JRGT BBP_ELEVATOR_WAIT ;BR=NOT THERE YET
BBP_ELEVATOR_PAST
; MOVI 0105000H,A1
; MOVE *A8(OYVAL),A2,L
; MOVI 06E433H,A3
; CALLR SET_BUG_POSITION
; MOVI 0105000H,A14
; MOVE A9,*A8(OXVAL),L
; MOVE A9,A1
;; CALLA SET_ANIPXU
; CALLA REPOS_OBJ
MOVIM -0f0h,@MAX_BUG_VEL,W
CLR A14 ;STOP X MOVEMENT
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OBFLAGS),W
MOVI 08001H-BUTT_ZOFF-010H-010H,A9
MOVI -013801H,A10
CREATE PID_BOSSBUG,BUG_HEAD_ATTACK_PROC
CLR A9
MOVI -012001H,A10 ;Z REL AT PUSH BACK
; MOVI -0F001H,A10
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A10
MOVI 0100H,A11
BBP_LOBBY_WAIT
SLEEP 1
MOVE @WAVE_UNIV,A14,L
CMPI GXEVLOB3,A14
JREQ BBP_LOBBY ;BR=WE'RE IN DA LOBBY
; MOVE A9,A9
; JRNZ BBP_LOBBY_WAIT ;BR=WE ALREADY SLOWED
MOVE *A8(OZVAL),A14,L
CMP A10,A14
JRGT BBP_LOBBY_WAIT ;BR=NOT CLOSE ENOUGH
MOVE *A8(OBFLAGS),a14,W
ori M_NOBITE,a14
move a14,*a8(OBFLAGS) ; too close, stop biting
MOVE *A8(OZVEL),A14,L
CMP A11,A14
JRGE BBP_LOBBY_WAIT ; already moving back
; MOVK 1,A9 ;TOO CLOSE. SLOW DOWN
MOVE A11,*A8(OZVEL),L ; move back now!
JRUC BBP_LOBBY_WAIT
BBP_LOBBY
; CALLR PULL_BUG
; JRUC BBP_TEST
CLR A14 ;NO Z MOVEMENT
MOVE A14,*A8(OZVEL),L
MOVIM -120h,@MAX_BUG_VEL,W
MOVE @ZREL_OFF,A4,L
SRA ZFRAC,A4
MOVE @XBASE,A3,L
MOVE *A8(OYVAL),A2,L
MOVI 0a801H,A1 ; was 9801
ADD A4,A1
CALLA REPOS_OBJ ;SET IN NEW UNIVERSE
sleep 60 ; wait for doors to open
MOVI 08000H-BUTT_ZOFF-0100H,A1
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A1
MOVE A1,*A8(OZFARTHEST),L ;SET PUSH LIMIT
MOVI 08001H-BUTT_ZOFF-010H-010H,A9
MOVI -013000H,A10
CREATE PID_BOSSBUG,BUG_HEAD_ATTACK_PROC
MOVK M_NOBITE,A14
MOVE A14,*A8(OBFLAGS),W
CLR A14 ;NO Z MOVEMENT
MOVE A14,*A8(OZVEL),L
MOVE @ZREL_OFF,A4,L
SRA ZFRAC,A4
MOVI -012000H,A9
ADD A4,A9
BBP_DESK_WAIT
SLEEP 1
MOVE *A8(OZVAL),A14,L
CMP A9,A14
JRGT BBP_DESK_WAIT ;BR=NOT READY TO JUMP
MOVK M_STOPLEGS,A14
MOVE A14,*A8(OBFLAGS),W
CALLA PULL_ANIM
MOVK M_NOPUSH|M_NOBITE|M_STOPLEGS,A14
MOVE A14,*A8(OBFLAGS),W
SOUND1 SND_JUMP
MOVI -0d0H,A14 ; was -100h ;JUMP THE DESK
MOVE A14,*A8(OZVEL),L
MOVI -50000h,A14
MOVE A14,*A8(OYVEL),L
MOVI BJ_YACCEL,A14
MOVE A14,*A8(OYACCEL),W
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14
MOVE A14,*A8(OFLAGS),W
BBP_DESK_LEAP_WAIT
SLEEP 1
MOVE *A8(OFLAGS),A14,W
BTST B_GCOLL,A14
JRNZ BBP_DESK_LEAP_WAIT ;BR=NOT OVER DESK
MOVK LEG_PARTS,A1
CALLA FINDPART
.if DEBUG
JRZ $
.endif
MOVI BUG_LEGS_SPRING_ANIM,A1 ;BOING!
CALLA STRTANIM
SOUND1 SND_LAND
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_RANDOM,A14
MOVE A14,*A0(OHFLAGS),W
SLEEP 30
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVI HEAD_GREETING_ANIM,A1
MOVI HEAD_SCREAM_GO_ANIM,A14
CALLA STRTANIM_OFF
sleep 15
MOVK 1,A14
MOVE A14,@SCROLL_FLAG,L
SLEEP 45
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_GOHOME,A14
MOVE A14,*A0(OHFLAGS),W
BBP_JUNGLE_WAIT
SLEEP 1
MOVE @WAVE_UNIV,A14,L
CMPI GXJUNG3,A14
JRNE BBP_JUNGLE_WAIT ;BR=NOT IN JUNGLE YET
CLR A14
MOVE A14,*A8(OBFLAGS),W
MOVE @ZREL_OFF,A4,L
SRA ZFRAC,A4
MOVE @XBASE,A3,L
MOVE *A8(OYVAL),A2,L
; MOVI 0F0000H,A2
MOVI 03F801H,A1 ; was 3e801
ADD A4,A1
CALLA REPOS_OBJ ;SET IN NEW UNIVERSE
MOVI 03C801H-BUTT_ZOFF-0100H,A1
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A1
MOVE A1,*A8(OZFARTHEST),L ;SET PUSH LIMIT
sleep 30
MOVI 03C801H-BUTT_ZOFF-010H-010H,A9
MOVI 025931H,A10
CREATE PID_BOSSBUG,BUG_HEAD_ATTACK_PROC
MOVI NECK_ANIM,A1
CALLA STRT_ANIM
CREATE PID_BOSSBUG,BUG_START_WALK_PROC
BBP_WALL_OFFSCREEN_WAIT
SLEEP 1
MOVE @YBASE,A14,L
CMPI 0910000H,A14
JRLT BBP_WALL_OFFSCREEN_WAIT ;BR=NOT OFFSCREEN YET
CALLR PULL_BUG
BBP_WALL_LAND_WAIT
SLEEP 1
MOVE @YBASE,A14,L
JRNZ BBP_WALL_LAND_WAIT ;BR=NOT ON GROUND YET
MOVE @XBASE,A1,L
MOVI -01000000H,A2
MOVI 024000H-BUTT_ZOFF-0100H,A3
CALLR SET_BUG_POSITION
MOVI 024000H-BUTT_ZOFF-0100H,A1
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A1
MOVE A1,*A8(OZFARTHEST),L ;SET PUSH LIMIT
MOVI 021000H,A9
MOVI -0CCD9H,A10
CREATE PID_BOSSBUG,BUG_HEAD_ATTACK_PROC
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_HOME,A14
MOVE A14,*A0(OHFLAGS),W
MOVK M_NOBITE|M_NOPUSH|M_STOPLEGS,A14
MOVE A14,*A8(OBFLAGS),W
CREATE PID_BOSSBUG,BUG_START_WALK_PROC
MOVI BJ_YACCEL,A14
MOVE A14,*A8(OYACCEL),W
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14
MOVE A14,*A8(OFLAGS),W
BBP_WALL_FALL_WAIT
SLEEP 1
MOVE *A8(OFLAGS),A14,W
BTST B_GCOLL,A14
JRNZ BBP_WALL_FALL_WAIT ;BR=NOT OVER DESK
MOVK LEG_PARTS,A1
CALLA FINDPART
.if DEBUG
JRZ $
.endif
MOVI BUG_LEGS_SPRING_ANIM,A1 ;BOING!
CALLA STRTANIM
SOUND1 SND_LAND
SLEEP 30
CLR A14
MOVE A14,*A8(OBFLAGS),W
CREATE PID_BOSSBUG,BUG_START_WALK_PROC
MOVI NECK_ANIM,A1
CALLA STRT_ANIM
MOVE @XBASE,A9,L
BBP_JUNGLE_OFFSCREEN_WAIT
SLEEP 1
MOVE @XBASE,A14,L
SUB A9,A14
CMPI -0177BA83H,A14
JRGT BBP_JUNGLE_OFFSCREEN_WAIT ;BR=NOT OFFSCREEN YET
CALLR PULL_BUG
BBP_BRIDGE_WAIT
SLEEP 1
MOVE @SCROLL_FLAG,A14,L
JRZ BBP_BRIDGE_WAIT ;BR=NOT AT BRIDGE YET
move @ATTACK_WAIT,a14
addk 20,a14
move a14,@ATTACK_WAIT
MOVE @XBASE,A1,L
MOVI -01000000H,A2
MOVI -019000H-BUTT_ZOFF-0100H,A3
CALLR SET_BUG_POSITION
MOVI -019000H-BUTT_ZOFF-0100H,A1
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A1
MOVE A1,*A8(OZFARTHEST),L ;SET PUSH LIMIT
MOVI -01C000H,A9
MOVI -0100000H,A10
CREATE PID_BOSSBUG,BUG_HEAD_ATTACK_PROC
move a0,a9 ; for killing later
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVK M_HOME,A14
MOVE A14,*A0(OHFLAGS),W
MOVK M_NOBITE|M_NOPUSH|M_STOPLEGS,A14
MOVE A14,*A8(OBFLAGS),W
CREATE PID_BOSSBUG,BUG_START_WALK_PROC
MOVI BJ_YACCEL,A14
MOVE A14,*A8(OYACCEL),W
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14
MOVE A14,*A8(OFLAGS),W
MOVIM -080h,@MAX_BUG_VEL,W
BBP_DOOR_FALL_WAIT
SLEEP 1
MOVE *A8(OFLAGS),A14,W
BTST B_GCOLL,A14
JRNZ BBP_DOOR_FALL_WAIT ;BR=NOT OVER DESK
MOVK LEG_PARTS,A1
CALLA FINDPART
.if DEBUG
JRZ $
.endif
MOVI BUG_LEGS_SPRING_ANIM,A1 ;BOING!
CALLA STRTANIM
SOUND1 SND_LAND
SLEEP 30
CLR A14
MOVE A14,*A8(OBFLAGS),W
CREATE PID_BOSSBUG,BUG_START_WALK_PROC
MOVI NECK_ANIM,A1
CALLA STRT_ANIM
BBP_TEST
move @ZBASE,a14,L ; slide OZFARTHEST forward if
addi 15000h,a14 ; necessary
move *a8(OZFARTHEST),a0,L
cmp a0,a14
jrgt BBP_nochg
move a14,*a8(OZFARTHEST),L
BBP_nochg:
move @BRIDGE_STATE,a14
jrn BBP_BRIDGE_GONE
move @ZSCROLL,a14,L
jrnz BBP_moving
MOVIM 7000h,@ZCLOSEST_WORLD,L
MOVE *A8(OBFLAGS),a14,W
ori M_NOBITE,a14
move a14,*a8(OBFLAGS)
BBP_moving:
SLoop 3,BBP_TEST
BBP_BRIDGE_GONE:
MOVIM BHAP_HOME,*a9(PWAKE),L
MOVKM 1,*a9(PTIME),W
calla DELETE_SHADOW ; remove body shadow
CALLA PULL_ANIM ;PULL BODY "HEAD" ANIMATION
MOVIM -38000h,*a8(OYVEL),L ; get body plummeting
movim 1500h,*a8(OYACCEL),W
CLRM *a8(OZVEL),L
move a8,a9 ; body obj in a9
movi BUG_NECK_OBJS,a3
movk NUM_NECK_SEGS,a6
movk 2,a4
BBP_nkshad:
move *a3+,a8,L
calla DELETE_SHADOW ; remove neck shadows
move a4,*a8(OUPDATETIME) ; reset update time
dsjs a6,BBP_nkshad
move @BUG_HEAD_OBJ,a8,L
calla DELETE_SHADOW ; remove head shadow
move *a8(OPLINK),a0,L ; BUG HEAD PROC
MOVIM BHP_GOHOME,*a0(PWAKE),L ; wake up to go home
MOVKM 1,*a0(PTIME),W
MOVKM M_GOHOME,*a8(OHFLAGS),W ; tell head to go home
BBP_nohomyet:
sleep 1
move *a8(OHFLAGS),a14 ; wait til head is home
btst B_GOHOME,a14
jrnz BBP_nohomyet
CLRM *a8(OHFLAGS),W
BBP_nohiyet:
move *a9(OYVEL),a14,L ; wait til body reaches peak height
jrnn BBP_peak
sloop 1,BBP_nohiyet
BBP_peak:
move *a8(OPLINK),a0,L ; BUG HEAD PROC
CLRM *a8(OPLINK),L
calla KILL ; KILL HEAD PROC
SETF 4,0,0 ;FIELD 0 IS 4 BITS
move *a8(OPARTS),a0,L
MOVK M_WRNONZ,A14 ;DMAWNZ
MOVE A14,*A8(OCTRL),0
MOVE A14,*A0(OCTRL),0
SETF 16,1,0 ;WORD SIGN EXTEND
MOVI LONG_SCREAM_ANIM,A1
MOVE *A8(OFLAGS),A14,W
BTST B_ANIM,A14
JRNZ BBP_scrm2
CALLA STRT_ANIM ; if not currently animating
jruc BBP_scrm1
BBP_scrm2:
move a1,*a8(AnimScr),L ; interrupt current anim
move a1,*a8(AnimFrm),L
MOVKB 1,*a8(AnimSlp)
BBP_scrm1:
calla PSTOP ; STOP HEAD
sleep 120
SOUND1 SND_DEATH_SCREAM
movim 2400h,*a8(OYACCEL),W ; start head falling
sleep 120
SOUND1 SND_BUG_FINALE
sleep 150
CLRM @SCROLL_FLAG,L ; signal scroller to end wave
BBP_endless: ; wave end will kill process
sloop 80,BBP_endless
**************************************************************************
* *
* BUG_HEAD_INTRO_PROC - INTRODUCE DA HEAD *
* *
**************************************************************************
BUG_HEAD_INTRO_PROC
MOVE @BUG_HEAD_OBJ,A8,L
JAZ SUCIDE
MOVK M_RANDOM,A14
MOVE A14,*A8(OHFLAGS),W
SLEEP 240
MOVK M_GOHOME,A14
MOVE A14,*A8(OHFLAGS),W
DIE
**************************************************************************
* *
* BUG_HEAD_ATTACK_PROC - MAKE HEAD ATTACK WITHIN A Z RANGE *
* *
* PASS: *
* A9 = RELATIVE UNIVERSE Z WHEN ATTACK STARTS *
* A10 = RELATIVE ZBASE WHEN ATTACK STOPS *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
BUG_HEAD_ATTACK_PROC
MOVE @ZREL_OFF,A14,L
SRA ZFRAC,A14
ADD A14,A9
ADD A14,A10
BHAP_START_WAIT
SLEEP 1
MOVE @BUG_HEAD_OBJ,A8,L
JAZ SUCIDE
MOVE *A8(OZVAL),A14,L
CMP A9,A14
JRGT BHAP_START_WAIT ;BR=NOT READY TO START
; JRUC BHAP_RANDOM
BHAP_LUPE
MOVE @BUG_HEAD_OBJ,A8,L
JAZ SUCIDE
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHAP_BITE_WAIT ;BR=BITING
BTST B_DAMAGE,A14
JRNZ BHAP_DAM_WAIT ;BR=HEAD DAMAGE
MOVK M_ATTACK,A14 ;ATTACK
MOVE A14,*A8(OHFLAGS),W
MOVK B_ATTACK,A9 ;WAIT FOR ATTACK DONE
JSRP WAIT_HFLAGS
JRZ BHAP_HOME ;BR=END THE ATTACK
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHAP_BITE_WAIT ;BR=BITING
BTST B_DAMAGE,A14
JRNZ BHAP_DAM_WAIT ;BR=HEAD DAMAGE
MOVK B_GOHOME,A9 ;WAIT FOR GO HOME
JSRP WAIT_HFLAGS
JRZ BHAP_HOME ;BR=END THE ATTACK
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHAP_BITE_WAIT ;BR=BITING
; BTST B_DAMAGE,A14
; JRNZ BHAP_DAM_WAIT ;BR=HEAD DAMAGE
BHAP_RANDOM
MOVK M_RANDOM,A14 ;MOVE RANDOMLY
MOVE A14,*A8(OHFLAGS),W
MOVE *A8(OAMINDELAY),A1,W
MOVE @ATTACK_WAIT,a0,W
inc a0
cmp a0,a1 ; if VAR is less than min,
jrge BHAP_norand ; just save min in a11
CALLA RANGERND
BHAP_norand:
MOVE A0,A11
BHAP_NAP
SLEEP 1
MOVE @BUG_HEAD_OBJ,A8,L
JAZ SUCIDE
MOVE @ZBASE,A14,L
CMP A10,A14
JRLT BHAP_HOME ;BR=END THE ATTACK
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHAP_BITE_WAIT ;BR=BITING
DEC A11
JRNZ BHAP_NAP ;BR=STILL MOVE RANDOM
JRUC BHAP_LUPE
BHAP_DAM_WAIT
MOVK B_DAMAGE,A9 ;WAIT FOR DAMAGE OVER
JSRP WAIT_HFLAGS
JRZ BHAP_HOME ;BR=END THE ATTACK
MOVK B_GOHOME,A9 ;WAIT FOR GO HOME
JSRP WAIT_HFLAGS
JRZ BHAP_HOME ;BR=END THE ATTACK
MOVI 60,A11 ;SLEEP TIME FOR RANDOM
JRUC BHAP_NAP
BHAP_BITE_WAIT
MOVK B_BITE,A9 ;WAIT FOR BITE OVER
JSRP WAIT_HFLAGS
JRZ BHAP_HOME ;BR=END THE ATTACK
MOVK B_GOHOME,A9 ;WAIT FOR GO HOME
JSRP WAIT_HFLAGS
JRZ BHAP_HOME ;BR=END THE ATTACK
MOVI 90,A11 ;SLEEP TIME FOR RANDOM
JRUC BHAP_NAP
BHAP_HOME
MOVE *A8(OHFLAGS),A14,W
ANDI M_HOME|M_GOHOME|M_HIT|M_BITE,A14
JRNZ BHAP_DONE ;BR=WE'RE HOME OR GOIN'
MOVK M_GOHOME,A14 ;NOW WE'RE GOING HOME
MOVE A14,*A8(OHFLAGS),W
BHAP_DONE
DIE
**************************************************************************
* *
* BUG_START_WALK_PROC - START LEG ANIMATIONS *
* *
**************************************************************************
BUG_START_WALK_PROC
MOVK LEG_PARTS,A2
; MOVI WALK_START_DELAY_TABLE,A3
MOVI WALK_START_OFFSET_TABLE,A3
BSWP_LUPE
MOVE A2,A1
CALLA FINDPART
; MOVI BUG_LEG_ANIM,A1
; CALLA STRTANIM
;
; MOVE *A3+,A14,W
; MOVB A14,*A0(AnimSlp)
MOVE *A3+,A1,L ;GET STARTING FRAME
SRL 1,A1 ;SHIFT OUT FLAG
GETST A4 ;SAVE CARRY
SLL 1,A1
MOVI BUG_LEG_ANIM,A14
CALLA STRTANIM_OFF
BTST 30,A4 ;CARRY
JRZ BSWP_NEXT ;BR=LEAVE LEG ALONE
MOVE A2,A1
INC A1 ;2ND LEG HALF
CALLA FINDPART
.if DEBUG
JRZ $
.endif
CALLA OBJOFF ;TURN 2ND LEG HALF OFF
BSWP_NEXT
ADDK 2,A2
CMPK 16,A2
JRLE BSWP_LUPE ;BR=STILL MORE LEGS
DIE
WALK_START_DELAY_TABLE
.WORD 0,30,30,0,15,45
WALK_START_OFFSET_TABLE
.LONG BUG_LEG_ANIM, BUG_LEG_UP_100+1, BUG_LEG_UP_100+1, BUG_LEG_ANIM
.LONG BUG_LEG_UP_50+1, BUG_LEG_DOWN_50
**************************************************************************
* *
* WAIT_HFLAGS_Z - FOR A HFLAG TO CHANGE OR ZBASE EXCEEDED *
* *
* PASS: *
* A9 = FLAG TO WAIT FOR *
* A10 = ZBASE TO CHECK *
* RETURN: *
* Z SET IF ZBASE EXCEEDED, CLR OTHERWISE *
* *
**************************************************************************
WAIT_HFLAGS
MOVE *A8(OHFLAGS),A11,W
WH_WAIT
SLEEP 1
MOVE @BUG_HEAD_OBJ,A8,L
JAZ SUCIDE
MOVE @ZBASE,A14,L
CMP A10,A14
JRGT WH_CHECK_FLAG ;BR=ZBASE OKAY
CLR A14 ;FLAG ZBASE EXCEEDED
RETP
WH_CHECK_FLAG
MOVE *A8(OHFLAGS),A14,W
XOR A11,A14
BTST A9,A14
JRZ WH_WAIT ;BR=NO FLAG CHANGE
RETP
**************************************************************************
* *
* BUG_ON - TURN BUG ON EXCEPT SHADOWS *
* *
* PASS: *
* A8 = HEAD OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
BUG_ON
PUSH A8
BO_LUPE
MOVE *A8(OFLAGS),A14,W
BTST B_SHAD,A14
JRNZ BO_NEXT ;BR=NO SHADOWS ALLOWED
CALLA OBJ_ON_WNZ
BO_NEXT
MOVE *A8(OPARTS),A8,L
JRNZ BO_LUPE
PULLQ A8
RETS
**************************************************************************
* *
* BUG_CONST - TURN BUG CONSTANT EXCEPT SHADOWS *
* *
* PASS: *
* A8 = HEAD OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
BUG_CONST
PUSH A8
BC_LUPE
MOVE *A8(OFLAGS),A14,W
BTST B_SHAD,A14
JRNZ BC_NEXT ;BR=NO SHADOWS ALLOWED
CALLA OBJ_CONST
BC_NEXT
MOVE *A8(OPARTS),A8,L
JRNZ BC_LUPE
PULLQ A8
RETS
**************************************************************************
* *
* BUG_HEAD_PROC - CONTROL DA HEAD *
* *
**************************************************************************
BUG_HEAD_PROC
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A8(OHFLAGS),A11,W
BTST B_PULL,A11
JRNZ BHP_NAP ;BR=HEAD PULLED
BTST B_BITE,A11
JRZ BHP_NEXT ;BR=NOT BITING
MOVE *A8(OZVAL),A14,L
MOVE *A0(OZVAL),A1,L
SUBI HEAD_ZOFF,A1
CMP A14,A1
JRGE BHP_ZVEL ;BR=HEAD IN FRONT OF BODY
CALLA SET_ANIPZU
CALLA SORT_OBJ
ORI M_SORTED,A11
MOVE A11,*A8(OHFLAGS),W ;FLAG SORT FOR NECK
JRUC BHP_ZVEL
BHP_NEXT
BTST B_HOME,A11
JRZ BHP_NEXT0 ;BR=DON'T GO HOME
.if DEBUG
BTST B_DAMAGE,A11
JRNZ $
.endif
BHP_HOME
.if DEBUG
MOVE *A8(OHFLAGS),A11,W
BTST B_DAMAGE,A11
JRNZ $
.endif
MOVE *A0(OXVAL),A1,L ;SET HOME
MOVE *A0(OYVAL),A2,L
MOVE *A0(OZVAL),A3,L
SUBI HEAD_ZOFF,A3
CALLA SET_ANIPU
JRUC BHP_ZVEL
BHP_NEXT0
BTST B_GOHOME,A11
JRZ BHP_NEXT1 ;BR=DON'T GO HOME
.if DEBUG
BTST B_DAMAGE,A11
JRNZ $
.endif
BHP_GOHOME
.if DEBUG
MOVE *A8(OHFLAGS),A11,W
BTST B_DAMAGE,A11
JRNZ $
.endif
MOVI 15,A9 ;GO IN THIS TIME
BHP_GOHOME_LUPE
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
; JRNZ BHP_GH_BITE ;BR=WE BITE
JRNZ BHP_BITE_NAP ;BR=WE BITE
.if DEBUG
MOVE *A8(OHFLAGS),A11,W
BTST B_DAMAGE,A11
JRNZ $
.endif
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OXVAL),A1,L ;DESTINATION
MOVE *A0(OYVAL),A3,L
MOVE *A0(OZVAL),A5,L
SUBI HEAD_ZOFF+0100H,A5
MOVE A5,A10
MOVE *A8(OXVAL),A2,L ;CURRENT POSITION
MOVE *A8(OYVAL),A4,L
MOVE *A8(OZVAL),A6,L
* A1 = PNT. B X POSITION (32 BITS) *
* A2 = PNT. A X POSITION (32 BITS) *
* A3 = PNT. B Y POSITION (32 BITS) *
* A4 = PNT. A Y POSITION (32 BITS) *
* A5 = PNT. B Z POSITION (32 BITS) *
* A6 = PNT. A Z POSITION (32 BITS) *
* A7 = DURATION(# OF TICKS TO GET FROM A TO B) *
MOVE A9,A7
; CALLA SLINEVEL_LOAD_3D
CALLA SLINEVEL_3D
* A1 = X VEL (32 BITS) *
* A3 = Y VEL (32 BITS) *
* A5 = Z VEL (32 BITS) *
MOVE A1,*A8(OXVEL),L
MOVE A3,*A8(OYVEL),L
MOVE *A0(OZVEL),A1,L
ADD A1,A10
ADD A5,A6
CMP A10,A6
JRLT BHP_GH_NAP ;BR=NO PAST BODY
MOVE A1,A5
BHP_GH_NAP
MOVE A5,*A8(OZVEL),L
SLEEP 1
DEC A9
JRNZ BHP_GOHOME_LUPE
; MOVE @WAVEIRQS,A10,L
; SLEEP 1
; MOVE @WAVEIRQS,A14,L
; SUB A10,A14
;
; SUB A14,A9
; CMPI 0,A9
; JRGT BHP_GOHOME_LUPE ;BR=NOT DONE YET
CLR A14 ;STOP EVERYTHING
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
MOVE A14,*A8(OHEADXACCEL),L
MOVE A14,*A8(OHEADYACCEL),L
MOVE *A8(OHFLAGS),A14,W ;SET FLAGS
ANDNI M_GOHOME,A14
ORI M_HOME,A14
MOVE A14,*A8(OHFLAGS),W
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
JRUC BHP_HOME
BHP_NEXT1
BTST B_RANDOM,A11
JRZ BHP_NEXT2 ;BR=DON'T MOVE RANDOMLY
BHP_RANDOM
MOVE *A8(OHEADXACCEL),A14,L
JRZ BHP_RESTART ;BR=RESTART RANDOM
CALLA RANDOM_HEAD_MOVE ;DO THE RANDOM THING
JRUC BHP_UPDATEZ
BHP_RESTART
MOVI -010000H,A14 ;MOVE HEAD UP
MOVE A14,*A8(OYVEL),L
MOVE *A0(OYVAL),A14,L
MOVE *A8(OYVAL),A1,L
SUB A1,A14
CMPI 0150000H,A14
JRLT BHP_UPDATEZ ;BR=NOT FAR ENOUGH UP
PUSH A0
CALLA RANDOM_HEAD_MOVE_INIT
PULLQ A0
JRUC BHP_UPDATEZ
BHP_NEXT2
BTST B_ATTACK,A11
JRZ BHP_NEXT3 ;BR=DON'T ATTACK
MOVE *A0(OZVAL),A1,L
MOVE A1,A2
MOVE @ZBASE,A14,L
SUB A14,A2
CMPI BODY_ZMIN_ATTACK,A2
JRLT BHP_RANDOM ;BR=TOO CLOSE
CMPI BODY_ZMAX_ATTACK,A2
JRGT BHP_RANDOM ;BR=TOO FAR
; MOVE *A8(OATTACKTIME),A2,L
; MOVE @WAVEIRQS,A14,L
; SUB A2,A14
; move @ATTACK_WAIT,a2
; CMP a2,A14
; JRLE BHP_RANDOM ;BR=TOO EARLY
MOVE *A8(OHFLAGS),A14,W
BTST B_DAMAGE,A14
JRNZ BHP_DAMAGE ;BR=WE HAVE DAMAGE
BTST B_GOHOME,A14
JRNZ BHP_A_GOHOME ;BR=I WANT TO GO HOME
; MOVE *A0(OZVAL),A1,L ;DO Z FOR THE HELL OF IT
SUBI HEAD_ZOFF,A1
CALLA SET_ANIPZU
CLR A14
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
MOVI 30,A9 ;ATTACK IN THIS TIME
CALLA GET_PLAYER_WORLDX_EXTENTS ;FIND ATTACK X RANGE
CALLA RANGERND
MOVE A0,A10 ;WORLD X ATTACK
MOVI -0100000H,A11 ;UNIVERSE Y ATTACK
SOUND1 SND_NECK_STRETCH_ATTACK
BHP_HIT_LUPE
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE @XBASE,A1,L
ADD A10,A1 ;X DESTINATION
MOVE A11,A3 ;Y DESTINATION
MOVI ZMAX_REAL,A5
MOVE @ZBASE,A14,L
ADD A14,A5 ;Z DESTINATION
MOVE *A8(OXVAL),A2,L ;CURRENT POSITION
MOVE *A8(OYVAL),A4,L
MOVE *A8(OZVAL),A6,L
* A1 = PNT. B X POSITION (32 BITS) *
* A2 = PNT. A X POSITION (32 BITS) *
* A3 = PNT. B Y POSITION (32 BITS) *
* A4 = PNT. A Y POSITION (32 BITS) *
* A5 = PNT. B Z POSITION (32 BITS) *
* A6 = PNT. A Z POSITION (32 BITS) *
* A7 = DURATION(# OF TICKS TO GET FROM A TO B) *
MOVE A9,A7
; CALLA SLINEVEL_LOAD_3D
CALLA SLINEVEL_3D
* A1 = X VEL (32 BITS) *
* A3 = Y VEL (32 BITS) *
* A5 = Z VEL (32 BITS) *
MOVE A1,*A8(OXVEL),L
MOVE A3,*A8(OYVEL),L
MOVE *A0(OZVEL),A14,L
JRP BHP_SET_ZVEL ;BR=NOT GOING FORWARD
CMP A14,A5
JRLE BHP_SET_ZVEL ;BR=GOIN' FAST ENOUGH
MOVE A14,A5
BHP_SET_ZVEL
MOVE A5,*A8(OZVEL),L
SLEEP 1
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
; JRNZ BHP_A_BITE ;BR=WE BITE
JRNZ BHP_BITE_NAP ;BR=WE BITE
BTST B_DAMAGE,A14
JRNZ BHP_DAMAGE ;BR=WE HAVE DAMAGE
BTST B_GOHOME,A14
JRNZ BHP_A_GOHOME ;BR=I WANT TO GO HOME
move *a8(OFLAGS),a14 ; no hit if he's offscreen
btst B_OFSCRN,a14
jrnz BHP_A_GOHOME
DEC A9
JRNZ BHP_HIT_LUPE ;BR=NOT DONE YET
CLR A14
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
; MOVE *A8(OFLAGS),A14,W
; BTST B_ANIM,A14
; JRNZ BHP_A_NAP
;
; MOVI HEAD_BITE_ANIM,A1
; CALLA STRT_ANIM
MOVI [2,0],A5
ALLPLYR PLAYER_HIT ;HIT 'EM ALL
move @ATTACK_WAIT,a14 ; lower ticks to wait between attacks
subk 2,a14 ; adjust each time bug butts plyr
jrn BHP0
move a14,@ATTACK_WAIT
BHP0:
;BHP_A_NAP
MOVE *A8(OHFLAGS),A14,W
ORI M_HIT,A14
MOVE A14,*A8(OHFLAGS),W
SOUND1 SND_NECK_STRETCH_ATTACK_HIT
MOVI 07979H,A4
CALLR SET_OCONST
MOVK 3,A9
BHP_HIT_FLASH_LUPE
CALLR BUG_CONST
SLEEP 1
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHP_BITE_NAP ;BR=WE BITE
SLEEP 1
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHP_BITE_NAP ;BR=WE BITE
SLEEP 1
CALLR BUG_ON
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHP_BITE_NAP ;BR=WE BITE
SLEEP 1
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHP_BITE_NAP ;BR=WE BITE
SLEEP 1
MOVE *A8(OHFLAGS),A14,W
BTST B_BITE,A14
JRNZ BHP_BITE_NAP ;BR=WE BITE
DSJ A9,BHP_HIT_FLASH_LUPE
MOVI 0101H,A4
CALLR SET_OCONST
BHP_A_GOHOME
MOVE *A8(OHFLAGS),A14,W ;SET FLAGS
ANDNI M_ATTACK|M_HIT,A14
ORI M_GOHOME,A14
MOVE A14,*A8(OHFLAGS),W
JRUC BHP_GOHOME
BHP_A_BITE
MOVE *A8(OHFLAGS),A14,W ;SET FLAGS
ANDNI M_ATTACK|M_HIT,A14
MOVE A14,*A8(OHFLAGS),W
JRUC BHP_BITE_NAP
BHP_NEXT3
BTST B_DAMAGE,A11
JRZ BHP_NEXT4 ;BR=DON'T DAMAGE
BHP_DAMAGE
CLR A14 ;STOP!
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
MOVE *A8(OHFLAGS),A14,W ;SET FLAGS
ANDNI M_DAMAGE,A14
ORI M_GOHOME,A14
MOVE A14,*A8(OHFLAGS),W
JRUC BHP_GOHOME
MOVI 15,A9 ;DAMAGE IN THIS TIME
BHP_DAMAGE_LUPE
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OZVAL),A5,L
SUBI HEAD_ZOFF+0100H,A5 ;Z DESTINATION
MOVE *A8(OXVAL),A2,L ;CURRENT POSITION
MOVE A2,A1
MOVE *A8(OYVAL),A4,L
MOVE A4,A3
MOVE *A8(OZVAL),A6,L
* A1 = PNT. B X POSITION (32 BITS) *
* A2 = PNT. A X POSITION (32 BITS) *
* A3 = PNT. B Y POSITION (32 BITS) *
* A4 = PNT. A Y POSITION (32 BITS) *
* A5 = PNT. B Z POSITION (32 BITS) *
* A6 = PNT. A Z POSITION (32 BITS) *
* A7 = DURATION(# OF TICKS TO GET FROM A TO B) *
MOVE A9,A7
CALLA SLINEVEL_LOAD_3D
; MOVE *A0(OZVEL),A1,L
; MOVE *A8(OZVEL),A14,L
; CMP A1,A14
; JRLE BHP_D_NAP
; MOVE A1,*A8(OZVEL),L
;BHP_D_NAP
SLEEP 1
DEC A9
JRNZ BHP_DAMAGE_LUPE ;BR=NOT DONE YET
MOVE *A8(OHFLAGS),A14,W ;SET FLAGS
ANDNI M_DAMAGE,A14
ORI M_GOHOME,A14
MOVE A14,*A8(OHFLAGS),W
JRUC BHP_GOHOME
BHP_NEXT4
JRUC BHP_NAP
BHP_BITE_NAP
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OZVEL),*A8(OZVEL),L ;USE SAME VELOCITY
JRUC BHP_NAP
BHP_UPDATEZ
MOVE *A0(OZVAL),A1,L ;SET Z
SUBI HEAD_ZOFF,A1
; MOVE A1,*A8(OZVAL),L
CALLA SET_ANIPZU
BHP_ZVEL
MOVE *A0(OZVEL),*A8(OZVEL),L ;USE SAME VELOCITY
BHP_NAP
SLEEP 1
JRUC BUG_HEAD_PROC
**************************************************************************
* *
* RANDOM_HEAD_MOVE_INIT *
* *
**************************************************************************
RANDOM_HEAD_MOVE_INIT
MOVI 0800H,A1
MOVI -014000H,A2
MOVI 512,A0
CALLA RANDPER
JRC RHMI_SET_X
NEG A1
NEG A2
RHMI_SET_X
MOVE A1,*A8(OHEADXACCEL),L
MOVE A2,*A8(OXVEL),L
MOVI 0800H,A1
MOVI -010000H,A2
MOVI 512,A0
CALLA RANDPER
JRC RHMI_SET_Y
NEG A1
NEG A2
RHMI_SET_Y
MOVE A1,*A8(OHEADYACCEL),L
MOVE A2,*A8(OYVEL),L
RETS
**************************************************************************
* *
* RANDOM_HEAD_MOVE *
* *
**************************************************************************
RANDOM_HEAD_MOVE
move *A8(OHEADXACCEL),A14,W
JRZ RHM_DO_Y ;BR=DON'T HOVER IN X
move *A8(OXVEL),A3,L
add A14,A3
move A3,*A8(OXVEL),L
abs A3
CMPI 014000H,A3
jrlt RHM_DO_Y ;BR=UNDER THE LIMIT
NEGM *A8(OHEADXACCEL),W ;CHANGE DIRECTION
RHM_DO_Y
move *A8(OHEADYACCEL),A14,W
JRZ RHM_DONE ;BR=DON'T HOVER IN Y
move *A8(OYVEL),A3,L
add A14,A3
move A3,*A8(OYVEL),L
abs A3
CMPI 010000H,A3
jrlt RHM_DONE ;BR=UNDER THE LIMIT
NEGM *A8(OHEADYACCEL),W ;CHANGE DIRECTION
RHM_DONE
RETS
**************************************************************************
* *
* BUG_NECK_PROC *
* *
**************************************************************************
BUG_NECK_PROC
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OHFLAGS),A6,W
BTST B_PULL,A6
JRNZ BNP_NAP
MOVK NUM_NECK_SEGS,A7
MOVE @BUG_BODY_OBJ,A10,L
.if DEBUG
JRZ $
.endif
MOVI BUG_NECK_OBJ_TABLE,A11
BNP_LUPE
MOVE *A11+,A9,L
MOVE *A9,A8,L
.if DEBUG
JRZ $
.endif
MOVK 020H,A14
CMPK NUM_NECK_SEGS/2+1,A7
JRLE BNP_GET
MOVE A9,A14
CMPI BUG_NECK_OBJS+((NUM_NECK_SEGS/2) << 5),A9
JRLE BNP_FIRST_HALF
SUBI BUG_NECK_OBJS+((NUM_NECK_SEGS/2) << 5),A14
JRUC BNP_GET
BNP_FIRST_HALF
SUBI BUG_HEAD_OBJ,A14
BNP_GET
MOVE A9,A0
SUB A14,A0
MOVE *A0,A0,L
.if DEBUG
JRZ $
.endif
MOVE A9,A2
ADD A14,A2
MOVE *A2,A2,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OZVAL),A1,L
MOVE *A2(OZVAL),A3,L
SUB A1,A3
SRA 1,A3
ADD A3,A1
; MOVE A1,*A8(OZVAL),L
CALLA SET_ANIPZU
MOVE *A10(OZVEL),*A8(OZVEL),L
BTST B_SORTED,A6
JRZ BNP_DSJ ;BR=DON'T SORT
CALLA SORT_OBJ
BNP_DSJ
DSJ A7,BNP_LUPE
MOVK NUM_NECK_SEGS,A7
MOVI BUG_NECK_OBJS,A9
CLR B0
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OHFLAGS),A14,W
BTST B_HOME,A14
JRZ BNP_LUPE2
MOVK 1,B0
MOVE @BUG_BODY_OBJ,A14,L
.if DEBUG
JRZ $
.endif
MOVE *A14(OXVAL),A10,L
MOVE *A14(OYVAL),A11,L
BNP_LUPE2
MOVE *A9,A8,L
.if DEBUG
JRZ $
.endif
MOVE A9,A0
SUBK 020H,A0
MOVE *A0,A0,L
.if DEBUG
JRZ $
.endif
MOVE A9,A1
ADDK 020H,A1
MOVE *A1,A1,L
.if DEBUG
JRZ $
.endif
ADDK 020H,A9
MOVE B0,B0
JRZ BNP_GET_TIME
; MOVE A10,*A8(OXVAL),L
; MOVE A11,*A8(OYVAL),L
MOVE A10,A1
MOVE A11,A2
MOVE *A8(OZVAL),A3,L
CALLA SET_ANIPU
CLR A2
JRUC BNP_NEXT
BNP_GET_TIME
MOVE *A8(OUPDATETIME),A2,L
MOVE A2,A3
SEXT A3,W
SRA 16,A2
JRNZ BNP_COUNT
MOVE A3,B14
MOVE *A0(OYVAL),A2,L
MOVE *A1(OYVAL),A3,L
MOVE *A0(OXVAL),A5,L
MOVE *A1(OXVAL),A6,L
MOVE A8,A14
ADDI ONECKX1+020H,A14
MMTM A14,A2,A3,A5,A6
MOVE B14,A3
CLR A2
BNP_COUNT
INC A2
CMP A3,A2
JRLT BNP_NEXT
MOVE A8,A14
ADDI ONECKY0,A14
MMFM A14,A2,A3,A5,A6
BNP_UPDATE_XY
SUB A2,A3
SRA 1,A3
ADD A3,A2
; MOVE A2,*A8(OYVAL),L
SUB A5,A6
SRA 1,A6
ADD A6,A5
; MOVE A5,*A8(OXVAL),L
MOVE A5,A1
MOVE *A8(OZVAL),A3,L
CALLA SET_ANIPU
CLR A2
BNP_NEXT
MOVE A2,*A8(OUPDATECOUNT),W
DSJ A7,BNP_LUPE2
BNP_NAP
SLEEP 1
JRUC BUG_NECK_PROC
BUG_NECK_OBJ_TABLE
.LONG BUG_NECK_OBJS+060H,BUG_NECK_OBJS+020H,BUG_NECK_OBJS+0A0H
.LONG BUG_NECK_OBJS,BUG_NECK_OBJS+040H,BUG_NECK_OBJS+080H
.LONG BUG_NECK_OBJS+0C0H
**************************************************************************
* *
* A_NECK *
* *
**************************************************************************
A_NECK
; CALLA SORT_OBJ
MOVE *A8(OBFLAGS),A9,W
BTST B_NOMOVEZ,A9
JRNZ AN_DONE ;BR=DON'T MOVE IN Z
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OHFLAGS),A14,W
BTST B_BITE,A14
JRZ AN_GO ;BR=WE'RE BITING
AN_BITE
MOVE @ZSCROLL,A14,L
SRA ZFRAC,A14 ;TO LO-RES
MOVE A14,*A8(OLASTZSCROLL),L
MOVE A14,*A8(OZVEL),L
RETS
AN_GO
; MOVE @XSCROLL,A14,L
; MOVE A14,*A8(OXVEL),L
MOVE *A8(OLASTZSCROLL),A2,L
MOVE *A8(OZVEL),A0,L
SUB A2,A0
MOVE @MAX_BUG_VEL,A14
CMP A14,A0
JRGT AN_ACCEL ;BR=ACCELERATE FORWARD
; JREQ AN_CHECK
MOVE A14,A0 ;MAXIMUM FORWARD VELOCITY
AN_CHECK
MOVE *A8(OZVAL),A1,L
MOVE *A8(OZFARTHEST),A14,L
CMP A14,A1
JRLT AN_CHECK_HIT ;BR=NOT AT FARTHEST Z
MOVE A0,A0
JRN AN_SET ;BR=GOING FORWARD
CLR A0 ;STOP GOING BACKWARD
JRUC AN_SET
AN_CHECK_HIT
MOVE @ZBASE,A14,L
SUB A14,A1
move @ZCLOSEST_WORLD,a14,L
CMP a14,A1
JRGT AN_SET ;BR=NOT CLOSE ENOUGH YET
MOVE A0,A0
JRP AN_DONE ;BR=GOING BACKWARD
BTST B_NOBITE,A9
JRZ AN_START_BITE ;BR=WE BITE
ADDI ROCKET_HIT_VEL,A0 ;PUSH BACK ALOT
JRUC AN_SET
AN_START_BITE
MOVE @BUG_HEAD_OBJ,A0,L
.if DEBUG
JRZ $
.endif
; MOVE *A0(OBFLAGS),A14,W
; BTST B_HIT,A14
; JRNZ $
MOVI M_BITE,A14
MOVE A14,*A0(OHFLAGS),W
CLR A14
MOVE A14,*A0(OXVEL),L
MOVE A14,*A0(OYVEL),L
MOVE A14,*A0(OZVEL),L
MOVI HEAD_BITE_ANIM,A1
CALLA STRTANIM
JRUC AN_BITE
; MOVI [1,0],A5
; ALLPLYR PLAYER_HIT ;HIT 'EM ALL
;
; ADDI ROCKET_HIT_VEL*2,A0
AN_SET
MOVE @ZSCROLL,A2,L
SRA ZFRAC,A2 ;TO LO-RES
MOVE A2,*A8(OLASTZSCROLL),L
ADD A2,A0 ;TRANSLATE TO UNIVERSE
MOVE A0,*A8(OZVEL),L
AN_DONE
RETS
AN_ACCEL
MOVE A0,A0
JRNN AN_CHARGE ;BR=NOT RECOVERING FROM A PUSH
MOVE *A8(ORECOVERVEL),A14,W
SUB A14,A0 ;ACCELERATE FORWARD
JRUC AN_CHECK
AN_CHARGE
MOVE *A8(OCHARGEVEL),A14,W
SUB A14,A0 ;ACCELERATE FORWARD
JRUC AN_CHECK
;**************************************************************************
;* *
;* A_SET_LEGS_SLEEP *
;* *
;**************************************************************************
;
;A_SET_LEGS_SLEEP
;
; RETS
;
; CALLA GET_HEAD_PART_A0
; MOVE *A0(OZVEL),A3,L
; ABS A3
; SRL 4,A3
;; CMPK 48,A3
; CMPK 26,A3
; JRLT ASLS_GO
; MOVK 1,A3
; JRUC ASLS_SET
;ASLS_GO
; SLL 3,A3
; ADDI LEGS_SLEEP_TABLE,A3
; MOVB *A3,A3
;ASLS_SET
; MOVI LEG_PARTS,A1
; CALLA FINDPART
; MOVB A3,*A0(AnimSlp)
; RETS
;
;A_SET_LEGS_SLEEP_R
; CALLR A_SET_LEGS_SLEEP
; CALLA GETAFARG_LONG
; JUMP A0
;
;LEGS_SLEEP_TABLE
; .BYTE 10,10,9,9
; .BYTE 9,9,9,8
; .BYTE 8,8,8,7
; .BYTE 7,7,6,6
;
; .BYTE 5,4,4,3
; .BYTE 3,3,2,2
; .BYTE 2,2,1,1
; .BYTE 1,1,1,1
;
; .BYTE 1,1,1,1
; .BYTE 1,1,1,1
; .BYTE 1,1,1,1
; .BYTE 1,1,1,1
;
; .LONG 1
**************************************************************************
* *
* A_CHECK_LEGS_STOP - CHECK IF LEG SHOULD STOP MOVING *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_CHECK_LEGS_STOP
CALLA GET_HEAD_PART_A0
MOVE *A0(OBFLAGS),A14,W
BTST B_STOPLEGS,A14
JANZ PULL_ANIM ;BR=STOP DA LEG
RETS
**************************************************************************
* *
* A_LEG_SOUND - MAKE A RANDOM LEG SOUND *
* *
* PASS: *
* NUTIN' *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_LEG_SOUND
RANDENT LEGSND_TABLE,4,5,L
CALLA ONESND
; SOUND1 SND_LEG_1
RETS
**************************************************************************
* *
* BUG_SCREAM - RELEASE A BUG SCREAM *
* *
* PASS: *
* NUTIN' *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
BUG_SCREAM
RANDENT SCREAM_TABLE,6,5,L
CALLA ONESND
RETS
**************************************************************************
* *
* PUSH_BUG - PUSH BUG BACK *
* *
* PASS: *
* A1 = PUSH VELOCITY TABLE *
* RETURN: *
* Z SET IF PUSH ALLOWED, ELSE Z CLR IF NOT ALLOWED *
* *
**************************************************************************
PUSH_BUG
MOVE @CURPLYRS,A14,W ;GET NUMBER OF CURRENT PLAYERS
DEC A14
JRNN PUB_GET
CLR A14
PUB_GET
SLL 4,A14 ;TRANSLATE TO TABLE OFFSET
ADD A1,A14 ;OFFSET TABLE
MOVE *A14,A1,W ;GET PUSH VELOCITY
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OBFLAGS),A14,W
BTST B_NOPUSH,A14
JRNZ PUB_NOPUSH ;BR=NO PUSHING ALLOWED
MOVE *A0(OZVAL),A3,L
MOVE *A0(OZFARTHEST),A14,L
CMP A14,A3
JRGE PUB_DONE ;BR=NOT AT FARTHEST Z
MOVE *A0(OZVEL),A14,L
MOVE @ZSCROLL,A4,L
SRA ZFRAC,A4 ;TO LO-RES
SUB A4,A14 ;TRANSLATE TO WORLD
ADD A1,A14
MOVI MAX_REVERSE_BUG_VEL,A3
CMP A3,A14
JRLE PUB_SET ;BR=NOT AT MAXIMUM REVERSE
MOVE A3,A14 ;MAXIMUM REVERSE
PUB_SET
ADD A4,A14 ;TRANSLATE TO UNIVERSE
MOVE A14,*A0(OZVEL),L
PUB_DONE
SETZ
PUB_NOPUSH
RETS
GUN_HIT_VEL_TABLE
.WORD GUN_HIT_VEL, GUN_HIT_VEL/2, GUN_HIT_VEL/3
ROCKET_HIT_VEL_TABLE
.WORD ROCKET_HIT_VEL, ROCKET_HIT_VEL/2, ROCKET_HIT_VEL/3
**************************************************************************
* *
* BUG HEAD COLLISION VECTORS *
* *
**************************************************************************
BUG_HEAD_CVECT
WWL OID_PROCKET,~MASK_PLAYER,BUG_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,BUG_HEAD_EXPLOSION_COLL
WL 0,DUMCRETS
BUG_HEAD_EXPLOSION_COLL
MOVE *A8(OATE_ROCKET),A14,L
JRZ BEC_DONE ;BR=NO ROCKET COLLISION
CMP A0,A14
JRNE BEC_DONE ;BR=DIFFERENT EXPLOSION
MOVE *A0(RL_INTENDED_OBJ),A14,L ;DO WE HAVE THE RIGHT TARGET?
CMP A8,A14
JRNE BEC_DONE ;BR=NOPE. NOT THE RIGHT TARGET.
CLRM *A8(OATE_ROCKET),L ;HIT! READY FOR ANOTHER!
SOUND1 SND_ROCKET_HIT
CALLA GET_HEAD_PART
MOVE *A8(OHFLAGS),A14,W
BTST B_HIT,A14
JRNZ BHEC_DONE ;BR=WE'RE HITING DA PLAYERS
BTST B_BITE,A14
JRNZ BHEC_DONE ;BR=WE'RE BITING DA PLAYERS
BTST B_ATTACK,A14
JRZ BHEC_PUSH ;BR=NOT ATTACKING
BHEC_DAMAGE
MOVK M_DAMAGE,A14
MOVE A14,*A8(OHFLAGS),W ;FLAG HEAD DAMAGE
JRUC BHEC_SCREAM
BHEC_PUSH
move @ATTACK_WAIT,a14 ; delay attacks a bit
addk 8,a14
move a14,@ATTACK_WAIT
MOVI ROCKET_HIT_VEL_TABLE,A1
CALLR PUSH_BUG
JRNZ BHG_FLASH ;BR=NO PUSHING ALLOWED
BHEC_SCREAM
; MOVE *A8(OHFLAGS),A14,W
; BTST B_ATTACK,A14
; JRNZ BHEC_FLASH
MOVE *A8(OFLAGS),A14,W
BTST B_ANIM,A14
JRNZ BHEC_FLASH ;BR=WE'RE ALREADY ANIMATING
MOVI HEAD_SCREAM_ANIM,A1
CALLA STRT_ANIM
BHEC_FLASH
JRUC BHG_FLASH
BHEC_DONE
RETS
**************************************************************************
* *
* BUG HEAD GUN VECTORS *
* *
**************************************************************************
BUG_HEAD_GUNVECT
SOUND1 SND_GUN_HIT
CALLA GET_HEAD_PART
MOVE *A8(OHFLAGS),A14,W
BTST B_HIT,A14
JRNZ BHG_DONE ;BR=WE'RE HITING DA PLAYERS
BTST B_BITE,A14
JRNZ BHG_DONE ;BR=WE'RE BITING DA PLAYERS
BTST B_ATTACK,A14
JRZ BHG_PUSH ;BR=NOT ATTACKING
MOVE *A8(OLASTHITTIME),A1,L
MOVE @WAVEIRQS,A14,L
MOVE A14,*A8(OLASTHITTIME),L
SUB A1,A14
CMPI MIN_HEAD_HIT_TIME,A14
JRLT BHG_GO ;BR=UNDER MINIMUM TIME
CLR A14
MOVE A14,*A8(OHITS),L
JRUC BHG_FLASH
BHG_GO
MOVK PULL_HEAD_HITS,A0
calla CURPLYR_ADJ
move a0,a1
MOVI OHITS,A3
CALLA HIT_ENEMY
JRLT BHG_FLASH ;BR=DON'T PULL BACK DA HEAD
JRUC BHEC_DAMAGE ;PULL BACK DA HEAD
BHG_PUSH
MOVI GUN_HIT_VEL_TABLE,A1
CALLR PUSH_BUG
BHG_FLASH
CALLA UNIV_FLASH ;FLASH RIGHT HALF
MOVE *A8(OPARTS),A8,L
.if DEBUG
JRZ $
.endif
CALLA UNIV_FLASH ;FLASH LEFT HALF
BHG_DONE
RETS
**************************************************************************
* *
* BUG BODY COLLISION VECTORS *
* *
**************************************************************************
BUG_CVECT
WWL OID_PROCKET,~MASK_PLAYER,BUG_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,BUG_EXPLOSION_COLL
WWL OID_GRND,0FFFFH,BUG_GROUND_COLL
WL 0,DUMCRETS
BUG_GROUND_COLL
CLR A14
MOVE A14,*A8(OXVEL),L ;STOP IT!
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
MOVE A14,*A8(OYACCEL),W
MOVE *A8(OFLAGS),A14,W
ANDNI M_GCOLL,A14 ;TURN OFF COLLISION CHECK
MOVE A14,*A8(OFLAGS),W
JAUC SET_ONGRND
BUG_ROCKET_COLL
MOVE A0,*A8(OATE_ROCKET),L ;SAVE ROCKET OBJECT
RETS
BUG_EXPLOSION_COLL
MOVE *A8(OATE_ROCKET),A14,L
JRZ BEC_DONE ;BR=NO ROCKET COLLISION
CMP A0,A14
JRNE BEC_DONE ;BR=DIFFERENT EXPLOSION
MOVE *A0(RL_INTENDED_OBJ),A14,L ;DO WE HAVE THE RIGHT TARGET?
CMP A8,A14
JRNE BEC_DONE ;BR=NOPE. NOT THE RIGHT TARGET.
CLRM *A8(OATE_ROCKET),L ;HIT! READY FOR ANOTHER!
SOUND1 SND_ROCKET_HIT
CALLA GET_HEAD_PART_A0
MOVI ROCKET_HIT_VEL_TABLE,A1
CALLR PUSH_BUG
JRUC FLASH_BUG_PART
BEC_DONE
RETS
**************************************************************************
* *
* BUG GUN VECTORS *
* *
**************************************************************************
BUG_GUNVECT
SOUND1 SND_GUN_HIT
MOVI GUN_HIT_VEL_TABLE,A1
CALLR PUSH_BUG
JRUC FLASH_BUG_PART
**************************************************************************
* *
* FLASH_BUG_PART *
* *
**************************************************************************
FLASH_BUG_PART
CALLA UNIV_FLASH
MOVB *A8(OPARTID),A1
CMPK NECK_SEG,A1
JREQ FBP_DONE ;BR=DON'T FLASH NO OTHER HALF
ADDK 1,A1
BTST 0,A1
JRNZ FBP_GO ;FLASH 2ND HALF
SUBK 2,A1 ;FLASH 1ST HALF
FBP_GO
CALLA FINDPART
MOVE A0,A8
CALLA UNIV_FLASH
FBP_DONE
RETS
**************************************************************************
* *
* A_SPRING_BODY - MOVE BUG BODY FOR LEAP *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = SPRING Y OFFSET IN PIXELS *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_SPRING_BODY
CALLA GETAFARG_WORD
SLL 15,A0 ;TRANSLATE TO WORLD
MOVE @BUG_BODY_OBJ,A8,L
.if DEBUG
JRZ $
.endif
MOVE *A8(OZVAL),A1,L
MOVE *A8(OYVAL),A2,L
ADD A0,A2 ;OFFSET Y POSITION
MOVE *A8(OXVAL),A3,L
CALLA REPOS_OBJ
RETS
**************************************************************************
* *
* A_FLAG_LEAP - TELL BUG BODY WE CAN TAKE OFF NOW *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_FLAG_LEAP
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OFLAGS),A14,W
ORI M_GCOLL,A14 ;FLAG
MOVE A14,*A0(OFLAGS),W
RETS
**************************************************************************
* *
* A_END_BITE - END BITE SEQUENCE *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_END_BITE
MOVI 0101H,A4
CALLR SET_OCONST
; MOVE *A8(OHFLAGS),A14,W
; ANDNI M_BITE,A14
MOVK M_GOHOME,A14 ;GO HOME
MOVE A14,*A8(OHFLAGS),W
MOVE @BUG_BODY_OBJ,A0,L
.if DEBUG
JRZ $
.endif
MOVE *A0(OZVEL),A14,L
ADDI ROCKET_HIT_VEL,A14 ;PUSH BACK ALOT
MOVE A14,*A0(OZVEL),L
JAUC PULL_ANIM
**************************************************************************
* *
* A_ALLPLYR_HIT - HIT ALL DA PLAYERS *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,L = [INT,FRAC] ENERGY POINTS TO SUBTRACT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
;A_ALLPLYR_HIT
; CALLA GETAFARG_LONG
; MOVE A0,A5
; ALLPLYR PLAYER_HIT ;HIT 'EM ALL
; RETS
**************************************************************************
* *
* A_BITE - DO THE BITE THANG *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_BITE
MOVI 07979H,A4
CALLR SET_OCONST
MOVK 6,A14 ;NUMBER OF FLASH CYCLES
MOVB A14,*A8(AnimLoop)
move *a8(OFLAGS),a14 ; no hit if he's offscreen
btst B_OFSCRN,a14
jrnz AB1
ADJUST ADJENERGY ;GET AMOUNT OF ENERGY FROM CMOS
SLL 16-2,A0
MOVE A0,A5
ALLPLYR PLAYER_HIT ;HIT 'EM ALL
move @ATTACK_WAIT,a14 ; lower ticks to wait between attacks
subk 2,a14 ; adjust each time bug goes off
jrn AB0
move a14,@ATTACK_WAIT
AB0:
SOUND1 SND_BITE
AB1:
RETS
**************************************************************************
* *
* C_PAL_AND_OFFSET_Z *
* *
* CHANGE PALETTE OFFSET Z POSITION. *
* *
* REQUIRES: *
* *
* .LONG PALETTE *
* .LONG Z WORLD OFFSET *
* *
**************************************************************************
C_PAL_AND_OFFSET_Z
MOVE A0,A1
MOVE A0,A8
MOVE *B0+,B14,L
MOVE B14,A0
CALLA CHANGE_PAL
MOVE A1,A0
JRUC C_OFFSET_Z
**************************************************************************
* *
* C_OFFSET_Z *
* *
* OFFSET Z POSITION. *
* *
* REQUIRES: *
* *
* .LONG Z WORLD OFFSET *
* *
**************************************************************************
C_OFFSET_Z
MOVE *B0+,B14,L
MOVE B14,A14
MOVE *A0(OZVAL),A1,L
ADD A14,A1
MOVE A1,*A0(OZVAL),L
RETS
BUG_HEAD_INIT
.byte 2, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_BUGHEAD ;IMGPAL
.word OID_BOSSBUG, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG BUG_HEAD_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW BITE1, DMAWNZ, 0, 0, OM_GUNV
.long BUG_HEAD_GUNVECT
LWWWW BITE1, DMAWNZ|M_FLIPH, 0, 1, OM_GUNV
.long BUG_HEAD_GUNVECT
BUG_NECK_INIT
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NECK ;IMGPAL
.word OID_BOSSBUG, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG BUG_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW NECK1, DMAWNZ, 0, 0, OM_GUNV
.long BUG_GUNVECT
BUG_BODY_INIT
.byte 17, 0, 0, 4 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NECK ;IMGPAL
.long P_MIDBOD ;IMGPAL
.long P_BUTT ;IMGPAL
.long P_FRNTWLK ;IMGPAL
.word OID_BOSSBUG, OM_DUMCOLL ;OID, GLOBAL_OPTIONS
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW NECK1, DMAWNZ, 0, 0, OM_OPARTS|OM_COLL|OM_GUNV ;|OM_ANIM
.LONG [15,0]
.LONG BUG_CVECT
.LONG BUG_GUNVECT
; .LONG NECK_ANIM
LWWWW BUTT1, DMAWNZ, 0, 0, OM_OPARTS|OM_COLL|OM_PRVGUNV|OM_CFUNC
.LONG [0,0]
.LONG BUG_CVECT
.LONG C_OFFSET_Z
.LONG BUTT_ZOFF
LWWWW BUTT1, DMAWNZ|M_FLIPH, 0, 0, OM_OPARTS|OM_COLL|OM_PRVGUNV|OM_CFUNC
.LONG [0,1]
.LONG BUG_CVECT
.LONG C_OFFSET_Z
.LONG BUTT_ZOFF
LWWWW MIDBOD1, DMAWNZ, 0, 1, OM_OPARTS|OM_COLL|OM_PRVGUNV
.LONG [0,0]
.LONG BUG_CVECT
LWWWW MIDBOD1, DMAWNZ|M_FLIPH, 0, 1, OM_OPARTS|OM_COLL|OM_PRVGUNV
.LONG [0,1]
.LONG BUG_CVECT
; LWWWW FRONTWK1, DMAWNZ, 0, 1, OM_GUNV
; .LONG DUMRETS
LWWWW FRONTWK1, DMAWNZ, 0, 1, OM_PRVGUNV
LWWWW FRONTWK1A, DMAWNZ, 0, 1, OM_PRVGUNV
LWWWW FRONTWK1, DMAWNZ|M_FLIPH, 0, 1, OM_PRVGUNV
LWWWW FRONTWK1A, DMAWNZ|M_FLIPH, 0, 1, OM_PRVGUNV
LWWWW FRONTWK1, DMAWNZ, 0, 0, OM_PRVGUNV|OM_CFUNC
.LONG C_PAL_AND_OFFSET_Z
.LONG DARK_LEG
.LONG LEGS_2ND_ZOFF
LWWWW FRONTWK1A, DMAWNZ, 0, 0, OM_PRVGUNV|OM_CFUNC
.LONG C_PAL_AND_OFFSET_Z
.LONG DARK_LEG
.LONG LEGS_2ND_ZOFF
LWWWW FRONTWK1, DMAWNZ|M_FLIPH, 0, 0, OM_PRVGUNV|OM_CFUNC
.LONG C_PAL_AND_OFFSET_Z
.LONG DARK_LEG
.LONG LEGS_2ND_ZOFF
LWWWW FRONTWK1A, DMAWNZ|M_FLIPH, 0, 0, OM_PRVGUNV|OM_CFUNC
.LONG C_PAL_AND_OFFSET_Z
.LONG DARK_LEG
.LONG LEGS_2ND_ZOFF
LWWWW FRONTWK1, DMAWNZ, 0, 0, OM_PRVGUNV|OM_CFUNC
.LONG C_PAL_AND_OFFSET_Z
.LONG DARKER_LEG
.LONG BUTT_ZOFF+1
LWWWW FRONTWK1A, DMAWNZ, 0, 0, OM_PRVGUNV|OM_CFUNC
.LONG C_PAL_AND_OFFSET_Z
.LONG DARKER_LEG
.LONG BUTT_ZOFF+1
LWWWW FRONTWK1, DMAWNZ|M_FLIPH, 0, 0, OM_PRVGUNV|OM_CFUNC
.LONG C_PAL_AND_OFFSET_Z
.LONG DARKER_LEG
.LONG BUTT_ZOFF+1
LWWWW FRONTWK1A, DMAWNZ|M_FLIPH, 0, 0, OM_PRVGUNV|OM_CFUNC
.LONG C_PAL_AND_OFFSET_Z
.LONG DARKER_LEG
.LONG BUTT_ZOFF+1
DARK_LEG
.word 64
.word 00000h,0739ch,00000h,00400h,00c00h,00000h,00800h,01020h
.word 01440h,00800h,02020h,02440h,02040h,01c00h,030a0h,034c0h
.word 038e0h,04520h,03d00h,02c80h,01820h,02860h,03060h,02c40h
.word 01000h,01400h,01400h,04100h,00c00h,01800h,038a0h,04920h
.word 02460h,03cc0h,040e0h,04500h,04d40h,05160h,055a2h,059a0h
.word 05580h,03480h,05560h,05dc0h,05180h,05da0h,024a0h,01c80h
.word 020a0h,04120h,03102h,01420h,04963h,01860h,06603h,028c0h
.word 065e0h,059a0h,059a0h,034e0h,06ef0h,05580h,055e7h,05e4bh
DARKER_LEG
.word 64
.word 00000h,06b5ah,00000h,00000h,00400h,00000h,00000h,00800h
.word 00c00h,00000h,01800h,01c00h,01800h,01400h,02860h,02c80h
.word 030a0h,03ce0h,034c0h,02440h,01000h,02020h,02820h,02400h
.word 00800h,00c00h,00c00h,038c0h,00400h,01000h,03060h,040e0h
.word 01c20h,03480h,038a0h,03cc0h,04500h,04920h,04d60h,05160h
.word 04d40h,02c40h,04d20h,05580h,04940h,05560h,01c60h,01440h
.word 01860h,038e0h,028c0h,00c00h,04121h,01020h,05dc1h,02080h
.word 05da0h,05160h,05160h,02ca0h,066aeh,04d40h,04da5h,05609h
BUG_HEAD_ANIM
LWLL 1,60|AFunc,A_AnimScr+2,BUG_HEAD_LUPE
; LW 1,60
; LW 1,60
; LW 1,60
; LW 1,60
; LW 1,60
; LW 1,60
LWLL 1,30|AFunc,A_SET_OYVEL+2,-010000H
LWLL 1,60|AFunc,A_SET_OYVEL+2,0
LWLL 1,15|AFunc,A_SET_OYVEL+2,010000H
LWLL 1,1|AFunc,A_SET_OYVEL+2,0
; LW 1,60
; LW 1,60
; LWLL 1,30|AFunc,A_SET_OXVEL+2,-010000H
LWL 1,1|AFunc,RANDOM_HEAD_MOVE_INIT
BUG_HEAD_LUPE
LWL 1,1|AFunc,RANDOM_HEAD_MOVE
.long 0
; LWLL 1,60|AFunc,A_SET_OXVEL+2,010000H
; LWLL 1,60|AFunc,A_SET_OXVEL+2,-010000H
; .long 0
HEAD_GREETING_ANIM
LWLL BITE2,1|AMulti|AFunc,A_SOUND+2,SND_GREETING_SCREAM
LW BITE2,5
.long 0
HEAD_SCREAM_ANIM
LWL BITE2,1|AMulti|AFunc,BUG_SCREAM
LW BITE2,5
HEAD_SCREAM_GO_ANIM
LW BITE3,1|AMulti
LW BITE3,5
LW BITE4,1|AMulti
LW BITE4,15
LW BITE3,1|AMulti
LW BITE3,5
LW BITE2,1|AMulti
LW BITE2,5
LWL BITE1,1|AMulti|AFunc,PULL_ANIM
LW BITE1,1
HEAD_BITE_ANIM
LWL BITE4,1|AMulti|AFunc,A_BITE
LW BITE4,1
HBA_FLASH_LUPE
LWL 1,3|AFunc,BUG_CONST
LWL 1,1|AFunc,BUG_ON
LWLL 1,1|AFunc,A_AnimFrm_DSJ+2,HBA_FLASH_LUPE
LW BITE3,1|AMulti
LW BITE3,5
LW BITE2,1|AMulti
LW BITE2,5
LWL BITE1,1|AMulti|AFunc,A_END_BITE
LW BITE1,1
NECK_ANIM
LWL 1,1|AFunc,A_NECK
.long 0
BUG_LEG_ANIM
; LW FRONTWK1,1|AMulti
LWL FRONTWK1,1|AMulti|AFunc,A_LEG_SOUND
; LWLL FRONTWK1A,5|AFunc,A_SET_LEGS_SLEEP_R+2,OBJ_ON_WNZ
LWL FRONTWK1A,5|AFunc,OBJ_ON_WNZ
LW FRONTWK2,1|AMulti
; LWLL 1,5|AFunc,A_SET_LEGS_SLEEP_R+2,OBJ_OFF
LWL 1,5|AFunc,OBJ_OFF
BUG_LEG_UP_50
; LWL FRONTWK3,5|AFunc,A_SET_LEGS_SLEEP
LW FRONTWK3,5
; LWL FRONTWK4,5|AFunc,A_SET_LEGS_SLEEP
LW FRONTWK4,5
BUG_LEG_UP_100
; LWL FRONTWK5,5|AFunc,A_SET_LEGS_SLEEP
LW FRONTWK5,5
; LWL FRONTWK6,5|AFunc,A_SET_LEGS_SLEEP
LW FRONTWK6,5
BUG_LEG_DOWN_50
LW FRONTWK7,1|AMulti
; LWLL FRONTWK7A,5|AFunc,A_SET_LEGS_SLEEP_R+2,OBJ_ON_WNZ
LWL FRONTWK7A,5|AFunc,OBJ_ON_WNZ
LWL FRONTWK8,1|AMulti|AFunc,A_CHECK_LEGS_STOP
; LWL FRONTWK8A,5|AFunc,A_SET_LEGS_SLEEP
LW FRONTWK8A,5
.long 0
BUG_LEGS_SPRING_ANIM
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,5|AFunc,OBJ_ON_WNZ
LWLW FRONTWK2,1|AMulti|AFunc,A_SPRING_BODY+1,3
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,5|AFunc,OBJ_OFF
LWLW FRONTWK3,1|AMulti|AFunc,A_SPRING_BODY+1,4
LW 1,1|AMulti
LW FRONTWK3,1|AMulti
LW 1,1|AMulti
LW FRONTWK3,1|AMulti
LW 1,1|AMulti
LW FRONTWK3,1|AMulti
LW 1,1|AMulti
LW FRONTWK3,1|AMulti
LW 1,1|AMulti
LW FRONTWK3,7
LWLW FRONTWK2,1|AMulti|AFunc,A_SPRING_BODY+1,-3
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LW FRONTWK2,1|AMulti
LWL 1,5|AFunc,OBJ_OFF
LWL FRONTWK1,1|AMulti|AFunc,PULL_ANIM
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LWL FRONTWK1,1|AMulti|AFunc,A_FLAG_LEAP
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,1|AMulti|AFunc,OBJ_ON_WNZ
LW FRONTWK1,1|AMulti
LWL FRONTWK1A,5|AFunc,OBJ_ON_WNZ
LONG_SCREAM_ANIM:
LWL BITE2,1|AMulti|AFunc,BUG_SCREAM
LW BITE2,5
LW BITE3,1|AMulti
LW BITE3,5
LW BITE4,1|AMulti
LW BITE4,15
LW BITE3,1|AMulti
LW BITE3,5
LW BITE2,1|AMulti
LW BITE2,5
LWL BITE1,1|AMulti|AFunc,A_PULL_ANIM_OFF
LW BITE1,1
.long 0
A_PULL_ANIM_OFF:
move *a8(OFLAGS),a14
btst B_OFSCRN,a14
jrz APAO_on
calla PULL_ANIM
APAO_on:
rets
.END
;BUG_LEGS_START_ANIM
; LW 1,1|AMulti
; LW 1,1|AMulti
; LW 1,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK2,1|AMulti
; LWL 1,1|AMulti|AFunc,OBJ_OFF
; LW FRONTWK2,1|AMulti
; LWL 1,10|AFunc,OBJ_OFF
;
; LW 1,1|AMulti
; LW 1,1|AMulti
; LW 1,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK3,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK3,10
;
; LWLL 1,1|AMulti|AFunc,A_AnimScr+2,BUG_LEGS_ANIM
; LW 1,1|AMulti
; LW 1,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK4,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK4,10
;
;BUG_LEGS_ANIM
; LW FRONTWK1,1|AMulti
; LWL 1,1|AMulti|AFunc,OBJ_ON_WNZ
; LW FRONTWK1,1|AMulti
; LWL 1,1|AMulti|AFunc,OBJ_ON_WNZ
; LW FRONTWK5,1|AMulti
; LW 1,1|AMulti
; LWL FRONTWK5,1|AFunc,A_SET_LEGS_SLEEP
;
; LW FRONTWK2,1|AMulti
; LWL 1,1|AMulti|AFunc,OBJ_OFF
; LW FRONTWK2,1|AMulti
; LWL 1,1|AMulti|AFunc,OBJ_OFF
; LW FRONTWK4,1|AMulti
; LW 1,1|AMulti
; LWL FRONTWK4,1|AFunc,A_SET_LEGS_SLEEP
;
; LW FRONTWK3,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK3,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK3,1|AMulti
; LW 1,1|AMulti
; LWL FRONTWK3,1|AFunc,A_SET_LEGS_SLEEP
;
; LW FRONTWK4,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK4,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK2,1|AMulti
; LW 1,1|AMulti
; LWL FRONTWK2,1|AFunc,A_SET_LEGS_SLEEP
;
; LW FRONTWK5,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK5,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK1,1|AMulti
; LWL 1,1|AMulti|AFunc,OBJ_ON_WNZ
; LW FRONTWK1,1|AMulti
; LWLL 1,1|AFunc,A_SET_LEGS_SLEEP_R+2,OBJ_ON_WNZ
;
; LW FRONTWK4,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK4,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK2,1|AMulti
; LWL 1,1|AMulti|AFunc,OBJ_OFF
; LW FRONTWK2,1|AMulti
; LWLL 1,1|AFunc,A_SET_LEGS_SLEEP_R+2,OBJ_OFF
;
; LW FRONTWK3,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK3,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK3,1|AMulti
; LW 1,1|AMulti
; LWL FRONTWK3,1|AFunc,A_SET_LEGS_SLEEP
;
; LW FRONTWK2,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK2,1|AMulti
; LW 1,1|AMulti
; LW FRONTWK4,1|AMulti
; LW 1,1|AMulti
; LWL FRONTWK4,1|AFunc,A_SET_LEGS_SLEEP