Another attempt at a Kit Fisto combo file

Releasing the source files for your mod or map? Post em' here. (Applies to both SWBF1 & SWBF2)

Moderator: Moderators

Post Reply
Sporadia
Corporal
Corporal
Posts: 151
Joined: Thu Jan 24, 2019 11:02 pm
Projects :: No Mod project currently
Games I'm Playing :: None
xbox live or psn: No gamertag set

Another attempt at a Kit Fisto combo file

Post by Sporadia »

This does not work the same as the xbox live version.

Update 13/03/23
This is the combo I'm using now. It's not the same as the old version; it's a bit closer to the xbox dlc.

Code: Select all

// forward declaration of attack animations
Animation("stand_comboattack1a"); // slash attack
Animation("stand_comboattack2a"); // melee transition to sprint attack part 1
Animation("stand_comboattack2b"); // melee transition to sprint attack part 2
Animation("stand_punchcombo"); // hand-to-hand attack
Animation("stand_comboattack3a"); // dash attack part 1
Animation("stand_comboattack3b"); // dash attack part 2
Animation("stand_comboattack3c"); // dash attack land
Animation("jumpattack1"); // jump attack
Animation("jumpattack3"); // jump attack land

// secondary weapons are same as all_hero_luke_jedi.combo (and so are several other states)
OffhandAnimation("stand_useforce", "FIRE")
{
    Loop("FinalFrame");
    AimType("Torso");
    BlendInTime(0.15);
    BlendOutTime(0.15);
}
OffhandAnimation("stand_useforce", "FIRE2");
OffhandAnimation("stand_useforce", "CHARGE");

ThrowAnimation("stand_throw");

State("CATCH_SABRE")
{
    Posture("Stand");
    Animation("stand_catch")
    {
        AimType("None");
        BlendOutTime(0.2);
    }

    InputLock("All", "!Thrust");
    AlignedToThrust();
}

State("IDLE")
{
	Duration(0.0); // infinite duration
	EnergyRestoreRate();
	InputLock(0.15, "Sprint", "Jump", "Crouch");
	
	Transition("DEFLECT")
	{
		If()
		{
			Break();    // all transitions are breaking if Duration is 0
			Posture("Stand", "Crouch");
			Energy(">=", 2.5);
			Button("FireSecondary", "Press");
		}
	}
	Transition("BACK_ATTACK")
    {
        If()
        {
            Break();
            Posture("Stand", "Crouch");
            Button("Fire", "Press");
			Thrust(">", 0.25);
			ThrustAngle(135, 225);	
        }
    }
	Transition("ATTACK1")
	{
		If()
		{
			Break();
			Posture("Stand", "Crouch");
			Button("Fire", "Press");
		}
	}
	Transition("DASHATTACK1A")
    {
		EnergyCost(40.0);
        If()
        {
            Break();
            Posture("Sprint");
            Button("Fire", "Press");
        }
    }
	Transition("JUMPATTACK_FALL")
    {
        If()
        {
            Break();
            Posture("Jump", "Jet");
            //The following should be true during a jetjump, jump, or fall 
            // unless we're more than 0.35 seconds from the apex
            //NOTE: This may not allow jedi to jump attack during longer falls
            // or falling from a force jump when it could.
            //VelocityY(">", -6.3);
            Button("Fire", "Press");
        }
    }
}

State("DEFLECT")
{
	Posture("Stand");
	Sound("imp_weap_lightsabre_block");
	Animation("stand_block_idle")
	{
		Loop();
		AimType("None");
		BlendInTime(0.15);
		BlendOutTime(0.15);
		LowResPose(0, "Frames");
	}
	
	Duration(0.0); // infinite duration
	EnergyRestoreRate(-10.0); // drain energy while waiting to deflect
	Deflect()
	{
        DeflectAngle(-60, 60);    // deflect anything from forward arc
        EnergyCost(0.0);

        DeflectAnimation("stand_block_front1", "Forward")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_front2", "Forward")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_left1", "Left")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_left2", "Left")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_right1", "Right")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_right2", "Right")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
	}
	
	Transition("ATTACK1")
	{
		If()
		{
			Break();
			Button("Fire", "Press");
		}
	}
	Transition("DEFLECT_ROLL") // same as the code checking for rolling
    {
        EnergyCost(25.0);
        If()
        {
            Break();    // all transitions are breaking if Duration is 0 
            Button("Crouch", "Press");
			Thrust(">", 0.9);
            ThrustAngle(-120, 120);
        }
    }
    Transition("DEFLECT_CROUCH")
    {
        If()
        {
            Break();    // all transitions are breaking if Duration is 0 
            Button("Crouch", "Press");
        }
    }
    Transition("DEFLECT_JUMP")
    {
        If()
        {
            Break();    // all transitions are breaking if Duration is 0 
            Button("Jump", "Press");
        }
    }
    Transition("DEFLECT_SPRINT")
    {
        If()
        {
            Break();    // all transitions are breaking if Duration is 0 
            Button("Sprint", "Down");
        }
    }
	Transition("IDLE")
	{
		If()
		{
			Break();
			Energy("<=" 0.0); // stop deflecting when energy is drained
		}
		Or()
		{
			Break(20, "Frames");
			Button("FireSecondary", "Press");
		}
		Or()
		{
			Break();
			Button("Reload", "Press");
		}
	}
}

State("DEFLECT_ROLL")
{
    Posture("Roll");

    MustShowOneFrame();

    Transition("IDLE")
    {
        If()
        {
            Break(1, "Frames");
        }
    }
}

State("DEFLECT_CROUCH")
{
    Posture("Crouch");

    MustShowOneFrame();

    Transition("IDLE")
    {
        If()
        {
            Break(1, "Frames");
        }
    }
}

State("DEFLECT_JUMP")
{
    Posture("Jump");

    MustShowOneFrame();

    Transition("IDLE")
    {
        If()
        {
            Break(1, "Frames");
        }
    }
}

State("DEFLECT_SPRINT")
{
    Posture("Sprint");

    MustShowOneFrame();

    Transition("IDLE")
    {
        If()
        {
            Break(1, "Frames");
        }
    }
}

State("BACK_ATTACK")
{
    Posture("Stand");
    Animation("stand_attack_backwards")
    {
	BlendInTime(0.15);
	BlendOutTime(0.3);
    }

    Sound("saber_swing");

    InputLock("All", "!Thrust");
    AlignedToThrust();
    Attack()
    {
        DamageTime(4, 9, "Frames");
        DamageLength(1.5);
        DamageWidth(0.75);
		Damage(400);
		Push(6.0);
    }

    Attack()
    {
        DamageTime(13, 20, "Frames");
        DamageLength(1.5);
        DamageWidth(0.75);
        Damage(400);
		Push(6.0);
    }

    Transition("IDLE");
}

State("ATTACK1")
{
	Posture("Stand");
	Animation("stand_comboattack1a");
	Sound("saber_swing", 5, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Attack()
	{
		DamageTime(4, 12, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("ATTACK2")
	{
		If()
		{
			TimeStart(2, "Frames");
			TimeEnd(18, "Frames"); // must be bigger than state duration
			Posture("Stand");
			Button("Fire", "Press");
		}
		Or()
		{
			TimeStart(2, "Frames");
			TimeEnd(18, "Frames");
			Posture("Stand");
			Button("Reload", "Press");
		}
	}
	Transition("RECOVER1");
}

State("RECOVER1")
{
	Posture("Stand");
	Animation("stand_comboattack1a")
	{
		AimType("None");
		BlendInTime(0.15);
		BlendOutTime(0.3);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Transition("IDLE");
}

State("ATTACK2")
{
	Posture("Stand");
	Animation("stand_comboattack2a")
	{
        BlendInTime(0.06);
		BlendOutTime(0.15);
		BlendTimeTo("stand_comboattack2a_upper", 0.06);
	}
	
	Sound("saber_swing", 5, "Frames");
	
	AlignedToThrust();
	
	InputLock("All", "!Thrust");
	AnimatedMove();
	
	Attack()
	{
		AttackID("FistoAttack3");
		DamageTime(5, 10, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("ATTACK3") // hidden attack
	{
		If()
		{
			Break();
			TimeStart(3, "Frames");
			TimeEnd(10, "Frames");
			Posture("Stand");
			Button("Reload", "Press");
		}
	}
	Transition("ATTACK2B");
}

State("ATTACK2B")
{
	Posture("Stand");
	Animation("stand_comboattack2b")
	{
		BlendInTime(0.06);
		BlendOutTime(0.15);
	}
	Duration(10, "Frames");
	
	InputLock("All", "!Thrust");
	AnimatedMove()
	{
		VelocityZ(0.0)
		VelocityX(0.0)
		VelocityFromThrust(0.5)
		VelocityFromStrafe(0.5)
	}
	
	AlignedToThrust();
	
	Attack()
	{
		AttackID("FistoAttack3");
		DamageTime(1, 4, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(125);
		Push(3.0);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("ATTACK3") // hidden attack
	{
		If()
		{
			Break();
			TimeStart(0, "Frames");
			TimeEnd(10, "Frames");
			Posture("Stand");
			Button("Reload", "Press");
		}
	}
	Transition("ATTACK2C");
}

State("ATTACK2C")
{
	Posture("Stand");
	Animation("stand_comboattack2b");
	Sound("saber_attack_three", 11, "Frames");
	
	AlignedToThrust();
	
	InputLock("All" "!Thrust");
	AnimatedMove()
	{
		VelocityZ(20.0);
		VelocityFromThrust(0.0);
		VelocityFromStrafe(15.0);
		Until()
		{
			Break(25, "Frames");
		}
	}
	TurnFactor(0.3)
	
	Attack()
	{
		DamageTime(11, 19, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(400);
		Push(3.0);
	}
	Attack()
	{
		DamageTime(21, 29, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(400);
		Push(3.0);
	}

	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Sprint");
        }
    }
	Transition("ATTACK3") // hidden attack
	{
		If()
		{
			Break();
			TimeStart(10, "Frames");
			TimeEnd(35, "Frames");
			Posture("Stand");
			Button("Reload", "Press");
		}
	}
	Transition("RECOVER2");
}

State("RECOVER2")
{
	Posture("Stand", "Sprint");
	Animation("stand_comboattack2b")
	{
		AimType("None");
		BlendInTime(0.15);
        BlendOutTime(0.15);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Transition("IDLE");
}

// hidden hand-to-hand attack
// triggered by LLR or LRR
State("ATTACK3")
{
	Posture("Stand");
	TurnOffLightsaber();
	Animation("stand_punchcombo")
	{
		BlendInTime(0.06);
		BlendOutTime(0.15);
	}
	
	Sound("com_weap_melee_swing", 29, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust();
	AnimatedMove()
	{
		VelocityFromThrust(3.5);
		VelocityFromStrafe(3.5);
	}
	
	Attack()
	{
		DamageTime(4, 9, "Frames");
		DamageLength(1.6);
		DamageWidth(0.8);
		Damage(200);
		Push(1.5);
	}
	Attack()
	{
		DamageTime(15, 18, "Frames");
		DamageLength(-1);
		DamageWidth(0.9);
		Damage(200);
		Push(1.5);
	}
	Attack()
	{
		DamageTime(28, 40, "Frames");
		DamageLength(1.95);
		DamageWidth(1.3);
		Damage(500);
		Push(3.0);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("RECOVER3");
}

State("RECOVER3")
{
	Posture("Stand");
	Animation("stand_punchcombo")
	{
		AimType("None");
		BlendInTime(0.15);
		BlendOutTime(0.15);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Transition("IDLE");
}

State("DASHATTACK1A")
{
	Posture("Stand");
	Animation("stand_comboattack3a");
	{
		AimType("FullBody");
		BlendInTime(0.10);
		BlendOutTime(0.25);
	}
	
	Sound("saber_attack_three", 8, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust(1);
	AnimatedMove()
	{
		VelocityZ(6.0);
		VelocityX(0.0);
		VelocityFromThrust(5.0);
		VelocityFromStrafe(1.0);
	}
	
	TurnFactor(0.3);
	Attack()
	{
		AttackID("FistoDashAttack");
		DamageTime(9, 15, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(600);
		Push(3.0);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Sprint");
        }
    }
	Transition("DASHATTACK1B");
}

State("DASHATTACK1B")
{
	Posture("Jump");
	MustShowOneFrame();
	Animation("stand_comboattack3b")
	{
		AimType("FullBody");
		BlendInTime(0.06);
		BlendOutTime(0.15);
	}
	
	Duration(1, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust(1);
	AnimatedMove();
	Attack()
	{
		AttackID("FistoDashAttack");
		DamageTime(1, 1, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(600);
		Push(3.0);
	}
	
	Transition("DASHATTACK1C");
}

State("DASHATTACK1C")
{
	Posture("Stand", "Jump");
	Animation("stand_comboattack3b")
	{
		AimType("FullBody");
		BlendInTime(0.06);
		BlendOutTime(0.15);
		BlendTimeTo("stand_comboattack3c", 0.25);
	}
	
	Duration(15, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust(1);
	AnimatedMove();
	Attack()
	{
		AttackID("FistoDashAttack");
		DamageTime(2, 4, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(600);
		Push(3.0);
	}
	
	Transition("DASHATTACK_LAND")
    {
        If()
        {
            Break();
            Posture("Stand");
        }
    }
	Transition("JUMPATTACK_FALL")
	{
		If()
		{
			Posture("Jump");
			TimeStart(10, "Frames");
			TimeEnd(16, "Frames");
			Button("Fire", "Press");
		}
	}
    Transition("IDLE")
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Jump");
        }
    }
	Transition("DASHATTACK1D");
}

State("DASHATTACK1D")
{
	Posture("Stand", "Jump", "Jet");
	Animation("stand_comboattack3b")
	{
		Loop("FinalFrame");
		AimType("FullBody");
		BlendInTime(0.06);
		BlendOutTime(0.15);
		BlendTimeTo("stand_comboattack3c", 0.25);
	}
	
	Duration(0.0); // infinite duration
	InputLock("All", "!Thrust", "!Jump"); // allow jumping
	AlignedToThrust(1);
	AnimatedMove();
	
	Transition("DASHATTACK_LAND")
    {
        If()
        {
            Break();
            Posture("Stand");
        }
    }
	Transition("JUMPATTACK_FALL")
	{
		If()
		{
			Break();
			Posture("Jump", "Jet");
			TimeStart(15, "Frames");
			TimeEnd(36, "Frames");
			Button("Fire", "Press");
			
		}
	}
	Transition("IDLE")
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Jump", "!Jet");
        }
		Or()
		{
			Break();
			Posture("Jump", "Jet");
			TimeStart(15, "Frames");
			TimeEnd(36, "Frames");
			Button("Jump", "Press"); // break state if jumping
		}
    }
}

State("DASHATTACK_LAND")
{
	Posture("Stand");
	Animation("stand_comboattack3c")
	{
		AimType("FullBody");
		BlendInTime(0.15);
		BlendOutTime(0.3);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Transition("IDLE");
}

State("JUMPATTACK_FALL")
{
	Posture("Jump");
	Animation("jumpattack1")
	{
		Loop("FinalFrame");
		AimType("None");
		BlendInTime(0.15);
		BlendOutTime(0.15);
		BlendTimeTo("jumpattack3", 0.06);
	}
	
	Sound("saber_double", 2, "Frames");
	Duration(0.0); // infinite duration
	EnergyRestoreRate(0.0);
	Gravity(4.0);
	GravityVelocityTarget(-20.0);
	AlignedToThrust();
	AnimatedMove();
	InputLock("All", "!Thrust");
	Attack()
	{
		DamageTime(3, 16, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("JUMPATTACK_LAND1")
	{
		If()
		{
			Break();
			Posture("Stand");
		}
	}
	Transition("IDLE")
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Jump", "!Jet");
        }
    }
}

State("JUMPATTACK_LAND1")
{
	Posture("Stand");
	Animation("jumpattack3")
	{
		AimType("FullBody");
		BlendInTime(0.15);
		BlendOutTime(0.15);
	}
	
	Duration(4, "Frames");
	EnergyRestoreRate(0.0);
	AlignedToThrust(1);
	AnimatedMove();
	InputLock("All");
	Attack()
	{
		DamageTime(1, 4, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(1000);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Jump", "!Jet");
        }
    }
	Transition("JUMPATTACK_LAND2");
}

State("JUMPATTACK_LAND2")
{
	Posture("Stand");
	Animation("jumpattack3")
	{
		BlendInTime(0.0);
		BlendOutTime(0.15);
	}
	
	Duration(-1);
	EnergyRestoreRate(0.0);
	AlignedToThrust(1);
	AnimatedMove();
	InputLock("All");
	PlayExplosion();
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("IDLE");
}
Old version:
Hidden/Spoiler:
I'm not sure where the best place to put this is. I wrote a new combo file for the Kit Fisto animations which were released as part of the conversion pack. I haven't kept the move order the same so this is not exactly like the xbox version; but I'm posting it here in case anyone wants to try it. I've just been revisiting it to make the button presses more doable and figured I might as well share it. The code is based on the stock combo files and a lot of the blending/timing was done through experimentation with slowmo, combo.damage and anim.show.

Hidden attacks are:
L, R, L, R -- the hand-to-hand combo
L, hold R -- I've changed how this attack works

Note: The JUMPATTACK_LAND2 state has the code PlayExplosion(); which will only work if you have an explosion set it up in the odf. If I post the particle effects I'm using for Kit Fisto in the future then I'll put them all up in one go.
Old version code:

Code: Select all

// forward declaration of attack animations
Animation("stand_comboattack1a"); // slash attack
Animation("stand_comboattack2a"); // melee transition to sprint attack part 1
Animation("stand_comboattack2b"); // melee transition to sprint attack part 2
Animation("stand_punchcombo"); // hand-to-hand attack
Animation("stand_comboattack3a"); // dash attack part 1
Animation("stand_comboattack3b"); // dash attack part 2
Animation("stand_comboattack3c"); // dash attack land
Animation("jumpattack1"); // jump attack
Animation("jumpattack3"); // jump attack land

// secondary weapons are same as all_hero_luke_jedi.combo (and so are several other states)
OffhandAnimation("stand_useforce", "FIRE")
{
    Loop("FinalFrame");
    AimType("Torso");
    BlendInTime(0.15);
    BlendOutTime(0.15);
}
OffhandAnimation("stand_useforce", "FIRE2");
OffhandAnimation("stand_useforce", "CHARGE");

ThrowAnimation("stand_throw");

State("CATCH_SABRE")
{
    Posture("Stand");
    Animation("stand_catch")
    {
        AimType("None");
        BlendOutTime(0.2);
    }

    InputLock("All", "!Thrust");
    AlignedToThrust();
}

State("IDLE")
{
	Duration(0.0); // infinite duration
	EnergyRestoreRate();
	InputLock(0.15, "Sprint", "Jump", "Crouch");
	
	Transition("DEFLECT")
	{
		If()
		{
			Break();    // all transitions are breaking if Duration is 0
			Posture("Stand", "Crouch");
			Energy(">=", 2.5);
			Button("FireSecondary", "Press");
		}
	}
	Transition("BACK_ATTACK")
    {
        If()
        {
            Break();
            Posture("Stand", "Crouch");
            Button("Fire", "Press");
			Thrust(">", 0.25);
			ThrustAngle(135, 225);	
        }
    }
	Transition("ATTACK1")
	{
		If()
		{
			Break();
			Posture("Stand", "Crouch");
			Button("Fire", "Press");
		}
	}
	Transition("DASHATTACK1A")
    {
		EnergyCost(40.0);
        If()
        {
            Break();
            Posture("Sprint");
            Button("Fire", "Press");
        }
    }
	Transition("JUMPATTACK_FALL")
    {
        If()
        {
            Break();
            Posture("Jump", "Jet");
            //The following should be true during a jetjump, jump, or fall 
            // unless we're more than 0.35 seconds from the apex
            //NOTE: This may not allow jedi to jump attack during longer falls
            // or falling from a force jump when it could.
            //VelocityY(">", -6.3);
            Button("Fire", "Press");
        }
    }
}

State("DEFLECT")
{
	Posture("Stand");
	Sound("imp_weap_lightsabre_block");
	Animation("stand_block_idle")
	{
		Loop();
		AimType("None");
		BlendInTime(0.15);
		BlendOutTime(0.15);
		LowResPose(0, "Frames");
	}
	
	Duration(0.0); // infinite duration
	EnergyRestoreRate(-10.0); // drain energy while waiting to deflect
	Deflect()
	{
        DeflectAngle(-60, 60);    // deflect anything from forward arc
        EnergyCost(0.0);

        DeflectAnimation("stand_block_front1", "Forward")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_front2", "Forward")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_left1", "Left")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_left2", "Left")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_right1", "Right")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
        DeflectAnimation("stand_block_right2", "Right")
        {
            BlendInTime(0.00);
            BlendOutTime(0.05);
            LowResPose(5, "Frames");
        }
	}
	
	Transition("ATTACK1")
	{
		If()
		{
			Break();
			Button("Fire", "Press");
		}
	}
	Transition("DEFLECT_ROLL") // same as the code checking for rolling
    {
        EnergyCost(25.0);
        If()
        {
            Break();    // all transitions are breaking if Duration is 0 
            Button("Crouch", "Press");
			Thrust(">", 0.9);
            ThrustAngle(-120, 120);
        }
    }
    Transition("DEFLECT_CROUCH")
    {
        If()
        {
            Break();    // all transitions are breaking if Duration is 0 
            Button("Crouch", "Press");
        }
    }
    Transition("DEFLECT_JUMP")
    {
        If()
        {
            Break();    // all transitions are breaking if Duration is 0 
            Button("Jump", "Press");
        }
    }
    Transition("DEFLECT_SPRINT")
    {
        If()
        {
            Break();    // all transitions are breaking if Duration is 0 
            Button("Sprint", "Down");
        }
    }
	Transition("IDLE")
	{
		If()
		{
			Break();
			Energy("<=" 0.0); // stop deflecting when energy is drained
		}
		Or()
		{
			Break(20, "Frames");
			Button("FireSecondary", "Press");
		}
		Or()
		{
			Break();
			Button("Reload", "Press");
		}
	}
}

State("DEFLECT_ROLL")
{
    Posture("Roll");

    MustShowOneFrame();

    Transition("IDLE")
    {
        If()
        {
            Break(1, "Frames");
        }
    }
}

State("DEFLECT_CROUCH")
{
    Posture("Crouch");

    MustShowOneFrame();

    Transition("IDLE")
    {
        If()
        {
            Break(1, "Frames");
        }
    }
}

State("DEFLECT_JUMP")
{
    Posture("Jump");

    MustShowOneFrame();

    Transition("IDLE")
    {
        If()
        {
            Break(1, "Frames");
        }
    }
}

State("DEFLECT_SPRINT")
{
    Posture("Sprint");

    MustShowOneFrame();

    Transition("IDLE")
    {
        If()
        {
            Break(1, "Frames");
        }
    }
}

State("BACK_ATTACK")
{
    Posture("Stand");
    Animation("stand_attack_backwards")
    {
	BlendInTime(0.15);
	BlendOutTime(0.3);
    }

    Sound("saber_swing");

    InputLock("All", "!Thrust");
    AlignedToThrust();
    Attack()
    {
        DamageTime(4, 9, "Frames");
        DamageLength(1.5);
        DamageWidth(0.75);
		Damage(400);
		Push(6.0);
    }

    Attack()
    {
        DamageTime(13, 20, "Frames");
        DamageLength(1.5);
        DamageWidth(0.75);
        Damage(400);
		Push(6.0);
    }

    Transition("IDLE");
}

State("ATTACK1")
{
	Posture("Stand");
	Animation("stand_comboattack1a");
	Sound("saber_swing", 5, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Attack()
	{
		DamageTime(4, 12, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("ATTACK2")
	{
		If()
		{
			TimeStart(2, "Frames");
			TimeEnd(18, "Frames"); // must be bigger than state duration
			Posture("Stand");
			Button("Fire", "Press");
		}
		Or()
		{
			TimeStart(2, "Frames");
			TimeEnd(18, "Frames");
			Posture("Stand");
			Button("Reload", "Press");
		}
	}
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("RECOVER1");
}

State("RECOVER1")
{
	Posture("Stand");
	Animation("stand_comboattack1a")
	{
		AimType("None");
		BlendInTime(0.15);
		BlendOutTime(0.3);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Transition("IDLE");
}

State("ATTACK2")
{
	Posture("Stand");
	Animation("stand_comboattack2a")
	{
        BlendInTime(0.06);
		BlendOutTime(0.15);
		BlendTimeTo("stand_comboattack2a_upper", 0.06);
	}
	
	Sound("saber_swing", 5, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust();
	Duration(8, "Frames");
	
	Attack()
	{
		AttackID("FistoAttack2");
		DamageTime(5, 8, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("ATTACK1B")
	{
		If()
		{
			TimeStart(1, "Frames");
			TimeEnd(11, "Frames");
			Posture("Stand");
			Button("Fire", "Press");
		}
	}
	Transition("ATTACK2B") // hidden attack
	{
		If()
		{
			TimeStart(3, "Frames");
			TimeEnd(9, "Frames"); // must be bigger than state duration
			Posture("Stand");
			Button("Reload", "Down");
		}
		Or()
		{
			TimeStart(2, "Frames");
			TimeEnd(9, "Frames"); // must be bigger than state duration
			Posture("Stand");
			Button("Sprint", "Press");
		}
	}
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("RECOVER2");
}

State("RECOVER2")
{
	Posture("Stand");
	Animation("stand_comboattack2a_upper")
	{
		AimType("None");
		BlendInTime(0.06);
		BlendOutTime(0.15);
		BlendTimeTo("stand_comboattack1a", 0.06);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	Duration(-1);
	
	Attack()
	{
		AttackID("FistoAttack2");
		DamageTime(9, 10, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("ATTACK1B")
	{
		If()
		{
			Break();
			TimeStart(7, "Frames");
			TimeEnd(13, "Frames");
			Posture("Stand");
			Button("Fire", "Press");
		}
	}
	Transition("IDLE");
}

// this state is the same move as attack 1
// it is repeated to hide the hand-to-hand attack
State("ATTACK1B")
{
	Posture("Stand");
	Animation("stand_comboattack1a");
	Sound("saber_swing", 5, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Attack()
	{
		DamageTime(4, 12, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("ATTACK2")
	{
		If()
		{
			TimeStart(2, "Frames");
			TimeEnd(18, "Frames"); // must be bigger than state duration
			Posture("Stand");
			Button("Fire", "Press");
		}
	}
	Transition("ATTACK3") // hidden attack
	{
		If()
		{
			Break();
			TimeStart(2, "Frames");
			TimeEnd(18, "Frames");
			Posture("Stand");
			Button("Reload", "Press");
		}
	}
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("RECOVER1");
}

// hidden extension to attack 2
// triggered by: press L, hold R
State("ATTACK2B")
{
	Posture("Stand");
	Animation("stand_comboattack2a");
	
	InputLock("All");
	AlignedToThrust(1);
	Duration(-1);
	
	AnimatedMove();
	
	Attack()
	{
		AttackID("FistoAttack2");
		DamageTime(9, 10, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("ATTACK2C");
}

State("ATTACK2C")
{
	Posture("Stand");
	Animation("stand_comboattack2b")
	{
		BlendInTime(0.06);
		BlendOutTime(0.15);
	}
	
	InputLock("All");
	AlignedToThrust();
	
	AnimatedMove();
	
	Duration(10, "Frames");
	
	Attack()
	{
		AttackID("FistoAttack2");
		DamageTime(1, 4, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(125);
		Push(3.0);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("ATTACK2D");
}

State("ATTACK2D")
{
	Posture("Sprint");
	Animation("stand_comboattack2b");
	Sound("saber_attack_three", 11, "Frames");
	InputLock("All" "!Thrust");
	AlignedToThrust();
	AnimatedMove()
	{
		VelocityZ(12.0);
		VelocityFromThrust(0.0);
		VelocityFromStrafe(3.0);
		Until()
		{
			Break(25, "Frames");
		}
	}
	
	Attack()
	{
		DamageTime(11, 19, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(400);
		Push(3.0);
	}
	Attack()
	{
		DamageTime(21, 29, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(400);
		Push(3.0);
	}

	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Sprint");
        }
    }
	Transition("RECOVER2D");
}

State("RECOVER2D")
{
	Posture("Stand", "Sprint");
	Animation("stand_comboattack2b")
	{
		AimType("None");
		BlendInTime(0.15);
        BlendOutTime(0.15);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Transition("IDLE");
}

// hidden hand-to-hand attack
// triggered by LRLR or LLLR
State("ATTACK3")
{
	Posture("Stand");
	TurnOffLightsaber();
	Animation("stand_punchcombo")
	{
		BlendInTime(0.06);
		BlendOutTime(0.15);
	}
	
	Sound("com_weap_melee_swing", 29, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust();
	AnimatedMove()
	{
		VelocityFromThrust(3.5);
		VelocityFromStrafe(3.5);
	}
	
	Attack()
	{
		DamageTime(4, 9, "Frames");
		DamageLength(1.6);
		DamageWidth(0.8);
		Damage(200);
		Push(1.5);
	}
	Attack()
	{
		DamageTime(15, 18, "Frames");
		DamageLength(-1);
		DamageWidth(0.9);
		Damage(200);
		Push(1.5);
	}
	Attack()
	{
		DamageTime(28, 40, "Frames");
		DamageLength(1.95);
		DamageWidth(1.3);
		Damage(500);
		Push(3.0);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("RECOVER3");
}

State("RECOVER3")
{
	Posture("Stand");
	Animation("stand_punchcombo")
	{
		AimType("None");
		BlendInTime(0.15);
		BlendOutTime(0.15);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Transition("IDLE");
}

State("DASHATTACK1A")
{
	Posture("Stand");
	Animation("stand_comboattack3a");
	{
		AimType("FullBody");
		BlendInTime(0.10);
		BlendOutTime(0.25);
	}
	
	Sound("saber_attack_three", 8, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust(1);
	AnimatedMove()
	{
		VelocityZ(6.0);
		VelocityX(0.0);
		VelocityFromThrust(5.0);
		VelocityFromStrafe(1.0);
	}
	
	TurnFactor(0.3);
	Attack()
	{
		AttackID("FistoDashAttack");
		DamageTime(9, 15, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(600);
		Push(3.0);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Sprint");
        }
    }
	Transition("DASHATTACK1B");
}

State("DASHATTACK1B")
{
	Posture("Jump");
	MustShowOneFrame();
	Animation("stand_comboattack3b")
	{
		AimType("FullBody");
		BlendInTime(0.06);
		BlendOutTime(0.15);
	}
	
	Duration(1, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust(1);
	AnimatedMove();
	Attack()
	{
		AttackID("FistoDashAttack");
		DamageTime(1, 1, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(600);
		Push(3.0);
	}
	
	Transition("DASHATTACK1C");
}

State("DASHATTACK1C")
{
	Posture("Stand", "Jump");
	Animation("stand_comboattack3b")
	{
		AimType("FullBody");
		BlendInTime(0.06);
		BlendOutTime(0.15);
		BlendTimeTo("stand_comboattack3c", 0.25);
	}
	
	Duration(15, "Frames");
	InputLock("All", "!Thrust");
	AlignedToThrust(1);
	AnimatedMove();
	Attack()
	{
		AttackID("FistoDashAttack");
		DamageTime(2, 4, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(600);
		Push(3.0);
	}
	
	Transition("DASHATTACK_LAND")
    {
        If()
        {
            Break();
            Posture("Stand");
        }
    }
	Transition("JUMPATTACK_FALL")
	{
		If()
		{
			Posture("Jump");
			TimeStart(10, "Frames");
			TimeEnd(16, "Frames");
			Button("Fire", "Press");
		}
	}
    Transition("IDLE")
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Jump");
        }
    }
	Transition("DASHATTACK1D");
}

State("DASHATTACK1D")
{
	Posture("Stand", "Jump", "Jet");
	Animation("stand_comboattack3b")
	{
		Loop("FinalFrame");
		AimType("FullBody");
		BlendInTime(0.06);
		BlendOutTime(0.15);
		BlendTimeTo("stand_comboattack3c", 0.25);
	}
	
	Duration(0.0); // infinite duration
	InputLock("All", "!Thrust", "!Jump"); // allow jumping
	AlignedToThrust(1);
	AnimatedMove();
	
	Transition("DASHATTACK_LAND")
    {
        If()
        {
            Break();
            Posture("Stand");
        }
    }
	Transition("JUMPATTACK_FALL")
	{
		If()
		{
			Break();
			Posture("Jump", "Jet");
			TimeStart(15, "Frames");
			TimeEnd(36, "Frames");
			Button("Fire", "Press");
			
		}
	}
	Transition("IDLE")
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Jump", "!Jet");
        }
		Or()
		{
			Break();
			Posture("Jump", "Jet");
			TimeStart(15, "Frames");
			TimeEnd(36, "Frames");
			Button("Jump", "Press"); // break state if jumping
		}
    }
}

State("DASHATTACK_LAND")
{
	Posture("Stand");
	Animation("stand_comboattack3c")
	{
		AimType("FullBody");
		BlendInTime(0.15);
		BlendOutTime(0.3);
	}
	
	InputLock("All", "!Thrust");
	AlignedToThrust();
	
	Transition("IDLE");
}

State("JUMPATTACK_FALL")
{
	Posture("Jump");
	Animation("jumpattack1")
	{
		Loop("FinalFrame");
		AimType("None");
		BlendInTime(0.15);
		BlendOutTime(0.15);
		BlendTimeTo("jumpattack3", 0.06);
	}
	
	Sound("saber_double", 2, "Frames");
	Duration(0.0); // infinite duration
	EnergyRestoreRate(0.0);
	Gravity(4.0);
	GravityVelocityTarget(-20.0);
	AlignedToThrust();
	AnimatedMove();
	InputLock("All", "!Thrust");
	Attack()
	{
		DamageTime(3, 16, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(300);
		Push(3.0);
	}
	
	Transition("JUMPATTACK_LAND1")
	{
		If()
		{
			Break();
			Posture("Stand");
		}
	}
	Transition("IDLE")
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Jump", "!Jet");
        }
    }
}

State("JUMPATTACK_LAND1")
{
	Posture("Stand");
	Animation("jumpattack3")
	{
		AimType("FullBody");
		BlendInTime(0.15);
		BlendOutTime(0.15);
	}
	
	Duration(4, "Frames");
	EnergyRestoreRate(0.0);
	AlignedToThrust(1);
	AnimatedMove();
	InputLock("All");
	Attack()
	{
		DamageTime(1, 4, "Frames");
		DamageLength(1.5);
		DamageWidth(0.75);
		Damage(1000);
	}
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand", "!Jump", "!Jet");
        }
    }
	Transition("JUMPATTACK_LAND2");
}

State("JUMPATTACK_LAND2")
{
	Posture("Stand");
	Animation("jumpattack3")
	{
		BlendInTime(0.0);
		BlendOutTime(0.15);
	}
	
	Duration(-1);
	EnergyRestoreRate(0.0);
	AlignedToThrust(1);
	AnimatedMove();
	InputLock("All");
	PlayExplosion();
	
	Transition("IDLE") // for deaths
    {
        If()
        {
            Break();
            Posture("Any", "!Stand");
        }
    }
	Transition("IDLE");
}
[\code]
Post Reply