Creating & Customizing Attack Motions (Unique Inputs)
- EvilAttackAction1.xml
- EvilAttackMotionFile.xml
The MotionList contains a series of Motions, or the Unique Inputs (UIs) in the Werehog’s combos. These Motion are XML cells which determine the value of the animation, movement, collision, attack types, and other attributes of each and every unique input of the Werehog's attacks. These elements are extensively long because of their content, so we will break each section down for you. For convenience's sake, we will create a new scenario by making a new Motion (individual attack) called “MOVE_A” and explain what each variable does.
By the end of this guide, you'll have a fairly comprehensive and complete Motion file, such as the example below.
<Motion>
<MotionName>MOVE_A</MotionName>
<FileName>NSA</FileName>
<MotionBlendTimeS>0.02f</MotionBlendTimeS>
<MotionBlendTimeE>0.02f</MotionBlendTimeE>
<MotionBlendTimeEIdle>0.02f</MotionBlendTimeEIdle>
<MotionMoveSpeedRatio>0.875f</MotionMoveSpeedRatio>
<MotionMoveSpeedRatio_Y>1.f</MotionMoveSpeedRatio_Y>
<MotionMoveSpeedRatioFrameStart_1>-1</MotionMoveSpeedRatioFrameStart_1>
<MotionMoveSpeedRatioFrame_1>10.f</MotionMoveSpeedRatioFrame_1>
<MotionMoveSpeedRatioFrameY_1>10.f</MotionMoveSpeedRatioFrameY_1>
<MotionFirstSpeed>1.f</MotionFirstSpeed>
<MiddleSpeed>1.f</MiddleSpeed>
<EndSpeed>1.f</EndSpeed>
<MotionSpeed_FirstFrame>9</MotionSpeed_FirstFrame>
<MotionSpeed_MiddleFrame>16</MotionSpeed_MiddleFrame>
<DontCatchTime>0</DontCatchTime>
<DontJump>false</DontJump>
<ShakeCameraStartFrame>-1</ShakeCameraStartFrame>
<GroundHeightRepair>0.1f</GroundHeightRepair>
<MoveType>IngAutoTarget</MoveType>
<AutoTargetEndFrame>9</AutoTargetEndFrame>
<AutoTargetPower>0.2</AutoTargetPower>
<PadRotationIntensity>20</PadRotationIntensity>
<IsGravity>true</IsGravity>
<GravityArray_Start1>-1</GravityArray_Start1>
<IsGravityArray1>true</IsGravityArray1>
<PadRotationIntensity_Start1>0</PadRotationIntensity_Start1>
<PadRotationIntensity_Power1>20</PadRotationIntensity_Power1>
<PadRotationValid1>true</PadRotationValid1>
<PadRotationIntensity_Start2>8</PadRotationIntensity_Start2>
<PadRotationIntensity_Power2>0</PadRotationIntensity_Power2>
<PadRotationValid2>false</PadRotationValid2>
<PadRotationIntensity_Start3>22</PadRotationIntensity_Start3>
<PadRotationIntensity_Power3>20</PadRotationIntensity_Power3>
<PadRotationValid3>true</PadRotationValid3>
<GameSpeed_Start1>0</GameSpeed_Start1>
<GameSpeed_Power1>1</GameSpeed_Power1>
<GameSpeed_CollPower1>1</GameSpeed_CollPower1>
<GuardStartFrame>8</GuardStartFrame>
<GuardEndFrame>27</GuardEndFrame>
<!--<GameSpeedColl_Start1>-1</GameSpeedColl_Start1>
<GameSpeedColl_Speed1>-1</GameSpeedColl_Speed1>
<GameSpeedColl_Timer1>-1</GameSpeedColl_Timer1>
-->
<Effect>
<REffect_Start1>4</REffect_Start1>
<REffect_End1>16</REffect_End1>
<REffect_Size1>2</REffect_Size1>
<REffect_Name1>evil_punch_01</REffect_Name1>
</Effect>
<Sound></Sound>
<Collision>
<DebugDraw>true</DebugDraw>
<Size1>0.75f</Size1>
<SizeDelta1>0.f</SizeDelta1>
<RHandStart1>6</RHandStart1>
<RHandEnd1>16</RHandEnd1>
</Collision>
<Vibration>
<StartFrame>-1</StartFrame>
<EndFrame>-1</EndFrame>
<BigMoter>0.f</BigMoter>
<SmallMoter>0.f</SmallMoter>
<SuccessTimeLength>0.01</SuccessTimeLength>
<SuccessBigMoter>0.5f</SuccessBigMoter>
<SuccessSmallMoter>0.5f</SuccessSmallMoter>
</Vibration>
<Attack>
<Type1>NormalHard</Type1>
<DamagePower1>95</DamagePower1>
<KnockOutPower_Y1>0.f</KnockOutPower_Y1>
<KnockOutPower_Dir1>2.2f</KnockOutPower_Dir1>
<KnockOutAnglePowerRatio1>0.5f</KnockOutAnglePowerRatio1>
<Attribute1>VerticalAttack</Attribute1>
</Attack>
</Motion>
Names
We start with the MotionName and FileName. The MotionName can be whatever it wants, but the FileName must be exactly as it’s written within EvilAttackMotionFile.xml
<Motion>
<MotionName>MOVE_A</MotionName>
<FileName>NSA</FileName>
</Motion>
For the most part, changing the filename is an entirely arbitrary case. But if you’re planning to change the filename anyways:
- Find the name of your animation file (formatted as *.anm.hkx)
- Look for EvilAttackMotionFile.xml, and look within that XML
- You can either change the filename or make a new MotionFileList. However, there are some limitations… so this is an arbitrary action unless you’re using the Beta Combos.
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Start>
<StartPoint>
<!-- Normal/Feral Were-Hammer -->
<MotionFileList>
<MotionName>NSA</MotionName>
<FileName>evilsonic_attackNSA</FileName>
</MotionFileList>
<MotionFileList>
<MotionName>NSB</MotionName>
<FileName>evilsonic_attackNSB</FileName>
</MotionFileList>
<MotionFileList>
<MotionName>NSC</MotionName>
<FileName>evilsonic_attackNSC</FileName>
</MotionFileList>
<MotionFileList>
<MotionName>NSD</MotionName>
<FileName>evilsonic_attackNSD</FileName>
</MotionFileList>
<MotionFileList>
<MotionName>NSE</MotionName>
<FileName>evilsonic_attackNSE</FileName>
</MotionFileList>
<!-- Your Custom MotionFileList -->
<MotionFileList>
<MotionName>MOVE_A</MotionName>
<FileName>evilsonic_attackNSE</FileName>
</MotionFileList>
</Start>
</StartPoint>
Animation and Movement
The animation and movement values here determine how your Motion looks and moves visually and physically.
- MotionBlendTimeS, MotionBlendTimeE, and MotionBlendTimeEIdle blend the animations between a previous and following combo. Keep the values as 0.02f.
- MotionMoveSpeedRatio (MMSR for convenience) and MotionMoveSpeedRatio_Y control the player’s movement ratio when making the entire attack. You can experiment with these values, but remember to write it in the form of “A.Bf”
- MotionMoveSpeedRatioFrameStart_X, MotionMoveSpeedRatioFrame_X, and MotionMoveSpeedRatioFrameY_Xand its subsequent variables apply the same movement/distance ratio, except it’s done within a certain frame. Reference other moves if you want to make particular adjustments.
- MotionFirstSpeed, MiddleSpeed, and EndSpeed all affect the Attack’s animation speed.
- MotionSpeed_First/MiddleFrame represents when the MotionFirstSpeed and MiddleSpeed params are executed (corresponding with the animation frames).
<Motion>
<MotionName>MOVE_A</MotionName>
<FileName>NSA</FileName>
<MotionBlendTimeS>0.02f</MotionBlendTimeS>
<MotionBlendTimeE>0.02f</MotionBlendTimeE>
<MotionBlendTimeEIdle>0.02f</MotionBlendTimeEIdle>
<MotionMoveSpeedRatio>0.875f</MotionMoveSpeedRatio>
<MotionMoveSpeedRatio_Y>1.f</MotionMoveSpeedRatio_Y>
<MotionMoveSpeedRatioFrameStart_1>-1</MotionMoveSpeedRatioFrameStart_1>
<MotionMoveSpeedRatioFrame_1>10.f</MotionMoveSpeedRatioFrame_1>
<MotionMoveSpeedRatioFrameY_1>10.f</MotionMoveSpeedRatioFrameY_1>
<MotionFirstSpeed>1.f</MotionFirstSpeed>
<MiddleSpeed>1.f</MiddleSpeed>
<EndSpeed>1.f</EndSpeed>
<MotionSpeed_FirstFrame>9</MotionSpeed_FirstFrame>
<MotionSpeed_MiddleFrame>16</MotionSpeed_MiddleFrame>
</Motion>
General
Now we can take a look at more general variables. These are equally important for combat and visual aspects of the Werehog.
- AttackScope sets the degrees of turning while attacking. You have None, Scope90, and Scope360 to use.
- DontCatchTime states how long it takes before the player can use the grab. Set it to 0 for ground moves, 2 for aerial moves.
- DontJump is self-explanatory. You apply it for whatever moves you DON'T want to have an enabled jump afterwards, such as Sho-Hog-Ken (YYA), and disable it for combo that you want to jump with, such as Unleashed Wild Combo (XX-YY-XX-YY).
- OnceSendDamage determines how long a combo can continually send damage. The default value is usually zero, and many moves use this as a way of implementing multiple hits for combos with a single or more number of hitboxes.
- ShakeCameraStartFrame is the start frame for when the Camera Shake can happen for certain moves. Unfortunately, there are no specific variables to affect the number or intensity of shakes.
- GroundHeightRepair determines the floatiness of a move. Lower values mean more floaty and higher values mean less floaty.
- MoveType has two values: Default and IngAutoTarget (the variables below only work when IngAutoTarget is enabled.
- AutoTargetEndFrame can be set to 0 for Default, and any value for IngAutoTarget
- AutoTargetPower can be set to 0 for Default, and any value for IngAutoTarget
<Motion>
<MotionName>MOVE_A</MotionName>
<FileName>NSA</FileName>
<MotionBlendTimeS>0.02f</MotionBlendTimeS>
<MotionBlendTimeE>0.02f</MotionBlendTimeE>
<MotionBlendTimeEIdle>0.02f</MotionBlendTimeEIdle>
<MotionMoveSpeedRatio>0.875f</MotionMoveSpeedRatio>
<MotionMoveSpeedRatio_Y>1.f</MotionMoveSpeedRatio_Y>
<MotionMoveSpeedRatioFrameStart_1>-1</MotionMoveSpeedRatioFrameStart_1>
<MotionMoveSpeedRatioFrame_1>10.f</MotionMoveSpeedRatioFrame_1>
<MotionMoveSpeedRatioFrameY_1>10.f</MotionMoveSpeedRatioFrameY_1>
<MotionFirstSpeed>1.f</MotionFirstSpeed>
<MiddleSpeed>1.f</MiddleSpeed>
<EndSpeed>1.f</EndSpeed>
<MotionSpeed_FirstFrame>9</MotionSpeed_FirstFrame>
<MotionSpeed_MiddleFrame>16</MotionSpeed_MiddleFrame>
<DontCatchTime>0</DontCatchTime>
<DontJump>false</DontJump>
<OnceSendDamage>0</OnceSendDamage> <!-- Not included in the original motion -->
<ShakeCameraStartFrame>-1</ShakeCameraStartFrame>
<GroundHeightRepair>0.1f</GroundHeightRepair>
<MoveType>IngAutoTarget</MoveType>
<AutoTargetEndFrame>9</AutoTargetEndFrame>
<AutoTargetPower>0.2</AutoTargetPower>
</Motion>
Gravity and PadRotation
The following Gravity and PadRotation variables are interpreted and explained by Nec0Arc and myself, so you can understand how to adjust the player’s movement across the X, Y, and Z axis. The value of these variables depend on what kind of attack you would want (grounded, launcher, aerial, unidirectional, multidirectional, etc.)
- PadRotationIntensity is a general value that of the attack's rotation via the left stick. It is assumed the value is represented in degrees or whatever value is used by the controller's left-stick.
- IsGravity and its subsequent parameters are self-explanatory. Ground moves follow the above setup for its gravity arrays and values.
- Aerial moves follow this particular setup for IsGravity:
- PadRotationIntensity_StartX sets the keyframe for the player’s movement during an attack.
- PadRotationIntensity_PowerX sets the degrees of rotation your player can move.
- PadRotationValidX just sets the value to true or false.
GameSpeed and Guarding
The following discoveries were made by BaconYum and myself: GameSpeed represents the “Slow Motion” moments that happen with attacks, so let’s look at the variables:
- GameSpeed_StartX refers to the specific frame that starts the GameSpeed variable.
- GameSpeed_PowerX refers to the power of this GameSpeed modifier, which is simple to understand.
- A value of 1 means the game’s speed is normal
- 1 > X > 0 means the game’s speed is slowed. So if you have a value of 0.5, the game’s speed is halved.
- A value above 1 means the game’s speed is multiplied by that amount. A value of 2 means the game’s speed is doubled.
- GameSpeed_CollPowerX does the same thing, except it refers to the player’s collision when doing the attack.
- GuardStart/EndFrame are self-explanatory, and they surprisingly explain the mechanic of Shield Cancelling… neat!
Sound and Effects
The Sound element is unused in the main game’s Attack XML, mostly used in the TBRES XMLs. The Effect element, however, can be used generally for hand and feet attacks.
- Effect_StartX is the start time value for the effect to take place. L/R is for hands, LF/RF is for feet.
- Effect_EndX is the end time value for the effect to take place.
- Effect_SizeX is self explanatory
- Effect_NameX is also self-explanatory. If you want to look for the effect names for the Werehog, look at EvilSonic’s ar files.
Collision
The Collision Element deals with the attack’s hitbox, which registers the hits and damage. Both Nec0Arc and NextinFRFX interpreted and discovered the following variables to help you understand what they do:
- Just keep it as true. I don’t know what it does.
- SizeX is the initial or start size of the attack’s hitbox.
- SizeDeltaX is the final or end size of the attack’s hitbox
- RHandStartX is the frame where the collision hitbox starts, applying the SizeX variable. The specific body hitbox can be changed (refer to this link).
- RHandEndX is the frame where the collision hitbox ends, applying the SizeDeltaX variable.
Camera
This element deals with the player’s camera when doing certain attacks. These values were taken from Sho-Hog-Ken (SHAS).
- StartEaseInFrame/StartEaseOutFrame are used to set the range of when the camera eases in and out.
- EaseIn/EaseOut is the value that the camera pulls in or pulls out.
- Fovy probably means FOV (field of view). The Y could be a type or mean the Y-Axis.
- HopeLength… your guess is as good as mine.
- Height is self-explanatory.
Vibration
This element deals with the controller’s vibration, usually when a hit is registered.
- Start/EndFrame are self-explanatory
- BigMoter and SmallMoter are the vibration motors of the control, meaning left or right.
- SuccessTimeLength is how long the vibration lasts if you land a hit
- SuccessBig/SmallMoter is the same thing but for the motors specifically.
Attack
These are the primary Attack values, which we know are connected to the Collision (thanks to Nec0Arc). Let’s take a look at the Attack Variables, which are the final variables you’ll need to complete your Motion:
- Type is one of many different Attack Types that you can use.
- DamagePower is self-explanatory, and its value is multiplied by the Strength Stat
- KnockOutPower_Y determines the vertical knockback distance for enemies
- KnockOutPower_Dir determines the horizontal knockback distance for enemies (I should note, for both, that it weirdly isn’t alterable when doing)
- KnockOutAnglePowerRatio is just a multiplier for both KnockOutPower variables.
- The Attribute variable can be set to Vertical, Side, or FinishAttack.