revolution-x/GXAFUNC.ASM

1582 lines
46 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 "GXAFUNC.ASM"
.TITLE "<<< GENERATION X --- GENERAL ANIMATION FUNCTIONS >>>"
.WIDTH 132
.OPTION B,D,L
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "GX.INC"
*SYMBOLS IN THIS FILE
.DEF SetAnim, A_Set_Rel_Long, A_Anim_Rel_DSJ, SetAnim_AFARG
.DEF A_RAND_REL_BYTE,A_STAY_TIL_SY_LT,A_Set_LOOP_STRT
.DEF A_BRANCH_IF_FALSE,A_CLR_OZVEL,A_STAY_TIL_GRND_HIT
.DEF A_INIT_AnimSLP_Var, A_INC_Var_Word, A_OBJ_OFF_CHANGE_PAL
.DEF A_SET_REL_LONG_HEAD, A_AnimFrm_DSJ, A_DELETE_ZBOT
.def A_OZVAL_DELTA,A_CLR_OYVEL,A_STAY_TIL_WY_GT
.DEF A_WAIT_FOR_QUOTA, AU_DANIM, A_BRANCH_IF_TRUE
.DEF A_SET_RANDSLP,A_ADJ_RANDSLP,A_SET_SCALE
.DEF A_AnimFrm_IF_TRUE, A_CREATEP_R, A_CREATEP_R8
.DEF A_STAY_TIL_OFFSCRN
.DEF A_AUDIT
*SYMBOLS IN GXENEMY.ASM
.REF DELETE_ENEMY
**** from GXD.ASM
.REF WORLD_GRNDOFF
.TEXT
**************************************************************************
* *
* A_AUDIT *
* *
* Anim func to click an audit counter. *
* *
* AARG+,W = Counter number *
* *
**************************************************************************
A_AUDIT
MOVE @GAME_STATE,A14,W
CMPI INAMODE,A14
JREQ AA_X ;No auditing during Attract mode
CALLA GETAFARG_WORD
JAUC AUD1
AA_X
RETS
**************************************************************************
* *
* Anim funcs for making Sounds *
* *
**************************************************************************
**************************************************************************
* *
* A_WAIT_FOR_QUOTA - WAIT FOR ENEMY_QUOTA TRUE, IF FALSE JUMP *
* *
* PASS: *
* A8 = OBJECT *
* AARG+,L = JUMP ADDRESS IF ENEMY_QUOTA FALSE *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_WAIT_FOR_QUOTA
MOVE @ENEMY_QUOTA,A14,W
JRZ AWFQ_JUMP ;BR=NO QUOTA
RETS
AWFQ_JUMP
CALLA GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L
RETS
**************************************************************************
* *
* A_DANIM - STOP A UNIVERSE ANIMATION AND SET IT TO RESTART ON AnimFrm *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
AU_DANIM
MOVE *A8(OULINK),A0,L
MOVE *A0(MAP_IMG),A1,L
SLL 28,A1 ;GET FLAGS
SRL 28,A1
MOVE *A8(AnimFrm),A14,L
OR A14,A1
ORI M_IF_DANIM,A1
MOVE A1,*A0(MAP_IMG),L
CALLA PULL_ANIM
RETS
**************************************************************************
* *
* A_DELETE_ZBOT - DELETE OBJECT IF OFF DA BOTTOM OF DA SCREEN OR OUT OF *
* Z RANGE, BEYOND ZFAR OR BEFORE ZMAX_REAL *
* *
* PASS: *
* A8 = OBJECT *
* RETURN: *
* NUTIN' *
* *
**************************************************************************
A_DELETE_ZBOT
MOVE *A8(OZVAL),A1,L
MOVE @ZBASE,A14,L
SUB A14,A1
MOVE @ZFAR,A14,L
CMP A14,A1
JAGT DELETE_OBJ ;BR=BEYOND ZFAR
CMPI ZMAX_REAL,A1
JALT DELETE_OBJ ;BR=BEFORE ZMAX_REAL
MOVE *A8(OYVEL),A14,L
JRN ADZ_ABORT ;BR=WE'RE MOVIN' ON UP
MOVE *A8(ODAGY),A1,W
MOVE @(SCRNBR+16),A14,W
CMP A14,A1
JAGT DELETE_OBJ ;BR=OFF DA BOTTOM
ADZ_ABORT
RETS
**************************************************************************
* *
* A_TOGGLE_OCTRL - TOGGLE BITS IN OCTRL *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* AARG+,W = BITS TO TOGGLE *
* *
**************************************************************************
A_TOGGLE_OCTRL
CALLA GETAFARG_WORD
MOVE *A8(OCTRL),A1,W
XOR A0,A1
MOVE A1,*A8(OCTRL),W
RETS
**************************************************************************
* *
* A_RAND_FLIP_OCTRL - FLIP BITS TO RANDOMLY SET IN OCTRL *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* AARG+,W = FLIP BITS TO CHANGE *
* *
**************************************************************************
A_RAND_FLIP_OCTRL
CALLA GETAFARG_WORD
MOVE *A8(OCTRL),A1,W
ANDN A0,A1
MOVE @RAND,A14,W
AND A14,A0
OR A0,A1
MOVE A1,*A8(OCTRL),W
RETS
**************************************************************************
* *
* A_SET_OCTRL - SET BITS IN OCTRL *
* *
* PASS: *
* A8 = PTR TO OBJECT *
* AARG+,W = BITS TO SET *
* *
**************************************************************************
A_SET_OCTRL
CALLA GETAFARG_WORD
MOVE *A8(OCTRL),A1,W
OR A0,A1
MOVE A1,*A8(OCTRL),W
RETS
**************************************************************************
* *
* A_SOUND - ANIM FUNC TO MAKE A SOUND CALL *
* A8 = PTR TO OBJECT *
* *A8(AnimFrm),L = PTR TO SOUND SCRIPT *
* NOTE: ANIM FUNCS DO NOT PUSH REGISTERS! *
* *
**************************************************************************
A_SOUND
CALLA GETAFARG_LONG
JAUC ONESND
**************************************************************************
* *
* A_SOUNDZ - ANIM FUNC TO MAKE A SOUND CALL BASED ON OBJECT Z *
* A8 = PTR TO OBJECT *
* *A8(AnimFrm),L = PTR TO SOUND SCRIPT *
* NOTE: ANIM FUNCS DO NOT PUSH REGISTERS! *
* *
**************************************************************************
A_SOUNDZ
CALLA GETAFARG_LONG
JAUC ONESND_Z
**************************************************************************
* *
* A_RAND_SOUNDZ *
* *
* Anim func to have a random chance to make a Z position *
* dependant sound. *
* *
* A8 = Ptr to object *
* AARG+,W = % chance of making sound *
* AARG+,L = Sound script *
* *
**************************************************************************
A_RAND_SOUNDZ
CALLA GETAFARG_WORD
CALLA RANDPER ;Do the % chance
JAC A_SOUNDZ ;BR = we hit it, do the sound
RETS
**************************************************************************
* *
* A_TAB_SOUNDZ *
* *
* Anim func to randomly pick from a table of sound calls *
* and make it as a Z position dependant sound. *
* *
* A8 = Ptr to object *
* AARG+,L = Table of sound calls *
* AARG+,W = # of sound calls in table *
* *
**************************************************************************
A_TAB_SOUNDZ
CALLA GETAFARG_LONG
MOVE A0,A1
CALLA GETAFARG_WORD
CALLA RAND0
SLL 5,A0
ADD A0,A1
MOVE *A1,A0,L
JAUC ONESND_Z
**************************************************************************
* *
* A_PLAYER_SND - ANIM FUNC TO FIRE OFF A SOUND FOR A PARTICULAR *
* PLAYER. *
* AARG+,L = PTR TO SOUND TABLE *
* *
**************************************************************************
A_PLAYER_SND
CALLA GETAFARG_LONG
JAUC PLAYER_SND
**************************************************************************
* *
* A_PLAYER_SND_Z *
* *
* Anim func to call PLAYER_SND_Z. *
* *
* AARG+,L = Ptr to sound script *
* *
**************************************************************************
A_PLAYER_SND_Z
CALLA GETAFARG_LONG
JAUC PLAYER_SND_Z
**************************************************************************
* *
* A_BRANCH_IF_FALSE *
* *
* Anim func to branch animation if a given byte value *
* is false. *
* *
* AARG+,L = Address of byte value *
* AARG+,L = Branch *
* *
**************************************************************************
A_BRANCH_IF_FALSE
CALLA GETAFARG_LONG ;Get the ptr
MOVB *A0,A14 ;Is it false?
JAZ SetAnim_AFARG ;BR = Yes
RETS
**************************************************************************
* *
* A_BRANCH_IF_TRUE *
* *
* Anim func to branch animation if a given byte value *
* is TRUE. *
* *
* AARG+,L = Address of byte value *
* AARG+,L = Branch *
* *
**************************************************************************
A_BRANCH_IF_TRUE
CALLA GETAFARG_LONG ;Get the ptr
MOVB *A0,A14 ;Is it TRUE?
JANZ SetAnim_AFARG ;BR = Yes
RETS
**************************************************************************
* *
* A_AnimFrm_IF_TRUE *
* *
* Anim func go to AnimFrm animation if a given byte value *
* is TRUE. *
* *
* AARG+,L = Address of byte value *
* AARG+,L = Branch *
* *
**************************************************************************
A_AnimFrm_IF_TRUE
CALLA GETAFARG_LONG ;Get the ptr
MOVB *A0,A14 ;Is it TRUE?
JRZ AAIF_DONE ;BR = NO
CALLA GETAFARG_LONG ;GET NEW AnimFrm
MOVE A0,*A8(AnimFrm),L
AAIF_DONE
RETS
**************************************************************************
* *
* A_GOSUB - JUMP TO SUBROUTINE *
* NOTE: SUBROUTINES CANNOT BE NESTED! *
* *
* A8 = Ptr to object *
* AARG+,L = SUBROUTINE ADDRESS *
* *
**************************************************************************
A_GOSUB
MOVE *A8(AnimScr),*A8(AnimRetScr),L
MOVE *A8(AnimFrm),*A8(AnimRetFrm),L
JAUC A_AnimGo
**************************************************************************
* *
* A_RETURN - RETURN FROM SUBROUTINE *
* *
* A8 = Ptr to object *
* *
**************************************************************************
A_RETURN
MOVE *A8(AnimRetScr),*A8(AnimScr),L
MOVE *A8(AnimRetFrm),*A8(AnimFrm),L
RETS
**************************************************************************
* *
* A_CREATEP *
* *
* Anim func to Create a process. *
* *
* AARG+,W = Process I.D. *
* AARG+,L = Process Address *
* A8 - A11 are passed to the process *
* *
**************************************************************************
A_CREATEP
CALLA GETAFARG_WORD
MOVE A0,A1
CALLA GETAFARG_LONG
MOVE A0,A7
JAUC GETPRC
**************************************************************************
* *
* A_CREATEP_R *
* *
* Anim func to Create a process and send some registers. *
* *
* A8 = Object creating process, passed to new process. *
* *
* AARG+,W = Process I.D. *
* AARG+,L = Process Address *
* AARG+,L = A9 *
* AARG+,L = A10 *
* AARG+,L = A11 *
* *
**************************************************************************
A_CREATEP_R
CALLA GETAFARG_WORD
MOVE A0,A1
CALLA GETAFARG_LONG
MOVE A0,A7
CALLA GETAFARG_LONG
MOVE A0,A9
CALLA GETAFARG_LONG
MOVE A0,A10
CALLA GETAFARG_LONG
MOVE A0,A11
JAUC GETPRC
**************************************************************************
* *
* A_CREATEP_R8 *
* *
* Anim func to Create a process and send some registers. *
* *
* A8 = Object creating process, passed to new process. *
* *
* AARG+,W = Process I.D. *
* AARG+,L = Process Address *
* AARG+,L = A8 *
* AARG+,L = A9 *
* AARG+,L = A10 *
* AARG+,L = A11 *
* *
**************************************************************************
A_CREATEP_R8
CALLA GETAFARG_WORD
MOVE A0,A1
CALLA GETAFARG_LONG
MOVE A0,A7
CALLA GETAFARG_LONG
MOVE A0,A8
CALLA GETAFARG_LONG
MOVE A0,A9
CALLA GETAFARG_LONG
MOVE A0,A10
CALLA GETAFARG_LONG
MOVE A0,A11
JAUC GETPRC
**************************************************************************
* *
* A_Set_AnimLoop - Anim func to initialize the Animation Loop count. *
* A8 = Ptr to object *
* AARG+,W = Initial value *
* *
**************************************************************************
A_Set_AnimLoop
calla GETAFARG_WORD
movb A0,*A8(AnimLoop)
rets
**************************************************************************
* *
* A_Anim_DSJ - Anim func to decrement AnimLoop count and branch *
* if not 0. *
* A8 = Ptr to object *
* AARG+,L = Branch if AnimLoop <> 0 *
* *
**************************************************************************
A_Anim_DSJ
movb *A8(AnimLoop),A14
dec A14
movb A14,*A8(AnimLoop)
jrz AAD_X
calla GETAFARG_LONG
move A0,A1
jauc SetAnim
AAD_X
rets
**************************************************************************
* *
* A_AnimFrm_DSJ - Anim func to decrement AnimLoop count and branch *
* if not 0. THIS DOES NOT TRASH AnimScr! *
* A8 = Ptr to object *
* AARG+,L = Branch if AnimLoop <> 0 *
* *
**************************************************************************
A_AnimFrm_DSJ
movb *A8(AnimLoop),A14
dec A14
movb A14,*A8(AnimLoop)
jrz AAFD_X
calla GETAFARG_LONG
MOVE A0,*A8(AnimFrm),L
AAFD_X
rets
**************************************************************************
* *
* A_Anim_Rel_DSJ *
* *
* Anim func to decrement a byte sized variable relative to the *
* beginning of the object, and branches the animation if not 0. *
* *
* A8 = Ptr to object *
* AARG+,W = Relative offset of byte loop counter *
* AARG+,L = Branch if loop counter <> 0 *
* *
**************************************************************************
A_Anim_Rel_DSJ
CALLA GETAFARG_WORD ;Get the offset
MOVE A8,A1
ADD A0,A1 ;And index into the object
MOVB *A1,A14
DEC A14 ;Decrement the loop counter
MOVB A14,*A1
JRZ AARD_X ;BR = loop counter = 0
CALLA GETAFARG_LONG ;Grab the branch address
MOVE A0,A1
JAUC SetAnim ;And stuff it
AARD_X
RETS
**************************************************************************
* *
* A_Set_Rel_Byte - Anim func to set a given byte relative to the current *
* object to a given value. *
* *
* AARG+,W = Offset in to object *
* AARG+,W = Value to store *
* *
**************************************************************************
A_Set_Rel_Byte
CALLA GETAFARG_WORD ;Get the offset
MOVE A8,A1
ADD A0,A1 ;And index into the object
CALLA GETAFARG_WORD ;Get the value
MOVB A0,*A1 ;And store it
RETS
**************************************************************************
* *
* A_Set_Rel_Byte_Head *
* *
* Anim func to set a given byte in the head object of a *
* multi-parter that is relative to the beginning of the *
* object block. *
* *
* A8 = Ptr to any object in a multi-parter *
* AARG+,W = Offset in to object *
* AARG+,W = Value to store *
* *
**************************************************************************
A_Set_Rel_Byte_Head
CALLA GETAFARG_WORD ;Get the offset
MOVE A0,A1 ;Save it here
CALLA GETAFARG_WORD ;Get the value to store
CALLA GET_HEAD_PART ;Grab the head part
ADD A8,A1 ;Offset into object block
MOVB A0,*A1 ;And store value
RETS
**************************************************************************
* *
* A_RAND_REL_BYTE *
* *
* Anim func to set a given byte relative to the current object *
* to a random value in the given range. *
* *
* A8 = Ptr to object *
* AARG+,W = Lower bound of random value *
* AARG+,W = Upper bound of random value *
* AARG+,W = Offset into object *
* *
**************************************************************************
A_RAND_REL_BYTE
CALLA GETAFARG_LONG ;Get the random values
MOVY A0,A1
SRA 16,A1 ;Split 'em up
ZEXT A0
CALLA RANGERND ;And make it into something
MOVE A0,A2
CALLA GETAFARG_WORD ;Get the offset
ADD A8,A0
MOVB A2,*A0
RETS
**************************************************************************
* *
* A_Set_Rel_Word - Anim func to set a given word relative to the current *
* object to a given value. *
* *
* AARG+,W = Offset in to object *
* AARG+,W = Value to store *
* *
**************************************************************************
A_Set_Rel_Word
CALLA GETAFARG_WORD ;Get the offset
MOVE A8,A1
ADD A0,A1 ;And index into the object
CALLA GETAFARG_WORD ;Get the value
MOVE A0,*A1,W ;And store it
RETS
**************************************************************************
* *
* A_Set_Rel_Word_Head *
* *
* Anim func to set a given Word in the head object of a *
* multi-parter that is relative to the beginning of the *
* object block. *
* *
* A8 = Ptr to any object in a multi-parter *
* AARG+,W = Offset in to object *
* AARG+,W = Value to store *
* *
**************************************************************************
A_Set_Rel_Word_Head
CALLA GETAFARG_WORD ;Get the offset
MOVE A0,A1 ;Save it here
CALLA GETAFARG_WORD ;Get the value to store
CALLA GET_HEAD_PART ;Grab the head part
ADD A8,A1 ;Offset into object block
MOVE A0,*A1,W ;And store value
RETS
**************************************************************************
* *
* A_Set_Rel_Long - Anim func to set a given long word relative to the *
* current object to a given value. *
* *
* AARG+,W = Offset in to object *
* AARG+,L = Value to store *
* *
**************************************************************************
A_Set_Rel_Long
CALLA GETAFARG_WORD ;Get the offset
MOVE A8,A1
ADD A0,A1 ;And index into the object
CALLA GETAFARG_LONG ;Get the value
MOVE A0,*A1,L ;And store it
RETS
**************************************************************************
* *
* A_SET_REL_LONG_HEAD *
* *
* Anim func to set a given Long in the head object of a *
* multi-parter that is relative to the beginning of the *
* object block. *
* *
* A8 = Ptr to any object in a multi-parter *
* AARG+,W = Offset in to object *
* AARG+,L = Value to store *
* *
**************************************************************************
A_SET_REL_LONG_HEAD
CALLA GETAFARG_WORD ;Get the offset
MOVE A0,A1
CALLA GETAFARG_LONG ;Get the value
CALLA GET_HEAD_PART
ADD A8,A1 ;Offset into object block
MOVE A0,*A1,L ;And store it
RETS
**************************************************************************
* *
* A_Set_Var_Byte - Anim func to set a given variable of byte length *
* to a given value. *
* AARG+,L = Address of variable *
* AARG+,W = Value to store *
* *
**************************************************************************
A_Set_Var_Byte
calla GETAFARG_LONG
move A0,A1
calla GETAFARG_WORD
movb A0,*A1
rets
**************************************************************************
* *
* A_Set_Var_Word - Anim func to set a given variable of word length *
* to a given value. *
* AARG+,L = Address of variable *
* AARG+,W = Value to store *
* *
**************************************************************************
A_Set_Var_Word
calla GETAFARG_LONG
move A0,A1
calla GETAFARG_WORD
move A0,*A1,W
rets
**************************************************************************
* *
* A_RAND_FLIP - ANIM FUNC TO SET THE FLIPS OF AN OBJECT RANDOMLY. *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_RAND_FLIP
MOVE @RAND,A0,W
ANDI M_FLIPH|M_FLIPV,A0 ;ISOLATE FLIP BITS ONLY
JAUC SET_FLIP
**************************************************************************
* *
* A_RAND_HFLIP - ANIM FUNC TO SET THE HFLIP OF AN OBJECT RANDOMLY. *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_RAND_HFLIP
MOVE @RAND,A0,W
ANDI M_FLIPH,A0 ;ISOLATE FLIP BITS ONLY
JAUC SET_FLIP
**************************************************************************
* *
* A_SET_OYACCEL - ANIM FUNC TO SET THE OYACCEL FIELD OF AN OBJECT. *
* A8 = OBJECT *
* AARG+,W = NEW YACCEL *
* *
**************************************************************************
A_SET_OYACCEL
CALLA GETAFARG_WORD
MOVE A0,*A8(OYACCEL),W
RETS
**************************************************************************
* *
* A_OBJ_ON_CHANGE_PAL - ANIM FUNC THAT DOES JUST WHAT IT SAYS. *
* A8 = OBJECT *
* AARG+,L = NEW PALETTE *
* *
**************************************************************************
A_OBJ_ON_CHANGE_PAL
CALLA OBJ_ON
JAUC A_CHANGE_PAL
**************************************************************************
* *
* A_OBJ_OFF_CHANGE_PAL *
* *
* Anim func to turn object off and change it's palette. *
* *
* A8 = Ptr to object *
* AARG+,L = New palette address *
* *
**************************************************************************
A_OBJ_OFF_CHANGE_PAL
CALLA OBJ_OFF
JAUC A_CHANGE_PAL
**************************************************************************
* *
* A_FLIP_BRANCH - ANIM FUNC TO BRANCH IF OBJECT IS FLIPPED. *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_FLIP_BRANCH
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JREQ AFB_X
SetAnim_AFARG
CALLA GETAFARG_LONG
MOVE A0,A1
SetAnim
MOVE A1,*A8(AnimFrm),L
MOVE A1,*A8(AnimScr),L
AFB_X
RETS
**************************************************************************
* *
* A_PreFrag_Center - ANIM FUNC TO START A FRAGGER SHOW USING *
* PreFrag_Center. *
* AARG+,L = FRAGGER SCRIPT *
* AARG+,L = 16.16 Z Absolute Max Velocity *
* AARG+,L = 16.16 X and Y Absolute Max Velocity *
* *
**************************************************************************
A_PreFrag_Center
calla GETAFARG_LONG ;Get the script
move A0,A1 ;Keep it here
calla GETAFARG_LONG ;Get the Z velocity
move A0,A3 ;Pass it here
calla GETAFARG_LONG ;Get the X and Y velocity
calla PreFrag_Center ;BLOW RANDOMLY OUT OR UP
move A1,B14 ;Right place at the right time
CALLA Fragger ;And get it goin' Boy
MOVE A8,*A0(FPDATA),L ;Pass pointer to parent
RETS
**************************************************************************
* *
* A_PreFrag_Box - ANIM FUNC TO START A FRAGGER SHOW USING *
* PreFrag_Box. *
* AARG+,L = FRAGGER SCRIPT *
* AARG+,L = 16.16 Z Absolute Max Velocity *
* AARG+,L = 16.16 X and Y Absolute Max Velocity *
* *
**************************************************************************
A_PreFrag_Box
calla GETAFARG_LONG ;Get the script
move A0,A1 ;Keep it here
calla GETAFARG_LONG ;Get the Z velocity
move A0,A3 ;Pass it here
calla GETAFARG_LONG ;Get the X and Y velocity
calla PreFrag_Box ;BLOW RANDOMLY OUT OR UP
move A1,B14 ;Right place at the right time
CALLA Fragger ;And get it goin' Boy
MOVE A8,*A0(FPDATA),L ;Pass pointer to parent
RETS
**************************************************************************
* *
* A_PreFrag_Gun - ANIM FUNC TO START A FRAGGER SHOW USING PreFrag_Gun *
* *
* *A8(OPLAYER),L = Ptr to player, if zero, no fragments are made. *
* AARG+,L = FRAGGER SCRIPT *
* AARG+,L = 16.16 Z Absolute Max Velocity *
* AARG+,L = 16.16 X and Y Absolute Max Velocity *
* *
**************************************************************************
A_PreFrag_Gun
move *A8(OPLAYER),A2,L ;Get the players data area
jrnz APG_Go ;BR = It's valid
rets
APG_Go
calla GETAFARG_LONG ;Get the script
move A0,A1 ;Keep it here
calla GETAFARG_LONG ;Get the box
move A0,A4 ;Pass it here
calla GETAFARG_LONG ;Get the Z velocity
move A0,A3 ;Pass it here
calla GETAFARG_LONG ;Get the X and Y velocity
calla PreFrag_Gun ;BLOW RANDOMLY OUT OR UP
move A1,B14 ;Right place at the right time
JAUC Fragger ;And get it goin' Boy
**************************************************************************
* *
* A_PreFrag_Rain - ANIM FUNC TO START A FRAGGER SHOW USING PreFrag_Rain *
* *
* *A8(OPLAYER),L = Ptr to player, if zero, no fragments are made. *
* AARG+,L = FRAGGER SCRIPT *
* AARG+,L = 16.16 Z Absolute Max Velocity *
* AARG+,L = 16.16 X and Y Absolute Max Velocity *
* *
**************************************************************************
A_PreFrag_Rain
calla GETAFARG_LONG ;Get the script
move A0,A1 ;Keep it here
calla GETAFARG_LONG ;Get the Z velocity
move A0,A3 ;Pass it here
calla GETAFARG_LONG ;Get the X and Y velocity
calla PreFrag_Rain ;BLOW RANDOMLY OUT OR UP
move A1,B14 ;Right place at the right time
JAUC Fragger ;And get it goin' Boy
**************************************************************************
* *
* A_PRINT_SCORE - ANIM FUNC TO SHOW A SCORE UPON A GIVEN OBJECT. *
* AND THEN AWARD THAT SCORE. *
* A8 = PTR TO OBJECT *
* *A8(OPLAYER),L = PLAYER GETTING SCORE *
* AARG+,L = SCORE *
* *
**************************************************************************
A_PRINT_SCORE
CALLA GETAFARG_LONG
MOVE A0,A1
MOVE *A8(OPLAYER),A2,L
JAUC PRINT_SCORE
**************************************************************************
* *
* A_RAND_AnimSLP - ANIM FUNC TO SET A RANDOM AnimSLP VALUE IN THE *
* GIVEN RANGE *
* A8 = OBJECT TO SET *
* AARG+,W = LOWEST SLEEP *
* AARG+,W = HIGHEST SLEEP *
* *
**************************************************************************
A_RAND_AnimSLP
CALLA GETAFARG_LONG
MOVY A0,A1
SRA 16,A1
ZEXT A0
CALLA RANGERND
MOVB A0,*A8(AnimSLP)
RETS
**************************************************************************
* *
* A_SET_RANDSLP - ANIM FUNC TO SET parameters in ODATA for ADJUSTABLE *
* RANDOM SLEEPING *
* A8 = OBJECT TO SET *
* AARG+,W = LOWEST START SLEEP *
* AARG+,W = HIGHEST START SLEEP *
* AARG+,W = LOWEST END SLEEP *
* AARG+,W = HIGHEST END SLEEP *
* AARG+,W = DELTA EACH SLEEP *
* AARG+,W = DELTA EACH SLEEP *
* *
**************************************************************************
A_SET_RANDSLP
CALLA GETAFARG_LONG
move a0,*a8(ODATA+40h),L
CALLA GETAFARG_LONG
move a0,*a8(ODATA+60h),L
CALLA GETAFARG_LONG
move a0,*a8(ODATA+80h),L
RETS
A_ADJ_RANDSLP
move *a8(ODATA+40h),a1
move *a8(ODATA+50h),a0
move a0,a2
calla RANGERND
movb a0,*a8(AnimSLP)
move a8,a6
addi ODATA+40h,a6
callr AdjRandSlp ; adjust min sleep
move a1,*a6 ; new min stored
move a2,a1
addk 16,a6
callr AdjRandSlp ; adjust max sleep
move a1,*a6 ; new max stored
rets
*
* a6 = ptr to current value
* a6(20h) = final value
* a6(40h) = delta
* a1 = current value
*
AdjRandSlp:
move *a6(20h),a4 ; limit
move *a6(40h),a5 ; delta
jrn ARSnegdelt
add a5,a1
cmp a4,a1
jrle newok
jruc newng
ARSnegdelt:
add a5,a1
cmp a4,a1
jrge newok
newng:
move a4,a1 ; use min
newok:
rets
**************************************************************************
* *
* A_SET_OZVEL - ANIM FUNC TO SET THE OZVEL FIELD OF AN OBJECT. *
* A8 = PTR TO OBJECT *
* AARG+,L = NEW OZVEL *
* *
* A_CLR_OZVEL - ANIM FUNC TO CLR THE OZVEL FIELD OF AN OBJECT. *
* A8 = PTR TO OBJECT *
* NO ARGUMENT *
* *
**************************************************************************
A_SET_OZVEL
CALLA GETAFARG_LONG
MOVE A8,A7
CALLA GET_HEAD_PART
MOVE A0,*A8(OZVEL),L
RETS
A_CLR_OZVEL
CALLA GET_HEAD_PART
CLRM *A8(OZVEL),L
RETS
**************************************************************************
* *
* A_SET_OXVEL - ANIM FUNC TO SET THE X VELOCITY OF AN OBJECT. IF *
* OBJECT IS FLIPPED, THE VALUE IS NEGATED. *
* A8 = PTR TO OBJECT *
* AARG+,L = OXVEL *
* *
**************************************************************************
A_SET_OXVEL
CALLA GETAFARG_LONG
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ ASO_NOW
NEG A0
ASO_NOW
MOVE A0,*A8(OXVEL),L
RETS
**************************************************************************
* *
* A_CLR_OXVEL - ANIM FUNC TO CLR THE OXVEL FIELD OF AN OBJECT. *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_CLR_OXVEL
CALLA GET_HEAD_PART
CLRM *A8(OXVEL),L
RETS
**************************************************************************
* *
* A_SET_OYVEL - ANIM FUNC TO SET THE Y VELOCITY OF AN OBJECT. IF *
* OBJECT IS FLIPPED, THE VALUE IS NEGATED. *
* A8 = PTR TO OBJECT *
* AARG+,L = OYVEL *
* *
**************************************************************************
A_SET_OYVEL
CALLA GETAFARG_LONG
MOVE *A8(OCTRL),A14,W
BTST B_FLIPV,A14
JRZ ASOY_NOW
NEG A0
ASOY_NOW
MOVE A0,*A8(OYVEL),L
RETS
A_CLR_OYVEL
CALLA GET_HEAD_PART
CLRM *A8(OYVEL),L
RETS
**************************************************************************
* *
* A_STRT_ANIM - ANIM FUNC TO START ANOTHER ANIMATION. *
* A8 = PTR TO OBJECT TO START *
* AARG+,L = PTR TO ANIM SCRIPT *
* *
**************************************************************************
A_STRT_ANIM
CALLA GETAFARG_LONG
MOVE A0,A1
JAUC STRT_ANIM
**************************************************************************
* *
* A_TOGGLE_FLPS - ANIM FUNC TO TOGGLE THE GIVEN FLIP BITS. *
* A8 = PTR TO OBJECT. *
* AARG+,W = FLIP BITS TO TOGGLE *
* *
**************************************************************************
A_TOGGLE_FLPS
CALLA GETAFARG_WORD
JAUC TOGGLE_FLPS
**************************************************************************
* *
* A_TOGGLE_FLIP - ANIM FUNC TO TOGGLE THE GIVEN FLIP BITS OF A *
* SINGLE OBJECT. *
* A8 = PTR TO OBJECT *
* AARG+,W = FLIP BITS TO TOGGLE *
* *
**************************************************************************
A_TOGGLE_FLIP
CALLA GETAFARG_WORD
JAUC TOGGLE_FLIP
**************************************************************************
* *
* A_DEL_DAMAGE - ANIM FUNC TO DELETE THE DAMAGE FOR A GIVEN PART. *
* A8 = PTR TO PART *
* AARG+,W = OID OF DAMAGE *
* *
**************************************************************************
A_DEL_OID_DAMAGE
;I DID THIS SO ROUTINE CAN ALSO BE CALLED BY NON-ANI ROUTINES
MMTM SP,A0,A1,A6,A8
movi OID_DAMAGE,A0
CALLR GotDamId
MMFM SP,A0,A1,A6,A8
RETS
A_DEL_DAMAGE
CALLA GETAFARG_WORD
GotDamId
MOVB *A8(OPARTID),A1
CALLA GET_HEAD_PART
ADD_LP
MOVE *A8(OID),A14,W
CMP A0,A14
JRNE ADD_NXT
MOVB *A8(DAMAGE_PARTID),A14
CMP A1,A14
JRNE ADD_NXT
MOVE *A8(OPARTS),A6,L
CALLA DELETE_OBJ
MOVE A6,A8
JRNZ ADD_LP
RETS
ADD_NXT
MOVE *A8(OPARTS),A8,L
JRNZ ADD_LP
RETS
**************************************************************************
* *
* A_OFF_DELETE_OBJ - ANIM FUNC TO SIMPLY DELETE AN OBJECT IF IT *
* IS OFF SCREEN. *
* A8 = PTR TO OBJECT. *
* *
**************************************************************************
A_OFF_DELETE_OBJ
CALLA GET_HEAD_PART
CALLA SCRTST
JANE DELETE_OBJ
RETS
**************************************************************************
* *
* A_OFF_KILL_OBJ - ANIM FUNC TO DELETE AN OBJECT and KILL ANY PROC IT IS *
* LINKED TO IF IT IS OFF SCREEN. *
* A8 = PTR TO OBJECT. *
* *
**************************************************************************
A_OFF_KILL_OBJ
CALLA SCRTST
JRZ nokill
calla DELETE_OBJ_PROC
nokill:
RETS
**************************************************************************
* *
* A_ONSCREEN *
* *
* Anim func to branch animation script if object is currently *
* ON screen. Uses the B_OFSCRN bit set by VELADD. *
* *
* NOTE: This should be changed so that if calling with the *
* master part, the check is done over all parts. *
* *
* A8 = Ptr to object. *
* AARG+,L = Animation branch address *
* *
**************************************************************************
A_ONSCREEN
CALLA GETAFARG_LONG
MOVB *A8(OFLAGS),A14 ;Are we onscreen?
JRN AO_NOBRANCH ;BR = No
; CALLA SCRTST
; JRNE AO_NOBRANCH
MOVE A0,A1
JAUC STRT_ANIM
AO_NOBRANCH
RETS
**************************************************************************
* *
* A_OFFSCREEN *
* *
* Anim func to branch animation script if object is currently *
* OFF screen. Uses the B_OFSCRN bit set by VELADD. *
* *
* NOTE: This should be changed so that if calling with the *
* master part, the check is done over all parts. *
* *
* A8 = Ptr to object. *
* AARG+,L = Animation branch address *
* *
**************************************************************************
A_OFFSCREEN
CALLA GETAFARG_LONG
; MOVB *A8(OFLAGS),A14 ;Are we offscreen?
; JRNN AOFF_NOBRANCH ;BR = No
CALLA SCRTST
JREQ AOFF_NOBRANCH ;BR = Not offscreen
MOVE A0,A1
JAUC STRT_ANIM
AOFF_NOBRANCH
RETS
**************************************************************************
* *
* A_INIT_AnimSLP - Anim Func to initialize the AnimSLP field of *
* a given object. *
* A8 = Ptr to Object *
* AARG+,W = Initial Value *
* *
**************************************************************************
A_INIT_AnimSLP
CALLA GETAFARG_WORD
MOVB A0,*A8(AnimSLP)
RETS
**************************************************************************
* *
* A_INIT_AnimSLP_Var - Anim Func to initialize the AnimSLP field of *
* a given object with the contents of a RAM word. *
* A8 = Ptr to Object *
* AARG+,L = Word containing AnimSLP *
* *
**************************************************************************
A_INIT_AnimSLP_Var:
CALLA GETAFARG_LONG
move *a0,a0
andi 7fh,a0
jrnz val_ok
inc a0 ; make sure it's not 0
val_ok:
MOVB A0,*A8(AnimSLP)
RETS
**************************************************************************
* *
* A_INC_AnimSLP - ANIM FUNC TO INCREMENT THE AnimSLP FIELD OF *
* A GIVEN OBJECT BY 1. *
* A8 = PTR TO OBJECT *
* AARG+,W = MAX AnimSLP VALUE *
* *
**************************************************************************
A_INC_AnimSLP
CALLA GETAFARG_WORD
MOVB *A8(AnimSLP),A14
INC A14
CMP A0,A14
JRLS AIA_STUFF
MOVE A0,A14
AIA_STUFF
MOVB A14,*A8(AnimSLP)
RETS
**************************************************************************
* *
* A_OFFOPP - ANIM FUNC TO BRANCH IF OBJECT IS OFF OF THE OPPOSITE *
* SIDE OF THE SCREEN. *
* A8 = PTR TO ANY PART. *
* AARG+,L = BRANCH *
* *
**************************************************************************
A_OFFOPP
CALLA GETAFARG_LONG ;GET THE BRANCH FIRST JUST IN CASE
MOVE A0,A1
CALLA GET_HEAD_PART
CALLA SCRTST ;OFF SCREEN YET?
JREQ AOO_X ;BR = NO
MOVE @SCRNTL+16,A2,W
MOVI M_FLIPH,A0
MOVE *A8(OCTRL),A4,W
MOVE *A8(ODAG),A3,W
CMP A2,A3
JRLT AOO_LEFT
*HE'S OFF THE RIGHT SIDE OF THE SCREEN NOW.
BTST B_FLIPH,A4 ;IS HE FACING LEFT?
JRZ SetAnim ;BR = NO, THEN HE'S OPPOSITE
RETS
*HE'S OFF THE LEFT SIDE OF THE SCREEN NOW.
AOO_LEFT
BTST B_FLIPH,A4 ;IS HE FACING RIGHT?
JRNZ SetAnim ;BR = NO
AOO_X
RETS
**************************************************************************
* *
* USE DEL ROUTINES FOR ENEMIES ONLY, THEY WILL TRY TO DEC *
* ENEMY COUNTS WHEN DELETING. *
* *
**************************************************************************
**************************************************************************
* *
* A_OFFOPP_DEL *
* *
* Anim func to delete an enemy if it is off of the opposite side *
* of the screen. This assumes that the unflipped version is *
* facing right. Delete will handle all necessary enemy *
* accounting. *
* *
* A8 = Ptr to any part *
* *
**************************************************************************
A_OFFOPP_DEL
CALLA GET_HEAD_PART
CALLA SCRTST
JREQ AOD_X ;BR = Not offscreen yet
MOVE @SCRNTL+16,A1,W ;Now let's see which side
MOVE *A8(OCTRL),A4,W
MOVE *A8(ODAG),A3,W
CMP A1,A3
JRLT AOD_LEFT
*
* He's off of the right side of the screen
*
BTST B_FLIPH,A4 ;Is he currently facing left?
JAZ DELETE_ENEMY ;BR = No, then he's gone
RETS
*
* He's off of the left side of the screen
*
AOD_LEFT
BTST B_FLIPH,A4 ;Is he currently facing right?
JANZ DELETE_ENEMY ;BR = No, then he's gone
AOD_X
RETS
**************************************************************************
* *
* A_OFFSCRN_DEL - ANIM FUNC TO DELETE AN OBJ IF ITS OFSCRN BIT IS SET *
* *
* A8 = PTR TO AN OBJ *
* *
**************************************************************************
A_OFFSCRN_DEL
move *a8(OPART1),a0,L ; multi?
jrnz aof_multi
move *a8(OFLAGS),a14
btst B_OFSCRN,a14
janz DELETE_OBJ_PROC
aofX:
RETS
aof_multi:
move *a0(OFLAGS),a14
btst B_OFSCRN,a14
jrz aofX ; don't delete if any part onscreen
move *a0(OPARTS),a0,L
jrnz aof_multi
move *a8(OPART1),a8,L ; multi?
jauc DELETE_OBJ_PROC
**************************************************************************
* *
* A_STAY_TIL_ZW_LT - STAY HERE UNTIL Z WORLD < some value *
* param 1 = Z world value *
* *
* This parameter can be an immediate value supplied *
* in the animation OR *
* you can supply an ADDRESS in the animation and the *
* desired Z will be taken from that address! *
* *
**************************************************************************
A_STAY_TIL_ZW_LT:
CALLA GETAFARG_LONG ; target Z (or RAM address) in a0
cmpi 10000000h,a0
jrlt assume_val
move *a0,a0,L ; if address, get target Z
assume_val:
move *a8(OZVAL),a1,L
move @ZBASE,a14,L
sub a14,a1 ; current Z in a1
cmp a0,a1
jrlt ALIZGX ; if current < target, move on
move *a8(AnimFrm),a14,L ; otherwise, stay here
subi 70h,a14
move a14,*a8(AnimFrm),L
ALIZGX:
rets
**************************************************************************
* *
* A_STAY_TIL_GRND_HIT - ANIM FUNC TO STAY PUT UNTIL OBJECT HITS GRND *
* (Then cancel YVEL and YACCEL and place at ground) *
* *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_STAY_TIL_GRND_HIT:
move @YWORLD,a1,L
MOVE @WORLD_GRNDOFF,A14,L
ADD A14,A1
move *a8(OYVAL),a14,L
cmp a1,a14
jrlt not_theryet
; move a1,*a8(OYVAL),L
clr a14
move a14,*a8(OYACCEL),W
move a14,*a8(OYVEL),L
CALLA SET_ONGRND
rets
not_theryet:
move *a8(AnimFrm),a14,L
subi 50h,a14,L
move a14,*a8(AnimFrm),L
rets
.DEF A_STAY_TIL_YVEL_POS
A_STAY_TIL_YVEL_POS:
move *a8(OYVEL),a14,L
jrn not_theryet
rets
**************************************************************************
* *
* A_STAY_TIL_ONSCRN - ANIM FUNC TO STAY PUT UNTIL OBJECT IS ON SCREEN *
* (This uses SCRTST to check) *
* *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_STAY_TIL_ONSCRN
move *a8(OFLAGS),a14 ;
btst B_OFSCRN,a14 ;
jrz ASTOX ;
move *a8(AnimFrm),a14,L ; otherwise, stay here
subi 50h,a14
move a14,*a8(AnimFrm),L
ASTOX:
RETS
**************************************************************************
* *
* A_STAY_TIL_OFFSCRN *
* *
* Anim func to stay put until offscreen. *
* *
* A8 = Ptr to head part *
* *
**************************************************************************
A_STAY_TIL_OFFSCRN
CALLA SCRTST
JRNE ASTOF_X ;BR = Offscreen now
SUBIM 50H,*A8(AnimFrm),L
ASTOF_X
RETS
**************************************************************************
* *
* A_STAY_TIL_WY_EQ - STAY HERE UNTIL WORLD Y == some value
* param 1 = world y value
* *
**************************************************************************
A_STAY_TIL_WY_GT:
CALLA GETAFARG_WORD ; target Y in a0
sll 16,a0
move @YBASE,a14,L
sub a14,a0
move *a8(OYVAL),a1,L
cmp a0,a1
jrgt ASTWY0
jruc stick
A_STAY_TIL_WY_LT:
CALLA GETAFARG_WORD ; target Y in a0
sll 16,a0
move @YBASE,a14,L
sub a14,a0
move *a8(OYVAL),a1,L
cmp a0,a1
jrlt ASTWY0 ; if current < target, move on
stick:
move *a8(AnimFrm),a14,L ; otherwise, stay here
subi 60h,a14
move a14,*a8(AnimFrm),L
rets
ASTWY0:
CLRM *a8(OYVEL),L
move a14,*a8(OYACCEL),W
ASTWYlp:
move a0,*a8(OYVAL),L
move *a8(OPARTS),a8,L
jrnz ASTWYlp
rets
**************************************************************************
* *
* A_STAY_TIL_SY_LT - STAY HERE UNTIL SCREEN Y < some value
* param 1 = screen y value
* *
**************************************************************************
A_STAY_TIL_SY_LT:
CALLA GETAFARG_WORD ; target Y in a0
move *a8(ODAGY),a1
cmp a0,a1
jrlt ASTSYX ; if current < target, move on
move *a8(AnimFrm),a14,L ; otherwise, stay here
subi 60h,a14
move a14,*a8(AnimFrm),L
ASTSYX:
rets
**************************************************************************
* *
* A_RAND_OXVEL - ANIM FUNC TO SET THE X VELOCITY OF AN OBJECT. IF *
* OBJECT IS FLIPPED, THE VALUE IS NEGATED. *
* A8 = PTR TO OBJECT *
* AARG+,L = OXVEL *
* *
**************************************************************************
A_RAND_OXVEL
CALLA GETAFARG_LONG ; min
move a0,a1
CALLA GETAFARG_LONG ; max
calla RANGRAND
MOVE *A8(OCTRL),A14,W
BTST B_FLIPH,A14
JRZ ARXV
NEG A0
ARXV:
MOVE A0,*A8(OXVEL),L
RETS
**************************************************************************
* *
* A_Set_LOOP_STRT - ANIM FUNC TO MAKE THE NEXT FRAME THE START OF THE *
* SCRIPT SO THAT YOU LOOP BACK TO THIS POINT AT THE *
* END. *
* A8 = PTR TO OBJECT *
* *
**************************************************************************
A_Set_LOOP_STRT
CLRB *a8(AnimLoop)
move *a8(AnimFrm),*a8(AnimScr),L
rets
**************************************************************************
* *
* A_INC_Var_Word - ANIM FUNC TO INCREMENT a word variable *
* *
* AARG+,L = Address of variable *
* *
**************************************************************************
A_INC_Var_Word:
calla GETAFARG_LONG ; address of word
move *a0,a14
inc a14
move a14,*a0
rets
**************************************************************************
* *
* A_OZVAL_DELTA - ANIM FUNC TO change an objects ZVAL *
* *
* AARG+,W = Delta *
* *
**************************************************************************
A_OZVAL_DELTA:
calla GETAFARG_WORD ; delta (sign-extended)
move *a8(OZVAL),a14,L
add a0,a14
move a14,*a8(OZVAL),L
rets
**************************************************************************
* *
* A_SET_SCALE - ANIM FUNC TO set the scale of a manually scaled object *
* *
* AARG+,W = Scale *
* *
**************************************************************************
A_SET_SCALE:
move *a8(OFLAGS),a14
btst B_MANSCALE,a14
jrz ASS_abt ; not manually scaled, abort
calla GETAFARG_WORD ; new scale
move a0,a5
calla SET_SCALE_MANUAL
ASS_abt:
rets
.end