************************************************************** * * Software: Jamie Rivett * Initiated: 6/93 * * COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC. * ************************************************************** .file "anim.asm" .title "animation routines" .width 132 .option b,d,l,t .mnolist .include "macros.h" .include "mproc.equ" ;Mproc equates .include "display.equ" ;Display proc equates .include "gsp.equ" ;Gsp asm equates .include "sys.equ" .include "game.equ" .include "plyr.equ" .include "anim.equ" .include "audit.equ" .include "ring.equ" .include "sound.h" .include "jjxm.h" .INCLUDE "SOUND.EQU" .include "fontsimg.glo" .include "bgndtbl.glo" .include "miscimg.glo" ****************************************************************************** * * external references .ref p2rounds,p1rounds,xxx_dead_anim,is_final_match,FINAL_PTR .ref get_opp_process .ref PSTATUS,round_award .ref PCNT,slowmo,do_roll,match_over,triple_sound,is_8_on_1 .ref match_winner,process_ptrs,square_root,set_target_offsets .ref calc_line_x,RNDPER,wrtable_sound,rope_command,no_debris .ref set_rope_z,SHAKER2,get_all_buttons_down,right_rproc .ref left_rproc,adjust_health,create_dizzy_proc,get_mpart_offsets .ref get_mpart_xsize,pal_find,round_tickcount,tgt_ground .ref get_rope_x,allow_offscrn,ADD_TO_COMBO_COUNT,MOVE_NAME_ANNC .ref reduce_bog,RNDRNG0,hyper_speed_on,royal_rumble .ref kill_smove_procs,clear_lifebar .ref wrestler_count,wrestler_count_proc .REF IF_SILENT_ADD_VOICE ****************************************************************************** * * external definitions #***************************************************************************** OANIMODE equ 0 ;word OANIBASE equ OANIMODE+10h ;long OANIPC equ OANIBASE+20h ;long OANICNT equ OANIPC+20h ;word OCUR_FRAME equ OANICNT+10h ;long SUBR animate_wrestler PUSH a4,a10 .ref match_time move @match_time,a0,L jrz #x ; callr animate_wrestler1 ; callr animate_wrestler2 move a13,a10 addi ANIMODE,a10 ;primary animation callr animate move a13,a10 addi ANIMODE2,a10 ;secondary animation callr animate #x PULL a4,a10 rets SUBR animate_wrestler1 PUSH a4,a10 move a13,a10 addi ANIMODE,a10 ;primary animation callr animate PULL a4,a10 rets SUBR animate_wrestler2 PUSH a4,a10 move a13,a10 addi ANIMODE2,a10 ;secondary animation callr animate PULL a4,a10 rets ******** animate ;a10 = * anim variables base move *a10(OANIMODE),a0 ;current animation ended??? btst MODE_END_BIT,a0 jrnz _exit .if 0 *** temp patch to step through images on player 1 !!!! move *a13(PLYRNUM),a0 jrnz #skippit move *a10(OANIBASE),a0,L move *a10(OANIPC),a1,L cmp a0,a1 jreq _next_command move *a13(BUT_VAL_DOWN),a0 move a0,a0 jrnz _next_command rets #skippit .endif *** move *a10(OANICNT),a0 ;cur tick count dec a0 move a0,*a10(OANICNT) jrgt _exit _next_command move *a10(OANIPC),a4,L _next_command1 move *a4+,a0 ;tick count or command jrn #command jrz _ani_zip ;no-op move *a13(ANI_SPEED),a1 mpyu a0,a1 srl 8,a1 move @hyper_speed_on,a14 srl a14,a1 .if DEBUG move a1,a1 jrge #not_z LOCKUP #not_z .endif move a1,*a10(OANICNT) ;# ticks to hold cur frame ; move a0,a1 ; sll 8,a1 ;* 256 ; move *a13(ANI_SPEED),a0 ;divisor * 256 ; divu a0,a1 ;a1/a0 ; move a1,*a10(OANICNT) ;# ticks to hold cur frame move *a4+,a0,L ;* * multi image object .if DEBUG cmpi >ff800000,a0 jrhs #img_ok LOCKUP ;bogus image pointer #img_ok .endif move *a0,a0,L ;* image .if DEBUG jrnz #ok LOCKUP jruc #skp #ok .endif move a0,*a10(OCUR_FRAME),L #skp move a4,*a10(OANIPC),L _exit rets #command ; andi 0ffh,a0 ; sll 5,a0 ;x 32 sll 24,a0 srl 19,a0 addi #ani_commands,a0 .if DEBUG cmpi #ani_commands_end,a0 jrlt #cmd_ok LOCKUP ;bogus ani command #cmd_ok .endif move *a0,a0,L jump a0 #ani_commands .long _ani_zip ;0 .long _ani_repeat ;1 .long _ani_setmode ;2 .long _ani_zerovels ;3 .long _ani_setplyrmode ;4 .long _ani_set_yvel ;5 .long _ani_attack_on ;6 .long _ani_attack_off ;7 .long _ani_leapatopp ;8 .long _ani_attach ;9 .long _ani_detach ;10 .long _ani_waithitgnd ;11 .long _ani_xflip ;12 .long _ani_bounce ;13 .long _ani_attack_on_Z ;14 .long _ani_gravity_on ;15 .long _ani_gravity_off ;16 .long _ani_goto ;17 .long _ani_attachz ;18 .long _ani_slowmo ;19 .long _ani_waitrelease ;20 .long _ani_offset ;21 .long _ani_friction ;22 .long _ani_min_yvel ;23 .long _ani_attachvel ;24 .long _ani_throw1 ;25 .long _ani_sound ;26 .long _ani_setfacing ;27 .long _ani_pause ;28 .long _ani_ifstatus ;29 .long _ani_code ;30 .long _ani_shaker ;31 .long _ani_changeanim ;32 .long _ani_faceup ;33 .long _ani_facedown ;34 .long _ani_bouncerope ;35 .long _ani_shakeropes ;36 .long _ani_bendrope ;37 .long _ani_setspeed ;38 .long _ani_leapatpos ;39 .long _ani_zero_xzvels ;40 .long _ani_rope_z ;41 .long _ani_loop ;42 .long _ani_zip ;43 .long _ani_set_xvel ;44 .long _ani_ifnotstatus ;45 .long _ani_slide_back ;46 .long _ani_clr_damage ;47 .long _ani_set_zvel ;48 .long _ani_checkword ;49 .long _ani_face ;50 .long _ani_setword ;51 .long _ani_getup ;52 .long _ani_getup_wait ;53 .long _ani_clr_stars ;54 .long _ani_shakeall ;55 .long _ani_damage ;56 .long _ani_start_dizzy ;57 .long _ani_clr_status ;58 .long _ani_set_target ;59 .long _ani_max_x ;60 .long _ani_max_z ;61 .long _ani_max_y_vel ;62 .long _ani_superslave ;63 .long _ani_slaveanim ;64 .long _ani_rawsound ;65 .long _ani_damageopp ;66 .long _ani_rndper ;67 .long _ani_waithitopp ;68 .long _ani_attchimage ;69 .long _ani_ifoppmode ;99 .long _ani_ifbuttons ;71 .long _ani_ifnohitblock ;72 .long _ani_end ;73 .long _ani_ifrope ;74 .long _ani_ifnotrope ;75 .long _ani_opp_getup ;76 .long _ani_shakecorner ;77 .long _ani_singlestep ;78 .long _ani_superslave2 ;79 .long _ani_setoppmode ;80 .long _ani_clroppmode ;81 .long _ani_oppoffset ;82 .long _ani_ifblocked ;83 .long _ani_waitroll ;84 .long _ani_setoppfacing ;85 .long _ani_ifopp ;86 .long _ani_snot ;87 .long _ani_if_butcount_ge ;88 .long _ani_if_butcount_lt ;89 .long _ani_if_rptcount ;90 .long _ani_ifnot_rptcount ;91 .long _ani_ringcheck ;92 .long _ani_debrisat ;93 .long _ani_debris ;94 .long _ani_set_wrestler_xflip ;95 .long _ani_slideatopp ;96 .long _ani_clr_butcount ;97 .long _ani_set_rptcount ;98 .long _ani_dec_rptcount ;99 .long _ani_shadowtrail ;100 .long _ani_createproc ;101 .long _ani_target ;102 .long _ani_hmbwait ;103 .long _ani_safe_time ;104 .long _ani_setopp_plyrmode ;105 .long _ani_xflip_opp ;106 .long _ani_setlong ;107 .long _ani_immobilize ;108 .long _ani_xflip_tbl ;109 .long _ani_setoppvels ;110 .long _ani_waithitgnd2 ;111 .long _ani_set_opp_xvel ;112 .long _ani_set_attach ;113 .long _ani_inc_combo_count ;114 .long _ani_clear_combo_count ;115 .long _ani_add_move ;116 .long _ani_startattack ;117 .long _ani_changeanim_tbl ;118 .long _ani_if_rptcount_ge ;119 .long _ani_if_rptcount_lt ;120 .long _ani_waithitany ;121 .long _ani_draw_name ;122 .long _ani_set_idiot ;123 .long _ani_attchimage2 ;124 .long _ani_ground ;125 .long _ani_rot ;126 .long _ani_scroll_ctrl ;127 .long _ani_clear_climb ;128 .long _ani_opp_face ;129 .long _ani_setflag ;130 #ani_commands_end #******** _ani_zip ;0 .if DEBUG LOCKUP .endif move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_repeat ;1 move *a10(OANIBASE),a4,L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_setmode ;2 move *a4+,a0 ;mode bits move a0,*a10(OANIMODE) move a4,*a10(OANIPC),L ;clear some STATUS_FLAGS bits too. move *a13(STATUS_FLAGS),a14,L andni SF_CLEAR_BITS,a14 move a14,*a13(STATUS_FLAGS),L ;if *a13(PTIME) is nonzero, this anim was called by someone other ; than our actual wrestler process. So clearing the KOD bit isn't ; enough, since we're still sleeping. Set PTIME to 1. move *a13(PTIME),a14 jrz _next_command movk 1,a14 move a14,*a13(PTIME) jruc _next_command #******** _ani_zerovels ;3 clr a0 move a0,*a13(OBJ_XVEL),L move a0,*a13(OBJ_YVEL),L move a0,*a13(OBJ_ZVEL),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_setplyrmode ;4 ;clear the climbin bit, just in case... clr a14 move a14,*a13(CLIMBING_THRU) move *a4+,a0 move *a13(PLYRMODE),a1 ;this is a temp fudge!!! cmpi MODE_DEAD,a1 jreq #noset ;If going into head hold mode, don't allow getup meter ;to come out for awhile. cmpi MODE_HEADHOLD,a0 jrnz #skp move *a13(DELAY_METER),a14 cmpi 6*60,a14 jrge #skp movi 9*60,a14 move a14,*a13(DELAY_METER) #skp move a0,*a13(PLYRMODE) #noset move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_set_yvel ;5 move *a4+,a0,L move a0,*a13(OBJ_YVEL),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_attack_on ;6 ;I'm not sure we want to zero attach_proc just for starting an attack! ;Watch this.... clr a0 ;start out not attached ; move a0,*a13(ATTACH_PROC),L ;to anything move a0,*a13(HITBLOCKER) ;The start of each attack on will clear MODE_STATUS! move *a13(ANIMODE),a0 andni MODE_STATUS,a0 move a0,*a13(ANIMODE) move *a13(ANIMODE),a0 ori MODE_CHECKHIT,a0 move a0,*a13(ANIMODE) move *a4+,a0 move a0,*a13(ATTACK_MODE) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTXOFF) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTYOFF) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTWIDTH) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTHEIGHT) move *a4+,a0,L move a0,*a13(OBJ_ATTXOFF),L move *a4+,a0,L move a0,*a13(OBJ_ATTWIDTH),L ;;; clr a0 ;;; move a0,*a13(OBJ_ATTZOFF) ;;; move a0,*a13(OBJ_ATTDEPTH) movi -40,a0 ;default z width (10) move a0,*a13(OBJ_ATTZOFF) movi 40*2,a0 ;10*2 move a0,*a13(OBJ_ATTDEPTH) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_attack_off ;7 ;clear CHECKHIT and WAITHITOPP bits move *a13(ANIMODE),a0 andni MODE_CHECKHIT|MODE_WAITHITOPP,a0 move a0,*a13(ANIMODE) ;clear SMART_ATTACK bit and SMART_TARGET value move *a13(STATUS_FLAGS),a14 andni M_SMART_ATTACK,a14 move a14,*a13(STATUS_FLAGS) clr a14 move a14,*a13(SMART_TARGET),L ;update ATTACK_TIME move @round_tickcount,a0 move a0,*a13(ATTACK_TIME) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_leapatopp ;8 ; # ticks to reach dest ; max total distance (X and Z) ; max X distance ; max Z distance ; max Y vel ; target area of opponent ; x,y,z offset of attack box STRUCT 0 WORD #TICKS WORD #MAX_TOTAL_DIST WORD #MAX_X_DIST WORD #MAX_Z_DIST LONG #MAX_Y_VEL WORD #TRGT WORD #ATT_X_OFF WORD #ATT_Y_OFF WORD #ATT_Z_OFF LABEL #SIZE .bss oppx,32 .bss oppz,32 .bss oppy,32 move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(CLOSEST_NUM),a11 X32 a11 addi process_ptrs,a11 move *a11,a11,L move *a11(OBJ_XVEL),a5,L move *a11(PLYRMODE),a14 cmpi MODE_RUNNING,a14 jrne #outring move a0,a0 jrnz #outring ;if opponent is inside the ring, running and near the ropes ;then target where he is now (don't add in xvel) move *a11(OBJ_XPOSINT),a1 move a5,a5 ;xvel jrp #run_right ;run_left cmpi RING_X_CENTER,a1 jrgt #outring jruc #cnt #run_right cmpi RING_X_CENTER,a1 jrlt #outring #cnt PUSH a13 move a11,a13 calla get_rope_x PULL a13 move *a11(OBJ_XPOSINT),a1 sub a1,a0 abs a0 cmpi 70,a0 jrgt #outring clr a5 ;clr xvel #outring move *a11(OBJ_ZVEL),a6,L move *a11(OBJ_YVEL),a7,L move *a11(GROUND_Y),a8 sll 16,a8 addi [256,0],a8 move *a11(OBJ_XPOS),a1,L move *a11(OBJ_ZPOS),a2,L move *a11(OBJ_YPOS),a3,L addi [256,0],a3 move *a4(#TICKS),a0 move *a13(OBJ_GRAVITY),a14,L #lp0 add a5,a1 ;x + xvel add a6,a2 ;z + zvel move a7,a7 jrz #ok add a7,a3 ;y + yvel sub a14,a7 ;yvel - gravity cmp a3,a8 ;hit ground? jrgt #ok move a8,a3 jruc #dn #ok dsj a0,#lp0 #dn subi [256,0],a3 move a1,@oppx,L move a2,@oppz,L move a3,@oppy,L move *a4(#TRGT),a0 jrn #user btst B_TGT_GROUND,a0 jrz #ngrnd andni TGT_GROUND,a0 calla set_target_offsets calla tgt_ground jruc #user #ngrnd calla set_target_offsets #user move *a13(TGT_XOFF),a0 ;target x offset sll 16,a0 move *a11(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrz #right1 neg a0 #right1 ;;; move *a11(OBJ_XPOS),a1,L move @oppx,a1,L add a0,a1 ;def target x move *a4(#ATT_X_OFF),a0 sll 16,a0 move *a13(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrz #right0 neg a0 #right0 move *a13(OBJ_XPOS),a2,L add a0,a2 ;att x sub a2,a1 ;def x - att x move a1,a14 abs a14 move *a4(#MAX_X_DIST),a0 jrn #xok sll 16,a0 cmp a14,a0 jrge #xok move a1,a1 jrp #no_negx neg a0 #no_negx move a0,a1 #xok move a1,a5 ;delta x move *a4(#TICKS),a0 divs a0,a1 ;a1 / a0 move a1,*a13(OBJ_XVEL),L move *a13(TGT_ZOFF),a0 ;target z offset sll 16,a0 ;;; move *a11(OBJ_ZPOS),a1,L move @oppz,a1,L add a0,a1 ;def target z move *a13(OBJ_ZPOS),a2,L move *a4(#ATT_Z_OFF),a0 sll 16,a0 add a0,a2 ;att z sub a2,a1 ;def z - att z move a1,a14 abs a14 move *a4(#MAX_Z_DIST),a0 jrn #zok sll 16,a0 cmp a14,a0 jrge #zok move a1,a1 jrp #no_negz neg a0 #no_negz move a0,a1 #zok move a1,a6 ;delta z move *a4(#TICKS),a0 divs a0,a1 ;a1 / a0 move a1,*a13(OBJ_ZVEL),L move *a4(#MAX_TOTAL_DIST),a9 jrn #maxok abs a5 srl 16,a5 move a5,a1 mpyu a5,a1 ;deltax^2 move a1,a5 abs a6 srl 16,a6 move a6,a1 mpyu a6,a1 ;deltaz^2 move a1,a0 add a5,a0 calla square_root cmp a0,a9 ;a9-a0 (will we exceed max dist?) jrgt #maxok sll 8,a9 ;x 256 (8 bits fractional) divu a0,a9 ;a9/a0 move a9,a1 move *a13(OBJ_XVEL),a0,L mpys a0,a1 ;scale down xvel sra 8,a1 ;shift off fractional move a1,*a13(OBJ_XVEL),L move a9,a1 move *a13(OBJ_ZVEL),a0,L mpys a0,a1 ;scale down yvel sra 8,a1 ;shift off fractional move a1,*a13(OBJ_ZVEL),L #maxok ;to calculate YVEL taking into account gravity: ;use y-y0 = v0*t + 0.5*a*t^2 move *a4(#TICKS),a8 move a8,a1 mpyu a8,a1 ;t^2 move *a13(OBJ_GRAVITY),a0,L mpyu a0,a1 ;a*t^2 srl 1,a1 ;1/2*a*t^2 ;;; move *a11(OBJ_YPOS),a0,L ;opp y move @oppy,a0,L move *a13(TGT_YOFF),a14 ;target y offset sll 16,a14 add a14,a0 move *a13(OBJ_YPOS),a2,L ;y0 move *a4(#ATT_Y_OFF),a14 sll 16,a14 add a14,a2 sub a2,a0 ;a0 = a0-a2 (y - y0) add a0,a1 jrnn #yvel_okay ; LOCKUP clr a1 jruc #yok #yvel_okay divu a8,a1 ;a1 = a1/a8 ( ((y-y0)+(1/2*a*t^2)) / t ) move *a4(#MAX_Y_VEL),a0,L cmp a1,a0 jrge #yok move a0,a1 #yok move a1,*a13(OBJ_YVEL),L ;make sure both have the same INRING value move *a11(INRING),a0 move *a13(INRING),a1 cmp a0,a1 jreq #done ;uh-oh. our INRING's don't match. Unless we're on the ; turnbuckle (or flying from it), zero the X and Z ; velocities and set the Y velocity to 50000h or something ;...unfortunately, there's no really clean way to tell if ; we're on the turnbuckle at this point since the LEAPAT doesn't ; happen until well into the anim sequence and our PLYRMODE could ; be just about anything by then. So instead we'll fudge and look ; at some other clues, like gravity and y pos. If a player has a ; Y pos that's way high (80+) pixels above GROUND_Y and no gravity, ; that sure looks like a turnbuckle, so go with it. move *a13(ANIMODE),a14 btst MODE_NOGRAVITY_BIT,a14 jrz #nt move *a13(OBJ_YPOSINT),a0 move *a13(GROUND_Y),a14 sub a14,a0 subi 80,a0 jrnn #done #nt ;no good. leap in place clr a14 move a14,*a13(OBJ_XVEL),L move a14,*a13(OBJ_ZVEL),L movi [5,0],a14 move a14,*a13(OBJ_YVEL),L #done jruc _next_command #******** _ani_attach ;9 ; move *a4+,a0 ;xoff ; move a0,*a13(ATTACH_XOFF) ; move *a4+,a0 ; move a0,*a13(ATTACH_YOFF) move *a4+,a0,L ;xoff move a0,*a13(ATTACH_XOFF),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_detach ;10 move *a13(ATTACH_PROC),a1,L jrz #done_really clr a0 move a0,*a13(ATTACH_PROC),L ;not attached to anything move *a1(ATTACH_PROC),a2,L cmp a2,a13 jrne #done_really ;attach_procs don't match! move a0,*a1(ATTACH_PROC),L ;not attached to anything #done ;if our victim is still in mode puppet, puppet2, headheld, or ; attached, instead put him in ONGROUND. move *a1(PLYRMODE),a14 cmpi MODE_PUPPET,a14 jreq #fix_opp cmpi MODE_PUPPET2,a14 jreq #fix_opp ;This was fucking up the shawn franknsteiner move from headhold! ;Forcing him to dive down too low! ; cmpi MODE_HEADHELD,a14 ; jreq #fix_opp cmpi MODE_ATTACHED,a14 jreq #fix_opp jruc #done_really #fix_opp movi MODE_ONGROUND,a14 move a14,*a1(PLYRMODE) #done_really move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_waithitgnd ;11 move *a13(OBJ_YVEL),a0,L ;must have down velocity jrp #no_gnd ;if we're the master and the attach is valid, check and see if ; our puppet has hit the ground. move *a13(ANIMODE),a14 btst MODE_KEEPATTACHED_BIT,a14 jrz #skip_pcheck move *a13(ATTACH_PROC),a0,L jrz #skip_pcheck ;we're attached? move *a0(ATTACH_PROC),a14,L jrz #skip_pcheck ;they're attached? cmp a13,a14 jrne #skip_pcheck ;to each other? ;ah, but if the opponent's MODE_GHOST bit is set, ignore him move *a0(ANIMODE),a14 btst MODE_GHOST_BIT,a14 jrnz #skip_pcheck move *a0(OBJ_YPOSINT),a1,W move *a0(GROUND_Y),a2,W sub a1,a2 jrnn #hit_gnd #skip_pcheck move *a13(OBJ_YPOSINT),a0 move *a13(GROUND_Y),a1 cmp a1,a0 ;a0-a1 jrgt #no_gnd #hit_gnd CALLA SMALL_BOUNCE move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #no_gnd movk 1,a0 move a0,*a10(OANICNT) ;# ticks to hold cur frame rets #******** _ani_xflip ;12 move *a13(OBJ_CONTROL),a0 xori M_FLIPH,a0 move a0,*a13(OBJ_CONTROL) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_bounce ;13 move *a4+,a0 ;Bounce value sll 16,a0 move a0,*a13(OBJ_YVEL),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_attack_on_Z ;14 ;I'm not sure we want to zero attach_proc just for starting an attack! ;Watch this.... clr a0 ;start out not attached ; move a0,*a13(ATTACH_PROC),L ;to anything move a0,*a13(HITBLOCKER) move a0,*a13(ATTACH_ZOFF) ;The start of each attack on will clear MODE_STATUS! move *a13(ANIMODE),a0 andni MODE_STATUS,a0 move a0,*a13(ANIMODE) move *a13(ANIMODE),a0 ori MODE_CHECKHIT,a0 move a0,*a13(ANIMODE) move *a4+,a0 move a0,*a13(ATTACK_MODE) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTXOFF) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTYOFF) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTZOFF) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTWIDTH) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTHEIGHT) ; move *a4+,a0 ; move a0,*a13(OBJ_ATTDEPTH) move *a4+,a0,L move a0,*a13(OBJ_ATTXOFF),L move *a4+,a0,L move a0,*a13(OBJ_ATTZOFF),L move *a4+,a0,L move a0,*a13(OBJ_ATTHEIGHT),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_gravity_on ;15 move *a13(ANIMODE),a0 andni MODE_NOGRAVITY,a0 move a0,*a13(ANIMODE) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_gravity_off ;16 move *a13(ANIMODE),a0 ori MODE_NOGRAVITY,a0 move a0,*a13(ANIMODE) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_goto ;17 move *a4+,a4,L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_attachz ;18 ; move *a4+,a0 ;xoff ; move a0,*a13(ATTACH_XOFF) ; move *a4+,a0 ; move a0,*a13(ATTACH_YOFF) move *a4+,a0,L move a0,*a13(ATTACH_XOFF),L move *a4+,a0 move a0,*a13(ATTACH_ZOFF) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_slowmo ;19 move *a4+,a0 ;frame delay move a0,@slowmo move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_waitrelease ;20 move *a13(BUT_VAL_CUR),a0 move *a4+,a1 ;button bit btst a1,a0 ;still down? jrz #button_up ;since we do the flip here, we have to update FACING_DIR too. move *a13(NEW_FACING_DIR),*a13(FACING_DIR) move *a13(NEW_FACING_DIR),a14 btst PLAYER_RIGHT_BIT,a14 jrnz #right move *a13(OBJ_CONTROL),a14 ori M_FLIPH,a14 move a14,*a13(OBJ_CONTROL) movk 1,a0 move a0,*a10(OANICNT) ;# ticks to hold cur frame rets #right move *a13(OBJ_CONTROL),a14 andni M_FLIPH,a14 move a14,*a13(OBJ_CONTROL) movk 1,a0 move a0,*a10(OANICNT) ;# ticks to hold cur frame rets #button_up move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_offset ;21 move *a4+,a1 ;x offset move *a13(FACING_DIR),a0 btst MOVE_RIGHT_BIT,a0 jrnz #right neg a1 #right move *a13(OBJ_XPOSINT),a0 add a1,a0 move a0,*a13(OBJ_XPOSINT) move *a4+,a1 ;y offset move *a13(OBJ_YPOSINT),a0 add a1,a0 move a0,*a13(OBJ_YPOSINT) ;SCROLL_CTRL stuff move *a13(SCROLL_Y),a0 sub a1,a0 move a0,*a13(SCROLL_Y) move *a4+,a1 ;z offset move *a13(OBJ_ZPOSINT),a0 add a1,a0 move a0,*a13(OBJ_ZPOSINT) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_friction ;22 move *a4+,a0 ;friction value move a0,*a13(OBJ_FRICTION) move *a13(ANIMODE),a0 ori MODE_FRICTION,a0 move a0,*a13(ANIMODE) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_min_yvel ;23 ;sets YVEL to given value, UNLESS it's already higher. move *a4+,a0,L move *a13(OBJ_YVEL),a14,L cmp a0,a14 jrge #set move a0,*a13(OBJ_YVEL),L #set move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_attachvel ;24 STRUCT 0 LONG #XVEL LONG #YVEL LONG #ZVEL LABEL #SIZE ;x velocity is always relative to attacker FACING_DIR move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a2,L ;proc attached to jrz #not_attached move *a2(ATTACH_PROC),a0,L jrz #not_attached move *a4(#YVEL),a0,L move a0,*a2(OBJ_YVEL),L move *a4(#ZVEL),a0,L move a0,*a2(OBJ_ZVEL),L move *a4(#XVEL),a0,L move *a13(FACING_DIR),a14 btst MOVE_RIGHT_BIT,a14 jrnz #xok neg a0 #xok move a0,*a2(OBJ_XVEL),L #not_attached jruc _next_command #******** _ani_throw1 ;25 move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_sound ;26 move *a4+,a0 cmpi run_snd,a0 jrne #not_run ;if there's been another foot noise from this guy within the last ; 12 ticks, give it a miss. move @PCNT,a14 zext a14,W move *a13(FOOT_PCNT),a1 sub a1,a14 abs a14 cmpi 12,a14 jrlt #done move @PCNT,a1 move a1,*a13(FOOT_PCNT) calla triple_sound jruc #done #not_run move a0,a0 jrn #table_lookup calla triple_sound jruc #done #table_lookup calla wrtable_sound #done move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_setfacing ;27 move *a13(NEW_FACING_DIR),a0 move a0,*a13(FACING_DIR) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_pause ;28 ;hold current frame for a few ticks move *a4+,a14 move a4,*a10(OANIPC),L move a14,*a10(OANICNT) rets #******** _ani_ifstatus ;29 move *a4+,a0,L ;this is a conditional goto move *a13(ANIMODE),a1 ;if MODE_STATUS set then btst MODE_STATUS_BIT,a1 ;branch is taken jrz #skip move a0,a4 ;new ani pc #skip move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_code ;30 move *a4+,a0,L ;code to execute move a4,*a10(OANIPC),L PUSH a10 call a0 PULL a10 jruc _next_command #******** _ani_shaker ;31 push a10 move *a4+,a10,W ;shaker mode value calla SHAKER2 pull a10 move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_changeanim ;32 move *a4+,a4,L move a4,*a10(OANIPC),L move a4,*a10(OANIBASE),L ; jruc _next_command jruc _next_command1 #******** _ani_faceup ;33 movk MOVE_UP_RIGHT,a1 move *a13(OBJ_CONTROL),a0 btst B_FLIPH,a0 jrz #right movk MOVE_UP_LEFT,a1 #right move a1,*a13(FACING_DIR) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_facedown ;34 movk MOVE_DOWN_RIGHT,a1 move *a13(OBJ_CONTROL),a0 btst B_FLIPH,a0 jrz #right movk MOVE_DOWN_LEFT,a1 #right move a1,*a13(FACING_DIR) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_bouncerope ;35 movi ROPE_LEFT,a0 move *a13(OBJ_XPOSINT),a14 cmpi RING_X_CENTER,a14 jrle #dir_set movi ROPE_RIGHT,a0 #dir_set movi ROPE_SIDES,a1 move *a13(OBJ_ZPOS),a3,L move *a4+,a2,W move a4,*a10(OANIPC),L jrnn #no_release movi ROPE_SIDESR,a1 #no_release calla rope_command movi 3ch,a0 calla triple_sound jruc _next_command #******** _ani_shakeropes ;36 movi ROPE_BOUNCEUD,a1 move *a4+,a2,W move a4,*a10(OANIPC),L ;blow it off if we're outside move *a13(INRING),a14 jrnz _next_command ;force a2 into range, just to be safe... andi 03h,a2 movi ROPE_BACK,a0 calla rope_command movi ROPE_LEFT,a0 move *a13(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrnz #cont movi ROPE_RIGHT,a0 #cont calla rope_command movi 3ch,a0 calla triple_sound jruc _next_command #******** _ani_bendrope ;37 movi ROPE_LEFT,a0 move *a13(OBJ_XPOSINT),a14 cmpi RING_X_CENTER,a14 jrle #dir_set movi ROPE_RIGHT,a0 #dir_set movi ROPE_DOWNS,a1 move *a13(OBJ_ZPOS),a3,L move *a4+,a2,W move a4,*a10(OANIPC),L jrnn #no_release movi ROPE_DOWNSR,a1 #no_release calla rope_command jruc _next_command #******** _ani_setspeed ;38 move *a4+,a0 move a0,*a13(ANI_SPEED) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_leapatpos ;39 ;WORD - #ticks to reach destination ;WORD - max distance to travel ;WORD - x,y,z offset of attack box (eg. attacker's fist) ;NB - user must set TGT_XOFF,YOFF & ZOFF <-- these are the actual target move *a4+,a8 ;# ticks move *a4+,a9 ;max distance to travel #user move *a13(TGT_XOFF),a1 ;target x sll 16,a1 move *a4+,a0 ;attack x offset sll 16,a0 move *a13(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrz #right0 neg a0 #right0 move *a13(OBJ_XPOS),a2,L add a0,a2 ;att x sub a2,a1 ;def x - att x move a1,a5 ;delta x move a8,a0 ;ticks divs a0,a1 ;a1 / a0 move a1,*a13(OBJ_XVEL),L ;to calculate YVEL taking into account gravity: ;use y-y0 = v0*t + 0.5*a*t^2 move a8,a1 mpyu a8,a1 ;t^2 move *a13(OBJ_GRAVITY),a0,L mpyu a0,a1 ;a*t^2 srl 1,a1 ;1/2*a*t^2 move *a13(TGT_YOFF),a0 ;target y sll 16,a0 move *a4+,a14 ;attack y offset sll 16,a14 move *a13(OBJ_YPOS),a2,L ;y0 sub a14,a2 sub a2,a0 ;a0 = a0-a2 (y - y0) add a0,a1 divu a8,a1 ;a1 = a1/a8 ( ((y-y0)+(1/2*a*t^2)) / t ) cmpi >0f0000,a1 jrlt #yok movi >0f0000,a1 #yok move a1,*a13(OBJ_YVEL),L move *a13(TGT_ZOFF),a1 ;target z sll 16,a1 move *a4+,a0 ;attack z offset sll 16,a0 move *a13(OBJ_ZPOS),a2,L add a0,a2 ;att z sub a2,a1 ;def z - att z move a1,a6 ;delta z move a8,a0 ;ticks divs a0,a1 ;a1 / a0 move a1,*a13(OBJ_ZVEL),L abs a5 srl 16,a5 move a5,a1 mpyu a5,a1 ;deltax^2 move a1,a5 abs a6 srl 16,a6 move a6,a1 mpyu a6,a1 ;deltaz^2 move a1,a0 add a5,a0 calla square_root cmp a0,a9 ;a9-a0 (will we exceed max dist?) jrgt #ok sll 8,a9 ;x 256 (8 bits fractional) divu a0,a9 ;a9/a0 move a9,a1 move *a13(OBJ_XVEL),a0,L mpys a0,a1 ;scale down xvel sra 8,a1 ;shift off fractional move a1,*a13(OBJ_XVEL),L move a9,a1 move *a13(OBJ_ZVEL),a0,L mpys a0,a1 ;scale down yvel sra 8,a1 ;shift off fractional move a1,*a13(OBJ_ZVEL),L #ok move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_zero_xzvels ;40 clr a0 move a0,*a13(OBJ_XVEL),L move a0,*a13(OBJ_ZVEL),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_rope_z ;41 ;.word ANI_ROPE_Z,R_TOP,RZ_HIGH ;which rope has he hit? move @right_rproc,a0,L move *a13(OBJ_XPOS),a14,L cmpi RING_X_CENTER<<16,a14 jrgt #right move @left_rproc,a0,L #right move *a4+,a1,W ;rope index move *a4+,a2,W ;action calla set_rope_z move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_loop ;42 .ref arw_bwait move @p1rounds,a0 cmpi 2,a0 jrz #at_end move @p2rounds,a0 cmpi 2,a0 jreq #at_end ;oooh, wait. If we've pinned someone, and announce_rnd_winner ; is waiting on the result (they'll be waiting to wake up at ; arw_bwait if they are) then we should wake it up. move *a13(STATUS_FLAGS),a14 btst B_PINNED,a14 jrz #no_pin movi ANNC_PID,a0 clr a1 not a1 calla EXISTP jrnz #no_pin ;annc exists? move *a0(PWAKE),a14,L cmpi arw_bwait,a14 jrne #no_pin ;waiting for a pin? movk 1,a14 move a14,*a0(PTIME) ;wake it up. #no_pin movk 1,a0 move a0,*a10(OANICNT) rets #at_end jruc _ani_detach ;10 ; ; move a4,*a10(OANIPC),L ; jruc _next_command #******** ;_ani_set_opp_getup ;43 ; ;;args: .word (GETUP_TIME) ; ; move *a4+,a0 ; ; move *a13(WHOIHIT),a14,L ; move a0,*a14(GETUP_TIME) ; ; move a4,*a10(OANIPC),L ; jruc _next_command ; #******** _ani_set_xvel ;44 ;args: .long (XVEL) .word (MODE) ;if MODE=0 vel is absolute ;if MODE=3 vel is new_face relative move *a4+,a0,L move *a4+,a1 jrz #abs dec a1 jrz #face dec a1 jrz #hit ;new_facing relative move *a13(NEW_FACING_DIR),a14 btst MOVE_RIGHT_BIT,a14 jrnz #abs ;right neg a0 ;left jruc #abs #hit ;hit relative move *a13(PLYR_HIT_SIDE),a14 btst MOVE_RIGHT_BIT,a14 jrnz #abs ;hit from right neg a0 ;hit from left jruc #abs #face move *a13(FACING_DIR),a14 btst MOVE_RIGHT_BIT,a14 jrnz #abs ;right neg a0 ;left #abs move a0,*a13(OBJ_XVEL),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_ifnotstatus ;45 move *a4+,a0,L ;this is a conditional goto move *a13(ANIMODE),a1 ;if MODE_STATUS clear then btst MODE_STATUS_BIT,a1 ;branch is taken jrnz #skip move a0,a4 ;new ani pc #skip move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_slide_back move *a4+,a8 ;range move *a4+,a9,L ;x-vel move *a4+,a7,L ;new ani PC if no slide move a4,*a10(OANIPC),L move *a13(ANIMODE),a14 ;was there a collision? btst MODE_STATUS_BIT,a14 jrz #no_slide move *a13(WHOIHIT),a6,L ; move *a6(PLYRMODE),a5 ; cmpi MODE_BLOCK,a5 ; jrz #no_slide move *a6(OBJ_XPOSINT),a5 move *a13(OBJ_XPOSINT),a0 cmp a5,a0 ;a0-a5 jrgt #hit_from_right ;hit_from_left move *a13(INRING),a0 jrnz #outside1 PUSH a6,a13 move a6,a13 movi vln_right_rope,a6 calla calc_line_x PULL a6,a13 move *a6(OBJ_XPOSINT),a1 sub a1,a0 abs a0 cmp a8,a0 jrgt #no_slide jruc #slide #outside1 ;hit from left outside ring. ; get left matedge first. if it's zero, or greater than our ; x pos, check against right fence instead. PUSH a6 movi vln_left_matedge,a6 calla calc_line_x PULL a6 TEST a0 jrz #check_right_fence move *a6(OBJ_XPOSINT),a1 sub a1,a0 jrlt #check_right_fence ;less than a nonzero left matedge val. check against it. cmp a1,a8 jrgt #no_slide jruc #slide #check_right_fence PUSH a6,a13 move a6,a13 movi vln_right_fence,a6 calla calc_line_x PULL a6,a13 move *a6(OBJ_XPOSINT),a1 sub a1,a0 abs a0 cmp a8,a0 jrgt #no_slide jruc #slide #hit_from_right move *a13(INRING),a0 jrnz #outside2 PUSH a6,a13 move a6,a13 movi vln_left_rope,a6 calla calc_line_x PULL a6,a13 move *a6(OBJ_XPOSINT),a1 sub a1,a0 abs a0 cmp a8,a0 jrgt #no_slide neg a9 jruc #slide #outside2 ;hit from right outside ring. ; get right matedge first. if it's zero, or greater than our ; x pos, check against left fence instead. PUSH a6 movi vln_right_matedge,a6 calla calc_line_x PULL a6 TEST a0 jrz #check_left_fence move *a6(OBJ_XPOSINT),a1 sub a0,a1 jrlt #check_left_fence ;greater than a nonzero right matedge val. check against it. cmp a1,a8 jrle #no_slide neg a9 jruc #slide #check_left_fence PUSH a6,a13 move a6,a13 movi vln_left_fence,a6 calla calc_line_x PULL a6,a13 move *a6(OBJ_XPOSINT),a1 sub a1,a0 abs a0 cmp a8,a0 jrgt #no_slide neg a9 #slide move a9,*a13(OBJ_XVEL),L movi 3000h,a0 move a0,*a13(OBJ_FRICTION) move *a13(ANIMODE),a0 ori MODE_FRICTION,a0 move a0,*a13(ANIMODE) jruc _next_command #no_slide move a7,*a10(OANIPC),L jruc _next_command #******** _ani_clr_damage ;47 move a4,*a10(OANIPC),L ; calla clear_damage_log ; jruc _next_command jruc _next_command1 #******** _ani_set_zvel ;48 ;args: .long (ZVEL) .word (MODE) ;if MODE=0 vel is absolute ;if MODE=1 vel is facing relative ;if MODE=2 vel is hit relative move *a4+,a0,L move *a4+,a1 jrz #abs dec a1 jrz #face ;hit relative move *a13(PLYR_HIT_SIDE),a14 btst MOVE_UP_BIT,a14 jrnz #abs ;hit from above neg a0 ;hit from below jruc #abs #face move *a13(FACING_DIR),a14 btst MOVE_DOWN_BIT,a14 jrnz #abs ;down neg a0 ;up #abs move a0,*a13(OBJ_ZVEL),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_checkword ;49 ;sets a word in the procs pdata area ; .word ANI_SETWORD,OFFSET,VAL move *a4+,a0 ;OFFSET move a4,*a10(OANIPC),L add a13,a0 move *a0,a0 jrz #clr ;hit. set mode_status move *a13(ANIMODE),a0 ori MODE_STATUS,a0 move a0,*a13(ANIMODE) jruc _next_command #clr ;clear mode_status move *a13(ANIMODE),a0 andni MODE_STATUS,a0 move a0,*a13(ANIMODE) jruc _next_command #******** _ani_face ;50 move *a4+,a0 move a4,*a10(OANIPC),L move *a13(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrz #no_flip xori MOVE_LEFT|MOVE_RIGHT,a0 #no_flip move a0,*a13(FACING_DIR) jruc _next_command #******** _ani_setword ;51 ;sets a word in the procs pdata area ; .word ANI_SETWORD,OFFSET,VAL move *a4+,a0 ;OFFSET add a13,a0 move *a4+,a1 ;VAL move a1,*a0 move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_getup ;52 ;args: .word (GETUP_TIME) move *a4+,a0 move *a13(PLYR_DIZZY),a14 jrnz #skip move a0,*a13(GETUP_TIME) #skip move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_getup_wait ;53 move *a13(GETUP_TIME),a0 jrnz #no_done move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #no_done movk 1,a0 move a0,*a10(OANICNT) ;# ticks to hold cur frame rets #******** _ani_clr_stars ;54 clr a0 move a0,*a13(STARS_FLAG) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_shakeall ;55 movi ROPE_BOUNCEUD,a1 move *a4+,a2,W move a4,*a10(OANIPC),L ;blow it off if we're outside move *a13(INRING),a14 jrnz _next_command move @reduce_bog,a14 jrnz _next_command ;force a2 into range, just to be safe... andi 03h,a2 movi ROPE_BACK,a0 calla rope_command movi ROPE_LEFT,a0 calla rope_command movi ROPE_RIGHT,a0 calla rope_command movi ROPE_FRONT,a0 calla rope_command movi 3ch,a0 calla triple_sound jruc _next_command #******** _ani_damage ;56 move *a4+,a0 neg a0 ;positive a0 = health increase... move *a13(PLYRNUM),a1 calla adjust_health move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_start_dizzy ;57 ; clr a0 ; move a0,*a13(PLYR_DIZZY) PUSH a10 move *a4+,a10 ;Where do stars go? calla create_dizzy_proc PULL a10 move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_clr_status ;58 move *a13(ANIMODE),a1 andni MODE_STATUS,a1 move a1,*a13(ANIMODE) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_set_target ;59 move *a4+,a0 move a4,*a10(OANIPC),L calla set_target_offsets jruc _next_command #******** _ani_max_x ;60 move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_max_z ;61 move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_max_y_vel ;62 move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_superslave ;63 ; long pointer to slave table ; word index into table move *a4+,a5,L ;* table move *a4+,a6 ;index to frame & offsets move a4,*a10(OANIPC),L move *a13(ATTACH_PROC),a11,L move *a11(ATTACH_PROC),a0,L cmp a13,a0 jrne #done move *a11(WRESTLERNUM),a0 X32 a0 add a5,a0 move *a0,a5,L .if DEBUG move *a5,a0,L ;table defined? jrnz #ok1 LOCKUP ; no slave table defined! #ok1 .endif movi 80,a1 ;LWWW mpyu a6,a1 add a1,a5 move *a5+,a0,L ;* * image move *a0,a0,L ;* image .if DEBUG jrnz #ok LOCKUP ; image not loaded! (null pointer) #ok .endif move a0,*a11(CUR_FRAME),L ;primary frame move *a5+,a0 ;xoff move a0,*a13(ATTACH_XOFF) move *a5+,a0 move a0,*a13(ATTACH_YOFF) move *a11(OBJ_CONTROL),a3 move *a13(FACING_DIR),a14 btst PLAYER_RIGHT_BIT,a14 jrnz #right ;left andni M_FLIPH,a3 ;clear flip bit jruc #cnt #right ori M_FLIPH,a3 ;set flip #cnt move *a5+,a0 ;flip flag jrz #skip xori M_FLIPH,a3 ;invert #skip move a3,*a11(OBJ_CONTROL) #done jruc _next_command #******** * ;same as old slaveanim except this executes ;the animation up to the 1st sleep _ani_slaveanim ;64 move *a4+,a5,L ;* table move a4,*a10(OANIPC),L move *a13(ATTACH_PROC),a2,L move *a2(ATTACH_PROC),a0,L cmp a13,a0 jrne #done move *a2(WRESTLERNUM),a0 X32 a0 add a0,a5 move *a5,a0,L jrnz #ok1 .if DEBUG LOCKUP ; no slave anim table defined! .endif jruc _next_command #ok1 ;a0 = * animation script ;a2 = * wrestler process PUSH a10,a13 move a2,a13 callr change_anim1a ;execute animation PULL a10,a13 #done jruc _next_command #******** _ani_rawsound ;65 move *a4+,a3,W calla SNDSND move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_damageopp ;66 ;works on attached proc, or WHOIHIT if there isn't one .ref any_hits,DAM_MULT,FIRSTATT_MESS STRUCT 0 WORD #FULL_DAMAGE WORD #REDUCED_DAMAGE LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L ;get victim process ptr move *a13(ATTACH_PROC),a2,L jrnz #attach_found move *a13(WHOIHIT),a2,L #attach_found ;get damage move *a4(#FULL_DAMAGE),a0 move *a2(LAST_DAMAGE),a14 jrz #dmset move @PCNT,a1 sub a14,a1 cmpi 30,a1 jrgt #dmset move *a4(#REDUCED_DAMAGE),a0 #dmset ;ooh, wait. if the attacker has a NEXT_DAMAGE set, use that instead. move *a13(NEXT_DAMAGE),a14 jrz #nnd ;aw, skip it. move *a13(SPECIAL_DAMAGE_TIME),a14,L move @PCNT,a1,L cmp a14,a1 jrgt #nnd ;too late. blow it off. move *a13(NEXT_DAMAGE),a0 #nnd neg a0 ;If this is the first unblocked hit this round and it did at least ; 2 pixels of damage, give an award PUSH a0 cmpi -2,a0 jrgt #n1uh ;Taunt style high risk move - give 3x dmg move *a13(RISK),a1 jrz #no_mult PUSH a0,a8,a10 move a13,a8 btst 15,a1 jrz #reg ;Taunt style high risk move - give 3x dmg movi -1,a10 movk 4,a14 move a14,@DAM_MULT .ref BONUS_MESS CREATE0 BONUS_MESS #reg clr a1 move a1,*a13(RISK) PULL a0,a8,a10 jruc #clear #no_mult move @any_hits,a14 jrnz #n1uh ;skip if there's already been one move *a2(PLYRMODE),a14 cmpi MODE_BLOCK,a14 jreq #n1uh ;skip if it was blocked RND_AWARD a13,FIRST_HIT_AWD PUSH a10 move a13,a10 CREATE MESSAGE_PID,FIRSTATT_MESS PULL a10 movk 2,a14 move a14,@DAM_MULT #clear movk 1,a14 move a14,@any_hits #n1uh PULL a0 ;MODS REQUIRED TO MAKE ADJUST_HEALTH WORK IN COMBO MODE move *a2(PLYRNUM),a1 PUSH A10,A13 MOVE A13,A10 calla adjust_health PULL A10,A13 #done jruc _next_command #******** _ani_rndper ;67 ;word probability ;long jump here if hit move *a4+,a0,W move *a4+,a2,L calla RNDPER jrls #done ;ANI_GOTO a2 move a2,*a10(OANIPC),L jruc _next_command #done move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_waithitopp ;68 ;NOTE: This is just like an ordinary "WL ticks,frame" type command ; except that the ANICNT is zeroed if we hit the opponent. ;word max ticks to wait ;long frame to hold move *a13(ANIMODE),a14 ori MODE_WAITHITOPP,a14 move a14,*a13(ANIMODE) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_attchimage ;69 ;long *image,word zoff ;update OANIPC move a4,a14 addi 30h,a14 move a14,*a10(OANIPC),L clr a14 ; move a14,*a13(ATTACHIMG_XOFF) ; move a14,*a13(ATTACHIMG_YOFF) move a14,*a13(ATTACHIMG_XOFF),L move *a4+,a0,L jrz #offimg move *a4+,a1 move a1,*a13(ATTACHIMG_ZOFF) #off attach_cont69 ;entry from attachimage2 #124 move *a13(ATTIMG_CUR_FRAME),*a13(ATTIMG_LAST_FRAME),L move *a0,a0,L .if DEBUG jrnz #ok LOCKUP ;NULL IMAGE POINTER!!! #ok .endif ;#offimg move a0,*a13(ATTIMG_CUR_FRAME),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #offimg move a0,*a13(ATTIMG_CUR_FRAME),L addk 16,a4 move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 .if 0 move *a4+,a0,L jrz #off move *a4+,a1 move a1,*a13(ATTIMG_ZOFF) move *a0,a0,L .if DEBUG jrnz #ok LOCKUP ;NULL IMAGE POINTER!!! #ok .endif move a0,*a13(ATTIMG_CUR_FRAME),L move *a13(ATTIMG_IMG),a8,L move a0,*a8(OIMG),L move *a0(0),*a8(OSIZE),L move *a0(ISAG),*a8(OSAG),L move *a0(ICMAP),a0,L calla pal_find jrnz #AOK LOCKUP ;can't find palette #AOK move a0,*a8(OPAL) move *a8(OIMG),a0,L movb *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops andi 0111111b,a7 ; setf 6,0,0 ; move a7,*a8(OCTRL) ;Write 6 low bits ; setf 16,1,0 move *a8(OCTRL),a14 srl 6,a14 sll 6,a14 or a7,a14 move a14,*a8(OCTRL) move *a13(OBJ_CONST),*a8(OCONST) jruc _next_command #off move a0,*a13(ATTIMG_CUR_FRAME),L jruc _next_command .endif #******** _ani_ifoppmode ;70 ;If opponent PLYRMODE is #MODE, jump to #BRANCH ;If the high bit of #MODE is set, jump on PLYRMODE != ~#MODE STRUCT 0 WORD #MODE LONG #BRANCH LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(CLOSEST_NUM),a11 X32 a11 addi process_ptrs,a11 move *a11,a11,L move *a11(PLYRMODE),a14 move *a4(#MODE),a0 jrn #not cmp a0,a14 jrne #done jruc #branch #not not a0 cmp a0,a14 jreq #done #branch move *a4(#BRANCH),a0,L move a0,*a10(OANIPC),L #done jruc _next_command #******** _ani_ifbuttons ;71 ;buttons (WORD), ani address (LONG) move *a13(BUT_VAL_CUR),a0 move *a4+,a1 ;button vals move *a4+,a2,L ;ani address ;;Drones shouldn't run accidentally ; move *a13(PLYR_TYPE),a14 ; cmpi PTYPE_DRONE,a14 ; jrz #fail and a1,a0 cmp a1,a0 jrne #fail move a2,a4 ;jump to new ani address #fail move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_ifnohitblock ;72 ;ani address (LONG) move *a4+,a0,L ;this is a conditional goto move *a13(HITBLOCKER),a14 jrnz skip? move a0,a4 skip? move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_end ;73 move *a10(OANIMODE),a0 ori MODE_END,a0 move a0,*a10(OANIMODE) jruc _exit #******** _ani_ifrope ;74 clr a11 jruc _ani_ifrope_common #******** _ani_ifnotrope ;75 #MODE equ 0 ;UHW #DIST equ 10h ;UHW #ADDR equ 20h ;UHL #SIZE equ 40h ;word distance ;long jump here if close enough ;word mode RC_FRONT - check rope in front of caller ; RC_BACK - check rope behind caller ; RC_EITHER - check nearest rope ; or'ed with: ; RC_PLAYER - check for caller ; RC_OPPONENT - check for caller's closest opponent movk 1,a11 _ani_ifrope_common ;prepare OANIPC before doing anything else move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(INRING),a0 jrnz #definitly_too_far ;;;a9 is process ptr of person for whom we're checking move a13,a9 move *a4(#MODE),a0 sra 8,a0 ;mask off the low byte jrz #player_set ;RC_PLAYER == 0 move *a13(CLOSEST_NUM),a9 X32 a9 addi process_ptrs,a9 move *a9,a9,L #player_set move *a4(#MODE),a14,W ;mode andi 00FFh,a14 ;mask off the high byte jrz #check_front ;RC_FRONT == 0 dec a14 jrz #check_back ;;;RC_(FRONT|BACK|EITHER) cases #check_closest move *a9(OBJ_XPOSINT),a1 cmpi RING_X_CENTER,a1 jrgt #check_right_rope jruc #check_left_rope #check_front move *a9(FACING_DIR),a0 btst MOVE_RIGHT_BIT,a0 jrnz #check_right_rope jruc #check_left_rope #check_back move *a9(FACING_DIR),a0 btst MOVE_LEFT_BIT,a0 jrnz #check_right_rope jruc #check_left_rope ;now do the actual check #check_left_rope movi vln_left_rope,a6 jruc #check_xxx_rope #check_right_rope movi vln_right_rope,a6 #check_xxx_rope calla calc_line_x move *a9(OBJ_XPOSINT),a1 sub a0,a1 abs a1 move *a4(#DIST),a0 cmp a0,a1 jrle #close_enough ;a11 is one if we are an IFNOTROPE command, so swap outcomes. #too_far dec a11 jrz #close_enough #definitly_too_far jruc _next_command #close_enough dec a11 jrz #too_far move *a4(#ADDR),a0,L move a0,*a10(OANIPC),L jruc _next_command #******** _ani_opp_getup ;76 ;if TIME is negative, then clear DELAY_METER #TIME equ 0 ;UHW #SIZE equ 10h move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a1,L jrnz #victim_set ;not attached. check WHOIHIT move *a13(WHOIHIT),a1,L jrz #done #victim_set move *a4(#TIME),a0 jrnn #norm clr a14 move a14,*a1(DELAY_METER) ;always do delay abs a0 ;make GETUP_TIME positive #norm move *a1(PLYR_DIZZY),a14 jrnz #done move a0,*a1(GETUP_TIME) #done jruc _next_command #******** _ani_shakecorner ;77 movk 1,a2 movi ROPE_BOUNCEUD,a1 movi ROPE_BACK,a0 calla rope_command movi ROPE_LEFT,a0 move *a13(OBJ_XPOSINT),a14 cmpi RING_X_CENTER,a14 jrle #dir_set movi ROPE_RIGHT,a0 #dir_set movi ROPE_BOUNCEUD,a1 calla rope_command move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_singlestep ;78 calla get_all_buttons_down move a0,a0 jrnz #done move a1,*a10(OANICNT) jruc _exit #done move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_superslave2 ;79 ; # ticks ; attacker frame ; table address ; table index STRUCT 0 ;ANI_SUPERSLAVE data WORD #TICKS LONG #ATTACKER LONG #TABLE WORD #INDEX LABEL #SIZE STRUCT 0 ;table data LONG #FRAME WORD #XOFF WORD #YOFF WORD #FLIP LABEL #TABLE_SIZE ;set OANIPC move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L ;verify the links move *a13(ATTACH_PROC),a11,L move *a11(ATTACH_PROC),a0,L cmp a13,a0 jrne #done move *a4(#TICKS),a0 move *a13(ANI_SPEED),a1 mpyu a0,a1 srl 8,a1 move a1,*a10(OANICNT) move *a4(#ATTACKER),a0,L move *a0,a0,L .if DEBUG jrnz #ok0 LOCKUP ;image not loaded! (null pointer) #ok0 .endif ;set the attacker frame move a0,*a10(OCUR_FRAME),L ;get the slave table move *a11(WRESTLERNUM),a0 X32 a0 move *a4(#TABLE),a14,L add a14,a0 move *a0,a5,L .if DEBUG move *a5,a0,L jrnz #ok1 LOCKUP ;no slave table defined! #ok1 .endif ;get the defender frame move *a4(#INDEX),a14 movi #TABLE_SIZE,a1 mpyu a14,a1 add a1,a5 move *a5(#FRAME),a0,L move *a0,a0,L .if DEBUG jrnz #ok LOCKUP ;image not loaded! (null pointer) #ok .endif ;set the defender frame move a0,*a11(CUR_FRAME),L ;compute attach offsets ; attach Y is raw(table)x + defender Xoff - attacker Xoff ;attacker anis in a8, defender in a9 move *a13(CUR_FRAME),a0,L ;attacker frame calla get_mpart_offsets move a0,a8 move *a11(CUR_FRAME),a0,L ;defender frame calla get_mpart_offsets move a0,a9 ;attacker size in a6, defender in a7 move *a13(CUR_FRAME),a0,L ;attacker frame calla get_mpart_xsize move a0,a6 move *a11(CUR_FRAME),a0,L ;defender frame calla get_mpart_xsize move a0,a7 ;compute Y offset move *a5(#YOFF),a1 ;raw Y move a9,a14 sra 16,a14 sub a14,a1 ;sub defender aniY move a8,a14 sra 16,a14 add a14,a1 ;add attacker aniY move a1,*a13(ATTACH_YOFF) ;attach Xoff: ; no flip: raw x + def xoff - att xoff ; def flip: raw x + (def xsz - def xoff) - att xoff ;compute X offset move *a5(#XOFF),a1 ;raw X ;defender part in a2 move a9,a2 andi 0FFFFh,a2 ;def xoff sext a2 callr #attacker_flip_test jrc #af_match ;attack X's don't match up move *a5(#FLIP),a14 jrz #def_set neg a2 add a7,a2 ;def xsize jruc #def_set ;attack X's match up #af_match move *a5(#FLIP),a14 jrnz #def_set neg a2 add a7,a2 ;def xsize #def_set ;attacker part in a3 move a8,a3 andi 0FFFFh,a3 ;att xoff add a2,a1 sub a3,a1 ;if X's don't match, negate this calla #attacker_flip_test jrc #foox neg a1 #foox move a1,*a13(ATTACH_XOFF) ;set flip bits properly move *a11(OBJ_CONTROL),a3 move *a13(FACING_DIR),a14 btst PLAYER_RIGHT_BIT,a14 jrnz #right ;left andni M_FLIPH,a3 ;clear flip bit jruc #cnt #right ori M_FLIPH,a3 ;set flip #cnt move *a5(#FLIP),a0 ;flip flag jrz #skip xori M_FLIPH,a3 ;invert #skip move a3,*a11(OBJ_CONTROL) #done jruc _exit SUBRP #attacker_flip_test ;Test for attacker flip. When facing right, flip should be off. ; When facing left, should be on. Set the carry flag if everything ; is okay. PUSH a0,a1 move *a13(FACING_DIR),a0 move *a13(OBJ_CONTROL),a1 btst B_FLIPH,a1 jrnz #ttf_set #ttf_clear btst MOVE_LEFT_BIT,a0 jrnz #ttf_flip jruc #ttf_noflip #ttf_set btst MOVE_RIGHT_BIT,a0 jrnz #ttf_flip jruc #ttf_noflip #ttf_flip PULL a0,a1 clrc rets #ttf_noflip PULL a0,a1 setc rets #******** _ani_setoppmode ;80 STRUCT 0 WORD #MODE LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a0,L jrz #done move *a0(ATTACH_PROC),a14,L jrz #done move *a0(ANIMODE),a1 move *a4(#MODE),a14 or a14,a1 move a1,*a0(ANIMODE) #done jruc _next_command #******** _ani_clroppmode ;81 STRUCT 0 WORD #MODE LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a0,L jrz #done move *a0(ATTACH_PROC),a14,L jrz #done move *a0(ANIMODE),a1 move *a4(#MODE),a14 andn a14,a1 move a1,*a0(ANIMODE) #done jruc _next_command #******** _ani_oppoffset ;82 STRUCT 0 LONG #TABLE LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a0,L jrz #done move *a0(ATTACH_PROC),a14,L jrz #done move *a0(WRESTLERNUM),a1 X32 a1 move *a4(#TABLE),a14,L jrz #done add a14,a1 move *a0(OBJ_XPOSINT),a2 move *a1+,a3 move *a0(FACING_DIR),a14 btst MOVE_RIGHT_BIT,a14 jrnz #right neg a3 #right add a3,a2 move a2,*a0(OBJ_XPOSINT) move *a0(OBJ_YPOSINT),a2 move *a1+,a3 add a3,a2 move a2,*a0(OBJ_YPOSINT) #done jruc _next_command #******** _ani_ifblocked ;83 move *a4+,a0,L ;this is a conditional goto move *a13(HITBLOCKER),a1 jrz #skip move a0,a4 ;new ani pc #skip move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_waitroll ;84 ;Zombies always roll up. move *a13(STATUS_FLAGS),a14 btst B_ZOMBIE,a14 jrnz #zombie ;DEAD check move *a13(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #dead move *a13(I_WILL_DIE),a14 jrz #notded ;I_WILL_DIE is set. If immobilize is zero, die and clear it. move *a13(IMMOBILIZE_TIME),a14 jrnz #repeat clr a14 move a14,*a13(IMMOBILIZE_TIME) move a14,*a13(I_WILL_DIE) SETMODE DEAD calla clear_lifebar jruc #dead #notded ;since we're not dead, set mode onground, just to be safe movi MODE_ONGROUND,a14 move a14,*a13(PLYRMODE) move *a13(IMMOBILIZE_TIME),a0 jrnz #repeat move *a13(GETUP_TIME),a0 jrnz #repeat #roll ;clear stars clr a0 move a0,*a13(STARS_FLAG) calla do_roll jrz #getup #repeat ;come back again next tick. clr a0 move a0,*a13(Z_BOUND) movk 1,a0 move a0,*a10(OANICNT) rets #getup move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #dead ;if player, change anim to xxx_dead_anim. ;if drone, figure out if we should become a zombie or not. ; if so, set it and roll up until we can't roll no more. Then the ; mode_dead code takes over so we don't worry about it here. ; if not, change to xxx_dead_anim. move *a13(PLYR_TYPE),a14 cmpi PTYPE_PLAYER,a14 jreq #die ;drone. calla is_8_on_1 jrc #fin move @royal_rumble,a14 ; jrnz #nolife jrnz #rlife jruc #die #rlife ;royal rumble. give the human team some life movk 4,a0 clr a1 calla adjust_health jruc #nolife #fin ;this is the final match. ; see if there's another guy in the hopper. ; if there is, store his number and become a zombie. ;first, tho, give the guy who killed us some life. move @PSTATUS,a1 dec a1 ;but not if he's already dead! move a1,a0 X32 a0 addi process_ptrs,a0 move *a0,a0,L move *a0(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #nolife movk 8,a0 calla adjust_health #nolife move @FINAL_PTR,a0,L movb *a0,a1 jrn #die ;no more guys ;okay, become a zombie. set our zombie flag, store our new number ; in NEW_WRESTLERNUM, increment FINAL_PTR, and clear our ZOMBIE_TIME. addk 8,a0 move a0,@FINAL_PTR,L ;7->8 hack cmpi 7,a1 jrne #vok movk 8,a1 #vok move a1,*a13(NEW_WRESTLERNUM) move *a13(STATUS_FLAGS),a14 ori M_ZOMBIE,a14 move a14,*a13(STATUS_FLAGS) clr a14 move a14,*a13(ZOMBIE_TIME) ;kill our specials calla kill_smove_procs ;if we're right up against either Z edge of the ring, move away ; a few pixels so we can roll. move *a13(OBJ_ZPOSINT),a14 cmpi RING_TOP+7,a14 jrle #mvdn cmpi RING_BOT-7,a14 jrle #zombie ;move up a few subk 7,a14 move a14,*a13(OBJ_ZPOSINT) jruc #zombie #mvdn ;move down a few addk 7,a14 move a14,*a13(OBJ_ZPOSINT) #zombie movi J_UP,a14 move a14,*a13(DRN_JOY) move a14,*a13(STICK_VAL_CUR) jruc #roll #die movi xxx_dead_anim,a14 move a14,*a10(OANIBASE),L move a14,*a10(OANIPC),L jruc _next_command #******** _ani_setoppfacing ;85 move *a13(ATTACH_PROC),a0,L jrz #done move *a0(ATTACH_PROC),a14,L jrz #done move *a0(NEW_FACING_DIR),a14 move a14,*a0(FACING_DIR) #done move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_ifopp ;86 ; .word ANI_IFOPP,wrestler1,wrestler2,...,wrestler3,-1 ; sets STATUS if opponent is one of the wrestlers in the list, else clears. move *a13(CLOSEST_NUM),a11 X32 a11 addi process_ptrs,a11 move *a11,a11,L move *a11(WRESTLERNUM),a11 ;clear mode_status move *a13(ANIMODE),a0 andni MODE_STATUS,a0 move a0,*a13(ANIMODE) ;compare loop #loop move *a4+,a0,W jrn #done cmp a0,a11 jrne #loop ;hit. set mode_status move *a13(ANIMODE),a0 ori MODE_STATUS,a0 move a0,*a13(ANIMODE) ;run off the rest of the list #runoff move *a4+,a14 jrnn #runoff #done move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_snot ;87 move a4,a0 addi 32+4*16,a0 ;LWWWW move a0,*a10(OANIPC),L push a10 clr a1 ;proc ID move *a4+,a7,L ;wake address move a4,a8 ;* arguments move a13,a11 calla GETPRC pull a10 jruc _next_command #******** _ani_if_butcount_ge ;88 STRUCT 0 WORD #BUTTON WORD #BUTCNT LONG #ADDR LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a4(#BUTTON),a14 add a13,a14 move *a14,a14 ;button count move *a4(#BUTCNT),a0 cmp a0,a14 ;#of presses needed to repeat jrlt #fail move *a4(#ADDR),*a10(OANIPC),L ;take branch #fail jruc _next_command ********* _ani_if_butcount_lt ;89 move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a4(#BUTTON),a14 add a13,a14 move *a14,a14 ;button count move *a4(#BUTCNT),a0 cmp a0,a14 ;#of presses needed to repeat jrge #fail2 move *a4(#ADDR),*a10(OANIPC),L ;take branch #fail2 jruc _next_command #******** _ani_if_rptcount ;90 STRUCT 0 LONG #ADDR LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(RPT_COUNT),a14 jrz #fail move *a4(#ADDR),*a10(OANIPC),L ;take branch #fail jruc _next_command ********* _ani_ifnot_rptcount ;91 move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(RPT_COUNT),a14 jrnz #fail2 move *a4(#ADDR),*a10(OANIPC),L ;take branch #fail2 jruc _next_command #******** _ani_ringcheck ;92 ;If caller and nearest opponent's INRING values don't match, jump ; to #BRANCH STRUCT 0 LONG #BRANCH LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(CLOSEST_NUM),a11 X32 a11 addi process_ptrs,a11 move *a11,a11,L move *a11(INRING),a0 move *a13(INRING),a1 cmp a0,a1 jreq #done move *a4(#BRANCH),a0,L move a0,*a10(OANIPC),L #done jruc _next_command #******** ;--> use this in a PUPPET sequence ;this is the same as calling ani_debris except that ;everything is relative to the wrestler attached to me _ani_debrisat ;93 move a4,a14 addi 5*16,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a11,L jrz #done move *a11(ATTACH_PROC),a14,L cmp a13,a14 jreq db94 #done jruc _next_command #******** _ani_debris ;94 .ref react_debris move a4,a14 addi 5*16,a14 move a14,*a10(OANIPC),L move a13,a11 db94 ;Stop debris if other smoke is going on! Bog reduction... move @no_debris,a1 move @reduce_bog,a14 or a14,a1 jrnz _next_command ;Too much bog outside... move *a13(INRING),a1 jrnz _next_command push a10 clr a1 ;proc ID movi react_debris,a7 ;wake address move a4,a8 ;* arguments calla GETPRC pull a10 jruc _next_command #******** _ani_set_wrestler_xflip ;95 move *a13(FACING_DIR),a14 btst PLAYER_RIGHT_BIT,a14 jrnz #right move *a13(OBJ_CONTROL),a14 ori M_FLIPH,a14 move a14,*a13(OBJ_CONTROL) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #right move *a13(OBJ_CONTROL),a14 andni M_FLIPH,a14 move a14,*a13(OBJ_CONTROL) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_slideatopp ;96 ; max ticks to slide ; target velocity ; max Z distance ; target area of opponent ; x,y,z offset of attack box STRUCT 0 WORD #MAX_TICKS LONG #VELOCITY WORD #MAX_Z_DIST WORD #TRGT WORD #ATT_X_OFF WORD #ATT_Y_OFF WORD #ATT_Z_OFF LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(CLOSEST_NUM),a11 X32 a11 addi process_ptrs,a11 move *a11,a11,L ;make sure both have the same INRING value move *a11(INRING),a0 move *a13(INRING),a1 cmp a0,a1 jrne _next_command move *a11(OBJ_XPOS),a1,L move *a11(OBJ_ZPOS),a2,L move *a11(OBJ_YPOS),a3,L addi [256,0],a3 move *a11(OBJ_XVEL),a5,L move *a11(OBJ_ZVEL),a6,L move *a11(OBJ_YVEL),a7,L move *a11(GROUND_Y),a8 sll 16,a8 addi [256,0],a8 move *a4(#MAX_TICKS),a0 #lp0 add a5,a1 ;x + xvel add a6,a2 ;z + zvel move a7,a7 jrz #ok add a7,a3 ;y + yvel ;;;; subi GRAVITY,a7 ;yvel - gravity cmp a3,a8 ;hit ground? jrgt #ok move a8,a3 jruc #dn #ok dsj a0,#lp0 #dn subi [256,0],a3 move a1,@oppx,L move a2,@oppz,L move a3,@oppy,L move *a4(#TRGT),a0 jrn #user calla set_target_offsets #user move *a13(TGT_XOFF),a0 ;target x offset sll 16,a0 move *a11(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrz #right1 neg a0 #right1 ;;; move *a11(OBJ_XPOS),a1,L move @oppx,a1,L add a0,a1 ;def target x move *a4(#ATT_X_OFF),a0 sll 16,a0 move *a13(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrz #right0 neg a0 #right0 move *a13(OBJ_XPOS),a2,L add a0,a2 ;att x move *a4(#VELOCITY),a0,L move *a13(FACING_DIR),a14 btst MOVE_RIGHT_BIT,a14 jrnz #pos neg a0 ;left #pos move a0,*a13(OBJ_XVEL),L ; move *a4(#MAX_TICKS),a0 ; move a0,*a10(OANICNT) jruc _next_command #******** _ani_clr_butcount ;97 move a4,*a10(OANIPC),L clr a14 ; move a14,*a13(PUNCHB_COUNT) ; move a14,*a13(BLOCKB_COUNT) ; move a14,*a13(SPUNCHB_COUNT) ; move a14,*a13(KICKB_COUNT) ; move a14,*a13(SKICKB_COUNT) move a14,*a13(PUNCHB_COUNT),L move a14,*a13(SPUNCHB_COUNT),L move a14,*a13(SKICKB_COUNT) ;;; move a14,*a13(BUT_COUNT) jruc _next_command #******** _ani_set_rptcount ;98 STRUCT 0 WORD #VAL LABEL #SIZE ;If #VAL is negative, set RPT_COUNT to RND(0-#VAL) move *a4+,a0 jrnn #set neg a0 calla RNDRNG0 #set move a0,*a13(RPT_COUNT) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_dec_rptcount ;99 move *a13(RPT_COUNT),a0 jrz #atz dec a0 #atz move a0,*a13(RPT_COUNT) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_shadowtrail ;100 STRUCT 0 LONG #PALETTE WORD #RATE WORD #LIFESPAN LABEL #SIZE move *a4,a0 jrnz #not_off addi 010h,a4 move a4,*a10(OANIPC),L move *a13(SHADTRAIL_PROC),a0,L ;check proc still exists jrz #huh calla KILL clr a0 move a0,*a13(SHADTRAIL_PROC),L ;proc is toast #huh jruc _next_command #not_off move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move @reduce_bog,a14 jrnz _next_command push a10 move a4,a8 ;* arguments move a13,a11 ;* wrestler proc ; move *a13(PLYRNUM),a0 ; ori SHADGEN_PID,a0 ;proc ID ; move a0,a1 ;mask ; calla EXISTP ;does process already exist? ; jrz #no_proc move *a13(SHADTRAIL_PROC),a0,L jrz #no_proc ;exists, so restart with new arguments move *a13(PLYRNUM),a1 ori SHADGEN_PID,a1 ;same proc ID movi shadow_gen,a7 ;wake address calla XFERPROC jruc #exit #no_proc move *a13(PLYRNUM),a1 ori SHADGEN_PID,a1 ;proc ID movi shadow_gen,a7 ;wake address calla GETPRC move a0,*a13(SHADTRAIL_PROC),L #exit pull a10 jruc _next_command *** ;a8 = * arguments ;a11 = * wrestler proc shadow_gen #lp move *a11(SHADTRAIL_PROC),a0,L jrz #die move *a11(CUR_FRAME),a10,L ;* multi-part image clr a1 ;proc ID movi shadow_proc,a7 ;wake address calla GETPRC ;create proc for piece ; move *a10(-10h),a9 ;# pieces ; addi (17-7)*16,a10 ;1st header move *a10(IPCOUNT),a9 ;# pieces addi IANI2Y,a10 ;1st header #loop dec a9 jrz #done ; addi 7*16,a10 addi (ICBZ-IANI2Y),a10 clr a1 ;proc ID movi shadow_proc,a7 ;wake address calla GETPRC ;create proc for piece jruc #loop #done move *a8(#RATE),a0 calla PRCSLP ;sleep jruc #lp #die DIE *** ;created from shadow_gen - creates an image, sleeps, delobj & dies shadow_proc move *a8(#LIFESPAN),a9 movi Y_SCALE_MULTIPLIER,a0 move *a11(OBJ_ZPOSINT),a1 mpyu a0,a1 move *a11(OBJ_YPOSINT),a0 sll 16,a0 sub a0,a1 ;y pos move *a11(OBJ_XPOS),a0,L ;x pos move a10,a2 ;* image move *a11(OBJ_PRIORITY),a3,L srl 16,a3 ;z pos move *a11(OBJ_CONTROL),a4 ;DMA flags PUSHP a0,a1,a2,a3,a4 SLEEP 1 PULLP a0,a1,a2,a3,a4 move *a8(#PALETTE),a5,L move a5,b0 ;palette to use clr a5 ;object ID clr a6 ;x vel clr a7 ;y vel calla BEGINOBJP move a9,a0 ;lifespan calla PRCSLP ;sleep ;#slp ; move @PCNT,a1 ; andi 1,a1 ; sll 12,a1 ; move *a8(OXPOS),a0 ; andi 0fffh,a0 ; or a1,a0 ; move a0,*a8(OXPOS) ; SLEEP 1 ; dsj a9,#slp calla DELOBJA8 DIE #******** _ani_createproc ;101 STRUCT 0 LONG #ADDR WORD #PROCID WORD #WORD1 WORD #WORD2 WORD #WORD3 LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move a13,a11 push a10 move *a4(#PROCID),a1 ;proc ID move *a4(#ADDR),a7,L ;wake address addi #WORD1,a4 move a4,a8 ;* arguments calla GETPRC pull a10 jruc _next_command #******** _ani_target ;102 ;sets leapat target to #TARGET1 or #TARGET2, depending on the ; value of #MODE. ;ex: ANI_TARGET,TGT_HEAD,TGT_KNEES,ATM_CLOSEST ; target the victim's head or victim's knees, whichever ; is closest. ;NOTE: This assumes that victim is on the ground. If he's ; not, the results will be screwy. STRUCT 0 WORD #TARGET1 ;TGT_??? WORD #TARGET2 ;TGT_??? WORD #MODE ;ATM_CLOSEST|ATM_FARTHEST LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L ;first, figure out the orientation of the wrestlers calla get_opp_process move a0,a11 ;see if our flip bits match move *a13(OBJ_CONTROL),a0 move *a11(OBJ_CONTROL),a1 xor a1,a0 btst B_FLIPH,a0 ;if Z is set, the flips match and thus the we're facing our ; opponent's feet, thus the #TARGET with the highest value ; is closest. if Z isn't set, the opposite is true. jrz #facing_feet jruc #facing_head #facing_feet move *a4(#MODE),a14 cmpi ATM_CLOSEST,a14 jreq #choose_highest jruc #choose_lowest #facing_head move *a4(#MODE),a14 cmpi ATM_CLOSEST,a14 jreq #choose_lowest jruc #choose_highest #choose_highest move *a4(#TARGET1),a0 move *a4(#TARGET2),a1 cmp a1,a0 jrge #set jruc #switch #choose_lowest move *a4(#TARGET1),a0 move *a4(#TARGET2),a1 cmp a1,a0 jrle #set jruc #switch #switch move a1,a0 #set calla set_target_offsets calla tgt_ground jruc _next_command #******** _ani_hmbwait ;103 STRUCT 0 WORD #HIT WORD #MISSED WORD #BLOCKED LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L ;first check for a block move *a13(HITBLOCKER),a1 jrz #check_hit move *a4(#BLOCKED),*a10(OANICNT) jrz _next_command rets ;then for a hit #check_hit move *a13(ANIMODE),a14 btst MODE_STATUS_BIT,a14 jrz #missed move *a4(#HIT),*a10(OANICNT) jrz _next_command rets ;assume a miss #missed move *a4(#MISSED),*a10(OANICNT) jrz _next_command rets #******** _ani_safe_time ;104 move *a4+,a0 move a0,*a13(SAFE_TIME) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** ;this won't do anything unless they're attached _ani_setopp_plyrmode ;105 move *a4+,a0 move a4,*a10(OANIPC),L move *a13(ATTACH_PROC),a11,L move *a11(ATTACH_PROC),a14,L cmp a13,a14 jrne #done move *a11(PLYRMODE),a14 cmpi MODE_DEAD,a14 jreq #done move a0,*a11(PLYRMODE) #done jruc _next_command #******** ;this won't do anything unless they're attached _ani_xflip_opp ;106 move *a13(ATTACH_PROC),a11,L move *a11(ATTACH_PROC),a14,L cmp a13,a14 jrne #done move *a11(OBJ_CONTROL),a0 xori M_FLIPH,a0 move a0,*a11(OBJ_CONTROL) #done move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** ;sets a LONG in wrestler PDATA _ani_setlong ;107 STRUCT 0 WORD #PDOFF LONG #LONG LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a4(#PDOFF),a0 add a13,a0 move *a4(#LONG),a1,L move a1,*a0,L jruc _next_command #******** * _ani_immobilize ;108 move *a4+,a0 move *a13(PLYR_DIZZY),a1 jrnz #skip move *a13(WHOIHIT),a1,L ;don't immobilize blockers! move *a1(PLYRMODE),a14 cmpi MODE_BLOCK,a14 jreq #skip move a0,*a1(IMMOBILIZE_TIME) ;clear his velocities too. clr a0 move a0,*a1(OBJ_XVEL),L move a0,*a1(OBJ_YVEL),L move a0,*a1(OBJ_ZVEL),L #skip move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** ;this flips your opponent based upon flip table ;this won't do anything unless they're attached _ani_xflip_tbl ;109 STRUCT 0 LONG #FLIPTBL LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a11,L move *a11(ATTACH_PROC),a14,L cmp a13,a14 jrne #done move *a11(WRESTLERNUM),a0 X16 a0 move *a4(#FLIPTBL),a1,L add a1,a0 move *a0,a0 jrz #done ;no flip move *a11(OBJ_CONTROL),a0 xori M_FLIPH,a0 move a0,*a11(OBJ_CONTROL) #done jruc _next_command #******** * this sets the vels for a wrestler you're attached to * x-vel and z-vel are relative to attackers facing dir ;works on attached proc, or WHOIHIT if there isn't one _ani_setoppvels ;110 STRUCT 0 LONG #XVEL LONG #YVEL LONG #ZVEL LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a11,L move *a11(ATTACH_PROC),a14,L cmp a13,a14 jreq #attach_match ;no attach. instead do this to WHOIHIT move *a13(WHOIHIT),a11,L #attach_match move *a4(#YVEL),*a11(OBJ_YVEL),L move *a4(#XVEL),a0,L move *a13(FACING_DIR),a14 btst MOVE_RIGHT_BIT,a14 jrnz #xok ;right neg a0 ;left #xok move a0,*a11(OBJ_XVEL),L move *a4(#ZVEL),a0,L btst MOVE_DOWN_BIT,a14 jrnz #zok ;down neg a0 ;up #zok move a0,*a11(OBJ_ZVEL),L #done jruc _next_command #******** ;same as waithitgnd except you pass an offset to add to ground Y ;(so you can make the guy hit the ground sooner) _ani_waithitgnd2 ;111 STRUCT 0 WORD #OFFSET LABEL #SIZE move *a13(OBJ_YVEL),a0,L ;must have down velocity jrp #no_gnd ;if we're the master and the attach is valid, check and see if ; our puppet has hit the ground. move *a13(ANIMODE),a14 btst MODE_KEEPATTACHED_BIT,a14 jrz #skip_pcheck move *a13(ATTACH_PROC),a0,L jrz #skip_pcheck ;we're attached? move *a0(ATTACH_PROC),a14,L jrz #skip_pcheck ;they're attached? cmp a13,a14 jrne #skip_pcheck ;to each other? ;ah, but if the opponent's MODE_GHOST bit is set, ignore him move *a0(ANIMODE),a14 btst MODE_GHOST_BIT,a14 jrnz #skip_pcheck move *a0(OBJ_YPOSINT),a1,W move *a0(GROUND_Y),a2,W move *a4(#OFFSET),a14 add a14,a2 cmp a2,a1 jrle #hit_gnd #skip_pcheck move *a13(OBJ_YPOSINT),a0 move *a13(GROUND_Y),a2 move *a4(#OFFSET),a14 add a14,a2 cmp a2,a0 ;a0-a1 jrgt #no_gnd #hit_gnd sll 16,a2 move a2,*a0(OBJ_YPOS),L .REF SMALL_BOUNCE CALLA SMALL_BOUNCE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L jruc _next_command #no_gnd movk 1,a0 move a0,*a10(OANICNT) ;# ticks to hold cur frame rets #******** _ani_set_opp_xvel ;112 ;args: .long (XVEL) .word (MODE) ;if MODE=0 vel is absolute ;if MODE=1 vel is facing relative ;if MODE=2 vel is hit relative ;if MODE=3 vel is new_face relative move a4,a14 addi 30h,a14 move a14,*a10(OANIPC),L move *a13(ATTACH_PROC),a11,L move *a11(ATTACH_PROC),a14,L cmp a13,a14 jrne #done move *a4+,a0,L move *a4+,a1 jrz #abs dec a1 jrz #face dec a1 jrz #hit ;new_facing relative move *a13(NEW_FACING_DIR),a14 btst MOVE_RIGHT_BIT,a14 jrnz #abs ;right neg a0 ;left jruc #abs #hit ;hit relative move *a13(PLYR_HIT_SIDE),a14 btst MOVE_RIGHT_BIT,a14 jrnz #abs ;hit from right neg a0 ;hit from left jruc #abs #face move *a13(FACING_DIR),a14 btst MOVE_RIGHT_BIT,a14 jrnz #abs ;right neg a0 ;left #abs move a0,*a11(OBJ_XVEL),L #done jruc _next_command #******** _ani_set_attach ;113 move *a13(WHOIHIT),a0,L move a0,*a13(ATTACH_PROC),L move a13,*a0(ATTACH_PROC),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_inc_combo_count ;114 move *a13(COMBO_COUNT),a0 inc a0 move a0,*a13(COMBO_COUNT) CMPI 8,A0 JRNE NO_BESERKER MOVI HES_JUST_GONE_BERSERK,A0 CALLA IF_SILENT_ADD_VOICE NO_BESERKER MOVE *a13(WHOIHIT),A0,L JRZ PROBLEMS_SS MOVI 30,A14 move a14,*a0(IMMOBILIZE_TIME) PROBLEMS_SS move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_clear_combo_count ;115 move *a13(COMBO_COUNT),a0 jrz #start_combo CLR A0 move a0,*a13(COMBO_COUNT) MOVE *a13(ATTACH_PROC),A0,L jrnz #ok MOVE *a13(WHOIHIT),A0,L jrnz #ok ;Fix LOCKUP #ok ; MOVE *A0(GETUP_TIME),A14 ; JRZ NO_WORRIES_MATEY ;Time opponent has to execute combo breaker clr a14 move a14,*a0(IMMOBILIZE_TIME) MOVE A14,*A0(GETUP_TIME) MOVI 10*60,A14 MOVE A14,*A0(DELAY_METER) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #start_combo ;problem here! ;Used to stuff a 1 in COMBO_COUNT. ;Mark now writes a 0 to COMBO_COUNT, ;Jake now skips the write altoghter. ;which is correct? ; movk 1,a0 clr a0 move a0,*a13(COMBO_COUNT) MOVE *a13(ATTACH_PROC),A0,L jrnz #ok2 MOVE *a13(WHOIHIT),A0,L jrnz #ok2 ;Fix LOCKUP #ok2 ; MOVE *A0(GETUP_TIME),A14 ; JRZ NO_WORRIES_MATEY ;Time opponent has to execute combo breaker MOVI 80,A14 move a14,*a0(IMMOBILIZE_TIME) move @PCNT,a14 move a14,*a0(ANTI_COMBO_TIME) ;Time stamp CLR A14 MOVE A14,*A0(GETUP_TIME) ;NO_WORRIES_MATEY MOVI 10*60,A14 MOVE A14,*A0(DELAY_METER) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_add_move ;116 move *a4+,a7 move *a4+,a5 move *a4+,a6 MOVE *A13(WHOIHIT),A0,L MOVE *A0(PLYRMODE),A14 CMPI MODE_DEAD,A14 JREQ NO_ADD_MORE_JUICE mmtm sp,a0,a4,a8,a10 calla ADD_TO_COMBO_COUNT mmfm sp,a0,a4,a8,a10 NO_ADD_MORE_JUICE move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** ; ;if num_ticks is negative then use default value ; _ani_startattack ;117 STRUCT 0 WORD #ATT_TYPE WORD #NUM_TICKS LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a4(#ATT_TYPE),*a13(ATTACK_TYPE) move *a4(#NUM_TICKS),a1 jrp #ok movk 30,a1 ;default tick count #ok move @round_tickcount,a0 add a0,a1 move a1,*a13(ATTACK_TIME) jruc _next_command #******** _ani_changeanim_tbl ;118 STRUCT 0 LONG #TABLE LABEL #END move *a13(WRESTLERNUM),a0 X32 a0 move *a4(#TABLE),a14,L add a14,a0 move *a0,a0,L move a0,*a10(OANIBASE),L move a0,*a10(OANIPC),L jruc _next_command #******** _ani_if_rptcount_ge ;119 STRUCT 0 WORD #VAL LONG #ADDR LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(RPT_COUNT),a14 move *a4(#VAL),a0,W cmp a0,a14 jrlt #fail move *a4(#ADDR),*a10(OANIPC),L ;take branch #fail jruc _next_command #******** _ani_if_rptcount_lt ;120 STRUCT 0 WORD #VAL LONG #ADDR LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a13(RPT_COUNT),a14 move *a4(#VAL),a0,W cmp a0,a14 jrge #fail move *a4(#ADDR),*a10(OANIPC),L ;take branch #fail jruc _next_command #******** _ani_waithitany ;121 ;holds on current frame until you hit the ground or your opponent. ;NOTE: This doesn't use the WAITHITOPP bit. We poll for a hit, ; which, now that I think about it, was probably the better way ; to implement WAITHITOPP anyway... ;ALSO NOTE: This doesn't work if you're attached. People who ; are attached have no business waiting for a blow to land. ;have we hit the ground? move *a13(OBJ_YPOSINT),a0 move *a13(GROUND_Y),a1 cmp a1,a0 ;a0-a1 jrgt #no_gnd ;hit ground. make noise and quit. calla SMALL_BOUNCE jruc #hit #no_gnd ;have we hit our opponent? move *a13(ANIMODE),a14 btst MODE_STATUS_BIT,a14 jrz #no_hit #hit move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #no_hit movk 1,a0 move a0,*a10(OANICNT) ;# ticks to hold cur frame rets #******** _ani_draw_name ;122 ;FIX!! ;This is bog! Check to see if we want messages before CREATE! move a13,a8 CREATE MESSAGE_PID,MOVE_NAME_ANNC move *a4+,a14 move a14,*a0(PA10),L move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_set_idiot ;123 ;Allow players off screen on toss outs movi 80,a0 move a0,@allow_offscrn move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_attchimage2 ;124 STRUCT 0 LONG #IMAGE WORD #XOFF WORD #YOFF WORD #ZOFF LABEL #SIZE ; move *a4(#XOFF),*a13(ATTACHIMG_XOFF) ; move *a4(#YOFF),*a13(ATTACHIMG_YOFF) move *a4(#XOFF),*a13(ATTACHIMG_XOFF),L move *a4(#ZOFF),*a13(ATTACHIMG_ZOFF) move *a4(#IMAGE),a0,L addi #SIZE,a4 jruc attach_cont69 #******** _ani_ground ;125 move *a13(GROUND_Y),a0 move a0,*a13(OBJ_YPOSINT) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_rot ;126 movk 1,a14 move a14,*a10(OANICNT) rets #******** _ani_scroll_ctrl;127 STRUCT 0 WORD #Y_VAL LABEL #SIZE move a4,a14 addi #SIZE,a14 move a14,*a10(OANIPC),L move *a4(#Y_VAL),a14 jrn #cont move a14,*a13(SCROLL_Y) #cont move *a13(STATUS_FLAGS),a14 ori M_SCROLL_CTRL,a14 move a14,*a13(STATUS_FLAGS) jruc _next_command #******** _ani_clear_climb ;128 clr a14 move a14,*a13(CLIMBING_THRU) inc a14 move a14,*a13(SAFE_TIME) move a4,*a10(OANIPC),L ; jruc _next_command jruc _next_command1 #******** _ani_opp_face ;129 move *a4+,a0 move a4,*a10(OANIPC),L move *a13(ATTACH_PROC),a11,L move *a11(ATTACH_PROC),a14,L cmp a13,a14 jrne #done move *a11(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrz #no_flip xori MOVE_LEFT|MOVE_RIGHT,a0 #no_flip move a0,*a11(FACING_DIR) #done jruc _next_command #******** _ani_setflag ;129 move *a13(STATUS_FLAGS),a14,L move *a4+,a0,L or a0,a14 move a14,*a13(STATUS_FLAGS),L move a4,*a10(OANIPC),L jruc _next_command1 #***************************************************************************** * used inside anim commands - doesn't call animate_wrestler ;a0 = * animation script ;a2 = * wrestler process SUBR change_anim_anim move a0,*a2(ANIBASE),L move a0,*a2(ANIPC),L movi GRAVITY,a0 ;reset gravity move a0,*a2(OBJ_GRAVITY),L clr a0 move a0,*a2(ANIMODE) movk 1,a0 move a0,*a2(ANICNT) rets #***************************************************************************** ;primary animation ;a0 = * animation script SUBR change_anim1 move *a13(ANIMODE),a2 btst MODE_END_BIT,a2 ;if anim has ended, then jrnz change_anim1a ;always restart it move *a13(ANIBASE),a2,L cmp a0,a2 jreq #no_change SUBR change_anim1a move a0,*a13(ANIBASE),L move a0,*a13(ANIPC),L clr a0 move a0,*a13(ANIMODE) movk 1,a0 move a0,*a13(ANICNT) movi GRAVITY,a0 ;reset gravity move a0,*a13(OBJ_GRAVITY),L callr animate_wrestler1 #no_change rets #***************************************************************************** ;secondary animation ;a0 = * animation script SUBR change_anim2 move *a13(ANIMODE2),a2 btst MODE_END_BIT,a2 ;if anim has ended, then jrnz change_anim2a ;always restart it move *a13(ANIBASE2),a2,L cmp a0,a2 jreq #no_change SUBR change_anim2a move a0,*a13(ANIBASE2),L move a0,*a13(ANIPC2),L clr a0 move a0,*a13(ANIMODE2) movk 1,a0 move a0,*a13(ANICNT2) callr animate_wrestler2 #no_change rets #***************************************************************************** SUBR slaveanim_tbl .long wres_slave_anim ;Bret .long wres_slave_anim ;Razor .long wres_slave_anim ;Taker .long wres_slave_anim ;Yokozuna .long wres_slave_anim ;Shawn .long wres_slave_anim ;BamBam .long wres_slave_anim ;Doink .long wres_slave_anim ;Adam .long wres_slave_anim ;Lex SUBR wres_slave_anim .word ANI_SETMODE,MODE_UNINT+MODE_NOAUTOFLIP+MODE_NOGRAVITY .word ANI_ZEROVELS .word ANI_SETSPEED,100h .word ANI_END #***************************************************************************** SUBR set_images PUSH a13 movi process_ptrs,a1 movi NUM_WRES,a2 #slp move *a1+,a13,L jrz #skp_mtp PUSH a1,a2 callr #set_image PULL a1,a2 #skp_mtp dsj a2,#slp PULL a13 rets #set_image ; CLR A5 ; MOVE A5,*A13(SCREENY) move *a13(OBJ_ZPOS),a0,L ori [01000h,0],a0 move *a13(INRING),a14 jrz #inring cmpi [015ach,0],a0 jrgt #inring subi [01e5h,0],a0 ;below mat #inring move a0,*a13(OBJ_PRIORITY),L move *a13(OBJ_XPOS),a5,L ;x val movi Y_SCALE_MULTIPLIER,a0 move *a13(OBJ_ZPOSINT),a1 mpyu a0,a1 move a1,a6 ;y val move *a13(OBJ_BASE),a3,L move a3,a0 movk MAX_PIECES,a1 movi [-100,0],a14 ;set all images offscreen move *a13(OBJ_PRIORITY),a2,L clr a7 #lp move *a0+,a8,L move a7,*a8(OSAG),L move a14,*a8(OXVAL),L move a6,*a8(OYVAL),L ;keep updating YVAL to keep priorities move a2,*a8(OZVAL),L dsj a1,#lp ; move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops ; andni 00111b,a7 ; movi DMAWNZ,a0 ; andi 01111b,a0 ; or a0,a7 move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops andi 0110000b,a7 ori DMAWNZ,a7 clr a10 ;x offset move *a13(GROUND_Y),a11 ;y offset ; move *a13(CUR_FRAME),a0,L ; move *a0(12*16),a0 ;shadow index clr a0 ;<------temp!!!!!! move a0,*a13(PLYR_SHADOW) ; X32 a0 ; addi shadows,a0 ; move *a0,a0,L movi shadow,a0 ;make shadow low priority move *a13(OBJ_PRIORITY),a14,L PUSH a14 movi [013c8h,0],a14 ;inside ring move *a13(INRING),a1 jrz #in movi [0106Ah,0],a14 ;outside ring #in move a14,*a13(OBJ_PRIORITY),L callr #plot_object ;plot shadow PULL a14 move a14,*a13(OBJ_PRIORITY),L move *a8(OXPOS),a0 move *a13(ANIMODE),a14 btst MODE_NOSHADOW_BIT,a14 jrz #shadow_on clr a0 #shadow_on andni 1,a0 move @PCNT,a1 andi 1,a1 or a1,a0 move *a8(OYPOS),a1 andi 1,a1 xor a1,a0 move a0,*a8(OXPOS) ;shake shadow ;leave him off if in mode_invisible move *a13(ANIMODE),a14 btst MODE_INVISIBLE_BIT,a14 jrnz #done2 move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops andi 0111111b,a7 clr a10 ;x offset move *a13(OBJ_YPOSINT),a11 ;y offset move *a13(CUR_FRAME),a0,L callr #plot_object ;image move *a13(OBJ_PAL),a1 move a1,*a8(OPAL) ; move *a0(-10h),a4 ;# pieces move *a0(IPCOUNT),a4 ;# pieces .if DEBUG .bss part_count,16 ;part count check move a4,@part_count .endif ; addi (13+4-7)*16,a0 ;1st header addi IANI2Y,a0 ;1st header #loop1 dec a4 jrz #done1 ; addi 7*16,a0 addi (ICBZ-IANI2Y),a0 callr #plot_object ;image move *a13(OBJ_PAL),a1 move a1,*a8(OPAL) jruc #loop1 #done1 move *a13(CUR_FRAME),a9,L move *a9(IANI2X),a14,L ;secondary X & Y inc a14 ;should be 0 jrz #no_2nd_piece move *a9(IANIOFFX),a10 ;display x offset move *a9(IANI2X),a14 ;secondary X sub a14,a10 move *a9(IANIOFFY),a1 ;display y offset move *a9(IANI2Y),a14 ;secondary Y sub a14,a1 add a1,a11 move *a13(CUR_FRAME2),a0,L callr #plot_object move *a13(OBJ_PAL),a1 move a1,*a8(OPAL) ; move *a0(-10h),a4 ;# pieces move *a0(IPCOUNT),a4 ;# pieces .if DEBUG ;part count check move @part_count,a14 add a4,a14 cmpi 5,a14 jrle #okay LOCKUP ;too many pieces!!! #okay .endif ; addi (13+4-7)*16,a0 ;1st header addi IANI2Y,a0 ;1st header #loop2 dec a4 jrz #done2 ; addi 7*16,a0 addi (ICBZ-IANI2Y),a0 callr #plot_object ;image move *a13(OBJ_PAL),a1 move a1,*a8(OPAL) jruc #loop2 #no_2nd_piece movi MODE_END,a0 ;don't bother animating move a0,*a13(ANIMODE2) ;if no 2nd piece #done2 ; move a13,a3 ; addi ATTACH_IMG1,a3 ; movk 4,a4 ;#attloop ; move *a3+,a8,L ; jrz #skip ;set the x,y & z of image ;; LOCKUP move *a13(ATTIMG_IMG),a8,L move *a13(ATTIMG_CUR_FRAME),a0,L jrnz #onscr move a0,*a8(OXVAL),L movi [-100,0],a0 ;set all images offscreen move a0,*a8(OYVAL),L rets #onscr move *a13(ATTIMG_LAST_FRAME),a1,L cmp a0,a1 jreq #no_change ;image has just changed move *a13(ATTIMG_IMG),a8,L move a0,*a8(OIMG),L move *a0(0),*a8(OSIZE),L move *a0(ISAG),*a8(OSAG),L .if 1 move *a0(ICMAP),a0,L .ref pal_getf calla pal_getf ;;; calla pal_find jrnz #AOK LOCKUP ;can't get palette #AOK move a0,*a8(OPAL) .endif move *a8(OIMG),a0,L movb *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp move *a13(OBJ_CONTROL),a7 ;flip bits & pixel ops andi 0111111b,a7 setf 6,0,0 move a7,*a8(OCTRL) ;Write 6 low bits setf 16,1,0 move *a13(OBJ_CONST),*a8(OCONST) move *a13(ATTIMG_CUR_FRAME),*a13(ATTIMG_LAST_FRAME),L #no_change clr a1 move *a13(ATTACHIMG_XOFF),a0 move *a13(OBJ_CONTROL),a14 btst B_FLIPH,a14 jrz #no_flip movi M_FLIPH,a1 neg a0 #no_flip sll 16,a0 add a5,a0 move a0,*a8(OXVAL),L move *a8(OFLAGS),a0 andni M_FLIPH,a0 or a1,a0 move a0,*a8(OFLAGS) move *a13(ATTACHIMG_YOFF),a0 sll 16,a0 neg a0 add a6,a0 move a0,*a8(OYVAL),L move *a13(OBJ_PRIORITY),a0,L move *a13(ATTACHIMG_ZOFF),a1 sll 16,a1 add a1,a0 move a0,*a8(OZVAL),L move *a13(OBJ_YPOSINT),a11 ;y offset move *a8(OIMG),a0,L move *a0(IANIOFFY),a1 add a11,a1 ;add in Y pos & ani-offset move a1,*a8(ODYOFF) ;display y offset move *a0(IANIOFFX),*a8(ODXOFF) #skip ; dsj a4,#attloop rets #plot_object move *a3+,a8,L ;* object move a5,*a8(OXVAL),L move a6,*a8(OYVAL),L move *a13(OBJ_PRIORITY),*a8(OZVAL),L move a0,*a8(OIMG),L move *a0(0),*a8(OSIZE),L move *a0(ISAG),*a8(OSAG),L move *a0(IANIOFFX),a1 add a10,a1 ;add in X ani-offset (if any) move a1,*a8(ODXOFF) ;display x offset move *a0(IANIOFFY),a1 add a11,a1 ;add in Y pos & ani-offset move a1,*a8(ODYOFF) ;display y offset movb *a0(ICTRL+7),*a8(OCTRL+7) ;Write 5 z comp bits + bits pp setf 6,0,0 move a7,*a8(OCTRL) ;Write 6 low bits setf 16,1,0 move *a13(OBJ_CONST),*a8(OCONST) rets #***************************************************************************** shadows .ref shadow .long shadow ****************************************************************************** .end