Street fighter 89

In Progress Street Fighter 89 The Final Fight by Machok v2.1

No permission to download
The project is currently under development.
Guy new Attackboth Anim

I want otg attacks for enemies without changing the original gameplay (many enemies in the final fight are fast enough to get up)
after being hit by this attack I planned to make the enemy rise longer.

guy_ATKboth.jpg

Just a plan since this cody animation seems complicated to make


444_625-8.png

Also I don't want to keep drawing o_O not sure @NED is ready for the amount of extra animation for Maki
 
Guy new Attackboth Anim

I want otg attacks for enemies without changing the original gameplay (many enemies in the final fight are fast enough to get up)
after being hit by this attack I planned to make the enemy rise longer.

View attachment 5743

Just a plan since this cody animation seems complicated to make


View attachment 5744

Also I don't want to keep drawing o_O not sure @NED is ready for the amount of extra animation for Maki
Trust me I thought about it many times lately.
But I'm in a deadline rush to complete my comics it's a matter of week before I start the crowdfunding with my publisher.
I completed the cover. still fixing stuffs on older pages.
+ my real job is exhausting lately.


But I still have plans for her.

BTW you progressed so well with Guy conversion.
Spriting in classic style is definitely not the easier one and you did it pretty well!
I like where the project go!
 
I love the red color variation for Guy. It looks very new. Not only does it pay homage to Final Fight 3, but it also gives variety of colors for his character.
 
It means your work is very popular, keep up the work, man👍

just one video, other video view count just the same

Algorhitm and also it’s getting shared a lot.
Unlike my videos with 15 views 😂

a little marketing thumbnail I thought would help, I also have so many 15 views video though 😄
Trust me I thought about it many times lately.
But I'm in a deadline rush to complete my comics it's a matter of week before I start the crowdfunding with my publisher.
I completed the cover. still fixing stuffs on older pages.
+ my real job is exhausting lately.


But I still have plans for her.

BTW you progressed so well with Guy conversion.
Spriting in classic style is definitely not the easier one and you did it pretty well!
I like where the project go!

😘 do what matters most NED
I am going to work on Haggar after guy and cody demo released so it's plenty of time. When I'm on fire maybe I'll try to learn editing Maki a bit

I love the red color variation for Guy. It looks very new. Not only does it pay homage to Final Fight 3, but it also gives variety of colors for his character.

I think it's modified Ken cps1 colors 🙂 also thanks to final fight 30th anniversary edition
 
  • Like
Reactions: NED
@Kratus

1. Is it recommend to use attack box on enemy grab anim? will it cause an error?

2. I can see you using bbox on heroes grab anim, by default, will the enemy still be able to do a grabattack while the hero is doing the grab animation?

_adamgrab.jpg


3. What's your solution so that the enemy does more grab attacks than any regular attack? range?
 
Last edited:
@machok

1. Is it recommend to use attack box on enemy grab anim? will it cause an error?
Tested the attack box in the grab anim but didn't see any error, the grabbed player will be hit showing the pain animation but remains grabbed. What's the purpose of adding attack box in the enemies grab animation?
The only thing I don't recommend is adding bbox in scripted throw/slam moves in order to not be interrupted, same as many official games does by default.

2. I can see you using bbox on heroes grab anim, by default, will the enemy still be able to do a grabattack while the hero is doing the grab animation?
I don't know if I understand correctly, grabattack would be done by the character that is in the grab animation but in case he is grabbed by another character he can't do grabattacks.

3. What's your solution so that the enemy does more grab attacks than any regular attack? range?
Usually in my game the enemy grab attacks are performed automatically as soon as he grabs any player/npc, there's no range adjustment.
Below is my adjustment for Break's headbutt (grabattack).

C:
anim grabattack #HEADBUTT
    attackone 0
    fastattack 1
    jugglecost 4
    forcedirection -1
    otg 1
    loop    0
    delay    6
    offset    62 125
    bbox    59 55 21 73
    @cmd hitfx "data/sounds/sor3_hit4.wav"
    @cmd sound "data/sounds/sor3_attack.wav"
    frame    data/chars/heroes/axel/grabatk00.png
        delay    24
    bbox     55 56 27 72
    @cmd voice "data/voices/sor3_axel_attack.wav"
    frame    data/chars/heroes/axel/grabatk01.png
    attack8 74 61 25 27 8 1 0 0 10 12
    bbox    59 61 27 67
    frame    data/chars/heroes/axel/grabatk02.png
 
Usually in my game the enemy grab attacks are performed automatically as soon as he grabs any player/npc, there's no range adjustment.

Thank you your answer helped me understand more
I realized my mistake regarding enemy grabs was forcing the enemy to do grabs in their attack animation, I intended that they would do a lot of grabs but this caused problems

for example:

C:
anim    attack3
    loop    0
    offset    89 176
    bbox    70 87 40 89
    delay    10
    @cmd    attack1R -90 100 25 "ANI_GRAB" 10    <========= problem
    @cmd    attack1R -130 160 25 "ANI_FOLLOW8" 10
    frame    data/chars/andore/andore/wk6.gif


Here is the video so that what I mean is clearer
 
  • Wow
Reactions: NED
Thank you your answer helped me understand more
I realized my mistake regarding enemy grabs was forcing the enemy to do grabs in their attack animation, I intended that they would do a lot of grabs but this caused problems

for example:

C:
anim    attack3
    loop    0
    offset    89 176
    bbox    70 87 40 89
    delay    10
    @cmd    attack1R -90 100 25 "ANI_GRAB" 10    <========= problem
    @cmd    attack1R -130 160 25 "ANI_FOLLOW8" 10
    frame    data/chars/andore/andore/wk6.gif


Here is the video so that what I mean is clearer
Now I understand, in this case I suggest using the default engine grabdistance command instead of forcing the grab animation in an attack. The engine already has some routines that prevent weird situations like that.
 
grabdistance
Keep in mind that grabdistance is tied to many other things inside the engine code - for example, your bbox depth.
Whenever you have branch arrows you need to touch, changing this value will affect the distance you can touch those arrows (any item based on touch in fact)

If you still have my Avengers game, you can go to REPLAY (or the branch choose screen after the first stage) with some chars - you will see that some (like Hulk) can touch the arrows from a bigger distance than Wolverine (you basilcally need to jump with him to touch it)

I realized my mistake regarding enemy grabs was forcing the enemy to do grabs in their attack animation, I intended that they would do a lot of grabs but this caused problems
Btw, you need a code to unbind any stuck enemy from you, because they will get stuck in some situations, like:
- games without NODROPEN (if you are using a scritpted grab and another player join on the same time)
- you are killed by a time over
- you are killed by a pit death
etc.

I use a code on my characters as onfallscripy to prevent this. It probably won't work for you because I've changed how Bloodbane's script works (I am using an entityvar), but it goes like this:

onfallscript data/scripts/dead.c

C-like:
#import "data/scripts/dead_actual.c"


void main()
{
    actual_main();


}

void actual_main()
{
changeopenborvariant("nojoin", 0);
unbind();
}

---
Fowarder to dead_actual.c

----
C-like:
void unbindK()
{//Release binded entity by GRABSTART script if falling by time over
// By Kratus
    void self     = getlocalvar("self");
    void target = getentityvar(self, "grabbed");
    changeentityproperty(self,"subject_to_gravity",1);
  
    if(target != NULL()){ //USED WHEN PLAYER IS FALLING BY TIME OVER AND THE GRABBER IS THE PLAYER, NEED TO UNBIND THE ENEMY
        bindentity(target, NULL());
        damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL"));
        changeentityproperty(target,"subject_to_gravity",1);
        setentityvar(self, "grabbed", NULL());
    }
}

void unbind ()
// unbind entity
// 24.09.2013 - Douglas Baldan - O Ilusionista + Kratus
{
   void self = getlocalvar("self");
   void target = getentityvar(self,"grabbed");
   changeentityproperty(self,"subject_to_gravity",1);

    if(target != NULL()){ //USED WHEN PLAYER IS FALLING BY TIME OVER AND THE GRABBER IS THE PLAYER, NEED TO UNBIND THE ENEMY
        bindentity(target, NULL());
        damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL"));
        changeentityproperty(target,"subject_to_gravity",1);
        bindentity(self, NULL());
    setentityvar(self, "grabbed", NULL());
    clearlocalvar();
    }
}


}[/CODE]
 
Last edited:
Keep in mind that grabdistance is tied to many other things inside the engine code - for example, your bbox depth.
Whenever you have branch arrows you need to touch, changing this value will affect the distance you can touch those arrows (any item based on touch in fact)

If you still have my Avengers game, you can go to REPLAY (or the branch choose screen after the first stage) with some chars - you will see that some (like Hulk) can touch the arrows from a bigger distance than Wolverine (you basilcally need to jump with him to touch it)


Btw, you need a code to unbind any stuck enemy from you, because they will get stuck in some situations, like:
- games without NODROPEN (if you are using a scritpted grab and another player join on the same time)
- you are killed by a time over
- you are killed by a pit death
etc.

I use a code on my characters as onfallscripy to prevent this. It probably won't work for you because I've changed how Bloodbane's script works (I am using an entityvar), but it goes like this:

onfallscript data/scripts/dead.c

C-like:
#import "data/scripts/dead_actual.c"


void main()
{
    actual_main();


}

void actual_main()
{
changeopenborvariant("nojoin", 0);
unbind();
}

---
Fowarder to dead_actual.c

----
C-like:
void unbindK()
{//Release binded entity by GRABSTART script if falling by time over
// By Kratus
    void self     = getlocalvar("self");
    void target = getentityvar(self, "grabbed");
    changeentityproperty(self,"subject_to_gravity",1);
 
    if(target != NULL()){ //USED WHEN PLAYER IS FALLING BY TIME OVER AND THE GRABBER IS THE PLAYER, NEED TO UNBIND THE ENEMY
        bindentity(target, NULL());
        damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL"));
        changeentityproperty(target,"subject_to_gravity",1);
        setentityvar(self, "grabbed", NULL());
    }
}

void unbind ()
// unbind entity
// 24.09.2013 - Douglas Baldan - O Ilusionista + Kratus
{
   void self = getlocalvar("self");
   void target = getentityvar(self,"grabbed");
   changeentityproperty(self,"subject_to_gravity",1);

    if(target != NULL()){ //USED WHEN PLAYER IS FALLING BY TIME OVER AND THE GRABBER IS THE PLAYER, NEED TO UNBIND THE ENEMY
        bindentity(target, NULL());
        damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL"));
        changeentityproperty(target,"subject_to_gravity",1);
        bindentity(self, NULL());
    setentityvar(self, "grabbed", NULL());
    clearlocalvar();
    }
}


}[/CODE]
Ilu so what I need to do is just put your code to onfall script?

btw in my situation when character dies (running out of health or running out of time) the enemy will be released automatically or simply slams other enemy



1000+YTsubs.png

Thank you guys my Youtube channel has reached 1000+ subs yesterday (finally) 🤭 and 60% of external viewers are from chronocrash So I would like to thank all friends here for your support 🥰🥰😘😘
 
I would need to check your scriptslam because, as I commented above, my method is a bit different - it uses an entityvar Kratus teached me. So it won't work if you use it with the common scriptedslam codes.

I am using @Bloodbane slam script, common used. I remember adding @Kratus antiWallG in finish and throw

C:
anim    grabforward
    fastattack    1
    loop    0
    offset    119 176
    bbox    0 0 0 0
    hitfx    data/sounds/empty.wav
    sound    data/chars/cody/Cody_throw.wav
    attackone    0
    delay    33
    @cmd    slamstart
    @cmd    position 0 -8 22 0 -1
    frame    data/chars/cody/th1.gif
    delay    14
    hitfx    data/sounds/punch.wav
    @cmd    position 1 38 68 0 -1
    frame    data/chars/cody/th2.gif
    delay    6
    @cmd    depost 0
    @cmd    throw 25 3 -2.25 2 0 1
    @cmd    clearL
    frame    data/chars/cody/th2.gif

C:
void slamstart() // Slam Starter for Cody/Guy grabbackward
{ // 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_NORMAL4")); // Slam Starter
   }
}

C:
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);
     }
   }
}

C:
void finish(int Damage, int Type, int x, int y, int z, int Face)
{ // Damage as slam or throw finisher
   void self = getlocalvar("self");
   void target = getlocalvar("Target" + self);
   int SDir = getentityproperty(target,"direction");
   int MDir;

   if(Face==0){ // Same facing?
       MDir = SDir;
   }

   if(Face==1){ // Opposite facing?

     if(SDir==0){ // Facing left?
       MDir = 1;
     } else { MDir = 0;}
   }

   if(target==NULL())
   {
     target = getentityproperty(self, "grabbing");
     setlocalvar("Target" + self, target);
   }
   if(target!=NULL())
   {
     int dir = getentityproperty(target,"direction"); //Get opponent's facing direction
     if(dir==0){ // Facing left?
       x = -x;
     }

     if(Type==1)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL5")); // 1st Finisher
     }

     if(Type==2)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL9")); // 2nd Finisher
     }

     if(Type==3)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL19")); // 3rd Finisher
     }

     if(Type==4)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL29")); // 4th Finisher
     }

     if(Type==5)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL6")); // 5th Finisher
     }

     changeentityproperty(target, "direction", MDir);
        antiWallG();
     tossentity(target, y, x, z); // Toss opponent ;)
     setlocalvar("Target"+self, NULL()); //Clears variable
   }
}

C:
void throw(int Damage, int Type, int x, int y, int z, int Face)
{ // Damage as throw finisher
   void self = getlocalvar("self");
   void target = getlocalvar("Target" + self);
   int SDir = getentityproperty(target,"direction");
   int MDir;

   if(Face==0){ // Same facing?
       MDir = SDir;
   }

   if(Face==1){ // Opposite facing?

     if(SDir==0){ // Facing left?
       MDir = 1;
     } else { MDir = 0;}
   }

   if(target==NULL())
   {
     target = getentityproperty(self, "grabbing");
     setlocalvar("Target" + self, target);
   }
   if(target!=NULL())
   {
     int dir = getentityproperty(target,"direction"); //Get opponent's facing direction
     if(dir==0){ // Facing left?
       x = -x;
     }

     if(Type==1)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL5")); // 1st throw type
     }

     if(Type==2)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL15")); // 2nd throw type
     }

     if(Type==3)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL6")); // 3rd throw type
     }

     if(Type==4)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL21")); // 4th throw type
     }
  
     if(Type==5)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL")); // 5th throw type
     }
  
     if(Type==6)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL40")); // 6th throw type
     }

     if(Type==7)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL17")); // 7th Finisher
     }

     changeentityproperty(target, "attacking", 1);
     changeentityproperty(target, "damage_on_landing", Damage);
     changeentityproperty(target, "projectile", 1);
     changeentityproperty(target, "direction", MDir);
        antiWallG();
     tossentity(target, y, x, z); // Toss opponent ;)
     setlocalvar("Target"+self, NULL()); //Clears variable
   }
}
 
Last edited:
I am using @Bloodbane slam script, common used. I remember adding @Kratus antiWallG in finish and throw

C:
anim    grabforward
    fastattack    1
    loop    0
    offset    119 176
    bbox    0 0 0 0
    hitfx    data/sounds/empty.wav
    sound    data/chars/cody/Cody_throw.wav
    attackone    0
    delay    33
    @cmd    slamstart
    @cmd    position 0 -8 22 0 -1
    frame    data/chars/cody/th1.gif
    delay    14
    hitfx    data/sounds/punch.wav
    @cmd    position 1 38 68 0 -1
    frame    data/chars/cody/th2.gif
    delay    6
    @cmd    depost 0
    @cmd    throw 25 3 -2.25 2 0 1
    @cmd    clearL
    frame    data/chars/cody/th2.gif

C:
void slamstart() // Slam Starter for Cody/Guy grabbackward
{ // 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_NORMAL4")); // Slam Starter
   }
}

C:
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);
     }
   }
}

C:
void finish(int Damage, int Type, int x, int y, int z, int Face)
{ // Damage as slam or throw finisher
   void self = getlocalvar("self");
   void target = getlocalvar("Target" + self);
   int SDir = getentityproperty(target,"direction");
   int MDir;

   if(Face==0){ // Same facing?
       MDir = SDir;
   }

   if(Face==1){ // Opposite facing?

     if(SDir==0){ // Facing left?
       MDir = 1;
     } else { MDir = 0;}
   }

   if(target==NULL())
   {
     target = getentityproperty(self, "grabbing");
     setlocalvar("Target" + self, target);
   }
   if(target!=NULL())
   {
     int dir = getentityproperty(target,"direction"); //Get opponent's facing direction
     if(dir==0){ // Facing left?
       x = -x;
     }

     if(Type==1)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL5")); // 1st Finisher
     }

     if(Type==2)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL9")); // 2nd Finisher
     }

     if(Type==3)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL19")); // 3rd Finisher
     }

     if(Type==4)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL29")); // 4th Finisher
     }

     if(Type==5)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL6")); // 5th Finisher
     }

     changeentityproperty(target, "direction", MDir);
        antiWallG();
     tossentity(target, y, x, z); // Toss opponent ;)
     setlocalvar("Target"+self, NULL()); //Clears variable
   }
}

C:
void throw(int Damage, int Type, int x, int y, int z, int Face)
{ // Damage as throw finisher
   void self = getlocalvar("self");
   void target = getlocalvar("Target" + self);
   int SDir = getentityproperty(target,"direction");
   int MDir;

   if(Face==0){ // Same facing?
       MDir = SDir;
   }

   if(Face==1){ // Opposite facing?

     if(SDir==0){ // Facing left?
       MDir = 1;
     } else { MDir = 0;}
   }

   if(target==NULL())
   {
     target = getentityproperty(self, "grabbing");
     setlocalvar("Target" + self, target);
   }
   if(target!=NULL())
   {
     int dir = getentityproperty(target,"direction"); //Get opponent's facing direction
     if(dir==0){ // Facing left?
       x = -x;
     }

     if(Type==1)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL5")); // 1st throw type
     }

     if(Type==2)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL15")); // 2nd throw type
     }

     if(Type==3)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL6")); // 3rd throw type
     }

     if(Type==4)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL21")); // 4th throw type
     }
 
     if(Type==5)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL")); // 5th throw type
     }
 
     if(Type==6)
     {
       damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL40")); // 6th throw type
     }

     if(Type==7)
     {
       damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL17")); // 7th Finisher
     }

     changeentityproperty(target, "attacking", 1);
     changeentityproperty(target, "damage_on_landing", Damage);
     changeentityproperty(target, "projectile", 1);
     changeentityproperty(target, "direction", MDir);
        antiWallG();
     tossentity(target, y, x, z); // Toss opponent ;)
     setlocalvar("Target"+self, NULL()); //Clears variable
   }
}
@machok I posted an updated version of my grab scripts used in the SORX, you can get them in this post.
 
for who asking is it playable on Android device:

SF89_aka_FF89_Android.png

Honestly, I didn't try to test it myself I've never even played Openbor on Android 🤭
 
btw anyone have this version of Cody? need to see the ultra moves animation

Yes, basically this guy don't make "his" content public.
He seems to works with some kind of community with a "pay wall".
Making money mainly with the work of other creators without giving them access to the result of his "tweaks"
+ He basically ask to some spriters to make him animations to create his "dream game" then he can make money with this "pay wall"

Some of his edits are pretty good, but I really don't like the fact he acts like an oportunist.
 
Back
Top Bottom