William999
Active member
It means your work is very popular, keep up the work, manmy old video got so many views just in a week from 45K to 125Knot sure what happened
View attachment 5737

It means your work is very popular, keep up the work, manmy old video got so many views just in a week from 45K to 125Knot sure what happened
View attachment 5737
Algorhitm and also it’s getting shared a lot.my old video got so many views just in a week from 45K to 125Knot sure what happened
View attachment 5737
Trust me I thought about it many times lately.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 drawingnot sure @NED is ready for the amount of extra animation for Maki
It means your work is very popular, keep up the work, man![]()
Algorhitm and also it’s getting shared a lot.
Unlike my videos with 15 views![]()
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.
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?1. Is it recommend to use attack box on enemy grab anim? will it cause an error?
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.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?
Usually in my game the enemy grab attacks are performed automatically as soon as he grabs any player/npc, there's no range adjustment.3. What's your solution so that the enemy does more grab attacks than any regular attack? range?
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.
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
Now I understand, in this case I suggest using the default engineThank 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
grabdistance
command instead of forcing the grab animation in an attack. The engine already has some routines that prevent weird situations like that.Keep in mind that grabdistance is tied to many other things inside the engine code - for example, your bbox depth.grabdistance
Btw, you need a code to unbind any stuck enemy from you, because they will get stuck in some situations, like: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
#import "data/scripts/dead_actual.c"
void main()
{
actual_main();
}
void actual_main()
{
changeopenborvariant("nojoin", 0);
unbind();
}
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();
}
}
Ilu so what I need to do is just put your code to onfall script?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]
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.Ilu so what I need to do is just put your code to onfall script?
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.
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
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
}
}
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 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
}
}
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.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 } }
The guy haven't released his stuff in public.btw anyone have this version of Cody? need to see the ultra moves animation
The guy haven't released his stuff in public.
But I know him and I can try asking the sprites.
Yes, basically this guy don't make "his" content public.btw anyone have this version of Cody? need to see the ultra moves animation