Thanks Xifanie,
The ideas you crossed out are probably what I'm going to wind up doing. For job data, simply knowing that FFTPatcher displays the HPC/HPM/etc. stats in the right order makes it easy to search memory for those byte sequences (eg [11, 125, 11] gets me 3 addresses corresponding to Ramza's 3 Squire jobs). I've already used the gameshark export tab to make some manual save state modifications (like adding abilities to a skillset), just for the sake of experimentation.
I was just checking to see if my work had already been done for me! I'll keep at it and report back.
Right, I'm interested in the raw, low-level data structure with the assumption that I might need to do some additional coding to properly interpret that data, and the recognition that some things might be unusually complicated (such as the overlapping tables you mention).
This is true if your goal is to design an intuitive UI for modders (which is the purpose of FFTPatcher), but for would-be hackers that want to understand the game it could be confusing. If the UI suggested that each ability included its own bit array for inflicting statuses, when what's actually there is a reference to a status payload from a different list, that would confuse anyone who tried to write their own tool to do something that FFTPatcher wasn't designed for. And I'm not really sure what I'm going to to want to do until later. For now, the first thing I want to do to query job stats and sort them, like this. (Data for this came from Aerostar's Battle Mechanics Guide, which is great but doesn't work for mods)
That's a great idea, though I confess setting up a new dev environment wasn't originally in my immediate plans.
The ideas you crossed out are probably what I'm going to wind up doing. For job data, simply knowing that FFTPatcher displays the HPC/HPM/etc. stats in the right order makes it easy to search memory for those byte sequences (eg [11, 125, 11] gets me 3 addresses corresponding to Ramza's 3 Squire jobs). I've already used the gameshark export tab to make some manual save state modifications (like adding abilities to a skillset), just for the sake of experimentation.
I was just checking to see if my work had already been done for me! I'll keep at it and report back.
QuoteAlso, you might be thinking of a simple data structure, but that would require more coding.
Right, I'm interested in the raw, low-level data structure with the assumption that I might need to do some additional coding to properly interpret that data, and the recognition that some things might be unusually complicated (such as the overlapping tables you mention).
QuoteFor example, FFTPatcher should really auto-calculate Inflict Statuses and Item Stats, fuse the duplicates together, and automatically assign an ID that the user should not even be able to see... i.e. those tabs should not even exist and they should be part of the Abilities and Items tabs. Of course, those tables have a limited number of rows, but if this was all automatically calculated, it would not be that easy to reach the max.
This is true if your goal is to design an intuitive UI for modders (which is the purpose of FFTPatcher), but for would-be hackers that want to understand the game it could be confusing. If the UI suggested that each ability included its own bit array for inflicting statuses, when what's actually there is a reference to a status payload from a different list, that would confuse anyone who tried to write their own tool to do something that FFTPatcher wasn't designed for. And I'm not really sure what I'm going to to want to do until later. For now, the first thing I want to do to query job stats and sort them, like this. (Data for this came from Aerostar's Battle Mechanics Guide, which is great but doesn't work for mods)
Code Select
$ python jobdata.py HPM MPM SPM PAM MAM | egrep "(Generic|Holy.Knight|Holy.Swordsman)"
63 [65, 80, 50, 50, 70] Calculator (0x5a) Generic
70 [55, 50, 100, 30, 115] Bard (0x5b) Generic
80 [80, 70, 100, 75, 75] Mediator (0x54) Generic
82 [80, 75, 100, 75, 80] Chemist (0x4b) Generic
82 [90, 50, 110, 100, 60] Thief (0x53) Generic
83 [60, 50, 100, 110, 95] Dancer (0x5c) Generic
87 [70, 50, 120, 120, 75] Ninja (0x59) Generic
88 [120, 50, 100, 120, 50] Lancer (0x57) Generic
89 [100, 75, 100, 90, 80] Squire (0x4a) Generic
91 [75, 110, 100, 50, 120] Oracle (0x55) Generic
91 [100, 65, 100, 110, 80] Archer (0x4d) Generic
92 [70, 125, 90, 50, 125] Summoner (0x52) Generic
93 [75, 75, 100, 128, 90] Samurai (0x58) Generic
95 [75, 120, 100, 50, 130] Time Mage (0x51) Generic
100 [120, 80, 100, 120, 80] Knight (0x4c) Generic
101 [75, 120, 100, 60, 150] Wizard (0x50) Generic
102 [80, 120, 110, 90, 110] Priest (0x4f) Generic
104 [110, 95, 100, 110, 105] Geomancer (0x56) Generic
106 [135, 80, 110, 129, 80] Monk (0x4e) Generic
108 [140, 100, 100, 100, 100] Holy Knight (0x1e) Special
108 [140, 100, 100, 100, 100] Holy Knight (0x34) Special
109 [140, 50, 120, 120, 115] Mime (0x5d) Generic
114 [135, 100, 110, 120, 105] Holy Knight (0x5) Special
122 [160, 120, 110, 122, 100] Holy Swordsman (0xd) Special
Quote from: RaijiniliI was considering IronPython for this purpose: load up the FFTPatcher libs, write some wrappers, and query from Python. IronPython is a Python that runs on the same virtual machine that C# uses, allowing reuse of the existing C# objects.
Make me do it.
That's a great idea, though I confess setting up a new dev environment wasn't originally in my immediate plans.