I just have the grab and get sorted so out but wat is to follow...Usually player grabs an enemy first before the former could throw the latter.
Enemies OTOH only need to have player within their grab distance before throwing player, for enemies which can throw that is.
You got some nice throws in 89 with Guy's air grab.You need to use @slamstart or @grabstart to get proper throw
many modules use it, for start check their anim grabforward
for air grab you'll need another script. @Kratus help me with this one, check guy keyscript lompat.cYou got some nice throws in 89 with Guy's air grab.
I want to cancel the tatsu into a power bomb with Ken.
followanim and followcond as attack followup. Take a look at Zangief's Spinning Piledriver for example.anim freespecial12 #L Grab to Spinning Piledriver
offset 337 291
delay 6
followanim 26 #Switch to Spinning Piledriver animation
followcond 2
fastattack 1
hitfx data/sounds/empty.wav
attack1 300 175 99 41 0 0 1 1 0 0
#attack{#} {x} {y} {right} {down} {damage} {power} {block} {noflash} {pausetime} {z}
frame data/CHARS/Zangief/CVS2_Zangief_114.png
attack 0
frame data/CHARS/Zangief/CVS2_Zangief_115.png
frame data/CHARS/Zangief/CVS2_Zangief_118.png
frame data/CHARS/Zangief/CVS2_Zangief_119.png
frame data/CHARS/Zangief/CVS2_Zangief_120.png
anim follow26 #Spinning Piledriver L
offset 337 291
delay 6
loop 1 6 10
jumpframe 5 4 0 0
landframe 10
@cmd slamstart2
@cmd position 15 60 15 0 -1
@cmd camFocus 1
frame data/CHARS/Zangief/CVS2_Zangief_116.png # 0
delay 14
@cmd position 15 54 15 0 -1
frame data/CHARS/Zangief/CVS2_Zangief_117.png # 1
delay 9
@cmd position 1 63 15 0 -1
frame data/CHARS/Zangief/CVS2_Zangief_306.png # 2
@cmd position 5 83 17 0 -1
frame data/CHARS/Zangief/CVS2_Zangief_307.png # 3
@cmd position 6 108 40 0 -1
frame data/CHARS/Zangief/CVS2_Zangief_308.png # 4
@cmd position 16 60 72 0 -1
delay 2
frame data/CHARS/Zangief/CVS2_Zangief_309.png # 5
@cmd position 16 60 72 0 -1
delay 9
frame data/CHARS/Zangief/CVS2_Zangief_309.png # 6
@cmd position 17 21 71 1 1
frame data/CHARS/Zangief/CVS2_Zangief_310.png # 7
@cmd position 17 -26 80 0 1
frame data/CHARS/Zangief/CVS2_Zangief_311.png # 8
@cmd position 16 20 61 0 -1
frame data/CHARS/Zangief/CVS2_Zangief_312.png # 9
@cmd position 3 58 12 0 1
sound data/sounds/fall.wav
delay 28
frame data/CHARS/Zangief/CVS2_Zangief_313.png # 10
@cmd position 3 58 12 0 1
frame data/CHARS/Zangief/CVS2_Zangief_314.png # 11
delay 9
@cmd depost
@cmd finish 8 1 1 1 0 -1
@cmd camFocus 0
frame data/CHARS/Zangief/CVS2_Zangief_315.png # 12
@cmd anichange "ani_follow29"
frame data/CHARS/Zangief/CVS2_Zangief_315.png # 13
followanim {value}
- Determines which FOLLOW animation played when followup condition is met or when counter condition is met.
- Possible values are 1, 2, 3 and 4.
- Used together with ‘followcond’ or ‘counterframe’.
followcond {value}
- This command is to make the entity performs FOLLOW{#} if an attackbox in the animation hits.
- value determines the condition requirements before FOLLOW{#} is played.
- 1 = this animation will followup as long as it hits an entity.
- 2 = this animation will followup as long as it hits an enemy (Or player if an enemy uses it).
- 3 = this animation will followup as long as it hits an enemy and the target does not get killed or not block the attack.
- 4 = this animation will followup as long as it hits an enemy, and the target is not killed, does not block the attack, and is not set to be ungrabbable.
- 5 = this animation will followup as long as it hits an enemy and the target does not get killed or block the attack.
- Which FOLLOW animation played is determined by ‘followanim’.
@cmd finish 8 1 1 1 0 -1
void finish(int Damage, int Type, int x, int y, int z, int Face)
if(Type==1)
{
damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL"));
@machokfor example slamstart "ATK_NORMAL4" = fall4 for enemy animation.
sure, my enemies fall4 anim is almost the same with pierwolf ff gold since I learned to implement it from there so you might also want to check itDoes anything need to be done to fall4?
You don't mine if I take a look at how you implemented it in 89.
Will do!my enemies fall4 anim is almost the same with pierwolf ff gold since I learned to implement it from there so you might also want to check it
I was expecting that question coming from you, so I thought I could tell you this.How do I setup the fall animation for the enemy being thrown?

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_NORMAL7")); // 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_NORMAL7")); // 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 antiwall(int Dist, int Move, int Distz)
{// Checks if there is wall at defined distance
// If there is wall, entity will be moved away with defined movement
void self = getlocalvar("self");
int Direction = getentityproperty(self, "direction");
int x = getentityproperty(self, "x");
int z = getentityproperty(self, "z");
float H;
float Hz;
if (Direction == 0){ //Is entity facing left?
Dist = -Dist; //Reverse Dist to match facing
Move = -Move; //Reverse Move to match facing
}
H = checkwall(x+Dist,z);
Hz = checkwall(x+Dist,z+Distz);
if(Hz > 0)
{
changeentityproperty(self, "position", x, z-Distz);
}
if(H > 0)
{
changeentityproperty(self, "position", x+Move);
}
}
void antiwall2(int Dist, int Move, int Distz)
{// Checks if there is wall at defined distance
// If there is wall, entity will be moved away with defined movement
void self = getlocalvar("self");
int Direction = getentityproperty(self, "direction");
int x = getentityproperty(self, "x");
int y = getentityproperty(self, "a");
int z = getentityproperty(self, "z");
float H;
float Hz;
if(Direction == 0){ //Is entity facing left?
Dist = -Dist; //Reverse Dist to match facing
Move = -Move; //Reverse Move to match facing
}
H = checkwall(x+Dist,z);
Hz = checkwall(x+Dist,z+Distz);
if(Hz > y)
{
changeentityproperty(self, "position", x, z-Distz);
}
if(H > y)
{
changeentityproperty(self, "position", x+Move);
}
}
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_NORMAL")); // 1st Finisher
}
if(Type==2)
{
damageentity(target, self, Damage, 1, openborconstant("ATK_NORMAL9")); // 2nd Finisher
}
tossentity(target, y, x, z); // Toss opponent ;)
changeentityproperty(target, "direction", MDir);
}
}
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_NORMAL")); // 1st throw type
}
if(Type==2)
{
damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL9")); // 2nd throw type
}
if(Type==3)
{
damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL2")); // 3rd throw type
}
changeentityproperty(target, "attacking", 1);
changeentityproperty(target, "damage_on_landing", Damage);
changeentityproperty(target, "projectile", 1);
changeentityproperty(target, "direction", MDir);
tossentity(target, y, x, z); // Toss opponent ;)
}
}
void clearL()
{// Clears all local variables
clearlocalvar();
}
anim idle
offset 140 188
delay 13
loop 1
bbox 116 93 57 95
@cmd clearL
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/0_0.png
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/0_1.png
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/0_2.png
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/0_3.png
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/0_4.png
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/0_5.png
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/0_6.png
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/0_7.png
void clearL()
{// Clears all local variables
clearlocalvar();
}
anim fall7
delay 1000
offset 89 143
frame data/chars/joe/pain1.gif # 0
frame data/chars/joe/pain2.gif # 1
# offset 92 96
# drawmethod rotate 180
# drawmethod fliprotate 1
frame data/chars/joe/falla1.gif # 2 / new gif
nodrawmethod
offset 92 96
frame data/chars/joe/fall1.gif # 3
offset 89 143
frame data/chars/joe/fall2.gif # 4
frame data/chars/joe/fall3.gif # 5
frame data/chars/joe/rise2.gif # 6
anim grabforward
offset 140 188
delay 16
@cmd slamstart
@cmd position 0 -28 31 0 1 # position {target's frame} {target's x} {target's y} {target's z} {target's facing}
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/209_1.png
@cmd position 1 -8 67 0 1
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/209_2.png
@cmd position 2 4 52 0 1
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/209_3.png
@cmd depost 0
@cmd throw 10 1 3 2.2 0 -1 #throw {damage}{type} {x} {y} {z} {direction}
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/209_4.png

anim grabforward
offset 140 188
delay 16
@cmd slamstart
@cmd position 0 -28 31 0 1 # position {target's frame} {target's x} {target's y} {target's z} {target's facing}
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/209_1.png
@cmd position 1 -8 67 0 1
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/209_2.png
@cmd position 2 4 52 0 1
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/209_3.png
@cmd depost 0
@cmd throw 10 1 3 2.2 0 -1 #throw {damage}{type} {x} {y} {z} {direction}
frame data/chars/heroes/KOF_2K3_Terry_Sprite.7z/209_4.png
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_NORMAL")); // 1st throw type
}
if(Type==2)
{
damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL9")); // 2nd throw type
}
if(Type==3)
{
damageentity(target, self, 0, 1, openborconstant("ATK_NORMAL2")); // 3rd throw type
}
changeentityproperty(target, "attacking", 1);
changeentityproperty(target, "damage_on_landing", Damage);
changeentityproperty(target, "projectile", 1);
changeentityproperty(target, "direction", MDir);
tossentity(target, y, x, z); // Toss opponent
}
}
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_NORMAL7")); // Slam Starter
}
}
CMT is updated very often every time a bug is found. Sometimes even within the same day a bug is reported.One question regarding CMT!
Is there a wiki for using it yet!
I want to move on to something that is continuously updated in the future
Like every tool, it requires a little practice at first. But then you don't want to go back - I abandoned the stats, I only use it when I want to copy things from one project to another.One question regarding CMT!
Is there a wiki for using it yet!