Its been 24 hours, and looky what I have done!
Here is a link to the output so far for RYU.
http://www.sendspace.com/file/xbh60a (Hiteffect Table is missing but who cares ATM)
Let me give an example of how this works.
BCM.xml contains Charges, InputMotions, Moves, and CancelLists. Let me give an example of the latter 3 since RYU doesn’t have charge moves.
<InputMotion Name="HADO" Offset="0x1df0L">
<SUPEREASY>
<InputMotionEntry Offset="0x1e04L" Type="NORMAL" Buffer="0xc" Input="FORWARD" InputFlags="STRICT_DIRECTION" Flags1="0x1000" Flags2="0x2" Mash="0x0"/>
</SUPEREASY>
<EASY>
<InputMotionEntry Offset="0x1f08L" Type="NORMAL" Buffer="0xc" Input="DOWN" InputFlags="STRICT_DIRECTION" Flags1="0x0" Flags2="0x0" Mash="0x0"/>
<InputMotionEntry Offset="0x1f18L" Type="NORMAL" Buffer="0xc" Input="FORWARD" InputFlags="LENIENT_DIRECTION" Flags1="0x0" Flags2="0x0" Mash="0x0"/>
</EASY>
<NORMAL>
<InputMotionEntry Offset="0x200cL" Type="NORMAL" Buffer="0xc" Input="DOWN" InputFlags="STRICT_DIRECTION" Flags1="0x0" Flags2="0x0" Mash="0x0"/>
<InputMotionEntry Offset="0x201cL" Type="NORMAL" Buffer="0xc" Input="DOWN FORWARD" InputFlags="STRICT_DIRECTION" Flags1="0x0" Flags2="0x0" Mash="0x0"/>
<InputMotionEntry Offset="0x202cL" Type="NORMAL" Buffer="0xc" Input="FORWARD" InputFlags="STRICT_DIRECTION" Flags1="0x0" Flags2="0x0" Mash="0x0"/>
</NORMAL>
<STRICT>
<InputMotionEntry Offset="0x2110L" Type="NORMAL" Buffer="0x4" Input="DOWN" InputFlags="STRICT_DIRECTION" Flags1="0x0" Flags2="0x0" Mash="0x0"/>
<InputMotionEntry Offset="0x2120L" Type="NORMAL" Buffer="0x4" Input="DOWN FORWARD" InputFlags="STRICT_DIRECTION" Flags1="0x0" Flags2="0x0" Mash="0x0"/>
<InputMotionEntry Offset="0x2130L" Type="NORMAL" Buffer="0x4" Input="FORWARD" InputFlags="STRICT_DIRECTION" Flags1="0x0" Flags2="0x0" Mash="0x0"/>
</STRICT>
</InputMotion>
You can see the inputs for very easy gem, easy gem, normal, and strict gem, and the info associated with them.
Now lets look at a Move. This is hadoken. Most characters have their chargeable move labeled SC in their file, so dont get confused.
<Move Name="SC_L" Offset="0x44f0L" Input="LP" InputFlags="ALL_BUTTONS +ON_PRESS +ON_RELEASE" PositionRestriction="NONE" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" PositionRestrictionDistance="0.0" Restriction="0x1" _Unk8="0x830" _Unk9="0x0" Meter Req="0x0" Meter Loss="-0xf" InputMotion="HADO" Script="0x172" _Unk14="0x21" _Unk15="-0x1" _Unk16="0x0" _Unk17="-0x1" AI Min Distance="3.5" AI Max Distance="10.0" _Unk20="1.39999997616" _Unk21="0x4" _Unk22="0x0" _Unk23="0x0" _Unk24="-0x1" _Unk25="-0x1" _Unk26="0x0" _Unk27="0x0" _Unk28="0x1" _Unk29="0x3" AIFar="0x5" AIVeryFar="0xa"/>
Yeah, a lot of unknowns, some of these are known, but my first priority is getting this working, not labeled, since its hard to test things if you can’t edit.
And last, but not least, lets look at a CancelList
<CancelList Name="GROUND" Offset="0x4db0L">
<CancelData Move="AI_COMBO_0" Offset="0x4f30L" _Unk0="0x2" _Unk1="0x2" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xa" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="5LP" Offset="0x4f38L" _Unk0="0x14" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x19" _Unk7="0xf"/>
<CancelData Move="5LPF" Offset="0x4f40L" _Unk0="0x14" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x14" _Unk7="0xa"/>
<CancelData Move="5LK" Offset="0x4f48L" _Unk0="0x0" _Unk1="0x14" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x14" _Unk7="0xa"/>
<CancelData Move="5LKF" Offset="0x4f50L" _Unk0="0x0" _Unk1="0x0" _Unk2="0xf" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x0" _Unk7="0x5"/>
<CancelData Move="5MP" Offset="0x4f58L" _Unk0="0xf" _Unk1="0xf" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0xf" _Unk7="0x0"/>
<CancelData Move="5MPF" Offset="0x4f60L" _Unk0="0x14" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0xf" _Unk7="0x0"/>
<CancelData Move="5MK" Offset="0x4f68L" _Unk0="0xc" _Unk1="0x14" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0xa" _Unk7="0x0"/>
<CancelData Move="5MKF" Offset="0x4f70L" _Unk0="0x14" _Unk1="0x14" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0xf" _Unk7="0x0"/>
<CancelData Move="5HP" Offset="0x4f78L" _Unk0="0xc" _Unk1="0xc" _Unk2="0xa" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="5HPF" Offset="0x4f80L" _Unk0="0xf" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xf" _Unk6="0xf" _Unk7="0xf"/>
<CancelData Move="5HK" Offset="0x4f88L" _Unk0="0x14" _Unk1="0xa" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xa" _Unk6="0x2" _Unk7="0x0"/>
<CancelData Move="5HKF" Offset="0x4f90L" _Unk0="0x0" _Unk1="0x0" _Unk2="0xa" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="2LP" Offset="0x4f98L" _Unk0="0xf" _Unk1="0xa" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xf" _Unk6="0x14" _Unk7="0x0"/>
<CancelData Move="2LK" Offset="0x4fa0L" _Unk0="0x19" _Unk1="0xf" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x23" _Unk6="0x1e" _Unk7="0x0"/>
<CancelData Move="2MP" Offset="0x4fa8L" _Unk0="0x14" _Unk1="0xf" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x19" _Unk6="0xf" _Unk7="0x0"/>
<CancelData Move="2MK" Offset="0x4fb0L" _Unk0="0x28" _Unk1="0x19" _Unk2="0x5" _Unk3="0x0" _Unk4="0x0" _Unk5="0x19" _Unk6="0x19" _Unk7="0xa"/>
<CancelData Move="2HP" Offset="0x4fb8L" _Unk0="0x0" _Unk1="0x0" _Unk2="0xa" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="2HK" Offset="0x4fc0L" _Unk0="0x14" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x1" _Unk6="0x1" _Unk7="0x0"/>
<CancelData Move="6MP" Offset="0x4fc8L" _Unk0="0x5" _Unk1="0x19" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x14" _Unk7="0x0"/>
<CancelData Move="6HP" Offset="0x4fd0L" _Unk0="0x5" _Unk1="0x5" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x5" _Unk6="0x2" _Unk7="0x0"/>
<CancelData Move="SC_L" Offset="0x4fd8L" _Unk0="0x5" _Unk1="0x5" _Unk2="0x0" _Unk3="0x2" _Unk4="0x0" _Unk5="0xf" _Unk6="0xf" _Unk7="0x0"/>
<CancelData Move="SC_M" Offset="0x4fe0L" _Unk0="0x5" _Unk1="0x5" _Unk2="0x0" _Unk3="0x2" _Unk4="0x0" _Unk5="0xf" _Unk6="0xf" _Unk7="0x0"/>
<CancelData Move="SC_H" Offset="0x4fe8L" _Unk0="0x5" _Unk1="0x5" _Unk2="0x0" _Unk3="0x2" _Unk4="0x0" _Unk5="0xf" _Unk6="0xf" _Unk7="0x0"/>
<CancelData Move="SC_EX" Offset="0x4ff0L" _Unk0="0x2" _Unk1="0x2" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0x5" _Unk7="0x0"/>
<CancelData Move="TATSUMAKI_L" Offset="0x4ff8L" _Unk0="0xa" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="TATSUMAKI_M" Offset="0x5000L" _Unk0="0xa" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xa" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="TATSUMAKI_H" Offset="0x5008L" _Unk0="0xa" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xa" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="TATSUMAKI_EX" Offset="0x5010L" _Unk0="0xa" _Unk1="0x0" _Unk2="0x5" _Unk3="0x0" _Unk4="0x0" _Unk5="0x19" _Unk6="0x5" _Unk7="0xa"/>
<CancelData Move="SYORYU_L" Offset="0x5018L" _Unk0="0x5" _Unk1="0x5" _Unk2="0x1e" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0x0" _Unk7="0x14"/>
<CancelData Move="SYORYU_M" Offset="0x5020L" _Unk0="0x0" _Unk1="0x0" _Unk2="0x19" _Unk3="0x0" _Unk4="0x0" _Unk5="0xa" _Unk6="0x0" _Unk7="0x5"/>
<CancelData Move="SYORYU_H" Offset="0x5028L" _Unk0="0x2" _Unk1="0x1" _Unk2="0xf" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0x0" _Unk7="0x5"/>
<CancelData Move="SYORYU_EX" Offset="0x5030L" _Unk0="0xa" _Unk1="0x5" _Unk2="0xf" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0x0" _Unk7="0x19"/>
<CancelData Move="SOKUTOU_L" Offset="0x5038L" _Unk0="0x2" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xa" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="SOKUTOU_M" Offset="0x5040L" _Unk0="0x2" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xa" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="SOKUTOU_H" Offset="0x5048L" _Unk0="0x2" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0xa" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="SOKUTOU_EX" Offset="0x5050L" _Unk0="0xa" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="SC_SA" Offset="0x5058L" _Unk0="0x2" _Unk1="0x2" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x14" _Unk6="0x5" _Unk7="0x0"/>
<CancelData Move="THROW_N" Offset="0x5060L" _Unk0="0xf" _Unk1="0x1e" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x1e" _Unk7="0x0"/>
<CancelData Move="THROW_F" Offset="0x5068L" _Unk0="0x1e" _Unk1="0xf" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x1e" _Unk7="0x0"/>
<CancelData Move="THROW_B" Offset="0x5070L" _Unk0="0x2" _Unk1="0x2" _Unk2="0x0" _Unk3="0xf" _Unk4="0x0" _Unk5="0x5" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="CHANGE" Offset="0x5078L" _Unk0="0x5" _Unk1="0x5" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x5" _Unk6="0x5" _Unk7="0x0"/>
<CancelData Move="CROSS_ASSAULT" Offset="0x5080L" _Unk0="0xa" _Unk1="0xa" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="CROSS_ARTS" Offset="0x5088L" _Unk0="0x1" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="PANDORA" Offset="0x5090L" _Unk0="0x0" _Unk1="0x3" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x0" _Unk7="0x14"/>
<CancelData Move="LAUNCH" Offset="0x5098L" _Unk0="0x0" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x0" _Unk7="0x0"/>
<CancelData Move="APPEAL" Offset="0x50a0L" _Unk0="0x2" _Unk1="0x0" _Unk2="0x0" _Unk3="0x0" _Unk4="0x0" _Unk5="0x0" _Unk6="0x0" _Unk7="0x0"/>
</CancelList>
This is just a list of moves that you can do in the STAND state, and…the unknowns might be AI weights for what to chain into what…not really sure. Anyways this is just an example of how this format is gonna look when its done.
Someone may want to write a GUI tool for editing certain parts of the file, this should be easy since there are good APIs for editing XML files. Let my tool go from BCM/BAC<->XML, and let your tool just touch the XML!
Edit: Just realized I left the Offsets in there. The offset thing just shows the original offset that part of the file had in the original file. Its useful for me since I am hex editing to test things. When its done they wont be in the files at all.