wwf-wrestlemania/WRESTLE2.ASM

5022 lines
98 KiB
NASM
Raw Normal View History

2021-04-06 15:21:54 -07:00
**************************************************************
*
* Software: Jamie Rivett
* Initiated: 5/20/94
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
**************************************************************
.file "wrestle2.asm"
.title "wrestling game program cont..."
.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 "audit.equ"
.include "plyr.equ"
.include "anim.equ"
.include "sound.h"
.include "sound.equ"
.include "ring.equ"
.include "imgtbl.glo"
.include "fontsimg.glo"
.include "bgndtbl.glo"
.include "miscimg.glo"
.include "jjxm.h"
;temp! - 314
.if DEBUG
.include "tmpdebug.h"
.endif
******************************************************************************
* EXTERNAL REFERENCES
.ref PSTATUS,triple_sound,change_anim1a,set_rotate_anim
.ref get_rope_x,round_tickcount,get_process_ptr,NUM_OPPS
.ref PALFRAM,HALT,dma_bog,GAMSTATE,pal_getf,process_ptrs
.ref change_anim2a,announce_rnd_winner,GET_ADJ,pin_prompt
.ref change_image,match_time,is_final_match,is_8_on_1
.ref ADD_VOICE,p1oldwinstreak,match_winner,RNDRNG0
.ref calc_line_x,PCNT,drone_meters_on,FINAL_PTR
.ref dnk_climbthru_side_anim,dnk_climbthru_bot_anim
.ref dnk_climbthru_top_anim,dnk_climbin_bot_anim
.ref dnk_climbin_top_anim,dnk_climbin_side_anim
.ref get_opp_process,adjust_health,init_wres_life_data
.ref HRTPNK_P,HRTBLU_P,UNDBLK_P,DNKPRP_P,YOKPRP_P
.ref LEXPRP_P,RZRPRP_P,BAMYLW_P,SHNPRP_P
.ref wrestler_x,wrestler_y,wrestler_z,index1,index2
.ref dnk_climb_up_anim,shn_climb_up_anim,bam_climb_up_anim
.ref hrt_climb_up_anim,lex_climb_up_anim,und_climb_up_anim
.ref yok_climb_up_anim,rzr_climb_up_anim
.ref bam_climbin_side_anim,bam_climbthru_side_anim
.ref bam_climbin_top_anim,bam_climbthru_top_anim
.ref bam_climbin_bot_anim,bam_climbthru_bot_anim
.ref und_climbin_side_anim,und_climbthru_side_anim
.ref und_climbin_top_anim,und_climbthru_top_anim
.ref und_climbin_bot_anim,und_climbthru_bot_anim
.ref rzr_climbin_side_anim,rzr_climbthru_side_anim
.ref rzr_climbin_top_anim,rzr_climbthru_top_anim
.ref rzr_climbin_bot_anim,rzr_climbthru_bot_anim
.ref hrt_climbin_side_anim,hrt_climbthru_side_anim
.ref hrt_climbin_top_anim,hrt_climbthru_top_anim
.ref hrt_climbin_bot_anim,hrt_climbthru_bot_anim
.ref yok_climbin_side_anim,yok_climbthru_side_anim
.ref yok_climbin_top_anim,yok_climbthru_top_anim
.ref yok_climbin_bot_anim,yok_climbthru_bot_anim
.ref lex_climbin_side_anim,lex_climbthru_side_anim
.ref lex_climbin_top_anim,lex_climbthru_top_anim
.ref lex_climbin_bot_anim,lex_climbthru_bot_anim
.ref shn_climbin_side_anim,shn_climbthru_side_anim
.ref shn_climbin_top_anim,shn_climbthru_top_anim
.ref shn_climbin_bot_anim,shn_climbthru_bot_anim
.ref switches_cur,switches_down,switches_up
.ref dufus_msg_off,get_rnd_wrestler,royal_rumble
.ref START_HI_FLASHES,wrestler_count,buddy_mode_on
.ref reduce_bog,player_pal_pref,crowd_process
.ref wrestler_count,wrestler_count_proc,get_opp_plyrmode
.ref THIS_GAME_TIME,STORE_AUDIT,GET_AUD,CURRENT_LADDER
.ref AUD,match_start_time,PSTARTS,match_realtime
.ref wrestler_audits,current_round,AUD1
******************************************************************************
* SYMBOLS DEFINED IN THIS FILE
#******************************************************************************
*
* a13 = * wrestler process
* a0 = stick_val_cur
SUBR climb_turnbuckle
move a0,a4
btst MOVE_UP_BIT,a4 ;check if player should climb
jrz #not_top ;up the turnbuckle
move *a13(INRING),a0
jrnz #no_climb
move *a13(OBJ_ZPOSINT),a0
cmpi RING_TOP+5,a0 ;give 'em 5 pixels of leeway
jrgt #not_top
move *a13(OBJ_XPOSINT),a0
cmpi RING_X_CENTER,a0
jrgt #right
;#left
calla get_rope_x
move *a13(OBJ_COLLX1),a1
subk 5,a1 ;give 'em 5
cmp a0,a1 ;a1-a0
jrgt #no_climb
movk MOVE_UP_LEFT,a3 ;face top left turnbuckle
cmp a3,a4 ;Make sure UP/LEFT is pressed
jreq #climbit
jruc #no_climb
#right
calla get_rope_x
move *a13(OBJ_COLLX2),a1
addk 5,a1 ;give 'em 5
cmp a0,a1 ;a1-a0
jrlt #no_climb
movk MOVE_UP_RIGHT,a3 ;face top right turnbuckle
cmp a3,a4 ;Make sure UP/RIGHT is pressed
jrne #no_climb
#climbit
;If anybody is already on turnbuckles, ignore this
movi process_ptrs,a4
movi NUM_WRES,a5
#loop move *a4+,a0,L
jrz #nxt ;skip inactive
move *a0(PLYRMODE),a14
cmpi MODE_ONTURNBKL,a14
jrz #found_climber
cmpi MODE_CLIMBTURNBKL,a14
jrz #found_climber
jruc #nxt
#found_climber
;check to see if we're trying to climb the one he's on
move *a13(OBJ_XPOSINT),a14
move *a0(OBJ_XPOSINT),a10
cmpi RING_X_CENTER,a14
jrgt #ck_rt
;left tbukl
cmpi RING_X_CENTER,a10
jrlt #no_climb
jruc #nxt
#ck_rt ;right tbukl
cmpi RING_X_CENTER,a10
jrgt #no_climb
#nxt dsj a5,#loop
;we're going to climb - because we allow 'near misses' to climb,
; we may have to glitch the guy to the corner. do it here.
movi RING_TOP,a14
move a14,*a13(OBJ_ZPOSINT)
move *a13(WRESTLERNUM),a0
X16 a0
addi #face_turnbuckle,a0
move *a0,a0 ;flip facing?
jrz #no_flip
xori MOVE_UP|MOVE_DOWN|MOVE_LEFT|MOVE_RIGHT,a3 ;opposite
#no_flip
move a3,*a13(NEW_FACING_DIR)
move *a13(FACING_DIR),a0
cmp a0,a3
jreq #climb
calla set_rotate_anim
calla change_anim1a
movi #climb,a0 ;this routine gets executed
move a0,*a13(CODE_ADDR),L ;when the rotate anim
SETMODE WAITANIM ;finishes
setc
rets
#climb
move *a13(WRESTLERNUM),a0
X32 a0
addi #climb_anims,a0
move *a0,a0,L
calla change_anim1a
SETMODE CLIMBTURNBKL
setc
rets
#not_top
#no_climb
clrc
rets
;0 = face turnbuckle before climb
;1 = back to turnbuckle
#face_turnbuckle
.word 1 ;0 Bret Hart
.word 1 ;1 Razor Ramon
.word 1 ;2 Undertaker
.word 0 ;3 Yokozuna
.word 0 ;4 Shawn Michaels
.word 1 ;5 Bam Bam
.word 0 ;6 Doink
.word 0 ;7 Adam Bomb
.word 1 ;8 Lex Luger
.word 0 ;9 Referee
#climb_anims
.long hrt_climb_up_anim ;0 Bret Hart
.long rzr_climb_up_anim ;1 Razor Ramon
.long und_climb_up_anim ;2 Undertaker
.long yok_climb_up_anim ;3 Yokozuna
.long shn_climb_up_anim ;4 Shawn Michaels
.long bam_climb_up_anim ;5 Bam Bam
.long dnk_climb_up_anim ;6 Doink
.long dnk_climb_up_anim ;7 Adam Bomb
.long lex_climb_up_anim ;8 Lex Luger
.long dnk_climb_up_anim ;9 Referee
#*****************************************************************************
*
* CLIMB-INS/OUTS
*
SUBR ck_climb_out_bot
move *a13(PLYRMODE),a14
cmpi MODE_ATTACHED,a14
jreq #done
cmpi MODE_RUNNING,a14
jreq #done
cmpi MODE_OPPOVERHEAD,a14
jreq #done
; calla get_opp_process
; move *a0(INRING),a0
; jrz #done
callr any_opp_outside
jrnc #done
;Far enough away from posts?
move *a13(OBJ_XPOSINT),a0
subi RING_X_CENTER,a0
abs a0
cmpi 10Dh,a0
jrgt #done
move *a13(ANIMODE),a0
btst MODE_UNINT_BIT,a0
jrnz #done
;make sure we're at the bottom edge of the ring.
move *a13(OBJ_ZPOS),a0,L
cmpi [RING_BOT,0],a0
jrne #done
;dummy check
callr idiot_check
jrc #climb
;button press
move *a13(BUT_VAL_CUR),a0
move a0,a0
jrz #done
#climb move *a13(WRESTLERNUM),a0
X32 a0
addi climbthru_bot_anims,a0
move *a0,a0,L
calla change_anim1a
movk 2,a0
move a0,*a13(CLIMBING_THRU)
#done rets
#********
SUBR ck_climb_in_top
move *a13(PLYRMODE),a14
cmpi MODE_ATTACHED,a14
jreq #done
cmpi MODE_DEAD,a14
jreq #done
cmpi MODE_RUNNING,a14
jreq #done
cmpi MODE_INAIR,a14
jreq #done
cmpi MODE_INAIR2,a14
jreq #done
cmpi MODE_OPPOVERHEAD,a14
jreq #done
move *a13(CLIMBING_THRU),a0 ;1=Climbing thru ropes flag
jrnz #done
move *a13(OBJ_XPOSINT),a0
subi RING_X_CENTER,a0
abs a0
;Far enough away from posts?
cmpi 0C0h,a0 ;48h
jrgt #done
move *a13(ANIMODE),a0
btst MODE_UNINT_BIT,a0
jrnz #done
;make sure we're at the top edge of the mat.
move *a13(OBJ_ZPOS),a0,L
cmpi [MAT_TOP-5,0],a0
jrne #done
move *a13(MOVE_DIR),a0
btst MOVE_DOWN_BIT,a0
jrz #done
callr idiot_check
jrc #climb
move *a13(BUT_VAL_CUR),a0
move a0,a0
jrz #done
#climb
move *a13(WRESTLERNUM),a0
X32 a0
addi climbin_top_anims,a0
move *a0,a0,L
calla change_anim1a
movk 2,a0
move a0,*a13(CLIMBING_THRU)
#done rets
#********
SUBR ck_climb_out_top
;roll right on through if we're a zombie.
move *a13(STATUS_FLAGS),a14
btst B_ZOMBIE,a14
jrnz #zombie
move *a13(PLYRMODE),a14
cmpi MODE_ATTACHED,a14
jreq #done
cmpi MODE_RUNNING,a14
jreq #done
cmpi MODE_OPPOVERHEAD,a14
jreq #done
; calla get_opp_process
; move *a0(INRING),a0
; jrz #done
callr any_opp_outside
jrnc #done
;Far enough away from posts?
move *a13(OBJ_XPOSINT),a0
subi RING_X_CENTER,a0
abs a0
cmpi 0C0h,a0
jrgt #done
move *a13(ANIMODE),a0
btst MODE_UNINT_BIT,a0
jrnz #done
;make sure we're at the top edge of the ring.
move *a13(OBJ_ZPOS),a0,L
cmpi [RING_TOP,0],a0
jrne #done
;dummy check
callr idiot_check
jrc #climb
;button press
move *a13(BUT_VAL_CUR),a0
move a0,a0
jrz #done
#climb move *a13(WRESTLERNUM),a0
X32 a0
addi climbthru_top_anims,a0
move *a0,a0,L
calla change_anim1a
movk 2,a0
move a0,*a13(CLIMBING_THRU)
#done rets
#zombie move *a13(WRESTLERNUM),a0
X32 a0
addi rollthru_top_anims,a0
move *a0,a0,L
move *a13(ANIBASE),a14,L
cmp a0,a14
jreq #skp ;skip if we're already doing it.
calla change_anim1a
movk 2,a0
move a0,*a13(CLIMBING_THRU)
#skp rets
#********
SUBR ck_climb_in_bot
move *a13(PLYRMODE),a14
cmpi MODE_ATTACHED,a14
jreq #done
cmpi MODE_DEAD,a14
jreq #done
cmpi MODE_RUNNING,a14
jreq #done
cmpi MODE_INAIR,a14
jreq #done
cmpi MODE_INAIR2,a14
jreq #done
cmpi MODE_OPPOVERHEAD,a14
jreq #done
move *a13(CLIMBING_THRU),a0 ;1=Climbing thru ropes flag
jrnz #done
;Far enough away from posts?
move *a13(OBJ_XPOSINT),a0
subi RING_X_CENTER,a0
abs a0
cmpi 10Dh,a0
jrgt #done
move *a13(ANIMODE),a0
btst MODE_UNINT_BIT,a0
jrnz #done
;make sure we're up against the bottom of the ring
move *a13(OBJ_ZPOS),a0,L
cmpi [MAT_BOT+5,0],a0
jrne #done
move *a13(MOVE_DIR),a0
btst MOVE_UP_BIT,a0
jrz #done
;dummy check
callr idiot_check
jrc #climb
;button press
move *a13(BUT_VAL_CUR),a0
move a0,a0
jrz #done
#climb
move *a13(WRESTLERNUM),a0
X32 a0
addi climbin_bot_anims,a0
move *a0,a0,L
calla change_anim1a
movk 2,a0
move a0,*a13(CLIMBING_THRU)
#done rets
#********
SUBR ck_climb_out_side
move *a13(PLYRMODE),a14
cmpi MODE_ATTACHED,a14
jreq #done
cmpi MODE_RUNNING,a14
jreq #done
cmpi MODE_OPPOVERHEAD,a14
jreq #done
; calla get_opp_process
; move *a0(INRING),a1
; jrz #done
callr any_opp_outside
jrnc #done
move *a0(CLIMBING_THRU),a0
CMPI 1,A0
JREQ #done
;Far enough away from posts?
move *a13(OBJ_ZPOSINT),a0
subi RING_Z_CENTER,a0
abs a0
cmpi 48h,a0
jrgt #done
move *a13(ANIMODE),a0
btst MODE_UNINT_BIT,a0
jrnz #done
;make sure we're up against one of the sides
calla get_rope_x
move a0,a4
cmpi RING_X_CENTER,a0
jrgt #rt
#lf move *a13(STICK_VAL_CUR),a0
btst MOVE_LEFT_BIT,a0
jrz #done
move a4,a0
move *a13(OBJ_COLLX1),a1
cmp a0,a1
jrle #out_lf
jruc #done
#rt move *a13(STICK_VAL_CUR),a0
btst MOVE_RIGHT_BIT,a0
jrz #done
move a4,a0
move *a13(OBJ_COLLX2),a1
cmp a0,a1
jrge #out_rt
jruc #done
#out_lf movk MOVE_DOWN_LEFT,a2
jruc #dummy
#out_rt movk MOVE_DOWN_RIGHT,a2
#dummy ;dummy check
callr idiot_check
jrc #special_face
;button press
move *a13(BUT_VAL_CUR),a0
move a0,a0
jrz #done
#face move *a13(FACING_DIR),a1
cmp a2,a1
jreq #climb
move a2,*a13(NEW_FACING_DIR)
calla set_rotate_anim
calla change_anim1a
movi #climb,a0
move a0,*a13(CODE_ADDR),L
SETMODE WAITANIM
movk 1,a0
move a0,*a13(CLIMBING_THRU)
rets
#climb move *a13(WRESTLERNUM),a0
X32 a0
addi climbthru_side_anims,a0
move *a0,a0,L
calla change_anim1a
SETMODE NORMAL
movk 1,a0
move a0,*a13(CLIMBING_THRU)
#done rets
#special_face
move *a13(PLYRMODE),A1
CMPI MODE_WAITANIM,a1
JREQ #done
jruc #face
#********
SUBR ck_climb_in_side
move *a13(PLYRMODE),a14
cmpi MODE_ATTACHED,a14
jreq #done
cmpi MODE_DEAD,a14
jreq #done
cmpi MODE_OPPOVERHEAD,a14
jreq #done
move *a13(CLIMBING_THRU),a0 ;1=Climbing thru ropes flag
jrnz #done
;Far enough away from posts?
move *a13(OBJ_ZPOSINT),a0
subi RING_Z_CENTER,a0
abs a0
cmpi 0D8h,a0
jrgt #done
;is he close enough to the ring?
move *a13(OBJ_XPOSINT),a0
cmpi RING_X_CENTER,a0
jrlt #on_left
;he's right of center
movk MOVE_LEFT_BIT,A2
movi vln_right_matedge2,a6
movk MOVE_DOWN_LEFT,a7
move *a13(OBJ_COLLX1),a14
jruc #d_set
#on_left
;he's left of center
movk MOVE_RIGHT_BIT,A2
movi vln_left_matedge2,a6
movk MOVE_DOWN_RIGHT,a7
move *a13(OBJ_COLLX2),a14
#d_set
move *a13(PLYRMODE),a0
cmpi MODE_RUNNING,a0
jrne no_special_check
move *a13(GETUP_TIME),a0
jrnz #done
jruc running_back_in_here
no_special_check
move *a13(ANIMODE),a0
btst MODE_UNINT_BIT,a0
jrnz #done
move *a13(PLYRMODE),a0
cmpi MODE_HEADHELD,a0
jreq #done
cmpi MODE_HEADHOLD,a0
jreq #done
cmpi MODE_INAIR,a0
jreq #done
cmpi MODE_INAIR2,a0
jreq #done
running_back_in_here
calla calc_line_x
sub a14,a0
abs a0
cmpi 10,a0
jrgt #done
move *a13(MOVE_DIR),a0
btst A2,a0
jrz #done
;idiot check
callr idiot_check
jrc #climb
move *a13(PLYRMODE),a0
cmpi MODE_RUNNING,a0
jrz #climb
;button press
move *a13(BUT_VAL_CUR),a0
move a0,a0
jrz #done
#climb ;he's within five pixels of his mat edge. face the ring
move *a13(FACING_DIR),a1
cmp a7,a1
jreq #jump_in
move a7,*a13(NEW_FACING_DIR)
calla set_rotate_anim
calla change_anim1a
movi #jump_in,a0
move a0,*a13(CODE_ADDR),L
SETMODE WAITANIM
movk 1,a0
move a0,*a13(CLIMBING_THRU)
rets
#jump_in
move *a13(WRESTLERNUM),a0
X32 a0
addi climbin_side_anims,a0
move *a0,a0,L
calla change_anim1a
SETMODE NORMAL
movk 1,a0
move a0,*a13(CLIMBING_THRU)
#done rets
climbthru_bot_anims
.long hrt_climbthru_bot_anim ;0 Bret Hart
.long rzr_climbthru_bot_anim ;1 Razor Ramon
.long und_climbthru_bot_anim ;2 Undertaker
.long yok_climbthru_bot_anim ;3 Yokozuna
.long shn_climbthru_bot_anim ;4 Shawn Michaels
.long bam_climbthru_bot_anim ;5 Bam Bam
.long dnk_climbthru_bot_anim ;6 Doink
.long dnk_climbthru_bot_anim ;7 Adam Bomb
.long lex_climbthru_bot_anim ;8 Lex Luger
.long dnk_climbthru_bot_anim ;9 Referee
climbthru_top_anims
.long hrt_climbthru_top_anim ;0 Bret Hart
.long rzr_climbthru_top_anim ;1 Razor Ramon
.long und_climbthru_top_anim ;2 Undertaker
.long yok_climbthru_top_anim ;3 Yokozuna
.long shn_climbthru_top_anim ;4 Shawn Michaels
.long bam_climbthru_top_anim ;5 Bam Bam
.long dnk_climbthru_top_anim ;6 Doink
.long dnk_climbthru_top_anim ;7 Adam Bomb
.long lex_climbthru_top_anim ;8 Lex Luger
.long dnk_climbthru_top_anim ;9 Referee
climbin_bot_anims
.long hrt_climbin_bot_anim ;0 Bret Hart
.long rzr_climbin_bot_anim ;1 Razor Ramon
.long und_climbin_bot_anim ;2 Undertaker
.long yok_climbin_bot_anim ;3 Yokozuna
.long shn_climbin_bot_anim ;4 Shawn Michaels
.long bam_climbin_bot_anim ;5 Bam Bam
.long dnk_climbin_bot_anim ;6 Doink
.long dnk_climbin_bot_anim ;7 Adam Bomb
.long lex_climbin_bot_anim ;8 Lex Luger
.long dnk_climbin_bot_anim ;9 Referee
climbin_top_anims
.long hrt_climbin_top_anim ;0 Bret Hart
.long rzr_climbin_top_anim ;1 Razor Ramon
.long und_climbin_top_anim ;2 Undertaker
.long yok_climbin_top_anim ;3 Yokozuna
.long shn_climbin_top_anim ;4 Shawn Michaels
.long bam_climbin_top_anim ;5 Bam Bam
.long dnk_climbin_top_anim ;6 Doink
.long dnk_climbin_top_anim ;7 Adam Bomb
.long lex_climbin_top_anim ;8 Lex Luger
.long dnk_climbin_top_anim ;9 Referee
climbthru_side_anims
.long hrt_climbthru_side_anim ;0 Bret Hart
.long rzr_climbthru_side_anim ;1 Razor Ramon
.long und_climbthru_side_anim ;2 Undertaker
.long yok_climbthru_side_anim ;3 Yokozuna
.long shn_climbthru_side_anim ;4 Shawn Michaels
.long bam_climbthru_side_anim ;5 Bam Bam
.long dnk_climbthru_side_anim ;6 Doink
.long dnk_climbthru_side_anim ;7 Adam Bomb
.long lex_climbthru_side_anim ;8 Lex Luger
.long dnk_climbthru_side_anim ;9 Referee
climbin_side_anims
.long hrt_climbin_side_anim ;0 Bret Hart
.long rzr_climbin_side_anim ;1 Razor Ramon
.long und_climbin_side_anim ;2 Undertaker
.long yok_climbin_side_anim ;3 Yokozuna
.long shn_climbin_side_anim ;4 Shawn Michaels
.long bam_climbin_side_anim ;5 Bam Bam
.long dnk_climbin_side_anim ;6 Doink
.long dnk_climbin_side_anim ;7 Adam Bomb
.long lex_climbin_side_anim ;8 Lex Luger
.long dnk_climbin_side_anim ;9 Referee
rollthru_top_anims
REFLONG hrt_rollthru_top_anim ;0 Bret Hart
REFLONG rzr_rollthru_top_anim ;1 Razor Ramon
REFLONG und_rollthru_top_anim ;2 Undertaker
REFLONG yok_rollthru_top_anim ;3 Yokozuna
REFLONG shn_rollthru_top_anim ;4 Shawn Michaels
REFLONG bam_rollthru_top_anim ;5 Bam Bam
REFLONG dnk_rollthru_top_anim ;6 Doink
.long 0 ;7 unused
REFLONG lex_rollthru_top_anim ;8 Lex Luger
#*****************************************************************************
*
* Updates CLIMB_START and CLIMB_LAST, and returns carry if it's time to
* climb. Note that we can't count on idiot_check being called only once
* per tick. As of this writing (28 Feb) it's at least two, and sometimes
* three. If CLIMB_LAST == PCNT, quit. If CLIMB_LAST == PCNT - 1, set
* CLIMB_LAST = PCNT, and compare CLIMB_LAST - CLIMB_START against
* IDIOT_COUNT. On GE, setc and return, else clrc and return. If CLIMB_LAST
* isn't PCNT or PCNT-1, set it and CLIMB_START to PCNT, clrc, and rets.
*
#IDIOT_COUNT .equ 21
SUBRP idiot_check
move *a13(CLIMB_LAST),a14
move @PCNT,a0
cmp a0,a14
jreq #no
inc a14
cmp a0,a14
jreq #cont
;new stick.
move a0,*a13(CLIMB_START)
move a0,*a13(CLIMB_LAST)
#no clrc
rets
#cont move a0,*a13(CLIMB_LAST)
move *a13(CLIMB_START),a14
sub a14,a0
cmpi #IDIOT_COUNT,a0
jrlt #no
;climb!
setc
rets
;#*****************************************************************************
;*
;* a13 = wrestler process
;
; SUBR clear_damage_log
;
; move a13,a2
; addi DAMAGE_HIST,a2 ;start of damage stucture
;
; clr a0
; movk 20,a1 ;8 longs
;#clr_loop
; move a0,*a2+,L
; dsj a1,#clr_loop
;
; rets
;
;
;#*****************************************************************************
;*
;* a13 = wrestler process
;* a0 = damage amount (only if negative)
;
; SUBR log_damage
;
; move a0,a0
; jrnn #not_damage
;
; PUSH a1,a2,a3
;
; move a13,a1
; move a13,a2
;
; addi DAMAGE_HIST+19*32,a1 ;start at end of structure and
; addi DAMAGE_HIST+20*32,a2 ;move everything down 1 long
;
; movk 19,a3
;#lp move -*a1,-*a2,L
; dsjs a3,#lp
;
; move a0,a1 ;damage amount
; neg a1
; sll 16,a1
; move @round_tickcount,a2 ;ticks since match started
; andi 0ffffh,a2
; or a1,a2
; move a2,*a13(DAMAGE_HIST),L
;
; PULL a1,a2,a3
;
;#not_damage
; rets
;
;
;#*****************************************************************************
;*
;* ARGS: a13 = wrestler process
;* a0 = timespan (in ticks)
;*
;* RETURNS: a0 = damage total
;*
;* TRASHES: a1-a6,a14
;*
;
; SUBR tally_damage
;
; move @round_tickcount,a4 ;ticks since match started
; clr a5 ;damage tally
;
; move a13,a1
; addi DAMAGE_HIST,a1 ;start of damage stucture
;
; movk 20,a6
;#loop
; move *a1+,a2 ;tick count
; jrz #exit ;can't have a 0 tick count
; move *a1+,a3 ;damage
;
; move a4,a14
; sub a2,a14
; cmp a0,a14 ;> timespan?
; jrgt #exit
;
; add a3,a5
; dsj a6,#loop
;
;#exit
; move a5,a0
; rets
;
#*****************************************************************************
*
* a10 = player number (0 to NUM_WRES-1)
GETUP_SIZE equ 80 ;102 ;174 ;99
MAX_TIME equ 6*TSEC
INV_MULT equ 256*GETUP_SIZE/MAX_TIME
ONSCR_X equ 173
OFFSCR_X equ 221
STRUCTPD
LONG IPTR_FRAME
LONG IPTR_GREEN
WORD DISPLAY_VAL
SUBR getup_meter
;HACK ALERT: In royal rumble mode, player 1 is on PLAYER 0's TEAM,
; so this code is gonna want to put his getup meter on the left.
; To get it over on the right where it belongs, we temporarily put
; him on the other team. This shouldn't break anything.
move @royal_rumble,a14
jrz #norum
cmpi 1,a10 ;(plyrnum)
jrne #norum
movk 1,a9 ;act like plyr 1 is on team 1.
#norum
move a10,a11 ;a11 is PLYRNUM
move a10,a1
calla get_process_ptr
move a0,a10 ;a10 is our wrestler process
SLEEPK 2
;first off, figure out if this guy is even allowed to have a getup
; meter. Humans always get them. A drone teammate of a human
; doesn't get one. Otherwise, drones only get them if the GETUP
; powerup is set and they're the only drone on their team.
move *a10(PLYR_TYPE),a14
cmpi PTYPE_PLAYER,a14
jreq #yes ;humans get getup meters
movk NUM_WRES,a0
movi process_ptrs,a1
move *a10(PLYR_SIDE),a2 ;we'll need that later anyway.
#lp0 move *a1+,a3,L
jrz #nxt0 ;skip inactive
cmp a3,a10
jreq #nxt0 ;skip self
move *a3(PLYR_SIDE),a14
cmp a14,a2
jrne #nxt0 ;skip other team
move *a3(PLYR_TYPE),a14
cmpi PTYPE_PLAYER,a14
jreq #die ;we have a human teammate so we don't get one
jruc #nxt0
#die clr a14
move a14,*a10(METER_PROC),L
DIE ;multi-drone team--no meters
#nxt0 dsjs a0,#lp0
;we got through the loop and found no teammates, so we're a lone
; drone and we get a meter only if GETUP_POWER is set.
; move @GETUP_POWER,a14
move @drone_meters_on,a14
jrz #die ;no GETUP_POWER--no meter
move @NUM_OPPS,a1
cmpi 2,a1
jrge #die
#yes clr a0
move a0,*a13(DISPLAY_VAL)
;set our x-position based on PLYR_SIDE
movi [OFFSCR_X,0],a10
move a9,a9
jrnz #p2
dec a10
neg a10
#p2
movi RECVRBLK,a2 ;* image (green bar)
movi [109,0],a1 ;y pos
movi 1801h,a3 ;z pos
callr #begin_obj
move a8,*a13(IPTR_GREEN),L
movi RECVR_R,a2 ;* image (frame)
move a9,a9
jrnz #p2_meter
movi RECVR_L,a2 ;* image (frame)
#p2_meter
movi [189,0],a1 ;y pos
movi 1800h,a3 ;z pos
callr #begin_obj
move a8,*a13(IPTR_FRAME),L
move a11,a1
calla get_process_ptr
move a0,a10
move a13,*a10(METER_PROC),L
SUBR slide_offscr
;Don't allow a meter to come out for awhile (unless flung)
movi 18*60,a0 ;13
move a0,*a10(DELAY_METER)
movk 10,a11
#offscr_loop
move a11,a11
jrz #update
dec a11
jruc #cont
#update
movi [OFFSCR_X,0],a0
callr #set_x
move *a10(WHOHITME),A0,L
move *a0(COMBO_COUNT),A14
jrnz #cont
move *a10(DELAY_METER),a14
jrnz #cont
move *a10(PLYRMODE),a14
cmpi MODE_DEAD,a14
jrz #cont
;If health meter is down low, don't have getup meter come out.
;Unless it was a fling!
move *a10(PLYRNUM),a1
.ref get_health
calla get_health
cmpi 20,a0
jrgt #norm
move *a10(GETUP_TIME),a14
cmpi FLUNG_TIME,a14
jrz #onscr
#norm
move *a10(GETUP_TIME),a14
jrnz #onscr
#cont
SLEEPK 1
jruc #offscr_loop
#onscr
move a14,a11
movi GETUP_SIZE,a0
move a0,*a13(DISPLAY_VAL)
MOVI 0BDH,A0 ;Meter announce sound
CALLA triple_sound
movi 120,a6
move *a10(GETUP_TIME),a5
#onscr_loop
movi [ONSCR_X,0],a0
callr #set_x
move *a10(GETUP_TIME),a7
;if a7 (current getup) is greater than a11 (starting getup), our
; scale will be messed up. In this case, just move a7 into a11.
cmp a11,a7
jrle #rescale
move a7,a11
#rescale
movi GETUP_SIZE,a0
mpyu a0,a7 ;* GETUP_SIZE
divu a11,a7 ;/ INITIAL GETUP TIME
move *a13(DISPLAY_VAL),a0
cmp a0,a7 ;has getup been incremented?
jrle #ok1
move a7,a11
movi GETUP_SIZE,a0
mpyu a0,a7 ;* GETUP_SIZE
divu a11,a7 ;/ INITIAL GETUP TIME
#ok1
.ref dufus_msg_on
subk 1,a6
jrnz #dont_bother
move *a10(GETUP_TIME),a0
sub a0,a5
cmpi 175,a5
jrgt #dont_bother
PUSH a2,a7,a9
movk 2,a9
CREATE 4000h|AWARD_PID,dufus_msg_on
PULL a2,a7,a9
#dont_bother
PUSH a5,a6
callr #update_meter
PULL a5,a6
move a7,a7
jrz slide_offscr
move *a10(PLYRMODE),a0
cmpi MODE_DEAD,a0
jrz slide_offscr
PUSHP a5,a6
SLEEPK 1
PULLP a5,a6
jruc #onscr_loop
**********
SUBRP #set_x
move a9,a9
jrnz #p22
neg a0
#p22
addi [200-1,0],a0 ;center of screen
move a13,a14
addi IPTR_FRAME,a14
move *a14,a8,L
move *a8(OXVAL),a1,L
sub a1,a0
sra 2,a0
movk 3-1,a1
#lp move *a14+,a8,L
move *a8(OXVAL),a2,L
add a0,a2
move a2,*a8(OXVAL),L
dsj a1,#lp
rets
**********
SUBRP #begin_obj
movi [200-1,0],a0 ;x pos
add a10,a0
movi DMAWNZ|M_SCRNREL,a4 ;DMA flags
clr a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
calla BEGINOBJ
rets
**********
SUBRP #update_meter
move *a13(DISPLAY_VAL),a0
add a0,a7
srl 1,a7
move a7,*a13(DISPLAY_VAL)
move a7,a1
neg a1
addi GETUP_SIZE,a1
jrp #ok
clr a1
#ok movi GETUP_SIZE,a0
cmp a0,a1 ;meter can't be taller
jrle #ok2 ;than GETUP_SIZE pixels
move a0,a1
#ok2 move *a13(IPTR_GREEN),a8,L
MOVI GETUP_SIZE,A2
SUB A1,A2
MOVE A2,*A8(OSIZEY)
MOVI RECVRBLK,A0
MOVE *A0(ICTRL),A5
SRL 12,A5
MOVE A1,A3
MPYU A5,A3
MOVE *A0(ISIZEX),A5
MPYU A5,A3
MOVE *A0(ISAG),A0,L
ADD A3,A0
MOVE A0,*A8(OSAG),L
rets
#*****************************************************************************
*
* makes your getup meter go away if you've got one out.
SUBR ditch_getup_meter_a9
PUSH a13
move a9,a13
callr ditch_getup_meter
PULL a13
rets
SUBR ditch_getup_meter
move *a13(GETUP_TIME),a0
jrz #cont
move *a13(PLYR_DIZZY),a0
jrnz #cont
;This guy has a getup meter on screen and is running out of control!
;Cause getup meter to slide off screen.
move *a13(METER_PROC),a0,L
jrz #cont ;skip if we don't have a meter.
PUSH a8,a9,a10
move *a0(PA8),a8,L
move *a0(PA9),a9,L
move *a0(PA10),a10,L
movi GETUP_PID,a1
movi slide_offscr,a7
calla XFERPROC
PULL a8,a9,a10
#cont rets
#*****************************************************************************
*
* a0 = # ticks to add
* a13 = * wrestler process
SUBR inc_getup_time
PUSH a14
move *a13(GETUP_TIME),a14
cmpi 20,a14
jrlt #exit
add a0,a14
move a14,*a13(GETUP_TIME)
#exit
PULL a14
rets
#*****************************************************************************
*
* do rolls for any wrestler
*
* args : a13 = * wrestler process
*
* returns : Z=1 if didn't roll
SUBR do_roll
move *a13(OBJ_ZPOSINT),a0
move *a13(Z_BOUND),a14
jrz #reg
sub a0,a14
abs a14 ;<-new!
cmpi 6,a14
jrle #no_roll
#reg
move *a13(STICK_VAL_CUR),a0
andi MOVE_UP|MOVE_DOWN,a0
jrz #no_roll
move *a13(WRESTLERNUM),a14
X32 a14
addi #roll_table,a14
move *a14,a14,L
move *a14+,a1 ;roll speed
move *a14+,a2,L ;z velocity
btst MOVE_DOWN_BIT,a0
jrnz #down
neg a1 ;must be up
neg a2
#down
move a2,*a13(OBJ_ZVEL),L
move *a13(ROLL_POS),a0
add a0,a1
andi 0ffh,a1
move a1,*a13(ROLL_POS)
move *a14+,a0,L ;inv multiplier
mpyu a0,a1
srl 16,a1 ;/65536
X32 a1
add a1,a14
move *a14,a0,L
.if DEBUG
jrnz #ok
LOCKUP
#ok
.endif
move *a0,a0,L
.if DEBUG
jrnz #ok2
LOCKUP
#ok2
.endif
move a0,*a13(CUR_FRAME),L
rets
#no_roll
clr a0
move a0,*a13(OBJ_ZVEL),L
rets
#roll_table
REFLONG hrt_roll_frames ;0 Bret Hart
REFLONG rzr_roll_frames ;1 Razor Ramon
REFLONG und_roll_frames ;2 Undertaker
REFLONG yok_roll_frames ;3 Yokozuna
REFLONG shn_roll_frames ;4 Shawn Michaels
REFLONG bam_roll_frames ;5 Bam Bam
REFLONG dnk_roll_frames ;6 Doink
.long 0 ;7 unused
REFLONG lex_roll_frames ;8 Lex Luger
;
;#*****************************************************************************
;
; SUBR check_dizzy
;
; movi 4*TSEC,a0
; calla tally_damage
;
;;Is this the right way to causes dizzies?
;;If one move is super powerful, we will tend to get dizzies when we don't want
;;them. Maybe it should be based on hits over time, not damage.
;
;;A combination of the two is needed here! 10/5/94
;
;;We need less resolution on the damage that is recorded!
;;Perhaps 1-3?
;
;;We should allow this to happen only once per round!
;
; cmpi 65,a0
;
; jrlt #no_dizzy
;
; jruc #no_dizzy
;
;
; calla clear_damage_log
;
;;Don't allow dizzies if your health meter is real low!
;;Killer Instinct sucks....
; move *a13(PLYRNUM),a1
; .ref get_health
; calla get_health
; cmpi 30,a0
; jrlt #no_dizzy
;
;;Too many dizzies this round?
; move *a13(PLYR_DIZZY_CNT),a0
; cmpi 1,a0 ;Max dizzies per round
; jrge #no_dizzy
;
; inc a0
; move a0,*a13(PLYR_DIZZY_CNT)
;
;
; movk 1,a0 ;return TRUE
; move a0,*a13(PLYR_DIZZY)
; rets
;
;#no_dizzy
; clr a0 ;return FALSE
; rets
#*****************************************************************************
SUBR form_button_value
;Combine the val_cur of the block bit with the val_down of the rest.
move *a13(BUT_VAL_CUR),a0
andi PLAYER_BLOCK_VAL,a0
move a0,a1
move *a13(BUT_VAL_DOWN),a0
or a1,a0
rets
;
;#*****************************************************************************
;
; SUBR start_whack
;
;;a10=plyr proc
;;Turn on whack button graphic, animate it for a bit
;
;frame_z .equ 202
;
; movk 1,a0
; move a0,*a10(WHACK_CNT)
;
; movi [0f6h,0],a1
; movi [44h,0],a0
; move *a10(PLYRNUM),a2
; jrz #ok
; movi [401-44h,0],a0
;#ok
; movi WHAK0001,a2
; movi frame_z+2,a3 ;Z
; movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags
; movi OVRHED_PID,a5
; clr a6
; clr a7
; calla BEGINOBJ
; move a8,a11
;
; movi [0f6h,0],a1
; movi [44h,0],a0
; move *a10(PLYRNUM),a2
; jrz #ok2
; movi [401-44h,0],a0
;#ok2
; movi WKBUTT01,a2
; movi frame_z+3,a3 ;Z
; movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags
; movi OVRHED_PID,a5
; clr a6
; clr a7
; calla BEGINOBJ
;
;#start
; movi butn_l,a9
;
;#lp move *a10(GETUP_TIME),a0
; jrz #die
;
; move *a9+,a0,L
; jrz #start
; move *a8(OCTRL),a1
; calla obj_aniq
;#noani
; SLEEPK 3
; jruc #lp ;Going up?
;
;#die
; SLEEPK 10
;
; move a11,a0
; calla DELOBJ
; jauc DELOBJDIE
;
;
;butn_l
; .long WKBUTT01
; .long WKBUTT02
; .long WKBUTT03
; .long WKBUTT02
; ; .long 0
#*****************************************************************************
*
* Gets the animation point of a multipart object. Find the highest x and y
* offset values among all the pieces.
*
* >a0 = object table pointer
* <a0 = [Yoff,Xoff]
SUBR get_mpart_offsets
PUSH a1,a2,a9
;reg use
; a1 = current hi xoff
; a2 = current hi yoff
; a9 = loop counter
move *a0(IPCOUNT),a9
.if DEBUG
jrle #bad
cmpi 5,a9
jrgt #bad
jruc #ok
#bad LOCKUP
#ok
.endif
move *a0(IANIOFFX),a1
move *a0(IANIOFFY),a2
addi ICBZ,a0
dec a9
jrle #done
#loop
move *a0(IANIOFFX),a14
cmp a1,a14
jrle #xc
move a14,a1 ;new hi x
#xc
move *a0(IANIOFFY),a14
cmp a2,a14
jrle #yc
move a14,a2 ;new hi y
#yc
addi ICPBZ,a0
dsj a9,#loop
#done
sla 16,a2
move a2,a0
zext a1 ;clear out sign
or a1,a0
PULL a1,a2,a9
rets
#*****************************************************************************
*
* Gets the combined X size of a multi-part object. The correct answer is
* (hi anipt) + hi (size - anipt)
*
* >a0 = object table pointer
* <a0 = Xsize
SUBR get_mpart_xsize
PUSH a1,a2,a3,a9
;reg use
; a1 = current hi anipt
; a2 = current hi size - anipt
; a9 = loop counter
move *a0(IPCOUNT),a9
move *a0(IANIOFFX),a1
move *a0(ISIZEX),a2
sub a1,a2
addi ICBZ,a0
dec a9
jrz #done
#loop
move *a0(IANIOFFX),a14
cmp a1,a14
jrle #ac
move a14,a1 ;new hi x
#ac
move *a0(ISIZEX),a14
move *a0(IANIOFFX),a3
sub a3,a14
cmp a2,a14
jrle #sac
move a14,a2 ;new hi y
#sac
addi ICPBZ,a0
dsj a9,#loop
#done
move a2,a0
add a1,a0
PULL a1,a2,a3,a9
rets
#*****************************************************************************
*
* Zero yer TGT_YOFF. Do this anytime you target an opponent who's on the
* ground.
SUBR tgt_ground
clr a14
move a14,*a13(TGT_YOFF)
rets
#*****************************************************************************
*
* Halves wrestler's X-velocity if he's moving backwards.
SUBR halve_bk_xvel
move *a13(OBJ_XVEL),a0,L
move *a13(FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #abs
neg a0
#abs
move a0,a0
jrnn #ok
move *a13(OBJ_XVEL),a0,L
sra 1,a0
move a0,*a13(OBJ_XVEL),L
#ok
rets
#*****************************************************************************
*
* scroll_world moves the screen based on the midpoint of a segment connecting
* two wrestlers. Rules:
*
* - If there are two and only two active wrestlers, track on them.
* - If there are more than two active wrestlers and two are human, track
* on the humans.
* - If there are more than two active wrestlers, but only one is human,
* count his live opponents:
* 0: track on only the human player
* 1: track on human and his one live opponent
* 2: track on the human and the mean position of the two live ones.
* 3: track on the human and the mean position of the three live ones,
* with the closest counted twice.
* - If there are more than two active wrestlers, and NONE of them are
* human, look for a live one. If none are alive, track on the first
* dead one and his closest opponent. If one or more is alive, track
* on the first live one and his closest opponent.
* - Don't let any human players off the top of the screen.
* - In royal rumble mode, just track on the average position of all live
* wrestlers. If this results in everyone being offscreen, so be it.
* - And finally, on top of everything else, if there's only one human
* player, under no circumstances will the scroller let him off-screen.
* He'll remain entirely on the screen regardless of whatever else might
* be going on. (as yet unimplemented. coming soon...)
*
#BUFFER equ [20,0]
#XMINUSX .equ 0
#YMINUSX .equ #XMINUSX+32*(NUM_WRES+1)
#ZMINUSX .equ #YMINUSX+32*(NUM_WRES+1)
LIMITXL .EQU [12FH,0]
LIMITXR .EQU [5E8H,0]
LIMITYT .EQU [200H,0]
LIMITYB .EQU [97h,0]
SUBR scroll_world
MMTM SP,A8,A9,A10,A11
.ref in_finish_move
move @in_finish_move,a0
jrnz #x
move @HALT,a0
jrnz #x
;first, check for a royal rumble
move @royal_rumble,a14
jrnz #rumble
;check for two human players
move @PSTATUS,a0
jrz #no_humans
cmpi 3,a0
jrne #one_human
;two humans. track on them.
clr a2
movk 1,a3
jruc #indices_set
#one_human
;okay, we have only one player. If this is one-on-one, track on
; him and the drone. (also, get the human's process ptr in a8)
move a0,a8
dec a8
X32 a8
addi process_ptrs,a8
move *a8,a8,L
move @NUM_OPPS,a14
dec a14
jrnz #one_v_many
;plyr v. one drone
move *a8(PLYRNUM),a2
movk 2,a3
jruc #indices_set
#one_v_many
;count live opponents. If there is one, track the human and his
; closest opponent, which should be the live drone. If there are
; none or more than one, track only on the human.
;NOTE: Don't count opponents who are live but have different INRING
; values.
movk NUM_WRES-2,a0
movi process_ptrs+40h,a1
move *a8(PLYR_SIDE),a2
move *a8(INRING),a5
clr a4 ;live enemy counter
#lp0 move *a1+,a3,L
jrz #done0 ;quit at first inactive since we're only
;looking at drones
move *a3(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #nxt0 ;skip dead
move *a3(PLYR_SIDE),a14
cmp a2,a14
jreq #nxt0 ;skip teammates
move *a3(INRING),a14
cmp a5,a14
jrne #nxt0 ;skip bad INRINGS
inc a4
#nxt0 dsj a0,#lp0
#done0 dec a4
jrn #track_human_only ;0 live opponents
jrz #1opp ;1 live opponent
dec a4
jrz #2ops ;2 live opponents
jruc #3ops ;3 live opponents
;for the three cases (#2ops, #3ops, #rumble) where we're tracking on
; a mean position rather than an actual wrestler, we store the mean
; position in the long word immediately before wrestler_[xyz].
; There's extra space allocated there.
;reggies:
; a5 = x accumulator
; a6 = y accumulator
; a7 = z accumulator
#rumble ;There are anywhere from 1 to 4 live wrestlers. Track on the live
; ones. If there's three, double-weight the one with the dead
; teammate. Since we've only got space for one artificial set
; of coordinates, if we get all four alive, compute the average
; position of all four, put that in the artificial slot, and track
; on it twice.
;first, count live wrestlers (drone and human)
movi process_ptrs,a0
movk 4,a1 ;only interested in plyrnum's 0-3
clr a3 ;live count
clr a4 ;PLYRNUMS
clr a5 ; of
clr a6 ; live
clr a7 ; wrestlers
#lp3 move *a0+,a2,L
move *a2(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #nxt3
move *a2(I_WILL_DIE),a14
jrnz #nxt3
inc a3
move a6,a7
move a5,a6
move a4,a5
move *a2(PLYRNUM),a4
#nxt3 dsj a1,#lp3
;okay, branch based on the live count
dec a3
jrn #rr0liv ;none alive? shouldn't happen.
jrz #rr1liv
subk 2,a3
jrn #rr2liv
jrz #rr3liv
jruc #rr4liv
#rr0liv ;none alive(!?) Track on the humans
clr a2
movk 1,a3
jruc #indices_set
#rr1liv ;one alive. Track on him.
move a4,a2
move a4,a3
jruc #indices_set
#rr2liv ;two alive. Track on them.
move a4,a2
move a5,a3
jruc #indices_set
#rr3liv ;three alive. Since one human CAN'T be dead, the dead one must
; be a drone. Track on the drone and the average position of the
; wrestlers. (a5 and a6 must be the humans, a4 the drone)
;#0 (human)
movi wrestler_x,a0
move *a0(#XMINUSX),a5,L
move *a0(#YMINUSX),a6,L
move *a0(#ZMINUSX),a7,L
;#1 (human)
movi wrestler_x+20h,a0
move *a0(#XMINUSX),a14,L
add a14,a5
move *a0(#YMINUSX),a14,L
add a14,a6
move *a0(#ZMINUSX),a14,L
add a14,a7
;divide
sra 1,a5
sra 1,a6
sra 1,a7
;store
movi wrestler_x-20h,a0
move a5,*a0(#XMINUSX),L
move a6,*a0(#YMINUSX),L
move a7,*a0(#ZMINUSX),L
;go
movi -1,a2
move a4,a3
jruc #indices_set
#rr4liv ;four alive. Track on all of 'em.
;#0
movi wrestler_x,a0
move *a0(#XMINUSX),a5,L
move *a0(#YMINUSX),a6,L
move *a0(#ZMINUSX),a7,L
;#1
movi wrestler_x+20h,a0
move *a0(#XMINUSX),a14,L
add a14,a5
move *a0(#YMINUSX),a14,L
add a14,a6
move *a0(#ZMINUSX),a14,L
add a14,a7
;#2
movi wrestler_x+40h,a0
move *a0(#XMINUSX),a14,L
add a14,a5
move *a0(#YMINUSX),a14,L
add a14,a6
move *a0(#ZMINUSX),a14,L
add a14,a7
;#3
movi wrestler_x+60h,a0
move *a0(#XMINUSX),a14,L
add a14,a5
move *a0(#YMINUSX),a14,L
add a14,a6
move *a0(#ZMINUSX),a14,L
add a14,a7
;divide
sra 2,a5
sra 2,a6
sra 2,a7
;store
movi wrestler_x-20h,a0
move a5,*a0(#XMINUSX),L
move a6,*a0(#YMINUSX),L
move a7,*a0(#ZMINUSX),L
;go
movi -1,a2
movi -1,a3
jruc #indices_set
#3ops ;opponents must be plyrnum's 2, 3, and 4.
;closest
move *a8(CLOSEST_NUM),a0
X32 a0
addi wrestler_x,a0
move *a0(#XMINUSX),a5,L
move *a0(#YMINUSX),a6,L
move *a0(#ZMINUSX),a7,L
;#2
movi wrestler_x+40h,a0
move *a0(#XMINUSX),a14,L
add a14,a5
move *a0(#YMINUSX),a14,L
add a14,a6
move *a0(#ZMINUSX),a14,L
add a14,a7
;#3
movi wrestler_x+60h,a0
move *a0(#XMINUSX),a14,L
add a14,a5
move *a0(#YMINUSX),a14,L
add a14,a6
move *a0(#ZMINUSX),a14,L
add a14,a7
;#4
movi wrestler_x+80h,a0
move *a0(#XMINUSX),a14,L
add a14,a5
move *a0(#YMINUSX),a14,L
add a14,a6
move *a0(#ZMINUSX),a14,L
add a14,a7
;divide
sra 2,a5
sra 2,a6
sra 2,a7
;store
movi wrestler_x-20h,a0
move a5,*a0(#XMINUSX),L
move a6,*a0(#YMINUSX),L
move a7,*a0(#ZMINUSX),L
;go
move *a8(PLYRNUM),a2
movi -1,a3
jruc #indices_set
#2ops ;opponents could have 2, 3, or 4. loop.
clr a5
clr a6
clr a7
movk NUM_WRES-2,a9 ;only check drones
movi process_ptrs+40h,a1
move *a8(PLYR_SIDE),a2
move *a8(INRING),a11
#lp2 move *a1+,a0,L
jrz #done2 ;quit at first inactive--only checking drones
move *a0(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #nxt2 ;skip dead
move *a0(PLYR_SIDE),a14
cmp a14,a2
jreq #nxt2 ;skip teammates
move *a0(INRING),a14
cmp a14,a11
jrne #nxt2 ;skip bad INRINGs
move *a0(OBJ_XPOS),a14,L
add a14,a5
move *a0(OBJ_YPOS),a14,L
add a14,a6
move *a0(OBJ_ZPOS),a14,L
add a14,a7
#nxt2 dsj a9,#lp2
#done2 ;divide
sra 1,a5
sra 1,a6
sra 1,a7
;store
movi wrestler_x-20h,a0
move a5,*a0(#XMINUSX),L
move a6,*a0(#YMINUSX),L
move a7,*a0(#ZMINUSX),L
;go
move *a8(PLYRNUM),a2
movi -1,a3
jruc #indices_set
#1opp move *a8(PLYRNUM),a2
move *a8(CLOSEST_NUM),a3
jruc #indices_set
#track_human_only
move *a8(PLYRNUM),a2
move a2,a3
jruc #indices_set
#no_humans
;attract mode play. track on first live drone and his closest
; opponent.
movk NUM_WRES,a0
movi process_ptrs,a1
#lp1 move *a1+,a2,L
jrz #nxt1 ;skip inactive
move *a2(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #nxt1 ;skip dead (shouldn't happen)
;found a live drone. track on him and his closest opp
move *a2(CLOSEST_NUM),a3
move *a2(PLYRNUM),a2
jruc #indices_set
#nxt1 dsj a0,#lp1
;bizarre. everyone's dead in the attract mode. Just track on
; first two drones.
movk 2,a2
movk 3,a3
;fall through to #indices_set
#indices_set
;a2 and a3 are PLYRNUM's of wrestlers to track on. They MAY be
; the same.
move a2,a0
move a2,a10
move a2,a8
X32 a0
X32 a10
X32 a8
addi wrestler_x,a0
addi wrestler_y,a10
addi wrestler_z,a8
move a3,a1
move a3,a11
move a3,a9
X32 a1
X32 a11
X32 a9
addi wrestler_x,a1
addi wrestler_y,a11
addi wrestler_z,a9
;wrestler1 (*x,*y,*z) = (a0,a10,a8)
;wrestler2 (*x,*y,*z) = (a1,a11,a9)
#values_set
move *a0,a0,L
move *a1,a1,L
add a0,a1
sra 1,a1
subi [200,0],a1 ;middle of screen
move @WORLDTLX,a2,L
sub a2,a1
jrp #pos
addi #BUFFER,a1
jrp #wide
jruc #cont
#pos subi #BUFFER,a1
jrn #wide
#cont sra 3,a1
add a1,a2
cmpi [12fh,0],a2
jrlt #wide
cmpi [648h,0],a2
jrgt #wide
move a2,@WORLDTLX,L
#wide move *a8,a0,L
move *a9,a1,L
add a0,a1
sra 1+16,a1
movi Y_SCALE_MULTIPLIER,a0
mpys a0,a1
move a1,a2
move *a10,a0,L
move *a11,a1,L
add a0,a1
sra 1,a1
sub a1,a2
subi [0d8h,0],a2 ;middle of screen
;Check for SCROLL_CTRL bits on active wrestlers.
movi process_ptrs,a0
movk NUM_WRES,a9
#lp4 move *a0+,a3,L
jrz #nxt4 ;skip inactive
move *a3(STATUS_FLAGS),a14
btst B_SCROLL_CTRL,a14
jrz #nxt4
;control found. On screen in X?
move *a3(OBJ_XPOS),a1,L
move @WORLDTLX,a14,L
subi [60,0],a14
cmp a14,a1
jrlt #nxt4
addi [400+120,0],a14
cmp a14,a1
jrgt #nxt4
;calc hi pt
move *a3(OBJ_ZPOSINT),a1
movi Y_SCALE_MULTIPLIER,a14
mpys a14,a1
move *a3(OBJ_YPOS),a14,L
sub a14,a1
move *a3(SCROLL_Y),a14
sla 16,a14
sub a14,a1
cmp a2,a1
jrge #nxt4
#top_ok move a1,a2
#nxt4 dsj a9,#lp4
#sc_done
move @WORLDTLY,a1,L
sub a1,a2
sra 2,a2
add a2,a1
;Don't allow scroller to go past front fence
cmpi [97h,0],a1
jrgt #low
move a1,@WORLDTLY,L
#low
#x MMFM SP,A8,A9,A10,A11
rets
#*****************************************************************************
*
* this is called before the velocity add and
* it's goal is to keep either wrestler from moving
* offscreen if one or both are outside the ring
#BUFF1 equ 185
#BUFF2 equ 185 ;140
SUBR keep_onscreen
;confine only in two-player game.
move @PSTATUS,a14
cmpi 3,a14 ;is it a 2-player game?
jrne #no_2_player
move @WORLDTLX+16,a0 ;world x int
addi 200,a0 ;center of screen
move a0,a1
cmpi RING_X_CENTER,a0
jrgt #right_side
#left_side
subi #BUFF2,a0 ;left edge
addi #BUFF1,a1 ;right edge
jruc #cont
#right_side
subi #BUFF1,a0
addi #BUFF2,a1
#cont
move @process_ptrs,a10,L ;player 1
move @process_ptrs+20h,a11,L ;player 2
; move *a10(DEC_DELAY),a14
; jrnz #inring
; move *a11(DEC_DELAY),a14
; jrnz #inring
.ref allow_offscrn
move @allow_offscrn,a14
jrz #ok
dec a14
move a14,@allow_offscrn
jrnz #inring
#ok
move *a10(INRING),a14
jrnz #outside
move *a11(INRING),a14
jrz #inring
#outside ;at least 1 player outside the ring
move a10,a9
callr #do_check
move a11,a9
callr #do_check
#inring
#no_2_player
rets
#do_check
move *a9(OBJ_XPOSINT),a14
cmp a0,a14
jrgt #ok1
;past left edge
move *a9(OBJ_XVEL),a14,L
jrz #done
jrn #clrx
rets
#ok1
cmp a1,a14
jrlt #ok2
;past right edge
move *a9(OBJ_XVEL),a14,L
jrz #done
jrn #done
#clrx
move *a9(CLIMBING_THRU),a14 ;1=Climbing thru ropes flag
jrnz #done
clr a14
move a14,*a9(OBJ_XVEL),L
move *a9(PLYRMODE),a14
cmpi MODE_RUNNING,a14
jrne #done
movi MODE_NORMAL,a14
move a14,*a9(PLYRMODE)
move a14,*a9(ANIMODE)
callr ditch_getup_meter_a9
#ok2
#done
rets
#*****************************************************************************
MAX_YVEL equ -1000000h ;-40000h
SUBR wrestler_veladd
move @HALT,a0
jrnz #x
move *a13(OBJ_XPOS),a0,L
move *a13(OBJ_XVEL),a1,L
add a1,a0
move a0,*a13(OBJ_XPOS),L
move *a13(GROUND_Y),a2
sll 16,a2
move *a13(OBJ_YPOS),a0,L
sub a2,a0 ;- GROUND_Y
move *a13(OBJ_YVEL),a1,L
add a1,a0
jrnn #yok
;under ground. clr Yvel unless we're attached and MODE_GHOST
move *a13(ATTACH_PROC),a14,L
jrz #set_yvel
move *a14(ATTACH_PROC),a14,L
cmp a13,a14 ;valid link?
jrne #set_yvel
move *a13(ANIMODE),a14,L
btst MODE_GHOST_BIT,a14
jrnz #yok
move a1,a1 ;if yvel is positive then keep
jrn #set_yvel ;velocity & put at ground level
clr a0
jruc #yok
#set_yvel
;we've hit the ground -- if our WAITHITOPP bit is set, stuff
; a 1 in ANICNT.
move *a13(ANIMODE),a14
btst MODE_WAITHITOPP_BIT,a14
jrz #nwho
movk 1,a14
move a14,*a13(ANICNT)
#nwho clr a0
move a0,*a13(OBJ_YVEL),L
#yok
add a2,a0 ;+ GROUND_Y
move a0,*a13(OBJ_YPOS),L
calla calc_ground_y
move *a13(OBJ_YPOS),a0,L
move *a13(GROUND_Y),a2
sll 16,a2
cmp a0,a2 ;a2-a0
jrlt #ok
;we're under ground... Unless we're attached and set MODE_GHOST,
; stay above.
move *a13(ATTACH_PROC),a14,L
jrz #set_ground_y
move *a14(ATTACH_PROC),a14,L
jrz #set_ground_y
move *a13(ANIMODE),a14,L
btst MODE_GHOST_BIT,a14
jrnz #ok
#set_ground_y
move a2,a0
#ok
move a0,*a13(OBJ_YPOS),L
move *a13(OBJ_ZPOS),a0,L
move *a13(OBJ_ZVEL),a1,L
add a1,a0
move a0,*a13(OBJ_ZPOS),L
move *a13(ANIMODE),a0
btst MODE_NOGRAVITY_BIT,a0
jrnz #no_gravity
move *a13(GROUND_Y),a0
sll 16,a0
move *a13(OBJ_YPOS),a1,L
cmp a0,a1
jreq #no_gravity
move *a13(OBJ_YVEL),a0,L
move *a13(OBJ_GRAVITY),a14,L
sub a14,a0
cmpi MAX_YVEL,a0
jrge #grav_ok
movi MAX_YVEL,a0
#grav_ok
move a0,*a13(OBJ_YVEL),L
#no_gravity
#x
rets
#*****************************************************************************
SUBRP calc_ground_y
move *a13(INRING),a0
jrz #inring
movi 117,a1
move *a13(OBJ_ZPOSINT),a0
cmpi 05bdh,a0
jrgt #setit
movi 103,a1
jruc #setit
#inring
movi 112,a1
#setit
move a1,*a13(OBJ_PRIORITY)
movi vln_right_matedge,a6
calla calc_line_x
move *a13(OBJ_XPOSINT),a1
cmp a0,a1 ;a1-a0
jrge #outside
movi vln_left_matedge,a6
calla calc_line_x
move *a13(OBJ_XPOSINT),a1
cmp a0,a1 ;a1-a0
jrle #outside
;an unsuccessful attempt to fix throw-into-ring bug
;-we fucked up climbins from behind
;trying again - climbin top and bottom weren't setting this flag!
move *a13(CLIMBING_THRU),a14
jrz #skip
movi MAT_Y,a0
move a0,*a13(GROUND_Y)
clr a0
move a0,*a13(INRING)
rets
#outside
clr a0
move a0,*a13(GROUND_Y)
MOVE @GAMSTATE,A0
CMPI INPREGAME2,A0
jreq #skip
movk 1,a0
move a0,*a13(INRING)
#skip
rets
#*****************************************************************************
.if 0
PATCH FOR SCROLLER
#MAX_DIST equ 380
move @PSTATUS,a14
cmpi 3,a14 ;is it a 2-player game?
jrne #no_2_player
move @process_ptrs,a10,L ;player 1
move @process_ptrs+20h,a11,L ;player 2
move *a10(OBJ_XPOSINT),a0 ;p1 x
move *a11(OBJ_XPOSINT),a1 ;p2 x
sub a0,a1 ;a1-a0
abs a1
cmpi #MAX_DIST,a1
jrlt #ok
;the 2 human wrestlers are too far apart
;now bias towards the guy in the ring -
;(since the only way this should be able to happen is when
;both guys are outside the ring, and 1 jumps back in - ignoring
;the keep_onscreen code).
#ok
#no_2_player
.endif
#*****************************************************************************
*
* a0 = * wrestler process
*
SUBR wres_get_but_val_down
move *a0(PLYR_TYPE),a14
jrnz #drndt
move *a0(PLYRNUM),a0
callr get_but_val_down
rets
#drndt
move *a0(DRN_BUTDT),a0
rets
#*****************************************************************************
SUBR wres_get_but_val_cur
move *a0(PLYR_TYPE),a14
jrnz #drndt
move *a0(PLYRNUM),a0
callr get_but_val_cur
rets
#drndt
move *a0(DRN_BUT),a0
rets
#*****************************************************************************
SUBR wres_get_but_val_up
move *a0(PLYR_TYPE),a14
jrnz #drnut
move *a0(PLYRNUM),a0
callr get_but_val_up
rets
#drnut
move *a0(DRN_BUTUT),a0
rets
#*****************************************************************************
SUBR wres_get_stick_val_cur
move *a0(PLYR_TYPE),a14
jrnz drn_joy
move *a0(PLYRNUM),a0
callr get_stick_val_cur
rets
drn_joy
move *a0(DRN_JOY),a0
rets
#*****************************************************************************
SUBR wres_get_stick_rel_cur
move *a0(PLYR_TYPE),a14
jrnz drn_joy
move *a0(OBJ_CONTROL),a14
move *a0(PLYRNUM),a0
callr get_stick_val_cur
btst B_FLIPH,a14
jrz #done
X16 a0
addi #xflip_table,a0
move *a0,a0
#done
rets
;returns a value only if stick val
;has changed (but not zero)
SUBR wres_get_stick_rel_new
move *a0(PLYR_TYPE),a14
jrnz #not_human2
;shawn - this needs patching too...
push a1,a10
move a0,a10
move *a10(PLYRNUM),a0
callr get_stick_val_up
push a0
move *a10(PLYRNUM),a0
callr get_stick_val_down
pull a1
or a1,a0
jrz #done2 ;no stick
move *a10(OBJ_CONTROL),a14
move *a10(PLYRNUM),a0
callr get_stick_val_cur
btst B_FLIPH,a14
jrz #done2
X16 a0
addi #xflip_table,a0
move *a0,a0
#done2
pull a1,a10
rets
#not_human2
move a0,a14
move *a14(DRN_JOYDT),a0
move *a14(DRN_JOYUT),a1
or a1,a0
jrz #dx
move *a14(DRN_JOY),a0
move *a14(OBJ_CONTROL),a14
btst B_FLIPH,a14
jrz #dx
X16 a0
addi #xflip_table,a0
move *a0,a0
#dx
rets
#xflip_table ;convert to forward / away if facing left
.word 0000b ;0
.word 0001b ;1
.word 0010b ;2
.word 0011b ;3
.word 1000b ;4
.word 1001b ;5
.word 1010b ;6
.word 1011b ;7
.word 0100b ;8
.word 0101b ;9
.word 0110b ;10
.word 0111b ;11
.word 1100b ;12
.word 1101b ;13
.word 1110b ;14
.word 1111b ;15
#*****************************************************************************
SUBR wres_get_stick_val_down
move *a0(PLYR_TYPE),a14
jrnz #drnjoy
move *a0(PLYRNUM),a0
callr get_stick_val_down
rets
#drnjoy
move *a0(DRN_JOYDT),a0
rets
#*****************************************************************************
SUBR wres_get_stick_val_up
move *a0(PLYR_TYPE),a14
jrnz #not_human
move *a0(PLYRNUM),a0
callr get_stick_val_up
rets
#not_human
move *a0(DRN_JOYUT),a0
rets
#*****************************************************************************
*
* INPUT: a0 = player number (0-1)
*-----------------------------------------------------------------------------
*
* RETURN: a0 = button bits
*-----------------------------------------------------------------------------
SUBR get_but_val_cur
PUSH a1
move a0,a1
sll 4,a1 ;x 16 bits
addi but_offs2,a1
move *a1,a1
addi switches_cur,a1
move *a1,a1
andi 011000b,a1
sll 4,a0 ;x 16 bits
addi but_offs,a0
move *a0,a0
addi switches_cur,a0
move *a0,a0
andi 0111b,a0
or a1,a0
PULL a1
rets
#*****************************************************************************
*
* INPUT: a0 = player number (0-3)
*-----------------------------------------------------------------------------
*
* RETURN: a0 = joy switch bits
*-----------------------------------------------------------------------------
SUBR get_stick_val_cur
sll 4,a0 ;x 16 bits
addi joy_offs,a0
move *a0,a0
addi switches_cur,a0
move *a0,a0
andi 01111b,a0
rets
******************************************************************************
*
* INPUT: a0 = player number (0-3)
*-----------------------------------------------------------------------------
*
* RETURN: a0 = joy switch bits
*-----------------------------------------------------------------------------
SUBR get_stick_val_down
sll 4,a0 ;x 16 bits
addi joy_offs,a0
move *a0,a0
addi switches_down,a0
move *a0,a0
andi 01111b,a0
rets
******************************************************************************
*
* INPUT: a0 = player number (0-3)
*-----------------------------------------------------------------------------
*
* RETURN: a0 = joy switch bits
*-----------------------------------------------------------------------------
SUBR get_stick_val_up
sll 4,a0 ;x 16 bits
addi joy_offs,a0
move *a0,a0
addi switches_up,a0
move *a0,a0
andi 01111b,a0
rets
joy_offs .word 00h,08h,20h,28h
******************************************************************************
*
* INPUT: a0 = player number (0-1)
*-----------------------------------------------------------------------------
*
* RETURN: a0 = button bits
*-----------------------------------------------------------------------------
SUBR get_but_val_down
PUSH a1
move a0,a1
sll 4,a1 ;x 16 bits
addi but_offs2,a1
move *a1,a1
addi switches_down,a1
move *a1,a1
andi 011000b,a1
sll 4,a0 ;x 16 bits
addi but_offs,a0
move *a0,a0
addi switches_down,a0
move *a0,a0
andi 0111b,a0
or a1,a0
PULL a1
rets
******************************************************************************
*
* INPUT: a0 = player number (0-1)
*-----------------------------------------------------------------------------
*
* RETURN: a0 = button bits
*-----------------------------------------------------------------------------
SUBR get_but_val_up
PUSH a1
move a0,a1
sll 4,a1 ;x 16 bits
addi but_offs2,a1
move *a1,a1
addi switches_up,a1
move *a1,a1
andi 011000b,a1
sll 4,a0 ;x 16 bits
addi but_offs,a0
move *a0,a0
addi switches_up,a0
move *a0,a0
andi 0111b,a0
or a1,a0
PULL a1
rets
but_offs .word 04h,0ch,24h,2ch
but_offs2 .word 20h-3,24h-3
#*****************************************************************************
*
* sacrifice clarity for speed
* this reads all switch transitions once
* and stuffs them into the PDATA area
SUBR read_switches
;#wait
; move @vcount,a0
; andi 31,a0
; jrnz #wait
; TINTON
movi process_ptrs,a9
movk NUM_WRES,a11
#next
move *a9+,a10,L
jrz #skip
;ignore all switches if wrestler is immobilized
move *a10(IMMOBILIZE_TIME),a14
jrp #immob
move *a10(PLYR_TYPE),a14
jrz #no_drone
#drone
move *a10(DRN_BUT),*a10(BUT_VAL_CUR)
move *a10(DRN_BUTDT),*a10(BUT_VAL_DOWN)
move *a10(DRN_BUTUT),*a10(BUT_VAL_UP)
move *a10(DRN_JOY),*a10(STICK_VAL_CUR)
move *a10(DRN_JOYDT),*a10(STICK_VAL_DOWN)
move *a10(DRN_JOYUT),*a10(STICK_VAL_UP)
jruc #cont
#immob clr a14
move a14,*a10(BUT_VAL_CUR)
move a14,*a10(BUT_VAL_DOWN)
move a14,*a10(BUT_VAL_UP)
move a14,*a10(STICK_VAL_CUR)
move a14,*a10(STICK_VAL_DOWN)
move a14,*a10(STICK_VAL_UP)
move a14,*a10(STICK_REL_CUR)
move a14,*a10(STICK_REL_NEW)
jruc #skip
#no_drone
move *a10(PLYRNUM),a8
move a8,a1
X16 a1
move a1,a0
addi joy_offs,a0
move *a0,a5 ;joy offset
move a1,a0
addi but_offs,a0
move *a0,a6 ;switch offset1
move a1,a0
addi but_offs2,a0
move *a0,a7 ;switch offset2
;wres_get_but_val_cur
move a7,a1 ;switch offset2
addi switches_cur,a1
move *a1,a1
andi 011000b,a1
move a6,a0 ;switch offset1
addi switches_cur,a0
move *a0,a0
andi 0111b,a0
or a1,a0
move a0,*a10(BUT_VAL_CUR)
;wres_get_but_val_down
move a7,a1 ;switch offset2
addi switches_down,a1
move *a1,a1
andi 011000b,a1
move a6,a0 ;switch offset1
addi switches_down,a0
move *a0,a0
andi 0111b,a0
or a1,a0
move a0,*a10(BUT_VAL_DOWN)
;wres_get_but_val_up
move a7,a1 ;switch offset2
addi switches_up,a1
move *a1,a1
andi 011000b,a1
move a6,a0 ;switch offset1
addi switches_up,a0
move *a0,a0
andi 0111b,a0
or a1,a0
move a0,*a10(BUT_VAL_UP)
;wres_get_stick_val_cur
move a5,a0 ;joy offset
addi switches_cur,a0
move *a0,a0
andi 01111b,a0
move a0,*a10(STICK_VAL_CUR)
;wres_get_stick_val_down
move a5,a0 ;joy offset
addi switches_down,a0
move *a0,a0
andi 01111b,a0
move a0,*a10(STICK_VAL_DOWN)
;wres_get_stick_val_up
move a5,a0 ;joy offset
addi switches_up,a0
move *a0,a0
andi 01111b,a0
move a0,*a10(STICK_VAL_UP)
#cont
;wres_get_stick_rel_cur
;facing reletive joystick value
move *a10(STICK_VAL_CUR),a0
move *a10(FACING_DIR),a14
btst PLAYER_RIGHT_BIT,a14
jrnz #no_flip
X16 a0
addi #xflip_table,a0
move *a0,a0
#no_flip
move a0,*a10(STICK_REL_CUR)
;wres_get_stick_rel_new
;returns a value only if stick val
;has changed (but not zero)
move *a10(STICK_VAL_UP),a0
move *a10(STICK_VAL_DOWN),a1
or a1,a0
jrz #no_stick
move *a10(STICK_VAL_CUR),a0
move *a10(FACING_DIR),a14
btst PLAYER_RIGHT_BIT,a14
jrnz #no_flip2
X16 a0
addi #xflip_table,a0
move *a0,a0
#no_flip2
#no_stick
move a0,*a10(STICK_REL_NEW)
#skip
dsj a11,#next
; TINTOFF
rets
#xflip_table ;convert to forward / away if facing left
.word 0000b ;0
.word 0001b ;1
.word 0010b ;2
.word 0011b ;3
.word 1000b ;4
.word 1001b ;5
.word 1010b ;6
.word 1011b ;7
.word 0100b ;8
.word 0101b ;9
.word 0110b ;10
.word 0111b ;11
.word 1100b ;12
.word 1101b ;13
.word 1110b ;14
.word 1111b ;15
;#*****************************************************************************
;*
;* puts you in mode_blocking if your safe_time is set. (or if you're a drone)
;* called from anim scripts with an ANI_CODE.
;
; SUBR block_if_safe
;
; move *a13(PLYR_TYPE),a14
; cmpi PTYPE_DRONE,a14
; jreq #safe
;
; move *a13(SAFE_TIME),a14
; jrz #not_safe
;
;#safe movk MODE_BLOCK,a14
; move a14,*a13(PLYRMODE)
;
;#not_safe
; rets
#*****************************************************************************
*
* Call at the beginning of any turnbuckle attack. This sets the NOCONFINE
* bit if any live opponents are outside the ring, or clears it otherwise.
*
* HOWEVER, if everyone is dead, it checks simply for active wrestlers outside,
* not just live ones.
*
* ...except for yoko. He can't jump out.
*
SUBR set_tbukl_confine
move *a13(WRESTLERNUM),a14
cmpi W_YOKO,a14
jreq #clear_noconfine
;a3 is the 'everyone is dead' flag.
clr a3
move *a13(CLOSEST_NUM),a1
calla get_process_ptr
move *a0(PLYRMODE),a14
cmpi MODE_DEAD,a14
jrne #dfset
inc a3 ;entire other team is dead.
#dfset movi process_ptrs,a0,L
movk NUM_WRES,a10
move *a13(PLYR_SIDE),a2
#loop
move *a0+,a1,L
jrz #nxt ;skip inactive
cmp a1,a13
jreq #nxt ;skip self
move *a1(PLYR_SIDE),a14
cmp a14,a2
jreq #nxt ;skip teammates
;skip the dead check if everyone on enemy side is dead
TEST a3
jrnz #nsd
move *a1(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #nxt ;skip dead
#nsd move *a1(INRING),a14
jrnz #set_noconfine
#nxt dsj a10,#loop
;fall through
#clear_noconfine
;he might have drifted out already, so we gotta yank 'em back in.
move *a13(INRING),a14
jrz #in
;rats. he's out. fix it.
clr a14
move a14,*a13(INRING)
movi MAT_Y,a14
move a14,*a13(GROUND_Y)
move *a13(OBJ_ZPOSINT),a14
cmpi RING_TOP,a14
jrge #zok
movi RING_TOP,a14
move a14,*a13(OBJ_ZPOSINT)
#zok move *a13(OBJ_XPOSINT),a2
cmpi RING_X_CENTER,a2
jrgt #rt
;on left
movi vln_left_rope,a6
calla calc_line_x
jrz #xok ;bad news. leave it alone.
cmp a0,a2
jrge #xok
move a0,*a13(OBJ_XPOSINT)
jruc #xok
#rt ;on right
movi vln_right_rope,a6
calla calc_line_x
jrz #xok ;bad news. leave it alone.
cmp a0,a2
jrle #xok
move a0,*a13(OBJ_XPOSINT)
#xok
#in move *a13(ANIMODE),a14
andni MODE_NOCONFINE,a14
jruc #cont
#set_noconfine
move *a13(ANIMODE),a14
ori MODE_NOCONFINE,a14
#cont
move a14,*a13(ANIMODE)
rets
;#*****************************************************************************
;*
;* Call with ANI_CODE when a turnbuckle attack misses. This does four pixels
;* of damage, or health-1, whichever is less.
;
; SUBR tbukl_miss_damage
;
; move *a13(PLYRNUM),a1
; calla get_health
; dec a0
; jrle #done
; movk 4,a14
; cmp a14,a0
; jrle #ok
; move a14,a0
;#ok neg a0
; clr a10
; calla adjust_health
;#done rets
.if DEBUG
#*****************************************************************************
.ref CPUAVG
SUBR draw_dma_meter
movi DIAGP,a0
calla pal_getf
move a0,a1
ori >0E0E0000,a1
movi [1,400],a2
move @dma_bog,a3
sll 16,a3
clr a4
movi DMACAL,a5
calla QDMAN
rets
#*****************************************************************************
SUBR draw_cpu_meter
movi DIAGP,a0
calla pal_getf
move a0,a1
ori >0D0D0000,a1
movi [1,400],a2
move @CPUAVG,a3
sll 14,a3
clr a4
movi DMACAL,a5
calla QDMAN
rets
.endif
#*****************************************************************************
SUBR COLRPRC
movi COLRPID,a0
calla KIL1C ;KILL ALL COLOR UPDATE PROCESSES
clr a0
move a0,@PALFRAM,L
; movi scorep,a0 ;Score area palette
jauc pal_getf
#*****************************************************************************
*
* call this at the top of any anim sequence that requires that you be
* attached before you get there, like any of the pile-drivers, vertical
* suplexes, and so forth. This checks for a good link, and bitches up
* a storm if it doesn't find one.
SUBR link_check
.if DEBUG
move *a13(ATTACH_PROC),a14,L
jrnz #ok1
LOCKUP ;I'm not attached!
nop
#ok1 move *a14(ATTACH_PROC),a14,L
jrnz #ok2
LOCKUP ;I'm attached, but he's not attached to me!
nop
#ok2 cmp a14,a13
jreq #ok3
LOCKUP ;We're both attached, but not to each other!
nop
.endif
#ok3 rets
#*****************************************************************************
*
* clears CLIMBING_THRU flag and sets SAFE_TIME to 1, which won't do you
* any good unless you're holding block. Call this at the end of any
* rope climb-through anim.
SUBR clr_climb
clr a0
move a0,*a13(CLIMBING_THRU) ;1=Climbing thru ropes flag
inc a0
move a0,*a13(SAFE_TIME)
rets
#*****************************************************************************
*
* returns carry set if one of a13's teammates has done a pin this round.
*
* trashes scratch
SUBR ck_teammate_pin
PUSH a2,a3
movk NUM_WRES,a0
movi process_ptrs,a1
move *a13(PLYR_SIDE),a2
#lp move *a1+,a3,L
jrz #nxt ;skip inactive
cmp a3,a13
jreq #nxt ;skip self
move *a3(PLYR_SIDE),a14
cmp a14,a2
jrne #nxt ;skip enemies
move *a3(STATUS_FLAGS),a14
btst B_DID_PIN,a14
jrz #nxt ;skip guys who didn't pin
;got a pinning teammate
PULL a2,a3
setc
rets
#nxt dsj a0,#lp
;no pinning teammates
PULL a2,a3
clrc
rets
#*****************************************************************************
*
* rummage through process_ptrs and decide which pal this wrestler should
* get. return pal ptr in b0
*
* trashes a0,a1,a2,a3, and a14.
SUBR choose_pal
;assign pals in PLYRNUM order. There's four in the table for
; each wrestler.
.if 1
; First check to see if there are 2 human players and they are
; playing the same wrestler
move @PSTATUS,a14 ; Get status
cmpi 3,a14 ; Do we have 2 humans playing ?
jrnz #pp_go ; br = no
;if buddy mode, choose special pals
move @buddy_mode_on,a14
jrnz #buddy_mode
clr a2
clr a14
neg a14
movi process_ptrs,a0
#f_loop
move *a0+,a3,L
jrz #f_done
move *a3(PLYRNUM),a4
jrnz #not_p1
move *a3(WRESTLERNUM),a2
#not_p1
cmpi 1,a4
jrnz #not_p2
move *a3(WRESTLERNUM),a14
#not_p2
jruc #f_loop
#f_done
move a14,a14 ; Does player 2 exist ?
jrn #pp_go ; br = no
cmp a2,a14 ; Are player 1 and 2 same wrestler ?
jrnz #pp_go ; br = no (no need to adjust pals)
move @player_pal_pref,a0 ; Get player 1 palette preference
cmpi 7,a0 ; Is it last palette ?
jrnz #set_pal ; br = no
movk 2,a0 ; force a palette above what'll be used by drones
#set_pal
move a0,@player_pal_pref+10h ; Set player 2 palette
#pp_go
.endif
;count identical wrestlers with lower PLYRNUMs.
movi process_ptrs,a0
clr a4 ; match count
move *a13(PLYRNUM),a2 ; Get player number
cmpi 2,a2 ; Are we human ?
jrge #not_player ; br = no
X16 a2 ; Get playre palette preference
addi player_pal_pref,a2
move *a2,a4 ; Init the counter to preference
#not_player
move *a13(WRESTLERNUM),a1
;loop from 0 to our PLYRNUM looking for matches, UNLESS we're a
; drone doink, in which case we just check 0 and 1.
move *a13(PLYRNUM),a2
jrz #end0
cmpi 2,a2 ;first drone is okay too.
jrle #lp0
cmpi W_DOINK,a1
jrne #lp0
movk 2,a2
#lp0 move *a0+,a3,L
jrz #nxt0 ;skip inactive
move *a3(WRESTLERNUM),a14
cmp a1,a14
jrne #nxt0
inc a4 ;got a match--inc count
#nxt0 dsj a2,#lp0
#end0 andi 7,a4
X32 a4
X256 a1
add a1,a4
addi #wrestler_pal_table,a4
move *a4,a14,L
move a14,b0
rets
#buddy_mode
move *a13(WRESTLERNUM),a0
X64 a0
move *a13(PLYR_SIDE),a14
X32 a14
add a14,a0
addi #buddy_mode_pals,a0
move *a0,a14,L
move a14,b0
rets
#wrestler_pal_table
; pnch ppnch kick pkick
REFLONG HRTPNK_P,HRTBLU_P,HRTORG_P,HRTYEL_P,HRTRED_P,HRTGRN_P,HRTPRP_P,HRTGRY_P ;(Bret)
REFLONG RZRGRN_P,RZRPRP_P,RZRYEL_P,RZRORG_P,RZRPNK_P,RZRBLU_P,RZRRED_P,RZRGRY_P ;(Razor)
REFLONG UNDPRP_P,UNDBLK_P,UNDGRN_P,UNDORG_P,UNDPNK_P,UNDBLU_P,UNDYEL_P,UNDRED_P ;(Taker)
REFLONG YOKRED_P,YOKPRP_P,YOKYEL_P,YOKORG_P,YOKPNK_P,YOKBLU_P,YOKGRN_P,YOKGRY_P ;(Yoko)
REFLONG SHNRED_P,SHNPRP_P,SHNORG_P,SHNGRN_P,SHNPNK_P,SHNBLU_P,SHNYEL_P,SHNGRY_P ;(Shawn)
REFLONG BAMBLU_P,BAMYLW_P,BAMPRP_P,BAMORG_P,BAMPNK_P,BAMRED_P,BAMGRN_P,BAMGRY_P ;(Bam Bam)
REFLONG DNKBLU_P,DNKPRP_P,DNKORG_P,DNKRED_P,DNKPNK_P,DNKGRN_P,DNKYEL_P,DNKGRY_P ;(Doink)
.long 0,0,0,0,0,0,0,0
REFLONG LEXWHT_P,LEXPRP_P,LEXRED_P,LEXYEL_P,LEXGRN_P,LEXPNK_P,LEXORG_P,LEXGRY_P ;(Lex)
#buddy_mode_pals
.long HRTBLU_P,HRTRED_P
.long RZRBLU_P,RZRRED_P
.long UNDBLU_P,UNDRED_P
.long YOKBLU_P,YOKRED_P
.long SHNBLU_P,SHNRED_P
.long BAMBLU_P,BAMRED_P
.long DNKBLU_P,DNKRED_P
.long 0,0
.long LEXPRP_P,LEXRED_P
#*****************************************************************************
* Sets PLYR_TYPE to PTYPE_PLAYER if PLYRNUM < 2.
*
* >a13 = process *
SUBR drone_change_back
move *a13(PLYRNUM),a14
cmpi 2,a14
jrge #done ;don't check real drones
;don't bother checking if they're a drone or not. In either case,
; turning them human again won't hurt.
movi PTYPE_PLAYER,a14
move a14,*a13(PLYR_TYPE)
#done rets
#*****************************************************************************
* (called by animation system)
*
SUBR start_run_flung
.word ANI_SETMODE,MODE_UNINT|MODE_NOAUTOFLIP
.word ANI_SETFACING ;so the offset works properly
WL ANI_CODE,#x_flip
.word ANI_OFFSET,20,0,0
WL ANI_CODE,#ok2
.word ANI_GETUP,FLUNG_TIME ;Flung time
.word ANI_END
SUBR start_run_anim
.word ANI_SETMODE,MODE_UNINT|MODE_NOAUTOFLIP
;Is this a good idea?
.word ANI_DETACH
WL ANI_CODE,#setup_run
.word ANI_END
#setup_run
; move a13,a0
; calla wres_get_stick_val_cur
PUSH a1
; movk 4,a1
movk 1,a1
calla dufus_msg_off
PULL a1
move *a13(STICK_VAL_CUR),a0
andi MOVE_LEFT+MOVE_RIGHT,a0
jrnz #use_joy1
move *a13(FACING_DIR),a0 ;use facing
andi MOVE_LEFT+MOVE_RIGHT,a0
#use_joy1
move *a13(FACING_DIR),a1
andi MOVE_LEFT+MOVE_RIGHT,a1
cmp a0,a1
jrz #ok1
;He wants to run in the opposite direction than he is facing
;Rotate him around first.
move *a13(FACING_DIR),a1
andi MOVE_UP+MOVE_DOWN,a1
or a1,a0
move a0,*a13(NEW_FACING_DIR)
move a0,*a13(FACING_DIR)
; callr set_rotate_anim
; move a13,a2 ;a2 = * process
; calla change_anim_anim
#ok1
; movi #dorun,a0 ;this routine gets executed
jruc #dorun
jruc #contx
#ok2
;Whenever you fling someone, a meter can & will appear
clr a0
move a0,*a13(DELAY_METER)
movi #dorun_flung,a0 ;this routine gets executed
#contx
move a0,*a13(CODE_ADDR),L ;when the rotate anim
SETMODE WAITANIM ;finishes
move *a13(OBJ_XVEL),a0,L
sra 1,a0
move a0,*a13(OBJ_XVEL),L
clr a0
move a0,*a13(OBJ_ZVEL),L
rets
#x_flip
move *a13(FACING_DIR),a14
xori >0C,a14
move a14,*a13(FACING_DIR)
rets
#dorun
clr a0
move a0,*a13(GETUP_TIME) ;in control
#dorun_flung
clr a0
move a0,*a13(USR_VAR1) ;with x-xel
move a0,*a13(RUN_TIME)
;Bogosity..
move *a13(FACING_DIR),a0 ;use facing
;; move *a13(NEW_FACING_DIR),a0 ;use facing
; move *a13(WHOHITME),a14,L
; move *a14(FACING_DIR),a0
; andi MOVE_LEFT+MOVE_RIGHT,a0
; xori 0ch,a0
#ok
move a0,*a13(MOVE_DIR)
move *a13(NEW_FACING_DIR),a1
andi MOVE_UP+MOVE_DOWN,a1
or a0,a1 ;LEFT or RIGHT
move a1,*a13(FACING_DIR) ;face same dir as run
move *a13(WRESTLERNUM),a0
X32 a0
addi #run_anims,a0
move *a0,a0,L ;run anim
calla change_anim1a
SETMODE RUNNING
movk 1,a0
move a0,*a13(DELAY_BUTNS)
rets
.ref bam_run_anim
.ref dnk_run_anim
.ref hrt_run_anim
.ref lex_run_anim
.ref rzr_run_anim
.ref shn_run_anim
.ref und_run_anim
.ref yok_run_anim
#run_anims
.long hrt_run_anim ;0 Bret Hart
.long rzr_run_anim ;1 Razor Ramon
.long und_run_anim ;2 Undertaker
.long yok_run_anim ;3 Yokozuna
.long shn_run_anim ;4 Shawn Michaels
.long bam_run_anim ;5 Bam Bam
.long dnk_run_anim ;6 Doink
.long dnk_run_anim ;7 spare
.long lex_run_anim ;8 Lex Luger
.long dnk_run_anim ;9 Referee
#*****************************************************************************
SUBR flash_white
movi [1111h,0000h],a1 ;[color,pal]
movi [256,400],a2 ;[Ysz,Xsz]
clr a3 ;[Ypos,Xpos]
clr a4 ;SAG
movi DMACAL,a5 ;[offset,ctrl]
calla QDMAN
rets
SUBR flash_red
movi [1b1bh,0000h],a1 ;[color,pal]
movi [256,400],a2 ;[Ysz,Xsz]
clr a3 ;[Ypos,Xpos]
clr a4 ;SAG
movi DMACAL,a5 ;[offset,ctrl]
calla QDMAN
rets
#*****************************************************************************
*
* return carry set if wrestler a0 has any living teammates. (excluding self)
*
* trashes scratch
SUBR ck_live_teammates
PUSH a2,a3,a4
move *a0(PLYR_SIDE),a1
movi process_ptrs,a2
movk NUM_WRES,a3
#lp move *a2+,a4,L
jrz #nxt ;skip inactive
cmp a4,a0
jreq #nxt ;skip self
move *a4(PLYR_SIDE),a14
cmp a14,a1
jrne #nxt ;skip other team
move *a4(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #nxt ;skip dead
;found live teammate.
PULL a2,a3,a4
setc
rets
#nxt dsj a3,#lp
PULL a2,a3,a4
clrc
rets
#*****************************************************************************
*
* return carry set if wrestler a0 has any teammates, living or dead.
*
* trashes scratch
SUBR ck_any_teammates
PUSH a2,a3,a4
move *a0(PLYR_SIDE),a1
movi process_ptrs,a2
movk NUM_WRES,a3
#lp move *a2+,a4,L
jrz #nxt ;skip inactive
cmp a4,a0
jreq #nxt ;skip self
move *a4(PLYR_SIDE),a14
cmp a14,a1
jrne #nxt ;skip other team
;found a teammate.
PULL a2,a3,a4
setc
rets
#nxt dsj a3,#lp
PULL a2,a3,a4
clrc
rets
#*****************************************************************************
*
* set smart_attack bit and set smart_target to *a13(WHOIHIT).
*
SUBR target_whoihit
move *a13(STATUS_FLAGS),a14
ori M_SMART_ATTACK,a14
move a14,*a13(STATUS_FLAGS)
move *a13(WHOIHIT),*a13(SMART_TARGET),L
rets
#*****************************************************************************
*
* If all of a13's opponents are dead and !zombie, and a13 is either outside
* or all his opponents are outside, setc and rets. else clrc and rets.
SUBR raisearm_check
;if a13 is human and this is a royal rumble, make sure @FINAL_PTR is
;FFh. If it isn't, don't raise arm.
move @royal_rumble,a14
jrz #hack_done
move *a13(PLYR_TYPE),a14
jrnz #hack_done ;PLAYER=0
move @FINAL_PTR,a14,L
move *a14,a14
jrn #hack_done
jruc #clrc ;no good
#hack_done
move *a13(PLYR_SIDE),a0
movk NUM_WRES,a1
movi process_ptrs,a2
clr a4 ;'is any opponent inside' flag.
#lp move *a2+,a3,L
jrz #nxt ;skip inactive
move *a3(PLYR_SIDE),a14
cmp a14,a0
jreq #nxt ;skip a13 and teammates
move *a3(PLYRMODE),a14
cmpi MODE_DEAD,a14
jrne #clrc ;opp dead?
move *a3(STATUS_FLAGS),a14,L
btst B_ZOMBIE,a14
jrnz #clrc ;zombie?
move *a3(INRING),a3
jrnz #nxt
;dead !zombie bad guy is inside. set a4
inc a4
#nxt dsj a1,#lp
;okay, all our opponents are dead and staying that way. now check
; the inside/outside stuff.
move *a13(INRING),a14
jrnz #setc ;am I outside?
TEST a4
jrnz #clrc ;is any opponent inside?
#setc setc
rets
#clrc clrc
rets
#*****************************************************************************
*
* Set WHOIHIT to closest opponent. Call this after you do a LEAPAT in your
* pin. Since pins don't actually attack, we need to do this so that WHOIHIT
* is correct when we call grnd_hit. We can't use CLOSEST in grnd_hit, since
* it's possible to land closer to someone else than the guy you meant to pin.
* ONLY USE THIS IN PINS!!!!!!!!!!!!!! Cuz it also sets the PINNED bit.
*
SUBR hit_nearest
;set WHOIHIT and victim WHOPINNEDME
move *a13(CLOSEST_NUM),a0
X32 a0
addi process_ptrs,a0
move *a0,a0,L
move a0,*a13(WHOIHIT),L
move a13,*a0(WHOPINNEDME),L
;set victim's PINNED bit.
move *a0(STATUS_FLAGS),a14
ori M_PINNED,a14
move a14,*a0(STATUS_FLAGS)
rets
#*****************************************************************************
*
* Change into another wrestler and re-enter the battle. This should probably
* only be used in the king of the ring match.
*
* >a13 = pointer to process to change
*
SUBR change_wrestler
**** ;change wrestlernum
move *a13(NEW_WRESTLERNUM),*a13(WRESTLERNUM)
**** ;make the new special move processes
callr init_smoves
**** ;change palette
calla choose_pal
move b0,a0
calla pal_getf
move a0,*a13(OBJ_PAL)
move a0,*a13(MY_PAL)
movk MAX_PIECES-1,a9
move *a13(OBJ_BASE),a1,L
addk 20h,a1 ;skip shadow
#nxt move *a1+,a8,L
move a0,*a8(OPAL)
dsj a9,#nxt
**** ;re-initialize animation
movi MODE_NORMAL,a14
move a14,*a13(PLYRMODE)
move *a13(WRESTLERNUM),a9
X64 a9
addi #init_anims,a9
move *a9+,a0,L
calla change_anim1a
move *a9,a0,L
calla change_anim2a
**** ;reset STATUS_FLAGS
clr a14
move a14,*a13(STATUS_FLAGS),L
**** ;reset life and combo data
calla init_wres_life_data
**** ;clear I_WILL_DIE
clr a14
move a14,*a13(I_WILL_DIE)
**** ;set new position
movi #init_positions,a0
#lp1 move *a0(#NXT),a14,W
jrn #usea0 ;if last entry, use by default.
;use current entry if:
; X <= WORLDTLX-30 or
; X >= WORLDTLX+400+30
move *a0(#XPOS),a1
move @WORLDTLX,a14,L
sra 16,a14
subk 30,a14
cmp a14,a1
jrle #usea0
addi 460,a14
cmp a14,a1
jrge #usea0
#nxt1 addi #SIZE,a0
jruc #lp1
#usea0 move *a0(#XPOS),*a13(OBJ_XPOSINT)
move *a0(#ZPOS),*a13(OBJ_ZPOSINT)
move *a0(#YPOS),*a13(OBJ_YPOSINT)
move *a0(#YPOS),*a13(GROUND_Y)
move *a0(#INRING),*a13(INRING)
**** ;clear old velocities
clr a14
move a14,*a13(OBJ_XVEL),L
move a14,*a13(OBJ_YVEL),L
move a14,*a13(OBJ_ZVEL),L
rets
#init_anims
REFLONG hrt_stand4_anim,hrt_torso4_anim
REFLONG rzr_stand4_anim,rzr_torso4_anim
REFLONG und_stand4_anim,und_torso4_anim
REFLONG yok_stand4_anim,yok_torso4_anim
REFLONG shn_stand4_anim,shn_torso4_anim
REFLONG bam_stand4_anim,bam_torso4_anim
REFLONG dnk_stand4_anim,dnk_torso4_anim
.long 0,0
REFLONG lex_stand4_anim,lex_torso4_anim
;possible starting positions. hunt until you find one that's
; offscreen, then use it. If none of them are offscreen (should
; never happen,) use the last entry in the table.
STRUCT 0
WORD #XPOS
WORD #ZPOS
WORD #YPOS
WORD #INRING
LABEL #SIZE
WORD #NXT ;first element of NEXT entry. check for -1.
;XPOSINT, ZPOSINT, YPOSINT/GROUND_Y, INRING
#init_positions
.word RING_X_CENTER,RING_Z_CENTER,MAT_Y,0 ;center
.word RING_TOP_LEFT,RING_Z_CENTER,MAT_Y,0 ;center left
.word RING_TOP_RIGHT,RING_Z_CENTER,MAT_Y,0 ;center right
.word RING_BOT_LEFT,RING_BOT,MAT_Y,0 ;bottom left
.word RING_BOT_RIGHT,RING_BOT,MAT_Y,0 ;bottom right
.word 024Fh,060Eh,0,1 ;outside left
.word 060Eh,04ABh,0,1 ;outside right
.word -1
#*****************************************************************************
*
* Kill all my special move processes.
*
SUBR kill_smove_procs
PUSH a2,a3
;loop through the processes. Anything with a PID of SMOVE_PID, and
; a PA8 that matches our a13 must go.
move @ACTIVE,a3,L
#lp0 move a3,a2 ;a2 = p->this
jrz #done0
move *a2,a3,L ;a3 = p->next
move *a2(PROCID),a14
cmpi SMOVE_PID,a14
jrne #lp0
move *a2(PA8),a14,L
cmp a14,a13
jrne #lp0
;match. kill this one
move a2,a0
calla KILL
jruc #lp0
#done0 PULL a2,a3
rets
#*****************************************************************************
*
* Check to make sure your opponent is at rest and staying that way. Check
* to see if he's in the xxx_dead_anim. And make sure he's in range.
* Oh, and make sure there aren't any zombies either.
*
SUBR can_pin
;no pin if there are any zombies or live wrestler on other team
movi process_ptrs,a0
movk NUM_WRES,a1
move *a13(PLYR_SIDE),a3
#lp0 move *a0+,a2,L
jrz #nxt0 ;skip inactive
move *a2(PLYR_SIDE),a14
cmp a14,a3
jreq #nxt0 ;skip teammates
move *a2(PLYRMODE),a14
cmpi MODE_DEAD,a14
jrne #clrc
move *a2(STATUS_FLAGS),a14
btst B_ZOMBIE,a14
jrnz #clrc
#nxt0 dsjs a1,#lp0
;check range
move *a13(CLOSEST_DIST),a0
cmpi 70h,a0
jrgt #clrc
move *a13(CLOSEST_ZDIST),a0
cmpi 50h,a0
jrgt #clrc
calla get_opp_process
move *a0(STATUS_FLAGS),a14
btst B_PINABLE,a14
jrz #clrc
#setc ;just to be safe, set the PINNED bit on the guy
move *a0(STATUS_FLAGS),a14
ori M_PINNED,a14
move a14,*a0(STATUS_FLAGS)
;and set his WHOPINNEDME
move a13,*a0(WHOPINNEDME),L
;and zero his velocities
clr a14
move a14,*a0(OBJ_XVEL),L
move a14,*a0(OBJ_YVEL),L
move a14,*a0(OBJ_ZVEL),L
;and set his PTIME to one and clear his KOD bit, 'cuz he's probably
; been KO'd if he's a drone.
movk 1,a14
move a14,*a0(PTIME)
move *a0(STATUS_FLAGS),a14
andni M_KOD,a14
move a14,*a0(STATUS_FLAGS)
setc
rets
#clrc clrc
rets
#*****************************************************************************
*
* Dead wrestlers sit here.
SUBR xxx_dead_anim
.word ANI_SETMODE,MODE_NOAUTOFLIP|MODE_UNINT
.word ANI_SETPLYRMODE,MODE_DEAD
WL ANI_CODE,#set_pinable_bit
WL ANI_CODE,#ko_if_drone
.word ANI_ROT ;just sit and do nothing
*****
* KO my process if I'm a drone.
SUBRP #ko_if_drone
;don't go to sleep if this is an 8-on-1 or 8-on-2 match, UNLESS
; wrestler_count is 0, which means there's no hope of becoming
; a zombie.
move @royal_rumble,a14
jrnz #is8
calla is_8_on_1
jrnc #not8
#is8 move @wrestler_count,a14
jrnz #rets
#not8
move *a13(PLYR_TYPE),a14
cmpi PTYPE_DRONE,a14
jrne #rets
;don't KO if I've been pinned
move *a13(STATUS_FLAGS),a14
btst B_PINNED,a14
jrnz #rets
;don't KO if our NO_KO bit is set.
btst B_NO_KO,a14
jrnz #rets
ori M_KOD,a14
move a14,*a13(STATUS_FLAGS)
#rets rets
*****
* set the PINABLE bit in STATUS_FLAGS
SUBRP #set_pinable_bit
move *a13(STATUS_FLAGS),a14
ori M_PINABLE,a14
move a14,*a13(STATUS_FLAGS)
rets
#*****************************************************************************
*
* This gets called once each MATCH for every wrestler, not each round.
* It creates the set of 'watchdog' processes that look out for special
* moves that the usual method can't handle; specifically, stuff that
* involves charging up with a stick, detailed control over timing, or
* proximity to the bad guy.
*
SUBR init_smoves
move *a13(WRESTLERNUM),a2,W
X32 a2
addi #special_moves,a2
move *a2,a2,L
jrz #done
#loop
move *a2+,a7,L
jrz #done
movi SMOVE_PID,a1
move a13,a8
calla GETPRC_INSERT
;store reset address
move *a0(PWAKE),*a0(SM_RESET_ADDRESS),L
jruc #loop
#done
rets
#special_moves
REFLONG hrt_smove_table ;Bret
REFLONG rzr_smove_table ;Razor
REFLONG und_smove_table ;Taker
REFLONG yok_smove_table ;Yoko
REFLONG shn_smove_table ;Shawn
REFLONG bam_smove_table ;Bam Bam
REFLONG dnk_smove_table ;Doink
.long 0 ;spare
REFLONG lex_smove_table ;Lex
#*****************************************************************************
.bss #pin_timeout,16 ;pin idiot check cntdown
.bss #last_dead,16 ;PCNT last time we had a one-team
; dead condition.
SUBR match_timer
movk 9,a0
move a0,@match_time ;10's
move a0,@match_time+10h ;1's
clr a0
move a0,@match_time+20h ;fractional
callr #create_timer
SLEEP TSEC*2
movk ADJSPEED,a0 ;game timer speed (1-5)
calla GET_ADJ
BADCHK a0,1,5,3 ;reg,lo,hi,val
X16 a0 ;x 16 bits
addi timer_table-10h,a0
move *a0,a1
;slow the clock to 1/3 speed if this is the royal rumble
move @royal_rumble,a14
jrnz #isrum
;slow the clock (2/3 speed) if it's 1v3.
move @PSTATUS,a14
jrz #nfin
cmpi 3,a14
jreq #nfin
move @NUM_OPPS,a14
cmpi 3,a14
jrne #nfin
#isrum movi >AAAA,a14
mpyu a14,a1
srl 16,a1
;slow it yet again (down to 1/3 speed) if this is the final battle,
calla is_final_match
jrc #isfin
move @royal_rumble,a14
jrz #nfin
#isfin sra 1,a1
#nfin move a1,a10
;initialize #last_dead
clr a14
move a14,@#last_dead
;initialize #pin_timeout - we need to do this because one time in
; 2^16, when we hit our first all-dead condition, PCNT will be 1,
; and the code will think that this isn't a new condition and it
; won't reset this value. Hey, it could happen.
movi 4*TSEC,a14
move a14,@#pin_timeout
#loop
SLEEPK 1
move @HALT,a0
jrnz #loop
move @match_time,a0,L
jrz #loop
;call #dec_timer and update_timer only if there's a live member
; of every team. (for this purpose, zombies count as live members)
callr get_live_bits
move a0,a3
cmpi 3,a3
jrne #1tmded ;a team is completely dead
callr #dec_timer
callr update_timer
jruc #loop
#1tmded ;one team is completely dead - wait five seconds, and if there's
; no pin by then, award the round to the team that's sitting on
; it's silly drone ass instead of pinning.
;check #last_dead to see if this is a new all-dead condition or
; an old one. if it's a new one, we need to reset #pin_timeout.
move @PCNT,a14
move @#last_dead,a0
sub a0,a14
dec a14
jrz #old
;new dead condition. reset #pin_timeout.
;temp! - 314
.if DEBUG
DBEVENT BDE_ALL_DEAD,a13,L,a13,L,a13,L
.endif
movi 5*TSEC,a14
move a14,@#pin_timeout
;clear reduce_bog. if we're in 8-on-1 or 8-on-2 mode, clear this
; only if the human team is dead, or the drones are dead and no
; more are coming.
move @royal_rumble,a14
jrnz #ck8_2
calla is_8_on_1
jrnc #crb
#ck8_1 ;check the 8-on-1 case
move @PSTATUS,a14
and a3,a14 ;a3 is bit of live team
jrz #crb ;on z, human team is dead
jruc #dtd ;else dead team is drones
#ck8_2 ;check the 8-on-2 case
btst 0,a3 ;team 0 is always humans in 8 on 2
jrz #crb ;on z, human team is dead
#dtd ;dead team is drones
move @wrestler_count,a14
cmpi 1,a14
jrge #ncrb
#crb clr a14
move a14,@reduce_bog
;wake the crowd
move @crowd_process,a0,L
movk 1,a14
move a14,*a0(PTIME)
#ncrb ;create the PIN HIM message process.
move a3,a9
xori 3,a9
srl 1,a9 ;a8 is dead team (0 or 1)
CREATE PINHIM_ANIM_PID,pin_prompt
#old ;update #last_dead
move @PCNT,a14
move a14,@#last_dead
;dec pin_timeout and call the round if time's up.
move @#pin_timeout,a14
jrz #loop ;we've already called this round
dec a14
jrz #end ;time's up - do it.
move a14,@#pin_timeout
jruc #loop
#end
CREATE ANNC_PID,announce_rnd_winner
.if DEBUG
move a13,*a0(PDATA),L ;#CREATOR (pdata)
movi $,a14
move a14,*a0(PDATA+20h),L ;#ORIGIN
.endif
;stuff a 0 in #pin_timeout so we'll know that there's no further
; action to be taken on this all-dead condition.
clr a14
move a14,@#pin_timeout
jruc #loop
********************
#create_timer
;set pal
movi WGFS_W_P,b0
calla is_8_on_1
jrnc #nfin2
movi WGSF_Y_P,b0
#nfin2 movi [186,0],a0 ;x pos
movi [21,0],a1 ;y pos
movi WGSF20_9,a2
movi 200,a3 ;z pos
movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags
movi TYPTIMERDIGIT,a5
clr a6 ;x vel
clr a7 ;y vel
PUSH b0
calla BEGINOBJP
PULL b0
move a8,*a13(PDATA+20h),L ;10's image pointer
movi [200+2,0],a0 ;x pos
movi [21,0],a1 ;y pos
movi WGSF20_9,a2
calla BEGINOBJP
move a8,*a13(PDATA),L ;1's image pointer
rets
********************
#dec_timer
move @match_time,a0,L
cmpi 090009h,a0
jrne #no_reset_pal
movi WGFS_W_P,a0
calla is_8_on_1
jrnc #nfin3
movi WGSF_Y_P,a0
#nfin3 calla pal_getf
move *a13(PDATA+20h),a8,L ;10's image pointer
move a0,*a8(OPAL)
move *a13(PDATA),a8,L ;10's image pointer
move a0,*a8(OPAL)
#no_reset_pal
move @match_time+20h,a0 ;fractional
sub a10,a0
move a0,@match_time+20h
jrnc #no_change
move @match_time+10h,a0 ;1's
dec a0
move a0,@match_time+10h
jrnc #no_borrow
movk 9,a0
move a0,@match_time+10h
move @match_time,a0 ;10's
dec a0
move a0,@match_time
cmpi 0,a0
jrne #no_borrow
movi WGSF_R_P,a0
calla pal_getf
move *a13(PDATA+20h),a8,L ;10's image pointer
move a0,*a8(OPAL)
move *a13(PDATA),a8,L ;10's image pointer
move a0,*a8(OPAL)
#no_borrow
;if time is less than 15, make noise
move @match_time,a0,L
move a0,a1
sra 16,a0
andi 0Fh,a1
sla 4,a1
or a1,a0
cmpi 10h,a0
jrgt #no_change
movk 10,a0 ;Time warning sound
calla triple_sound
#no_change
rets
timer_table
.asg 1500,BASETM ;2100 ;16
.word BASETM-BASETM*30/100 ;1 (slowest) ;76.6 seconds/round
.word BASETM-BASETM*15/100 ;2 (slower)
.word BASETM ;3 (default) ;53.6 seconds/round
.word BASETM+BASETM*15/100 ;4 (faster)
.word BASETM+BASETM*30/100 ;5 (fastest) ;41.2 seconds/round
********************
SUBR update_timer
move @match_time,a0 ;10's
.if DEBUG
cmpi 10,a0
jrlt #ok1
;clock digit out of range!
LOCKUP
#ok1
.endif
X32 a0
addi digit_tbl,a0
move *a0,a0,L ;* image
move *a13(PDATA+20h),a8,L ;10's image pointer
move *a8(OCTRL),a1 ;DMA flags
calla change_image
move @match_time+10h,a0 ;1's
.if DEBUG
cmpi 10,a0
jrlt #ok2
;clock digit out of range!
LOCKUP
.endif
#ok2
X32 a0
addi digit_tbl,a0
move *a0,a0,L ;* image
move *a13(PDATA),a8,L ;1's image pointer
move *a8(OCTRL),a1 ;DMA flags
calla change_image
rets
#**********************************************
*
*
SUBR wrestler_counter
movk 8,a9 ; Initial wrestler count
move a9,@wrestler_count ; Initialize the count
;Turn on remaining word
movi [126h,0],a0
clr a11
move @PSTATUS,a14
cmpi 3,a14
jrz #no_adj
btst 1,a14
jrz #no_adj
movi [11ah,0],a11
#no_adj
sub a11,a0
movi [32h,0],a1
movi remaining,a2
name_z equ 9
movi name_z,a3 ;Z
movi DMAWNZ|M_SCRNREL,a4 ;DMA flags
movi TYPWCCOUNT,a5 ;Delete the last string
clr a6
clr a7
movi WSF_Y_P,b0
calla BEGINOBJP
move a8,a10
movi [17eh,0],a0
sub a11,a0
movi [32h,0],a1
movi WSF10_8,a2
movi name_z,a3 ;Z
movi DMAWNZ|M_SCRNREL,a4 ;DMA flags
movi TYPWCCOUNT,a5 ;Delete the last string
clr a6
clr a7
movi WSF_Y_P,b0
calla BEGINOBJP
#wc_loop
SLEEP 07fffh ; Sleep until woken up
move @wrestler_count,a14 ; Get current count
jrz #wc_exit ; Is it 0 ? - br = yes
cmp a9,a14 ; Has it changed from last time ?
jrz #wc_loop
move a14,a9 ; Save for reprint
move @wrestler_count,a0 ; Get current count
X32 a0
addi #digit10_tbl,a0
move *a0,a0,L ;* image
move *a8(OCTRL),a1 ;DMA flags
calla change_image
jruc #wc_loop ; Go redo it
#wc_exit
clr a0
move a0,@wrestler_count_proc,L
calla DELOBJA8
move a10,a8
jauc DELOBJDIE
#digit10_tbl
.long WSF10_0
.long WSF10_1
.long WSF10_2
.long WSF10_3
.long WSF10_4
.long WSF10_5
.long WSF10_6
.long WSF10_7
.long WSF10_8
.long WSF10_9
digit_tbl
.long WGSF20_0,WGSF20_1,WGSF20_2,WGSF20_3,WGSF20_4
.long WGSF20_5,WGSF20_6,WGSF20_7,WGSF20_8,WGSF20_9
#*****************************************************************************
SUBR maybe_do_flashes
#top SLEEPK 5
move @reduce_bog,a1
jrnz #die
MOVE @WORLDTLY,A0,L
CMPI [>ff97,0],A0
JRGT #top
CALLA START_HI_FLASHES
SLEEPK 30
JRUC #top
#die DIE
#*****************************************************************************
*
* sets our DID_RAISEARM bit.
SUBR set_raisearm_bit
move *a13(STATUS_FLAGS),a14,L
ori M_DID_RAISEARM,a14
move a14,*a13(STATUS_FLAGS),L
rets
#*****************************************************************************
*
* check our DID_RAISEARM bit--set MODE_STATUS bit if it's clear (ANI_CODE)
SUBR check_raisearm_bit
move *a13(STATUS_FLAGS),a14,L
btst B_DID_RAISEARM,a14
jrz #set
#clr move *a13(ANIMODE),a14
andni MODE_STATUS,a14
move a14,*a13(ANIMODE)
rets
#set move *a13(ANIMODE),a14
ori MODE_STATUS,a14
move a14,*a13(ANIMODE)
rets
#*****************************************************************************
*
* choose buddies for buddy mode. return the wrestlernums in a0 and a1.
SUBR choose_buddies
;prepare an exclusion mask
clr a7
movk 1,a0
move @index1,a14
sll a14,a0
or a0,a7
movk 1,a0
move @index2,a14
sll a14,a0
or a0,a7
;count excluded wrestlers
move a7,a14
clr a8
movk 8,a0
#lp1 srl 1,a14
jrnc #nxt1
inc a8
#nxt1 dsj a0,#lp1
;get the first one
calla get_rnd_wrestler
PUSH a0 ;store first WRESTLERNUM
;now exclude him and get another one.
inc a8 ;inc exclusion count
movk 1,a14
sll a0,a14
or a14,a7
calla get_rnd_wrestler
PULL a1 ;retrieve first WRESTLERNUM
rets
#*****************************************************************************
*
* Return carry set if wrestler *a14 is behind wrestler *a13, clear otherwise.
*
* trashes a14 (isn't allowed to trash a0 or a1!)
SUBR is_a14_behind
PUSH a1
move *a14(OBJ_XPOSINT),a1
move *a13(OBJ_XPOSINT),a14
sub a1,a14
jrn #onrt
#onlt ;opponent on my left
move *a13(FACING_DIR),a14
btst MOVE_LEFT_BIT,a14
jrz #behind
; jruc #ahead
#ahead PULL a1
clrc
rets
#onrt ;opponent on my right
move *a13(FACING_DIR),a14
btst MOVE_RIGHT_BIT,a14
jrnz #ahead
; jruc #behind
#behind PULL a1
setc
rets
#*****************************************************************************
*
* Call this when a match has just ended. Does an appropriate sound if
* someone's winning streak has just ended.
SUBR loser_snd
move @PSTATUS,a14
cmpi 3,a14
jrne #rets
move @match_winner,a1
NOT A1
ANDI 3,A1
DEC A1
X16 A1
ADDI p1oldwinstreak,A1
MOVE *A1,A1
jrz #rets
MOVK 2,A0
CALLA RNDRNG0
SLL 4,A0
ADDI #speech,A0
MOVE *A0,A0
CALLA ADD_VOICE
#rets rets
#speech ;.word CONGRATULATIONS
.word SOMEHOW_I_DONT_THINK
; .word L_CONGRATS
.word L_BACK_TO_SANDBOX
.word ARE_YOU_TOUGH_ENOUGH
; .WORD L_SIGN_YOUR_NAME
; .WORD THIS_IS_FOR_ALL
; .WORD SIGN_HERE_PLEASE
#*****************************************************************************
*
SUBR postgame_audits
;battle over accounting.
;compute match_realtime
move @match_start_time,a14,L
move @PCNT,a1,L
sub a14,a1
movi 55,a14
divu a14,a1
move a1,@match_realtime
;skip all this crap after a royal_rumble
move @royal_rumble,a14
jrnz #rets
;increment AUD_VSHUMF or AUD_VSCPUF (and AUD_CPUWIN)
movi AUD_VSHUMF,a0
move @PSTATUS,a14
cmpi 03h,a14
jreq #vshum
movi AUD_VSCPUF,a0
#vshum calla AUD1
;add to AUD_2PBTIME, AUD_CPUWINTIME, or AUD_CPULOSETIME
move @PSTATUS,a14
cmpi 03h,a14
jreq #2pbtime
move @match_winner,a0
and a0,a14
jrnz #cpulosetime
jruc #cpuwintime
#2pbtime
movi AUD_2PBTIME,a0
jruc #addtime
#cpuwintime
MOVE @PSTARTS,A0
JRZ NO_UPDATE_ANYTHING
MOVI AUD_CREDLEN,A0
MOVE @THIS_GAME_TIME,A1
CALLA AUD
MOVI AUD_CREDLENNUM,A0
CALLA AUD1
CLR A0
MOVE A0,@THIS_GAME_TIME
MOVE A0,@PSTARTS
NO_UPDATE_ANYTHING
movi AUD_CPUWIN,a0
calla AUD1
movi AUD_CPUWINTIME,a0
jruc #addtime
#cpulosetime
movi AUD_CPULOSETIME,a0
jruc #addtime
#addtime
move @match_realtime,a1
calla AUD
;update record speeds
move @PSTATUS,a14
cmpi 03h,a14
jreq #fast_2p
move @match_winner,a0
and a0,a14
jrnz #fast_cpulose
jruc #fast_cpuwin
#fast_2p
movi AUD_FASTHDH,a0
calla GET_AUD
jrz #no_prior_hdh
move @match_realtime,a2
cmp a1,a2
jrge #recordspeed_done
#no_prior_hdh
movi AUD_FASTHDH,a0
move @match_realtime,a1
calla STORE_AUDIT
jruc #recordspeed_done
#fast_cpulose
movi AUD_FASTHDC,a0
calla GET_AUD
jrz #no_prior_hdc
move @match_realtime,a2
cmp a1,a2
jrge #recordspeed_done
#no_prior_hdc
movi AUD_FASTHDC,a0
move @match_realtime,a1
calla STORE_AUDIT
jruc #recordspeed_done
#fast_cpuwin
movi AUD_FASTCDH,a0
calla GET_AUD
jrz #no_prior_cdh
move @match_realtime,a2
cmp a1,a2
jrge #recordspeed_done
#no_prior_cdh
movi AUD_FASTCDH,a0
move @match_realtime,a1
calla STORE_AUDIT
#recordspeed_done
;No speedy victories in 3 rnd matches!
move @current_round,a0
cmpi 3,a0
jrz #rets
;increment the proper wrestler use thingies
MOVE @PSTATUS,A0
CMPI 3,A0
JREQ #2pmatch
;it's a one-player match.
move @index1,a2
CLR A1
SRL 1,A0
JRC AUDIT_THE_HUMAN
move @index2,a2
MOVK 1,A1
AUDIT_THE_HUMAN
CALLR #audit_wrestler
move @NUM_OPPS,a14
cmpi 1,a14
jrne #rets ;don't audit 1-vs-many matches
;audit the computer
move @CURRENT_LADDER,a0,L
move *a0,a2,L
sll 24,a2
srl 24,a2 ;CPU wrestlernum in a2
;convert 7 to 8.
cmpi 7,a2
jrne #vok0
inc a2
#vok0
move @PSTATUS,a1
xori 3,a1
srl 1,a1 ;CPU side in a3 (!PSTATUS >> 1)
callr #audit_wrestler
rets
;human vs. human match
#2pmatch
;player 1
move @index1,a2
CLR A1
CALLR #audit_wrestler
;player 2
move @index2,a2
MOVK 1,A1
CALLR #audit_wrestler
#rets RETS
******************
* a2 = WRESTLERNUM
* a1 = PLYR_SIDE
SUBRP #audit_wrestler
TEST a2
jrnn #ok
.if DEBUG
LOCKUP
.endif
rets
#ok
X64 a2 ;x 4 words
addi wrestler_audits,a2
move @PSTATUS,a0
btst A1,a0
jrnz #p1hum
addi 20h,a2 ;skip 2 words
#p1hum
move *a2+,a0,W ;increment uses
calla AUD1
move @match_winner,a0
btst A1,a0
jrz #p1_audited
move *a2+,a0,W ;increment wins
calla AUD1
#p1_audited
RETS
#****************************************************************************
*
* Returns bits of teams with live members in a0.
*
SUBR get_live_bits
PUSH a1,a2,a3
movk NUM_WRES,a0
movi process_ptrs,a1
clr a3
#lp1 move *a1+,a2,L
jrz #nxt1 ;skip inactive
move *a2(PLYRMODE),a14
cmpi MODE_DEAD,a14
jrne #live
move *a2(STATUS_FLAGS),a14
btst B_ZOMBIE,a14
jrz #nxt1 ;skip dead &! zombie
#live ;live wrestler. flag his team
move *a2(PLYR_SIDE),a14
jrnz #t2
;member of team 1
ori 01h,a3
jruc #nxt1
#t2 ;member of team 2
ori 02h,a3
#nxt1 dsj a0,#lp1
move a3,a0
PULL a1,a2,a3
rets
#*****************************************************************************
*
* Returns carry set if any of a13's live opponents are outside the ring.
* Trashes a0, a1, a14
*
SUBRP any_opp_outside
PUSH a3
movi process_ptrs,a0
movi NUM_WRES,a1
move *a13(PLYR_SIDE),a2
#lp0 move *a0+,a3,L
jrz #nxt0 ;skip inactive
move *a3(PLYR_SIDE),a14
cmp a14,a2
jreq #nxt0 ;skip teammates
move *a3(PLYRMODE),a14
cmpi MODE_DEAD,a14
jreq #nxt0 ;skip dead guys
move *a3(INRING),a14
jrnz #setc ;is outside?
#nxt0 dsj a1,#lp0
PULL a3
clrc
rets
#setc PULL a3
setc
rets
#*****************************************************************************
*
* Sets a13's PLYRMODE to INAIR2 if his nearest opponent is dead, INAIR
* otherwise.
*
SUBR set_tbukl_airmode
calla get_opp_plyrmode
cmpi MODE_DEAD,a0
jreq #dead
movi MODE_INAIR2,a0
jruc #go
#dead movi MODE_INAIR,a0
#go move a0,*a13(PLYRMODE)
rets
#*****************************************************************************
*
* set MODE_STATUS bit if switches are AWAY & PUNCH.
SUBR free_toss_check
move *a13(ANIMODE),a0
ori MODE_STATUS,a0
move *a13(CLOSEST_NUM),a14
X32 a14
addi process_ptrs,a14
move *a14,a14,L
move *a14(OBJ_ZPOS),a14,L
move *a13(OBJ_ZPOS),a1,L
sub a1,a14
abs a14
srl 16,a14
cmpi 15,a14
jrlt #set
; move *a13(STICK_REL_CUR),a14
; btst MOVE_AWAY_BIT,a14
; jrz #clr
move *a13(BUT_VAL_CUR),a14
cmpi PLAYER_BLOCK_VAL,a14
jreq #set
;#clr
andni MODE_STATUS,a0
#set
move a0,*a13(ANIMODE)
rets
#*****************************************************************************
*
* We're gonna do a free hiptoss. Do all the neccesary setup here. Set our
* PLYRMODE to normal, IMMOBILIZE the bad guy, clear velocities, etc.
SUBR setup_freetoss
;mode normal
SETMODE NORMAL
;immobilize bad guy
move *a13(WHOIHIT),a0,L
movk 20,a14
move a14,*a0(IMMOBILIZE_TIME)
;smart-target bad guy
SMRTTGT a13,WHOIHIT
rets
******************************************************************************
.end