ã¿ãªããããã«ã¡ã¯ïŒ ç§ã®ååã¯Artyomã§ããã¿ã€ãã³ã§ã¯ãã°ãããããã¯ããŒã TTEMMAã§ããç¥ãããŠããŸããããã€ã³ãã§ã¯ãããŸããã ç§ã¯ãã¢ããã¥ã¢ã°ã«ãŒãã®ç¿»èš³è ã§ããRussian Studio Video 7ã®åµèšè ã®1人ã§ããããã®ããŒã ã§å¯äžã®romhacker-programmerã§ãã
ç§ã®ããŒã ãšç§ã¯ã 任倩å ã²ãŒã ãã¥ãŒãã®2ã€ã®è±¡åŸŽçãªã²ãŒã ã ãã€ãªãã¶ãŒããªã¡ã€ã¯ãšãã€ãªãã¶ãŒããŒãã®ç¿»èš³ããã€ãªãã¶ãŒããã¡ã³ã«åããŠæäŸããŸããããã€ãç§ãã¡ãã©ã®ããã«ããããããã«ã€ããŠã話ããŸããããã®ãããã¯ã§ã¯ã 任倩å Wiiã® Xenoblade Chroniclesã®ãããªè±ªè¯ãªã²ãŒã ãšããã®ã²ãŒã ã®ãã ããã¯ãã©ã®ããã«ç¶ãããã ãã®ã²ãŒã ã§ã¯ããã¹ãŠãæ¥æ¬ã®ã¹ã¿ã€ã«ã§è¡ãããå¥åŠã§ãããããã€ãã®ç¹ã§ããªãïŒããšãã質åãèªåããã ãã§ããããããããªãã¯æ¥æ¬äººã®å¥åŠãªäººã ã®æ°ãèŠããŠããŸãã ãããå§ããŸããããïŒ
ãŸããã
Xenoblade Chroniclesã¯ããã®äŸ¡å€ãããã²ãŒã ã§ããããã 任倩å Wiiãè³Œå ¥ããå¿ èŠãããããŸãã 倧èŠæš¡ãªãªãŒãã³ã¯ãŒã«ãã§ããJRPGãå€æ°ã®è£å©ã¯ãšã¹ãããããŠæ°é±éã§ã¯ãªãæ°ã¶æéã²ãŒã ã®é²è¡ãé ããããšããµã€ãã£ã³ã°ãªã¹ããŒãªãŒã 任倩å Wiiã«ç²ŸéããŠãã人ãªã誰ã§ããã³ã³ãœãŒã«ã¯ã¹ãŒããŒããªãªãªã©ã®åŒ±ãã«ã©ãã«ãªãã¡ããªãŒã²ãŒã åãã«èšèšãããŠããããšãç¥ã£ãŠããŸããã Monolith Softãäœæãããã®ã¯è³è³ã«å€ããŸããXenobladeChroniclesã¯ãã³ã³ãœãŒã«ã®æè¡çãªå¶éïŒ Resident Evil RemakeãšResident Evil Zeroã®ã¿ãã°ã©ãã£ãã¯ã«é¢ããŠç«¶åã§ããŸãïŒã
ããŒã ã§ã²ãŒã ãèŠãŠãç§ãã¡ã¯ãããç§ãã¡ã®å倧ã§å匷ããã®ã«ç¿»èš³ããå¿ èŠããããšæ±ºããŸããã ãããããåç¥ã®ããã«ãã²ãŒã ã®æè¡çãªèŠçŽ ãç解ããŠããªããã°ã翻蚳ãè¡ã䟡å€ã¯ãããŸããã 次ã«ãæè¡ã³ã³ããŒãã³ãã«ã€ããŠèª¬æããŸãã
æè¡çãªè©³çŽ°
Wiièªäœãšããã®ãããã¯ã§äœãã§ããªããã«ã€ããŠå°ãã話ãããŸãã
Nintendo GameCube ã Nintendo WiiãPowerPCã¢ãŒããã¯ãã£ãŒãåããIBMããã»ããµãŒäžã§å®è¡ãããããšã ãã®ããã»ããµã¯ããã°ãšã³ãã£ã¢ã³ã¢ãŒãã§åäœããŸããããã¯èŠããŠããããšãéèŠã§ãïŒç§ã«ãšã£ãŠã¯ãããã°ãšã³ãã£ã¢ã³ãã¡ã€ã«ã®ãããã³ã°ã¯ãã€ããªãŒããŒã®ããã«ãªãã«ãšã³ãã£ã¢ã³ãããã¯ããã«äŸ¿å©ã§ãïŒã
幞ããªããšã«ã 任倩å ã¯ã²ãŒã éçºè ã倧äºã«ããSDKã§ããããç®çã®ããã«èšå€§ãªæ°ã®ãã©ãŒããããæäŸããŸãããããã®ãããã¯ã«ã€ããŠè°è«ããã®ã¯åœŒãã§ã¯ãããŸããã åŸã§è©³ãã説æãããããããŸããããç§ã®æ inessã¯ãããèš±ãããã«ãããŸããã ç§ã¯ä»»å€©å ã®ãã©ãŒããããã1ã€ã ããéžã³ãã-BRFNAïŒBinary Revolution FontïŒãããã«ã€ããŠã¯ããã«è°è«ããã
ãã©ã³ã
Xenoblade Chronicles ïŒä»¥éXCïŒã®ãã©ã³ãã¯æšæºã§ä¿åãããŸãããBRFNAæ¡åŒµæ©èœãåããã²ãŒã 圢åŒã§ã¯ã»ãšãã©äœ¿çšãããŸããã
Wiiã«ã¯ 2ã€ã®æšæºãã©ã³ã圢åŒãããããŸããã
- BRFNTïŒããäžè¬çïŒ
- BRFNAïŒã»ãšãã©äœ¿çšãããªãïŒ
ãããã®æ§é ã«ã€ããŠã¯è©³ãã説æããŸããããéãã«ã€ããŠã®ã¿èª¬æããŸãã
- ãšã³ã³ãŒãæ å ±ïŒansiã挢åããšãŒããããªã©ïŒãæ ŒçŽããæ°ãããããã¯ãBRFNAã«è¿œå ãããŸãã
- BRFNAã§ã¯ãã·ã³ãã«ãå«ããã¯ã¹ãã£ã¯ç§ã«ã¯æªç¥ã®åœ¢åŒã§å§çž®ãããŸãããBRFNTã§ã¯ããããã¯ã¯ãªã¢ã§ãããç°¡åã«ç·šéã§ããŸãã
BRFNAã¯å€ãã®åé¡ãåŒãèµ·ãããŸããã1ã€ç®ã¯æªç¥ã®ã¿ã€ãã®å§çž®ããã1ã€ã¯ãšã³ã³ãŒãã£ã³ã°ã®ãããã«å¥åŠãªåé¢ã§ãã å¥åŠãªããšã«ã ãã³ãã³ã㌠3DS SDKã®å ¬åŒãã©ã³ãã³ã³ããŒã¿ãŒããã®ç¶æ³ããç§ãã¡ãæãåºããŸããã ããããããã«ãåé¡ããããŸãã.XCèªäœã§äœ¿çšãããŠãããšã³ã³ãŒãã£ã³ã°ã調ã¹ããã¯ã¹ãã£ã³ã³ããŒã¿ãŒçšã«åå¥ã®æ§æãã¡ã€ã«ãäœæããã³ã³ããŒã¿ãŒèªäœã®èšå®ãåçããŠããã©ã³ããå ã®ãã©ã³ããšåãã«ãªãããã«ããªããã°ãªããŸããã§ããã ãããæ°æ¥èŠããã åŸãUTF8ã®ãã·ã¢æåã³ãŒãã䜿ã£ãŠãã·ã¢æåãæšæž¬ããããšãã§ããŸããã
確ãã«ãæ°ãããã©ã³ãã®ãµã€ãºãåå ã§ã²ãŒã ãé·æéåæ¢ããã²ãŒã ã®ããŠã³ããŒãã®éå§æã«ã¯ã©ãã·ã¥ããŸããã æåã¯ãæ²ãã£ãæãäœãééã£ãããšãããŠããçãããããŸãããããã©ã³ããããŠã ã©ãŠããåé€ããåŸãã²ãŒã ã¯éãã«å§ãŸããŸããã ããããç§ã¯ãŠã ã©ãŠããæ確ã«åé€ããããªãã£ãã®ã§ãå察åŽããã¢ãããŒãããŸãã.IA4ïŒè²ããšã«4ããããéæ床ã«4ãããïŒããã¡ããã©I4ïŒè²ããšã«4ããããéæ床ãªãïŒã«å€æŽããXCã¯ããŒãªã³ã
ãã¯ã¹ãã£åœ¢åŒãå€æŽããããšã«ããã®ã¯ãªãã§ããïŒ ã§ããããïŒ æ£çŽãªãšãããããã¯ãã£ã©ã¯ã¿ãŒã®å質ãäœäžãããããšã¯ãããŸããã§ããã ãã®ã²ãŒã ã®ãã£ã©ã¯ã¿ãŒåºåã¯ãã¡ã€ã³ãã£ã³ãã«ããŸã£ãã䜿çšããã«ã¢ã«ãã¡ãã£ã³ãã«ã®ã¿ãåºåããããã«æ©èœããŸãããéæ床ã®ãªããã©ã³ã圢åŒã䜿çšããå Žåãã¡ã€ã³ãã£ã³ãã«ä»¥å€ã«äœ¿çšãããã®ã¯ãããŸããã äžåèªãç§ã¯èãããããŠå Žæãæ£ããããªãããã«éææ§ãªãã§ããããšã«ããã
ãã®æç¹ã§ããã©ã³ãã䜿çšããäœæ¥ãå®äºããã¿ã¹ã¯ã®ãªã¹ãããåé€ãããŸããã
PKB \ PKH-ãã¡ã€ã«ã³ã³ãããŒ
ç§ã¯ããã§ãŸã£ãã話ãå§ããŸããã§ããã å€ãã®ã¡ã€ã³ãã¡ã€ã«ãååŸããã«ã¯ãäœããã®æ¹æ³ã§ããããPKBã³ã³ããããæœåºããå¿ èŠããããŸãã
PKBã¯åãªããã€ã³ã¿ãŒã§ããããã€ã³ã¿ãŒããµã€ãºããã¡ã€ã«åã¯ãããŸããã æ°ä»ãã®ã¯ã2048ãã€ãã«æãããããã¡ã€ã«ã®æã ãã§ãã
PKBã®äŸ
æãèå³æ·±ãã®ã¯PKHãã¡ã€ã«ã«æ ŒçŽãããŠããŸããããããã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸãã ãã¹ãŠã®PKHãã¡ã€ã«ã¯ãstatic.arcãšåŒã°ããåU8èšèªã®åå¥ã®ã¢ãŒã«ã€ãã«ãããŸãã
STATIC.ARCè±èª
PKHã¯ããã¡ã€ã«ã®ãµã€ãºããã€ã³ã¿ãŒãããã³ã€ã³ããã¯ã¹ãæ ŒçŽããPKBã®éåžžã«å¥åŠãªããŒã¯ã¢ããã§ãã ã€ã³ããã¯ã¹ãããã²ãŒã èªäœãäœããã®åœ¢ã§å®å šãªãã¡ã€ã«åãååŸããŸãããç§ã¯ãããåŠçããŸããã§ããã ããã¯ããŸãã«ãéå±ã§ç¡æå³ã§ãã
ãã®ã³ã³ããã®æ§é ãæåŸãŸã§å解ããããšã¯ã§ããŸããã§ãããããã¡ã€ã«ãæœåºããŠããã¯ããã®ã«ååãªå匷ãããŸããã
PKHã¯ãããããŒãšãšã³ããªãŒãšãã2ã€ã®ãããã¯ã«åå²ã§ããŸãã
public class pkhModuleEntry { public uint ID; public uint unk; public ushort sizeFile; public uint offsetFile; public pkhModuleEntry() { ID = unk = offsetFile = sizeFile = 0; } } public class pkhModule { uint Magic; uint version; uint tableOffset; uint pkhSize; uint countFiles; pkhModuleEntry[] entry; string[] extensions; ... }
ãšã³ããªãŒã¯ãtableOffsetãã€ã³ã¿ãŒããå§ãŸããŸãã ããã§ã®ã¿åé¡ã¯ããšã³ããªãããã€ãã®ãããã¯ã«åå²ãããŠããããšã§ãããã¡ã€ã«ã«é¢ãããã¹ãŠã®æ å ±ã®ããŒãã¯æ¬¡ã®ããã«è¡ãããŸãã
for (int i = 0; i < countFiles; i++) { entry[i] = new pkhModuleEntry(); entry[i].ID = mainPkhSfa.ReadUInt32(); entry[i].unk = mainPkhSfa.ReadUInt32(); } for (int i = 0; i < countFiles; i++) entry[i].sizeFile = mainPkhSfa.ReadUInt16(); for (int i = 0; i < countFiles; i++) entry[i].offsetFile = mainPkhSfa.ReadUInt32();
äžèšã®ã³ãŒãããããã¡ã€ã«ã«é¢ãããã¹ãŠã®æ å ±ã3ã€ã®ãããã¯ã«åå²ãããŠããããšãããããŸãã
- ãã¡ã€ã«ã€ã³ããã¯ã¹ãšäžæãªå€
- ãã¡ã€ã«ãµã€ãº
- ãã¡ã€ã«ãã€ã³ã¿
ç¹å®ã®ãã¡ã€ã«ãžã®ãã€ã³ã¿ãŒã¯uint32ãã€ãŸã4ãã€ãå€æ°ã«æ ŒçŽãããŠããŸããããµã€ãºã¯äœããã®çç±ã§2ãã€ãã«ãªã£ãŠããããšãããããŸãã äžèšã®ããã«ãPKBãã¡ã€ã«ã¯2048ãã€ãã«æããããŠããããããã®æ¬ é¥ã«ã€ããŠèª¬æããŸãããããã«ã¯çç±ããããŸãã ãã¡ã€ã«ãµã€ãºã¯ãã€ãåäœã§ã¯ãªããããŒã¿ãããã¯ã®éã§ç€ºãããŸãã ããšãã°ããã¡ã€ã«ãµã€ãºã¯0xCã§ãããããPKBã®ãµã€ãºã¯0xC * 0x800 = 0x6000ã«ãªããŸãã
PKHã®äŸ
ãã®æ§é ãç 究ããåŸãã¢ã³ããã«ãŒ/ããã«ãŒã¯ããã«ãªãããã§çããããç§ã¯ããã¹ããä¿åããã³ã³ããã®ç 究ãå§ããŸããã
ããã¹ãã³ã³ãã
ãã€ãã®ããã«ãæ¥æ¬äººã¯åœŒãã®ã²ãŒã ã§å¥åŠãªããšãããŸããã ã²ãŒã ã³ã³ããã®é·ãç 究ã®åŸãã²ãŒã ããã¹ããå«ã3ã€ã®é¢ã匷調衚瀺ãããŸããã
- ã³ã³ããBDAT-ããã€ãã®ããŒã¿ãšè¡ãåªå 床ã·ã¹ãã ïŒã¡ãã¥ãŒãååŒãèšå®ïŒèªäœãä¿åããŸãã
- SBã³ã³ãã-å± äœè ãšã®äŒè©±ãå«ãã¹ã¯ãªãããšè¡ãä¿åããŸãã
- ã³ã³ããREV-ã«ããã·ãŒã³ã§äœ¿çšãããããŒã¿ãšã©ã€ã³ãä¿åããŸãã
æ¥æ¬äººã¯åœŒãã®ç·ã«éåžžã«ããè¿ã¥ããŸããããç§ãã¡ã¯ãã®äºå®ããŸã£ãã奜ãŸãªãã£ãã
åã³ã³ããã§æå·åãããã®ã¯æååã®ã¿ã§ããæå·åã¢ã«ãŽãªãºã ã1ã€ã ã䜿çšãããŠããå Žåãããã¯åé¡ã«ãªããŸããã ããããæ®å¿µãªãããæ¥æ¬äººã¯åã³ã³ããã§ç¬èªã®æå·åã¢ã«ãŽãªãºã ãéçºããããšã決å®ããŸãããããã«ãããå€ãã®åé¡ãçºçããŸããã
ãã®ãããã¯ã§ã¯ãBDATã³ã³ãããŒãšãã®æå·åã¢ã«ãŽãªãºã ã«ã€ããŠã®ã¿èª¬æããŸããSBã³ã³ãããŒã®æå·åã«ã€ããŠã¯äœãèšããŸããããREVã³ã³ãããŒã®æå·åã«ã€ããŠã¯äœãèšããŸããã 圌ããããã³ã°äžã§ãã
BDATã³ã³ãããŒ
ç§ããããã³ã°ããæåã®ã³ã³ããã¯BDATã§ããã äžèŠãããšã圌ãããã¹ããèªåã®äžã«ä¿åããŠããããšãç解ããããšã¯å°é£ã§ããã ããããç§ãã¡ã¯æã§ãããããªãã£ãã®ã§ãããã«ãã®åœ¢åŒã«ã€ããŠã°ãŒã°ã«ã«è¡ããŸããã ãã®ã³ã³ããã®æ§é ã«é¢ããããã€ãã®æ å ±ãå€åœã®ãã©ãŒã©ã ã§èŠã€ãããããã¹ããããã«ä¿åãããŠãããšãã蚌æ ãæäŸãããŸããã ãããæœåºãããœãããŠã§ã¢ãèŠã€ãããŸããããäœããã®çç±ã§åœŒã¯ç§ã®ãã¡ã€ã«ãé£ã¹ãŸããã§ããã å€åœã®ãã©ãŒã©ã ãæ€çŽ¢ãããšãããã²ãŒã ã®ããŒãžã§ã³ã«ã¯ãªãŒãã³ããã¹ããå«ãŸããŠããããšãããããŸãããããã¡ã€ã«ã«ã¯è¡šç€ºãããŸããã æ å ±ã®æµããšããŸããŸãªä»®å®ãããã«ç§ã®é ã«æµã蟌ã¿ãŸãããã1ã€ã ããçå®ã§ãã-æ¥æ¬äººã¯æå·åãããæå·åãããŠããŸããã æ¹æ³ãç解ããããã«æ®ã£ãŠããããšã1ã€ã ããããŸãã
ããã€ãã®æäœã®åŸãæå·åãããBDATãšå ã®BDATãå«ãã¡ã¢ãªãã³ããæã«å ¥ãããããã®ãã¡ã€ã«ãåæããããã»ã¹ãéå§ãããŸããã ãã¡ã€ã«ã®æ¯èŒã«å€ãã®æéãè²»ãããåŸãæå·åãç解ã§ããŸããã§ããã ç§ã¯ãã¿ãŒã³ãèŠãŸããã§ããããããŠãããã¥ãŒããå¯äžã®æ¹æ³ããããŸããïŒ
æ®å¿µãªãããDolphinã«ã¯ãã ããªããããã¬ããããŸãïŒãŸãã¯ãããããããŠããããã°ã«äœ¿çšã§ãããã¹ãŠã®æ©èœãããPCSXãããã¬ã«æ £ããŸããïŒã ç§ã¯ã¡ã¢ãªBDATã®ã©ã®é åã埩å·åããããã«bricã眮ãããèŠã€ããªããã°ãªããŸããã§ããããDolphinã¯ã¢ãã¬ã¹ã®ã³ãã³ãã«ã®ã¿ããããoprããã®èªã¿åã/æžã蟌ã¿ã«ãã¬ãŒã¯ã眮ãããšãã§ããŸããã RAMã¯ã©ã®ããã«èªèããŠããªããããããåé¡ã«ãªã£ãŠããŸãã ãããã°çšã®è¿œå æ©èœãåããDolphinã®æ€çŽ¢ãå§ãŸãã1ã€ãèŠã€ãããŸãã-ããŒãžã§ã³4ã«åºã¥ãDolphin DebugFastã¯ã1ã€ã®æ©èœã®ã¿ãè¿œå ããŸãã-RAM RAMã®èªã¿åã/æžã蟌ã¿ãå¿ èŠãªãã®ãèããããã«ããã¯ã«é²ã¿ãŸããã
ç§ã®èšæ¶ã®äžã«å¿ èŠãªããŒã¿ã®ã»ã¯ã·ã§ã³ãèŠã€ããã®ã§ãç§ã¯ã¬ã³ã¬ãã»ããã¢ããããã²ãŒã ããã®BDATã解èªããæ¹æ³ãç 究ãå§ããŸããã ãã¹ãŠãã·ã³ãã«ã§ãããšåæã«èå³æ·±ããã®ã§ããããšãå€æããŸããã BDATã«ã¯2ãã€ãã®ããŒããããæåã®ãã€ãã¯R5ã¬ãžã¹ã¿ã«ããŒãããã2çªç®ã®ãã€ãã¯R0ã«ããããããŒããããŸãããŸãã埩å·åã®éå§æã«1ïŒtrueïŒã«èšå®ãããããŒã«å€æ°ããããŸãã
ããŒã«å€æ°ã1ã«èšå®ãããŠããå Žåãã¬ãžã¹ã¿R5ã䜿çšããŠåŸ©å·åãè¡ããã0ã®å Žåãã¬ãžã¹ã¿R0ã䜿çšããŠåŸ©å·åãè¡ãããŸãã
æå·åã¯åçŽãªXORã«åºã¥ããŠããã埩å·åã®é åºã¯æ¬¡ã®ãšããã§ãã
- æå·åããããã€ã=æå·åããããã€ã^ RïŒ5ãŸãã¯0ïŒ
- RïŒ5ãŸãã¯0ïŒ=ïŒæå·åããããã€ã+ RïŒ5ãŸãã¯0ïŒïŒïŒ0xFF
- ããŒã«å€ãå察ã®å€ã«å€æŽããŸã
CïŒã³ãŒãïŒ
public static void BDAT_DecryptPart(int offset, int size, ushort key, MemoryStream data) { data.Position = offset; int endOffset = offset + size; if (endOffset > data.Length) endOffset = (int)data.Length; bool reg = true; byte _r0 = (byte)(0xFF - (key & 0xFF)); byte _r5 = (byte)(0xFF - (key >> 8 & 0xFF)); byte inByte = 0; while (offset < endOffset) { inByte = data.GetBuffer()[offset]; if (reg) { data.GetBuffer()[offset] = (byte)(inByte ^ _r5); _r5 = (byte)((_r5 + inByte) & 0xFF); reg = false; } else { data.GetBuffer()[offset] = (byte)(inByte ^ _r0); _r0 = (byte)((_r0 + inByte) & 0xFF); reg = true; } offset += 1; } }
æå·åã¯éåžžã«èå³æ·±ãããã«èšèšãããŠããã次ã®åãã€ãã¯éå»ã«äŸåããŠããŸãã ããã«ã埩å·åã®ããã®ãªãœãŒã¹ã¯ã»ãšãã©æ¶è²»ãããŸããããããã°ãªãã§ã¯ã¢ã«ãŽãªãºã ã®æ¬è³ªãç解ããããšã¯ã§ããŸããã
æå·åãçµäºãããšãBDATèªäœã®æ§é ãç解ãå§ããŸããã æååããŒã¿ã解èªããåŸããã¡ã€ã«ã®å é ã§ãããã€ãã®ãããã¯ã®ååã®ããã«ãããã€ãã®ååãèªèãããŸããã
äŸ
0x2C-0x66ã§æå·åããããããã¯ã
ããããç§ã¯ãã®ãããã¯ã®åæã延æããäžè¬çãªæ§é ãæ±ãããšã«ããŸããã å°é£ãªåæã«ãããããããŒã0x20ãã€ããã䜿çšããªãããšãæããã«ãªããŸããããã®æ§é ã以äžã«èª¬æããŸãã
ããããã¹ãŠå®çŸ©ããã®ã§ãæ·±ãã¯è¿°ã¹ãŸãããããããã®åãã€ãã®æå³ãç°¡åã«èª¬æããŸãã
class header { public uint magic; public byte mode; public byte unk; public ushort offsetToNameBlock; public ushort sizeTableStruct; public ushort unkTableOffset; public ushort unk2; public ushort offsetToMainData; public ushort countEntryMain; public ushort unk3; public ushort unk4; public ushort cryptKey; public uint offsetToStringBlock; public uint sizeStringBlock; ... }
- ããžãã¯ã¯äžå®ã§ãããåžžã«BDATïŒansiïŒãšçãã
- ã¢ãŒã-1ïŒæå·åãªãã3ïŒæå·å
- unk-ãåç¥ã®ããã«ãäžæã§ããããã®ãã€ãã¯åžžã«ãŒãã§ã
- offsetToNameBlock-ãããã¯åãæã€æå·åããããããã¯ãžã®ãã€ã³ã¿ãŒ
- sizeTableStruct-ãã¹ãŠã®ããŒã¿ãå«ã1ãããã¯ã®ãµã€ãº
- unkTableOffset-æåŸãŸã§è§£æã§ããªãã£ãããŒãã«ãžã®ãã€ã³ã¿
- unk2-äžæã§ãããåžžã«0x3D
- offsetToMainData-ãã¹ãŠã®ããŒã¿ãå«ããããã¯ãžã®ãã€ã³ã¿ãŒ
- countEntryMain-offsetToMainDataãã€ã³ã¿ãŒã«ãããããã¯æ°ïŒMainDataãããã¯ã®ãµã€ãºã¯æ¬¡ã®ããã«èšç®ã§ããŸãïŒsizeTableStruct * countEntryMainïŒ
- unk3-äžæãåžžã«0x01
- unk4-äžæãåžžã«0x02
- cryptKey-2ãã€ãã®åŸ©å·åããŒ
- offsetToStringBlock-ããã¹ããå«ããããã¯ãžã®ãã€ã³ã¿ãŒ
- sizeStringBlock-ããã¹ãä»ãã®ãããã¯ãµã€ãºïŒããã¹ãããªãå Žåã¯0ã«çããïŒ
ããããŒã®åŸãäžæãªããŒã¿ã¯offsetToNameBlockã«éãããŸããããã¯ãMainDataã®ãããã¯ã«é¢ãããã®æ å ±ã次ã®æ§é ãæã£ãŠããããšãå€æããããã§ãã
class typeStruct { public byte unk; public byte type; public ushort idx; ... }
- unk-äžæ
- type-ããŒã¿å
- idx-MainDataã®ãã€ã³ã¿ãŒïŒæ£ç¢ºãªãã€ã³ã¿ãŒã¯ãoffsetToMainData +ïŒIndexStructure * sizeTableStructïŒ+ idxã®ããã«èšç®ãããŸã
ãããŠãæåŸã®ãããã¯ã¯æ®ããŸãã-offsetToNameBlockãããã¯æ¬¡ã®æ§é ãæã£ãŠããŸãïŒ
class nameBlock { public string bdatName; public nameBlockEntry[] nameEntry; public nameBlock(StreamFunctionAdd sfa, int countName) { bdatName = sfa.ReadAnsiStringStopByte(); sfa.SeekValue(2); nameEntry = new nameBlockEntry[countName]; for (int i = 0; i < countName; i++) { nameEntry[i] = new nameBlockEntry(sfa); } } } class nameBlockEntry { public ushort offsetToStructType; public ushort unk; public string name; public typeStruct type; public nameBlockEntry(StreamFunctionAdd sfa) { offsetToStructType = sfa.ReadUInt16(); unk = sfa.ReadUInt16(); name = sfa.ReadAnsiStringStopByte(); type = new typeStruct(sfa, offsetToStructType); sfa.SeekValue(2); } }
ç§ã¯ããããŒã®ã©ãã«ãèŠã€ãããªãå€æ°countNameã®ã¿ãéžæãããã®ã§ãããNameBlock 0x20ãžã®ãã€ã³ã¿ãŒãååŸãããã®æ°å€ã4ã§å²ãããšã§èšç®ã§ããŸããçç±ã¯æ¬¡ã®ãšããã§ããããããŒã¯ãæ§é ããšã«4ãã€ããããMainDataã®ãããã¯ã®æ§é ã«é¢ããæ å ±ãåãåããŸãã ãããã£ãŠããã®ãããªæ§é ã®æ°ã調ã¹ãã«ã¯ãæ§é ã«é¢ããæ å ±ã®ã¿ã®ãµã€ãºãç¥ãããã®ãµã€ãºã§å²ãå¿ èŠããããŸããã€ãŸãã4ã§ãã
äžèŠè€éãªæ§é ã«èŠããŸãããå¥ã®æ¹æ³ã§èª¬æããããšæããŸãã
ãã¹ãŠã®ããŒã¿ãä¿åããããããã¯-MainDataããããŸãã ãã®ãããã¯ã¯ããã€ãã®ãããã¯ã«åå²ããããã®æ°ã¯å€æ°countEntryMainã«ãã£ãŠèšè¿°ããããã®ãããªãããã¯ã®ãµã€ãºã¯å€æ°sizeTableStructã«ãã£ãŠèšè¿°ãããŸãã ãã ãããã®ãããª1ã€ã®ãããã¯ã«æ ŒçŽãããããŒã¿ã¯ãtypeStructã¯ã©ã¹ã䜿çšããŠæ¢ã«èª¬æãããŠããŸããtypeStructã¯ã©ã¹ã®æ°ã¯1ããè€æ°ãŸã§ã§ãã typeStructããšã«ãnameBlockEntryã«ä¿åãããååããããŸãã
ããã ãã§ããBDATã¯å解ããããœãããŠã§ã¢ã¯ãªããã³ã°ãããŠãæ£åžžã«èãããã¹ããæœåº/眮æããŸããã
BDATããååŸããè¡ã®äŸ
ãããã«
ãã®ãããã¯ã§ã¯ãäŒèª¬ã®Wiiã²ãŒã ã®1ã€ãããã¯ããŠããã¡ã€ã«ãã¹ã«ãŠãããªãããã«æ¥æ¬äººãããããããšããç¶ããæ¹æ³ã玹ä»ããŸããã
ããããããã®ã²ãŒã ã§ã¯ãã©ãŒãããã®åæãç¶ç¶ãããã§ãããããããã¯æ£ç¢ºã§ã¯ãããŸããã ç§ã®èšäºãæ°ã«å ¥ã£ããã ãã€ãªãã¶ãŒããªã¡ã€ã¯ãšãã€ãªãã¶ãŒããŒãã®ç¿»èš³ã«ã€ããŠã話ããŸãã
ãæéãããã ãããããšãããããŸãïŒ
PSããã¯ãã®ãããªãããã¯ã«é¢ããç§ã®æåã®èšäºã§ããã¹ãªãããæããªãã§ãã ããããã ã¡ã«ãšã©ãŒãææããæ¹ãè¯ãã§ãã 圌ã¯å¿ èŠãªãã®ãå®å šã«æããã«ããªãã£ããã説æããªãã£ããããããŸããããã®ãããªãšã©ãŒãäºåºŠãšèµ·ãããªãããã«ãããã瀺ããŠãã ããã