6706 lines
129 KiB
NASM
Executable File
6706 lines
129 KiB
NASM
Executable File
**************************************************************
|
||
*
|
||
* Software: Jamie Rivett, Mark Turmell, Jason Skiles
|
||
* Initiated: 12/7/93
|
||
*
|
||
* Modified:
|
||
*
|
||
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
|
||
*
|
||
**************************************************************
|
||
|
||
.file "wrestle.asm"
|
||
.title "wrestling game program"
|
||
.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 "wwfsec.equ"
|
||
.include "game.equ"
|
||
.include "audit.equ"
|
||
.include "plyr.equ"
|
||
.include "anim.equ"
|
||
.include "sound.h"
|
||
.include "ring.equ"
|
||
.include "sound.equ"
|
||
.include "damage.equ"
|
||
|
||
.include "newfont.tbl"
|
||
.include "imgtbl.glo"
|
||
.include "fontsimg.glo"
|
||
.include "bgndtbl.glo"
|
||
.include "miscimg.glo"
|
||
|
||
; .if DEBUG
|
||
; .include "dirdebug.tbl"
|
||
;
|
||
;ARROWS:
|
||
; .word 4
|
||
; .word 00H,015H,07FFFH,02B5H
|
||
; .endif
|
||
|
||
.if DEBUG
|
||
|
||
SCRT_DEBUG equ 0
|
||
DIR_DEBUG equ 0
|
||
COL_DEBUG equ 1
|
||
|
||
.else
|
||
|
||
SCRT_DEBUG equ 0
|
||
DIR_DEBUG equ 0
|
||
COL_DEBUG equ 0
|
||
|
||
.endif
|
||
|
||
******************************************************************************
|
||
* EXTERNAL REFERENCES
|
||
|
||
.if DEBUG
|
||
.ref instant_death
|
||
.endif
|
||
|
||
.ref ADD_VOICE,ARE_WE_IN_RING,AUD,AUD1,BAKMODS,BGND_UD1
|
||
.ref CLEAR_SPEECH_REPEAT,CREATE_TEXT_LINE,CR_CONTP,CR_STRTP
|
||
.ref CURRENT_LADDER,D2ST2B03,DAM_MULT,DBV,DIAG,DONE_HOWARD
|
||
.ref DO_CROWD_CHEER,FIND_AND_KILL_ENDLESS,GAME_BEATEN
|
||
.ref GET_ADJ,GET_AUD,combo_audit_done,FINAL_PTR
|
||
.ref INIT_LADDER_TABLE,INIT_SKIRTS,INIT_TAB,IRQSKYE,KILL_AUD
|
||
.ref LCOIN,MATCH_TIMERS,NUM_OPPS,OPEN_PROGRESS_SCREEN
|
||
.ref POWERCMOS,POWERTST,P_CONT,P_START,RCOIN,READ_DIP
|
||
.ref RESETUP_PROGRESS,SERVICE,SET_LOWER_VOL,SHIFT_BARS_IN_Z
|
||
.ref SLAM_SW,SORT_OUT_WRESTLER_NUM,SPECIAL_WIPEOUT,STORE_AUDIT
|
||
.ref THIS_GAME_IS_BEATEN,VOLBTN_PRESS,WALK_SOUND,do_game_over
|
||
.ref WDOGRAM,rewire_monitor,XCOIN,DUMRETS,WHICH_SCREEN
|
||
.ref ZFLIP_POS_VAR,CREATE_TIMEOUT,CCOIN,CHANGE_SKIRTS,CKDIAG
|
||
.ref set_volume,KILL_ALL_CHANNELS,RESET_VOICE_QUEUE
|
||
.ref FINAL_BATTLE_LINEUP,RNDRNG0,change_wrestler,match_timer
|
||
.ref animate_wrestler,are_we_waiting_f,attract_mode
|
||
.ref bam_ani_init,bret_ani_init,change_anim1,change_anim1a
|
||
.ref change_anim2,check_collisions,ck_climb_in_bot,keep_onscreen
|
||
.ref ck_climb_in_side,ck_climb_in_top,ck_climb_out_bot
|
||
.ref ck_climb_out_side,ck_climb_out_top
|
||
.ref crowd_anim,dirqtimer,dma_meter,doink_ani_init,buyin_select
|
||
.ref dpageflip,drone_main,entered_inits,getup_meter
|
||
.ref index1,index2,init_all,init_life_data,init_special_objlist
|
||
.ref lex_ani_init,meters,move_bam,move_bret,move_doink,move_lex
|
||
.ref move_razor,move_shawn,move_taker,move_yoko,adjust_health
|
||
.ref overlap_collision,pal_getf,pin_speed_in_case,pregame_show
|
||
.ref print_string_C2,process_dispatch,razor_ani_init,choose_pal
|
||
.ref read_switches,rope,rope_command,select_screen,init_smoves
|
||
.ref set_collision_boxes,set_images,setup_message
|
||
.ref shawn_ani_init,snd_update,square_root,taker_ani_init
|
||
.ref triple_sound,wgsf24_ascii,wres_get_but_val_down
|
||
.ref wres_get_stick_val_down,wres_get_stick_val_up
|
||
.ref wrestler_audits,yoko_ani_init,mess_objid,pal_clean
|
||
.ref wrestler_veladd,announce_rnd_winner,scroll_world
|
||
.ref drone_change_back,is_final_match,audit_ud_flag
|
||
.ref ditch_getup_meter,message_flag,init_rnd_life_data
|
||
.ref p1rnd_award,p2rnd_award,p1mtch_award,p2mtch_award
|
||
.ref p1ws_award,p2ws_award,rst_awards,rst_winstreak_awards
|
||
.ref PERFECT_WINS,MUSIC_HAP,THIS_GAME_TIME,WINS_OBJ
|
||
.ref arm_winstreak_award,reset_dufus_msgs,clear_icon_total
|
||
.ref MESSAGE_FLAGS,FLASH_FLAG,royal_rumble,choose_buddies
|
||
.ref do_show_options,show_options,IKIL1C,is_a14_behind
|
||
.ref maybe_do_flashes,COMBO_FLASH_FLAG,loser_snd
|
||
.ref in_finish_move,buddy_mode_on,buddy_mode_checked
|
||
.ref copy_rom_string,concat_rom_string,setup_message
|
||
.ref copy_string,dec_to_asc,concat_string,message_buffer
|
||
.ref osgmd8_ascii,get_all_buttons_cur,_serial_number,_man_date
|
||
.ref InitPIC,RemapIO,SecFuncCheck
|
||
.ref rr_loss,postgame_audits
|
||
.ref wrestler_counter
|
||
.ref is_8_on_1,bncoff_gate,fall_back_tbl
|
||
.ref show_wrestler_end_story,do_fireworks
|
||
.ref p1pins,p2pins,finish_completed
|
||
|
||
|
||
******************************************************************************
|
||
* SYMBOLS DEFINED IN THIS FILE
|
||
|
||
|
||
.def obj_look,ani_init,mainlp,PCMOSRET,ring_mod
|
||
|
||
BSSX _coin_addr,32
|
||
BSSX _switch_addr,32
|
||
BSSX _switch2_addr,32
|
||
BSSX _watchdog_addr,32
|
||
BSSX _dipswitch_addr,32
|
||
BSSX _sound_addr,32
|
||
BSSX _soundirq_addr,32
|
||
BSSX _coin_counter_addr,32
|
||
|
||
;uninitialized ram definitions
|
||
BSSX no_pin_check,16
|
||
BSSX belt_ask ,16
|
||
BSSX belt_type ,16
|
||
|
||
BSSX PSTATUS ,16 ;Player in game bits (0-3)
|
||
BSSX OLD_PSTATUS ,16 ;Previous games PSTATUS
|
||
BSSX PSTARTS ,16 ;Not documented. Pbltltlt.
|
||
|
||
.if DEBUG
|
||
BSSX SLDEBUG ,16 ;Shawn's debug
|
||
BSSX slowmotion ,16 ;!0=Frames of delay for slow motion
|
||
.endif
|
||
|
||
BSSX slowmo ,16 ;!0=Frames of delay for slow motion
|
||
|
||
;I changed PCNT to a 32-bit value instead of 16 'cuz I'm tired of
|
||
; coding checks for the wraparound case, which happens every ten
|
||
; minutes or so. Since it's always treated as an unsigned value
|
||
; anyway, it's perfectly safe to continue using it as a word. - JS
|
||
.even
|
||
BSSX PCNT ,32 ;Main loop cnt
|
||
|
||
BSSX swstack_p ,32 ;*Stack position
|
||
BSSX swstackbot ,16*64 ;Bottom of stack
|
||
BSSX swstacktop ,0 ;Top of stack
|
||
|
||
BSSX COLRTEMP ,16*16 ;RAM COPY OF CYCLING COLORS
|
||
|
||
BSSX GAMSTATE ,16 ;Game state: See game.equ
|
||
|
||
BSSX HALT ,16 ;FREEZE ALL OBJECTS (NO VEL UPDATE)
|
||
BSSX NO_START ,16 ;FLAG 0=OKAY, 1=NOT RIGHT NOW.
|
||
|
||
BSSX WSPEED ,16
|
||
BSSX WFLG ,16 ;0=NOT ON, 1=YES IT IS ON
|
||
.bss WNDWFLG ,16 ;0=WINDOW SHOULD CLOSE, 1=NO WINDOW
|
||
.even
|
||
BSSX OBJPTR ,32 ;PNTR FOR WINDOW OBJECT
|
||
|
||
|
||
.bss PALTMP ,13*16*2 ;ALLOCATE 2 X COLOR AREA IN RAM
|
||
|
||
BSSX match_cnt, 16
|
||
|
||
BSSX debug_collis, 16
|
||
|
||
.even
|
||
BSSX DIAG0, 32
|
||
BSSX DIAG1, 32
|
||
|
||
BSSX process_ptrs, 32*NUM_WRES ;long * number wrestlers
|
||
p2_process .equ process_ptrs+32
|
||
.def p2_process
|
||
|
||
.bss wres0_objs, 32*MAX_PIECES
|
||
.bss wres1_objs, 32*MAX_PIECES
|
||
.bss wres2_objs, 32*MAX_PIECES
|
||
.bss wres3_objs, 32*MAX_PIECES
|
||
.bss wres4_objs, 32*MAX_PIECES
|
||
.bss wres5_objs, 32*MAX_PIECES
|
||
.bss wres6_objs, 32*MAX_PIECES
|
||
.bss wres7_objs, 32*MAX_PIECES
|
||
|
||
BSSX round_tickcount,16
|
||
|
||
|
||
BSSX wrest_joystat, 32*16*NUM_WRES ;16 bit joyval: 16 bit count
|
||
|
||
.bss fudge_x, 32 ;wrestler_x[-20h]
|
||
BSSX wrestler_x, 32*NUM_WRES ;long * number wrestlers
|
||
.bss fudge_y, 32 ;wrestler_y[-20h]
|
||
BSSX wrestler_y, 32*NUM_WRES ;long * "
|
||
.bss fudge_z, 32 ;wrestler_z[-20h]
|
||
BSSX wrestler_z, 32*NUM_WRES ;long * "
|
||
|
||
;This is the game clock at the top of the screen. It runs at various
|
||
; speeds in the different modes, and can be adjusted by the operator.
|
||
; It's not any kind of real time clock and shouldn't be used for
|
||
; ANYTHING except displaying those two digits.
|
||
BSSX match_time, 16*3 ;frac, 1's, 10's
|
||
|
||
BSSX match_over, 16 ;0=not over, !0=over
|
||
|
||
;This used to be incremented on the fly. Bogus, since we lose bog
|
||
; frames that way and end up with an artificially low time. Instead,
|
||
; compute this based on current PCNT and match_start_time at the
|
||
; end of the match.
|
||
BSSX match_realtime, 16 ;actual seconds elapsed
|
||
|
||
BSSX match_winner, 16 ;just like PSTATUS
|
||
|
||
BSSX fight_debug, 16
|
||
|
||
BSSX p1winstreak, 16 ;player 1 winning streak
|
||
BSSX p2winstreak, 16 ;player 2 winning streak
|
||
BSSX p1winstreakd, 16 ;player 1 vs drones
|
||
BSSX p2winstreakd, 16 ;player 2 vs drones
|
||
|
||
;copy pXwinstreak to pXoldwinstreak immediately after any battle
|
||
; ends, then clear pXwinstreak.
|
||
BSSX p1oldwinstreak, 16 ;player 1 dead winning streak
|
||
BSSX p2oldwinstreak, 16 ;player 2 dead winning streak
|
||
|
||
BSSX current_round, 16 ;current round in match (1+)
|
||
BSSX p1rounds, 16 ;player 1 rounds won
|
||
BSSX p2rounds, 16 ;player 2 rounds won
|
||
|
||
;keep these in order and adjacent
|
||
.even
|
||
BSSX front_rproc, 32 ;front ropes proc
|
||
BSSX back_rproc, 32 ;back ropes proc
|
||
BSSX left_rproc, 32 ;left ropes proc
|
||
BSSX right_rproc, 32 ;right ropes proc
|
||
|
||
BSSX total_matches, 16 ;matches since attract mode
|
||
BSSX no_debris, 16 ;Don't allow debris - it bogs
|
||
BSSX reduce_bog, 16
|
||
BSSX allow_offscrn,16 ;Allow players offscrn on toss outs
|
||
|
||
.bss bgnd_cntr,16
|
||
BSSX any_hits,16
|
||
BSSX robo_icon_trigger,16
|
||
|
||
.if DEBUG
|
||
BSSX stay_down, 16 ;flag - don't dec GETUP_TIME
|
||
.endif
|
||
|
||
;these three data are only for use in pin times. They don't count
|
||
; time not spent actually fighting, and so we can't use them for
|
||
; the game time audit.
|
||
BSSX round_start_time,32 ;PCNT at start of round
|
||
BSSX round_end_time,32 ;PCNT at end of round
|
||
|
||
;Set this at the beginning of a match, and subtract it from PCNT
|
||
; at the end of the match. THIS is the clock we use for the game
|
||
; time audits. It won't lose bog frames, and it isn't tied to that
|
||
; silly game clock.
|
||
BSSX match_start_time,32 ;PCNT at start of match
|
||
.text
|
||
|
||
.bss plyr_dmg_given,2*16
|
||
BSSX wrestler_count,16
|
||
BSSX wrestler_count_proc,32
|
||
BSSX temp_music,16
|
||
|
||
BSSX annc_rnd_winner_done,16
|
||
|
||
vln_right_rope_r
|
||
.WORD RING_TOP_RIGHT,RING_TOP,RING_BOT_RIGHT,RING_BOT
|
||
.WORD RING_DEPTH,RING_RIGHT_WIDTH
|
||
vln_left_rope_r
|
||
.WORD RING_TOP_LEFT,RING_TOP,RING_BOT_LEFT,RING_BOT
|
||
.WORD RING_DEPTH,RING_LEFT_WIDTH
|
||
vln_right_matedge_r
|
||
.WORD MAT_TOP_RIGHT,MAT_TOP,MAT_BOT_RIGHT,MAT_BOT
|
||
.WORD MAT_DEPTH,MAT_RIGHT_WIDTH
|
||
vln_left_matedge_r
|
||
.WORD MAT_TOP_LEFT,MAT_TOP,MAT_BOT_LEFT,MAT_BOT
|
||
.WORD MAT_DEPTH,MAT_LEFT_WIDTH
|
||
vln_right_matedge2_r
|
||
.WORD MAT2_TOP_RIGHT,MAT2_TOP,MAT2_BOT_RIGHT,MAT2_BOT
|
||
.WORD MAT2_DEPTH,MAT2_RIGHT_WIDTH
|
||
vln_left_matedge2_r
|
||
.WORD MAT2_TOP_LEFT,MAT2_TOP,MAT2_BOT_LEFT,MAT2_BOT
|
||
.WORD MAT2_DEPTH,MAT2_LEFT_WIDTH
|
||
vln_right_fence_r
|
||
.WORD ARENA_TOP_RIGHT,ARENA_TOP,ARENA_BOT_RIGHT,ARENA_BOT
|
||
.WORD ARENA_DEPTH,ARENA_RIGHT_WIDTH
|
||
vln_left_fence_r
|
||
.WORD ARENA_TOP_LEFT,ARENA_TOP,ARENA_BOT_LEFT,ARENA_BOT
|
||
.WORD ARENA_DEPTH,ARENA_LEFT_WIDTH
|
||
|
||
bssx vln_right_rope,((RING_DEPTH+10)*16)+64
|
||
bssx vln_left_rope,((RING_DEPTH+10)*16)+64
|
||
bssx vln_right_matedge,((MAT_DEPTH+10)*16)+64
|
||
bssx vln_left_matedge,((MAT_DEPTH+10)*16)+64
|
||
bssx vln_right_matedge2,((MAT2_DEPTH+10)*16)+64
|
||
bssx vln_left_matedge2,((MAT2_DEPTH+10)*16)+64
|
||
bssx vln_right_fence,((ARENA_DEPTH+10)*16)+64
|
||
bssx vln_left_fence,((ARENA_DEPTH+10)*16)+64
|
||
|
||
.even
|
||
box_matedge
|
||
.long vln_left_matedge
|
||
.long vln_right_matedge
|
||
|
||
box_matedge2
|
||
.long vln_left_matedge2
|
||
.long vln_right_matedge2
|
||
|
||
|
||
****************************************************************
|
||
* Reset entry point
|
||
|
||
SUBR init_prog
|
||
|
||
.if 0
|
||
dint
|
||
setf 16,1,0 ;Field0 = Word sign extend
|
||
setf 32,0,1 ;Field1 = Long word
|
||
movi STCKST,sp ;Top of stack
|
||
|
||
calla InitPIC
|
||
|
||
; .if DEBUG
|
||
; move a0,@>1e00000 ;Clr FPGA rom protect
|
||
; .endif
|
||
|
||
;>Manual sound board reset
|
||
; Moved to PU DIAGS
|
||
; movi 0fe00h,a0 ;Hit reset bit
|
||
; move a0,@SOUND
|
||
; movi 100,a0 ;Wait for it to catch
|
||
; dsj a0,$
|
||
; movi 0ff00h,a0 ;Let it go
|
||
; move a0,@SOUND
|
||
|
||
move @WDOGRAM,a0,L
|
||
cmpi WDOGNUM,a0
|
||
jrne initp50 ;Powerup?
|
||
|
||
move @dirqtimer,a0
|
||
cmpi 400,a0
|
||
jrhs #lockup ;Main loop died?
|
||
|
||
|
||
.if TUNIT
|
||
move @TALKPORT,a0 ;Check if watchdog was real
|
||
btst B_WDOG,a0 ;Bit should be low if dog fired
|
||
jrnz initp50 ;No watchdog?
|
||
.endif
|
||
|
||
movk AUD_LOCKUP,a0 ;watchdog
|
||
calla AUD1
|
||
jruc #cont
|
||
|
||
#lockup
|
||
|
||
movi AUD_LOCKUP,a0 ;main loop lockup
|
||
calla AUD1
|
||
|
||
#cont
|
||
.if DEBUG
|
||
.else
|
||
CALLERR 11,0 ;Watch dog
|
||
.endif
|
||
|
||
|
||
movk AUDSTAT,a0
|
||
calla GET_AUD ;0=AMode, 1=Game
|
||
move a1,a1
|
||
jrz WARMSET ;Attract mode glitch?
|
||
|
||
initp50
|
||
calla READ_DIP ;skip if UJ2 bit 6 set
|
||
btst 6,a0
|
||
jrnz #skip_powerst
|
||
jauc POWERTST ;board test etc...
|
||
#skip_powerst
|
||
|
||
.else
|
||
dint ; Interrupts OFF
|
||
setf 16,1,0 ; word sign extend
|
||
setf 32,1,1 ; long word sign extend
|
||
movi STCKST,sp ; Setup the stack pointer
|
||
|
||
clr a0 ; initial mode for VMUX chip
|
||
move a0,@VMUX_CONTROL,W ; initialize VMUX chip
|
||
|
||
movi 00030h,a0 ; hit sound reset bit
|
||
move a0,@COIN_COUNTERS ; this is where reset bit is
|
||
movi 100,a0 ; wait for it to catch
|
||
dsjs a0,$
|
||
movi 00020h,a0 ; let it go
|
||
move a0,@COIN_COUNTERS
|
||
|
||
|
||
move @SOUNDIRQ,a0 ; read watchdog status
|
||
btst 8,a0 ; Is this reset from a watchdog ?
|
||
jrnz initp50 ; br = no
|
||
|
||
#lockup
|
||
|
||
movk AUD_LOCKUP,a0 ; watchdog audit
|
||
calla AUD1
|
||
|
||
;04/01/95 - NOTE: It may look a little dumb to have two calls to InitPIC
|
||
;here instead of one above before the read for the watchdog status and it may
|
||
;be tempting to move the InitPIC call to before the watchdog status read BUT
|
||
;don't do it!!! The watchdog status MUST be read BEFORE the PIC is initialized
|
||
;or the status of the watchdog will be reset.
|
||
|
||
initp50
|
||
calla InitPIC ; Initialize the PIC and the I/O system
|
||
move a0,@WATCHDOG ; Kill the dog fer yucks
|
||
calla READ_DIP ; Read the dipswitches
|
||
btst 6,a0 ; Is the power test bypass switch on?
|
||
jrnz #skip_powerst ; br = yes
|
||
jauc POWERTST ; Go off and run the power up tests
|
||
#skip_powerst
|
||
calla InitPIC ; Reinitialize the PIC and I/O system
|
||
.endif
|
||
|
||
|
||
******************************************************************************
|
||
|
||
SUBR WARMSET
|
||
|
||
dint
|
||
setf 16,1,0 ;Field0 = Word sign extend
|
||
setf 32,0,1 ;Field1 = Long word
|
||
movi STCKST,sp ;Top of stack
|
||
|
||
calla InitPIC
|
||
|
||
;This takes all day to run. leave it out until we ship.
|
||
.if DEBUG
|
||
.else
|
||
jauc POWERCMOS
|
||
.endif
|
||
PCMOSRET
|
||
|
||
calla init_all ;Initialize hardware
|
||
; These are stored in these reggies to protect them
|
||
move b5,@_serial_number,L
|
||
move b6,@_man_date,L
|
||
calla SecFuncCheck ;Check to make sure security functions
|
||
;have not been mucked with
|
||
calla INIT_TAB ;Reset todays high score table
|
||
|
||
.if DEBUG
|
||
clr a14
|
||
move a14,@fight_debug
|
||
move @_soundirq_addr,a14,L
|
||
move *a14,a14
|
||
btst 8,a14
|
||
jrnz #no_dog
|
||
LOCKUP
|
||
#no_dog
|
||
.endif
|
||
|
||
calla CKDIAG
|
||
jrz main_go ;No diag switches closed?
|
||
|
||
CREATE DIAG_PID,DIAG ;Fire off the diag process
|
||
jruc mainlp
|
||
main_go
|
||
CREATE AMODE_PID,attract_mode ;Start the attract mode
|
||
|
||
;fall through
|
||
|
||
********************************
|
||
* Main loop
|
||
|
||
mainlp
|
||
calla process_dispatch
|
||
|
||
move a13,a13
|
||
jrz mainpok
|
||
|
||
.if DEBUG
|
||
LOCKUP
|
||
eint
|
||
.else
|
||
CALLERR 10,0
|
||
.endif
|
||
|
||
mainpok
|
||
|
||
move @RAND,a1,L ;>Randomize
|
||
rl a1,a1
|
||
move @HCOUNT,a14
|
||
rl a14,a1
|
||
add sp,a1
|
||
move a1,@RAND,L
|
||
|
||
.if DEBUG
|
||
move @dma_meter,a14
|
||
jrz #no_dmaline
|
||
.ref draw_dma_meter
|
||
calla draw_dma_meter
|
||
#no_dmaline
|
||
.endif
|
||
|
||
|
||
;isn't there a less obvious place
|
||
;that we can remap the IO ???
|
||
; btst 5,a1
|
||
; jrz _no_remap
|
||
; calla RemapIO
|
||
;_no_remap
|
||
|
||
callr switch_unstack
|
||
calla snd_update ;Update the sound calls
|
||
|
||
.if DEBUG
|
||
calla cputime_calcfree
|
||
.endif
|
||
|
||
;update all 32 bits of PCNT
|
||
move @PCNT,a0,L
|
||
addk 1,a0
|
||
move a0,@PCNT,L
|
||
|
||
jruc mainlp
|
||
|
||
|
||
#***************************************************************
|
||
* Unstack switch queue
|
||
|
||
|
||
SUBRP switch_unstack
|
||
|
||
|
||
#lp move @swstack_p,a3,L
|
||
cmpi swstacktop,a3 ;Stack at start?
|
||
jreq #x ;Empty?
|
||
move @FREE,a0,L
|
||
jrz #x ;No processes left?
|
||
|
||
move *a3+,a0 ;Get entry
|
||
move a3,@swstack_p,L ;Update stack
|
||
sll 32-5,a0 ;Max switch # 31
|
||
srl 32-5-4,a0 ;*16
|
||
move a0,a2
|
||
add a0,a2
|
||
add a0,a2 ;*3
|
||
addi switch_t,a2
|
||
move *a2+,a1
|
||
jrz #lp ;No PID?
|
||
move *a2+,a7,L ;*Code
|
||
movi ACTIVE,a13 ;*Proc list
|
||
calla GETPRC
|
||
jruc #lp
|
||
|
||
#x rets
|
||
|
||
|
||
switch_t ;(Process ID or 0, *Routine) ;Put in audit??
|
||
|
||
|
||
.if TUNIT
|
||
WL 0,0 ;S0
|
||
WL 0,0 ;S1
|
||
WL 0,0 ;S2
|
||
WL 0,0 ;S3
|
||
WL 0,0 ;S4
|
||
WL 0,0 ;S5
|
||
WL 0,0 ;S6
|
||
WL 0,0 ;S7
|
||
WL 0,0 ;S8
|
||
WL 0,0 ;S9
|
||
WL 0,0 ;S10
|
||
WL 0,0 ;S11
|
||
WL 0,0 ;S12
|
||
WL 0,0 ;S13
|
||
WL 0,0 ;S14
|
||
WL 0,0 ;S15
|
||
|
||
WL LC_PID,LCOIN ;S16 - LEFT COIN (1)
|
||
WL RC_PID,RCOIN ;S17 - RIGHT COIN (2)
|
||
WL PSWPID,plyr_strtb1 ;S18 - START 1
|
||
WL SLAM_PID,SLAM_SW ;S19 - SLAM TILT
|
||
WL DIAG_PID,DIAG ;S20 - TEST
|
||
WL PSWPID,plyr_strtb2 ;S21 - START 2
|
||
WL DIAG_PID,SERVICE ;S22 - SERVICE CREDIT
|
||
WL CC_PID,CCOIN ;S23 - CENTER COIN (3)
|
||
WL CC_PID,XCOIN ;S24 - COIN 4
|
||
WL 0,0 ;S25 - START 3
|
||
WL 0,0 ;S26 - START 4
|
||
WL VOLBTN_PID,VOLBTN_PRESS ;S27 - VOLUME DOWN
|
||
WL VOLBTN_PID,VOLBTN_PRESS ;S28 - VOLUME UP
|
||
WL 0,0 ;S29
|
||
WL 0,0 ;S30
|
||
WL CC_PID,DBV ;S31
|
||
|
||
.else
|
||
|
||
WL PSWPID,plyr_strtb4 ;S7 IO20 - START 4
|
||
WL 0,0 ;S1
|
||
WL 0,0 ;S2
|
||
WL 0,0 ;S3
|
||
WL 0,0 ;S4
|
||
WL 0,0 ;S5
|
||
WL 0,0 ;S6
|
||
WL PSWPID,plyr_strtb3 ;S7 - START 3
|
||
WL 0,0 ;S8
|
||
WL 0,0 ;S9
|
||
WL 0,0 ;S10
|
||
WL 0,0 ;S11
|
||
WL 0,0 ;S12
|
||
WL 0,0 ;S13
|
||
WL 0,0 ;S14
|
||
WL CC_PID,XCOIN ;S15 - COIN 4
|
||
|
||
WL LC_PID,LCOIN ;S16 - LEFT COIN (1)
|
||
WL RC_PID,RCOIN ;S17 - RIGHT COIN (2)
|
||
WL PSWPID,plyr_strtb1 ;S18 - START 1
|
||
WL SLAM_PID,SLAM_SW ;S19 - SLAM TILT
|
||
WL DIAG_PID,DIAG ;S20 - TEST
|
||
WL PSWPID,plyr_strtb2 ;S21 - START 2
|
||
WL DIAG_PID,SERVICE ;S22 - SERVICE CREDIT
|
||
WL CC_PID,CCOIN ;S23 - CENTER COIN (3)
|
||
WL 0,0 ;S24
|
||
WL 0,0 ;S25
|
||
WL 0,0 ;S26
|
||
WL 0,0 ;S27
|
||
WL 0,0 ;S28
|
||
WL 0,0 ;S29
|
||
WL 0,0 ;S30 - Snd IRQ
|
||
WL 0,0 ;S31
|
||
.endif
|
||
|
||
are_we_waiting_for_inits
|
||
move a8,a0
|
||
addi HI_INPUT_PID,a0
|
||
clr a1
|
||
not a1
|
||
jauc EXISTP
|
||
|
||
#***************************************************************
|
||
* plyr_strtbx - Process player start button (Process)
|
||
|
||
SUBR plyr_strtb1
|
||
clr a8 ;A8=Player #
|
||
jruc #go
|
||
|
||
SUBR plyr_strtb2
|
||
movk 1,a8
|
||
|
||
#go
|
||
|
||
move @GAMSTATE,a0
|
||
jrn #die ;In diagnostics?
|
||
|
||
cmpi INPARTY,a0
|
||
jreq #die ;don't interrupt the win sequence
|
||
|
||
move @PSTATUS,a14
|
||
btst a8,a14
|
||
jrnz #die ;Player already started?
|
||
|
||
;New start. kill the player's score and win count
|
||
|
||
PUSH a0
|
||
MOVI process_ptrs,A2
|
||
movi p1winstreak,a0
|
||
movi p1winstreakd,a4
|
||
movi entered_inits,a1
|
||
movi MATCH_TIMERS,a3
|
||
movi p1ws_award,a14
|
||
move a8,a8
|
||
jrz #rstp1scor
|
||
MOVI process_ptrs+020H,A2
|
||
movi p2winstreak,a0
|
||
movi p2winstreakd,a4
|
||
movi entered_inits+030h,a1
|
||
movi MATCH_TIMERS+020H,a3
|
||
movi p2ws_award,a14
|
||
#rstp1scor
|
||
calla rst_winstreak_awards ;reset player winstreak awards
|
||
PUSH a0
|
||
clr a0
|
||
move a8,a8
|
||
jrz #do_dmsg_rst
|
||
movk 1,a0
|
||
#do_dmsg_rst
|
||
calla reset_dufus_msgs
|
||
move a8,a0
|
||
calla clear_icon_total
|
||
move a0,a8
|
||
PULL a0
|
||
; calla dufus_msgs_on
|
||
clr a14
|
||
; move a14,@belt_ask
|
||
move a14,*a0,W ;wins
|
||
MOVE A14,*A1,L ;entered_inits
|
||
MOVE A14,*A2,L ;process_ptrs
|
||
MOVE A14,*A3,L ;MATCH_TIMERS
|
||
|
||
move *a4,a0
|
||
jrn #a4ok
|
||
move a14,*a4,W ;wins vs drones
|
||
#a4ok
|
||
|
||
PULL a0
|
||
|
||
move @OLD_PSTATUS,a14
|
||
btst a8,a14
|
||
jrz #reg ;Player on buyin screen?
|
||
;On the buyin screen.
|
||
cmpi INSELECT,a0
|
||
jreq #start_from_waitcont
|
||
LOCKUP
|
||
|
||
#reg
|
||
|
||
calla CR_STRTP ;not a continue. die on insuff $$
|
||
jalo #die
|
||
|
||
move @GAMSTATE,a0
|
||
cmpi INAMODE,a0
|
||
jreq #start_from_amode ;New start from amode?
|
||
|
||
cmpi INGAMEOVER,a0
|
||
jreq #start_from_gameover ;just like attract mode, really
|
||
|
||
cmpi INSELECT,a0
|
||
jreq #start_from_select
|
||
|
||
cmpi INPREGAME,a0
|
||
jreq #start_from_pregame
|
||
|
||
cmpi INPREGAME2,a0
|
||
jreq #start_from_midgame
|
||
|
||
cmpi INGAME,a0
|
||
jreq #start_from_midgame
|
||
|
||
LOCKUP
|
||
|
||
jruc #die ;cases we forgot...
|
||
|
||
#start_from_midgame
|
||
|
||
movi AUD_TOTSTARTS,a0 ;inc total starts audit
|
||
calla AUD1
|
||
|
||
calla P_START ;eat the creds
|
||
|
||
CREATE NO_PID,game_interrupt ;create the game proc
|
||
|
||
jruc #set_pstatus_and_die
|
||
|
||
#start_from_waitcont
|
||
|
||
callr are_we_waiting_for_inits
|
||
jrnz #die
|
||
|
||
calla CR_CONTP ;enuff creds?
|
||
jalo #die
|
||
calla P_CONT ;eat the creds
|
||
|
||
movi AUD_CONTTAKN,a0 ;inc continues taken audit
|
||
calla AUD1
|
||
|
||
|
||
jruc #set_pstatus_and_die ;waitcont watches for PSTATUS
|
||
; changes, so we don't need to
|
||
|
||
#start_from_amode
|
||
|
||
clr a0
|
||
|
||
move a0,@are_we_waiting_f
|
||
move a0,@OLD_PSTATUS
|
||
CALLA INIT_LADDER_TABLE
|
||
|
||
#start_from_gameover
|
||
movk 25,a0
|
||
move a0,@robo_icon_trigger
|
||
|
||
movk 1,a0
|
||
move a0,@no_pin_check
|
||
move a0,@belt_ask
|
||
|
||
movi AUD_PRESTARTS,a0 ;inc attract mode starts audit
|
||
calla AUD1
|
||
|
||
movi AUD_TOTSTARTS,a0 ;inc total starts audit
|
||
calla AUD1
|
||
|
||
calla P_START ;eat the creds
|
||
|
||
;Reset the volume levels here
|
||
calla KILL_ALL_CHANNELS
|
||
calla RESET_VOICE_QUEUE
|
||
|
||
movi ADJVOLUME,a0
|
||
calla GET_ADJ
|
||
BADCHK a0,0,255,28 ;reg, lo, hi, val if bad
|
||
calla set_volume
|
||
|
||
;If any button is pressed at the same time as the start button,
|
||
;then skip all select stuff. Otherwise, game acts as it will on location
|
||
|
||
clr a0
|
||
move a0,@match_cnt
|
||
|
||
|
||
.if DEBUG
|
||
move a0,@skip_select
|
||
move a0,@fight_debug
|
||
|
||
.ref get_all_buttons_cur2
|
||
calla get_all_buttons_cur2
|
||
jrz #nobutn
|
||
|
||
movk 1,a0
|
||
move a0,@skip_select
|
||
move a0,@fight_debug
|
||
|
||
.ref get_all_sticks_cur2
|
||
calla get_all_sticks_cur2
|
||
jrz #nobutn
|
||
|
||
movi -1,a0
|
||
move a0,@skip_select
|
||
|
||
#nobutn
|
||
.endif
|
||
|
||
|
||
CREATE NO_PID,game_loop ;create the game proc
|
||
jruc #set_pstatus_and_die
|
||
|
||
|
||
#start_from_select
|
||
callr are_we_waiting_for_inits
|
||
jrnz #die
|
||
|
||
movi AUD_TOTSTARTS,a0 ;creds have already been checked,
|
||
calla AUD1 ; so we know we have enough.
|
||
calla P_START
|
||
jruc #set_pstatus_and_die
|
||
|
||
|
||
#start_from_pregame
|
||
movi AUD_TOTSTARTS,a0 ;total starts
|
||
calla AUD1
|
||
calla P_START ;eat creds
|
||
CREATE NO_PID,game_loop ;make a new game loop. This will
|
||
|
||
clr a3
|
||
calla SNDSND
|
||
|
||
calla KILL_ALL_CHANNELS
|
||
calla RESET_VOICE_QUEUE
|
||
|
||
movk 11,a3 ;Little rap ditty
|
||
calla SNDSND
|
||
|
||
clr a0
|
||
move a0,@are_we_waiting_f
|
||
jruc #set_pstatus_and_die ;kill the old one and drop back
|
||
;into the select screen.
|
||
|
||
#set_pstatus_and_die
|
||
movk 1,a0 ;set the player bit in PSTATUS
|
||
sll a8,a0
|
||
move @PSTATUS,a14
|
||
or a0,a14
|
||
move a14,@PSTATUS
|
||
MOVE @PSTARTS,A14
|
||
or a0,a14
|
||
move a14,@PSTARTS
|
||
CLR A0
|
||
MOVE A0,@THIS_GAME_TIME
|
||
movi 49h,a0
|
||
calla triple_sound
|
||
|
||
clr a0
|
||
MOVE A0,@IRQSKYE
|
||
|
||
movi AUD_WINSTREAK,A0
|
||
calla KILL_AUD
|
||
movi AUD_PINSPEED,A0
|
||
calla KILL_AUD
|
||
movi AUD_BEATEN,A0
|
||
calla KILL_AUD
|
||
|
||
#die DIE
|
||
|
||
|
||
#*****************************************************************************
|
||
* game loop
|
||
*
|
||
|
||
STRUCTPD
|
||
LONG BLINK_PROC
|
||
|
||
SUBRP game_interrupt
|
||
|
||
;Someone has bought in during gameplay of a one player game!
|
||
;Print challenger comes message
|
||
|
||
movk 1,a0
|
||
move a0,@HALT
|
||
|
||
;If a player buys in during a one player game. We must decrement pxcpu_ladder
|
||
;because we haven't defeated that cpu opponent yet!
|
||
|
||
;...but if the player has already lost, go ahead and dec.
|
||
MOVE @match_winner,a0
|
||
jrz #decldr
|
||
|
||
;someone has won--figure out if it's our player. We can't look at
|
||
; PSTATUS because the other player has now bought in and it's gonna
|
||
; be 3. Instead, look at the process_ptrs. There'll be a non-zero
|
||
; value one of the first two, and that's our player.
|
||
move @process_ptrs,a14,L
|
||
jrz #op2
|
||
#op1 ;p1 is the human. test bit 0 of match_winner
|
||
btst 0,a0
|
||
jrnz #nodecldr
|
||
|
||
;p1 lost. kill his PSTATUS bit.
|
||
movi 2,a14
|
||
move a14,@PSTATUS
|
||
|
||
jruc #decldr
|
||
#op2 ;p2 is the human.
|
||
btst 1,a0
|
||
jrnz #nodecldr
|
||
|
||
;p2 lost. kill his PSTATUS bit.
|
||
movi 1,a14
|
||
move a14,@PSTATUS
|
||
|
||
#decldr MOVE @CURRENT_LADDER,A0,L
|
||
SUBI 020H,A0
|
||
MOVE A0,@CURRENT_LADDER,L
|
||
#nodecldr
|
||
|
||
;If match/rnd winner anouncement is on screen, kill it
|
||
movi ANNC_PID,a0
|
||
clr a1
|
||
not a1
|
||
calla KILALL
|
||
|
||
movi CYCPID,a0
|
||
clr a1
|
||
not a1
|
||
calla KILALL
|
||
|
||
movi CLSNEUT|TYPTEXT|SUBTXT,a0
|
||
calla obj_del1c ;delete text/plates
|
||
|
||
movi CLSNEUT|TYPTEXT|SUBMES1,a0
|
||
calla obj_del1c ;delete text/plates
|
||
|
||
#nope
|
||
|
||
movi LN1b_setup,a2
|
||
calla setup_message
|
||
movi CLSNEUT|TYPTEXT|SUBMES1,a0
|
||
move a0,@mess_objid ;OBJ ID's for text
|
||
movi #str_game,a4
|
||
calla print_string_C2
|
||
|
||
movi LN2b_setup,a2
|
||
calla setup_message
|
||
movi CLSNEUT|TYPTEXT|SUBMES1,a0
|
||
move a0,@mess_objid ;OBJ ID's for text
|
||
movi #str_over,a4
|
||
calla print_string_C2
|
||
|
||
calla pal_clean
|
||
|
||
|
||
|
||
|
||
movi ACTIVE,a3,L
|
||
|
||
#lp move *a3,a3,L ;Get next
|
||
jrz #x ;End?
|
||
move *a3(PWAKE),a0,L
|
||
move *a3(PTIME),a14 ;Add sleep
|
||
addi 3*60,a14
|
||
move a14,*a3(PTIME)
|
||
jruc #lp
|
||
#x
|
||
|
||
CREATE SET_IMAGES_PID,DO_SET_IMAGES
|
||
.ref fade_down_half
|
||
movi #no_fade,a10
|
||
CREATE FADE_PID,fade_down_half
|
||
|
||
SLEEP 120
|
||
|
||
calla KILL_ALL_CHANNELS
|
||
calla RESET_VOICE_QUEUE
|
||
|
||
movi ADJVOLUME,a0
|
||
calla GET_ADJ
|
||
BADCHK a0,0,255,28 ;reg, lo, hi, val if bad
|
||
calla set_volume
|
||
|
||
movk 1,a0
|
||
move a0,@no_pin_check
|
||
movk 11,a3 ;Little rap ditty
|
||
calla SNDSND
|
||
|
||
|
||
SUBRP game_loop
|
||
|
||
.if DEBUG
|
||
|
||
movk 3,a0 ;2 humans
|
||
.ref skip_select
|
||
move @skip_select,a14
|
||
jrz #noskp
|
||
jrp #nodrn
|
||
movk 2,a0 ;1 human 1 drone
|
||
#nodrn
|
||
move a0,@PSTATUS
|
||
#noskp
|
||
.endif
|
||
|
||
; .if DEBUG
|
||
; ;don't allow this out in the field yet.
|
||
; JSRP robo_check
|
||
; .endif
|
||
|
||
movk 1,a0
|
||
move a0,@NUM_OPPS
|
||
|
||
JSRP select_screen
|
||
clr a0
|
||
move a0,@no_pin_check
|
||
|
||
do_pregame
|
||
|
||
;clear match_winner
|
||
clr a14
|
||
move a14,@match_winner
|
||
|
||
; .ref robo_check
|
||
;
|
||
; JSRP robo_check ; RETURNS ONLY
|
||
movk INPREGAME,a14 ;set GAMSTATE
|
||
move a14,@GAMSTATE
|
||
movi PREGAME_PID,a14 ;set our PID
|
||
move a14,*a13(PROCID)
|
||
|
||
move @match_cnt,a0
|
||
inc a0
|
||
move a0,@match_cnt
|
||
|
||
move @PSTATUS,A0
|
||
CMPI 3,A0
|
||
JREQ NOT_FINISHED_GAME
|
||
|
||
calla is_final_match
|
||
jrc finished_game
|
||
|
||
NOT_FINISHED_GAME
|
||
movk 1,a14
|
||
move a14,@do_show_options
|
||
JSRP pregame_show
|
||
|
||
#game
|
||
movi INGAME,a14 ;set GAMSTATE
|
||
move a14,@GAMSTATE
|
||
movi GAME_PID,a14 ;set our PID
|
||
move a14,*a13(PROCID)
|
||
|
||
clr a0
|
||
move a0,@p1rounds
|
||
move a0,@p2rounds
|
||
move a0,@in_finish_move
|
||
|
||
movk 1,a0
|
||
move a0,@current_round
|
||
|
||
;set match_start_time
|
||
move @PCNT,a14,L
|
||
move a14,@match_start_time,L
|
||
|
||
;do the match
|
||
JSRP start_match
|
||
|
||
;inc the TOTAL GAMES audit
|
||
movi AUD_TOTALGAMES,A0
|
||
CALLA AUD1
|
||
|
||
;The only time we return from start_match is when the match is over
|
||
;and the game must goto:
|
||
|
||
;1. Buy-in screen for 1 or 2 player games
|
||
;2. Ladder screen for the next matchup
|
||
;3. Finale screens
|
||
|
||
;clear out howard speech flag so he can say it again on
|
||
; new select screen.
|
||
CLR A0
|
||
MOVE A0,@DONE_HOWARD
|
||
|
||
;set delay before allowing player to select a wrestler
|
||
movi 60,a0
|
||
move a0,@are_we_waiting_f
|
||
|
||
;If that was a royal rumble, branch right now. The following code
|
||
; assumes that PLYRNUMs match PLYR_SIDEs for human players.
|
||
move @royal_rumble,a14
|
||
jrnz #finished_rumble
|
||
|
||
;Did a human player lose?
|
||
move @PSTATUS,a0
|
||
move @match_winner,a1
|
||
andn a1,a0
|
||
jrnz #go_buyin
|
||
|
||
;This player will keep on playing.
|
||
;Display ladder of progreesion which shows his next opponent.
|
||
|
||
move @match_winner,a10
|
||
dec a10
|
||
JSRP pin_speed_in_case
|
||
jruc do_pregame
|
||
|
||
#go_buyin
|
||
;Display 2 player buyin screen.
|
||
;Turn on appropriate messages for each player
|
||
;One guy lost, check if he achieved a high score. (Most wins)
|
||
;If so, allow him to enter initials just on his panel.
|
||
|
||
;if the loser had a win streak, do a random sound call.
|
||
calla loser_snd
|
||
|
||
;save old PSTATUS
|
||
move @PSTATUS,a0
|
||
move a0,@OLD_PSTATUS
|
||
|
||
;did a human win? Check by ANDing match_winner with PSTATUS.
|
||
move @PSTATUS,a0
|
||
move @match_winner,a1
|
||
and a1,a0
|
||
jrnz #human_won
|
||
|
||
;The cpu won
|
||
clr a0
|
||
move a0,@match_winner
|
||
|
||
;decrement CURRENT_LADDER, because NEXT_IN_LADDER automatically
|
||
; increments it.
|
||
move @CURRENT_LADDER,A0,L
|
||
subi 20h,a0
|
||
move a0,@CURRENT_LADDER,L
|
||
|
||
#human_won
|
||
;use match_winner as our new PSTATUS.
|
||
move @match_winner,a0
|
||
move a0,@PSTATUS
|
||
|
||
calla is_final_match
|
||
jrc finished_game
|
||
|
||
JSRP buyin_select
|
||
|
||
;Clear the loser's wincount
|
||
movi p1winstreak,a1
|
||
move @match_winner,a0
|
||
|
||
cmpi 1,a0
|
||
jrnz #notp1
|
||
movi p2winstreak,a1
|
||
|
||
#notp1 clr a14
|
||
move a14,*a1
|
||
|
||
jruc do_pregame
|
||
|
||
****
|
||
|
||
#finished_rumble
|
||
|
||
;save old PSTATUS
|
||
; move @PSTATUS,a14
|
||
; move a14,@OLD_PSTATUS
|
||
|
||
;...no, DON'T save the old PSTATUS. For whatever reason, the
|
||
;buyin/select stuff won't work with a PSTATUS of 0 and an
|
||
;OLD_PSTATUS of 3. Evidently two people losing is too traumatic
|
||
;an event for this rickety code to deal with. So we just pretend.
|
||
;Maybe we fix this before we ship, maybe we don't. It works.
|
||
|
||
;create a set_images process to keep us animating while this
|
||
; stuff is going on.
|
||
CREATE SET_IMAGES_PID,DO_SET_IMAGES
|
||
PUSHP a0 ;store set_images proc address
|
||
JSRP show_most_damage
|
||
|
||
movk 1,a14
|
||
move a14,@OLD_PSTATUS
|
||
|
||
;did the humans win?
|
||
move @p1winstreak,a0
|
||
clr a14
|
||
move a14,@p1winstreak
|
||
move a14,@p2winstreak
|
||
move a14,@p1oldwinstreak
|
||
move a14,@p2oldwinstreak
|
||
TEST a0
|
||
jrz #rr_cpuwon
|
||
|
||
;create a set_images process to keep us animating while this
|
||
; stuff is going on.
|
||
|
||
;set GAMSTATE to INPARTY--disallows buyins
|
||
movk INPARTY,a14
|
||
move a14,@GAMSTATE
|
||
|
||
JSRP do_fireworks
|
||
|
||
PULLP a0 ;restore set_images proc address
|
||
calla KILL
|
||
|
||
;inc the 'human wins in rumble' audit
|
||
movi AUD_RRWINS,a0
|
||
calla AUD1
|
||
|
||
JSRP GAME_BEATEN
|
||
|
||
.if RR_AWARD = 1
|
||
|
||
;zero entered_inits
|
||
clr a14
|
||
move a14,@entered_inits,L
|
||
move a14,@entered_inits+20h,L
|
||
move a14,@entered_inits+40h,L
|
||
|
||
jruc do_pregame
|
||
.endif
|
||
|
||
#rr_cpuwon
|
||
|
||
clr a14
|
||
move a14,@PSTATUS
|
||
movk 3,a14
|
||
move a14,@OLD_PSTATUS
|
||
move a14,@rr_loss
|
||
JSRP buyin_select
|
||
|
||
;clear royal_rumble
|
||
clr a14
|
||
move a14,@rr_loss
|
||
move a14,@royal_rumble
|
||
|
||
move @PSTATUS,a14
|
||
jrnz do_pregame
|
||
|
||
;nobody bought in. drop to game over
|
||
jauc do_game_over
|
||
****
|
||
|
||
finished_game
|
||
;player has won the entire game.
|
||
|
||
;set GAMSTATE to INPARTY--disallows buyins
|
||
movk INPARTY,a14
|
||
move a14,@GAMSTATE
|
||
|
||
;Audit total time for a 1 credit game
|
||
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
|
||
|
||
|
||
;create a set_images process to keep us animating while this
|
||
; stuff is going on.
|
||
CREATE SET_IMAGES_PID,DO_SET_IMAGES
|
||
PUSHP a0
|
||
JSRP do_fireworks
|
||
PULLP a0
|
||
calla KILL
|
||
calla is_8_on_1
|
||
jrnc #no_stories
|
||
JSRP show_wrestler_end_story
|
||
#no_stories
|
||
JSRP GAME_BEATEN
|
||
JSRP CREATE_TEXT_LINE
|
||
JAUC THIS_GAME_IS_BEATEN
|
||
|
||
#buyin_mod
|
||
.long wwfselbkBMOD
|
||
.word -40,0
|
||
.long 0
|
||
|
||
#no_fade
|
||
.long WGSF_Y_P,scorep,0
|
||
LN1b_setup
|
||
JAM_STR wgsf24_ascii,12,0,200,77,WGSF_Y_P,0
|
||
LN2b_setup
|
||
JAM_STR wgsf24_ascii,6,0,200,120,WGSF_Y_P,0
|
||
#str_game
|
||
.byte "CHALLENGER",0
|
||
#str_over
|
||
.byte "FOUND!",0
|
||
.even
|
||
|
||
|
||
pprompt
|
||
.string "PLAYER ",0
|
||
.even
|
||
ydid_prompt
|
||
.string " INFLICTED",0
|
||
.even
|
||
pct_damage
|
||
.string "% OF THE TOTAL DAMAGE!!!",0
|
||
.even
|
||
pprompt_setup
|
||
.ref osgemd_ascii
|
||
; JAM_STR osgmd8_ascii,10,0,200,140,SGMD8YEL,print_string_C2
|
||
JAM_STR osgemd_ascii,10,0,200,140,BLUE,print_string_C2
|
||
.even
|
||
pct_damage_setup
|
||
; JAM_STR osgmd8_ascii,10,0,200,155,SGMD8YEL,print_string_C2
|
||
JAM_STR osgemd_ascii,10,0,200,163,BLUE,print_string_C2
|
||
.even
|
||
.bss dmg_ram,16*64
|
||
|
||
#*************************************************************************
|
||
*
|
||
SUBRP show_most_damage
|
||
PUSHP a0,a1,a2,a4
|
||
PUSHP a8,a9,a10,a11
|
||
|
||
clr a11 ; Clear out plyr damage totals
|
||
clr a1 ; Clear total damage done
|
||
move a11,@plyr_dmg_given,L
|
||
|
||
movi process_ptrs,a8 ; Get process pointers
|
||
#find_damage_lp
|
||
move *a8+,a9,L ; Get player process pointer
|
||
jrz #find_done ; are we done ? - br = yes
|
||
move *a9(PLYR_TYPE),a10 ; Get the player type
|
||
jrnz #find_damage_lp ; Is this a drone - br = yes
|
||
move *a9(DAMAGE_GIVEN),a11 ; Get damage this player did
|
||
add a11,a1 ; Total the damage
|
||
move *a9(PLYRNUM),a10 ; Which player is this
|
||
sll 4,a10 ; Point to temp storage for this player
|
||
addi plyr_dmg_given,a10
|
||
move a11,*a10 ; Store his damage
|
||
jruc #find_damage_lp ; Keep going
|
||
#find_done
|
||
movk 1,a11 ; Set player 1
|
||
move @plyr_dmg_given,a8 ; Get player 1 damage
|
||
move @plyr_dmg_given+10h,a9 ; Get player 2 damage
|
||
cmp a8,a9 ; Player 1 did more damage ?
|
||
jrlt #p1_most ; br = yes
|
||
movk 2,a11 ; Set player 2
|
||
move a9,a8 ; Set damage done
|
||
#p1_most
|
||
move a8,a9 ; Set up for conversion to %
|
||
movi 100,a10 ; Mult damage done by 100
|
||
mpyu a10,a9
|
||
divu a1,a9 ; Divide by total damage done
|
||
|
||
movi pprompt_setup,a2 ; Show which player did most damage
|
||
calla setup_message
|
||
movi CLSDEAD,a4
|
||
move a4,@mess_objid
|
||
move a11,a0
|
||
movk 2,a1
|
||
calla dec_to_asc
|
||
movi pprompt,a4
|
||
calla copy_rom_string
|
||
calla concat_string
|
||
movi ydid_prompt,a4
|
||
calla concat_rom_string
|
||
movi message_buffer,a4
|
||
calla print_string_C2
|
||
|
||
movi pct_damage_setup,a2 ; Show how much damage he/she did
|
||
calla setup_message
|
||
movi CLSDEAD,a4
|
||
move a4,@mess_objid
|
||
move a9,a0
|
||
movi 100,a1
|
||
calla dec_to_asc
|
||
calla copy_string
|
||
movi pct_damage,a4
|
||
calla concat_rom_string
|
||
movi message_buffer,a4
|
||
calla print_string_C2
|
||
.ref hscore_colcyc
|
||
|
||
calla hscore_colcyc
|
||
move a0,a8
|
||
SLEEP TSEC ; Show for 1 second minimum
|
||
|
||
movi TSEC*2,a9 ; Allow upto 2 more seconds
|
||
#wait_lp
|
||
SLEEPK 1
|
||
calla get_all_buttons_cur
|
||
jrnz #sd_exit
|
||
dsjs a9,#wait_lp
|
||
#sd_exit
|
||
move a8,a0
|
||
calla KILL
|
||
PULLP a8,a9,a10,a11
|
||
PULLP a0,a1,a2,a4
|
||
RETP
|
||
|
||
|
||
#*****************************************************************************
|
||
;Copy pXwinstreaks to pXoldwinstreaks, then
|
||
;increment winner's winstreak and clear loser's.
|
||
|
||
SUBR increment_wincount
|
||
|
||
;save old streaks
|
||
move @p1winstreak,a14
|
||
move a14,@p1oldwinstreak
|
||
move @p2winstreak,a14
|
||
move a14,@p2oldwinstreak
|
||
|
||
move @match_winner,a0
|
||
move @PSTATUS,a14
|
||
and a14,a0
|
||
|
||
;inc/clear p1winstreak
|
||
move @p1winstreak,a1
|
||
inc a1
|
||
btst 0,a0
|
||
jrnz #p1ok
|
||
clr a1
|
||
|
||
#p1ok PUSHP a2
|
||
clr a2
|
||
calla arm_winstreak_award
|
||
PULLP a2
|
||
|
||
move a1,@p1winstreak
|
||
move a1,a1
|
||
jrnz #no_clr_p1_ws_awards
|
||
movi p1ws_award,a14
|
||
calla rst_winstreak_awards
|
||
#no_clr_p1_ws_awards
|
||
|
||
; ;inc/clear p1winstreakd (clear if lost, inc if won vs drones)
|
||
; btst 0,a0
|
||
; jrz #clrp1d ;clr if we lost
|
||
; move @p1winstreakd,a1
|
||
; move @PSTATUS,a14
|
||
; btst 1,a14
|
||
; jrz #incp1d ;inc if vs drone
|
||
; jruc #p1dset ;else no increment
|
||
;
|
||
;#incp1d inc a1
|
||
; jruc #p1dset
|
||
;#clrp1d clr a1
|
||
;#p1dset move a1,@p1winstreakd
|
||
|
||
;inc/clear p2winstreak
|
||
move @p2winstreak,a1
|
||
inc a1
|
||
btst 1,a0
|
||
jrnz #p2ok
|
||
clr a1
|
||
#p2ok PUSHP a2
|
||
movk 1,a2
|
||
calla arm_winstreak_award
|
||
PULLP a2
|
||
move a1,@p2winstreak
|
||
move a1,a1
|
||
jrnz #no_clr_p2_ws_awards
|
||
movi p2ws_award,a14
|
||
calla rst_winstreak_awards
|
||
#no_clr_p2_ws_awards
|
||
|
||
; ;inc/clear p2winstreakd (clear if lost, inc if won vs drones or
|
||
; ; value < 2.
|
||
; btst 1,a0
|
||
; jrz #clrp2d ;clr if we lost
|
||
; move @p2winstreakd,a1
|
||
; move @PSTATUS,a14
|
||
; btst 0,a14
|
||
; jrz #incp2d ;inc if vs drone
|
||
; jruc #p2dset ;else no increment
|
||
;
|
||
;#incp2d inc a1
|
||
; jruc #p2dset
|
||
;#clrp2d clr a1
|
||
;#p2dset move a1,@p2winstreakd
|
||
|
||
;adjust p1&p2winstreakd. three possibilities:
|
||
; 1. 2p match. do nothing
|
||
; 2. 1p match, player wins. inc his winstreak.
|
||
; 3. 1p match, player loses. set both winstreaks to -1, unless
|
||
; they're already negative, in which case we dec both.
|
||
|
||
move @PSTATUS,a14
|
||
cmpi 3,a14
|
||
jreq #do_nothing
|
||
|
||
move @match_winner,a0
|
||
cmp a0,a14
|
||
jrne #dec_both
|
||
; jruc #inc_one
|
||
|
||
#inc_one
|
||
dec a0
|
||
X16 a0
|
||
addi p1winstreakd,a0
|
||
move *a0,a14
|
||
jrnn #ib_ok
|
||
clr a14
|
||
#ib_ok inc a14
|
||
move a14,*a0
|
||
jruc #do_nothing
|
||
|
||
#dec_both
|
||
move @p1winstreakd,a14
|
||
jrn #db_ok
|
||
clr a14
|
||
#db_ok dec a14
|
||
move a14,@p1winstreakd
|
||
move a14,@p2winstreakd
|
||
; jruc #do_nothing
|
||
|
||
#do_nothing
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* This is the master fight process. It's created once, and it doesn't end
|
||
* until the entire match is over. Between rounds, it's just suspended--
|
||
* it doesn't actually die and get re-created.
|
||
*
|
||
|
||
SUBR start_match
|
||
|
||
;skip some of this if we're in attract mode
|
||
move @PSTATUS,a14
|
||
jrz #amode_battle
|
||
|
||
move @total_matches,a14,W
|
||
inc a14
|
||
move a14,@total_matches,W
|
||
CALLA SPECIAL_WIPEOUT
|
||
clr a14 ; Clear out stuff for finishing moves
|
||
move a14,@p1pins
|
||
move a14,@p2pins
|
||
move a14,@finish_completed
|
||
|
||
movi p1mtch_award,a14 ; Reset the per match awards
|
||
calla rst_awards
|
||
movi p1rnd_award,a14 ; Reset the per round awards
|
||
calla rst_awards
|
||
|
||
#amode_battle
|
||
|
||
calla pal_clean
|
||
|
||
**** ;routine display initialization
|
||
movk 1,a0
|
||
move a0,@dpageflip
|
||
move a0,@HALT
|
||
|
||
**** ;position the scroller
|
||
callr init_scroller
|
||
|
||
**** ;If this is the final match, initialize FINAL_PTR. We can't do
|
||
; it in NEXT_IN_LADDER because if we're speeding through the
|
||
; rounds, that can happen while wrestler processes from the
|
||
; previous round are still active and DEAD, so they gobble up
|
||
; the first three slots and we end up with a 1v5 match.
|
||
calla is_final_match
|
||
jrnc #do_zf
|
||
movi FINAL_BATTLE_LINEUP+24,a14
|
||
move a14,@FINAL_PTR,L
|
||
|
||
**** ;World Y-position at which power bars toggle in z
|
||
#do_zf movi ZFLIP_POS,a0
|
||
move a0,@ZFLIP_POS_VAR,L
|
||
|
||
**** ;set up the ring.
|
||
movi ring_mod,a0
|
||
move a0,@BAKMODS,L
|
||
calla BGND_UD1
|
||
|
||
**** ;init message_flag - clears 'already done' bits for move names
|
||
clr a0
|
||
move a0,@message_flag,L
|
||
move a0,@MESSAGE_FLAGS,L ;clear which side has a message out
|
||
MOVE A0,@FLASH_FLAG ;clear out the 'doing flashes' flag
|
||
MOVE A0,@COMBO_FLASH_FLAG,L ;clear out combo flashing message
|
||
|
||
**** ;kill off any perpetual yells that might be going on.
|
||
CALLA FIND_AND_KILL_ENDLESS
|
||
|
||
**** ;create misc stuff like crowd, clocks, a wipe, and some debug stuff.
|
||
CREATE CROWD_PID,crowd_anim
|
||
CREATE TIMER_PID,match_timer
|
||
CREATE ZSHIFT_PID,SHIFT_BARS_IN_Z
|
||
CREATE FLASH_PID,maybe_do_flashes
|
||
clr a14
|
||
move a14,@wrestler_count_proc,L
|
||
move @royal_rumble,a14
|
||
jrnz #create_wcounter
|
||
calla is_8_on_1
|
||
jrnc #no_wcounter
|
||
#create_wcounter
|
||
CREATE WCOUNT_PID,wrestler_counter
|
||
move a0,@wrestler_count_proc,L
|
||
#no_wcounter
|
||
|
||
.if DIR_DEBUG
|
||
CREATE DIR_DEBUG_PID,dir_debug
|
||
.endif
|
||
|
||
.if SCRT_DEBUG
|
||
CREATE SCRT_DEBUG_PID,scrt_debug
|
||
.endif
|
||
|
||
**** ;create ropes
|
||
|
||
movi ROPE_FRONT,a11
|
||
CREATE ROPE_PID,rope
|
||
move a0,@front_rproc,L
|
||
|
||
movi ROPE_BACK,a11
|
||
CREATE ROPE_PID,rope
|
||
move a0,@back_rproc,L
|
||
|
||
movi ROPE_LEFT,a11
|
||
CREATE ROPE_PID,rope
|
||
move a0,@left_rproc,L
|
||
|
||
movi ROPE_RIGHT,a11
|
||
CREATE ROPE_PID,rope
|
||
move a0,@right_rproc,L
|
||
|
||
**** ;initialize various other crap
|
||
clr a0
|
||
move a0,@match_winner
|
||
MOVE A0,@DAM_MULT
|
||
MOVE A0,@combo_audit_done
|
||
move a0,@no_debris
|
||
move a0,@any_hits
|
||
MOVE A0,@PERFECT_WINS
|
||
MOVE A0,@MUSIC_HAP
|
||
MOVE A0,@WINS_OBJ,L
|
||
MOVE A0,@WINS_OBJ+20H,L
|
||
MOVE A0,@WINS_OBJ+40H,L
|
||
|
||
.if DEBUG
|
||
move a0,@instant_death
|
||
.endif
|
||
|
||
**** ;increment the battles started audit
|
||
movi AUD_VSHUMS,a0
|
||
move @PSTATUS,a14
|
||
JRZ NO_BATLES_AT_ALL
|
||
cmpi 03h,a14
|
||
jreq #aud_vshumf
|
||
movi AUD_VSCPUS,a0
|
||
#aud_vshumf
|
||
calla AUD1
|
||
NO_BATLES_AT_ALL
|
||
|
||
;clear out the process_ptrs data
|
||
callr CLEAR_PROCESSES
|
||
|
||
**** ;initialize the life and combo bars.
|
||
calla init_life_data
|
||
|
||
**** ;create wrestler processes
|
||
|
||
;figure out if it's a 0-, 1-, or 2-player game, and branch.
|
||
MOVE @PSTATUS,A0
|
||
jrz #0plyr
|
||
CMPI 3,A0
|
||
JREQ #2plyr
|
||
|
||
#1plyr ;1-player game
|
||
|
||
;create player process
|
||
movi PSIDE_PLYR1,a9 ;side on
|
||
clr a10 ;plyrnum
|
||
move @index1,a11 ;wrestlernum
|
||
|
||
btst 0,A0
|
||
jrnz #set
|
||
|
||
movi PSIDE_PLYR2,a9 ;side on
|
||
movk 1,a10 ;plyrnum
|
||
move @index2,a11 ;wrestlernum
|
||
|
||
#set movi PTYPE_PLAYER,a8 ;player type
|
||
SCREATE WMAIN_PID,wrestler_main
|
||
callr set_process_ptr2
|
||
CREATE GETUP_PID,getup_meter
|
||
|
||
|
||
#ndrone ;create the drone processes
|
||
;get the lineup for the coming battle
|
||
MOVE @CURRENT_LADDER,A4,L
|
||
MOVE *A4,A4,L ;battle lineup
|
||
|
||
;drone PLYRNUM's start at 2
|
||
MOVK 2,A10
|
||
move @NUM_OPPS,a3
|
||
|
||
#nxtdrn CALLA SORT_OUT_WRESTLER_NUM
|
||
|
||
*jakeeee if you want a specific wrestler, put his number in A11 here !
|
||
|
||
movi PTYPE_DRONE,a8 ;player type
|
||
|
||
;set PLYR_SIDE for ENEMY drones--All these drones are bad guys.
|
||
;In a 2v2 match, we can't use this code.
|
||
movi PSIDE_PLYR2,a9
|
||
move @PSTATUS,a14
|
||
btst 0,a14 ;plyr 1 human?
|
||
jrnz #pside_set
|
||
movi PSIDE_PLYR1,a9
|
||
#pside_set
|
||
|
||
.if DEBUG
|
||
move @skip_select,a0
|
||
jrge #skp
|
||
movk 6,a11 ;make him a doink
|
||
#skp
|
||
.endif
|
||
|
||
SCREATE WMAIN_PID,wrestler_main
|
||
callr set_process_ptr2
|
||
CREATE GETUP_PID,getup_meter
|
||
SRL 8,A4 ;shift battle lineup
|
||
INC A10 ;inc PLYRNUM
|
||
dsj a3,#nxtdrn
|
||
|
||
JRUC #wrestlers_created
|
||
|
||
*****
|
||
|
||
#0plyr ;0-player (attract mode) game
|
||
movi PTYPE_DRONE,a8 ;player type
|
||
movi PSIDE_PLYR1,a9 ;side on
|
||
movk 2,a10 ;wres num
|
||
move @index1,a11 ;wrestler
|
||
SCREATE WMAIN_PID,wrestler_main ;player 1
|
||
callr set_process_ptr2
|
||
CREATE GETUP_PID,getup_meter
|
||
|
||
move @CURRENT_LADDER,a4,L
|
||
move *a4,a4,L
|
||
move @NUM_OPPS,a3
|
||
movi PTYPE_DRONE,a8
|
||
movi PSIDE_PLYR2,a9
|
||
#nxt calla SORT_OUT_WRESTLER_NUM
|
||
srl 8,a4 ;shift battle lineup
|
||
inc a10 ;inc PLYRNUM
|
||
SCREATE WMAIN_PID,wrestler_main
|
||
callr set_process_ptr2
|
||
CREATE GETUP_PID,getup_meter
|
||
#ngup dsj a3,#nxt
|
||
|
||
jruc #wrestlers_created
|
||
|
||
*****
|
||
|
||
#2plyr ;2-player game
|
||
|
||
movi PTYPE_PLAYER,a8 ;player type
|
||
move @PSTATUS,a0
|
||
btst 0,a0
|
||
jrnz #ok
|
||
movi PTYPE_DRONE,a8 ;player type
|
||
#ok movi PSIDE_PLYR1,a9 ;side on
|
||
clr a10 ;wres num
|
||
move @index1,a11 ;wrestler
|
||
SCREATE WMAIN_PID,wrestler_main ;player 1
|
||
callr set_process_ptr2
|
||
CREATE GETUP_PID,getup_meter
|
||
|
||
movi PTYPE_PLAYER,a8 ;player type
|
||
move @PSTATUS,a0
|
||
btst 1,a0
|
||
jrnz #ok1
|
||
movi PTYPE_DRONE,a8 ;player type
|
||
#ok1 movi PSIDE_PLYR2,a9 ;side on
|
||
|
||
;if we're in royal rumble mode, second guy is on first team
|
||
move @royal_rumble,a14
|
||
sub a14,a9
|
||
|
||
movk 1,a10 ;wres num
|
||
move @index2,a11 ;wrestler
|
||
SCREATE WMAIN_PID,wrestler_main ;player 2
|
||
callr set_process_ptr2
|
||
CREATE GETUP_PID,getup_meter
|
||
|
||
;set the 'too late now to choose buddy mode' flag
|
||
movk 1,a14
|
||
move a14,@buddy_mode_checked
|
||
|
||
;If they selected buddy mode, add a pair of drones.
|
||
;WE HAVE TO COMPUTE buddy_mode_on OURSELVES, because
|
||
; the code that normally does that kind of thing hasn't
|
||
; gone off yet.
|
||
.ref p1powerup_request
|
||
.ref p2powerup_request
|
||
move @p1powerup_request,a8,L
|
||
move @p2powerup_request,a9,L
|
||
and a9,a8
|
||
andi BUDDY_MODE,a8
|
||
move a8,@buddy_mode_on
|
||
jrz #no_buddies
|
||
|
||
calla choose_buddies
|
||
PUSH a0,a1 ;store the two wrestlernums
|
||
|
||
movk PTYPE_DRONE,a8
|
||
movi PSIDE_PLYR1,a9
|
||
movk 2,a10
|
||
PULL a11 ;get the first buddy
|
||
SCREATE WMAIN_PID,wrestler_main
|
||
callr set_process_ptr2
|
||
|
||
movk PTYPE_DRONE,a8
|
||
movk PSIDE_PLYR2,a9
|
||
movk 3,a10
|
||
PULL a11 ;get the second buddy
|
||
SCREATE WMAIN_PID,wrestler_main
|
||
callr set_process_ptr2
|
||
|
||
jruc #wrestlers_created
|
||
|
||
#no_buddies
|
||
|
||
;if we're in royal rumble mode, create the starting bad guys.
|
||
move @royal_rumble,a14
|
||
jrz #wrestlers_created
|
||
|
||
;you never hit the progress screen in royal_rumble mode, so we've
|
||
; got to set up some stuff by hand.
|
||
|
||
.ref get_royal_lineup
|
||
|
||
calla get_royal_lineup
|
||
movi FINAL_BATTLE_LINEUP,a0
|
||
move *a0,a1,L
|
||
andi 0000FFFFh,a1
|
||
ori 02000000h,a1
|
||
|
||
move @CURRENT_LADDER,a14,L
|
||
move a1,*a14,L
|
||
movk 2,a14
|
||
move a14,@NUM_OPPS
|
||
|
||
;set FINAL_PTR to the next guy to fight.
|
||
addi 2*8,a0
|
||
move a0,@FINAL_PTR,L
|
||
|
||
jruc #ndrone
|
||
|
||
#wrestlers_created
|
||
|
||
**** ;create the rewire monitor - this has to be done AFTER all the
|
||
; set_process_ptr2's have been called
|
||
CREATE REWIRE_PID,rewire_monitor
|
||
|
||
;play the battle music
|
||
|
||
.if DEBUG
|
||
movi 40,a3
|
||
move @skip_select,a14
|
||
jrnz #marked_snd
|
||
.endif
|
||
|
||
movk 16,a3
|
||
move @royal_rumble,a14
|
||
jrnz music_selected
|
||
calla is_8_on_1
|
||
jrc music_selected
|
||
movk 25,a3
|
||
move @hcount,a14
|
||
srl 1,a14
|
||
jrnc music_selected
|
||
movk 15,a3
|
||
music_selected
|
||
move a3,@temp_music
|
||
|
||
calla SNDSND
|
||
|
||
#marked_snd
|
||
|
||
;SET CROWD VOLUME TO 100% OF MASTER VOLUME
|
||
MOVI 55ABH+5,A3
|
||
CALLA SNDSND
|
||
MOVI 0FF00H,A3
|
||
CALLA SNDSND
|
||
;and the crowd
|
||
movi 2065,a3
|
||
calla SNDSND
|
||
|
||
CALLA CLEAR_SPEECH_REPEAT
|
||
|
||
callr init_joystat
|
||
callr init_joy_dtime
|
||
|
||
callr init_reduce_bog
|
||
|
||
calla init_special_objlist
|
||
|
||
clr a0
|
||
move a0,@match_over
|
||
|
||
CALLA RESETUP_PROGRESS
|
||
calla INIT_SKIRTS
|
||
|
||
SLEEPK 1
|
||
|
||
calla BGND_UD1
|
||
SLEEPK 1
|
||
|
||
; CREATE SKIRT_PID,CHANGE_SKIRTS
|
||
|
||
;if this is the first match after attract mode, cue vince.
|
||
move @total_matches,a14
|
||
dec a14
|
||
jrnz #no_vince_intro
|
||
CREATE SKIRT_PID,CHANGE_SKIRTS
|
||
move @PSTATUS,A0
|
||
CMPI 3,A0
|
||
JRNE #no_vince_intro
|
||
|
||
movi 0E0h,a0
|
||
calla ADD_VOICE
|
||
MOVI 01FAH,A0
|
||
calla ADD_VOICE
|
||
JRUC INTRO_DONE
|
||
|
||
#no_vince_intro
|
||
MOVK 5,A0
|
||
CALLA RNDRNG0
|
||
JRNZ INTRO_DONE
|
||
MOVI THIS_IS_FOR_THE_MARBLES,A0
|
||
CALLA ADD_VOICE
|
||
INTRO_DONE
|
||
|
||
calla BGND_UD1
|
||
SLEEPK 2
|
||
calla BGND_UD1
|
||
|
||
clr a8 ;left meter for player 0
|
||
movk 1,a9 ;right meter for player 1
|
||
move @PSTATUS,a0
|
||
jrz drone_pointers
|
||
|
||
move @royal_rumble,a14
|
||
jrnz #rumble_pointers
|
||
|
||
cmpi 3,a0
|
||
jreq meter_pointers_set
|
||
|
||
movk 2,a9
|
||
srl 1,a0
|
||
jrz meter_pointers_set
|
||
movk 1,a9
|
||
movk 2,a8
|
||
jruc meter_pointers_set
|
||
|
||
#rumble_pointers
|
||
movk 2,a9
|
||
jruc meter_pointers_set
|
||
|
||
drone_pointers
|
||
movk 2,a8
|
||
movk 3,a9
|
||
meter_pointers_set
|
||
CREATE METER_PID,meters ;life/turbo/names
|
||
|
||
movk 1,a0
|
||
move a0,@DISPLAYON
|
||
|
||
clr a0
|
||
move a0,@IRQSKYE
|
||
|
||
.if DEBUG
|
||
;FIX THAT DAM ANNOYING START UP DMA GLITCH !!!!!!!
|
||
move @skip_select,a0
|
||
JRNZ DONT_OPEN_ANYTHING
|
||
.endif
|
||
|
||
CREATE SET_IMAGES_PID,DO_SET_IMAGES
|
||
|
||
PUSHP A0
|
||
movk 18,a8 ;20
|
||
movk 4,a9 ;6
|
||
JSRP OPEN_PROGRESS_SCREEN
|
||
; movi PU_CHECK_PID,a0
|
||
; calla IKIL1C
|
||
PULLP A0
|
||
|
||
CALLA KILL
|
||
DONT_OPEN_ANYTHING
|
||
MOVI DUMRETS,A0
|
||
MOVE A0,@WHICH_SCREEN,L
|
||
|
||
clr a1
|
||
callr get_process_ptr
|
||
; clr a14
|
||
;Don't allow meters for the first x seconds of round
|
||
movi 10*60,a14
|
||
move a14,*a0(DELAY_METER)
|
||
|
||
movk 1,a1
|
||
callr get_process_ptr
|
||
;Don't allow meters for the first x seconds of round
|
||
movi 14*60,a14
|
||
move a14,*a0(DELAY_METER)
|
||
|
||
;initialize the bgnd_cntr
|
||
movk 1,a14
|
||
move a14,@bgnd_cntr
|
||
|
||
;initialize annc_rnd_winner_done
|
||
clr a14
|
||
move a14,@annc_rnd_winner_done
|
||
|
||
; CREATE0 show_options
|
||
|
||
#loop calla check_collisions
|
||
callr final_confine
|
||
calla set_images
|
||
|
||
;BGND_UD1 every eight ticks.
|
||
move @bgnd_cntr,a2
|
||
dsjs a2,#no_bg
|
||
|
||
;time to do it - but if there's a AUDIT_UD_PID process going, wait
|
||
; until it dies. This could lead to a delay of up to three ticks.
|
||
inc a2 ;...so that if we skip, we try next tick.
|
||
|
||
;check this flag instead of using the extremely slow EXISTP
|
||
move @audit_ud_flag,a14
|
||
jrnz #no_bg
|
||
|
||
calla BGND_UD1
|
||
movk 8,a2
|
||
#no_bg move a2,@bgnd_cntr
|
||
|
||
SLEEPK 1
|
||
|
||
calla read_switches
|
||
|
||
move @match_over,a0
|
||
jrz #not_over
|
||
|
||
calla postgame_audits
|
||
|
||
RETP
|
||
|
||
#not_over
|
||
|
||
calla scroll_world
|
||
|
||
move @round_tickcount,a0
|
||
inc a0
|
||
move a0,@round_tickcount
|
||
|
||
move @match_time,a0,L ;10's & 1's
|
||
jrnz #loop
|
||
|
||
.if DEBUG
|
||
;if we're in fight_debug mode, roll the clock around
|
||
move @fight_debug,a14
|
||
jrnz #wraparound
|
||
.endif
|
||
|
||
;if we're in attract mode, roll the clock around
|
||
move @PSTATUS,a14
|
||
jrnz #norm
|
||
|
||
#wraparound
|
||
movi 00090009h,a14
|
||
move a14,@match_time,L
|
||
jruc #not_over
|
||
|
||
#norm
|
||
movk 1,a0
|
||
move a0,@HALT
|
||
|
||
|
||
;Timer on the round expired
|
||
|
||
clr a1
|
||
callr get_process_ptr
|
||
|
||
move a1,*a0(OBJ_XVEL),L
|
||
move a1,*a0(OBJ_YVEL),L
|
||
move a1,*a0(OBJ_ZVEL),L
|
||
movi -1,a1
|
||
move a1,@MATCH_TIMERS,L
|
||
|
||
movk 1,a1
|
||
callr get_process_ptr
|
||
|
||
clr a1
|
||
move a1,*a0(OBJ_XVEL),L
|
||
move a1,*a0(OBJ_YVEL),L
|
||
move a1,*a0(OBJ_ZVEL),L
|
||
movi -1,a1
|
||
move a1,@MATCH_TIMERS+32,L
|
||
|
||
calla DO_CROWD_CHEER
|
||
|
||
CREATE CYCPID,CREATE_TIMEOUT
|
||
|
||
movi 55,a9
|
||
#wait SLEEPK 1
|
||
PUSH a9,a11
|
||
calla set_images ;Make shadows shift...
|
||
PULL a9,a11
|
||
dsjs a9,#wait
|
||
|
||
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
|
||
|
||
movk 28,a9
|
||
#wait1 SLEEPK 1
|
||
PUSH a9,a11
|
||
calla set_images ;Make shadows shift...
|
||
PULL a9,a11
|
||
dsjs a9,#wait1
|
||
|
||
; move a11,a0
|
||
; calla KILL
|
||
|
||
movi CLSNEUT|TYPTEXT|SUBMES1,a0
|
||
calla obj_del1c ;delete text/plates
|
||
|
||
#wait2 SLEEPK 1
|
||
calla set_images ;Make shadows shift...
|
||
; move @HALT,a0
|
||
movi ANNC_PID,a0
|
||
clr a1
|
||
not a1
|
||
calla EXISTP
|
||
jrnz #wait2
|
||
|
||
move @p1rounds,a0
|
||
cmpi 2,a0
|
||
jrz #end
|
||
move @p2rounds,a0
|
||
cmpi 2,a0
|
||
jrnz #not_end
|
||
|
||
#end
|
||
;Match is over.
|
||
move a0,@match_over
|
||
|
||
;Move match winning players match awards to winning players winstread awards,
|
||
;annunciate match awards for winning player, then clear get out
|
||
|
||
#not_end
|
||
jruc #loop
|
||
|
||
**********
|
||
;Is this duplicated effort? Jason, look into this...
|
||
SUBR DO_SET_IMAGES
|
||
CALLA set_images
|
||
SLOOP 1,DO_SET_IMAGES
|
||
|
||
**********
|
||
|
||
SUBR CLEAR_PROCESSES
|
||
|
||
clr a0
|
||
movi wres0_objs,a1
|
||
movi NUM_WRES*MAX_PIECES,a2
|
||
#clr_lp
|
||
move a0,*a1+,L
|
||
dsj a2,#clr_lp
|
||
|
||
movi process_ptrs,a1
|
||
movi NUM_WRES,a2
|
||
#clr_ptr
|
||
move a0,*a1+,L
|
||
dsj a2,#clr_ptr
|
||
rets
|
||
|
||
ring_mod
|
||
.long ringBMOD ;wrestling ring
|
||
.word 105,-450 ;x,y
|
||
.long 0
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
* can probably get rid of this crap once scroller is finished
|
||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
|
||
SUBRP update_positions
|
||
|
||
move *a13(PLYRNUM),a0
|
||
X32 a0
|
||
|
||
move a0,a1
|
||
addi wrestler_x,a1
|
||
move *a13(OBJ_XPOS),a14,L
|
||
move a14,*a1,L
|
||
|
||
move a0,a1
|
||
addi wrestler_y,a1
|
||
;;;; move *a13(OBJ_YPOS),a14,L
|
||
move *a13(GROUND_Y),a14
|
||
sll 16,a14
|
||
|
||
jrnn #ok
|
||
|
||
clr a14
|
||
#ok move a14,*a1,L
|
||
|
||
move a0,a1
|
||
addi wrestler_z,a1
|
||
move *a13(OBJ_ZPOS),a14,L
|
||
move a14,*a1,L
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* a8 = player type (PLAYER, DRONE, REFEREE)
|
||
* a9 = player side (PLYR1, PLYR2, NONE)
|
||
* a10 = player number
|
||
* a11 = wrestler number
|
||
|
||
|
||
SUBRP wrestler_main
|
||
|
||
move a8,*a13(PLYR_TYPE)
|
||
move a9,*a13(PLYR_SIDE)
|
||
move a10,*a13(PLYRNUM)
|
||
move a11,*a13(WRESTLERNUM)
|
||
|
||
MOVE A10,A0
|
||
CMPI 2,A0
|
||
JRGE NO_POINT_ITS_A_DRONE
|
||
CLR A1
|
||
SLL 5,A0
|
||
ADDI MATCH_TIMERS,A0
|
||
MOVE A1,*A0,L
|
||
NO_POINT_ITS_A_DRONE
|
||
|
||
movi 112,a0
|
||
move a0,*a13(OBJ_PRIORITY)
|
||
|
||
callr reset_start
|
||
|
||
calla choose_pal ;sets b0
|
||
clr a1 ;y pos
|
||
movi D2ST2B03,a2 ;* image
|
||
movi 110,a3 ;z pos
|
||
movi DMAWNZ|M_3D,a4 ;DMA flags
|
||
move a4,*a13(OBJ_CONTROL)
|
||
movi CLSPLYR | TYPPLYR,a5 ;object ID
|
||
clr a6 ;x vel
|
||
clr a7 ;y vel
|
||
|
||
movk MAX_PIECES,a9
|
||
#nxt_obj
|
||
PUSH b0
|
||
calla BEGINOBJP
|
||
PULL b0
|
||
move a8,-*a10,L
|
||
dsj a9,#nxt_obj
|
||
|
||
calla BEGINOBJP
|
||
move a8,*a13(ATTIMG_IMG),L
|
||
clr a0
|
||
move a0,*a13(ATTIMG_CUR_FRAME),L
|
||
move a0,*a13(ATTIMG_LAST_FRAME),L
|
||
move a0,*a13(GETUP_TIME)
|
||
move a0,*a13(COMBO_COUNT)
|
||
move a0,*a13(COMBO_START)
|
||
move a0,*a13(OUTSIDE_ALONE)
|
||
move a0,*a13(SPECIAL_MOVE_ADDR),L
|
||
|
||
move a0,*a13(LAST_HIT_TIME),L
|
||
move a0,*a13(LAST_FLING_ATTEMPT),L
|
||
move a0,*a13(HIT_GATE_TIME),L
|
||
move a0,*a13(LAST_HEADHOLD),L
|
||
move a0,*a13(LAST_FLING),L
|
||
move a0,*a13(LAST_SPUNCH),L
|
||
move a0,*a13(LAST_SKICK),L
|
||
move a0,*a13(CONSECUTIVE_HITS)
|
||
move a0,*a13(LAST_DAMAGE),L
|
||
move a0,*a13(DAMAGE_GIVEN)
|
||
movi 8*60,a0
|
||
move a0,*a13(DELAY_METER)
|
||
|
||
move *a8(OPAL),a0
|
||
move a0,*a13(OBJ_PAL)
|
||
move a0,*a13(MY_PAL)
|
||
|
||
movi shadow_p,a0
|
||
calla pal_getf
|
||
move *a13(OBJ_BASE),a8,L
|
||
move *a8,a8,L ;1st object
|
||
move a0,*a8(OPAL) ;set palette for shadow
|
||
|
||
movi MAT_Y,a0
|
||
move a0,*a13(GROUND_Y)
|
||
|
||
clr a0
|
||
move a0,*a13(ATTACK_TIME)
|
||
move a0,*a13(INRING)
|
||
MOVE A0,*A13(COMBO_START)
|
||
MOVE A0,*A13(COMBO_COUNT)
|
||
|
||
move a0,*a13(OBJ_XVEL),L
|
||
move a0,*a13(OBJ_YVEL),L
|
||
move a0,*a13(OBJ_ZVEL),L
|
||
move a0,*a13(SHADTRAIL_PROC),L
|
||
move a0,*a13(I_WILL_DIE)
|
||
move a0,*a13(STATUS_FLAGS),L
|
||
|
||
move a0,*a13(BUT_VAL_CUR)
|
||
move a0,*a13(BUT_VAL_DOWN)
|
||
move a0,*a13(BUT_VAL_UP)
|
||
move a0,*a13(STICK_VAL_CUR)
|
||
move a0,*a13(STICK_VAL_DOWN)
|
||
move a0,*a13(STICK_VAL_UP)
|
||
move a0,*a13(STICK_REL_CUR)
|
||
move a0,*a13(STICK_REL_NEW)
|
||
|
||
|
||
; calla clear_damage_log
|
||
callr ani_init ;start default animation
|
||
|
||
move @PCNT,a14
|
||
move a14,*a13(FOOT_PCNT),W ;init foot timer
|
||
|
||
.if COL_DEBUG
|
||
move a13,a10
|
||
CREATE CDEBUG_PID,collis_debug
|
||
move a13,a10
|
||
CREATE CDEBUG_PID,collis_debug2
|
||
.endif
|
||
|
||
calla init_smoves
|
||
calla set_collision_boxes
|
||
|
||
.ref drone_calcskill
|
||
calla drone_calcskill
|
||
|
||
;#wait MOVE @VCOUNT,a0
|
||
; andi 7,a0
|
||
; jrnz #wait
|
||
; TINTON
|
||
; move @VCOUNT,a0
|
||
; PUSH a0
|
||
|
||
|
||
; move @VCOUNT,a0
|
||
; PULL a1
|
||
; sub a1,a0
|
||
; TINTOFF
|
||
|
||
SLEEPK 1
|
||
|
||
callr calc_closest
|
||
|
||
#loop
|
||
;-----> calla animate_wrestler
|
||
|
||
calla ARE_WE_IN_RING
|
||
|
||
calla set_collision_boxes
|
||
|
||
callr confine_wrestler
|
||
callr confine_wrestler_fix2
|
||
|
||
callr update_newfacing
|
||
|
||
callr update_positions ;used by scroller (temp!)
|
||
|
||
move *a13(PLYR_TYPE),a0
|
||
jrz #hmn ;Human?
|
||
move *a13(STATUS_FLAGS),a14
|
||
btst B_ZOMBIE,a14
|
||
jrnz #zmb ;Zombie?
|
||
calla drone_main
|
||
#zmb
|
||
#hmn
|
||
|
||
; TINTOFF
|
||
movk 1,a0
|
||
move *a13(STATUS_FLAGS),a14
|
||
btst B_KOD,a14
|
||
jrz #slp
|
||
movi >7fff,a0
|
||
#slp SLEEPR a0
|
||
; TINTON
|
||
|
||
MOVE *A13(RISK),A0
|
||
JRZ NO_DECREMENT
|
||
DEC A0
|
||
MOVE A0,*A13(RISK)
|
||
|
||
andi 7fffh,a0
|
||
jrnz NO_DECREMENT
|
||
;Turn off taunt high risk move bonus
|
||
move a0,*a13(RISK)
|
||
|
||
NO_DECREMENT
|
||
|
||
callr update_joystat
|
||
callr count_button_presses
|
||
|
||
calla keep_onscreen
|
||
|
||
calla wrestler_veladd ;<-------
|
||
callr wrestler_friction ;<-------
|
||
|
||
calla animate_wrestler ;<-------
|
||
calla set_collision_boxes ;<-------
|
||
|
||
callr confine_wrestler ;<--- temp fix!
|
||
callr confine_wrestler_fix1
|
||
|
||
callr calc_closest2
|
||
|
||
callr move_wrestler
|
||
|
||
;----> calla wrestler_veladd
|
||
;----> callr wrestler_friction
|
||
|
||
callr update_links
|
||
|
||
calla set_collision_boxes
|
||
calla overlap_collision
|
||
|
||
|
||
move *a13(ANIMODE),a0
|
||
btst MODE_KEEPATTACHED_BIT,a0
|
||
jrz #no_attach
|
||
callr master_keep_attached
|
||
#no_attach
|
||
|
||
|
||
move *a13(ANIMODE),a0
|
||
btst MODE_NOAUTOFLIP_BIT,a0
|
||
jrnz #no_flip
|
||
move a13,a0
|
||
callr set_wrestler_xflip
|
||
#no_flip
|
||
|
||
callr update_joy_dtime
|
||
|
||
; move *a13(BURNOUT_COUNT),a0
|
||
; jrz #skp
|
||
; dec a0
|
||
; move a0,*a13(BURNOUT_COUNT)
|
||
;#skp
|
||
;This is for delaying the reading of buttons just after regaining
|
||
;control from being flung. This will stop inadvertant moves from happening
|
||
;while the player is still whacking on his buttons
|
||
|
||
move *a13(DELAY_BUTNS),a0
|
||
jrz #skp2
|
||
dec a0
|
||
move a0,*a13(DELAY_BUTNS)
|
||
#skp2
|
||
;This is for delaying collisions when a player gets up
|
||
|
||
move *a13(SAFE_TIME),a0
|
||
jrz #skp3
|
||
dec a0
|
||
move a0,*a13(SAFE_TIME)
|
||
#skp3
|
||
;This is for delaying the reappearance of a getup meter
|
||
|
||
move *a13(DELAY_METER),a0
|
||
jrz #skp4
|
||
dec a0
|
||
move a0,*a13(DELAY_METER)
|
||
#skp4
|
||
;This is for disallowing movement by wrestler
|
||
|
||
move *a13(IMMOBILIZE_TIME),a0
|
||
jrz #skp5
|
||
dec a0
|
||
move a0,*a13(IMMOBILIZE_TIME)
|
||
#skp5
|
||
;This is for walking fast powerup
|
||
|
||
move *a13(WALK_FAST),a0
|
||
jrz #skp6
|
||
jrn #skp6
|
||
dec a0
|
||
move a0,*a13(WALK_FAST)
|
||
#skp6
|
||
move *a13(GETUP_TIME),a0
|
||
jrz #loop
|
||
|
||
move @match_time,a14,L
|
||
jrnz #notend
|
||
;Match timer ran out...
|
||
clr a0
|
||
move a0,*a13(GETUP_TIME)
|
||
jruc #loop
|
||
#notend
|
||
move *a13(DELAY_METER),a14
|
||
jrz #reg
|
||
;Don't want to allow getup time to be set this close to last time!
|
||
;allow the meter to come right back if stay_down is set
|
||
.if DEBUG
|
||
move @stay_down,a14
|
||
jrnz #reg
|
||
.endif
|
||
clr a0
|
||
move a0,*a13(GETUP_TIME)
|
||
jrz #loop
|
||
#reg
|
||
|
||
.if DEBUG
|
||
;If stay_down flag is set, don't decrement
|
||
move @stay_down,a14
|
||
jrz #dec
|
||
inc a0
|
||
#dec
|
||
.endif
|
||
dec a0
|
||
|
||
move a0,*a13(GETUP_TIME)
|
||
jrz #clr_dizzy
|
||
|
||
#skip
|
||
|
||
;NOTE:
|
||
;Drones will have to fill up their meter
|
||
;at a faster pace!
|
||
|
||
;Allow players to whack buttons to speed
|
||
;up their recovery from getup_time.
|
||
;Remember, the wrestler's meter doesn't have to be visible for him
|
||
;to still have a getup time set!
|
||
;As long as getup_time has a value, he is stuck.
|
||
|
||
;get data on this and last ticks
|
||
move a13,a0
|
||
calla wres_get_but_val_down
|
||
move a0,a2
|
||
move a13,a0
|
||
calla wres_get_stick_val_down
|
||
or a2,a0
|
||
move *a13(STATUS_FLAGS),a1
|
||
|
||
move a1,a14
|
||
andni M_PRESS_LAST,a14
|
||
TEST a0
|
||
jrz #set_flag
|
||
ori M_PRESS_LAST,a14
|
||
#set_flag
|
||
move a14,*a13(STATUS_FLAGS)
|
||
|
||
TEST a0
|
||
jrnz #deduct_three
|
||
BTST B_PRESS_LAST,a1
|
||
jrz #loop
|
||
|
||
#deduct_three
|
||
move *a13(GETUP_TIME),a14
|
||
subk 3,a14
|
||
jrnn #ok
|
||
clr a14
|
||
#ok
|
||
move a14,*a13(GETUP_TIME)
|
||
jrp #loop
|
||
|
||
|
||
#clr_dizzy
|
||
clr a0
|
||
move a0,*a13(PLYR_DIZZY)
|
||
move a0,*a13(STARS_FLAG) ;Gets rid of them...
|
||
|
||
;Delay button reads
|
||
movi 40,a0
|
||
move a0,*a13(DELAY_BUTNS)
|
||
|
||
jruc #loop
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR reset_for_round
|
||
|
||
;Reset world and both wrestlers for the start
|
||
;of a new round - Called from lifebar.
|
||
|
||
PUSH a13
|
||
|
||
clr a1
|
||
#lp0 PUSH a1
|
||
callr reset_wrestle
|
||
PULL a1
|
||
inc a1
|
||
cmpi NUM_WRES,a1
|
||
jrlt #lp0
|
||
|
||
PULL a13
|
||
|
||
move @current_round,a0
|
||
inc a0
|
||
move a0,@current_round
|
||
|
||
;reset life data
|
||
calla init_rnd_life_data
|
||
|
||
;reset special move processes
|
||
callr reset_smoves
|
||
|
||
;reset match_time
|
||
movk 9,a0
|
||
move a0,@match_time ;10's
|
||
movk 9,a0
|
||
move a0,@match_time+10h ;1's
|
||
clr a0
|
||
move a0,@match_time+20h ;fractional
|
||
|
||
;reset various other crap
|
||
clr a0
|
||
move a0,@any_hits
|
||
|
||
callr init_reduce_bog
|
||
|
||
nobody_home
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
reset_wrestle
|
||
callr get_process_ptr
|
||
move a0,a13
|
||
jrz nobody_home
|
||
|
||
calla drone_change_back
|
||
|
||
clr a0
|
||
move a0,*a13(PLYR_DIZZY_CNT)
|
||
;Don't allow meters for the first x seconds of round
|
||
movi 14*60,a0
|
||
move a0,*a13(DELAY_METER)
|
||
|
||
move *a13(PLYRNUM),a10
|
||
|
||
reset_start
|
||
|
||
;choose starting position - our index into the #teamX_starts table
|
||
; is the number of teammates with PLYRNUM's lower than ours. (0-2)
|
||
move *a13(PLYR_SIDE),a0
|
||
movi process_ptrs,a1
|
||
clr a2
|
||
|
||
#loop0 move *a1+,a14,L
|
||
jrz #loop0 ;skip inactive
|
||
cmp a13,a14
|
||
jreq #set0 ;hit self -> we're done
|
||
move *a14(PLYR_SIDE),a14
|
||
cmp a14,a0
|
||
jrne #loop0
|
||
inc a2 ;lower PSTATUS, same PLYR_SIDE, so inc index
|
||
jruc #loop0
|
||
|
||
#set0 ;a2 is index.
|
||
X64 a2
|
||
movi #team1_starts,a9
|
||
TEST a0 ;team == 0?
|
||
jrz #add
|
||
movi #team2_starts,a9
|
||
#add add a2,a9
|
||
|
||
move *a9+,a0
|
||
sll 16,a0 ;x val
|
||
move a0,*a13(OBJ_XPOS),L
|
||
move *a9+,a0
|
||
sll 16,a0 ;z val
|
||
move a0,*a13(OBJ_ZPOS),L
|
||
|
||
clr a0
|
||
move a0,*a13(OBJ_YPOS),L
|
||
|
||
movi MAT_Y,a0
|
||
move a0,*a13(GROUND_Y)
|
||
|
||
;From veladd
|
||
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
|
||
|
||
clr a0
|
||
move a0,*a13(OBJ_YVEL),L
|
||
#yok
|
||
add a2,a0 ;+ GROUND_Y
|
||
move a0,*a13(OBJ_YPOS),L
|
||
|
||
move a10,a0
|
||
X32 a0
|
||
addi obj_look,a0
|
||
move *a0,a0,L ;* start of objects
|
||
move a0,*a13(OBJ_BASE),L
|
||
move a0,a10
|
||
addi 32*MAX_PIECES,a10 ;start at end to reverse priorities
|
||
|
||
move *a9+,a0
|
||
move a0,*a13(NEW_FACING_DIR)
|
||
move a0,*a13(FACING_DIR)
|
||
|
||
clr a0 ;x pos
|
||
move a0,*a13(PLYRMODE)
|
||
move a0,*a13(PLYR_DIZZY)
|
||
move a0,*a13(ANIMODE)
|
||
move a0,*a13(ANIMODE2)
|
||
|
||
; movi MAT_Y,a0
|
||
; move a0,*a13(GROUND_Y)
|
||
|
||
clr a0
|
||
; move a0,*a13(BURNOUT_COUNT)
|
||
move a0,*a13(INRING)
|
||
|
||
move a0,*a13(OBJ_XVEL),L
|
||
move a0,*a13(OBJ_YVEL),L
|
||
move a0,*a13(OBJ_ZVEL),L
|
||
|
||
; calla clear_damage_log
|
||
callr ani_init ;start default animation
|
||
|
||
move @PCNT,a14
|
||
move a14,*a13(FOOT_PCNT),W ;init foot timer
|
||
|
||
rets
|
||
|
||
;X,Z,face_dir,unused for team 0
|
||
#team1_starts
|
||
.word RING_X_CENTER-85,1127+93,9,0 ;first player on team
|
||
.word RING_X_CENTER-150,1127+170,9,0 ;second
|
||
.word RING_X_CENTER-20,1127+16,10,0 ;third
|
||
|
||
;X,Z,face_dir,unused for team 1
|
||
#team2_starts
|
||
.word RING_X_CENTER+85,1103+93,6,0 ;first player on team
|
||
.word RING_X_CENTER+150,1103+170,5,0 ;second
|
||
.word RING_X_CENTER+20,1103+16,6,0 ;third
|
||
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR reset_for_round2
|
||
|
||
PUSH a13
|
||
|
||
clr a14
|
||
move a14,@annc_rnd_winner_done
|
||
|
||
;un-canned for NUM_WRES wrestlers
|
||
|
||
clr a1
|
||
#lp1 PUSH a1
|
||
callr reset_wrestle2
|
||
PULL a1
|
||
inc a1
|
||
cmpi NUM_WRES,a1
|
||
jrlt #lp1
|
||
|
||
PULL a13
|
||
rets
|
||
|
||
reset_wrestle2
|
||
callr get_process_ptr
|
||
move a0,a13
|
||
jrz nobody_home
|
||
|
||
calla drone_change_back
|
||
|
||
movk 30,a0
|
||
move a0,*a13(IMMOBILIZE_TIME)
|
||
|
||
;Re-initialize these variables between rounds
|
||
clr a0
|
||
move a0,*a13(PLYR_DIZZY_CNT)
|
||
move a0,*a13(GETUP_TIME)
|
||
move a0,*a13(AUTO_PIN_CNTDOWN)
|
||
move a0,*a13(SPECIAL_MOVE_ADDR),L
|
||
move a0,*a13(LAST_HIT_TIME),L
|
||
move a0,*a13(LAST_FLING_ATTEMPT),L
|
||
move a0,*a13(HIT_GATE_TIME),L
|
||
move a0,*a13(LAST_HEADHOLD),L
|
||
move a0,*a13(LAST_SPUNCH),L
|
||
move a0,*a13(LAST_SKICK),L
|
||
move a0,*a13(CONSECUTIVE_HITS)
|
||
move a0,*a13(LAST_FLING),L
|
||
move a0,*a13(LAST_HIPTOSS),L
|
||
move a0,*a13(LAST_DAMAGE),L
|
||
|
||
;clear STATUS_FLAGS, except for bits in SF_RESET_MASK,
|
||
; which should be preserved between rounds.
|
||
move *a13(STATUS_FLAGS),a14,L
|
||
andi SF_RESET_MASK,a14
|
||
move a14,*a13(STATUS_FLAGS),L
|
||
|
||
;set PTIME to 1, just in case they were KO'd last round.
|
||
movk 1,a14
|
||
move a14,*a13(PTIME)
|
||
|
||
move *a13(PLYRNUM),a10
|
||
|
||
reset_start2
|
||
callr calc_closest
|
||
calla set_collision_boxes
|
||
callr confine_wrestler
|
||
callr update_positions ;used by scroller (temp!)
|
||
callr update_joystat
|
||
callr count_button_presses
|
||
calla wrestler_veladd ;<-------
|
||
callr wrestler_friction ;<-------
|
||
calla set_collision_boxes ;<-------
|
||
callr confine_wrestler ;<--- temp fix!
|
||
callr calc_closest
|
||
callr move_wrestler
|
||
callr ani_init
|
||
callr update_links
|
||
calla set_collision_boxes
|
||
calla overlap_collision
|
||
|
||
move a13,a0
|
||
callr set_wrestler_xflip
|
||
callr update_joy_dtime
|
||
calla drone_calcskill
|
||
|
||
rets
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* wrestler object blocks
|
||
|
||
obj_look
|
||
.long wres0_objs ;0
|
||
.long wres1_objs ;1
|
||
.long wres2_objs ;2
|
||
.long wres3_objs ;3
|
||
.long wres4_objs ;4
|
||
.long wres5_objs ;5
|
||
.long wres6_objs ;6
|
||
.long wres7_objs ;7
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* initializes animations for each wrestler
|
||
*
|
||
* a13 = * wrestler process
|
||
|
||
SUBR ani_init
|
||
|
||
|
||
movi 100h,a0
|
||
move a0,*a13(ANI_SPEED) ;normal speed animations
|
||
|
||
clr a0
|
||
move a0,*a13(I_WILL_DIE)
|
||
.ref hyper_speed_on
|
||
|
||
move @hyper_speed_on,a14
|
||
move a14,*a13(WALK_FAST)
|
||
; move a0,*a13(WALK_FAST)
|
||
|
||
move a0,*a13(ATTIMG_CUR_FRAME),L
|
||
|
||
move *a13(WRESTLERNUM),a0
|
||
X32 a0
|
||
addi #init_addr,a0
|
||
move *a0,a0,L
|
||
call a0
|
||
|
||
rets
|
||
|
||
#init_addr
|
||
.long bret_ani_init ;0 Bret Hart
|
||
.long razor_ani_init ;1 Razor Ramon
|
||
.long taker_ani_init ;2 Undertaker
|
||
.long yoko_ani_init ;3 Yokozuna
|
||
.long shawn_ani_init ;4 Shawn Michaels
|
||
.long bam_ani_init ;5 Bam Bam
|
||
.long doink_ani_init ;6 Doink
|
||
.long doink_ani_init ;7 spare
|
||
.long lex_ani_init ;8 Lex Luger
|
||
.long 0 ;9 Referee
|
||
|
||
|
||
#*****************************************************************************
|
||
* a13 = ptr to process
|
||
* a1 = player/drone number 0-?
|
||
|
||
;old version - used by PROGRESS.ASM
|
||
|
||
SUBR set_process_ptr
|
||
|
||
PUSH a1
|
||
X32 a1
|
||
addi process_ptrs,a1
|
||
move a13,*a1,L
|
||
PULL a1
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
* a0 = ptr to process
|
||
* a9 = side (0 or 1)
|
||
* a10 = player/drone number 0-?
|
||
* a11 = WRESTLERNUM
|
||
|
||
;new version - used here in WRESTLE.ASM because the new pal selector routine
|
||
; requires that process_ptrs are all set up before any of the wrestler
|
||
; processes actually wake up. set_process_ptr2 is called by the code that
|
||
; creates wrestler_main procs, not by wrestler_main itself.
|
||
|
||
;it also sets PLYRNUM and WRESTLERNUM, 'cuz the pal thing needs those
|
||
; too. What a pain, eh? (And now PLYR_SIDE, too)
|
||
|
||
SUBRP set_process_ptr2
|
||
|
||
PUSH a10
|
||
X32 a10
|
||
addi process_ptrs,a10
|
||
move a0,*a10,L
|
||
PULL a10
|
||
|
||
move a9,*a0(PLYR_SIDE)
|
||
move a10,*a0(PLYRNUM)
|
||
move a11,*a0(WRESTLERNUM)
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
* a1 = player/drone number 0-?
|
||
* returns ptr in a0
|
||
|
||
SUBR get_process_ptr
|
||
|
||
PUSH a1
|
||
X32 a1
|
||
addi process_ptrs,a1
|
||
move *a1,a0,L
|
||
PULL a1
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* a13 = * to wrestler process
|
||
*
|
||
* breaks links if both wrestlers not attached to each other
|
||
*
|
||
|
||
SUBRP update_links
|
||
|
||
move *a13(ATTACH_PROC),a1,L ;proc attached to
|
||
jrz #exit ;not attached
|
||
move *a1(ATTACH_PROC),a0,L
|
||
cmp a0,a13 ;pointing to each other?
|
||
jreq #exit ;ok
|
||
|
||
clr a0
|
||
move a0,*a13(ATTACH_PROC),L
|
||
#exit rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
|
||
SUBRP update_newfacing
|
||
|
||
|
||
callr get_opp_process ;closest opponent process
|
||
move a0,a10
|
||
|
||
movi MOVE_RIGHT,a0
|
||
move *a13(OBJ_XPOS),a2,L
|
||
move *a10(OBJ_XPOS),a3,L
|
||
cmp a2,a3 ;a3-a2
|
||
jrgt #right
|
||
movi MOVE_LEFT,a0
|
||
|
||
#right movi MOVE_DOWN,a1
|
||
move *a13(OBJ_ZPOS),a2,L
|
||
move *a10(OBJ_ZPOS),a3,L
|
||
cmp a2,a3 ;a3-a2
|
||
jrgt #down
|
||
movi MOVE_UP,a1
|
||
|
||
#down or a1,a0
|
||
move a0,*a13(NEW_FACING_DIR)
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* sets x-flip based on facing direction
|
||
*
|
||
* a0 = * wrestler process
|
||
|
||
|
||
SUBR set_wrestler_xflip
|
||
|
||
move *a0(FACING_DIR),a14
|
||
btst PLAYER_RIGHT_BIT,a14
|
||
jrnz #right
|
||
|
||
move *a0(OBJ_CONTROL),a14
|
||
ori M_FLIPH,a14
|
||
move a14,*a0(OBJ_CONTROL)
|
||
|
||
rets
|
||
|
||
#right move *a0(OBJ_CONTROL),a14
|
||
andni M_FLIPH,a14
|
||
move a14,*a0(OBJ_CONTROL)
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* confines wrestler in/out of ring
|
||
* and sets CAN_MOVE_DIR bits
|
||
*
|
||
|
||
SUBRP confine_wrestler
|
||
|
||
clr a7 ;can move in all directions
|
||
|
||
move *a13(ANIMODE),a0
|
||
btst MODE_NOCONFINE_BIT,a0
|
||
jrnz #no_confine
|
||
|
||
move *a13(PLYRMODE),a0
|
||
cmpi MODE_ATTACHED,a0
|
||
jreq #no_confine
|
||
|
||
move *a13(INRING),a0
|
||
jrnz #outring
|
||
|
||
;We're inside the ring
|
||
;Check against the top ropes.
|
||
movi RING_TOP,a0
|
||
move *a13(OBJ_ZPOSINT),a5
|
||
cmp a0,a5 ;zpos - top
|
||
jrgt #zu_ok
|
||
jreq #no_u
|
||
|
||
;set Z to top of ring
|
||
move a0,*a13(Z_BOUND)
|
||
sll 16,a0
|
||
move a0,*a13(OBJ_ZPOS),L
|
||
|
||
;climb out if allowed
|
||
calla ck_climb_out_top
|
||
|
||
#no_u ;just inside - don't adjust, but don't go any further.
|
||
ori MOVE_UP,a7 ;can't move up
|
||
jruc #check_x
|
||
|
||
#zu_ok ;Check aginst bottom ropes
|
||
movi RING_BOT,a0 ;zpos - bot
|
||
cmp a0,a5
|
||
jrlt #zd_ok
|
||
jreq #no_d
|
||
|
||
;set Z to bottom of ring
|
||
move a0,*a13(Z_BOUND)
|
||
sll 16,a0
|
||
move a0,*a13(OBJ_ZPOS),L
|
||
|
||
;climb out if allowed
|
||
calla ck_climb_out_bot
|
||
|
||
#no_d ;just inside - don't adjust, but don't go any further.
|
||
ori MOVE_DOWN,a7 ;can't move down
|
||
jruc #check_x
|
||
|
||
#zd_ok ;no z problems. zero Z_BOUND
|
||
clr a14
|
||
move a14,*a13(Z_BOUND)
|
||
|
||
#check_x
|
||
;Check left edge of collision box against left rope
|
||
move *a13(OBJ_COLLX1),a5
|
||
|
||
;first see if we're even in the ballpark.
|
||
movi vln_left_rope,a6
|
||
move *a6,a0 ;x1
|
||
cmp a0,a5 ;xpos - x2
|
||
jrgt #xl_ok
|
||
|
||
;close enough for a more careful check...
|
||
callr calc_line_x
|
||
cmp a0,a5 ;xpos - a0
|
||
jrgt #xl_ok
|
||
jreq #no_l
|
||
|
||
|
||
;we're past the left rope. see if we're attached
|
||
move *a13(ATTACH_PROC),a14,L
|
||
jrz #not
|
||
|
||
;I'm attached, which means both me and my opponent are gonna get
|
||
; moved. Figure the right amount, apply it to both of us, then
|
||
; wobble the ropes and bounce both of us away.
|
||
|
||
;a0 is rope X, a5 is left edge of our collbox. Move us and our
|
||
; opponent right (a0 - a5) pixels.
|
||
sub a5,a0
|
||
move *a13(OBJ_XPOSINT),a14
|
||
add a0,a14
|
||
move a14,*a13(OBJ_XPOSINT)
|
||
|
||
move *a13(ATTACH_PROC),a5,L
|
||
move *a5(OBJ_XPOSINT),a14
|
||
add a0,a14
|
||
move a14,*a5(OBJ_XPOSINT)
|
||
|
||
;If either I or my opponent has a nonzero X velocity other than
|
||
; 40000h, give us both Xvel 40000h, Yvel 30000h.
|
||
|
||
;Skip the velocity crap if I'm on the ground.
|
||
move *a13(GROUND_Y),a0
|
||
move *a13(OBJ_YPOSINT),a1
|
||
cmp a0,a1
|
||
jreq #no_l
|
||
|
||
move *a13(OBJ_XVEL),a14,L
|
||
jrz #lr_check_opp
|
||
cmpi [4,0],a14
|
||
jrne #lr_check_opp
|
||
jruc #lr_set_vels
|
||
|
||
#lr_check_opp
|
||
move *a5(OBJ_XVEL),a14,L
|
||
jrz #no_l
|
||
cmpi [4,0],a14
|
||
jrne #lr_set_vels
|
||
jruc #no_l
|
||
|
||
#lr_set_vels
|
||
;X vel
|
||
movi [4,0],a14
|
||
move a14,*a13(OBJ_XVEL),L
|
||
move a14,*a5(OBJ_XVEL),L
|
||
|
||
;Y vel
|
||
;Wait! Don't muck with the Y vels if they're already above 30000h.
|
||
move *a13(OBJ_YVEL),a14,L
|
||
cmpi 30000h,a14
|
||
jrgt #nyv1
|
||
move *a5(OBJ_YVEL),a14,L
|
||
cmpi 30000h,a14
|
||
jrgt #nyv1
|
||
movi [3,0],a14
|
||
move a14,*a13(OBJ_YVEL),L
|
||
move a14,*a5(OBJ_YVEL),L
|
||
|
||
#nyv1 ;...and wobble the ropes
|
||
PUSH a0,a5
|
||
movi ROPE_LEFT,a0
|
||
movk 1,a2
|
||
movi ROPE_BOUNCEIO,a1
|
||
calla rope_command
|
||
|
||
movi 3ch,a0
|
||
calla triple_sound
|
||
|
||
PULL a0,a5
|
||
|
||
jruc #no_l
|
||
|
||
#not
|
||
;we're not attached
|
||
;line me up flush against the left rope
|
||
move *a13(OBJ_XPOSINT),a14
|
||
sub a5,a14
|
||
add a14,a0
|
||
move a0,*a13(X_BOUND)
|
||
sll 16,a0
|
||
move a0,*a13(OBJ_XPOS),L
|
||
|
||
move *a13(INRING),a0
|
||
jrnz #no_l ;Am outside.
|
||
;climb out the side if allowed
|
||
calla ck_climb_out_side
|
||
|
||
;Has hit left rope
|
||
;Wobble ropes and bounce off of them upon first hit.
|
||
move *a13(MOVE_DIR),a0
|
||
jrnz #no_l
|
||
|
||
move *a13(OBJ_XVEL),a0,L
|
||
jrz #no_l
|
||
|
||
;Skip the velocity crap if I'm on the ground.
|
||
move *a13(GROUND_Y),a0
|
||
move *a13(OBJ_YPOSINT),a1
|
||
cmp a0,a1
|
||
jreq #no_l
|
||
|
||
;We also should check YPOS also. Ropes shouldn't wobble if
|
||
;not hit.
|
||
|
||
move *a13(OBJ_XVEL),a0,L
|
||
movi [3,0001],a7
|
||
move a7,*a13(OBJ_XVEL),L
|
||
andi >ffff,a0
|
||
cmpi 1,a0
|
||
jrz #no_l
|
||
|
||
;This is the first time we have collided with ropes.
|
||
;Wobble them.
|
||
|
||
movi ROPE_LEFT,a0
|
||
movk 1,a2
|
||
movi ROPE_BOUNCEIO,a1
|
||
calla rope_command
|
||
|
||
movi 3ch,a0
|
||
calla triple_sound
|
||
|
||
#no_l
|
||
ori MOVE_LEFT,a7 ;can't move left
|
||
jruc #done
|
||
|
||
#xl_ok
|
||
;Check right edge of collision box against right ropes
|
||
move *a13(OBJ_COLLX2),a5
|
||
|
||
;first see if we're even in the ballpark.
|
||
movi vln_right_rope,a6
|
||
move *a6,a0 ;x1
|
||
cmp a0,a5 ;xpos - x1
|
||
jrlt #xr_ok
|
||
|
||
;close enough for a more careful check...
|
||
callr calc_line_x
|
||
cmp a0,a5 ;xpos - a0
|
||
jrlt #xr_ok
|
||
jreq #no_r
|
||
|
||
|
||
;we're past the right rope. see if we're attached
|
||
move *a13(ATTACH_PROC),a14,L
|
||
jrz #not2
|
||
|
||
;I'm attached, which means both me and my opponent are gonna get
|
||
; moved. Figure the right amount, apply it to both of us, then
|
||
; wobble the ropes and bounce both of us away.
|
||
|
||
;a0 is rope X, a5 is right edge of our collbox. Move us and our
|
||
; opponent left (a5 - a0) pixels.
|
||
sub a0,a5
|
||
move *a13(OBJ_XPOSINT),a14
|
||
sub a5,a14
|
||
move a14,*a13(OBJ_XPOSINT)
|
||
|
||
move *a13(ATTACH_PROC),a0,L
|
||
move *a0(OBJ_XPOSINT),a14
|
||
sub a5,a14
|
||
move a14,*a0(OBJ_XPOSINT)
|
||
|
||
;If either I or my opponent has a nonzero X velocity other than
|
||
; -40000h, give us both Xvel -40000h, Yvel 30000h.
|
||
|
||
;Skip the velocity crap if I'm on the ground.
|
||
move *a13(GROUND_Y),a0
|
||
move *a13(OBJ_YPOSINT),a1
|
||
cmp a0,a1
|
||
jreq #no_r
|
||
|
||
move *a13(OBJ_XVEL),a14,L
|
||
jrz #rr_check_opp
|
||
cmpi [-4,0],a14
|
||
jrne #rr_check_opp
|
||
jruc #rr_set_vels
|
||
|
||
#rr_check_opp
|
||
move *a13(ATTACH_PROC),a5,L
|
||
move *a5(OBJ_XVEL),a14,L
|
||
jrz #no_r
|
||
cmpi [-4,0],a14
|
||
jrne #rr_set_vels
|
||
jruc #no_r
|
||
|
||
#rr_set_vels
|
||
;X vel
|
||
movi [-4,0],a14
|
||
move a14,*a13(OBJ_XVEL),L
|
||
move *a13(ATTACH_PROC),a5,L
|
||
move a14,*a5(OBJ_XVEL),L
|
||
|
||
;Y vel
|
||
;Wait! Don't muck with the Y vels if they're already above 30000h.
|
||
move *a13(OBJ_YVEL),a14,L
|
||
cmpi 30000h,a14
|
||
jrgt #nyv2
|
||
move *a5(OBJ_YVEL),a14,L
|
||
cmpi 30000h,a14
|
||
jrgt #nyv2
|
||
movi [3,0],a14
|
||
move a14,*a13(OBJ_YVEL),L
|
||
move a14,*a5(OBJ_YVEL),L
|
||
#nyv2
|
||
;...and wobble the ropes
|
||
PUSH a0,a5
|
||
movi ROPE_RIGHT,a0
|
||
movk 1,a2
|
||
movi ROPE_BOUNCEIO,a1
|
||
calla rope_command
|
||
|
||
movi 3ch,a0
|
||
calla triple_sound
|
||
|
||
PULL a0,a5
|
||
|
||
jruc #no_r
|
||
|
||
#not2
|
||
|
||
move *a13(OBJ_XPOSINT),a14
|
||
sub a14,a5
|
||
sub a5,a0
|
||
|
||
move a0,*a13(X_BOUND)
|
||
sll 16,a0
|
||
move a0,*a13(OBJ_XPOS),L
|
||
|
||
move *a13(INRING),a0
|
||
jrnz #no_r ;Am outside.
|
||
|
||
calla ck_climb_out_side
|
||
|
||
;Has hit right rope
|
||
;Wobble ropes and bounce off of them upon first hit.
|
||
move *a13(MOVE_DIR),a0
|
||
jrnz #no_r
|
||
|
||
move *a13(OBJ_XVEL),a0,L
|
||
jrz #no_r
|
||
|
||
;Skip the velocity crap if I'm on the ground.
|
||
move *a13(GROUND_Y),a0
|
||
move *a13(OBJ_YPOSINT),a1
|
||
cmp a0,a1
|
||
jreq #no_r
|
||
|
||
;We also should check YPOS also. Ropes shouldn't wobble if
|
||
;not hit.
|
||
|
||
move *a13(OBJ_XVEL),a0,L
|
||
movi [-3,0001],a7
|
||
move a7,*a13(OBJ_XVEL),L
|
||
andi >ffff,a0
|
||
cmpi 1,a0
|
||
jrz #no_r
|
||
|
||
;This is the first time we have collided with ropes.
|
||
;Wobble them.
|
||
|
||
movi ROPE_RIGHT,a0
|
||
movk 1,a2
|
||
movi ROPE_BOUNCEIO,a1
|
||
calla rope_command
|
||
|
||
movi 3ch,a0
|
||
calla triple_sound
|
||
|
||
#no_r
|
||
ori MOVE_RIGHT,a7 ;can't move right
|
||
#xr_ok
|
||
#done
|
||
#no_confine
|
||
move a7,*a13(CAN_MOVE_DIR)
|
||
rets
|
||
|
||
|
||
|
||
;We're outside the ring
|
||
#outring
|
||
movi ARENA_TOP,a0
|
||
move *a13(OBJ_ZPOSINT),a5
|
||
cmp a0,a5 ;zpos - top
|
||
jrgt #zu_ok2
|
||
jreq #no_u2
|
||
|
||
move a0,*a13(Z_BOUND)
|
||
sll 16,a0
|
||
move a0,*a13(OBJ_ZPOS),L
|
||
#no_u2
|
||
ori MOVE_UP,a7 ;can't move up
|
||
jruc #check_x2
|
||
|
||
#zu_ok2
|
||
movi ARENA_BOT,a0 ;zpos - bot
|
||
cmp a0,a5
|
||
jrlt #zd_ok2
|
||
jreq #no_d2
|
||
|
||
move a0,*a13(Z_BOUND)
|
||
sll 16,a0
|
||
move a0,*a13(OBJ_ZPOS),L
|
||
#no_d2
|
||
ori MOVE_DOWN,a7 ;can't move down
|
||
#zd_ok2
|
||
|
||
#check_x2
|
||
move *a13(OBJ_COLLX1),a5
|
||
movi vln_left_fence,a6
|
||
move *a6,a0 ;x1
|
||
cmp a0,a5 ;xpos - x2
|
||
jrgt #xl_ok2
|
||
callr calc_line_x
|
||
cmp a0,a5 ;xpos - a0
|
||
jrgt #xl_ok2
|
||
jreq #no_l2
|
||
|
||
;must move right (a0-a5) pixels. If we're attached, move our
|
||
; opponent too.
|
||
move a0,a1
|
||
sub a5,a0
|
||
|
||
move *a13(OBJ_XPOSINT),a14
|
||
add a0,a14
|
||
move a14,*a13(OBJ_XPOSINT)
|
||
move a1,*a13(X_BOUND)
|
||
|
||
move *a13(ATTACH_PROC),a5,L
|
||
jrz #no_l2
|
||
|
||
move *a5(OBJ_XPOSINT),a14
|
||
add a0,a14
|
||
move a14,*a5(OBJ_XPOSINT)
|
||
move a1,*a5(X_BOUND)
|
||
#no_l2
|
||
ori MOVE_LEFT,a7 ;can't move left
|
||
jruc #cont_x
|
||
|
||
#xl_ok2
|
||
move *a13(OBJ_COLLX2),a5
|
||
movi vln_right_fence,a6
|
||
move *a6,a0 ;x1
|
||
cmp a0,a5 ;xpos - x1
|
||
jrlt #xr_ok2
|
||
callr calc_line_x
|
||
cmp a0,a5 ;xpos - a0
|
||
jrlt #xr_ok2
|
||
jreq #no_r2
|
||
|
||
;must move left (a5-a0) pixels. If we're attached, move our
|
||
; opponent too.
|
||
sub a0,a5
|
||
|
||
move *a13(OBJ_XPOSINT),a14
|
||
sub a5,a14
|
||
move a14,*a13(OBJ_XPOSINT)
|
||
move a0,*a13(X_BOUND)
|
||
|
||
move *a13(ATTACH_PROC),a1,L
|
||
jrz #no_r2
|
||
move *a1(OBJ_XPOSINT),a14
|
||
sub a5,a14
|
||
move a14,*a1(OBJ_XPOSINT)
|
||
move a0,*a1(X_BOUND)
|
||
#no_r2
|
||
ori MOVE_RIGHT,a7 ;can't move right
|
||
#xr_ok2
|
||
|
||
;now check for the mat/ring
|
||
|
||
#cont_x
|
||
move *a13(OBJ_XPOSINT),a5
|
||
cmpi RING_X_CENTER,a5
|
||
jrgt #right_side
|
||
;left side
|
||
movi vln_left_matedge2,a6
|
||
callr calc_line_x
|
||
jrz #done2 ;out of range
|
||
move *a13(OBJ_COLLX2),a8
|
||
sub a0,a8 ;xpos - a0 =(xov)
|
||
jrn #done2
|
||
|
||
move *a13(OBJ_ZPOSINT),a4
|
||
cmpi RING_Z_CENTER,a4
|
||
jrgt #bot_left
|
||
;top left
|
||
move *a6(10h),a0
|
||
;;; dec a4
|
||
move a4,a9
|
||
sub a0,a9 ;zpos - z1 =(zov)
|
||
cmp a8,a9 ;zov - xov
|
||
jrgt #no_r3
|
||
|
||
sub a9,a4
|
||
move a4,*a13(Z_BOUND)
|
||
sll 16,a4
|
||
move a4,*a13(OBJ_ZPOS),L
|
||
ori MOVE_DOWN,a7 ;can't move down
|
||
|
||
calla ck_climb_in_top
|
||
|
||
jruc #done2
|
||
|
||
#bot_left
|
||
move *a6(30h),a9
|
||
;;; inc a4
|
||
sub a4,a9 ;z2 - zpos =(zov)
|
||
cmp a8,a9 ;zov - xov
|
||
jrgt #no_r3
|
||
add a9,a4
|
||
move a4,*a13(Z_BOUND)
|
||
sll 16,a4
|
||
move a4,*a13(OBJ_ZPOS),L
|
||
ori MOVE_UP,a7 ;can't move up
|
||
|
||
calla ck_climb_in_bot
|
||
|
||
jruc #done2
|
||
|
||
#no_r3
|
||
;we need to move a8 pixels to the left. if we're attached, move both
|
||
; of us.
|
||
sub a8,a5
|
||
move a5,*a13(X_BOUND)
|
||
sll 16,a5
|
||
move a5,*a13(OBJ_XPOS),L
|
||
ori MOVE_RIGHT,a7 ;can't move right
|
||
|
||
move *a13(ATTACH_PROC),a0,L
|
||
jrz #no_r3_att
|
||
move *a0(OBJ_XPOSINT),a14
|
||
sub a8,a14
|
||
move a14,*a0(OBJ_XPOSINT)
|
||
#no_r3_att
|
||
|
||
calla ck_climb_in_side
|
||
|
||
jruc #done2
|
||
|
||
|
||
#right_side
|
||
movi vln_right_matedge2,a6
|
||
callr calc_line_x
|
||
jrz #done2 ;out of range
|
||
move a0,a8
|
||
move *a13(OBJ_COLLX1),a0
|
||
sub a0,a8 ;a8 - xpos =(xov)
|
||
jrn #done2
|
||
|
||
move *a13(OBJ_ZPOSINT),a4
|
||
cmpi RING_Z_CENTER,a4
|
||
jrgt #bot_right
|
||
;top right
|
||
move *a6(10h),a0
|
||
;;; dec a4
|
||
move a4,a9
|
||
sub a0,a9 ;zpos - z1 =(zov)
|
||
cmp a8,a9 ;zov - xov
|
||
jrgt #no_l3
|
||
sub a9,a4
|
||
move a4,*a13(Z_BOUND)
|
||
sll 16,a4
|
||
move a4,*a13(OBJ_ZPOS),L
|
||
ori MOVE_DOWN,a7 ;can't move down
|
||
|
||
calla ck_climb_in_top
|
||
|
||
jruc #done2
|
||
|
||
|
||
#bot_right
|
||
move *a6(30h),a9
|
||
;;; inc a4
|
||
sub a4,a9 ;z2 - zpos =(zov)
|
||
cmp a8,a9 ;zov - xov
|
||
jrgt #no_l3
|
||
add a9,a4
|
||
move a4,*a13(Z_BOUND)
|
||
sll 16,a4
|
||
move a4,*a13(OBJ_ZPOS),L
|
||
ori MOVE_UP,a7 ;can't move up
|
||
|
||
calla ck_climb_in_bot
|
||
|
||
jruc #done2
|
||
|
||
|
||
#no_l3
|
||
;we need to move a8 pixels to the right. if we're attached, move both
|
||
; of us.
|
||
add a8,a5
|
||
move a5,*a13(X_BOUND)
|
||
sll 16,a5
|
||
move a5,*a13(OBJ_XPOS),L
|
||
ori MOVE_LEFT,a7 ;can't move down
|
||
|
||
move *a13(ATTACH_PROC),a0,L
|
||
jrz #no_l3_att
|
||
move *a0(OBJ_XPOSINT),a14
|
||
add a8,a14
|
||
move a14,*a0(OBJ_XPOSINT)
|
||
#no_l3_att
|
||
|
||
calla ck_climb_in_side
|
||
|
||
#done2
|
||
move a7,*a13(CAN_MOVE_DIR)
|
||
move *a13(PLYRMODE),a0
|
||
cmpi MODE_DEAD,a0
|
||
jreq #dead
|
||
cmpi MODE_RUNNING,a0
|
||
jrne just_ignore_me
|
||
|
||
movi [3,0],a2
|
||
btst MOVE_LEFT_BIT,a7
|
||
jrnz we_going_left
|
||
neg a2
|
||
btst MOVE_RIGHT_BIT,a7
|
||
jrz just_ignore_me
|
||
we_going_left
|
||
|
||
;we've hit a gate, and we're running. It's possible, however, that
|
||
; we're right up against a gate and have just started running in the
|
||
; opposite direction, in which case we shouldn't crash or anything.
|
||
; blow this off if we're running AWAY from the gate we've hit
|
||
move *a13(CAN_MOVE_DIR),a0
|
||
move *a13(FACING_DIR),a14
|
||
and a14,a0
|
||
andi MOVE_LEFT|MOVE_RIGHT,a0
|
||
jrz just_ignore_me
|
||
|
||
move a2,*a13(OBJ_XVEL),L
|
||
SETMODE NORMAL
|
||
movi [3,0],a0
|
||
move a0,*a13(OBJ_YVEL),L
|
||
clr a0
|
||
move a0,*a13(RUN_TIME)
|
||
|
||
;if we've hit the gate in the last three seconds, fall back instead.
|
||
move @PCNT,a14,L
|
||
move *a13(HIT_GATE_TIME),a0,L
|
||
sub a0,a14
|
||
cmpi TSEC*3,a14
|
||
jrge #bnc
|
||
FACETBL fall_back_tbl
|
||
jruc #bcanim
|
||
|
||
#bnc FACE24TBL bncoff_gate
|
||
#bcanim calla change_anim1a
|
||
|
||
;crash sound
|
||
movi 0c5h,a0
|
||
calla triple_sound
|
||
|
||
;set HIT_GATE_TIME
|
||
move @PCNT,a14,L
|
||
move a14,*a13(HIT_GATE_TIME),L
|
||
|
||
;take some damage
|
||
move *a13(PLYRNUM),a1
|
||
movi -D_GATE_CRASH,a0
|
||
clr a10
|
||
calla adjust_health
|
||
|
||
calla ditch_getup_meter
|
||
|
||
just_ignore_me
|
||
rets
|
||
|
||
#dead ;if we're a zombie, hitting the edge is our cue to transform
|
||
andi MOVE_LEFT|MOVE_RIGHT,a7
|
||
jrz just_ignore_me
|
||
move *a13(STATUS_FLAGS),a14
|
||
btst B_ZOMBIE,a14
|
||
jrz just_ignore_me
|
||
btst B_CAN_XFORM,a14
|
||
jrz just_ignore_me
|
||
|
||
#zombie_transform
|
||
movk 1,a0
|
||
calla change_wrestler
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* for whatever reason, confine_wrestler happens twice per tick. The problem
|
||
* is that if you bump into the ropes, the first time we execute c_w, your
|
||
* CAN_MOVE_DIR bits are set. But the second time, they're cleared since you
|
||
* aren't hitting the ropes anymore. This ugly little hack gets around this
|
||
* by saving your CAN_MOVE_DIR bits after the first call, and then ORing them
|
||
* with your CAN_MOVE_DIR bits after the second.
|
||
|
||
SUBRP confine_wrestler_fix1
|
||
|
||
move *a13(CAN_MOVE_DIR),*a13(CAN_MOVE_TEMP)
|
||
rets
|
||
|
||
SUBRP confine_wrestler_fix2
|
||
move *a13(CAN_MOVE_DIR),a0
|
||
move *a13(CAN_MOVE_TEMP),a1
|
||
or a0,a1
|
||
move a1,*a13(CAN_MOVE_DIR)
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
SUBRP wrestler_friction
|
||
|
||
move *a13(ANIMODE),a0
|
||
btst MODE_FRICTION_BIT,a0
|
||
jrz #no_friction
|
||
|
||
move *a13(OBJ_FRICTION),a0
|
||
|
||
move *a13(OBJ_XVEL),a1,L
|
||
jrz #no_friction
|
||
jrn #add
|
||
|
||
sub a0,a1
|
||
jrp #ok1
|
||
clr a1
|
||
#ok1
|
||
move a1,*a13(OBJ_XVEL),L
|
||
rets
|
||
|
||
#add
|
||
add a0,a1
|
||
jrn #ok2
|
||
clr a1
|
||
#ok2
|
||
move a1,*a13(OBJ_XVEL),L
|
||
|
||
|
||
#no_friction
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
* Change an objects image
|
||
* A0=*New image
|
||
* A1=New flip flags & const
|
||
* A8=*Obj
|
||
* Trashes scratch
|
||
|
||
SUBR change_image
|
||
|
||
|
||
PUSH a2,a3
|
||
|
||
cmpi ROM,a0
|
||
jrlo #anierr
|
||
|
||
move a0,a2
|
||
move a1,a3
|
||
|
||
move a2,*a8(OIMG),L
|
||
move *a2(0),*a8(OSIZE),L
|
||
move *a2(ISAG),*a8(OSAG),L
|
||
|
||
|
||
move *a2(IANIOFFX),*a8(ODXOFF) ;display x offset
|
||
move *a2(IANIOFFY),*a8(ODYOFF) ;display y offset
|
||
|
||
|
||
setf 5,0,0
|
||
move *a2(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits
|
||
setf 6,0,0
|
||
move a3,*a8(OCTRL) ;Write 6 low bits
|
||
setf 16,1,0
|
||
|
||
#x PULL a2,a3
|
||
rets
|
||
|
||
#anierr
|
||
.if DEBUG
|
||
LOCKUP
|
||
eint
|
||
.else
|
||
CALLERR 2,2
|
||
.endif
|
||
jruc #x
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* calls movement code base on wrestler number
|
||
*
|
||
* a13 = * wrestler process
|
||
|
||
SUBRP move_wrestler
|
||
|
||
move @HALT,a0
|
||
jrnz #rets
|
||
|
||
;check to see if a special move watchdog proc has queued up an anim.
|
||
; If one has, do that instead of calling move_xxx.
|
||
move *a13(SPECIAL_MOVE_ADDR),a0,L
|
||
jrz #no_special
|
||
|
||
;a special has been queued up. do it.
|
||
calla change_anim1a
|
||
clr a14
|
||
move a14,*a13(SPECIAL_MOVE_ADDR),L
|
||
jruc #rets
|
||
|
||
#no_special
|
||
|
||
;turn into a drone if it's time to auto-pin.
|
||
callr auto_pin_check
|
||
|
||
move *a13(WRESTLERNUM),a0
|
||
X32 a0
|
||
addi #code_addr,a0
|
||
move *a0,a0,L
|
||
call a0
|
||
|
||
#rets rets
|
||
|
||
#code_addr
|
||
.long move_bret ;0 Bret Hart
|
||
.long move_razor ;1 Razor Ramon
|
||
.long move_taker ;2 Undertaker
|
||
.long move_yoko ;3 Yokozuna
|
||
.long move_shawn ;4 Shawn Michaels
|
||
.long move_bam ;5 Bam Bam
|
||
.long move_doink ;6 Doink
|
||
.long 0 ;7 spare
|
||
.long move_lex ;8 Lex Luger
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* if all opponents are dead, wait four seconds, then wait for the
|
||
* unint bit to clear, then turn into a drone.
|
||
*
|
||
|
||
SUBR auto_pin_check
|
||
move @in_finish_move,a14 ; Are we in a finishing move ?
|
||
jrnz #rets ; br = yes
|
||
move @finish_completed,a14 ; Did we do a finishing move ?
|
||
jrnz #rets ; br = yes
|
||
|
||
move @royal_rumble,a14
|
||
jrnz #rets
|
||
|
||
calla get_opp_plyrmode
|
||
cmpi MODE_DEAD,a0
|
||
jrne #alive
|
||
|
||
;skip it if we've already pinned
|
||
move *a13(STATUS_FLAGS),a14
|
||
btst B_DID_PIN,a14
|
||
jrnz #rets
|
||
|
||
callr get_opp_process
|
||
move *a0(STATUS_FLAGS),a14
|
||
btst B_ZOMBIE,a14
|
||
jrnz #alive
|
||
|
||
.ref anyone_bucking
|
||
calla anyone_bucking
|
||
jrnz #rets
|
||
|
||
;all opponents are dead. increment AUTO_PIN_CNTDOWN and turn into
|
||
; a drone if the total is >= TSEC*4.
|
||
move *a13(AUTO_PIN_CNTDOWN),a14
|
||
inc a14
|
||
move a14,*a13(AUTO_PIN_CNTDOWN)
|
||
cmpi TSEC*3,a14
|
||
jrlt #rets
|
||
|
||
move *a13(ANIMODE),a14
|
||
btst MODE_UNINT_BIT,a14
|
||
jrnz #rets
|
||
|
||
;become a drone
|
||
movi PTYPE_DRONE,a14
|
||
move a14,*a13(PLYR_TYPE)
|
||
jruc #rets
|
||
|
||
#alive ;Reset AUTO_PIN_CNTDOWN
|
||
clr a14
|
||
move a14,*a13(AUTO_PIN_CNTDOWN)
|
||
#rets rets
|
||
|
||
#*****************************************************************************
|
||
|
||
; SUBRP realtime_clock
|
||
;
|
||
; clr a8
|
||
; move a8,@match_realtime
|
||
;
|
||
;#loop SLEEP TSEC
|
||
; inc a8
|
||
; move a8,@match_realtime
|
||
; jruc #loop
|
||
|
||
******************************************************************************
|
||
|
||
;!KEEP THIS ORDER!
|
||
BSSX up_dtime1, 16*NUM_WRES ;number of ticks stick held down
|
||
BSSX down_dtime1, 16*NUM_WRES
|
||
BSSX left_dtime1, 16*NUM_WRES
|
||
BSSX right_dtime1, 16*NUM_WRES
|
||
BSSX punch_dtime1, 16*NUM_WRES
|
||
BSSX block_dtime1, 16*NUM_WRES ;number of ticks button held down
|
||
BSSX powerp_dtime1, 16*NUM_WRES
|
||
BSSX kick_dtime1, 16*NUM_WRES
|
||
BSSX powerk_dtime1, 16*NUM_WRES
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBRP init_joy_dtime
|
||
|
||
clr a0
|
||
|
||
movi up_dtime1,a1
|
||
movi 9*NUM_WRES,a2
|
||
#lp1
|
||
move a0,*a1+
|
||
dsj a2,#lp1
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR get_block_dtime
|
||
|
||
X16 a0
|
||
addi block_dtime1,a0
|
||
move *a0,a0
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR get_powerp_dtime
|
||
|
||
X16 a0
|
||
addi powerp_dtime1,a0
|
||
move *a0,a0
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR get_punch_dtime
|
||
|
||
X16 a0
|
||
addi punch_dtime1,a0
|
||
move *a0,a0
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR get_kick_dtime
|
||
|
||
X16 a0
|
||
addi kick_dtime1,a0
|
||
move *a0,a0
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR get_powerk_dtime
|
||
|
||
X16 a0
|
||
addi powerk_dtime1,a0
|
||
move *a0,a0
|
||
rets
|
||
|
||
|
||
#*****************************************************************************
|
||
|
||
|
||
SUBRP update_joy_dtime
|
||
|
||
move *a13(PLYRNUM),a2
|
||
callr #update_but
|
||
move *a13(PLYRNUM),a2
|
||
callr #update_stick
|
||
|
||
rets
|
||
|
||
#update_stick
|
||
; move a13,a0
|
||
; calla wres_get_stick_val_cur
|
||
move *a13(STICK_VAL_CUR),a0
|
||
X16 a2
|
||
addi up_dtime1,a2
|
||
|
||
movk 4,a3
|
||
#loop1
|
||
clr a1
|
||
|
||
srl 1,a0
|
||
jrnc #clr1
|
||
|
||
move *a2,a1
|
||
inc a1
|
||
#clr1
|
||
move a1,*a2
|
||
|
||
addi 16*NUM_WRES,a2
|
||
dsj a3,#loop1
|
||
|
||
rets
|
||
|
||
#update_but
|
||
move *a13(BUT_VAL_CUR),a0
|
||
X16 a2
|
||
addi punch_dtime1,a2
|
||
|
||
movk 5,a3
|
||
#loop2
|
||
clr a1
|
||
|
||
srl 1,a0
|
||
jrnc #clr2
|
||
|
||
move *a2,a1
|
||
inc a1
|
||
#clr2
|
||
move a1,*a2
|
||
|
||
addi 16*NUM_WRES,a2
|
||
dsj a3,#loop2
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
* a13 = * current process
|
||
* calculates closest opponent and distances to him
|
||
*
|
||
* Well, not really the closest. We bias it lots of ways:
|
||
*
|
||
* ---> Will always choose live targets over dead ones.
|
||
* ---> Will always choose normal dead over zombies.
|
||
* ---> Biased distance (used for comparison but never stored) is doubled
|
||
* for targets in MODE_ONGROUND.
|
||
* ---> 25% reduction in biased distance for WHOIHIT
|
||
* ---> Biased distance tripled for targets with different INRING values.
|
||
* ---> Add double the Z difference to biased range (favors targets in
|
||
* your Z-lane.
|
||
* ---> 25% reduction in biased distance for previous closest
|
||
* ---> Will always pick live targets in front of a runner over targets behind
|
||
* him, IF they have the same INRING value.
|
||
* ---> If in combo mode, will always face WHOIHIT, unless WHOIHIT is dead.
|
||
*
|
||
|
||
|
||
;biased distance to current champ.
|
||
.bss #biased_range,16
|
||
|
||
; first calculate the distance on the X-Z plane
|
||
; dxz = sqroot ( (x1-x2)^2 + (z1-z2)^2 )
|
||
; total dist = sqroot ( DXZ^2 + (y1-y2)^2 )
|
||
|
||
|
||
SUBRP calc_closest2
|
||
|
||
;Always recalculate if our current closest is dead.
|
||
move *a13(CLOSEST_NUM),a14
|
||
X32 a14
|
||
addi process_ptrs,a14
|
||
move *a14,a14,L
|
||
move *a14(PLYRMODE),a14
|
||
cmpi MODE_DEAD,a14
|
||
jreq #go
|
||
|
||
;Only proceed on every fourth tick.
|
||
move *a13(PLYRNUM),a0
|
||
andi 3,a0
|
||
move @PCNT,a1
|
||
andi 3,a1
|
||
cmp a0,a1
|
||
jrnz #x
|
||
|
||
|
||
SUBRP calc_closest
|
||
|
||
;a11 is a flag. when set, this indicates that a live player
|
||
; is the current closest. Any live player will be chosen over
|
||
; a dead one.
|
||
;a11 is the status of the closest guy. a positive value means the
|
||
; current closest is alive. Zero means he's dead, and a negative
|
||
; value means there isn't one or it's a zombie.
|
||
|
||
#go move *a13(PLYR_TYPE),a0
|
||
|
||
move *a13(OBJ_XPOSINT),a4
|
||
move *a13(OBJ_ZPOSINT),a5
|
||
move *a13(OBJ_YPOSINT),a6
|
||
|
||
movi 7FFFh,a3 ;closest distance
|
||
move a3,@#biased_range
|
||
clr a11
|
||
dec a11 ;initialize to none/zombie
|
||
movi process_ptrs,a2
|
||
movi NUM_WRES,a1
|
||
|
||
#loop move *a2+,a10,L
|
||
jrz #inactive
|
||
cmp a13,a10
|
||
jreq #skip_nopull ;skip self
|
||
|
||
move *a13(PLYR_SIDE),a7
|
||
move *a10(PLYR_SIDE),a8
|
||
cmp a7,a8
|
||
jreq #skip_nopull ;skip friendly
|
||
|
||
PUSH a4,a6
|
||
PUSH a1
|
||
|
||
move *a10(OBJ_XPOSINT),a7
|
||
move *a10(OBJ_ZPOSINT),a8
|
||
move *a10(OBJ_YPOSINT),a9
|
||
|
||
sub a4,a7 ;abs(delta x)
|
||
abs a7
|
||
move a7,a1
|
||
mpyu a1,a1 ;^2
|
||
move a1,a0
|
||
|
||
sub a5,a8 ;abs(delta z)
|
||
abs a8
|
||
move a8,a1
|
||
mpyu a1,a1 ;^2
|
||
add a1,a0
|
||
|
||
sub a6,a9 ;abs(delta y)
|
||
abs a9
|
||
move a9,a1
|
||
mpyu a1,a1 ;^2
|
||
add a1,a0
|
||
calla square_root ;sqroot of dxz^2 + dy^2
|
||
|
||
PULL a1
|
||
|
||
;a0 is dist. compute biased dist in a4
|
||
move a0,a4
|
||
|
||
;ONGROUND penalty
|
||
move *a10(PLYRMODE),a14
|
||
cmpi MODE_ONGROUND,a14
|
||
jrne #bc1
|
||
sll 1,a4 ;double it
|
||
|
||
#bc1 ;WHOIHIT bonus
|
||
move *a13(WHOIHIT),a14,L
|
||
cmp a14,a10
|
||
jrne #bc2
|
||
move a4,a14
|
||
srl 2,a14
|
||
sub a14,a4 ;sub 25%
|
||
|
||
#bc2 ;INRING penalty
|
||
move *a10(INRING),a14
|
||
move *a13(INRING),a6
|
||
cmp a6,a14
|
||
jreq #bc3
|
||
move a4,a14
|
||
sll 1,a4
|
||
add a14,a4 ;triple it
|
||
|
||
#bc3 ;previous closest bonus
|
||
move *a13(CLOSEST_NUM),a14
|
||
move *a10(PLYRNUM),a6
|
||
cmp a14,a6
|
||
jrne #bc4
|
||
move a4,a14
|
||
srl 2,a14
|
||
sub a14,a4 ;sub 25%
|
||
|
||
#bc4 ;zero biased dist to combo target
|
||
move *a13(COMBO_COUNT),a14
|
||
jrz #bc5
|
||
move *a13(WHOIHIT),a14,L
|
||
cmp a14,a10
|
||
jrne #bc5
|
||
clr a4 ;zero dist
|
||
|
||
#bc5 ;Z penalty
|
||
move a8,a14 ;delta Z
|
||
sll 1,a14
|
||
add a14,a4 ;add double the Z dist
|
||
|
||
|
||
;skip this guy if:
|
||
; a) we're running,
|
||
; b) he's behind us,
|
||
; c) our current closest is ahead of us, and
|
||
; d) our current closest is inside the ring.
|
||
|
||
;we running?
|
||
move *a13(PLYRMODE),a14
|
||
cmpi MODE_RUNNING,a14
|
||
jrne #ab_ok
|
||
|
||
;have a useful current closest?
|
||
TEST a11
|
||
jrn #ab_ok
|
||
|
||
;is this guy behind us?
|
||
move a10,a14
|
||
calla is_a14_behind
|
||
jrnc #ab_ok
|
||
|
||
;is closest ahead of us?
|
||
move *a13(CLOSEST_NUM),a14
|
||
X32 a14
|
||
addi process_ptrs,a14
|
||
move *a14,a14,L
|
||
calla is_a14_behind
|
||
jrc #ab_ok
|
||
|
||
;is closest inside the ring?
|
||
move *a13(CLOSEST_NUM),a14
|
||
X32 a14
|
||
addi process_ptrs,a14
|
||
move *a14,a14,L
|
||
move *a14(INRING),a14
|
||
jrnz #ab_ok
|
||
|
||
;we're running, this guy is behind us, and our current closest is
|
||
; both inside the ring and ahead of us. Ignore this guy.
|
||
jruc #skip
|
||
|
||
#ab_ok ;ahead/behind ok.
|
||
|
||
;three cases. zombie, dead, or alive.
|
||
move *a10(PLYRMODE),a14
|
||
cmpi MODE_DEAD,a14
|
||
jrne #alive
|
||
move *a10(STATUS_FLAGS),a14
|
||
btst B_ZOMBIE,a14
|
||
jrz #dead
|
||
;fall through to zombie
|
||
|
||
#zombie ;Only test this guy if a11 is negative.
|
||
TEST a11
|
||
jrnn #skip
|
||
jruc #compare
|
||
|
||
#dead ;If a11 is negative, take this guy. If it's zero, compare
|
||
TEST a11
|
||
jrz #compare
|
||
jrnn #skip
|
||
clr a11 ;set a11 to dead
|
||
jruc #accept
|
||
|
||
#alive ;If a11 is positive, compare, otherwise just take him.
|
||
TEST a11
|
||
jrp #compare
|
||
movk 1,a11 ;set a11 to alive
|
||
jruc #accept
|
||
|
||
#compare
|
||
move @#biased_range,a14
|
||
cmp a14,a4
|
||
jrle #accept
|
||
|
||
;too far.
|
||
jruc #skip
|
||
|
||
#accept ;use the guy in a10
|
||
|
||
move a4,@#biased_range
|
||
move a0,a3
|
||
move a3,*a13(CLOSEST_DIST)
|
||
move a7,*a13(CLOSEST_XDIST)
|
||
move a8,*a13(CLOSEST_ZDIST)
|
||
move a9,*a13(CLOSEST_YDIST)
|
||
|
||
move *a10(PLYRNUM),a14
|
||
move a14,*a13(CLOSEST_NUM)
|
||
|
||
#skip
|
||
PULL a4,a6
|
||
#inactive
|
||
#skip_nopull
|
||
dsj a1,#loop
|
||
|
||
#x rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* if attached, updates position based on player attached to
|
||
* wrestler proc = *a13
|
||
*
|
||
* RETURNS: Z=1 - not attached to anything
|
||
* Z=0 - attached and updated
|
||
*
|
||
* TRASHES: a0,a1,a2
|
||
|
||
SUBR master_keep_attached
|
||
|
||
|
||
move *a13(ATTACH_PROC),a10,L ;proc attached to me
|
||
jrz #not_attached
|
||
move *a10(ATTACH_PROC),a0,L
|
||
jrz #not_attached
|
||
|
||
#still_attached
|
||
;first, see if opponent is on the ground.
|
||
move *a10(OBJ_YPOS),a0,L
|
||
move *a10(GROUND_Y),a14
|
||
sll 16,a14
|
||
cmp a14,a0
|
||
jrgt #opp_notgnd
|
||
|
||
;opponent is on ground. first, make sure he's not in MODE_GHOST
|
||
move *a10(ANIMODE),a14
|
||
btst MODE_GHOST_BIT,a14
|
||
jrnz #opp_notgnd
|
||
|
||
;calc new 'floor'
|
||
move *a10(OBJ_YPOS),a0,L
|
||
move *a13(ATTACH_YOFF),a14
|
||
sll 16,a14
|
||
sub a14,a0
|
||
|
||
;a0 is our new floor. stay at or above
|
||
move *a13(OBJ_YPOS),a14,L
|
||
cmp a14,a0
|
||
jrle #above_newfloor
|
||
|
||
;too low. climb
|
||
move a0,*a13(OBJ_YPOS),L
|
||
|
||
#above_newfloor
|
||
#opp_notgnd
|
||
|
||
clr a0
|
||
move a0,*a10(OBJ_YVEL),L
|
||
|
||
move *a13(OBJ_ZPOS),a0,L
|
||
move *a13(ATTACH_ZOFF),a1
|
||
sll 16,a1
|
||
add a1,a0
|
||
move a0,*a10(OBJ_ZPOS),L
|
||
|
||
move *a13(OBJ_YPOS),a0,L
|
||
move *a13(ATTACH_YOFF),a1
|
||
sll 16,a1
|
||
add a1,a0
|
||
move a0,*a10(OBJ_YPOS),L
|
||
|
||
move *a13(OBJ_XPOS),a0,L
|
||
move *a13(ATTACH_XOFF),a1
|
||
sll 16,a1
|
||
|
||
move *a13(FACING_DIR),a2
|
||
btst MOVE_RIGHT_BIT,a2
|
||
jrnz #add
|
||
neg a1
|
||
#add
|
||
add a1,a0
|
||
move a0,*a10(OBJ_XPOS),L
|
||
|
||
movk 1,a0 ;Z=0
|
||
|
||
#not_attached
|
||
rets
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* if attached, updates position based on player attached to
|
||
* wrestler proc = *a13
|
||
*
|
||
* RETURNS: Z=1 - not attached to anything
|
||
* Z=0 - attached and updated
|
||
*
|
||
* TRASHES: a0,a1,a2
|
||
|
||
|
||
SUBR keep_attached
|
||
|
||
|
||
move *a13(ATTACH_PROC),a2,L ;proc attached to
|
||
jrz #not_attached
|
||
move *a2(ATTACH_PROC),a0,L
|
||
jrz #not_attached
|
||
|
||
#still_attached
|
||
clr a0
|
||
move a0,*a13(OBJ_YVEL),L
|
||
|
||
move *a2(OBJ_ZPOS),a0,L
|
||
move *a2(ATTACH_ZOFF),a1
|
||
sll 16,a1
|
||
add a1,a0
|
||
move a0,*a13(OBJ_ZPOS),L
|
||
|
||
move *a2(OBJ_YPOS),a0,L
|
||
move *a2(ATTACH_YOFF),a1
|
||
sll 16,a1
|
||
add a1,a0
|
||
move a0,*a13(OBJ_YPOS),L
|
||
|
||
|
||
move *a2(OBJ_XPOS),a0,L
|
||
move *a2(ATTACH_XOFF),a1
|
||
sll 16,a1
|
||
|
||
move *a2(FACING_DIR),a2
|
||
btst MOVE_RIGHT_BIT,a2
|
||
jrnz #add
|
||
neg a1
|
||
#add
|
||
add a1,a0
|
||
move a0,*a13(OBJ_XPOS),L
|
||
|
||
movk 1,a0 ;Z=0
|
||
|
||
#not_attached
|
||
rets
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* RETURNS: a0 = * closest opponent process
|
||
*
|
||
* TRASHES: a0
|
||
|
||
SUBR get_opp_process
|
||
|
||
move *a13(CLOSEST_NUM),a0
|
||
X32 a0
|
||
addi process_ptrs,a0
|
||
move *a0,a0,L
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* RETURNS: a0 = PLYRMODE of the closest opponent
|
||
*
|
||
* TRASHES: a0
|
||
|
||
SUBR get_opp_plyrmode
|
||
|
||
move *a13(CLOSEST_NUM),a0
|
||
X32 a0
|
||
addi process_ptrs,a0
|
||
move *a0,a0,L
|
||
move *a0(PLYRMODE),a0
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* ARGS: a0 = facing value (in binary form - 0,1,2,4,8)
|
||
*
|
||
* RETURNS: a0 = facing value (in linear form - 0,1,2,3 - 8)
|
||
*
|
||
|
||
SUBR convert_facing
|
||
|
||
X16 a0
|
||
addi #convert_table,a0
|
||
move *a0,a0
|
||
rets
|
||
|
||
#convert_table
|
||
.word 0 ;0 zip
|
||
.word 0 ;1 up
|
||
.word 4 ;2 down
|
||
.word 0 ;3 zip
|
||
.word 6 ;4 left
|
||
.word 7 ;5 up_left
|
||
.word 5 ;6 down_left
|
||
.word 0 ;7 zip
|
||
.word 2 ;8 right
|
||
.word 1 ;9 up_right
|
||
.word 3 ;10 down_right
|
||
.word 0 ;11 zip
|
||
.word 0 ;12 zip
|
||
.word 0 ;13 zip
|
||
.word 0 ;14 zip
|
||
.word 0 ;15 zip
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBRP init_joystat
|
||
|
||
clr a0
|
||
|
||
move a0,@round_tickcount
|
||
|
||
movi wrest_joystat,a1
|
||
movi 16*NUM_WRES,a2
|
||
#clr_loop
|
||
move a0,*a1+,L
|
||
dsj a2,#clr_loop
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* count active wrestler processes. Clear reduce_bog if there's two, set if
|
||
* there's more
|
||
|
||
SUBR init_reduce_bog
|
||
|
||
movi process_ptrs,a0
|
||
movi NUM_WRES,a1
|
||
clr a2
|
||
#lp move *a0+,a14,L
|
||
jrz #nxt
|
||
inc a2 ;got one.
|
||
#nxt dsj a1,#lp
|
||
|
||
;a2 is active wrestlers. sub 2 and stick it in reduce_bog
|
||
subk 2,a2
|
||
move a2,@reduce_bog
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBRP update_joystat
|
||
|
||
move @HALT,a0
|
||
jrnz #exit
|
||
|
||
; move a13,a0
|
||
; calla wres_get_stick_val_cur
|
||
move *a13(STICK_VAL_CUR),a0
|
||
movk 1100b,a8 ;mask out left & right
|
||
and a0,a8
|
||
sll 10-2,a8 ;shift to bit 10 & 11
|
||
|
||
move *a13(FACING_DIR),a14
|
||
btst MOVE_LEFT_BIT,a14
|
||
jrz #no_flip
|
||
X16 a0
|
||
addi #xflip_table,a0
|
||
move *a0,a0 ;flipped based on facing
|
||
#no_flip
|
||
or a0,a8 ;real L/R | flipped joy dirs
|
||
|
||
|
||
move a13,a0
|
||
calla wres_get_stick_val_up
|
||
move a0,a4
|
||
move a13,a0
|
||
calla wres_get_stick_val_down
|
||
or a4,a0
|
||
jrz #no_stick
|
||
|
||
move a8,a4 ;cur (flipped) stick vals
|
||
jrz #no_stick
|
||
|
||
callr #insert
|
||
|
||
#no_stick
|
||
|
||
move a13,a0
|
||
calla wres_get_but_val_down
|
||
move a0,a6
|
||
jrz #no_button
|
||
X16 a6
|
||
|
||
movk 5,a5 ;5 button bits
|
||
movk 10000b,a7 ;1st bit << 4 (to skip 4 joy bits)
|
||
#bit_loop
|
||
move a6,a0
|
||
and a7,a0 ;button down?
|
||
jrz #skip
|
||
move a0,a4
|
||
or a8,a4 ;+ cur (flipped) stick vals
|
||
callr #insert ;only 1 button per entry
|
||
#skip
|
||
sll 1,a7
|
||
dsj a5,#bit_loop
|
||
|
||
#no_button
|
||
|
||
#exit
|
||
rets
|
||
|
||
#insert
|
||
move @round_tickcount,a0
|
||
sll 16,a0
|
||
or a0,a4
|
||
|
||
move *a13(PLYRNUM),a0
|
||
sll 5+4,a0 ;PLYRNUM x32 x16
|
||
|
||
addi wrest_joystat + 32*15,a0 ;2nd last entry (after pre-dec)
|
||
move a0,a1
|
||
addk 32,a1 ;last entry (after pre-dec)
|
||
|
||
movk 15,a2 ;# entries - 1
|
||
#move_loop
|
||
move -*a0,-*a1,L ;move each entry down
|
||
dsj a2,#move_loop ;1 position
|
||
|
||
move a4,*a0,L ;time stamp : joy & buttons
|
||
rets
|
||
|
||
#xflip_table ;convert to forward / away if facing left
|
||
.word 0 ;0
|
||
.word J_UP ;1
|
||
.word J_DOWN ;2
|
||
.word 0 ;3
|
||
.word J_TOWARD ;4
|
||
.word J_UP_TOWARD ;5
|
||
.word J_DOWN_TOWARD ;6
|
||
.word 0 ;7
|
||
.word J_AWAY ;8
|
||
.word J_UP_AWAY ;9
|
||
.word J_DOWN_AWAY ;10
|
||
.word 0,0,0,0,0 ;11-15
|
||
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR clear_button_presses
|
||
|
||
movk 5,a1 ;5 buttons
|
||
move a13,a2
|
||
addi PUNCHB_COUNT,a2
|
||
clr a0
|
||
#loop
|
||
move a0,*a2+
|
||
dsj a1,#loop
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR count_button_presses
|
||
|
||
move a13,a0
|
||
calla wres_get_but_val_down
|
||
move a0,a0
|
||
jrz #exit
|
||
|
||
movk 5,a1 ;5 bits
|
||
move a13,a2
|
||
addi PUNCHB_COUNT,a2
|
||
#loop
|
||
srl 1,a0 ;button-->Carry
|
||
jrnc #no_but
|
||
|
||
move *a2,a14
|
||
inc a14
|
||
move a14,*a2
|
||
|
||
#no_but
|
||
addi 16,a2
|
||
dsj a1,#loop
|
||
|
||
#exit
|
||
rets
|
||
|
||
; WORD PUNCHB_COUNT ;0 <------
|
||
; WORD BLOCKB_COUNT ;1 keep |
|
||
; WORD SPUNCHB_COUN ;2 ordered|
|
||
; WORD KICK_COUNT ;3 |
|
||
; WORD SKICK_COUNT ;4 <------
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR direction_test
|
||
|
||
.if 0
|
||
;can put this in a mode
|
||
.ref direction_test
|
||
|
||
move *a13(PLYRNUM),a8
|
||
move *a13(CLOSEST_NUM),a9
|
||
|
||
CREATE 0,direction_test ;temp!!!!!!!!!!!
|
||
|
||
movi 424000h,a0
|
||
move a0,*a13(OBJ_YVEL),L
|
||
|
||
SETMODE INAIR
|
||
rets
|
||
.endif
|
||
|
||
|
||
;a8 = PLYRNUM
|
||
;a9 = CLOSEST_NUM
|
||
|
||
move a8,*a13(PLYRNUM)
|
||
move a9,*a13(CLOSEST_NUM)
|
||
|
||
X32 a8
|
||
addi process_ptrs,a8
|
||
move *a8,a10,L
|
||
|
||
X32 a9
|
||
addi process_ptrs,a9
|
||
move *a9,a11,L
|
||
|
||
move *a10(OBJ_XPOS),*a13(OBJ_XPOS),L
|
||
move *a10(OBJ_YPOS),*a13(OBJ_YPOS),L
|
||
move *a10(OBJ_ZPOS),*a13(OBJ_ZPOS),L
|
||
|
||
|
||
|
||
move *a10(OBJ_XPOS),a0,L
|
||
move *a11(OBJ_XPOS),a1,L
|
||
sub a0,a1
|
||
movi TSEC,a0
|
||
divs a0,a1 ;a1 / a0
|
||
move a1,*a13(OBJ_XVEL),L
|
||
|
||
|
||
move *a10(OBJ_ZPOS),a0,L
|
||
move *a11(OBJ_ZPOS),a1,L
|
||
sub a0,a1
|
||
movi TSEC,a0
|
||
divs a0,a1 ;a1 / a0
|
||
move a1,*a13(OBJ_ZVEL),L
|
||
|
||
|
||
|
||
clr a0
|
||
move a0,*a13(OBJ_YVEL),L
|
||
|
||
; move a0,*a13(OBJ_XVEL),L
|
||
; move a0,*a13(OBJ_ZVEL),L
|
||
|
||
clr a0 ;x pos
|
||
clr a1 ;y pos
|
||
movi D2ST2B03,a2 ;* image
|
||
movk 20,a3 ;z pos
|
||
movi DMAWNZ|M_3D,a4 ;DMA flags
|
||
move a4,*a13(OBJ_CONTROL)
|
||
clr a5 ;object ID
|
||
clr a6 ;x vel
|
||
clr a7 ;y vel
|
||
calla BEGINOBJ
|
||
|
||
movi TSEC,a0
|
||
#loop
|
||
PUSHP a0
|
||
|
||
;velocity add
|
||
move *a13(OBJ_XPOS),a0,L
|
||
move *a13(OBJ_XVEL),a1,L
|
||
add a1,a0
|
||
move a0,*a13(OBJ_XPOS),L
|
||
|
||
move *a13(OBJ_YPOS),a0,L
|
||
move *a13(OBJ_YVEL),a1,L
|
||
add a1,a0
|
||
jrnn #yok
|
||
clr a0
|
||
#yok
|
||
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
|
||
|
||
|
||
|
||
|
||
|
||
;image plot
|
||
move *a13(OBJ_XPOS),a5,L ;x val
|
||
|
||
movi Y_SCALE_MULTIPLIER,a0
|
||
move *a13(OBJ_ZPOSINT),a1
|
||
mpys a0,a1
|
||
move a1,a6 ;y val
|
||
|
||
move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops
|
||
|
||
move a6,*a8(OYVAL),L ;keep updating YVAL to keep priorities
|
||
|
||
move a5,*a8(OXVAL),L
|
||
move a6,*a8(OYVAL),L
|
||
|
||
movi [20,0],a1 ;z pos
|
||
move a1,*a8(OZVAL),L
|
||
|
||
setf 6,0,0
|
||
move a7,*a8(OCTRL) ;Write 6 low bits
|
||
setf 16,1,0
|
||
|
||
|
||
SLEEPK 1
|
||
|
||
PULLP a0
|
||
dsj a0,#loop
|
||
|
||
calla DELOBJA8
|
||
|
||
DIE
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* a11 = * secret move table
|
||
* a13 = * wrestler process
|
||
|
||
SUBR check_secret_moves
|
||
|
||
move *a13(IMMOBILIZE_TIME),a14
|
||
jrnz #done
|
||
|
||
move *a13(PLYRMODE),a14
|
||
cmpi MODE_DIZZY,a14
|
||
jreq #done
|
||
cmpi MODE_WAITANIM,a14
|
||
jreq #done
|
||
|
||
;No secret moves if getup time is set - out of control runs, etc.
|
||
move *a13(GETUP_TIME),a14
|
||
jrnz #done
|
||
|
||
move *a11+,a0,L ;button hold test code
|
||
call a0
|
||
jrc #done
|
||
|
||
move *a13(PLYRNUM),a10
|
||
sll 5+4,a10 ;PLYRNUM x32 x16
|
||
addi wrest_joystat,a10
|
||
|
||
;only check if newest entry in queue is fresh
|
||
move *a10(10h),a0 ;time stamp
|
||
move @round_tickcount,a1
|
||
cmp a0,a1
|
||
jrne #done
|
||
|
||
|
||
#next_table
|
||
.align
|
||
move *a11+,a2,L
|
||
jrz #done
|
||
move a10,a9
|
||
|
||
movk 8,a3 ;only skip 8 masked entries
|
||
|
||
;the first entry in the queue requires a special check...
|
||
move *a2,a0 ;value
|
||
move *a2(10h),a1 ;mask
|
||
move *a9,a14,L
|
||
andi 0ffffh,a14 ;queue head
|
||
andn a1,a14 ;apply mask
|
||
|
||
;if the mask leaves nothing behind, then there's noise since the
|
||
; final (trigger) move, so blow it off.
|
||
jrz #next_table
|
||
|
||
#loop
|
||
move *a2+,a0
|
||
jrn #match
|
||
move *a2+,a1 ;mask
|
||
#skip
|
||
|
||
;check for end of table (16 entries)
|
||
|
||
move *a9+,a7,L
|
||
move a7,a8
|
||
srl 16,a7 ;round tick count
|
||
andi 0ffffh,a8 ;joy+buttons
|
||
andn a1,a8
|
||
dsjeq a3,#skip
|
||
|
||
cmp a0,a8
|
||
jreq #loop
|
||
|
||
#failed
|
||
jruc #next_table
|
||
|
||
#done
|
||
rets
|
||
|
||
#match
|
||
;skip it if we're a zombie
|
||
move *a13(STATUS_FLAGS),a14
|
||
btst B_ZOMBIE,a14
|
||
jrnz #done
|
||
|
||
andi 07fffh,a0 ;clear out sign bit
|
||
move @round_tickcount,a1
|
||
andi 0ffffh,a1 ;clear out sign extend
|
||
sub a7,a1
|
||
cmp a0,a1 ;below count?
|
||
jrgt #failed
|
||
|
||
move *a2,a0,L ;code to execute
|
||
jump a0
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* sets animations for legs & torso based on facing & move direction
|
||
*
|
||
|
||
SUBR change_walk_anim
|
||
|
||
clr a0
|
||
move a0,*a13(CONSECUTIVE_HITS)
|
||
;Fix walking speeds!
|
||
;Did I do a taunt to achieve high risk move bonus?
|
||
move *a13(RISK),a14
|
||
btst 15,a14
|
||
jrnz #taunted
|
||
clr a0
|
||
move a0,*A13(RISK)
|
||
#taunted
|
||
move *a13(WALK_FAST),a0
|
||
jrnz #fast
|
||
|
||
callr get_opp_process
|
||
move *a0(PLYRMODE),a0 ;don't slow down if backing
|
||
cmpi MODE_ONGROUND,a0 ;away from a downed opponent
|
||
jrnz #notgrnd
|
||
#fast
|
||
movi 0cdh,a0 ;fast legs
|
||
jruc #go_spd
|
||
|
||
#notgrnd
|
||
movi 100h,a0 ;normal speed
|
||
|
||
#go_spd
|
||
move a0,*a13(ANI_SPEED)
|
||
move *a13(ANIMODE2),a0
|
||
btst MODE_UNINT_BIT,a0
|
||
jrnz #no_interrupt
|
||
|
||
move *a13(FACING_DIR),a0
|
||
callr convert_facing ;(0-7)
|
||
srl 1,a0 ;only uses diagonals (0-3)
|
||
X4 a0
|
||
move a0,a1
|
||
|
||
move *a13(NEW_FACING_DIR),a0
|
||
callr convert_facing ;(0-7)
|
||
srl 1,a0 ;only uses diagonals (0-3)
|
||
add a1,a0
|
||
X32 a0
|
||
|
||
move *a13(WRESTLERNUM),a14
|
||
X32 a14
|
||
addi #wres_torso_anims,a14
|
||
move *a14,a14,L ;* torso anim table
|
||
add a14,a0
|
||
|
||
move *a0,a0,L
|
||
calla change_anim2 ;torso
|
||
|
||
#no_interrupt
|
||
|
||
move *a13(MOVE_DIR),a0
|
||
callr convert_facing ;(0-7)
|
||
X8 a0
|
||
move a0,a1
|
||
|
||
move *a13(FACING_DIR),a0
|
||
callr convert_facing ;(0-7)
|
||
add a1,a0
|
||
X32 a0
|
||
|
||
move *a13(WRESTLERNUM),a14
|
||
X32 a14
|
||
addi #wres_leg_anims,a14
|
||
move *a14,a14,L ;* leg anim table
|
||
add a14,a0
|
||
|
||
move *a0,a0,L ;* new animation
|
||
calla change_anim1 ;legs
|
||
|
||
#rets rets
|
||
|
||
|
||
.ref bam_torso_anims_table,bam_leg_anims_table
|
||
.ref dnk_torso_anims_table,dnk_leg_anims_table
|
||
.ref hrt_torso_anims_table,hrt_leg_anims_table
|
||
.ref lex_torso_anims_table,lex_leg_anims_table
|
||
.ref rzr_torso_anims_table,rzr_leg_anims_table
|
||
.ref shn_torso_anims_table,shn_leg_anims_table
|
||
.ref und_torso_anims_table,und_leg_anims_table
|
||
.ref yok_torso_anims_table,yok_leg_anims_table
|
||
|
||
#wres_torso_anims
|
||
.long hrt_torso_anims_table ;0 Bret Hart
|
||
.long rzr_torso_anims_table ;1 Razor Ramon
|
||
.long und_torso_anims_table ;2 Undertaker
|
||
.long yok_torso_anims_table ;3 Yokozuna
|
||
.long shn_torso_anims_table ;4 Shawn Michaels
|
||
.long bam_torso_anims_table ;5 Bam Bam
|
||
.long dnk_torso_anims_table ;6 Doink
|
||
.long dnk_torso_anims_table ;7 spare
|
||
.long lex_torso_anims_table ;8 Lex Luger
|
||
.long 0 ;9 Referee
|
||
|
||
#wres_leg_anims
|
||
.long hrt_leg_anims_table ;0 Bret Hart
|
||
.long rzr_leg_anims_table ;1 Razor Ramon
|
||
.long und_leg_anims_table ;2 Undertaker
|
||
.long yok_leg_anims_table ;3 Yokozuna
|
||
.long shn_leg_anims_table ;4 Shawn Michaels
|
||
.long bam_leg_anims_table ;5 Bam Bam
|
||
.long dnk_leg_anims_table ;6 Doink
|
||
.long dnk_leg_anims_table ;7 spare
|
||
.long lex_leg_anims_table ;8 Lex Luger
|
||
.long 0 ;9 Referee
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* returns: A0 = rotation anim based on NEW_FACING_DIR & FACING_DIR
|
||
*
|
||
* goes into stance anim if already facing if NEW_FACING = FACING
|
||
|
||
SUBR set_rotate_anim
|
||
|
||
move *a13(FACING_DIR),a0
|
||
calla convert_facing ;(0-7)
|
||
srl 1,a0 ;only uses diagonals (0-3)
|
||
X4 a0
|
||
move a0,a1
|
||
|
||
move *a13(NEW_FACING_DIR),a0
|
||
calla convert_facing ;(0-7)
|
||
srl 1,a0 ;only uses diagonals (0-3)
|
||
add a1,a0
|
||
X32 a0
|
||
|
||
move *a13(WRESTLERNUM),a14
|
||
X32 a14
|
||
addi #wres_rotate_anims,a14
|
||
move *a14,a14,L ;* rotate anim table
|
||
add a14,a0
|
||
|
||
move *a13(NEW_FACING_DIR),a14
|
||
move a14,*a13(FACING_DIR)
|
||
|
||
move *a0,a0,L
|
||
;;; calla change_anim1
|
||
|
||
rets
|
||
|
||
|
||
.ref bam_rotate_anims_table
|
||
.ref dnk_rotate_anims_table
|
||
.ref hrt_rotate_anims_table
|
||
.ref lex_rotate_anims_table
|
||
.ref rzr_rotate_anims_table
|
||
.ref shn_rotate_anims_table
|
||
.ref und_rotate_anims_table
|
||
.ref yok_rotate_anims_table
|
||
|
||
#wres_rotate_anims
|
||
.long hrt_rotate_anims_table ;0 Bret Hart
|
||
.long rzr_rotate_anims_table ;1 Razor Ramon
|
||
.long und_rotate_anims_table ;2 Undertaker
|
||
.long yok_rotate_anims_table ;3 Yokozuna
|
||
.long shn_rotate_anims_table ;4 Shawn Michaels
|
||
.long bam_rotate_anims_table ;5 Bam Bam
|
||
.long dnk_rotate_anims_table ;6 Doink
|
||
.long dnk_rotate_anims_table ;7 spare
|
||
.long lex_rotate_anims_table ;8 Lex Luger
|
||
.long 0 ;9 Referee
|
||
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR bounce_off_ropes
|
||
|
||
|
||
move *a13(INRING),a0
|
||
jrnz #outside
|
||
|
||
move *a13(WRESTLERNUM),a14
|
||
X16 a14
|
||
addi #bounce_xoffsets,a14
|
||
move *a14,a14
|
||
|
||
|
||
move *a13(MOVE_DIR),a0
|
||
btst PLAYER_RIGHT_BIT,a0
|
||
jrnz #right
|
||
;#left
|
||
movi vln_left_rope,a6
|
||
callr calc_line_x
|
||
sub a14,a0
|
||
move *a13(OBJ_COLLX1),a1
|
||
cmp a0,a1 ;a0-a1
|
||
jrle #bounce
|
||
rets
|
||
|
||
#right
|
||
movi vln_right_rope,a6
|
||
callr calc_line_x
|
||
add a14,a0
|
||
move *a13(OBJ_COLLX2),a1
|
||
cmp a0,a1 ;a0-a1
|
||
jrle #no_bounce
|
||
|
||
#bounce
|
||
;;; move a0,*a13(OBJ_XPOSINT)
|
||
|
||
|
||
MOVE *A13(GETUP_TIME),A0
|
||
JRNZ ALREADY_DONE_RISK_MESS
|
||
|
||
move *a13(RISK),A0
|
||
JRNZ ALREADY_DONE_RISK_MESS
|
||
|
||
;Time to execute high-risk move!
|
||
MOVI 60,A0
|
||
MOVE A0,*A13(RISK)
|
||
|
||
ALREADY_DONE_RISK_MESS
|
||
|
||
move *a13(WRESTLERNUM),a14
|
||
X32 a14
|
||
addi #bounce_anims,a14
|
||
move *a14,a0,L ;* bounce anim
|
||
calla change_anim1a
|
||
SETMODE BOUNCING
|
||
|
||
#no_bounce
|
||
#outside
|
||
rets
|
||
|
||
|
||
.ref bam_bounce_anim
|
||
.ref dnk_bounce_anim
|
||
.ref hrt_bounce_anim
|
||
.ref lex_bounce_anim
|
||
.ref rzr_bounce_anim
|
||
.ref shn_bounce_anim
|
||
.ref und_bounce_anim
|
||
.ref yok_bounce_anim
|
||
|
||
#bounce_xoffsets
|
||
.word -20 ;0 Bret Hart
|
||
.word -20 ;1 Razor Ramon
|
||
.word -20 ;2 Undertaker
|
||
.word -20 ;3 Yokozuna
|
||
.word 0 ;4 Shawn Michaels
|
||
.word -30 ;5 Bam Bam
|
||
.word -20 ;6 Doink
|
||
.word -20 ;7 spare
|
||
.word -20 ;8 Lex Luger
|
||
.word 0 ;9 Referee
|
||
|
||
#bounce_anims
|
||
.long hrt_bounce_anim ;0 Bret Hart
|
||
.long rzr_bounce_anim ;1 Razor Ramon
|
||
.long und_bounce_anim ;2 Undertaker
|
||
.long yok_bounce_anim ;3 Yokozuna
|
||
.long shn_bounce_anim ;4 Shawn Michaels
|
||
.long bam_bounce_anim ;5 Bam Bam
|
||
.long dnk_bounce_anim ;6 Doink
|
||
.long dnk_bounce_anim ;7 spare
|
||
.long lex_bounce_anim ;8 Lex Luger
|
||
.long dnk_bounce_anim ;9 Referee
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR execute_walk
|
||
|
||
;Do a step sound every 32 ticks if we're walking. (whether or not
|
||
; INTURN bit is set)
|
||
move *a13(MOVE_DIR),a0
|
||
JRZ NO_SOUND_CALL
|
||
MOVE @PCNT,A0
|
||
ANDI 31,A0
|
||
JRNZ NO_SOUND_CALL
|
||
CALLA WALK_SOUND
|
||
NO_SOUND_CALL
|
||
|
||
;if our INTURN bit is set, we're doing a turn and we shouldn't do
|
||
; anything here -- treat it like UNINT.
|
||
|
||
move *a13(ANIMODE),a14
|
||
btst MODE_INTURN_BIT,a14
|
||
jrnz #inturn
|
||
|
||
move *a13(ANIMODE2),a14
|
||
btst MODE_INTURN_BIT,a14
|
||
jrnz #inturn
|
||
|
||
clr a0
|
||
move a0,*a13(ATTACK_TYPE)
|
||
|
||
move *a13(MOVE_DIR),a0
|
||
|
||
X32 a0
|
||
addi #walk_table,a0
|
||
move *a0,a0,L
|
||
call a0
|
||
|
||
#rets rets
|
||
|
||
#inturn move *a13(MOVE_DIR),a0
|
||
jrnz #rets
|
||
|
||
;stick at rest - clear any velocity we might have lying around
|
||
move a0,*a13(OBJ_XVEL),L
|
||
move a0,*a13(OBJ_ZVEL),L
|
||
|
||
rets
|
||
|
||
#walk_table
|
||
.long #zip ;0
|
||
.long #up ;1
|
||
.long #down ;2
|
||
.long #zip ;3
|
||
.long #left ;4
|
||
.long #up_left ;5
|
||
.long #down_left ;6
|
||
.long #zip ;7
|
||
.long #right ;8
|
||
.long #up_right ;9
|
||
.long #down_right ;10
|
||
.long #zip ;11
|
||
.long #zip ;12
|
||
.long #zip ;13
|
||
.long #zip ;14
|
||
.long #zip ;15
|
||
|
||
|
||
;All these routines set MOVE_DIR. However, the above code chooses the
|
||
; routine to execute based on MOVE_DIR, so they just end up stuffing the
|
||
; same value that's already there. Wuzzup wit' that? - JS
|
||
|
||
************
|
||
#zip ;(#0)
|
||
#do_stance
|
||
|
||
clr a0
|
||
move a0,*a13(MOVE_DIR)
|
||
move a0,*a13(OBJ_XVEL),L
|
||
move a0,*a13(OBJ_ZVEL),L
|
||
|
||
callr set_rotate_anim ;or stance
|
||
calla change_anim1
|
||
rets
|
||
|
||
************
|
||
#up ;(#1)
|
||
|
||
movk MOVE_UP,a0
|
||
move a0,*a13(MOVE_DIR)
|
||
|
||
callr set_velocities
|
||
callr change_walk_anim
|
||
|
||
rets
|
||
|
||
|
||
************
|
||
#up_right ;(#2)
|
||
|
||
move *a13(OBJ_CONTROL),a0
|
||
andni M_FLIPH,a0
|
||
move a0,*a13(OBJ_CONTROL)
|
||
|
||
; move *a13(CAN_MOVE_DIR),a0
|
||
; btst MOVE_RIGHT_BIT,a0
|
||
; jrnz #up
|
||
; btst MOVE_UP_BIT,a0
|
||
; jrnz #right
|
||
|
||
movk MOVE_UP_RIGHT,a0
|
||
move a0,*a13(MOVE_DIR)
|
||
|
||
callr set_velocities
|
||
callr change_walk_anim
|
||
rets
|
||
|
||
|
||
************
|
||
#right ;(#3)
|
||
|
||
move *a13(OBJ_CONTROL),a0
|
||
andni M_FLIPH,a0
|
||
move a0,*a13(OBJ_CONTROL)
|
||
|
||
movk MOVE_RIGHT,a0
|
||
move a0,*a13(MOVE_DIR)
|
||
|
||
callr set_velocities
|
||
callr change_walk_anim
|
||
rets
|
||
|
||
|
||
************
|
||
#down_right ;(#4)
|
||
|
||
move *a13(OBJ_CONTROL),a0
|
||
andni M_FLIPH,a0
|
||
move a0,*a13(OBJ_CONTROL)
|
||
|
||
move *a13(CAN_MOVE_DIR),a0
|
||
btst MOVE_DOWN_BIT,a0
|
||
jrnz #right
|
||
|
||
movk MOVE_DOWN_RIGHT,a0
|
||
move a0,*a13(MOVE_DIR)
|
||
|
||
callr set_velocities
|
||
callr change_walk_anim
|
||
rets
|
||
|
||
|
||
************
|
||
#down ;(#5)
|
||
|
||
movk MOVE_DOWN,a0
|
||
move a0,*a13(MOVE_DIR)
|
||
|
||
callr set_velocities
|
||
callr change_walk_anim
|
||
rets
|
||
|
||
|
||
************
|
||
#down_left ;(#6)
|
||
|
||
move *a13(OBJ_CONTROL),a0
|
||
ori M_FLIPH,a0
|
||
move a0,*a13(OBJ_CONTROL)
|
||
|
||
move *a13(CAN_MOVE_DIR),a0
|
||
btst MOVE_DOWN_BIT,a0
|
||
jrnz #left
|
||
|
||
movk MOVE_DOWN_LEFT,a0
|
||
move a0,*a13(MOVE_DIR)
|
||
|
||
callr set_velocities
|
||
callr change_walk_anim
|
||
rets
|
||
|
||
|
||
************
|
||
#left ;(#7)
|
||
|
||
move *a13(OBJ_CONTROL),a0
|
||
ori M_FLIPH,a0
|
||
move a0,*a13(OBJ_CONTROL)
|
||
|
||
movk MOVE_LEFT,a0
|
||
move a0,*a13(MOVE_DIR)
|
||
|
||
callr set_velocities
|
||
callr change_walk_anim
|
||
rets
|
||
|
||
|
||
************
|
||
#up_left ;(#8)
|
||
|
||
move *a13(OBJ_CONTROL),a0
|
||
ori M_FLIPH,a0
|
||
move a0,*a13(OBJ_CONTROL)
|
||
|
||
; move *a13(CAN_MOVE_DIR),a0
|
||
; btst MOVE_LEFT_BIT,a0
|
||
; jrnz #up
|
||
; btst MOVE_UP_BIT,a0
|
||
; jrnz #left
|
||
|
||
movk MOVE_UP_LEFT,a0
|
||
move a0,*a13(MOVE_DIR)
|
||
|
||
callr set_velocities
|
||
callr change_walk_anim
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* sets X & Z velocites based on MOVE_DIR
|
||
*
|
||
|
||
;MULT equ 256*75/100 ;25% reduction when moving backward
|
||
|
||
|
||
;MULT equ 256*100/100 ;0% reduction when moving backward
|
||
MULT equ 256*90/100 ;10% reduction when moving backward
|
||
GRND_MULT equ 256*150/100 ;50% addition when opponent is on ground
|
||
|
||
|
||
SUBRP set_velocities
|
||
|
||
|
||
move *a13(MOVE_DIR),a0
|
||
callr convert_facing
|
||
X64 a0
|
||
|
||
move *a13(WRESTLERNUM),a2
|
||
X32 a2
|
||
addi #wres_velocity_tables,a2
|
||
|
||
move *a2,a2,L ;* velocity table
|
||
add a0,a2
|
||
move *a2+,a1,L
|
||
|
||
move *a13(WALK_FAST),a0
|
||
jrnz #ongrnd
|
||
|
||
callr get_opp_process
|
||
move *a0(PLYRMODE),a0 ;don't slow down if backing
|
||
cmpi MODE_ONGROUND,a0 ;away from a downed opponent
|
||
jreq #ongrnd
|
||
|
||
cmpi MODE_DEAD,a0 ;away from a dead opponent
|
||
jreq #ongrnd
|
||
|
||
move *a13(MOVE_DIR),a3
|
||
move *a13(FACING_DIR),a4
|
||
|
||
move a3,a14
|
||
or a4,a14
|
||
andi MOVE_LEFT|MOVE_RIGHT,a14
|
||
cmpi MOVE_LEFT|MOVE_RIGHT,a14 ;move opposite to facing?
|
||
jrne #not_back_x
|
||
|
||
movi MULT,a0
|
||
mpys a0,a1
|
||
sra 8,a1
|
||
jruc #not_back_x
|
||
#ongrnd
|
||
movi GRND_MULT,a0
|
||
mpys a0,a1
|
||
sra 8,a1
|
||
|
||
#not_back_x
|
||
move a1,*a13(OBJ_XVEL),L
|
||
|
||
|
||
move *a2,a1,L
|
||
move a3,a14 ;move_dir
|
||
or a4,a14 ;facing dir
|
||
andi MOVE_UP|MOVE_DOWN,a14
|
||
cmpi MOVE_UP|MOVE_DOWN,a14 ;move opposite to facing?
|
||
jrne #not_back_y
|
||
|
||
movi MULT,a0
|
||
mpys a0,a1
|
||
sra 8,a1
|
||
|
||
#not_back_y
|
||
move a1,*a13(OBJ_ZVEL),L
|
||
|
||
rets
|
||
|
||
|
||
.ref bam_velocity_table
|
||
.ref dnk_velocity_table
|
||
.ref hrt_velocity_table
|
||
.ref lex_velocity_table
|
||
.ref rzr_velocity_table
|
||
.ref shn_velocity_table
|
||
.ref und_velocity_table
|
||
.ref yok_velocity_table
|
||
|
||
#wres_velocity_tables
|
||
.long hrt_velocity_table ;0 Bret Hart
|
||
.long rzr_velocity_table ;1 Razor Ramon
|
||
.long und_velocity_table ;2 Undertaker
|
||
.long yok_velocity_table ;3 Yokozuna
|
||
.long shn_velocity_table ;4 Shawn Michaels
|
||
.long bam_velocity_table ;5 Bam Bam
|
||
.long dnk_velocity_table ;6 Doink
|
||
.long dnk_velocity_table ;7 spare
|
||
.long lex_velocity_table ;8 Lex Luger
|
||
.long 0 ;9 referee
|
||
|
||
|
||
;#*****************************************************************************
|
||
;*
|
||
;* RETURNS: a0 = boundary
|
||
;*
|
||
; SUBRP check_move_up
|
||
;
|
||
; move *a13(INRING),a0
|
||
; jrnz #outring
|
||
;
|
||
; movi RING_TOP,a0
|
||
; move *a13(OBJ_ZPOSINT),a1
|
||
; cmp a0,a1
|
||
; jrle #fail
|
||
; clrc
|
||
; rets
|
||
;
|
||
;#outring
|
||
; movi ARENA_TOP,a0
|
||
; move *a13(OBJ_ZPOSINT),a1
|
||
; cmp a0,a1
|
||
; jrle #fail
|
||
;
|
||
; movi box_matedge2,a10
|
||
; callr get_box_overlap
|
||
; move a1,a1 ;z overlap
|
||
; jrp #fail2
|
||
;
|
||
; clrc
|
||
; rets
|
||
;
|
||
;#fail2
|
||
; move *a13(OBJ_ZPOSINT),a0
|
||
; dec a1
|
||
; add a1,a0
|
||
;
|
||
;#fail
|
||
; setc
|
||
; rets
|
||
;
|
||
;#*****************************************************************************
|
||
;*
|
||
;* RETURNS: a0 = boundary
|
||
;*
|
||
; SUBRP check_move_down
|
||
;
|
||
; move *a13(INRING),a0
|
||
; jrnz #outring
|
||
;
|
||
; movi RING_BOT,a0
|
||
; move *a13(OBJ_ZPOSINT),a1
|
||
; cmp a0,a1
|
||
; jrge #fail
|
||
; clrc
|
||
; rets
|
||
;
|
||
;#outring
|
||
; movi ARENA_BOT,a0
|
||
; move *a13(OBJ_ZPOSINT),a1
|
||
; cmp a0,a1
|
||
; jrge #fail
|
||
;
|
||
; movi box_matedge2,a10
|
||
; callr get_box_overlap
|
||
; move a1,a1 ;z overlap
|
||
; jrn #fail2
|
||
;
|
||
; clrc
|
||
; rets
|
||
;
|
||
;#fail2
|
||
; move *a13(OBJ_ZPOSINT),a0
|
||
; inc a1
|
||
; add a1,a0
|
||
;#fail
|
||
; setc
|
||
; rets
|
||
;
|
||
;#*****************************************************************************
|
||
;*
|
||
;* RETURNS: a0 = boundary
|
||
;*
|
||
; SUBRP check_move_left
|
||
;
|
||
; move *a13(INRING),a0
|
||
; jrnz #outring
|
||
;
|
||
; move *a13(OBJ_XPOSINT),a5
|
||
; movi vln_left_rope,a6
|
||
; move *a6,a0 ;x1
|
||
; cmp a0,a5 ;xpos - x1
|
||
; jrge #ok
|
||
; callr calc_line_x
|
||
; cmp a0,a5 ;xpos - a0
|
||
; jrle #fail
|
||
;#ok
|
||
; clrc
|
||
; rets
|
||
;
|
||
;#outring
|
||
; move *a13(OBJ_XPOSINT),a5
|
||
; movi vln_left_fence,a6
|
||
; move *a6,a0 ;x1
|
||
; cmp a0,a5 ;xpos - x1
|
||
; jrge #ok2
|
||
; callr calc_line_x
|
||
; jrz #outrange
|
||
; cmp a0,a5 ;xpos - a0
|
||
; jrle #fail
|
||
;#outrange
|
||
;#ok2
|
||
; movi box_matedge2,a10
|
||
; callr get_box_overlap
|
||
; move a0,a0 ;x overlap
|
||
; jrp #fail2
|
||
;
|
||
; clrc
|
||
; rets
|
||
;
|
||
;#fail2
|
||
; move *a13(OBJ_XPOSINT),a1
|
||
; dec a0
|
||
; add a1,a0
|
||
;#fail
|
||
; setc
|
||
; rets
|
||
;
|
||
;#*****************************************************************************
|
||
;*
|
||
;* RETURNS: a0 = boundary
|
||
;*
|
||
; SUBRP check_move_right
|
||
;
|
||
; move *a13(INRING),a0
|
||
; jrnz #outring
|
||
;
|
||
; move *a13(OBJ_XPOSINT),a5
|
||
; movi vln_right_rope,a6
|
||
; move *a6,a0 ;x1
|
||
; cmp a0,a5 ;xpos - x1
|
||
; jrle #ok
|
||
; callr calc_line_x
|
||
; cmp a0,a5 ;xpos - a0
|
||
; jrge #fail
|
||
;#ok
|
||
; clrc
|
||
; rets
|
||
;
|
||
;#outring
|
||
; move *a13(OBJ_XPOSINT),a5
|
||
; movi vln_right_fence,a6
|
||
; move *a6,a0 ;x1
|
||
; cmp a0,a5 ;xpos - x1
|
||
; jrle #ok2
|
||
; callr calc_line_x
|
||
; jrz #outrange
|
||
; cmp a0,a5 ;xpos - a0
|
||
; jrge #fail
|
||
;#ok2
|
||
;#outrange
|
||
; movi box_matedge2,a10
|
||
; callr get_box_overlap
|
||
; move a0,a0 ;x overlap
|
||
; jrn #fail2
|
||
;
|
||
; clrc
|
||
; rets
|
||
;
|
||
;#fail2
|
||
; move *a13(OBJ_XPOSINT),a1
|
||
; inc a0
|
||
; add a1,a0
|
||
;#fail
|
||
; setc
|
||
; rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* ARGS: a10 = * box
|
||
*
|
||
* RETURNS: a0 = signed x offset (left overlap < 0 < right overlap)
|
||
* a1 = signed z offset (top overlap < 0 < bot overlap)
|
||
|
||
SUBR get_box_overlap
|
||
|
||
|
||
move *a10(20h),a6,L
|
||
callr calc_line_x
|
||
move a0,a0
|
||
jrz #outrange
|
||
PUSH a0
|
||
|
||
move *a10,a6,L
|
||
callr calc_line_x
|
||
move a0,a0 ;left
|
||
jrz #outrange
|
||
PULL a1 ;right
|
||
|
||
move *a13(OBJ_XPOSINT),a4
|
||
sub a4,a0 ;left-xpos
|
||
jrgt #outside
|
||
neg a0
|
||
|
||
sub a4,a1 ;right-xpos
|
||
jrlt #outside
|
||
|
||
move *a13(OBJ_ZPOSINT),a2
|
||
move a2,a3
|
||
move *a6(10h),a4 ;z top
|
||
sub a4,a2 ;zpos-top
|
||
jrlt #outside
|
||
|
||
move *a6(30h),a4 ;z bot
|
||
sub a4,a3 ;zpos-bot
|
||
jrgt #outside
|
||
neg a3
|
||
|
||
|
||
|
||
cmp a0,a1 ;right - left
|
||
jrlt #right_min
|
||
|
||
;left_min
|
||
cmp a2,a0 ;left - top
|
||
jrgt #top_min
|
||
cmp a3,a0 ;left - bot
|
||
jrgt #bot_min
|
||
|
||
neg a0 ;xoff
|
||
clr a1 ;zoff
|
||
rets
|
||
|
||
#right_min
|
||
cmp a2,a1 ;right - top
|
||
jrgt #top_min
|
||
cmp a3,a1 ;right - bot
|
||
jrgt #bot_min
|
||
|
||
move a1,a0 ;xoff
|
||
clr a1 ;zoff
|
||
rets
|
||
|
||
#top_min
|
||
cmp a3,a2 ;top - bot
|
||
jrgt #bot_min
|
||
|
||
neg a2
|
||
move a2,a1 ;zoff
|
||
clr a0 ;xoff
|
||
rets
|
||
|
||
#bot_min
|
||
cmp a2,a3 ;bot - top
|
||
jrgt #top_min
|
||
|
||
move a3,a1 ;zoff
|
||
clr a0 ;xoff
|
||
rets
|
||
|
||
#outside
|
||
#outrange
|
||
clr a0
|
||
clr a1
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR get_rope_x
|
||
|
||
PUSH a6
|
||
|
||
movi vln_right_rope,a6
|
||
move *a13(OBJ_XPOSINT),a0
|
||
cmpi RING_X_CENTER,a0
|
||
jrgt #right
|
||
movi vln_left_rope,a6
|
||
#right
|
||
callr calc_line_x
|
||
PULL a6
|
||
rets
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* ARGUMENTS: a6 = * line table
|
||
*
|
||
* RETURNS: a0 = x-val of line at player ZPOS
|
||
* a0 = 0 if out of range in Z
|
||
*
|
||
* TRASHES: a0,a1
|
||
|
||
|
||
SUBR calc_line_x
|
||
|
||
move *a13(OBJ_ZPOSINT),a1
|
||
|
||
move *a6(30h),a0 ;z2
|
||
cmp a0,a1 ;zpos - z2
|
||
jrgt #outrange ;below
|
||
|
||
move *a6(10h),a0 ;z1
|
||
sub a0,a1 ;zpos - z1
|
||
jrlt #outrange ;above
|
||
|
||
X16 a1
|
||
add a6,a1
|
||
move *a1(40h),a0 ;skip 4 word header
|
||
rets
|
||
#outrange
|
||
clr a0
|
||
rets
|
||
|
||
SUBR set_up_line_tables
|
||
movi vln_right_rope_r,a1
|
||
movi vln_right_rope,a0
|
||
callr setup_each_right_table
|
||
movi vln_left_rope_r,a1
|
||
movi vln_left_rope,a0
|
||
callr setup_each_left_table
|
||
movi vln_right_matedge_r,a1
|
||
movi vln_right_matedge,a0
|
||
callr setup_each_right_table
|
||
movi vln_left_matedge_r,a1
|
||
movi vln_left_matedge,a0
|
||
callr setup_each_left_table
|
||
movi vln_right_matedge2_r,a1
|
||
movi vln_right_matedge2,a0
|
||
callr setup_each_right_table
|
||
movi vln_left_matedge2_r,a1
|
||
movi vln_left_matedge2,a0
|
||
callr setup_each_left_table
|
||
movi vln_right_fence_r,a1
|
||
movi vln_right_fence,a0
|
||
callr setup_each_right_table
|
||
movi vln_left_fence_r,a1
|
||
movi vln_left_fence,a0
|
||
|
||
setup_each_left_table
|
||
move *a1(0),*a0+,L
|
||
move *a1(020h),*a0+,L
|
||
move *a1(040h),a2
|
||
inc a2
|
||
move *a1(050h),a3
|
||
move *a1(0h),a4
|
||
sll 16,a4
|
||
move a2,a7
|
||
sll 16,a3
|
||
divs a7,a3
|
||
#write_next_val_l
|
||
sub a3,a4
|
||
move a4,a6
|
||
srl 16,a6
|
||
move a6,*a0+
|
||
dsjs a2,#write_next_val_l
|
||
|
||
rets
|
||
|
||
setup_each_right_table
|
||
move *a1(0),*a0+,L
|
||
move *a1(020h),*a0+,L
|
||
move *a1(040h),a2
|
||
inc a2
|
||
move *a1(050h),a3
|
||
move *a1(0h),a4
|
||
sll 16,a3
|
||
sll 16,a4
|
||
move a2,a7
|
||
divs a7,a3
|
||
#write_next_val
|
||
add a3,a4
|
||
move a4,a6
|
||
srl 16,a6
|
||
move a6,*a0+
|
||
dsjs a2,#write_next_val
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* ARGUMENTS: a6 = * line table
|
||
* a1 = ZPOSINT
|
||
*
|
||
* RETURNS: a0 = x-val of line at input ZPOS
|
||
* a0 = 0 if out of range in Z
|
||
*
|
||
* TRASHES: a0,a1
|
||
|
||
|
||
SUBR calc_line_pt
|
||
|
||
move *a6(30h),a0 ;z2
|
||
cmp a0,a1 ;zpos - z2
|
||
jrgt #outrange ;below
|
||
|
||
move *a6(10h),a0 ;z1
|
||
sub a0,a1 ;zpos - z1
|
||
jrlt #outrange ;above
|
||
|
||
X16 a1
|
||
add a6,a1
|
||
move *a1(40h),a0 ;skip 4 word header
|
||
rets
|
||
#outrange
|
||
clr a0
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
|
||
SUBR wobble_ropes
|
||
|
||
;Called from wrestler "GETTING HIT" sequences.
|
||
;Check to see if I'm up against the ropes.
|
||
;If so, wobble them.
|
||
|
||
move *a13(INRING),a0
|
||
jrnz #exit
|
||
|
||
move *a13(OBJ_XPOSINT),a0
|
||
cmpi RING_X_CENTER,a0
|
||
jrlt #lft
|
||
|
||
movi vln_right_rope,a6
|
||
callr calc_line_x
|
||
movk ROPE_RIGHT,a2
|
||
move *a13(OBJ_XPOSINT),a1
|
||
cmp a0,a1 ;a1-a0
|
||
jrge #wobble
|
||
jruc #exit
|
||
|
||
#lft
|
||
movi vln_left_rope,a6
|
||
callr calc_line_x
|
||
movk ROPE_LEFT,a2
|
||
move *a13(OBJ_XPOSINT),a1
|
||
cmp a0,a1 ;a1-a0
|
||
jrle #wobble
|
||
jruc #exit
|
||
|
||
#wobble
|
||
|
||
;Wrestler has been knocked back into ropes
|
||
;Wobble them!
|
||
move a2,a0
|
||
movk 1,a2
|
||
movk ROPE_BOUNCEIO,a1
|
||
calla rope_command
|
||
|
||
#exit rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* If player is moving away from opponent, or standing still, tell the
|
||
* calling SEQUENCE to not leap at the opponent!
|
||
*
|
||
* This routine is used by all wrestlers.
|
||
|
||
SUBR get_leap
|
||
|
||
move *a13(ANIMODE),a1
|
||
andni MODE_STATUS,a1
|
||
move a1,*a13(ANIMODE)
|
||
|
||
move *a13(OBJ_XVEL),a14,L
|
||
move *a13(OBJ_ZVEL),a0,L
|
||
or a14,a0
|
||
jrz #novel ;Wrestler is standing still!
|
||
|
||
|
||
;Is wrestler backing away from opponent?
|
||
|
||
move *a13(MOVE_DIR),a1
|
||
move *a13(NEW_FACING_DIR),a0 ;Current facing dir (9,10,6,5 only)
|
||
sll 5,a0
|
||
addi mv_tbl,a0
|
||
move *a0,a0,L
|
||
btst a0,a1
|
||
jrnz #novel
|
||
|
||
;Will lunge toward opponent
|
||
rets
|
||
|
||
#novel
|
||
move *a13(ANIMODE),a0
|
||
ori MODE_STATUS,a0
|
||
move a0,*a13(ANIMODE)
|
||
|
||
rets
|
||
|
||
*****************************************************************************
|
||
*
|
||
* If player is moving away from opponent, or standing still, tell the
|
||
* calling routine to ignore button press
|
||
*
|
||
|
||
SUBR ck_ignore
|
||
|
||
;Is wrestler going away from opponent?
|
||
|
||
move *a13(MOVE_DIR),a1
|
||
move *a13(NEW_FACING_DIR),a0 ;Current facing dir (9,10,6,5 only)
|
||
sll 5,a0
|
||
addi mv_tbl,a0
|
||
move *a0,a0,L
|
||
btst a0,a1
|
||
jrnz #novel2
|
||
|
||
;Will allow button press
|
||
clrc
|
||
rets
|
||
|
||
#novel2 setc
|
||
rets
|
||
|
||
mv_tbl .long 0,0,0,0,0,MOVE_RIGHT_BIT,MOVE_RIGHT_BIT
|
||
.long 0,0,MOVE_LEFT_BIT,MOVE_LEFT_BIT
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* If player is moving away from opponent, or standing still, tell the
|
||
* calling routine to ignore button press
|
||
*
|
||
|
||
SUBR ck_ignore_a8
|
||
|
||
;Is wrestler going away from opponent?
|
||
|
||
move *a8(MOVE_DIR),a1
|
||
move *a8(NEW_FACING_DIR),a0 ;Current facing dir (9,10,6,5 only)
|
||
sll 5,a0
|
||
addi mv_tbl,a0
|
||
move *a0,a0,L
|
||
btst a0,a1
|
||
jrnz #novel2
|
||
|
||
;Will allow button press
|
||
clrc
|
||
rets
|
||
|
||
#novel2 setc
|
||
rets
|
||
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* When we want all ropes to wobble (Butt drops, etc.)
|
||
* This routine is used by all wrestlers.
|
||
|
||
SUBR shake_all_ropes
|
||
|
||
; move @NUM_OPPS,A1
|
||
; CMPI 2,A1
|
||
; JRGE NO_SHAKING
|
||
|
||
movi ROPE_BOUNCEUD,a1
|
||
movk 2,a2
|
||
|
||
movi ROPE_FRONT,a0
|
||
calla rope_command
|
||
|
||
movk ROPE_BACK,a0
|
||
calla rope_command
|
||
|
||
movk ROPE_LEFT,a0
|
||
calla rope_command
|
||
|
||
movk ROPE_RIGHT,a0
|
||
calla rope_command
|
||
|
||
NO_SHAKING
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* CALLED FROM WITHIN COLLISION ROUTINES
|
||
*
|
||
* makes wrestlers face each other & sets x_flip accordingly
|
||
*
|
||
* a13 = victim process
|
||
* a10 = attacker process
|
||
|
||
SUBR face_each_other
|
||
|
||
movk MOVE_RIGHT,a0
|
||
move *a13(OBJ_XPOS),a2,L
|
||
move *a10(OBJ_XPOS),a3,L
|
||
cmp a2,a3 ;a3-a2
|
||
jrgt #right
|
||
movk MOVE_LEFT,a0
|
||
#right
|
||
movk MOVE_DOWN,a1
|
||
move *a13(OBJ_ZPOS),a2,L
|
||
move *a10(OBJ_ZPOS),a3,L
|
||
cmp a2,a3 ;a3-a2
|
||
jrgt #down
|
||
movk MOVE_UP,a1
|
||
#down
|
||
or a1,a0
|
||
move a0,*a13(NEW_FACING_DIR)
|
||
move a0,*a13(FACING_DIR)
|
||
|
||
xori MOVE_UP|MOVE_DOWN|MOVE_LEFT|MOVE_RIGHT,a0 ;opposite
|
||
|
||
move a0,*a10(NEW_FACING_DIR)
|
||
move a0,*a10(FACING_DIR)
|
||
|
||
move a10,a0
|
||
callr set_wrestler_xflip
|
||
|
||
move a13,a0
|
||
callr set_wrestler_xflip
|
||
|
||
rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* Resets all special move processes by writing their SM_RESET_ADDRESSes
|
||
* to their PWAKEs, and setting their PTIMEs to 1.
|
||
|
||
SUBR reset_smoves
|
||
|
||
movi ACTIVE,a0
|
||
movk 1,a1
|
||
#lp0 move *a0,a0,L
|
||
jrz #done
|
||
move *a0(PROCID),a14
|
||
cmpi SMOVE_PID,a14
|
||
jrne #lp0
|
||
|
||
move *a0(SM_RESET_ADDRESS),*a0(PWAKE),L
|
||
move a1,*a0(PTIME)
|
||
jruc #lp0
|
||
|
||
#done rets
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* This is a final pass at confining the wrestlers and it's just about the
|
||
* last thing that happens every frame, certain to run after both wrestler
|
||
* processes. It calls confine_wrestler once for each attached wrestler.
|
||
*
|
||
|
||
SUBRP final_confine
|
||
|
||
movi NUM_WRES,a1
|
||
movi process_ptrs,a2
|
||
PUSH a13
|
||
#loop
|
||
move *a2+,a13,L
|
||
jrz #inactive
|
||
|
||
move *a13(ATTACH_PROC),a0,L
|
||
jrz #no_attach
|
||
|
||
PUSH a1,a2
|
||
calla set_collision_boxes
|
||
calla confine_wrestler
|
||
PULL a1,a2
|
||
|
||
#no_attach
|
||
#inactive
|
||
dsj a1,#loop
|
||
|
||
PULL a13
|
||
rets
|
||
|
||
|
||
#*****************************************************************************
|
||
* Temp routines
|
||
|
||
.if DEBUG
|
||
|
||
BSSX CPUAVG ,16
|
||
BSSX CPULEFT ,16
|
||
|
||
|
||
SUBRP cputime_calcfree
|
||
|
||
move @dirqtimer,a0
|
||
subk 1,a0
|
||
jrle nobog
|
||
clr a0
|
||
jruc gottime
|
||
nobog
|
||
move @vcount,a0
|
||
subi EOSINT,a0
|
||
jrnn skinccnt
|
||
addi 256,a0
|
||
skinccnt
|
||
sll 2,a0
|
||
neg a0
|
||
addi 1024,a0
|
||
gottime
|
||
move a0,@CPULEFT
|
||
|
||
srl 4,a0
|
||
move @CPUAVG,a1
|
||
move a1,a2
|
||
srl 4,a2 ;/16
|
||
sub a2,a1
|
||
add a0,a1
|
||
move a1,@CPUAVG
|
||
|
||
rets
|
||
|
||
|
||
.endif
|
||
|
||
.if COL_DEBUG
|
||
|
||
#*****************************************************************************
|
||
* highlights attack box
|
||
* a10 is ptr to wrestler process
|
||
|
||
SUBR collis_debug
|
||
|
||
|
||
clr a0 ;x pos
|
||
clr a1 ;y pos
|
||
movi jmeter,a2 ;* image
|
||
movi >1601,a3 ;z pos
|
||
movi DMACAL|M_3D,a4 ;DMA flags
|
||
clr a5 ;object ID
|
||
clr a6 ;x vel
|
||
clr a7 ;y vel
|
||
calla BEGINOBJ
|
||
|
||
clr a0
|
||
move a0,*a8(ODXOFF)
|
||
move a0,*a8(ODYOFF)
|
||
|
||
movi 0202h,a0
|
||
move a0,*a8(OCONST)
|
||
|
||
#loop
|
||
SLEEPK 1
|
||
|
||
movi 7f00h,a0
|
||
move @debug_collis,a14
|
||
cmpi 2,a14
|
||
jrne #not_2
|
||
movi 1400h,a0
|
||
#not_2
|
||
move a0,*a8(OZPOS)
|
||
|
||
move @debug_collis,a0
|
||
jrz #off
|
||
|
||
move *a10(ANIMODE),a0
|
||
btst MODE_CHECKHIT_BIT,a0
|
||
jrnz #on
|
||
|
||
#off
|
||
clr a0
|
||
move a0,*a8(OXVAL),L
|
||
move a0,*a8(OYVAL),L
|
||
|
||
move @slowmo,a0
|
||
move a0,@slowmotion
|
||
|
||
movk 16,a0
|
||
move a0,*a8(OSIZEX)
|
||
move a0,*a8(OSIZEY)
|
||
|
||
jruc #loop
|
||
|
||
|
||
#on
|
||
movk 30,a0
|
||
clr a0
|
||
|
||
move @slowmo,a1
|
||
jrz #skp
|
||
move a1,a0
|
||
#skp
|
||
move a0,@slowmotion
|
||
|
||
movi Y_SCALE_MULTIPLIER,a0
|
||
move *a10(OBJ_ZPOSINT),a1
|
||
mpys a0,a1
|
||
move a1,a4 ;y val
|
||
srl 16,a4
|
||
move *a10(OBJ_YPOSINT),a0
|
||
sub a0,a4
|
||
|
||
move *a10(OBJ_ATTYOFF),a0
|
||
sub a0,a4
|
||
move *a10(OBJ_ATTHEIGHT),a0
|
||
sub a0,a4
|
||
sll 16,a4
|
||
move a4,*a8(OYVAL),L
|
||
|
||
move *a10(OBJ_ATTWIDTH),a0
|
||
move a0,*a8(OSIZEX)
|
||
move *a10(OBJ_ATTHEIGHT),a0
|
||
move a0,*a8(OSIZEY)
|
||
|
||
move *a10(OBJ_ATTXOFF),a0
|
||
move *a10(OBJ_XPOSINT),a4
|
||
|
||
;check the same way the actual collision code does.
|
||
move *a10(OBJ_CONTROL),a14
|
||
btst B_FLIPH,a14
|
||
jrz #facing_right
|
||
|
||
; move *a10(FACING_DIR),a14
|
||
; btst PLAYER_RIGHT_BIT,a14
|
||
; jrnz #facing_right
|
||
|
||
neg a0
|
||
move *a10(OBJ_ATTWIDTH),a14
|
||
sub a14,a0
|
||
|
||
#facing_right
|
||
|
||
add a0,a4
|
||
sll 16,a4
|
||
move a4,*a8(OXVAL),L
|
||
|
||
|
||
|
||
jruc #loop
|
||
|
||
;;; move a0,@debug_collis
|
||
|
||
|
||
|
||
#*****************************************************************************
|
||
* highlights target box
|
||
* a10 is ptr to wrestler process
|
||
|
||
SUBRP collis_debug2
|
||
|
||
clr a0 ;x pos
|
||
clr a1 ;y pos
|
||
movi jmeter,a2 ;* image
|
||
movi 7f00h,a0 ;199
|
||
movi DMACAL|M_3D,a4 ;DMA flags
|
||
clr a5 ;object ID
|
||
clr a6 ;x vel
|
||
clr a7 ;y vel
|
||
calla BEGINOBJ
|
||
|
||
clr a0
|
||
move a0,*a8(ODXOFF)
|
||
move a0,*a8(ODYOFF)
|
||
|
||
movi 0101h,a0
|
||
move a0,*a8(OCONST)
|
||
|
||
#loop
|
||
SLEEPK 1
|
||
|
||
movi >1600,a0
|
||
move @debug_collis,a14
|
||
cmpi 2,a14
|
||
jrne #not_2
|
||
movi 111,a0
|
||
#not_2
|
||
move a0,*a8(OZPOS)
|
||
|
||
move @debug_collis,a0
|
||
jrnz #on
|
||
|
||
clr a0
|
||
move a0,*a8(OXVAL),L
|
||
move a0,*a8(OYVAL),L
|
||
|
||
movk 16,a0
|
||
move a0,*a8(OSIZEX)
|
||
move a0,*a8(OSIZEY)
|
||
|
||
jruc #loop
|
||
|
||
#on
|
||
move *a10(OBJ_COLLX1),a0
|
||
move a0,a1
|
||
sll 16,a0
|
||
move a0,*a8(OXVAL),L
|
||
|
||
move *a10(OBJ_COLLX2),a2
|
||
sub a1,a2
|
||
move a2,*a8(OSIZEX)
|
||
|
||
movi Y_SCALE_MULTIPLIER,a0
|
||
move *a10(OBJ_ZPOSINT),a1
|
||
mpys a0,a1
|
||
srl 16,a1
|
||
move *a10(OBJ_COLLY2),a0
|
||
sub a0,a1
|
||
sll 16,a1
|
||
move a1,*a8(OYVAL),L
|
||
|
||
move *a10(OBJ_COLLY2),a0
|
||
move *a10(OBJ_COLLY1),a1
|
||
sub a1,a0
|
||
move a0,*a8(OSIZEY)
|
||
|
||
jruc #loop
|
||
|
||
.endif
|
||
|
||
#*****************************************************************************
|
||
.if SCRT_DEBUG
|
||
|
||
.bss imgptrs0, 32*16
|
||
|
||
SUBRP scrt_debug
|
||
|
||
movk 16,a1
|
||
movi imgptrs0,a2
|
||
movi [10,0],a0 ;x pos
|
||
#init_loop
|
||
|
||
PUSH a0,a1,a2
|
||
|
||
movi [238,0],a1 ;y pos
|
||
movi d_zip,a2 ;* image
|
||
movi 10000,a3 ;z pos
|
||
movi DMAWNZ|M_SCRNREL,a4 ;DMA flags
|
||
clr a5 ;object ID
|
||
clr a6 ;x vel
|
||
clr a7 ;y vel
|
||
calla BEGINOBJ
|
||
|
||
PULL a0,a1,a2
|
||
move a8,*a2+,L
|
||
addi [16,0],a0
|
||
dsj a1,#init_loop
|
||
|
||
#loop
|
||
|
||
|
||
movi wrest_joystat,a1
|
||
movi imgptrs0,a2
|
||
movk 16,a3
|
||
|
||
#loop2
|
||
move *a2+,a8,L
|
||
move *a1+,a5,L
|
||
move a5,a0
|
||
|
||
srl 4,a0
|
||
andi 011111b,a0
|
||
jrz #cont
|
||
X32 a0
|
||
addi #button_imgs,a0
|
||
move *a0,a0,L
|
||
jruc #cont2
|
||
|
||
#cont
|
||
move a5,a0
|
||
andi 01111b,a0
|
||
X32 a0
|
||
addi #arrow_imgs,a0
|
||
move *a0,a0,L
|
||
|
||
#cont2
|
||
|
||
PUSH a1,a2,a3
|
||
|
||
callr #change_image
|
||
|
||
PULL a1,a2,a3
|
||
dsj a3,#loop2
|
||
|
||
SLEEPK 1
|
||
|
||
jruc #loop
|
||
|
||
|
||
#change_image
|
||
move a0,*a8(OIMG),L
|
||
move *a0(0),*a8(OSIZE),L
|
||
move *a0(ISAG),*a8(OSAG),L
|
||
|
||
move *a0(IANIOFFX),a1
|
||
move a1,*a8(ODXOFF) ;display x offset
|
||
|
||
move *a0(IANIOFFY),a1
|
||
move a1,*a8(ODYOFF) ;display y offset
|
||
|
||
setf 5,0,0
|
||
move *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits
|
||
setf 16,1,0
|
||
rets
|
||
|
||
#arrow_imgs
|
||
.long d_zip ;0
|
||
.long d_up ;1
|
||
.long d_down ;2
|
||
.long d_zip ;3
|
||
.long d_left ;4
|
||
.long d_upleft ;5
|
||
.long d_downleft ;6
|
||
.long d_zip ;7
|
||
.long d_right ;8
|
||
.long d_upright ;9
|
||
.long d_downright ;10
|
||
.long d_zip ;11
|
||
.long d_zip ;12
|
||
.long d_zip ;13
|
||
.long d_zip ;14
|
||
.long d_zip ;15
|
||
|
||
|
||
#button_imgs
|
||
.long d_zip ;0
|
||
.long d_block ;1
|
||
.long d_grab ;2
|
||
.long d_zip ;3
|
||
.long d_punch ;4
|
||
.long d_zip ;5
|
||
.long d_zip ;6
|
||
.long d_zip ;7
|
||
.long d_kick ;8
|
||
.long d_zip ;9
|
||
.long d_zip ;10
|
||
.long d_zip ;11
|
||
.long d_zip ;12
|
||
.long d_zip ;13
|
||
.long d_zip ;14
|
||
.long d_zip ;15
|
||
.long d_turbo ;16
|
||
|
||
.endif
|
||
|
||
#*****************************************************************************
|
||
.if DIR_DEBUG
|
||
|
||
.bss imgptrs, 32*3
|
||
.bss imgptrs2, 32*3
|
||
|
||
SUBRP dir_debug
|
||
|
||
movi [10,0],a0 ;x pos
|
||
movi [25,0],a1 ;y pos
|
||
movi d_zip,a2 ;* image
|
||
movi 10000,a3 ;z pos
|
||
movi DMAWNZ|M_SCRNREL,a4 ;DMA flags
|
||
clr a5 ;object ID
|
||
clr a6 ;x vel
|
||
clr a7 ;y vel
|
||
calla BEGINOBJ
|
||
move a8,@imgptrs,L
|
||
|
||
movi [10,0],a0 ;x pos
|
||
movi [25+15,0],a1 ;y pos
|
||
calla BEGINOBJ
|
||
move a8,@imgptrs+32,L
|
||
|
||
movi [10,0],a0 ;x pos
|
||
movi [25+30,0],a1 ;y pos
|
||
calla BEGINOBJ
|
||
move a8,@imgptrs+64,L
|
||
|
||
|
||
movi [400-24,0],a0 ;x pos
|
||
movi [25,0],a1 ;y pos
|
||
calla BEGINOBJ
|
||
move a8,@imgptrs2,L
|
||
|
||
movi [400-24,0],a0 ;x pos
|
||
movi [25+15,0],a1 ;y pos
|
||
calla BEGINOBJ
|
||
move a8,@imgptrs2+32,L
|
||
|
||
movi [400-24,0],a0 ;x pos
|
||
movi [25+30,0],a1 ;y pos
|
||
calla BEGINOBJ
|
||
move a8,@imgptrs2+64,L
|
||
|
||
|
||
|
||
#loop
|
||
clr a1
|
||
callr get_process_ptr
|
||
|
||
move a0,a10
|
||
JRZ NO_ONE_HERE1
|
||
|
||
move *a10(MOVE_DIR),a0
|
||
move @imgptrs,a8,L
|
||
callr #ud_arrow
|
||
|
||
move *a10(NEW_FACING_DIR),a0
|
||
move @imgptrs+32,a8,L
|
||
callr #ud_arrow
|
||
|
||
move *a10(FACING_DIR),a0
|
||
move @imgptrs+64,a8,L
|
||
callr #ud_arrow
|
||
|
||
NO_ONE_HERE1
|
||
movk 1,a1
|
||
callr get_process_ptr
|
||
move a0,a10
|
||
JRZ NO_ONE_HERE2
|
||
|
||
move *a10(MOVE_DIR),a0
|
||
move @imgptrs2,a8,L
|
||
callr #ud_arrow
|
||
|
||
move *a10(NEW_FACING_DIR),a0
|
||
move @imgptrs2+32,a8,L
|
||
callr #ud_arrow
|
||
|
||
move *a10(FACING_DIR),a0
|
||
move @imgptrs2+64,a8,L
|
||
callr #ud_arrow
|
||
|
||
NO_ONE_HERE2
|
||
SLEEPK 1
|
||
jruc #loop
|
||
|
||
|
||
#ud_arrow
|
||
move a0,a0
|
||
jrnz #ok
|
||
movi d_zip,a0
|
||
jruc #cont
|
||
#ok
|
||
callr convert_facing
|
||
X32 a0
|
||
addi #arrow_imgs,a0
|
||
move *a0,a0,L
|
||
|
||
#cont
|
||
move a0,*a8(OIMG),L
|
||
move *a0(0),*a8(OSIZE),L
|
||
move *a0(ISAG),*a8(OSAG),L
|
||
|
||
move *a0(IANIOFFX),a1
|
||
move a1,*a8(ODXOFF) ;display x offset
|
||
|
||
move *a0(IANIOFFY),a1
|
||
move a1,*a8(ODYOFF) ;display y offset
|
||
|
||
setf 5,0,0
|
||
move *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits
|
||
setf 16,1,0
|
||
rets
|
||
|
||
|
||
#arrow_imgs
|
||
.long d_up
|
||
.long d_upright
|
||
.long d_right
|
||
.long d_downright
|
||
.long d_down
|
||
.long d_downleft
|
||
.long d_left
|
||
.long d_upleft
|
||
|
||
.long d_punch
|
||
.long d_kick
|
||
.long d_block
|
||
.long d_grab
|
||
.long d_turbo
|
||
.long d_zip
|
||
|
||
.endif
|
||
|
||
#*****************************************************************************
|
||
*
|
||
* Initializes the scroller position
|
||
|
||
SUBR init_scroller
|
||
|
||
movi [RING_X_CENTER-200,0],a0
|
||
move a0,@WORLDTLX,L
|
||
|
||
;use [ffe5,0] in 1v1 or 1v3, [ffe9,0] for 1v2
|
||
movi [0ffe5h,0],a0
|
||
move @NUM_OPPS,a14
|
||
cmpi 2,a14
|
||
jrne #sety
|
||
movi [0ffe9h,0],a0
|
||
#sety move a0,@WORLDTLY,L
|
||
|
||
rets
|
||
|
||
******************************************************************************
|
||
|
||
.end
|
||
|