************************************************************** * * Software: Jamie Rivett * Initiated: 4/16/94 * * COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC. * ************************************************************** .file "ref.asm" .title "referee specific game code" .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 "sound.h" .include "ring.equ" .include "fontsimg.glo" ****************************************************************************** * EXTERNAL REFERENCES .ref wres_get_but_val_up,wres_get_but_val_down,wres_get_but_val_cur .ref wres_get_stick_val_cur .ref get_punch_dtime .ref change_anim1,change_anim1a .ref change_anim2,change_anim2a .ref set_wrestler_xflip .ref process_ptrs .ref keep_attached .ref get_opp_plyrmode .ref wres_collis_off .ref convert_facing .ref check_secret_moves .ref change_walk_anim .ref set_rotate_anim .ref execute_walk .ref start_run,bounce_off_ropes .ref inc_burnout .ref PCNT ;from DCSSOUND.ASM .ref triple_sound ;from DISPLAY.ASM .ref BEGINOBJ_TBL ;from HSTD.ASM .ref BINBCD ;from ROBO.ASM .ref civanic ;from SQUARE.ASM .ref square_root ;from WRESTLE.ASM .ref get_rope_x,calc_line_pt .ref set_turbo_status ;animation sequence .ref ref_stand2_anim,ref_stand4_anim .ref ref_torso2_anim,ref_torso4_anim .ref ref_zip_anim .ref ref_walk1_f2_anim,ref_walk2_f2_anim,ref_walk4_f2_anim .ref ref_walk5_f2_anim,ref_walk6_f2_anim,ref_walk8_f2_anim .ref ref_walk1_f4_anim,ref_walk2_f4_anim,ref_walk4_f4_anim .ref ref_walk5_f4_anim,ref_walk6_f4_anim,ref_walk8_f4_anim .ref ref_2_to_4_turn_anim,ref_8_to_6_turn_anim ;stand .ref ref_4_to_2_turn_anim,ref_6_to_8_turn_anim .ref ref_4_to_6_turn_anim,ref_6_to_4_turn_anim .ref ref_2_to_8_turn_anim,ref_8_to_2_turn_anim .ref ref_4_to_8_turn_anim,ref_6_to_2_turn_anim .ref ref_8_to_4_turn_anim,ref_2_to_6_turn_anim .ref ref_2_to_4_turn2_anim,ref_4_to_2_turn2_anim ;torso .ref ref_4_to_6_turn2_anim,ref_6_to_4_turn2_anim .ref ref_2_to_8_turn2_anim,ref_8_to_2_turn2_anim .ref ref_2_head_hit_anim,ref_4_head_hit_anim,ref_head_hit2_anim .ref ref_2_body_hit_anim,ref_4_body_hit_anim ****************************************************************************** * SYMBOLS DEFINED IN THIS FILE .bss uhgrid,9*20h .bss grid_index,10h BSSX refmove_dir,10h BSSX motion_threshhold,10h BSSX ref_unhap,20h BSSX last_move,10h BSSX last_holdstill,10h ****************************************************************************** * EQUATES FOR THIS FILE MAX_UNHAPPINESS equ 7FFFFFFFh UHGRID_X equ 4 UHGRID_Z equ 4 GRID_UNHAP equ 0 GRID_D1 equ 1 GRID_D2 equ 2 REF_DEBUG equ 0 BRAIN_FREQ equ 3 ;update move grid every X ticks .if REF_DEBUG BSSX grid_mode,10h .endif #***************************************************************************** SUBR ref_ani_init .if REF_DEBUG movi GRID_UNHAP,a14 move a14,@grid_mode CREATE0 grid_display .endif move a13,a8 CREATE0 ref_brain movi ref_stand2_anim,a0 calla change_anim1a movi ref_torso2_anim,a0 calla change_anim2a rets #***************************************************************************** * * REF CONTROL CODE * * a13 = * ref process SUBR move_ref ; movi 100h,a0 ;temp fix! ; move a0,*a13(ANI_SPEED) clr a0 move a0,*a13(MOVE_DIR) move *a13(PLYRMODE),a0 sll 5,a0 ;x 32 addi #mode_table,a0 move *a0,a0,L call a0 rets #mode_table .long mode_normal ;0 .long mode_running ;1 .long mode_inair ;2 .long mode_attached ;3 .long mode_onground ;4 .long mode_bouncing ;5 .long mode_onturnbkl ;6 .long mode_block ;7 .long mode_dizzy ;8 .long mode_dead ;9 .long mode_oppoverhead ;10 .long mode_climbturnbkl ;11 .long mode_waitanim ;12 .long mode_x6 ;13 .long mode_x7 ;14 .long mode_x8 ;15 .long mode_x9 ;16 #***************************************************************************** * mode_normal ;0 move *a13(ANIMODE),a0 btst MODE_UNINT_BIT,a0 jrnz #no_interrupt callr calc_walk_dir calla execute_walk #no_interrupt rets SUBRP calc_walk_dir move @refmove_dir,a14 move a14,*a13(MOVE_DIR) rets #***************************************************************************** * Brain process. Continuously updates refmove_dir to show the direction to * minimize unhappiness. * >a8 = ref proc STRUCTPD LONG #REFPROC ;UHL ref process SUBR ref_brain move a8,*a13(#REFPROC),L movi 10,a14 move a14,@motion_threshhold move @PCNT,a14 move a14,@last_move move a14,@last_holdstill #main_loop SLEEPK BRAIN_FREQ ;update the motion threshhold ;if he's been moving continuously for 20 ticks, increment the ; threshhold. move @PCNT,a0 move @last_holdstill,a1 sub a1,a0 cmpi 20,a0 jrlt #no_inc move @motion_threshhold,a14 inc a14 move a14,@motion_threshhold move @PCNT,a14 move a14,@last_holdstill #no_inc ;if he's been holding still continuously for 20 ticks, decrement ; the threshhold. move @PCNT,a0 move @last_move,a1 sub a1,a0 cmpi 20,a0 jrlt #no_dec move @motion_threshhold,a14 dsj a14,#dmt_inrange clr a14 #dmt_inrange move a14,@motion_threshhold move @PCNT,a14 move a14,@last_move #no_dec ;update move_dir ;reg use ; a2 - current low unhappiness value (score) ; a3 - current low unhappiness index (champ) ; a4 - current index (0-8) movi MAX_UNHAPPINESS,a2 movi 4,a3 movi 8,a4 #search_loop move *a13(#REFPROC),a5,L move *a5(OBJ_XPOSINT),a0 move *a5(OBJ_ZPOSINT),a1 move a4,a5 X64 a5 addi brain_grid,a5 move *a5+,a14,L sra 16,a14 add a14,a0 move *a5+,a14,L sra 16,a14 add a14,a1 calla calc_unhappiness cmpi 4,a4 jrne #skip_refupdate move a0,@ref_unhap,L #skip_refupdate .if REF_DEBUG move @grid_mode,a14 cmpi GRID_UNHAP,a14 jrne #no_grid_unhap move a4,a14 X32 a14 addi uhgrid,a14 move a0,*a14,L #no_grid_unhap .endif cmp a2,a0 jrge #too_high move a0,a2 move a4,a3 #too_high dec a4 jrnn #search_loop ;all done. ref_unhap holds unhappiness at ref's current position. ; a2 holds unhappiness at lowest position. If the best unhappiness ; is within motion_thresshold of the current unhap, just hold still. move @ref_unhap,a1,L sub a2,a1 .if DEBUG jrnn #no_bug LOCKUP ;a2 should never be less than ref_unhap #no_bug .endif move @motion_threshhold,a0 sub a0,a1 jrnn #move_off ;not enough of a difference to make moving worthwhile movk 4,a3 #move_off movi last_holdstill,a0 cmpi 4,a3 jreq #holdstill movi last_move,a0 #holdstill move @PCNT,a14 move a14,*a0 X16 a3 addi #move_table,a3 move *a3,a3,W move a3,@refmove_dir jruc #main_loop #no_ref DIE #move_table .word MOVE_UP_LEFT,MOVE_UP,MOVE_UP_RIGHT .word MOVE_LEFT,MOVE_ZIP,MOVE_RIGHT .word MOVE_DOWN_LEFT,MOVE_DOWN,MOVE_DOWN_RIGHT #***************************************************************************** * mode_running ;1 rets #***************************************************************************** * mode_inair ;2 rets #***************************************************************************** * mode_attached ;3 rets #***************************************************************************** mode_onground ;4 rets #***************************************************************************** * * bouncing off ropes while running mode_bouncing ;5 rets #***************************************************************************** * * STANDING ON TOP OF TURNBUCKLE mode_onturnbkl ;6 rets #***************************************************************************** * blocking mode_block ;7 rets #***************************************************************************** * doink with zero health mode_dizzy ;8 rets #***************************************************************************** mode_dead ;9 rets #***************************************************************************** * opponent held overhead mode_oppoverhead ;10 rets #***************************************************************************** * * CLIMBING UP OR DOWN THE TURNBUCKLE mode_climbturnbkl ;11 rets #***************************************************************************** mode_waitanim ;12 move *a13(ANIMODE),a0 btst MODE_END_BIT,a0 jrz #not_ended move *a13(CODE_ADDR),a0,L call a0 #not_ended rets #***************************************************************************** mode_x6 ;13 mode_x7 ;14 mode_x8 ;15 mode_x9 ;16 rets #***************************************************************************** #VEL equ 30000h #DVEL equ 21f0eh SUBR ref_velocity_table ; X, Z .long 0, -#VEL ;0 UP .long #DVEL, -#DVEL ;1 UP-RIGHT .long #VEL, 0 ;2 RIGHT .long #DVEL, #DVEL ;3 DOWN-RIGHT .long 0, #VEL ;4 DOWN .long -#DVEL, #DVEL ;5 DOWN-LEFT .long -#VEL, 0 ;6 LEFT .long -#DVEL, -#DVEL ;7 UP-LEFT SUBRP brain_grid .long -#DVEL*BRAIN_FREQ,-#DVEL*BRAIN_FREQ ;up-left .long 0,-#VEL*BRAIN_FREQ ;up .long #DVEL*BRAIN_FREQ,-#DVEL*BRAIN_FREQ ;up-right .long -#VEL*BRAIN_FREQ,0 ;left .long 0,0 ;zip .long #VEL*BRAIN_FREQ,0 ;right .long -#DVEL*BRAIN_FREQ,#DVEL*BRAIN_FREQ ;down-left .long 0,#VEL*BRAIN_FREQ ;down .long #DVEL*BRAIN_FREQ,#DVEL*BRAIN_FREQ ;down-right #***************************************************************************** SUBR ref_rotate_anims_table ; old = up right .long ref_stand2_anim ;new = up right .long ref_2_to_4_turn_anim ; = down right .long ref_2_to_6_turn_anim ; = down left *** .long ref_2_to_8_turn_anim ; = up left ; old = down right .long ref_4_to_2_turn_anim ;new = up right .long ref_stand4_anim ; = down right .long ref_4_to_6_turn_anim ; = down left .long ref_4_to_8_turn_anim ; = up left *** ; old = down left .long ref_6_to_2_turn_anim ;new = up right *** .long ref_6_to_4_turn_anim ; = down right .long ref_stand4_anim ; = down left .long ref_6_to_8_turn_anim ; = up left ; old = up left .long ref_8_to_2_turn_anim ;new = up right .long ref_8_to_4_turn_anim ; = down right *** .long ref_8_to_6_turn_anim ; = down left .long ref_stand2_anim ; = up left SUBR ref_leg_anims_table ; MOVE ;(#1 - UP) FACING .long ref_walk1_f2_anim ;1 (UP) .long ref_walk1_f2_anim ;2 (UP_RIGHT) .long ref_walk1_f4_anim ;3 (RIGHT) .long ref_walk1_f4_anim ;4 (DOWN_RIGHT) .long ref_walk1_f4_anim ;5 (DOWN) .long ref_walk1_f4_anim ;6 (DOWN_LEFT) .long ref_walk1_f2_anim ;7 (LEFT) .long ref_walk1_f2_anim ;8 (UP-LEFT) ;(#2 - UP-RIGHT) .long ref_walk2_f2_anim ;1 (UP) .long ref_walk2_f2_anim ;2 (UP_RIGHT) .long ref_walk2_f2_anim ;3 (RIGHT) .long ref_walk2_f4_anim ;4 (DOWN_RIGHT) .long ref_walk8_f4_anim ;5 (DOWN) .long ref_walk8_f4_anim ;6 (DOWN_LEFT) .long ref_walk4_f2_anim ;7 (LEFT) .long ref_walk4_f2_anim ;8 (UP-LEFT) ;(#3 - RIGHT) .long ref_walk2_f2_anim ;1 (UP) .long ref_walk2_f2_anim ;2 (UP_RIGHT) .long ref_walk2_f2_anim ;3 (RIGHT) .long ref_walk4_f4_anim ;4 (DOWN_RIGHT) .long ref_walk4_f4_anim ;5 (DOWN) .long ref_walk8_f4_anim ;6 (DOWN_LEFT) .long ref_walk6_f2_anim ;7 (LEFT) .long ref_walk6_f2_anim ;8 (UP-LEFT) ;(#4 - DOWN-RIGHT) .long ref_walk2_f2_anim ;1 (UP) .long ref_walk8_f2_anim ;2 (UP_RIGHT) .long ref_walk4_f4_anim ;3 (RIGHT) .long ref_walk4_f4_anim ;4 (DOWN_RIGHT) .long ref_walk2_f4_anim ;5 (DOWN) .long ref_walk6_f4_anim ;6 (DOWN_LEFT) .long ref_walk2_f2_anim ;7 (LEFT) .long ref_walk6_f2_anim ;8 (UP-LEFT) ;(#5 - DOWN) .long ref_walk5_f2_anim ;1 (UP) .long ref_walk5_f2_anim ;2 (UP_RIGHT) .long ref_walk5_f4_anim ;3 (RIGHT) .long ref_walk5_f4_anim ;4 (DOWN_RIGHT) .long ref_walk5_f4_anim ;5 (DOWN) .long ref_walk5_f4_anim ;6 (DOWN_LEFT) .long ref_walk5_f2_anim ;7 (LEFT) .long ref_walk5_f2_anim ;8 (UP-LEFT) ;(#6 - DOWN-LEFT) .long ref_walk2_f2_anim ;1 (UP) .long ref_walk6_f2_anim ;2 (UP_RIGHT) .long ref_walk2_f2_anim ;3 (RIGHT) .long ref_walk6_f4_anim ;4 (DOWN_RIGHT) .long ref_walk2_f4_anim ;5 (DOWN) .long ref_walk4_f4_anim ;6 (DOWN_LEFT) .long ref_walk2_f2_anim ;7 (LEFT) .long ref_walk8_f2_anim ;8 (UP-LEFT) ;(#7 - LEFT) .long ref_walk2_f2_anim ;1 (UP) .long ref_walk6_f2_anim ;2 (UP_RIGHT) .long ref_walk6_f2_anim ;3 (RIGHT) .long ref_walk8_f4_anim ;4 (DOWN_RIGHT) .long ref_walk4_f4_anim ;5 (DOWN) .long ref_walk4_f4_anim ;6 (DOWN_LEFT) .long ref_walk2_f2_anim ;7 (LEFT) .long ref_walk2_f2_anim ;8 (UP-LEFT) ;(#8 - UP-LEFT) .long ref_walk2_f2_anim ;1 (UP) .long ref_walk4_f2_anim ;2 (UP_RIGHT) .long ref_walk6_f2_anim ;3 (RIGHT) .long ref_walk8_f4_anim ;4 (DOWN_RIGHT) .long ref_walk6_f4_anim ;5 (DOWN) .long ref_walk2_f4_anim ;6 (DOWN_LEFT) .long ref_walk2_f2_anim ;7 (LEFT) .long ref_walk2_f2_anim ;8 (UP-LEFT) SUBR ref_torso_anims_table ; old = up right .long ref_torso2_anim ;new = up right .long ref_2_to_4_turn2_anim ; = down right .long ref_2_to_8_turn2_anim ; = down left *** .long ref_2_to_8_turn2_anim ; = up left ; old = down right .long ref_4_to_2_turn2_anim ;new = up right .long ref_torso4_anim ; = down right .long ref_4_to_6_turn2_anim ; = down left .long ref_4_to_6_turn2_anim ; = up left *** ; old = down left .long ref_6_to_4_turn2_anim ;new = up right *** .long ref_6_to_4_turn2_anim ; = down right .long ref_torso4_anim ; = down left .long ref_4_to_2_turn2_anim ; = up left ; old = up left .long ref_8_to_2_turn2_anim ;new = up right .long ref_8_to_2_turn2_anim ; = down right *** .long ref_2_to_4_turn2_anim ; = down left .long ref_torso2_anim ; = up left ; *** should not happen #***************************************************************************** * REFEREE HAS JUST BEEN HIT * a10 = * offensive process * a13 = * defensive process (REF) SUBR ref_hit move *a10(ATTACK_MODE),a0 ;type of attack that hit the ref move a0,a1 sll 5,a1 ;x 32 addi #hit_table,a1 move *a1,a1,L ;appropriate routine call a1 rets #hit_table .long _punch ;0 .long _hdbutt ;1 .long _kick ;2 .long _flykick ;3 .long _grabthrow ;4 .long _uprcut ;5 .long _lbowdrop ;6 .long _grabhold ;7 .long _grabfling ;8 .long _push ;9 .long _hiptoss ;10 .long _bigboot ;11 .long _knee ;12 .long _13 ;13 .long _14 ;14 .long _15 ;15 .long _16 ;16 #************************ ;AMODE_PUNCH 0 _punch WRSND W_REF,PUNCH_L1 WRSND W_REF,PUNCH_L2 SETMODE NORMAL movi ref_2_head_hit_anim,a0 move *a13(FACING_DIR),a1 btst MOVE_UP_BIT,a1 jrnz #2_hit movi ref_4_head_hit_anim,a0 #2_hit calla change_anim1a calla wres_collis_off rets #************************ ;AMODE_HDBUTT 1 _hdbutt WRSND W_REF,HDBUTT_L1 WRSND W_REF,HDBUTT_L2 SETMODE NORMAL movi ref_head_hit2_anim,a0 calla change_anim1a movi [1,0],a2 move *a10(OBJ_XPOSINT),a0 move *a13(OBJ_XPOSINT),a1 cmp a0,a1 ;offx - defx jrgt #go_rgt ;attacker on left neg a2 #go_rgt move a2,*a13(OBJ_XVEL),L calla wres_collis_off rets #************************ ;AMODE_KICK 2 _kick WRSND W_REF,KICK_L1 WRSND W_REF,KICK_L2 SETMODE NORMAL movi ref_2_body_hit_anim,a0 move *a13(FACING_DIR),a1 btst MOVE_UP_BIT,a1 jrnz #2_hit movi ref_4_body_hit_anim,a0 #2_hit calla change_anim1a ;Drift back away from attacker movi 20000h,a1 move *a10(OBJ_XPOSINT),a0 move *a13(OBJ_XPOSINT),a14 cmp a0,a14 jrgt #setxv movi -20000h,a1 #setxv move a1,*a13(OBJ_XVEL),L calla wres_collis_off rets #************************ ;AMODE_FLYKICK 3 _flykick rets #************************ ;AMODE_GRABTHROW 4 _grabthrow rets #************************ ;AMODE_UPRCUT 5 _uprcut rets #************************ ;AMODE_LBOWDROP 6 _lbowdrop rets #************************ ;AMODE_GRABHOLD 7 _grabhold rets #************************ ;AMODE_GRABFLING 8 _grabfling rets #************************ ;AMODE_PUSH 9 _push rets #************************ ;AMODE_HIPTOSS 10 _hiptoss rets #************************ ;AMODE_BIGBOOT 11 _bigboot rets #************************ ;AMODE_KNEE 12 _knee rets #************************ _13 ;13 _14 ;14 _15 ;15 _16 ;16 #***************************************************************************** * calculates the 2D distance between two points * >a0=x1 >a1=y1 >a2=x2 >a3=y2 * a0=x >a1=z * F000,a14 sra 12,a14 move a14,*a11+,W dsj b2,#inner_loop dsj b3,#outer_loop ;update the digit objects movi grid_digit_objects,a10 movi grid_digit_values,a11 movi 9*4,b2 #loop move *a11+,a0,W X32 a0 addi #digit_table,a0 move *a0,a0,L move *a10+,a8,L move *a8(OIMG),a2,L cmp a0,a2 jreq #match ;animate calla civanic #match dsj b2,#loop ;update the title move @grid_mode,a0 X32 a0 addi #grid_modes,a0 move *a0,a0,L move @grid_title,a8,L move *a8(OIMG),a14,L cmp a14,a0 jreq #done calla civanic #done rets #digit_table .long font60,font61,font62,font63,font64 .long font65,font66,font67,font68,font69 #grid_modes .long g_unhap,g_d1,g_d2 .endif ****************************************************************************** .end