3230 lines
74 KiB
NASM
3230 lines
74 KiB
NASM
.MLIB "GXMACS.LIB"
|
||
.FILE "GXNINJA.ASM"
|
||
.TITLE "<<< GENERATION X -- Ninja 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 "GXNINJA.TBL"
|
||
.INCLUDE "GXNATV.H"
|
||
|
||
***** In this file
|
||
|
||
.DEF PROC_NINJA_JUMPIN, AU_CREATE_WALKWAY_NINJA
|
||
.DEF AU_CREATE_DESK_NINJA, AU_CREATE_SHUFFLE_NINJA
|
||
.DEF AU_CREATE_SIDE_NINJA, PROC_STONED_NINJA
|
||
.DEF AU_CREATE_SHUFFLE_NINJA_OPP, AU_CREATE_SIDE_NINJA_OPP
|
||
|
||
***** from GXRAM.ASM
|
||
.REF WAVETIME, CURPLYRS, HOLD_ENEMY_DISPATCH, ENEMY_HITALL
|
||
.REF OBJENEMIES, SOCRATES, RAND, NUM_NSTARS, ENEMY_QUOTA, WAVE
|
||
.REF LAB_RAT
|
||
|
||
***** 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
|
||
.REF A_SET_OXVEL, A_PreFrag_Center, A_INIT_AnimSLP
|
||
.REF A_TOGGLE_FLIP, A_STAY_TIL_OFFSCRN
|
||
|
||
***** 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, YWORLD, REPOS_OBJ, ZREL_OFF, XSCROLL, YHALF
|
||
.REF ZSCROLL, WORLD_GRNDOFF, SET_ANIPYU
|
||
|
||
***** 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 GXCOG.ASM
|
||
.REF HIT_ENEMY, A_CLR_ALL_X, A_CLR_ALL_Z, OBJ_DRAWBITS_MULTI
|
||
.REF STORE_OCONST
|
||
|
||
***** from GXMONDR2.ASM
|
||
.REF A_SPAWN_PROJECTILE, NSTAR_INIT
|
||
|
||
***** from GXBLOOD.ASM
|
||
.REF BLOODY_BULLET_HIT, A_BLOOD_SPLORCH, A_SBOMB_BLOOD
|
||
.REF BIGBOY_ROCKET_BLOOD
|
||
|
||
***** from GXCONTRL.ASM
|
||
.REF ENEMYP_COLL
|
||
|
||
***** from GXNONBOY.ASM
|
||
.REF N_CHUNK
|
||
|
||
***** from GXUNIJP2.ASM
|
||
.REF WHAREA, ROW_PARMS_TABLE
|
||
|
||
***** from GXUTIL.ASM
|
||
.REF SET_VECTORS
|
||
|
||
***** from GXBUG.ASM
|
||
.REF SET_OCONST
|
||
|
||
*
|
||
* Ninja RAM
|
||
*
|
||
.BSS NINJA_POPS,16
|
||
|
||
.BSS BIG_LIST,16*3 ;BIGBOY PICK LIST
|
||
|
||
.TEXT
|
||
|
||
|
||
* Ninja 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
|
||
B_FOLLOW EQU 8 ;Follow the scroll
|
||
B_FLY_IN EQU 9 ;Fly in from the side
|
||
B_OPP_FLIP EQU 10 ;Flip opposite the enemy generator
|
||
|
||
|
||
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
|
||
M_FOLLOW EQU 0100H
|
||
M_FLY_IN EQU 0200H
|
||
M_OPP_FLIP EQU 0400H
|
||
|
||
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
|
||
|
||
NINJA_HITS_TO_KILL EQU 2 ;HITS REQUIRED TO KILL NINJA
|
||
|
||
NINJA_FLASH_COLOR EQU 3E3EH ;FLASH COLOR FOR NINJA
|
||
|
||
SHORT_DEATH_ZVEL .EQU 1C0H
|
||
LONG_DEATH_ZVEL .EQU 2C0H
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PROC_NINJA_HEADON_OFFSET *
|
||
* *
|
||
* Process to create a head-on Ninja at an offset from *
|
||
* another object. *
|
||
* *
|
||
* A8 = Object to offset from *
|
||
* A9 = [Y,X] offset *
|
||
* A11 = Z offset *
|
||
* *
|
||
**************************************************************************
|
||
PROC_NINJA_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_NINJA_HEADON
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PROC_NINJA_HEADON *
|
||
* *
|
||
* Process to create a head-on Ninja. *
|
||
* *
|
||
* A9 = Universe X *
|
||
* A10 = Universe Y *
|
||
* A11 = Universe Z *
|
||
* *
|
||
**************************************************************************
|
||
PROC_NINJA_HEADON
|
||
CLR A8 ;Clear OFLAGS for headon
|
||
JRUC PROC_NINJA
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PROC_NINJA_JUMPIN *
|
||
* *
|
||
* Create a Ninja 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] *
|
||
* A11 = Univ Y *
|
||
* *
|
||
**************************************************************************
|
||
PROC_NINJA_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
|
||
|
||
MOVE A11,A10
|
||
|
||
MOVE A0,A11
|
||
|
||
MOVE @SOCRATES,A14,W
|
||
JRNZ PNJ_CRATES
|
||
|
||
CLR A8
|
||
JRUC PNJ_PICK_TYPE
|
||
|
||
PNJ_CRATES
|
||
MOVI 512,A0
|
||
CALLA RANDPER
|
||
JRNC PNJ_PICK_TYPE ;BR = Not a follower
|
||
MOVI M_FOLLOW,A8 ;Setup some flags
|
||
PNJ_PICK_TYPE
|
||
MOVI 700,A0
|
||
CALLA RANDPER
|
||
JRC PNJ_JUMPER
|
||
|
||
ORI M_FLY_IN|M_SIDE,A8 ;Make him the fly from side type
|
||
|
||
MOVE @RAND,A6,W
|
||
ANDI M_FLIPH,A6 ;Random flip this guy
|
||
|
||
JRUC PROC_NINJA
|
||
|
||
PNJ_JUMPER
|
||
ORI M_JUMP_IN,A8
|
||
JRUC PROC_NINJA
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PROC_NINJA_STAND *
|
||
* *
|
||
* Create a Ninja 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_NINJA_STAND
|
||
MOVE A8,A6
|
||
MOVI M_GUARD,A8
|
||
JRUC PROC_NINJA
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PROC_NINJA *
|
||
* *
|
||
* Process entry point to create a Ninja. *
|
||
* *
|
||
* A6 = General purpose register, saved through Create *
|
||
* A8 = EFLAGS to denote Side or Headon *
|
||
* A9 = Universe X *
|
||
* A10 = Universe Y *
|
||
* A11 = Universe Z *
|
||
* *
|
||
**************************************************************************
|
||
PROC_NINJA
|
||
MOVE @HOLD_ENEMY_DISPATCH,A14,W
|
||
JANE SUCIDE
|
||
|
||
MOVI OID_NINJA,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 NINJA_INIT,B0
|
||
CALLA CREATE_ENEMY
|
||
MMFM SP,A6,A7 ;Preserve status please
|
||
JRZ PBH_EXIT ;BR = Could not create the dude
|
||
|
||
MOVI SRUNVEL_MAX,A0
|
||
MOVI SRUNVEL_MIN,A1
|
||
CALLA RANGRAND
|
||
MOVE A0,*A8(OSRUNVEL),L ;SET SIDE VELOCITY
|
||
|
||
MOVIM HRUNVEL,*A8(OHRUNVEL),L ;Set the headon velocity
|
||
|
||
MOVE A11,A3
|
||
|
||
MOVE @ZREL_OFF,A14,L
|
||
SRA ZFRAC,A14
|
||
ADD A14,A3
|
||
|
||
MOVE A9,A1
|
||
MOVE A10,A2
|
||
|
||
BTST B_JUMP_IN,A7
|
||
JRZ PN_NOJUMPIN
|
||
|
||
; MOVE @YWORLD,A5,L
|
||
; MOVE @WORLD_GRNDOFF,A14,L
|
||
; ADD A14,A5
|
||
|
||
; SUB A5,A2
|
||
; MOVE A2,*A8(OGRNDOFF),L
|
||
|
||
MOVK 10,A5
|
||
NEG A5
|
||
STOUY A3,A5
|
||
|
||
MOVE A5,A2 ;Set us off of the top of the screen
|
||
JRUC PN_POSITION
|
||
|
||
PN_NOJUMPIN
|
||
BTST B_FLY_IN,A7
|
||
JRZ PN_NOFLYIN
|
||
|
||
; MOVE @WORLD_GRNDOFF,A5,L
|
||
; MOVE @YWORLD,A14,L
|
||
; ADD A5,A14
|
||
; MOVE A2,A5
|
||
; SUB A14,A5
|
||
; MOVE A5,*A8(OGRNDOFF),L
|
||
|
||
BTST B_FLIPH,A6
|
||
JRZ PN_FLY_LEFT
|
||
MOVI 460,A5
|
||
JRUC PN_FLY_CALC
|
||
PN_FLY_LEFT
|
||
MOVI -60,A5
|
||
PN_FLY_CALC
|
||
STOUX A3,A5
|
||
|
||
MOVE A5,A1 ;Set us off of the top of the screen
|
||
JRUC PN_POSITION
|
||
|
||
PN_NOFLYIN
|
||
PN_POSITION
|
||
CALLA SET_ANIPU ;Position him
|
||
|
||
BTST B_JUMP_IN,A7
|
||
JRZ PNA_NO_JUMP ;BR = This is not a jump in guy
|
||
|
||
MOVI ANIM_JUMP_ON,A1
|
||
JRUC PNA_LOAD_HEAD
|
||
|
||
PNA_NO_JUMP
|
||
BTST B_FLY_IN,A7
|
||
JRZ PNA_NO_FLY ;BR = This is not a jump in guy
|
||
|
||
MOVI ANIM_JUMP_SYDE,A1
|
||
JRUC PNA_LOAD_HEAD
|
||
|
||
PNA_NO_FLY
|
||
BTST B_GUARD,A7
|
||
JRZ PNA_RUNNING ;BR = This is not a guard guy
|
||
|
||
MOVE A6,*A8(OGUARD_STARTZ),L ;Save our starting ZBASE
|
||
MOVI ANIM_GUARD,A1
|
||
JRUC PNA_LOAD_HEAD
|
||
PNA_RUNNING
|
||
MOVI HEADON_HANDSPRING_ANIM,A1
|
||
PNA_LOAD_HEAD
|
||
MOVIM HEADON_DEATH_ANIM,*A8(ODEATH_ANIM),L
|
||
MOVIM HEADON_STOP_ANIM,*A8(OSTOP_ANIM),L
|
||
MOVIM HEADON_THROW_STAR_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 NINJA_FLASH_COLOR,A1
|
||
CALLA STORE_OCONST ;STORE THE PROPER VALUE FOR CONSTANT
|
||
|
||
CALLA OBJ_ON_MULTI ;We create with the objects off
|
||
|
||
MOVE @LAB_RAT,A14,W
|
||
JRZ PBH_YELPAL
|
||
|
||
MOVI NINBLU64,A0
|
||
CALLA CHANGE_PAL_MULTI
|
||
|
||
PBH_YELPAL
|
||
CALLA GET_SHAD_MULTI ;Setup his shadow
|
||
|
||
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
|
||
JRUC NINJA_WATCH
|
||
|
||
PBH_EXIT
|
||
DIE
|
||
|
||
NINJA_WATCH
|
||
MOVE A13,*A8(OPLINK),L
|
||
NINJA_WATCH_LOOP
|
||
SLOOP 7000H,NINJA_WATCH_LOOP ;Here we wait for shit to happen
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* Universe anim func to create a Ninja that will jump *
|
||
* onto a factory walkway. Direction is taken from H-flip of *
|
||
* generator. Position is offset from generator position. *
|
||
* *
|
||
* AARG+,W = X offset *
|
||
* AARG+,W = Y offset *
|
||
* AARG+,L = Bridge jump table *
|
||
* *
|
||
**************************************************************************
|
||
AU_CREATE_WALKWAY_NINJA
|
||
MOVE @OBJENEMIES,A14,W
|
||
BTST B_OF_WNINJA,A14
|
||
JRZ ACWN_ABORT ;BR = not allowed, yet
|
||
|
||
MOVI OID_NINJA,A0
|
||
CALLA GET_ENEMY_COUNT
|
||
CMPK 3,A0
|
||
JRHS ACWN_ABORT ;BR = There are too many
|
||
|
||
PUSH A8
|
||
MOVI NINJA_INIT,B0 ;Get us one
|
||
CALLA CREATE_ENEMY
|
||
PULL A2 ;A2=obj block of creator,
|
||
;pull must preserve status.
|
||
JRZ ACWN_ABORT ;BR = Object not created.
|
||
|
||
MOVI SRUNVEL_MAX,A0
|
||
MOVI SRUNVEL_MIN,A1
|
||
CALLA RANGRAND
|
||
MOVE A0,*A8(OSRUNVEL),L ;SET SIDE VELOCITY
|
||
|
||
MOVE *A2(OCTRL),A14
|
||
BTST B_FLIPH,A14
|
||
JRZ ACWN_NOFLIP
|
||
|
||
MOVI M_FLIPH,A0
|
||
CALLA SET_FLPS
|
||
|
||
ACWN_NOFLIP
|
||
*
|
||
* set position
|
||
*
|
||
MOVE A8,A9
|
||
MOVE A2,A8
|
||
|
||
CALLA GETAFARG_LONG ; pixel Y:X in a0
|
||
MOVE A0,A4
|
||
|
||
MOVE *A8(OZVAL),A3,L
|
||
ADDK 8,A3 ;Hold Z for set
|
||
|
||
MOVE *A8(OXVAL),A1,L
|
||
MOVE *A8(OYVAL),A2,L
|
||
MOVE A4,A5 ; do X and Y
|
||
SEXT A5
|
||
SRA 16,A4
|
||
SLL 15,A5
|
||
SLL 15,A4
|
||
ADD A5,A1
|
||
ADD A4,A2
|
||
|
||
CALLA GETAFARG_LONG
|
||
MOVE A0,*A9(OJUMPTAB),L ;Load that jump table
|
||
|
||
MOVE A9,A8
|
||
|
||
MOVE @YWORLD,A14,L
|
||
MOVE A2,A4
|
||
SUB A14,A4
|
||
MOVE A4,*A8(OGRNDOFF),L
|
||
|
||
MOVK 10,A7
|
||
NEG A7
|
||
STOUY A3,A7
|
||
|
||
MOVE A7,A2 ;Set us off of the top of the screen
|
||
; SUBI 200 << 15, A2 ;Offset for above screen
|
||
|
||
CALLA SET_ANIPU
|
||
|
||
MOVIM HEADON_DEATH_ANIM,*A8(ODEATH_ANIM),L
|
||
CLRM *A8(OSTOP_ANIM),L
|
||
MOVIM HEADON_THROW_STAR_ANIM,*A8(OSHOOT_ANIM),L
|
||
|
||
MOVI ANIM_JUMP_ON,A1
|
||
CALLA STRT_ANIM ;START ANIMATION
|
||
|
||
MOVIM M_SIDE|M_BRIDGE,*A8(OEFLAGS),W ;Give this enemy some personality
|
||
|
||
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
|
||
|
||
MOVI NINJA_FLASH_COLOR,A1
|
||
CALLA STORE_OCONST ;STORE THE PROPER VALUE FOR CONSTANT
|
||
|
||
CREATE PID_NINJA,NINJA_WATCH
|
||
MOVE A0,*A8(OPLINK),L
|
||
|
||
ACWN_ABORT
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* AU_CREATE_DESK_NINJA *
|
||
* *
|
||
* Universe anim func to create a Ninja that will jump *
|
||
* from behind a desk, over it, then attack. *
|
||
* *
|
||
* AARG+,W = X offset *
|
||
* AARG+,W = Y offset *
|
||
* AARG+,L = Z offset *
|
||
* *
|
||
**************************************************************************
|
||
AU_CREATE_DESK_NINJA
|
||
MOVK B_OF_DNINJA,A1
|
||
MOVI M_INVINCIBLE,A6 ;This keeps the flags
|
||
MOVI ANIM_JUMP_OVER,A7 ;This is our initial animation
|
||
JRUC CREATE_NINJA_GROUND
|
||
|
||
**************************************************************************
|
||
* *
|
||
* AU_CREATE_SHUFFLE_NINJA *
|
||
* *
|
||
* Universe anim func to create a Ninja that will shuffle *
|
||
* out from behind a wall, then attack or flip towards you. *
|
||
* *
|
||
* AARG+,W = X offset *
|
||
* AARG+,W = Y offset *
|
||
* AARG+,L = Z offset *
|
||
* *
|
||
**************************************************************************
|
||
AU_CREATE_SHUFFLE_NINJA
|
||
MOVK B_OF_WNINJA,A1
|
||
CLR A6 ;This keeps the flags
|
||
MOVI ANIM_SHUFFLE_OUT,A7 ;This is our initial animation
|
||
JRUC CREATE_NINJA_GROUND
|
||
|
||
**************************************************************************
|
||
* *
|
||
* AU_CREATE_SHUFFLE_NINJA_OPP *
|
||
* *
|
||
* Universe anim func to create a Ninja that will shuffle *
|
||
* out from behind a wall, then attack or flip towards you. *
|
||
* Flip is opposite that of the generator. *
|
||
* *
|
||
* AARG+,W = X offset *
|
||
* AARG+,W = Y offset *
|
||
* AARG+,L = Z offset *
|
||
* *
|
||
**************************************************************************
|
||
AU_CREATE_SHUFFLE_NINJA_OPP
|
||
MOVK B_OF_WNINJA,A1
|
||
MOVI M_OPP_FLIP,A6 ;This keeps the flags
|
||
MOVI ANIM_SHUFFLE_OUT,A7 ;This is our initial animation
|
||
JRUC CREATE_NINJA_GROUND
|
||
|
||
**************************************************************************
|
||
* *
|
||
* AU_CREATE_SIDE_NINJA *
|
||
* *
|
||
* Universe anim func to create a Ninja that will jump *
|
||
* out from behind a wall, then attack or flip towards you. *
|
||
* *
|
||
* AARG+,W = X offset *
|
||
* AARG+,W = Y offset *
|
||
* AARG+,L = Z offset *
|
||
* *
|
||
**************************************************************************
|
||
AU_CREATE_SIDE_NINJA
|
||
MOVK B_OF_WNINJA,A1
|
||
CLR A6 ;This keeps the flags
|
||
MOVI ANIM_JUMP_SYDE,A7 ;This is our initial animation
|
||
JRUC CREATE_NINJA_GROUND
|
||
|
||
**************************************************************************
|
||
* *
|
||
* AU_CREATE_SIDE_NINJA_OPP *
|
||
* *
|
||
* Universe anim func to create a Ninja that will jump *
|
||
* out from behind a wall, then attack or flip towards you. *
|
||
* Flip is opposite that of the generator. *
|
||
* *
|
||
* AARG+,W = X offset *
|
||
* AARG+,W = Y offset *
|
||
* AARG+,L = Z offset *
|
||
* *
|
||
**************************************************************************
|
||
AU_CREATE_SIDE_NINJA_OPP
|
||
MOVK B_OF_WNINJA,A1
|
||
MOVI M_OPP_FLIP,A6 ;This keeps the flags
|
||
MOVI ANIM_JUMP_SYDE,A7 ;This is our initial animation
|
||
JRUC CREATE_NINJA_GROUND
|
||
|
||
*
|
||
* Create a ground dwelling ninja (i.e. behind desk, out from wall)
|
||
*
|
||
* AARG+,W = X Offset
|
||
* AARG+,W = Y Offset
|
||
* AARG+,L = Z Offset
|
||
* AARG+,L = Generator animation branch on failure (0 = none)
|
||
* A1 = OBJENEMIES bit to test
|
||
* A6 = EFLAGS
|
||
* A7 = Animation script
|
||
* A8 = Ptr to generator object
|
||
*
|
||
CREATE_NINJA_GROUND
|
||
MOVE @OBJENEMIES,A14,W
|
||
BTST A1,A14
|
||
JRZ CNG_ABORT ;BR = not allowed, yet
|
||
|
||
MOVI OID_NINJA,A0
|
||
CALLA GET_ENEMY_COUNT
|
||
CMPK 3,A0
|
||
JRHS CNG_ABORT ;BR = There are too many
|
||
|
||
MMTM SP,A6,A7
|
||
PUSH A8
|
||
MOVI NINJA_INIT,B0 ;Get us one
|
||
CALLA CREATE_ENEMY
|
||
PULL A2 ;A2=obj block of creator,
|
||
MMFM SP,A6,A7
|
||
JRNZ CNG_GO ;BR = Object created succesfully
|
||
|
||
MOVE A2,A8
|
||
JRUC CNG_ABORT
|
||
|
||
CNG_GO
|
||
MOVI SRUNVEL_MAX,A0
|
||
MOVI SRUNVEL_MIN,A1
|
||
CALLA RANGRAND
|
||
MOVE A0,*A8(OSRUNVEL),L ;SET SIDE VELOCITY
|
||
|
||
MOVIM HRUNVEL,*A8(OHRUNVEL),L
|
||
*
|
||
* set position
|
||
*
|
||
MOVE A8,A9
|
||
MOVE A2,A8
|
||
|
||
CALLA GETAFARG_LONG ; pixel Y:X in a0
|
||
MOVE A0,A4
|
||
|
||
CALLA GETAFARG_LONG ;Get Z offset
|
||
|
||
MOVE *A8(OZVAL),A3,L
|
||
ADD A0,A3
|
||
|
||
MOVE *A8(OXVAL),A1,L
|
||
MOVE *A8(OYVAL),A2,L
|
||
MOVE A4,A5 ; do X and Y
|
||
|
||
SEXT A5
|
||
|
||
CLR A0
|
||
|
||
BTST B_OPP_FLIP,A6
|
||
JRZ CNG_NORM_FLIP_CK ;BR = No opposite flipping for you
|
||
|
||
MOVE *A8(OCTRL),A14
|
||
BTST B_FLIPH,A14
|
||
JRNZ CNG_NOFLIP ;BR = Don't flip this guy
|
||
JRUC CNG_FLIP
|
||
|
||
CNG_NORM_FLIP_CK
|
||
MOVE *A8(OCTRL),A14
|
||
BTST B_FLIPH,A14
|
||
JRZ CNG_NOFLIP
|
||
|
||
CNG_FLIP
|
||
NEG A5
|
||
MOVI M_FLIPH,A0
|
||
|
||
CNG_NOFLIP
|
||
|
||
SRA 16,A4
|
||
SLL 15,A5
|
||
SLL 15,A4
|
||
ADD A5,A1
|
||
ADD A4,A2
|
||
|
||
|
||
MOVE A9,A8
|
||
|
||
CALLA SET_FLPS
|
||
|
||
; MOVE @YWORLD,A14,L
|
||
; MOVE A2,A4
|
||
; SUB A14,A4
|
||
; MOVE A4,*A8(OGRNDOFF),L
|
||
|
||
CALLA SET_ANIPU
|
||
|
||
MOVIM HEADON_DEATH_ANIM,*A8(ODEATH_ANIM),L
|
||
CLRM *A8(OSTOP_ANIM),L
|
||
MOVIM HEADON_THROW_STAR_ANIM,*A8(OSHOOT_ANIM),L
|
||
|
||
MOVE A7,A1
|
||
CALLA STRT_ANIM ;START ANIMATION
|
||
|
||
MOVE A6,*A8(OEFLAGS),W ;Give this enemy some personality
|
||
|
||
MOVI NINJA_FLASH_COLOR,A1
|
||
CALLA STORE_OCONST ;STORE THE PROPER VALUE FOR CONSTANT
|
||
|
||
MOVE @LAB_RAT,A14,W
|
||
JRZ CNG_YELPAL
|
||
|
||
MOVI NINBLU64,A0
|
||
CALLA CHANGE_PAL_MULTI
|
||
|
||
CNG_YELPAL
|
||
|
||
CALLA GET_SHAD_MULTI ;Setup his shadow
|
||
|
||
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
|
||
|
||
CREATE PID_NINJA,NINJA_WATCH
|
||
MOVE A0,*A8(OPLINK),L
|
||
|
||
RETS
|
||
|
||
*
|
||
* Come here on failure, this tries to branch animation of generator
|
||
*
|
||
CNG_ABORT
|
||
CALLA GETAFARG_LONG ;Throw out offsets
|
||
CALLA GETAFARG_LONG ;And Throw out more offsets
|
||
CALLA GETAFARG_LONG ;Get branch
|
||
JRZ CNG_AX ;BR = No branch to make
|
||
MOVE A0,*A8(AnimFrm),L ;OOPS!
|
||
CNG_AX
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* NINJA_CVECT *
|
||
* *
|
||
**************************************************************************
|
||
NINJA_CVECT
|
||
WWL OID_PROCKET,~MASK_PLAYER,NINJA_CD_COLL
|
||
WWL OID_PEXPLOSION,MASK_SUPP|MASK_TYPE|MASK_ID,NINJA_EXPLOSION_COLL
|
||
WWL OID_BLOWUP,0FFFFH,NINJA_SBOMB_COLL
|
||
WL 0,DUMCRETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* NINJA_GUNVECT *
|
||
* *
|
||
* PASS: *
|
||
* A2 = PTR TO PLAYER *
|
||
* A8 = PTR TO OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
NINJA_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 NINJA_DO_DEATH ;BR = Wicked bullets being used
|
||
|
||
BTST B_INVINCIBLE,A6 ;ARE WE CURRENTLY INVINCIBLE?
|
||
JRNE BG_DEAD ;BR = YES, JUST EXIT
|
||
|
||
*
|
||
* A4 = OPARTID of part shot
|
||
* A6 = OEFLAGS
|
||
* A9 = OFLAGS
|
||
*
|
||
BG_TAKE_HIT
|
||
CLR A5
|
||
MOVK NINJA_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 NINJA_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
|
||
|
||
*
|
||
* Ninja is still alive here
|
||
*
|
||
MOVI NINJA_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
|
||
|
||
**************************************************************************
|
||
* *
|
||
* NINJA_UNFLASH *
|
||
* *
|
||
* Process subroutine to turn off the Ninja flash and *
|
||
* invinciblity bits. *
|
||
* *
|
||
* A8 = Ptr to head object *
|
||
* *
|
||
* Note: Call with JSRP *
|
||
* *
|
||
**************************************************************************
|
||
NINJA_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
|
||
|
||
**************************************************************************
|
||
* *
|
||
* NINJA_SBOMB_COLL *
|
||
* *
|
||
* Ninja get hit by a smart bomb. *
|
||
* *
|
||
* A2 = Ptr to player smart bombing *
|
||
* A8 = Ptr to Ninja *
|
||
* *
|
||
**************************************************************************
|
||
NINJA_SBOMB_COLL
|
||
CLR A5
|
||
CALLA GET_HEAD_PART
|
||
|
||
MOVIM ANIM_NINJA_SBOMB_EXPLODE,*A8(ODEATH_ANIM),L
|
||
|
||
JRUC NINJA_GEN_COLL
|
||
|
||
**************************************************************************
|
||
* *
|
||
* NINJA_CD_COLL *
|
||
* *
|
||
* Ninja get hit by a CD *
|
||
* *
|
||
* A0 = Ptr to CD *
|
||
* A8 = Ptr to Ninja *
|
||
* *
|
||
**************************************************************************
|
||
NINJA_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
|
||
|
||
**************************************************************************
|
||
* *
|
||
* NINJA_EXPLOSION_COLL *
|
||
* *
|
||
* Ninja collides with a player explosion. *
|
||
* *
|
||
* A0 = Ptr to explosion *
|
||
* A8 = Ptr to Ninja *
|
||
* *
|
||
**************************************************************************
|
||
NINJA_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
|
||
|
||
MOVIM ANIM_NINJA_EXPLODE,*A8(ODEATH_ANIM),L
|
||
|
||
*
|
||
* A2 = Ptr to player that killed us
|
||
* A8 = Ptr to head part of object
|
||
*
|
||
NINJA_GEN_COLL
|
||
MOVE A2,*A8(OPLAYER),L
|
||
|
||
MOVE *A8(OFLAGS),A9,W
|
||
|
||
MOVE *A8(OEFLAGS),A6,W
|
||
|
||
SOUND1 SND_NINJA_EXPLODE
|
||
|
||
CLRM *A8(OHRUN_DURATION),W
|
||
|
||
CALLA ALL_COLLS_OFF
|
||
|
||
MOVE A5,A5
|
||
JRZ NINJA_DO_DEATH ;BR = No explosion attached
|
||
|
||
SWAP A5,A8
|
||
CALLA GET_HEAD_PART
|
||
CALLA OBJ_OFF_MULTI ;Kill the explosion
|
||
SWAP A5,A8
|
||
|
||
*
|
||
* This is a generic Ninja 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
|
||
*
|
||
NINJA_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
|
||
|
||
*
|
||
* This is the bullet death thing
|
||
*
|
||
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
|
||
MOVE A1,*A8(AnimFrm),L
|
||
CLR A14
|
||
MOVB A14,*A8(AnimSlp)
|
||
BEC_DEAD
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* Anim funcs for the Ninja *
|
||
* *
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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
|
||
; MOVE @ZSCROLL,A14,L
|
||
; JRZ AVW_STOP_STOP
|
||
; JRN AVW_BACKING
|
||
|
||
; MOVE *A8(OZVEL),A2,L
|
||
; JRLE AVW_STOP_STOP
|
||
|
||
; MOVI 05000H,A10
|
||
; MOVE A10,A11
|
||
; JRUC A_CALC_BT_Z
|
||
|
||
;AVW_BACKING
|
||
; MOVE *A8(OZVEL),A2,L
|
||
; JRGE AVW_STOP_STOP
|
||
|
||
; MOVI 05000H,A10
|
||
; MOVE A10,A11
|
||
; JRUC A_CALC_HT_Z
|
||
|
||
AVW_STOP_STOP
|
||
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
|
||
A_SCREEN_CK_MEAT
|
||
CALLA SCRTST
|
||
JANZ DEL_ENEMY_NOAUD
|
||
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_SCREEN_CK_FOLLOW *
|
||
* *
|
||
* Anim func to check if the Ninja should follow the scroll. *
|
||
* If not, then just do a normal screen check. *
|
||
* *
|
||
* A8 = Ptr to any part *
|
||
* *
|
||
**************************************************************************
|
||
A_SCREEN_CK_FOLLOW
|
||
CALLA GET_HEAD_PART
|
||
MOVE *A8(OEFLAGS),A14,W
|
||
BTST B_FOLLOW,A14
|
||
JRZ A_SCREEN_CK_MEAT
|
||
CLR A4
|
||
JRUC A_FOLLOW_SCROLL
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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_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_BACKWARD_TARGET *
|
||
* *
|
||
* Anim func to pick a target point and calculate the numbers *
|
||
* to get there. *
|
||
* *
|
||
* A8 = Ptr to head part *
|
||
* *
|
||
**************************************************************************
|
||
A_CALC_BACKWARD_TARGET
|
||
MOVE @SOCRATES,A14,W
|
||
JRZ ACBT_NO_CRATE
|
||
|
||
MOVI 0B000H,A10
|
||
MOVI 09000H,A11
|
||
|
||
MOVI 20,A0
|
||
CALLA SRAND
|
||
JRUC A_TARGET_GOT_X
|
||
|
||
ACBT_NO_CRATE
|
||
MOVI 0C000H,A10
|
||
MOVI 0A000H,A11
|
||
|
||
JRUC A_TARGET_G
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CALC_BT_Z *
|
||
* *
|
||
* Anim func to pick a target point and calculate the numbers. *
|
||
* You provide the Z *
|
||
* *
|
||
* A8 = Ptr to head part *
|
||
* A10 = Max target Z *
|
||
* A11 = Min target Z *
|
||
* *
|
||
**************************************************************************
|
||
A_CALC_BT_Z
|
||
MOVE @SOCRATES,A14,W
|
||
JRZ A_TARGET_G
|
||
|
||
MOVI 20,A0
|
||
CALLA SRAND
|
||
JRUC A_TARGET_GOT_X
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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 9000H,A10
|
||
MOVI 8000H,A11
|
||
|
||
A_CALC_HT_Z
|
||
MOVE @SOCRATES,A14,W
|
||
JRZ A_TARGET_G
|
||
|
||
MOVI 20,A0
|
||
CALLA SRAND
|
||
JRUC A_TARGET_GOT_X
|
||
|
||
*
|
||
* Generic entry for target calculation
|
||
* A10 = Max target Z
|
||
* A11 = Min target Z
|
||
*
|
||
A_TARGET_G
|
||
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_NINJA,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
|
||
|
||
A_TARGET_GOT_X
|
||
MOVE A0,A5 ;This is our world X target
|
||
SLL 16,A5
|
||
|
||
MOVE A10,A0
|
||
MOVE A11,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
|
||
|
||
MOVE *A8(OHRUNVEL),A2,L
|
||
|
||
SUB A7,A1 ;Get the Z distance to travel
|
||
JRGE ACHT_GOING_FORWARD
|
||
|
||
ABS A1
|
||
|
||
NEG A2
|
||
|
||
MOVE @SOCRATES,A14,W
|
||
JRZ ACHT_STUFF_Z ;BR = Don't need to add this now
|
||
|
||
MOVE @ZSCROLL,A14,L
|
||
JRGE ACHT_STUFF_Z
|
||
|
||
ADD A14,A2
|
||
JRUC ACHT_STUFF_Z
|
||
|
||
ACHT_GOING_FORWARD
|
||
MOVE @SOCRATES,A14,W
|
||
JRZ ACHT_STUFF_Z ;BR = Don't need to add this now
|
||
|
||
MOVE @ZSCROLL,A14,L
|
||
JRLE ACHT_STUFF_Z
|
||
ADD A14,A2
|
||
ACHT_STUFF_Z
|
||
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_SHUFFLE *
|
||
* *
|
||
* Anim func to determine what should be done, now that *
|
||
* the Ninja has landed and is ready for battle. *
|
||
* *
|
||
* A8 = Ptr to Ninja head object *
|
||
* *
|
||
**************************************************************************
|
||
A_THROW_OR_SHUFFLE
|
||
MOVI 512,A0
|
||
CALLA RANDPER
|
||
JRNC ATOS_SHUFFLE
|
||
|
||
MOVI HEADON_THROW_STAR_ANIM,A1
|
||
JAUC SetAnim
|
||
|
||
ATOS_SHUFFLE
|
||
SLL 28,A0
|
||
SRL 28,A0
|
||
INC A0
|
||
MOVB A0,*A8(AnimLoop)
|
||
MOVI HEADON_SHUFFLE_ANIM,A1
|
||
JAUC SetAnim
|
||
|
||
*
|
||
* Decide if we should throw, do a shuffle step or hand spring
|
||
*
|
||
A_THROW_SHUFFLE_OR_SPRING
|
||
MOVE @WAVE,A14,W
|
||
CMPK LAST_WAVE,A14
|
||
JREQ A_THROW_OR_SHUFFLE ;BR = These are the finale' guys
|
||
|
||
MOVE *A8(OEFLAGS),A14,W
|
||
BTST B_BRIDGE,A14
|
||
JRNZ A_THROW_OR_SHUFFLE
|
||
|
||
BTST B_FOLLOW,A14
|
||
JRZ ATSOS_SHUFFLE_CK
|
||
|
||
MOVI HEADON_THROW_STAR_ANIM,A4
|
||
JRUC A_FOLLOW_SCROLL
|
||
|
||
ATSOS_SHUFFLE_CK
|
||
MOVE *A8(OZVAL),A1,L
|
||
MOVE @ZBASE,A14,L
|
||
SUB A14,A1 ;Universe to World Z
|
||
|
||
CMPI 09000H,A1
|
||
JRLT A_THROW_OR_SHUFFLE ;BR = Too far, needs to run closer
|
||
|
||
MOVI HEADON_HANDSPRING_ANIM,A1
|
||
JAUC SetAnim
|
||
|
||
*
|
||
* Follow the scroll
|
||
* A4 = Animation branch if we don't need to follow. (0 = fall through)
|
||
*
|
||
A_FOLLOW_SCROLL
|
||
MOVE *A8(OXVAL),A1,L
|
||
MOVE *A8(OZVAL),A2,L
|
||
MOVE A2,A3
|
||
|
||
MOVE @ZBASE,A14,L
|
||
SUB A14,A3
|
||
CMPI ZMAX_REAL,A3
|
||
JALT AFS_WAY_FORWARD ;BR = Too far forward, deal with 'em
|
||
|
||
MOVE @SOCRATES,A14,W
|
||
JRZ AFS_NOCRATE
|
||
|
||
MOVE @WHAREA,A6,W
|
||
MOVE A6,A14
|
||
SLL 5,A6
|
||
SLL 6,A14
|
||
ADD A6,A14
|
||
ADDI ROW_PARMS_TABLE,A14
|
||
|
||
MOVE *A14(40H),A6,L ;A1 = UNIVERSE Z FARTHEST
|
||
MOVE @ZREL_OFF,A14,L
|
||
SRA ZFRAC,A14
|
||
ADD A14,A6
|
||
|
||
CMP A6,A2
|
||
JRGT AFS_WAY_BACK
|
||
|
||
AFS_NOCRATE
|
||
UTOSX A2,A1 ;Get a screen position for this guy
|
||
|
||
MOVE @XSCROLL,A3,L
|
||
JRN AFS_CK_RIGHTSIDE ;BR = Scrolling left, check right edge
|
||
JRNZ AFS_CK_LEFTSIDE ;BR = Scrolling right, check left edge
|
||
|
||
CMPI 75,A1
|
||
JRLT SHUFFLE_RIGHT
|
||
|
||
CMPI 325,A1
|
||
JRLE AFS_X
|
||
|
||
SHUFFLE_LEFT
|
||
MOVI M_FLIPH,A0
|
||
JRUC AFS_DO_SHUFFLE
|
||
|
||
SHUFFLE_RIGHT
|
||
CLR A0
|
||
AFS_DO_SHUFFLE
|
||
CALLA SET_FLPS
|
||
|
||
MOVK 3,A0
|
||
MOVE A3,A3
|
||
JRZ ATOS_SHUFFLE
|
||
ADDK 2,A0 ;More if we are moving
|
||
JRUC ATOS_SHUFFLE
|
||
|
||
AFS_CK_RIGHTSIDE
|
||
MOVE *A8(OXVEL),A14,L
|
||
JRNN AFS_CR_GO ;BR = Velocity is not happening correctly
|
||
|
||
ABS A3
|
||
ABS A14
|
||
SUB A3,A14
|
||
JRGT AFS_X ;BR = Moving faster than the scroll
|
||
|
||
AFS_CR_GO
|
||
CMPI 325,A1
|
||
JRGE SHUFFLE_LEFT
|
||
JRUC AFS_X
|
||
|
||
AFS_CK_LEFTSIDE
|
||
MOVE *A8(OXVEL),A14,L
|
||
JRN AFS_CL_GO ;BR = Velocity is not happening correctly
|
||
JREQ AFS_CL_GO
|
||
|
||
ABS A3
|
||
ABS A14
|
||
SUB A3,A14
|
||
JRGT AFS_X ;BR = Moving faster than the scroll
|
||
|
||
AFS_CL_GO
|
||
CMPI 75,A1
|
||
JRLE SHUFFLE_RIGHT
|
||
AFS_X
|
||
MOVE A4,A1
|
||
JANZ SetAnim
|
||
RETS
|
||
|
||
*
|
||
* The guy is too far forward in Z
|
||
* A1 = OXVAL
|
||
* A2 = OZVAL
|
||
* A8 = Ptr to head object
|
||
*
|
||
AFS_WAY_FORWARD
|
||
MOVE @XBASE,A14,L
|
||
SUB A14,A1
|
||
|
||
MOVE @ZSCROLL,A14,L
|
||
JRLE AFS_DEL
|
||
|
||
ABS A1
|
||
SRA 16,A1
|
||
CMPI 50,A1
|
||
JRGT AFS_DEL
|
||
|
||
MOVI BACKWARD_HANDSPRING_ANIM,A1
|
||
JAUC STRT_ANIM
|
||
|
||
AFS_DEL
|
||
ADDKM 1,@NINJA_POPS,W
|
||
JAUC DEL_ENEMY_NOAUD
|
||
|
||
*
|
||
* The guy is too far back in Z
|
||
* A1 = OXVAL
|
||
* A2 = OZVAL
|
||
* A3 = World Z pos
|
||
* A8 = Ptr to head object
|
||
*
|
||
AFS_WAY_BACK
|
||
MOVE @XBASE,A14,L
|
||
SUB A14,A1
|
||
|
||
MOVE @ZSCROLL,A14,L
|
||
JRGE AFS_STAND_OR_JUMP
|
||
|
||
ABS A1
|
||
SRA 16,A1
|
||
CMPI 50,A1
|
||
JRGT AFS_STAND_OR_JUMP
|
||
|
||
MOVI HEADON_HANDSPRING_ANIM,A1
|
||
JAUC STRT_ANIM
|
||
|
||
AFS_STAND_OR_JUMP
|
||
MOVE @XSCROLL,A14,L
|
||
JRNZ AFS_JUMP_OFF
|
||
|
||
MOVI HEADON_STAND_ANIM,A1
|
||
JAUC STRT_ANIM
|
||
|
||
AFS_JUMP_OFF
|
||
ADDKM 1,@NINJA_POPS,W
|
||
MOVI ANIM_JUMP_OFF,A1
|
||
JAUC STRT_ANIM
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CK_FALL *
|
||
* *
|
||
* Anim func to check if we should fall into oblivion *
|
||
* *
|
||
* A8 = Ptr to Head part of object *
|
||
* *
|
||
**************************************************************************
|
||
A_CK_FALL
|
||
MOVE *A8(OEFLAGS),A14,W
|
||
BTST B_BRIDGE,A14
|
||
JRZ ACF_X ;BR = Not up on something
|
||
|
||
SOUNDZ SND_LONG_FALL
|
||
|
||
MOVI HEADON_FALL_ANIM,A1
|
||
JAUC SetAnim
|
||
ACF_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* 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_HIT_GROUND - Animation Function for when the enemy hits the ground *
|
||
* while jumping. It zeros velocity and sets on ground. *
|
||
* A8 = Ptr to object *
|
||
* *
|
||
**************************************************************************
|
||
A_HIT_GROUND
|
||
CALLA GET_HEAD_PART
|
||
CLR A14
|
||
MOVE A14,*A8(OYVEL),L
|
||
MOVE A14,*A8(OYACCEL),W
|
||
MOVE A14,*A8(OZVEL),L
|
||
MOVE *A8(OXVAL),A3,L
|
||
MOVE @YWORLD,A2,L
|
||
MOVE @WORLD_GRNDOFF,A0,L
|
||
ADD A0,A2
|
||
MOVE *A8(OGRNDOFF),A0,L
|
||
ADD A0,A2
|
||
MOVE *A8(OZVAL),A1,L
|
||
JAUC REPOS_OBJ
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CK_SPEARS *
|
||
* *
|
||
* Anim func to check the number of spears and skip throw *
|
||
* if there are too many. *
|
||
* *
|
||
**************************************************************************
|
||
A_CK_SPEARS
|
||
MOVE @NUM_NSTARS,A14,W
|
||
CMPK 3,A14
|
||
JRLS ACS_X
|
||
|
||
MOVIM HEADON_SKIP_THROW,*A8(AnimFrm),L
|
||
|
||
ACS_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_SETUP_JUMP_OVER *
|
||
* *
|
||
* Set velocities for jumping over something. *
|
||
* *
|
||
* A8 = Ptr to head part of object *
|
||
* *
|
||
**************************************************************************
|
||
A_SETUP_JUMP_OVER
|
||
MOVIM -40000H,*A8(OYVEL),L
|
||
MOVIM 3000H,*A8(OYACCEL),W
|
||
MOVIM -20H,*A8(OZVEL),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_NGROUND_CK *
|
||
* *
|
||
* Anim func to check if an object is above ground. *
|
||
* If it is, then branch. *
|
||
* *
|
||
* A8 = Ptr to object *
|
||
* AARG+,W = Integer Ground offset *
|
||
* AARG+,L = Branch *
|
||
* *
|
||
**************************************************************************
|
||
A_NGROUND_CK
|
||
CALLA GETAFARG_WORD
|
||
MOVE A0,A2
|
||
SLL 16,A2
|
||
|
||
CALLA GET_HEAD_PART_A0
|
||
MOVE *A0(OYVEL),A14,L
|
||
JRN AGC_BRANCH ;BR = We are going up
|
||
|
||
CALLA DIST_FROM_GROUND
|
||
CMP A2,A1
|
||
JRLE AGC_X
|
||
AGC_BRANCH
|
||
CALLA GETAFARG_LONG
|
||
MOVE A0,A1
|
||
CALLA GET_HEAD_PART
|
||
JAUC SetAnim
|
||
AGC_X
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CHECK_OBSTRUCTION *
|
||
* *
|
||
* Check if the given point offset from the objects animation *
|
||
* point is free from obstruction. *
|
||
* If it is not, then branch. *
|
||
* *
|
||
* A8 = Object *
|
||
* AARG+,L = [Y,X] Offset *
|
||
* AARG+,L = Branch if obstructed *
|
||
* *
|
||
**************************************************************************
|
||
A_CHECK_OBSTRUCTION
|
||
CALLA GETAFARG_LONG
|
||
MOVE A0,A3
|
||
MOVE A3,A7
|
||
|
||
SEXT A3,W
|
||
SLL 15,A3 ;X WORLD OFFSET
|
||
SRA 16,A7
|
||
SLL 15,A7 ;Y WORLD OFFSET
|
||
MOVE *A8(OCTRL),A14,W ;ADJUST FIRING OFFSET IF NECESSARY
|
||
BTST B_FLIPH,A14
|
||
JREQ ACO_CKV ;BR=NO HORIZONTAL FLIP
|
||
NEG A3
|
||
ACO_CKV
|
||
BTST B_FLIPV,A14
|
||
JREQ ACO_OFF ;BR=NO VERTICAL FLIP
|
||
NEG A7
|
||
ACO_OFF
|
||
MOVE *A8(OXVAL),A14,L
|
||
ADD A14,A3 ;X UNIVERSE
|
||
MOVE *A8(OYVAL),A14,L
|
||
ADD A14,A7 ;Y UNIVERSE
|
||
MOVE *A8(OZVAL),A2,L ;Z UNIVERSE
|
||
|
||
UTOSXY A2,A3,A7 ;UNIVERSE X,Y TO SCREEN X,Y TRANSLATION
|
||
SLL 16,A7
|
||
ZEXT A3,W
|
||
ADDXY A7,A3 ;A3 IN [Y,X] FORMAT
|
||
|
||
CALLA ENEMYP_COLL
|
||
JANZ SetAnim_AFARG ;BR = There is an obstruction
|
||
|
||
MOVE @HOLD_ENEMY_DISPATCH,A14,W
|
||
JANZ SetAnim_AFARG ;BR = We are not to throw
|
||
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CLR_INVINCIBLE *
|
||
* *
|
||
* Anim func to clear the invinciblity flag *
|
||
* *
|
||
* A8 = Ptr to any part *
|
||
* *
|
||
**************************************************************************
|
||
A_CLR_INVINCIBLE
|
||
CALLA GET_HEAD_PART
|
||
ANDNIM M_INVINCIBLE,*A8(OEFLAGS),W
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_SIDE_FLY *
|
||
* *
|
||
* Anim func to start him flying to the side. *
|
||
* *
|
||
* A8 = Ptr to head part *
|
||
* *
|
||
**************************************************************************
|
||
A_SIDE_FLY
|
||
MOVI 24000H,A1
|
||
MOVI 2C000H,A0
|
||
CALLA RANGERND
|
||
|
||
MOVE *A8(OCTRL),A14,W
|
||
BTST B_FLIPH,A14
|
||
JRZ ASF_NOT_FLIPPED
|
||
|
||
NEG A0
|
||
MOVE @XSCROLL,A2,L
|
||
JRNN ASF_STUFF_XVEL
|
||
|
||
ADD A2,A0
|
||
JRUC ASF_STUFF_XVEL
|
||
|
||
ASF_NOT_FLIPPED
|
||
MOVE @XSCROLL,A2,L
|
||
JRN ASF_STUFF_XVEL
|
||
|
||
ADD A2,A0
|
||
|
||
ASF_STUFF_XVEL
|
||
MOVE A0,*A8(OXVEL),L
|
||
|
||
MOVE *A8(OZVAL),A2,L
|
||
MOVE @ZBASE,A14,L
|
||
SUB A14,A2
|
||
CMPI 0B000H,A2
|
||
JRGE ASF_FAR_FLY
|
||
MOVIM -2C000H,*A8(OYVEL),L
|
||
JRUC ASF_FLY_ACCEL
|
||
ASF_FAR_FLY
|
||
MOVIM -40000H,*A8(OYVEL),L
|
||
ASF_FLY_ACCEL
|
||
MOVIM 3000H,*A8(OYACCEL),W
|
||
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_SET_NINJA_OXVEL *
|
||
* *
|
||
* Anim func to set the OXVEL for the Ninja. *
|
||
* *
|
||
* AARG+,L = Absolute XVEL to set *
|
||
* *
|
||
**************************************************************************
|
||
A_SET_NINJA_OXVEL
|
||
MOVE *A8(OEFLAGS),A14,W
|
||
BTST B_FOLLOW,A14
|
||
JAZ A_SET_OXVEL
|
||
|
||
CALLA GETAFARG_LONG
|
||
|
||
MOVE *A8(OCTRL),A14,W
|
||
BTST B_FLIPH,A14
|
||
JRNZ ASNO_FLIPPED
|
||
MOVE @XSCROLL,A1,L
|
||
JRN ASNO_STUFFIT
|
||
JRUC ASNO_ADDIT
|
||
ASNO_FLIPPED
|
||
NEG A0
|
||
MOVE @XSCROLL,A1,L
|
||
JRNN ASNO_STUFFIT
|
||
ASNO_ADDIT
|
||
ADD A1,A0
|
||
ASNO_STUFFIT
|
||
MOVE A0,*A8(OXVEL),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CHECK_XBOUNDS *
|
||
* *
|
||
* Anim func to check the current X boundries of the Ninja *
|
||
* *
|
||
* A8 = Ptr to any part *
|
||
* *
|
||
**************************************************************************
|
||
A_CHECK_XBOUNDS
|
||
MOVE @SOCRATES,A14,W
|
||
JRZ ACX_X
|
||
|
||
CALLA GET_HEAD_PART
|
||
|
||
MOVE *A8(OEFLAGS),A14,W
|
||
BTST B_FOLLOW,A14
|
||
JRZ ACX_X
|
||
|
||
MOVE *A8(OXVEL),A4,L
|
||
JRZ ACX_X ;BR = Not moving
|
||
|
||
CALLR GET_MY_ROW
|
||
JRZ ACX_X ;BR = Row not found
|
||
|
||
MOVE *A6,A2,L ;A1 = UNIVERSE Z FARTHEST
|
||
|
||
MOVY A2,A3
|
||
SRA 16,A3
|
||
SEXT A2
|
||
|
||
MOVE *A8(OXPOS),A1,W
|
||
MOVE A4,A4
|
||
JRNN ACX_CHECK_RIGHT
|
||
|
||
CMP A2,A1
|
||
JRLT ACX_STOP_NOW ;BR = Too far left
|
||
JRUC ACX_X
|
||
|
||
ACX_CHECK_RIGHT
|
||
CMP A3,A1
|
||
JRLT ACX_X ;BR = OK on the right side
|
||
|
||
ACX_STOP_NOW
|
||
CLR A14
|
||
MOVE A14,*A8(OXVEL),L
|
||
MOVE A14,*A8(OXACCEL),W
|
||
|
||
MOVI HEADON_STAND_ANIM,A1
|
||
CALLA STRT_ANIM
|
||
|
||
ACX_X
|
||
RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_SET_SHUFFLE_X *
|
||
* *
|
||
* Anim func to set the amount of shuffle loops to do. *
|
||
* *
|
||
* A8 = Ptr to head part *
|
||
* *
|
||
**************************************************************************
|
||
A_SET_SHUFFLE_X
|
||
MOVE @LAB_RAT,A14,W
|
||
JRZ ASSX_NORM
|
||
|
||
MOVK 2,A0
|
||
MOVB A0,*A8(AnimLoop)
|
||
RETS
|
||
|
||
ASSX_NORM
|
||
MOVK 3,A1
|
||
MOVK 5,A0
|
||
CALLA RANGERND ;And make it into something
|
||
MOVB A0,*A8(AnimLoop)
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_MY_ROW *
|
||
* *
|
||
* Get the current row entry for this guy, based on *
|
||
* current universe Z, not relative. *
|
||
* *
|
||
* A8 = Ptr to object *
|
||
* *
|
||
* Returns: *
|
||
* Z = No row found, A6 = 0 *
|
||
* NZ = Found one, A6 = Entry *
|
||
* *
|
||
**************************************************************************
|
||
GET_MY_ROW
|
||
PUSH A4
|
||
|
||
MOVE *A8(OZVAL),A4,L
|
||
|
||
MOVE @ZREL_OFF,A14,L
|
||
SRA ZFRAC,A14
|
||
|
||
SUB A14,A4
|
||
|
||
MOVI ROW_PARMS_TABLE,A6
|
||
|
||
GMR_LOOP
|
||
MOVE *A6(20H),A14,L
|
||
CMP A14,A4
|
||
JRLT GMR_NEXT ;BR = Too far forward for this one
|
||
|
||
MOVE *A6(40H),A14,L
|
||
CMP A14,A4
|
||
JRLE GMR_GOT_IT ;BR = We found one
|
||
|
||
GMR_NEXT
|
||
ADDI 96,A6
|
||
MOVE *A6,A14,L
|
||
JRNZ GMR_LOOP
|
||
JRUC GMR_X
|
||
|
||
GMR_GOT_IT
|
||
MOVE @WHAREA,A4,W
|
||
MOVE A4,A14
|
||
SLL 5,A4
|
||
SLL 6,A14
|
||
ADD A14,A4
|
||
ADDI ROW_PARMS_TABLE,A4
|
||
CMP A4,A6
|
||
JREQ GMR_USE_IT ;BR = same as WHAREA
|
||
|
||
MOVE @ZSCROLL,A14,L
|
||
JRNZ GMR_USE_IT ;Moving in Z so use what you got
|
||
|
||
MOVE A4,A6 ;Otherwise use correct
|
||
|
||
GMR_USE_IT
|
||
MOVE A6,A6
|
||
GMR_X
|
||
PULL A4
|
||
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,16,0A589H,0 ;Bullet hit vocal response
|
||
SND_HIT2
|
||
.WORD 0F102H,12,0A58CH,0 ;Bullet hit vocal response
|
||
|
||
SND_BODY_HIT
|
||
.WORD 0F302H,26,0A1D1H,0 ;Bullet hits his body
|
||
|
||
SND_CHEST_HIT
|
||
.WORD 0F304H,24,0A1E6H,0 ;Chest plate gets hit
|
||
|
||
NUM_DEATH_SNDS .EQU 2
|
||
TAB_DEATH_SNDS
|
||
.LONG SND_DEATH1, SND_DEATH2
|
||
SND_DEATH1
|
||
.WORD 0F342H,23,0A591H,0
|
||
SND_DEATH2
|
||
.WORD 0F342H,23,0A594H,0
|
||
|
||
SND_LONG_FALL
|
||
.WORD 0F343H,197,0A59AH,0
|
||
|
||
SND_NINJA_EXPLODE
|
||
.WORD 0F142H,60,0A38BH,0 ;Explosion used by much
|
||
|
||
SND_NINJA_EXP_SCREAM
|
||
.WORD 0F342H,30,0A597H,0
|
||
|
||
SND_SPRING_WHOOSH
|
||
.WORD 0F342H,15,0A489H,0 ;Sound of an axe being thrown
|
||
|
||
SND_GROUND_HIT
|
||
.WORD 0F330H,26,0A1D1H,0
|
||
|
||
SND_JUMP_LAND
|
||
.WORD 0F330H,26,0A1D1H,0
|
||
|
||
SND_NINJA_FIRE
|
||
.WORD 0F305H,25,0A10BH,0 ;Ninja fire sound
|
||
SND_NINJA_THROW
|
||
.WORD 0F142H,30,0A469H,0
|
||
|
||
*
|
||
* Object initialization table for the Ninja
|
||
*
|
||
NINJA_INIT
|
||
.byte 4, 0, 1, 0 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long NST1_01A ;IMGPAL
|
||
.word OID_NINJA, OM_COLL
|
||
.LONG NINJA_CVECT
|
||
*
|
||
* .long IMG
|
||
* .word OCTRL, OFLAGS, OZOFF, OPTION_FLAGS
|
||
*
|
||
NUM_LEGS .EQU 1
|
||
LWWWW NST1_01A, DMAWNZ, M_NODISP, 0, OM_GUNV
|
||
.LONG NINJA_GUNVECT
|
||
NUM_TORSO .EQU 2
|
||
LWWWW NST1_01B, DMAWNZ, M_NODISP, -1, OM_ANIM|OM_PRVGUNV
|
||
.LONG ANIM_VELOCITY_WATCH
|
||
LWWWW NST1_01C, DMAWNZ, M_NODISP, -2, OM_PRVGUNV
|
||
LWWWW NST1_01A, DMAWNZ, M_NODISP, -3, 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_HANDSPRING_ANIM
|
||
LWL 1,1|AFunc,A_CALC_HEADON_TARGET
|
||
|
||
LW NSPRING1_12,1|AMulti
|
||
LWL 1,1|AMulti|AFunc,OBJ_OFF
|
||
LWL 1,1|AMulti|AFunc,OBJ_OFF
|
||
LWL 1,3|AFunc,OBJ_OFF
|
||
|
||
LW NSPRING1_11,3
|
||
|
||
LW NSPRING1_10,3
|
||
HHA_LOOP
|
||
LWLL NSPRING1_09,3|AFunc,A_SOUNDZ+2,SND_SPRING_WHOOSH
|
||
|
||
LW NSPRING1_08,3
|
||
|
||
LW NSPRING1_07,3
|
||
|
||
LW NSPRING1_06,3
|
||
|
||
LW NSPRING1_05,3
|
||
|
||
LW NSPRING1_04,3
|
||
|
||
LWLL NSPRING1_10,1|AMulti|AFunc,A_AnimFrm+2,HHA_LOOP
|
||
LWL 1,1|AFunc,A_SCREEN_CK
|
||
|
||
BACKWARD_HANDSPRING_ANIM
|
||
LW NSPRING1_01,1|AMulti
|
||
LWL 1,1|AMulti|AFunc,OBJ_OFF
|
||
LWL 1,1|AMulti|AFunc,OBJ_OFF
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LW NSPRING1_02,4
|
||
|
||
LW NSPRING1_03,3
|
||
|
||
LWL 1,1|AFunc,A_CALC_BACKWARD_TARGET
|
||
|
||
BHA_LOOP
|
||
LWLL NSPRING1_04,3|AFunc,A_SOUNDZ+2,SND_SPRING_WHOOSH
|
||
|
||
LW NSPRING1_05,3
|
||
|
||
LW NSPRING1_06,3
|
||
|
||
LW NSPRING1_07,3
|
||
|
||
LW NSPRING1_08,3
|
||
|
||
LW NSPRING1_09,3
|
||
|
||
LWLL NSPRING1_10,1|AMulti|AFunc,A_AnimFrm+2,BHA_LOOP
|
||
LWL 1,1|AFunc,A_SCREEN_CK
|
||
|
||
*
|
||
* Throw star, starting from stance position 1
|
||
*
|
||
HEADON_THROW_STAR_ANIM
|
||
LWLWWL 1,1|AFunc,A_CHECK_OBSTRUCTION+4,-21,-99,HEADON_STAND_ANIM
|
||
|
||
LW NSTAR1_01A,1|AMulti
|
||
LWL NSTAR1_01B,1|AMulti|AFunc,OBJ_ON
|
||
LWL NSTAR1_01C,1|AMulti|AFunc,OBJ_ON
|
||
LWL 1,3|AFunc,OBJ_OFF
|
||
|
||
LW NSTAR1_02A,1|AMulti
|
||
LW NSTAR1_02B,1|AMulti
|
||
LW NSTAR1_02C,3
|
||
|
||
LW NSTAR1_03A,1|AMulti
|
||
LW NSTAR1_03B,1|AMulti
|
||
LW NSTAR1_03C,1|AMulti
|
||
LWL NSTAR1_03D,3|AFunc,OBJ_ON
|
||
|
||
LWL NSTAR1_04A,1|AMulti|AFunc,A_CK_SPEARS
|
||
LW NSTAR1_04B,1|AMulti
|
||
LWL NSTAR1_04C,1|AMulti|AFunc,A_SCREEN_CK_FOLLOW
|
||
LW NSTAR1_04D,3
|
||
|
||
LW NSTAR1_05A,1|AMulti
|
||
LW NSTAR1_05B,1|AMulti
|
||
LW NSTAR1_05C,1|AMulti
|
||
LWLLWW NSTAR1_05D,10|AFunc,A_SPAWN_PROJECTILE+4,NSTAR_INIT,-21,-99
|
||
|
||
HEADON_SKIP_THROW
|
||
LWLL NNRG1_01A,1|AMulti|AFunc,A_AnimGo+2,HEADON_STAND_ANIM
|
||
LW NNRG1_01B,1|AMulti
|
||
LW NNRG1_01C,1|AMulti
|
||
LW NNRG1_01D,4
|
||
|
||
|
||
*
|
||
* Jump from where you are, up and off the screen
|
||
*
|
||
ANIM_JUMP_OFF
|
||
LW NLD1_04A,1|AMulti
|
||
LW NLD1_04B,1|AMulti
|
||
LW NLD1_04C,1|AMulti
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LW NLD1_03A,1|AMulti
|
||
LW NLD1_03B,1|AMulti
|
||
LW NLD1_03C,10
|
||
|
||
LW NLD1_02A,1
|
||
LW NLD1_02B,1
|
||
LW NLD1_02C,4
|
||
|
||
LWLL NLD1_01A,1|AMulti|AFunc,A_SET_OYVEL+2,-80000H
|
||
LW NLD1_01B,1|AMulti
|
||
LW NLD1_01C,4
|
||
|
||
LWL 1,1|AFunc,DELETE_SHADOW
|
||
|
||
LWL 1,10|AFunc,A_STAY_TIL_OFFSCRN
|
||
|
||
LWL 1,1|AFunc,DEL_ENEMY_NOAUD
|
||
|
||
*
|
||
* Jump from above to the ground.
|
||
*
|
||
ANIM_JUMP_ON
|
||
LWL NJP1_05A,1|AMulti|AFunc,OBJ_ON
|
||
LWL NJP1_05B,1|AMulti|AFunc,OBJ_ON
|
||
LWL NJP1_05C,1|AMulti|AFunc,OBJ_ON
|
||
LWL 1,1|AFunc,OBJ_OFF
|
||
|
||
LWLL 1,1|AFunc,A_SET_OYVEL+2,60000H
|
||
|
||
AJO_WAIT
|
||
LWLWL 1,1|AFunc,A_NGROUND_CK+3,10,AJO_WAIT
|
||
|
||
LWL NLD1_01A,1|AMulti|AFunc,A_HIT_GROUND
|
||
LW NLD1_01B,1|AMulti
|
||
LW NLD1_01C,4
|
||
|
||
LWL NLD1_02A,1|AMulti|AFunc,A_CLR_INVINCIBLE
|
||
LWLL NLD1_02B,1|AMulti|AFunc,A_SOUNDZ+2,SND_JUMP_LAND
|
||
LW NLD1_02C,4
|
||
|
||
LW NLD1_03A,1|AMulti
|
||
LW NLD1_03B,1|AMulti
|
||
LW NLD1_03C,10
|
||
|
||
LW NLD1_04A,1|AMulti
|
||
LW NLD1_04B,1|AMulti
|
||
LW NLD1_04C,4
|
||
|
||
LWL NST1_01A,1|AMulti|AFunc,A_THROW_SHUFFLE_OR_SPRING
|
||
LW NST1_01B,1|AMulti
|
||
LW NST1_01C,6
|
||
|
||
LWL 1,1|AFunc,A_AnimGo+2,HEADON_SHUFFLE_ANIM
|
||
|
||
ANIM_SHUFFLE_OUT
|
||
LWL NSHFL1_01A,1|AMulti|AFunc,OBJ_ON
|
||
LWL NSHFL1_01B,1|AMulti|AFunc,OBJ_ON
|
||
LWL NSHFL1_01C,1|AMulti|AFunc,OBJ_ON
|
||
LWL NSHFL1_01D,1|AFunc,OBJ_ON
|
||
|
||
; LWLWWW 1,1|AFunc,A_RAND_REL_BYTE+3,3,5,AnimLoop
|
||
LWL 1,1|AFunc,A_SET_SHUFFLE_X
|
||
|
||
HEADON_SHUFFLE_ANIM
|
||
LWLL NSHFL1_01A,1|AMulti|AFunc,A_SET_NINJA_OXVEL+2,20000H
|
||
LW NSHFL1_01B,1|AMulti
|
||
LW NSHFL1_01C,1|AMulti
|
||
LWL NSHFL1_01D,4|AFunc,OBJ_ON
|
||
|
||
HEADON_SHUFFLE_LOOP
|
||
LWL NSHFL1_02A,1|AMulti|AFunc,A_CHECK_XBOUNDS
|
||
LW NSHFL1_02B,1|AMulti
|
||
LW NSHFL1_02C,1|AMulti
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LWL NSHFL1_03A,1|AMulti|AFunc,A_CHECK_XBOUNDS
|
||
LW NSHFL1_03B,1|AMulti
|
||
LW NSHFL1_03C,4
|
||
|
||
LWL NSHFL1_04A,1|AMulti|AFunc,A_CHECK_XBOUNDS
|
||
LW NSHFL1_04B,1|AMulti
|
||
LW NSHFL1_04C,1|AMulti
|
||
LWL NSHFL1_04D,4|AFunc,OBJ_ON
|
||
|
||
LWL NSHFL1_05A,1|AMulti|AFunc,A_CHECK_XBOUNDS
|
||
LW NSHFL1_05B,1|AMulti
|
||
LW NSHFL1_05C,1|AMulti
|
||
LW NSHFL1_05D,4
|
||
|
||
LWLL NSHFL1_01A,1|AMulti|AFunc,A_Anim_DSJ+2,HEADON_SHUFFLE_LOOP
|
||
LW NSHFL1_01B,1|AMulti
|
||
LWL NSHFL1_01C,1|AMulti|AFunc,A_SCREEN_CK_FOLLOW
|
||
LW NSHFL1_01D,4
|
||
|
||
HEADON_STAND_ANIM
|
||
LWL NST1_01A,1|AMulti|AFunc,A_CLR_ALL_X
|
||
LWL NST1_01B,1|AMulti|AFunc,OBJ_ON
|
||
LWL NST1_01C,1|AMulti|AFunc,OBJ_ON
|
||
LWL 1,1|AFunc,OBJ_OFF
|
||
|
||
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,15
|
||
|
||
LW 1,0
|
||
|
||
LWL 1,1|AFunc,A_SCREEN_CK_FOLLOW
|
||
|
||
LWL 1,1|AFunc,A_AnimGo+2,HEADON_THROW_STAR_ANIM
|
||
|
||
|
||
*
|
||
* Stand guard and then bring up a staff
|
||
*
|
||
ANIM_GUARD
|
||
LW NST1_01A,1|AMulti
|
||
LW NST1_01B,1|AMulti
|
||
LW NST1_01C,1|AMulti
|
||
LWL 1,1|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
|
||
|
||
LWL 1,1|AFunc,A_AnimGo+2,HEADON_THROW_STAR_ANIM
|
||
|
||
*
|
||
* Jump over desk
|
||
*
|
||
ANIM_JUMP_OVER
|
||
LWL NLD1_03A,1|AMulti|AFunc,OBJ_ON
|
||
LWL NLD1_03B,1|AMulti|AFunc,OBJ_ON
|
||
LWL NLD1_03C,1|AMulti|AFunc,OBJ_ON
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LW NLD1_04A,1|AMulti
|
||
LW NLD1_04B,1|AMulti
|
||
LW NLD1_04C,4
|
||
|
||
LWL NJP1_05A,1|AMulti|AFunc,A_SETUP_JUMP_OVER
|
||
LW NJP1_05B,1|AMulti
|
||
LW NJP1_05C,4
|
||
|
||
|
||
LWLL 1,1|AFunc,A_AnimGo+2,AJO_WAIT
|
||
|
||
*
|
||
* Jump sideways
|
||
*
|
||
ANIM_JUMP_SYDE
|
||
LWL NSYDJP1_01A,1|AMulti|AFunc,OBJ_ON
|
||
LWL NSYDJP1_01B,1|AMulti|AFunc,OBJ_ON
|
||
LWL NSYDJP1_01C,1|AMulti|AFunc,OBJ_ON
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LW NSYDJP1_02A,1|AMulti
|
||
LW NSYDJP1_02B,1|AMulti
|
||
LW NSYDJP1_02C,4
|
||
|
||
LWL NSYDJP1_03A,1|AMulti|AFunc,A_SIDE_FLY
|
||
LW NSYDJP1_03B,1|AMulti
|
||
LW NSYDJP1_03C,1|AMulti
|
||
LWL NSYDJP1_03D,4|AFunc,OBJ_ON
|
||
|
||
LW NSYDJPSTR_05A,1|AMulti
|
||
LW NSYDJPSTR_00B,1|AMulti
|
||
LW NSYDJPSTR_00C,1|AMulti
|
||
LW NSYDJPSTR_00D,4
|
||
|
||
AJS_STAR_THROW
|
||
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,1,5
|
||
LWLWL 1,2|AFunc,A_NGROUND_CK+3,10,AJS_CK_OBJSTRUCT
|
||
|
||
LWLL 1,1|AFunc,A_AnimGo+2,AJS_LAND
|
||
|
||
AJS_CK_OBJSTRUCT
|
||
LWLWWL 1,1|AFunc,A_CHECK_OBSTRUCTION+4,1,-134,AJS_STAR_THROW
|
||
|
||
LW 1,1|AMulti
|
||
LW NSYDJPSTR_01B,1|AMulti
|
||
LW NSYDJPSTR_01C,1|AMulti
|
||
LW NSYDJPSTR_01D,4
|
||
|
||
LW 1,1|AMulti
|
||
LW NSYDJPSTR_02B,1|AMulti
|
||
LW NSYDJPSTR_02C,1|AMulti
|
||
LW NSYDJPSTR_02D,4
|
||
|
||
LW 1,1|AMulti
|
||
LW NSYDJPSTR_05B,1|AMulti
|
||
LW NSYDJPSTR_04C,1|AMulti
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LWLLWW 1,1|AMulti|AFunc,A_SPAWN_PROJECTILE+4,NSTAR_INIT,1,-134
|
||
LW NSYDJPSTR_05B,1|AMulti
|
||
LW NSYDJPSTR_05C,1|AMulti
|
||
LWL NSYDJPSTR_05D,6|AFunc,OBJ_ON
|
||
|
||
LW NSYDJPSTR_05A,1|AMulti
|
||
LW NSYDJPSTR_00B,1|AMulti
|
||
LW NSYDJPSTR_00C,1|AMulti
|
||
LW NSYDJPSTR_00D,1
|
||
|
||
AJS_WAIT
|
||
LWLWL 1,1|AFunc,A_NGROUND_CK+3,10,AJS_WAIT
|
||
|
||
AJS_LAND
|
||
LWL NSYDJP1_06A,1|AMulti|AFunc,A_HIT_GROUND
|
||
LW NSYDJP1_06B,1|AMulti
|
||
LW NSYDJP1_06C,1|AMulti
|
||
LW NSYDJP1_06D,4
|
||
|
||
LWL NSYDJP1_01A,1|AMulti|AFunc,A_CLR_OXVEL
|
||
LW NSYDJP1_01B,1|AMulti
|
||
LW NSYDJP1_01C,1|AMulti
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LWL NST1_01A,1|AMulti|AFunc,A_THROW_SHUFFLE_OR_SPRING
|
||
LW NST1_01B,1|AMulti
|
||
LW NST1_01C,6
|
||
|
||
LWL 1,1|AFunc,A_AnimGo+2,HEADON_SHUFFLE_ANIM
|
||
|
||
|
||
HEADON_STOP_ANIM
|
||
HEADON_SHOOT_ANIM
|
||
|
||
HEADON_DEATH_ANIM
|
||
LW NDIE1_01A,1|AMulti
|
||
LWL NDIE1_01B,1|AMulti|AFunc,OBJ_ON
|
||
LWL NDIE1_01C,1|AMulti|AFunc,OBJ_ON
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LW NDIE1_02A,1|AMulti
|
||
LW NDIE1_02B,1|AMulti
|
||
LWL 1,4|AFunc,OBJ_OFF
|
||
|
||
LWL NDIE1_03A,1|AMulti|AFunc,A_CK_FALL
|
||
LW NDIE1_03B,1|AMulti
|
||
LWL NDIE1_03C,4|AFunc,OBJ_ON
|
||
|
||
ROCKET_DEATH_GROUND_WAIT
|
||
LWLWL 1,1|AFunc,A_NGROUND_CK+3,0,ROCKET_DEATH_GROUND_WAIT
|
||
|
||
LWL NDIE1_04A,1|AMulti|AFunc,A_HIT_GROUND
|
||
LWLL NDIE1_04B,1|AMulti|AFunc,A_SOUNDZ+2,SND_GROUND_HIT
|
||
LW NDIE1_04C,4
|
||
|
||
LWL NDIE1_05A,1|AMulti|AFunc,A_CLR_ALL_Z
|
||
LWL 1,1|AMulti|AFunc,OBJ_OFF
|
||
LWL 1,60|AFunc,A_CLR_ALL_X
|
||
|
||
LWL 1,1|AFunc,DELETE_ENEMY
|
||
|
||
HEADON_FALL_ANIM
|
||
LW NFALLA_01A,1|AMulti
|
||
LW NFALLA_01B,1|AMulti
|
||
LW NFALLA_01C,1|AMulti
|
||
LWL 1,3|AFunc,OBJ_OFF
|
||
|
||
LW NFALLA_02A,1|AMulti
|
||
LW NFALLA_02B,1|AMulti
|
||
LW NFALLA_02C,3
|
||
|
||
LW NFALLA_03A,1|AMulti
|
||
LW NFALLA_03B,1|AMulti
|
||
LW NFALLA_03C,3
|
||
|
||
LW NFALLA_04A,1|AMulti
|
||
LW NFALLA_04B,1|AMulti
|
||
LW NFALLA_04C,3
|
||
|
||
LW NFALLA_05A,1|AMulti
|
||
LW NFALLA_05B,1|AMulti
|
||
LW NFALLA_05C,3
|
||
|
||
LW NFALLA_06A,1|AMulti
|
||
LW NFALLA_06B,1|AMulti
|
||
LW NFALLA_06C,1|AMulti
|
||
LWL NFALLA_06D,3|AFunc,OBJ_ON
|
||
|
||
LWL NFALLA_07A,1|AMulti|AFunc,A_SCREEN_CK
|
||
LW NFALLA_07B,1|AMulti
|
||
LW NFALLA_07C,1|AMulti
|
||
LWL 1,3|AFunc,OBJ_OFF
|
||
|
||
.LONG 0
|
||
|
||
|
||
.IF AUSTRALIA
|
||
|
||
ANIM_NINJA_SBOMB_EXPLODE
|
||
LWLLL 1,1|AFunc,A_SBOMB_BLOOD+4,0,40000H
|
||
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_NINJA_EXP_NOBLOOD
|
||
ANIM_NINJA_EXPLODE
|
||
LWLLL 1,1|AFunc,A_BLOOD_SPLORCH+4,0,0
|
||
LWL 1,1|AFunc,CLR_VEL
|
||
LWLL 1,2|AFunc,A_SOUNDZ+2,SND_NINJA_EXP_SCREAM
|
||
ANIM_NINJA_EXP_NOBLOOD
|
||
LWL 1,1|AFunc,DELETE_ENEMY
|
||
|
||
.ELSE
|
||
|
||
ANIM_NINJA_SBOMB_EXPLODE
|
||
LWLLL 1,1|AFunc,A_SBOMB_BLOOD+4,0,40000H
|
||
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_NINJA_EXP_NOBLOOD
|
||
ANIM_NINJA_EXPLODE
|
||
LWLLL 1,1|AFunc,A_BLOOD_SPLORCH+4,0,0
|
||
LWL 1,1|AFunc,CLR_VEL
|
||
LWLL 1,2|AFunc,A_SOUNDZ+2,SND_NINJA_EXP_SCREAM
|
||
ANIM_NINJA_EXP_NOBLOOD
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,NINJA_PARTS_1,80h,60000h
|
||
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,NINJA_PARTS_2,500h,50000h
|
||
LWL 1,1|AFunc,DELETE_ENEMY
|
||
|
||
.ENDIF
|
||
|
||
**************************************************************************
|
||
* *
|
||
* Fragger Scripts *
|
||
* *
|
||
**************************************************************************
|
||
|
||
*
|
||
* Ninja blows up a little bit
|
||
*
|
||
NINJA_PARTS_1
|
||
.long ARM_SPIN,NINJA_CHUNK_ARM
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
|
||
|
||
.long LEG_SPIN,NINJA_CHUNK_LEG
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
|
||
|
||
.long 0
|
||
|
||
*
|
||
* Ninja blows up some more
|
||
*
|
||
NINJA_PARTS_2
|
||
.long ARM_SPIN,NINJA_CHUNK_ARM
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
|
||
|
||
.long HEAD_SPIN,NINJA_CHUNK_HEAD
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
|
||
|
||
.long CHEST_SPIN,NINJA_CHUNK_LEG
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
|
||
|
||
.long LEG_SPIN,NINJA_CHUNK_LEG
|
||
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
|
||
|
||
.long 0
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* NINJA_CHUNK *
|
||
* *
|
||
* Frag func for a piece of the ninja. *
|
||
* *
|
||
**************************************************************************
|
||
NINJA_CHUNK_ARM
|
||
MOVE @LAB_RAT,A14,W
|
||
JAZ N_CHUNK ;BR = Not the special ninja
|
||
|
||
MMTM SP,A0,A8
|
||
MOVE A0,A8
|
||
MOVI NINARMB2,A0
|
||
CALLA CHANGE_PAL
|
||
MMFM SP,A0,A8
|
||
|
||
JAUC N_CHUNK
|
||
|
||
NINJA_CHUNK_LEG
|
||
MOVE @LAB_RAT,A14,W
|
||
JAZ N_CHUNK ;BR = Not the special ninja
|
||
|
||
MMTM SP,A0,A8
|
||
MOVE A0,A8
|
||
MOVI NINLEGB2,A0
|
||
CALLA CHANGE_PAL
|
||
MMFM SP,A0,A8
|
||
|
||
JAUC N_CHUNK
|
||
|
||
NINJA_CHUNK_HEAD
|
||
MOVE @LAB_RAT,A14,W
|
||
JAZ N_CHUNK ;BR = Not the special ninja
|
||
|
||
MMTM SP,A0,A8
|
||
MOVE A0,A8
|
||
MOVI NINHEDB2,A0
|
||
CALLA CHANGE_PAL
|
||
MMFM SP,A0,A8
|
||
|
||
JAUC N_CHUNK
|
||
|
||
|
||
*
|
||
* Ninja arm spin animation
|
||
*
|
||
ARM_SPIN
|
||
LWLW NINARM1,1|AFunc,A_INIT_AnimSLP+1,3
|
||
LW NINARM2,0
|
||
LW NINARM3,0
|
||
ARM_SPIN_LOOP
|
||
LWLW NINARM1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV|M_FLIPH
|
||
LW NINARM2,0
|
||
LW NINARM3,0
|
||
|
||
LWLW NINARM1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV|M_FLIPH
|
||
LW NINARM2,0
|
||
LW NINARM3,0
|
||
|
||
LWLW NINARM1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV|M_FLIPH
|
||
LW NINARM2,0
|
||
LW NINARM3,0
|
||
|
||
LWLW NINARM1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV|M_FLIPH
|
||
LW NINARM2,0
|
||
LWLL NINARM3,0|AFunc,A_AnimFrm+2,ARM_SPIN_LOOP
|
||
|
||
*
|
||
* Ninja leg spin animation
|
||
*
|
||
LEG_SPIN
|
||
LWLW NINLEG1,1|AFunc,A_INIT_AnimSLP+1,3
|
||
LW NINLEG2,0
|
||
LW NINLEG3,0
|
||
LEG_SPIN_LOOP
|
||
LWLW NINLEG1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV|M_FLIPH
|
||
LW NINLEG2,0
|
||
LW NINLEG3,0
|
||
|
||
LWLW NINLEG1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV|M_FLIPH
|
||
LW NINLEG2,0
|
||
LW NINLEG3,0
|
||
|
||
LWLW NINLEG1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV|M_FLIPH
|
||
LW NINLEG2,0
|
||
LW NINLEG3,0
|
||
|
||
LWLW NINLEG1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV|M_FLIPH
|
||
LWLW NINLEG2,0|AFunc,A_INC_AnimSLP+1,8
|
||
LWLL NINLEG3,0|AFunc,A_AnimFrm+2,LEG_SPIN_LOOP
|
||
|
||
*
|
||
* Ninja head spin animation
|
||
*
|
||
HEAD_SPIN
|
||
LWLW NINHEAD1,1|AFunc,A_INIT_AnimSLP+1,3
|
||
LW NINHEAD2,0
|
||
LW NINHEAD3,0
|
||
HEAD_SPIN_LOOP
|
||
LWLW NINHEAD2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV
|
||
LW NINHEAD1,0
|
||
LWLW NINHEAD2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPH
|
||
LW NINHEAD3,0
|
||
LWLW NINHEAD2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV
|
||
LWLW NINHEAD1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPH
|
||
LW NINHEAD2,0
|
||
LW NINHEAD3,0
|
||
|
||
LWLW NINHEAD2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV
|
||
LW NINHEAD1,0
|
||
LWLW NINHEAD2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPH
|
||
LW NINHEAD3,0
|
||
LWLW NINHEAD2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV
|
||
LWLW NINHEAD1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPH
|
||
LWLW NINHEAD2,0|AFunc,A_INC_AnimSLP+1,8
|
||
LWLL NINHEAD3,0|AFunc,A_AnimFrm+2,HEAD_SPIN_LOOP
|
||
|
||
*
|
||
* Ninja chest spin animation
|
||
*
|
||
CHEST_SPIN
|
||
LWLW NINCHEST1,1|AFunc,A_INIT_AnimSLP+1,3
|
||
LW NINCHEST2,0
|
||
LW NINCHEST3,0
|
||
CHEST_SPIN_LOOP
|
||
LWLW NINCHEST2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV
|
||
LW NINCHEST1,0
|
||
LWLW NINCHEST2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPH
|
||
LW NINCHEST3,0
|
||
LWLW NINCHEST2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV
|
||
LWLW NINCHEST1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPH
|
||
LW NINCHEST2,0
|
||
LW NINCHEST3,0
|
||
|
||
LWLW NINCHEST2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV
|
||
LW NINCHEST1,0
|
||
LWLW NINCHEST2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPH
|
||
LW NINCHEST3,0
|
||
LWLW NINCHEST2,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPV
|
||
LWLW NINCHEST1,0|AFunc,A_TOGGLE_FLIP+1,M_FLIPH
|
||
LWLW NINCHEST2,0|AFunc,A_INC_AnimSLP+1,8
|
||
LWLL NINCHEST3,0|AFunc,A_AnimFrm+2,CHEST_SPIN_LOOP
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* Stoned Ninja *
|
||
* *
|
||
**************************************************************************
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PROC_STONED_NINJA *
|
||
* *
|
||
* Process entry point to create a Stoned Ninja. *
|
||
* *
|
||
* A8 = Flip flags *
|
||
* A9 = Universe X *
|
||
* A10 = Universe Y *
|
||
* A11 = Universe Z *
|
||
* *
|
||
**************************************************************************
|
||
PROC_STONED_NINJA
|
||
MOVI STONE_NINJA_INIT,B0
|
||
PUSH A8
|
||
CALLA MULTIMAKE
|
||
PULL A6
|
||
JRZ PSN_EXIT ;BR = Could not create the dude
|
||
|
||
MOVE A11,A3
|
||
|
||
MOVE @ZREL_OFF,A14,L
|
||
SRA ZFRAC,A14
|
||
ADD A14,A3
|
||
|
||
MOVE A9,A1
|
||
MOVE A10,A2
|
||
|
||
CALLA SET_ANIPU ;Position him
|
||
|
||
MOVE A6,A0
|
||
CALLA SET_FLPS
|
||
|
||
CALLA OBJ_ON_MULTI ;We create with the objects off
|
||
|
||
CALLA INSERT_OBJ ;Insert
|
||
|
||
PSN_EXIT
|
||
DIE
|
||
|
||
*
|
||
* Object initialization table for the Stoned Ninja
|
||
*
|
||
STONE_NINJA_INIT
|
||
.byte 4, 0, 1, 0 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long STNGUYA ;IMGPAL
|
||
.word OID_JUNK, OM_COLL
|
||
.LONG DUMCOLL
|
||
*
|
||
* .long IMG
|
||
* .word OCTRL, OFLAGS, OZOFF, OPTION_FLAGS
|
||
*
|
||
LWWWW STNGUYA, DMAWNZ, M_NODISP|M_DBLSCL, 0, OM_ANIM
|
||
.LONG ANIM_STONE_WATCH
|
||
LWWWW STNGUYB, DMAWNZ, M_NODISP|M_DBLSCL, -1, 0
|
||
LWWWW STNGUYC, DMAWNZ, M_NODISP|M_DBLSCL, -2, 0
|
||
LWWWW STNGUYD, DMAWNZ, M_NODISP|M_DBLSCL, -3, 0
|
||
|
||
ANIM_STONE_WATCH
|
||
LWL 1,10|AFunc,A_STAY_TIL_ONSCRN
|
||
LWL 1,10|AFunc,A_STAY_TIL_OFFSCRN
|
||
LWL 1,1|AFunc,DELETE_OBJ
|
||
|
||
*
|
||
* Blue guy palettes
|
||
*
|
||
NINBLU64:
|
||
.word 63
|
||
.word 00000h,063ffh,043feh,03ffdh,02ffch,037fbh,033fbh,02fd9h
|
||
.word 02bb8h,02b97h,01b77h,00fb6h,01f55h,02ad2h,00313h,012b2h
|
||
.word 00ad1h,00eaeh,0028fh,01a4eh,0024dh,0022ah,005cah,001c9h
|
||
.word 00000h,05abeh,0463eh,035beh,0295eh,039b9h,02539h,01cfah
|
||
.word 02936h,018d9h,018d5h,01093h,00852h,018aeh,00432h,00430h
|
||
.word 0042eh,0042dh,01066h,00009h,00c45h,00007h,00005h,00003h
|
||
.word 07f34h,07f13h,07691h,06a6fh,0622dh,05a0ch,055ebh,051cah
|
||
.word 04989h,04588h,03d47h,03105h,030e4h,07fbfh,07f3fh
|
||
|
||
NINHEDB2:
|
||
.word 32
|
||
.word 00000h,00421h,05adfh,039deh,0463eh,06b5dh,0253ah,04659h
|
||
.word 01097h,031d6h,00d35h,00c74h,00873h,04a53h,00871h,02551h
|
||
.word 00430h,0042eh,0318eh,0002dh,00026h,00002h,05826h,05000h
|
||
.word 03c00h,03c26h,03969h,01800h,019adh,014c6h,00863h,065aeh
|
||
|
||
NINARMB2:
|
||
.word 32
|
||
.word 00000h,039deh,0463eh,0253ah,03258h,00858h,01cf7h,02dd5h
|
||
.word 004eeh,0042eh,00026h,06e16h,064a5h,06000h,0610bh,05488h
|
||
.word 05064h,04800h,048a0h,01800h,07f34h,07af3h,072d1h,06eb0h
|
||
.word 0666fh,0624eh,05a2dh,0560ch,051ebh,049aah,024c3h,03987h
|
||
|
||
NINLEGB2:
|
||
.word 32
|
||
.word 00000h,0479fh,04bdfh,03f5fh,0371dh,01afdh,00adch,05b5bh
|
||
.word 00a37h,02656h,01556h,001f5h,019d2h,00871h,02551h,004eeh
|
||
.word 01d0ah,06bf9h,057f9h,064a5h,05314h,060e7h,05d67h,05821h
|
||
.word 055aah,04800h,04841h,02c00h,01800h,07bffh,034c3h,018a6h
|
||
|
||
|
||
.IF 0
|
||
|
||
**************************************************************************
|
||
* *
|
||
* Big, in yo' face, pop-up Ninja *
|
||
* *
|
||
**************************************************************************
|
||
|
||
BIGBOY_Z EQU ZMAX_KLUDGE+0100H
|
||
|
||
BIG_POS_TABLE
|
||
.LONG BIGBOY_Z*(SCRWIDTH*1/6-HALFX),BIGBOY_Z*(SCRWIDTH*3/6-HALFX)
|
||
.LONG BIGBOY_Z*(SCRWIDTH*5/6-HALFX)
|
||
|
||
*
|
||
* Some data for the big guy
|
||
*
|
||
OBIGPOS EQU ODATA+0A0H ;UHW POSITION INDEX
|
||
OBIGYON EQU ODATA+0C0H ;UHL WORLD Y POPUP ON POSITION
|
||
OBIGYOFF EQU ODATA+0E0H ;UHL WORLD Y POPUP OFF POSITION
|
||
OBIGYVEL EQU ODATA+100H ;UHL UPWARD Y VELOCITY
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PROC_BIG_NINJA *
|
||
* *
|
||
* Process to decide when to throw up a big ninja. *
|
||
* *
|
||
**************************************************************************
|
||
PROC_BIG_NINJA
|
||
CLR A9 ;CLEAR BIGBOY POSITION FLAGS
|
||
MOVE A9,@NINJA_POPS,W ;CLEAR BIGBOY COUNT
|
||
BWP_LUPE
|
||
MOVK 10,A1
|
||
MOVI 60,A0
|
||
CALLA RANGERND
|
||
CALLA PRCSLP ;RANDOM SLEEP
|
||
|
||
MOVE @NINJA_POPS,A10,W
|
||
JRZ BWP_CHECK_QUOTA ;BR=NONE READY
|
||
|
||
MOVE @HOLD_ENEMY_DISPATCH,A14,W
|
||
JRNZ BWP_CHECK_QUOTA ;BR=HOLD ON THERE
|
||
|
||
MOVE @ZSCROLL,A14,L
|
||
JRNZ BWP_CHECK_QUOTA ;BR = No popping when in Z
|
||
|
||
CMPK 0111B,A9
|
||
JREQ BWP_CHECK_QUOTA ;BR=ALL POSITIONS FILLED
|
||
|
||
MOVI POP_NINJA_INIT,B0 ;ALLOCATE OBJECT
|
||
CALLA CREATE_ENEMY
|
||
JRZ BWP_CHECK_QUOTA ;BR=CAN'T DO IT
|
||
|
||
MOVE A13,*A8(OPLINK),L
|
||
|
||
CLR A0
|
||
MOVK 3,A1
|
||
MOVI BIG_LIST,A2
|
||
BWP_MAKE_LIST
|
||
DEC A1
|
||
JRN BWP_PICK ;BR=DONE PICKIN'
|
||
BTST A1,A9
|
||
JRNZ BWP_MAKE_LIST ;BR=NOT OPEN
|
||
INC A0 ;COUNT ENTRY
|
||
MOVE A1,*A2+,W ;ENTER IN LIST
|
||
JRUC BWP_MAKE_LIST
|
||
BWP_PICK
|
||
CALLA RAND0 ;PICK INDEX
|
||
SLL 4,A0 ;TRANSLATE TO OFFSET
|
||
ADDI BIG_LIST,A0
|
||
MOVE *A0,A0,W ;GET POSITION FROM LIST
|
||
MOVK 1,A14
|
||
SLL A0,A14
|
||
OR A14,A9 ;FLAG POSITION PICKED
|
||
MOVE A14,*A8(OBIGPOS),W ;POSITION PICKED
|
||
|
||
SLL 5,A0 ;TRANSLATE TO OFFSET
|
||
ADDI BIG_POS_TABLE,A0
|
||
MOVE *A0,A1,L ;GET WORLD X POSITION
|
||
|
||
MOVE @XBASE,A14,L
|
||
ADD A14,A1
|
||
|
||
MOVE @XSCROLL,A14,L
|
||
ADD A14,A1
|
||
|
||
MOVI BIGBOY_Z,A3
|
||
MOVI 256+150,A5
|
||
STOWY A3,A5
|
||
MOVE A5,A2
|
||
MOVE A2,*A8(OBIGYOFF),L ;OFF SCREEN WORLD Y
|
||
|
||
MOVI 256,A7
|
||
STOWY A3,A7
|
||
MOVE A7,*A8(OBIGYON),L ;ON SCREEN WORLD Y
|
||
|
||
SUB A5,A7
|
||
MOVK 15,A14
|
||
DIVS A14,A7
|
||
MOVE A7,*A8(OYVEL),L
|
||
MOVE A7,*A8(OBIGYVEL),L ;UPWARD Y VELOCITY
|
||
|
||
MOVE @YBASE,A14,L
|
||
SUB A14,A2
|
||
|
||
MOVE @ZBASE,A14,L
|
||
ADD A14,A3
|
||
|
||
CALLA SET_ANIPU ;SET POSITION
|
||
|
||
MOVE @RAND,A0,W ;LEFTY OR RIGHTY?
|
||
ANDI M_FLIPH,A0
|
||
CALLA SET_FLPS
|
||
|
||
MOVI 0101H,A4 ;SET FLASH COLOR
|
||
CALLA SET_OCONST
|
||
|
||
MOVI ANIM_BIG_NINJA_POPUP,A1 ;POP UP ANIMATION
|
||
CALLA STRT_ANIM
|
||
|
||
CALLA INSERT_ENEMY
|
||
|
||
DEC A10
|
||
MOVE A10,@NINJA_POPS,W
|
||
|
||
BWP_CHECK_QUOTA
|
||
MOVE @ENEMY_QUOTA,A14,W
|
||
JRZ BWP_LUPE ;BR=NO QUOTA YET
|
||
BWP_BIGBOY_WAIT
|
||
SLEEP 1
|
||
MOVE A9,A9
|
||
JRNZ BWP_BIGBOY_WAIT ;BR=SOME BIGBOYS STILL ACTIVE
|
||
|
||
DIE
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CHECK_BIGUP - CHECK IF BIGBOY DONE COMIN' ON SCREEN *
|
||
* *
|
||
* PASS: *
|
||
* A8 = OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
|
||
A_CHECK_BIGUP
|
||
MOVE *A8(OYVAL),A0,L ;CURRENT Y
|
||
MOVE *A8(OBIGYON),A1,L ;ON SCREEN Y DESTINATION
|
||
MOVE @YBASE,A14,L
|
||
ADD A14,A1 ;TRANSLATE TO UNIVERSE
|
||
CMP A1,A0
|
||
JRGT ACBU_DONE ;BR=NOT UP YET
|
||
CLR A14
|
||
MOVE A14,*A8(OYVEL),L ;STOP Y MOTION
|
||
CALLA SET_ANIPYU ;SET Y POSITION TO DESTINATION
|
||
|
||
; MOVI BIGBOY_GUNVECT,A1 ;ENABLE VECTORS
|
||
; MOVI BIGBOY_CVECT,A2
|
||
; CALLA SET_VECTORS
|
||
|
||
MOVE *A8(OPARTS),A0,L
|
||
MOVI ANIM_BIG_NINJA_WATCH,A1
|
||
CALLA STRTANIM ;Start part watching us
|
||
|
||
MOVI 30,A14 ;INITIAL SLEEP BEFORE ATTACK
|
||
MOVB A14,*A8(AnimSlp)
|
||
MOVI ANIM_BIG_NINJA_ATTACK,A1 ;SHOOTIN' ANIMATION
|
||
MOVE A1,*A8(AnimFrm),L
|
||
MOVE A1,*A8(AnimScr),L
|
||
ACBU_DONE
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_BIGBOY_POPDOWN - START BIGBOY GOIN' OFF SCREEN *
|
||
* *
|
||
* PASS: *
|
||
* A8 = OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
|
||
A_BIGBOY_POPDOWN
|
||
MOVE *A8(OBIGYVEL),A14,L ;SET DOWNWARD Y MOTION
|
||
NEG A14 ;OPPOSITE DIRECTION
|
||
SLL 1,A14 ;FASTER BY TIMES 2
|
||
MOVE A14,*A8(OYVEL),L
|
||
|
||
MOVI ANIM_BIG_NINJA_POPDOWN,A1 ;GOIN' DOWN ANIMATION
|
||
MOVE A1,*A8(AnimFrm),L
|
||
MOVE A1,*A8(AnimScr),L
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CHECK_BIGDOWN - CHECK IF BIGBOY DONE GOIN' OFF SCREEN *
|
||
* *
|
||
* PASS: *
|
||
* A8 = OBJECT *
|
||
* *
|
||
**************************************************************************
|
||
|
||
A_CHECK_BIGDOWN
|
||
MOVE *A8(OYVAL),A0,L ;CURRENT Y
|
||
MOVE *A8(OBIGYOFF),A1,L ;OFF SCREEN Y DESTINATION
|
||
MOVE @YBASE,A14,L
|
||
ADD A14,A1 ;TRANSLATE TO UNIVERSE
|
||
CMP A1,A0
|
||
JRLT ACBD_DONE ;BR=NOT DOWN YET
|
||
|
||
MOVE *A8(OPLINK),A0,L ;GET STARTING PROCESS
|
||
MOVE *A8(OBIGPOS),A14,W ;GET POSITION FLAG
|
||
MOVE *A0(PA9),A9,W ;GET CURRENT POSITION FLAGS
|
||
ANDN A14,A9 ;TURN OFF POSITION
|
||
MOVE A9,*A0(PA9),W ;SET POSITION FLAGS
|
||
CLR A14
|
||
MOVE A14,*A8(OPLINK),L ;CLEAR STARTING PROCESS
|
||
MOVE *A8(OPLAYER),A14,L
|
||
JAZ DEL_ENEMY_NOAUD ;BR=NOT KILLED BY PLAYER
|
||
JAUC DELETE_ENEMY
|
||
ACBD_DONE
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* A_CHECK_BIG_AWAY *
|
||
* *
|
||
* Anim func to check if we should disappear now. *
|
||
* *
|
||
* A8 = Ptr to any part *
|
||
* *
|
||
**************************************************************************
|
||
A_CHECK_BIG_AWAY
|
||
MOVE @HOLD_ENEMY_DISPATCH,A14,W
|
||
JRNZ ACBA_GO_AWAY
|
||
|
||
MOVE @ZSCROLL,A14,L
|
||
JRNZ ACBA_GO_AWAY
|
||
|
||
MOVB *A8(OFLAGS),A14
|
||
JRN ACBA_GO_AWAY
|
||
|
||
RETS
|
||
|
||
ACBA_GO_AWAY
|
||
CALLA GET_HEAD_PART
|
||
|
||
JRUC A_BIGBOY_POPDOWN
|
||
|
||
|
||
*
|
||
* Big Ninja initialization
|
||
*
|
||
POP_NINJA_INIT
|
||
.byte 4, 0, 0, 2 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
|
||
.long NINYEL64, NUNCHUK ;Palettes we must have
|
||
.word OID_NINJA, OM_COLL ;OID, GLOBAL_OPTIONS
|
||
; .LONG BIG_NINJA_CVECT
|
||
.LONG DUMCOLL
|
||
* .long IMG
|
||
* .word OCTRL, OFLAGS, OZOFF
|
||
* .word OPTIONS
|
||
LWWWW NCUCHUK_01A, DMAWNZ, M_NOSCALE|M_NOPIXSCAN, 0, OM_GUNV
|
||
.LONG DUMRETS
|
||
LWWWW NCUCHUK_01B, DMAWNZ, M_NOSCALE|M_NOPIXSCAN, 1, OM_PRVGUNV
|
||
LWWWW NCUCHUK_01C, DMAWNZ, M_NOSCALE|M_NOPIXSCAN, 0, OM_PRVGUNV
|
||
LWWWW CHUK1, DMAWNZ, M_NOSCALE|M_NOPIXSCAN|M_NODISP, 0, OM_PRVGUNV
|
||
|
||
ANIM_BIG_NINJA_POPUP
|
||
LWL 1,1|AFunc,A_CHECK_BIGUP
|
||
.long 0
|
||
|
||
ANIM_BIG_NINJA_POPDOWN
|
||
LWL 1,1|AFunc,A_CHECK_BIGDOWN
|
||
.long 0
|
||
|
||
ANIM_BIG_NINJA_WATCH
|
||
LWL 1,1|AFunc,A_CHECK_BIG_AWAY
|
||
.LONG 0
|
||
|
||
ANIM_BIG_NINJA_ATTACK
|
||
LW 1,10
|
||
.LONG 0
|
||
|
||
ANIM_BIG_NINJA_DEATH
|
||
LWL 1,1|AFunc,A_BIGBOY_POPDOWN
|
||
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PROC_NINJA_ROPE *
|
||
* *
|
||
* Process to start a rope swinging Ninja. *
|
||
* *
|
||
* A9 = Starting side, 0 = From Left, 1 = From Right *
|
||
* *
|
||
**************************************************************************
|
||
PROC_NINJA_ROPE
|
||
MOVE @HOLD_ENEMY_DISPATCH,A14,W
|
||
JANE SUCIDE
|
||
|
||
; MOVI ROPE_INIT,B0
|
||
CALLA MULTIMAKE
|
||
JAZ SUCIDE ;BR = No rope to swing on
|
||
|
||
MOVI 8000H,A1
|
||
UNIVZ A1 ;Set Z for 1 to 1
|
||
|
||
MOVE A9,A9
|
||
JRNZ PBR_ROPE_RIGHT
|
||
|
||
MOVI M_FLIPH,A0
|
||
CALLA SET_FLPS
|
||
|
||
MOVI [30,100],A1
|
||
JRUC PBR_SETUP_ROPE
|
||
|
||
PBR_ROPE_RIGHT
|
||
MOVI [30,200],A1
|
||
|
||
PBR_SETUP_ROPE
|
||
CALLA SET_SCRN_POS
|
||
|
||
CALLA INSERT_OBJ
|
||
|
||
DIE
|
||
|
||
CALLA CREATE_ENEMY
|
||
MMFM SP,A6,A7 ;Preserve status please
|
||
JRZ PBH_EXIT ;BR = Could not create the dude
|
||
|
||
MOVI NINJA_INIT,B0
|
||
CALLA CREATE_ENEMY
|
||
MMFM SP,A6,A7 ;Preserve status please
|
||
JRZ PBH_EXIT ;BR = Could not create the dude
|
||
|
||
.ENDIF
|
||
|
||
.END
|
||
|
||
|