On the ground (hit fallen enemies)

tightninja

Member
Is it possible to right a script that will give a bbox to fallen enemies? I want to mount fallen enemies and utilize ground attacks, but would hate to have to put a bbox on every fall animation in the game.
 
as far as I know, you can't gerenrate bbox by script. So the better idea would be adding bbox on the fall animations.
in my case, I use two: one is the normal fall animation and the second one is the one I check with my OTG attack with script, so it triggers only if the target is on that specific animation, avoiding abuse.
 
Is it possible to right a script that will give a bbox to fallen enemies? I want to mount fallen enemies and utilize ground attacks, but would hate to have to put a bbox on every fall animation in the game.

That's just part of the tedium that comes with game creation - get used to it. CMT helps a lot.

FTR, it's technically possible to create collisions via script - but not smart at all except in extremely rare cases, and this isn't one of those. That sort of scripting also requires very advanced capability - which you don't have yet or you would have already known the answer by proxy. Plus it would take a lot more time than using native boxes anyway.

Follow @O Ilusionista's advice.

DC
 
Is it possible to right a script that will give a bbox to fallen enemies? I want to mount fallen enemies and utilize ground attacks, but would hate to have to put a bbox on every fall animation in the game.

You don't need to declare bbox on fallen enemies for mounting. What you need is script to detect if there is a valid fallen enemy nearby and perform mounting if one is found. Valid condition is pretty complex cause it involves range, enemy health, facing direction just to name a few.
Then you need to code mounting state with attack option and mount timer. It's basically coding custom grabbing system except it's for fallen enemies.

TLDR, it's complex but doable ;)
 
You don't need to declare bbox on fallen enemies for mounting. What you need is script to detect if there is a valid fallen enemy nearby and perform mounting if one is found. Valid condition is pretty complex cause it involves range, enemy health, facing direction just to name a few.
Then you need to code mounting state with attack option and mount timer. It's basically coding custom grabbing system except it's for fallen enemies.

TLDR, it's complex but doable ;)

Oh! I missed the part about mounting. I thought you meant just attacking a downed enemy @tightninja. Mounting is a whole other kettle of fish. It doesn't need a bbox as @Bloodbane said, but DOES need script. It's not all that hard. Essentially it's just like coding a standing slam.

DC
 
yep, you won't need bbox for that, but it will be a bit harder to limit how many times you can use the same move over and over (unless you don't care about it)

See this example: this is how I let Black be able to execute the OTG move after a normal knockdown, but you can't use it again after using it (unless you hit the enemy with a different move)
 
ilusion do you mind sharing your mount script? I have been creating grab moves by using them as really close attacks. The code below is how I made my stone cold stunner i t works well but the enemy is not grabbed.


I am having trouble with slamstart, I dont understand the @cmd position ,toss etc. is there specific documention somewhere for these functions? and what the numbers correspond too?


@cmd position 36 25 5 -0.1 0

@cmd finish 36 25 5 -0.1 0
@cmd depost 0
@cmd finish 15 1 -1 1 0 0




########------STONE COLD STUNNER KICK



anim freespecial178

loop 0

delay 3

offset 80 129

bbox.position.x 68

bbox.position.y 83

bbox.size.x 24

bbox.size.y 44

fastattack 1



cancel 7 8 0 s freespecial177

sound data/sounds/grab.wav



frame data/chars/1billy/g101.gif

frame data/chars/1billy/g101.gif

delay 4

frame data/chars/1billy/g201.gif

frame data/chars/1billy/g201.gif





grabin 1 35

delay 25

attack.block.penetrate 1

attack.damage.force 15

attack.damage.type 11

attack.effect.hit.flash.disable 0

attack.effect.hit.sound.path data/sounds/whip06.wav

attack.position.x 93

attack.position.y 88

attack.reaction.fall.force 0

attack.reaction.fall.velocity.x 3.5

attack.reaction.fall.velocity.y 0.5

attack.reaction.fall.velocity.z 0.0

attack.reaction.pause.time 15

attack.size.x 77

attack.size.y 15

attack.size.z.background 5

forcedirection -1

jugglecost 2

frame data/chars/1billy/g201.gif



attack 0 0 0 0

delay 10

frame data/chars/1billy/g201.gif





sound data/sounds/grab.wav

delay 10

attack.block.penetrate 1

attack.damage.force 15

attack.damage.type 11

attack.effect.hit.flash.disable 0

attack.effect.hit.sound.path data/sounds/whip06.wav

attack.position.x 93

attack.position.y 88

attack.reaction.fall.force 0

attack.reaction.fall.velocity.x 3.5

attack.reaction.fall.velocity.y 0.5

attack.reaction.fall.velocity.z 0.0

attack.reaction.pause.time 15

attack.size.x 77

attack.size.y 15

attack.size.z.background 5

forcedirection -1

jugglecost 2

frame data/chars/1billy/grab01.gif



attack 0 0 0 0

delay 10

frame data/chars/1billy/grab01.gif



delay 6

frame data/chars/1billy/grab02.gif











########------STONE COLD STUNNER



anim freespecial177

loop 0

delay 6

offset 80 129

energycost 15

mponly 1



frame data/chars/1billy/fin02.gif





flipframe 0

move -15

delay 8

frame data/chars/1billy/rise02.gif



move 0

sound data/sounds/stunner.wav

frame data/chars/1billy/stunner01.gif



delay 15

frame data/chars/1billy/stunner02.gif



attack.block.penetrate 0

attack.damage.force 15

attack.damage.type 9

attack.effect.hit.flash.disable 0

attack.position.x 63

attack.position.y 89

attack.reaction.fall.force 1

attack.reaction.fall.velocity.x 0.5

attack.reaction.fall.velocity.y 1.0

attack.reaction.fall.velocity.z 0.0

attack.reaction.pause.time 20

attack.size.x 21

attack.size.y 29

attack.size.z.background 2

forcedirection 1

jugglecost 5









delay 10

frame data/chars/1billy/stunner03.gif







delay 15

frame data/chars/1billy/pile04.gif





attack9 0 0 0 0



delay 10

frame data/chars/1billy/rise01.gif



delay 10

frame data/chars/1billy/rise02.gif
 
It's always better to tag the person, just put @ and start typing the user name :)

You can download it here - it's on Wolverine In Progress - Avengers United Battle Force

Keep in mind I made this eaons ago, probably there is a better solution today, but here we go:

Open it and you will see that Wolverine has an extra freespecial:
com D A freespecial30 #down attack
1760445906624.png
It's basically the first attack duplicated, with and extra scripts - I remember I got it from Maggas's World Heroes and it was made by @DCurrent

This is the script:
@cmd ani0020 openborconstant("ANI_FOLLOW15") openborconstant("ANI_FOLLOW15")

It will force your entity to use the first animation if the target is on the second animation. Here I used the same name, so I can track what each follow is

C-like:
int ani0020(int iAni, int iTAni){
  
    /*
    ani0020
    Damon Vaughn Caskey
    Perform alternate animation if target is within range and in specified animation.

    iAni:    Alternate attack.
    iTAni:    Target animation.
    */

    void vSelf      = getlocalvar("self");                    //Caller.                                                       
    void vOpp       = findtarget(vSelf, iAni);                //Nearest target in range of alternate attack.
  
    if (vOpp)                                                //Found a target?
    {
        if(getentityproperty(vOpp, "animationID") == iTAni)    //Animation match?
        {
            ani0009(vSelf, iAni, 0);                        //Perform alternate attack.
            return 1;                                        //Return 1.
        }
    }

    return 0;                                                //Return 0.
}
int ani0009(void vTarget, int iAni, int iType)
{
    //Set animation and return 1 if valid.

    if (!vTarget) vTarget = getlocalvar("self");

    if (getentityproperty(vTarget, "animvalid", iAni))          //Animation valid?
    {
        if (iType == -1)                                        //Type -1?
        {
            changeentityproperty(vTarget, "animation", iAni);   //Set animation with entity property.
        }
        else
        {
            performattack(vTarget, iAni, iType);                //Set animation with perform attack command.
        }
        return 1;                                               //Return 1.      
    }
    return 0;
}

This code doesn't execute the bind, just the attack. (FOLLOW15)

This is the attack. It has some things to note:
- It needs a range
- needs to be set to OTG 2 (so it hurts only down enemies)
- forcefirection -1, to make the target to face the attacker
- proper followcond and followanim
(extras)
- attackone 1 (if you want the attack to hit just one target)
- a target() and dash() functions, to make him to always jump on the enemy spot
1760446386022.png

Once it connects, them the ground pound starts (FOLLOW16).
Its a bit different on that version of Wolverine because I changed it on current version, the but the code is here:

1760446788625.png

To understand what each numer means, you need to see the function script.
note: I am using slamstart2() not slamstart(), because the second works only with grabbed enemies (for example, you use it on grabforward as you are grabbing an enemy) and we aren't grabbing anything yet, instead we have a target.

You can donwload both funcions from Bloodbane Crime Buster game - mine are a bit modified and will work only if you use my version for all the scripts

slamstart() takes an argument (the knockdown power, it needs to be higher than the opponent knockdownpower), but slamstart2() doesn't.

The you will see position(), which works like this - the names are pretty much self explanatory:
void position(int Frame, float dx, float dy, float dz, int face)
{ // Modify grabbed entity's position relative to grabber
// face 0 - same facing
// face 1 - turn around
void self = getlocalvar("self");
void target = getlocalvar("Target" + self);

if(target==NULL())
{
target = getentityproperty(self, "grabbing");
setlocalvar("Target" + self, target);
}
if(target!=NULL())
{
updateframe(target, Frame);
bindentity(target, self, dx, dz, dy, face, 0);
}
}

@cmd position 0 30 0 -1 0
Frame number (starting from 0), x y and z positions and facing
My method use 2 custom animations for all the throws on the game, as this speeds up the process A LOT and using CMT will help you a lot too:
Once you made all the animtion, its time to let the target to go.
Here is were depost() script goes in, but there is a catch

C-like:
void depost(int Gr)
{// Release grabbed entity
   void self = getlocalvar("self");
   void target = getlocalvar("Target" + self);

   if(target==NULL())
   {
     target = getentityproperty(self, "grabbing");
     setlocalvar("Target" + self, target);
   }
   if(target!=NULL())
   {
     bindentity(target, NULL());

     if(Gr == 1)
     {
       int x = getentityproperty(target, "x");
       int z = getentityproperty(target, "z");
       changeentityproperty(target, "position", x, z, 0);
     }
   }
}
This script will automatically unbind the target, leaving it on the last position you place it. But during the bind, you can put the target in any location, even inside a wall, a platform or a hole. But as soon as you unbind it, the engine routine for all those things will kick in - so if your target is inside a wall/platform it will be moved on top of it if the wall/platform is smaller than a certain value (I can't remember right now), but if the wall/platform is too high (say 3000), the target will be destroyed instantly

And I really mean destroyed: it won't trigger anything - score points, death animation or even ondeathscripts() - it is just obliterated.

so, using @cmd depost 0 just leave the target where it was, while depost 1 will leave it on the same spot the attacker is, a safe spot
(I confess I never read the function until now and I always placed the enemy manually).

I remember @Kratus has a different version wher you don't need to care about it anymore, as the code shift the target position to a safe spot, might worth checking.

Warning: its not because you had unbided it that its done - the attacker still knows who the last target was and any other scripted slam will affect it, being it near to you or not.
And it will even try to work with invalid targets (although my version has a check for that), which can lead you to null point crash.

This is where two extra functions will kick in: throw() or finish() and clearL().

Keep in mind that working with a script gives you absolute control over several things
, and that's not an exaggeration—when you use a script, the engine will only do what you tell it to do, nothing more.

For example: when you use the THROW animation, the engine takes care of everything for you—which direction the enemy goes, how fast it goes, whether there are walls/platforms/holes, etc.

When you do this via script, the engine will do exactly what you told it to. Did the enemy stay inside a wall? You didn't ask it to position it outside the wall. Did the enemy stay stuck forever? You didn't ask it to unstick it, etc.

both my THROW and FINISH scripts were customized so I can't paste it here unless you use all the version like me, but it works like this:

void throw(int Damage, int Type, int x, int y, int z, int Face)
void finish(int Damage, int Type, int x, int y, int z, int Face)

@cmd throw 35 2 6 1 0 0
@cmd finish 35 2 6 1 0 0

Both takes the same arguments, but works on different ways:
- THROW is for when, as the name suggests, you want to finish the attack by knocking the target away. The damage is only applied when the enemy touches the ground, so if you or someone else hits the enemy in the air after being thrown, the damage is canceled.
latest

FINISH is for when you want the damage to be applied instantly, like Zangief's Piledriver.
In most cases, I put DEPOST and THROW/FINISH on the same frame.

Now you need to tell the engine that the old target is no longer needed, and this is where you use the "clearL" function. It doesn't require any arguments.

But I have a few tips for using it:
- Don't use it alongside any other script in the frame, especially if you place it above other scripts, as this function clears all local variables (hence the name, clear Local).
- Don't place bbox in the same frame as you use this function, as if your character is hit at the exact moment, the target will remain valid forever.
- If you're performing an attack where the player jumps and throws the enemy into the air, it's safer to use depost and throw/finish twice—once in the air and once when you touch the ground.

This is necessary because you can use this move while jumping toward a platform, and if you touch the platform, your character will execute the landframe, but your code wasn't in that frame, which will leave the target stuck forever.

1760450132045.png
 
Last edited:
I almost have my mount and "ground and pound" attack this working except the player still "remembers" the last target. The enemy warps to where the player is. I have depost and clearL but enemy still warps




@cmd slamstart2

@cmd position 12 0 0 0 0

frame data/chars/1billy/ffc12.gif



delay 12

sound data/sounds/beat1.wav

@cmd position 11 0 0 0 0

@cmd hurt2 3

frame data/chars/1billy/ult29.gif

delay 4

frame data/chars/1billy/ffc12.gif



delay 12

sound data/sounds/beat1.wav

@cmd position 11 0 0 0 0

@cmd hurt2 3

frame data/chars/1billy/ddemon.gif



delay 10

@cmd position 12 0 0 0 0

frame data/chars/1billy/ffc12.gif



delay 12

sound data/sounds/beat1.wav

@cmd position 11 0 0 0 1

@cmd hurt2 3

frame data/chars/1billy/ult29.gif

delay 4

frame data/chars/1billy/ffc12.gif



delay 12

sound data/sounds/beat1.wav

@cmd position 11 0 0 0 0

@cmd hurt2 3

frame data/chars/1billy/ddemon.gif



@cmd position 12 0 0 0 0

frame data/chars/1billy/ffc12.gif



delay 5

@cmd depost 0

@cmd finish 12 1 0 0 0 1

frame data/chars/1billy/ffc12.gif


@cmd clearL

frame data/chars/1billy/dodge.gif
 
clearL is old function to clear all local variables. If your slam functions use local variables, the former should work. But if they use other variables, the former won't work.
TLDR, we need to see your slam functions. Copy and paste them in your reply.
 
void slamstart()

{ // Slam Starter

// Use finish after using this

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "grabbing");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL80")); // Slam Starter

}

}



void slamstart2()

{ // Slam Starter for nongrab slams

// Use finish or throw after using this

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "opponent");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL80")); // Slam Starter

}

}



void position(int Frame, float dx, float dy, float dz, int face)

{ // Modify grabbed entity's position relative to grabber

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "grabbing");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

updateframe(target, Frame);

bindentity(target, self, dx, dz, dy, face, 0);

}

}



void depost(int Gr)

{// Release grabbed entity

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "grabbing");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

bindentity(target, NULL());



if(Gr == 1)

{

int x = getentityproperty(target, "x");

int z = getentityproperty(target, "z");

changeentityproperty(target, "position", x, z, 0);

}

}

}



void hurt2(int Damage)

{ // Damage without altering opponent's animation + less damage if opponent has less health

// Mainly used for slams

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "grabbing");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

int THealth = getentityproperty(target,"health"); //Get target's health

int TAniPos = getentityproperty(target,"animpos"); //Get target's animation frame

if(THealth > Damage)

{

damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL80")); // Damage target with desired damage

updateframe(target, TAniPos);

} else {

int Damage2 = THealth - 1;

damageentity(target, self, Damage2, 1, openborconstant("ATK_NORMAL80")); //Damage target with less damage

updateframe(target, TAniPos);

}

}

}
 
void slamstart()

{ // Slam Starter

// Use finish after using this

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "grabbing");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL80")); // Slam Starter

}

}



void slamstart2()

{ // Slam Starter for nongrab slams

// Use finish or throw after using this

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "opponent");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL80")); // Slam Starter

}

}



void position(int Frame, float dx, float dy, float dz, int face)

{ // Modify grabbed entity's position relative to grabber

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "grabbing");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

updateframe(target, Frame);

bindentity(target, self, dx, dz, dy, face, 0);

}

}



void depost(int Gr)

{// Release grabbed entity

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "grabbing");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

bindentity(target, NULL());



if(Gr == 1)

{

int x = getentityproperty(target, "x");

int z = getentityproperty(target, "z");

changeentityproperty(target, "position", x, z, 0);

}

}

}



void hurt2(int Damage)

{ // Damage without altering opponent's animation + less damage if opponent has less health

// Mainly used for slams

void self = getlocalvar("self");

void target = getlocalvar("Target" + self);



if(target==NULL())

{

target = getentityproperty(self, "grabbing");

setlocalvar("Target" + self, target);

}

if(target!=NULL())

{

int THealth = getentityproperty(target,"health"); //Get target's health

int TAniPos = getentityproperty(target,"animpos"); //Get target's animation frame

if(THealth > Damage)

{

damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL80")); // Damage target with desired damage

updateframe(target, TAniPos);

} else {

int Damage2 = THealth - 1;

damageentity(target, self, Damage2, 1, openborconstant("ATK_NORMAL80")); //Damage target with less damage

updateframe(target, TAniPos);

}

}

}

@tightninja,

Please do not dump code directly into posts. It's nearly impossible to read and diagnose. We have code tags for this. See here:


DC
 
C:
void slamstart()
{ // Slam Starter
// Use finish after using this
void self = getlocalvar("self");
void target = getlocalvar("Target" + self);

if(target==NULL())
{
target = getentityproperty(self, "grabbing");
setlocalvar("Target" + self, target);
}
if(target!=NULL())
{
damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL80")); // Slam Starter
}
}

void slamstart2()
{ // Slam Starter for nongrab slams
// Use finish or throw after using this
void self = getlocalvar("self");
void target = getlocalvar("Target" + self);

if(target==NULL())
{
target = getentityproperty(self, "opponent");
setlocalvar("Target" + self, target);
}
if(target!=NULL())
{
damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL80")); // Slam Starter
}
}

void position(int Frame, float dx, float dy, float dz, int face)
{ // Modify grabbed entity's position relative to grabber
void self = getlocalvar("self");
void target = getlocalvar("Target" + self);

if(target==NULL())
{
target = getentityproperty(self, "grabbing");
setlocalvar("Target" + self, target);
}
if(target!=NULL())
{
updateframe(target, Frame);
bindentity(target, self, dx, dz, dy, face, 0);
}
}

void depost(int Gr)
{// Release grabbed entity
void self = getlocalvar("self");
void target = getlocalvar("Target" + self);

if(target==NULL())
{
target = getentityproperty(self, "grabbing");
setlocalvar("Target" + self, target);
}
if(target!=NULL())
{
bindentity(target, NULL());

if(Gr == 1)
{
int x = getentityproperty(target, "x");
int z = getentityproperty(target, "z");
changeentityproperty(target, "position", x, z, 0);
}
}
}
 
Thanks for sharing your scripts. Looks like you're using old version of these scripts. clearL should be working for them.

I had other thought of the cause of this glitch. This starting frame could be the cause:
Code:
@cmd slamstart2
@cmd position 12 0 0 0 0
frame data/chars/1billy/ffc12.gif

slamstart2 function attempted to acquire an opponent to be grabbed or mounted if you will. However, there's no physical contact between Billy and opponent to do so. This causes that function to acquire last opponent instead of the current one which is being mounted.

That's my thought. Unless, there is another animation played before this one.
 
Attached is a video of the behavior in game.

Below video is latest code (ignore crazy fall aniamtion lol)

I don't know if the MOUNTanimation being a cancel from DUCK animation would affect it. However, I added a com command for the MOUNT animation and it still "warps" the player. Perhaps I need the updated slamstart commands.







C:
#####-----DUCK

anim freespecial200
loop 1 1 2
delay 8
offset 80 129

bbox.position.x 68
bbox.position.y 124
bbox.size.x 26
bbox.size.y 6

energycost -5 # Charges 5 MP per cycle
mponly 1

cancel     0 3 0 a4     freespecial179 #BREAKIN!
cancel     0 3 0 a        freespecial198 #Hyper Upper 198 from super
cancel     0 3 0 a2     freespecial199 #Hyper Knee 199 from super
cancel 0 3 0 s           freespecial197 #BLOCK 2
cancel 0 3 0 u           freespecial196 #STANDING IDLE
cancel 0 3 0 a3         freespecial170 #MOUNT

cancel 0 3 0 j         freespecial36 #FORWARD LEAP
cancel 0 2 0 u u     freespecial190 #UP DODGE
cancel 0 2 0 d d     freespecial189 #DOWN DODGE
cancel 0 2 0 f f         freespecial100 #FWD DODGE
cancel 0 2 0 b b     freespecial99 #BACK DODGE

cancel 0 2 0 d f d f a       freespecial59 #CVS ISM SUPER ART I
cancel 0 2 0 d f d f a2     freespecial58 #CVS ISM SUPER ART II
cancel 0 2 0 d f d f a4     freespecial86 #ULTRA – MUSICAL

frame data/chars/1billy/fin02.gif
frame data/chars/1billy/dodge.gif
frame data/chars/1billy/dodge.gif









#####-----MOUNT
com d a4 freespecial170

anim freespecial170
loop 0
delay 5
offset 80 129

bbox.position.x 77
bbox.position.y 83
bbox.size.x 24
bbox.size.y 44

energycost 5
mponly 1

cancel 0 1 0 j             freespecial36 #FORWARD LEAP
cancel 0 1 0 b a         freespecial193 #BACK ELBOW
cancel 0 1 0 b a2         freespecial194 #BACK DOUBLE KICKS
cancel 0 1 0 a             freespecial171 #GROUND AND POUNDD
cancel 0 3 0 a2           freespecial172 #STOMP EM IN THE NUTS
cancel 0 3 0 a4           freespecial173 #BILLY KNEE DROP

cancel 0 1 0 f f             freespecial100 #FWD DODGE
cancel 0 1 0 b b         freespecial99 #BACK DODGE
cancel 0 1 0 u u         freespecial190 #UP DODGE
cancel 0 1 0 d d         freespecial189 #DOWN DODGE

@cmd slamstart2
frame data/chars/1billy/ffc12.gif

delay 200
sound data/sounds/grab.wav
@cmd position 12 0 0 0 0
frame data/chars/1billy/ffc12.gif

delay 5
@cmd depost 0
@cmd finish 0 0 0 0 0 0
frame data/chars/1billy/ffc12.gif

delay 5
@cmd clearL
frame data/chars/1billy/fin02.gif
 
I don't know if the MOUNTanimation being a cancel from DUCK animation would affect it. However, I added a com command for the MOUNT animation and it still "warps" the player

That video is a proof of what I've thought above.
Nothing in DUCK nor FREESPECIAL170 animation which initiates interaction with enemy. This interaction is essential to confirm which enemy to mount or no mounting at all.
You should study Ilu's example above. Wolverine performs mounting attack AFTER his first attack connects.

Perhaps I need the updated slamstart commands

Not quite. What you need is to declare something for the interaction. You can use script or attackbox for this purpose. Each has its own followup and pros and cons.
 
Back
Top Bottom