OBD talk:TRAM: Difference between revisions

From OniGalore
Jump to navigation Jump to search
mNo edit summary
m (better note wording)
 
(41 intermediate revisions by 4 users not shown)
Line 1: Line 1:
==HEX area==
===more detailed explanations===
===more detailed explanations===
Hello all ONI fans,
Hello all ONI fans,
This is not guide how to edit TRAM, it is only TRAM explained in more detail in order to help those who would like to modify it. I see it all the time that you discover already discovered and it is '''MY FAULT''' because I didn't share my knowledge X_X. Shame on me. --[[User:Loser|Loser]] 19:50, 20 August 2008 (CEST)
This is not guide how to edit TRAM, it is only TRAM explained in more detail in order to help those who would like to modify it. I see it all the time that you discover already discovered and it is '''MY FAULT''' because I didn't share my knowledge X_X. Shame on me.


http://gumby.oni2.net/runloser.jpg
[[Image:Run Loser.jpg]]


P.S.: And I am [[comguy]] (smart@$$ and coward), not striker ^_^
P.S.: And I am [[comguy]] (smart@$$ and coward), not striker ^_^


GENERAL:
'''[Snipped this breakdown of TRAM to avoid duplicated information on the wiki, since all the material was incorporated into OBD:TRAM. -Iritscen]'''
:*We need hexeditor or [[OUP]] and some decimal to hex (Windows calculator) and decimal to float (see [http://babbage.cs.qc.edu/IEEE-754/ HERE]) converters.
:* normal number are written as usual, when I want to write HEx number, I use prefix 0x. so '''0x10''' means '''16'''.
:*Next here comes explanation of storage types (that is "type" column in table). Storage type is how this value is saved and how can be read by Oni. Types in TRAM which interests us are:
::*'''Offset''': tells us that value points to the exact location in raw file where is something stored. Offset is a bit tricky. It is written in ''Little endian''. So when in offset field is written '''A0'''|'''B4'''|'''80'''|'''00''' , then something starts in raw at position '''00'''|'''80'''|'''B4'''|'''A0''' . See? Order of bytes is reversed. Keep this in mind. This can be helpful if we need to add some part to the TRAM which is originally not present for this TRAM (usually particles). You ''add'' this part (in correct form of course!) to the end of raw file, extending it (HEXeditor needed! Cannot do this with OUP!) and then you note where it begins (''offset'' is usually written on the side) and write it into correct offset field in correct form for Oni(reverse bytes). A few examples of tricky offsets:
:::*'''C5'''|'''A6'''|'''70'''|'''00''' means '''00'''|'''70'''|'''A6'''|'''C5''', so something in raw starts at line '''00'''|'''70'''|'''A6'''|'''C0''' on the byte '''05''' (so it is 6th byte from the right, 0 is counted as well!!!).
:::*'''40'''|'''89'''|'''14'''|'''01''' means '''01'''|'''14'''|'''89'''|'''40''', so something in raw starts at that line. Tricky part is the LAST byte when it is YOU who tries to reverse bytes in order to write them into TRAM ^_~.
::*'''Link''': it tells us (and engine) that we should find some other file to use for something. Link contains internal number of the file we should search for,its '''res_ID'''. Usually first 4 bytes of file are this number.
::*'''Bitset''': this is field of some optional possibilites. Each one has its own (hardcoded) number. Numbers are powers of 2 : 0,1,2,4,8,16 (0x10 in hex),32 (0x20 in hex),64 (0x40 in hex),128 (0x80 in hex)
::*'''Int''': integer, it is some value written in hex (not generally, just for this purpose. Generally integer is defined as numeric value which can contain only whole numbers). Beware, again '''little endian'''. So if you want to change some "short" field, then type value you want into calculator, convert to hexadecimal. Then fill it in in reverse order (Little endian).
::*'''Float''': field which can contain real number value. Beware, again '''Little endian'''. In order to decipher float, use some "float to decimal" converter (maybe the one I have suggested above? ^_^)
::*'''Char''': some word, usually it is name of something. Howgh
 
 
 
 
[[image:tram_all.gif]]
 
 
{{Table}}
{{OBDth}}
{{OBDtr| 0x000 | res_id  |FF0000| 01 49 07 00 | 1532        | 01865-KONCOMpunch_heavy.TRAM }}
{{OBDtr| 0x004 | lev_id  |FFFF00| 01 00 00 00 | 0          | level 0 }}
{{OBDtr| 0x008 | int32    |FFC8C8| 00 00 00 00 | 0          | unknown; always zero }}
{{OBDtr| 0x00C | offset  |FFFFC8| A0 B4 80 00 | 00 80 B4 A0 | at this position starts the "Y-positions of the pelvis" in the raw file.It looks like this: }}
[[image:tram_r01.gif]]
{{Table}}
{{OBDth}}
{{OBDtrBK}}
{{OBDtr| 0x00 | float    |FFC8C8| 67 64 9B 40 | 4.856006 | y-position of the pelvis in 0th frame of TRAM }}
|}
This part contains Y-axis position (height) of pelvis in EACH frame of animation. If we need to "lower" or "elevate" character (we adopted some TRAM from other character and while performing, our char is "sinking" or "floating") this is place where we go.
Beware: wrong values cause Oni to hang.
{{OBDtr| 0x010 | offset  |FFFFC8| E0 B5 80 00 | 00 80 B5 E0 | at this position starts the "X/Z - velocities of the pelvis" in the raw file. It looks like this:}}
[[image:tram_r02.gif]]
{{Table}}
{{OBDth}}
{{OBDtrBK}}
{{OBDtr| 0x00 | float    |FFC8C8| EE D0 10 BE | -0.141422 | x-velocity of the pelvis }}
{{OBDtr| 0x04 | float    |FFFFC8| 00 96 8F 3D | 0.070110  | z-velocity of the pelvis }}
|}
Z+ is forward, Z- is back, X+ is left, X- is right
{{OBDtr| 0x014 | offset  |FFFFC8| 60 B8 80 00 | 00 80 B8 60 | at this position starts attack part in the raw file:}}
[[image:tram_r03.gif]]
{{Table}}
{{OBDth}}
{{OBDtrBK}}
{{OBDtr| 0x00 | bitset32 |FFC8C8| 00 60 06 00 | 0, 96, 6, 0 | damage-dealing bones; these are "dangerous ones";the following bits are possible:
:0x'''01'''000000 - pelvis
:0x'''02'''000000 - left thigh
:0x'''04'''000000 - left calf
:0x'''08'''000000 - left foot
:0x'''10'''000000 - right thigh
:0x'''20'''000000 - right calf
:0x'''40'''000000 - right foot
:0x'''80'''000000 - mid
:0x00'''01'''0000 - chest
:0x00'''02'''0000 - neck
:0x00'''04'''0000 - head
:0x00'''08'''0000 - left shoulder
:0x00'''10'''0000 - left arm
:0x00'''20'''0000 - left wrist
:0x00'''40'''0000 - left fist
:0x00'''80'''0000 - right shoulder
:0x0000'''01'''00 - right arm
:0x0000'''02'''00 - right wrist
:0x0000'''04'''00 - right fist
}}
{{OBDtr| 0x04 | float    |FFFFC8| 00 00 00 41 | 8.000000    | knockback aka "how much is enemy pushed back by attack", only works if attack '''sucesfully damaged enemy'''}}
{{OBDtr| 0x08 | bitset32 |C8FFC8| 08 00 00 00 | 8, 0, 0, 0  | raw attack part bitset; the following bits are possible:
:0 - nothing special, attack can be blocked by any stance of defender (crouch, stand) and deals no damage when blocked
:1 - attack is unblockable
:2 - attack is high; can be blocked only if defender plays an animation which have "BlockHigh" bit (see 0x3C TRAM bitset), otherwise hits
:4 - attack is low; can be blocked only if defender plays an animation which have "BlockLow" bit (see 0x3C TRAM bitset), otherwise hits
:8 - attack deals 1/2 damage when blocked + while blocking, it does not use blue "blocked" impact effect but hit impact effect
}}
{{OBDtr| 0x0C | int16    |C8FFFF| 14 00      | 20          | hit points; how much it steals from enemy's HP if sucessfully hits }}
{{OBDtr| 0x0E | int16    |FFC8FF| 05 00      | 5          | start frame of attack part; 0 is start of TRAM }}
{{OBDtr| 0x10 | int16    |FFC8FF| 0F 00      | 15          | stop frame of attack part 0 is start of TRAM }}
{{OBDtr| 0x12 | int16    |FFC800| 50 00      | 80          | anim_type ID for opponent's animation if attack is sucessful (80 <nowiki>=</nowiki> hit_foot), see [http://loser.oni2.net/Junkyard/Animations.pdf THIS] file for Anim types, '''beware''', you have to subtract 1 as list starts with 1 but should start with 0 }}
{{OBDtr| 0x14 | int16    |C800C8| 0A 00      | 10          | number of frames for how long should victim remain in hit anim when he gets hit, if value exceeds about 25 frames, it automatically makes victim play stagger animation instead of its proper one written above}}
{{OBDtr| 0x16 | int16    |C800C8| 0A 00      | 10          | number in frames for how long should defender remain in "block" animation, if you set it a bit higher (about 0x10), then AI2 considers that technique with this move causes "blockstun" }}
{{OBDtr| 0x18 | int16    |C800C8| 00 00      | 0          | number of frames for how long should defender play stagger animation if defender blocked sucessfully; when set, then AI2 considers that technique with this move causes "block stagger" }}
{{OBDtr| 0x1A | int16    |C800C8| 00 00      | 0          | apparently garbage }}
{{OBDtr| 0x1C | int32    |C87C64| 00 00 00 00 | 0          | apparently garbage }}
|}
{{OBDtr| 0x018 | offset  |FFFFC8| 00 00 00 00 | unused      | at this position starts the damage part in the raw file; only tgt (target) animations use it, BEWARE, without '''ThrowTarget''' bit (see 0x3C TRAM) it causes Loser's bug No.1 (Oni crashes). Raw:}}
[[image:tram_r04.gif]]
{{Table}}
{{OBDth}}
{{OBDtrBK}}
{{OBDtr| 0x00 | int16 |FFC8C8| 14 00 | 20 | damage taken by character }}
{{OBDtr| 0x02 | int16 |FFFFC8| 29 00 | 41 | frame of the animation, when damage is dealt }}
|}
{{OBDtr| 0x1C | offset  |FFFFC8| A0 B8 80 00 | 00 80 B8 A0 | at this position starts the motion blur in the raw file, nothing intersting here for us, it is just eye candy }}
{{OBDtr| 0x20 | offset  |FFFFC8| C0 B8 80 00 | 00 80 B8 C0 | at this position starts the shortcut part in the raw file:}}
[[image:tram_r06.gif]]
{{Table}}
{{OBDth}}
{{OBDtrBK}}
{{OBDtr| 0x00 | int16    |FFC8C8| 2F 00      | 47      | from state; (see Molten's PDF for anim states) this tells us from which anim states can this animation be called and vice versa}}
{{OBDtr| 0x02 | int16    |FFFFC8| 06 00      | 6        | shortcut length in frames }}
{{OBDtr| 0x04 | int32    |C8FFC8| 00 00 00 00 | 0        | replace an atomic animation (0 - no, 1 - yes), see TRAM flags at 0x3C }}
|}
This is important part. thanks to this we can perform specials as well as other movements (run, sprint). If you are messing around with TRAM and it does NOT want to be performed while all other things see OK, try to think if it has correct shortcut or if another animation related to this one has correct shortcut.
{{OBDtr| 0x24 | offset  |FFFFC8| 00 00 00 00 | unused      | at this position starts throw part in the raw file:}}
[[image:tram_r07.gif]]
{{Table}}
{{OBDth}}
{{OBDtrBK}}
{{OBDtr| 0x00 | float |FFC8C8| 8A 39 2C BF | -0.672752 | X axis adjustment; when throw is sucessful, used to move "teleport" victim left/right in order to set some distance between participants so throw looks good. If victim cannot move, throw is performed "as is".
X+ is left, X- is right }}
{{OBDtr| 0x04 | float |FFFFC8| 10 39 B4 3F | 0.793839  | Y axis adjustment; when throw is sucessful, victim is moved "teleported" up/down by this in order to set some distance between participants so throw looks good.
Curious is that if you "lift" enemy (you set it high Y+) enemy is lifted '''as if je jumped''', bounding box is lifted! Usually when executing TRAMs, Y+ just stretches bounding box of character, that is why you cannot throw them over fences. But this one lifts character completely. Weird, isn't it?
Y+ is up, Y- is down  }}
{{OBDtr| 0x08 | float |C8FFC8| 44 2D 1C 41 | 9.761051  | Z axis adjustment; same as X axis, only it is forward/backward
Z+ is forward, Z- is backward }}
{{OBDtr| 0x0C | float |C8FFFF| DB 0F 49 40 | 3.141592  | angle adjustment; when throw is sucessful, victim is turned around his axis for this angle in order to make throw look good. (3.141 <nowiki>=</nowiki> pi)
P.S.: If you mess it, you can get that victim is performing correct thrown animation, but he turns around and is facing wrong way. Looks goofy :) }}
{{OBDtr| 0x10 | float |FFC8FF| 00 00 40 41 | 12.000000 | throw distance, beware, if TRAM belong to TRAC which is inheriting some moves from parent TRAC, throw distance MUST be same or longer than throw distance of the same throw in parent TRAC. Otherwise, you will see Loser's bug No.2 ^_^. }}
{{OBDtr| 0x14 | int16 |FFC800| 60 00      | 96        | type / aming type; that's the ID (Anim type, se Molten's PDF) for the animation of the target, if you mess this, Oni will play wrong animation or crash. }}
|}
Loser's bug No.2: Wrong throw animation is ocasionally performed. That is caused by fact that parent throw is IN distance for throw but our TRAC's throw is not. So engine iniciates throw and plays parent's TRAC throw animation and our TRAC thrown animation. Mess ^_^
{{OBDtr| 0x28 | offset  |FFFFC8| E0 B8 80 00 | 00 80 B8 E0 | at this position starts the footstep part in the raw file. Nothing to add. }}
{{OBDtr| 0x2C | offset  |FFFFC8| 00 B9 80 00 | 00 80 B9 00 | at this position starts the particle part in the raw file:}}
[[image:tram_r09.gif]]
{{Table}}
{{OBDth}}
{{OBDtrBK}}
{{OBDtr| 0x00 | int16    |FFC8C8| 00 00      | 0  | start frame of this particle }}
{{OBDtr| 0x02 | int16    |FFFFC8| 30 00      | 48 | stop frame of this particle }}
{{OBDtr| 0x04 | int32    |C8FFC8| 0D 00 00 00 | 13 | bodypart number; the particle is fixed to this bodypart; look to the [[OBD:TRIA|TRIA]] file for a bodypart number }}
{{OBDtr2|0x08 | char[16] |C8FFFF| contrail        | ONCP particle name; the first 00 is the stop-byte; reference to [[OBD:ONCP|01017-.ONCP]], otherwise it plays nothing and put up warning into dev console }}
|}
Beware of the fact that ONCP particle name is NOT general name of the particle. "Kontrail" is ONCP particle name. "h2h_strtrail_e01" is general name of the particle.
{{OBDtr| 0x30 | offset  |FFFFC8| 60 B9 80 00 | 00 80 B9 60 | at this position starts the position part in the raw file. Don't mess with it.}}
{{OBDtr| 0x34 | offset  |FFFFC8| 00 BD 80 00 | 00 80 BD 00 | at this position starts the [[OBD:TRAM/raw0x34|bodyparts animation part]] in the raw file. Read its section if you want. Until we can export/import animations and edit them in some program, I encourage you to leave this part alone. I know that sometnig CAN be done by hand work, but it is too time consuming. }}
{{OBDtr| 0x38 | offset  |FFFFC8| 00 00 00 00 | unused      | at this position starts the sound part in the raw file. Howgh }}
{{OBDtr| 0x3C | bitset32 |C8FFC8| 90 00 08 00 | 144, 0, 8, 0| TRAM bitset collection; the following bits are possible /values in hex):
:0x'''01'''000000 - '''private1''' (this bit is not animation related, it is used at runtime to mark that the animation was loaded)
:0x'''02'''000000 - '''invulnerable''', while playing this animation user is invulnerable to melee damage AND cannot be thrown, PAR3/height still hurts him
:0x'''04'''000000 - '''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
:0x'''08'''000000 - '''blockLow''', same as before only it can block low or undefined attacks
:0x'''10'''000000 - '''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
:0x'''20'''000000 - '''dropWeapon''', if user is armed, he drops weapon when he plays this animation
:0x'''40'''000000 - '''inAir''', something with jumps, didn't checked
:0x'''80'''000000 - '''atomic''', whole animation must be played, user cannot interrupt it once it starts
:0x00'''01'''0000 - '''noTurn''', cannot turn by mouse while performing this animation
:0x00'''02'''0000 - '''attackForward''',unknown, looks like this is rough info for AI2 about where attack aims from user's point of view
:0x00'''04'''0000 - '''attackLeft''', same as above
:0x00'''08'''0000 - '''attackRight''', same as above
:0x00'''10'''0000 - '''attackBackward''', same as above
:0x00'''20'''0000 - '''overlay''', these are not standalone animatios, they just overwrite part of already playing one, for example holstering weapon is such an animation
:0x00'''40'''0000 - '''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)
:0x00'''80'''0000 - '''throwSource''', unknown, throws use it
:0x0000'''01'''00 - '''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?).
::-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.
:0x0000'''02'''00 - '''realWorld''', something with Y-velocities part
:0x0000'''04'''00 - '''doAim''', forces aim animation (PIS/RIF) if user has weapon
:0x0000'''08'''00 - '''dontAim''', forces not to aim
:0x0000'''10'''00 - '''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.
:0x0000'''20'''00 - '''aim360''', dunno
:0x0000'''40'''00 - '''disableShield''', if user had active supershield (chr_super "name" 1), this forces him to disable it (chr_super "name" 0)
:0x0000'''80'''00 - '''noAIPickup''', AI2 are not permitted to pick up items with this animations
 
 
}}
{{OBDtr| 0x040 | link    |C8FFFF| 00 00 00 00 | unused      | direct animation 0 (link to another TRAM file) }}
{{OBDtr| 0x044 | link    |C8FFFF| 00 00 00 00 | unused      | direct animation 1 (link to another TRAM file), these two do NOT ensure that this animation can link, they only allow you to write two animations which can follow immediately, without applying soft pause, see below for more.}}
{{OBDtr| 0x048 | bitset32 |FFC8FF| 00 00 00 00 | 0          | used parts; Aiming screen TRAMs "use" several bones here. Other overlay TRAMs use only "chest". Non-overlay TRAMs use none. So we can ignore this part.
}}
{{OBDtr| 0x04C | bitset32 |FFC8FF| 00 00 00 00 | 0          | replaced parts; same legend as above; only overlay TRAMs other than aiming-screen ones "replace" parts. }}
{{OBDtr| 0x050 | float    |FFC800| 00 00 00 00 | 0.000000    | final rotation in radians (for anims that make you turn), note that if you are hurt and this animation stopped, you are immediately forced back into your original direction. So if you make Konoko's running punch throw that thrown victim can be hurt and then you punch him, he reverses back to original rotation, "slides on his spin". Looks awful.}}
{{OBDtr| 0x054 | int16    |C800C8| 01 00      | 1          | move direction; the following directions are possible:
:0 - nothing
:1 - forward
:2 - backward
:3 - left
:4 - right
:I don't know why it is here, but it is good idea to set it correctly
}}
{{OBDtr| 0x056 | int16    |C87C64| 06 00      | 6          | attack sound ("Rising fury!"); the number belongs to the sound slot in the [[OBD:ONCC|ONCC]] file}}
{{OBDtr| 0x058 | float    |B0C3D4| 8D 87 CF 41 | 25.941187  | max horizontal extent of the attack
-extents are for AI2s. Thanks to these AI2 knows reach of technique (general and then in represented ranges around body) and can attack with it or guard it ''correctly''. You can adjust it a bit if you feel it really needs to, but I don't recommend it as you cannot directly see what changed and if it is for good or for bad. }}
{{OBDtr| 0x05C | float    |B0C3D4| DE E9 1A 40 | 2.420524    | min Y of the attack }}
{{OBDtr| 0x060 | float    |B0C3D4| 95 34 D3 41 | 26.400675  | max Y of the attack }}
{{OBDtr| 0x064 | float    |B0C3D4| 8D 87 CF 41 | 25.941187  | max horizontal extent at 0° (front) }}
{{OBDtr| ...  | ...      |B0C3D4| ...        | ...        | ... }}
{{OBDtr| 0x088 | float    |B0C3D4| DF 37 87 40 | 4.225570    | max horizontal extent at 90° (left) }}
{{OBDtr| ...  | ...      |B0C3D4| ...        | ...        | ... }}
{{OBDtr| 0x0AC | float    |B0C3D4| 5A D8 6D 40 | 3.716330    | max horizontal extent at 180° (back) }}
{{OBDtr| ...  | ...      |B0C3D4| ...        | ...        | ... }}
{{OBDtr| 0x0D0 | float    |B0C3D4| 98 95 E3 40 | 7.112011    | max horizontal extent at 270° (right) }}
{{OBDtr| ...  | ...      |B0C3D4| ...        | ...        | ... }}
{{OBDtr| 0x0F0 | float    |B0C3D4| 8D 87 CF 41 | 25.941187  | max horizontal extent at 350° }}
{{OBDtr| 0x0F4 | int16    |E7CEA5| 05 00      | 5          | unknown; indicator for the seven floats below; always -1 if the attack part doesn't exist }}
{{OBDtr| 0x0F6 | int8    |FFDDDD| 00          | 0          | unknown; always zero }}
{{OBDtr| 0x0F7 | int8    |FFDDDD| 00          | 0          | unknown; always zero }}
{{OBDtr| 0x0F8 | float    |64AAAA| 00 00 00 BF | -0.500000  | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x0FC | float    |64AAAA| 1E 85 6B BF | -0.920000  | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x100 | float    |64AAAA| 19 47 0C 41 | 8.767358    | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x104 | float    |64AAAA| EB 51 F0 40 | 7.510000    | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x108 | float    |64AAAA| D7 A3 14 41 | 9.290000    | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x10C | float    |64AAAA| 0A D7 3B 41 | 11.740000  | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x110 | float    |64AAAA| 5E 93 BF 40 | 5.986739    | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x114 | int16    |EBEBEB| 2F 00      | 47          | unknown; indicator for the two bytes and seven floats below; always -1 if the attack part doesn't exist or the attack part exists and it's a tgt animation (tgt <nowiki>=</nowiki> target) }}
{{OBDtr| 0x116 | int8    |8C8CCC| 01          | 1          | unknown }}
{{OBDtr| 0x117 | int8    |FF00C8| 16          | 22          | unknown }}
{{OBDtr| 0x118 | float    |F0F096| 85 EB 51 BF | -1.850000  | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x11C | float    |F0F096| E1 7A 7C C1 | -3.900000  | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x120 | float    |F0F096| 69 61 BF 40 | 16.874636  | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x124 | float    |F0F096| 70 3D 22 41 | 10.510000  | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x128 | float    |F0F096| 47 E1 3A 40 | 8.860000    | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x12C | float    |F0F096| 33 33 DB 40 | 18.460000  | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x130 | float    |F0F096| F7 C0 2E 3E | 0.055320    | unknown; always zero if the indicator is -1 }}
{{OBDtr| 0x134 | int32    |00C864| 00 00 00 00 | 0          | unknown; always zero }}
{{OBDtr| 0x138 | int32    |00C8FF| 18 00 00 00 | 24          | amount of elements of the extent part; only used if the attack part exists }}
{{OBDtr| 0x13C | offset  |C80040| E0 BB 80 00 | 00 80 BB E0 | at this position starts the [[OBD:TRAM/raw0x13C|extent part]] in the raw file; only used if the attack part exists.
:-Extent part stores the finest description of attack's path. Thus when you do an attack, AI2 can for example read that it starts going up, goes left a bit, then goes right and down again. How it is stored is still mystery for me.
}}
{{OBDtr2|0x140 | char[16] |FFCD96| konflash1                | impact particle name (reference to 01018-.[[OBD:ONIA|ONIA]], which is called up in the [[OBD:ONCC|ONCC]] file) }}
{{OBDtr| 0x150 | int16    |C8C864| 00 00      | 0          | hard pause in 1/60 seconds }}
{{OBDtr| 0x152 | int16    |C8C864| 12 00      | 18          | soft pause in 1/60 seconds, this pause is forced after animation ends. You simply stand, cannot do a thing. Only if this animaton links to some other one (links means it has correct ID Anim Type so it CAN be followed) this pause is ignored }}
{{OBDtr| 0x154 | int32    |0096C8| 00 00 00 00 | 0          | amount of packages of the sound part }}
{{OBDtr| 0x158 | int32    |FF80C0| 00 00 00 00 | 0          | runtime: pointer to the sound for this animation (initialised from [[OBD:BINA/SABD|SABD]])}}
{{OBDtr| 0x15C | int16    |D0C0AF| 00 00      | 0          | runtime: sound start frame (initialised from SABD) }}
{{OBDtr| 0x15E | int16    |D0C0AF| 3C 00      | 60          | frames per second }}
{{OBDtr| 0x160 | int16    |EEDDFF| 06 00      | 6          | compression size }}
{{OBDtr| 0x162 | int16    |EEDDFF| 16 00      | 22          | animation type from anim_types. See Molten's PDF. This number determines which keypress combination is required to call this animation, if animation can link to other one and many more }}
{{OBDtr| 0x164 | int16    |C5FF8A| 16 00      | 6          | aiming animation type from anim_types.[[OBD:StNA|StNA]] }}
{{OBDtr| 0x166 | int16    |C5FF8A| 00 00      | 0          | from state, this tells engine from which state this animation can be called. Thanks to this you can perform kick, getup kick and crouch kick. All done by same action, only animation state differs.}}
{{OBDtr| 0x168 | int16    |C0C0C0| 07 00      | 7          | to state, this is state in which animation ends. Should correspond so next animation transits smoothly. ^_^ }}
{{OBDtr| 0x16A | int16    |C0C0C0| 13 00      | 19          | bodyparts }}
{{OBDtr| 0x16C | int16    |FF0080| 50 00      | 80          | frames, you cannot extend frames (Oni will hang) but you can shorten animation if you need. Only be aware that there are some parts of TRAM which can be harmed by shorting TRAM below their end frame. }}
{{OBDtr| 0x16E | int16    |FF0080| 50 00      | 80          | duration in in 1/60 seconds, the same as above }}
{{OBDtr| 0x170 | bitset16 |FFFFA6| 00 02      | 0, 2        | varient, the following bits are possible:
:0x00'''01''' - '''SPR'''int animation
:0x00'''02''' - '''COM'''bat animation
:0x00'''08''' - '''PIS'''tol animation
:0x00'''10''' - '''NIN'''ja '''PIS'''tol animation (left-handed)
:0x00'''20''' - '''RIF'''le animation
:0x00'''40''' - '''NIN'''ja '''RIF'''le animation (left-handed)
:0x00'''80''' - '''PAN'''ic or '''SCR'''amble animation
:Beware, looks like PAN/SCR varient is somewhat messed up. Crashes happen sometimes.
}}
{{OBDtr| 0x172 | char[2]  |FFFFA6| AD DE      | dead        | varient end; unused }}
{{OBDtr| 0x174 | int16    |71FFB8| 00 00      | 0          | atomic start, you can set only part of the TRAM to be atomic (cannot be affected by user) }}
{{OBDtr| 0x176 | int16    |71FFB8| FF FF      | -1          | atomic end, same }}
{{OBDtr| 0x178 | int16    |0000BF| 00 00      | 0          | end interpolation, in frames, beware, too big interpolation looks bad.}}
{{OBDtr| 0x17A | int16    |0000BF| FF FF      | -1          | maximal interpolation }}
{{OBDtr| 0x17C | int16    |804040| FF FF      | -1          | action frame, frame where action happens. Action is  weapon theft in disarm animations, action is when Mukade actually teleports(changes place), and many other things }}
{{OBDtr| 0x17E | int16    |804040| 0A 00      | 10          | first level }}
{{OBDtr| 0x180 | uint8    |FF22FF| 01          | 1          | first "invulnerable" frame, you can set only part of the TRAM to be invulnerable }}
{{OBDtr| 0x181 | uint8    |FF22FF| 1C          | 28          | last "invulnerable" frame, same }}
{{OBDtr| 0x182 | uint8    |808080| 02          | 2          | amount of elements in the attack part }}
{{OBDtr| 0x183 | uint8    |808080| 00          | 0          | amount of elements in the take damage part }}
{{OBDtr| 0x184 | uint8    |FFAA82| 01          | 1          | amount of elements in the motion blur part }}
{{OBDtr| 0x185 | uint8    |FFAA82| 01          | 1          | amount of elements in the shortcut part }}
{{OBDtr| 0x186 | uint8    |00D900| 02          | 2          | amount of elements in the footstep part }}
{{OBDtr| 0x187 | uint8    |00D900| 04          | 4          | amount of elements in the particle part }}
{{OBDtr| 0x188 | char[24] |CACAFF| AD DE      | dead        | unused }}
 
|}
Beware, setting wrong values in those "amount of elements" fields may make Oni crash/hang.


--[[User:Loser|Loser]] 19:50, 20 August 2008 (CEST)
--[[User:Loser|Loser]] 19:50, 20 August 2008 (CEST)


 
{{OBD}}
 
==XML area==
===adding colorful trails===
Open the xml formated TRAM and search for the "Particles" tag and insert your code.
 
First example: TRAMSTRCOMcomb_p_p.xml
 
{| border=0 cellspacing=20 cellpadding=0 align=right
| [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/TRAM/colorful_contrail_added.png http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/TRAM/colorful_contrail_added_preview.png]
|}
 
        <Particles>
            <Particle>
                <StartFrame>0</StartFrame>
                <EndFrame>12</EndFrame>
                <Bone>LeftFist</Bone>
                <Name>contrail</Name>
            </Particle>
        </Particles>
 
"contrail" is looked up by the used character class (ONCC) which lunch the actual particle, here it is "h2h_strtrail_e01".
 
 
Second example is about two different contrails in one TRAM at same time. The animation is "TRAMSTRCOMpunch_heavy.xml".
 
{| border=0 cellspacing=20 cellpadding=0 align=right
| [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/TRAM/different_contrails_in_attack.png http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/TRAM/different_contrails_in_attack_previ.png]
|}
 
        <Particles>
            <Particle>
                <StartFrame>0</StartFrame>
                <EndFrame>54</EndFrame>
                <Bone>RightWrist</Bone>
                <Name>contrail</Name>
            </Particle>
            <Particle>
                <StartFrame>0</StartFrame>
                <EndFrame>54</EndFrame>
                <Bone>LeftWrist</Bone>
                <Name>'''contrail_2'''</Name>
            </Particle>
        </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.
 
            <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>
 
<!-- Careful what you post here Paradox, TRAM XML format is changing a little bit in the next Onisplit -->
 
 
==a look on run move complex==
Example on Striker's moves, meant as illustration for "what would be needed for new run trams".
 
 
Run cancel:
* STRIKEidle1 / another idle animation
* [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XSI_modding/STRIKErun1stepa.png STRIKErun1stepa]
* [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XSI_modding/STRIKErun1stepb.png STRIKErun1stepb]
* STRIKEidle1 / another idle animation
 
 
Run - ''a minimal cycle'':
* STRIKEidle1 / another idle animation
* [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XSI_modding/STRIKErun1stepa.png STRIKErun1stepa]
* [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XSI_modding/STRIKErunstart.png STRIKErunstart]
* [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XSI_modding/STRIKErun_rt.png STRIKErun_rt]
* [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XSI_modding/STRIKErun_lt.png (STRIKErun_lt)]
* [http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XSI_modding/STRIKErunstop.png STRIKErunstop]
* STRIKEidle1 / another idle animation
 
 
==free-to-use TRAMs==
Following files are available in DAE (and maybe ONI format).
* [http://dl.dropbox.com/u/139715/TRAM/REDCOMjump_fw_crouch--double_flip--dae.zip Fury double flip] (.dae)
** note: -
* [http://dl.dropbox.com/u/139715/TRAM/KONenter_prone_mode--oni_and_dae.zip Konoko enters prone mode] (.dae + .oni)
** note: prone mode artefact
* ...
** ...

Latest revision as of 03:45, 1 November 2023

more detailed explanations

Hello all ONI fans, This is not guide how to edit TRAM, it is only TRAM explained in more detail in order to help those who would like to modify it. I see it all the time that you discover already discovered and it is MY FAULT because I didn't share my knowledge X_X. Shame on me.

Run Loser.jpg

P.S.: And I am comguy (smart@$$ and coward), not striker ^_^

[Snipped this breakdown of TRAM to avoid duplicated information on the wiki, since all the material was incorporated into OBD:TRAM. -Iritscen]

--Loser 19:50, 20 August 2008 (CEST)