wwf-wrestlemania/ANIM.ASM

4968 lines
86 KiB
NASM
Executable File
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.

**************************************************************
*
* Software: Jamie Rivett
* Initiated: 6/93
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
**************************************************************
.file "anim.asm"
.title "animation routines"
.width 132
.option b,d,l,t
.mnolist
.include "macros.h"
.include "mproc.equ" ;Mproc equates
.include "display.equ" ;Display proc equates
.include "gsp.equ" ;Gsp asm equates
.include "sys.equ"
.include "game.equ"
.include "plyr.equ"
.include "anim.equ"
.include "audit.equ"
.include "ring.equ"
.include "sound.h"
.include "jjxm.h"
.INCLUDE "SOUND.EQU"
.include "fontsimg.glo"
.include "bgndtbl.glo"
.include "miscimg.glo"
******************************************************************************
*
* external references
.ref p2rounds,p1rounds,xxx_dead_anim,is_final_match,FINAL_PTR
.ref get_opp_process
.ref PSTATUS,round_award
.ref PCNT,slowmo,do_roll,match_over,triple_sound,is_8_on_1
.ref match_winner,process_ptrs,square_root,set_target_offsets
.ref calc_line_x,RNDPER,wrtable_sound,rope_command,no_debris
.ref set_rope_z,SHAKER2,get_all_buttons_down,right_rproc
.ref left_rproc,adjust_health,create_dizzy_proc,get_mpart_offsets
.ref get_mpart_xsize,pal_find,round_tickcount,tgt_ground
.ref get_rope_x,allow_offscrn,ADD_TO_COMBO_COUNT,MOVE_NAME_ANNC
.ref reduce_bog,RNDRNG0,hyper_speed_on,royal_rumble
.ref kill_smove_procs,clear_lifebar
.ref wrestler_count,wrestler_count_proc
.REF IF_SILENT_ADD_VOICE
******************************************************************************
*
* external definitions
#*****************************************************************************
OANIMODE equ 0 ;word
OANIBASE equ OANIMODE+10h ;long
OANIPC equ OANIBASE+20h ;long
OANICNT equ OANIPC+20h ;word
OCUR_FRAME equ OANICNT+10h ;long
SUBR animate_wrestler
PUSH a4,a10
.ref match_time
move @match_time,a0,L
jrz #x
; callr animate_wrestler1
; callr animate_wrestler2
move a13,a10
addi ANIMODE,a10 ;primary animation
callr animate
move a13,a10
addi ANIMODE2,a10 ;secondary animation
callr animate
#x
PULL a4,a10
rets
SUBR animate_wrestler1
PUSH a4,a10
move a13,a10
addi ANIMODE,a10 ;primary animation
callr animate
PULL a4,a10
rets
SUBR animate_wrestler2
PUSH a4,a10
move a13,a10
addi ANIMODE2,a10 ;secondary animation
callr animate
PULL a4,a10
rets
********
animate ;a10 = * anim variables base
move *a10(OANIMODE),a0 ;current animation ended???
btst MODE_END_BIT,a0
jrnz _exit
.if 0
*** temp patch to step through images on player 1 !!!!
move *a13(PLYRNUM),a0
jrnz #skippit
move *a10(OANIBASE),a0,L
move *a10(OANIPC),a1,L
cmp a0,a1
jreq _next_command
move *a13(BUT_VAL_DOWN),a0
move a0,a0
jrnz _next_command
rets
#skippit
.endif
***
move *a10(OANICNT),a0 ;cur tick count
dec a0
move a0,*a10(OANICNT)
jrgt _exit
_next_command
move *a10(OANIPC),a4,L
_next_command1
move *a4+,a0 ;tick count or command
jrn #command
jrz _ani_zip ;no-op
move *a13(ANI_SPEED),a1
mpyu a0,a1
srl 8,a1
move @hyper_speed_on,a14
srl a14,a1
.if DEBUG
move a1,a1
jrge #not_z
LOCKUP
#not_z
.endif
move a1,*a10(OANICNT) ;# ticks to hold cur frame
; move a0,a1
; sll 8,a1 ;* 256
; move *a13(ANI_SPEED),a0 ;divisor * 256
; divu a0,a1 ;a1/a0
; move a1,*a10(OANICNT) ;# ticks to hold cur frame
move *a4+,a0,L ;* * multi image object
.if DEBUG
cmpi >ff800000,a0
jrhs #img_ok
LOCKUP ;bogus image pointer
#img_ok
.endif
move *a0,a0,L ;* image
.if DEBUG
jrnz #ok
LOCKUP
jruc #skp
#ok
.endif
move a0,*a10(OCUR_FRAME),L
#skp
move a4,*a10(OANIPC),L
_exit
rets
#command
; andi 0ffh,a0
; sll 5,a0 ;x 32
sll 24,a0
srl 19,a0
addi #ani_commands,a0
.if DEBUG
cmpi #ani_commands_end,a0
jrlt #cmd_ok
LOCKUP ;bogus ani command
#cmd_ok
.endif
move *a0,a0,L
jump a0
#ani_commands
.long _ani_zip ;0
.long _ani_repeat ;1
.long _ani_setmode ;2
.long _ani_zerovels ;3
.long _ani_setplyrmode ;4
.long _ani_set_yvel ;5
.long _ani_attack_on ;6
.long _ani_attack_off ;7
.long _ani_leapatopp ;8
.long _ani_attach ;9
.long _ani_detach ;10
.long _ani_waithitgnd ;11
.long _ani_xflip ;12
.long _ani_bounce ;13
.long _ani_attack_on_Z ;14
.long _ani_gravity_on ;15
.long _ani_gravity_off ;16
.long _ani_goto ;17
.long _ani_attachz ;18
.long _ani_slowmo ;19
.long _ani_waitrelease ;20
.long _ani_offset ;21
.long _ani_friction ;22
.long _ani_min_yvel ;23
.long _ani_attachvel ;24
.long _ani_throw1 ;25
.long _ani_sound ;26
.long _ani_setfacing ;27
.long _ani_pause ;28
.long _ani_ifstatus ;29
.long _ani_code ;30
.long _ani_shaker ;31
.long _ani_changeanim ;32
.long _ani_faceup ;33
.long _ani_facedown ;34
.long _ani_bouncerope ;35
.long _ani_shakeropes ;36
.long _ani_bendrope ;37
.long _ani_setspeed ;38
.long _ani_leapatpos ;39
.long _ani_zero_xzvels ;40
.long _ani_rope_z ;41
.long _ani_loop ;42
.long _ani_zip ;43
.long _ani_set_xvel ;44
.long _ani_ifnotstatus ;45
.long _ani_slide_back ;46
.long _ani_clr_damage ;47
.long _ani_set_zvel ;48
.long _ani_checkword ;49
.long _ani_face ;50
.long _ani_setword ;51
.long _ani_getup ;52
.long _ani_getup_wait ;53
.long _ani_clr_stars ;54
.long _ani_shakeall ;55
.long _ani_damage ;56
.long _ani_start_dizzy ;57
.long _ani_clr_status ;58
.long _ani_set_target ;59
.long _ani_max_x ;60
.long _ani_max_z ;61
.long _ani_max_y_vel ;62
.long _ani_superslave ;63
.long _ani_slaveanim ;64
.long _ani_rawsound ;65
.long _ani_damageopp ;66
.long _ani_rndper ;67
.long _ani_waithitopp ;68
.long _ani_attchimage ;69
.long _ani_ifoppmode ;99
.long _ani_ifbuttons ;71
.long _ani_ifnohitblock ;72
.long _ani_end ;73
.long _ani_ifrope ;74
.long _ani_ifnotrope ;75
.long _ani_opp_getup ;76
.long _ani_shakecorner ;77
.long _ani_singlestep ;78
.long _ani_superslave2 ;79
.long _ani_setoppmode ;80
.long _ani_clroppmode ;81
.long _ani_oppoffset ;82
.long _ani_ifblocked ;83
.long _ani_waitroll ;84
.long _ani_setoppfacing ;85
.long _ani_ifopp ;86
.long _ani_snot ;87
.long _ani_if_butcount_ge ;88
.long _ani_if_butcount_lt ;89
.long _ani_if_rptcount ;90
.long _ani_ifnot_rptcount ;91
.long _ani_ringcheck ;92
.long _ani_debrisat ;93
.long _ani_debris ;94
.long _ani_set_wrestler_xflip ;95
.long _ani_slideatopp ;96
.long _ani_clr_butcount ;97
.long _ani_set_rptcount ;98
.long _ani_dec_rptcount ;99
.long _ani_shadowtrail ;100
.long _ani_createproc ;101
.long _ani_target ;102
.long _ani_hmbwait ;103
.long _ani_safe_time ;104
.long _ani_setopp_plyrmode ;105
.long _ani_xflip_opp ;106
.long _ani_setlong ;107
.long _ani_immobilize ;108
.long _ani_xflip_tbl ;109
.long _ani_setoppvels ;110
.long _ani_waithitgnd2 ;111
.long _ani_set_opp_xvel ;112
.long _ani_set_attach ;113
.long _ani_inc_combo_count ;114
.long _ani_clear_combo_count ;115
.long _ani_add_move ;116
.long _ani_startattack ;117
.long _ani_changeanim_tbl ;118
.long _ani_if_rptcount_ge ;119
.long _ani_if_rptcount_lt ;120
.long _ani_waithitany ;121
.long _ani_draw_name ;122
.long _ani_set_idiot ;123
.long _ani_attchimage2 ;124
.long _ani_ground ;125
.long _ani_rot ;126
.long _ani_scroll_ctrl ;127
.long _ani_clear_climb ;128
.long _ani_opp_face ;129
.long _ani_setflag ;130
#ani_commands_end
#********
_ani_zip ;0
.if DEBUG
LOCKUP
.endif
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_repeat ;1
move *a10(OANIBASE),a4,L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_setmode ;2
move *a4+,a0 ;mode bits
move a0,*a10(OANIMODE)
move a4,*a10(OANIPC),L
;clear some STATUS_FLAGS bits too.
move *a13(STATUS_FLAGS),a14,L
andni SF_CLEAR_BITS,a14
move a14,*a13(STATUS_FLAGS),L
;if *a13(PTIME) is nonzero, this anim was called by someone other
; than our actual wrestler process. So clearing the KOD bit isn't
; enough, since we're still sleeping. Set PTIME to 1.
move *a13(PTIME),a14
jrz _next_command
movk 1,a14
move a14,*a13(PTIME)
jruc _next_command
#********
_ani_zerovels ;3
clr a0
move a0,*a13(OBJ_XVEL),L
move a0,*a13(OBJ_YVEL),L
move a0,*a13(OBJ_ZVEL),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_setplyrmode ;4
;clear the climbin bit, just in case...
clr a14
move a14,*a13(CLIMBING_THRU)
move *a4+,a0
move *a13(PLYRMODE),a1 ;this is a temp fudge!!!
cmpi MODE_DEAD,a1
jreq #noset
;If going into head hold mode, don't allow getup meter
;to come out for awhile.
cmpi MODE_HEADHOLD,a0
jrnz #skp
move *a13(DELAY_METER),a14
cmpi 6*60,a14
jrge #skp
movi 9*60,a14
move a14,*a13(DELAY_METER)
#skp
move a0,*a13(PLYRMODE)
#noset
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_set_yvel ;5
move *a4+,a0,L
move a0,*a13(OBJ_YVEL),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_attack_on ;6
;I'm not sure we want to zero attach_proc just for starting an attack!
;Watch this....
clr a0 ;start out not attached
; move a0,*a13(ATTACH_PROC),L ;to anything
move a0,*a13(HITBLOCKER)
;The start of each attack on will clear MODE_STATUS!
move *a13(ANIMODE),a0
andni MODE_STATUS,a0
move a0,*a13(ANIMODE)
move *a13(ANIMODE),a0
ori MODE_CHECKHIT,a0
move a0,*a13(ANIMODE)
move *a4+,a0
move a0,*a13(ATTACK_MODE)
; move *a4+,a0
; move a0,*a13(OBJ_ATTXOFF)
; move *a4+,a0
; move a0,*a13(OBJ_ATTYOFF)
; move *a4+,a0
; move a0,*a13(OBJ_ATTWIDTH)
; move *a4+,a0
; move a0,*a13(OBJ_ATTHEIGHT)
move *a4+,a0,L
move a0,*a13(OBJ_ATTXOFF),L
move *a4+,a0,L
move a0,*a13(OBJ_ATTWIDTH),L
;;; clr a0
;;; move a0,*a13(OBJ_ATTZOFF)
;;; move a0,*a13(OBJ_ATTDEPTH)
movi -40,a0 ;default z width (10)
move a0,*a13(OBJ_ATTZOFF)
movi 40*2,a0 ;10*2
move a0,*a13(OBJ_ATTDEPTH)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_attack_off ;7
;clear CHECKHIT and WAITHITOPP bits
move *a13(ANIMODE),a0
andni MODE_CHECKHIT|MODE_WAITHITOPP,a0
move a0,*a13(ANIMODE)
;clear SMART_ATTACK bit and SMART_TARGET value
move *a13(STATUS_FLAGS),a14
andni M_SMART_ATTACK,a14
move a14,*a13(STATUS_FLAGS)
clr a14
move a14,*a13(SMART_TARGET),L
;update ATTACK_TIME
move @round_tickcount,a0
move a0,*a13(ATTACK_TIME)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_leapatopp ;8
; # ticks to reach dest
; max total distance (X and Z)
; max X distance
; max Z distance
; max Y vel
; target area of opponent
; x,y,z offset of attack box
STRUCT 0
WORD #TICKS
WORD #MAX_TOTAL_DIST
WORD #MAX_X_DIST
WORD #MAX_Z_DIST
LONG #MAX_Y_VEL
WORD #TRGT
WORD #ATT_X_OFF
WORD #ATT_Y_OFF
WORD #ATT_Z_OFF
LABEL #SIZE
.bss oppx,32
.bss oppz,32
.bss oppy,32
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(CLOSEST_NUM),a11
X32 a11
addi process_ptrs,a11
move *a11,a11,L
move *a11(OBJ_XVEL),a5,L
move *a11(PLYRMODE),a14
cmpi MODE_RUNNING,a14
jrne #outring
move a0,a0
jrnz #outring
;if opponent is inside the ring, running and near the ropes
;then target where he is now (don't add in xvel)
move *a11(OBJ_XPOSINT),a1
move a5,a5 ;xvel
jrp #run_right
;run_left
cmpi RING_X_CENTER,a1
jrgt #outring
jruc #cnt
#run_right
cmpi RING_X_CENTER,a1
jrlt #outring
#cnt
PUSH a13
move a11,a13
calla get_rope_x
PULL a13
move *a11(OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmpi 70,a0
jrgt #outring
clr a5 ;clr xvel
#outring
move *a11(OBJ_ZVEL),a6,L
move *a11(OBJ_YVEL),a7,L
move *a11(GROUND_Y),a8
sll 16,a8
addi [256,0],a8
move *a11(OBJ_XPOS),a1,L
move *a11(OBJ_ZPOS),a2,L
move *a11(OBJ_YPOS),a3,L
addi [256,0],a3
move *a4(#TICKS),a0
move *a13(OBJ_GRAVITY),a14,L
#lp0
add a5,a1 ;x + xvel
add a6,a2 ;z + zvel
move a7,a7
jrz #ok
add a7,a3 ;y + yvel
sub a14,a7 ;yvel - gravity
cmp a3,a8 ;hit ground?
jrgt #ok
move a8,a3
jruc #dn
#ok
dsj a0,#lp0
#dn
subi [256,0],a3
move a1,@oppx,L
move a2,@oppz,L
move a3,@oppy,L
move *a4(#TRGT),a0
jrn #user
btst B_TGT_GROUND,a0
jrz #ngrnd
andni TGT_GROUND,a0
calla set_target_offsets
calla tgt_ground
jruc #user
#ngrnd
calla set_target_offsets
#user
move *a13(TGT_XOFF),a0 ;target x offset
sll 16,a0
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #right1
neg a0
#right1
;;; move *a11(OBJ_XPOS),a1,L
move @oppx,a1,L
add a0,a1 ;def target x
move *a4(#ATT_X_OFF),a0
sll 16,a0
move *a13(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #right0
neg a0
#right0
move *a13(OBJ_XPOS),a2,L
add a0,a2 ;att x
sub a2,a1 ;def x - att x
move a1,a14
abs a14
move *a4(#MAX_X_DIST),a0
jrn #xok
sll 16,a0
cmp a14,a0
jrge #xok
move a1,a1
jrp #no_negx
neg a0
#no_negx
move a0,a1
#xok
move a1,a5 ;delta x
move *a4(#TICKS),a0
divs a0,a1 ;a1 / a0
move a1,*a13(OBJ_XVEL),L
move *a13(TGT_ZOFF),a0 ;target z offset
sll 16,a0
;;; move *a11(OBJ_ZPOS),a1,L
move @oppz,a1,L
add a0,a1 ;def target z
move *a13(OBJ_ZPOS),a2,L
move *a4(#ATT_Z_OFF),a0
sll 16,a0
add a0,a2 ;att z
sub a2,a1 ;def z - att z
move a1,a14
abs a14
move *a4(#MAX_Z_DIST),a0
jrn #zok
sll 16,a0
cmp a14,a0
jrge #zok
move a1,a1
jrp #no_negz
neg a0
#no_negz
move a0,a1
#zok
move a1,a6 ;delta z
move *a4(#TICKS),a0
divs a0,a1 ;a1 / a0
move a1,*a13(OBJ_ZVEL),L
move *a4(#MAX_TOTAL_DIST),a9
jrn #maxok
abs a5
srl 16,a5
move a5,a1
mpyu a5,a1 ;deltax^2
move a1,a5
abs a6
srl 16,a6
move a6,a1
mpyu a6,a1 ;deltaz^2
move a1,a0
add a5,a0
calla square_root
cmp a0,a9 ;a9-a0 (will we exceed max dist?)
jrgt #maxok
sll 8,a9 ;x 256 (8 bits fractional)
divu a0,a9 ;a9/a0
move a9,a1
move *a13(OBJ_XVEL),a0,L
mpys a0,a1 ;scale down xvel
sra 8,a1 ;shift off fractional
move a1,*a13(OBJ_XVEL),L
move a9,a1
move *a13(OBJ_ZVEL),a0,L
mpys a0,a1 ;scale down yvel
sra 8,a1 ;shift off fractional
move a1,*a13(OBJ_ZVEL),L
#maxok
;to calculate YVEL taking into account gravity:
;use y-y0 = v0*t + 0.5*a*t^2
move *a4(#TICKS),a8
move a8,a1
mpyu a8,a1 ;t^2
move *a13(OBJ_GRAVITY),a0,L
mpyu a0,a1 ;a*t^2
srl 1,a1 ;1/2*a*t^2
;;; move *a11(OBJ_YPOS),a0,L ;opp y
move @oppy,a0,L
move *a13(TGT_YOFF),a14 ;target y offset
sll 16,a14
add a14,a0
move *a13(OBJ_YPOS),a2,L ;y0
move *a4(#ATT_Y_OFF),a14
sll 16,a14
add a14,a2
sub a2,a0 ;a0 = a0-a2 (y - y0)
add a0,a1
jrnn #yvel_okay
; LOCKUP
clr a1
jruc #yok
#yvel_okay
divu a8,a1 ;a1 = a1/a8 ( ((y-y0)+(1/2*a*t^2)) / t )
move *a4(#MAX_Y_VEL),a0,L
cmp a1,a0
jrge #yok
move a0,a1
#yok
move a1,*a13(OBJ_YVEL),L
;make sure both have the same INRING value
move *a11(INRING),a0
move *a13(INRING),a1
cmp a0,a1
jreq #done
;uh-oh. our INRING's don't match. Unless we're on the
; turnbuckle (or flying from it), zero the X and Z
; velocities and set the Y velocity to 50000h or something
;...unfortunately, there's no really clean way to tell if
; we're on the turnbuckle at this point since the LEAPAT doesn't
; happen until well into the anim sequence and our PLYRMODE could
; be just about anything by then. So instead we'll fudge and look
; at some other clues, like gravity and y pos. If a player has a
; Y pos that's way high (80+) pixels above GROUND_Y and no gravity,
; that sure looks like a turnbuckle, so go with it.
move *a13(ANIMODE),a14
btst MODE_NOGRAVITY_BIT,a14
jrz #nt
move *a13(OBJ_YPOSINT),a0
move *a13(GROUND_Y),a14
sub a14,a0
subi 80,a0
jrnn #done
#nt ;no good. leap in place
clr a14
move a14,*a13(OBJ_XVEL),L
move a14,*a13(OBJ_ZVEL),L
movi [5,0],a14
move a14,*a13(OBJ_YVEL),L
#done
jruc _next_command
#********
_ani_attach ;9
; move *a4+,a0 ;xoff
; move a0,*a13(ATTACH_XOFF)
; move *a4+,a0
; move a0,*a13(ATTACH_YOFF)
move *a4+,a0,L ;xoff
move a0,*a13(ATTACH_XOFF),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_detach ;10
move *a13(ATTACH_PROC),a1,L
jrz #done_really
clr a0
move a0,*a13(ATTACH_PROC),L ;not attached to anything
move *a1(ATTACH_PROC),a2,L
cmp a2,a13
jrne #done_really ;attach_procs don't match!
move a0,*a1(ATTACH_PROC),L ;not attached to anything
#done
;if our victim is still in mode puppet, puppet2, headheld, or
; attached, instead put him in ONGROUND.
move *a1(PLYRMODE),a14
cmpi MODE_PUPPET,a14
jreq #fix_opp
cmpi MODE_PUPPET2,a14
jreq #fix_opp
;This was fucking up the shawn franknsteiner move from headhold!
;Forcing him to dive down too low!
; cmpi MODE_HEADHELD,a14
; jreq #fix_opp
cmpi MODE_ATTACHED,a14
jreq #fix_opp
jruc #done_really
#fix_opp
movi MODE_ONGROUND,a14
move a14,*a1(PLYRMODE)
#done_really
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_waithitgnd ;11
move *a13(OBJ_YVEL),a0,L ;must have down velocity
jrp #no_gnd
;if we're the master and the attach is valid, check and see if
; our puppet has hit the ground.
move *a13(ANIMODE),a14
btst MODE_KEEPATTACHED_BIT,a14
jrz #skip_pcheck
move *a13(ATTACH_PROC),a0,L
jrz #skip_pcheck ;we're attached?
move *a0(ATTACH_PROC),a14,L
jrz #skip_pcheck ;they're attached?
cmp a13,a14
jrne #skip_pcheck ;to each other?
;ah, but if the opponent's MODE_GHOST bit is set, ignore him
move *a0(ANIMODE),a14
btst MODE_GHOST_BIT,a14
jrnz #skip_pcheck
move *a0(OBJ_YPOSINT),a1,W
move *a0(GROUND_Y),a2,W
sub a1,a2
jrnn #hit_gnd
#skip_pcheck
move *a13(OBJ_YPOSINT),a0
move *a13(GROUND_Y),a1
cmp a1,a0 ;a0-a1
jrgt #no_gnd
#hit_gnd
CALLA SMALL_BOUNCE
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#no_gnd
movk 1,a0
move a0,*a10(OANICNT) ;# ticks to hold cur frame
rets
#********
_ani_xflip ;12
move *a13(OBJ_CONTROL),a0
xori M_FLIPH,a0
move a0,*a13(OBJ_CONTROL)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_bounce ;13
move *a4+,a0 ;Bounce value
sll 16,a0
move a0,*a13(OBJ_YVEL),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_attack_on_Z ;14
;I'm not sure we want to zero attach_proc just for starting an attack!
;Watch this....
clr a0 ;start out not attached
; move a0,*a13(ATTACH_PROC),L ;to anything
move a0,*a13(HITBLOCKER)
move a0,*a13(ATTACH_ZOFF)
;The start of each attack on will clear MODE_STATUS!
move *a13(ANIMODE),a0
andni MODE_STATUS,a0
move a0,*a13(ANIMODE)
move *a13(ANIMODE),a0
ori MODE_CHECKHIT,a0
move a0,*a13(ANIMODE)
move *a4+,a0
move a0,*a13(ATTACK_MODE)
; move *a4+,a0
; move a0,*a13(OBJ_ATTXOFF)
; move *a4+,a0
; move a0,*a13(OBJ_ATTYOFF)
; move *a4+,a0
; move a0,*a13(OBJ_ATTZOFF)
; move *a4+,a0
; move a0,*a13(OBJ_ATTWIDTH)
; move *a4+,a0
; move a0,*a13(OBJ_ATTHEIGHT)
; move *a4+,a0
; move a0,*a13(OBJ_ATTDEPTH)
move *a4+,a0,L
move a0,*a13(OBJ_ATTXOFF),L
move *a4+,a0,L
move a0,*a13(OBJ_ATTZOFF),L
move *a4+,a0,L
move a0,*a13(OBJ_ATTHEIGHT),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_gravity_on ;15
move *a13(ANIMODE),a0
andni MODE_NOGRAVITY,a0
move a0,*a13(ANIMODE)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_gravity_off ;16
move *a13(ANIMODE),a0
ori MODE_NOGRAVITY,a0
move a0,*a13(ANIMODE)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_goto ;17
move *a4+,a4,L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_attachz ;18
; move *a4+,a0 ;xoff
; move a0,*a13(ATTACH_XOFF)
; move *a4+,a0
; move a0,*a13(ATTACH_YOFF)
move *a4+,a0,L
move a0,*a13(ATTACH_XOFF),L
move *a4+,a0
move a0,*a13(ATTACH_ZOFF)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_slowmo ;19
move *a4+,a0 ;frame delay
move a0,@slowmo
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_waitrelease ;20
move *a13(BUT_VAL_CUR),a0
move *a4+,a1 ;button bit
btst a1,a0 ;still down?
jrz #button_up
;since we do the flip here, we have to update FACING_DIR too.
move *a13(NEW_FACING_DIR),*a13(FACING_DIR)
move *a13(NEW_FACING_DIR),a14
btst PLAYER_RIGHT_BIT,a14
jrnz #right
move *a13(OBJ_CONTROL),a14
ori M_FLIPH,a14
move a14,*a13(OBJ_CONTROL)
movk 1,a0
move a0,*a10(OANICNT) ;# ticks to hold cur frame
rets
#right
move *a13(OBJ_CONTROL),a14
andni M_FLIPH,a14
move a14,*a13(OBJ_CONTROL)
movk 1,a0
move a0,*a10(OANICNT) ;# ticks to hold cur frame
rets
#button_up
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_offset ;21
move *a4+,a1 ;x offset
move *a13(FACING_DIR),a0
btst MOVE_RIGHT_BIT,a0
jrnz #right
neg a1
#right
move *a13(OBJ_XPOSINT),a0
add a1,a0
move a0,*a13(OBJ_XPOSINT)
move *a4+,a1 ;y offset
move *a13(OBJ_YPOSINT),a0
add a1,a0
move a0,*a13(OBJ_YPOSINT)
;SCROLL_CTRL stuff
move *a13(SCROLL_Y),a0
sub a1,a0
move a0,*a13(SCROLL_Y)
move *a4+,a1 ;z offset
move *a13(OBJ_ZPOSINT),a0
add a1,a0
move a0,*a13(OBJ_ZPOSINT)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_friction ;22
move *a4+,a0 ;friction value
move a0,*a13(OBJ_FRICTION)
move *a13(ANIMODE),a0
ori MODE_FRICTION,a0
move a0,*a13(ANIMODE)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_min_yvel ;23
;sets YVEL to given value, UNLESS it's already higher.
move *a4+,a0,L
move *a13(OBJ_YVEL),a14,L
cmp a0,a14
jrge #set
move a0,*a13(OBJ_YVEL),L
#set move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_attachvel ;24
STRUCT 0
LONG #XVEL
LONG #YVEL
LONG #ZVEL
LABEL #SIZE
;x velocity is always relative to attacker FACING_DIR
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a2,L ;proc attached to
jrz #not_attached
move *a2(ATTACH_PROC),a0,L
jrz #not_attached
move *a4(#YVEL),a0,L
move a0,*a2(OBJ_YVEL),L
move *a4(#ZVEL),a0,L
move a0,*a2(OBJ_ZVEL),L
move *a4(#XVEL),a0,L
move *a13(FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #xok
neg a0
#xok
move a0,*a2(OBJ_XVEL),L
#not_attached
jruc _next_command
#********
_ani_throw1 ;25
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_sound ;26
move *a4+,a0
cmpi run_snd,a0
jrne #not_run
;if there's been another foot noise from this guy within the last
; 12 ticks, give it a miss.
move @PCNT,a14
zext a14,W
move *a13(FOOT_PCNT),a1
sub a1,a14
abs a14
cmpi 12,a14
jrlt #done
move @PCNT,a1
move a1,*a13(FOOT_PCNT)
calla triple_sound
jruc #done
#not_run
move a0,a0
jrn #table_lookup
calla triple_sound
jruc #done
#table_lookup
calla wrtable_sound
#done
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_setfacing ;27
move *a13(NEW_FACING_DIR),a0
move a0,*a13(FACING_DIR)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_pause ;28
;hold current frame for a few ticks
move *a4+,a14
move a4,*a10(OANIPC),L
move a14,*a10(OANICNT)
rets
#********
_ani_ifstatus ;29
move *a4+,a0,L ;this is a conditional goto
move *a13(ANIMODE),a1 ;if MODE_STATUS set then
btst MODE_STATUS_BIT,a1 ;branch is taken
jrz #skip
move a0,a4 ;new ani pc
#skip
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_code ;30
move *a4+,a0,L ;code to execute
move a4,*a10(OANIPC),L
PUSH a10
call a0
PULL a10
jruc _next_command
#********
_ani_shaker ;31
push a10
move *a4+,a10,W ;shaker mode value
calla SHAKER2
pull a10
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_changeanim ;32
move *a4+,a4,L
move a4,*a10(OANIPC),L
move a4,*a10(OANIBASE),L
; jruc _next_command
jruc _next_command1
#********
_ani_faceup ;33
movk MOVE_UP_RIGHT,a1
move *a13(OBJ_CONTROL),a0
btst B_FLIPH,a0
jrz #right
movk MOVE_UP_LEFT,a1
#right move a1,*a13(FACING_DIR)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_facedown ;34
movk MOVE_DOWN_RIGHT,a1
move *a13(OBJ_CONTROL),a0
btst B_FLIPH,a0
jrz #right
movk MOVE_DOWN_LEFT,a1
#right move a1,*a13(FACING_DIR)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_bouncerope ;35
movi ROPE_LEFT,a0
move *a13(OBJ_XPOSINT),a14
cmpi RING_X_CENTER,a14
jrle #dir_set
movi ROPE_RIGHT,a0
#dir_set
movi ROPE_SIDES,a1
move *a13(OBJ_ZPOS),a3,L
move *a4+,a2,W
move a4,*a10(OANIPC),L
jrnn #no_release
movi ROPE_SIDESR,a1
#no_release
calla rope_command
movi 3ch,a0
calla triple_sound
jruc _next_command
#********
_ani_shakeropes ;36
movi ROPE_BOUNCEUD,a1
move *a4+,a2,W
move a4,*a10(OANIPC),L
;blow it off if we're outside
move *a13(INRING),a14
jrnz _next_command
;force a2 into range, just to be safe...
andi 03h,a2
movi ROPE_BACK,a0
calla rope_command
movi ROPE_LEFT,a0
move *a13(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrnz #cont
movi ROPE_RIGHT,a0
#cont
calla rope_command
movi 3ch,a0
calla triple_sound
jruc _next_command
#********
_ani_bendrope ;37
movi ROPE_LEFT,a0
move *a13(OBJ_XPOSINT),a14
cmpi RING_X_CENTER,a14
jrle #dir_set
movi ROPE_RIGHT,a0
#dir_set
movi ROPE_DOWNS,a1
move *a13(OBJ_ZPOS),a3,L
move *a4+,a2,W
move a4,*a10(OANIPC),L
jrnn #no_release
movi ROPE_DOWNSR,a1
#no_release
calla rope_command
jruc _next_command
#********
_ani_setspeed ;38
move *a4+,a0
move a0,*a13(ANI_SPEED)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_leapatpos ;39
;WORD - #ticks to reach destination
;WORD - max distance to travel
;WORD - x,y,z offset of attack box (eg. attacker's fist)
;NB - user must set TGT_XOFF,YOFF & ZOFF <-- these are the actual target
move *a4+,a8 ;# ticks
move *a4+,a9 ;max distance to travel
#user
move *a13(TGT_XOFF),a1 ;target x
sll 16,a1
move *a4+,a0 ;attack x offset
sll 16,a0
move *a13(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #right0
neg a0
#right0
move *a13(OBJ_XPOS),a2,L
add a0,a2 ;att x
sub a2,a1 ;def x - att x
move a1,a5 ;delta x
move a8,a0 ;ticks
divs a0,a1 ;a1 / a0
move a1,*a13(OBJ_XVEL),L
;to calculate YVEL taking into account gravity:
;use y-y0 = v0*t + 0.5*a*t^2
move a8,a1
mpyu a8,a1 ;t^2
move *a13(OBJ_GRAVITY),a0,L
mpyu a0,a1 ;a*t^2
srl 1,a1 ;1/2*a*t^2
move *a13(TGT_YOFF),a0 ;target y
sll 16,a0
move *a4+,a14 ;attack y offset
sll 16,a14
move *a13(OBJ_YPOS),a2,L ;y0
sub a14,a2
sub a2,a0 ;a0 = a0-a2 (y - y0)
add a0,a1
divu a8,a1 ;a1 = a1/a8 ( ((y-y0)+(1/2*a*t^2)) / t )
cmpi >0f0000,a1
jrlt #yok
movi >0f0000,a1
#yok move a1,*a13(OBJ_YVEL),L
move *a13(TGT_ZOFF),a1 ;target z
sll 16,a1
move *a4+,a0 ;attack z offset
sll 16,a0
move *a13(OBJ_ZPOS),a2,L
add a0,a2 ;att z
sub a2,a1 ;def z - att z
move a1,a6 ;delta z
move a8,a0 ;ticks
divs a0,a1 ;a1 / a0
move a1,*a13(OBJ_ZVEL),L
abs a5
srl 16,a5
move a5,a1
mpyu a5,a1 ;deltax^2
move a1,a5
abs a6
srl 16,a6
move a6,a1
mpyu a6,a1 ;deltaz^2
move a1,a0
add a5,a0
calla square_root
cmp a0,a9 ;a9-a0 (will we exceed max dist?)
jrgt #ok
sll 8,a9 ;x 256 (8 bits fractional)
divu a0,a9 ;a9/a0
move a9,a1
move *a13(OBJ_XVEL),a0,L
mpys a0,a1 ;scale down xvel
sra 8,a1 ;shift off fractional
move a1,*a13(OBJ_XVEL),L
move a9,a1
move *a13(OBJ_ZVEL),a0,L
mpys a0,a1 ;scale down yvel
sra 8,a1 ;shift off fractional
move a1,*a13(OBJ_ZVEL),L
#ok
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_zero_xzvels ;40
clr a0
move a0,*a13(OBJ_XVEL),L
move a0,*a13(OBJ_ZVEL),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_rope_z ;41
;.word ANI_ROPE_Z,R_TOP,RZ_HIGH
;which rope has he hit?
move @right_rproc,a0,L
move *a13(OBJ_XPOS),a14,L
cmpi RING_X_CENTER<<16,a14
jrgt #right
move @left_rproc,a0,L
#right
move *a4+,a1,W ;rope index
move *a4+,a2,W ;action
calla set_rope_z
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_loop ;42
.ref arw_bwait
move @p1rounds,a0
cmpi 2,a0
jrz #at_end
move @p2rounds,a0
cmpi 2,a0
jreq #at_end
;oooh, wait. If we've pinned someone, and announce_rnd_winner
; is waiting on the result (they'll be waiting to wake up at
; arw_bwait if they are) then we should wake it up.
move *a13(STATUS_FLAGS),a14
btst B_PINNED,a14
jrz #no_pin
movi ANNC_PID,a0
clr a1
not a1
calla EXISTP
jrnz #no_pin ;annc exists?
move *a0(PWAKE),a14,L
cmpi arw_bwait,a14
jrne #no_pin ;waiting for a pin?
movk 1,a14
move a14,*a0(PTIME) ;wake it up.
#no_pin movk 1,a0
move a0,*a10(OANICNT)
rets
#at_end
jruc _ani_detach ;10
;
; move a4,*a10(OANIPC),L
; jruc _next_command
#********
;_ani_set_opp_getup ;43
;
;;args: .word (GETUP_TIME)
;
; move *a4+,a0
;
; move *a13(WHOIHIT),a14,L
; move a0,*a14(GETUP_TIME)
;
; move a4,*a10(OANIPC),L
; jruc _next_command
;
#********
_ani_set_xvel ;44
;args: .long (XVEL) .word (MODE) ;if MODE=0 vel is absolute
;if MODE=3 vel is new_face relative
move *a4+,a0,L
move *a4+,a1
jrz #abs
dec a1
jrz #face
dec a1
jrz #hit
;new_facing relative
move *a13(NEW_FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #abs ;right
neg a0 ;left
jruc #abs
#hit
;hit relative
move *a13(PLYR_HIT_SIDE),a14
btst MOVE_RIGHT_BIT,a14
jrnz #abs ;hit from right
neg a0 ;hit from left
jruc #abs
#face
move *a13(FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #abs ;right
neg a0 ;left
#abs
move a0,*a13(OBJ_XVEL),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_ifnotstatus ;45
move *a4+,a0,L ;this is a conditional goto
move *a13(ANIMODE),a1 ;if MODE_STATUS clear then
btst MODE_STATUS_BIT,a1 ;branch is taken
jrnz #skip
move a0,a4 ;new ani pc
#skip
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_slide_back
move *a4+,a8 ;range
move *a4+,a9,L ;x-vel
move *a4+,a7,L ;new ani PC if no slide
move a4,*a10(OANIPC),L
move *a13(ANIMODE),a14 ;was there a collision?
btst MODE_STATUS_BIT,a14
jrz #no_slide
move *a13(WHOIHIT),a6,L
; move *a6(PLYRMODE),a5
; cmpi MODE_BLOCK,a5
; jrz #no_slide
move *a6(OBJ_XPOSINT),a5
move *a13(OBJ_XPOSINT),a0
cmp a5,a0 ;a0-a5
jrgt #hit_from_right
;hit_from_left
move *a13(INRING),a0
jrnz #outside1
PUSH a6,a13
move a6,a13
movi vln_right_rope,a6
calla calc_line_x
PULL a6,a13
move *a6(OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmp a8,a0
jrgt #no_slide
jruc #slide
#outside1
;hit from left outside ring.
; get left matedge first. if it's zero, or greater than our
; x pos, check against right fence instead.
PUSH a6
movi vln_left_matedge,a6
calla calc_line_x
PULL a6
TEST a0
jrz #check_right_fence
move *a6(OBJ_XPOSINT),a1
sub a1,a0
jrlt #check_right_fence
;less than a nonzero left matedge val. check against it.
cmp a1,a8
jrgt #no_slide
jruc #slide
#check_right_fence
PUSH a6,a13
move a6,a13
movi vln_right_fence,a6
calla calc_line_x
PULL a6,a13
move *a6(OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmp a8,a0
jrgt #no_slide
jruc #slide
#hit_from_right
move *a13(INRING),a0
jrnz #outside2
PUSH a6,a13
move a6,a13
movi vln_left_rope,a6
calla calc_line_x
PULL a6,a13
move *a6(OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmp a8,a0
jrgt #no_slide
neg a9
jruc #slide
#outside2
;hit from right outside ring.
; get right matedge first. if it's zero, or greater than our
; x pos, check against left fence instead.
PUSH a6
movi vln_right_matedge,a6
calla calc_line_x
PULL a6
TEST a0
jrz #check_left_fence
move *a6(OBJ_XPOSINT),a1
sub a0,a1
jrlt #check_left_fence
;greater than a nonzero right matedge val. check against it.
cmp a1,a8
jrle #no_slide
neg a9
jruc #slide
#check_left_fence
PUSH a6,a13
move a6,a13
movi vln_left_fence,a6
calla calc_line_x
PULL a6,a13
move *a6(OBJ_XPOSINT),a1
sub a1,a0
abs a0
cmp a8,a0
jrgt #no_slide
neg a9
#slide
move a9,*a13(OBJ_XVEL),L
movi 3000h,a0
move a0,*a13(OBJ_FRICTION)
move *a13(ANIMODE),a0
ori MODE_FRICTION,a0
move a0,*a13(ANIMODE)
jruc _next_command
#no_slide
move a7,*a10(OANIPC),L
jruc _next_command
#********
_ani_clr_damage ;47
move a4,*a10(OANIPC),L
; calla clear_damage_log
; jruc _next_command
jruc _next_command1
#********
_ani_set_zvel ;48
;args: .long (ZVEL) .word (MODE) ;if MODE=0 vel is absolute
;if MODE=1 vel is facing relative
;if MODE=2 vel is hit relative
move *a4+,a0,L
move *a4+,a1
jrz #abs
dec a1
jrz #face
;hit relative
move *a13(PLYR_HIT_SIDE),a14
btst MOVE_UP_BIT,a14
jrnz #abs ;hit from above
neg a0 ;hit from below
jruc #abs
#face
move *a13(FACING_DIR),a14
btst MOVE_DOWN_BIT,a14
jrnz #abs ;down
neg a0 ;up
#abs
move a0,*a13(OBJ_ZVEL),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_checkword ;49
;sets a word in the procs pdata area
; .word ANI_SETWORD,OFFSET,VAL
move *a4+,a0 ;OFFSET
move a4,*a10(OANIPC),L
add a13,a0
move *a0,a0
jrz #clr
;hit. set mode_status
move *a13(ANIMODE),a0
ori MODE_STATUS,a0
move a0,*a13(ANIMODE)
jruc _next_command
#clr
;clear mode_status
move *a13(ANIMODE),a0
andni MODE_STATUS,a0
move a0,*a13(ANIMODE)
jruc _next_command
#********
_ani_face ;50
move *a4+,a0
move a4,*a10(OANIPC),L
move *a13(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
xori MOVE_LEFT|MOVE_RIGHT,a0
#no_flip
move a0,*a13(FACING_DIR)
jruc _next_command
#********
_ani_setword ;51
;sets a word in the procs pdata area
; .word ANI_SETWORD,OFFSET,VAL
move *a4+,a0 ;OFFSET
add a13,a0
move *a4+,a1 ;VAL
move a1,*a0
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_getup ;52
;args: .word (GETUP_TIME)
move *a4+,a0
move *a13(PLYR_DIZZY),a14
jrnz #skip
move a0,*a13(GETUP_TIME)
#skip
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_getup_wait ;53
move *a13(GETUP_TIME),a0
jrnz #no_done
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#no_done
movk 1,a0
move a0,*a10(OANICNT) ;# ticks to hold cur frame
rets
#********
_ani_clr_stars ;54
clr a0
move a0,*a13(STARS_FLAG)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_shakeall ;55
movi ROPE_BOUNCEUD,a1
move *a4+,a2,W
move a4,*a10(OANIPC),L
;blow it off if we're outside
move *a13(INRING),a14
jrnz _next_command
move @reduce_bog,a14
jrnz _next_command
;force a2 into range, just to be safe...
andi 03h,a2
movi ROPE_BACK,a0
calla rope_command
movi ROPE_LEFT,a0
calla rope_command
movi ROPE_RIGHT,a0
calla rope_command
movi ROPE_FRONT,a0
calla rope_command
movi 3ch,a0
calla triple_sound
jruc _next_command
#********
_ani_damage ;56
move *a4+,a0
neg a0 ;positive a0 = health increase...
move *a13(PLYRNUM),a1
calla adjust_health
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_start_dizzy ;57
; clr a0
; move a0,*a13(PLYR_DIZZY)
PUSH a10
move *a4+,a10 ;Where do stars go?
calla create_dizzy_proc
PULL a10
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_clr_status ;58
move *a13(ANIMODE),a1
andni MODE_STATUS,a1
move a1,*a13(ANIMODE)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_set_target ;59
move *a4+,a0
move a4,*a10(OANIPC),L
calla set_target_offsets
jruc _next_command
#********
_ani_max_x ;60
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_max_z ;61
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_max_y_vel ;62
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_superslave ;63
; long pointer to slave table
; word index into table
move *a4+,a5,L ;* table
move *a4+,a6 ;index to frame & offsets
move a4,*a10(OANIPC),L
move *a13(ATTACH_PROC),a11,L
move *a11(ATTACH_PROC),a0,L
cmp a13,a0
jrne #done
move *a11(WRESTLERNUM),a0
X32 a0
add a5,a0
move *a0,a5,L
.if DEBUG
move *a5,a0,L ;table defined?
jrnz #ok1
LOCKUP
; no slave table defined!
#ok1
.endif
movi 80,a1 ;LWWW
mpyu a6,a1
add a1,a5
move *a5+,a0,L ;* * image
move *a0,a0,L ;* image
.if DEBUG
jrnz #ok
LOCKUP
; image not loaded! (null pointer)
#ok
.endif
move a0,*a11(CUR_FRAME),L ;primary frame
move *a5+,a0 ;xoff
move a0,*a13(ATTACH_XOFF)
move *a5+,a0
move a0,*a13(ATTACH_YOFF)
move *a11(OBJ_CONTROL),a3
move *a13(FACING_DIR),a14
btst PLAYER_RIGHT_BIT,a14
jrnz #right
;left
andni M_FLIPH,a3 ;clear flip bit
jruc #cnt
#right
ori M_FLIPH,a3 ;set flip
#cnt
move *a5+,a0 ;flip flag
jrz #skip
xori M_FLIPH,a3 ;invert
#skip
move a3,*a11(OBJ_CONTROL)
#done
jruc _next_command
#********
*
;same as old slaveanim except this executes
;the animation up to the 1st sleep
_ani_slaveanim ;64
move *a4+,a5,L ;* table
move a4,*a10(OANIPC),L
move *a13(ATTACH_PROC),a2,L
move *a2(ATTACH_PROC),a0,L
cmp a13,a0
jrne #done
move *a2(WRESTLERNUM),a0
X32 a0
add a0,a5
move *a5,a0,L
jrnz #ok1
.if DEBUG
LOCKUP
; no slave anim table defined!
.endif
jruc _next_command
#ok1
;a0 = * animation script
;a2 = * wrestler process
PUSH a10,a13
move a2,a13
callr change_anim1a ;execute animation
PULL a10,a13
#done
jruc _next_command
#********
_ani_rawsound ;65
move *a4+,a3,W
calla SNDSND
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_damageopp ;66
;works on attached proc, or WHOIHIT if there isn't one
.ref any_hits,DAM_MULT,FIRSTATT_MESS
STRUCT 0
WORD #FULL_DAMAGE
WORD #REDUCED_DAMAGE
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
;get victim process ptr
move *a13(ATTACH_PROC),a2,L
jrnz #attach_found
move *a13(WHOIHIT),a2,L
#attach_found
;get damage
move *a4(#FULL_DAMAGE),a0
move *a2(LAST_DAMAGE),a14
jrz #dmset
move @PCNT,a1
sub a14,a1
cmpi 30,a1
jrgt #dmset
move *a4(#REDUCED_DAMAGE),a0
#dmset
;ooh, wait. if the attacker has a NEXT_DAMAGE set, use that instead.
move *a13(NEXT_DAMAGE),a14
jrz #nnd ;aw, skip it.
move *a13(SPECIAL_DAMAGE_TIME),a14,L
move @PCNT,a1,L
cmp a14,a1
jrgt #nnd ;too late. blow it off.
move *a13(NEXT_DAMAGE),a0
#nnd neg a0
;If this is the first unblocked hit this round and it did at least
; 2 pixels of damage, give an award
PUSH a0
cmpi -2,a0
jrgt #n1uh
;Taunt style high risk move - give 3x dmg
move *a13(RISK),a1
jrz #no_mult
PUSH a0,a8,a10
move a13,a8
btst 15,a1
jrz #reg
;Taunt style high risk move - give 3x dmg
movi -1,a10
movk 4,a14
move a14,@DAM_MULT
.ref BONUS_MESS
CREATE0 BONUS_MESS
#reg
clr a1
move a1,*a13(RISK)
PULL a0,a8,a10
jruc #clear
#no_mult
move @any_hits,a14
jrnz #n1uh ;skip if there's already been one
move *a2(PLYRMODE),a14
cmpi MODE_BLOCK,a14
jreq #n1uh ;skip if it was blocked
RND_AWARD a13,FIRST_HIT_AWD
PUSH a10
move a13,a10
CREATE MESSAGE_PID,FIRSTATT_MESS
PULL a10
movk 2,a14
move a14,@DAM_MULT
#clear
movk 1,a14
move a14,@any_hits
#n1uh PULL a0
;MODS REQUIRED TO MAKE ADJUST_HEALTH WORK IN COMBO MODE
move *a2(PLYRNUM),a1
PUSH A10,A13
MOVE A13,A10
calla adjust_health
PULL A10,A13
#done jruc _next_command
#********
_ani_rndper ;67
;word probability
;long jump here if hit
move *a4+,a0,W
move *a4+,a2,L
calla RNDPER
jrls #done
;ANI_GOTO a2
move a2,*a10(OANIPC),L
jruc _next_command
#done
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_waithitopp ;68
;NOTE: This is just like an ordinary "WL ticks,frame" type command
; except that the ANICNT is zeroed if we hit the opponent.
;word max ticks to wait
;long frame to hold
move *a13(ANIMODE),a14
ori MODE_WAITHITOPP,a14
move a14,*a13(ANIMODE)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_attchimage ;69
;long *image,word zoff
;update OANIPC
move a4,a14
addi 30h,a14
move a14,*a10(OANIPC),L
clr a14
; move a14,*a13(ATTACHIMG_XOFF)
; move a14,*a13(ATTACHIMG_YOFF)
move a14,*a13(ATTACHIMG_XOFF),L
move *a4+,a0,L
jrz #offimg
move *a4+,a1
move a1,*a13(ATTACHIMG_ZOFF)
#off
attach_cont69 ;entry from attachimage2 #124
move *a13(ATTIMG_CUR_FRAME),*a13(ATTIMG_LAST_FRAME),L
move *a0,a0,L
.if DEBUG
jrnz #ok
LOCKUP
;NULL IMAGE POINTER!!!
#ok
.endif
;#offimg
move a0,*a13(ATTIMG_CUR_FRAME),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#offimg
move a0,*a13(ATTIMG_CUR_FRAME),L
addk 16,a4
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
.if 0
move *a4+,a0,L
jrz #off
move *a4+,a1
move a1,*a13(ATTIMG_ZOFF)
move *a0,a0,L
.if DEBUG
jrnz #ok
LOCKUP
;NULL IMAGE POINTER!!!
#ok
.endif
move a0,*a13(ATTIMG_CUR_FRAME),L
move *a13(ATTIMG_IMG),a8,L
move a0,*a8(OIMG),L
move *a0(0),*a8(OSIZE),L
move *a0(ISAG),*a8(OSAG),L
move *a0(ICMAP),a0,L
calla pal_find
jrnz #AOK
LOCKUP ;can't find palette
#AOK
move a0,*a8(OPAL)
move *a8(OIMG),a0,L
movb *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp
move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops
andi 0111111b,a7
; setf 6,0,0
; move a7,*a8(OCTRL) ;Write 6 low bits
; setf 16,1,0
move *a8(OCTRL),a14
srl 6,a14
sll 6,a14
or a7,a14
move a14,*a8(OCTRL)
move *a13(OBJ_CONST),*a8(OCONST)
jruc _next_command
#off
move a0,*a13(ATTIMG_CUR_FRAME),L
jruc _next_command
.endif
#********
_ani_ifoppmode ;70
;If opponent PLYRMODE is #MODE, jump to #BRANCH
;If the high bit of #MODE is set, jump on PLYRMODE != ~#MODE
STRUCT 0
WORD #MODE
LONG #BRANCH
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(CLOSEST_NUM),a11
X32 a11
addi process_ptrs,a11
move *a11,a11,L
move *a11(PLYRMODE),a14
move *a4(#MODE),a0
jrn #not
cmp a0,a14
jrne #done
jruc #branch
#not
not a0
cmp a0,a14
jreq #done
#branch
move *a4(#BRANCH),a0,L
move a0,*a10(OANIPC),L
#done
jruc _next_command
#********
_ani_ifbuttons ;71
;buttons (WORD), ani address (LONG)
move *a13(BUT_VAL_CUR),a0
move *a4+,a1 ;button vals
move *a4+,a2,L ;ani address
;;Drones shouldn't run accidentally
; move *a13(PLYR_TYPE),a14
; cmpi PTYPE_DRONE,a14
; jrz #fail
and a1,a0
cmp a1,a0
jrne #fail
move a2,a4 ;jump to new ani address
#fail
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_ifnohitblock ;72
;ani address (LONG)
move *a4+,a0,L ;this is a conditional goto
move *a13(HITBLOCKER),a14
jrnz skip?
move a0,a4
skip?
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_end ;73
move *a10(OANIMODE),a0
ori MODE_END,a0
move a0,*a10(OANIMODE)
jruc _exit
#********
_ani_ifrope ;74
clr a11
jruc _ani_ifrope_common
#********
_ani_ifnotrope ;75
#MODE equ 0 ;UHW
#DIST equ 10h ;UHW
#ADDR equ 20h ;UHL
#SIZE equ 40h
;word distance
;long jump here if close enough
;word mode RC_FRONT - check rope in front of caller
; RC_BACK - check rope behind caller
; RC_EITHER - check nearest rope
; or'ed with:
; RC_PLAYER - check for caller
; RC_OPPONENT - check for caller's closest opponent
movk 1,a11
_ani_ifrope_common
;prepare OANIPC before doing anything else
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(INRING),a0
jrnz #definitly_too_far
;;;a9 is process ptr of person for whom we're checking
move a13,a9
move *a4(#MODE),a0
sra 8,a0 ;mask off the low byte
jrz #player_set ;RC_PLAYER == 0
move *a13(CLOSEST_NUM),a9
X32 a9
addi process_ptrs,a9
move *a9,a9,L
#player_set
move *a4(#MODE),a14,W ;mode
andi 00FFh,a14 ;mask off the high byte
jrz #check_front ;RC_FRONT == 0
dec a14
jrz #check_back
;;;RC_(FRONT|BACK|EITHER) cases
#check_closest
move *a9(OBJ_XPOSINT),a1
cmpi RING_X_CENTER,a1
jrgt #check_right_rope
jruc #check_left_rope
#check_front
move *a9(FACING_DIR),a0
btst MOVE_RIGHT_BIT,a0
jrnz #check_right_rope
jruc #check_left_rope
#check_back
move *a9(FACING_DIR),a0
btst MOVE_LEFT_BIT,a0
jrnz #check_right_rope
jruc #check_left_rope
;now do the actual check
#check_left_rope
movi vln_left_rope,a6
jruc #check_xxx_rope
#check_right_rope
movi vln_right_rope,a6
#check_xxx_rope
calla calc_line_x
move *a9(OBJ_XPOSINT),a1
sub a0,a1
abs a1
move *a4(#DIST),a0
cmp a0,a1
jrle #close_enough
;a11 is one if we are an IFNOTROPE command, so swap outcomes.
#too_far
dec a11
jrz #close_enough
#definitly_too_far
jruc _next_command
#close_enough
dec a11
jrz #too_far
move *a4(#ADDR),a0,L
move a0,*a10(OANIPC),L
jruc _next_command
#********
_ani_opp_getup ;76
;if TIME is negative, then clear DELAY_METER
#TIME equ 0 ;UHW
#SIZE equ 10h
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a1,L
jrnz #victim_set
;not attached. check WHOIHIT
move *a13(WHOIHIT),a1,L
jrz #done
#victim_set
move *a4(#TIME),a0
jrnn #norm
clr a14
move a14,*a1(DELAY_METER) ;always do delay
abs a0 ;make GETUP_TIME positive
#norm
move *a1(PLYR_DIZZY),a14
jrnz #done
move a0,*a1(GETUP_TIME)
#done
jruc _next_command
#********
_ani_shakecorner ;77
movk 1,a2
movi ROPE_BOUNCEUD,a1
movi ROPE_BACK,a0
calla rope_command
movi ROPE_LEFT,a0
move *a13(OBJ_XPOSINT),a14
cmpi RING_X_CENTER,a14
jrle #dir_set
movi ROPE_RIGHT,a0
#dir_set
movi ROPE_BOUNCEUD,a1
calla rope_command
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_singlestep ;78
calla get_all_buttons_down
move a0,a0
jrnz #done
move a1,*a10(OANICNT)
jruc _exit
#done
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_superslave2 ;79
; # ticks
; attacker frame
; table address
; table index
STRUCT 0 ;ANI_SUPERSLAVE data
WORD #TICKS
LONG #ATTACKER
LONG #TABLE
WORD #INDEX
LABEL #SIZE
STRUCT 0 ;table data
LONG #FRAME
WORD #XOFF
WORD #YOFF
WORD #FLIP
LABEL #TABLE_SIZE
;set OANIPC
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
;verify the links
move *a13(ATTACH_PROC),a11,L
move *a11(ATTACH_PROC),a0,L
cmp a13,a0
jrne #done
move *a4(#TICKS),a0
move *a13(ANI_SPEED),a1
mpyu a0,a1
srl 8,a1
move a1,*a10(OANICNT)
move *a4(#ATTACKER),a0,L
move *a0,a0,L
.if DEBUG
jrnz #ok0
LOCKUP ;image not loaded! (null pointer)
#ok0
.endif
;set the attacker frame
move a0,*a10(OCUR_FRAME),L
;get the slave table
move *a11(WRESTLERNUM),a0
X32 a0
move *a4(#TABLE),a14,L
add a14,a0
move *a0,a5,L
.if DEBUG
move *a5,a0,L
jrnz #ok1
LOCKUP ;no slave table defined!
#ok1
.endif
;get the defender frame
move *a4(#INDEX),a14
movi #TABLE_SIZE,a1
mpyu a14,a1
add a1,a5
move *a5(#FRAME),a0,L
move *a0,a0,L
.if DEBUG
jrnz #ok
LOCKUP ;image not loaded! (null pointer)
#ok
.endif
;set the defender frame
move a0,*a11(CUR_FRAME),L
;compute attach offsets
; attach Y is raw(table)x + defender Xoff - attacker Xoff
;attacker anis in a8, defender in a9
move *a13(CUR_FRAME),a0,L ;attacker frame
calla get_mpart_offsets
move a0,a8
move *a11(CUR_FRAME),a0,L ;defender frame
calla get_mpart_offsets
move a0,a9
;attacker size in a6, defender in a7
move *a13(CUR_FRAME),a0,L ;attacker frame
calla get_mpart_xsize
move a0,a6
move *a11(CUR_FRAME),a0,L ;defender frame
calla get_mpart_xsize
move a0,a7
;compute Y offset
move *a5(#YOFF),a1 ;raw Y
move a9,a14
sra 16,a14
sub a14,a1 ;sub defender aniY
move a8,a14
sra 16,a14
add a14,a1 ;add attacker aniY
move a1,*a13(ATTACH_YOFF)
;attach Xoff:
; no flip: raw x + def xoff - att xoff
; def flip: raw x + (def xsz - def xoff) - att xoff
;compute X offset
move *a5(#XOFF),a1 ;raw X
;defender part in a2
move a9,a2
andi 0FFFFh,a2 ;def xoff
sext a2
callr #attacker_flip_test
jrc #af_match
;attack X's don't match up
move *a5(#FLIP),a14
jrz #def_set
neg a2
add a7,a2 ;def xsize
jruc #def_set
;attack X's match up
#af_match
move *a5(#FLIP),a14
jrnz #def_set
neg a2
add a7,a2 ;def xsize
#def_set
;attacker part in a3
move a8,a3
andi 0FFFFh,a3 ;att xoff
add a2,a1
sub a3,a1
;if X's don't match, negate this
calla #attacker_flip_test
jrc #foox
neg a1
#foox
move a1,*a13(ATTACH_XOFF)
;set flip bits properly
move *a11(OBJ_CONTROL),a3
move *a13(FACING_DIR),a14
btst PLAYER_RIGHT_BIT,a14
jrnz #right
;left
andni M_FLIPH,a3 ;clear flip bit
jruc #cnt
#right
ori M_FLIPH,a3 ;set flip
#cnt
move *a5(#FLIP),a0 ;flip flag
jrz #skip
xori M_FLIPH,a3 ;invert
#skip
move a3,*a11(OBJ_CONTROL)
#done
jruc _exit
SUBRP #attacker_flip_test
;Test for attacker flip. When facing right, flip should be off.
; When facing left, should be on. Set the carry flag if everything
; is okay.
PUSH a0,a1
move *a13(FACING_DIR),a0
move *a13(OBJ_CONTROL),a1
btst B_FLIPH,a1
jrnz #ttf_set
#ttf_clear
btst MOVE_LEFT_BIT,a0
jrnz #ttf_flip
jruc #ttf_noflip
#ttf_set
btst MOVE_RIGHT_BIT,a0
jrnz #ttf_flip
jruc #ttf_noflip
#ttf_flip
PULL a0,a1
clrc
rets
#ttf_noflip
PULL a0,a1
setc
rets
#********
_ani_setoppmode ;80
STRUCT 0
WORD #MODE
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a0,L
jrz #done
move *a0(ATTACH_PROC),a14,L
jrz #done
move *a0(ANIMODE),a1
move *a4(#MODE),a14
or a14,a1
move a1,*a0(ANIMODE)
#done
jruc _next_command
#********
_ani_clroppmode ;81
STRUCT 0
WORD #MODE
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a0,L
jrz #done
move *a0(ATTACH_PROC),a14,L
jrz #done
move *a0(ANIMODE),a1
move *a4(#MODE),a14
andn a14,a1
move a1,*a0(ANIMODE)
#done
jruc _next_command
#********
_ani_oppoffset ;82
STRUCT 0
LONG #TABLE
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a0,L
jrz #done
move *a0(ATTACH_PROC),a14,L
jrz #done
move *a0(WRESTLERNUM),a1
X32 a1
move *a4(#TABLE),a14,L
jrz #done
add a14,a1
move *a0(OBJ_XPOSINT),a2
move *a1+,a3
move *a0(FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #right
neg a3
#right
add a3,a2
move a2,*a0(OBJ_XPOSINT)
move *a0(OBJ_YPOSINT),a2
move *a1+,a3
add a3,a2
move a2,*a0(OBJ_YPOSINT)
#done
jruc _next_command
#********
_ani_ifblocked ;83
move *a4+,a0,L ;this is a conditional goto
move *a13(HITBLOCKER),a1
jrz #skip
move a0,a4 ;new ani pc
#skip
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_waitroll ;84
;Zombies always roll up.
move *a13(STATUS_FLAGS),a14
btst B_ZOMBIE,a14
jrnz #zombie
;DEAD check
move *a13(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #dead
move *a13(I_WILL_DIE),a14
jrz #notded
;I_WILL_DIE is set. If immobilize is zero, die and clear it.
move *a13(IMMOBILIZE_TIME),a14
jrnz #repeat
clr a14
move a14,*a13(IMMOBILIZE_TIME)
move a14,*a13(I_WILL_DIE)
SETMODE DEAD
calla clear_lifebar
jruc #dead
#notded ;since we're not dead, set mode onground, just to be safe
movi MODE_ONGROUND,a14
move a14,*a13(PLYRMODE)
move *a13(IMMOBILIZE_TIME),a0
jrnz #repeat
move *a13(GETUP_TIME),a0
jrnz #repeat
#roll ;clear stars
clr a0
move a0,*a13(STARS_FLAG)
calla do_roll
jrz #getup
#repeat ;come back again next tick.
clr a0
move a0,*a13(Z_BOUND)
movk 1,a0
move a0,*a10(OANICNT)
rets
#getup move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#dead ;if player, change anim to xxx_dead_anim.
;if drone, figure out if we should become a zombie or not.
; if so, set it and roll up until we can't roll no more. Then the
; mode_dead code takes over so we don't worry about it here.
; if not, change to xxx_dead_anim.
move *a13(PLYR_TYPE),a14
cmpi PTYPE_PLAYER,a14
jreq #die
;drone.
calla is_8_on_1
jrc #fin
move @royal_rumble,a14
; jrnz #nolife
jrnz #rlife
jruc #die
#rlife ;royal rumble. give the human team some life
movk 4,a0
clr a1
calla adjust_health
jruc #nolife
#fin ;this is the final match.
; see if there's another guy in the hopper.
; if there is, store his number and become a zombie.
;first, tho, give the guy who killed us some life.
move @PSTATUS,a1
dec a1
;but not if he's already dead!
move a1,a0
X32 a0
addi process_ptrs,a0
move *a0,a0,L
move *a0(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #nolife
movk 8,a0
calla adjust_health
#nolife
move @FINAL_PTR,a0,L
movb *a0,a1
jrn #die ;no more guys
;okay, become a zombie. set our zombie flag, store our new number
; in NEW_WRESTLERNUM, increment FINAL_PTR, and clear our ZOMBIE_TIME.
addk 8,a0
move a0,@FINAL_PTR,L
;7->8 hack
cmpi 7,a1
jrne #vok
movk 8,a1
#vok move a1,*a13(NEW_WRESTLERNUM)
move *a13(STATUS_FLAGS),a14
ori M_ZOMBIE,a14
move a14,*a13(STATUS_FLAGS)
clr a14
move a14,*a13(ZOMBIE_TIME)
;kill our specials
calla kill_smove_procs
;if we're right up against either Z edge of the ring, move away
; a few pixels so we can roll.
move *a13(OBJ_ZPOSINT),a14
cmpi RING_TOP+7,a14
jrle #mvdn
cmpi RING_BOT-7,a14
jrle #zombie
;move up a few
subk 7,a14
move a14,*a13(OBJ_ZPOSINT)
jruc #zombie
#mvdn ;move down a few
addk 7,a14
move a14,*a13(OBJ_ZPOSINT)
#zombie movi J_UP,a14
move a14,*a13(DRN_JOY)
move a14,*a13(STICK_VAL_CUR)
jruc #roll
#die movi xxx_dead_anim,a14
move a14,*a10(OANIBASE),L
move a14,*a10(OANIPC),L
jruc _next_command
#********
_ani_setoppfacing ;85
move *a13(ATTACH_PROC),a0,L
jrz #done
move *a0(ATTACH_PROC),a14,L
jrz #done
move *a0(NEW_FACING_DIR),a14
move a14,*a0(FACING_DIR)
#done
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_ifopp ;86
; .word ANI_IFOPP,wrestler1,wrestler2,...,wrestler3,-1
; sets STATUS if opponent is one of the wrestlers in the list, else clears.
move *a13(CLOSEST_NUM),a11
X32 a11
addi process_ptrs,a11
move *a11,a11,L
move *a11(WRESTLERNUM),a11
;clear mode_status
move *a13(ANIMODE),a0
andni MODE_STATUS,a0
move a0,*a13(ANIMODE)
;compare loop
#loop
move *a4+,a0,W
jrn #done
cmp a0,a11
jrne #loop
;hit. set mode_status
move *a13(ANIMODE),a0
ori MODE_STATUS,a0
move a0,*a13(ANIMODE)
;run off the rest of the list
#runoff
move *a4+,a14
jrnn #runoff
#done
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_snot ;87
move a4,a0
addi 32+4*16,a0 ;LWWWW
move a0,*a10(OANIPC),L
push a10
clr a1 ;proc ID
move *a4+,a7,L ;wake address
move a4,a8 ;* arguments
move a13,a11
calla GETPRC
pull a10
jruc _next_command
#********
_ani_if_butcount_ge ;88
STRUCT 0
WORD #BUTTON
WORD #BUTCNT
LONG #ADDR
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a4(#BUTTON),a14
add a13,a14
move *a14,a14 ;button count
move *a4(#BUTCNT),a0
cmp a0,a14 ;#of presses needed to repeat
jrlt #fail
move *a4(#ADDR),*a10(OANIPC),L ;take branch
#fail
jruc _next_command
*********
_ani_if_butcount_lt ;89
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a4(#BUTTON),a14
add a13,a14
move *a14,a14 ;button count
move *a4(#BUTCNT),a0
cmp a0,a14 ;#of presses needed to repeat
jrge #fail2
move *a4(#ADDR),*a10(OANIPC),L ;take branch
#fail2
jruc _next_command
#********
_ani_if_rptcount ;90
STRUCT 0
LONG #ADDR
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(RPT_COUNT),a14
jrz #fail
move *a4(#ADDR),*a10(OANIPC),L ;take branch
#fail
jruc _next_command
*********
_ani_ifnot_rptcount ;91
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(RPT_COUNT),a14
jrnz #fail2
move *a4(#ADDR),*a10(OANIPC),L ;take branch
#fail2
jruc _next_command
#********
_ani_ringcheck ;92
;If caller and nearest opponent's INRING values don't match, jump
; to #BRANCH
STRUCT 0
LONG #BRANCH
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(CLOSEST_NUM),a11
X32 a11
addi process_ptrs,a11
move *a11,a11,L
move *a11(INRING),a0
move *a13(INRING),a1
cmp a0,a1
jreq #done
move *a4(#BRANCH),a0,L
move a0,*a10(OANIPC),L
#done
jruc _next_command
#********
;--> use this in a PUPPET sequence
;this is the same as calling ani_debris except that
;everything is relative to the wrestler attached to me
_ani_debrisat ;93
move a4,a14
addi 5*16,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a11,L
jrz #done
move *a11(ATTACH_PROC),a14,L
cmp a13,a14
jreq db94
#done
jruc _next_command
#********
_ani_debris ;94
.ref react_debris
move a4,a14
addi 5*16,a14
move a14,*a10(OANIPC),L
move a13,a11
db94
;Stop debris if other smoke is going on! Bog reduction...
move @no_debris,a1
move @reduce_bog,a14
or a14,a1
jrnz _next_command
;Too much bog outside...
move *a13(INRING),a1
jrnz _next_command
push a10
clr a1 ;proc ID
movi react_debris,a7 ;wake address
move a4,a8 ;* arguments
calla GETPRC
pull a10
jruc _next_command
#********
_ani_set_wrestler_xflip ;95
move *a13(FACING_DIR),a14
btst PLAYER_RIGHT_BIT,a14
jrnz #right
move *a13(OBJ_CONTROL),a14
ori M_FLIPH,a14
move a14,*a13(OBJ_CONTROL)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#right
move *a13(OBJ_CONTROL),a14
andni M_FLIPH,a14
move a14,*a13(OBJ_CONTROL)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_slideatopp ;96
; max ticks to slide
; target velocity
; max Z distance
; target area of opponent
; x,y,z offset of attack box
STRUCT 0
WORD #MAX_TICKS
LONG #VELOCITY
WORD #MAX_Z_DIST
WORD #TRGT
WORD #ATT_X_OFF
WORD #ATT_Y_OFF
WORD #ATT_Z_OFF
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(CLOSEST_NUM),a11
X32 a11
addi process_ptrs,a11
move *a11,a11,L
;make sure both have the same INRING value
move *a11(INRING),a0
move *a13(INRING),a1
cmp a0,a1
jrne _next_command
move *a11(OBJ_XPOS),a1,L
move *a11(OBJ_ZPOS),a2,L
move *a11(OBJ_YPOS),a3,L
addi [256,0],a3
move *a11(OBJ_XVEL),a5,L
move *a11(OBJ_ZVEL),a6,L
move *a11(OBJ_YVEL),a7,L
move *a11(GROUND_Y),a8
sll 16,a8
addi [256,0],a8
move *a4(#MAX_TICKS),a0
#lp0
add a5,a1 ;x + xvel
add a6,a2 ;z + zvel
move a7,a7
jrz #ok
add a7,a3 ;y + yvel
;;;; subi GRAVITY,a7 ;yvel - gravity
cmp a3,a8 ;hit ground?
jrgt #ok
move a8,a3
jruc #dn
#ok
dsj a0,#lp0
#dn
subi [256,0],a3
move a1,@oppx,L
move a2,@oppz,L
move a3,@oppy,L
move *a4(#TRGT),a0
jrn #user
calla set_target_offsets
#user
move *a13(TGT_XOFF),a0 ;target x offset
sll 16,a0
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #right1
neg a0
#right1
;;; move *a11(OBJ_XPOS),a1,L
move @oppx,a1,L
add a0,a1 ;def target x
move *a4(#ATT_X_OFF),a0
sll 16,a0
move *a13(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #right0
neg a0
#right0
move *a13(OBJ_XPOS),a2,L
add a0,a2 ;att x
move *a4(#VELOCITY),a0,L
move *a13(FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #pos
neg a0 ;left
#pos
move a0,*a13(OBJ_XVEL),L
; move *a4(#MAX_TICKS),a0
; move a0,*a10(OANICNT)
jruc _next_command
#********
_ani_clr_butcount ;97
move a4,*a10(OANIPC),L
clr a14
; move a14,*a13(PUNCHB_COUNT)
; move a14,*a13(BLOCKB_COUNT)
; move a14,*a13(SPUNCHB_COUNT)
; move a14,*a13(KICKB_COUNT)
; move a14,*a13(SKICKB_COUNT)
move a14,*a13(PUNCHB_COUNT),L
move a14,*a13(SPUNCHB_COUNT),L
move a14,*a13(SKICKB_COUNT)
;;; move a14,*a13(BUT_COUNT)
jruc _next_command
#********
_ani_set_rptcount ;98
STRUCT 0
WORD #VAL
LABEL #SIZE
;If #VAL is negative, set RPT_COUNT to RND(0-#VAL)
move *a4+,a0
jrnn #set
neg a0
calla RNDRNG0
#set move a0,*a13(RPT_COUNT)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_dec_rptcount ;99
move *a13(RPT_COUNT),a0
jrz #atz
dec a0
#atz
move a0,*a13(RPT_COUNT)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_shadowtrail ;100
STRUCT 0
LONG #PALETTE
WORD #RATE
WORD #LIFESPAN
LABEL #SIZE
move *a4,a0
jrnz #not_off
addi 010h,a4
move a4,*a10(OANIPC),L
move *a13(SHADTRAIL_PROC),a0,L ;check proc still exists
jrz #huh
calla KILL
clr a0
move a0,*a13(SHADTRAIL_PROC),L ;proc is toast
#huh
jruc _next_command
#not_off
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move @reduce_bog,a14
jrnz _next_command
push a10
move a4,a8 ;* arguments
move a13,a11 ;* wrestler proc
; move *a13(PLYRNUM),a0
; ori SHADGEN_PID,a0 ;proc ID
; move a0,a1 ;mask
; calla EXISTP ;does process already exist?
; jrz #no_proc
move *a13(SHADTRAIL_PROC),a0,L
jrz #no_proc
;exists, so restart with new arguments
move *a13(PLYRNUM),a1
ori SHADGEN_PID,a1 ;same proc ID
movi shadow_gen,a7 ;wake address
calla XFERPROC
jruc #exit
#no_proc
move *a13(PLYRNUM),a1
ori SHADGEN_PID,a1 ;proc ID
movi shadow_gen,a7 ;wake address
calla GETPRC
move a0,*a13(SHADTRAIL_PROC),L
#exit
pull a10
jruc _next_command
***
;a8 = * arguments
;a11 = * wrestler proc
shadow_gen
#lp
move *a11(SHADTRAIL_PROC),a0,L
jrz #die
move *a11(CUR_FRAME),a10,L ;* multi-part image
clr a1 ;proc ID
movi shadow_proc,a7 ;wake address
calla GETPRC ;create proc for piece
; move *a10(-10h),a9 ;# pieces
; addi (17-7)*16,a10 ;1st header
move *a10(IPCOUNT),a9 ;# pieces
addi IANI2Y,a10 ;1st header
#loop
dec a9
jrz #done
; addi 7*16,a10
addi (ICBZ-IANI2Y),a10
clr a1 ;proc ID
movi shadow_proc,a7 ;wake address
calla GETPRC ;create proc for piece
jruc #loop
#done
move *a8(#RATE),a0
calla PRCSLP ;sleep
jruc #lp
#die
DIE
***
;created from shadow_gen - creates an image, sleeps, delobj & dies
shadow_proc
move *a8(#LIFESPAN),a9
movi Y_SCALE_MULTIPLIER,a0
move *a11(OBJ_ZPOSINT),a1
mpyu a0,a1
move *a11(OBJ_YPOSINT),a0
sll 16,a0
sub a0,a1 ;y pos
move *a11(OBJ_XPOS),a0,L ;x pos
move a10,a2 ;* image
move *a11(OBJ_PRIORITY),a3,L
srl 16,a3 ;z pos
move *a11(OBJ_CONTROL),a4 ;DMA flags
PUSHP a0,a1,a2,a3,a4
SLEEP 1
PULLP a0,a1,a2,a3,a4
move *a8(#PALETTE),a5,L
move a5,b0 ;palette to use
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
calla BEGINOBJP
move a9,a0 ;lifespan
calla PRCSLP ;sleep
;#slp
; move @PCNT,a1
; andi 1,a1
; sll 12,a1
; move *a8(OXPOS),a0
; andi 0fffh,a0
; or a1,a0
; move a0,*a8(OXPOS)
; SLEEP 1
; dsj a9,#slp
calla DELOBJA8
DIE
#********
_ani_createproc ;101
STRUCT 0
LONG #ADDR
WORD #PROCID
WORD #WORD1
WORD #WORD2
WORD #WORD3
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move a13,a11
push a10
move *a4(#PROCID),a1 ;proc ID
move *a4(#ADDR),a7,L ;wake address
addi #WORD1,a4
move a4,a8 ;* arguments
calla GETPRC
pull a10
jruc _next_command
#********
_ani_target ;102
;sets leapat target to #TARGET1 or #TARGET2, depending on the
; value of #MODE.
;ex: ANI_TARGET,TGT_HEAD,TGT_KNEES,ATM_CLOSEST
; target the victim's head or victim's knees, whichever
; is closest.
;NOTE: This assumes that victim is on the ground. If he's
; not, the results will be screwy.
STRUCT 0
WORD #TARGET1 ;TGT_???
WORD #TARGET2 ;TGT_???
WORD #MODE ;ATM_CLOSEST|ATM_FARTHEST
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
;first, figure out the orientation of the wrestlers
calla get_opp_process
move a0,a11
;see if our flip bits match
move *a13(OBJ_CONTROL),a0
move *a11(OBJ_CONTROL),a1
xor a1,a0
btst B_FLIPH,a0
;if Z is set, the flips match and thus the we're facing our
; opponent's feet, thus the #TARGET with the highest value
; is closest. if Z isn't set, the opposite is true.
jrz #facing_feet
jruc #facing_head
#facing_feet
move *a4(#MODE),a14
cmpi ATM_CLOSEST,a14
jreq #choose_highest
jruc #choose_lowest
#facing_head
move *a4(#MODE),a14
cmpi ATM_CLOSEST,a14
jreq #choose_lowest
jruc #choose_highest
#choose_highest
move *a4(#TARGET1),a0
move *a4(#TARGET2),a1
cmp a1,a0
jrge #set
jruc #switch
#choose_lowest
move *a4(#TARGET1),a0
move *a4(#TARGET2),a1
cmp a1,a0
jrle #set
jruc #switch
#switch
move a1,a0
#set
calla set_target_offsets
calla tgt_ground
jruc _next_command
#********
_ani_hmbwait ;103
STRUCT 0
WORD #HIT
WORD #MISSED
WORD #BLOCKED
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
;first check for a block
move *a13(HITBLOCKER),a1
jrz #check_hit
move *a4(#BLOCKED),*a10(OANICNT)
jrz _next_command
rets
;then for a hit
#check_hit
move *a13(ANIMODE),a14
btst MODE_STATUS_BIT,a14
jrz #missed
move *a4(#HIT),*a10(OANICNT)
jrz _next_command
rets
;assume a miss
#missed
move *a4(#MISSED),*a10(OANICNT)
jrz _next_command
rets
#********
_ani_safe_time ;104
move *a4+,a0
move a0,*a13(SAFE_TIME)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
;this won't do anything unless they're attached
_ani_setopp_plyrmode ;105
move *a4+,a0
move a4,*a10(OANIPC),L
move *a13(ATTACH_PROC),a11,L
move *a11(ATTACH_PROC),a14,L
cmp a13,a14
jrne #done
move *a11(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #done
move a0,*a11(PLYRMODE)
#done
jruc _next_command
#********
;this won't do anything unless they're attached
_ani_xflip_opp ;106
move *a13(ATTACH_PROC),a11,L
move *a11(ATTACH_PROC),a14,L
cmp a13,a14
jrne #done
move *a11(OBJ_CONTROL),a0
xori M_FLIPH,a0
move a0,*a11(OBJ_CONTROL)
#done
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
;sets a LONG in wrestler PDATA
_ani_setlong ;107
STRUCT 0
WORD #PDOFF
LONG #LONG
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a4(#PDOFF),a0
add a13,a0
move *a4(#LONG),a1,L
move a1,*a0,L
jruc _next_command
#********
*
_ani_immobilize ;108
move *a4+,a0
move *a13(PLYR_DIZZY),a1
jrnz #skip
move *a13(WHOIHIT),a1,L
;don't immobilize blockers!
move *a1(PLYRMODE),a14
cmpi MODE_BLOCK,a14
jreq #skip
move a0,*a1(IMMOBILIZE_TIME)
;clear his velocities too.
clr a0
move a0,*a1(OBJ_XVEL),L
move a0,*a1(OBJ_YVEL),L
move a0,*a1(OBJ_ZVEL),L
#skip
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
;this flips your opponent based upon flip table
;this won't do anything unless they're attached
_ani_xflip_tbl ;109
STRUCT 0
LONG #FLIPTBL
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a11,L
move *a11(ATTACH_PROC),a14,L
cmp a13,a14
jrne #done
move *a11(WRESTLERNUM),a0
X16 a0
move *a4(#FLIPTBL),a1,L
add a1,a0
move *a0,a0
jrz #done ;no flip
move *a11(OBJ_CONTROL),a0
xori M_FLIPH,a0
move a0,*a11(OBJ_CONTROL)
#done
jruc _next_command
#********
* this sets the vels for a wrestler you're attached to
* x-vel and z-vel are relative to attackers facing dir
;works on attached proc, or WHOIHIT if there isn't one
_ani_setoppvels ;110
STRUCT 0
LONG #XVEL
LONG #YVEL
LONG #ZVEL
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a11,L
move *a11(ATTACH_PROC),a14,L
cmp a13,a14
jreq #attach_match
;no attach. instead do this to WHOIHIT
move *a13(WHOIHIT),a11,L
#attach_match
move *a4(#YVEL),*a11(OBJ_YVEL),L
move *a4(#XVEL),a0,L
move *a13(FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #xok ;right
neg a0 ;left
#xok
move a0,*a11(OBJ_XVEL),L
move *a4(#ZVEL),a0,L
btst MOVE_DOWN_BIT,a14
jrnz #zok ;down
neg a0 ;up
#zok
move a0,*a11(OBJ_ZVEL),L
#done
jruc _next_command
#********
;same as waithitgnd except you pass an offset to add to ground Y
;(so you can make the guy hit the ground sooner)
_ani_waithitgnd2 ;111
STRUCT 0
WORD #OFFSET
LABEL #SIZE
move *a13(OBJ_YVEL),a0,L ;must have down velocity
jrp #no_gnd
;if we're the master and the attach is valid, check and see if
; our puppet has hit the ground.
move *a13(ANIMODE),a14
btst MODE_KEEPATTACHED_BIT,a14
jrz #skip_pcheck
move *a13(ATTACH_PROC),a0,L
jrz #skip_pcheck ;we're attached?
move *a0(ATTACH_PROC),a14,L
jrz #skip_pcheck ;they're attached?
cmp a13,a14
jrne #skip_pcheck ;to each other?
;ah, but if the opponent's MODE_GHOST bit is set, ignore him
move *a0(ANIMODE),a14
btst MODE_GHOST_BIT,a14
jrnz #skip_pcheck
move *a0(OBJ_YPOSINT),a1,W
move *a0(GROUND_Y),a2,W
move *a4(#OFFSET),a14
add a14,a2
cmp a2,a1
jrle #hit_gnd
#skip_pcheck
move *a13(OBJ_YPOSINT),a0
move *a13(GROUND_Y),a2
move *a4(#OFFSET),a14
add a14,a2
cmp a2,a0 ;a0-a1
jrgt #no_gnd
#hit_gnd
sll 16,a2
move a2,*a0(OBJ_YPOS),L
.REF SMALL_BOUNCE
CALLA SMALL_BOUNCE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
jruc _next_command
#no_gnd
movk 1,a0
move a0,*a10(OANICNT) ;# ticks to hold cur frame
rets
#********
_ani_set_opp_xvel ;112
;args: .long (XVEL) .word (MODE) ;if MODE=0 vel is absolute
;if MODE=1 vel is facing relative
;if MODE=2 vel is hit relative
;if MODE=3 vel is new_face relative
move a4,a14
addi 30h,a14
move a14,*a10(OANIPC),L
move *a13(ATTACH_PROC),a11,L
move *a11(ATTACH_PROC),a14,L
cmp a13,a14
jrne #done
move *a4+,a0,L
move *a4+,a1
jrz #abs
dec a1
jrz #face
dec a1
jrz #hit
;new_facing relative
move *a13(NEW_FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #abs ;right
neg a0 ;left
jruc #abs
#hit
;hit relative
move *a13(PLYR_HIT_SIDE),a14
btst MOVE_RIGHT_BIT,a14
jrnz #abs ;hit from right
neg a0 ;hit from left
jruc #abs
#face
move *a13(FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #abs ;right
neg a0 ;left
#abs
move a0,*a11(OBJ_XVEL),L
#done jruc _next_command
#********
_ani_set_attach ;113
move *a13(WHOIHIT),a0,L
move a0,*a13(ATTACH_PROC),L
move a13,*a0(ATTACH_PROC),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_inc_combo_count ;114
move *a13(COMBO_COUNT),a0
inc a0
move a0,*a13(COMBO_COUNT)
CMPI 8,A0
JRNE NO_BESERKER
MOVI HES_JUST_GONE_BERSERK,A0
CALLA IF_SILENT_ADD_VOICE
NO_BESERKER
MOVE *a13(WHOIHIT),A0,L
JRZ PROBLEMS_SS
MOVI 30,A14
move a14,*a0(IMMOBILIZE_TIME)
PROBLEMS_SS
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_clear_combo_count ;115
move *a13(COMBO_COUNT),a0
jrz #start_combo
CLR A0
move a0,*a13(COMBO_COUNT)
MOVE *a13(ATTACH_PROC),A0,L
jrnz #ok
MOVE *a13(WHOIHIT),A0,L
jrnz #ok
;Fix
LOCKUP
#ok
; MOVE *A0(GETUP_TIME),A14
; JRZ NO_WORRIES_MATEY
;Time opponent has to execute combo breaker
clr a14
move a14,*a0(IMMOBILIZE_TIME)
MOVE A14,*A0(GETUP_TIME)
MOVI 10*60,A14
MOVE A14,*A0(DELAY_METER)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#start_combo
;problem here!
;Used to stuff a 1 in COMBO_COUNT.
;Mark now writes a 0 to COMBO_COUNT,
;Jake now skips the write altoghter.
;which is correct?
; movk 1,a0
clr a0
move a0,*a13(COMBO_COUNT)
MOVE *a13(ATTACH_PROC),A0,L
jrnz #ok2
MOVE *a13(WHOIHIT),A0,L
jrnz #ok2
;Fix
LOCKUP
#ok2
; MOVE *A0(GETUP_TIME),A14
; JRZ NO_WORRIES_MATEY
;Time opponent has to execute combo breaker
MOVI 80,A14
move a14,*a0(IMMOBILIZE_TIME)
move @PCNT,a14
move a14,*a0(ANTI_COMBO_TIME) ;Time stamp
CLR A14
MOVE A14,*A0(GETUP_TIME)
;NO_WORRIES_MATEY
MOVI 10*60,A14
MOVE A14,*A0(DELAY_METER)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_add_move ;116
move *a4+,a7
move *a4+,a5
move *a4+,a6
MOVE *A13(WHOIHIT),A0,L
MOVE *A0(PLYRMODE),A14
CMPI MODE_DEAD,A14
JREQ NO_ADD_MORE_JUICE
mmtm sp,a0,a4,a8,a10
calla ADD_TO_COMBO_COUNT
mmfm sp,a0,a4,a8,a10
NO_ADD_MORE_JUICE
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
;
;if num_ticks is negative then use default value
;
_ani_startattack ;117
STRUCT 0
WORD #ATT_TYPE
WORD #NUM_TICKS
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a4(#ATT_TYPE),*a13(ATTACK_TYPE)
move *a4(#NUM_TICKS),a1
jrp #ok
movk 30,a1 ;default tick count
#ok
move @round_tickcount,a0
add a0,a1
move a1,*a13(ATTACK_TIME)
jruc _next_command
#********
_ani_changeanim_tbl ;118
STRUCT 0
LONG #TABLE
LABEL #END
move *a13(WRESTLERNUM),a0
X32 a0
move *a4(#TABLE),a14,L
add a14,a0
move *a0,a0,L
move a0,*a10(OANIBASE),L
move a0,*a10(OANIPC),L
jruc _next_command
#********
_ani_if_rptcount_ge ;119
STRUCT 0
WORD #VAL
LONG #ADDR
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(RPT_COUNT),a14
move *a4(#VAL),a0,W
cmp a0,a14
jrlt #fail
move *a4(#ADDR),*a10(OANIPC),L ;take branch
#fail
jruc _next_command
#********
_ani_if_rptcount_lt ;120
STRUCT 0
WORD #VAL
LONG #ADDR
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a13(RPT_COUNT),a14
move *a4(#VAL),a0,W
cmp a0,a14
jrge #fail
move *a4(#ADDR),*a10(OANIPC),L ;take branch
#fail
jruc _next_command
#********
_ani_waithitany ;121
;holds on current frame until you hit the ground or your opponent.
;NOTE: This doesn't use the WAITHITOPP bit. We poll for a hit,
; which, now that I think about it, was probably the better way
; to implement WAITHITOPP anyway...
;ALSO NOTE: This doesn't work if you're attached. People who
; are attached have no business waiting for a blow to land.
;have we hit the ground?
move *a13(OBJ_YPOSINT),a0
move *a13(GROUND_Y),a1
cmp a1,a0 ;a0-a1
jrgt #no_gnd
;hit ground. make noise and quit.
calla SMALL_BOUNCE
jruc #hit
#no_gnd ;have we hit our opponent?
move *a13(ANIMODE),a14
btst MODE_STATUS_BIT,a14
jrz #no_hit
#hit move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#no_hit movk 1,a0
move a0,*a10(OANICNT) ;# ticks to hold cur frame
rets
#********
_ani_draw_name ;122
;FIX!!
;This is bog! Check to see if we want messages before CREATE!
move a13,a8
CREATE MESSAGE_PID,MOVE_NAME_ANNC
move *a4+,a14
move a14,*a0(PA10),L
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_set_idiot ;123
;Allow players off screen on toss outs
movi 80,a0
move a0,@allow_offscrn
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_attchimage2 ;124
STRUCT 0
LONG #IMAGE
WORD #XOFF
WORD #YOFF
WORD #ZOFF
LABEL #SIZE
; move *a4(#XOFF),*a13(ATTACHIMG_XOFF)
; move *a4(#YOFF),*a13(ATTACHIMG_YOFF)
move *a4(#XOFF),*a13(ATTACHIMG_XOFF),L
move *a4(#ZOFF),*a13(ATTACHIMG_ZOFF)
move *a4(#IMAGE),a0,L
addi #SIZE,a4
jruc attach_cont69
#********
_ani_ground ;125
move *a13(GROUND_Y),a0
move a0,*a13(OBJ_YPOSINT)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_rot ;126
movk 1,a14
move a14,*a10(OANICNT)
rets
#********
_ani_scroll_ctrl;127
STRUCT 0
WORD #Y_VAL
LABEL #SIZE
move a4,a14
addi #SIZE,a14
move a14,*a10(OANIPC),L
move *a4(#Y_VAL),a14
jrn #cont
move a14,*a13(SCROLL_Y)
#cont move *a13(STATUS_FLAGS),a14
ori M_SCROLL_CTRL,a14
move a14,*a13(STATUS_FLAGS)
jruc _next_command
#********
_ani_clear_climb ;128
clr a14
move a14,*a13(CLIMBING_THRU)
inc a14
move a14,*a13(SAFE_TIME)
move a4,*a10(OANIPC),L
; jruc _next_command
jruc _next_command1
#********
_ani_opp_face ;129
move *a4+,a0
move a4,*a10(OANIPC),L
move *a13(ATTACH_PROC),a11,L
move *a11(ATTACH_PROC),a14,L
cmp a13,a14
jrne #done
move *a11(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
xori MOVE_LEFT|MOVE_RIGHT,a0
#no_flip
move a0,*a11(FACING_DIR)
#done
jruc _next_command
#********
_ani_setflag ;129
move *a13(STATUS_FLAGS),a14,L
move *a4+,a0,L
or a0,a14
move a14,*a13(STATUS_FLAGS),L
move a4,*a10(OANIPC),L
jruc _next_command1
#*****************************************************************************
* used inside anim commands - doesn't call animate_wrestler
;a0 = * animation script
;a2 = * wrestler process
SUBR change_anim_anim
move a0,*a2(ANIBASE),L
move a0,*a2(ANIPC),L
movi GRAVITY,a0 ;reset gravity
move a0,*a2(OBJ_GRAVITY),L
clr a0
move a0,*a2(ANIMODE)
movk 1,a0
move a0,*a2(ANICNT)
rets
#*****************************************************************************
;primary animation
;a0 = * animation script
SUBR change_anim1
move *a13(ANIMODE),a2
btst MODE_END_BIT,a2 ;if anim has ended, then
jrnz change_anim1a ;always restart it
move *a13(ANIBASE),a2,L
cmp a0,a2
jreq #no_change
SUBR change_anim1a
move a0,*a13(ANIBASE),L
move a0,*a13(ANIPC),L
clr a0
move a0,*a13(ANIMODE)
movk 1,a0
move a0,*a13(ANICNT)
movi GRAVITY,a0 ;reset gravity
move a0,*a13(OBJ_GRAVITY),L
callr animate_wrestler1
#no_change
rets
#*****************************************************************************
;secondary animation
;a0 = * animation script
SUBR change_anim2
move *a13(ANIMODE2),a2
btst MODE_END_BIT,a2 ;if anim has ended, then
jrnz change_anim2a ;always restart it
move *a13(ANIBASE2),a2,L
cmp a0,a2
jreq #no_change
SUBR change_anim2a
move a0,*a13(ANIBASE2),L
move a0,*a13(ANIPC2),L
clr a0
move a0,*a13(ANIMODE2)
movk 1,a0
move a0,*a13(ANICNT2)
callr animate_wrestler2
#no_change
rets
#*****************************************************************************
SUBR slaveanim_tbl
.long wres_slave_anim ;Bret
.long wres_slave_anim ;Razor
.long wres_slave_anim ;Taker
.long wres_slave_anim ;Yokozuna
.long wres_slave_anim ;Shawn
.long wres_slave_anim ;BamBam
.long wres_slave_anim ;Doink
.long wres_slave_anim ;Adam
.long wres_slave_anim ;Lex
SUBR wres_slave_anim
.word ANI_SETMODE,MODE_UNINT+MODE_NOAUTOFLIP+MODE_NOGRAVITY
.word ANI_ZEROVELS
.word ANI_SETSPEED,100h
.word ANI_END
#*****************************************************************************
SUBR set_images
PUSH a13
movi process_ptrs,a1
movi NUM_WRES,a2
#slp
move *a1+,a13,L
jrz #skp_mtp
PUSH a1,a2
callr #set_image
PULL a1,a2
#skp_mtp
dsj a2,#slp
PULL a13
rets
#set_image
; CLR A5
; MOVE A5,*A13(SCREENY)
move *a13(OBJ_ZPOS),a0,L
ori [01000h,0],a0
move *a13(INRING),a14
jrz #inring
cmpi [015ach,0],a0
jrgt #inring
subi [01e5h,0],a0 ;below mat
#inring
move a0,*a13(OBJ_PRIORITY),L
move *a13(OBJ_XPOS),a5,L ;x val
movi Y_SCALE_MULTIPLIER,a0
move *a13(OBJ_ZPOSINT),a1
mpyu a0,a1
move a1,a6 ;y val
move *a13(OBJ_BASE),a3,L
move a3,a0
movk MAX_PIECES,a1
movi [-100,0],a14 ;set all images offscreen
move *a13(OBJ_PRIORITY),a2,L
clr a7
#lp
move *a0+,a8,L
move a7,*a8(OSAG),L
move a14,*a8(OXVAL),L
move a6,*a8(OYVAL),L ;keep updating YVAL to keep priorities
move a2,*a8(OZVAL),L
dsj a1,#lp
; move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops
; andni 00111b,a7
; movi DMAWNZ,a0
; andi 01111b,a0
; or a0,a7
move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops
andi 0110000b,a7
ori DMAWNZ,a7
clr a10 ;x offset
move *a13(GROUND_Y),a11 ;y offset
; move *a13(CUR_FRAME),a0,L
; move *a0(12*16),a0 ;shadow index
clr a0 ;<------temp!!!!!!
move a0,*a13(PLYR_SHADOW)
; X32 a0
; addi shadows,a0
; move *a0,a0,L
movi shadow,a0
;make shadow low priority
move *a13(OBJ_PRIORITY),a14,L
PUSH a14
movi [013c8h,0],a14 ;inside ring
move *a13(INRING),a1
jrz #in
movi [0106Ah,0],a14 ;outside ring
#in
move a14,*a13(OBJ_PRIORITY),L
callr #plot_object ;plot shadow
PULL a14
move a14,*a13(OBJ_PRIORITY),L
move *a8(OXPOS),a0
move *a13(ANIMODE),a14
btst MODE_NOSHADOW_BIT,a14
jrz #shadow_on
clr a0
#shadow_on
andni 1,a0
move @PCNT,a1
andi 1,a1
or a1,a0
move *a8(OYPOS),a1
andi 1,a1
xor a1,a0
move a0,*a8(OXPOS) ;shake shadow
;leave him off if in mode_invisible
move *a13(ANIMODE),a14
btst MODE_INVISIBLE_BIT,a14
jrnz #done2
move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops
andi 0111111b,a7
clr a10 ;x offset
move *a13(OBJ_YPOSINT),a11 ;y offset
move *a13(CUR_FRAME),a0,L
callr #plot_object ;image
move *a13(OBJ_PAL),a1
move a1,*a8(OPAL)
; move *a0(-10h),a4 ;# pieces
move *a0(IPCOUNT),a4 ;# pieces
.if DEBUG
.bss part_count,16
;part count check
move a4,@part_count
.endif
; addi (13+4-7)*16,a0 ;1st header
addi IANI2Y,a0 ;1st header
#loop1
dec a4
jrz #done1
; addi 7*16,a0
addi (ICBZ-IANI2Y),a0
callr #plot_object ;image
move *a13(OBJ_PAL),a1
move a1,*a8(OPAL)
jruc #loop1
#done1
move *a13(CUR_FRAME),a9,L
move *a9(IANI2X),a14,L ;secondary X & Y
inc a14 ;should be 0
jrz #no_2nd_piece
move *a9(IANIOFFX),a10 ;display x offset
move *a9(IANI2X),a14 ;secondary X
sub a14,a10
move *a9(IANIOFFY),a1 ;display y offset
move *a9(IANI2Y),a14 ;secondary Y
sub a14,a1
add a1,a11
move *a13(CUR_FRAME2),a0,L
callr #plot_object
move *a13(OBJ_PAL),a1
move a1,*a8(OPAL)
; move *a0(-10h),a4 ;# pieces
move *a0(IPCOUNT),a4 ;# pieces
.if DEBUG
;part count check
move @part_count,a14
add a4,a14
cmpi 5,a14
jrle #okay
LOCKUP ;too many pieces!!!
#okay
.endif
; addi (13+4-7)*16,a0 ;1st header
addi IANI2Y,a0 ;1st header
#loop2
dec a4
jrz #done2
; addi 7*16,a0
addi (ICBZ-IANI2Y),a0
callr #plot_object ;image
move *a13(OBJ_PAL),a1
move a1,*a8(OPAL)
jruc #loop2
#no_2nd_piece
movi MODE_END,a0 ;don't bother animating
move a0,*a13(ANIMODE2) ;if no 2nd piece
#done2
; move a13,a3
; addi ATTACH_IMG1,a3
; movk 4,a4
;#attloop
; move *a3+,a8,L
; jrz #skip
;set the x,y & z of image
;; LOCKUP
move *a13(ATTIMG_IMG),a8,L
move *a13(ATTIMG_CUR_FRAME),a0,L
jrnz #onscr
move a0,*a8(OXVAL),L
movi [-100,0],a0 ;set all images offscreen
move a0,*a8(OYVAL),L
rets
#onscr
move *a13(ATTIMG_LAST_FRAME),a1,L
cmp a0,a1
jreq #no_change
;image has just changed
move *a13(ATTIMG_IMG),a8,L
move a0,*a8(OIMG),L
move *a0(0),*a8(OSIZE),L
move *a0(ISAG),*a8(OSAG),L
.if 1
move *a0(ICMAP),a0,L
.ref pal_getf
calla pal_getf
;;; calla pal_find
jrnz #AOK
LOCKUP ;can't get palette
#AOK
move a0,*a8(OPAL)
.endif
move *a8(OIMG),a0,L
movb *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp
move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops
andi 0111111b,a7
setf 6,0,0
move a7,*a8(OCTRL) ;Write 6 low bits
setf 16,1,0
move *a13(OBJ_CONST),*a8(OCONST)
move *a13(ATTIMG_CUR_FRAME),*a13(ATTIMG_LAST_FRAME),L
#no_change
clr a1
move *a13(ATTACHIMG_XOFF),a0
move *a13(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #no_flip
movi M_FLIPH,a1
neg a0
#no_flip
sll 16,a0
add a5,a0
move a0,*a8(OXVAL),L
move *a8(OFLAGS),a0
andni M_FLIPH,a0
or a1,a0
move a0,*a8(OFLAGS)
move *a13(ATTACHIMG_YOFF),a0
sll 16,a0
neg a0
add a6,a0
move a0,*a8(OYVAL),L
move *a13(OBJ_PRIORITY),a0,L
move *a13(ATTACHIMG_ZOFF),a1
sll 16,a1
add a1,a0
move a0,*a8(OZVAL),L
move *a13(OBJ_YPOSINT),a11 ;y offset
move *a8(OIMG),a0,L
move *a0(IANIOFFY),a1
add a11,a1 ;add in Y pos & ani-offset
move a1,*a8(ODYOFF) ;display y offset
move *a0(IANIOFFX),*a8(ODXOFF)
#skip
; dsj a4,#attloop
rets
#plot_object
move *a3+,a8,L ;* object
move a5,*a8(OXVAL),L
move a6,*a8(OYVAL),L
move *a13(OBJ_PRIORITY),*a8(OZVAL),L
move a0,*a8(OIMG),L
move *a0(0),*a8(OSIZE),L
move *a0(ISAG),*a8(OSAG),L
move *a0(IANIOFFX),a1
add a10,a1 ;add in X ani-offset (if any)
move a1,*a8(ODXOFF) ;display x offset
move *a0(IANIOFFY),a1
add a11,a1 ;add in Y pos & ani-offset
move a1,*a8(ODYOFF) ;display y offset
movb *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp
setf 6,0,0
move a7,*a8(OCTRL) ;Write 6 low bits
setf 16,1,0
move *a13(OBJ_CONST),*a8(OCONST)
rets
#*****************************************************************************
shadows
.ref shadow
.long shadow
******************************************************************************
.end