1232 lines
23 KiB
NASM
Executable File
1232 lines
23 KiB
NASM
Executable File
**************************************************************
|
||
*
|
||
* 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=distance (a1-a3 left intact)
|
||
|
||
SUBR distance_2D
|
||
|
||
PUSH a1,a2,a3,a5
|
||
|
||
move a0,a5
|
||
sub a2,a5
|
||
abs a5
|
||
mpyu a5,a5
|
||
move a5,a0
|
||
|
||
sub a1,a3
|
||
abs a3
|
||
mpyu a3,a3
|
||
|
||
add a3,a0
|
||
|
||
calla square_root
|
||
|
||
PULL a1,a2,a3,a5
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
* calculates the unhappiness value of a given point in the XZ plane.
|
||
* >a0=x >a1=z
|
||
* <a0=unhappiness(UHL)
|
||
|
||
SUBR calc_unhappiness
|
||
|
||
PUSH a1,a2,a3,a4,a5,a6,a7,a8
|
||
|
||
move a0,a2 ;keep these in a safer place
|
||
move a1,a3
|
||
|
||
;return MAX_UNHAPPINESS if the point lies outside the ring
|
||
cmpi RING_TOP,a3
|
||
jrlt #out_of_ring
|
||
cmpi RING_BOT,a3
|
||
jrgt #out_of_ring
|
||
|
||
cmpi RING_X_CENTER,a0
|
||
jrlt #check_left
|
||
|
||
movi vln_right_rope,a6
|
||
move a3,a1
|
||
calla calc_line_pt
|
||
jrz #out_of_ring
|
||
subi 4,a0 ;don't get within 4 of rope
|
||
cmp a0,a2
|
||
jrge #out_of_ring
|
||
jruc #in_ring
|
||
|
||
#check_left
|
||
movi vln_left_rope,a6
|
||
move a3,a1
|
||
calla calc_line_pt
|
||
jrz #out_of_ring
|
||
addi 4,a0 ;don't get within 4 of rope
|
||
cmp a0,a2
|
||
jrle #out_of_ring
|
||
|
||
#in_ring
|
||
|
||
;reg use - main
|
||
; a2 = point x
|
||
; a3 = point z
|
||
; a4 = important wrestler 1 x
|
||
; a5 = important wrestler 1 z
|
||
; a6 = important wrestler 2 x
|
||
; a7 = important wrestler 2 z
|
||
; a8 = dist1 (point to w1)
|
||
; a9 = dist2 (point to w2)
|
||
;a10 = dist12 (w1 to w2)
|
||
;a11 = running unhappiness total
|
||
|
||
movi process_ptrs,a0
|
||
move *a0+,a1,L
|
||
move *a1(OBJ_XPOSINT),a4
|
||
move *a1(OBJ_ZPOSINT),a5
|
||
move *a0,a1,L
|
||
move *a1(OBJ_XPOSINT),a6
|
||
move *a1(OBJ_ZPOSINT),a7
|
||
|
||
;get dist1
|
||
move a4,a0
|
||
move a5,a1
|
||
calla distance_2D
|
||
move a0,a8
|
||
|
||
.if REF_DEBUG
|
||
move @grid_mode,a14
|
||
cmpi GRID_D1,a14
|
||
jrne #d2
|
||
move @grid_index,a14
|
||
X32 a14
|
||
addi uhgrid,a14
|
||
move a8,*a14,W
|
||
|
||
#d2
|
||
.endif
|
||
;get dist2
|
||
move a6,a0
|
||
move a7,a1
|
||
calla distance_2D
|
||
move a0,a9
|
||
|
||
.if REF_DEBUG
|
||
move @grid_mode,a14
|
||
cmpi GRID_D2,a14
|
||
jrne #d12
|
||
move @grid_index,a14
|
||
X32 a14
|
||
addi uhgrid,a14
|
||
move a9,*a14,W
|
||
|
||
#d12
|
||
.endif
|
||
;get dist12
|
||
PUSH a2,a3
|
||
move a4,a0
|
||
move a5,a1
|
||
move a6,a2
|
||
move a7,a3
|
||
calla distance_2D
|
||
move a0,a10
|
||
PULL a2,a3
|
||
|
||
;set the total
|
||
clr a11
|
||
|
||
;BETWEEN - No standing in the foreground between the wrestlers.
|
||
; It blocks the camera.
|
||
|
||
;first off, is our Z greater than the Z of the line connecting
|
||
; the two wrestlers at X?
|
||
; z(x)=(z2-z1)(x-x1)/(x2-x1)+z1
|
||
move a7,a1
|
||
sub a5,a1 ;z2-z1
|
||
|
||
move a2,a14
|
||
sub a4,a14 ;x-x1
|
||
mpys a14,a1 ;(z2-z1)*(x-x1)
|
||
|
||
move a6,a14
|
||
sub a4,a14 ;x2-x1
|
||
divs a14,a1 ;(z2-z1)(x-x1)/(x2-x1)
|
||
add a7,a1 ;(z2-z1)(x-x1)/(x2-x1)+z1
|
||
|
||
cmp a1,a3
|
||
jrlt #not_between
|
||
|
||
move a4,a14
|
||
add a6,a14
|
||
sra 1,a14
|
||
move a14,a1 ;a1 = midpoint of x1 and x2
|
||
|
||
move a4,a14
|
||
sub a6,a14
|
||
abs a14
|
||
addi 120,a14
|
||
sra 1,a14
|
||
move a14,a0 ;a0 = dist ref wants to be from mdpt
|
||
|
||
sub a2,a1
|
||
abs a1 ;a1 = dist from point to mdpt
|
||
cmp a0,a1
|
||
jrgt #not_between
|
||
|
||
;in between. assign some whine points based on how close
|
||
sub a1,a0
|
||
X32 a0
|
||
addi 100,a0
|
||
add a0,a11
|
||
|
||
#not_between
|
||
;EQUIDISTANT - Unhappiness is the difference between d1 and d2.
|
||
move a9,a1
|
||
sub a8,a1
|
||
abs a1
|
||
|
||
;hack - don't worry about a difference of less than 200.
|
||
cmpi 200,a1
|
||
jrle #skip_eq
|
||
X8 a1
|
||
add a1,a11
|
||
#skip_eq
|
||
|
||
;ELLIPSE - Unhappiness is the difference between d1+d2 and (d12+160)
|
||
; times 8 if too far or times 32 if too close.
|
||
; if d12+80 < 200, use 200 instead.
|
||
PUSH a10
|
||
cmpi 200,a10
|
||
jrge #a10_ok
|
||
movi 160,a10
|
||
#a10_ok
|
||
move a8,a1
|
||
add a9,a1
|
||
sub a10,a1
|
||
subi 160,a1
|
||
jrnn #el_too_far
|
||
|
||
; abs a1 ;no unhappiness if too far...
|
||
; X4 a1
|
||
;#el_too_far
|
||
; X8 a1
|
||
; add a1,a11
|
||
|
||
abs a1
|
||
X32 a1
|
||
add a1,a11
|
||
#el_too_far
|
||
PULL a10
|
||
|
||
;DUMMY - And whatever else, do NOT get within 80 pixels of a wrestler.
|
||
cmpi 80,a8
|
||
jrgt #tc_ok1
|
||
movi 80,a14
|
||
sub a8,a14
|
||
X16 a14
|
||
add a14,a11
|
||
#tc_ok1
|
||
cmpi 80,a9
|
||
jrgt #tc_ok2
|
||
movi 80,a14
|
||
sub a9,a14
|
||
X128 a14
|
||
add a14,a11
|
||
#tc_ok2
|
||
|
||
move a11,a0
|
||
jrnn #done
|
||
LOCKUP ;unhap shouldn't ever be negative!
|
||
clr a0
|
||
jruc #done
|
||
|
||
#out_of_ring
|
||
movi MAX_UNHAPPINESS,a0
|
||
#done
|
||
PULL a1,a2,a3,a4,a5,a6,a7,a8
|
||
rets
|
||
|
||
.if REF_DEBUG
|
||
#*****************************************************************************
|
||
* displays the unhappiness values
|
||
*
|
||
|
||
.bss grid_digit_objects,9*4*20h
|
||
.bss grid_digit_values,9*4*10h
|
||
.bss grid_title,20h
|
||
|
||
|
||
GRID_TLX equ 310
|
||
GRID_TLY equ 200
|
||
|
||
|
||
SUBR grid_display
|
||
|
||
TBL_OBJ #ttt_grid
|
||
TBL_OBJ #grid_title
|
||
move a8,@grid_title,L
|
||
|
||
;reg use
|
||
;a10 - grid_digit_objects
|
||
|
||
; b2 - inside loop counter
|
||
; b3 - middle loop counter
|
||
; b4 - outside loop counter
|
||
|
||
movi grid_digit_objects,a10
|
||
movi GRID_TLY<<16,a1
|
||
|
||
movi font60,a2
|
||
movi 300,a3
|
||
movi DMAWNZ|M_3D|M_SCRNREL,a4
|
||
movi CLSNEUT|TYPTEXT,a5
|
||
clr a6
|
||
clr a7
|
||
|
||
|
||
movi 3,b4
|
||
#outer_loop
|
||
|
||
movi GRID_TLX<<16,a0
|
||
movi 3,b3
|
||
#middle_loop
|
||
|
||
movi 4,b2
|
||
#inside_loop
|
||
;create the object
|
||
PUSH a0,a1,a2,a3,a4,a5,a6,a7
|
||
calla BEGINOBJ
|
||
PULL a0,a1,a2,a3,a4,a5,a6,a7
|
||
|
||
move a8,*a10+,L
|
||
|
||
addi [5,0],a0
|
||
dsj b2,#inside_loop
|
||
|
||
addi [6,0],a0
|
||
dsj b3,#middle_loop
|
||
|
||
addi [9,0],a1
|
||
dsj b4,#outer_loop
|
||
|
||
#main_loop
|
||
SLEEP 6
|
||
callr update_grid
|
||
jruc #main_loop
|
||
|
||
#ttt_grid
|
||
.word GRID_TLX-2,GRID_TLY-2,299
|
||
.long ttt_grid
|
||
.word DMAWNZ|M_3D|M_SCRNREL
|
||
.word CLSNEUT|TYPNEUT
|
||
.long 0,0
|
||
|
||
#grid_title
|
||
.word GRID_TLX+35,GRID_TLY-12,299
|
||
.long g_unhap
|
||
.word DMAWNZ|M_3D|M_SCRNREL
|
||
.word CLSNEUT|TYPNEUT
|
||
.long 0,0
|
||
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR update_grid
|
||
|
||
;reg use
|
||
; a9 grid values *
|
||
;a10 grid digit obj *
|
||
;a11 digit values *
|
||
|
||
; b2 inner loop counter
|
||
; b3 outer loop counter
|
||
|
||
;update the digit values
|
||
|
||
movi uhgrid,a9
|
||
movi grid_digit_values,a11
|
||
movi 9,b3
|
||
|
||
#outer_loop
|
||
|
||
movi 4,b2
|
||
move *a9+,a0,L
|
||
calla BINBCD
|
||
|
||
#inner_loop
|
||
move a0,a14
|
||
sla 4,a0
|
||
andi >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
|
||
|