************************************************************** * * Software: Jason Skiles * Initiated: 29 Oct 93 * * COPYRIGHT (C) 1993 WILLIAMS ELECTRONICS GAMES, INC. * *.Last mod - 5/5/95 14:54 ************************************************************** .file "lifebar.asm" .title "meters, names, messages, and scores" .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 "game.equ" .include "plyr.equ" .include "sys.equ" .include "link.equ" .include "sound.h" .include "ring.equ" .include "miscimg.glo" .include "fontsimg.glo" .include "sound.equ" .include "imgtbl.glo" .include "jjxm.h" ;temp! - 314 .if DEBUG .include "tmpdebug.h" .endif #***************************************************************************** .ref reset_for_round,init_scroller,BGND_UD1 .ref reset_for_round2,no_debris,flash_red .ref calc_match_time_2,ck_any_teammates .ref change_anim1a,triple_sound,HALT,CLOSE_VERT_SCREEN_LINE .ref civanic,CR_STRTP,get_process_ptr,wres_collis_off .ref GET_ADJ,p2winstreak,ANIM_CROWD,update_timer,GAMSTATE .ref fight_debug,RNDRNG0,pal_getf,ring_bell,BEGINOBJ_TBL .ref PSTATUS,match_over,p1rounds,is_8_on_1 .ref OPEN_VERT_SCREEN_LINE,process_ptrs,SET_LOWER_VOL .ref GET_CREDITS,BINBCD,get_all_buttons_cur2,LINES_VERT .ref current_round,p1winstreak,CLEAR_SPEECH_REPEAT,p2rounds .ref VINCE_START_ROUND2_3,WHICH_SCREEN,do_game_over .ref CALL_MATCH_OVER,AUD1,setup_back_anim,DUMRETS .ref calc_match_time_1,match_time .ref ROLLING_COUNT,match_winner,PCNT,NUM_OPPS,is_final_match .ref ADD_VOICE,KILL_ALL_CHANNELS,END_MATCH_SPEECH .ref accumulate_awards,annc_rnd_winner_done .ref round_award,royal_rumble,buddy_mode_on .ref match_award,reduce_bog,get_live_bits .ref create_end_rnd_awards .ref award_ok_to_die .ref is_it_a_really_quick_win,increment_wincount .ref give_award_if_opponent_is_human .ref arm_comeback_award .ref check_for_award_for_big_comeback .ref check_for_award_for_winstreak .ref show_dufus_messages .ref CHANGE_SKIRTS2,INIT_SKIRTS .ref pal_clean,round_start_time,round_end_time .ref dboxes_on,do_fireworks .ref instant_combos_on,p1powerup_request .ref show_mk3_tip,MAYBE_HIGH_RISK .ref match_cnt,WGFS_W_P .ref temp_music .ref finish_completed #***************************************************************************** ;player life/turbo data struct PLT_LIFE equ 0 ;UHW life pixels (164 max) PLT_CLIFE equ PLT_LIFE+10h ;UHW displayed life (164 max) PLT_TURBO equ PLT_CLIFE+10h ;UHW turbo val (5400h max) PLT_COMBO_SIZE equ PLT_TURBO+10h ;UHW combo bar size PLT_SIZE equ PLT_COMBO_SIZE+010h ;NOTE that PLT_SIZE is 40h, so anytime we might otherwise use a multiply, ; we do a X64 instead. DO NOT change the size of this struct unless ; you're prepared to do some cleanup. ;meter data struct MD_LINK equ 0 ;UHW PLYRNUM for this meter MD_LIFE equ MD_LINK+10h ;UHL life bar *obj MD_LBAK equ MD_LIFE+20h ;UHL turbo bar *obj MD_NAME equ MD_LBAK+20h ;UHL name *obj MD_COMBO equ MD_NAME+20h ;UHL combo bar *obj MD_SIZE equ MD_COMBO+20H .bss life_data, NUM_WRES*PLT_SIZE .bss meter_data, 2*MD_SIZE .bss damage_imgs, 4*32 .bss ram_lst, 32*40 ;For announce_match BSSX DAM_MULT,16 .BSS LAST_FLIP,16 BSSX combo_audit_done,16 BSSX message_flag,32*2 ;Message already displayed bit BSSX ZFLIP_POS_VAR,32 BSSX MUSIC_HAP,16 BSSX PERFECT_WINS,16 BSSX WINS_OBJ,32*3 BSSX fence1,4*32 BSSX MESSAGE_FLAGS,32 BSSX fence2,4*32 BSSX COMBO_FLASH_FLAG,32 BSSX in_finish_move,16 BSSX speed_adjustment,32 ;game speed damage adjustment ;temp! - 314 .if DEBUG BSSX event_data,EVENTSIZ*NUM_EVENTS BSSX event_ptr,32 .endif #***************************************************************************** * * Life/Turbo meter sizes and positions. * LIFE_MAX .equ 163 ;green pixels in life bar TURBO_MAX .equ 84<<8 ;max turbo value #***************************************************************************** * * Called at the beginning of the first round of a match. * SUBR init_life_data ;temp! - 314 .if DEBUG movi event_data,a14 move a14,@event_ptr,L clr a14 movi event_data,a0 movi EVENTSIZ*NUM_EVENTS/16,a1 #clp move a14,*a0+,W dsj a1,#clp .endif ;initialize speed_adjustment movk ADJSPEED,a0 ;game timer speed (1-5) calla GET_ADJ BADCHK a0,1,5,3 ;reg,lo,hi,val X32 a0 ;x 16 bits addi #timer_table-20h,a0 move *a0,a1,L move a1,@speed_adjustment,L ;initialize life data movi NUM_WRES,a0 movi life_data,a1 movi LIFE_MAX,a2 movi TURBO_MAX,a3 clr a4 #init_loop move a2,*a1(PLT_LIFE) move a3,*a1(PLT_TURBO) move a4,*a1(PLT_CLIFE) move a4,*a1(PLT_COMBO_SIZE) addi PLT_SIZE,a1 dsj a0,#init_loop rets #timer_table .long 10000h*4/5 ;80% damage (slowest) .long 10000h*9/10 ;90% .long 10000h*1 ;normal damage (default) .long 10000h*11/10 ;110% .long 10000h*6/5 ;120% damage (fastest) #***************************************************************************** * * Resets life/turbo/combo data for wrestler in a13. Used by change_wrestler. * Updates name display too, if either display is aimed at our guy. * * Since this only happens for dead guys, we don't check to see if it's a * player, and we don't check special royal rumble mode cases. * SUBR init_wres_life_data ;initialize life data move *a13(PLYRNUM),a1 X64 a1 ;mult by PLT_SIZE addi life_data,a1 movi LIFE_MAX,a2 movi TURBO_MAX,a3 clr a4 move a2,*a1(PLT_LIFE) move a3,*a1(PLT_TURBO) move a2,*a1(PLT_CLIFE) move a4,*a1(PLT_COMBO_SIZE) ;check names move *a13(PLYRNUM),a1 movi meter_data,a5 move *a5(MD_LINK),a14 cmp a1,a14 jreq #chgnm addi MD_SIZE,a5 move *a5(MD_LINK),a14 cmp a1,a14 jrne #done #chgnm X32 a1 addi name_tbl,a1 move *a1,a0,L move *a5(MD_NAME),a8,L calla civanic #done rets #***************************************************************************** * * Called at the start of the second and later rounds of a match. * SUBR init_rnd_life_data ;reset life data movi NUM_WRES,a0 movi life_data,a1 movi LIFE_MAX,a2 #init_loop move a2,*a1(PLT_LIFE) move a2,*a1(PLT_CLIFE) addi PLT_SIZE,a1 dsj a0,#init_loop ;set lifebar pals. movi FYL2RD_P,a0 calla pal_getf movi meter_data,a1 move @p2rounds,a14 jrz #ok1 ;set left lifebar red move *a1(MD_LIFE),a8,L move a0,*a8(OPAL) #ok1 addi MD_SIZE,a1 move @p1rounds,a14 jrz #ok2 ;set right lifebar red move *a1(MD_LIFE),a8,L move a0,*a8(OPAL) #ok2 rets #***************************************************************************** * * >a8 = PLYRNUM for left meter * >a9 = PLYRNUM for right meter P1CNTR .equ PDATA P2CNTR .equ PDATA+16 P1STATE .equ PDATA+32 P2STATE .equ PDATA+48 SUBR meters PUSH a8,a9 ;Start the credits message calla start_credbox ;initialize meter data movi meter_data,a1 TBL_OBJ lhlth1 move a8,*a1(MD_LIFE),L TBL_OBJ lname move a8,*a1(MD_NAME),L TBL_OBJ lframec move a8,*a1(MD_LBAK),L TBL_OBJ lcombo move a8,*a1(MD_COMBO),L addi MD_SIZE,a1 TBL_OBJ rhlth1 move a8,*a1(MD_LIFE),L TBL_OBJ rname move a8,*a1(MD_NAME),L TBL_OBJ rframec move a8,*a1(MD_LBAK),L TBL_OBJ rcombo move a8,*a1(MD_COMBO),L ;create the static (no-handle) objects TBL_OBJ lframe TBL_OBJ lframeb TBL_OBJ rframe TBL_OBJ rframeb callr do_win_streaks PULL a8,a9 ;wire up the meters clr a0 move a8,a1 callr rewire_meter movk 1,a0 move a9,a1 callr rewire_meter CREATE ANNC_PID,announce_match movk 1,a0 move a0,*a13(P1CNTR) move a0,*a13(P2CNTR) clr a0 move a0,*a13(P1STATE) move a0,*a13(P2STATE) #main_loop ;Update all the life data clr a0 #maint_loop MOVE @WHICH_SCREEN,A1,L CMPI DUMRETS,A1 JRNE JUST_DISPLAY_THEM callr inc_life inc a0 cmpi NUM_WRES,a0 jrne #maint_loop JUST_DISPLAY_THEM ;Update the meters clr a0 callr update_meter movk 1,a0 callr update_meter ;Blink CPU controlled name with insert coins/press start movi meter_data,a1 move @PSTATUS,a0 btst 0,a0 jrnz #p2 ;Plyr 1 is drone move *a13(P1CNTR),a0 dec a0 move a0,*a13(P1CNTR) jrnz #p2 move *a13(P1STATE),a0 xori 1,a0 move a0,*a13(P1STATE) jrz #doname ;Do correct coin message movi TSEC,a0 ;one second of PRESS/INSERT... move @NUM_OPPS,a14 ;(two if one-on-one mode) dec a14 jrnz #tset1a sla 1,a0 #tset1a move a0,*a13(P1CNTR) move *a1(MD_NAME),a8,L movi WF_START,a0 ;Display the insert coin/press start message calla CR_STRTP jrhs #enough_money movi WF_INSERT,a0 #enough_money calla civanic jruc #p2 #doname movi TSEC*4,a0 ;and four seconds of names move @NUM_OPPS,a14 ;(two if one-on-one mode) dec a14 jrnz #tset1b sra 1,a0 #tset1b move a0,*a13(P1CNTR) move *a1(MD_LINK),a0 X32 a0 addi process_ptrs,a0 move *a0,a0,L move *a0(WRESTLERNUM),a0 X32 a0 addi name_tbl,a0 move *a0,a0,L ;Change the name move *a1(MD_NAME),a8,L calla civanic #p2 movi meter_data,a1 addi MD_SIZE,a1 move @PSTATUS,a0 btst 1,a0 jrnz #ok ;Plyr 2 is drone move *a13(P2CNTR),a0 dec a0 move a0,*a13(P2CNTR) jrnz #ok move *a13(P2STATE),a0 xori 1,a0 move a0,*a13(P2STATE) jrz #doname2 ;Do correct coin message movi TSEC,a0 ;one second of PRESS/INSERT... move @NUM_OPPS,a14 ;(two if one-on-one mode) dec a14 jrnz #tsetsa sla 1,a0 #tsetsa move a0,*a13(P1CNTR) move *a1(MD_NAME),a8,L movi WF_START,a0 ;Display the insert coin/press start message calla CR_STRTP jrhs #enough_money movi WF_INSERT,a0 #enough_money2 calla civanic jruc #ok #doname2 movi TSEC*4,a0 ;and four seconds of names move @NUM_OPPS,a14 ;(two if one-on-one mode) dec a14 jrnz #tset2b sra 1,a0 #tset2b move a0,*a13(P1CNTR) move *a1(MD_LINK),a0 X32 a0 addi process_ptrs,a0 move *a0,a0,L move *a0(WRESTLERNUM),a0 X32 a0 addi name_tbl,a0 move *a0,a0,L ;Change the name move *a1(MD_NAME),a8,L calla civanic #ok SLEEPK 1 jruc #main_loop #******** * * Meter objects and their positions * lbar_x .equ 11 rbar_x .equ 390 lcombo_x .equ 181-45 rcombo_x .equ 220+45 lname_x .equ 97 rname_x .equ 303 bar_y .equ 20 combo_y .equ bar_y+18 name_y .equ 13 bak_z .equ 200 bar_z .equ 202 frame_z .equ 201 name_z .equ 203 lcombo .word lcombo_x,combo_y,name_z ;X, Y, Z .long SUPER_0 .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even rcombo .word rcombo_x,combo_y,name_z ;X, Y, Z .long SUPER_0 .word DMAWNZ|M_FLIPH|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even lframe .word lbar_x,bar_y,frame_z ;X, Y, Z .long PWREMPTY .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even rframe .word rbar_x,bar_y,frame_z ;X, Y, Z .long PWREMPTY .word DMAWNZ|M_3D|M_SCRNREL|M_FLIPH ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even lframeb .word lbar_x,bar_y,frame_z ;X, Y, Z .long LBAR_GENB ;IMG .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even rframeb .word rbar_x,bar_y,frame_z ;X, Y, Z .long RBAR_GENB ;IMG .word DMAWNZ|M_3D|M_SCRNREL|M_FLIPH ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even lframec .word lbar_x,bar_y,bak_z ;X, Y, Z .long LBAR_GENC ;IMG .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even rframec .word rbar_x,bar_y,bak_z ;X, Y, Z .long LBAR_GENC ;IMG .word DMAWNZ|M_3D|M_SCRNREL|M_FLIPH ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even lwin .word 11,22h,name_z ;X, Y, Z .long BWINBOX ;IMG .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even rwin .word 391,22h,name_z ;X, Y, Z .long RWINBOX ;IMG .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBMFRAME ;OID .long 0,0 ;XVEL, YVEL .even lhlth1 .word lbar_x,bar_y,bar_z ;X, Y, Z .long FGRN2YEL .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBLBAR ;OID .long 0,0 ;XVEL, YVEL .even rhlth1 .word rbar_x,bar_y,bar_z ;X, Y, Z .long FGRN2YEL .word DMAWNZ|M_3D|M_SCRNREL|M_FLIPH ;CTRL .word CLSNEUT|TYPNEUT|SUBLBAR ;OID .long 0,0 ;XVEL, YVEL .even * * name data * lname .word lname_x,name_y,name_z ;X, Y, Z .long NAM_BRT ;IMG .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBLBAR ;OID .long 0,0 ;XVEL, YVEL .even rname .word rname_x,name_y,name_z ;X, Y, Z .long NAM_RZR ;IMG .word DMAWNZ|M_3D|M_SCRNREL ;CTRL .word CLSNEUT|TYPNEUT|SUBLBAR ;OID .long 0,0 ;XVEL, YVEL .even *************************************** SUBRP replace_wins move @match_winner,a1 MOVE @PSTATUS,A0 AND A1,A0 JRZ #EXIT move @WINS_OBJ,A0,L JRZ NO_WINS_1 CALLA DELOBJ NO_WINS_1 move @WINS_OBJ+020H,A0,L JRZ NO_WINS_2 CALLA DELOBJ NO_WINS_2 move @WINS_OBJ+040H,A0,L JRZ NO_WINS_3 CALLA DELOBJ NO_WINS_3 move @match_winner,a1 dec a1 jrnz do_player_2_wins move @p1winstreak,a0 push a10 callr streak_1 pull a10 #EXIT rets do_player_2_wins move @p2winstreak,a0 push a10 callr streak_2 pull a10 rets *************************************** FLASH_COMBO MOVI COMBO_P,A0 CALLA pal_getf MOVE A0,*A8(OPAL) MOVE *A8(OCTRL),A1 ANDNI M_FLIPH,A1 MOVE A1,*A8(OCTRL) DO_COMBO_FLASH_AGAIN MOVI COMBO_FLASH_ANIM,A1 calla setup_back_anim JSRP ANIM_CROWD SLEEPK 20 JRUC DO_COMBO_FLASH_AGAIN DO_COMBO_SOUND SLEEPK 25 MOVI 3,A0 CALLA triple_sound DIE CANI_END equ 2 + 8000H COMBO_FLASH_ANIM WL 2,COMBO_01 WL 2,COMBO_02 WL 2,COMBO_03 WL 2,COMBO_04 WL 2,COMBO_05 WL 2,COMBO_06 WL 2,COMBO_07 WL 2,COMBO_08 WL 2,COMBO_09 WL 2,COMBO_10 .WORD CANI_END SUBRP flash_2ndwind MOVE *A8(OCTRL),A1 ANDNI M_FLIPH,A1 MOVE A1,*A8(OCTRL) movk 3,a9 #flsh PUSHP a9 movi wind_anim,a1 calla setup_back_anim JSRP ANIM_CROWD SLEEPK 2 PULLP a9 dsj a9,#flsh DIE wind_anim WL 2,SECWND01 WL 2,SECWND02 WL 2,SECWND03 WL 2,SECWND04 WL 2,SECWND05 WL 2,SECWND06 WL 2,SECWND07 WL 2,SECWND08 WL 2,SECWND09 .WORD CANI_END ****************************************************************************** SUBR CHECK_COMBO_GO move *a8(PLYRNUM),a1 ;if we're in royal rumble, change a 1 to a zero. move @royal_rumble,a14 jrz #norum0 cmpi 1,a1 jrne #norum0 clr a1 #norum0 X64 a1 ;x by PLT_SIZE addi life_data,a1 MOVE *A1(PLT_COMBO_SIZE),a14 ; MOVE @BONUS_POWER,A1 ; cmp A1,a14 move @instant_combos_on,a1 jrnz #auto_combos ; Auto combos on movk 16,a1 ; Normal combo check jruc #combo_check #auto_combos clr a1 #combo_check cmp a1,a14 rets ****************************************************************************** ;A7 = BIT TO SET IN PLAYER HISTORY ;A5 = FIRST TIME FOR MOVE ;A6 = MOVE REPEAT SUBR ADD_TO_COMBO_COUNT ;Adds first value each time! [why?] MOVE A7,A2 movk 1,a5 movk 1,a3 MOVE *a13(COMBO_START),A1 AND A1,A2 JRNZ ALREADY_ADDED_ONCE MOVE A5,A3 MOVE *a13(COMBO_START),A1 OR A7,A1 MOVE A1,*A13(COMBO_START) ALREADY_ADDED_ONCE ;HACK ALERT: In royal rumble mode, each player individually tracks ; which moves he's done and so on, but both share a single combo ; meter. Halve the amount to add and give it to player 0 if we're ; in royal rumble mode and a13 is player 1. PUSH a13 move @royal_rumble,a14 jrz #norum move *a13(PLYRNUM),a14 cmpi 1,a14 jrgt #norum ;royal rumble and a13 is a human. make it the first one. clr a1 calla get_process_ptr move a0,a13 #norum ;WARNING: a13 isn't neccesarily valid in here! (see above) move *a13(PLYR_SIDE),a1 move *a13(PLYRNUM),a11 PULL a13 ;OKAY: a13 is safe again. movi MD_SIZE,a9 mpyu a1,a9 addi meter_data,a9 MOVE *A9(MD_COMBO),A8,L move a11,a5 X64 a5 ;x by PLT_SIZE ADDI life_data,A5 MOVE *A5(PLT_COMBO_SIZE),A2 ADD A3,A2 MOVE A2,*A5(PLT_COMBO_SIZE) move @instant_combos_on,a6 jrz #norm_combos clr a6 jruc #do_check #norm_combos movk 16,a6 #do_check cmp a6,a2 JRGE SET_FLASHING_COMBO_GOING SLL 5,A2 ADDI WHICH_SIZE_BAR,A2 MOVE *A2,A0,L move *a0(IANIOFF),*A8(ODOFF),L move *a0(ISAG),*a8(OSAG),L RETS SUBR SET_FLASHING move a10,a0 sll 5,a0 addi process_ptrs,a0 move *a0,a0,L move *a0(PLYR_SIDE),a1 movi MD_SIZE,a9 mpyu a1,a9 addi meter_data,a9 MOVE *A9(MD_COMBO),A8,L SET_FLASHING_COMBO_GOING ;a1=plyr side move a1,a0 SLL 4,a0 ADDI COMBO_FLASH_FLAG,a0 MOVE *a0,a0 JRNZ COMBO_ALREADY_STARTED MOVE A1,A7 SLL 4,A7 ADDI COMBO_FLASH_FLAG,A7 MOVK 1,A0 MOVE A0,*A7 ADDI FLASH_COMBO_PID,A1 MOVI FLASH_COMBO,A7 CALLA GETPRC CREATE SOUND_PID,DO_COMBO_SOUND COMBO_ALREADY_STARTED RETS WHICH_SIZE_BAR .LONG SUPER_0 .LONG SUPER_1 .LONG SUPER_2 .LONG SUPER_3 .LONG SUPER_4 .LONG SUPER_5 .LONG SUPER_6 .LONG SUPER_7 .LONG SUPER_8 .LONG SUPER_9 .LONG SUPER_10 .LONG SUPER_11 .LONG SUPER_12 .LONG SUPER_13 .LONG SUPER_14 .LONG SUPER_15 .LONG SUPER_16 #***************** * * Use in a 1-player game when there are multiple drones on the other team. * This process keeps the other lifebar/name/combo meter display up-to-date. * It won't do a rewire within #LATENCY ticks of the last rewire unless the * currently displayed wrestler is dead. * .bss #LAST_REWIRE,32 #LATENCY .equ TSEC/2 SUBR rewire_monitor move @buddy_mode_on,a14 jrnz #buddy move @royal_rumble,a14 jrnz #rumble ;quit if we're a two-player game move @PSTATUS,a14 cmpi 3,a14 jreq #die ;quit if we're a 1v1 game move @NUM_OPPS,a14 cmpi 1,a14 jreq #die ;okay, we should run. figure out which PLYRNUM to key on. Choose ; the first active process, since that'll either be the only human ; or the lone attract mode drone. (Even if we do decide to show ; 2v2 battles in attract mode, nobody dies so it's okay to always ; key on the first drone.) ;NOTE: The reason we store the PLYRNUM to key on instead of the ; process pointer is that if we allow 2v2 mode and the human can ; switch control from one drone to the next, we can't count on ; PLYRNUM's and process ptrs always matching up! #run movi NUM_WRES,a0 movi process_ptrs,a1 #lp0 move *a1+,a2,L jrnz #found dsj a0,#lp0 ;Hey! No active processes! Bitch, then quit. .if DEBUG LOCKUP .endif #die DIE #found move *a2(PLYRNUM),a10 ;key plyrnum move *a2(CLOSEST_NUM),a11 ;previous closest (current disp.) #loop move a10,a1 calla get_process_ptr move a0,a6 ;key process (recomputed every wake) move *a6(CLOSEST_NUM),a1 cmp a11,a1 jreq #no ;closest has changed. only rewire if PCNT >= @#LAST_REWIRE+#LATENCY, ; or if the old guy is dead. move a11,a1 ;old guy... calla get_process_ptr move *a0(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #rewire ;dead? move @PCNT,a0,L move @#LAST_REWIRE,a1,L addi #LATENCY,a1 cmp a1,a0 jrle #no ;enough time since last chg? #rewire move *a6(CLOSEST_NUM),a1 calla get_process_ptr move a0,a7 ;new closest proc move *a7(PLYR_SIDE),a0 ;side to display move *a7(PLYRNUM),a1 ;PLYRNUM to display callr rewire_meter move @PCNT,a14,L move a14,@#LAST_REWIRE,L move *a6(CLOSEST_NUM),a11 #no SLOOP 10,#loop **** #rumble ;royal rumble. Never rewire the left meter. Toggle the right ; meter every four seconds between plyrnums 2 and 3. Don't ; toggle to or stay on a dead guy. movk 3,a9 ;pretend we're on PLYRNUM 3... jruc #toggle ;...so that we can just toggle to initialize. #rloop ;see if we're displaying a dead guy. move a9,a1 calla get_process_ptr move *a0(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #toggle ;still alive. time to toggle anyway? dec a8 jrle #toggle ;not time yet. SLOOP 10,#rloop #toggle move a9,a1 ;is THIS guy dead? xori 1,a1 ;toggle between 2 and 3 calla get_process_ptr move *a0(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #notogl ;new guy is dead. skip it. move a1,a9 movk 1,a0 callr rewire_meter movk TSEC*4/10,a8 #notogl SLOOP 10,#rloop **** #buddy ;buddy mode. This one is easy: Show the human, unless he's dead ; and his drone teammate is alive. Don't assume, once the human ; is dead, that he'll stay that way. Buckoffs and all. clr a8 ;displayed player on team 0 movk 1,a9 ;displayed player on team 1 #bloop clr a1 calla get_process_ptr move *a0(PLYRMODE),a14 cmpi MODE_DEAD,a14 jrne #p1liv #p1ded ;plyr 1 is dead--check his drone. movk 2,a1 calla get_process_ptr move *a0(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #p1liv ;show the human anyway ;p1 is dead and his drone is alive. show the drone. cmpi 2,a8 jreq #ckp2 ;already showing the drone. skip it. clr a0 movk 2,a1 move a1,a8 callr rewire_meter jruc #ckp2 #p1liv ;plyr 1 is alive (or his drone is dead). show him. TEST a8 jrz #ckp2 ;already showing the human. skip it. clr a0 clr a1 move a1,a8 callr rewire_meter #ckp2 movk 1,a1 calla get_process_ptr move *a0(PLYRMODE),a14 cmpi MODE_DEAD,a14 jrne #p2liv #p2ded ;plyr 2 is dead--check his drone. movk 3,a1 calla get_process_ptr move *a0(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #p2liv ;show the human anyway ;p2 is dead and his drone is alive. show the drone. cmpi 3,a9 jreq #bnap ;already showing the drone. skip it. movk 1,a0 movk 3,a1 move a1,a9 callr rewire_meter jruc #bnap #p2liv ;plyr 2 is alive (or his drone is dead). show him. cmpi 1,a9 jrz #bnap ;already showing the human. skip it. movk 1,a0 movk 1,a1 move a1,a9 callr rewire_meter #bnap SLOOP 10,#bloop #***************************************************************************** * 'rewires' a meter display for a different wrestler * >a0 = display(0 or 1), >a1= playernum (0 to NUM_WRES-1) SUBR rewire_meter PUSH a2,a3,a4,a5,a6,a7,a8,a9,a10,a11 ;set the pointers ;point a5 at the MD_???? block for the display movi MD_SIZE,a5 mpyu a0,a5 addi meter_data,a5 ;point a6 at the PLT_???? block for PLYRNUM move a1,a3 X64 a3 ;x by PLT_SIZE movi life_data,a6 add a3,a6 ;set MD_LINK move a1,*a5(MD_LINK) ;point a7 at PLYRNUM's process move a1,a7 X32 a7 addi process_ptrs,a7 move *a7,a7,L ;change the combo bar PUSH A0 MOVE *A6(PLT_COMBO_SIZE),A2 ; MOVE @BONUS_POWER,A14 ; CMP A14,A2 move @instant_combos_on,a14 jrz #norm_combos clr a14 jruc #do_check #norm_combos movk 16,a14 #do_check cmp a14,a2 ; CMPI 16,A2 JRGE WE_ARE_IN_COMBO_MODE MOVE A0,A1 SLL 4,A1 ADDI COMBO_FLASH_FLAG,A1 MOVE *A1,A8 JRZ NO_NEED_TO_KILL_COMBO_PROC CLR A8 MOVE A8,*A1 ADDI FLASH_COMBO_PID,A0 MOVI -1,A1 CALLA KILALL NO_NEED_TO_KILL_COMBO_PROC PULL A0 MOVE *A5(MD_COMBO),A8,L CLR A14 MOVE A0,A0 JRZ NO_NEED_TO_SET_XFLIP MOVI M_FLIPH,A14 NO_NEED_TO_SET_XFLIP MOVI SUPER_P,A0 CALLA pal_getf MOVE A0,*A8(OPAL) MOVE *A6(PLT_COMBO_SIZE),A0 SLL 5,A0 ADDI WHICH_SIZE_BAR,A0 MOVE *A0,A0,L MOVE *A0(ICTRL),A1 OR A14,A1 ORI 8000H|DMAWNZ,A1 MOVE A1,*A8(OCTRL) move *a0(IANIOFF),*A8(ODOFF),L move *a0(ISAG),*a8(OSAG),L move *a0(0),*a8(OSIZE),L JRUC JUMP_BACK_IN WE_ARE_IN_COMBO_MODE ;IS THIS NECESSARY! SLL 4,A0 ADDI COMBO_FLASH_FLAG,A0 MOVE *A0,A1 JRNZ WE_ARE_ON_RIGHT_SETTING MOVK 1,A1 MOVE A1,*A0 PULL A1 PUSH A1 ADDI FLASH_COMBO_PID,A1 PUSH A7 MOVI FLASH_COMBO,A7 MOVE *A5(MD_COMBO),A8,L CALLA GETPRC PULL A7 WE_ARE_ON_RIGHT_SETTING PULL A0 JUMP_BACK_IN ;change the name move *a5(MD_NAME),a8,L move *a7(WRESTLERNUM),a1 move @royal_rumble,a14 jrz #uname move *a7(PLYRNUM),a14 jrz #buddy0 cmpi 1,a14 jrgt #uname .if DEBUG LOCKUP ;rewire to PLYRNUM 1 in buddy mode!? .endif #buddy0 ;It's a royal rumble. Create the pair of names to go with the slash. ; This code only executes once for the left meters in rumble mode. .ref index1,index2 PUSH a8 TBL_OBJ lname move @index1,a0 X32 a0 addi shortname_tbl,a0 move *a0,a0,L calla civanic move *a8(OXPOS),a1 subk 8,a1 move *a0(ISIZEX),a14 sub a14,a1 move *a0(IANIOFFX),a14 add a14,a1 move a1,*a8(OXPOS) TBL_OBJ lname move @index2,a0 X32 a0 addi shortname_tbl,a0 move *a0,a0,L calla civanic move *a8(OXPOS),a1 addk 8,a1 move *a0(ISIZEX),a14 add a14,a1 move *a0(IANIOFFX),a14 sub a14,a1 move a1,*a8(OXPOS) movk 10,a1 PULL a8 #uname X32 a1 addi name_tbl,a1 move *a1,a0,L calla civanic #rets PULL a2,a3,a4,a5,a6,a7,a8,a9,a10,a11 rets name_tbl .long NAM_BRT,NAM_RZR,NAM_UND,NAM_YOK,NAM_SHN .long NAM_BAM,NAM_DNK,NAM_DNK,NAM_LEX,NAM_LEX .long WSF10SLSx shortname_tbl .long SHORTHRT,SHORTRZR,SHORTUND,SHORTYOK,SHORTSHN .long SHORTBAM,SHORTDNK,SHORTDNK,SHORTLEX,SHORTLEX #***************************************************************************** * Updates (resizes) the bars on a meter display. * >a0 = meter (0 or 1) SUBRP update_meter ;aim a1 at the MD struct movi MD_SIZE,a1 mpyu a0,a1 addi meter_data,a1 ;aim a3 at the PLT struct move *a1(MD_LINK),a2 move a2,a3 X64 a3 ;x by PLT_SIZE addi life_data,a3 ;set the life bar move *a1(MD_LIFE),a8,L move *a3(PLT_CLIFE),a14 neg a14 addi LIFE_MAX,a14 ;a14 is pixels to hide move a14,*a8(OFSET) JRZ #NOT_TO_WORRY cmpi 2,a2 jrge we_are_a_drone_ignore move a2,a6 X32 a6 addi process_ptrs,a6 move *a6,a6,L move *a6(OUTSIDE_ALONE),a1 jrz we_are_a_drone_ignore move @ROLLING_COUNT,A0 sll 31,a0 jrnz ignore_it move *a8(OFLAGS),a1 xori M_NODISP,A1 move a1,*a8(OFLAGS) ignore_it rets we_are_a_drone_ignore MOVE @WHICH_SCREEN,A1,L CMPI DUMRETS,A1 JREQ #NOT_TO_WORRY MOVE *A8(OFLAGS),A1 ORI M_NODISP,A1 MOVE A1,*A8(OFLAGS) RETS #NOT_TO_WORRY MOVE *A8(OFLAGS),A1 ANDI 0FFFFH-M_NODISP,A1 MOVE A1,*A8(OFLAGS) RETS ; movi 5,a7 ; mpyu a14,a7 ; move *a8(OIMG),a14,L ; move *a14(ISAG),a14,L ; add a14,a7 ; move a7,*a8(OSAG),L rets #***************************************************************************** * Returns the remaining health for a player * >a1 = PLYRNUM * a0 = amount to add to player's health total * >a1 = PLYRNUM * >a10= attacker's process ptr * * Returns carry bit set if we're dead at the end of this, even if we * were dead when the function was called. Returns carry clear if we're * alive afterwards. * * HACK ALERT: In royal rumble mode, the two human players share a lifebar. * This is implemented by halving all damage done to human players, and * then redirecting any damage done to player 1 to player 0 instead. * So right away we save the actual PLYRNUM, then change from 1 to 0 in * royal rumble mode. When it comes time to animate, we restore the * original. * .bss #actual_plyrnum,16 ;reg use: ; a3 = adjusted health ; a4 = current health ; a5 = player life meter pointer ;a13 = our process pointer SUBR adjust_health PUSH a1,a3,a4,a5,a8,a10,a13 ;save the original PLYRNUM move a1,@#actual_plyrnum ;if we're in royal rumble mode and PLYRNUM is 1, make it zero. move @royal_rumble,a14 jrz #pnumok cmpi 1,a1 jrne #pnumok clr a1 #pnumok **** ;get process pointer move a1,a13 X32 a13 addi process_ptrs,a13 move *a13,a13,L **** ;get the meter struct pointer move a1,a5 X64 a5 ;x by PLT_SIZE addi life_data,a5 **** ;get health move *a5(PLT_LIFE),a4 **** ;skip the whole routine if we're dead and taking damage TEST a0 jrnn #x0 ;not taking damage move *a13(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #already_dead #x0 **** ;skip multiplier if we're getting life back. TEST a0 jrnn #no_multiplier **** ;make sure a10 is valid move *a13(WHOHITME),a14,L jrz #no_valid_attacker ;must have this. WHOHITME is init'd cmp a14,a10 ; to 0, and will thus match a cleared jrne #no_valid_attacker ; a10, with unpredictable results. **** ;teammates do 1 pixel damage to each other move *a10(PLYR_SIDE),a3 move *a13(PLYR_SIDE),a14 xor a3,a14 jrnz #norum1 ;in 8-on-1, do half dmg to teammates instead of 1 pixel calla is_8_on_1 jrnc #do_1 sra 1,a0 jruc #norum1 #do_1 movi -1,a0 #norum1 **** ;doing a combo? move *a10(COMBO_COUNT),a14 jrz DO_NORMAL_ADJUST_CHECK move a14,a0 ;it's a combo. Clean DAM_MULT and adjust the damage: ; 0 < hit# < 12: damage = 15 - hit# ; hit# > 11: damage = 4 clr a14 move a14,@DAM_MULT ; subk 12,a0 ; subk 11,a0 subk 10,a0 CMPI -4,A0 JRLE #no_multiplier MOVI -4,A0 JRUC #no_multiplier DO_NORMAL_ADJUST_CHECK ;not a combo. check for a multiplier. move @DAM_MULT,a9 jrz #no_multiplier ;compute new damage val ;MULT 2: damage *= 3/2 ;MULT 3: damage *= 4/2 ;MULT 4+: damage *= 5/2 move a0,a14 #mul_lp add a14,a0 dsj a9,#mul_lp sra 1,a0 ;clr DAM_MULT clr a14 move a14,@DAM_MULT #no_valid_attacker #no_multiplier **** ;Adjust damage based on the number of drones, unless we're adding ;life. TEST a0 jrnn #dc_adj_done ;count active drones ; count = 0 in attract mode, 4 in 8-on-1, 5 in buddy mode, 6 in ; 8-on-2. PUSH a1,a2,a3 movk 4,a3 calla is_8_on_1 jrc #adc_set movk 5,a3 move @buddy_mode_on,a14 jrnz #adc_set movk 6,a3 move @royal_rumble,a14 jrnz #adc_set clr a3 move @PSTATUS,a14 jrz #adc_set movi process_ptrs+40h,a1 movi NUM_WRES-2,a2 #lp0 move *a1+,a14,L jrz #adc_set inc a3 dsj a2,#lp0 #adc_set X32 a3 addi #damage_mod_table,a3 ;add 10h if the target is a player move *a13(PLYR_TYPE),a14 cmpi PTYPE_DRONE,a14 jreq #adc_drone addk 10h,a3 #adc_drone move *a3,a3 mpyu a0,a3 move a3,a0 sra 8,a0 PULL a1,a2,a3 #dc_adj_done **** ;Adjust damage based on game time adjustment move @speed_adjustment,a14,L mpys a14,a0 sra 16,a1 move a1,a0 **** ;Store away dmg this plyr has done for later analysis, but only ; if we're taking damage and a10 matches WHOHITME. TEST a0 jrnn #nostore move *a13(WHOHITME),a14,L cmp a14,a10 jrne #nostore move *a10(DAMAGE_GIVEN),a14 sub a0,a14 ;(damage is negative) move a14,*a10(DAMAGE_GIVEN) #nostore ;do range checking on the damage value. Don't allow a wrestler ; to have a life value below zero or above LIFE_MAX. move a0,a3 add a4,a3 ;a3 is new life total jrle #bzero cmpi LIFE_MAX,a3 jrle #dmg_ok movi LIFE_MAX,a3 jruc #dmg_ok #bzero ;this hit will kill us. If it was a 20+ point hit, and it killed ; us by a margin of 6 pixels or less, fudge it by taking five ; off the damage cmpi -10,a3 jrle #no_fudge ;skip if life is -4 or less cmpi -20,a0 jrgt #no_fudge ;skip if the hit wasn't 25 or more ;fudge it. Add 5 to the adjusted life to keep us alive addk 5,a3 movk 5,a3 ;and add 5 to the health adjustment (thus subtracting five from ; the damage done), just to be safe. ; addk 5,a0 jruc #dmg_ok #no_fudge clr a3 ;if we're in attract mode, don't die! move @PSTATUS,a14 jrnz #norm1 MOVI LIFE_MAX,a3 #norm1 ;if he's out of life and we're in debug mode, fill him up. .if DEBUG move @fight_debug,a14 jrz #dmg_ok movi LIFE_MAX,a3 .endif #dmg_ok move a3,*a5(PLT_LIFE) ;update LAST_DAMAGE move @PCNT,a14 move a14,*a13(LAST_DAMAGE) ;figure out if we need to flash the lifebar as a warning. ;if a4 > 30 and a3 <= 30, fire off a danger process. ; re above: a4 is current life, a3 is life after this hit. cmpi 30,a4 jrle #no_danger_proc cmpi 30,a3 jrgt #no_danger_proc ;skip this if we have any teammates move a13,a0 calla ck_any_teammates jrc #no_danger_proc CREATE FLASH_PID,flash_obj move a13,*a0(PDATA),L #no_danger_proc TEST a3 jrnz #not_dead ;player IS dead. -- time to restore original PLYRNUM move @#actual_plyrnum,a1 calla get_process_ptr move a0,a13 ;set I_WILL_DIE on dead human's teammate if we're in royal rumble ; mode. move @royal_rumble,a14 jrz #norum cmpi 2,a1 jrge #norum xori 1,a1 calla get_process_ptr movk 1,a14 move a14,*a0(I_WILL_DIE) xori 1,a1 #norum ;if dying guy is a drone, and we're in 8-on-? mode, decrement ; wrestler_count and wake up the wrestler_counter process. move @#actual_plyrnum,a1 cmpi 2,a1 jrlt #notd8 ;Set the COUNTED_DEAD bit too. If it's already set, don't decrement ; wrestler_count again. move *a13(STATUS_FLAGS),a14,L btst B_COUNTED_DEAD,a14 jrnz #notd8 ori M_COUNTED_DEAD,a14 move a14,*a13(STATUS_FLAGS),L move @wrestler_count_proc,a0,L ; Does the counter proc exist ? jrz #notd8 ; br = no move @wrestler_count,a14 ; Current count == 0 ? jrz #notd8 ; br = yes dec a14 ; Decrement it move a14,@wrestler_count ; Write it back movk 1,a14 ; Make counter proc wakeup on next tick move a14,*a0(PTIME) #notd8 ;Is combo mode on for this player? move *a13(WHOHITME),a8,L callr CHECK_COMBO_GO jrlt #ok ;Am I in the middle of a combo? move *a8(COMBO_COUNT),a0 jrz #ok ;Give him some life back movk 1,a14 move a14,*a5(PLT_LIFE) move a14,*a13(I_WILL_DIE) jruc #already_dead #ok ;temp! - 314 .if DEBUG DBEVENT BDE_DIES,a13,L,*a13(WRESTLERNUM),W,*a13(PLYRNUM),W .endif ;death sound movi 034h,a0 calla triple_sound clr a14 move a14,*a13(ROLL_POS) ;Lookup table based on wrestler type move *a13(WHOHITME),a10,L ;* wrestler process move *a10(ATTACK_MODE),a0 cmpi AMODE_BLBOWDROP,a0 jrz #skip0 cmpi AMODE_BSTOMP,a0 jrz #skip0 cmpi AMODE_BUTTSTOMP,a0 jrz #skip0 ;if death by buzzer, jump to #skip0 ONLY if it was unblocked. cmpi AMODE_BUZZ,a0 jrne #nobuzz move *a13(PLYRMODE),a14 cmpi MODE_BLOCK,a14 jrne #skip0 #nobuzz ;if our DEAD_ANIM bit is set, don't animate move *a13(STATUS_FLAGS),a14 btst B_DEAD_ANIM,a14 jrnz #skip0 move *a13(WRESTLERNUM),a0 X32 a0 move *a13(PLYRMODE),a14 cmpi MODE_DEAD,a14 jrz #grnd cmpi MODE_ONGROUND,a14 jrnz #fall #grnd addi convulse_t,a0 move *a0,a0,L calla change_anim1a #skip0 SETMODE DEAD calla wres_collis_off calla flash_red PULL a1,a3,a4,a5,a8,a10,a13 setc rets #fall ;Check plyr mode, attempt a death fall back ;Otherewise, just set mode dead cmpi MODE_NORMAL,a14 jrz #fallbk cmpi MODE_RUNNING,a14 jrz #fallbk cmpi MODE_INAIR,a14 jrz #fallbk cmpi MODE_INAIR2,a14 jrz #fallbk cmpi MODE_BOUNCING,a14 jrz #fallbk cmpi MODE_ONTURNBKL,a14 jrz #fallbk cmpi MODE_BLOCK,a14 jrz #fallbk cmpi MODE_DIZZY,a14 jrz #fallbk cmpi MODE_CLIMBTURNBKL,a14 jrz #fallbk cmpi MODE_HEADHOLD,a14 jrz #fallbk cmpi MODE_HEADHELD,a14 jrz #will_die ;Puppet mode? Others? ;How best to deal with this? ; LOCKUP ;At least zero vels? clr a0 move a0,*a13(OBJ_XVEL),L move a0,*a13(OBJ_ZVEL),L move a0,*a13(OBJ_YVEL),L SETMODE DEAD #skip calla wres_collis_off calla flash_red PULL a1,a3,a4,a5,a8,a10,a13 setc rets #will_die ; movk 1,a0 ; move a0,*a13(I_WILL_DIE) movi 3*60,a0 move a0,*a13(I_WILL_DIE) jruc #skip #fallbk addi #fallbacks_t,a0 move *a0,a0,L calla change_anim1a move *a13(OBJ_XVEL),a2,L cmpi [2,0],a2 jrgt #okz movi [2,0],a2 move *a13(OBJ_XPOSINT),a1 move *a13(WHOHITME),a0,L ;* wrestler process move *a0(OBJ_XPOSINT),a0 cmp a0,a1 ;offx - defx jrgt #fall_right ;attacker on left movi [-2,0],a2 #fall_right move a2,*a13(OBJ_XVEL),L #okz calla wres_collis_off SETMODE DEAD calla flash_red PULL a1,a3,a4,a5,a8,a10,a13 setc rets #already_dead calla flash_red PULL a1,a3,a4,a5,a8,a10,a13 setc rets #not_dead PULL a1,a3,a4,a5,a8,a10,a13 clrc rets ; tgt = drone tgt = player #damage_mod_table .word _85PCT, _85PCT ;0 drones .word _100PCT, _100PCT ;1 drone .word _110PCT, _90PCT ;2 drones .word _125PCT, _75PCT ;3 drones .word _145PCT, _60PCT ;8-on-1 match .word _110PCT, _90PCT ;buddy mode match .word _130PCT, _30PCT ;8-on-2 match SUBR fallbacks_t #fallbacks_t #fall_back REFLONG hrt_fall_back_anim ;0 Bret Hart REFLONG rzr_fall_back_anim ;1 Razor Ramon REFLONG und_fall_back_anim ;2 Undertaker REFLONG yok_fall_back_anim ;3 Yokozuna REFLONG shn_fall_back_anim ;4 Shawn Michaels REFLONG bam_fall_back_anim ;5 Bam Bam REFLONG dnk_fall_back_anim ;6 Doink .long 0 ;7 spare REFLONG lex_fall_back_anim ;8 Lex Luger SUBR convulse_t #hitonground REFLONG hrt_hitonground_anim ;0 Bret Hart REFLONG rzr_hitonground_anim REFLONG und_hitonground_anim ;2 Undertaker REFLONG yok_hitonground_anim ;3 Yokozuna REFLONG shn_hitonground_anim ;4 Shawn Michaels REFLONG bam_hitonground_anim ;5 Bam Bam REFLONG dnk_hitonground_anim ;6 Doink .long 0 ;7 spare REFLONG lex_hitonground_anim ;8 Lex Luger #***************************************************************************** * Create the credits display at the top of the screen * SUBR start_credbox ;draw the panel TBL_OBJ #plate callr update_credit_msg rets *************************************** * Display credit info - Gets called from coin routines. * * Trashes a0-a7 SUBR update_credit_msg PUSH a8,a9,a10 ;Only turn on these messages if during gameplay, or player select! .ref SHOW_CRD_FLAG move @SHOW_CRD_FLAG,a0 jrnz #cont0 move @GAMSTATE,a0 cmpi INSELECT,a0 jrz #cont CMPI INPARTY,A0 JREQ #cont CMPI INPREGAME,A0 JREQ #cont CMPI INPREGAME2,A0 JREQ #cont subk INGAME,a0 jrne #x #cont0 ;When coins are entered, and the game is being played, tell the meter ;code to display approproiate coinin message. ;Get meter process info movi METER_PID,a0 clr a1 not a1 calla EXISTP jrz #cont movk 1,a1 move a1,*a0(P1CNTR) move a1,*a0(P2CNTR) clr a1 move a1,*a0(P1STATE) move a1,*a0(P2STATE) #cont movi CLSDEAD|CREDITID,a0 calla obj_del1c ;kill credit/qrtr imgs TBL_OBJ #plate movi freeply,a10 movk ADJFREPL,a0 CALLA GET_ADJ ;SEE IF FREEPLAY......(Z BIT CLEAR IF SO!) jrnz #freep movi credit,a10 calla GET_CREDITS calla BINBCD move a0,a9 sll 32-4,a0 srl 32-4-5,a0 ;*32 addi #numfont,a0 move *a0,a2,L movi [216,0],a0 movi [6,0],a1 ; movi 1006,a3 ;Z movi 1901H,a3 ;Z movi DMAWNZ|M_SCRNREL,a4 movi CLSDEAD|CREDITID,a5 clr a6 clr a7 calla BEGINOBJ srl 4,a9 sll 32-4,a9 srl 32-4-5,a9 ;*32 addi #numfont,a9 move *a9,a2,L movi [211,0],a0 movi [6,0],a1 calla BEGINOBJ #freep movi [179,0],a0 movi [6,0],a1 move a10,a2 ; movi 1006,a3 ;Z movi 1901H,a3 ;Z movi DMAWNZ|M_SCRNREL,a4 movi CLSDEAD|CREDITID,a5 clr a6 clr a7 calla BEGINOBJ #x PULL a8,a9,a10 rets *************************************** * config data * #plate .word 176,4,1900H ;X, Y, Z .long crplate ;IMG .word DMAWNZ|M_SCRNREL ;CTRL .word CLSDEAD|CREDITID ;OID .long 0,0 ;XVEL, YVEL .even #numfont .long font60 .long font61 .long font62 .long font63 .long font64 .long font65 .long font66 .long font67 .long font68 .long font69 #***************************************************************************** * Moves PLT_CLIFE toward PLT_LIFE if it isn't already there. * >a0 = PLYRNUM #lifebar_deltavee equ 2 ;pixels per tick of motion SUBRP inc_life ;aim a1 at PLT block move a0,a1 X64 a1 ;x by PLT_SIZE addi life_data,a1 ;check the values move *a1(PLT_LIFE),a2 move *a1(PLT_CLIFE),a3 cmp a2,a3 jrz #done ;CLIFE is lagging. move it toward LIFE jrgt #shrink ;CLIFE needs to grow addi #lifebar_deltavee,a3 cmp a3,a2 jruc #set #shrink subi #lifebar_deltavee,a3 cmp a2,a3 #set jrge #inrange ;overshot it move a2,a3 #inrange move a3,*a1(PLT_CLIFE) #done rets #***************************************************************************** * Flash the background of the life meter for the current player. * >a10 = plyrnum danger_snd equ 0b9h SUBRP flash_obj ;if we're a drone and we have teammates, ignore this. cmpi 1,a10 jrle #ndie move a10,a1 calla get_process_ptr move *a0(PLYR_SIDE),a4 movi process_ptrs+40h,a1 movi NUM_WRES-2,a2 #lp0 move *a1+,a3,L jrz #ndie ;done at first inactive cmp a0,a3 jreq #nxt0 ;skip self move *a3(PLYR_SIDE),a14 cmp a4,a14 jreq #die ;die--we have a teammate #nxt0 dsj a2,#lp0 #ndie ;find the bar obj calla arm_comeback_award movi danger_snd,a0 calla triple_sound ;danger music - skip if in 8-on-2 mode calla is_8_on_1 jrc #die move @royal_rumble,a14 jrnz #die movi 18,a3 move @temp_music,a14 cmpi 15,a14 jreq end_music_set movk 26,a3 end_music_set calla SNDSND movi danger,a2 movi [85h,0],a0 move *a13(PDATA),a1,L move *a1(PLYR_SIDE),a1 jrz #p1 movi [0e4h,0],a0 #p1 movi [18h,0],a1 movi name_z,a3 ;Z movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags movi CLSDEAD,a5 clr a6 clr a7 calla BEGINOBJ movk 20,a9 #lp move a10,a0 X32 a0 addi process_ptrs,a0 move *a0,a0,L move *a0(CLOSEST_NUM),a14 X32 a14 addi process_ptrs,a14 move *a14,a14,L move *a14(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #deldie move *a0(PLYRMODE),a0 cmpi MODE_DEAD,a0 jreq #deldie SLEEPK 7 movi WSF_R_P,a0 calla pal_getf move a0,*a8(OPAL) SLEEPK 4 movi WSF_W_P,a0 calla pal_getf move a0,*a8(OPAL) dsj a9,#lp #deldie calla DELOBJA8 #die DIE ****************************************************************************** SUBRP do_win_streaks move @p1winstreak,a0 jrz #p2 callr streak_1 #p2 move @p2winstreak,a0 jrz #x callr streak_2 #x rets streak_1 cmpi 99,a0 jrls #maxok movi 99,a0 #maxok calla BINBCD move a0,a9 sll 32-4,a0 srl 32-4-5,a0 ;*32 addi #f_t,a0 move *a0,a2,L movi [3dh,0],a0 movi [23h,0],a1 movi name_z,a3 ;Z movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags movi CLSDEAD,a5 clr a6 clr a7 calla BEGINOBJ MOVE A8,@WINS_OBJ,L srl 4,a9 sll 32-4,a9 srl 32-4-5,a9 ;*32 addi #f_t,a9 move *a9,a2,L movi [36h,0],a0 movi [23h,0],a1 calla BEGINOBJ MOVE A8,@WINS_OBJ+20H,L TBL_OBJ lwin MOVE A8,@WINS_OBJ+40H,L rets streak_2 cmpi 99,a0 jrls #maxok2 movi 99,a0 #maxok2 calla BINBCD move a0,a9 sll 32-4,a0 srl 32-4-5,a0 ;*32 addi #f_t,a0 move *a0,a2,L movi [175h,0],a0 movi [23h,0],a1 movi name_z,a3 ;Z movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags movi CLSDEAD,a5 clr a6 clr a7 calla BEGINOBJ MOVE A8,@WINS_OBJ,L move a8,a10 srl 4,a9 sll 32-4,a9 srl 32-4-5,a9 ;*32 addi #f_t,a9 move *a9,a2,L movi [16eh,0],a0 movi [23h,0],a1 calla BEGINOBJ MOVE A8,@WINS_OBJ+20H,L TBL_OBJ rwin MOVE A8,@WINS_OBJ+40H,L rets #f_t .long WFONT_0,WFONT_1,WFONT_2,WFONT_3,WFONT_4 .long WFONT_5,WFONT_6,WFONT_7,WFONT_8,WFONT_9 .ref match_cnt #***************************************************************************** * STRUCTPD LONG BLINK_PROC announce_match MOVI CROWD_CHEER_0,A3 CALLA SNDSND clr a0 move a0,*a13(BLINK_PROC),L move @PSTATUS,a0 jrnz #noamode clr a0 move a0,@HALT DIE #noamode .if DEBUG .ref skip_select move @skip_select,a0 jrz #noskp clr a0 move a0,@HALT DIE #noskp .endif ; SLEEP 28h ; movi 28h,a10 ; JSRP wait_on_butn movi ram_lst,a11 clr a0 movi 39,a1 #lp move a0,*a11+,L dsjs a1,#lp movi ram_lst,a11 movi [252h,0],a0 ;x pos movi [3eh,0],a1 ;y pos movi MTCHPLT,a2 movi MPLTPRPP,b0 movi 1800h,a3 ;z pos callr #begin_obj movi [252h,0],a0 ;x pos movi [3eh,0],a1 ;y pos movi MNMEPLT,a2 movi MPLTPRPP,b0 movi 1800h,a3 ;z pos callr #begin_obj movi [574,0],a0 ;x pos movi [4Fh,0],a1 ;y pos movi MATCH,a2 movi WGFS_W_P,b0 movi 1801h,a3 ;z pos callr #begin_obj MOVE A8,B3 CLR B4 CLR B5 CLR B6 move @match_cnt,a0 cmpi 999,a0 jrls #maxok movi 999,a0 #maxok calla BINBCD move a0,a9 move a0,a10 sll 32-4,a0 srl 32-4-5,a0 ;*32 addi #f_t,a0 move *a0,a2,L movi [252h,0],a0 ;x pos movi [43h,0],a1 ;y pos movi WGFS_W_P,b0 movi 1802h,a3 ;z pos callr #begin_obj MOVE A8,B4 srl 4,a9 sll 32-4,a9 srl 32-4-5,a9 ;*32 move a9,a9 jrz #ok2 addi #f_t,a9 move *a9,a2,L movi [252h,0],a0 ;x pos movi [43h,0],a1 ;y pos movi WGFS_W_P,b0 movi 1802h,a3 ;z pos callr #begin_obj MOVE A8,B5 srl 8,a10 sll 32-4,a10 srl 32-4-5,a10 ;*32 move a10,a10 jrz #ok2 addi #f_t,a10 move *a10,a2,L movi [252h,0],a0 ;x pos movi [43h,0],a1 ;y pos movi WGFS_W_P,b0 movi 1802h,a3 ;z pos callr #begin_obj MOVE A8,B6 #ok2 MOVE *B3(OSIZEX),B7 ADDI 5,B7 MOVE *B4(OSIZEX),B0 ADD B0,B7 ADDK 3,B7 MOVE B5,B5 JRZ NO_NEED_TO_ADD_TO_X SUBK 3,B7 MOVE *B5(OSIZEX),B0 ADD B0,B7 MOVE B6,B6 JRZ NO_NEED_TO_ADD_TO_X MOVE *B6(OSIZEX),B0 ADD B0,B7 NO_NEED_TO_ADD_TO_X SRL 1,B7 MOVI 252H,B8 SUB B7,B8 MOVE B8,*B3(OXPOS) ADDI 5,B8 MOVE B5,B5 JRNZ NO_EXTRA_SPACE ADDK 3,B8 NO_EXTRA_SPACE MOVE B6,B6 JRZ NO_NEED_TO_ADD_TO_X2A MOVE *B3(OSIZEX),B7 ADD B7,B8 MOVE B8,*B6(OXPOS) JRUC X2A_ADDED NO_NEED_TO_ADD_TO_X2A MOVE B3,B6 X2A_ADDED MOVE B5,B5 JRZ NO_NEED_TO_ADD_TO_X2B MOVE *B6(OSIZEX),B7 ADD B7,B8 MOVE B8,*B5(OXPOS) JRUC X2B_ADDED NO_NEED_TO_ADD_TO_X2B MOVE B3,B5 X2B_ADDED MOVE *B5(OSIZEX),B7 ADD B7,B8 MOVE B8,*B4(OXPOS) ;Print the text on the little plate ;This will be a table lookup which points to match type ;(Ex. Best 2 of 3, Intercontinental Championship, WWF Championship ;Lumberjack match, Tag Team Bout, This contest is for 1 fall!, etc.) ;Make sure we have enough ram set aside for the largest ;message possible. (ram_lst) movi [253h,0],a0 ;x pos movi [68h,0],a1 ;y pos ;set a3 to 1 if this is the final match, 0 otherwise clr a3 calla is_final_match jrnc #a3set movk 1,a3 #a3set movi WHICH_MATCH,a2 SLL 5,A3 ADD A3,A2 MOVE *A2,A2,L movi WSF_W_P,b0 movi 1801h,a3 ;z pos movi DMAWNZ|M_SCRNREL,a4 ;DMA flags movi CLSNEUT|TYPTEXT|SUBMES1,a5 clr a6 ;x vel clr a7 ;y vel calla BEGINOBJP ;Place all of the new plates & string characters onto the ram_lst that ;gets scrolled. movi OBJLST,a14 movi CLSNEUT|TYPTEXT|SUBTXT,a0 movi CLSNEUT|TYPTEXT|SUBMES1,a2 #lp2 move *a14,a14,L jrz #x move *a14(OID),a1 cmp a2,a1 jrz #add cmp a0,a1 jrne #lp2 #add move a14,*a11+,L jruc #lp2 #x ;This will blink between red/white CREATE CYCPID,blink_font move a0,*a13(BLINK_PROC),L ;Slide everthing onto screen movi >b6,a0 calla triple_sound movi 20h,a10 ;30 #onscr_loop SLEEPK 1 movi [200,0],a0 callr #set_x dsj a10,#onscr_loop calla is_8_on_1 jrc #skip_do_rounds ;skip this if this is the final match CREATE ANNC_PID,DO_ROUNDS #skip_do_rounds ;In middle CREATE SOUND_PID,ring_bell ; SLEEP 20h .ref IKIL1C .ref show_options movi PU_CHECK_PID,a0 calla IKIL1C CREATE0 show_options movi 50h,a10 ;80 .ref wait_on_butn JSRP wait_on_butn movi >b6,a0 calla triple_sound movi 16h,a10 ;23 #offscr_loop SLEEPK 1 movi [0feb0h,0],a0 callr #set_x dsj a10,#offscr_loop move *a13(BLINK_PROC),a0,L calla KILL clr a0 move a0,@HALT movi CLSNEUT|TYPTEXT|SUBTXT,a0 calla obj_del1c ;delete text/plates movi CLSNEUT|TYPTEXT|SUBMES1,a0 calla obj_del1c ;delete text/plates ;set round_start_time move @PCNT,a14,L move a14,@round_start_time,L DIE #f_t .long WGSF22_0,WGSF22_1,WGSF22_2,WGSF22_3,WGSF22_4 .long WGSF22_5,WGSF22_6,WGSF22_7,WGSF22_8,WGSF22_9 WHICH_MATCH .LONG BESTOF3 .LONG ROYRUM .LONG ELIMMTCH .LONG TAGTEAM .LONG ONEFALL .LONG LUMBMTCH ;#ln0a_setup ; JAM_STR osgemd_ascii,6,0,247h,43h,BLUE,0 ; ;#ln0b_setup ; JAM_STR osgemd_ascii,6,0,23fh,43h,BLUE,0 ; ;#ln1_setup ; JAM_STR sgmd8_ascii,5,0,252h,80h-10,SGMD8WHT2,0 ; ;#ln2_setup ; JAM_STR sgmd8_ascii,5,0,252h,8bh-10,SGMD8WHT2,0 ; ;#str_rounds ; .string "ROUNDS",0 ; .even blink_font SLEEPK 2 movi 20,a10 #top movi WSF_R_P,a0 calla pal_getf movi ram_lst,a11 #lp3 move *a11+,a8,L jrz #x2 move *a8(OID),a14 cmpi CLSNEUT|TYPTEXT|SUBMES1,a14 jrnz #lp3 move a0,*a8(OPAL) jruc #lp3 #x2 SLEEPK 4 movi WSF_W_P,a0 calla pal_getf movi ram_lst,a11 #lp4 move *a11+,a8,L jrz #x3 move *a8(OID),a14 cmpi CLSNEUT|TYPTEXT|SUBMES1,a14 jrnz #lp4 move a0,*a8(OPAL) jruc #lp4 #x3 SLEEPK 7 dsj a10,#top announcing_being_done DIE ****************************************************************************** STRUCTPD LONG #CREATOR ;UHL proc ptr to whoever created us LONG #ORIGIN ;UHL approx address of our create call .if DEBUG ;doesn't execute -- just here for TV viewing move *a13(#CREATOR),a14,L move *a13(#ORIGIN),a14,L .endif SUBR announce_rnd_winner ;process ;temp! - 314 .if DEBUG DBEVENT BDE_ARW_START,a13,L,*a13(#CREATOR),L,*a13(#ORIGIN),L .endif #fini_wait move @in_finish_move,a14 ; Are we doing a finishing move ? jrz #fini_done ; br = no SLEEPK 10 jruc #fini_wait #fini_done movi ANNC_PID,a0 clr a1 not a1 calla EXISTP ; janz SUCIDE jrz #tmpok ;temp! - 314 .if DEBUG DBEVENT BDE_ARW_DEXIST,a13,L,*a13(#CREATOR),L,*a13(#ORIGIN),L .endif DIE #tmpok move @annc_rnd_winner_done,a14 jrz #arwd_ok .if DEBUG ;temp! - 314 DBEVENT BDE_ARW_FLAGDIE,a13,L,*a13(#CREATOR),L,*a13(#ORIGIN),L .endif DIE #arwd_ok ;if anyone is trying to do a buckoff, wait for them to finish up. #any_b callr anyone_bucking TEST a0 jrz #nobuck ;temp! - 314 .if DEBUG DBEVENT BDE_ARW_ATTEMPT,a13,L,*a13(#CREATOR),L,*a13(#ORIGIN),L .endif ;Someone's trying to do a buckoff. We'll give them 120 ticks or ; until someone hits an ANI_LOOP statement, then figure out what ; to do from there. SLEEP 90 ;NOTE: If someone hits an ANI_LOOP command and ; their DID_PIN bit is set, they'll check and ; see if we're sleeping at arw_bwait, and if we ; are, they'll wake us up right away. SUBR arw_bwait ;temp! - 314 .if DEBUG DBEVENT BDE_ARW_WAKEUP,a13,L,*a13(#CREATOR),L,*a13(#ORIGIN),L .endif ;check for anyone with their NEW_BUCKOFF bit set. If we find any, ; clear that bit on anyone who's got it set. movi process_ptrs,a0 movi NUM_WRES,a1 clr a3 #lp0 move *a0+,a2,L jrz #nxt0 ;skip inactive move *a2(STATUS_FLAGS),a14,L btst B_NEW_BUCKOFF,a14 jrz #nxt0 ;got one andni M_NEW_BUCKOFF,a14 move a14,*a2(STATUS_FLAGS),L inc a3 #nxt0 dsj a1,#lp0 ;now check for an all-dead condition. If neither team is dead, die. calla get_live_bits cmpi 3,a0 jrne #1ded ;temp! - 314 .if DEBUG DBEVENT BDE_ALL_ALIVE,a13,L,*a13(#CREATOR),L,*a13(#ORIGIN),L .endif jauc SUCIDE #1ded ;1 team is dead. If nobody did a buckoff during our nap, end the ; round. If someone did, jump up to #any_b, which checks to see ; if there's any more buckoff candidates. TEST a3 jrnz #any_b ;temp! - 314 .if DEBUG DBEVENT BDE_ARW_NOBUCK,a13,L,*a13(#CREATOR),L,*a13(#ORIGIN),L .endif ;there was at least one wrestler who could have done a buckoff, ; but was too slow. For EVERYONE, clear BUCKOFF_COUNT, clear ; the DO_BUCKOFF flag, and set the NO_BUCKOFF flag. movi process_ptrs,a0 movi NUM_WRES,a1 clr a3 #lp6 move *a0+,a2,L jrz #nxt6 ;skip inactive move a3,*a2(BUCKOFF_COUNT) move *a2(STATUS_FLAGS),a14,L andni M_DO_BUCKOFF,a14 ori M_NO_BUCKOFF,a14 move a14,*a2(STATUS_FLAGS),L #nxt6 dsj a1,#lp6 #nobuck ;temp! - 314 .if DEBUG DBEVENT BDE_ARW_ENDRND,a13,L,*a13(#CREATOR),L,*a13(#ORIGIN),L .endif ;set round_end_time move @PCNT,a0,L move a0,@round_end_time,L ;set annc_rnd_winner_done movk 1,a14 move a14,@annc_rnd_winner_done ;set EVERYONE'S NO_BUCKOFF flags, just to be safe. callr set_all_buckoffs MOVI ZFLIP_FOR_SURE,A0 MOVE A0,@ZFLIP_POS_VAR,L MOVI CROWD_VICTORY_LOOP,A3 CALLA SNDSND callr set_winner ;a3 = PLYRNUM of a wrestler on the winning ; team. The pinner if there is one. jrn #do_game_over X32 a3 addi process_ptrs,a3 move *a3,a10,L move @p1rounds,a0 cmpi 2,a0 jrz at_end move @p2rounds,a0 cmpi 2,a0 jreq at_end calla calc_match_time_1 jruc timer_updated at_end ;#let_finish_happen ; move @in_finish_move,a0 ; Did a finish move get started? ; jrz #no_finish_move ; br = no ; SLEEPK 1 ; Wait for it to finish ; jruc #let_finish_happen ;#no_finish_move move @p1rounds,a0 move @p2rounds,a3 or a0,a3 cmpi 2,a3 jrnz #no_2_rnd_victory calla is_8_on_1 jrc #no_2_rnd_victory MATCH_AWARD a10,TWO_RND_AWD #no_2_rnd_victory calla calc_match_time_2 timer_updated callr is_perfect jrnc #not_perfect MATCH_AWARD a10,PERFECT_AWD CREATE ADD_INIT_PID,CREATE_PERFECT SLEEP 55+50 #not_perfect ;NOT_PERFECT_MATCH ;a10=*proc of wrestler who just pinned opponent ;-not neccesarily: if the win was by disqualification or timeout, there's ; no pin. SLEEPK 30 ;Place token on top of winner, then have it float up to the top of the screen movi 27,a3 calla SNDSND move *a10(PLYR_SIDE),a0 CALLA CALL_MATCH_OVER SLEEPK 20 ;has anyone won the match? move @p1rounds,a0 cmpi 2,a0 jrz DO_WAIT move @p2rounds,a0 cmpi 2,a0 jrnz #go0 DO_WAIT CLR A0 MOVE A0,@MUSIC_HAP ;Increment his win count calla increment_wincount ;don't draw the text if this is a royal rumble move @royal_rumble,a14 jrnz #skip_rw callr replace_wins #skip_rw ;wait 1 sec or until a press movi TSEC,a9 #wl0 SLEEPK 1 calla get_all_buttons_cur2 jrnz #go0 dsjs a9,#wl0 #go0 move @p1rounds,a9 cmpi 2,a9 jreq #won_match move @p2rounds,a14 cmpi 2,a14 jreq #won_match add a14,a9 dec a9 jruc #won_fall #won_match movk 2,a9 #won_fall ; calla is_8_on_1 ; jrnc #no_fireworks ; move @p1rounds,a0 ; move @p2rounds,a14 ; or a0,a14 ; cmpi 2,a14 ; jrlt #no_fireworks ; JSRP do_fireworks ;#no_fireworks move *a10(PLYR_SIDE),a11 movi 0c4h,a0 calla triple_sound CREATE ANNC_PID,CREATE_END_ROUND_TOP SLEEPK 15 CREATE ANNC_PID,CREATE_END_ROUND_BOT SLEEPK 10 CREATE ANNC_PID,CREATE_END_ROUND_ICON SLEEPK 20 ;Move round awards into match awards section and annunciate round awards for ;each human player. Then clear out round awards. calla is_it_a_really_quick_win calla give_award_if_opponent_is_human calla check_for_award_for_big_comeback calla accumulate_awards ; Accumulate awards for each player CALLA CLEAR_SPEECH_REPEAT move @p1rounds,a0 cmpi 2,a0 jrz #end move @p2rounds,a0 cmpi 2,a0 jrnz #not_end #end calla check_for_award_for_winstreak clr a0 move a0,@award_ok_to_die,L CREATE AWARD_PID,create_end_rnd_awards CREATE SOUND_PID,DO_RIGHT_MUSIC move @royal_rumble,a0 jrnz #no_award_wait #wait_awards_dead SLEEPK 1 move @award_ok_to_die,a0,L cmpi 3,a0 jrlt #wait_awards_dead #no_award_wait ;wait 1 sec or until a press movi TSEC*3,a9 #wl1 SLEEPK 1 calla get_all_buttons_cur2 jrnz #go1 dsjs a9,#wl1 #go1 movk 4,a0 move a0,@award_ok_to_die,L MOVI ANNC_PID,A0 CLR A1 NOT A1 CALLA KILALL movi 25,a0 ; Tips every 25 consecutive wins move @p1winstreak,a1 ; p1 winstreak ? jrnz #tip_chk ; br = yes #ck_p2 move @p2winstreak,a1 ; p2 winstreak ? jrz #ck_mtch_num ; br = no #tip_chk modu a0,a1 ; 25 wins? jrz #do_tip ; br = yes #ck_mtch_num movi 100,a0 ; Tips every 100 matches move @match_cnt,a1 ; Get match count modu a0,a1 ; Time for a tip jrnz #no_tip ; br = no #do_tip CREATE 04000h,show_mk3_tip ; Show a random mk3 tip SLEEPK 2 #no_tip MOVE @MUSIC_HAP,A0 JRNZ MUSIC_ALREADY_GOING CREATE SOUND_PID,DO_RIGHT_MUSIC2 MUSIC_ALREADY_GOING MOVK 2,A0 move a0,@match_over CALLA KILL_ALL_CHANNELS MOVI 4DH,A0 CALLA triple_sound clr a0 move a0,@HALT DIE ******** * Create game over process and die SUBRP #do_game_over CREATE0 do_game_over ;it'll set it's own PROCID DIE ******** * Play's a wrestler's music SUBRP DO_RIGHT_MUSIC SLEEP 55 SUBRP DO_RIGHT_MUSIC2 MOVK 1,A0 MOVE A0,@MUSIC_HAP MOVE *A10(WRESTLERNUM),A11 SLL 4,A11 ADDI #wrestler_tunes,A11 MOVE *A11,A3 calla SNDSND DIE #wrestler_tunes .word 5,2,1,7,6,4,8,0,3 #not_end move @royal_rumble,a14 jrnz #no_run_boxes JSRP show_dufus_messages ; Shows run msg (only between rounds) #no_run_boxes ;wait 105 ticks or until a press movi 105,a9 #wl2 SLEEPK 1 calla get_all_buttons_cur2 jrnz #go2 dsjs a9,#wl2 #go2 ;Hey! REAL programmers don't use go2's! ;if the dufus msg boxes are on make sure their ;on for at least 1 second move @dboxes_on,a0,L ; Any dufus msg boxes on? jrz #death_ok ; br = no cmpi 50,a9 ; Has 1 second passed ? jrle #death_ok ; br = yes subi 50,a9 ; Give me remainder of 1 second #dbox_wait SLEEPK 1 dsjs a9,#dbox_wait #death_ok movk 1,a0 move a0,@award_ok_to_die,L MOVI ANNC_PID,A0 CLR A1 NOT A1 CALLA KILALL ;STOP BAR MOTION IF NEED BE MOVE @PSTATUS,A5 CMPI 3,A5 JREQ RESET_HUMAN_VS_HUMAN MOVE *A10(PLYRNUM),A3 CMPI 2,A3 JRGE RESET_HUMAN_VS_HUMAN NOT A5 SLL 30,A5 SRL 30,A5 DEC A5 JRUC WRESTLERS_RESET HUMAN_WON_IT RESET_HUMAN_VS_HUMAN MOVE *A10(WHOIHIT),A1,L MOVE *A1(PLYRNUM),A5 WRESTLERS_RESET ;Cause wrestlers to re-appear in the correct spot to start the next round. CALLA CLEAR_SPEECH_REPEAT ;do new music for the coming round MOVE @current_round,A1 MOVI 16,A3 CMPI 2,A1 JREQ NOT_THIRD_MATCH MOVI 17,A3 NOT_THIRD_MATCH CALLA SNDSND NO_LOWER movk 8,a8 movk 1,a9 jsrp CLOSE_VERT_SCREEN_LINE MOVI LINES_VERT,A1 MOVE A1,@WHICH_SCREEN,L movi CLSNEUT|TYPTEXT|SUBMES1,a0 calla obj_del1c ;delete text/plates movi ZFLIP_POS,a0 move a0,@ZFLIP_POS_VAR,L calla reset_for_round calla reset_for_round2 movi TIMER_PID,a0 movi -1,a1 calla EXISTP jrz dont_update_clock pushst dint push a13 move a0,a13 calla update_timer movi WGFS_W_P,a0 calla pal_getf move *a13(PDATA+20h),a8,L ;10's image pointer move a0,*a8(OPAL) move *a13(PDATA),a8,L ;10's image pointer move a0,*a8(OPAL) pull a13 popst dont_update_clock ;Update the meters clr a0 MOVE A0,@DAM_MULT callr update_meter movk 1,a0 callr update_meter ;reset the scroller position calla init_scroller calla INIT_SKIRTS calla BGND_UD1 ;Now display "round 2" or "round 3" CREATE SOUND_PID,ring_bell movk 1,a0 move a0,@HALT SLEEPK 1 calla BGND_UD1 CREATE SKIRT_PID,CHANGE_SKIRTS2 SLEEPK 1 calla BGND_UD1 ; CREATE SKIRT_PID,CHANGE_SKIRTS2 SLEEPK 1 movk 8,a8 movk 1,a9 jsrp OPEN_VERT_SCREEN_LINE CREATE ANNC_PID,DO_ROUNDS SLEEP 50 CALLA VINCE_START_ROUND2_3 clr a0 move a0,@HALT SLEEP 40 movi CLSNEUT|TYPTEXT|SUBMES1,a0 calla obj_del1c ;delete text/plates movi CLSNEUT|TYPTEXT|SUBTXT,a0 calla obj_del1c ;delete text/plates clr a0 move a0,@HALT ;reset round_start_time move @PCNT,a14,L move a14,@round_start_time,L DIE ****************************************************************************** SUBRP DO_ROUNDS movi [200,0],a0 ;x pos movi [255,0],a1 ;y pos movi RNDPLAT,a2 movi RNDPLT_P,b0 movi 1800h,a3 ;z pos callr #begin_obj clr a0 move a0,*a8(OID) PUSH A8 move @current_round,a0 MOVI RNDNUM_1,A2 DEC A0 JRZ #OKAY MOVI RNDNUM_2,A2 DEC A0 JRZ #OKAY MOVI RNDNUM_3,A2 DEC A0 JRZ #OKAY MOVI RNDNUM_4,A2 #OKAY movi [200,0],a0 ;x pos movi [255,0],a1 ;y pos movi RNDNUM_P,b0 movi 1801h,a3 ;z pos callr #begin_obj clr a0 move a0,*a8(OID) PULL A9 MOVK 20,A10 LOOP_ROUNDS_ON MOVI [190,0],A0 CALLR ZIP_ROUNDS_ON SLEEPK 1 DSJS A10,LOOP_ROUNDS_ON movk 20,a10 JSRP wait_on_butn MOVK 20,A10 LOOP_ROUNDS_OFF MOVI [300,0],A0 CALLR ZIP_ROUNDS_ON SLEEPK 1 DSJS A10,LOOP_ROUNDS_OFF calla DELOBJA8 move a9,a0 calla DELOBJ DIE ZIP_ROUNDS_ON move *a8(OYVAL),a1,L sub a1,a0 sra 3,a0 move *a8(OYVAL),a2,L add a0,a2 move a2,*a8(OYVAL),L move *a9(OYVAL),a2,L add a0,a2 move a2,*a9(OYVAL),L RETS #set_x movi ram_lst,a11 move *a11,a8,L move *a8(OXVAL),a1,L sub a1,a0 sra 3,a0 #lp5 move *a11+,a8,L jrz #x4 move *a8(OXVAL),a2,L add a0,a2 move a2,*a8(OXVAL),L jruc #lp5 #x4 rets #begin_obj movi DMAWNZ|M_SCRNREL,a4 ;DMA flags movi CLSNEUT|TYPTEXT|SUBTXT,a5 clr a6 ;x vel clr a7 ;y vel calla BEGINOBJP rets blink_text SLEEPK 10 #lp1 movi SGMD8RED2,a0 calla pal_getf move a0,*a8(OPAL) SLEEPK 4 movi SGMD8WHT2,a0 calla pal_getf move a0,*a8(OPAL) SLEEPK 7 jruc #lp1 ******************************************************************************* SUBR FIRSTATT_MESS move a10,a0 movi FIRSTATT,a8 move *a0(PLYR_SIDE),a9 clr a10 pushp a10 movi 1801h,a11 jruc #common SUBR BONUS_MESS ;Process which displays high risk - 2x damage & possibly move name ;This comes in from Secret button moves ;A8=* plyr proc of who fired off the move ;A10=# of move message ;Messages display the first time only clr a14 move a10,a10 ;No message jrz #already jrnn #reg #tag ;Taunt style high risk move - give 3x dmg PUSHP a14 ; movk 3,a1 ; move a1,@DAM_MULT RND_AWARD a8,HIGH_RISK_AWD ; give award for high risk move *a8(PLYR_SIDE),a9 MOVI HIGHRISK,A8 CLR A10 MOVI 1801H,A11 CREATE0 MAYBE_HIGH_RISK callr is_there_one_already jrnz #exit CREATE MESSAGE_PID,SPECIAL_MESSAGE MOVI 0BBH,A0 ;Guitar snd CALLA triple_sound SLEEP 50 movk 4,a10 jruc #inhere #reg move *a8(RISK),a1 btst 15,a1 ;Taunt style high risk move - give 3x dmg jrnz #tag move a10,a3 movi message_flag,a2 cmpi 32,a3 jrlt normal_thing2 addi 32,a2 subi 32,a3 normal_thing2 move *a2,a0,L btst a3,a0 jrnz #already ;Set the bit which says I've been displayed already! movk 1,a1 sll a3,a1 or a1,a0 move a0,*a2,L sll 5,a10 addi #message_tbl,a10 move *a10,a14,L #already PUSHP a14 ; movk 2,a1 ; move *a8(RISK),a14 ; btst 15,a14 ; jrz #reg2 ; ;;Taunt style high risk move - give 3x dmg ; movk 4,a1 ;#reg2 move a1,@DAM_MULT movk 2,a1 move a1,@DAM_MULT RND_AWARD a8,HIGH_RISK_AWD ; give award for high risk move *a8(PLYR_SIDE),a9 MOVI HIGHRISK,A8 CLR A10 MOVI 1801H,A11 CREATE0 MAYBE_HIGH_RISK #common callr is_there_one_already jrnz #exit CREATE MESSAGE_PID,SPECIAL_MESSAGE MOVI 0BBH,A0 ;Guitar snd CALLA triple_sound SLEEP 50 movk 2,a10 #inhere MOVI xDAMAGE,A8 MOVI 1803H,A11 CREATE MESSAGE_PID,SPECIAL_MESSAGE ;Wait for 2x to leave ;Try to print correct move name SLEEP 50 ;Get back message img addr to display PULLP a8 jaz SUCIDE callr DO_THIS_MESS DIE SUBRP is_there_one_already MOVE A9,A1 NOT A1 SLL 31,A1 SRL 31-4,A1 ADDI MESSAGE_FLAGS,A1 MOVE *A1,A0 rets SET_MESS_FLAGS MOVE A9,A1 NOT A1 SLL 31,A1 SRL 31-4,A1 ADDI MESSAGE_FLAGS,A1 MOVE A0,*A1 RETS ******************************************************************************* SUBR MOVE_NAME_ANNC ;Process which displays move name ;This comes in from actual script - like a hip toss announce ;A8=* plyr proc of who fired off the move ;A10=# of move message ;Messages display the first time only cmpi 41,a10 jrz #skip move @reduce_bog,a14 jrnz #exit #skip move *a8(PLYR_SIDE),a9 callr is_there_one_already jrnz #exit move a10,a3 movi message_flag,a2 cmpi 32,a3 jrlt normal_thing addi 32,a2 subi 32,a3 cmpi 9,a3 jrz #cont normal_thing move *a2,a0,L btst a3,a0 jrnz #exit ;Set the bit which says I've been displayed already! movk 1,a1 sll a3,a1 or a1,a0 move a0,*a2,L #cont sll 5,a10 addi #message_tbl,a10 move *a10,a8,L callr DO_THIS_MESS #exit DIE ;Add new move img names here: #message_tbl .long 0 ;0 = Blank .long HEADSLAM ;1 .long 0 ;2 .long SNAPMIRR ;3 .long FRANKEN ;4 * .long BACKBRKR ;5 .long BODYSLAM ;6 .long PILEDRV ;7 .long FIRSTATT ;8 ; saved for Jason .long ARMBREAK ;9 * .long ARMDRAG ;10 * ;RAZOR & HART HIP TOSS .long BACKDROP ;11 * ;BAM BAM HIP TOSS .long BACKSUPL ;12 * ;SHAWN MICHEALS .long BANZAI ;13 * .long BEHMBUTT ;14 * ;BAM BAM RUNNING BUTT DROP .long CROSFIRE ;15 * .long DDT ;16 * .long DOBLSNAP ;17 * ;SHAWN KICK .long ELBOWDRP ;18 ;EVERYBODY MOSTLY .long EYERAKER ;19 * .long FACESLAM ;20 * .long FIRESPL ;21 * ;BAM BAM OFF TURNBUCKLES .long CLAPPER ;22 * ;DOINK .long FLYBUTT ;23 ? .long FLYCLOTH ;24 * .long HAMMER ;25 * .long HIPTOSS ;26 * ;LEX YOKO .long BIGBOOT ;27 * ;EVERYBODY .long JOYBUZZ ;28 * .long MYSTGLVE ;29 ; .long NAPALM ;30 ; .long POGOPILE ;31 * .long RAPIDRND ;32 * .long RAZOREDG ;33 * .long SCISSOR ;34 * ;YOKO .long SKULLCRK ;35 * .long SLMONKEY ;36 * .long SPEEDKIK ;37 * .long SPLASH ;38 ;BAMBAM TURNBUCKLE DROP, EVENTUALLY .long SUNSETFL ;39 * ;SHAWN FLIP .long TOMBPLDR ;40 * .long SECWND09 ;41 .long VERTSUPL ;42 * ;YOKO LEX ******************************************************************************* DO_THIS_MESS ;a8=*message to print ;a9=0 or 1 ;if this is the second wind message, skip the permission check cmpi SECWND09,a8 jreq #skip_perm_check ;no messages in no-bog mode? move @no_debris,a14 jrnz NO_MORE_MESS move a9,a0 sll 5,a0 addi p1powerup_request,a0 move *a0,a0,L btst MOVE_NAMES_ON_BIT,a0 jrz NO_MORE_MESS #skip_perm_check ;Don't allow overlaps! CLR A10 MOVI 1805H,A11 ;1801 CREATE MESSAGE_PID,SPECIAL_MESSAGE MOVI 0BBH,A0 ;Move name annc snd CALLA triple_sound NO_MORE_MESS RETS ******************************************************************************* SUBR DO_REVERSAL_MESS RND_AWARD a8,REVERSAL_AWD ; give award for reversal movi 15Ch,a0 calla ADD_VOICE move *a8(PLYR_SIDE),a9 CREATE MESSAGE_PID,CREATE_REVERSAL_MESS RETS SUBRP CREATE_REVERSAL_MESS ;process callr is_there_one_already jrnz exit_reversal MOVI REVERS,A8 CLR A10 MOVI 1801H,A11 CREATE MESSAGE_PID,SPECIAL_MESSAGE MOVI 0BBH,A0 CALLA triple_sound exit_reversal DIE #**************************************************************************** * Returns process ptr to first wrestler we can find who's trying a buckoff. SUBR anyone_bucking ;no buckoffs allowed in royal rumble mode move @royal_rumble,a14 jrnz #no movi process_ptrs,a0 movi NUM_WRES,a1 #lp move *a0+,a2,L jrz #nxt move *a2(STATUS_FLAGS),a14,L btst B_DO_BUCKOFF,a14 jrz #nxt btst B_NEW_BUCKOFF,a14 jrnz #yes btst B_DID_BUCKOFF,a14 jrnz #nxt #yes move a2,a0 rets #nxt dsj a1,#lp #no clr a0 rets #**************************************************************************** * Sets everyone's NO_BUCKOFF flag. SUBRP set_all_buckoffs movi process_ptrs,a0 movi NUM_WRES,a1 #lp move *a0+,a2,L jrz #nxt move *a2(STATUS_FLAGS),a14 ori M_NO_BUCKOFF,a14 move a14,*a2(STATUS_FLAGS) #nxt dsj a1,#lp rets #**************************************************************************** * * Returns carry set if everyone on winning team is unharmed. * Exception: Never returns C if final match. * * >a10 = proc of a wrestler on the winning team (anyone will do) * SUBRP is_perfect calla is_8_on_1 jrc #final PUSH a2,a3,a4,a5 move *a10(PLYR_SIDE),a5 movi NUM_WRES,a2 movi process_ptrs,a3 #lp move *a3+,a4,L jrz #nxt ;skip inactive move *a4(PLYR_SIDE),a14 cmp a5,a14 jrne #nxt ;skip enemies move *a4(PLYRNUM),a1 callr get_health cmpi LIFE_MAX,a0 jreq #nxt ;okay - unharmed ;injured guy found. return !c PULL a2,a3,a4,a5 #final clrc rets #nxt dsj a2,#lp ;no injured teammates found. return c PULL a2,a3,a4,a5 setc rets #***************************************************************************** SUBR DO_COMBO_MESS ;Combo messages come from the scripts MOVE @combo_audit_done,A0 JRNZ YES_WE_HAVE movi AUD_COMBO,A0 calla AUD1 MOVK 1,A0 MOVE A0,@combo_audit_done YES_WE_HAVE ;if our combo_broken bit is set, blow out of here altogether. ; We audit it, but we don't adjust the bar or display any kind of ; message. move *a13(STATUS_FLAGS),a14,L btst B_COMBO_BROKEN,a14 jrnz #rets MOVE *A13(PLYRNUM),A9 MOVI HITCOMBO,A8 MOVE *A13(COMBO_COUNT),A10 DEC A10 ;We need to announce even the lowly combos ;How can you have a combo of 1 ????? CMPI 2,A10 JRLT NO_MESSAGE cmpi 10,a10 jrlt #award_reg_combo RND_AWARD a13,UCOMBOS_AWD jruc #combo_awd_done #award_reg_combo RND_AWARD a13,COMBOS_AWD ; give award for combo started #combo_awd_done MOVI 0BAH,A0 ;0BAH humbug! CALLA triple_sound MOVI 01A4H,A0 ;INCREDIBLE COMBINATION MOVE ! CALLA ADD_VOICE ;Add a couple for a better appearance! CMPI 5,A10 JRLE NO_MIGHT_BE_OBVIOUS addk 2,a10 NO_MIGHT_BE_OBVIOUS MOVI 1803H,A11 move *a13(PLYR_SIDE),a9 ;Don't allow combo message to come out if other message there... callr is_there_one_already jrnz NO_MESSAGE CREATE MESSAGE_PID,SPECIAL_MESSAGE NO_MESSAGE ;HACK ALERT: In royal rumble, the two human players share one combo ; meter. This means that if player 1 (on the right) calls this, ; we clear HIS combo count but we zero his TEAMMATES bar. ; Confusing, eh? CLR A0 MOVE A0,*A13(COMBO_START) move *a13(PLYR_SIDE),a1 move *a13(PLYRNUM),a11 cmpi 1,a11 jrne #norum move @royal_rumble,a14 jrz #norum ;pretend we're player 0 clr a1 ;side clr a11 ;PLYRNUM ;clear_combo_meter jumps here! SUBRP zero_combo_meter #norum movi MD_SIZE,a9 mpyu a1,a9 addi meter_data,a9 MOVE *A9(MD_COMBO),A8,L move a11,a5 X64 a5 ;x by PLT_SIZE ADDI life_data,A5 CLR A2 ;halve_combo_meter jumps here! SUBRP draw_combo_meter MOVE A2,*A5(PLT_COMBO_SIZE) SLL 5,A2 ADDI WHICH_SIZE_BAR,A2 MOVE *A2,A0,L move *a0(IANIOFF),*A8(ODOFF),L move *a0(ISAG),*a8(OSAG),L MOVE *A0(ISIZEX),*A8(OSIZE),L PUSH A0,a1 MOVE A1,A0 SLL 4,A0 ADDI COMBO_FLASH_FLAG,A0 CLR A2 MOVE A2,*A0 ADDI FLASH_COMBO_PID,A1 MOVE A1,A0 MOVI -1,A1 CALLA KILALL PULL A0,a1 ;get the flip right sll B_FLIPH,a1 move *a0(ICTRL),a14 or a1,a14 ori 8000H|DMAWNZ,a14 move a14,*a8(OCTRL) MOVI SUPER_P,A0 CALLA pal_getf MOVE A0,*A8(OPAL) NO_GO_AWAY #rets RETS ******************************************************************************* * SUBRP SPECIAL_MESSAGE ZIP_SPEED .EQU 18H BUFF .EQU 25 ;A8=IMAGE TO PLACE UP ;A9=WHICH SIDE (1 OR 2) ;A10=NUMBER OF BONUS MULTIPLIER 2-5 (IF NECESSARY) ;A11=ZPOS TO PLACE BLOCK (SO DAMAGE x GOES OVER OTHER) MOVK 1,A0 CALLR SET_MESS_FLAGS PUSHP A9 NOT A9 SLL 31,A9 SRL 31,A9 MOVI 10H,A0 ;Whoosh CALLA triple_sound MOVE A11,B5 CLR A11 MOVE A8,A2 MOVE *A2(ISIZEX),A3 CMPI xDAMAGE,A2 JREQ SPECIAL_CASE_THIS CMPI HITCOMBO,A2 JRNE ONLY_THIS_SIZE SPECIAL_CASE_THIS ADDI 19,A3 MOVE A10,A0 CALLA BINBCD MOVE A0,A10 MOVE A10,A11 SRL 4,A11 JRZ ONLY_THIS_SIZE MOVI HITCOMBO2,A2 ADDI 21,A3 CMPI 1,A11 JRNE ONLY_THIS_SIZE SUBI 4,A3 ONLY_THIS_SIZE MOVI TYPE_MESS2,A5 ADDI BUFF*2,A3 MOVI 410,A0 MOVE A0,A7 SUB A3,A7 SLL 16,A7 DEC A9 JRNZ WE_SET_XPOS MOVI TYPE_MESS1,A5 MOVE A3,A0 NEG A0 MOVI [BUFF,0],A7 ADDK BUFF,A0 WE_SET_XPOS SLL 16,A0 MOVE A0,*A13(PDATA+120H),L MOVE A7,*A13(PDATA+100H),L MOVI [230+4,0],A1 MOVE B5,A3 ADDK 1,A3 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags CLR A6 CLR A7 MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10 calla BEGINOBJ move *a8(OIMG),a0,L cmpi SECWND09,a0 jrnz #nospec ;We need to animate this second wind message CREATE0 flash_2ndwind #nospec MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9,A10 PUSH A8 MOVI WHICH_BONUS_2,A14 CMPI xDAMAGE,A2 JREQ WE_HAVE_NUMBERS CMPI HITCOMBO,A2 JREQ WE_HAVE_NUMBERS MOVI WHICH_BONUS_1,A14 CMPI HITCOMBO2,A2 JRNE NO_NEED_FOR_THIRD_OBJ WE_HAVE_NUMBERS SLL 32-4,A10 SRL 32-4-5,A10 ;*32 ADD A14,A10 MOVE *A10,A2,L MMTM SP,A0,A1,A3,A4,A5,A6,A7,A11 calla BEGINOBJ MMFM SP,A0,A1,A3,A4,A5,A6,A7,A11 MOVE A8,A10 MOVE A11,A7 SLL 32-4,A7 JRZ NO_NEED_FOR_THIRD_OBJ SRL 32-4-5,A7 ;*32 ADDI WHICH_BONUS_2,A7 MOVE *A7,A2,L CLR A7 MMTM SP,A0,A1,A5,A6,A7 CMPI 1,A11 JRNE NO_REPOS_THIS_NUM ADDI [4,0],A0 NO_REPOS_THIS_NUM calla BEGINOBJ MMFM SP,A0,A1,A5,A6,A7 MOVE A8,A11 NO_NEED_FOR_THIRD_OBJ MOVE *A8(OSIZEX),A2 MOVI 395,A3 SUB A2,A3 SUBI BUFF,A3 SLL 16,A0 SUB A3,A0 MOVI MVEBAR_B,A2 movi DMAWNZ|M_FLIPH|M_3D|M_SCRNREL,a4 ;DMA flags MOVE A9,A9 JRZ BAR_SET movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags MOVI MVEBAR_R,A2 MOVE *A8(OXVAL),A0,L SUBI [BUFF,0],A0 BAR_SET MOVE B5,A3 calla BEGINOBJ MOVE A8,A9 PULL A8 MOVI ZIP_SPEED,A3 MOVE_IT_ON MOVE *A13(PDATA+100H),A0,L CALLR MOVE_BARS PUSHP A3 SLEEPK 1 PULLP A3 DSJS A3,MOVE_IT_ON SLEEP 50 MOVI ZIP_SPEED,A3 MOVE_IT_OFF MOVE *A13(PDATA+120H),A0,L SLA 1,A0 CALLR MOVE_BARS PUSHP A3 SLEEPK 1 PULLP A3 DSJS A3,MOVE_IT_OFF CALLA DELOBJA8 MOVE A9,A8 CALLA DELOBJA8 MOVE A10,A8 JRZ NO_A10_3 CALLA DELOBJA8 NO_A10_3 MOVE A11,A8 JRZ NO_A11_3 CALLA DELOBJA8 NO_A11_3 PULLP A9 CLR A0 CALLR SET_MESS_FLAGS DIE MOVE_BARS PUSH A8 MOVE *A8(OXVAL),A1,L SUB A1,A0 SRA 3,A0 CALLR MOVE_THIS_PART MOVE A9,A8 JRZ NO_A11_PART CALLR MOVE_THIS_PART MOVE A10,A8 JRZ NO_A10_PART CALLR MOVE_THIS_PART NO_A10_PART MOVE A11,A8 JRZ NO_A11_PART CALLR MOVE_THIS_PART NO_A11_PART PULL A8 RETS MOVE_THIS_PART MOVE *A8(OXVAL),A2,L ADD A0,A2 MOVE A2,*A8(OXVAL),L RETS WHICH_BONUS_2 .LONG X0X,X1X,X2X .LONG X3X,X4X,X5X .LONG X6X,X7X,X8X .LONG X9X WHICH_BONUS_1 .LONG X0X2,X1X2,X2X2 .LONG X3X2,X4X2,X5X2 .LONG X6X2,X7X2,X8X2 .LONG X9X2 Z_FORWARD .EQU 1800H SUBR SHIFT_BARS_IN_Z CLR A0 MOVE A0,@LAST_FLIP SHIFT_BARS_IN_Z_MOTION MOVE @WORLDTLY,A0,L MOVE @ZFLIP_POS_VAR,A1,L CMP A1,A0 JRLT CHECK_IF_WE_ALREADY_FLIPPED_BACK MOVE @LAST_FLIP,A0 JRNZ YES_WE_DID MOVK 1,A0 MOVE A0,@LAST_FLIP CALLR SHIFT_BARS_FORWARD SLOOP 4,SHIFT_BARS_IN_Z_MOTION CHECK_IF_WE_ALREADY_FLIPPED_BACK MOVE @LAST_FLIP,A0 JRZ YES_WE_DID CLR A0 MOVE A0,@LAST_FLIP CALLR SHIFT_BARS_BACK YES_WE_DID SLOOP 4,SHIFT_BARS_IN_Z_MOTION SHIFT_BARS_FORWARD movi OBJLST,a8 movi bak_z,A2 movi name_z,A3 movi Z_FORWARD,A4 JRUC DONT_SHIFT_IT_FORWARD STILL_MORE_TO_CHECK MOVE *A8(OZPOS),A1 CMP a2,A1 JRLT DONT_SHIFT_IT_FORWARD CMP a3,A1 JRGT DONT_SHIFT_IT_FORWARD SHIFT_IT_FORWARD ADD a4,A1 MOVE A1,*A8(OZPOS) DONT_SHIFT_IT_FORWARD MOVE *A8,A8,L JRNZ STILL_MORE_TO_CHECK RETS SHIFT_BARS_BACK movi OBJLST,a8 movi bak_z+Z_FORWARD,A2 movi name_z+Z_FORWARD,A3 movi Z_FORWARD,A4 JRUC DONT_SHIFT_IT_BACK STILL_MORE_TO_CHECK_B MOVE *A8(OZPOS),A1 CMP a2,A1 JRLT DONT_SHIFT_IT_BACK CMP a3,A1 JRGT DONT_SHIFT_IT_BACK SHIFT_IT_BACK SUB a4,A1 MOVE A1,*A8(OZPOS) DONT_SHIFT_IT_BACK MOVE *A8,A8,L JRNZ STILL_MORE_TO_CHECK_B RETS END_BUFF .equ 10 END_POS .EQU 30 END_YPOS .EQU 80 TURM_OFF .EQU 4 WHICH_ROUND .LONG FIRSTFAL,SECNDFAL,MATCHFAL CREATE_END_ROUND_TOP SLL 5,A9 ADDI WHICH_ROUND,A9 MOVE *A9,A2,L CLR A1 MOVE A1,*A13(PDATA+140),L MOVI [END_POS+150+TURM_OFF,0],A1 MOVI [400+END_BUFF+150+TURM_OFF,0],A0 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags MOVE A11,A11 JRNZ WHICH_TEXT_SET MOVI [400-END_POS-150,0],A1 MOVI [0-END_BUFF-150,0],A0 WHICH_TEXT_SET MOVE A1,*A13(PDATA+100H),L MOVI [END_YPOS,0],A1 MOVI 1803H,A3 MOVI CLSNEUT|TYPTEXT|SUBMES1,A5 CLR A6 CLR A7 MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7 calla BEGINOBJ MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7 MOVE A8,A9 MOVI [END_POS+TURM_OFF,0],A1 MOVI [400+END_BUFF+TURM_OFF,0],A0 MOVI MVEBAR_R,A2 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags MOVE A11,A11 JRNZ WHICH_BAR_SET MOVI [400-END_POS,0],A1 MOVI [0-END_BUFF,0],A0 movi DMAWNZ|M_FLIPH|M_3D|M_SCRNREL,a4 ;DMA flags MOVI MVEBAR_B,A2 WHICH_BAR_SET MOVE A1,*A13(PDATA+120H),L MOVI [END_YPOS,0],A1 MOVI 1800H,A3 MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9 calla BEGINOBJ MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9 CLR A0 MOVE A0,*A13(PDATA+140H),L JSRP ZIP_HIM_ON DIE WHICH_WRESTLE_NAME .LONG BIGHRT .LONG BIGRAZ .LONG BIGUND .LONG BIGYOK .LONG BIGSHN .LONG BIGBAM .LONG BIGDNK .LONG 0 .LONG BIGLEX CREATE_END_ROUND_BOT MOVE *A10(WRESTLERNUM),A2 SLL 5,A2 ADDI WHICH_WRESTLE_NAME,A2 MOVE *A2,A2,L MOVI [END_POS+150+TURM_OFF,0],A1 MOVI [400+END_BUFF+150+TURM_OFF,0],A0 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags MOVE A11,A11 JRNZ ON_LEFT MOVI [400-END_POS-150,0],A1 MOVI [0-END_BUFF-150,0],A0 ON_LEFT MOVE A1,*A13(PDATA+100H),L MOVI [END_YPOS+25,0],A1 MOVI 1802H,A3 MOVI CLSNEUT|TYPTEXT|SUBMES1,A5 CLR A6 CLR A7 MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7 movi WGSF_W_P1,b0 ; calla BEGINOBJ calla BEGINOBJP MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7 MOVE A8,A9 MOVI [END_POS+TURM_OFF,0],A1 MOVI AWDNMPL_R,A2 MOVI [400+END_BUFF+TURM_OFF,0],A0 MOVE A11,A11 JRNZ ON_LEFT2 MOVI [400-END_POS,0],A1 MOVI [0-END_BUFF,0],A0 MOVI AWDNMPL_B,A2 movi DMAWNZ|M_FLIPH|M_3D|M_SCRNREL,a4 ;DMA flags ON_LEFT2 MOVE A1,*A13(PDATA+120H),L MOVE A1,*A13(PDATA+140H),L MOVI [END_YPOS,0],A1 DEC A3 MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9 calla BEGINOBJ MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9 PUSH A8 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags MOVI DIAGLGO_R,A2 MOVE A11,A11 JRNZ ON_LEFT3 MOVI DIAGLGO_B,A2 ON_LEFT3 INC A3 calla BEGINOBJ MOVE A8,A10 PULL A8 JSRP ZIP_HIM_ON DIE ZIP_HIM_ON MOVI ZIP_SPEED,A3 MOVE_END_ON MOVE *A13(PDATA+140H),A0,L JRZ NOTHING_IN_A10 PUSH A8 MOVE A10,A8 CALLR MOVE_THIS PULL A8 NOTHING_IN_A10 MOVE *A13(PDATA+100H),A0,L JRZ NOTHING_IN_A9 PUSH A8 MOVE A9,A8 CALLR MOVE_THIS PULL A8 NOTHING_IN_A9 MOVE *A13(PDATA+120H),A0,L CALLR MOVE_THIS PUSHP A3 SLEEPK 1 PULLP A3 DSJS A3,MOVE_END_ON RETP MOVE_THIS MOVE *A8(OXVAL),A1,L SUB A1,A0 SRA 3,A0 JRUC MOVE_THIS_PART END_IPOS1 .EQU 332 END_IPOS2 .EQU 292 END_IYPOS .EQU 54 CREATE_END_ROUND_ICON .ref wrestler_count_proc .ref wrestler_count move @wrestler_count_proc,a0,L ; Does the counter proc exist ? jrz #no_wc_proc ; br = no ; move @wrestler_count,a14 ; Current count == 0 ? ; jrz #no_wc_proc ; br = yes ; dec a14 ; Decrement it clr a14 move a14,@wrestler_count ; Write it back movk 1,a14 ; Make counter proc wakeup on next tick move a14,*a0(PTIME) #no_wc_proc MOVI [END_IPOS1+30,0],B4 MOVI [400-END_IPOS1-30,0],B5 MOVI [END_IPOS1,0],B6 MOVI [400-END_IPOS1,0],B7 MOVE @p1rounds,a1 MOVE A11,A11 JRZ GOT_RIGHT_SIDE MOVE @p2rounds,a1 GOT_RIGHT_SIDE DEC A1 JRZ DO_THE_RIGHT_ROUND MOVI [END_IPOS2+30,0],B4 MOVI [400-END_IPOS2-30,0],B5 MOVI [END_IPOS2,0],B6 MOVI [400-END_IPOS2,0],B7 DO_THE_RIGHT_ROUND CLR A1 MOVE A1,*A13(PDATA+140),L MOVI WWFICON10,A2 MOVE B4,A1 MOVI [400+END_BUFF+150,0],A0 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags MOVE A11,A11 JRNZ WHICH_ICON_SET MOVE B5,A1 MOVI [0-END_BUFF-150,0],A0 WHICH_ICON_SET MOVE A1,*A13(PDATA+100H),L MOVI [END_IYPOS,0],A1 MOVI 1800h+200,A3 MOVE @WORLDTLY,A5,L MOVE @ZFLIP_POS_VAR,A6,L CMP A6,A5 JRGE IN_FORWARD_POS MOVI 200,A3 IN_FORWARD_POS movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags movi TYPWWFICON,a5 CLR A6 CLR A7 MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9 calla BEGINOBJ MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A9 MOVE A8,A9 MOVE B6,A1 MOVI [400+END_BUFF,0],A0 MOVI MVEBAR_R,A2 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags MOVE A11,A11 JRNZ WHICH_BAR2_SET MOVE B7,A1 MOVI [0-END_BUFF,0],A0 movi DMAWNZ|M_FLIPH|M_3D|M_SCRNREL,a4 ;DMA flags MOVI MVEBAR_B,A2 WHICH_BAR2_SET MOVE A1,*A13(PDATA+120H),L MOVE A0,*A13(PDATA+160H),L MOVI [END_IYPOS,0],A1 MOVI 1800h+199,A3 MOVE @WORLDTLY,A5,L MOVE @ZFLIP_POS_VAR,A6,L CMP A6,A5 JRGE IN_FORWARD_POS2 MOVI 199,A3 IN_FORWARD_POS2 MOVI CLSNEUT|TYPTEXT|SUBMES1,A5 CLR A6 CLR A7 MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7 calla BEGINOBJ MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7 JSRP ZIP_HIM_ON SLEEP 20 MOVI ICON_PID,A1 ADD A11,A1 CALLA FIND_ANY_OTHERS MOVI 4DH,A0 CALLA triple_sound MOVI MAKE_ICON_GLOW,A7 CALLA GETPRC MOVE A9,A11 CLR A9 MOVE A9,*A13(PDATA+100),L MOVE *A13(PDATA+160H),*A13(PDATA+120H),L JSRP ZIP_HIM_ON MOVE A11,A8 CREATE FLASH_PID,MAYBE_A_SPARKLE DIE MAKE_ICON_GLOW MOVE A9,A8 MOVI WWF_ICON_ANIM,A1 CALLA setup_back_anim JSRP ANIM_CROWD SLEEP TSEC*10 JRUC MAKE_ICON_GLOW FIND_ANY_OTHERS PUSH A1 MOVE A1,A0 MOVI -1,A1 CALLA EXISTP JRZ NO_MORE MOVK 1,A1 MOVE A1,*A0(PTIME) NO_MORE PULL A1 RETS CANI_END equ 2 + 8000H WWF_ICON_ANIM WL 2,WWFICON01 WL 2,WWFICON02 WL 2,WWFICON03 WL 2,WWFICON04 WL 2,WWFICON05 WL 2,WWFICON06 WL 2,WWFICON07 WL 2,WWFICON08 WL 2,WWFICON09 WL 2,WWFICON10 .WORD CANI_END MAYBE_A_SPARKLE MOVI 120,A0 CALLA RNDRNG0 ADDI 50,A0 CALLA PRCSLP CREATE FLASH_PID,ICON_SPARKLE JRUC MAYBE_A_SPARKLE SUBRP ICON_SPARKLE move @reduce_bog,a14 jrnz #die MOVK 6,A0 CALLA RNDRNG0 SLL 5,A0 ADDI WHERE_SPARKLE,A0 MOVE A0,A2 MOVE *A8(OXPOS),A0 MOVE *A2,A14 ADD A14,A0 MOVE *A8(OYPOS),A1 MOVE *A2(10H),A14 ADD A14,A1 SLL 16,A0 SLL 16,A1 MOVI SPRKLA01,A2 MOVE *A8(OZVAL),A3,L INC A3 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags movi TYPWWFICON,a5 CLR A6 CLR A7 CALLA BEGINOBJ MOVK 2,A0 CALLA RNDRNG0 SLL 5,A0 ADDI WHICH_SPARKLE,A0 MOVE *A0,A1,L calla setup_back_anim JSRP ANIM_CROWD CALLA DELOBJA8 #die DIE WHICH_SPARKLE .LONG SPARKLE_1 .LONG SPARKLE_2 .LONG SPARKLE_3 .LONG BSPARKLE1 .LONG BSPARKLE2 WHERE_SPARKLE .LONG [-8,-14] .LONG [8,-9] .LONG [-1,8] .LONG [0,15] .LONG [-9,19] .LONG [-10,2] .LONG [-1,-6] SPARKLE_1 WL 2,SPRKLA01 WL 2,SPRKLA02 WL 2,SPRKLA03 WL 2,SPRKLA04 WL 2,SPRKLA05 WL 2,SPRKLA06 WL 2,SPRKLA07 WL 2,SPRKLA08 WL 2,SPRKLA09 WL 2,SPRKLA10 WL 2,SPRKLA11 WL 2,SPRKLA12 WL 2,SPRKLA13 .WORD CANI_END SPARKLE_2 WL 2,SPRKLB01 WL 2,SPRKLB02 WL 2,SPRKLB03 WL 2,SPRKLB04 WL 2,SPRKLB05 WL 2,SPRKLB06 WL 2,SPRKLB07 WL 2,SPRKLB08 WL 2,SPRKLB09 WL 2,SPRKLB10 WL 2,SPRKLB11 WL 2,SPRKLB12 WL 2,SPRKLB13 .WORD CANI_END SPARKLE_3 WL 2,SPRKLC01 WL 2,SPRKLC02 WL 2,SPRKLC03 WL 2,SPRKLC04 WL 2,SPRKLC05 WL 2,SPRKLC06 WL 2,SPRKLC07 WL 2,SPRKLC08 WL 2,SPRKLC09 WL 2,SPRKLC10 WL 2,SPRKLC11 WL 2,SPRKLC12 WL 2,SPRKLC13 .WORD CANI_END BSPARKLE1 WL 2,BSPRKA01 WL 2,BSPRKA02 WL 2,BSPRKA03 WL 2,BSPRKA04 WL 2,BSPRKA05 WL 2,BSPRKA06 WL 2,BSPRKA07 WL 2,BSPRKA08 WL 2,BSPRKA09 WL 2,BSPRKA10 WL 2,BSPRKA11 WL 2,BSPRKA12 WL 2,BSPRKA13 WL 2,BSPRKA14 WL 2,BSPRKA15 .WORD CANI_END BSPARKLE2 WL 2,BSPRKB01 WL 2,BSPRKB02 WL 2,BSPRKB03 WL 2,BSPRKB04 WL 2,BSPRKB05 WL 2,BSPRKB06 WL 2,BSPRKB07 WL 2,BSPRKB08 WL 2,BSPRKB09 WL 2,BSPRKB10 WL 2,BSPRKB11 WL 2,BSPRKB12 WL 2,BSPRKB13 WL 2,BSPRKB14 WL 2,BSPRKB15 .WORD CANI_END YSPEED .EQU [4,0] CREATE_PERFECT movi CYCPID,a0 CLR A1 NOT A1 CALLA EXISTP JRNZ NO_NEED_FOR_PERFECT MOVI 0c4h,A0 CALLA triple_sound MOVI [200,0],A0 MOVI [300,0],A1 MOVI PERFCT09,A2 MOVI 1799H,A3 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags movi TYPPERFECT,a5 CLR A6 CLR A7 CALLA BEGINOBJ MOVI YSPEED,A0 NEG A0 MOVE A0,*A8(OYVEL),L PUSHP A10 MOVI PERFECT_DISSOLVE_ANIM,A9 MOVI 12,A11 MOVI PERFCT09,A10 CREATE FX_PID,COPY_OBJ_AND_MOVE_UP PULLP A10 #wait_loop SLEEPK 1 move *a8(OYPOS),a0 cmpi 100,a0 jrge #wait_loop clr a0 move a0,*a8(OYVEL),L movi FX_PID,a0 clr a1 not a1 calla KILALL MOVE *A10(PLYRNUM),A10 INC A10 move @PERFECT_WINS,A0 and a10,A0 JRZ NOT_A_DOUBLE CREATE ADD_INIT_PID,CREATE_DOUBLE NOT_A_DOUBLE move @PERFECT_WINS,A0 or a10,A0 MOVE A0,@PERFECT_WINS MOVI PERFECT_FLASH_ANIM,A1 calla setup_back_anim JSRP ANIM_CROWD MOVI 0A8H,A0 calla triple_sound MOVI WHERE_PERFECT_SPARKLE,A10 PUSH A8 MOVE *A8(OXPOS),A9 MOVE *A8(OYVAL),A8,L MOVX A9,A8 MOVK 2,A9 CREATE FLASH_PID,SPRINKLE_GLINTS PULL A8 MOVI 110,A9 JRUC LOOK_FOR_IT NO_NEED_FOR_PERFECT DIE CREATE_DOUBLE MOVI [200,0],A0 MOVI [80,0],A1 MOVI DOUBLE09,A2 MOVI 1799H,A3 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags movi TYPPERFECT,a5 CLR A6 CLR A7 CALLA BEGINOBJ MOVI DOUBLE_FLASH_ANIM,A1 calla setup_back_anim JSRP ANIM_CROWD MOVI 110,A9 JRUC LOOK_FOR_IT DIE COPY_OBJ_AND_MOVE_UP PUSHP A10 MOVE A8,A10 COPY_OBJ_AND_MOVE_UP2 MOVE *A10(OYVAL),A1,L MOVI [200,0],A0 PULLP A2 PUSHP A2 MOVI 1799H,A3 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags movi TYPPERFECT,a5 CLR A6 CLR A7 CALLA BEGINOBJ CREATE OVRHED_PID,KILL_THEM_EVENTUALLY_EACH SLEEP 3 JRUC COPY_OBJ_AND_MOVE_UP2 KILL_THEM_EVENTUALLY_EACH MOVK 6,A11 MOVE A9,A9 JRZ NORMAL_KILL MOVE_IT_BACK MOVE *A8(OZPOS),A1 DEC A1 MOVE A1,*A8(OZPOS) SLEEP 1 DSJS A11,MOVE_IT_BACK MOVE A9,A1 calla setup_back_anim JSRP ANIM_CROWD CALLA DELOBJA8 DIE NORMAL_KILL MOVE *A8(OZPOS),A1 DEC A1 MOVE A1,*A8(OZPOS) SLEEP 1 DSJS A11,NORMAL_KILL CALLA DELOBJA8 DIE DOUBLE_FLASH_ANIM WL 2,DOUBLE01 WL 2,DOUBLE02 WL 2,DOUBLE03 WL 2,DOUBLE04 WL 2,DOUBLE05 WL 2,DOUBLE06 WL 2,DOUBLE07 WL 2,DOUBLE08 WL 2,DOUBLE09 .WORD CANI_END PERFECT_FLASH_ANIM WL 2,PERFCT01 WL 2,PERFCT02 WL 2,PERFCT03 WL 2,PERFCT04 WL 2,PERFCT05 WL 2,PERFCT06 WL 2,PERFCT07 WL 2,PERFCT08 WL 2,PERFCT09 .WORD CANI_END PERFECT_DISSOLVE_ANIM WL 2,PERFDS01 WL 2,PERFDS02 WL 2,PERFDS03 WL 2,PERFDS04 WL 2,PERFDS05 WL 2,PERFDS06 WL 2,PERFDS07 WL 2,PERFDS08 .WORD CANI_END SUBR RANDOM_SPARKLE SLEEP 20 MOVI FLASH_PID,A0 MOVI -1,A1 CALLA EXISTP JRNZ RANDOM_SPARKLE MOVI 39,A0 CALLA RNDRNG0 MOVE A0,A9 MOVI [102,7],A8 MOVI WHERE_WRESTLMANIA_SPARKLES,A10 MOVE A9,A11 SLL 5,A11 ADD A10,A11 MOVK 4,A9 CREATE FLASH_PID,START_SPARKLE SLOOP 30,RANDOM_SPARKLE SUBR SPRINKLE_GLINTS CLR A6 PUSHP A6 NEXT_SPARKLE PULLP A6 MOVE A6,A11 SLL 5,A11 ADD A10,A11 MOVE *A11,A1,L INC A1 JRZ NO_MORE_SPARKLE CREATE FLASH_PID,START_SPARKLE INC A6 PUSHP A6 SLOOP 5,NEXT_SPARKLE NO_MORE_SPARKLE DIE START_SPARKLE MOVE A8,A0 MOVE *A11,A14 ADD A14,A0 MOVE A8,A1 SRL 16,A1 MOVE *A11(10H),A14 ADD A14,A1 SLL 16,A0 SLL 16,A1 MOVI SPRKLA01,A2 MOVI 1800H,A3 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags CLR A5 CLR A6 CLR A7 CALLA BEGINOBJ MOVE A9,A0 CALLA RNDRNG0 SLL 5,A0 ADDI WHICH_SPARKLE,A0 MOVE *A0,A1,L calla setup_back_anim JSRP ANIM_CROWD CALLA DELOBJA8 DIE WHERE_PERFECT_SPARKLE .LONG [-6,-71] .LONG [0,-64] .LONG [-7,-49] .LONG [5,-42] .LONG [-2,-35] .LONG [5,-31] .LONG [-7,-18] .LONG [5,-10] .LONG [-2,-1] .LONG [-7,9] .LONG [5,17] .LONG [-7,31] .LONG [2,39] .LONG [-7,49] .LONG [6,59] .LONG [-2,69] .LONG [-7,74] .LONG -1 SUBR WHERE_WRESTLMANIA_SPARKLES .LONG [5,8] .LONG [29,22] .LONG [4,43] .LONG [60,50] .LONG [4,65] .LONG [28,76] .LONG [56,80] .LONG [15,87] .LONG [33,94] .LONG [50,105] .LONG [32,110] .LONG [4,114] .LONG [64,121] .LONG [56,125] .LONG [28,129] .LONG [15,158] .LONG [56,159] .LONG [4,177] .LONG [33,186] .LONG [30,200] .LONG [15,203] .LONG [35,220] .LONG [4,225] .LONG [40,236] .LONG [4,257] .LONG [13,260] .LONG [4,271] .LONG [61,273] .LONG [56,277] .LONG [15,286] .LONG [33,291] .LONG [15,309] .LONG [37,320] .LONG [56,334] .LONG [33,338] .LONG [4,345] .LONG [32,359] .LONG [4,370] .LONG [56,373] .LONG [17,383] .LONG -1 ****************************************************************************** SUBR CREATE_TIMEOUT MOVI 0c4h,A0 CALLA triple_sound MOVI [200,0],A0 MOVI [300,0],A1 MOVI TIMEEX09,A2 MOVI 1799H,A3 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags CLR A5 CLR A6 CLR A7 CALLA BEGINOBJ MOVI YSPEED,A0 NEG A0 MOVE A0,*A8(OYVEL),L MOVI TIMEOUT_DISSOLVE_ANIM,A9 MOVI 12,A11 MOVI TIMEEX09,A10 CREATE FX_PID,COPY_OBJ_AND_MOVE_UP CREATE FX_PID,HAVE_TO_MOVE_IT_TO SLEEP 50 CLR A0 MOVE A0,*A8(OYVEL),L MOVI FX_PID,A0 CLR A1 NOT A1 CALLA KILALL SLEEP 10 MOVK 4,A4 LOOP_TIMEOUT PUSHP A4 MOVI TIMEOUT_FLASH_ANIM,A1 calla setup_back_anim JSRP ANIM_CROWD MOVE @match_time,A0,L CMPI 90009H,A0 JREQ JUMP_OUT PULLP A4 DSJS A4,LOOP_TIMEOUT MOVI 110-(3*18),A9 JRUC LOOK_FOR_IT TIMEOUT_FLASH_ANIM WL 2,TIMEEX01 WL 2,TIMEEX02 WL 2,TIMEEX03 WL 2,TIMEEX04 WL 2,TIMEEX05 WL 2,TIMEEX06 WL 2,TIMEEX07 WL 2,TIMEEX08 WL 2,TIMEEX09 .WORD CANI_END TIMEOUT_DISSOLVE_ANIM WL 2,TIMEDS01 WL 2,TIMEDS02 WL 2,TIMEDS03 WL 2,TIMEDS04 WL 2,TIMEDS05 WL 2,TIMEDS06 WL 2,TIMEDS07 WL 2,TIMEDS08 .WORD CANI_END SUBR CREATE_DISQUAL MOVI 0c4h,A0 CALLA triple_sound MOVI [200,0],A0 MOVI [300,0],A1 MOVI DISQUA09,A2 MOVI 1799H,A3 movi DMAWNZ|M_3D|M_SCRNREL,a4 ;DMA flags CLR A5 CLR A6 CLR A7 CALLA BEGINOBJ MOVI YSPEED,A0 NEG A0 MOVE A0,*A8(OYVEL),L MOVI DISQUAL_DISSOLVE_ANIM,A9 MOVI 12,A11 MOVI DISQUA09,A10 CREATE FX_PID,COPY_OBJ_AND_MOVE_UP SLEEP 50 CLR A0 MOVE A0,*A8(OYVEL),L MOVI FX_PID,A0 CLR A1 NOT A1 CALLA KILALL MOVK 4,A4 LOOP_DISQUAL PUSHP A4 MOVI DISQUAL_FLASH_ANIM,A1 calla setup_back_anim JSRP ANIM_CROWD MOVE @match_time,A0,L CMPI 90009H,A0 JREQ JUMP_OUT PULLP A4 DSJS A4,LOOP_DISQUAL MOVI 110-(3*18),A9 LOOK_FOR_IT SLEEP 2 MOVE @match_time,A0,L CMPI 90009H,A0 JREQ JUMP_OUT DSJS A9,LOOK_FOR_IT JUMP_OUT CALLA DELOBJA8 DIE HAVE_TO_MOVE_IT_TO MOVE *A8(OYVEL),A1,L MOVE *A8(OYVAL),A2,L ADD A1,A2 MOVE A2,*A8(OYVAL),L SLOOP 1,HAVE_TO_MOVE_IT_TO DISQUAL_FLASH_ANIM WL 2,DISQUA01 WL 2,DISQUA02 WL 2,DISQUA03 WL 2,DISQUA04 WL 2,DISQUA05 WL 2,DISQUA06 WL 2,DISQUA07 WL 2,DISQUA08 WL 2,DISQUA09 .WORD CANI_END DISQUAL_DISSOLVE_ANIM WL 2,DISQDS01 WL 2,DISQDS02 WL 2,DISQDS03 WL 2,DISQDS04 WL 2,DISQDS05 WL 2,DISQDS06 WL 2,DISQDS07 WL 2,DISQDS08 .WORD CANI_END SUBR PIN_FLASH_ANIM WL 2,PINHIM01 WL 2,PINHIM02 WL 2,PINHIM03 WL 2,PINHIM04 WL 2,PINHIM05 WL 2,PINHIM06 WL 2,PINHIM07 WL 2,PINHIM08 WL 20,PINHIM09 .WORD CANI_END *********** * * Old: * returns lowest PLYRNUM on winning side (0 or 1 for plyrs, 2 for drones) * in a3. increments p1rounds and p2rounds too. (actually, it's okay to * return a 3 or a 4 if we want. The code that calls this will work fine. * If this is the final battle, we add 2 instead of 1 to pXrounds. * * New: * returns lowest PLYRNUM on winning side, unless there was a pin, in which * case it returns the first wrestler on the winning side with his DID_PIN * flag set. * SUBRP set_winner ;first, establish cause of death. Choices are time running out ; and loss of all health. move @match_time,a14,L jrz #tmout ;time didn't run out, so either someone was pinned, which should ; only happen if everyone on his team is dead, or the last living ; member of a team died by ring-out. Search through the wrestlers ; and award victory to the first live one we find. movi NUM_WRES,a0 movi process_ptrs,a1 clr a3 #loop0 move *a1+,a2,L jrz #nxt0 ;skip inactive move *a2(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #nxt0 ;skip dead ;got a live one. if he pinned, use him. if not, save his pointer ; in case we find no pinner, but keep looking move *a2(STATUS_FLAGS),a14 btst B_DID_PIN,a14 jrnz #a2wins move a2,a3 #nxt0 dsj a0,#loop0 ;okay, nobody pinned. did we find any live ones at all? move a3,a2 jrnz #a2wins ;yes, we saved a non-pinner. ;trouble. we didn't find any live wrestlers, and there definitely ; should have been one. This is really bad and should never happen, ; but just in case it does, give the win to the first valid wrestler ; we can find. .if DEBUG LOCKUP .endif #bogus movi NUM_WRES,a0 movi process_ptrs,a1 #loop1 move *a1+,a2,L jrz #nxt1 ;skip inactive ;got one jruc #a2wins #nxt1 dsjs a0,#loop1 ;good heavens! no actives found at all! no way is this ever gonna ; happen. fuck it. quit or something. jruc #no_hits #a2wins ;a2 is process of winner ;increment pXrounds movi p1rounds,a0 movi 01h,a1 ;match_winner value for p1 side winning move *a2(PLYR_SIDE),a4 jrz #rok movi p2rounds,a0 movi 02h,a1 ;match_winner value for p1 side winning #rok move *a0,a4 inc a4 ;if this is the final match (or royal rumble), increment it again. inc a4 ;increment, then dec if we shouldn't have. calla is_8_on_1 jrc #a4ok move @royal_rumble,a14 jrnz #a4ok dec a4 #a4ok move a4,*a0 ;if pXwins == 2, set match_winner cmpi 2,a4 jrne #no_mw move a1,@match_winner #no_mw move *a2(PLYRNUM),a3 rets #tmout ;clock ran out on the round. Award victory to the team with the ; highest average life points remaining. In case of a tie, winner ; is the last team to land a hit. If there have been no hits, ; we'll wanna drop out and go straight to game over, which I'll ; deal with later, probably by returning a -1 and letting the ; caller deal with it. ;If this was an 8-on-1 or 8-on-2 match, the CPU wins when time ; runs out. move @process_ptrs+40h,a2,L ;first drone calla is_8_on_1 jrc #a2wins move @royal_rumble,a14 jrnz #a2wins ;reggies: clr a4 ;team 1 count clr a5 ;team 1 total clr a6 ;team 2 count clr a7 ;team 2 total movi NUM_WRES,a9 movi process_ptrs,a8 #loop2 move *a8+,a10,L jrz #nxt2 ;skip inactive move *a10(PLYRNUM),a1 calla get_health move *a10(PLYR_SIDE),a14 jrnz #t2 ;on team 1 inc a4 add a0,a5 jruc #nxt2 #t2 ;on team 2 inc a6 add a0,a7 #nxt2 dsj a9,#loop2 ;compute the averages (we could check for the very likely case of ; the divisor being one, but there's no real need, as this is ; hardly a performance-critical event.) divu a4,a5 divu a6,a7 cmp a5,a7 jrlt #t1w jrgt #t2w #tie ;uh-oh. Tie. Find wrestler with most recent LAST_HIT_TIME and ; award the match to his team. If everyone's LAST_HIT_TIME's are ; zero, nobody has landed a blow, so just quit to game over. ; LAST_HIT_TIME holds all 32 bits of PCNT, so we don't need to worry ; about wraparound. movi NUM_WRES,a9 movi process_ptrs,a8 clr a0 ;current high LAST_HIT_TIME clr a1 ;team with current high LAST_HIT_TIME #loop4 move *a8+,a10,L jrz #nxt4 ;skip inactive move *a10(LAST_HIT_TIME),a14,L cmp a0,a14 jrle #nxt4 ;new champ. move a14,a0 move *a10(PLYR_SIDE),a1 #nxt4 dsj a9,#loop4 TEST a0 jrz #no_hits TEST a1 jrnz #t2w ;fall through to #t1w #t1w ;team 1 wins clr a4 jruc #fw #t2w ;team 2 wins movk 1,a4 #fw ;award win to first live wrestler with PLYR_SIDE equal to a4 movk NUM_WRES,a0 movi process_ptrs,a1 #loop3 move *a1+,a2,L jrz #nxt3 ;skip inactive move *a2(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #nxt3 ;skip dead move *a2(PLYR_SIDE),a14 cmp a14,a4 jrne #nxt3 ;skip losers ;got one move *a2(PLYRNUM),a3 jruc #a2wins #nxt3 dsj a0,#loop3 ;good heavens. we didn't find ANYONE from that team. This is ; a major error that should never happen. Deal with it as in ; the 'no live wrestlers found' case above. .if DEBUG LOCKUP .endif jruc #bogus #no_hits ;battle ended in a tie with neither side landing a blow. drop ; out to game over. movi -1,a2 rets #***************************************************************************** * * Clears a combo meter. * >a13 = process of victim SUBR clear_combo_meter move *a13(PLYR_SIDE),a1 move *a13(PLYRNUM),a11 jruc zero_combo_meter #***************************************************************************** * * Sets a combo meter to half-size. * >a13 = process of victim SUBR halve_combo_meter move *a13(PLYR_SIDE),a1 move *a13(PLYRNUM),a11 movi MD_SIZE,a9 mpyu a1,a9 addi meter_data,a9 move *a9(MD_COMBO),a8,L move a11,a5 X64 a5 ;x by PLT_SIZE addi life_data,a5 movk 10,a2 jruc draw_combo_meter #***************************************************************************** * * Clears a life bar. * >a13 = process of victim SUBR clear_lifebar move *a13(PLYRNUM),a0 X64 a0 addi life_data,a0 clr a14 move a14,*a0(PLT_LIFE) move *a13(PLYR_SIDE),a0 callr update_meter rets ****************************************************************************** .end