XML:TRAM: Difference between revisions

From OniGalore
Jump to navigation Jump to search
(details for first value (int8) of EKey)
(general copy-edit)
Line 4: Line 4:


===Export===
===Export===
TRAM files can be extracted '''A) as pure xml''' files or combined '''B) as xml and dae''' files.
TRAM files can be extracted '''A) as pure XML''' files or '''B) as a pair of XML and DAE''' files. For editing the actual animation, you will want to use method B. While exporting an ONCC, you might see errors such as:
 
For editing the actual animation you will want to use method B.
 
While doing the export with ONCC you might see errors such as


  Cannot find instance 'TRAMKONCOMthrow_rev'
  Cannot find instance 'TRAMKONCOMthrow_rev'
Line 17: Line 13:
  Cannot find instance 'TRAMKONPIScorner_hide'
  Cannot find instance 'TRAMKONPIScorner_hide'


Ignore them, those files doesn't exist.
Ignore them, as those files doesn't exist. (Someday we should remove them from the TRACs.)
 
(Someday we should remove them from TRAC.)
 


====Via command line====
====Via command line====
for single file export
To export a single TRAM:
  onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni
  onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni


for merged file export
To export merged TRAMs:
  onisplit -extract:xml output_path '''-anim-merge''' -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni
  onisplit -extract:xml output_path '''-anim-merge''' -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni


====Via Vago====
====Via Vago====
<!--[[Image:Vago_xml_plus_dae_extraction.png|thumb|200px|right|combined extraction of dae and xml]]-->
[[Image:Vago_xml_plus_dae_extraction.png|thumb|200px|right|combined extraction of dae and xml]]


When you start '''[[Vago_(tool)|Vago]]''' the "General" tab should be open by default. If not click on it. Then follow the five easy steps.
When you start '''[[Vago_(tool)|Vago]]''', the "General" tab should be open by default. If not, click on it. Then follow these five easy steps.
<!-- General tab should be step 1 but i've already another img. If Vago gets updated I will upload a better img. -->
<!-- General tab should be step 1 but i've already another img. If Vago gets updated I will upload a better img. -->


'''Step 1:''' Select "ONI" as ("From") input format.
'''Step 1:''' Select "ONI" as input format ("From").


'''Step 2:''' Select "XML" as ("To") output format.
'''Step 2:''' Select "XML" as output format ("To").


'''Step 3:''' Check "Another TRAM" to chose a character animation file.
'''Step 3:''' Check "Another TRAM" to chose a character animation file.


'''Step 4:''' Click on "Add" button to chose an ONCC file.
'''Step 4:''' Click "Add" button to choose an ONCC file.
 
'''Step 5:''' Click on "Convert".


'''Step 5:''' Click "Convert".


====Via Simple OniSplit GUI====
====Via Simple OniSplit GUI====
There was a long standing problem with ONCC-TRAM-combined files whereby the textures will be missing.<br>With an older method you couldn't export non-native TRAM which meant to the TRAM had to be registered in the TRAC the ONCC is using.
There was a long-standing problem with combined ONCC/TRAM files where the textures would be missing.<!--[Iritscen: I don't understand this sentence; is it important to keep this historical note?] With an older method you couldn't export non-native TRAM which meant to the TRAM had to be registered in the TRAC the ONCC is using.-->
 
'''[http://www.paradox.oni2.net/programs/Simple_OniSplit_GUI.zip Simple OniSplit GUI]''' post-edits the dae to fix the missing textures. The character related oni files must be all in one folder. Usually level0_Final folder does the trick.


'''[http://www.paradox.oni2.net/programs/Simple_OniSplit_GUI.zip Simple OniSplit GUI]''' post-edits the DAE to fix missing textures. The character-related .oni files must be all in one folder. Usually the level0_Final folder does the trick.


'''Step 1:''' Drag and drop TRAM and ONCC into the [http://www.paradox.oni2.net/images/simpleOniSplitGui.png big field.] (One by one. Or simultaneously. The order doesn't matter.)
'''Step 1:''' Drag and drop TRAM and ONCC into the [http://www.paradox.oni2.net/images/simpleOniSplitGui.png big field.] (One by one or simultaneously; the order doesn't matter.)
 
'''Step 2:''' Hit Convert.


'''Step 2:''' Hit "Convert".


===Editing the actual animation===
===Editing the actual animation===
You can load the dae file into an compatible editor. So far the community's favorite is Mod Tool.
You can load the DAE file into a compatible editor. So far, the community's favorite is {{ModTool}}.
* For correct Mod Tool settings look [[Mod Tool#Animating|HERE]]
* For the correct Mod Tool settings, see [[Mod Tool#Animating|HERE]].
* Tutorial: <font style="color:#777777">basics of Oni animation editing</font> (todo)
* Tutorial: <font style="color:#777777">Basics of Oni animation editing</font> (to do)
<!--* Tutorial: working with rigged models-->
<!--* Tutorial: working with rigged models-->


===Import===
===Import===
Line 71: Line 59:
<s>Condensed knowledge coming soon.</s>
<s>Condensed knowledge coming soon.</s>


 
====Totally new animations====
====Total new animations====
<s>Coming soon.</s>
<s>Coming soon.</s>


===File structure===
===File structure===
  TRAM
  TRAM
   |
   |
   +-- header: animation type, state, flags, particle, sounds, etc.
   +-- header: animation type, state, flags, particle, sounds, etc.
   +-- actual animation: heights, velocities, rotations
   +-- actual animation: heights, velocities, rotations
   +-- additional data: positions, throw adjustments, selfdamage, attack parts, extents
   +-- additional data: positions, throw adjustments, self-damage, attack parts, extents
 


===List of tags, types, and flags===
===List of tags, types, and flags===
Line 111: Line 94:
|valign="top"| flag
|valign="top"| flag
| Look them up over [[XML:StNA#animation_states|HERE]].
| Look them up over [[XML:StNA#animation_states|HERE]].
: Somtimes FromState is set to None; in another scenarios one FromState possibility is not enough.
: Sometimes FromState is set to "None"; in other scenarios, one FromState value is not enough.
:: In those cases Shortcuts are used. They extent the number from what state the animation can be played and under what conditions (replace atomic yes/no).
:: In those cases Shortcuts are used. They extend the number of states from which an animation can be played and under what conditions (replacing this atomic yes/no).
|-
|-
| <ToState>
| <ToState>
Line 120: Line 103:
|valign="top"| <Varient>
|valign="top"| <Varient>
|valign="top"| flag
|valign="top"| flag
| "<Varient />" if unused. E.g. that's the case for non-combat animations.
|(misspelled because Oni misspells it) If unused, tag will be simply "<Varient />", such as for non-combat animations. Otherwise contains one of these values:
: Combat
: Combat
: LeftPistol
: LeftPistol
Line 131: Line 114:
| <FirstLevel>
| <FirstLevel>
| int16
| int16
|
|Number of first level in which move becomes available to the player ("0" to make it available from the start).
|-
|-
| <Shortcuts>
| <Shortcuts>
Line 159: Line 142:
|
|
:RuntimeLoaded
:RuntimeLoaded
:::(this bit is not animation related, it is used at runtime to mark that the animation was loaded)
::(This bit is not stored on disk; it is used at runtime to mark that the animation was loaded.)
:Invulnerable
:Invulnerable
:::while playing this animation user is invulnerable to melee damage AND cannot be thrown, PAR3/height still hurts him
::While playing this animation, the player is invulnerable to melee damage and also cannot be thrown. Damage from particles and fall damage still hurt.
:BlockHigh
:BlockHigh
:::if set then while playing this animation user can block high or undefined attacks within some arc which is '''before''' him, so if you set this to some animation where user spins, then he can still be legaly kicked to the @$$ and he can be thrown
::While playing this animation, the player is invulnerable to high or undefined attacks within some arc in front of him. If you set this flag on an animation where the player character is spinning, then the character can still be kicked in the back or thrown.
:BlockLow
:BlockLow
:::same as before only it can block low or undefined attacks
::Same as above, only it can block low or undefined attacks.
:Attack
:Attack
:::animations with attack part have it, unknown what it does, IMO it turns on soft lock (characters turns with animation a bit in order to hit nearby enemy), but didn't checked
::Animations with an attack part have this turned on. Uncertain what it does, but it may enable the melee soft-lock (where the character turns a bit during the animation to face a nearby enemy).
:DropWeapon
:DropWeapon
:::if user is armed, he drops weapon when he plays this animation
::If the player is armed, he drops his weapon when this animation plays.
:InAir
:InAir
:::something with jumps, didn't checked
::Something to do with jumps; not investigated.
:Atomic
:Atomic
:::whole animation must be played, user cannot interrupt it once it starts
::The whole animation must be played; player cannot interrupt it once it starts.
:NoTurn
:NoTurn
:::cannot turn by mouse while performing this animation  
:::Player cannot turn by mouse while performing this animation.
:AttackForward
:AttackForward
:::unknown, looks like this is rough info for AI2 about where attack aims from user's point of view -[[User:Loser|Loser]]
::Unknown, but it looks like this is rough info for the AI about where an attack is aiming, from the player's point of view.
:AttackLeft
:AttackLeft
:::same as above
::Same as above.
:AttackRight
:AttackRight
:::same as above
::Same as above.
:AttackBackward
:AttackBackward
::Same as above.
:Overlay
:Overlay
:::these are not standalone animations, they just overwrite part of already playing one, for example holstering weapon is such an animation
::Not a standalone animation; it just overwrites part of an already-playing one, e.g. the weapon-holstering animation.
:DontInterpolateVelocity
:DontInterpolateVelocity
:::unknown, but maybe it has something to do with X,Y,Z velocities and fact that for example directional jumps take info about direction vector from X-Z velocity part of TRAM (Y vector is in ONCC)
::Unknown, but maybe it has something to do with {x,y,z} velocities and the fact that directional jumps, for example, take information about their direction vector from the {x,z} velocity part of the TRAM (the vertical Y component is in the ONCC).
:ThrowSource
:ThrowSource
:::unknown, throws use it
::Unknown, but throws use it.
:ThrowTarget
:ThrowTarget
:::if set, then animation can hurt anybody, with its attack part, including teammates. User of TRAM can even hurt himself with "damage part" (user cannot hurt himself with own attack parts). It also allows two (try more, get crash ^_^) attack parts to be executed instead of only one (maybe bug?).
::Animation can hurt anybody with its attack part, including teammates. The player can even hurt himself with the TRAM's damage part (whereas a player cannot hurt himself with his own animation's attack part). It also allows two attack parts to be executed instead of only one (maybe a bug? more than two will result in a crash).
::::-If you set first attack part to be able to deal damage from 1st to 100th frame of TRAM, and second attack part to deal damage within that limit (e.g. from 25th to 41st frame, it can be again from 1 to 100), than first attack part an hurt from 1st to 100th (as usual), but even if it hits, that second one attack part (25th to 41st) can hurt enemy as well during "its lifetime". So two attack parts are allowed to execute. Note that second attack part MUST be executed while first attack part has active "window", otherwise it won't work.
:::If you set the first attack part to be able to deal damage from the 1st to the 100th frame of the TRAM, and the second attack part to deal damage within that range (e.g. from the 25th to the 41st frame), then the first attack part will deal damage from the 1st to the 100th frame (as usual), but even if it hits, that second attack part can the hurt enemy as well during frames 25–41. Note that the second attack part must be executed within the first attack part's active "window", otherwise it won't work.
:RealWorld
:RealWorld
:::It appears this flag was used to create TRAM and OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions because that way a character can move over obstacles/gaps. The very most of them are used in cutscenes.
::It appears this flag was used to create a TRAM and an OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions, allowing a character to move over obstacles/gaps. The vast majority of them are used in cutscenes.
:DoAim
:DoAim
:::forces aim animation (PIS/RIF) if user has weapon
::Applies the aiming animation overlay (PIS/RIF) if the player has a weapon.
:::(used PIS/RIF animation and prone)
:DontAim
:DontAim
:::forces not to aim
::An aiming overlay will not be applied.
:CanPickup
:CanPickup
:::can pickup items in this animations, not like it plays pickup one, but like it "takes" the item if you have this animation on and you collide with item.
::Player can pick up an item during this animation if he intersects with one during his movement.
:Aim360
:Aim360
:::unknown
::Unknown.
:DisableShield
:DisableShield
:::if user had active supershield (chr_super "name" 1), this forces him to disable it (chr_super "name" 0) -[[User:Loser|Loser]]
::If the player has an active supershield (chr_super "name" 1), this forces him to disable it (chr_super "name" 0)
:NoAIPickup
:NoAIPickup
:::AI2 are not permitted to pick up items with this animations
::AIs are not permitted to pick up items with this animation.
|-
|-
| <Atomic>
| <Atomic>
Line 238: Line 221:
|valign="top"| <UsedBones>
|valign="top"| <UsedBones>
|valign="top"| flag
|valign="top"| flag
| "<UsedBones />" if unsued.
|Simply contains "<UsedBones />" if no bones are involved, otherwise:
:Pelvis
:Pelvis
:LeftThigh
:LeftThigh
Line 260: Line 243:
|valign="top"| <ReplacedBones>
|valign="top"| <ReplacedBones>
|valign="top"| flag
|valign="top"| flag
| "<ReplacedBones />" if unused.
| "<ReplacedBones />" if unused, otherwise:
:Pelvis
:Pelvis
:LeftThigh
:LeftThigh
Line 318: Line 301:
| <FinalRotation>
| <FinalRotation>
| float
| float
| final rotation in degrees
| Ending rotation in degrees.
|-
|-
|valign="top"| <Direction>
|valign="top"| <Direction>
Line 339: Line 322:
| <Impact>
| <Impact>
| link
| link
| "<Impact />" if unsued.
| "<Impact />" if unused.
|-
|-
| <Particles>
| <Particles>
Line 443: Line 426:
| <Name>
| <Name>
| char[32]
| char[32]
| <font color="#777777">OSBD</font>file<font color="#777777">.imp.oni</font> <font color="#777777">(don't use file prefix/suffix)</font>
| <font color="#777777">OSBD</font>file<font color="#777777">.imp.oni</font> <font color="#777777">(don't use resource type's prefix or suffix)</font>
|-
|-
| <Start>
| <Start>
| int16
| int16
| the frame when the sound starts to play
|The frame when the sound starts to play.
|-
|-
| <Heights>
| <Heights>
Line 455: Line 438:
| <Height>
| <Height>
| float
| float
| absolute position
|Absolute position.
|-
|-
| <Velocities>
| <Velocities>
Line 463: Line 446:
| <Velocity>
| <Velocity>
| 2 x float
| 2 x float
| relative positions
|Relative positions.
|-
|-
| <Rotations>
| <Rotations>
Line 471: Line 454:
| <Bone>
| <Bone>
| parent tag
| parent tag
| There are 19 bone tags. One for each [[TRIA#Bones|body part]].
|There are 19 bone tags, one for each [[TRIA#Bones|body part]].
|-
|-
| <EKey>
| <EKey>
| int8 + 3 * float
| int8 + 3 * float
| for normal animations. The first value specifies the frames number for which the rotation applies, the sum of all of these first numbers for all the EKey elements always equals to the total number of frames for the animation.
|For normal animations. The first value is the number of frames for which the rotation is maintained; the sum of all of these first EKey components always equals the total number of frames for the animation.
|-
|-
|valign="top"| <QKey>
|valign="top"| <QKey>
|valign="top"| int8 + 4 * float
|valign="top"| int8 + 4 * float
| for overlay animations used by [[TRAS|TRAS]]
|For overlay animations used by [[TRAS|TRAS]] aiming screens.


onisplit v0.9.54.0 produces <QKeys> (quaternions) instead of (euler rotations) <EKey> for normal animations
OniSplit v0.9.54.0 produces <QKey>s (quaternions) instead of <EKey>s (Euler rotations) for normal animations.
|-
|-
| <PositionOffset>
| <PositionOffset>
| parent tag
| parent tag
| <PositionOffset> and <Positions> belong together. In the [[OBD:TRAM/raw0x30|binaries]] they are written in the place.
| <PositionOffset> and <Positions> belong together. In the [[OBD:TRAM/raw0x30|binaries]], they are written in place.
|-
|-
| <X>
| <X>
Line 559: Line 542:
----
----
About the naming:
About the naming:
: "fw" = face to face throw
: "fw" = face-to-face throw
: "bk" = thrower is facing victim's back
: "bk" = thrower is facing victim's back
: "throw" inside TRAM names are sometimes shortened with "thr"
: "throw" inside TRAM names is sometimes shortened to "thr"
: "p" can also be missing
: "p"/"k" = triggered by punch or kick button ("p" can also be omitted)
|-
|-
| <SelfDamage>
| <SelfDamage>
Line 574: Line 557:
| <Points>
| <Points>
| int16
| int16
| damage taken by character
| Damage taken by character.
|-
|-
| <Frame>
| <Frame>
| int16
| int16
| frame of the animation, when damage is dealt
| Frame of the animation when damage is dealt.
|-
|-
| <Attacks>
| <Attacks>
Line 586: Line 569:
|valign="top"| <Attack>
|valign="top"| <Attack>
|valign="top"| parent tag
|valign="top"| parent tag
| Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frames of both attack parts are overlapping then the target can be [http://oni.bungie.org/community/forum/viewtopic.php?pid=39787#p39787 hit by both of them].
| Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frame ranges of both attack parts are overlapping, then the target can be [http://oni.bungie.org/community/forum/viewtopic.php?pid=39787#p39787 hit by both of them].
|-
|-
| <Start>
| <Start>
| int16
| int16
| First frame where damage can be inflicted to an opponent.
| First frame where damage can be inflicted on an opponent.
|-
|-
| <End>
| <End>
| int16
| int16
| Last frame where damage can be inflicted to an opponent.
| Last frame where damage can be inflicted on an opponent.
|-
|-
| <Bones>
| <Bones>
| flag
| flag
| Set here the bones that can inflict damage.
| The bones which can inflict damage.
|-
|-
|valign="top"| <Flags>
|valign="top"| <Flags>
Line 604: Line 587:
|
|
: Unblockable
: Unblockable
: Low - blocker needs to crouch
: Low - Target of attack needs to crouch in order to block this attack.
: High - blocker needs to stand; if Low and High are set then blocker can block from stand and crouch
: High - Blocker needs to stand; if Low and High are set then blocker can block from both standing and crouching positions.
: HalfDamage - the blocker gets half of the damage
: HalfDamage - Blocker receives half of the normal damage.
|-
|-
| <Knockback>
| <Knockback>
| float
| float
| Target gets knockbacked by this amount.
| Target gets "knockback"ed by this amount.
|-
|-
| <HitPoints>
| <HitPoints>
| int16
| int16
| damage points
| Damage points inflicted by attack.
|-
|-
| <HitType>
| <HitType>
| flag
| flag
| Animation type for opponent's animation when attack isn't blocked.
| Animation type for opponent's animation when the attack isn't blocked.
|-
|-
| <HitLength>
| <HitLength>
| int16
| int16
| Number of frames for how long should blocking char remain in hit anim when he gots hit.
| Number of frames for how long the target should remain in his "hit" animation state when he gets hit.
|-
|-
| <StunLength>
| <StunLength>
| int16
| int16
| Number in frames for how long should blocking char remain in blocking animation.
| Number in frames for how long the target should remain in his blocking animation when he blocks the attack.
|-
|-
| <StaggerLength>
| <StaggerLength>
| int16
| int16
| Number of frames for how long should blocking char perform stagger anim after sucessful block.
| Number of frames for how long the target should perform his "stagger" animation after a successful block.
|-
|-
| <Extents>
| <Extents>
| parent tag
| parent tag
| Gets calculated by onisplit if there's a dae file referenced in xml.
| Explained below. Automatically calculated by OniSplit if there's a DAE file referenced in XML.
|-
|-
| <Extent>
| <Extent>
| parent tag
| parent tag
| One tag per frame. In numbers: attack end - attack start + 1. (E.g. start=5; end=6; it makes 2 involved frames.)
| One tag per frame.
|-
|-
| <Angle>
| <Angle>
| float
| float
| In degree.
| In degrees.
|-
|-
| <Length>
| <Length>
Line 658: Line 641:
|valign="top"| <AttackRing>
|valign="top"| <AttackRing>
|valign="top"|  parent tag
|valign="top"|  parent tag
| Contains always 36 <Length> tags, no more, no less. Gets calculated by onisplit if there's a dae file referenced in xml. (The AttackRing was formerly know as horizontal extents.)
| Always contains 36 <Length> tags, explained below. Automatically calculated by OniSplit if there's a DAE file referenced in the XML. (AttackRing was formerly known as "horizontal extents" in older versions of OniSplit.)
|-
|-
|valign="top"| <Length>
|valign="top"| <Length>
|valign="top"| float
|valign="top"| float
| Horizontal extents in 10° intervals. They make a ''zone of danger'' so the AI knows that the animation is harmful there. (It give them the chance to dogde an attack.)
| Horizontal extents, explained below. They create a "danger zone" around the attacker so that the AI has a chance to dodge an attack.
|}
|}


===Extents and XML===
===Extents and XML===
Ever wondered how comes Artificial Intelligence can recognize incoming attack and block or dodge? Extents ( found out by Geyser and fully uncovered by Neo ) are the key.
Ever wondered how the AI can recognize incoming attacks and block or dodge them? Extents (found by geyser and fully uncovered by Neo) are the key. Imagine the character looked at from above, and visualize a circle with this character being at the center of the circle. Now divide this circle into 10° segments, and those are the 36 units of horizontal extents (that is, the lateral reach of the attack). The 0° point is directly in front of the character and 180° is behind the character. The segments run clockwise around the character. So the first Extent tag is the horizontal reach on the 0° line, the second tag is for the line 10° clockwise, and so on. Note that a frontal attack like a simple kick could hit a target not only if he's standing at 0° (directly in front), but also at 10° or 20° to the right, and also at 340° and 350° (a bit to the left). When setting these manually, you should guess the inner and outer ranges of the reach of the attacker's bones that have damage attached to them. Test these values with an AI that blocks often. If you did it right, your attack will often be blocked, but if the extent length is too high, the AIs will react when too far from you, which does not look good.


There are two types of extents -
There are two types of extents:
*'''<Extents>''', its packages store this info:
*'''<Extents>''' stores this info:
::<Angle> at which is this extent radiated from character. 0° is in front of character, 180° is in the back
::<Angle> at which this extent radiates from the character.
::<Length> of this extent,
::<Length> of this extent.
::<MinY> minimal height of this extent
::<MinY> minimal height of this extent.
::<MaxY> maximal height of this extent
::<MaxY> maximum height of this extent.
:Length, MinY and MaxY serve for creating invisible area in space which is "dangerous to be in". If AI collides and notices it (refer to notice field in [[MELE]]), it will attempt to block or dodge according to its modifiers in given MELE profile. Again, see fields in [[MELE]].
:Length, MinY and MaxY serve to create an invisible area in space which is "dangerous to be in". If an AI intersects with this area and notices it (refer to the Notice field in [[MELE]]), it will attempt to block or dodge according to its modifiers in its MELE profile (again, see the MELE page).
::: Number of <Extent> is equal to attack frames: <End> minus <Start> plus one (because start frame counts too).
::The number of <Extent>s is equal to the number of attack frames: <End> minus <Start> plus one (because start frame counts too). For example, for TRAMKONCOMkick_low1: <End>30</End> minus <Start>22</Start> plus one = 9 <Extent>s.
:::: (e.g. TRAMKONCOMkick_low1: <End>30</End> minus <Start>22</Start> plus one = nine <Extent>.)
 
:These extents are pretty impossible to guess, so leave them until Neo comes up with extent computation ( probably from attack bones and bonetrack rotations ).
:;BUT
:Always add at least one package, because its Length, MinY and MaxY will be taken as the longest extent, the most maximal Y and the most minimal Y vales. Those are needed, otherwise character won't react to this attack.
 
*'''<HorizontalExtents>''', its packages store this info:
::36 fields (exactly 36, no more, no less, otherwise it won't compile back into .oni file), which correspond to areas in 10° intervals around character ( so overall 360°, full horizontal circle around character).
 
::Imagine character. Look at it from above. Make a circle with this character being center of this circle. Now divide this circle with lines after each 10°; and those are horizontal extent lines used by packages ^_^.
::Once more 0° is in front of the character, 180° is behind character. Intervals go clockwise. So first package is horizontal extent for 0° line, second package is for horizontal line which is 10° clockwise and so on.
 
::These extents can be guessed up to some degree. Use common sense, look at Your custom attack and tip which lines are probably intersected by attacking limbs of Your move.
::Watch out - if attack is frontal ( direct kick forward ), you should worry not only about 0° (directly front), but also about 10°, 20° (a bit to the right) and also about 340°, 350° (a bit to the left).
::Next guess the length (you will get used to the sense of distance soon), write it in, test it with some AI which blocks a lot. If you did it right, Your attack will be often blocked.
::Don't overdo it with horizontal extent length - too long will cause AIs to react too far from you, does not look pretty.
 
Have extended fun, --[[User:Loser|Loser]] 19:12, 13 July 2010 (UTC)


:These extents are pretty impossible to guess, so leave them alone until Neo comes up with extent computation (probably from attack bones and bone rotations). However, always add at least one set of component tags, because those Length, MinY and MaxY components will be taken as the longest extent, the highest Y value, and the lowest Y value. Without those, a character won't react to this attack.


*'''<HorizontalExtents>''' stores this info:
::36 fields (exactly 36, otherwise it won't compile back into a .oni file), which correspond to areas in 10° intervals around the character as described above.


===Adding colorful trails===
===Adding colorful trails===
Open the xml formated TRAM and search for the "Particles" tag and insert your code.
Open the XML-accompanied TRAM, search for the "Particles" tag, and insert your markup.


First example: TRAMSTRCOMcomb_p_p.xml
First example: TRAMSTRCOMcomb_p_p.xml
Line 713: Line 681:
         </Particles>
         </Particles>


"contrail" is looked up by the used character class (ONCC) which lunch the actual particle, here it is "h2h_strtrail_e01".
"contrail" is looked up by the character class (ONCC) that emits the actual particle; here it is "h2h_strtrail_e01".


 
This second example is about creating two different contrails in a TRAM at the same time. The animation is "TRAMSTRCOMpunch_heavy.xml".
Second example is about two different contrails in one TRAM at same time. The animation is "TRAMSTRCOMpunch_heavy.xml".


[[Image:Different_contrails_in_attack.png|right|thumb]]
[[Image:Different_contrails_in_attack.png|right|thumb]]
Line 735: Line 702:
         </Particles>
         </Particles>


Note that you need to register the second contrail in the used ONCC as well. Using your own contrail particle is also possible, just insert it's name between the <Type> tags.
Note that you need to register the second contrail in the ONCC as well. Using your own contrail particle is also possible; just insert its name between the <Type> tags.


             <ONCPParticle>
             <ONCPParticle>
Line 770: Line 737:
:Do not add an AttackRing section after Attacks.
:Do not add an AttackRing section after Attacks.
:4. Import this with "-create dest_folder TRAMsomething.xml". The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.
:4. Import this with "-create dest_folder TRAMsomething.xml". The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.
:5. If you need this information for a patch mod, run "-extract:xml" on the TRAMsomething.oni you've created, <u>without</u> using "-anim-body". Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the Domino Knockdowns mod.
:5. If you need this information for a patch mod, run "-extract:xml" on the TRAMsomething.oni you've created, <u>without</u> using "-anim-body". Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the [http://mods.oni2.net/node/311 Domino Knockdowns] mod.
 
<!-- Careful what you post here Paradox, TRAM XML format is changing a little bit in the next Onisplit -->


<!-- Careful what you post here Paradox, TRAM XML format is changing a little bit in the next OniSplit -->
==Throws==
==Throws==
Throws target animation are registered in the TRAC of the throw initiator (a.k.a. throw source). Target animations are forced onto the other character removing the need to have that animation in target TRAC.
Throw target animations are registered in the TRAC of the throw initiator (AKA the throw source). Target animations are forced onto the other character, removing the need to have that animation in the target's TRAC. Throw target (TRAM*tgt) animations can cover only up to 256 (0-255) frames.
 
Throw target (TRAM*tgt) animations can cover only up to 256 (0-255) frames.
 
 
==Fw throws==
Situation: you load two chars into Mod Tools and rotate (+/-180°) the throw target char because you want them to stand face to face. When you are done animating, the target animation would need to be reversed again: multiplying the velocities with -1, also the rotation needs a tweak. So far it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the y rotation.


===Excel macro to tweak fw throws===
==Forward throws==
* put your files into the "input_and_output" folder
Scenario: you load two characters into Mod Tool and rotate (+/-180°) the throw target character because you need them to stand face to face as you work on an animation. When you are done animating, the target animation would need to be reversed again. This means multiplying the velocities by -1; the rotation also needs correcting. So it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the y rotation.
* disable macro security if you don't want to click every time on the macro option button
* close other worksheets first before you run the macro
* if you are not afraid of VBA code you can enter the developer environment by hitting [alt]+[F11], e.g. for extending the attack library with more screenshots and settings
** in that case search for: "LibraryThrows", " LibraryAttack", "Picture", "CBAttackHelp.AddItem"


* [http://dl.dropbox.com/u/139715/OniGalore/TRAM_macro.zip the macro] (for all TRAM except overlay-TRAM), [http://youtu.be/wxzJ8ahjP8k demo vid]
===Excel macro to tweak forward throws===
* [http://dl.dropbox.com/u/139715/OniGalore/TRAM_macro.zip Here's the macro] (for all TRAMs except overlays). [http://youtu.be/wxzJ8ahjP8k Demo vid here]. Usage:
* Put your files into the "input_and_output" folder.
* Disable macro security if you don't want to have to click on the macro options button every time.
* Close other worksheets before you run the macro.
* If you are not afraid of VBA code, you can enter the dev environment by hitting Alt+F11. If you want to extend the attack library with more screenshots and settings, search for: "LibraryThrows", " LibraryAttack", "Picture", and "CBAttackHelp.AddItem".


[[Image:Animation_macro_v4.png|right|thumb]]
[[Image:Animation_macro_v4.png|right|thumb]]


 
==Run animations==
==A look on run move complex==
Here's a breakdown of the Striker's run animations, meant as an illustration for what would be needed to make new run TRAMs.
Example on Striker's moves, meant as illustration for "what would be needed for new run trams".
 


Run cancel:
Run cancel:
Line 805: Line 764:
* STRIKEidle1 / another idle animation
* STRIKEidle1 / another idle animation


 
Run ''a minimal cycle'':
Run - ''a minimal cycle'':
* STRIKEidle1 / another idle animation
* STRIKEidle1 / another idle animation
* STRIKErun1stepa
* STRIKErun1stepa
Line 815: Line 773:
* STRIKEidle1 / another idle animation
* STRIKEidle1 / another idle animation


Start looking on the image most right.
Follow the images below from right to left.
<gallery>
<gallery>
Image:XML_TRAM_STRIKErunstop.png|STRIKErunstop
Image:XML_TRAM_STRIKErunstop.png|STRIKErunstop
Line 823: Line 781:
Image:XML_TRAM_STRIKErun1stepa.png|STRIKErun1stepa
Image:XML_TRAM_STRIKErun1stepa.png|STRIKErun1stepa
</gallery>
</gallery>


==List of unused animations==
==List of unused animations==
Line 829: Line 786:


===From the original game===
===From the original game===
* KONOKOconsole_punch           what the name says (the engine can use that animation depending on the console's configuration, see [[OBD:BINA/OBJC/CONS|CONS]])  
* KONOKOconsole_punch: what the name says (the engine can use that animation depending on the console's configuration, see [[OBD:BINA/OBJC/CONS|CONS]])  
* KONOKOlev3_intro looks like she was placing something (bomb?) and then running away
* KONOKOlev3_intro: looks like she was placing something (bomb?) and then running away
* KONOKOlev4_undress from an official aborted cutscene
* KONOKOlev4_undress: from an aborted clothes-changing cutscene
* KONOKOlev16_bomb             planting a bomb
* KONOKOlev16_bomb: planting a bomb
* KONCOMsuper_kick now used in OTA scripts (mod) as spawn event
* KONCOMsuper_kick: now used in OTA scripts (mod) as spawn event
* KONCOMsuper_punch KONCOMpunch_heavy but without ''attack name shout'', HalfDamage, and makes 10 less damage in first attack part
* KONCOMsuper_punch: KONCOMpunch_heavy but without the shouted attack name, has HalfDamage flag, and does 10 less damage in its first attack part
* COMPISidle_special1 comguy checking environment and his gun (it's actually used if you wait long enough, isn't it?)
* COMPISidle_special1: Comguy checking environment and his gun (meant for a feature that would visually depict an elevation in the AI's level of alertness after, say, hearing a noise)
* STRPISidle_special1 striker showing off his gun, whatever (it's actually used if you wait long enough, isn't it?)
* STRPISidle_special1: Striker checking his his gun and communicating with an ally (another unused alertness animation)
* THUGlev1_direct thug probably directing a truck driver
* THUGlev1_direct: Thug probably directing a truck driver


===From modders===
===From modders===
Following files are available in DAE (and maybe ONI format).
The following files are available in DAE (and maybe .oni format).


[[Image:female_stun.jpg|right|thumb|charA and charB performing stun animations]]
[[Image:female_stun.jpg|right|thumb|charA and charB performing stun animations]]


* [https://www.dropbox.com/s/5d6aki276ryb61y/REDCOMjump_fw_crouch--double_flip--dae.zip?dl=0 Fury double flip] (.dae)
* [https://www.dropbox.com/s/5d6aki276ryb61y/REDCOMjump_fw_crouch--double_flip--dae.zip?dl=0 Fury double flip] (.dae)
** note: -
* [https://www.dropbox.com/s/dww2hf1yj6e7wqa/KONenter_prone_mode--oni_and_dae.zip?dl=0 Konoko enters prone mode] (.dae + .oni)
* [https://www.dropbox.com/s/dww2hf1yj6e7wqa/KONenter_prone_mode--oni_and_dae.zip?dl=0 Konoko enters prone mode] (.dae + .oni)
** note: prone mode artefact
* [https://www.dropbox.com/s/3llicjdxbva836p/KONprone_getup--dae.zip?dl=0 Konoko leaves prone mode] (.dae)
* [https://www.dropbox.com/s/3llicjdxbva836p/KONprone_getup--dae.zip?dl=0 Konoko leaves prone mode] (.dae)
** note: prone mode artefact
** These are artifacts of Paradox's work on his [http://mods.oni2.net/node/119 Prone Mode] mod.
* [https://www.dropbox.com/s/luf7ayqikcuupo7/female_stun--dae.zip?dl=0 female stun (throw pair)] (.dae)
* [https://www.dropbox.com/s/luf7ayqikcuupo7/female_stun--dae.zip?dl=0 Female stun (throw pair)] (.dae)
** note: needs to be slowed down (-> more frames)
** Needs to be slowed down by adding more frames.




{{XML}}
{{XML}}

Revision as of 03:31, 4 February 2019

TRAM : Totoro Animation
XML modding tips
  • See HERE to start learning about XML modding.
  • See HERE if you are searching for information on how to handle object coordinates.
  • See HERE for some typical modding errors and their causes.
XML.png
XML

TRAC << Other file types >> TRAS

switch to OBD page

Export

TRAM files can be extracted A) as pure XML files or B) as a pair of XML and DAE files. For editing the actual animation, you will want to use method B. While exporting an ONCC, you might see errors such as:

Cannot find instance 'TRAMKONCOMthrow_rev'
Cannot find instance 'TRAMKONCOMthrow_rev'
Cannot find instance 'TRAMKONRIFturn_right'
Cannot find instance 'TRAMKONOKOlev18_ZomStand'
Cannot find instance 'TRAMKONOKOcorner_hide'
Cannot find instance 'TRAMKONPIScorner_hide'

Ignore them, as those files doesn't exist. (Someday we should remove them from the TRACs.)

Via command line

To export a single TRAM:

onisplit -extract:xml output_path -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname.oni

To export merged TRAMs:

onisplit -extract:xml output_path -anim-merge -anim-body:path_to\TRBS_or_ONCCname.oni path_to\TRAMname1.oni  path_to\TRAMnameN.oni

Via Vago

combined extraction of dae and xml

When you start Vago, the "General" tab should be open by default. If not, click on it. Then follow these five easy steps.

Step 1: Select "ONI" as input format ("From").

Step 2: Select "XML" as output format ("To").

Step 3: Check "Another TRAM" to chose a character animation file.

Step 4: Click "Add" button to choose an ONCC file.

Step 5: Click "Convert".

Via Simple OniSplit GUI

There was a long-standing problem with combined ONCC/TRAM files where the textures would be missing.

Simple OniSplit GUI post-edits the DAE to fix missing textures. The character-related .oni files must be all in one folder. Usually the level0_Final folder does the trick.

Step 1: Drag and drop TRAM and ONCC into the big field. (One by one or simultaneously; the order doesn't matter.)

Step 2: Hit "Convert".

Editing the actual animation

You can load the DAE file into a compatible editor. So far, the community's favorite is (formerly "XSI") Mod Tool.

  • For the correct Mod Tool settings, see HERE.
  • Tutorial: Basics of Oni animation editing (to do)

Import

Revisited animations

http://oni.bungie.org/forum/viewtopic.php?id=1433

Condensed knowledge coming soon.

Totally new animations

Coming soon.

File structure

TRAM
  |
  +-- header: animation type, state, flags, particle, sounds, etc.
  +-- actual animation: heights, velocities, rotations
  +-- additional data: positions, throw adjustments, self-damage, attack parts, extents

List of tags, types, and flags

Use the search function of your web browser to quickly find a tag.

(work in progress)

tag type description
<Lookup> parent tag
<Type> flag Look them up over HERE.
<AimingType> flag Look them up over HERE.
<FromState> flag Look them up over HERE.
Sometimes FromState is set to "None"; in other scenarios, one FromState value is not enough.
In those cases Shortcuts are used. They extend the number of states from which an animation can be played and under what conditions (replacing this atomic yes/no).
<ToState> flag Look them up over HERE.
<Varient> flag (misspelled because Oni misspells it) If unused, tag will be simply "<Varient />", such as for non-combat animations. Otherwise contains one of these values:
Combat
LeftPistol
LeftRifle
Panic
RightPistol
RightRifle
Sprint
<FirstLevel> int16 Number of first level in which move becomes available to the player ("0" to make it available from the start).
<Shortcuts> parent tag
<Shortcut> parent tag
<FromState> flag Look them up over HERE.
<Length> int16
<ReplaceAtomic> flag
yes
no
<Flags> flag
RuntimeLoaded
(This bit is not stored on disk; it is used at runtime to mark that the animation was loaded.)
Invulnerable
While playing this animation, the player is invulnerable to melee damage and also cannot be thrown. Damage from particles and fall damage still hurt.
BlockHigh
While playing this animation, the player is invulnerable to high or undefined attacks within some arc in front of him. If you set this flag on an animation where the player character is spinning, then the character can still be kicked in the back or thrown.
BlockLow
Same as above, only it can block low or undefined attacks.
Attack
Animations with an attack part have this turned on. Uncertain what it does, but it may enable the melee soft-lock (where the character turns a bit during the animation to face a nearby enemy).
DropWeapon
If the player is armed, he drops his weapon when this animation plays.
InAir
Something to do with jumps; not investigated.
Atomic
The whole animation must be played; player cannot interrupt it once it starts.
NoTurn
Player cannot turn by mouse while performing this animation.
AttackForward
Unknown, but it looks like this is rough info for the AI about where an attack is aiming, from the player's point of view.
AttackLeft
Same as above.
AttackRight
Same as above.
AttackBackward
Same as above.
Overlay
Not a standalone animation; it just overwrites part of an already-playing one, e.g. the weapon-holstering animation.
DontInterpolateVelocity
Unknown, but maybe it has something to do with {x,y,z} velocities and the fact that directional jumps, for example, take information about their direction vector from the {x,z} velocity part of the TRAM (the vertical Y component is in the ONCC).
ThrowSource
Unknown, but throws use it.
ThrowTarget
Animation can hurt anybody with its attack part, including teammates. The player can even hurt himself with the TRAM's damage part (whereas a player cannot hurt himself with his own animation's attack part). It also allows two attack parts to be executed instead of only one (maybe a bug? more than two will result in a crash).
If you set the first attack part to be able to deal damage from the 1st to the 100th frame of the TRAM, and the second attack part to deal damage within that range (e.g. from the 25th to the 41st frame), then the first attack part will deal damage from the 1st to the 100th frame (as usual), but even if it hits, that second attack part can the hurt enemy as well during frames 25–41. Note that the second attack part must be executed within the first attack part's active "window", otherwise it won't work.
RealWorld
It appears this flag was used to create a TRAM and an OBAN from one animation source. The OBAN is supposed to store pelvis rotations and positions, allowing a character to move over obstacles/gaps. The vast majority of them are used in cutscenes.
DoAim
Applies the aiming animation overlay (PIS/RIF) if the player has a weapon.
DontAim
An aiming overlay will not be applied.
CanPickup
Player can pick up an item during this animation if he intersects with one during his movement.
Aim360
Unknown.
DisableShield
If the player has an active supershield (chr_super "name" 1), this forces him to disable it (chr_super "name" 0)
NoAIPickup
AIs are not permitted to pick up items with this animation.
<Atomic> parent tag
<Start> int16
<End> int16
<Invulnerable> parent tag
<Start> int16
<End> int16
<Overlay> parent tag
<UsedBones> flag Simply contains "<UsedBones />" if no bones are involved, otherwise:
Pelvis
LeftThigh
LeftCalf
LeftFoot
RightThigh
RightCalf
RightFoot
Mid
Chest
Neck
Head
LeftShoulder
LeftArm
LeftWrist
LeftFist
RightShoulder
RightArm
RightFist
<ReplacedBones> flag "<ReplacedBones />" if unused, otherwise:
Pelvis
LeftThigh
LeftCalf
LeftFoot
RightThigh
RightCalf
RightFoot
Mid
Chest
Neck
Head
LeftShoulder
LeftArm
LeftWrist
LeftFist
RightShoulder
RightArm
RightFist
<DirectAnimations>
<Link> link First slot. "<Link />" if unused.
<Link> link Second slot. "<Link />" if unused.
<Pause>
<Hard> int16
<Soft> int16
<Interpolation>
<End> int16
<Max> int16
<FinalRotation> float Ending rotation in degrees.
<Direction>
None
Forward
Backward
Left
Right
<Vocalization>
<ActionFrame>
<Impact> link "<Impact />" if unused.
<Particles> parent tag
<Particle> parent tag
<Start>
<End>
<Bone> flag
<Name> link
<MotionBlur> parent tag
<MotionBlur> parent tag sequence element
<Bones> flag
Pelvis
LeftThigh
LeftCalf
LeftFoot
RightThigh
RightCalf
RightFoot
Mid
Chest
Neck
Head
LeftShoulder
LeftArm
LeftWrist
LeftFist
RightShoulder
RightArm
RightFist
<Start> int16
<End> int16
<Lifetime> int8
<Alpha> int8
<Interval> int8
<Footsteps> parent tag
<Footstep> parent tag
<Frame> int16
<Type> flag
Left
Right
<Sounds> parent tag "<Sounds />" if unused.
<Sound> parent tag
<Name> char[32] OSBDfile.imp.oni (don't use resource type's prefix or suffix)
<Start> int16 The frame when the sound starts to play.
<Heights>
<Height> float Absolute position.
<Velocities> parent tag
<Velocity> 2 x float Relative positions.
<Rotations> parent tag
<Bone> parent tag There are 19 bone tags, one for each body part.
<EKey> int8 + 3 * float For normal animations. The first value is the number of frames for which the rotation is maintained; the sum of all of these first EKey components always equals the total number of frames for the animation.
<QKey> int8 + 4 * float For overlay animations used by TRAS aiming screens.

OniSplit v0.9.54.0 produces <QKey>s (quaternions) instead of <EKey>s (Euler rotations) for normal animations.

<PositionOffset> parent tag <PositionOffset> and <Positions> belong together. In the binaries, they are written in place.
<X> int16
<Z> int16
<Positions> parent tag
<Position> parent tag
<Height> float vertical extent
<YOffset> float y offset of the vertical extent from character location
<ThrowSource> parent tag "<ThrowSource />" if unused.
<TargetAdjustment> parent tag
<Position> 3 * float
<Angle> float
<Distance> float
<TargetType> flag The flags are part of the animation type list.

(static throws)

Thrown1 = ###COMthrow_fw_p_tgt
Thrown2 = ###COMthrow_fw_k_tgt
Thrown3 = ###COMthrow_bk_p_tgt
Thrown4 = ###COMthrow_bk_k_tgt

(running throws)

Thrown4 = ###COMrun_throw_fw_p_tgt
Thrown6 = ###COMrun_throw_fw_p_tgt
Thrown7 = ###COMrun_throw_bk_k_tgt
Thrown8 = ###COMrun_throw_bk_k_tgt (not tested)

(tackle throw = catching)

Thrown9 = ###COMrun_tkl_fw_p_tgt (not tested)
Thrown10 = ###COMrun_tkl_bk_p_tgt

(pistol disarms)

Thrown11 = ###PISthrow_fw_p_tgt
Thrown12 = ###PISthrow_fw_k_tgt
Thrown13 = ###PISthrow_bk_p_tgt

(rifle disarm)

Thrown14 = ###PISthrow_bk_k_tgt (not tested)
Thrown15 = ###RIFthrow_fw_p_tgt
Thrown16 = ###RIFthrow_bk_p_tgt
Thrown17 = ###RIF? = (not tested)

About the naming:

"fw" = face-to-face throw
"bk" = thrower is facing victim's back
"throw" inside TRAM names is sometimes shortened to "thr"
"p"/"k" = triggered by punch or kick button ("p" can also be omitted)
<SelfDamage> parent tag "<SelfDamage />" if unused.
<Damage> parent tag sequence element
<Points> int16 Damage taken by character.
<Frame> int16 Frame of the animation when damage is dealt.
<Attacks> parent tag
<Attack> parent tag Only 2 attack parts per file are allowed. Normally the target gets only one hit. But if the attack frame ranges of both attack parts are overlapping, then the target can be hit by both of them.
<Start> int16 First frame where damage can be inflicted on an opponent.
<End> int16 Last frame where damage can be inflicted on an opponent.
<Bones> flag The bones which can inflict damage.
<Flags> flag
Unblockable
Low - Target of attack needs to crouch in order to block this attack.
High - Blocker needs to stand; if Low and High are set then blocker can block from both standing and crouching positions.
HalfDamage - Blocker receives half of the normal damage.
<Knockback> float Target gets "knockback"ed by this amount.
<HitPoints> int16 Damage points inflicted by attack.
<HitType> flag Animation type for opponent's animation when the attack isn't blocked.
<HitLength> int16 Number of frames for how long the target should remain in his "hit" animation state when he gets hit.
<StunLength> int16 Number in frames for how long the target should remain in his blocking animation when he blocks the attack.
<StaggerLength> int16 Number of frames for how long the target should perform his "stagger" animation after a successful block.
<Extents> parent tag Explained below. Automatically calculated by OniSplit if there's a DAE file referenced in XML.
<Extent> parent tag One tag per frame.
<Angle> float In degrees.
<Length> float
<MinY> float
<MaxY> float
<AttackRing> parent tag Always contains 36 <Length> tags, explained below. Automatically calculated by OniSplit if there's a DAE file referenced in the XML. (AttackRing was formerly known as "horizontal extents" in older versions of OniSplit.)
<Length> float Horizontal extents, explained below. They create a "danger zone" around the attacker so that the AI has a chance to dodge an attack.

Extents and XML

Ever wondered how the AI can recognize incoming attacks and block or dodge them? Extents (found by geyser and fully uncovered by Neo) are the key. Imagine the character looked at from above, and visualize a circle with this character being at the center of the circle. Now divide this circle into 10° segments, and those are the 36 units of horizontal extents (that is, the lateral reach of the attack). The 0° point is directly in front of the character and 180° is behind the character. The segments run clockwise around the character. So the first Extent tag is the horizontal reach on the 0° line, the second tag is for the line 10° clockwise, and so on. Note that a frontal attack like a simple kick could hit a target not only if he's standing at 0° (directly in front), but also at 10° or 20° to the right, and also at 340° and 350° (a bit to the left). When setting these manually, you should guess the inner and outer ranges of the reach of the attacker's bones that have damage attached to them. Test these values with an AI that blocks often. If you did it right, your attack will often be blocked, but if the extent length is too high, the AIs will react when too far from you, which does not look good.

There are two types of extents:

  • <Extents> stores this info:
<Angle> at which this extent radiates from the character.
<Length> of this extent.
<MinY> minimal height of this extent.
<MaxY> maximum height of this extent.
Length, MinY and MaxY serve to create an invisible area in space which is "dangerous to be in". If an AI intersects with this area and notices it (refer to the Notice field in MELE), it will attempt to block or dodge according to its modifiers in its MELE profile (again, see the MELE page).
The number of <Extent>s is equal to the number of attack frames: <End> minus <Start> plus one (because start frame counts too). For example, for TRAMKONCOMkick_low1: <End>30</End> minus <Start>22</Start> plus one = 9 <Extent>s.
These extents are pretty impossible to guess, so leave them alone until Neo comes up with extent computation (probably from attack bones and bone rotations). However, always add at least one set of component tags, because those Length, MinY and MaxY components will be taken as the longest extent, the highest Y value, and the lowest Y value. Without those, a character won't react to this attack.
  • <HorizontalExtents> stores this info:
36 fields (exactly 36, otherwise it won't compile back into a .oni file), which correspond to areas in 10° intervals around the character as described above.

Adding colorful trails

Open the XML-accompanied TRAM, search for the "Particles" tag, and insert your markup.

First example: TRAMSTRCOMcomb_p_p.xml

Colorful contrail added.png
       <Particles>
           <Particle>
               <StartFrame>0</StartFrame>
               <EndFrame>12</EndFrame>
               <Bone>LeftFist</Bone>
               <Name>contrail</Name>
           </Particle>
       </Particles>

"contrail" is looked up by the character class (ONCC) that emits the actual particle; here it is "h2h_strtrail_e01".

This second example is about creating two different contrails in a TRAM at the same time. The animation is "TRAMSTRCOMpunch_heavy.xml".

Different contrails in attack.png
       <Particles>
           <Particle>
               <Start>0</Start>
               <End>54</End>
               <Bone>RightWrist</Bone>
               <Name>contrail</Name>
           </Particle>
           <Particle>
               <Start>0</Start>
               <End>54</End>
               <Bone>LeftWrist</Bone>
               <Name>contrail_2</Name>
           </Particle>
       </Particles>

Note that you need to register the second contrail in the ONCC as well. Using your own contrail particle is also possible; just insert its name between the <Type> tags.

           <ONCPParticle>
               <Name>contrail</Name>
               <Type>h2h_strtrail_e01</Type>
               <BodyPart>-1</BodyPart>
           </ONCPParticle>
           <ONCPParticle>
               <Name>contrail_2</Name>
               <Type>h2h_murtrail_e01</Type>
               <BodyPart>-1</BodyPart>
           </ONCPParticle>

Adding extents to an existing animation

Let's say that you want to convert a non-attack animation to a damage-dealing animation. Non-attack TRAMs do not have extents information used to notify the AIs about incoming attacks, so how do you generate this information from the animation?

1. Export the animation to XML with a body attached. If you extract using just "-extract:xml dest_folder TRAMsomething.oni", you'll get the 3D animation data inside the XML (namely, the tags Heights, Velocities, Rotations, PositionOffset, and Positions; for an attack animation, you'll also get Attacks and AttackRing, and inside Attacks' elements, each Attack element will have Extents at the end of it).
However, if you extract this same animation using "-extract:xml dest_folder TRAMsomething.oni -anim-body ONCCtramuser.oni", the animation data will be placed in a DAE file along with the character model geometry. Be sure to pick a body with a representative size for the character classes that will actually use this TRAM, because the extents will be calculated from it. The XML file will be very short without the 3D data in it. This is how we want the non-attack TRAM to look. We do not know the extents information that should go in Extents or AttackRing, so we just want to add the part that distinguishes a DAE-extracted attack TRAM XML from a DAE-extracted non-attack TRAM XML. That part is the Attacks section, without the Extents under each Attack.
2. First, consider whether the TRAM should have something added to its Flags section, like Attack or ThrowTarget.
3. Now add to the XML of the non-attack TRAM data in the following format (after the <SelfDamage /> section, typically):
       <Attacks>
           <Attack>
               <Start>1</Start>
               <End>10</End>
               <Bones>RightWrist RightFist</Bones>
               <Flags />
               <Knockback>4</Knockback>
               <HitPoints>10</HitPoints>
               <HitType>KnockdownHead</HitType>
               <HitLength>5</HitLength>
               <StunLength>8</StunLength>
               <StaggerLength>0</StaggerLength>
           </Attack>
       </Attacks>
Do not add an AttackRing section after Attacks.
4. Import this with "-create dest_folder TRAMsomething.xml". The Extents sections and the AttackRing will be calculated by OniSplit from the attached DAE.
5. If you need this information for a patch mod, run "-extract:xml" on the TRAMsomething.oni you've created, without using "-anim-body". Now you can copy the Extents and AttackRing data to your XML patch. For an example of how the patch should look, see the Domino Knockdowns mod.

Throws

Throw target animations are registered in the TRAC of the throw initiator (AKA the throw source). Target animations are forced onto the other character, removing the need to have that animation in the target's TRAC. Throw target (TRAM*tgt) animations can cover only up to 256 (0-255) frames.

Forward throws

Scenario: you load two characters into Mod Tool and rotate (+/-180°) the throw target character because you need them to stand face to face as you work on an animation. When you are done animating, the target animation would need to be reversed again. This means multiplying the velocities by -1; the rotation also needs correcting. So it looks like you need *(-1) for the x rotation and -/+180° (depending on your initial change) for the y rotation.

Excel macro to tweak forward throws

  • Here's the macro (for all TRAMs except overlays). Demo vid here. Usage:
  • Put your files into the "input_and_output" folder.
  • Disable macro security if you don't want to have to click on the macro options button every time.
  • Close other worksheets before you run the macro.
  • If you are not afraid of VBA code, you can enter the dev environment by hitting Alt+F11. If you want to extend the attack library with more screenshots and settings, search for: "LibraryThrows", " LibraryAttack", "Picture", and "CBAttackHelp.AddItem".
Animation macro v4.png

Run animations

Here's a breakdown of the Striker's run animations, meant as an illustration for what would be needed to make new run TRAMs.

Run cancel:

  • STRIKEidle1 / another idle animation
  • STRIKErun1stepa
  • STRIKErun1stepb
  • STRIKEidle1 / another idle animation

Run – a minimal cycle:

  • STRIKEidle1 / another idle animation
  • STRIKErun1stepa
  • STRIKErunstart
  • STRIKErun_rt
  • STRIKErun_lt (optional)
  • STRIKErunstop
  • STRIKEidle1 / another idle animation

Follow the images below from right to left.

List of unused animations

Here are all the known unused animations. These could be reintegrated/recycled/whatever....

From the original game

  • KONOKOconsole_punch: what the name says (the engine can use that animation depending on the console's configuration, see CONS)
  • KONOKOlev3_intro: looks like she was placing something (bomb?) and then running away
  • KONOKOlev4_undress: from an aborted clothes-changing cutscene
  • KONOKOlev16_bomb: planting a bomb
  • KONCOMsuper_kick: now used in OTA scripts (mod) as spawn event
  • KONCOMsuper_punch: KONCOMpunch_heavy but without the shouted attack name, has HalfDamage flag, and does 10 less damage in its first attack part
  • COMPISidle_special1: Comguy checking environment and his gun (meant for a feature that would visually depict an elevation in the AI's level of alertness after, say, hearing a noise)
  • STRPISidle_special1: Striker checking his his gun and communicating with an ally (another unused alertness animation)
  • THUGlev1_direct: Thug probably directing a truck driver

From modders

The following files are available in DAE (and maybe .oni format).

charA and charB performing stun animations