revolution-x/GXNONBOY.ASM

6231 lines
151 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 "GXNONBOY.ASM"
.TITLE "<<< GENERATION X -- NONBOY ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
* GET THE SYSTEM STUFF
; .INCLUDE "GX.INC"
.INCLUDE "GXENEMY.INC"
.INCLUDE "GXGLO.H"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "GXCONTRL.H"
.INCLUDE "GXNONBOY.TBL"
.INCLUDE "GXNONBOY.H"
.BSS BIG_LIST,16*3 ;BIGBOY PICK LIST
.BSS BIGBOYS,16 ;BIG NONBOY COUNT
.BSS NONBOY_SHOOT_CHANCE,16 ;CHANCE OF NONBOY SHOOTIN'
.BSS YOGI,16 ;ALIGNMENT
* SYMBOLS IN HERE
.DEF N_CHUNK,NONBOY_SBOMB
.DEF NONBOY_HEADON_SHOOT_ANIM
.DEF AU_CREATE_HEADOUTBOY
.DEF NONBOY_ROCKET_COLL,OUTCLUB_GUNVECT,OUTCLUB_CVECT
.DEF FALLING_DEATH_ANIM, WINBOY_DEATH_ANIM
.DEF CREATE_JUMPON_NONBOY
.DEF P_NONBOYO,P_NONBOYR
.DEF BIGBOY_WATCH_PROC, NONBOY_SHOOT_CHANCE, BIGBOYS
; .DEF A_TOGGLE_DIR
.DEF SND_BODY_THUD
.def BUSPOP_DEATH,BUSPOP_INIT,NONTHR_CVECT
.def NONTHR_DEATH,NONBOY_GUNVECT,A_ALL_FIRE_FNC
.DEF CREATE_SIDERUN_NONBOYF
* SYMBOLS FROM ?
.REF A_CLR_OZVEL,EGUN_FLASH_MULTI,CK_PLAYER_HIT
.REF ENEMY_QUOTA,DOWN_THE_HATCH,A_OZVAL_DELTA
.ref CURPLYR_ADJ,MAX_ALLOWED,A_CAN_I_POPUP
* SYMBOLS FROM GXLA1.ASM
.REF BREAK_WINDOW
* SYMBOLS FROM GXRAM.ASM
.REF ENEMY_HITALL, HOLD_ENEMY_DISPATCH, BASE_HIT
* SYMBOLS FROM GXUNIV.ASM
.REF GET_TOPY_OFFSCRN
* SYMBOLS FROM GXD.ASM
.REF OBJ_CONST_MULTI, OBJ_ON_WNZ_MULTI, WORLD_GRNDOFF
* SYMBOLS FROM GXBUG.ASM
.REF SET_OCONST, SORT_OBJ
* SYMBOLS FROM GXENEMY.ASM
.REF EF1AST08, EFLASH_ANIM, GUN_FLASH_MULTI
***** from GXBLOOD.ASM
.REF BLOODY_BULLET_HIT_OFFSET, A_BLOOD_SPLORCH, A_SBOMB_BLOOD
.REF BIGBOY_ROCKET_BLOOD
.TEXT
SND_NONBOY_FIRE
.WORD 0E303H,10,0A10BH,0 ;NONBOY fire at close Z
GRUNT_HIT_TBL
.LONG SND_NB_HIT1,SND_NB_HIT2
.LONG SND_NB_HIT3,SND_NB_HIT4
.LONG SND_NB_HIT5,SND_NB_HIT6
;THIS IS NOW IN GXEQU.H ---> NUM_GRUNT_SNDS .EQU 6
SND_NB_HIT1
.WORD 0F220H,33,0A201H,0 ;NON-BOY takes a hit #1
SND_NB_HIT2
.WORD 0F220H,16,0A204H,0 ;NON-BOY takes a hit #2
SND_NB_HIT3
.WORD 0F220H,32,0A211H,0 ;NON-BOY takes a hit #3
SND_NB_HIT4
.WORD 0F220H,17,0A217H,0 ;NON-BOY takes a hit #4
SND_NB_HIT5
.WORD 0F220H,24,0A226H,0 ;NON-BOY takes a hit #5
SND_NB_HIT6
.WORD 0F220H,16,0A229H,0 ;NON-BOY takes a hit #6
SND_BODY_THUD
.WORD 0F120H,26,0A1CFH,0 ;NON-BOY Thud for getting shot
SND_NB_LONG_FALL
.WORD 0E320H,60,0A21BH,0 ;NONBOY Falling from upon high
SHORT_FALL_TBL
.LONG SND_NB_SFALL1,SND_NB_SFALL2
.LONG SND_NB_SFALL3,SND_NB_SFALL4
.LONG SND_NB_SFALL5
NUM_SFALL_SNDS .EQU 5
SND_NB_SFALL1
.WORD 0E220H,51,0A21DH,0 ;NON-BOY Short fall #1
SND_NB_SFALL2
.WORD 0E220H,77,0A220H,0 ;NON-BOY Short fall #2
SND_NB_SFALL3
.WORD 0E220H,62,0A223H,0 ;NON-BOY Short fall #3
SND_NB_SFALL4
.WORD 0E220H,25,0A22CH,0 ;NON-BOY Short fall #4
SND_NB_SFALL5
.WORD 0E220H,27,0A22FH,0 ;NON-BOY Short fall #5
**************************************************************************
* *
* BIGBOY_WATCH_PROC - CREATE BIG POPUP NONBOYS WHEN BIGBOYS VAR IS NOT 0 *
* *
**************************************************************************
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)
BIGBOY_WATCH_PROC
CLR A9 ;CLEAR BIGBOY POSITION FLAGS
MOVE A9,@BIGBOYS,W ;CLEAR BIGBOY COUNT
BWP_LUPE
MOVK 10,A1
MOVI 60,A0
CALLA RANGERND
CALLA PRCSLP ;RANDOM SLEEP
MOVE @BIGBOYS,A10,W
JRZ BWP_CHECK_QUOTA ;BR=NONE READY
MOVE @HOLD_ENEMY_DISPATCH,A14,W
JRNZ BWP_CHECK_QUOTA ;BR=HOLD ON THERE
CMPK 0111B,A9
JREQ BWP_CHECK_QUOTA ;BR=ALL POSITIONS FILLED
MOVI BIGBOY_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
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 0404H,A4 ;SET FLASH COLOR
CALLA SET_OCONST
MOVI BIGBOY_POPUP_ANIM,A1 ;POP UP ANIMATION
CALLA STRT_ANIM
CALLA INSERT_ENEMY
DEC A10
MOVE A10,@BIGBOYS,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
**************************************************************************
* *
* BIGBOY VECTORS *
* *
* PASS: *
* A0 = PTR TO ROCKET OBJECT (ONLY FOR COLLISION VECTORS) *
* A2 = PTR TO PLAYER (ONLY FOR GUN VECTOR) *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
BIGBOY_CVECT
WWL OID_PROCKET,~MASK_PLAYER,NONBOY_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,BIGBOY_EXPLOSION_COLLVECT
WWL OID_BLOWUP,0FFFFH,BIGBOY_SBOMB_COLLVECT
WL 0,DUMCRETS
BIGBOY_SBOMB_COLLVECT
; CLR A2 ;LET SBOMB AWARD POINTS
CALLA GET_HEAD_PART
MOVE *A8(OFLAGS),A9,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A9
JRNZ BBV_DONE ;BR = YES
MOVE A2,*A8(OPLAYER),L
JRUC BIGBOY_SBOMB
BIGBOY_EXPLOSION_COLLVECT
CALLA GET_HEAD_PART
MOVE *A8(ONATEROCKET),A14,L
JRZ BBV_DONE ;BR=NO ROCKET COLLISION
CMP A0,A14
JRNE BBV_DONE ;BR=DIFFERENT EXPLOSION
MOVE *A8(OFLAGS),A9,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A9
JRNZ BBV_DONE ;BR = YES
MOVE *A8(OYVEL),A14,L
JRN BBV_DONE ;BR=GOIN' UP
MOVE A0,A5
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA ;GET PDATA IN A2
MOVE A2,*A8(OPLAYER),L
SWAP A5,A8
CALLA GET_HEAD_PART
CALLA OBJ_OFF_MULTI
SWAP A5,A8
BIGBOY_SBOMB
CLR A1
CALLA FINDPART ;FIND GUN FLASH
JRZ BBV_ROCKET_BLOOD ;BR=NO GUN FLASH
CALLA PULLPART ;PULL FROM MULTIPARTER
CALLA DELOBJ ;DELETE GUN FLASH
BBV_ROCKET_BLOOD
MOVI BIGBOY_DEATH_ANIM,A1 ;TIME TO DIE
CALLA STRT_ANIM
MOVK 6,A14
MOVB A14,*A8(AnimSLP) ;HOLD TIME
CALLA OBJ_CONST_MULTI ;FLASH WHITE
MOVE A2,A3
MOVI BIGBOY_GUNVECT,A1
MOVI DUMCOLL,A2 ;TURN COLLISIONS OFF
CALLA SET_VECTORS
MOVE A3,A2
CALLA BIGBOY_ROCKET_BLOOD
JRUC BIGBOY_GO
BIGBOY_GUNVECT
SOUND1 SND_BODY_THUD
CALLA GET_HEAD_PART
MOVE *A8(OFLAGS),A9,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A9
JANZ BLOODY_BULLET_HIT_OFFSET ;BR=YES, JUST MAKE BLOOD
CLR A1
CALLA FINDPART ;FIND GUN FLASH
JRZ BG_BLOOD ;BR=NO GUN FLASH
CALLA PULLPART ;PULL FROM MULTIPARTER
CALLA DELOBJ ;DELETE GUN FLASH
BG_BLOOD
MOVE A2,*A8(OPLAYER),L
MOVI 1000,A1
CALLA SCORE
MOVI BIGBOY_DEATH_ANIM,A1 ;TIME TO DIE
CALLA STRT_ANIM
MOVK 3,A14
MOVB A14,*A8(AnimSLP) ;HOLD TIME
CALLA OBJ_CONST_MULTI ;FLASH WHITE
MOVE A2,A3
MOVI BIGBOY_GUNVECT,A1
MOVI DUMCOLL,A2 ;TURN COLLISIONS OFF
CALLA SET_VECTORS
MOVE A3,A2
CALLA BLOODY_BULLET_HIT_OFFSET
BIGBOY_GO
ORI M_DEAD,A9 ;MAKE DEAD
MOVE A9,*A8(OFLAGS),W
SOUND1 SND_BODY_THUD
MOVK NUM_GRUNT_SNDS,A0 ;GRUNT LIKE A PIG!
CALLA RAND0
SLL 5,A0
ADDI GRUNT_HIT_TBL,A0
MOVE *A0,A0,L
CALLA ONESND
CLR A14
MOVE A14,*A8(OYVEL),L ;STOP Y MOTION
MOVE *A8(OBIGYVEL),A14,L
SRA 1,A14
MOVE A14,*A8(OBIGYVEL),L ;SLOW DOWN DOWNWARD Y VELOCITY
MOVI BIGBOY_Z,A3
MOVI 256+198,A5
STOWY A3,A5
MOVE A5,*A8(OBIGYOFF),L ;DEATH OFF SCREEN WORLD Y
BBV_DONE
RETS
**************************************************************************
* *
* 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
MOVI 30,A14 ;INITIAL SLEEP BEFORE ATTACK
MOVB A14,*A8(AnimSlp)
MOVI BIGBOY_FIRE_ANIM,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 BIGBOY_POPDOWN_ANIM,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_BIGPART_FIRE_FNC - ANIM FUNC, FOR BIGBOY ENEMY GUN PART FIRE. *
* *
* PASS: *
* A8 = PTR TO ARM PART DOING THE FIRING. *
* *
**************************************************************************
A_BIGPART_FIRE_FNC
MOVE *A8(OFLAGS),A14,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A14
JRNZ BPFF_X ;BR = YES
MOVI [(-72*BIGBOY_Z/08000H),(-42*BIGBOY_Z/08000H)],A3 ;FIRING OFFSET
MOVI BIGFLASH_INIT,B0
CALLA GUN_FLASH_MULTI ;MAKE A GUN FLASH
MOVE @BASE_HIT,A5,W
ADDI 800H,A5
SLL 4,A5
; MOVI [2,0],A5
CLR A1
CALLA CK_PLAYER_HIT
JRC BPFF_X ;He did'nt hit because he was not visible
SOUNDZ SND_NONBOY_FIRE
BPFF_X
RETS
BIGFLASH_INIT
.LONG EF1AST08
.WORD DMAWNZ,M_DEAD|M_NOPARTANI|M_OPARTSXY|M_MANSCALE|M_NOSCALE
.WORD OM_ANIM|OM_CFUNC
.LONG EFLASH_ANIM
.LONG C_SET_BIGFLASH_SCALE
**************************************************************************
* *
* C_SET_BIGFLASH_SCALE - SET SCALE FOR BIGFLASH *
* *
* PASS: *
* A0 = OBJECT *
* *
**************************************************************************
C_SET_BIGFLASH_SCALE
MOVI 0800080H,A14
MOVE A14,*A0(ONuManScl),L
RETS
**************************************************************************
* *
* BIGBOY STUFF *
* *
**************************************************************************
BIGBOY_INIT
.byte 4, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long GASBOY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG BIGBOY_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_HCUSHTA1, DMAWNZ, M_NOSCALE|M_NOPIXSCAN, 0, OM_GUNV
.LONG DUMRETS
LWWWW G_TCUSHTA1, DMAWNZ, M_NOSCALE|M_NOPIXSCAN, 1, OM_PRVGUNV
LWWWW G_ACUSHTA1, DMAWNZ, M_NOSCALE|M_NOPIXSCAN, 0, OM_PRVGUNV
LWWWW G_ZCUSHTA1, DMAWNZ, M_NOSCALE|M_NOPIXSCAN, 0, OM_PRVGUNV
BIGBOY_POPUP_ANIM
LWL 1,1|AFunc,A_CHECK_BIGUP
.long 0
BIGBOY_FIRE_ANIM
LWL G_HCUSHTA2,1|AMulti|AFunc,A_BIGPART_FIRE_FNC
LW G_TCUSHTA2,1|AMulti
LW G_ACUSHTA2,1|AMulti
LW G_ZCUSHTA2,5
LW G_HCUSHTA1,1|AMulti
LW G_TCUSHTA1,1|AMulti
LW G_ACUSHTA1,1|AMulti
LW G_ZCUSHTA1,6
LWLLW 1,1|AFunc,A_GOTO+3,BIGBOY_FIRE_ANIM,768
LWL 1,1|AFunc,A_BIGBOY_POPDOWN
BIGBOY_POPDOWN_ANIM
LWL 1,1|AFunc,A_CHECK_BIGDOWN
.long 0
BIGBOY_DEATH_ANIM
LW G_HCUDEDA4,3|AMulti
LW G_TCUDEDA4,1|AMulti
LW G_ACUDEDA4,1|AMulti
LW G_ZCUDEDA4,1
LWL 1,0|AFunc,OBJ_ON_WNZ_MULTI
LWL 1,1|AFunc,A_BIGBOY_POPDOWN
**************************************************************************
* *
* CREATE_JUMPON_NONBOY - JUMP ON SCREEN FROM BEHIND THE PLAYERS *
* IF X VELOCITIES SUPPLIED, THEN X POSITIONS ARE OFF SCREEN *
* *
* PASS: *
* A8 = [MAXIMUM OXVEL >> 16, MINIMUM OXVEL >> 16] FROM THE LEFT *
* A9 = [MAXIMUM X WORLD >> 12,MINIMUM X WORLD >> 12] *
* A10 = [MAXIMUM INITIAL OYVEL >> 16, MINIMUM INITIAL OYVEL >> 16] *
* A11 = [MAXIMUM OZVEL, MINIMUM OZVEL] *
* *
**************************************************************************
LAND_CVECT
WWL OID_PROCKET,~MASK_PLAYER,NONBOY_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,NONBOY_EXPLOSION_COLL
; WWL OID_BLOWUP,0FFFFH,NONBOY_SBOMB_COLLVECT
WWL OID_BLOWUP,0FFFFH,NONBOY_SBOMB_CARNAGE
WWL OID_GRND,0FFFFH,LAND_GRND_COLLVECT
WL 0,DUMCRETS
LAND_GRND_COLLVECT
CLR A14
MOVE A14,*A8(OXVEL),L ;STOP IT!
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
MOVE A14,*A8(OYACCEL),W
MOVE *A8(OFLAGS),A14,W
ANDNI M_GCOLL,A14 ;TURN OFF COLLISION CHECK
MOVE A14,*A8(OFLAGS),W
MOVI NONBOY_GUNVECT,A14
MOVE A14,*A8(OGUNVECT),L
MOVI NONBOY_CVECT,A14
MOVE A14,*A8(OCVECT),L
JAUC SET_ONGRND
CREATE_JUMPON_NONBOY
MOVE @ENEMY_QUOTA,A14,W
JANZ SUCIDE ;BR=REACHED QUOTA
MOVI OID_NONBOY,A0
CALLA GET_ENEMY_COUNT
CMPK 10,A0
JAHS SUCIDE
MOVE A8,A5
MOVI NONBOY_DROP_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JRZ CJN_ABORT ;BR = ABORT! ABORT!
; MOVI DUMRETS,A14
; MOVE A14,*A8(OGUNVECT),L
; MOVI JUMPON_CVECT,A14
; MOVE A14,*A8(OCVECT),L
MOVE A8,A0
MOVI NONBOY_DROP_SHOOT_ANIM,A1
MOVI NONBOY_SHOOT_LUPE,A14
CALLA STRTANIM_OFF ;START ANIMATION
MOVE @RAND,A6,W ;LEFTY OR RIGHTY?
MOVE A5,A5
JRZ CJN_DOX ;BR=NO X VELOCITIES
MOVE A5,A1
SLL 16,A1 ;MINIMUM X VELOCITY
MOVE A5,A0
SRA 16,A0
SLL 16,A0 ;MAXIMUM X VELOCITY
CALLA RANGRAND
MOVE A0,A1
MOVI (0-HALFX)*ZMAX_REAL - (33 << 15),A0 ;WORLD X OFF SCREEN
BTST 1,A6
JRZ CJN_SET_X ;BR=STAY ON LEFT SIDE
NEG A0
NEG A1
CJN_SET_X
MOVE A1,*A8(OXVEL),L
JRUC CJN_XTRANS
CJN_DOX
MOVE A9,A1
SEXT A1,W
SLL 12,A1 ;MINIMUM X WORLD
MOVE A9,A0
SRA 16,A0
SLL 12,A0 ;MAXIMUM X WORLD
CALLA RANGRAND
CJN_XTRANS
MOVE @XBASE,A14,L
ADD A14,A0
MOVE A0,A1
MOVE @YWORLD,A2,L
MOVE @YBASE,A4,L
ADD A4,A2
MOVI ZMAX_REAL,A3
MOVE @ZBASE,A14,L
ADD A14,A3
CALLA SET_ANIPU
NEG A4
MOVE A4,*A8(OGRNDOFF),L
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVK 1,A14
MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
MOVK M_FLIPH,A0
AND A6,A0
CALLA SET_FLPS
MOVI 07000H,A14
MOVE A14,*A8(OYACCEL),W ;SET GRAVITY
MOVE A10,A1
SLL 16,A1 ;MINIMUM INITIAL Y VELOCITY
MOVE A10,A0
SRA 16,A0
SLL 16,A0 ;MAXIMUM INITIAL Y VELOCITY
CALLA RANGRAND
MOVE A0,*A8(OYVEL),L
MOVE A11,A1
SEXT A1,W ;MINIMUM Z VELOCITY
MOVE A11,A0
SRA 16,A0 ;MAXIMUM Z VELOCITY
CALLA RANGRAND
MOVE A0,*A8(OZVEL),L
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
CALLA GET_SHAD_MULTI
CJN_ABORT
DIE
**************************************************************************
* *
* AU_CREATE_HEADOUTBOY - CREATE THE ENEMY TO RUN OUT OF THE DOOR WITH A *
* X DRIFT VELOCITY AND Y VELOCITY *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = MINIMUM X DRIFT VELOCITY >> 8 *
* AARG+,W = MAXIMUM X DRIFT VELOCITY >> 8 *
* AARG+,W = Y VELOCITY >> 8 *
* AARG+,W = Z OFFSET BEHIND GENERATOR *
* *
**************************************************************************
HEADOUT_CVECT
WWL OID_PROCKET,~MASK_PLAYER,NONBOY_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,NONBOY_EXPLOSION_COLL
WWL OID_BLOWUP,0FFFFH,NONBOY_SBOMB_CARNAGE
WWL OID_GRND,0FFFFH,HEADOUT_GRND_COLLVECT
WL 0,DUMCRETS
HEADOUT_GRND_COLLVECT
MOVE *A8(OFLAGS),A14,W
BTST B_DEAD,A14
JRNZ NONBOY_GRND_COLLVECT
MOVE *A8(OFLAGS),A14,W
ANDNI M_GCOLL,A14 ;TURN OFF COLLISION CHECK
MOVE A14,*A8(OFLAGS),W
CLR A14
MOVE A14,*A8(OYVEL),L ;STOP Y VELOCITY
MOVE *A8(OXDRIFTVEL),*A8(OXVEL),L ;SET X DRIFT VELOCITY
MOVI NONBOY_CVECT,A14
MOVE A14,*A8(OCVECT),L
JAUC SET_ONGRND
AU_CREATE_HEADOUTBOY
; MOVE @OBJENEMIES,A14,W
; BTST B_DOOR,A14
; JRZ AU_CH_ABORT ;BR=NOT ALLOWED
MOVE @ENEMY_QUOTA,A14,W
JRNZ AU_CH_ABORT ;BR=QUOTA REACHED
MOVE @HOLD_ENEMY_DISPATCH,A14,W
JRNZ AU_CH_ABORT ;BR=HOLD ON THERE
;DON'T TRASH A0
; MOVI OID_NONBOY,A0
; CALLA GET_ENEMY_COUNT
; CMPI 10,A0
; JRHS AU_CH_ABORT ;BR=REACHED MAX NUMBER OF ENEMIES
MOVE A8,A9
MOVI NONBOY_HEADON_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JRZ AU_CH_ERROR ;BR = ERROR! ERROR!
MOVE @RAND,A0,W ;LEFTY OR RIGHTY?
ANDI M_FLIPH,A0
CALLA SET_FLPS
MOVE A8,A1 ;NONBOY OBJECT POINTER
MOVE A9,A8 ;GENERATOR OBJECT POINTER
CLR A11 ;CLEAR SET X DRIFT ON GROUND COLL FLAG
CALLA GETAFARG_LONG
MOVE A0,A10
CALLA GETAFARG_WORD
SLL 8,A0
MOVE A0,*A1(OYVEL),L
DEC A0
JRN AU_CH_OFFZ ;NO GOING DOWN
MOVK 1,A11 ;SET SET X DRIFT ON GROUND COLL FLAG
MOVE *A1(OFLAGS),A14,W ;ENABLE GROUND CHECK
ORI M_GCOLL,A14
MOVE A14,*A1(OFLAGS),W
MOVI HEADOUT_CVECT,A14
MOVE A14,*A1(OCVECT),L
AU_CH_OFFZ
CALLA GETAFARG_WORD
MOVE *A9(OYVAL),A2,L
; MOVE @YWORLD,A2,L
MOVE *A9(OZVAL),A3,L
ADD A0,A3 ;OFFSET Z IN BACK OF DOOR
MOVE A1,A8 ;RESTORE NONBOY OBJECT POINTER
MOVE *A9(OXVAL),A1,L
CALLA SET_ANIPU
; MOVI RUNOUTBOY_CHECK,A14
; MOVE A14,*A8(OANIMCHK),L
MOVI NB_SRUNVEL_MAX,A0 ;GET RANDOM SIDE RUNNING SPEED
MOVI NB_SRUNVEL_MIN,A1
CALLA RANGRAND
MOVE A0,*A8(OSRUNVEL),L
MOVI NB_HRUNVEL,A14
MOVE A14,*A8(OHRUNVEL),L ;SET HEADON RUNNING SPEED
MOVE A14,*A8(OZVEL),L
MOVE A10,A1
SEXT A1,W
SLL 8,A1 ;UNCOMPRESSED MIN X DRIFT
MOVE A10,A0
SRA 16,A0
SLL 8,A0 ;UNCOMPRESSED MAX X DRIFT
MOVE *A9(OCTRL),A14,W
BTST B_FLIPH,A14
JRNZ AU_CH_XVEL
NEG A0
NEG A1
AU_CH_XVEL
CALLA RANGERND
MOVE A11,A11
JRZ AU_CH_SET_XVEL ;SET VELOCITY NOW!
MOVE A0,*A8(OXDRIFTVEL),L ;SET IT LATER
JRUC AU_CH_ANIM
AU_CH_SET_XVEL
MOVE A0,*A8(OXVEL),L
AU_CH_ANIM
MOVI NONBOY_HEADON_RUN_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
; MOVE *A9(OCTRL),A0,W ;INVERT DOOR FLIP
; NOT A0
; ANDI M_FLIPH,A0
; MOVE *A8(OCTRL),A14,W
; OR A0,A14
; MOVE A14,*A8(OCTRL),W
MOVI 0FFH,A14
MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
MOVK 3,A1
MOVK 10,A0
CALLA RANGRAND
; MOVI 080H,A0
MOVB A0,*A8(OSHOOTCNT) ;DISABLE SHOOTING
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
CALLA GET_SHAD_MULTI ;ME AND MY SHADOW
RETS
AU_CH_ERROR
AU_CH_ABORT
AU_CH_DONE
RETS
**************************************************************************
* *
* CREATE_SIDERUN_NONBOY0 - CREATE SIDE RUNNING NONBOY *
* *
* PASS: *
* A8 = UNIVERSE Y *
* A9 = FLAGS|X (OFF-)SCREEN OFFSET AT FULL SIZE *
* A10 = CLOSEST UNIVERSE Z *
* A11 = FARTHEST UNIVERSE Z *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
CREATE_SIDERUN_NONBOYF
MOVE @ENEMY_QUOTA,A14,W
JANZ SUCIDE ;BR=REACHED QUOTA
MOVI OID_NONBOY,A0
CALLA GET_ENEMY_COUNT
CMPK 3,A0
JAHS SUCIDE
PUSH A8
MOVI NONBOY_SIDE_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
PULL A2 ;A2=UNIVERSE Y
MOVE A8,A8
JRZ CSN0_ABORT ;BR = ABORT! ABORT!
JRUC CSN0_GO
CREATE_SIDERUN_NONBOY0
MOVE @ENEMY_QUOTA,A14,W
JANZ SUCIDE ;BR=REACHED QUOTA
MOVI OID_NONBOY,A0
CALLA GET_ENEMY_COUNT
CMPK 10,A0
JAHS SUCIDE
PUSH A8
MOVI NONBOY_SIDE_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
PULL A2 ;A2=UNIVERSE Y
MOVE A8,A8
JRZ CSN0_ABORT ;BR = ABORT! ABORT!
CSN0_GO
CALLA GET_SHAD_MULTI
MOVI NB_SRUNVEL_MAX,A0 ;GET RANDOM SIDE RUNNING SPEED
MOVI NB_SRUNVEL_MIN,A1
CALLA RANGRAND
MOVE A0,*A8(OSRUNVEL),L
MOVI NB_HRUNVEL,A14
MOVE A14,*A8(OHRUNVEL),L ;SET HEADON RUNNING SPEED
MOVE A9,A7
SEXT A9,W ;CLEAR OUT FLAGS
SLL 15,A9 ;TRANSLATE TO WORLD OFFSET
;CHANGE THIS POSITIONING TO WORK WITH WORLD NOT SCREEN!
MOVK M_FLIPH,A6 ;DEFAULT TO COMING ON DA RIGHT
NEG A0
MOVI SCRRGT,A3
BTST B_NON_RIGHT+16,A7
JRNZ CSN0_SETX ;BR=COME ON FROM THE RIGHT
BTST B_NON_LEFT+16,A7
JRNZ CSN0_NEGX ;BR=COME ON FROM THE LEFT
MOVE @XSCROLL,A14,L
JRNZ CSN0_NORAND ;BR = WE ARE SCROLLING
MOVE @RAND,A14,W ;LEFTY OR RIGHTY?
SRA 2,A14
JRC CSN0_SETX
JRUC CSN0_NEGX
CSN0_NORAND
JRNN CSN0_SETX ;BR = SCROLLING RIGHT
CSN0_NEGX
NEG A9 ;BR = SCROLLING LEFT, SO COME ON DA LEFT
CLR A3
CLR A6
NEG A0
CSN0_SETX
MOVE A0,*A8(OXVEL),L ;RUN MOTHERFUCKER!
MOVE A11,A0 ;GET RANDOM UNIVERSE Z
MOVE A10,A1
CMP A0,A1
JREQ CSN0_SAME ;BR=THEY'RE DA SAME
CALLA RANGERND
CSN0_SAME
STOUX A0,A3 ;TRANSLATE SCREEN TO UNIVERSE
ADD A9,A3 ;ADD WORLD OFFSET
MOVE A3,A1
MOVE A0,A3
CALLA SET_ANIPU ;A2=UNIVERSE Y
MOVI NONBOY_SIDE_RUN_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVK 4,A14
MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
MOVI 080H,A0 ;DEFAULT -> SHOOTING OFF
BTST B_DONT_SHOOT+16,A7
JRNZ CSN0_DONT_SHOOT ;BR=DO NOT ENABLE SHOOTING
MOVK 3,A1
MOVK 10,A0
CALLA RANGRAND
CSN0_DONT_SHOOT
MOVB A0,*A8(OSHOOTCNT) ;RANDOM SHOOTING CHECK COUNT
MOVI M_SIDE,A0
MOVE A0,*A8(OEFLAGS),W ;SET ENEMY STATE FLAG
MOVE A6,A0
CALLA SET_FLPS
SRL 28,A7 ;HIGH 4 BITS HOLD INDEX
SLL 5,A7
ADDI CSN0_ANIMCHK_TABLE,A7
MOVE *A7,A14,L ;GET ROUTINE ADDRESS
MOVE A14,*A8(OANIMCHK),L
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
CSN0_ABORT
DIE
CSN0_ANIMCHK_TABLE
.LONG 0, NONBOY_HOLE_CHECK0, NONBOY_CONCERT_AISLE_CHECK
.LONG NONBOY_CRATE_AISLE, NONBOY_SCAFFOLD_CHECK
**************************************************************************
* *
* NONBOY_CONCERT_AISLE_CHECK - MAKE NONBOY RUN UP THE AISLE IN THE *
* CONCERT HALL *
* PASS: *
* A8 = NONBOY OBJECT *
* *
**************************************************************************
NONBOY_CONCERT_AISLE_CHECK
MOVE @XSCROLL,A14,L
JRNZ NCAC_ABORT ;BR=ABORT IF X SCROLLING
MOVE *A8(OXVAL),A0,L
MOVE @XBASE,A14,L
SUB A14,A0
GETST A14
ABS A0
CMPI 0100000H,A0
JRLT NCAC_TURN ;BR=GO UP AISLE
MOVE *A8(OXVEL),A0,L
GETST A0
XOR A14,A0
MOVE A0,A0
JANN DEL_ENEMY_NOAUD ;BR=RUNNING AWAY FROM CENTER
RETS
NCAC_TURN
MOVI -04000H,A14
MOVE A14,*A8(OYVEL),L ;UP THE AISLE STAIRS VELOCITY
; MOVK 3,A1
; MOVK 10,A0
; CALLA RANGRAND
; MOVB A0,*A8(OSHOOTCNT) ;RANDOM SHOOTING CHECK COUNT
CLR A14
MOVE A14,*A8(OANIMCHK),L
; MOVB A14,*A8(OSHOOTCNT) ;SHOOT ASAP
MOVE A14,*A8(OXVEL),L ;STOP
MOVE *A8(OEFLAGS),A14,W
XORI M_SIDE,A14
MOVE A14,*A8(OEFLAGS),W
MOVE A8,A0
MOVI NONBOY_SIDE_TO_HEAD_ANIM,A1
MOVI NONBOY_HEADON_RUN_ANIM,A14
CALLA STRTANIM_OFF
NCAC_ABORT
RETS
**************************************************************************
* *
* NONBOY_SCAFFOLD_CHECK - MAKE NONBOY ON THE SCAFFOLD *
* *
* PASS: *
* A8 = NONBOY OBJECT *
* *
**************************************************************************
NONBOY_SCAFFOLD_CHECK
MOVE *A8(OXVAL),A0,L
MOVE @XBASE,A14,L
SUB A14,A0
GETST A14
ABS A0
CMPI 0100000H,A0
JRLT NSC_TURN ;BR=GO ON SCAFFOLD
MOVE *A8(OXVEL),A0,L
GETST A0
XOR A14,A0
MOVE A0,A0
JANN DEL_ENEMY_NOAUD ;BR=RUNNING AWAY FROM CENTER
RETS
NSC_TURN
CLR A14
MOVE A14,*A8(OANIMCHK),L
MOVB A14,*A8(OSHOOTCNT) ;SHOOT ASAP
MOVE A14,*A8(OXVEL),L ;STOP
MOVE *A8(OEFLAGS),A14,W
XORI M_SIDE,A14
MOVE A14,*A8(OEFLAGS),W
MOVE A8,A0
MOVI NONBOY_SIDE_TO_HEAD_ANIM,A1
MOVI NONBOY_HEADON_RUN_ANIM,A14
CALLA STRTANIM_OFF
RETS
;**************************************************************************
;* *
;* NONBOY_BAR_CHECK - CHECK IF HE CAN RUN AROUND THE BAR *
;* *
;* PASS: *
;* A8 = OBJECT *
;* *
;**************************************************************************
;
;NONBOY_BAR_CHECK
; MOVE *A8(OXVAL),A0,L
; MOVE *A8(OCTRL),A14,W
; BTST B_FLIPH,A14
; JRZ NBC_RIGHT_CHECK
; CMPI 030F0000H,A0
; JRLT NBC_GO
; CMPI 034F0000H,A0
; JRGT NBC_DONE
; MOVI 256,A0
; CALLA RANDPER
; JRC NBC_GO
;NBC_DONE
; RETS
;NBC_RIGHT_CHECK
; CMPI 04B40000H,A0
; JRGT NBC_GO
; CMPI 04640000H,A0
; JRLT NBC_DONE
; MOVI 256,A0
; CALLA RANDPER
; JRNC NBC_DONE
;NBC_GO
; CLR A14
; MOVE A14,*A8(OANIMCHK),L
; MOVE A14,*A8(OXVEL),L ;STOP
; MOVE *A8(OEFLAGS),A14,W
; XORI M_SIDE,A14
; MOVE A14,*A8(OEFLAGS),W
; MOVE A8,A0
; MOVI NONBOY_SIDE_TO_HEAD_ANIM,A1
; MOVI NONBOY_HEADON_RUN_ANIM,A14
; JAUC STRTANIM_OFF
**************************************************************************
* *
* NONBOY_CRATE_AISLE *
* *
* Anim func to have the NON-BOY figure when you're on a crate *
* aisle and start running foward. *
* *
* A8 = Ptr to NON-BOY object *
* *
**************************************************************************
NONBOY_CRATE_AISLE
MOVE @XSCROLL,A14,L ;Are we moving in X?
JRNZ NCA_X ;BR = Yes, then we are not centered
MOVE @ZSCROLL,A14,L ;Are we moving in or out?
JRZ NCA_X ;BR = No, then we're not in an aisle
MOVE *A8(OAISLE_X_OFFSET),A0,W
JRNZ NCA_GOT_TOFF
MOVK 10,A0
CALLA SRAND
MOVE A0,*A8(OAISLE_X_OFFSET),W
NCA_GOT_TOFF
SLL 16,A0
MOVE @XBASE,A1,L ;Get the position of the universe
ADD A0,A1 ;Randomize the lockon, slightly
MOVE *A8(OXVAL),A0,L ;Get our position
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ NCA_RIGHT_CK
CMP A1,A0 ;Have we crossed to the left?
JRLT NCA_GO ;BR = Yes, then get goin' forward
NCA_X
RETS
NCA_RIGHT_CK
CMP A1,A0 ;Have we crossed to the right?
JRLE NCA_X ;BR = No, let us bail now
NCA_GO
CLR A14
MOVE A14,*A8(OAISLE_X_OFFSET),W
MOVE A14,*A8(OANIMCHK),L
MOVE A14,*A8(OXVEL),L ;Stop this madness
MOVE *A8(OEFLAGS),A14,W
ANDNI M_SIDE,A14 ;We no longer run sideways
MOVE A14,*A8(OEFLAGS),W
MOVE A8,A0
MOVI NONBOY_SIDE_TO_HEAD_ANIM,A1
MOVI NONBOY_HEADON_RUN_ANIM,A14
JAUC STRTANIM_OFF
**************************************************************************
* *
* NONBOY_HOLE_CHECK0 - CHECK IF HE CAN GO THROUGH THE HOLE IN THE WALL *
* NONBOY_HOLE_CHECK1 - CHECK IF HE IS DONE GOING THROUGH THE HOLE *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
NONBOY_HOLE_CHECK0
MOVE *A8(OXVAL),A14,L
SUBI 03E08000H,A14 ;GET X DIFF FROM HOLE
ABS A14
CMPI NB_SRUNVEL_MAX*SIDERUN_TIME,A14
JRGT NHC0_DONE ;BR=TO FAR AWAY
MOVI 03E08000H,A1
CALLA SET_ANIPXU ;CENTER HIM IN THE HOLE
MOVI NONBOY_SIDE_TO_HEAD_ANIM,A1 ;NEW ANIM
MOVE A1,*A8(AnimFrm),L
MOVI NONBOY_HEADON_RUN_ANIM,A1 ;NEW LOOP ANIM
MOVE A1,*A8(AnimScr),L
CLR A14 ;NO SLEEP TIL'
MOVB A14,*A8(AnimSlp)
MOVE A14,*A8(OXVEL),L ;STOP
MOVI NONBOY_HOLE_CHECK1,A14
MOVE A14,*A8(OANIMCHK),L ;NEW ANIM CHECK
NHC0_DONE
RETS
NONBOY_HOLE_CHECK1
MOVE *A8(OZVAL),A14,L
CMPI -011000H,A14
JRGT NHC1_DONE ;BR=NOT AT Z YET
MOVI NONBOY_HEAD_TO_SIDE_ANIM,A1 ;NEW ANIM
MOVE A1,*A8(AnimFrm),L
MOVI NONBOY_SIDE_RUN_ANIM,A1 ;NEW LOOP ANIM
MOVE A1,*A8(AnimScr),L
CLR A14
MOVB A14,*A8(AnimSlp) ;NO SLEEP TIL'
MOVE A14,*A8(OZVEL),L ;STOP
MOVE A14,*A8(OANIMCHK),L ;NO ANIM CHECK
MOVB A14,*A8(OSHOOTCNT) ;SHOOT ASAP
MOVI -011000H,A1 ;SET Z POSITION AND SORT
CALLA SET_ANIPZU
JRUC RESORT_OBJ
NHC1_DONE
RETS
**************************************************************************
* *
* CREATE_HELIDROP_NONBOY0 - CREATE HELICOPTER DROPPING NONBOY *
* CREATE_DROP_SHOOTING_NONBOY - CREATE DROPPING NONBOY THAT ONLY SHOOTS *
* *
* PASS: *
* A8 = UNIVERSE X *
* A9 = UNIVERSE Y OF CREATION (HELICOPTER) *
* A10 = UNIVERSE Y OF DESTINATION (GROUND OR TOP OF BUILDING) *
* A11 = UNIVERSE Z *
* *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
CREATE_HELIDROP_NONBOY0
MOVE @ENEMY_QUOTA,A14,W
JANZ SUCIDE ;BR=REACHED QUOTA
; MOVI OID_NONBOY,A0
; CALLA GET_ENEMY_COUNT
; MOVK 7,A1
; MOVE @XSCROLL,A14,L
; JRZ CHN0_NOFUDGE
; MOVK 5,A1
;CHN0_NOFUDGE
; CMP A1,A0
; JAHS SUCIDE
PUSH A8
MOVI NONBOY_DROP_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
PULL A4 ;A4=UNIVERSE X
MOVE A8,A8
JRZ CHN0_ABORT ;BR = ABORT! ABORT!
MOVI NONBOY_HELIDROP_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVI ROOF_LEFT_BOUNDARY,A14
MOVE A14,*A8(OROOFXLEFT),L ;SET LEFT ROOF BOUNDARY
MOVI ROOF_RIGHT_BOUNDARY,A14
MOVE A14,*A8(OROOFXRGHT),L ;SET RIGHT ROOF BOUNDARY
MOVI NONBOY_ROOF_CHECK0,A14
MOVE A14,*A8(OANIMCHK),L
MOVK 3,A1
MOVK 10,A0
CALLA RANGRAND
MOVB A0,*A8(OSHOOTCNT) ;RANDOM SHOOTING CHECK COUNT
JRUC CHN0_GO
CREATE_DROP_SHOOTING_NONBOY
MOVE @ENEMY_QUOTA,A14,W
JANZ SUCIDE ;BR=REACHED QUOTA
; MOVI OID_NONBOY,A0
; CALLA GET_ENEMY_COUNT
; MOVK 7,A1
; MOVE @XSCROLL,A14,L
; JRZ CHN0_NOFUDGE
; MOVK 5,A1
;CHN0_NOFUDGE
; CMP A1,A0
; JAHS SUCIDE
PUSH A8
MOVI NONBOY_DROP_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
PULL A4 ;A4=UNIVERSE X
MOVE A8,A8
JRZ CHN0_ABORT ;BR = ABORT! ABORT!
MOVE A8,A0
MOVI NONBOY_DROP_SHOOT_ANIM,A1
MOVI NONBOY_SHOOT_LUPE,A14
CALLA STRTANIM_OFF ;START ANIMATION
MOVE @BLACKOUT,A14,W
JRZ CHN0_GO ;BR=NO BLACKOUT
CALLA OBJ_OFF_MULTI
CHN0_GO
MOVE A11,A3
MOVE A4,A1
MOVE A9,A2
JRNZ CHN0_SET
CALLA GET_TOPY_OFFSCRN
CHN0_SET
CALLA SET_ANIPU
MOVE @YWORLD,A0,L
SUB A10,A0
MOVE A0,*A8(OGRNDOFF),L
MOVI NB_SRUNVEL_MAX,A0 ;GET RANDOM RUNNING SPEED
MOVI NB_SRUNVEL_MIN,A1
CALLA RANGRAND
MOVE A0,*A8(OSRUNVEL),L
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVK 2,A14
MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
MOVE @RAND,A0,W ;LEFTY OR RIGHTY?
ANDI M_FLIPH,A0
CALLA SET_FLPS
MOVI 07000H,A14
MOVE A14,*A8(OYACCEL),W ;SET GRAVITY
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
CHN0_ABORT
DIE
**************************************************************************
* *
* A_CHECK_NONBOY_BLACKOUT - IF BLACKOUT <> 0, THEN BLACKEN NONBOY *
* *
* A8 = NONBOY OBJECT *
* *
**************************************************************************
A_CHECK_NONBOY_BLACKOUT
MOVE @BLACKOUT,A14,W
JAZ A_CHECK_DUDE
CALLA OBJ_OFF
JRUC A_CHECK_DUDE
; JRZ A_CNB_DONE
;
; MOVE *A8(OCTRL),A14,W
; SRL 4,A14
; SLL 4,A14
; ORI DMACNZ & 0FH,A14
; MOVE A14,*A8(OCTRL),W
;
;A_CNB_DONE
RETS
**************************************************************************
* *
* MAKE_SECRET_BAR_NONBOYS - MAKE 2 NONBOYS FALL IN THE SECRET ROOM *
* *
**************************************************************************
MAKE_SECRET_BAR_NONBOYS
MOVI 02EC19H,A11 ;Z
MOVI 0138000H,A10 ;Y DESTINATION
MOVI -02E4000H,A9 ;Y CREATION
MOVE @RAND,A14,W
BTST 1,A14
JRZ MSBN_OTHER
MOVI -0370000H,A8 ;X
CREATE PID_IND,CREATE_DROP_SHOOTING_NONBOY ;LEFT GUY
MOVK 30,A0
CALLA RANDU
SLEEPR A0
MOVI -0E0000H,A8 ;X
CREATE PID_IND,CREATE_DROP_SHOOTING_NONBOY ;RIGHT GUY
DIE
MSBN_OTHER
MOVI -0E0000H,A8 ;X
CREATE PID_IND,CREATE_DROP_SHOOTING_NONBOY ;RIGHT GUY
MOVK 30,A0
CALLA RANDU
SLEEPR A0
MOVI -0370000H,A8 ;X
CREATE PID_IND,CREATE_DROP_SHOOTING_NONBOY ;LEFT GUY
DIE
**************************************************************************
* *
* CREATE_SHOOTING_NONBOY - AND THAT'S ALL HE DOES *
* *
* PASS: *
* A9 = UNIVERSE X *
* A10 = UNIVERSE Y *
* A11 = UNIVERSE Z *
* *
**************************************************************************
CREATE_SHOOTING_NONBOY
MOVE @ENEMY_QUOTA,A14,W
JANZ SUCIDE ;BR=REACHED QUOTA
; MOVI OID_NONBOY,A0
; CALLA GET_ENEMY_COUNT
; MOVK 7,A1
; MOVE @XSCROLL,A14,L
; JRZ CSN_NOFUDGE
; MOVK 5,A1
;CSN_NOFUDGE
; CMP A1,A0
; JAHS SUCIDE
MOVI NONBOY_SHOOTER_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JRZ CSN_ABORT ;BR = ABORT! ABORT!
MOVI NONBOY_SHOOTER_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVE A9,A1 ;X
MOVE A10,A2 ;Y
MOVE A11,A3 ;Z
CALLA SET_ANIPU
MOVE @YWORLD,A0,L
SUB A10,A0
MOVE A0,*A8(OGRNDOFF),L
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVI 0FFH,A14
MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
MOVK 2,A0
CALLA RAND0
SLL 4,A0
MOVE *A8(OCTRL),A14,W
OR A0,A14
MOVE A14,*A8(OCTRL),W
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
CSN_ABORT
DIE
;**************************************************************************
;* *
;* CREATE_SHOOTING_HALFBOY - AND THAT'S ALL HE DOES (HE'S ONLY HALF A MAN)*
;* *
;* PASS: *
;* A9 = UNIVERSE X *
;* A10 = UNIVERSE Y *
;* A11 = UNIVERSE Z *
;* *
;**************************************************************************
;
;CREATE_SHOOTING_HALFBOY
;
; MOVE @ENEMY_QUOTA,A14,W
; JANZ SUCIDE ;BR=REACHED QUOTA
;
;; MOVI OID_NONBOY,A0
;; CALLA GET_ENEMY_COUNT
;; MOVK 7,A1
;; MOVE @XSCROLL,A14,L
;; JRZ CSN_NOFUDGE
;; MOVK 5,A1
;;CSN_NOFUDGE
;; CMP A1,A0
;; JAHS SUCIDE
;
; MOVI NONBOY_SHOOTER2_INIT,B0 ;ALLOCATE OBJECT
; CALLA CREATE_ENEMY
; JRZ CSH_ABORT ;BR = ABORT! ABORT!
;
;; MOVI NONBOY_SHOOTER2_FALL_ANIM,A14
;; MOVE A14,*A8(OEDEATH),L
;
; MOVI NONBOY_SHOOTER2_ANIM,A1
; CALLA STRT_ANIM ;START ANIMATION
;
; MOVE A9,A1 ;X
; MOVE A10,A2 ;Y
; MOVE A11,A3 ;Z
; CALLA SET_ANIPU
;
; MOVE @YWORLD,A0,L
; SUB A10,A0
; MOVE A0,*A8(OGRNDOFF),L
;
; MOVK 1,A14
; MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
;
; MOVI -10,A14
; MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
;
; MOVK 2,A0
; CALLA RAND0
; SLL 4,A0
; MOVE *A8(OCTRL),A14,W
; OR A0,A14
; MOVE A14,*A8(OCTRL),W
;
; CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
;
;CSH_ABORT
; DIE
**************************************************************************
* *
* CREATE_STALLBOY - CREATE A NONBOY WAITING IN THE STALL *
* *
* PASS: *
* A9 = UNIVERSE X *
* A10 = UNIVERSE Y *
* A11 = UNIVERSE Z *
* *
**************************************************************************
CREATE_STALLBOY
MOVE @ENEMY_QUOTA,A14,W
JANZ SUCIDE ;BR=REACHED QUOTA
MOVI NONBOY_SHOOTER_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JRZ CS_ABORT ;BR = ABORT! ABORT!
MOVI NONBOY_STALL_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVE A9,A1 ;X
MOVE A10,A2 ;Y
MOVE A11,A3 ;Z
CALLA SET_ANIPU
MOVE @YWORLD,A0,L
SUB A10,A0
MOVE A0,*A8(OGRNDOFF),L
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVK 2,A0
CALLA RAND0
SLL 4,A0
MOVE *A8(OCTRL),A14,W
OR A0,A14
MOVE A14,*A8(OCTRL),W
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
CALLA GET_SHAD_MULTI
CS_ABORT
DIE
**************************************************************************
* *
* A_CHECK_STALLBOY - WHEN ENEMY_QUOTA IS TRUE, DIE! *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_CHECK_STALLBOY
MOVE @SCROLL_FLAG,A14,W
JANZ DEL_ENEMY_NOAUD ;BR=BANG YOUR DEAD!
RETS
**************************************************************************
* *
* NONBOY_ROOF_CHECK0 - LOOK FOR THE BEGINNING OF THE STAIRWAY *
* NONBOY_ROOF_CHECK1 - LOOK FOR THE END OF THE STAIRWAY *
* *
* PASS: *
* A8 = OBJECT *
* *A8(OROOFXLEFT) = ROOF LEFT BOUNDARY *
* *A8(OROOFXRGHT) = ROOF RIGHT BOUNDARY *
* *
**************************************************************************
NONBOY_ROOF_CHECK0
MOVE *A8(OEFLAGS),A14,W
BTST B_SIDE,A14
JRZ NRF_DONE ;BR=HE'S SHOOTING! ABORT!
MOVE *A8(OXVAL),A0,L
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ NRF_NOFLIP
MOVE *A8(OROOFXLEFT),A14,L
ADDI 0200000H,A14
CMP A14,A0
JRLT NRF_GOING_DOWN ;BR=NOT AT LEFT STAIRWAY
JRUC NRF_DONE
NRF_NOFLIP
MOVE *A8(OROOFXRGHT),A14,L
SUBI 0200000H,A14
CMP A14,A0
JRLT NRF_DONE ;BR=NOT AT RIGHT STAIRWAY
NRF_GOING_DOWN
MOVI NONBOY_ROOF_CHECK1,A14 ;FOUND A STAIRWAY!
MOVE A14,*A8(OANIMCHK),L
MOVI 030000H,A14
MOVE A14,*A8(OYVEL),L ;GOING DOWN!
MOVI 080H,A0
MOVB A0,*A8(OSHOOTCNT) ;DISABLE SHOOTING
NRF_DONE
RETS
NONBOY_ROOF_CHECK1
MOVE *A8(OXVAL),A0,L
MOVE *A8(OROOFXLEFT),A1,L
CMP A1,A0
JALT DEL_ENEMY_NOAUD ;BR=END OF THE STAIRS
MOVE *A8(OROOFXRGHT),A1,L
CMP A1,A0
JAGT DEL_ENEMY_NOAUD ;BR=END OF THE STAIRS
RETS
**************************************************************************
* *
* CREATE_HEADONRUN_NONBOY0 *
* *
* Process to create a head-on running NON-BOY. He runs *
* until he gets off of the screen. *
* *
* A9 = Starting position universe Z *
* A10 = Starting position universe Y *
* A11 = Starting position universe X *
* *
**************************************************************************
CREATE_HEADONRUN_NONBOY0
MOVE @ENEMY_QUOTA,A14,W
JANZ SUCIDE ;BR=REACHED QUOTA
MOVI OID_NONBOY,A0
CALLA GET_ENEMY_COUNT
MOVK 7,A1
; MOVE @XSCROLL,A14,L
; JRZ CHNB0_NOFUDGE
; MOVK 5,A1
;CHNB0_NOFUDGE
CMP A1,A0
JAHS SUCIDE
MOVI NONBOY_HEADON_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JRZ CHNB0_ABORT ;BR = ABORT! ABORT!
; MOVI NB_SRUNVEL_MAX,A0 ;GET RANDOM RUNNING SPEED
; MOVI NB_SRUNVEL_MIN,A1
; CALLA RANGRAND
; MOVE A0,*A8(OSRUNVEL),L
MOVIM NB_HRUNVEL,*A8(OZVEL),L ;Set speed
; MOVK M_FLIPH,A6 ;DEFAULT TO COMING ON DA RIGHT
; NEG A0
; MOVI SCRRGT,A3
; MOVE @XSCROLL,A14,L
; JRNZ CHNB0_NORAND ;BR = WE ARE SCROLLING
; MOVE @RAND,A14,W ;LEFTY OR RIGHTY?
; SRA 2,A14
; JRC CHNB0_SETX
; JRUC CHNB0_NEGX
;CHNB0_NORAND
; JRNN CHNB0_SETX ;BR = SCROLLING RIGHT
;CHNB0_NEGX
; NEG A9 ;BR = SCROLLING LEFT, SO COME ON DA LEFT
; CLR A3
; CLR A6
; NEG A0
;CHNB0_SETX
; MOVE A0,*A8(OXVEL),L ;RUN MOTHERFUCKER!
; ADD A9,A3
; MOVE A11,A0 ;GET RANDOM UNIVERSE Z
; MOVE A10,A1
; CMP A0,A1
; JREQ CHNB0_SAME ;BR=THEY'RE DA SAME
; CALLA RANGERND
;CHNB0_SAME
; MOVE A0,*A8(OZVAL),L
; STOUX A0,A3 ;TRANSLATE SCREEN TO UNIVERSE
; MOVE A3,*A8(OXVAL),L
; MOVE A9,*A8(OZVAL),L
; MOVE A11,*A8(OXVAL),L
; MOVE A10,*A8(OYVAL),L
MOVE A11,A1
MOVE A10,A2
MOVE A9,A3
CALLA SET_ANIPU
MOVI NONBOY_HEADON_RUN_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVK 2,A14
MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
MOVK 3,A1
MOVK 10,A0
CALLA RANGRAND
MOVB A0,*A8(OSHOOTCNT) ;RANDOM SHOOTING CHECK COUNT
; CLR A0
; MOVE A0,*A8(OEFLAGS),W ;SET ENEMY STATE FLAG
; MOVE *A8(OCTRL),A14,W
; OR A6,A14
; MOVE A14,*A8(OCTRL),W
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
CHNB0_ABORT
DIE
**************************************************************************
* *
* NONBOY_CVECT - NONBOY COLLISION TABLE *
* *
**************************************************************************
NONBOY_CVECT
WWL OID_PROCKET,~MASK_PLAYER,NONBOY_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,NONBOY_EXPLOSION_COLL
; WWL OID_BLOWUP,0FFFFH,NONBOY_SBOMB_COLLVECT
WWL OID_BLOWUP,0FFFFH,NONBOY_SBOMB_CARNAGE
WWL OID_GRND,0FFFFH,NONBOY_GRND_COLLVECT
WL 0,DUMCRETS
**************************************************************************
* *
* NONBOY_GUNVECT - NONBOY GUN VECTOR *
* *
* PASS: *
* A2 = PTR TO PLAYER *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
NONBOY_SBOMB_COLLVECT
; CLR A2 ;LET SBOMB AWARD POINTS
JRUC NONBOY_SBOMB
NONBOY_GRND_COLLVECT
CLR A14
MOVE A14,*A8(OXVEL),L ;STOP IT!
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
MOVE A14,*A8(OYACCEL),W
MOVE *A8(OFLAGS),A14,W
ANDNI M_GCOLL,A14 ;TURN OFF COLLISION CHECK
MOVE A14,*A8(OFLAGS),W
JAUC SET_ONGRND
NONBOY_COLLVECT
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA ;GET PDATA IN A2
JRUC NG_NO_BLOOD
NONBOY_GUNVECT
SOUND1 SND_BODY_THUD
CALLA BLOODY_BULLET_HIT_OFFSET
NG_NO_BLOOD
NONBOY_SBOMB
CALLA GET_HEAD_PART
MOVE A2,*A8(OPLAYER),L
;NONBOY_SBOMB
MOVE *A8(OFLAGS),A9,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A9
JRNZ NG_DEAD ;BR = YES
MOVE *A8(OEFLAGS),A6,W
MOVB *A8(OHITS),A14
DEC A14
JRP NG_STILL_ALIVE ;BR = NONBOY STILL ALIVE
MOVI OID_JUNK,A1
CALLA DEL_OID_PART ;GET RID OF GUN FLASH
ORI M_DEAD,A9
MOVE A9,*A8(OFLAGS),W ;DEAD AS A DOOR KNOB
; MOVI DUMRETS,A14
; MOVE A14,*A8(OGUNVECT),L
MOVE A2,A2
JRZ NG_NOSCORE ;BR = NO SCORE
; MOVK 10,A0 ;AWARD RANDOM SCORE
; CALLA RANDU
; MOVE A0,A1
; MOVI 1000,A0
; MPYU A0,A1
;; CALLA SCORE
; INC A1 ;FLAG UP MOTION
MOVI 1000,A1
CALLA SCORE
CALLA COUNT_PLAYER_KILL
; MOVI 1001,A1
; CLR A9 ;NO OFFSET
; CALLA PRINT_SCORE
*A8 = PTR TO OBJECT BEING KILLED
NG_NOSCORE
; SOUND1 SND_BODY_THUD
MOVK NUM_GRUNT_SNDS,A0 ;GRUNT LIKE A PIG!
CALLA RAND0
SLL 5,A0
ADDI GRUNT_HIT_TBL,A0
MOVE *A0,A0,L
CALLA ONESND
; CALLA ONESND_Z
CLR A14 ;STOP IT!
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
;NOTE: DO NOT CLEAR OYACCEL!
MOVE *A8(ODEATHCALL),A14,L
JrZ SKP_DTHCALL2
MMTM SP,A6,A8
CALL A14
MMFM SP,A6,A8
SKP_DTHCALL2:
MOVE *A8(OEDEATH),A14,L
JRZ NG_ANIM ;BR=NO SPECIAL DEATH
JUMP A14
NG_ANIM
MOVI NONBOY_SIDE_RUN_DEATH_ANIM,A1 ;DEFAULT SIDEWAYS DEATH ANIM
BTST B_SIDE,A6
JANZ STRT_ANIM ;BR=HE'S NOT FACING YOU
MOVI NONBOY_HEADON_DEATH_ANIM,A1 ;OTHER DEATH ANIM
JAUC STRT_ANIM
NG_DEAD
RETS
NG_STILL_ALIVE
MOVB A14,*A8(OHITS) ;NUMBER OF HITS LEFT
RETS
**************************************************************************
* *
* A_HEADON_DEATH_SETUP *
* *
**************************************************************************
A_HEADON_DEATH_SETUP
MOVK 3,A1 ;TURN OFF 3 PARTS MAXIMUM
AHDS_LUPE
MOVE *A8(OPARTS),A8,L
JRZ AHDS_DONE ;BR=NO MORE PARTS
MOVE *A8(OFLAGS),A14,W
BTST B_SHAD,A14
JRNZ AHDS_DONE ;BR=DON'T DO NO SHADOWS
CALLA OBJ_OFF
DEC A1
JRZ AHDS_DONE ;BR=NO MORE PARTS
JRUC AHDS_LUPE
AHDS_DONE
RETS
**************************************************************************
* *
* NONBOY_ROCKET_COLL - Collision vector for Player rocket bomb. *
* A0 = Ptr to rocket object *
* A8 = Ptr to NON-BOY object *
* *
**************************************************************************
NONBOY_ROCKET_COLL
MOVE *A0(RL_INTENDED_OBJ),A14,L
CMP A14,A8 ;Is this the object we are after?
JRNE NRC_X ;BR = No
NONTHR_ROCKET_COLL:
CALLA GET_HEAD_PART
ORIM M_ATEROCKET,*A8(OEFLAGS),W ;Flag the rocket touch
MOVE A0,*A8(ONATEROCKET),L ;SAVE ROCKET OBJECT
NRC_X
RETS
**************************************************************************
* *
* NONBOY_EXPLOSION_COLL - Collision vector for Player explosion. *
* A0 = Ptr to explosion object *
* A8 = Ptr to NON-BOY object *
* *
**************************************************************************
NONBOY_EXPLOSION_COLL
CALLA GET_HEAD_PART
MOVE *A8(OEFLAGS),A14,W
BTST B_ATEROCKET,A14 ;Did he get hit by a rocket?
JRZ NONBOY_COLLVECT ;BR = No, just do generic for now.
NONTHR_COLLVECT:
CALLA ALL_COLLS_OFF ;Turn all collisions off now!
MOVE A0,A5
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA ;GET PDATA IN A2
SWAP A5,A8
CALLA GET_HEAD_PART
CALLA OBJ_OFF_MULTI
SWAP A5,A8
MOVI NONBOY_EXPLODE_ANIM,A1 ;Die like a brave
JRUC NEC_ANIM
NONBOY_SBOMB_CARNAGE
MOVI ANIM_NON_SBOMB_EXPLODE,A1
NEC_ANIM
CALLA STRT_ANIM
MOVE A2,*A8(OPLAYER),L ;Hang on to this address
MOVI 1000,A1
CALLA SCORE ;Explosions are always good for points
JAUC COUNT_PLAYER_KILL
**************************************************************************
* *
* A_CHECK_DUDE - CHECK UP ON ENEMY AND MAKE SURE HE'S ON SCREEN *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_CHECK_DUDE
MOVE *A8(OZVAL),A2,L
move @ZBASE,a14,L
sub a14,a2
; CMPI ZMAX_KLUDGE,A2
; JALT DEL_ENEMY_NOAUD ;BR = ENEMY IS BEHIND OF PLAYERS
CMPI ZMAX_REAL,A2
JAGE ACD_CHECK_FAR ;BR = ENEMY IN FRONT OF PLAYERS
MOVE *A8(OEFLAGS),A14,W
BTST B_SIDE,A14
JANZ DEL_ENEMY_NOAUD ;BR=HE'S SIDEWAYS!
MOVE @BIGBOYS,A14,W ;FLAG WE PASSED A HEADON NONBOY
INC A14
MOVE A14,@BIGBOYS,W
JAUC DEL_ENEMY_NOAUD
ACD_CHECK_FAR
MOVE @ZFAR,A14,L
CMP A14,A2
JAGT DEL_ENEMY_NOAUD ;BR = ENEMY IS FAR AWAY
CALLA SCRTST
JREQ ACD_OI ;BR = ON DA SCREEN
MOVB *A8(OSCRNOFFCNT),A0
; JRN ACD_CHECK_ON ;BR = NOT ON SCREEN YET
;
;ACD_CONT
; MOVB *A8(OFLAGS),A14 ;THIS ONLY CHECKS X
; JRN ACD_OFF ;BR = OFSCRN IS SET
;ACD_CHECK_ON
; CALLA SCRTST
; JREQ ACD_OI ;BR = ON DA SCREEN
;ACD_OFF
; MOVE A0,A0
JRN ACD_DONE ;BR = NOT ON SCREEN YET
DEC A0
JAZ DEL_ENEMY_NOAUD ;BR = OFF JUST ONCE TO MANY
JRUC ACD_SET
ACD_OI
MOVE A0,A0
JRNN ACD_DONE ;BR = BEEN ON SCREEN MORE THAN ONCE
NEG A0
ACD_SET
MOVB A0,*A8(OSCRNOFFCNT)
ACD_DONE
MOVE *A8(OANIMCHK),A14,L
JRZ ACD_NOCHK ;BR = NO SPECIAL CHECK
JUMP A14
ACD_NOCHK
SETZ ;FOR A_CHECK_DUDE_FIRE
RETS
**************************************************************************
* *
* A_CHECK_DUDE_FIRE - CHECK UP ON ENEMY AND MAKE SURE HE'S ON SCREEN *
* AND THEN CHECK IF HE CAN FIRE HIS GUN *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* *
* RETURN: *
* Z IS SET IF HE DIDN'T FIRE HIS GUN *
* Z IS CLEAR IF HE DID *
* *
**************************************************************************
A_CHECK_DUDE_FIRE
; MOVE *A8(OZVAL),A2,L
; move @ZBASE,a14,L
; sub a14,a2
; CMPI ZMAX_REAL,A2
; JALT DEL_ENEMY_NOAUD ;BR = ENEMY IS BEHIND OF PLAYERS
; MOVE @ZFAR,A14,L
; CMP A14,A2
; JAGT DEL_ENEMY_NOAUD ;BR = ENEMY IS FAR AWAY
MOVI [-80,-24],A3 ;FIRING OFFSET
CLR A5
MOVB *A8(OSHOOTCNT),A1
JRN ACDF_ABORT ;BR = NO SHOOTING ALLOWED
DEC A1
JRP ACDF_ABORT ;BR = CAN'T SHOOT YET
; JRNN ACDF_NORM ;BR = NORMAL ATTACK
; CALLA CK_PLAYER_HIT
; JRZ A_CHECK_DUDE ;BR = NO HIT ON PLAYERS
;; CALLR CHECK_OVERLAP
;; JRNZ A_CHECK_DUDE ;BR = OVERLAP ON ENEMIES
; CLR A0
; JRUC ACDF_SET
;ACDF_NORM
CALLA CK_PLAYER_HIT
; JRNZ ACDF_SHOOT ;BR=HIT ON PLAYER
JRC ACDF_NEW_COUNT ;BR=HE'S OFF SCREEN OR BLOCKED
MOVE @NONBOY_SHOOT_CHANCE,A0,W
NEG A0
ADDI 1024,A0
CALLA RANDPER
JRC ACDF_NEW_COUNT ;BR=DON'T SHOOT
; JRZ ACDF_NEW_COUNT ;BR = NO HIT ON PLAYERS
;; CALLR CHECK_OVERLAP
;; JRNZ ACDF_NEW_COUNT ;BR = OVERLAP ON ENEMIES
ACDF_SHOOT
MOVK 10,A1
MOVI 100,A0
CALLA RANGRAND
ACDF_SET
MOVB A0,*A8(OSHOOTCNT) ;SET RANDOM MAX FIRE CYCLES
CLR A1
MOVE A1,*A8(OXVEL),L ;STOP
MOVE A1,*A8(OYVEL),L ;STOP
MOVE A1,*A8(OZVEL),L ;STOP
MOVB A1,*A8(AnimSlp)
MOVI NONBOY_SIDE_TO_HEADON_SHOOT_ANIM,A1
MOVE *A8(OEFLAGS),A14,W
BTST B_SIDE,A14
JRNZ ACDF_SIDE ;BR=HE'S SIDEWAYS!
MOVI NONBOY_HEADON_SHOOT_ANIM,A1
ACDF_SIDE
MOVE A1,*A8(AnimFrm),L ;START SHOOT ANIMATION
RETS ;Z IS CLEAR
ACDF_NEW_COUNT
MOVK 3,A1 ;GET RANDOM SHOOT CHECK COUNT
MOVK 10,A0
CALLA RANGRAND
MOVE A0,A1
ACDF_ABORT
MOVB A1,*A8(OSHOOTCNT) ;SAVE SHOOT COUNT
JRUC A_CHECK_DUDE ;CHECK IF HE'S OFF SCREEN
**************************************************************************
* *
* CHECK_OVERLAP - CHECK FOR OVERLAPPING ENEMIES *
* *
* PASS: *
* A8 = OBJECT *
* *
* RETURN: *
* Z IS CLEAR IF OVERLAP *
* *
**************************************************************************
CHECK_OVERLAP
MMTM SP,A0,A1,A2,A3,A4,A7
MOVE *A8(ODAG),A0,L
MOVE *A8(OANIOFF),A14,L
ADDXY A14,A0 ;ANIP IN SCREEN COORDS
MOVE *A8(OZVAL),A7,L
MOVE @ZBASE,A14,L
SUB A14,A7
SRA Z2SCALE,A7
MOVI (33-10) << 8,A3 ;X ANIOFF
DIVU A7,A3
SUBXY A3,A0
MOVI 110 << 8,A3 ;Y ANIOFF
DIVU A7,A3
SLL 16,A3
SUBXY A3,A0 ;UPPER LEFT
MOVE A0,A1
MOVE A3,A14
ADDXY A3,A1 ;ADD Y SIZE
MOVI (56-10) << 8,A3 ;X SIZE
DIVU A7,A3
ADDXY A3,A1 ;BOTTOM RIGHT
MOVX A3,A14
; MOVI 110 << 8,A3 ;Y SIZE
; DIVU A7,A3
; SLL 16,A3
; ADDXY A3,A1 ;BOTTOM RIGHT
MOVE @SCRNTL,A3,L ;GET SCREEN UPPER LEFT
CMPXY A3,A0 ;IS THE UPPER LEFT INSIDE?
JRYLT CE_FAIL ;BR=NO
JRXLT CE_FAIL ;BR=NO
MOVE @SCRNBR,A2,L ;GET SCREEN BOTTOM RIGHT
CMPXY A2,A1 ;IS THE BOTTOM RIGHT INSIDE?
JRYGT CE_FAIL ;BR=NO
JRXGT CE_FAIL ;BR=NO
MOVB *A8(OSHOOTCNT),A7
JRZ CE_FULL ;BR=USE FULL SIZE
SRL 1,A14 ;USE QUARTER OF FULL ON SHOOTING SIDE
ANDNI 08000H,A14 ;DIVIDE [Y,X] BY 2
MOVE *A8(OCTRL),A7,W
BTST B_FLIPH,A7
JRZ CE_NOFLIP ;BR=NO FLIP
CLR A7
MOVX A14,A7
ADDXY A7,A0 ;ADD HALF X SIZE FOR NEW UPPER LEFT
CE_NOFLIP
MOVE A0,A1
ADDXY A14,A1 ;NEW BOTTOM RIGHT
CE_FULL
MOVE *A8(OZVAL),A3,L ;SORT BY Z AND WE DON'T HAVE TO DO THIS!
MOVI (SUPP_2 >> (SR_SUPP-5)) + SUPPLSTS - OSLINK,A7
CE_LUPE
MOVE *A7(OSLINK),A7,L
JRZ CE_DONE ;BR=END OF SUPP LIST
CMP A8,A7
JREQ CE_LUPE ;BR=THIS IS THE OBJECT WE'RE TESTING
MOVE *A7(ODAG),A2,L
; MOVE *A7(OSIZE),A14,L
;
; MOVB *A8(OSHOOTCNT),A4
; JRZ CE_NOFLIPH
;
; SRL 1,A14
; ANDNI 08000H,A14
; MOVE *A7(OCTRL),A4,W
; BTST B_FLIPH,A4
; JRZ CE_NOFLIPH
; CLR A4
; MOVX A14,A4
; ADDXY A4,A2
;CE_NOFLIPH
CMPXY A1,A2 ;IS UPPER LEFT >= BOTTOM RIGHT?
JRYGE CE_LUPE ;BR=YES FOR Y
JRXGE CE_LUPE ;BR=YES FOR X
MOVE *A7(OSIZE),A14,L
ADDXY A2,A14 ;GET BOTTOM RIGHT OF OBJECT
CMPXY A0,A14 ;IS BOTTOM RIGHT <= UPPER LEFT?
JRYLE CE_LUPE ;BR=YES FOR Y
JRXLE CE_LUPE ;BR=YES FOR X
MOVE *A7(OZVAL),A14,L
CMP A3,A14
JRGT CE_LUPE ;BR=IT'S BEHIND THE TEST OBJECT
CE_FAIL
CLRZ ;WE'VE FAILED!
CE_DONE
MMFM SP,A0,A1,A2,A3,A4,A7
RETS
**************************************************************************
* *
* A_PART_FIRE_FNC - ANIM FUNC, FOR ENEMY GUN PART FIRE. *
* *
* PASS: *
* A8 = PTR TO ARM PART DOING THE FIRING. *
* AARG+,L = [Y,X] FIRING OFFSET. *
* *
**************************************************************************
A_PART_FIRE_FNC
MOVE *A8(OFLAGS),A14,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A14
JRNZ PFF_X ;BR = YES
CALLA GETAFARG_LONG ;GET THE FIRING OFFSET
MOVE A0,A3
CALLA EGUN_FLASH_MULTI ;MAKE A GUN FLASH
MOVE @BASE_HIT,A5,W
SLL 4,A5
; MOVI [1,8000H],A5
MOVE @ENEMY_HITALL,A14,W
JRZ PFF_GO ;BR=CHECK PLAYERS
DEC A14
JRZ AFF_HIT ;BR=HIT EVERYBODY
CLR A5 ;NO DAMAGE
PFF_GO
CLR A1
CALLA CK_PLAYER_HIT
JRC PFF_NOHIT_No_Sound ;He did'nt hit because he was not visible
; JRNZ PFF_HIT ;BR = Successful hit on Player(s)
; JRNC PFF_NOHIT ;BR = No hit, but he was visible
; jruc PFF_NOHIT_No_Sound ;He did'nt hit because he was not visible
PFF_HIT
MOVI M_ATTACK,A1
PFF_NOHIT
SOUNDZ SND_NONBOY_FIRE
PFF_NOHIT_No_Sound
MOVE *A8(OEFLAGS),A14,W ;SET RESULT OF ATTACK
ANDNI M_ATTACK,A14
OR A1,A14
MOVE A14,*A8(OEFLAGS),W
PFF_X
RETS
A_ALL_FIRE_FNC
MOVE *A8(OFLAGS),A14,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A14
JRNZ PFF_X ;BR = YES
CALLA GETAFARG_LONG ;GET THE FIRING OFFSET
MOVE A0,A3
CALLA EGUN_FLASH_MULTI ;MAKE A GUN FLASH
AFF_HIT
MOVE @BASE_HIT,A5,W
SLL 4,A5
; MOVI [1,8000H],A5
ALLPLYR PLAYER_HIT ;HIT 'EM ALL
jruc PFF_HIT
**************************************************************************
* *
* A_REPEAT_FIRE - DETERMINES IF ENEMY FIRES AGAIN *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* AARG+,L = BEGINNING OF FIRE FRAMES *
* *
**************************************************************************
A_REPEAT_FIRE
MOVE *A8(OEFLAGS),A1,W
MOVB *A8(OSHOOTCNT),A2
DEC A2
JRZ ARF_NOFIRE ;BR = MAX FIRE TIME ELAPSED
; JRUC ARF_STORE ;IGNORE LAST ATTACK
MOVE A2,A2
JRNN ARF_NORM
BTST B_ATTACK,A1
JRNZ ARF_ATTACK ;BR = LAST ATTACK SUCCEEDED
CLR A0
JRUC ARF_SET
ARF_NORM
BTST B_ATTACK,A1
JRZ ARF_DONE ;BR = LAST ATTACK FAILED
ARF_STORE
MOVB A2,*A8(OSHOOTCNT)
ARF_ATTACK
CALLA GETAFARG_LONG ;BR = GET FIRST FIRE FRAME
MOVE A0,*A8(AnimFrm),L
JRUC A_CHECK_DUDE ;CHECK IF HE'S ON SCREEN
ARF_NOFIRE
ANDNI M_ATTACK,A1
MOVE A1,*A8(OEFLAGS),W ;CLEAR ATTACK
ARF_DONE
MOVK 3,A1
MOVK 10,A0
CALLA RANGRAND
ARF_SET
MOVB A0,*A8(OSHOOTCNT) ;RANDOM SHOOTING CHECK COUNT
RETS
**************************************************************************
* *
* A_SET_HRUNVEL - SET ENEMY'S ZVEL *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_SET_HRUNVEL
CLR A14
MOVE A14,*A8(OXVEL),L
MOVE *A8(OHRUNVEL),*A8(OZVEL),L
RETS
**************************************************************************
* *
* A_SET_SRUNVEL - SET ENEMY'S OXVEL *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_SET_SRUNVEL
CLR A14
MOVE A14,*A8(OZVEL),L
MOVE *A8(OSRUNVEL),A0,L
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ ASS_OK ;BR = NO FLIP
NEG A0
ASS_OK
MOVE A0,*A8(OXVEL),L
RETS
**************************************************************************
* *
* A_LAUNCH_ENEMY - SEND ENEMY UP INTO THE AIR *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* AARG+,W = GRAVITY (OYACCEL) *
* AARG+,L = INITIAL OYVEL *
* *
**************************************************************************
A_LAUNCH_ENEMY
MOVE *A8(OYACCEL),A14,W
JRZ ALE_NO_DROP ;BR=NOT A DROPPING GUY
.if DEBUG
MOVE *A8(OFLAGS),A14,W
BTST B_GCOLL,A14
LOCKON Z
.endif
MOVE *A8(OGRNDOFF),A0,L
ADDI -26 << 15,A0 ;OFFSET HIM INTO THE GROUND A LITTLE
MOVE A0,*A8(OGRNDOFF),L
RETS
ALE_NO_DROP
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14 ;SET FOR GROUND COLLISION
MOVE A14,*A8(OFLAGS),W
MOVE @YWORLD,A0,L
MOVE *A8(OYVAL),A14,L
SUB A14,A0 ;COMPUTE HIS GROUND OFFSET
MOVE @WORLD_GRNDOFF,A14,L
JRZ ALE_GO
CLR A0 ;USE THIS GROUND OFFSET
ALE_GO
ADDI -26 << 15,A0 ;OFFSET HIM INTO THE GROUND A LITTLE
MOVE A0,*A8(OGRNDOFF),L
CALLA GETAFARG_WORD ;GET OYACCEL
MOVE A0,*A8(OYACCEL),W
CALLA GETAFARG_LONG ;GET OYVEL
MOVE A0,*A8(OYVEL),L
ALE_ABORT
RETS
**************************************************************************
* *
* A_CHECK_GROUND - CHECK IF AN ENEMY HIT THE GROUND *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* AARG+,L = ADDRESS TO JUMP IF NO IMPACT *
* *
**************************************************************************
A_CHECK_GROUND
MOVE *A8(OFLAGS),A14,W ;NO MORE GROUND COLLISION
BTST B_GCOLL,A14
JRZ ACG_DONE
CALLA GETAFARG_LONG ;JUMP HERE!
; JRZ ACG_ABORT
MOVE A0,*A8(AnimFrm),L
RETS
ACG_DONE
MOVE *A8(OFLAGS),A14,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A14
JRNZ ACG_ABORT ;BR = YES
MOVE @YWORLD,A0,L ;NEW GROUND OFFSET
MOVE *A8(OYVAL),A14,L
SUB A14,A0
MOVE A0,*A8(OGRNDOFF),L
ACG_ABORT
RETS
**************************************************************************
* *
* A_TOGGLE_OEFLAGS - TOGGLE BITS IN OEFLAGS *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* AARG+,W = BITS TO TOGGLE *
* *
**************************************************************************
A_TOGGLE_OEFLAGS
CALLA GETAFARG_WORD
MOVE *A8(OEFLAGS),A1,W
XOR A0,A1
MOVE A1,*A8(OEFLAGS),W
RETS
**************************************************************************
* *
* A_SET_OEFLAGS - JUST SET OEFLAGS *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* AARG+,W = BITS TO SET *
* *
**************************************************************************
A_SET_OEFLAGS
CALLA GETAFARG_WORD
MOVE A0,*A8(OEFLAGS),W
RETS
**************************************************************************
* *
* A_DEL_NONBOY - DELETE A NONBOY *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_DEL_NONBOY
MOVE *A8(OPLINK),A0,L
JRZ ADN_NOPROC
CLR A14
MOVE A14,*A8(OPLINK),L
CALLA KILL
ADN_NOPROC
MOVE *A8(OPLAYER),A2,L
JAZ DEL_ENEMY_NOAUD
JAUC DELETE_ENEMY
**************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
NONBOY_SIDE_INIT
.byte 4, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG NONBOY_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_H3RUN__C1, DMAWNZ, 0, 0, OM_GUNV
.LONG NONBOY_GUNVECT
LWWWW G_T3RUN__C1, DMAWNZ, 0, 0, OM_PRVGUNV
LWWWW G_L3RUN__C1, DMAWNZ, 0, 0, OM_PRVGUNV
LWWWW G_Z3RUN__C1, DMAWNZ, 0, 0, OM_PRVGUNV
NONBOY_DROP_INIT
.byte 4, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG LAND_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_H1JUMP_A4, DMAWNZ, M_GCOLL, 0, OM_GUNV
.LONG DUMRETS
LWWWW G_T1JUMP_A4, DMAWNZ, 0, 0, OM_PRVGUNV
LWWWW G_L1JUMP_A4, DMAWNZ, 0, 0, OM_PRVGUNV
LWWWW G_L1JUMP_A4, DMAWNZ, M_NODISP, 0, OM_PRVGUNV
NONBOY_HEADON_INIT
.byte 4, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG NONBOY_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_H1RUN__A1, DMAWNZ, 0, 0, OM_GUNV
.LONG NONBOY_GUNVECT
LWWWW G_T1RUN__A1, DMAWNZ, 0, 0, OM_PRVGUNV
LWWWW G_L1RUN__A1, DMAWNZ, 0, 0, OM_PRVGUNV
LWWWW G_L1RUN__A1, DMAWNZ, M_NODISP, 0, OM_PRVGUNV
NONBOY_SHOOTER_INIT
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG NONBOY_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_B1SHOOTA1, DMAWNZ, 0, 0, OM_GUNV
.LONG NONBOY_GUNVECT
;NONBOY_SHOOTER2_INIT
; .byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
; .long P_NONBOYY ;IMGPAL
; .word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
; .LONG NONBOY_CVECT
;* .long IMG
;* .word OCTRL, OFLAGS, OZOFF
;* .word OPTIONS
; LWWWW G_B1SHTCOP1, DMAWNZ, 0, 0, OM_GUNV
; .LONG NONBOY_GUNVECT
;DIAG_PBOY_INIT
; .byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
; .long P_NONBOYY ;IMGPAL
; .word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
; .LONG NONBOY_CVECT
;* .long IMG
;* .word OCTRL, OFLAGS, OZOFF
;* .word OPTIONS
; LWWWW G_B2RUN__B1, DMAWNZ, 0, 0, OM_GUNV
; .LONG NONBOY_GUNVECT
NONBOY_SIDE_TO_HEAD_ANIM
LW G_H2RUN__B5,1|AMulti
LW G_T2RUN__B5,1|AMulti
LW G_L2RUN__B5,1|AMulti
LWL G_Z2RUN__B5,4|AFunc,OBJ_ON
LW G_H2RUN__B4,1|AMulti
LW G_T2RUN__B4,1|AMulti
LW G_L2RUN__B4,1|AMulti
LW G_A2RUN__B4,4
LWL G_H1RUN__A1,1|AMulti|AFunc,A_SET_HRUNVEL
LW G_T1RUN__A1,1|AMulti
LW G_L1RUN__A1,1|AMulti
LWL 1,1|AFunc,OBJ_OFF
NONBOY_HEADON_RUN_ANIM
LWL G_H1RUN__A1,1|AMulti|AFunc,A_CHECK_DUDE
LW G_T1RUN__A1,1|AMulti
LW G_L1RUN__A1,HEADON_TIME
LWL G_H1RUN__A2,1|AMulti|AFunc,A_CHECK_DUDE_FIRE
LW G_T1RUN__A2,1|AMulti
LW G_L1RUN__A2,HEADON_TIME
LWL G_H1RUN__A3,1|AMulti|AFunc,A_CHECK_DUDE
LW G_T1RUN__A3,1|AMulti
LW G_L1RUN__A3,HEADON_TIME
LWL G_H1RUN__A4,1|AMulti|AFunc,A_CHECK_DUDE_FIRE
LW G_T1RUN__A4,1|AMulti
LW G_L1RUN__A4,HEADON_TIME
LWL G_H1RUN__A5,1|AMulti|AFunc,A_CHECK_DUDE
LW G_T1RUN__A5,1|AMulti
LW G_L1RUN__A5,HEADON_TIME
LWL G_H1RUN__A6,1|AMulti|AFunc,A_CHECK_DUDE_FIRE
LW G_T1RUN__A6,1|AMulti
LW G_L1RUN__A6,HEADON_TIME
LWL G_H1RUN__A7,1|AMulti|AFunc,A_CHECK_DUDE
LW G_T1RUN__A7,1|AMulti
LW G_L1RUN__A7,HEADON_TIME
.long 0
NONBOY_HEAD_TO_SIDE_ANIM
LW G_H2RUN__B4,1|AMulti
LW G_T2RUN__B4,1|AMulti
LW G_L2RUN__B4,1|AMulti
LWL G_A2RUN__B4,4|AFunc,OBJ_ON
LW G_H2RUN__B5,1|AMulti
LW G_T2RUN__B5,1|AMulti
LW G_L2RUN__B5,1|AMulti
LW G_Z2RUN__B5,3
LWL 1,1|AFunc,A_SET_SRUNVEL
NONBOY_SIDE_RUN_ANIM
LWL G_H3RUN__C1,1|AMulti|AFunc,A_CHECK_DUDE
LW G_T3RUN__C1,1|AMulti
LW G_L3RUN__C1,1|AMulti
LW G_Z3RUN__C1,SIDERUN_TIME
LWL G_H3RUN__C2,1|AMulti|AFunc,A_CHECK_DUDE_FIRE
LW G_T3RUN__C2,1|AMulti
LW G_L3RUN__C2,1|AMulti
LW G_Z3RUN__C2,SIDERUN_TIME
LWL G_H3RUN__C3,1|AMulti|AFunc,A_CHECK_DUDE
LW G_T3RUN__C3,1|AMulti
LW G_L3RUN__C3,1|AMulti
LW G_Z3RUN__C3,SIDERUN_TIME
LWL G_H3RUN__C4,1|AMulti|AFunc,A_CHECK_DUDE_FIRE
LW G_T3RUN__C4,1|AMulti
LW G_L3RUN__C4,1|AMulti
LW G_Z3RUN__C4,SIDERUN_TIME
LWL G_H3RUN__C5,1|AMulti|AFunc,A_CHECK_DUDE
LW G_T3RUN__C5,1|AMulti
LW G_L3RUN__C5,1|AMulti
LW G_Z3RUN__C5,SIDERUN_TIME
LWL G_H3RUN__C6,1|AMulti|AFunc,A_CHECK_DUDE_FIRE
LW G_T3RUN__C6,1|AMulti
LW G_L3RUN__C6,1|AMulti
LW G_Z3RUN__C6,SIDERUN_TIME
LWL G_H3RUN__C7,1|AMulti|AFunc,A_CHECK_DUDE
LW G_T3RUN__C7,1|AMulti
LW G_L3RUN__C7,1|AMulti
LW G_Z3RUN__C7,SIDERUN_TIME
LWL G_H3RUN__C8,1|AMulti|AFunc,A_CHECK_DUDE_FIRE
LW G_T3RUN__C8,1|AMulti
LW G_L3RUN__C8,1|AMulti
LW G_Z3RUN__C8,SIDERUN_TIME
.long 0
NONBOY_SIDE_TO_HEADON_SHOOT_ANIM
LW G_H2RUN__B5,1|AMulti
LW G_T2RUN__B5,1|AMulti
LW G_L2RUN__B5,1|AMulti
LWL G_Z2RUN__B5,3|AFunc,OBJ_ON
LW G_H2RUN__B4,1|AMulti
LW G_T2RUN__B4,1|AMulti
LW G_L2RUN__B4,1|AMulti
LW G_A2RUN__B4,3
LW G_H1RxSH_A2,1|AMulti
LW G_T1RxSH_A2,1|AMulti
LW G_L1RxSH_A2,1|AMulti
LW G_A1RxSH_A2,3
LWLW G_H1RxSH_A3,1|AMulti|AFunc,A_TOGGLE_OEFLAGS+1,M_SIDE
LW G_T1RxSH_A3,1|AMulti
LW G_L1RxSH_A3,1|AMulti
LW G_Z1RxSH_A3,2
LWLW 1,1|AFunc,A_OFFSETZ+1,-1
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,20
LW 1,0
LW G_B1SHOOTA1,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_OFF
NONBOY_SIDE_FIRE_ANIM
LW G_B1SHOOTA1,1
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
LW G_B1SHOOTA2,6
LWLL 1,1|AFunc,A_REPEAT_FIRE+2,NONBOY_SIDE_FIRE_ANIM
LWLW 1,1|AFunc,A_OFFSETZ+1,1
LWLW G_H1RxSH_A3,1|AMulti|AFunc,A_TOGGLE_OEFLAGS+1,M_SIDE
LWL G_T1RxSH_A3,1|AMulti|AFunc,OBJ_ON
LWL G_L1RxSH_A3,1|AMulti|AFunc,OBJ_ON
LWL G_Z1RxSH_A3,3|AFunc,OBJ_ON
LW G_H1RxSH_A2,1|AMulti
LW G_T1RxSH_A2,1|AMulti
LW G_L1RxSH_A2,1|AMulti
LW G_A1RxSH_A2,3
LW G_H2RUN__B4,1|AMulti
LW G_T2RUN__B4,1|AMulti
LW G_L2RUN__B4,1|AMulti
LW G_A2RUN__B4,3
LW G_H2RUN__B5,1|AMulti
LW G_T2RUN__B5,1|AMulti
LW G_L2RUN__B5,1|AMulti
LW G_Z2RUN__B5,2
LWL 1,1|AFunc,A_SET_SRUNVEL
.long 0
NONBOY_HEADON_SHOOT_ANIM
LW G_H1RxSH_A2,1|AMulti
LW G_T1RxSH_A2,1|AMulti
LW G_L1RxSH_A2,1|AMulti
LWL G_A1RxSH_A2,3|AFunc,OBJ_ON
LW G_H1RxSH_A3,1|AMulti
LW G_T1RxSH_A3,1|AMulti
LW G_L1RxSH_A3,1|AMulti
LW G_Z1RxSH_A3,2
LWLW 1,1|AFunc,A_OFFSETZ+1,-1
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,20
LW 1,0
LW G_B1SHOOTA1,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_OFF
NONBOY_HEADON_FIRE_ANIM
LW G_B1SHOOTA1,1
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
LW G_B1SHOOTA2,6
LWLL 1,1|AFunc,A_REPEAT_FIRE+2,NONBOY_HEADON_FIRE_ANIM
LWLW 1,1|AFunc,A_OFFSETZ+1,1
LW G_H1RxSH_A3,1|AMulti
LWL G_T1RxSH_A3,1|AMulti|AFunc,OBJ_ON
LWL G_L1RxSH_A3,1|AMulti|AFunc,OBJ_ON
LWL G_Z1RxSH_A3,3|AFunc,OBJ_ON
LW G_H1RxSH_A2,1|AMulti
LW G_T1RxSH_A2,1|AMulti
LW G_L1RxSH_A2,1|AMulti
LW G_A1RxSH_A2,3
LWL G_H1RUN__A1,1|AMulti|AFunc,A_SET_HRUNVEL
LW G_T1RUN__A1,1|AMulti
LW G_L1RUN__A1,1|AMulti
LWL 1,1|AFunc,OBJ_OFF
.long 0
NONBOY_HEADON_DEATH_ANIM
; LW G_B1DEATHE1,4+HEADON_TIME_FUDGE
; LW G_B1DEATHE2,1+HEADON_TIME_FUDGE
; LWLWL 1,1|AFunc,A_LAUNCH_ENEMY+3,04000H,-020000H
LWL G_B1DEATHE2,1|AFunc,A_HEADON_DEATH_SETUP
LWLWL 1,HEADON_TIME_FUDGE+AFunc,A_LAUNCH_ENEMY+3,03000H,-028000H
LW G_B1DEATHE4,2+HEADON_TIME_FUDGE
LW G_B1DEATHE5,2+HEADON_TIME_FUDGE
NONBOY_HEADON_UP
LWLL 1,1|AFunc,A_CHECK_DOWN+2,NONBOY_HEADON_UP
LWL G_B1DEATHE6,1+HEADON_TIME_FUDGE+AFunc,DELETE_SHADOW
NONBOY_HEADON_HANGTIME
LWLL 1,2|AFunc,A_CHECK_GROUND+2,NONBOY_HEADON_HANGTIME
LW G_B1DEATHE8,4+HEADON_TIME_FUDGE
;NONBOY_HEADON_HANGTIME
; LWLL 1,2|AFunc,A_CHECK_GROUND+2,NONBOY_HEADON_HANGTIME
LW 1,60
LWL 1,1|AFunc,A_DEL_NONBOY
NONBOY_SIDE_RUN_DEATH_ANIM
LWLWL G_A3DEATHE4,1|AMulti|AFunc,A_LAUNCH_ENEMY+3,03000H,-028000H
LWL G_T3DEATHE4,1|AMulti|AFunc,OBJ_ON
LWL G_L3DEATHE4,1|AMulti|AFunc,OBJ_ON
LWL G_Z3DEATHE4,1+SIDE_TIME_FUDGE|AFunc,OBJ_ON
LW G_T3DEATHE5,1|AMulti
LW G_A3DEATHE5,1|AMulti
LW G_L3DEATHE5,1|AMulti
LWL 1,2+SIDE_TIME_FUDGE+AFunc,OBJ_OFF
LW G_T3DEATHE6,1|AMulti
LW G_A3DEATHE6,1|AMulti
LW G_L3DEATHE6,1|AMulti
LWL 1,2+SIDE_TIME_FUDGE+AFunc,OBJ_OFF
NONBOY_SIDE_UP
LWLL 1,1|AFunc,A_CHECK_DOWN+2,NONBOY_SIDE_UP
LWL 1,1|AFunc,DELETE_SHADOW
NONBOY_SIDE_HANGTIME
LWLL 1,1|AFunc,A_CHECK_GROUND+2,NONBOY_SIDE_HANGTIME
LW G_H3DEATHE10,1|AMulti
LW G_T3DEATHE10,1|AMulti
LW G_A3DEATHE10,1|AMulti
LWL G_L3DEATHE10,4+SIDE_TIME_FUDGE+AFunc,OBJ_ON
LW 1,60
LWL 1,1|AFunc,A_DEL_NONBOY
NONBOY_HELIDROP_ANIM
LWLL 1,2|AFunc,A_CHECK_GROUND+2,NONBOY_HELIDROP_ANIM
LW G_H1JUMP_A3,1|AMulti
LW G_T1JUMP_A3,1|AMulti
LW G_L1JUMP_A3,3
LW G_H1JUMP_A2,1|AMulti
LW G_T1JUMP_A2,1|AMulti
LW G_L1JUMP_A2,3
LW G_H1JUMP_A1,1|AMulti
LW G_T1JUMP_A1,1|AMulti
LW G_L1JUMP_A1,2
LW G_H1JUMP_A2,1|AMulti
LW G_T1JUMP_A2,1|AMulti
LW G_L1JUMP_A2,3
LW G_H1JUMP_A3,1|AMulti
LW G_T1JUMP_A3,1|AMulti
LW G_L1JUMP_A3,3
LWLW G_H2RUN__B4,1|AMulti|AFunc,A_TOGGLE_OEFLAGS+1,M_SIDE
LW G_T2RUN__B4,1|AMulti
LW G_L2RUN__B4,1|AMulti
LWL G_A2RUN__B4,2|AFunc,OBJ_ON
LW G_H2RUN__B5,1|AMulti
LW G_T2RUN__B5,1|AMulti
LW G_L2RUN__B5,1|AMulti
LW G_Z2RUN__B5,1
LWL 1,1|AFunc,A_SET_SRUNVEL
LWLL 1,1|AFunc,A_AnimGo+2,NONBOY_SIDE_RUN_ANIM
NONBOY_DROP_SHOOT_ANIM
LWLL 1,2|AFunc,A_CHECK_GROUND+2,NONBOY_DROP_SHOOT_ANIM
LW G_H1JUMP_A3,1|AMulti
LW G_T1JUMP_A3,1|AMulti
LW G_L1JUMP_A3,3
LW G_H1JUMP_A2,1|AMulti
LW G_T1JUMP_A2,1|AMulti
LW G_L1JUMP_A2,3
LW G_H1JUMP_A1,1|AMulti
LW G_T1JUMP_A1,1|AMulti
LW G_L1JUMP_A1,2
LW G_H1JUMP_A2,1|AMulti
LW G_T1JUMP_A2,1|AMulti
LW G_L1JUMP_A2,3
LW G_H1JUMP_A3,1|AMulti
LW G_T1JUMP_A3,1|AMulti
LW G_L1JUMP_A3,3
LW G_B1SHOOTA1,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,1|AFunc,OBJ_OFF
NONBOY_SHOOT_LUPE
LWL G_B1SHOOTA1,1|AFunc,A_CHECK_NONBOY_BLACKOUT
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
LWL G_B1SHOOTA2,6|AFunc,OBJ_ON_WNZ
.long 0
NONBOY_SHOOTER_ANIM
LWL G_B1SHOOTA1,1|AFunc,A_CHECK_DUDE
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
LW G_B1SHOOTA2,6
.long 0
;NONBOY_SHOOTER2_ANIM
; LW G_B1SHTCOP1,1
; LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
; LW G_B1SHTCOP2,6
; .long 0
NONBOY_STALL_ANIM
LWL 1,2|AFunc,A_CHECK_STALLBOY
.long 0
NONBOY_STALL_SHOOT_ANIM
LWL G_B1SHOOTA1,1|AFunc,A_CHECK_STALLBOY
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
LW G_B1SHOOTA2,6
.long 0
**************************************************************************
* *
* RANDOM_NONPAL - SELECT RANDOM NONBOY PALETTE *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
RANDOM_NONPAL
RETS
PUSH A0
; MOVK 4,A0
MOVK 3,A0
CALLA RAND0
SLL 5,A0
ADDI NONBOY_PALS,A0
MOVE *A0,A0,L
CALLA CHANGE_PAL
PULLQ A0
RETS
NONBOY_PALS
; .LONG gasgreen,gasblue,gasred,GASBOYlsb
.LONG P_NONBOYY,P_NONBOYO,P_NONBOYR
**************************************************************************
* *
* A_CHECK_OETIME - CHECK IF IT'S TIME TO BACK OFF *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,L = JUMP TO THIS LABEL IF THERE IS STILL TIME *
* *
**************************************************************************
A_CHECK_OETIME
MOVE *A8(OETIME),A14,W
SUBK 12,A14 ;SHOOT TIME
JRP ACOET_JUMP ;BR=KEEP ON FIRING
RETS
ACOET_JUMP
MOVE A14,*A8(OETIME),W ;SAVE TIME LEFT
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L ;JUMP
RETS
**************************************************************************
* *
* AU_RANDOM_NAP - STAY AT SAME FRAME UPON RANDOM CHANCE *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = CHANCE TO SLEEP AGAIN *
* AARG+,L = IF SLEEPING JUMP HERE *
* *
**************************************************************************
AU_RANDOM_NAP
CALLA GETAFARG_WORD
CALLA RANDPER
JRNC AU_RN_WAKEUP ;BR=IT DIDN'T HAPPEN MOVE ON
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L ;STAY AT SAME FRAME
RETS
AU_RN_WAKEUP
CLR A14 ;MOVE ON AND CLEAR CURRENT SLEEP
MOVB A14,*A8(AnimSlp)
MOVE *A8(AnimFrm),A14,L
JRNZ AU_RN_DONE ;BR=NOT END OF SCRIPT
MOVE *A8(AnimScr),*A8(AnimFrm),L
AU_RN_DONE
RETS
**************************************************************************
* *
* CHECK_HOST_ANIM - CHECK IF ENEMY GENERATOR IS STILL ON SCREEN, *
* IF NOT PULL GENERATORS ANIMATION *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
CHECK_HOST_ANIM
move *a8(OFLAGS),a14 ; delete anim if enemy generator
btst B_OFSCRN,a14 ; is offscreen.
jrnz CHA_DEL_ANIM
CLRC
RETS
CHA_DEL_ANIM
MOVE *A8(OID),A14,W
ANDI MASK_TYPE,A14
CMPI TYPE_UNIV & MASK_TYPE,A14
JRNE CHA_NOT_UNIV ;BR=NOT A UNIVERSE OBJECT
MOVE *A8(OULINK),A1,L
MOVE *A1(MAP_IMG),A14,L ;TURN ON DANIM FLAG
ORI M_IF_DANIM,A14
MOVE A14,*A1(MAP_IMG),L
MOVE @ENEMYDATA,A14,L
MOVE A8,*A14+,L ;STUFF ADDRESS
MOVE A14,@ENEMYDATA,L ;SAVE FOR NEXT GUY
CALLA PULL_ANIM
CHA_NOT_UNIV
SETC
RETS
**************************************************************************
* *
* AU_CREATE_DOORBOY - CREATE THE ENEMY IN THE DOORWAY *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,L = GENERATOR ANIMATION JUMP HERE UPON FAILURE *
* *
**************************************************************************
AU_CREATE_DOORBOY
MOVE @OBJENEMIES,A14,W
BTST B_DOOR,A14
JRZ AU_CD_ABORT ;BR=NOT ALLOWED
CALLR CHECK_HOST_ANIM
JRC AU_CD_DONE ;BR=HOST ANIM OFF SCREEN
MOVE @ENEMY_QUOTA,A14,W
JRNZ AU_CD_ABORT ;BR=QUOTA REACHED
; MOVI OID_NONBOY,A0
; CALLA GET_ENEMY_COUNT
; CMPI 10,A0
; JRHS AU_CD_ABORT ;BR=REACHED MAX NUMBER OF ENEMIES
AU_CD_DOORBOY
MOVE A8,A9
MOVI DOORBOY_INIT,B0 ;ALLOCATE DOOR GUY OBJECT
CALLA CREATE_ENEMY
JRZ AU_CD_ERROR ;BR = ERROR! ERROR!
CALLR RANDOM_NONPAL ;GET RANDOM PALETTE
MOVI DOORBOY_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVE *A9(OXVAL),A1,L
MOVE *A9(OYVAL),A2,L
MOVE *A9(OZVAL),A3,L
ADDK 5,A3 ;OFFSET Z IN BACK OF DOOR
CALLA SET_ANIPU
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVK M_DOOR,A14
MOVE A14,*A8(OEFLAGS),W ;ENEMY TYPE
MOVE *A9(OCTRL),A0,W ;COPY DOOR FLIP
ANDI M_FLIPH,A0
CALLA SET_FLPS
MOVK 20,A0 ;RANDOM DELAY BEFORE SHOOTING UP
MOVK 5,A1
CALLA RANGRAND
MOVE A0,A1
ADDK 6,A0
MOVB A0,*A8(AnimSLP)
MOVI 127,A14
MOVB A14,*A9(AnimSLP)
MOVI 127+10,A14
SUB A1,A14
MOVE A14,*A8(OETIME),W
; MOVI 127-20,A0 ;RANDOM LIFE TIME
; MOVI 60,A1
; CALLA RANGRAND
; ADD A3,A0 ;EXTRA DELAY BEFORE SHOOTING UP
; MOVB A0,*A9(AnimSLP)
; ADDK 14,A0 ;ADD DOOR OPEN AND CLOSE TIME
;
; MOVE A0,A2
; MOVI 59+5-12,A0 ;RANDOM INITIAL SLEEP TIME
; MOVK 30,A1
; CALLA RANGRAND
; MOVB A0,*A8(AnimSlp)
; SUB A0,A2
; MOVE A2,*A8(OETIME),W
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
RETS
AU_CD_ERROR
MOVE A9,A8
AU_CD_ABORT
CALLA GETAFARG_LONG ;COULDN'T MAKE BADGUY
MOVE A0,*A8(AnimFrm),L ;OOPS!
AU_CD_DONE
RETS
**************************************************************************
* *
* AU_CREATE_LADDERBOY - CREATE THE ENEMY TO RUN OUT OF THE DOORWAY *
* AND HEAD TOWARD THE LADDER *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = PERCENT CHANCE OF EXITING ENEMY *
* AARG+,L = GENERATOR ANIMATION JUMP HERE UPON FAILURE *
* *
**************************************************************************
AU_CREATE_LADDERBOY
CALLA GETAFARG_WORD
MOVE @OBJENEMIES,A14,W
BTST B_DOOR,A14
JRZ AU_CL_ABORT ;BR=NOT ALLOWED
CALLR CHECK_HOST_ANIM
JRC AU_CL_DONE ;BR=HOST ANIM OFF SCREEN
MOVE @ENEMY_QUOTA,A14,W
JRNZ AU_CL_ABORT ;BR=QUOTA REACHED
;DON'T TRASH A0
; MOVI OID_NONBOY,A0
; CALLA GET_ENEMY_COUNT
; CMPI 10,A0
; JRHS AU_CL_ABORT ;BR=REACHED MAX NUMBER OF ENEMIES
CALLA RANDPER
JRNC AU_CD_DOORBOY ;BR=MAKE DOORBOY
MOVE A8,A9
MOVI LADDERBOY_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JRZ AU_CL_ERROR ;BR = ERROR! ERROR!
CALLR RANDOM_NONPAL ;GET RANDOM PALETTE
MOVE *A9(OXVAL),A1,L
MOVE *A9(OYVAL),A2,L
MOVE A2,*A8(OYSTART),L
MOVE *A9(OZVAL),A3,L
ADDK 5,A3 ;OFFSET Z IN BACK OF DOOR
CALLA SET_ANIPU
MOVI NB_SRUNVEL_MAX,A0 ;GET RANDOM SIDE RUNNING SPEED
MOVI NB_SRUNVEL_MIN,A1
CALLA RANGRAND
MOVE A0,*A8(OSRUNVEL),L
MOVI LADDERBOY_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVI LADDERBOY_SIDERUN_ANIM,A14 ;LOOP ON SIDERUN
MOVE A14,*A8(AnimScr),L
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVK M_DOOR,A14
MOVE A14,*A8(OEFLAGS),W ;ENEMY TYPE
MOVE *A9(OCTRL),A0,W ;INVERT DOOR FLIP
NOT A0
ANDI M_FLIPH,A0
CALLA SET_FLPS
; MOVI 127,A0 ;RANDOM LIFE TIME
; MOVI 60,A1
; CALLA RANGRAND
MOVK HEADON_TIME*3+8+1,A0
MOVB A0,*A9(AnimSLP)
; ADDK 14,A0 ;ADD DOOR OPEN AND CLOSE TIME
; MOVE A0,A2
;; MOVI 59+10-12,A0 ;RANDOM INITIAL SLEEP TIME
;; MOVK 30,A1
;; CALLA RANGRAND
;; MOVB A0,*A8(AnimSlp)
;; SUB A0,A2
; MOVE A2,*A8(OETIME),W
MOVI (TYPE_UNIV & MASK_TYPE) | ID_7, A1 ;OID OF LADDER
CALLR SET_ODESTX ;FIND LADDER
MOVI LADDERBOY_TURN_ANIM,A14
MOVE A14,*A8(OANIM0),L ;ANIM BRANCH #0
MOVI LADDERBOY_UP_LADDER_ANIM,A14
MOVE A14,*A8(OANIM1),L ;ANIM BRANCH #1
MOVK 4,A14
MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
CLR A14
MOVB A14,*A8(OSHOOTCNT) ;SHOOT ASAP
MOVI ROOF_LEFT_BOUNDARY+(20 << 15),A14
MOVE A14,*A8(OROOFXLEFT),L ;SET LEFT ROOF BOUNDARY
MOVI ROOF_RIGHT_BOUNDARY-(20 << 15),A14
MOVE A14,*A8(OROOFXRGHT),L ;SET RIGHT ROOF BOUNDARY
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
RETS
AU_CL_ERROR
MOVE A9,A8
AU_CL_ABORT
CALLA GETAFARG_LONG ;COULDN'T MAKE BADGUY
MOVE A0,*A8(AnimFrm),L ;OOPS!
AU_CL_DONE
RETS
**************************************************************************
* *
* AU_CREATE_POPTOP - CREATE POPUP ENEMY *
* AU_CREATE_WINBOY - CREATE POPUP ENEMY IN WINDOW *
* AU_CREATE_DUMPBOY - CREATE POPUP ENEMY IN DUMPSTER *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,L = X PIXEL OFFSET << 4 OR TABLE ADDRESS (LOWEST BIT FLAGS TABLE)*
* NOTE: YOU MUST PASS A REVERSE TABLE FOR A FLIPPED GENERATOR * *
* AARG+,L = [PIXEL Y, Z] OFFSET FROM GENERATOR *
* AARG+,L = GENERATOR ANIMATION JUMP HERE UPON FAILURE *
* *
**************************************************************************
AU_CREATE_BOXOFF
MOVE @OBJENEMIES,A14,W
BTST B_POPTOP,A14
JRZ AU_CW_ABORT ;BR=NOT ALLOWED
MOVK M_POPTOP,A11 ;SET TYPE
MOVI BREAK_WINDOW,A10
JRUC AU_CW_CONT
AU_CREATE_POPTOP
MOVE @OBJENEMIES,A14,W
BTST B_POPTOP,A14
JRZ AU_CW_ABORT ;BR=NOT ALLOWED
MOVK M_POPTOP,A11 ;SET TYPE
CLR A10
JRUC AU_CW_CONT
AU_CREATE_DUMPBOY
MOVE @OBJENEMIES,A14,W
BTST B_DUMPSTER,A14
JRZ AU_CW_ABORT ;BR=NOT ALLOWED
MOVI M_DUMPSTER,A11 ;SET TYPE
CLR A10
JRUC AU_CW_CONT
AU_CREATE_WINBOY
MOVE @OBJENEMIES,A14,W
BTST B_WINDOW,A14
JRZ AU_CW_ABORT ;BR=NOT ALLOWED
MOVK M_WINDOW,A11 ;SET TYPE
CLR A10
AU_CW_CONT
MOVE @HOLD_ENEMY_DISPATCH,A14,W
JRNZ AU_CW_ABORT ;BR=HOLD ON THERE
CALLR CHECK_HOST_ANIM
JRC AU_CW_DONE ;BR=HOST ANIM OFF SCREEN
MOVE @ENEMY_QUOTA,A14,W
JRNZ AU_CW_ABORT ;BR=QUOTA REACHED
; MOVI OID_NONBOY,A0
; CALLA GET_ENEMY_COUNT
; CMPI 10,A0
; JRHS AU_CW_ABORT ;BR=REACHED MAX NUMBER OF ENEMIES
MOVE A8,A9
MOVI WINBOY_INIT,B0 ;ALLOCATE OBJECT
CALLA CREATE_ENEMY
JRZ AU_CW_ERROR ;BR = ERROR! ERROR!
MOVE A10,*A8(ODEATHCALL),L
CALLR RANDOM_NONPAL ;GET RANDOM PALETTE
MOVE A11,*A8(OEFLAGS),W ;SAVE TYPE
MOVE @RAND,A0,W ;LEFTY OR RIGHTY?
ANDI M_FLIPH,A0
MOVE A0,A10
CALLA SET_FLPS
MOVE A8,A1
MOVE A9,A8
CALLA GETAFARG_LONG ;GET X OFFSET OR TABLE ADDRESS
MOVE A0,A2
BTST 0,A2
JRNZ AU_CW_TBL ;BR=TABLE
SLL 11,A2 ;CONVERT TO WORLD OFFSET
AU_CW_CHECK_FLIPH
MOVE *A9(OCTRL),A14,W ;Let's get flip of the host object
BTST B_FLIPH,A14 ;Is it flipped?
JRZ AU_CW_CENTER ;BR = No horiz flip to worry about
NEG A2
AU_CW_CENTER
;WE MAY WANT TO USE THE HIGH WORD IN THE FIRST LONG
;TO CONTAIN BOTH X OBJECT OFFSET AND X CENTER OFFSET!
ADDI 10 << 15,A2
BTST B_FLIPH,A10
JRZ AU_CW_NOROM
SUBI (10+10) << 15,A2
JRUC AU_CW_NOROM
AU_CW_TBL
SRL 1,A2 ;CLEAR FLAG BIT
SLL 1,A2
MOVE A2,A0
MOVE *A8(ODAGX),A3,W
MOVE *A8(OANIOFFX),A14,W
ADD A14,A3 ;SCREEN X ANIMP
SUBK 20,A3 ;LEFT SIDE FUDGE
MOVE *A8(OSCALEX),A4,W
AU_CW_START_LUPE
MOVE *A0+,A5,W
JRZ AU_CW_GET_OFFSET ;BR=END OF TABLE
SLL 8,A5
DIVS A4,A5 ;SCALE OFFSET
ADD A3,A5 ;ADD TO GENERATOR X ANIMP
JRN AU_CW_START_LUPE ;BR=THIS IS OFF SCREEN
SUBK 010H,A0 ;FIRST ON SCREEN TABLE ADJUST
MOVE A0,A2
SUBI 400-20-20,A3 ;RIGHT SIDE FUDGE
AU_CW_END_LUPE
MOVE *A0+,A5,W
JRZ AU_CW_END_DONE ;END OF TABLE
SLL 8,A5
DIVS A4,A5 ;SCALE OFFSET
ADD A3,A5 ;ADD TO GENERATOR X ANIMP
JRN AU_CW_END_LUPE ;BR=THIS IS OFF SCREEN
AU_CW_END_DONE
SUBK 010H,A0 ;LAST ON SCREEN TABLE ADJUST
CMP A0,A2
JREQ AU_CW_GET_OFFSET ;BR=THE FIRST IS THE LAST
SUB A2,A0 ;PICK OFFSET BETWEEN
SRL 4,A0
CALLA RAND0
SLL 4,A0
ADD A0,A2
AU_CW_GET_OFFSET
MOVE *A2,A2,W ;GET OFFSET
SLL 15,A2 ;CONVERT TO WORLD OFFSET
; JRUC AU_CW_CHECK_FLIPH ;CHECK FOR FLIPH
AU_CW_NOROM
CALLA GETAFARG_LONG ;GET [PIXEL Y, Z] OFFSET
MOVE A1,A8
MOVE *A9(OXVAL),A1,L
ADD A2,A1 ;OFFSET X
MOVE *A9(OYVAL),A2,L
MOVE A0,A14 ;GET PIXEL Y OFFSET
SRA 16,A14
SLL 15,A14 ;CONVERT TO WORLD OFFSET
ADD A14,A2 ;ADD TO Y OF GENERATOR
MOVE A2,*A8(OYSTART),L
MOVE *A9(OZVAL),A3,L
SEXT A0,W
ADD A0,A3 ;OFFSET Z FROM GENERATOR
CALLA SET_ANIPU
MOVI WINBOY_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVI -20 << 15,A14
MOVE A14,*A8(OGRNDOFF),L ;GROUND OFFSET UPON FALL
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVI -02B333H,A14
MOVE A14,*A8(OYVEL),L ;SEND HIM UP
MOVK 20,A0 ;RANDOM DELAY BEFORE SHOOTING UP
MOVK 5,A1
CALLA RANGRAND
MOVB A0,*A8(AnimSLP)
MOVE A0,A3
MOVI 127-20,A0 ;RANDOM LIFE TIME
MOVK 30,A1
CALLA RANGRAND
ADD A3,A0 ;EXTRA DELAY BEFORE SHOOTING UP
MOVB A0,*A9(AnimSLP)
SUBK 21,A0 ;POPUP AND POPDOWN TIME
MOVE A0,*A8(OETIME),W
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
RETS
AU_CW_ERROR
MOVE A9,A8
AU_CW_ABORT
CALLA GETAFARG_LONG ;THROW OUT FIRST LONG
CALLA GETAFARG_LONG ;THROW OUT SECOND LONG
CALLA GETAFARG_LONG ;COULDN'T MAKE BADGUY
MOVE A0,*A8(AnimFrm),L ;OOPS!
AU_CW_DONE
RETS
**************************************************************************
* *
* AU_CREATE_BWBOY - CREATE BEHIND THE WALL ENEMY WITH RESPECT TO FLIP *
* OF GENERATOR *
* AU_CREATE_BWBOY2 - CREATE BEHIND AN OPEN OBJECT ENEMY *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,L = [Y,X] PIXEL OFFSET FROM GENERATOR *
* AARG+,L = DEATH ROUTINE *
* AARG+,L = GENERATOR ANIMATION JUMP HERE UPON FAILURE *
* *
**************************************************************************
AU_CREATE_BWBOY2
MOVK 1,A11 ;FLAG BWBOY2
JRUC AU_CB_GO
AU_CREATE_BWBOY
CLR A11
AU_CB_GO
CALLA GETAFARG_LONG ;GET [Y,X] PIXEL OFFSET
MOVE A0,A10
CALLA GETAFARG_LONG ;GET DEATH ROUTINE
MOVE @HOLD_ENEMY_DISPATCH,A14,W
JRNZ AU_CB_ABORT ;BR=HOLD ON THERE
MOVE @OBJENEMIES,A14,W
BTST B_BW,A14
JRZ AU_CB_ABORT ;BR=NOT ALLOWED
CALLR CHECK_HOST_ANIM
JRC AU_CB_DONE ;BR=HOST ANIM OFF SCREEN
MOVE @ENEMY_QUOTA,A14,W
JRNZ AU_CB_ABORT ;BR=QUOTA REACHED
; MOVI OID_NONBOY,A0
; CALLA GET_ENEMY_COUNT
; CMPI 10,A0
; JRHS AU_CB_ABORT ;BR=REACHED MAX NUMBER OF ENEMIES
MOVE A8,A9
; MOVE A0,A10
MOVI BWBOY_INIT,B0 ;ALLOCATE OBJECT
PUSH A0
CALLA CREATE_ENEMY
PULL A0
MOVE A8,A8
JRZ AU_CB_ERROR ;BR = ERROR! ERROR!
MOVE A0,*A8(OEDEATH),L
CALLR RANDOM_NONPAL ;GET RANDOM PALETTE
MOVI BWBOY_ANIM,A1
CALLA STRT_ANIM ;START ANIMATION
MOVK 1,A14
MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
MOVI M_BW|M_SIDE,A14
MOVE A14,*A8(OEFLAGS),W ;SET TYPE
MOVE A11,A11
JRZ AU_CB_GETFLIP ;BR=GET FLIP FROM GENERATOR
CLR A0 ;DEFAULT TO NO FLIP
MOVE *A9(ODAGX),A14,W
CMPI 200,A14
JRGT AU_CB_FLIPSET ;BR=ON THE RIGHT HALF OF THE SCREEN
MOVK M_FLIPH,A0 ;FLIP OUT ON THE LEFT HALF
JRUC AU_CB_FLIPSET
AU_CB_GETFLIP
MOVE *A9(OCTRL),A0,W ;COPY DOOR FLIP
AU_CB_FLIPSET
MOVX A10,A1 ;Grab the passed X offset
SEXT A1
SLL 15,A1 ;Convert
; MOVI 65*08000H,A1
ADDI -65*08000H,A1
BTST B_FLIPH,A0
; JRNZ AU_CB_SETX ;BR=NOT FLIPPED
JRZ AU_CB_SETX ;BR=NOT FLIPPED
NEG A1
AU_CB_SETX
MOVE *A9(OXVAL),A14,L
ADD A14,A1 ;OFFSET X
MOVE *A9(OYVAL),A2,L
SRA 16,A10 ;Clear out the X part
SLL 15,A10
ADD A10,A2 ;OFFSET Y
MOVE *A9(OZVAL),A3,L
INC A3 ;OFFSET Z
CALLA SET_ANIPU
NOT A0 ;INVERT DOOR FLIP
ANDI M_FLIPH,A0
CALLA SET_FLPS
MOVI 127,A0 ;RANDOM LIFE TIME
MOVK 30,A1
CALLA RANGRAND
MOVB A0,*A9(AnimSLP)
SUBK 24,A0 ;MOVE OUT AND PULL BACK TIME
MOVE A0,*A8(OETIME),W
MOVI -20 << 15,A14
MOVE A14,*A8(OGRNDOFF),L ;SET GROUND OFFSET FOR FALL
MOVE A11,A11
JAZ INSERT_ENEMY ;BR=NO SHADOW JUST INSERT AND COUNT
CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
CALLA GET_SHAD_MULTI
RETS
AU_CB_ERROR
MOVE A9,A8
AU_CB_ABORT
CALLA GETAFARG_LONG ;COULDN'T MAKE BADGUY
MOVE A0,*A8(AnimFrm),L ;OOPS!
AU_CB_DONE
RETS
**************************************************************************
* *
* LAVA_GUY_DEATH *
* *
* A1 = OEFLAGS *
* A8 = OBJECT *
* *
**************************************************************************
LAVA_GUY_DEATH
CLR A14
MOVE A14,*A8(OGRNDOFF),L
; MOVE A1,A3
MOVI NONBOY_HEADON_DEATH_ANIM,A1 ;DEFAULT TO FALLING BACKWARDS
BTST B_SIDE,A3
JAZ STRT_ANIM ;BR=NOT SIDEWAYS
; MOVI NONBOY_SIDE_RUN_DEATH_ANIM,A1 ;SIDE TO FRONT TRANSITION DEATH
; MOVE *A8(OIMG),A14,L
; CMPI G_B5SPxSHA6,A14 ;CHECK FOR LAST SIDE FRAME
; JAEQ STRT_ANIM ;BR=DON'T OFFSET X
MOVE *A8(OIMG),A14,L
MOVI 20 << 15,A3
CMPI G_B5SPxSHA6,A14
JREQ LGD_CHKFLIP ;BR=CHECK FOR FLIP
MOVI 30 << 15,A3
CMPI G_B5SPxSHA5,A14
JREQ LGD_CHKFLIP ;BR=CHECK FOR FLIP
MOVI 40 << 15,A3
LGD_CHKFLIP
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ LGD_NOFLIPH ;BR=NO H FLIP
NEG A3
LGD_NOFLIPH
MOVE *A8(OXVAL),A14,L
SUB A3,A14
MOVE A14,*A8(OXVAL),L
JAUC STRT_ANIM
**************************************************************************
* *
* DEL_OID_PART - DELETE ALL PARTS OF GIVEN OID *
* NOTE: IGNORES SINGLE OBJECTS *
* *
* PASS: *
* A1 = OID *
* A8 = OBJECT *
* *
**************************************************************************
DEL_OID_PART
PUSH A8
MOVE *A8(OPARTS),A14,L
JRZ DOP_DONE ;BR=IGNORE SINGLE OBJECTS
JRUC DOP_START
DOP_LUPE
MOVE *A8(OPARTS),A8,L
JRZ DOP_DONE ;BR=NO MORE OBJECTS
DOP_START
MOVE *A8(OID),A14,W
CMP A1,A14
JRNE DOP_LUPE ;BR=NO MATCH ON OID
CALLA DELETE_OBJ ;KILL IT!
JRUC DOP_LUPE
DOP_DONE
PULLQ A8
RETS
**************************************************************************
* *
* OUTCLUB_CVECT - COLLISION TABLE *
* *
**************************************************************************
OUTCLUB_CVECT
WWL OID_PROCKET,~MASK_PLAYER,NONBOY_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,OUTCLUB_EXPLOSION_COLL
WWL OID_BLOWUP,0FFFFH,OUTCLUB_SBOMB_CARNAGE
WWL OID_GRND,0FFFFH,OUTCLUB_GRND_COLLVECT
WL 0,DUMCRETS
OUTCLUB_CVECT_PART
WWL OID_PROCKET,~MASK_PLAYER,NONBOY_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,OUTCLUB_EXPLOSION_COLL
WWL OID_BLOWUP,0FFFFH,OUTCLUB_SBOMB_CARNAGE
WWL OID_GRND,0FFFFH,OUTCLUB_GRND_COLLVECT
WL 0,DUMCRETS
**************************************************************************
* *
* OUTCLUB_EXPLOSION_COLL - Collision vector for Player explosion. *
* A0 = Ptr to explosion object *
* A8 = Ptr to NON-BOY object *
* *
**************************************************************************
OUTCLUB_EXPLOSION_COLL
CALLA GET_HEAD_PART
MOVE A0,*A8(ONATEEXPLO),L ;SAVE EXPLOSION OBJECT
MOVE *A8(OEFLAGS),A14,W
BTST B_ATEROCKET,A14 ;Did he get hit by a rocket?
JRZ OUTCLUB_COLLVECT ;BR = No, just do generic for now.
CALLA ALL_COLLS_OFF ;Turn all collisions off now!
MOVE A0,A5
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA ;GET PDATA IN A2
SWAP A5,A8
CALLA GET_HEAD_PART
CALLA OBJ_OFF_MULTI
SWAP A5,A8
MOVI NONBOY_EXPLODE_ANIM,A1 ;Die like a brave
JRUC OEC_ANIM
;the rest of this is the same as NONBOY_SBOMB_CARNAGE
OUTCLUB_SBOMB_CARNAGE
MOVI ANIM_NON_SBOMB_EXPLODE,A1
OEC_ANIM
CALLA STRT_ANIM
MOVE A2,*A8(OPLAYER),L ;Hang on to this address
MOVI 1000,A1
CALLA SCORE ;Explosions are always good for points
JAUC COUNT_PLAYER_KILL
**************************************************************************
* *
* OUTCLUB_GUNVECT - GUN VECTOR *
* *
* PASS: *
* A2 = PTR TO PLAYER *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
OUTCLUB_SBOMB_COLLVECT
; CLR A2
CALLA GET_HEAD_PART
JRUC OUTCLUB_SBOMB ;LET SBOMB CODE AWARD POINTS
OUTCLUB_GRND_COLLVECT
CLR A14 ;STOP IT!
MOVE A14,*A8(OXVEL),L
MOVE A14,*A8(OYVEL),L
MOVE A14,*A8(OZVEL),L
MOVE A14,*A8(OYACCEL),W
MOVE *A8(OFLAGS),A14,W
ANDNI M_GCOLL,A14 ;CLEAR GROUND COLL FLAG
MOVE A14,*A8(OFLAGS),W
JAUC SET_ONGRND
OUTCLUB_COLLVECT_PART
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CMPI OID_GRND,A0
JREQ OUTCLUB_GRND_COLLVECT ;BR=GROUND COLLISION
CALLA POID_TO_PDATA ;GET PDATA IN A2
; JRUC OUTCLUB_GUNVECT_PART ;IT'S A PART!
JRUC OG_NO_BLOOD ;IT'S A PART!
OUTCLUB_COLLVECT
MOVE *A0(OID),A0,W ;GET PLAYER DATA ADDRESS
CALLA POID_TO_PDATA ;GET PDATA IN A2
CALLA GET_HEAD_PART
JRUC OG_NO_BLOOD
OUTCLUB_GUNVECT
CALLA GET_HEAD_PART
OUTCLUB_GUNVECT_PART
SOUND1 SND_BODY_THUD
CALLA BLOODY_BULLET_HIT_OFFSET
OG_NO_BLOOD
OUTCLUB_SBOMB
MOVE A2,*A8(OPLAYER),L
;OUTCLUB_SBOMB
MOVE *A8(OFLAGS),A9,W ;IS THIS OBJECT DEAD?
BTST B_DEAD,A9
JRNZ OG_DEAD ;BR = YES
MOVB *A8(OHITS),A14
DEC A14
JRP OG_STILL_ALIVE ;BR = NONBOY STILL ALIVE
MOVI OID_JUNK,A1
CALLA DEL_OID_PART ;GET RID OF GUN FLASH
ORI M_DEAD,A9 ;HE'S DEAD NOW
MOVE A9,*A8(OFLAGS),W
; MOVI DUMRETS,A14
; MOVE A14,*A8(OGUNVECT),L
MOVE A2,A2
JRZ OG_NOSCORE ;BR = NO SCORE
; MOVK 10,A0 ;AWARD RANDOM SCORE
; CALLA RANDU
; MOVE A0,A1
; MOVI 1000,A0
; MPYU A0,A1
;; CALLA SCORE
; INC A1 ;FLAG UP MOTION
MOVI 1000,A1
CALLA SCORE
CALLA COUNT_PLAYER_KILL
; MOVI 1001,A1
; CLR A9 ;NO OFFSET
; CALLA PRINT_SCORE
*A8 = PTR TO OBJECT BEING KILLED
OG_NOSCORE
; SOUND1 SND_BODY_THUD
MOVK NUM_GRUNT_SNDS,A0 ;RANDOM GRUNT SOUND
CALLA RAND0
SLL 5,A0
ADDI GRUNT_HIT_TBL,A0
MOVE *A0,A0,L
CALLA ONESND ;Do the SOUND
MOVE *A8(OEFLAGS),A14,W ;GET ENEMY TYPE
MOVE A14,A1 ;SAVE FLAGS
MOVE *A8(OEDEATH),A0,L
JRZ OG_NO_EDEATH ;BR=NO DEATH ROUTINE
JUMP A0
OG_NO_EDEATH
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE *A8(OYVEL),A3,W ;USE TO TEST WINDOW DUDE
MOVE A0,*A8(OYVEL),L
MOVE A0,*A8(OZVEL),L
SLL 16+4,A14 ;SHIFT OUT FLAGS
SRL 16+4,A14
JRZ OG_SIDE_DEATH ;BR=HE'S SIDEWAYS!
LMO A14,A14
SUBK 31,A14
NEG A14
SLL 5,A14 ;GET TABLE OFFSET
ADDI OUTCLUB_GUNVECT_TBL,A14
MOVE *A14,A14,L
JUMP A14 ;HEY HO! LETS GO!
OG_STILL_ALIVE
MOVB A14,*A8(OHITS) ;NUMBER OF HITS LEFT
OG_DEAD
RETS
OG_SIDE_DEATH
MOVE A1,A14
MOVI NONBOY_SIDE_RUN_DEATH_ANIM,A1
BTST B_SIDE,A14
JANZ STRT_ANIM ;BR=SIDEWAYS
MOVI FALLDOWN_DEATH_ANIM,A1
JAUC STRT_ANIM
; MOVE *A8(OGRNDOFF),A14,L
; JAZ STRT_ANIM
;
; MOVI -03000H,A14
; MOVE A14,*A8(OYACCEL),W ;FALL DOWN
; MOVE *A8(OFLAGS),A14,W
; ORI M_GCOLL,A14 ;READY FOR GROUND COLLISION
; MOVE A14,*A8(OFLAGS),W
; JAUC STRT_ANIM
OUTCLUB_GUNVECT_TBL
.LONG OG_WINDOW_GUNVECT, OG_DOOR_GUNVECT
.LONG OG_BW_GUNVECT, OG_POPTOP_GUNVECT
; .LONG OG_HELI_GUNVECT, OG_LEDGE_GUNVECT
.LONG DUMRETS, OG_LEDGE_GUNVECT
.LONG OG_LADDER_GUNVECT, OG_DUMPSTER_GUNVECT
**************************************************************************
OG_LADDER_GUNVECT
* NEEDS OEFLAGS IN A1
**************************************************************************
BTST B_SIDE,A1
JRZ OG_ON_LADDER ;BR=NO SPECIAL DEATH
MOVE *A8(OGRNDOFF),A14,L ;SPECIAL TOP OF BUILDING DEATH
ADDI -60 << 15,A14 ;OFFSET BELOW LEDGE
MOVE A14,*A8(OGRNDOFF),L
MOVI LADDER_FALL_DEATH_ANIM3,A1
JAUC STRT_ANIM
OG_ON_LADDER
MOVI -15 << 15,A14 ;OFFSET INTO GROUND
MOVE A14,*A8(OGRNDOFF),L
MOVI LADDER_FALL_DEATH_ANIM,A1
MOVE *A8(OYVAL),A3,L
MOVE *A8(OYSTART),A4,L
SUB A3,A4
CMPI 0240000H,A4
JAGT STRT_ANIM ;BR=HE'S ABOVE THE RAILING
MOVE @YWORLD,A0,L
ADD A3,A4
SUB A4,A0 ;COMPUTE HIS GROUND OFFSET
ADDI -5 << 15,A0 ;OFFSET HIM INTO THE FLOOR A LITTLE
MOVE A0,*A8(OGRNDOFF),L
MOVI LADDER_FALL_DEATH_ANIM2,A1 ;BELOW THE RAILING DEATH
JAUC STRT_ANIM
**************************************************************************
OG_DOOR_GUNVECT
**************************************************************************
MOVI FALLDOWN_DEATH_ANIM,A1
JAUC STRT_ANIM
;**************************************************************************
;OG_HELI_GUNVECT
;**************************************************************************
;
; MOVI FALLDOWN_DEATH_ANIM,A1 ;DEFAULT TO FALLING BACKWARDS
; MOVI NONBOY_LEGS_INIT,A5
; CALLA CREATE_OBJ
; JAZ STRT_ANIM ;BR=OOPS! JUST FALL BACKWARDS
;
; MOVE *A0(OFLAGS),A14,L
; ORI M_OPARTSXY,A14
; MOVE A14,*A0(OFLAGS),L
;
; MOVE *A8(OPARTSXY),*A0(OPARTSXY),L
;
; MOVI FALLING_DEATH_LEGS_ANIM5,A1
; CALLA STRTANIM
;
; MOVI FALLING_DEATH_ANIM5,A9
; JRUC OG_BW_LEGS
**************************************************************************
OG_LEDGE_GUNVECT
* NEEDS OEFLAGS IN A1
**************************************************************************
BTST B_SIDE,A1
JRNZ OG_BW_FALL_OK ;BR=SIDEWAYS ON THE LEDGE DEATH
MOVI NONBOY_HEADON_DEATH_ANIM,A1 ;DEFAULT TO FALLING BACKWARDS
MOVI NONBOY_LEGS_INIT,A5
CALLA CREATE_OBJ
JAZ STRT_ANIM ;BR=OOPS! JUST FALL BACKWARDS
MOVI -20 << 15,A14
MOVE A14,*A8(OGRNDOFF),L ;SET GROUND OFFSET FOR FALL
MOVI 04000H,A14 ;INITIAL BOOST
MOVE A14,*A8(OYACCEL),W
MOVI -040000H,A14
MOVE A14,*A8(OYVEL),L
MOVI FALLING_DEATH_ANIM3,A9
JRUC OG_BW_LEGS
**************************************************************************
OG_BW_GUNVECT
* NEEDS OEFLAGS IN A1
**************************************************************************
BTST B_SIDE,A1
JRZ OG_BW_NO_SIDE ;BR=NOT SIDEWAYS
MOVE *A8(OIMG),A14,L
; CMPI G_B5SPxSHA6,A14 ;CHECK FOR LAST SIDE FRAME
; JREQ OG_BW_FALL_OK ;BR=DON'T OFFSET X
MOVI 20 << 15,A1
CMPI G_B5SPxSHA6,A14
JREQ OG_BW_CHKFLIP ;BR=CHECK FOR FLIP
MOVI 30 << 15,A1
CMPI G_B5SPxSHA5,A14
JREQ OG_BW_CHKFLIP ;BR=CHECK FOR FLIP
MOVI 40 << 15,A1
OG_BW_CHKFLIP
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ OG_BW_NOFLIPH ;BR=NO H FLIP
NEG A1
OG_BW_NOFLIPH
MOVE *A8(OXVAL),A14,L
SUB A1,A14
MOVE A14,*A8(OXVAL),L
OG_BW_FALL_OK
; MOVI SIDEWAYS_FALLDOWN_DEATH_ANIM,A1 ;SIDE TO FRONT TRANSITION DEATH
; MOVI NONBOY_SIDE_RUN_DEATH_ANIM,A1
MOVI NONBOY_HEADON_DEATH_ANIM,A1
JAUC STRT_ANIM
OG_BW_NO_SIDE
; MOVI FALLDOWN_DEATH_ANIM2,A1 ;DEFAULT TO FALLING BACKWARDS
MOVI NONBOY_HEADON_DEATH_ANIM,A1
MOVI 512,A0
CALLA RANDPER
JAC STRT_ANIM ;BR=FALL BACKWARDS
MOVI FALLING_DEATH_ANIM2,A9
ND_hk:
MOVI NONBOY_LEGS_INIT,A5
CALLA CREATE_OBJ
JAZ STRT_ANIM ;BR=OOPS! JUST FALL BACKWARDS
OG_BW_LEGS
MOVE *A8(OXVAL),*A0(OXVAL),L ;SET POSITION OF LEGS
MOVE *A8(OYVAL),*A0(OYVAL),L
MOVE *A8(OZVAL),*A0(OZVAL),L
; MOVE *A8(OZVAL),A14,L
; MOVE A14,*A0(OZVAL),L
; SUBK 3,A14 ;OFFSET Z OF TORSO
; MOVE A14,*A8(OZVAL),L
;
; MOVB *A8(OZOFF),A14
; MOVB A14,*A0(OZOFF)
; SUBK 3,A14 ;OFFSET Z OF TORSO
; MOVB A14,*A8(OZOFF)
MOVE *A8(OCTRL),A14,W ;SET FLIP OF LEGS
ANDI M_FLIPH,A14
MOVE *A0(OCTRL),A1,W
OR A14,A1
MOVE A1,*A0(OCTRL),W
MOVI DUMRETS,A14
MOVE A14,*A0(OGUNVECT),L
CALLA INSPART
CALLA INSOBJ
CALLR RESORT_OBJ ;MAKE SURE IT IS SORTED
MOVE A9,A1
JAUC STRT_ANIM ;MAKE HIM FALL
NONTHR_DEATH:
MOVI NONTHR_DEATH_ANIM,A9
jruc ND_hk
**************************************************************************
OG_WINDOW_GUNVECT
* NEEDS OYVEL IN A3
**************************************************************************
MOVE *A8(ODEATHCALL),A14,L
JrZ SKP_DTHCALL
MMTM SP,A3,A8
CALL A14
MMFM SP,A3,A8
SKP_DTHCALL:
MOVI WINBOY_DEATH_ANIM,A1 ;DEFAULT FALL BACK ANIMATION
MOVE A3,A3
JANZ STRT_ANIM ;BR=IN TRANSITION
; MOVI 512,A0
; CALLA RANDPER
; JAC STRT_ANIM ;BR=LETS FALL BACK
MOVE *A8(OZVAL),A1,L
SUBK 6,A1 ;OFFSET Z
CALLA SET_ANIPZU
CALLR RESORT_OBJ ;MAKE SURE IT IS SORTED
MOVI FALLING_DEATH_ANIM,A1
JAUC STRT_ANIM ;FALL FORWARD ANIMATION
**************************************************************************
OG_POPTOP_GUNVECT
* NEEDS OYVEL IN A3
**************************************************************************
MOVI WINBOY_DEATH_ANIM,A1 ;DEFAULT FALL BACK ANIMATION
MOVE A3,A3
JANZ STRT_ANIM ;BR=IN TRANSITION
MOVI FALLING_DEATH_ANIM,A1
MOVE *A8(ODEATHCALL),A14,L
JAZ STRT_ANIM
CALL A14
JAUC STRT_ANIM ;FALL FORWARD ANIMATION
**************************************************************************
OG_DUMPSTER_GUNVECT
* NEEDS OYVEL IN A3
**************************************************************************
MOVI WINBOY_DEATH_ANIM,A1 ;DEFAULT FALL BACK ANIMATION
MOVE A3,A3
JANZ STRT_ANIM ;BR=IN TRANSITION
MOVI FALLING_DEATH_ANIM4,A1
JAUC STRT_ANIM ;FALL FORWARD ANIMATION
**************************************************************************
* *
* A_OFFSETYZ - OFFSET Y AND EXECUTE A_OFFSETZ *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = Y PIXEL OFFSET *
* AARG+,W = Z WORLD OFFSET *
* *
**************************************************************************
A_OFFSETYZ
CALLA GET_HEAD_PART
CALLA GETAFARG_WORD
; MOVE *A8(OFLAGS),A14,L
; BTST B_OPARTSXY,A14
; JRZ AOYZ_NOPARTSXY
; SLL 16,A0
; MOVE *A8(OPARTSXY),A14,L
; ADDXY A0,A14
; MOVE A14,*A8(OPARTSXY),L
; SRA 16,A0
;AOYZ_NOPARTSXY
SLL 15,A0
; MOVE *A8(OYVAL),A14,L
; ADD A0,A14 ;ADD OFFSET TO Y
; MOVE A14,*A8(OYVAL),L
MOVE *A8(OXVAL),A1,L
MOVE *A8(OYVAL),A2,L
ADD A0,A2
MOVE *A8(OZVAL),A3,L
CALLA GETAFARG_WORD
ADD A0,A3 ;ADD OFFSET TO Z
CALLA SET_ANIPU
CALLR RESORT_OBJ ;MAKE SURE IT IS SORTED
RETS
**************************************************************************
* *
* A_OFFSETZ *
* OFFSETZ - OFFSET Z *
* *
* PASS: *
* A0 = Z OFFSET FOR OFFSETZ *
* A8 = OBJECT *
* AARG+,W = Z WORLD OFFSET FOR A_OFFSETZ *
* *
**************************************************************************
A_OFFSETZ
CALLA GETAFARG_WORD
OFFSETZ
CALLA GET_HEAD_PART
; MOVB *A8(OZOFF),A14
; MOVE *A8(OZVAL),A1,L
; ADD A0,A14
; ADD A0,A1
; MOVE A1,*A8(OZVAL),L
; MOVB A14,*A8(OZOFF)
MOVE *A8(OZVAL),A1,L
ADD A0,A1 ;ADD OFFSET TO Z
CALLA SET_ANIPZU
CALLR RESORT_OBJ ;MAKE SURE IT IS SORTED
RETS
**************************************************************************
* *
* A_SET_FALL *
* SET_FALL - PREPARE GUY TO FALL FORWARD *
* *
* PASS: *
* A0 = OZVEL FOR SET_FALL *
* A1 = OYACCEL FOR SET_FALL *
* A8 = OBJECT *
* AARG+,W = Y ACCELERATION FOR A_SET_FALL *
* AARG+,W = Z VELOCITY FOR A_SET_FALL *
* *
**************************************************************************
A_SET_FALL
CALLA GETAFARG_WORD
MOVE A0,A1
CALLA GETAFARG_WORD
SET_FALL
MOVE A1,*A8(OYACCEL),W
MOVE A0,*A8(OZVEL),L
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14 ;READY FOR GROUND COLLISION
MOVE A14,*A8(OFLAGS),W
RETS
**************************************************************************
* *
* A_SET_JUMP *
* SET_JUMP - PREPARE GUY TO JUMP FORWARD *
* *
* PASS: *
* A0 = OZVEL FOR SET_JUMP *
* A1 = OYACCEL FOR SET_JUMP *
* A2 = OYVEL FOR SET_JUMP *
* A8 = OBJECT *
* AARG+,W = Y ACCELERATION FOR A_SET_JUMP *
* AARG+,L = Y VELOCITY FOR A_SET_JUMP *
* AARG+,W = Z VELOCITY FOR A_SET_JUMP *
* *
**************************************************************************
A_SET_JUMP
CALLA GETAFARG_WORD
MOVE A0,A1
CALLA GETAFARG_LONG
MOVE A0,A2
CALLA GETAFARG_WORD
SET_JUMP
MOVE A2,*A8(OYVEL),L
MOVE A1,*A8(OYACCEL),W
MOVE A0,*A8(OZVEL),L
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14 ;READY FOR GROUND COLLISION
MOVE A14,*A8(OFLAGS),W
RETS
**************************************************************************
* *
* RESORT_OBJ - PLACE AN OBJECT IN ITS CORRECT POSITION IN THE LIST *
* NOTE: USE THIS WHEN OZVAL IS CHANGED MANUALLY *
* *
* PASS: *
* A8 = DA OBJECT *
* *
**************************************************************************
RESORT_OBJ
JAUC SORT_OBJ
; PUSH A2
;; MMTM SP,A0,A1,A2,A4,A5,A7,A10
; MOVE @ZSCROLL,A7,L ;TIMER CHECK DEPENDS ON Z SCROLL
;
; MOVI FGLIST,A10
;
; MOVE *A8(OZVAL),A1,L ;GET OBJECT'S POSITION
; MOVE *A8(OYVAL),A2,L
;
; MOVE *A8(OBLINK),A0,L ;DEFAULT TO REVERSE CHECK
; CMP A10,A0
; JREQ RO_FORWARD_CHECK ;BR=CAN'T DO REVERSE CHECK
;
; MOVE *A0(OZVAL),A3,L
; CMP A1,A3
; JRLT RO_FORWARD_CHECK ;BR=FORWARD CHECK
;
; JRUC RO_REVERSE_NEXT ;LETS GO UP THE LIST
;
;RO_REVERSE_LUPE
; CMP A1,A3
; JRLT RO_MOVE_IT ;BR=FOUND NEW POSITION
; JRNE RO_REVERSE_NEXT ;BR=SKIP Y CHECK
;
; MOVE *A0(OYVAL),A4,L
; CMP A2,A4
; JRGE RO_MOVE_IT ;BR=FOUND NEW POSITION
;RO_REVERSE_NEXT
; MOVE *A0(OBLINK),A14,L ;GET NEXT OBJECT
; CMP A10,A14
; JREQ RO_MOVE_IT ;BR=AT END OF LIST
; MOVE A14,A0
; MOVE *A0(OZVAL),A3,L
; JRUC RO_REVERSE_LUPE
;RO_FORWARD_CHECK
; MOVE *A8,A0,L ;FORWARD CHECK
; CMP A10,A0
; JREQ RO_DONE ;BR=CAN'T DO FORWARD CHECK
;
; MOVE *A0(OZVAL),A3,L ;LETS GO DOWN THE LIST
; CMP A1,A3
; JRGE RO_DONE ;BR=NO SORT NECESSARY
;
; JRUC RO_FORWARD_NEXT
;
;RO_FORWARD_LUPE
; CMP A1,A3
; JRGT RO_MOVE_IT_ONE_OVER ;BR=FOUND NEW POSITION
; JRNE RO_FORWARD_NEXT ;BR=SKIP Y CHECK
;
; MOVE *A0(OYVAL),A4,L
; CMP A2,A4
; JRLE RO_MOVE_IT ;BR=FOUND NEW POSITION
;RO_FORWARD_NEXT
; MOVE A0,A5 ;SAVE FOR LATER
; MOVE *A0,A0,L ;GET NEXT OBJECT
; CMP A10,A0
; JREQ RO_MOVE_IT_ONE_OVER ;BR=AT END OF LIST
; MOVE *A0(OZVAL),A3,L
; JRUC RO_FORWARD_LUPE
;RO_MOVE_IT_ONE_OVER
; MOVE A5,A0 ;HEY WAIT A MINUTE! BACKUP ONE
;RO_MOVE_IT
; PUSHST
; DINT
;
; MOVE A7,A7
; JRZ RO_NOTIMER_CHECK ;BR=NOT SCROLLING IN Z
;
; MOVE @TIMER,A14,W
; JRNZ RO_ABORT ;BR=VELADD MAY HAVE SCREWED US
;RO_NOTIMER_CHECK
; MOVE *A8(OBLINK),A1,L ;UNLINK A8
; MOVE *A8,A2,L
; MOVE A2,*A1,L
; MOVE A1,*A2(OBLINK),L
;
; MOVE *A0,A1,L ;LINK A8 AFTER A0
; MOVE A8,*A0,L
; MOVE A1,*A8,L
; MOVE A0,*A8(OBLINK),L
; MOVE A8,*A1(OBLINK),L
;RO_ABORT
; POPST
;RO_DONE
;; MMFM SP,A0,A1,A2,A4,A5,A7,A10
; PULL A2
; RETS
**************************************************************************
* *
* A_TOGGLE_DIR - TOGGLE DIRECTION, SIDEWAYS <=> FORWARD *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_TOGGLE_DIR
MOVE *A8(OEFLAGS),A14,W
XORI M_SIDE,A14
MOVE A14,*A8(OEFLAGS),W
RETS
**************************************************************************
* *
* A_CHECK_WINBOY - CHECK POPUP'S Y POSITION *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,L = JUMP HERE IF NOT DONE *
* *
**************************************************************************
A_CHECK_WINBOY
MOVE *A8(OYSTART),A1,L
MOVE *A8(OYVAL),A14,L
SUB A1,A14
CMPI -02B333H*10,A14
JRLE ACW_DONE ;BR=POSITION NOT REACHED
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L ;LETS GO HERE
RETS
ACW_DONE
SUBI 02B333H*10,A1
CALLA SET_ANIPYU ;CORRECT Y POSITION
CLR A14
MOVE A14,*A8(OYVEL),L ;STOP 'EM
RETS
A_CHECK_WINBOY_UP
move *a8(OYVAL),a14,L
subi 2b333h,a14
ACW_hk:
move a14,*a8(OYVAL),L
movb *A8(AnimLoop),A14
dec A14
movb A14,*A8(AnimLoop)
jrz ACWU_X
move *a8(AnimFrm),a14,L ; STAY HERE until all loops exhausted
subi 50h,a14
move a14,*a8(AnimFrm),L
ACWU_X:
rets
A_CHECK_WINBOY_DN:
move *a8(OYVAL),a14,L
addi 2b333h,a14
jruc ACW_hk
**************************************************************************
* *
* FIND_NEARESTX_OID - FIND NEAREST OBJECT IN X OF A GIVEN OID THAT THE *
* GIVEN OBJECT IS FACING *
* *
* PASS: *
* A1 = OID TO FIND *
* A8 = OBJECT *
* *
* RETURN: *
* A0 = OBJECT FOUND (Z SET AND A0=0 IF NONE FOUND) *
* *
**************************************************************************
FIND_NEARESTX_OID
MMTM SP,A2,A4,A5,A6,A7
CLR A0 ;DEFAULT TO NO OBJECT FOUND
MOVE *A8(OXVAL),A2,L ;GET POSITION
MOVE *A8(OCTRL),A14,W ;NEED FOR FLIP TEST
MOVI 07FFFFFFFH,A5 ;SET FARTHEST DISTANCE
MOVI FGLIST,A6
MOVE A6,A7
FNOX_LUPE
MOVE *A7,A7,L
CMP A6,A7
JREQ FNOX_DONE ;BR=END OF LIST
MOVE *A7(OID),A4,W
CMP A1,A4
JRNE FNOX_LUPE ;BR=NO OID MATCH
MOVE *A7(OXVAL),A4,L ;GET POSITION
BTST B_FLIPH,A14
JRNZ FNOX_FLIP_TEST ;BR=FLIPPED
SUB A2,A4
JRN FNOX_LUPE ;BR=NOT FACING THE OBJECT
JRUC FNOX_CHECK_DIST
FNOX_FLIP_TEST
SUB A2,A4
NEG A4
JRN FNOX_LUPE ;BR=NOT FACING THE OBJECT
FNOX_CHECK_DIST
CMP A5,A4
JRGE FNOX_LUPE ;BR=NOT CLOSER
MOVE A4,A5 ;NEW CLOSEST DISTANCE
MOVE A7,A0 ;SAVE OBJECT ADDRESS
JRUC FNOX_LUPE
FNOX_DONE
MOVE A0,A0 ;REPORT STATUS OF A0
MMFM SP,A2,A4,A5,A6,A7
RETS
;**************************************************************************
;* *
;* FIND_NEARESTY_OID - FIND NEAREST OBJECT IN Y OF A GIVEN OID THAT *
;* THE GIVEN OBJECT IS HEADING TOWARDS *
;* *
;* PASS: *
;* A1 = OID TO FIND *
;* A8 = OBJECT *
;* *
;* RETURN: *
;* A0 = OBJECT FOUND (Z SET AND A0=0 IF NONE FOUND) *
;* *
;**************************************************************************
;
;FIND_NEARESTY_OID
; MMTM SP,A2,A3,A4,A5,A6,A7
; CLR A0 ;DEFAULT TO NO OBJECT FOUND
; MOVE *A8(OYVAL),A2,L ;GET POSITION
; MOVE *A8(OXVAL),A3,L
; MOVE *A8(OYVEL),A14,L ;GET DIRECTION
; JRZ FNOY_DONE ;BR=NO DIRECTION ABORT
; MOVI 07FFFFFFFH,A5 ;SET FARTHEST DISTANCE
; MOVI FGLIST,A6
; MOVE A6,A7
;FNOY_LUPE
; MOVE *A7,A7,L
; CMP A6,A7
; JREQ FNOY_DONE ;BR=END OF LIST
;
; MOVE *A7(OID),A4,W
; CMP A1,A4
; JRNE FNOY_LUPE ;BR=NO OID MATCH
;
; MOVE *A7(OXVAL),A4,L ;GET X POSITION
; SUB A3,A4
; ABS A4
; CMPI 010000H,A4
; JRGT FNOY_LUPE ;BR=OUT OF X ERROR RANGE
;
; MOVE *A7(OYVAL),A4,L ;GET Y POSITION
;
; MOVE A14,A14
; JRN FNOY_UP_TEST ;BR=GOING UP
; SUB A2,A4
; JRN FNOY_LUPE ;BR=WRONG DIRECTION, IT'S ABOVE
; JRUC FNOY_CHECK_DIST
;FNOY_UP_TEST
; SUB A2,A4
; NEG A4
; JRN FNOY_LUPE ;BR=WRONG DIRECTION, IT'S BELOW
;FNOY_CHECK_DIST
; CMP A5,A4
; JRGE FNOY_LUPE ;BR=NOT CLOSER
; MOVE A4,A5 ;NEW CLOSEST DISTANCE
; MOVE A7,A0 ;SAVE OBJECT ADDRESS
; JRUC FNOY_LUPE
;FNOY_DONE
; MOVE A0,A0 ;REPORT STATUS OF A0
; MMFM SP,A2,A3,A4,A5,A6,A7
; RETS
**************************************************************************
* *
* A_SET_ODESTX *
* SET_ODESTX - SET ODEST TO THE NEAREST OBJECT OF A GIVEN OID *
* *
* PASS: *
* A1 = OID FOR SET_ODESTX *
* A8 = OBJECT *
* AARG+,W = OID TO FIND FOR A_SET_ODESTX *
* *
**************************************************************************
A_SET_ODESTX
CALLA GETAFARG_WORD
MOVE A0,A1
SET_ODESTX
CALLA FIND_NEARESTX_OID
MOVE *A0(OXVAL),*A8(ODEST),L
RETS
**************************************************************************
* *
* A_CHECK_ODESTX - CHECK IF WE REACHED ODEST IN X *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_CHECK_ODESTX
MOVE *A8(OXVAL),A0,L ;GET POSITIONS
MOVE *A8(ODEST),A3,L
MOVE A3,A1
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ ACOX_OK ;BR=NO FLIP, NO SWAP
XOR A0,A3 ;DO THE SWAP!
XOR A3,A0
XOR A0,A3
ACOX_OK
SUB A0,A3 ;ARE WE THERE YET?
NEG A3
JRN ACOX_DONE ;BR=NOT YET
CALLA SET_ANIPXU ;SET POSITION
MOVE *A8(OANIM0),*A8(AnimFrm),L ;SET ANIMATIONS
MOVE *A8(OANIM1),*A8(AnimScr),L
CLR A14
MOVB A14,*A8(AnimSlp)
MOVE A14,*A8(OXVEL),L ;STOP!
ACOX_DONE
RETS
**************************************************************************
* *
* A_LADDERBOY_SHOOT - CHECK IF LADDERBOY WANTS TO SHOOT *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = PERCENT CHANCE TO SHOOT *
* *
**************************************************************************
A_LADDERBOY_SHOOT
CALLA GETAFARG_WORD
CALLA RANDPER
JRNC AU_RS_NOPE ;BR=IT DIDN'T HAPPEN
CALLR A_CHECK_DUDE_FIRE
JRZ AU_RS_NOPE ;BR=NO HIT
MOVE *A8(OEFLAGS),A1,W
ORI M_LEDGE,A1 ;USE LEDGE DEATH
MOVE A1,*A8(OEFLAGS),W
AU_RS_NOPE
RETS
**************************************************************************
* *
* A_GO_OUTSIDE - JUST GO OUTSIDE AND SHUT UP! *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = NEW OEFLAGS *
* AARG+,W = Z WORLD OFFSET *
* *
**************************************************************************
A_GO_OUTSIDE
CALLA GETAFARG_WORD
MOVE A0,*A8(OEFLAGS),W ;NEW STATE
JRUC A_OFFSETZ
**************************************************************************
* *
* A_SET_OGRNDOFF *
* SET_OGRNDOFF - SET OGRNDOFF SO IT'S "GROUND PLANE" IS IT'S OYVAL *
* *
* PASS: *
* A1 = EXTRA Y PIXEL OFFSET FOR SET_OGRNDOFF *
* A8 = OBJECT *
* AARG+,W = EXTRA Y PIXEL OFFSET FOR A_SET_OGRNDOFF *
* *
**************************************************************************
A_SET_OGRNDOFF
CALLA GETAFARG_WORD
MOVE A0,A1
SET_OGRNDOFF
MMTM SP,A0,A1
MOVE @YWORLD,A0,L
MOVE *A8(OYVAL),A14,L
SUB A14,A0 ;COMPUTE IT'S GROUND OFFSET
SLL 15,A1 ;CONVERT OFFSET TO WORLD
ADD A1,A0 ;ADD WORLD OFFSET
MOVE A0,*A8(OGRNDOFF),L
MMFM SP,A0,A1
RETS
**************************************************************************
* *
* A_CLR_OGRNDOFF - ZERO OGRNDOFF *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_CLR_OGRNDOFF
CLR A14
MOVE A14,*A8(OGRNDOFF),L
RETS
**************************************************************************
* *
* A_GO_UP_LADDER - SET LADDERBOY TO GO UP LADDER *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_GO_UP_LADDER
MOVI M_LADDER,A14 ;USE LADDER DEATH
MOVE A14,*A8(OEFLAGS),W
MOVI -0A000H,A14 ;GOING UP!
MOVE A14,*A8(OYVEL),L
; MOVI (TYPE_UNIV & MASK_TYPE) | ID_6, A1 ;OID OF TOP LADDER
; CALLA FIND_NEARESTY_OID
; MOVE *A0(OYVAL),*A8(ODEST),L ;SET DESTINATION
MOVI -02280000H,A14
MOVE A14,*A8(ODEST),L ;SET DESTINATION
MOVI LADDERBOY_ONTOP_TURN_ANIM,A14 ;SET ANIMATIONS
MOVE A14,*A8(OANIM0),L
MOVI NONBOY_SIDE_RUN_ANIM,A14
MOVE A14,*A8(OANIM1),L
RETS
**************************************************************************
* *
* A_CHECK_ODESTY - CHECK IF WE REACHED ODEST IN Y *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_CHECK_ODESTY
MOVE *A8(OYVAL),A0,L ;GET POSITIONS
MOVE *A8(ODEST),A3,L
MOVE A3,A1
MOVE *A8(OYVEL),A14,L
JRZ ACOY_DONE ;BR=NOT MOVIN'
JRNN ACOY_OK ;BR=NO DOWN, NO SWAP
XOR A0,A3 ;DO THE SWAP!
XOR A3,A0
XOR A0,A3
ACOY_OK
SUB A0,A3 ;ARE WE THERE YET?
NEG A3
JRN ACOY_DONE ;BR=NOT YET
CALLA SET_ANIPYU ;SET POSITION
MOVE *A8(OANIM0),*A8(AnimFrm),L ;SET ANIMATIONS
MOVE *A8(OANIM1),*A8(AnimScr),L
CLR A14
MOVB A14,*A8(AnimSlp)
MOVE A14,*A8(OYVEL),L ;STOP!
MOVE @RAND,A0,W ;DO THE RANDOM FLIP!
ANDI M_FLIPH,A0
CALLA TOGGLE_FLPS
ACOY_DONE
RETS
**************************************************************************
* *
* A_SET_ONTOP - SET LADDERBOY ON TOP OF THE LEDGE *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_SET_ONTOP
MOVI LADDERBOY_LEDGE_CHECK,A14 ;USE LEDGE CHECK
MOVE A14,*A8(OANIMCHK),L
MOVK 3,A1
MOVK 10,A0
CALLA RANGRAND
MOVB A0,*A8(OSHOOTCNT) ;RANDOM SHOOTING CHECK COUNT
MOVI M_SIDE,A0 ;USE SIDE DEATH
MOVE @RAND,A14,W ;CHOOSE RANDOM OTHER DEATH
BTST 1,A14
JRZ ASO_UNDERDOG ;BR=DIE THE OTHER WAY
ORI M_LEDGE,A0 ;USE LEDGE DEATH
JRUC ASO_SET
ASO_UNDERDOG
ORI M_BW,A0 ;USE BEHIND WALL DEATH
ASO_SET
MOVE A0,*A8(OEFLAGS),W
JAUC A_SET_SRUNVEL ;ON YOUR MARK, GET SET, GO!
**************************************************************************
* *
* LADDERBOY_LEDGE_CHECK - LOOK FOR THE END OF THE LEDGE *
* *
* PASS: *
* A8 = OBJECT *
* *A8(OROOFXLEFT) = ROOF LEFT BOUNDARY *
* *A8(OROOFXRGHT) = ROOF RIGHT BOUNDARY *
* *
**************************************************************************
LADDERBOY_LEDGE_CHECK
MOVE *A8(OXVAL),A0,L
MOVE *A8(OROOFXLEFT),A14,L
CMP A14,A0
JRLT RLC_GOING_DOWN ;BR=NOT AT LEFT STAIRWAY
MOVE *A8(OROOFXRGHT),A14,L
CMP A14,A0
JRLT RLC_DONE ;BR=NOT AT RIGHT STAIRWAY
RLC_GOING_DOWN
MOVE *A8(OFLAGS),A14,W
ORI M_GCOLL,A14 ;SET FOR GROUND COLLISION
MOVE A14,*A8(OFLAGS),W
MOVE @YWORLD,A0,L
MOVI -02180000H,A14
SUB A14,A0 ;COMPUTE IT'S GROUND OFFSET
MOVE A0,*A8(OGRNDOFF),L
CLR A14
MOVE A14,*A8(OXVEL),L ;STOP!
MOVI 04000H,A14 ;INITIAL BOOST
MOVE A14,*A8(OYACCEL),W
MOVI NONBOY_ROOF_CHECK0,A14 ;USE ROOF GUY CHECK
MOVE A14,*A8(OANIMCHK),L
MOVI LADDERBOY_JUMP_ANIM,A1 ;JUMP OFF LEDGE ANIM
CALLA STRT_ANIM
MOVK 12,A0
CALLR OFFSETZ ;PUT BEHIND LEDGE
RLC_DONE
RETS
**************************************************************************
* *
* A_SET_ONROOF - SET LADDERBOY ON DA ROOF STUFF *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_SET_ONROOF
MOVI NONBOY_CVECT,A14 ;NEW VECTORS
MOVE A14,*A8(OCVECT),L
MOVI NONBOY_GUNVECT,A14
MOVE A14,*A8(OGUNVECT),L
MOVI M_SIDE,A14 ;SIDE STATE
MOVE A14,*A8(OEFLAGS),W
RETS
**************************************************************************
* *
* A_RAND_BRANCH - BRANCH ON RANDOM PERCENTAGE DECISION *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,W = PERCENTAGE OF BRANCH *
* AARG+,L = BRANCH ADDRESS *
* *
**************************************************************************
A_RAND_BRANCH
CALLA GETAFARG_WORD
CALLA RANDPER
JRNC ARB_NOPE ;BR=DIDN'T HAPPEN
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L
ARB_NOPE
RETS
**************************************************************************
* *
* A_CHECK_DOWN - BRANCH IF NOT TRAVELING TOWARDS THE GROUND (DOWNWARD) *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,L = BRANCH ADDRESS *
* *
**************************************************************************
A_CHECK_DOWN
.if DEBUG
; MOVE *A8(OFLAGS),A14,W
; BTST B_GCOLL,A14
; LOCKON Z
.endif
MOVE *A8(OYVEL),A14,L
;I DON'T NEED THIS CAUSE I GOIN TO FIX THE M_GCOLL NOT BEING SET BUG!
JRZ ACDN_DONE
JRP ACDN_DONE ;BR = Going down
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L
ACDN_DONE
RETS
**************************************************************************
* *
* A_SET_NONBOY_VECTORS - USE NONBOY GUN AND COLLISION VECTORS *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_SET_NONBOY_VECTORS
CLR A14
MOVE A14,*A8(OEFLAGS),W
MOVI NONBOY_CVECT,A14 ;NEW VECTORS
MOVE A14,*A8(OCVECT),L
MOVI NONBOY_GUNVECT,A14
MOVE A14,*A8(OGUNVECT),L
RETS
;**************************************************************************
;* *
;* A_SET_JUMPBOY0 - SET JUMPBOY STATE 0, ABOVE THE RAILING IN THE AIR *
;* *
;* PASS: *
;* A8 = OBJECT *
;* *
;**************************************************************************
;
;A_SET_JUMPBOY0
; CLR A14
; MOVE A14,*A8(OGRNDOFF),L
; MOVI -0400H,A14
; MOVE A14,*A8(OZVEL),L
; RETS
**************************************************************************
* *
* A_NB_FALL_SOUND - Make the sound for the NON-BOY falling to the *
* ground. *
* A8 = Ptr to NON-BOY object *
* *
**************************************************************************
A_NB_FALL_SOUND
calla GET_HEAD_PART
calla DIST_FROM_GROUND
sra 16,A1
cmpi 80H,A1
jrle ANFS_Short_Sound
movi SND_NB_LONG_FALL,A0
jauc ONESND_Z ;Make the righteous falling sound
ANFS_Short_Sound
movk NUM_SFALL_SNDS,A0 ;Pick from 3
calla RAND0 ;Randomly
sll 5,A0
addi SHORT_FALL_TBL,A0
move *A0,A0,L
jauc ONESND ;Make a short fall sound
; jauc ONESND_Z ;Make a short fall sound with volume
**************************************************************************
* *
* A_SEPERATE_NONBOY - SEPERATE NONBOY FROM HEAD OBJECT *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_SEPERATE_NONBOY
MOVE *A8(OPART1),A14,L
CMP A8,A14
JREQ ASN_DONE ;BR=THIS IS THE HEAD OBJECT!
CALLA PULL_PART
MOVE *A8(OFLAGS),A14,L
ANDNI M_OPARTSXY,A14
MOVE A14,*A8(OFLAGS),L
CLR A14
MOVE A14,*A8(OPARTSXY),L
ASN_DONE
JAUC A_SET_FALL
**************************************************************************
* *
* A_START_X_DECEL - START THE DECELERATE IN X PROCESS *
* *
* PASS: *
* A8 = OBJECT *
* *
**************************************************************************
A_START_X_DECEL
MOVE *A8(OXVEL),A9,L
JRZ ASXD_ABORT
CREATE PID_IND,X_DECEL_PROC
MOVE A0,*A8(OPLINK),L
ASXD_ABORT
RETS
**************************************************************************
* *
* X_DECEL_PROC - THE DECELARATION PROCESS *
* *
* PASS: *
* A8 = OBJECT *
* A9 = INITIAL VELOCITY *
* *
**************************************************************************
X_DECEL_PROC
SRA 1,A9
MOVE A9,*A8(OXVEL),L
JRZ XDP_DONE
SLEEP 1
JRUC X_DECEL_PROC
XDP_DONE
CLR A14
MOVE A14,*A8(OPLINK),L
DIE
**************************************************************************
**************************************************************************
LADDERBOY_INIT
.byte 4, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG OUTCLUB_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_H1RUN__A1, DMAWNZ, 0, 0, OM_GUNV
.LONG OUTCLUB_GUNVECT
LWWWW G_T1RUN__A1, DMAWNZ, 0, 0, OM_PRVGUNV
LWWWW G_L1RUN__A1, DMAWNZ, 0, 0, OM_PRVGUNV
LWWWW G_L1RUN__A1, DMAWNZ, M_NODISP, 0, OM_PRVGUNV
DOORBOY_INIT
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG OUTCLUB_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_B1SHOOTA1, DMAWNZ, 0, 0, OM_GUNV
.LONG OUTCLUB_GUNVECT
WINBOY_INIT
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG OUTCLUB_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_B1POPCOP3, DMAWNZ, M_NOPARTANI, 0, OM_GUNV
.LONG OUTCLUB_GUNVECT
BUSPOP_INIT
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, 0 ;OID, GLOBAL_OPTIONS
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_B1POPCOP3, DMAWNZ|M_FLIPH, M_NOPARTANI, 0, OM_GUNV | OM_ANIM
.LONG NONBOY_GUNVECT
.long WINBOY_ANIM
NONTHR_CVECT
WWL OID_PROCKET,~MASK_PLAYER,NONTHR_ROCKET_COLL
WWL OID_PEXPLOSION,~MASK_PLAYER,NONTHR_EXPLOSION_COLL
WWL OID_BLOWUP,0FFFFH,OUTCLUB_SBOMB_CARNAGE
WWL OID_GRND,0FFFFH,OUTCLUB_GRND_COLLVECT
WL 0,DUMCRETS
NONTHR_EXPLOSION_COLL
CALLA GET_HEAD_PART
MOVE *A8(OEFLAGS),A14,W
BTST B_ATEROCKET,A14 ;Did he get hit by a rocket?
JRNZ NONTHR_COLLVECT ;BR = No, just do generic for now.
rets
BUSPOP_DEATH_ANIM
LW G_B1DEATHE2,6
LW G_B1DEATHE4,6
LW G_B1DEATHE5,6
LW G_B1DEATHE6,6
LWL 1,1|AFunc,A_DEL_NONBOY
BUSPOP_DEATH:
movi BUSPOP_DEATH_ANIM,a1
jauc STRT_ANIM
BWBOY_INIT
.byte 1, 0, 0, 1 ;OBJCNT, PRCCNT, IMGPALCNT, PALCNT
.long P_NONBOYY ;IMGPAL
.word OID_NONBOY, OM_COLL ;OID, GLOBAL_OPTIONS
.LONG OUTCLUB_CVECT
* .long IMG
* .word OCTRL, OFLAGS, OZOFF
* .word OPTIONS
LWWWW G_B5SPxSHA4, DMAWNZ, 0, 0, OM_GUNV
.LONG OUTCLUB_GUNVECT
NONBOY_LEGS_INIT
.LONG G_BOTFAL, DUMCOLL
.WORD OID_NONBOY, DMAWNZ, 0, 3
.LONG 0
;RUNOUTBOY_ANIM
; LW 1,HEADON_TIME
;
; LW G_H1RUN__A2,1|AMulti
; LW G_T1RUN__A2,1|AMulti
; LW G_L1RUN__A2,HEADON_TIME
;
; LW G_H1RUN__A3,1|AMulti
; LW G_T1RUN__A3,1|AMulti
; LW G_L1RUN__A3,HEADON_TIME
;
; LWL 1,1|AFunc,A_SET_RUNOUTBOY
;JUMPBOY_ANIM
; LW 1,HEADON_TIME
;
; LW G_H1RUN__A2,1|AMulti
; LW G_T1RUN__A2,1|AMulti
; LW G_L1RUN__A2,HEADON_TIME
;
; LW G_H1RUN__A3,1|AMulti
; LW G_T1RUN__A3,1|AMulti
; LW G_L1RUN__A3,HEADON_TIME
;
; LWLWW 1,1|AFunc,A_GO_OUTSIDE+2,M_LEDGE,-010H
;
; LWLWL 1,1|AFunc,A_RAND_BRANCH+3,512,NONBOY_HEADON_SHOOT_ANIM
;JUMPBOY_JUMP_ANIM
; LW G_H1JUMP_A3,1|AMulti
; LW G_T1JUMP_A3,1|AMulti
; LW G_L1JUMP_A3,1|AMulti
; LWL 1,3|AFunc,OBJ_OFF
;
; LW G_H1JUMP_A2,1|AMulti
; LW G_T1JUMP_A2,1|AMulti
; LW G_L1JUMP_A2,3
;
; LW G_H1JUMP_A1,1|AMulti
; LW G_T1JUMP_A1,1|AMulti
; LW G_L1JUMP_A1,2
;
; LW G_H1JUMP_A2,1|AMulti
; LW G_T1JUMP_A2,1|AMulti
; LW G_L1JUMP_A2,3
;
; LW G_H1JUMP_A3,1|AMulti
; LW G_T1JUMP_A3,1|AMulti
; LW G_L1JUMP_A3,3
;
; LWLWLW G_H1JUMP_A4,1|AMulti|AFunc,A_SET_JUMP+4,04000H,-040000H,0
; LW G_T1JUMP_A4,1|AMulti
; LW G_L1JUMP_A4,1
;
; LWL 1,1|AFunc,A_SET_NONBOY_VECTORS
;; LWLW 1,1|AFunc,A_SET_OGRNDOFF+1,-10
;JUMPBOY_JUMP_UPTIME
; LWLL 1,2|AFunc,A_CHECK_DOWN+2,JUMPBOY_JUMP_UPTIME
; LWL 1,1|AFunc,A_SET_JUMPBOY0
;JUMPBOY_JUMP_HANGTIME
; LWLL 1,2|AFunc,A_CHECK_GROUND+2,JUMPBOY_JUMP_HANGTIME
;
; LW G_H1JUMP_A3,1|AMulti
; LW G_T1JUMP_A3,1|AMulti
; LW G_L1JUMP_A3,3
;
; LW G_H1JUMP_A2,1|AMulti
; LW G_T1JUMP_A2,1|AMulti
; LW G_L1JUMP_A2,3
;
; LW G_H1JUMP_A1,1|AMulti
; LW G_T1JUMP_A1,1|AMulti
; LW G_L1JUMP_A1,2
;
; LW G_H1JUMP_A2,1|AMulti
; LW G_T1JUMP_A2,1|AMulti
; LW G_L1JUMP_A2,3
;
; LW G_H1JUMP_A3,1|AMulti
; LW G_T1JUMP_A3,1|AMulti
; LW G_L1JUMP_A3,3
;
; LWLW G_H2RUN__B4,1|AMulti|AFunc,A_TOGGLE_OEFLAGS+1,M_SIDE
; LW G_T2RUN__B4,1|AMulti
; LW G_L2RUN__B4,1|AMulti
; LWL G_A2RUN__B4,2|AFunc,OBJ_ON
;
; LW G_H2RUN__B5,1|AMulti
; LW G_T2RUN__B5,1|AMulti
; LW G_L2RUN__B5,1|AMulti
; LW G_Z2RUN__B5,1
;
; LWL 1,1|AFunc,A_SET_SRUNVEL
; LWLL 1,1|AFunc,A_AnimGo+2,NONBOY_SIDE_RUN_ANIM
LADDERBOY_ANIM
LW 1,HEADON_TIME
LW G_H1RUN__A2,1|AMulti
LW G_T1RUN__A2,1|AMulti
LW G_L1RUN__A2,HEADON_TIME
LW G_H1RUN__A3,1|AMulti
LW G_T1RUN__A3,1|AMulti
LW G_L1RUN__A3,HEADON_TIME
LWLWW G_H2RUN__B4,1|AMulti|AFunc,A_GO_OUTSIDE+2,M_SIDE,-030H
LW G_T2RUN__B4,1|AMulti
LW G_L2RUN__B4,1|AMulti
LWL G_A2RUN__B4,4|AFunc,OBJ_ON
LW G_H2RUN__B5,1|AMulti
LW G_T2RUN__B5,1|AMulti
LW G_L2RUN__B5,1|AMulti
LW G_Z2RUN__B5,3
LWL 1,1|AFunc,A_SET_SRUNVEL
LADDERBOY_SIDERUN_ANIM
LWL G_H3RUN__C1,1|AMulti|AFunc,A_CHECK_ODESTX
LW G_T3RUN__C1,1|AMulti
LW G_L3RUN__C1,1|AMulti
LW G_Z3RUN__C1,SIDERUN_TIME
LWL G_H3RUN__C2,1|AMulti|AFunc,A_CHECK_ODESTX
LW G_T3RUN__C2,1|AMulti
LW G_L3RUN__C2,1|AMulti
LW G_Z3RUN__C2,SIDERUN_TIME
LWL G_H3RUN__C3,1|AMulti|AFunc,A_CHECK_ODESTX
LW G_T3RUN__C3,1|AMulti
LW G_L3RUN__C3,1|AMulti
LW G_Z3RUN__C3,SIDERUN_TIME
LWL G_H3RUN__C4,1|AMulti|AFunc,A_CHECK_ODESTX
LW G_T3RUN__C4,1|AMulti
LW G_L3RUN__C4,1|AMulti
LW G_Z3RUN__C4,SIDERUN_TIME
LWL G_H3RUN__C5,1|AMulti|AFunc,A_CHECK_ODESTX
LW G_T3RUN__C5,1|AMulti
LW G_L3RUN__C5,1|AMulti
LW G_Z3RUN__C5,SIDERUN_TIME
LWL G_H3RUN__C6,1|AMulti|AFunc,A_CHECK_ODESTX
LW G_T3RUN__C6,1|AMulti
LW G_L3RUN__C6,1|AMulti
LW G_Z3RUN__C6,SIDERUN_TIME
LWL G_H3RUN__C7,1|AMulti|AFunc,A_CHECK_ODESTX
LW G_T3RUN__C7,1|AMulti
LW G_L3RUN__C7,1|AMulti
LW G_Z3RUN__C7,SIDERUN_TIME
LWL G_H3RUN__C8,1|AMulti|AFunc,A_CHECK_ODESTX
LW G_T3RUN__C8,1|AMulti
LW G_L3RUN__C8,1|AMulti
LW G_Z3RUN__C8,SIDERUN_TIME-1
LWL 1,1|AFunc,A_LADDERBOY_SHOOT+1,1024/2
.long 0
LADDERBOY_TURN_ANIM
LW G_HDRNxLDE1,1|AMulti
LW G_TDRNxLDE1,1|AMulti
LW G_LDRNxLDE1,1|AMulti
LW G_ADRNxLDE1,4
LWL 1,1|AMulti|AFunc,A_GO_UP_LADDER
LADDERBOY_UP_LADDER_ANIM
LWL G_H5LADDRE1,1|AMulti|AFunc,A_CHECK_ODESTY
LW G_T5LADDRE1,1|AMulti
LW G_L5LADDRE1,1|AMulti
LWL G_Z5LADDRE1,LADDER_TIME|AFunc,OBJ_ON
LWL G_H5LADDRE2,1|AMulti|AFunc,A_CHECK_ODESTY
LW G_T5LADDRE2,1|AMulti
LW G_L5LADDRE2,1|AMulti
LW G_Z5LADDRE2,LADDER_TIME
LWL G_H5LADDRE3,1|AMulti|AFunc,A_CHECK_ODESTY
LW G_T5LADDRE3,1|AMulti
LW G_L5LADDRE3,1|AMulti
LWL 1,LADDER_TIME|AFunc,OBJ_OFF
LWL G_H5LADDRE4,1|AMulti|AFunc,A_CHECK_ODESTY
LW G_T5LADDRE4,1|AMulti
LW G_L5LADDRE4,1|AMulti
LWL G_Z5LADDRE4,LADDER_TIME|AFunc,OBJ_ON
LWL G_H5LADDRE5,1|AMulti|AFunc,A_CHECK_ODESTY
LW G_T5LADDRE5,1|AMulti
LW G_L5LADDRE5,1|AMulti
LW G_Z5LADDRE5,LADDER_TIME
LWL G_H5LADDRE6,1|AMulti|AFunc,A_CHECK_ODESTY
LW G_T5LADDRE6,1|AMulti
LW G_L5LADDRE6,1|AMulti
LWL 1,LADDER_TIME|AFunc,OBJ_OFF
.long 0
LADDERBOY_ONTOP_TURN_ANIM
LWLW 1,1|AFunc,A_SET_OEFLAGS+1,M_SIDE
LWLW 1,1|AFunc,A_OFFSETZ+1,02BH
LW G_HDRNxLDE1,1|AMulti
LW G_TDRNxLDE1,1|AMulti
LW G_LDRNxLDE1,1|AMulti
LWL G_ADRNxLDE1,4|AFunc,OBJ_ON
LWL 1,1|AFunc,A_SET_ONTOP
.long 0
LADDERBOY_JUMP_ANIM
LW G_HDRNxLDE1,1|AMulti
LW G_TDRNxLDE1,1|AMulti
LW G_LDRNxLDE1,1|AMulti
LW G_ADRNxLDE1,1
LWLW 1,3|AFunc,A_SET_OEFLAGS+1,M_SIDE|M_LADDER
LWLW G_H5LADDRE3,1|AMulti|AFunc,A_TOGGLE_FLPS+1,M_FLIPH
LW G_T5LADDRE3,1|AMulti
LW G_L5LADDRE3,1|AMulti
LWL 1,LADDER_TIME|AFunc,OBJ_OFF
LADDERBOY_JUMP_HANGTIME
LWLL 1,2|AFunc,A_CHECK_GROUND+2,LADDERBOY_JUMP_HANGTIME
LWL G_HDRNxLDE1,1|AMulti|AFunc,A_SET_ONROOF
LW G_TDRNxLDE1,1|AMulti
LW G_LDRNxLDE1,1|AMulti
LW G_ADRNxLDE1,4
LWL 1,1|AFunc,A_SET_SRUNVEL
LWLL 1,1|AFunc,A_AnimGo+2,NONBOY_SIDE_RUN_ANIM
DOORBOY_ANIM
LW G_B1SHOOTA1,1
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,20
LW 1,0
DOORBOY_ANIM_LUPE
LW G_B1SHOOTA2,1
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
LW G_B1SHOOTA1,6
LWLL 1,1|AFunc,A_CHECK_OETIME+2,DOORBOY_ANIM_LUPE
LWL 1,1|AFunc,A_DEL_NONBOY
HATCHBOY_ANIM
LWL 1,1|AFunc,A_CHECK_WINBOY_UP
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,20
LWLW 1,0|AFunc,A_OZVAL_DELTA+1,-2
HATCHBOY_SHOOT_ANIM
LW G_B1SHTCOP1,1
LWLWW 1,5|AFunc,A_ALL_FIRE_FNC+2,-25,-83
LW G_B1SHTCOP2,6
LWLL 1,1|AFunc,A_CHECK_OETIME+2,HATCHBOY_SHOOT_ANIM
LWL 1,3|AFunc,DOWN_THE_HATCH
LWLW G_B1POPCOP3,1|AFunc,A_Set_AnimLoop+1,10
LWL 1,1|AFunc,A_CHECK_WINBOY_DN
LWL 1,1|AFunc,A_DEL_NONBOY
WINBOY_ANIM
LWLL 1,1|AFunc,A_CHECK_WINBOY+2,WINBOY_ANIM
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,20
LW 1,0
WINBOY_SHOOT_ANIM
LW G_B1SHTCOP1,1
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
LW G_B1SHTCOP2,6
LWLL 1,1|AFunc,A_CHECK_OETIME+2,WINBOY_SHOOT_ANIM
LW 1,3
LWLL G_B1POPCOP3,11|AFunc,A_SET_OYVEL+2,02B333H
LWL 1,1|AFunc,A_DEL_NONBOY
BWBOY_ANIM
LW G_B5SPxSHA4,3
LW G_B5SPxSHA5,3
LWL G_B5SPxSHA6,3|AFunc,A_TOGGLE_DIR
LWLWW G_B1SHOOTA1,1|AFunc,A_RAND_AnimSLP+2,5,20
; LWL G_B5SPxSHA7,3|AFunc,A_TOGGLE_DIR
; LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,20
LW 1,0
BWBOY_SHOOT_ANIM
LW G_B1SHOOTA1,1
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-24,-80
LW G_B1SHOOTA2,6
LWLL 1,1|AFunc,A_CHECK_OETIME+2,BWBOY_SHOOT_ANIM
; LW G_B5SPxSHA7,3
LWL G_B5SPxSHA6,3|AFunc,A_TOGGLE_DIR
LW G_B5SPxSHA5,3
LW G_B5SPxSHA4,3
LWL 1,1|AFunc,A_DEL_NONBOY
FALLDOWN_DEATH_ANIM
; LW G_B1DEATHE1,6
LWL G_B1DEATHE2,6|AFunc,A_HEADON_DEATH_SETUP
LW G_B1DEATHE4,4
LW G_B1DEATHE5,4
LW G_B1DEATHE6,5
LW G_B1DEATHE8,6+30
LWL 1,1|AFunc,A_DEL_NONBOY
PILLAR_DEATH_ANIM
; LW G_B1DEATHE1,6
LW G_B1DEATHE2,6
LW G_B1DEATHE4,4
LW G_B1DEATHE5,4
LW G_B1DEATHE6,5
LW G_B1DEATHE8,40
LWL 1,1|AFunc,A_RESTART_PILLBOY
.long 0
;FALLDOWN_DEATH_ANIM2
;; LW G_B1DEATHE1,6
; LW G_B1DEATHE2,6
; LW G_B1DEATHE4,4
; LW G_B1DEATHE5,4
; LW G_B1DEATHE6,5
; LW G_B1DEATHE8,6+20
; LWL 1,1|AFunc,A_DEL_NONBOY
WINBOY_DEATH_ANIM
; LW G_B1DEATHE1,6
LW G_B1DEATHE2,6
LW G_B1DEATHE4,4
LW G_B1DEATHE5,4
LWL 1,1|AFunc,A_DEL_NONBOY
FALLING_DEATH_ANIM
LW G_T1WINFAA2,4
LW G_T1WINFAA3,4
LW G_T1WINFAA4,2
LWLW 1,1|AFunc,A_OFFSETZ+1,-060H
LW G_T1WINFAA5,4
LW G_T1WINFAA7,4
LW G_T1WINFAA11,4
LWLWW G_T1WINFAA12,5|AFunc,A_SET_FALL+2,04000H,-02A0H
LWL G_T1WINFAA13,5|AFunc,A_NB_FALL_SOUND
LW G_T1WINFAA15,5
LW G_T1WINFAA16,5
LWL G_T1WINFAA18,5+60|AFunc,A_CLR_OZVEL
LWL 1,1|AFunc,A_DEL_NONBOY
FALLING_DEATH_ANIM2
LWLW G_T1WINFAA2,4|AFunc,A_OFFSETZ+1,-3
LW G_T1WINFAA3,4
LW G_T1WINFAA4,4
LW G_T1WINFAA5,4
LW G_T1WINFAA7,1|AMulti
LW G_T1BOTFAA7,3
LWLWW 1,1|AFunc,A_OFFSETYZ+2,10,-05DH
LW G_T1WINFAA11,1|AMulti
LWL 1,1|AFunc,DELETE_LEGS
LWLWW 1,3|AFunc,A_SET_FALL+2,04000H,0
LW G_T1WINFAA12,5
LWL G_T1WINFAA13,5|AFunc,A_NB_FALL_SOUND
LW G_T1WINFAA15,5
LW G_T1WINFAA16,5
LWL G_T1WINFAA18,5+60|AFunc,A_CLR_OZVEL
LWL 1,1|AFunc,A_DEL_NONBOY
NONTHR_DEATH_ANIM
LWLWL G_T1WINFAA2,4|AFunc,A_CREATEP+3,PID_IND,MOVE_NONTHR_FWD
LW G_T1WINFAA3,4
LW G_T1WINFAA4,4
LW G_T1WINFAA5,4
LW G_T1WINFAA7,1|AMulti
LW G_T1BOTFAA7,4
LWL G_T1WINFAA11,1|AFunc,DELETE_LEGS
LWLWW 1,5|AFunc,A_SET_FALL+2,04000H,0
LW G_T1WINFAA12,6
LWL G_T1WINFAA13,6|AFunc,A_NB_FALL_SOUND
LW G_T1WINFAA15,6
LW G_T1WINFAA16,6
LWL G_T1WINFAA18,127|AFunc,OBJPROC_KILL
LWL 1,1|AFunc,A_DEL_NONBOY
MOVE_NONTHR_FWD:
move *a8(ODATA+100h),a0 ; adjust offset from bus doors
subk 4,a0
move a0,*a8(ODATA+100h)
cmpi -100,a0
jale SUCIDE
sloop 1,MOVE_NONTHR_FWD
DELETE_LEGS:
move *a8(OPARTS),a8,L
jrz DLdun
move *a8(OID),a1
cmpi OID_NONBOY,a1
jrne DELETE_LEGS
calla DELETE_OBJ
DLdun:
rets
FALLING_DEATH_ANIM3
LWLW G_T1WINFAA2,4|AFunc,A_OFFSETZ+1,-3
LW G_T1WINFAA3,4
LW G_T1WINFAA4,4
LW G_T1WINFAA5,4
LW G_T1WINFAA7,1|AMulti
LW G_T1BOTFAA7,3
LWLWW 1,1|AFunc,A_OFFSETYZ+2,10,-05DH
LW G_T1WINFAA11,1|AMulti
LWL 1,4|AFunc,DELETE_OBJ
LWLWW G_T1WINFAA12,5|AFunc,A_SET_FALL+2,04000H,-02A0H
LWL G_T1WINFAA13,5|AFunc,A_NB_FALL_SOUND
LW G_T1WINFAA15,5
LW G_T1WINFAA16,5
LWL G_T1WINFAA18,5+60|AFunc,A_CLR_OZVEL
LWL 1,1|AFunc,A_DEL_NONBOY
FALLING_DEATH_ANIM4
LW G_T1WINFAA2,4
LW G_T1WINFAA3,4
LW G_T1WINFAA4,4
LW G_T1WINFAA5,2
LWLW 1,1|AFunc,A_OFFSETZ+1,-10
LWLWLW G_T1WINFAA7,4|AFunc,A_SET_JUMP+4,04000H,-060000H,-02A0H
LW G_T1WINFAA11,4
LW G_T1WINFAA12,5
LWL G_T1WINFAA13,5|AFunc,A_NB_FALL_SOUND
LW G_T1WINFAA15,5
LW G_T1WINFAA16,5
LWL G_T1WINFAA18,5+60|AFunc,A_CLR_OZVEL
LWL 1,1|AFunc,A_DEL_NONBOY
FALLING_DEATH_ANIM5
LWLW G_T1WINFAA2,4|AFunc,A_OFFSETZ+1,-3
LW G_T1WINFAA3,4
LW G_T1WINFAA4,4
LW G_T1WINFAA5,4
LW G_T1WINFAA7,3
LWLWW 1,1|AFunc,A_OFFSETYZ+2,10,-05DH
LW G_T1WINFAA11,1
LWLWW 1,1|AFunc,A_SEPERATE_NONBOY+2,04000H,-0300H
LWL 1,2|AFunc,A_START_X_DECEL
LW G_T1WINFAA12,5
LWL G_T1WINFAA13,5|AFunc,A_NB_FALL_SOUND
LW G_T1WINFAA15,5
LW G_T1WINFAA16,5
LWL G_T1WINFAA18,5+60|AFunc,A_CLR_OZVEL
LWL 1,1|AFunc,A_DEL_NONBOY
FALLING_DEATH_LEGS_ANIM5
LW 1,4
LW 1,4
LW 1,4
LW 1,4
LW G_T1BOTFAA7,3
LW 1,1
LWL 1,1|AFunc,DELETE_OBJ
LADDER_FALL_DEATH_ANIM
LW G_H5LADFALA4,1|AMulti
LW G_T5LADFALA4,1|AMulti
LW G_A5LADFALA4,1|AMulti
LWL G_Z5LADFALA4,8|AFunc,OBJ_ON
LWL G_H5LADFALA5,1|AMulti|AFunc,A_NB_FALL_SOUND
LW G_T5LADFALA5,1|AMulti
LW G_A5LADFALA5,1|AMulti
LW G_Z5LADFALA5,7
LWLWW G_H5LADFALA6,1|AMulti|AFunc,A_SET_FALL+2,04000H,-02A0H
LW G_T5LADFALA6,1|AMulti
LW G_A5LADFALA6,1|AMulti
LW G_Z5LADFALA6,20
LWL 1,1|AFunc,A_CLR_OZVEL
LADDER_FALL_DEATH_HANGTIME
LWLL 1,2|AFunc,A_CHECK_GROUND+2,LADDER_FALL_DEATH_HANGTIME
LW G_L5LADFALA8,1|AMulti
LW G_T5LADFALA8,1|AMulti
LWL 1,1|AMulti|AFunc,OBJ_OFF
LWL 1,60|AFunc,OBJ_OFF
LWL 1,1|AFunc,A_DEL_NONBOY
LADDER_FALL_DEATH_ANIM2
LW G_H5LADFALA4,1|AMulti
LW G_T5LADFALA4,1|AMulti
LW G_A5LADFALA4,1|AMulti
LWL G_Z5LADFALA4,7|AFunc,OBJ_ON
LWL G_H5LADFALA5,1|AMulti|AFunc,A_NB_FALL_SOUND
LW G_T5LADFALA5,1|AMulti
LW G_A5LADFALA5,1|AMulti
LW G_Z5LADFALA5,6
LWLWW G_H5LADFALA6,1|AMulti|AFunc,A_SET_FALL+2,04000H,0
LW G_T5LADFALA6,1|AMulti
LW G_A5LADFALA6,1|AMulti
LW G_Z5LADFALA6,1
LWLL 1,1|AFunc,A_AnimGo+2,LADDER_FALL_DEATH_HANGTIME
LADDER_FALL_DEATH_ANIM3
LW G_H5LADFALA4,1|AMulti
LW G_T5LADFALA4,1|AMulti
LW G_A5LADFALA4,1|AMulti
LWL G_Z5LADFALA4,7|AFunc,OBJ_ON
LWL G_H5LADFALA5,1|AMulti|AFunc,A_NB_FALL_SOUND
LW G_T5LADFALA5,1|AMulti
LW G_A5LADFALA5,1|AMulti
LW G_Z5LADFALA5,6
LWLWW G_H5LADFALA6,1|AMulti|AFunc,A_SET_FALL+2,04000H,0
LW G_T5LADFALA6,1|AMulti
LW G_A5LADFALA6,1|AMulti
LW G_Z5LADFALA6,1
LADDER_FALL_DEATH_HANGTIME3
LWLL 1,2|AFunc,A_CHECK_GROUND+2,LADDER_FALL_DEATH_HANGTIME3
LWL 1,1|AFunc,A_DEL_NONBOY
.IF AUSTRALIA
ANIM_NON_SBOMB_EXPLODE
LWLLL 1,1|AFunc,A_SBOMB_BLOOD+4,0,40000H
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_NON_EXP_NOBLOOD
NONBOY_EXPLODE_ANIM
LWLLL 1,1|AFunc,A_BLOOD_SPLORCH+4,0,0
LWL 1,3|AFunc,CLR_VEL
ANIM_NON_EXP_NOBLOOD
LWL 1,1|AFunc,DELETE_ENEMY
.ELSE
ANIM_NON_SBOMB_EXPLODE
LWLLL 1,1|AFunc,A_SBOMB_BLOOD+4,0,40000H
LWLL 1,1|AFunc,A_AnimGo+2,ANIM_NON_EXP_NOBLOOD
NONBOY_EXPLODE_ANIM
LWLLL 1,1|AFunc,A_BLOOD_SPLORCH+4,0,0
LWL 1,3|AFunc,CLR_VEL
ANIM_NON_EXP_NOBLOOD
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,NONBOY_PARTS_1,80h,60000h
LWLLLL 1,1|AFunc,A_PreFrag_Center+6,NONBOY_PARTS_2,500h,50000h
LWL 1,1|AFunc,DELETE_ENEMY
.ENDIF
**************************************************************************
* *
* Fragger Scripts *
* *
**************************************************************************
*
*NON-BOY blows up a little bit
*
NONBOY_PARTS_1
.long ARM_SPIN,N_CHUNK
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
.long LEG_SPIN,N_CHUNK
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
.long 0
*
*NON-BOY blows up some more
*
NONBOY_PARTS_2
.long ARM_SPIN,N_CHUNK
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
.long HEAD_SPIN,N_CHUNK
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
.long CHEST_SPIN,N_CHUNK
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
.long LEG_SPIN,N_CHUNK
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
.long 0
NONBOY_PARTS_TEST
.long ARM_SPIN,N_CHUNK
.word OID_JUNK,1*800H+1*40H+FRGPAL+FRGGCOL
.long 0
**************************************************************************
* *
* N_CHUNK - Frag Func for NON-Boy chunk. *
* A0 = Ptr to un-inserted object. *
* *
* Note: Frag funcs must preserve A8-A11 and all B-File regs. *
* *
**************************************************************************
N_CHUNK
SUBIM 28000H,*A0(OYVEL),L
MOVIM CHUNK_COLL,*A0(OCVECT),L ;Set up chunk with Vectors
RETS
**************************************************************************
* *
* CHUNK Collision Vector Table *
* *
* **** NOTE *** MANY OTHER CHUNKS WILL USE THIS TOO. *
* *
**************************************************************************
CHUNK_COLL
WWL OID_GRND,0FFFFH,CHUNK_GROUND_COLL
WL 0,DUMCRETS
**************************************************************************
* *
* CHUNK_GROUND_COLL - Collision routine for CHUNK. *
* A8 = Ptr Chunk Object *
* *
**************************************************************************
CHUNK_GROUND_COLL
MOVB *A8(OFLAGS),A14 ;Are we out of Range?
JRN CGC_DEL ;BR = Yes
MOVE *A8(OYVEL),A14,L
MOVE A14,A1
SRA 2,A14 ;Knock off 25% for the bounce.
SUB A14,A1
CMPI 14000H,A1 ;Have we hit the minimum?
JRLE CGC_DEL ;BR = Yes, delete the object.
CMPI 24000H,A1 ;Will it bounce too high?
JRLE CGC_BOUNCE ;BR = No, let it bounce.
MOVI 24000H,A1 ;Cap the rebound velocity
CGC_BOUNCE
NEG A1 ;Turn it up
MOVE A1,*A8(OYVEL),L
RETS
CGC_DEL
JAUC DELETE_OBJ
**************************************************************************
* *
* Fragment Animation Scripts - These are used by the Fragger Scripts *
* *
**************************************************************************
*
*NON-BOY arm spin animation
*
ARM_SPIN
LWLW VARM1,1|AFunc,A_INIT_AnimSLP+1,1
ARM_SPIN_LOOP
LW VARM2,0
LW VARM3,0
LW VARM4,0
LW VARM5,0
LW VARM6,0
LW VARM7,0
LW VARM8,0
LW VARM9,0
LW VARM10,0
LW VARM1,0
LW VARM2,0
LW VARM3,0
LW VARM4,0
LW VARM5,0
LW VARM6,0
LW VARM7,0
LW VARM8,0
LW VARM9,0
LWLW VARM10,0|AFunc,A_INC_AnimSLP+1,4
LWLL VARM1,0|AFunc,A_AnimFrm+2,ARM_SPIN_LOOP
*
*NON-BOY leg spin animation
*
LEG_SPIN
LWLW LEG1,1|AFunc,A_INIT_AnimSLP+1,3
LEG_SPIN_LOOP
LW LEG2,0
LW LEG3,0
LW LEG4,0
LW LEG5,0
LW LEG6,0
LW LEG7,0
LW LEG8,0
LW LEG1,0
LW LEG2,0
LW LEG3,0
LW LEG4,0
LW LEG5,0
LW LEG6,0
LW LEG7,0
LWLW LEG8,0|AFunc,A_INC_AnimSLP+1,8
LWLL LEG1,0|AFunc,A_AnimFrm+2,LEG_SPIN_LOOP
*
*NON-BOY head spin animation
*
HEAD_SPIN
LWLW NHEADL1,1|AFunc,A_INIT_AnimSLP+1,1
HEAD_SPIN_LOOP
LW NHEADL2,0
LW NHEADL3,0
LW NHEADL4,0
LW NHEADL5,0
LW NHEADL1,0
LW NHEADL2,0
LW NHEADL3,0
LW NHEADL4,0
LW NHEADL5,0
LW NHEADL1,0
LW NHEADL2,0
LW NHEADL3,0
LW NHEADL4,0
LWLW NHEADL5,0|AFunc,A_INC_AnimSLP+1,5
LWLL NHEADL1,0|AFunc,A_AnimFrm+2,HEAD_SPIN_LOOP
*
*NON-BOY chest spin animation
*
CHEST_SPIN
LWLW CREST1,1|AFunc,A_INIT_AnimSLP+1,1
CHEST_SPIN_LOOP
LW CREST2,0
LW CREST3,0
LW CREST4,0
LW CREST5,0
LW CREST1,0
LW CREST2,0
LW CREST3,0
LW CREST4,0
LWLW CREST5,0|AFunc,A_INC_AnimSLP+1,5
LWLL CREST1,0|AFunc,A_AnimFrm+2,CHEST_SPIN_LOOP
;DIAG_PBOY_ANIM:
; LW G_B2RUN__B1,3
; LW G_B2RUN__B2,3
; LW G_B2RUN__B3,3
; LW G_B2RUN__B4,3
; LW G_B2RUN__B5,3
; LW G_B2RUN__B6,3
; LW G_B2RUN__B7,3
; LW G_B2RUN__B8,3
; .long 0
WINJUN_ANIM
LWL G_B1POPCOP3,15|AFunc,A_CAN_I_POPUP
WINJUN_a:
LWLL 1,1|AFunc,A_CHECK_WINBOY+2,WINJUN_a
LWLWW 1,1|AFunc,A_RAND_AnimSLP+2,5,20
LW 1,0
WINJUN_SHOOT_ANIM
LW G_B1SHTCOP1,1
LWLWW 1,5|AFunc,A_PART_FIRE_FNC+2,-25,-83
LW G_B1SHTCOP2,6
LWLL 1,1|AFunc,A_CHECK_OETIME+2,WINJUN_SHOOT_ANIM
LW 1,3
LWLL G_B1POPCOP3,11|AFunc,A_SET_OYVEL+2,02B000H
LWL 1,90|AFunc,A_RESET_WINJUN
.long 0
*
* On my way down.
*
A_RESET_WINJUN:
MOVE *A8(OYSTART),A1,L
CALLA SET_ANIPYU ;CORRECT Y POSITION
CLR A14
MOVE A14,*A8(OYVEL),L ;STOP 'EM
move @NUM_OUT_THERE,a0
dec a0
move a0,@NUM_OUT_THERE
move *a8(OZVAL),a14,L
move @ZBASE,a0,L
sub a0,a14 ; world Z
cmpi ZMAX_REAL,a14
jalt DELETE_OBJ
rets
P_NONBOYO:
.word 64
.word 00100h,0737bh,07775h,06f5ah,06718h,066f3h,05ed6h,05692h
.word 0566fh,04e52h,04e2fh,045efh,045eeh,039adh,07e00h,07e00h
.word 07920h,07520h,06522h,06520h,07d00h,07de0h,075c5h,075c1h
.word 07dc0h,06981h,06980h,07d60h,07e44h,07e40h,06520h,074e0h
.word 070c0h,060c0h,054c0h,068a0h,054a0h,054a0h,05880h,06040h
.word 05440h,04040h,04440h,05820h,04020h,04420h,04800h,0356ah
.word 0316bh,04120h,02928h,02d24h,02902h,034e0h,030e0h,024e6h
.word 020e7h,020c5h,024a0h,01883h,01c60h,01063h,01041h,00400h
P_NONBOYR:
.word 64
.word 02000h,06f7ch,06ebdh,06b5bh,06319h,05e79h,05ad7h,05255h
.word 04df5h,04a53h,045f3h,03df1h,03dd1h,035aeh,06c06h,06c06h
.word 05006h,05006h,05004h,05004h,04c06h,06806h,06466h,06406h
.word 06406h,05c04h,05c04h,05806h,07446h,07406h,05004h,04806h
.word 04405h,04404h,04402h,04004h,04002h,04002h,03c03h,03404h
.word 03402h,03400h,03401h,03003h,03000h,03001h,02c01h,02d4dh
.word 02d6ch,04009h,0250ah,03004h,02803h,03402h,03002h,01cc9h
.word 01ce8h,020a6h,02400h,01800h,01c00h,00c64h,00824h,00001h
;**************************************************************************
;* *
;* AU_CREATE_JUMPBOY - CREATE THE ENEMY TO RUN OUT OF THE DOORWAY *
;* AND JUMP TO THE GROUND *
;* *
;* PASS: *
;* A8 = OBJECT *
;* AARG+,W = PERCENT CHANCE OF EXITING ENEMY *
;* AARG+,L = GENERATOR ANIMATION JUMP HERE UPON FAILURE *
;* *
;**************************************************************************
;
;AU_CREATE_JUMPBOY
; CALLA GETAFARG_WORD
;
; MOVE @OBJENEMIES,A14,W
; BTST B_DOOR,A14
; JRZ AU_CJ_ABORT ;BR=NOT ALLOWED
;
; CALLR CHECK_HOST_ANIM
; JRC AU_CJ_DONE ;BR=HOST ANIM OFF SCREEN
;
; MOVE @ENEMY_QUOTA,A14,W
; JRNZ AU_CJ_ABORT ;BR=QUOTA REACHED
;
;;DON'T TRASH A0
;; MOVI OID_NONBOY,A0
;; CALLA GET_ENEMY_COUNT
;; CMPI 10,A0
;; JRHS AU_CJ_ABORT ;BR=REACHED MAX NUMBER OF ENEMIES
;
; CALLA RANDPER
; JRNC AU_CD_DOORBOY ;BR=MAKE DOORBOY
;
; MOVE A8,A9
; MOVI LADDERBOY_INIT,B0 ;ALLOCATE OBJECT
; CALLA CREATE_ENEMY
; JRZ AU_CJ_ERROR ;BR = ERROR! ERROR!
;
; MOVE *A9(OXVAL),A1,L
; MOVE *A9(OYVAL),A2,L
; MOVE *A9(OZVAL),A3,L
; ADDK 5,A3 ;OFFSET Z IN BACK OF DOOR
; CALLA SET_ANIPU
;
; MOVI NB_SRUNVEL_MAX,A0 ;GET RANDOM SIDE RUNNING SPEED
; MOVI NB_SRUNVEL_MIN,A1
; CALLA RANGRAND
; MOVE A0,*A8(OSRUNVEL),L
;
; MOVI JUMPBOY_ANIM,A1
; CALLA STRT_ANIM ;START ANIMATION
; MOVI JUMPBOY_JUMP_ANIM,A14 ;LOOP ON SIDERUN
; MOVE A14,*A8(AnimScr),L
;
; MOVK 1,A14
; MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
;
; MOVK M_DOOR,A14
; MOVE A14,*A8(OEFLAGS),W ;ENEMY TYPE
;
; MOVE *A9(OCTRL),A0,W ;INVERT DOOR FLIP
; NOT A0
; ANDI M_FLIPH,A0
; CALLA SET_FLPS
;
; MOVI 127,A0 ;RANDOM LIFE TIME
; MOVI 60,A1
; CALLA RANGRAND
; MOVB A0,*A9(AnimSLP)
; ADDK 14,A0 ;ADD DOOR OPEN AND CLOSE TIME
;
; MOVE A0,A2
;; MOVI 59+10-12,A0 ;RANDOM INITIAL SLEEP TIME
;; MOVK 30,A1
;; CALLA RANGRAND
;; MOVB A0,*A8(AnimSlp)
;; SUB A0,A2
; MOVE A2,*A8(OETIME),W
;
; MOVK 4,A14
; MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
; MOVK 3,A1
; MOVK 10,A0
; CALLA RANGRAND
; MOVB A0,*A8(OSHOOTCNT) ;RANDOM SHOOT COUNT
;
; MOVI -20,A1
; CALLR SET_OGRNDOFF ;SET FOR FIRE ESCAPE
;
; CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
; RETS
;AU_CJ_ERROR
; MOVE A9,A8
;AU_CJ_ABORT
; CALLA GETAFARG_LONG ;COULDN'T MAKE BADGUY
; MOVE A0,*A8(AnimFrm),L ;OOPS!
;AU_CJ_DONE
; RETS
;**************************************************************************
;* *
;* AU_CREATE_RUNOUTBOY - CREATE THE ENEMY TO RUN OUT OF THE DOORWAY *
;* ONTO THE GROUND *
;* *
;* PASS: *
;* A8 = OBJECT *
;* AARG+,W = PERCENT CHANCE OF EXITING ENEMY *
;* AARG+,L = GENERATOR ANIMATION JUMP HERE UPON FAILURE *
;* *
;**************************************************************************
;
;AU_CREATE_RUNOUTBOY
; CALLA GETAFARG_WORD
;
; MOVE @OBJENEMIES,A14,W
; BTST B_DOOR,A14
; JRZ AU_CR_ABORT ;BR=NOT ALLOWED
;
; CALLR CHECK_HOST_ANIM
; JRC AU_CR_DONE ;BR=HOST ANIM OFF SCREEN
;
; MOVE @ENEMY_QUOTA,A14,W
; JRNZ AU_CR_ABORT ;BR=QUOTA REACHED
;
; MOVE @HOLD_ENEMY_DISPATCH,A14,W
; JRNZ AU_CR_ABORT ;BR=HOLD ON THERE
;
;;DON'T TRASH A0
;; MOVI OID_NONBOY,A0
;; CALLA GET_ENEMY_COUNT
;; CMPI 10,A0
;; JRHS AU_CR_ABORT ;BR=REACHED MAX NUMBER OF ENEMIES
;
; CALLA RANDPER
; JRNC AU_CD_DOORBOY ;BR=MAKE DOORBOY
;
; MOVE A8,A9
; MOVI LADDERBOY_INIT,B0 ;ALLOCATE OBJECT
; CALLA CREATE_ENEMY
; JRZ AU_CR_ERROR ;BR = ERROR! ERROR!
;
; MOVE *A9(OXVAL),A1,L
; MOVE *A9(OYVAL),A2,L
; MOVE *A9(OZVAL),A3,L
; ADDK 5,A3 ;OFFSET Z IN BACK OF DOOR
; CALLA SET_ANIPU
;
; MOVI RUNOUTBOY_CHECK,A14
; MOVE A14,*A8(OANIMCHK),L
;
; MOVI NB_SRUNVEL_MAX,A0 ;GET RANDOM SIDE RUNNING SPEED
; MOVI NB_SRUNVEL_MIN,A1
; CALLA RANGRAND
; MOVE A0,*A8(OSRUNVEL),L
;
; MOVI RUNOUTBOY_ANIM,A1
; CALLA STRT_ANIM ;START ANIMATION
;
; MOVK 1,A14
; MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
;
; MOVK M_DOOR,A14
; MOVE A14,*A8(OEFLAGS),W ;ENEMY TYPE
;
; MOVE *A9(OCTRL),A0,W ;INVERT DOOR FLIP
; NOT A0
; ANDI M_FLIPH,A0
; CALLA SET_FLPS
;
; MOVI 127,A0 ;RANDOM LIFE TIME
; MOVI 60,A1
; CALLA RANGRAND
; MOVB A0,*A9(AnimSLP)
; ADDK 14,A0 ;ADD DOOR OPEN AND CLOSE TIME
;
; MOVE A0,A2
;; MOVI 59+10-12,A0 ;RANDOM INITIAL SLEEP TIME
;; MOVK 30,A1
;; CALLA RANGRAND
;; MOVB A0,*A8(AnimSlp)
;; SUB A0,A2
; MOVE A2,*A8(OETIME),W
;
; MOVK 4,A14
; MOVB A14,*A8(OSCRNOFFCNT) ;TIMES ALLOWED OFF SCREEN
; MOVI 080H,A14
; MOVB A14,*A8(OSHOOTCNT) ;DISABLE SHOOTING
;
; CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
;
; RETS
;AU_CR_ERROR
; MOVE A9,A8
;AU_CR_ABORT
; CALLA GETAFARG_LONG ;COULDN'T MAKE BADGUY
; MOVE A0,*A8(AnimFrm),L ;OOPS!
;AU_CR_DONE
; RETS
;**************************************************************************
;* *
;* RUNOUTBOY_CHECK - CHECK IF RUNOUTBOY IS ON THE GROUND *
;* *
;* PASS: *
;* A8 = OBJECT *
;* *
;**************************************************************************
;
;RUNOUTBOY_CHECK
; MOVE *A8(OFLAGS),A14,W
; BTST B_GCOLL,A14
; JRNZ RC_DONE ;BR=NOT THE GROUND YET
; MOVK 3,A1
; MOVK 10,A0
; CALLA RANGRAND
; MOVB A0,*A8(OSHOOTCNT) ;RANDOM SHOOT COUNT
; MOVI NONBOY_HEAD_TO_SIDE_ANIM,A14 ;SET ANIMATIONS
; MOVE A14,*A8(AnimFrm),L
; MOVI NONBOY_SIDE_RUN_ANIM,A14
; MOVE A14,*A8(AnimScr),L
; CLR A14
; MOVB A14,*A8(AnimSlp) ;NO SLEEP TIL'
; MOVE A14,*A8(OANIMCHK),L ;NO CHECK TIL'
; MOVI M_SIDE,A14
; MOVE A14,*A8(OEFLAGS),W ;GO SIDEWAYS
;RC_DONE
; RETS
;**************************************************************************
;* *
;* A_SET_RUNOUTBOY - SET SUM RUNOUTBOY STUFF *
;* *
;* PASS: *
;* A8 = OBJECT *
;* *
;**************************************************************************
;
;A_SET_RUNOUTBOY
; MOVI NONBOY_CVECT,A14 ;NEW VECTORS
; MOVE A14,*A8(OCVECT),L
; MOVI NONBOY_GUNVECT,A14
; MOVE A14,*A8(OGUNVECT),L
;
; MOVI 010000H,A14 ;GOING DOWN
; MOVE A14,*A8(OYVEL),L
;
; MOVE *A8(OFLAGS),A14,W ;ENABLE GROUND CHECK
; ORI M_GCOLL,A14
; MOVE A14,*A8(OFLAGS),W
;
; MOVI NONBOY_HEADON_RUN_ANIM,A1 ;NICE HEAD!
; CALLA STRT_ANIM
;
; MOVI -010H,A0 ;OFFSET OUTSIDE THE DOOR
; JRUC OFFSETZ
;**************************************************************************
;* *
;* A_CREATE_HELIBOY - CREATE THE ENEMY IN THE HELICOPTER *
;* *
;* PASS: *
;* A8 = OBJECT *
;* AARG+,L = GENERATOR ANIMATION JUMP HERE UPON FAILURE *
;* *
;**************************************************************************
;
;A_CREATE_HELIBOY
; CALLR CHECK_HOST_ANIM
; JRC A_CH_ABORT ;BR=HOST ANIM OFF SCREEN
;
; MOVE @ENEMY_QUOTA,A14,W
; JRNZ A_CH_ABORT ;BR=QUOTA REACHED
;
;; MOVI OID_NONBOY,A0
;; CALLA GET_ENEMY_COUNT
;; CMPI 10,A0
;; JRHS A_CH_ABORT ;BR=REACHED MAX NUMBER OF ENEMIES
;
; MOVE A8,A9
; MOVI DOORBOY_INIT,B0 ;ALLOCATE OBJECT
; CALLA CREATE_ENEMY
; JRZ A_CH_ERROR ;BR = ERROR! ERROR!
;
; MOVI OUTCLUB_CVECT_PART,A14 ;RESET COLLISION VECTOR
; MOVE A14,*A8(OCVECT),L
; MOVI OUTCLUB_GUNVECT_PART,A14 ;RESET GUN VECTOR
; MOVE A14,*A8(OGUNVECT),L
;
; MOVI DOORBOY_ANIM,A1
; CALLA STRT_ANIM ;START ANIMATION
;
; MOVK 1,A14
; MOVB A14,*A8(OHITS) ;NUMBER OF ALLOWED HITS
;
; MOVK M_HELI,A14 ;HE WILL FALL OUT OF THE HELICOPTER
; MOVE A14,*A8(OEFLAGS),W ;ENEMY TYPE
;
; MOVE *A9(OCTRL),A0,W ;INVERT DOOR FLIP
; NOT A0
; ANDI M_FLIPH,A0
; MOVE *A8(OCTRL),A14,W
; OR A0,A14
; MOVE A14,*A8(OCTRL),W
;
; MOVE *A8(OFLAGS),A14,L ;SET OPARTSXY
; ORI M_OPARTSXY,A14
; MOVE A14,*A8(OFLAGS),L
;
; MOVI (67+10),A14
; BTST B_FLIPH,A0
; JRZ A_CH_NOFLIPH ;BR=WE'RE FLIPPING OUT!
; NEG A14
;A_CH_NOFLIPH
;
; ADDI (57+5) << 16,A14
; MOVE A14,*A8(OPARTSXY),L
; MOVK 2,A14
; MOVB A14,*A8(OZOFF)
;
; MOVE *A9(OXVAL),A1,L ;HELI'S X
; MOVE *A9(OYVAL),A2,L
; MOVE *A9(OZVAL),A3,L
; CALLA SET_ANIPU
;
; MOVI 127,A0 ;RANDOM LIFE TIME
; MOVI 60,A1
; CALLA RANGRAND
; MOVB A0,*A9(AnimSLP)
; ADDI 48,A0 ;ADD DOOR OPEN AND CLOSE TIME
;
; MOVE A0,A2
; MOVI 59+48-12,A0 ;RANDOM INITIAL SLEEP TIME
; MOVK 30,A1
; CALLA RANGRAND
; MOVB A0,*A8(AnimSlp)
; SUB A0,A2
; MOVE A2,*A8(OETIME),W
;
; MOVI -20 << 15,A14
; MOVE A14,*A8(OGRNDOFF),L ;SET GROUND OFFSET FOR FALL
;
; MOVE A8,A0
; MOVE A9,A8
; CALLA INSPART
; MOVE A0,A8
; CALLA INSERT_ENEMY ;INSERT AND COUNT ENEMY
;
; RETS
;A_CH_ERROR
; MOVE A9,A8
;A_CH_ABORT
; CALLA GETAFARG_LONG ;COULDN'T MAKE BADGUY
; MOVE A0,*A8(AnimFrm),L ;OOPS!
;A_CH_DONE
; RETS
.END