revolution-x/GXBZERK.ASM

1714 lines
41 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 "GXBZERK.ASM"
.TITLE "<<< GENERATION X -- Berzerker enemy >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1994 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "GXENEMY.INC" ;SYSTEM EQUATES
.INCLUDE "GXCONTRL.H"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GXBZERK.TBL"
***** In this file
.DEF PROC_BZERK_HEADON_OFFSET, PROC_BZERK_JUMPIN
.DEF PROC_BZERK_STAND
.DEF PROC_BZERK_JMP_WRLD,PROC_BZERK_JUMP_ZW
***** from GXRAM.ASM
.REF WAVETIME, CURPLYRS, HOLD_ENEMY_DISPATCH, ENEMY_HITALL
.REF BASE_HIT, WAVE
***** from GXAFUNC.ASM
.REF A_SOUNDZ, SetAnim_AFARG, A_SET_OYVEL, A_RAND_REL_BYTE
.REF A_Anim_DSJ, SetAnim, A_SOUND, A_STAY_TIL_ONSCRN
***** from GXSND.ASM
.REF ONESND_Z, ONESND
***** from GXD.ASM
.REF GET_SHAD_MULTI, SET_ANIPU, XBASE, ZBASE, GETHEADPART, YBASE
.REF EXIST_OBJ_ALL, RESUME_EXIST_OBJ_ALL, SET_SCRN_POS
.REF SET_OBJSU, WORLD_GRNDOFF, YWORLD
***** from GXENEMY.ASM
.REF INSERT_ENEMY, CREATE_ENEMY, DEL_ENEMY_NOAUD, DELETE_ENEMY
.REF EGUN_FLASH_MULTI
***** from GXPLAYER.ASM
.REF CK_PLAYER_HIT, PLAYER_HIT
***** from GXPALL.ASM
.REF A_CHANGE_PAL
***** from GXCOG.ASM
.REF HIT_ENEMY, A_CLR_ALL_X, A_CLR_ALL_Z, OBJ_DRAWBITS_MULTI
.REF A_HIT_GROUND, A_GROUND_CK, STORE_OCONST
***** from GXMONDR2.ASM
.REF A_SPAWN_PROJECTILE, AXE_INIT
***** from GXBLOOD.ASM
.REF BLOODY_BULLET_HIT, A_BLOOD_SPLORCH, A_SBOMB_BLOOD
*
* Berzerker RAM
*
.TEXT
*
* Berzerker Object data area
* Note: Any fields named the same as the Coghead should
* use the same offset.
*
OHITS .EQU ODATA ;UHL GUN HIT COUNTER:
;0-7:P1 HITS, 8-15:P2 HITS
;16-23:P3 HITS, 24-31:P4 HITS
OMISSES .EQU ODATA+020H ;UHB Number of consec. missed shots
OCHEWED_ROCKET .EQU ODATA+028H ;UHB Means that a rocket hit him
OBURSTCNT .EQU ODATA+030H ;UHB Number of bursts left, if hitting
ORAPIDCNT .EQU ODATA+038H ;UHB Current rapid fire shots left
ONO_STOP .EQU ODATA+060H ;UHB This is a non-stopper guy
OJUMPING .EQU ODATA+068H ;UHB We are currently jumping
OHRUN_DURATION .EQU ODATA+070H ;UHW Headon crazy run duration
OSRUNVEL .EQU ODATA+080H ;UHL SIDE RUN VELOCITY
OHRUNVEL .EQU ODATA+0A0H ;UHL HEADON RUN VELOCITY
OJUMP_SLEEP .EQU ODATA+0C0H ;UHW Remaining jump sleep
OEFLAGS .EQU ODATA+0D0H ;UHW ENEMY FLAGS
* Used by guys that do not stand guard
OJUMPTAB .EQU ODATA+0E0H ;UHL Table of Jump positions
* Used be guard guys only. Also, must stay together, in this order
OGUARD_STARTZ .EQU ODATA+0E0H ;UHW Start Guard when ZBASE is GT
OGUARD_ATIME .EQU ODATA+0F0H ;UHW Time before activating
OSHOOT_ANIM .EQU ODATA+100H ;UHL USE THIS ANIMATION TO SHOOT
ODEATH_ANIM .EQU ODATA+120H ;UHL USE THIS ANIMATION FOR DEATH
OSTOP_ANIM .EQU ODATA+160H ;UHL USE THIS ANIMATION FOR STOPPING
OFLINCH_ANIM .EQU ODATA+180H ;UHL Current flinch animation
OXORIG .EQU ODATA+1B0H ;UHW Origination universe X
OXLIMIT .EQU ODATA+1C0H ;UHW If <> 0 then this is X travel
OYENEMY .EQU ODATA+1D0H ;UHW Universe Y position of enemy
OXACCEL .EQU ODATA+1E0H ;SHW X acceleration
OZACCEL .EQU ODATA+1F0H ;SHW Z acceleration
*
* Rope ODATA fields
*
*
* Enemy Flags
*
B_SIDE EQU 0 ;DIRECTION
;0 = HEADON MOTHER FUCKER
;1 = SIDEWAYS MELLOW DUDE
B_BRIDGE EQU 1 ;Bridge dwelling Coghead
B_JUMP_IN EQU 2 ;Jump in from the top of the screen
B_STAYPUT EQU 3 ;Flag to stay on screen 'til killed or off
B_FLIP EQU 4 ;HORIZONTALLY FLIPPED OUT WACKO
B_GUARD EQU 5 ;Standing guard guy
B_BLOCKING EQU 6 ;IF=1, THEN COGHEAD IS BLOCKING
B_INVINCIBLE EQU 7 ;IF=1, THEN COGHEAD IS INVINCIBLE
M_SIDE EQU 001H
M_BRIDGE EQU 002H
M_JUMP_IN EQU 004H
M_STAYPUT EQU 008H
M_FLIP EQU 010H
M_GUARD EQU 020H
M_BLOCKING EQU 040H
M_INVINCIBLE EQU 080H
HRUNVEL EQU -0140H ;HEADON RUN VELOCITY
HRUNVEL_CRAZY .EQU -280H ;Head on run for Crazy guy
SRUNVEL_MIN EQU 01D000H ;SIDE RUN (TO THE RIGHT) VELOCITY
SRUNVEL_MAX EQU 01F000H ;SIDE RUN (TO THE RIGHT) VELOCITY
JUMP_MIN_YVEL .EQU 08000H ;Absolute jumping velocity
SHOOTCNT EQU 3
BZRK_FRAME_TIME .EQU 5 ;BASE SLEEP TIME BETWEEN FRAMES
;!!WARNING!! - VALUE MUST BE > 2
BZRK_HITS_TO_KILL EQU 5 ;HITS REQUIRED TO KILL COG HEAD
BZRK_FLASH_COLOR EQU 0101H ;FLASH COLOR FOR COGHEAD
SHORT_DEATH_ZVEL .EQU 1C0H
LONG_DEATH_ZVEL .EQU 2C0H
**************************************************************************
* *
* PROC_BZERK_HEADON_OFFSET *
* *
* Process to create a head-on berzerker at an offset from *
* another object. *
* *
* A8 = Object to offset from *
* A9 = [Y,X] offset *
* A11 = Z offset *
* *
**************************************************************************
PROC_BZERK_HEADON_OFFSET
MOVE *A8(OYVAL),A10,L ;Get generator's universe Y
MOVE A9,A14
SRA 16,A14
SLL 15,A14 ;Translate offset to world
ADD A14,A10 ;This is the starting Y
MOVE *A8(OXVAL),A1,L ;Get generator's universe X
SEXT A9,W
SLL 15,A9 ;Translate
ADD A1,A9 ;Starting Universe X
ADDM *A8(OZVAL),A11,L ;Starting Z
JRUC PROC_BZERK_HEADON
**************************************************************************
* *
* PROC_BZERK_HEADON *
* *
* Process to create a head-on berzerker. *
* *
* A9 = Universe X *
* A10 = Universe Y *
* A11 = Universe Z *
* *
**************************************************************************
PROC_BZERK_HEADON
CLR A8 ;Clear OFLAGS for headon
JRUC PROC_BZERK
**************************************************************************
* *
* PROC_BZERK_JMP_WRLD *
* *
* Create a berzerker that jumps in from the top of the *
* screen. *
* *
* A9 = [Wrld X max >> 16, Wrld X min >> 16] *
* A10 = [Wrld Z max >> 4, Wrld Z min >> 4] *
* A11 = Don't leave screen (if = 1) *
* *
**************************************************************************
PROC_BZERK_JMP_WRLD
MOVE A11,A11
JRZ PBJW_NO_FLAGS
MOVI M_STAYPUT,A8
PBJW_NO_FLAGS
MOVE A9,A0
MOVE A0,A1
SLL 16,A1
CALLA RANGERND ;Get our WORLD X position
move @XBASE,a14,L
add a14,a0
MOVE A0,A9
MOVE A10,A0
SRA 16,A0
SLL 4,A0
MOVE A10,A1
SEXT A1
SLL 4,A1
CALLA RANGERND ;Get our WORLD Z position
move @ZBASE,a14,L
add a14,a0
jruc BZJ_hk
**************************************************************************
* *
* PROC_BZERK_JUMP_ZW *
* *
* Create a berzerker that jumps in from the top of the *
* screen. *
* *
* A9 = [Univ X max >> 16, Univ X min >> 16] *
* A10 = [Wrld Z max >> 4, Wrld Z min >> 4] *
* A11 = Don't leave screen (if = 1) *
* *
**************************************************************************
PROC_BZERK_JUMP_ZW
MOVE A11,A11
JRZ PBJZ_NO_FLAGS
MOVI M_STAYPUT,A8
PBJZ_NO_FLAGS
MOVE A9,A0
MOVE A0,A1
SLL 16,A1
CALLA RANGERND ;Get our Univ X position
MOVE A0,A9
MOVE A10,A0
SRA 16,A0
SLL 4,A0
MOVE A10,A1
SEXT A1
SLL 4,A1
CALLA RANGERND ;Get our WORLD Z position
move @ZBASE,a14,L
add a14,a0
jruc BZJ_hk
**************************************************************************
* *
* PROC_BZERK_JUMPIN *
* *
* Create a berzerker that jumps in from the top of the *
* screen. *
* *
* A9 = [Univ X max >> 16, Univ X min >> 16] *
* A10 = [Univ Z max >> 8, Univ Z min >> 8] *
* *
**************************************************************************
PROC_BZERK_JUMPIN
MOVE A9,A0
MOVE A0,A1
SLL 16,A1
CALLA RANGERND ;Get our Univ X position
MOVE A0,A9
MOVE A10,A0
SRA 16,A0
SLL 8,A0
MOVE A10,A1
SEXT A1
SLL 8,A1
CALLA RANGERND ;Get our Univ Z position
CLR A8
*
* Entrypoint: Creates jump-in Berzerker
* A8 = EFLAGS
*
BZJ_hk:
MOVE A0,A11
move @YWORLD,a10,L
move @WORLD_GRNDOFF,a14,L
add a14,a10
; MOVE @YBASE,A10,L
ADDI [-200,0],A10
ORI M_JUMP_IN,A8
JRUC PROC_BZERK
**************************************************************************
* *
* PROC_BZERK_STAND *
* *
* Create a berzerker that stands guard until ZBASE is *
* greater than a given universe value. Then he will wait *
* for ATIME before activating. If ZBASE to wait is 0 then *
* he skips that check. *
* *
* A8 = [ATIME, ZBASE >> 4 at which to activate] *
* A9 = Universe X *
* A10 = Universe Y *
* A11 = Universe Z *
* *
**************************************************************************
PROC_BZERK_STAND
MOVE A8,A6
MOVI M_GUARD,A8
JRUC PROC_BZERK
**************************************************************************
* *
* PROC_BZERK *
* *
* Process entry point to create a Berzerker. *
* *
* A6 = General purpose register, saved through Create *
* A8 = EFLAGS to denote Side or Headon *
* A9 = Universe X *
* A10 = Universe Y *
* A11 = Universe Z *
* *
**************************************************************************
PROC_BZERK
MOVE @HOLD_ENEMY_DISPATCH,A14,W
JANE SUCIDE
MOVI OID_BZERK,A0
CALLA GET_ENEMY_COUNT
MOVK 5,A1
MOVE @CURPLYRS,A14,W
ADD A14,A1 ;Adjust for amount of current players
CMP A1,A0
JAHS SUCIDE
MMTM SP,A6,A8
MOVI BZERK_INIT,B0
CALLA CREATE_ENEMY
MMFM SP,A6,A7 ;Preserve status please
JRZ PBH_EXIT ;BR = Could not create the dude
MOVE A11,A3
MOVE A10,A2
MOVE A9,A1
CALLA SET_ANIPU ;Position him
;Do this only if these guys live off of the ground
; SRA 16,A10
; MOVE A10,*A8(OYENEMY),W ;Store the integer landing line
MOVI SRUNVEL_MAX,A0
MOVI SRUNVEL_MIN,A1
CALLA RANGRAND
MOVE A0,*A8(OSRUNVEL),L ;SET SIDE VELOCITY
MOVI HRUNVEL_CRAZY,A1
MOVE A1,*A8(OHRUNVEL),L ;Set the headon velocity
BTST B_SIDE,A7
JRZ PBH_HEAD_ON
; MOVE A0,*A8(OXVEL),L
; MOVI SIDE_SKATE_ANIM,A1
; MOVIM SIDE_DEATH_ANIM,*A8(ODEATH_ANIM),L
; MOVIM SIDE_SPIN_STOP,*A8(OSTOP_ANIM),L
; MOVIM SIDE_GLIDE_SHOOT,*A8(OSHOOT_ANIM),L
; JRUC PBH_DIRSET
*This guy will be a HEAD-ON man
PBH_HEAD_ON
BTST B_JUMP_IN,A7
JRZ PBH_ON_GROUND ;BR = This is not a jump in guy
MOVI ANIM_JUMP_ON,A1
JRUC PBH_LOAD_HEAD
PBH_ON_GROUND
BTST B_GUARD,A7
JRZ PBH_RUNNING ;BR = This is not a guard guy
MOVE A6,*A8(OGUARD_STARTZ),L ;Save our starting ZBASE
MOVI ANIM_GUARD,A1
JRUC PBH_LOAD_HEAD
PBH_RUNNING
MOVI HEADON_CRAZY_RUN_ANIM,A1
PBH_LOAD_HEAD
MOVIM HEADON_DEATH_ANIM,*A8(ODEATH_ANIM),L
MOVIM HEADON_STOP_ANIM,*A8(OSTOP_ANIM),L
MOVIM HEADON_THROW_ANIM,*A8(OSHOOT_ANIM),L
PBH_DIRSET
CALLA STRT_ANIM ;START ANIMATION
MOVE A7,*A8(OEFLAGS),W
BTST B_SIDE,A7
JRZ PBH_NOSET
MOVE A6,A0
CALLA SET_FLPS
PBH_NOSET
MOVI BZRK_FLASH_COLOR,A1
CALLA STORE_OCONST ;STORE THE PROPER VALUE FOR CONSTANT
CALLA OBJ_ON_MULTI ;We create with the objects off
CALLA GET_SHAD_MULTI ;Setup his shadow
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
JRUC BZERK_WATCH
PBH_EXIT
DIE
BZERK_WATCH
MOVE A13,*A8(OPLINK),L
BZERK_WATCH_LOOP
SLOOP 7000H,BZERK_WATCH_LOOP ;Here we wait for shit to happen
**************************************************************************
* *
* BZERK_CVECT *
* *
**************************************************************************
BZERK_CVECT
WWL OID_PROCKET,~MASK_PLAYER,BZERK_CD_COLL
WWL OID_PEXPLOSION,MASK_SUPP|MASK_TYPE|MASK_ID,BZERK_EXPLOSION_COLL
WWL OID_BLOWUP,0FFFFH,BZERK_SBOMB_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* BZERK_GUNVECT *
* *
* PASS: *
* A2 = PTR TO PLAYER *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
BZERK_GUNVECT
MOVB *A8(OPARTID),A4 ;Keep our Parts I.D.
CALLA GET_HEAD_PART
SOUND1 SND_BODY_HIT
CALLA BLOODY_BULLET_HIT
MOVE *A8(OFLAGS),A9,W
BTST B_DEAD,A9
JRNZ BG_DEAD ;BR = He is already dead
MOVE A2,*A8(OPLAYER),L ;STORE PLAYER INFO FOR LATER???
MOVE *A8(OEFLAGS),A6,W
RANDENT TAB_HIT_SNDS,NUM_HIT_SNDS,5,L
CALLA ONESND_Z ;Give us a grunt
MOVE *A2(PPLASMASHOTS),A14,W
JRNZ BZERK_DO_DEATH ;BR = Wicked bullets being used
BTST B_INVINCIBLE,A6 ;ARE WE CURRENTLY INVINCIBLE?
JRNE BG_DEAD ;BR = YES, JUST EXIT
CMPK NUM_LEGS,A4 ;Was this the legs?
JREQ BG_TAKE_HIT ;BR = Yo, then no need to block
*
* A4 = OPARTID of part shot
* A6 = OEFLAGS
* A9 = OFLAGS
*
BG_TAKE_HIT
CLR A5
MOVK BZRK_HITS_TO_KILL,A1 ;This many hits to kill
MOVI OHITS,A3 ;This is the variable to use
CALLA HIT_ENEMY ;IS THIS GUY TOAST?
JRHS BZERK_DO_DEATH ;BR = OH YEAH!
; MOVE *A8(OZVEL),A14,L
; JRNN BG_SKIP_PUSH_BACK
; PUSH A2
; MOVE A8,A14
; ADDI OXVAL,A14
; MOVE *A14+,A1,L
; MOVE *A14+,A2,L
; MOVE *A14+,A3,L
; ADDI 800H,A3
; CALLA SET_ANIPU
; PULL A2
;BG_SKIP_PUSH_BACK
MOVE *A8(OHRUN_DURATION),A14,W
JRZ BG_NOT_RUNNING
ADDK 5,A14
MOVE A14,*A8(OHRUN_DURATION),W
BG_NOT_RUNNING
*
* Berzerker is still alive here
*
MOVI BZERK_UNFLASH,A7
CALLA OBJPROC_INT ;INTERRUPT COG WATCHER
JRZ BG_DEAD ;BR = NO COG WATCHER EXISTS
MOVI DMACNZ&(~DMAGO),A1
CALLA OBJ_DRAWBITS_MULTI ;FLASH HIM WHITE
ORI M_INVINCIBLE,A6
MOVE A6,*A8(OEFLAGS),W ;MAKE HIM NON-HITTABLE NOW
BG_DEAD
RETS
**************************************************************************
* *
* BZERK_UNFLASH *
* *
* Process subroutine to turn off the Berzerker flash and *
* invinciblity bits. *
* *
* A8 = Ptr to head object *
* *
* Note: Call with JSRP *
* *
**************************************************************************
BZERK_UNFLASH
SLEEP 2
MOVI DMAWNZ&(~DMAGO),A1
CALLA OBJ_DRAWBITS_MULTI
SLEEP 2
MOVE *A8(OEFLAGS),A14,W
ANDNI M_INVINCIBLE,A14
MOVE A14,*A8(OEFLAGS),W
RETP
**************************************************************************
* *
* BZERK_SBOMB_COLL *
* *
* Berzerker get hit by a smart bomb. *
* *
* A2 = Ptr to player smart bombing *
* A8 = Ptr to Berzerker *
* *
**************************************************************************
BZERK_SBOMB_COLL
CLR A5
CALLA GET_HEAD_PART
JRUC BZERK_GEN_COLL
**************************************************************************
* *
* BZERK_CD_COLL *
* *
* Berzerker get hit by a CD *
* *
* A0 = Ptr to CD *
* A8 = Ptr to Berzerker *
* *
**************************************************************************
BZERK_CD_COLL
MOVE *A0(RL_INTENDED_OBJ),A14,L
CMP A14,A8 ;Is this the object we are after?
JRNE BCC_X ;BR = No
CALLA GET_HEAD_PART
MOVKB 1,*A8(OCHEWED_ROCKET) ;Flag the rocket hit
CLRM *A8(OHRUN_DURATION),W ;Clear run target time
BCC_X
RETS
**************************************************************************
* *
* BZERK_EXPLOSION_COLL *
* *
* Berzerker collides with a player explosion. *
* *
* A0 = Ptr to explosion *
* A8 = Ptr to Berzerker *
* *
**************************************************************************
BZERK_EXPLOSION_COLL
CALLA GETHEADPART ;GET THE KILLERS HEAD
MOVE A0,A5 ;KEEP KILLER HERE
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA
CALLA GET_HEAD_PART
MOVB *A8(OCHEWED_ROCKET),A14 ;Did he actually get hit?
JRZ BEC_DEAD ;BR= No
*
* A2 = Ptr to player that killed us
* A8 = Ptr to head part of object
*
BZERK_GEN_COLL
MOVE A2,*A8(OPLAYER),L
MOVE *A8(OFLAGS),A9,W
BTST B_DEAD,A9
JRNZ BEC_DEAD ;BR = He is already dead
MOVE *A8(OEFLAGS),A6,W
SOUND1 SND_BZERK_EXPLODE
*
* This is a generic Berzerker death entrypoint
* Note: NOTHING SHOULD BE PUSHED!
* A5 = Ptr to accompanying explosion, 0 means there isn't one
* A6 = EFLAGS
* A8 = Ptr to head part of cog
* A9 = OFLAGS
* *A8(OPLAYER),L = Ptr to player that killed us
*
BZERK_DO_DEATH
ORI M_DEAD,A9
MOVE A9,*A8(OFLAGS),W
MOVI DMAWNZ&(~DMAGO),A1
CALLA OBJ_DRAWBITS_MULTI
MOVI 1000,A1
CALLA SCORE
CALLA COUNT_PLAYER_KILL
MOVE *A8(ODEATH_ANIM),A1,L
.IF DEBUG
LOCKON Z
.ENDIF
; MOVE A5,A5
; jrnz BEC_Explosion
*
* This is the bullet death thing
*
;BEC_SHORT_DEATH
RANDENT TAB_DEATH_SNDS,NUM_DEATH_SNDS,5,L
CALLA ONESND_Z ;Give us a ding
MOVIM -20000H,*A8(OYVEL),L ;SEND HIM UP
MOVIM 4000H,*A8(OYACCEL),W ;AND MAKE HIM COME DOWN
MOVI SHORT_DEATH_ZVEL,A14
MOVE A14,*A8(OZVEL),L ;AND MAKE HIM GET BLOWN BACK
; jruc BEC_Death_Anim
;BEC_Explosion
; SOUNDZ SND_DEATH_LONG
;; SOUNDZ SND_ROCKET_HIT
; MOVIM -40000H,*A8(OYVEL),L ;SEND HIM UP
; MOVIM 4000H,*A8(OYACCEL),W ;AND MAKE HIM COME DOWN
; MOVI LONG_DEATH_ZVEL,A14
; MOVE A14,*A8(OZVEL),L ;AND MAKE HIM GET BLOWN BACK
; MOVE A14,*A5(OZVEL),L ;AND HIS LITTLE DOG TOO
;BEC_Death_Anim
MOVE A1,*A8(AnimFrm),L
CLR A14
MOVB A14,*A8(AnimSlp)
BEC_DEAD
RETS
**************************************************************************
* *
* Anim funcs for the Berzerker *
* *
**************************************************************************
**************************************************************************
* *
* A_VELOCITY_WATCH *
* *
* Anim func to watch velocities and boundries and such. *
* Should be called every tick *
* *
* A8 = Ptr to any part *
* *
**************************************************************************
A_VELOCITY_WATCH
CALLA GET_HEAD_PART
MOVE *A8(OXVEL),A5,L
MOVE *A8(OZVEL),A6,L
MOVE *A8(OXACCEL),A7,W
MOVE *A8(OHRUN_DURATION),A14,W
JRZ AVW_NO_TARGET ;BR = We are not running to a target
DEC A14
MOVE A14,*A8(OHRUN_DURATION),W
JRZ AVW_DO_HEADON_STOP
AVW_NO_TARGET
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14 ;Are we flipped
JRZ AVW_NOFLIP
*
* This is the flipped case
*
NEG A7 ;Handle acceleration backwards during flip
JRZ AVW_CHECK_Z ;BR = No accel to worry about
ADD A7,A5 ;Add the acceleration
MOVE *A8(OSRUNVEL),A2,L
NEG A2
CMP A2,A5 ;Did we max out?
JRGE AVW_STUFF_X ;BR = No
JRUC AVW_CHECK_Z
*
* This is the unflipped case
*
AVW_NOFLIP
MOVE A7,A7
JRZ AVW_CHECK_Z ;BR = No acceleration, no worry
ADD A7,A5 ;Add the acceleration
MOVE *A8(OSRUNVEL),A2,L
CMP A2,A5 ;Did we max out?
JRGT AVW_CHECK_Z ;BR = No
AVW_STUFF_X
MOVE A5,*A8(OXVEL),L ;Stuff that velocity
*
* Now we do Z
*
AVW_CHECK_Z
MOVE *A8(OZACCEL),A7,W
ADD A7,A6
MOVE A6,*A8(OZVEL),L
RETS
*
* Here we will stop and do the proper shoot/throw animation
*
AVW_DO_HEADON_STOP
MOVE *A8(OFLAGS),A14,W
BTST B_DEAD,A14
JRZ AVW_STOP_GO ;BR = He's not dead, O.K. to stop
RETS
AVW_STOP_GO
CALLA CLR_VEL ;Stop the show
CLR A14
MOVE A14,*A8(OXACCEL),W
MOVE A14,*A8(OZACCEL),W
MOVE *A8(OSHOOT_ANIM),A1,L
JAUC STRT_ANIM ;Do whatever it is that you do
**************************************************************************
* *
* A_SCREEN_CK *
* *
* Anim func to check if any guy is off the screen period. *
* If he is, then delete him. *
* *
* A8 = Ptr to any part *
* *
**************************************************************************
A_SCREEN_CK
CALLA GET_HEAD_PART
; MOVE *A8(OZVAL),A2,L
; move @ZBASE,a14,L
; sub a14,a2
; CMPI ZMAX_REAL,A2
; JALT DEL_ENEMY_NOAUD ;BR = Enemy too far forward
CALLA SCRTST
JANZ DEL_ENEMY_NOAUD
RETS
**************************************************************************
* *
* A_STAND_RAPIDFIRE_DECISION - Anim Function to decide if we should fire *
* again quickly. *
* A8 = PTR TO FIRING PART *
* AARG+,L = ANIM BRANCH IF WE SHOULD FIRE AGAIN *
* *
**************************************************************************
A_STAND_RAPIDFIRE_DECISION
MOVB *A8(ORAPIDCNT),A14
DEC A14
MOVB A14,*A8(ORAPIDCNT)
JANZ SetAnim_AFARG
RETS
**************************************************************************
* *
* A_STAND_FIRE_DECISION - Anim Function to decide if we should fire *
* again. *
* A8 = PTR TO FIRING PART *
* AARG+,L = ANIM BRANCH IF WE SHOULD FIRE AGAIN *
* *
**************************************************************************
A_STAND_FIRE_DECISION
MOVB *A8(OMISSES),A14
JRNZ ASFD_X ;BR = We've been missing our target
MOVB *A8(OBURSTCNT),A14
DEC A14
MOVB A14,*A8(OBURSTCNT)
JANZ SetAnim_AFARG
ASFD_X
RETS
**************************************************************************
* *
* A_INITIALIZE_FIRING - DO ANY FIRING VARIABLE INITIALIZATION THAT *
* MIGHT BE NECESSARY. *
* A8 = PTR TO PART DOING THE FIRING *
* *
**************************************************************************
A_INITIALIZE_FIRING
CALLA GET_HEAD_PART
CLR A14
MOVB A14,*A8(OMISSES)
RETS
**************************************************************************
* *
* A_FIRE_FNC *
* *
* Anim func for normal part gun fire. *
* *
* A8 = Ptr to part firing *
* AARG+,L = [Y,X] firing offset *
* AARG+,L = [INT,FRAC] hit points to take *
* *
**************************************************************************
A_FIRE_FNC
CALLA GET_HEAD_PART_A0
MOVE A0,A9 ;Everything is in his head
MOVE *A8(OFLAGS),A14,W
BTST B_DEAD,A14
JRNZ AFF_X ;BR = He is already dead
move *a8(OZVAL),a14,L ; Don't shoot if you're
move @ZBASE,a3,L ; offscreen in Z
sub a3,a14
cmpi ZMAX_REAL,a14
jrlt AFF_X
CALLA GETAFARG_LONG ;Get the firing offset
MOVE A0,A3
; CALLA GETAFARG_LONG ;And the hit points
; MOVE A0,A5
MOVE @BASE_HIT,A5,W
ADDI 800H,A5
SLL 4,A5
CALLA EGUN_FLASH_MULTI ;Make a flash
MOVE @ENEMY_HITALL,A14,W
JRZ AFF_CK_PLAYER ;BR = Check player by player
DEC A14
JRZ AFF_HITALL ;BR = Hit everyboy
CLR A5 ;No Damage
AFF_CK_PLAYER
CALLA CK_PLAYER_HIT
JRNZ AFF_HIT ;BR = Successful hit on Player(s)
JRNC AFF_NOHIT ;BR = No hit, but he was visible
jruc AFF_NOHIT_No_Sound ;He did'nt hit because he was not visible
AFF_HITALL
ALLPLYR PLAYER_HIT ;Hit every player
AFF_HIT
CLRB *A9(OMISSES) ;We did not miss
SOUNDZ SND_BZERK_FIRE
JRUC AFF_X
AFF_NOHIT
SOUNDZ SND_BZERK_FIRE
AFF_NOHIT_No_Sound
MOVB *A9(OMISSES),A14
INC A14 ;Knock the miss count
MOVB A14,*A9(OMISSES)
AFF_X
RETS
**************************************************************************
* *
* A_FACE_CLR_VEL - Anim Function to mark enemy as head-on and clear *
* it's velocity. *
* A8 = Ptr to object *
* *
**************************************************************************
A_FACE_CLR_VEL
CALLA GET_HEAD_PART
MOVIM HEADON_DEATH_ANIM,*A8(ODEATH_ANIM),L
MOVIM HEADON_SHOOT_ANIM,*A8(OSHOOT_ANIM),L
CALLA A_CLR_ALL_X
JAUC A_CLR_ALL_Z
NUM_WX .EQU 16
.BSS WORLDX_ARRAY,NUM_WX*16
**************************************************************************
* *
* A_CALC_HEADON_TARGET *
* *
* Anim func to pick a target point and calculate the numbers *
* to get there. *
* *
* A8 = Ptr to head part *
* *
**************************************************************************
A_CALC_HEADON_TARGET
MOVI WORLDX_ARRAY,A3
MOVE A3,A7 ;Store here for second trip through
CLR A4 ;This is our array count
MOVK NUM_WX,A5
MOVE @XBASE+16,A6,W
MOVE A8,A9 ;Keep the object here
MOVI OID_BZERK,A0
CALLA EXIST_OBJ_ALL ;Load array with all World X's
JRZ ACHT_GET_PT ;BR = No others exist
ACHT_WX_LOOP
MOVE *A8(OPART1),A14,L
CMP A14,A8
JRNE ACHT_NEXT_WX ;BR = This is not the head
CMP A8,A9
JREQ ACHT_NEXT_WX ;BR = This is us
MOVE *A8(OXPOS),A14,W
SUB A6,A14 ;Universe to World X
MOVE A14,*A3+,W
INC A4
DEC A5
JRZ ACHT_GET_PT ;BR = We ran out of storage
ACHT_NEXT_WX
CALLA RESUME_EXIST_OBJ_ALL
JRNZ ACHT_WX_LOOP
ACHT_GET_PT
MOVK 10,A5 ;We can only try this many times
ACHT_RAND_WX_LOOP
MOVI 90,A0
CALLA SRAND ;Get a prospective value
MOVE A4,A6
JRZ ACHT_GOT_WX ;BR = Nothing in the array
MOVE A7,A3
MOVE A0,A1
MOVE A0,A2
SUBK 20,A1
ADDK 20,A2 ;We gots da range now
ACHT_FIND_WX_LOOP
MOVE *A3+,A14
CMP A1,A14
JRLT ACHT_TRY_NEXT
CMP A2,A14
JRGT ACHT_TRY_NEXT
DSJS A5,ACHT_RAND_WX_LOOP ;BR = Time to get yet another candidate
JRUC ACHT_GOT_WX ;We've wasted too much time, just use it
ACHT_TRY_NEXT
DSJS A6,ACHT_FIND_WX_LOOP
ACHT_GOT_WX
MOVE A9,A8 ;Restore object ptr
MOVE A0,A5 ;This is our world X target
SLL 16,A5
MOVI 9000H,A0
MOVI 8000H,A1
CALLA RANGERND
MOVE A0,A7 ;This is our world Z target
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1 ;Universe to World Z
MOVE *A8(OXVAL),A3,L
MOVE @XBASE,A14,L
SUB A14,A3 ;Universe to World X
SUB A7,A1 ;Get the Z distance to travel
ABS A1
MOVE *A8(OHRUNVEL),A2,L
MOVE A2,*A8(OZVEL),L
ABS A2
DIVU A2,A1 ;Get the duration, in ticks.
SUB A3,A5 ;Now what the hell for X target
DIVS A1,A5 ;Get the proper XVEL
MOVE A5,*A8(OXVEL),L ;Make him get there
MOVE A1,*A8(OHRUN_DURATION),L
RETS
**************************************************************************
* *
* A_THROW_OR_RUN *
* *
* Anim func to determine what should be done, now that *
* the berzerker has the axe over his head. If he is *
* far away, then he will target a point and run at the *
* screen. If he is close, then he will just throw the *
* thing. *
* *
* A8 = Ptr to Berzerker head object *
* *
**************************************************************************
A_THROW_OR_RUN
move @WAVE,a14
cmpk 6+DEBUG,a14
jrge ATOR_THROW
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1 ;Universe to World Z
CMPI 09800H,A1
JRGT ATOR_RUN ;BR = Too far, needs to run closer
ATOR_THROW:
MOVI HEADON_THROW_ANIM,A1
JAUC SetAnim
ATOR_RUN
MOVI HEADON_CRAZY_RUN_ANIM,A1
JAUC SetAnim
**************************************************************************
* *
* A_JUMP_OFF_CK *
* *
* Anim func to check if we should jump off of the screen. *
* *
* A8 = Ptr to any part *
* *
**************************************************************************
A_JUMP_OFF_CK
CALLA GET_HEAD_PART
MOVB *A8(OMISSES),A14
JRNZ AJOC_JUMP ;BR = We've been missing our target
MOVI OID_BZERK,A0
CALLA GET_ENEMY_COUNT
CMPK 4,A0
JRHI AJOC_JUMP ;BR = Too many berzerkers spoils the broth
RETS
AJOC_JUMP
MOVE *A8(OEFLAGS),A14,W
BTST B_STAYPUT,A14
JRZ AJOC_JUMP_JUMP ;BR = We are not inclined to stay
RETS
AJOC_JUMP_JUMP
MOVI ANIM_JUMP_OFF,A1
JAUC SetAnim
**************************************************************************
* *
* A_STAY_TIL_ZBASE *
* *
* Anim func to wait here until ZBASE is greater than what *
* is stored in *A8(OGUARD_STARTZ),W. Value is >> 4. *
* *
* A8 = Ptr to any part *
* *
**************************************************************************
A_STAY_TIL_ZBASE
CALLA GET_HEAD_PART
MOVE *A8(OGUARD_STARTZ),A2,W
JRZ ASTZ_X ;BR = No value to check
SLL 4,A2
MOVE @ZBASE,A14,L
CMP A2,A14
JRGT ASTZ_X ;BR = We have surpassed our target
SUBIM 50H,*A8(AnimFrm),L ;Back to the hoes
JRUC A_SCREEN_CK ;Check if we are on screen
ASTZ_X
RETS
**************************************************************************
* *
* A_DEC_STAY_TIL_ZERO *
* *
* Anim func to decrement a given word value at some offset *
* into the head part of a multi-parter. *
* *
* A8 = Ptr to any part *
* AARG+,W = Variable offset *
* *
**************************************************************************
A_DEC_STAY_TIL_ZERO
CALLA GETAFARG_WORD
CALLA GET_HEAD_PART
ADD A8,A0
MOVE *A0,A14,W
JRZ ADSTZ_X
DEC A14
MOVE A14,*A0,W
JRZ ADSTZ_X
SUBIM 60H,*A8(AnimFrm),L ;Back to where we were
ADSTZ_X
RETS
**************************************************************************
* *
* A_INCREASE_ROPE_OXVEL *
* *
* Anim func to increase the OXVEL of the rope. *
* *
* A8 = Ptr to head part *
* AARG+,L = Amount to increase *
* *
**************************************************************************
A_INCREASE_ROPE_OXVEL
CALLA GETAFARG_LONG
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRNZ AIRO_ADD_IT ;BR = Rope is flipped
NEG A0 ;The rope is backwards
AIRO_ADD_IT
ADDRM A0,*A8(OXVEL),L
RETS
**************************************************************************
* *
* LET'S GET DOWN AND DATA! *
* *
**************************************************************************
.DATA
*
*SOME SOUNDS FOR YOU
*
NUM_HIT_SNDS .EQU 2
TAB_HIT_SNDS
.LONG SND_HIT1, SND_HIT2
SND_HIT1
.WORD 0F102H,23,0A46CH,0 ;Metal hit
SND_HIT2
.WORD 0F102H,20,0A46FH,0 ;Metal hit
SND_BODY_HIT
.WORD 0F102H,26,0A1CFH,0 ;Bullet hits his body
NUM_DEATH_SNDS .EQU 2
TAB_DEATH_SNDS
.LONG SND_DEATH1, SND_DEATH2
SND_DEATH1
.WORD 0F342H,46,0A474H,0
SND_DEATH2
.WORD 0F342H,41,0A477H,0
SND_BZERK_EXPLODE
.WORD 0F142H,60,0A38BH,0 ;Explosion used by much
SND_CRAZY_RUN
.WORD 0F342H,64,0A468H,0
SND_GROUND_HIT
.WORD 0F330H,26,0A1D1H,0
SND_JUMP_LAND
.WORD 0F330H,26,0A1D1H,0
;SND_ROCKET_HIT
; .WORD 0F330H,52,0A341H,0
SND_BZERK_FIRE
.WORD 0F305H,25,0A10BH,0 ;Berzerker fire sound
SND_BZERK_THROW
.WORD 0F142H,30,0A469H,0
*
* Object initialization table for the Berzerker
*
BZERK_INIT
.byte 4, 0, 1, 0 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long ZT1STX_A1 ;IMGPAL
.word OID_BZERK, OM_COLL
.LONG BZERK_CVECT
*
* .long IMG
* .word OCTRL, OFLAGS, OZOFF, OPTION_FLAGS
*
NUM_LEGS .EQU 1
LWWWW ZL1STX_A1, DMAWNZ, M_NODISP, 0, OM_GUNV
.LONG BZERK_GUNVECT
NUM_TORSO .EQU 2
LWWWW ZT1STX_A1, DMAWNZ, M_NODISP, -1, OM_ANIM|OM_PRVGUNV
.LONG ANIM_VELOCITY_WATCH
LWWWW ZH1STX_A1, DMAWNZ, M_NODISP, -2, OM_PRVGUNV
LWWWW ZT1STX_A1, DMAWNZ, M_NODISP, -1, OM_PRVGUNV
*
*Animation script to keep tabs on the velocity and movement boundries
*
ANIM_VELOCITY_WATCH
LWL 1,1|AFunc,A_VELOCITY_WATCH
.LONG 0
HEADON_CRAZY_RUN_ANIM
LWL 1,1|AMulti|AFunc,A_CALC_HEADON_TARGET
LWLL 1,1|AFunc,A_SOUND+2,SND_CRAZY_RUN
HCRA_LOOP
LW ZL1RN_A1,1|AMulti
LW ZT1RNX_A1,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,3|AFunc,OBJ_OFF
LW ZL1RN_A2,1|AMulti
LW ZT1RNX_A2,3
LW ZL1RN_A3,1|AMulti
LW ZT1RNX_A3,3
LW ZL1RN_A4,1|AMulti
LW ZT1RNX_A4,3
LW ZL1RN_A5,1|AMulti
LW ZT1RNX_A5,3
LW ZL1RN_A6,1|AMulti
LW ZT1RNX_A6,3
LW ZL1RN_A7,1|AMulti
LW ZT1RNX_A1_a,3
LW ZL1RN_A8,1|AMulti
LW ZT1RNX_A2_a,3
LW ZL1RN_A9,1|AMulti
LW ZT1RNX_A3,3
LW ZL1RN_A10,1|AMulti
LW ZT1RNX_A4_a,3
LWLL ZL1RN_A11,1|AMulti|AFunc,A_AnimFrm+2,HCRA_LOOP
LWL ZT1RNX_A6_a,3|AFunc,A_SCREEN_CK
*
* Throw axe, starting from hands over head
*
HEADON_THROW_ANIM
LW ZL1OT_A9,1|AMulti
LW ZT1OT_A9,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,3|AFunc,OBJ_OFF
LW ZL1OT_A10,1|AMulti
LW ZT1OT_A10,1|AMulti
LWL ZA1OT_A10,3|AFunc,OBJ_ON
LWLLWW ZL1OT_A11,1|AMulti|AFunc,A_SPAWN_PROJECTILE+4,AXE_INIT,-3,-99
LWLL ZT1OT_A11,1|AMulti|AFunc,A_SOUND+2,SND_BZERK_THROW
LW ZH1OT_A11,3
LW ZL1OT_A13,1|AMulti
LW ZT1OT_A13,1|AMulti
LWL 1,3|AFunc,OBJ_OFF
LW ZL1OT_A14,1|AMulti
LW ZT1OT_A14,25
LW ZL1OT_A13,1|AMulti
LW ZT1OT_A13,4
LW ZL1STX_A1,1|AMulti
LW ZT1STX_A1,1|AMulti
LWL ZH1STX_A1,50|AFunc,OBJ_ON
LW ZL1G_A2,1|AMulti
LW ZT1G_A2,1|AMulti
LW ZH1G_A2,5
LW ZL1G_A4,1|AMulti
LW ZT1G_A4,1|AMulti
LW ZH1G_A4,5
LW ZB1G_A5,1|AMulti
LW ZH1G_A5,1|AMulti
LWL 1,5|AFunc,OBJ_OFF
LW ZL1G_A6,1|AMulti
LW ZT1G_A6,1|AMulti
LWL ZH1G_A6,1|AMulti|AFunc,OBJ_ON
LWL ZA1G_A6,5|AFunc,OBJ_ON
LW ZL1G_A8,1|AMulti
LW ZT1G_A8,1|AMulti
LW ZH1G_A8,1|AMulti
LWL 1,5|AFunc,OBJ_OFF
LWLL ZL1ST_A1,1|AMulti|AFunc,A_AnimGo+2,ANIM_STRUM_SHOOT
LW ZT1ST_A1,1|AMulti
LW ZH1ST_A1,1|AMulti
LWL ZA1ST_A1,30|AFunc,OBJ_ON
*
* Jam on the guitar
*
;ANIM_JAM
; LWLWWW ZB1JAM_A1,1|AMulti|AFunc,A_RAND_REL_BYTE+3,2,4,AnimLoop
; LW ZA1JAM_A1,1|AMulti
; LW ZH1JAM_A1,1|AMulti
; LWL 1,6|AFunc,OBJ_OFF
;ANIM_JAM_LOOP
; LW ZB1JAM_A2,1|AMulti
; LW ZA1JAM_A2,1|AMulti
; LW ZH1JAM_A2,6
; LW ZB1JAM_A3,1|AMulti
; LW ZA1JAM_A3,1|AMulti
; LW ZH1JAM_A3,6
; LW ZB1JAM_A4,1|AMulti
; LW ZA1JAM_A4,1|AMulti
; LW ZH1JAM_A4,6
; LW ZB1JAM_A5,1|AMulti
; LW ZA1JAM_A5,1|AMulti
; LW ZH1JAM_A5,6
; LW ZB1JAM_A6,1|AMulti
; LW ZH1JAM_A6,1|AMulti
; LWL 1,6|AFunc,OBJ_OFF
; LW ZL1JAM_A7,1|AMulti
; LW ZT1JAM_A7,1|AMulti
; LWL ZH1JAM_A7,6|AFunc,OBJ_ON
; LWLL ZB1JAM_A1,1|AMulti|AFunc,A_Anim_DSJ+2,ANIM_JAM_LOOP
; LW ZA1JAM_A1,1|AMulti
; LW ZH1JAM_A1,6
; LWL 1,1|AFunc,A_SCREEN_CK
*
* Do a Pete Townsend and fire that crazy guitar
*
ANIM_STRUM_SHOOT
LW ZB1PLTR_A2,1|AMulti
LW ZH1PLTR_A2,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,6|AFunc,OBJ_OFF
LWLWWW ZL1PL_A1,1|AMulti|AFunc,A_RAND_REL_BYTE+3,3,7,ORAPIDCNT
LW ZT1PL_A1,1|AMulti
LWL ZH1PL_A1,4|AFunc,OBJ_ON
LWL ZL1PL_A2,1|AMulti|AFunc,A_INITIALIZE_FIRING
LW ZT1PL_A2,1|AMulti
LW ZH1PL_A2,4
ANIM_STRUM_LOOP
LW ZL1PL_A3,1|AMulti
LW ZT1PL_A3,1|AMulti
LW ZH1PL_A3,4
LW ZL1PL_A4,1|AMulti
LW ZT1PL_A4,1|AMulti
LW ZH1PL_A4,1|AMulti
LWL ZA1PL_A4,4|AFunc,OBJ_ON
LW ZL1PL_A5,1|AMulti
LW ZT1PL_A5,1|AMulti
LW ZH1PL_A5,1|AMulti
LW ZA1PL_A5,4
LW ZL1PL_A6,1|AMulti
LW ZT1PL_A6,1|AMulti
LW ZH1PL_A6,1|AMulti
LWL 1,4|AFunc,OBJ_OFF
LW ZL1PL_A7,1|AMulti
LW ZT1PL_A7,1|AMulti
LW ZH1PL_A7,4
LW ZL1PL_A8,1|AMulti
LW ZT1PL_A8,1|AMulti
LW ZH1PL_A8,4
LW 1,1|AMulti
LWLWW 1,1|AFunc,A_FIRE_FNC+2,-10,-74
LWLL ZL1PLSH_A9,1|AMulti|AFunc,A_CHANGE_PAL+2,P_GXZERS
LWLL ZT1PLSH_A9,1|AMulti|AFunc,A_CHANGE_PAL+2,P_GXZERS
LWLL ZH1PLSH_A9,3|AFunc,A_CHANGE_PAL+2,P_GXZERS
LWLL ZL1PL_A2,1|AMulti|AFunc,A_CHANGE_PAL+2,P_GXZERK
LWLL ZT1PL_A2,1|AMulti|AFunc,A_CHANGE_PAL+2,P_GXZERK
LWLL ZH1PL_A2,3|AFunc,A_CHANGE_PAL+2,P_GXZERK
LWLL 1,1|AFunc,A_STAND_RAPIDFIRE_DECISION+2,ANIM_STRUM_LOOP
LWL 1,1|AFunc,A_SCREEN_CK
LWL 1,1|AFunc,A_JUMP_OFF_CK
*
* Pick that axe up over head
*
ANIM_OVERHEAD
LW ZL1OT_A1,1|AMulti
LW ZT1OT_A1,1|AMulti
LWL ZH1OT_A1,1|AMulti|AFunc,OBJ_ON
LWL ZA1OT_A1,6|AFunc,OBJ_ON
LW ZL1OT_A3,1|AMulti
LW ZT1OT_A3,1|AMulti
LW ZH1OT_A3,1|AMulti
LW ZA1OT_A3,6
LW ZL1OT_A5,1|AMulti
LW ZT1OT_A5,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,6|AFunc,OBJ_OFF
LW ZL1OT_A7,1|AMulti
LW ZT1OT_A7,1|AMulti
LWL ZH1OT_A7,1|AMulti|AFunc,OBJ_ON
LWL ZA1OT_A7,4|AFunc,OBJ_ON
LWL 1,1|AFunc,A_THROW_OR_RUN
*
* Jump from where you are, up and off the screen
*
ANIM_JUMP_OFF
LW ZL1J_A8,1|AMulti
LW ZT1J_A8,1|AMulti
LW ZH1J_A8,1|AMulti
LWL 1,10|AFunc,OBJ_OFF
LWLL ZL1J_A2,1|AMulti|AFunc,A_SET_OYVEL+2,-80000H
LW ZT1J_A2,1|AMulti
LW ZH1J_A2,1|AMulti
LWL ZA1J_A2,3|AFunc,OBJ_ON
LW ZB1J_A6,1|AMulti
LW ZH1J_A6,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,3|AFunc,OBJ_OFF
LW ZL1J_A4,1|AMulti
LW ZT1J_A4,1|AMulti
LW ZH1J_A4,1|AMulti
LWL 1,3|AFunc,OBJ_OFF
AJO_LOOP
LWLL 1,10|AFunc,A_ONSCREEN+2,AJO_LOOP
LWL 1,1|AFunc,DEL_ENEMY_NOAUD
*
* Jump from above to the ground.
*
ANIM_JUMP_ON
LWLL ZL1J_A4,1|AMulti|AFunc,A_SET_OYVEL+2,60000H
LW ZT1J_A4,1|AMulti
LW ZH1J_A4,1|AMulti
LWL 1,1|AFunc,OBJ_OFF
AJO_WAIT
LWLWL 1,1|AFunc,A_GROUND_CK+3,30,AJO_WAIT
LW ZB1J_A6,1|AMulti
LW ZH1J_A6,1|AMulti
LWL 1,4|AFunc,OBJ_OFF
LWL ZL1J_A8,1|AMulti|AFunc,A_HIT_GROUND
LWLL ZT1J_A8,1|AMulti|AFunc,A_SOUNDZ+2,SND_JUMP_LAND
LWL ZH1J_A8,10|AFunc,OBJ_ON
LWLL ZL1ST_A1,1|AMulti|AFunc,A_AnimFrm+2,ANIM_OVERHEAD
LW ZT1ST_A1,1|AMulti
LW ZH1ST_A1,1|AMulti
LWL ZA1ST_A1,6|AFunc,OBJ_ON
*
* Stand guard and then bring up axe and run towards player
*
ANIM_GUARD
LW ZB1ST_A5,1|AMulti
LW ZH1ST_A5,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,6|AFunc,OBJ_OFF
LWL 1,5|AFunc,A_STAY_TIL_ONSCRN
LWL 1,5|AFunc,A_STAY_TIL_ZBASE
LWLW 1,1|AFunc,A_DEC_STAY_TIL_ZERO+1,OGUARD_ATIME
LW ZL1ST_A6,1|AMulti
LW ZT1ST_A6,1|AMulti
LWL ZH1ST_A6,6|AFunc,OBJ_ON
LWLL ZL1ST_A7,1|AMulti|AFunc,A_AnimGo+2,ANIM_OVERHEAD
LW ZT1ST_A7,1|AMulti
LW ZH1ST_A7,1|AMulti
LWL ZA1ST_A7,6|AFunc,OBJ_ON
HEADON_STOP_ANIM
HEADON_SHOOT_ANIM
HEADON_DEATH_ANIM
LWLL ZL1DX_A2,1|AMulti|AFunc,A_CHANGE_PAL+2,P_GXZERK
LWLL ZT1DX_A2,1|AMulti|AFunc,A_CHANGE_PAL+2,P_GXZERK
LWLL ZA1DX_A2,1|AMulti|AFunc,A_OBJ_ON_CHANGE_PAL+2,P_GXZERK
LWLL ZH1DX_A2,4|AFunc,A_OBJ_ON_CHANGE_PAL+2,P_GXZERK
LW ZH1DX_A3,1|AMulti
LW ZT1DX_A3,1|AMulti
LW ZL1DX_A3,1|AMulti
LW ZA1DX_A3,4
LW ZH1DX_A4,1|AMulti
LW ZT1DX_A4,1|AMulti
LW ZL1DX_A4,1|AMulti
LW ZA1DX_A4,1
ROCKET_DEATH_GROUND_WAIT
LWLWL 1,1|AFunc,A_GROUND_CK+3,0,ROCKET_DEATH_GROUND_WAIT
LWL ZH1DX_A5,1|AMulti|AFunc,A_HIT_GROUND
LWLL ZT1DX_A5,1|AMulti|AFunc,A_SOUNDZ+2,SND_GROUND_HIT
LW ZL1DX_A5,1|AMulti
LWL 1,4|AFunc,OBJ_OFF
LW ZA1DX_A7,1|AMulti
LWL ZT1DX_A7,1|AMulti|AFunc,A_CLR_ALL_Z
LWL ZL1DX_A7,60|AFunc,A_CLR_ALL_X
LWL 1,1|AFunc,DELETE_ENEMY
SIDE_DEATH_ANIM
**************************************************************************
* *
* Berzerker miscellany *
* *
**************************************************************************
.IF 0
*
* Object initialization table for the Berzerker
*
ROPE_INIT
.byte 2, 0, 1, 0 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long ROPESEC01 ;IMGPAL
.word OID_JUNK, OM_DUMCOLL
*
* .long IMG
* .word OCTRL, OFLAGS, OZOFF, OPTION_FLAGS
*
LWWWW ROPESEC07, DMAWNZ, M_NOSCALE, 0, OM_ANIM
.LONG ANIM_ROPE_SWING
LWWWW ROPESEC07b, DMAWNZ, M_NOSCALE, 0, 0
ANIM_ROPE_SWING
LW 1,5
ANIM_ROPE_LOOP
LWLL ROPESEC06,1|AMulti|AFunc,A_INCREASE_ROPE_OXVEL+2,08000H
LW ROPESEC06b,5
LWLL ROPESEC05,1|AMulti|AFunc,A_INCREASE_ROPE_OXVEL+2,08000H
LW ROPESEC05b,5
LWLL ROPESEC04,1|AMulti|AFunc,A_INCREASE_ROPE_OXVEL+2,08000H
LW ROPESEC04b,5
LWLL ROPESEC03,1|AMulti|AFunc,A_INCREASE_ROPE_OXVEL+2,08000H
LW ROPESEC03b,5
LW ROPESEC02,1|AMulti
LW ROPESEC02b,5
LW ROPESEC01,1|AMulti
LW ROPESEC01b,4
LWLW 1,1|AFunc,A_TOGGLE_FLPS+1,M_FLIPH
LW ROPESEC02,1|AMulti
LW ROPESEC02b,5
LW ROPESEC03,1|AMulti
LW ROPESEC03b,6
LW ROPESEC04,1|AMulti
LW ROPESEC04b,7
LWLL ROPESEC05,1|AMulti|AFunc,A_INCREASE_ROPE_OXVEL+2,08000H
LW ROPESEC05b,8
LWLL ROPESEC06,1|AMulti|AFunc,A_INCREASE_ROPE_OXVEL+2,08000H
LW ROPESEC06b,9
LWLL ROPESEC07,1|AMulti|AFunc,A_INCREASE_ROPE_OXVEL+2,08000H
LW ROPESEC07b,5
LWLL 1,4|AFunc,A_INCREASE_ROPE_OXVEL+2,08000H
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_ROPE_LOOP
.ENDIF
.ref CURPLYR_ADJ,SCRL_DISPATCHER
.def S_CREATE_BZERKS
**************************************************************************
* *
* .LONG S_CREATE_BZERKS *
* .word how many *
* .word how many ticks apart *
* .word left world X, right world X *
* .long close Z, far Z *
* *
**************************************************************************
S_CREATE_BZERKS:
move a11,a5
move *a5+,a0 ; how many
calla CURPLYR_ADJ
move a0,a8 ; adjusted number in a8
move *a5+,a3 ; ticks between creations
move *a5+,a9,L ; x range
move *a5+,a10,L ; min Z
move *a5+,a2,L ; max Z
sll 12,a2
sra 4,a10
movy a2,a10
movk 1,a11 ; don't leave screen
SCBlp:
CREATE PID_BZERK,PROC_BZERK_JMP_WRLD
mmtm a12,a3,a5
SLEEPR a3
mmfm a12,a3,a5
dsjs a8,SCBlp
move a5,a11
sleep 90
jauc SCRL_DISPATCHER
.END