Solved Animation Switch Issue

Question that is answered or resolved.
This is because you are only using the same animation of follow3 instead of the other. Look at the numbers of anim follows here, as well as the last parameter of counterrange.

anim block
counterrange 0 1 1 10
followanim 3
loop 0
delay 5
offset 31 99
bbox 39 7 2 81
frame data/chars/ryu/block1.gif
@cmd keyint "ANI_FOLLOW3" 0 "S" 0 200
offset 33 102
bbox 39 7 2 81
delay 5
frame data/chars/ryu/block2.gif

Look at counterrange here:
counterrange {start} {end} {condition} {damage}

  • Animation header. If all conditions are met, entity will perform animation set by followanim.
  • This command is to make entity performs FOLLOW{#} if the entity is hit in set frame.
  • frame determines at which frame if entity is hit , FOLLOW{#} would be played.
  • Which FOLLOW animation played is determined by 'followanim'.
  • {start} Start of frame range when counter may trigger.
  • {end} End of frame range when counter may trigger.
  • cond determines the condition requirements before FOLLOW{#} is played.
    • 1: The counter will always be used.
    • 2: The counter will be used as long as the attacker was an enemy (Or a player if an enemy uses it).
    • 3: The counter will be used as long as the attacker was an enemy, the attack was not unblockable, hits the user from the front, and was not a FREEZE attack.
    • 4: The counter will always be used and if health - attack damage <= your health will be 1 (rage).
  • damaged determines whether the entity will receive damage from the hit or not.
    • 0, the damage won't be taken
    • 1, the damage will be taken

Like Bloodbane said about counterrange, it's a counter attack which an entity gets hit and it performs with follow animation.

I just found out how you can do this and it's how BonusJZ did with his mod (though he didn't use counterrange). Try these:
Code:
anim block
    counterrange 0 2 1 0  #counterrange {start} {end} {condition} {damage}
    followanim 4 # Counter between these starting and ending frames for anim follow4 (same as anim freespecial2) to play if counterrange is used
    loop    0
    delay    5
    offset    31 99
    bbox    39 7 2 81
    frame      data/chars/ryu/block1.gif
    delay    15
    offset    33 102
    frame    data/chars/ryu/block2.gif
         delay    5
    @cmd keyint "ANI_FOLLOW3" 0 "S" 0 200 # HOLD SPECIAL button to change to FIRST frame of anim FOLLOW3
        frame    data/chars/ryu/block2.gif

Make these two animations look like it's a looping block animation. Pay attention to both counterrange and followanim for counter, as well as keyint for key holds as blocking.
Code:
anim follow3 #Still blocking

    counterrange 0 2 1 0 #counterrange {start} {end} {condition} {damage}
    followanim 6 #Dash back after counter
    loop    0
    delay    5
    offset    33 102
    bbox    39 7 2 81
    frame      data/chars/ryu/block2.gif
    frame      data/chars/ryu/block2.gif
         delay    5
    @cmd keyint "ANI_FOLLOW5" 0 "S" 0 200 # Switching to another animation but with same block frames as anim follow3
        frame    data/chars/ryu/block2.gif

anim follow5 #Still blocking 2  
    counterframe 0 2 1 0
    followanim 6
    loop    0
    delay    1
    offset    33 102
    bbox    39 7 2 81  
    frame      data/chars/ryu/block2.gif
    frame      data/chars/ryu/block2.gif
    @cmd keyint "ANI_FOLLOW3" 0 "S" 0 200 #Going back to anim follow3 and forth so it'll end up as a looping block animation
        frame    data/chars/ryu/block2.gif

This is when the enemy attacks you while you're still blocking. Every time they hit you, you dash back after counter. Look at the last frame of this animation. Do you want him to remain blocking after the ending of the animation?
Code:
anim follow6 #Dash back after counter

    loop    0
    delay    5
    offset    33 102
        frame    data/chars/ryu/block2.gif
        frame    data/chars/ryu/block2.gif
        frame    data/chars/ryu/block2.gif
        frame    data/chars/ryu/block2.gif
        frame    data/chars/ryu/block2.gif
    @cmd velo001 -1.6 0 0 # Move back more
        frame    data/chars/ryu/block2.gif
        frame    data/chars/ryu/block2.gif
    @cmd velo001 -1.2 0 0 # Move back a little more
        frame    data/chars/ryu/block2.gif
        frame    data/chars/ryu/block2.gif
    @cmd velo001 -0.8 0 0 # Move back a little bit
        frame    data/chars/ryu/block2.gif
        frame    data/chars/ryu/block2.gif
    @cmd velo001 -0.4 0 0 # Move back a little closer
        frame    data/chars/ryu/block2.gif
        frame    data/chars/ryu/block2.gif
    @cmd velo001 0 0 0 # Stop
        frame    data/chars/ryu/block2.gif
    @cmd keyint "ANI_FOLLOW3" 0 "S" 0 200 #Go back to anim follow3 if special button is held
        frame    data/chars/ryu/block2.gif

Finally, the counter from anim block :):
Code:
anim follow4 #Same frames as ANIM FREESPECIAL2
    @script
    void self = getlocalvar("self");
    changeentityproperty(self, "aiflag", "idling", 0);
    changeentityproperty(self, "aiflag", "walking", 0);
    changeentityproperty(self, "aiflag", "blocking", 0);
    changeentityproperty(self, "takeaction", "common_pain");
    @end_script  
    loop    0
    delay    5
    offset    24 87
    bbox    0 0 0 0
    fastattack 1
    followanim 2
    followcond 1
    move    5
    sound   data/sounds/ryuratk.wav
        frame    data/chars/ryu/frsp00.gif
offset    24 93
        frame    data/chars/ryu/frsp01.gif
offset    23 97
        frame    data/chars/ryu/frsp02.gif
offset    25 118
        attack  30 0 36 72 8
        frame    data/chars/ryu/frsp03.gif
offset    24 113
        attack  0 0 0 0 0
        frame    data/chars/ryu/frsp04.gif
offset    24 113
        frame    data/chars/ryu/frsp05.gif
offset    24 108
        frame    data/chars/ryu/frsp06.gif
offset    24 98
        frame    data/chars/ryu/frsp07.gif
offset    24 98
        frame    data/chars/ryu/frsp08.gif

EDIT: Did you know that you can loop animations with starting and ending frames? Like, loop {loop} {start} {end}.

loop {bi} {start} {end}

  • Determines how loop effect is applied in current animation
  • {bi} toggles looping on or off.
    • 0 = looping off
    • 1 = looping on
  • {start} determines the number of frame the animation loops to. Defaults to 0 or 1st frame.
  • {end} determines the number of frame which starts the loop. If left blank, the animation will loop at the end of animation.
  • Some animations should NOT be set to loop (loop temporary at least). Examples include most attacks and injured animations.
 
Last edited:
sorry for not replying yesterday..got the code from maxman and trying to make it work plus life lol...thanks maxman and bloodbane...ill be working on this in a bit :)
 
so far maxmans way blocks and sorta works?was only able to get 1 counter out lol..but when you hold the button it blocks as it should...
bloodbaes counters perfect, but you lose blocking ability as holding the button down does nothing...but as a counter alone works great..
so now i just dont know how to proceed lol...just gonna mess around with it and see...but day 4 and is starting to wear on me lol.
thank you for reals for helping me out :)
 
Update... @Bloodbane i got yours to work..is not a complete block but it works as intended...thank you for sharing am very grateful for this :)
@maxman thank you so much for the past 3 days lol..i feel like a noob all over again ugh...but you have dome so much for me in such a short time...am very grateful :)

i have much to learn and fix for ATOV to be more of what i wanted it to be back then, but didnt know enough.
thanks again all of you :)

EDIT: forgot how much of a pain in the ass my game was lol...this counter makes it much more enjoyable...or maybe am biased and excited to be back in the fold haha
 
Last edited:
Alex, I'm so sorry that I forgot to show you here to try thold 1 instead of holdblock 1. That's the one I missed pointing out and I'm using it (thold 1). That's what BonusJZ used for his NSX mod.

thold {int}

  • {int} is the threshold for an entity's blocking ability.
  • If the entity tries to block an attack with an attack power higher than {int}, they will not be able to do so and will get hit anyway.
  • If {int} is 0, an entity will have infinite threshold. In other words, they can block any attacks.
  • Regardless of threshold, if an attack is set to be unblockable, it can't be blocked.
 
Alex, I'm so sorry that I forgot to show you here to try thold 1 instead of holdblock 1. That's the one I missed pointing out and I'm using it (thold 1). That's what BonusJZ used for his NSX mod.
no worries my brother, it happens :)
 
but you lose blocking ability as holding the button down does nothing...but as a counter alone works great..

I'm aware of that. I've given you simpler version without extra features to make it easier to understand.
If you want the extra features, here it is:
Code:
anim    freespecial
    delay    8
    counterrange 1 1 1 0
    followanim 1
    offset    54 159
    bbox    35 55 34 106
    frame    data/chars/ken/block.gif
    delay    15
    frame    data/chars/ken/block.gif
    delay    5
    @cmd    block 1
    frame    data/chars/ken/block.gif
    @cmd    keyflip
    @cmd    keyint "ANI_FREESPECIAL" 2 "A2" 0 -1
    frame    data/chars/ken/block.gif
    delay    8
    @cmd    block 0
    frame    data/chars/ken/block.gif

This one allows longer blocking by holding Attack2 key and allow turning left/right while blocking.
 
so am fixing some characters and i came up on this issue with the on block counter scrip...if an enemy grabs you, just press block and youl escape it, but it looks weird and odd as hell lol... i tried using grabfinish , grabforce , antigrab but same result :/

advise? thanks
@Bloodbane
 
Did you try using 1 in {block} in attack{#}? It's unblockable.

attack{#} {x} {y} {right} {down} {damage} {power} {block} {noflash} {pausetime} {z}

attack{#} {x} {y} {right} {down} {damage} {power} {block} {noflash} {pausetime} {z}

There are two ways to set an attack box, since build 4183:
the old method, with multiple parameters on the same line (above) and the new method, where all the parameters were broken in several lines, which makes easier to read.

  • An attack box which can hit bboxes
  • OpenBoR supports 10 different attack boxes by default and {#} determines which one the frame is using. There's no space between 'attack' and {#} though.
  • You can only have one type of attack box per frame (that is, you can't have two attack boxes or an attack and an attack4 box in the same frame). You can 'fake' an extra box or two by adding in extra frames with different boxes and changing the delay accordingly, but this takes up more memory (for the extra frames) and doesn't work perfectly, so try to do so sparingly.
  • {x}, {y}, {right}, and {down} work exactly like in a bbox.
  • {damage} determines how much damage the attack does. Setting it to 0 also works. Great for making launchers, slams and paralyze attacks.
  • {power} is an integer value that determines how strong the knockdown effect of this attack. 0 means no knockdown, 1 means knockdown level 1, etc. This is used in conjunction with 'knockdowncount' (see above).
  • {block} is a binary value which determines if an attack is unblockable.
  • {noflash} is a binary value which controls whether the flash is displayed. 0 means flash, 1 means no flash.
  • {pausetime} is an integer which will cause the attacker and attackee to be paused for {pausetime} if the attack hits something.
  • {z} determines attackbox' width in z axis.
  • If you change or repeat an attack box's declaration later in the animation, you can create combos in same animation. However, a certain amount of time must pass before targets can be hit again (This can be avoided with 'fastattack'). Also, you must have at least one frame with a blank attack box (One set to 'attack 0') between the two frames or sets of frames which combo.
  • You can use negative numbers or numbers outside of the frame's edges.
  • Can be used multiple times in one animation to change hit areas mid-animation
  • When the attacking part of the animation is over, use 'attack 0'. Otherwise, the attack box will remain and can continue hitting people for the rest of the animation!
  • Each 'attack{#}' has respective PAIN, FALL and DEATH animation. For instance, if attacker hits opponent with attack2, the latter will play PAIN2 (if attack2 doesn't knock him/her down) or FALL2 (if attack2 knocks him/her down) or DEATH2 (if attack2 kills him/her).
The new method: Commands with multiple parameters are being broken down into single line items. This will make text files more readable and easier to debug. It will also help to "future proof" commands and avoid conflicts as we go forward.

  • attack.block.cost - See guardcost.
  • attack.block.penetrate - See attack{#} {block}.
  • attack.counter - See counterattack.
  • attack.damage.force - The attack's standard damage output.
  • attack.damage.land.force - damageonlanding {value}
  • attack.damage.land.mode - damageonlanding {type}
  • attack.damage.lethal.disable - This attack cannot finish off the target - only reduce it to 1 HP.
  • attack.damage.recursive.force - See DOT {force}.
  • attack.damage.recursive.index - See DOT {index}.
  • attack.damage.recursive.mode - See DOT {mode}.
  • attack.damage.recursive.rate - See DOT {rate}.
  • attack.damage.recursive.time - See DOT {time}.
  • attack.damage.steal - Damage done by this attack will be added to attackers HP.
  • attack.damage.type - Sets attack type. Same as {#} in attack{#}
  • attack.effect.block.flash.model - See blockflash.
  • attack.effect.block.sound.path - Path to sound that will play when this attack is blocked.
  • attack.effect.hit.flash.disable - See noflash.
  • attack.effect.hit.flash.model - See hitflash.
  • attack.effect.hit.flash.sound - See hitfx.
  • attack.index - Currently no effect. This is for future support of multiple attack boxes.
  • attack.ground.mode - See otg.
  • attack.map.index - See forcemap {map}.
  • attack.map.time - See forcemap {time}.
  • attack.position.x - See attack{#} {x}.
  • attack.position.y - See attack{#} {y}.
  • attack.reaction.fall.force - See attack{#} {power}.
  • attack.reaction.fall.velocity.x - See dropv {speedx}.
  • attack.reaction.fall.velocity.y - See dropv {speedy}.
  • attack.reaction.fall.velocity.z - See dropv {speedz}.
  • attack.reaction.freeze.mode - Freeze target (requires freezetime). Set forcemap = -1 to apply target's fmap.
  • attack.reaction.freeze.time - Time target remains frozen.
  • attack.reaction.invincible.time - Time to remain invincible after hit.
  • attack.reaction.reposition.direction - See forcedirection.
  • attack.reaction.reposition.distance - See grabin {distance}.
  • attack.reaction.reposition.mode - See grabin {mode}.
  • attack.reaction.pain.disable - See noreflect.
  • attack.reaction.pause.time - See attack{#} {pausetime}.
  • attack.seal.cost - See seal {energy}.
  • attack.seal.time- See seal {time}.
  • attack.size.x - See attack{#} {width}.
  • attack.size.y - See attack{#} {height}.
  • attack.size.z.1 - See attack{#} {z}.
  • attack.size.z.2 - Depth of bbox toward player. When this is defined, z.1 becomes depth into screen.
  • attack.staydown.rise.time - See staydown {rise}.
  • attack.staydown.attack.time - See staydown {riseattack}.
  • attack.tag - Neutral integer value not utilized by engine in any way. Use this to add your own custom tags or flags to an attack box for scripting. Protip: OpenBOR script supports bitwise logic - you can store a LOT of information in a single integer if you are careful and plan ahead.

attack11,attack12,...

  • These attacks are only usable if you have increased attacktype limit. To increase the limit use 'maxattacktypes' (see details above in Models.txt section).
  • After they are available, they work just like other attacks. That also means respective PAIN,FALL and DEATH animations are also available.

Code:
attack        60 12 64 41 6 0 1 0 0 0
 
Did you try using 1 in {block} in attack{#}? It's unblockable.





Code:
attack        60 12 64 41 6 0 1 0 0 0
sadly no effect...same thing happens
btw that grab attack hits like 4 times like in the vid below...probably why that doesnt work
 
Last edited:
Hmm.... you're using special key to access BLOCK animation, that's why it's possible to break free from grab by pressing that key.

To solve this, try adding this script in Alex's GRAB animation:
C:
anim    grab
@script
  if(frame==0){
    void self = getlocalvar("self");
    void target = getentityproperty(self, "opponent");

    if(target){
      changeentityproperty(target, "seal",-10);
    }
  }
@end_script
...
 
Hmm.... you're using special key to access BLOCK animation, that's why it's possible to break free from grab by pressing that key.

To solve this, try adding this script in Alex's GRAB animation:
C:
anim    grab
@script
  if(frame==0){
    void self = getlocalvar("self");
    void target = getentityproperty(self, "opponent");

    if(target){
      changeentityproperty(target, "seal",-10);
    }
  }
@end_script
...
thanks that did fix it YAY!!!
appreciated brother :)
 
Back
Top Bottom