/
ClassData.bt
289 lines (276 loc) · 10.4 KB
/
ClassData.bt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
//-------------------------------------------------------------------------
//--- 010 Editor v9.0.2 Binary Template
//
// File: Job.bin / 11.bin / classdata.bin
// Authors: DeathChaos
// Version: 1.03
// Purpose: Three Houses character file mapping
// History
// 1.00 2019-08-28 DeathChaos - started this
// 1.01 2019-08-28 DeathChaos - added class names to struct indices
// 1.02 2019-09-11 TildeHat - added mapping to class data and abilities
// 1.03 2019-09-13 Moonling - added reclassing item
// 1.04 2019-09-14 Puddles - added mapping to class arts
//-------------------------------------------------------------------------
//---------------------------------------------
// Includes
//---------------------------------------------
#include "3H_Enums.bt"
#include "3H_ArtsEnums.bt"
LittleEndian();
struct File{
struct SectionPointers{
uint32 NumberOfSectionPointers;
uint32 ClassDataPointer<bgcolor=cRed>;
uint32 UnkSize<bgcolor=cRed>;
uint32 PointerToGenderLock<bgcolor=cPurple>;
uint32 GenderLockSize<bgcolor=cPurple>;
uint32 TierLevelPointer<bgcolor=cBlue>;
uint32 TierLevelSize<bgcolor=cBlue>;
uint32 ClassAbilityPointer<bgcolor=cDkYellow>;
uint32 ClassAbilitySize<bgcolor=cDkYellow>;
uint32 UnkPointer<bgcolor=cDkBlue>;
uint32 UnkSize<bgcolor=cDkBlue>;
uint32 UnkPointer<bgcolor=cBlack>;
uint32 UnkSize<bgcolor=cBlack>;
uint32 UnkPointer<bgcolor=cGreen>;
uint32 UnkSize<bgcolor=cGreen>;
uint32 UnkPointer<bgcolor=cDkRed>;
uint32 UnkSize<bgcolor=cDkRed>;
uint32 UnkPointer<bgcolor=cDkPurple>;
uint32 UnkSize<bgcolor=cDkPurple>;
uint32 UnkPointer<bgcolor=cDkGreen>;
uint32 UnkSize<bgcolor=cDkGreen>;
}sectionpointers<name="Section Pointers">;
FSeek(sectionpointers.ClassDataPointer);
struct ClassData
{
uint32 ClassDataMagic;
uint32 numClassData;
uint32 SizeOfClassData;
struct ClassDataHeaderPadding{
byte Padding[0x34];
}classdataheaderpadding<name="Padding">;
local int i;
for( i = 0; i < numClassData; i++ )
struct ClassBlock{
local ClassName Class<hidden=true>;
Class = i; // keeping a localvar so we can add classname to the struct indice
ushort UnknownValue;
ushort UnknownValue;
ushort UnknownValue;
ushort UnknownValue;
uint16 MaleAID;
uint16 FemaleAID;
uint32 UnknownValue;
byte HPBonus;
uint16 UnknownValue;
byte EnemyHPGrowth;
struct PlayerGrowths{
byte HPGrowth<name="HP Growth">;
byte StrGrowth<name="Str Growth">;
byte MagGrowth<name="Mag Growth">;
byte DexGrowth<name="Dex Growth">;
byte SpdGrowth<name="Spd Growth">;
byte LckGrowth<name="Lck Growth">;
byte DefGrowth<name="Def Growth">;
byte ResGrowth<name="Res Growth">;
byte MovGrowth<name="Mov Growth">;
byte CharmGrowth<name="Cha Growth">;
}playergrowths;
struct EnemyGrowths{
byte StrGrowth<name="Str Growth">;
byte MagGrowth<name="Mag Growth">;
byte DexGrowth<name="Dex Growth">;
byte SpdGrowth<name="Spd Growth">;
byte LckGrowth<name="Lck Growth">;
byte DefGrowth<name="Def Growth">;
byte ResGrowth<name="Res Growth">;
byte MovGrowth<name="Mov Growth">;
byte CharmGrowth<name="Cha Growth">;
}enemygrowths;
struct ClassBonus{
byte BonusStr<name="Bonus Str">;
byte BonusMag<name="Bonus Mag">;
byte BonusDex<name="Bonus Dex">;
byte BonusSpd<name="Bonus Spd">;
byte BonusLck<name="Bonus Lck">;
byte BonusDef<name="Bonus Def">;
byte BonusRes<name="Bonus Res">;
byte BonusMov<name="Bonus Mov">;
byte BonusCharm<name="Bonus Cha">;
}classbonus<name="Class Bonus Stats">;
struct DismountChange{
byte BaseStr<name="Str Change">;
byte BaseMag<name="Mag Change">;
byte BaseDex<name="Dex Change">;
byte BaseSpd<name="Spd Change">;
byte BaseLck<name="Lck Change">;
byte BaseDef<name="Def Change">;
byte BaseRes<name="Res Change">;
byte BaseMov<name="Mov Change">;
byte BaseCharm<name="Cha Change">;
}dismountchange<name="Dismount Stat Change">;
struct RankBonus{
byte SwordExp<name="Sword Exp">;
byte LanceExp<name="Lance Exp">;
byte AxeExp<name="Axe Exp">;
byte BowExp<name="Bow Exp">;
byte BrawlingExp<name="Brawling Exp">;
byte ReasonExp<name="Reason Exp">;
byte FaithExp<name="Faith Exp">;
byte AuthorityExp<name="Authority Exp">;
byte ArmorExp<name="Heavy Armor Exp">;
byte RidingExp<name="Riding Exp">;
byte FlyingExp<name="Flying Exp">;
}rankbonus<name="Rank Bonus">;
EquipID ShieldID;
byte ClassTier;
byte MountMapScale<name="Mount Map Scale">;
byte UnitMapScale<name="Unit Map Scale">;
byte UnknownValue;
byte UnknownValue;
byte UnknownValue;
byte BaseHP;
byte UnknownValue;
byte BanMovement<name="Movement Ban FF is banned">;
byte UnknownValue;
byte UnknownValue;
byte UnknownValue;
byte ClassType;
struct ClassProperty{
ubyte bit0 : 1<name="Mounted">;
ubyte bit1 : 1<name="Hand to Hand">;
ubyte bit2 : 1<name="Flying">;
ubyte bit3 : 1<name="Magic Usage">;
ubyte bit4 : 1<name="Reserve">;
ubyte bit5 : 1<name="Reserve">;
ubyte bit6 : 1<name="Reserve">;
ubyte bit7 : 1<name="Reserve">;
}classproperty<name="Class Property">;
SpellID Spell1;
SpellID Spell2;
struct BaseStats{
byte BaseStr<name="Base Str">;
byte BaseMag<name="Base Mag">;
byte BaseDex<name="Base Dex">;
byte BaseSpd<name="Base Spd">;
byte BaseLck<name="Base Lck">;
byte BaseDef<name="Base Def">;
byte BaseRes<name="Base Res">;
}basestats<name="Base Stats">;
uint32 UnknownValue;
uint16 UnknownValue;
struct UnknownEnemyAbility1{
AbilityID Ability1;
AbilityID Ability2;
AbilityID Ability3;
AbilityID Ability4;
AbilityID Ability5;
}unknownenemyability1;
struct UnknownEnemyAbility2{
AbilityID Ability1;
AbilityID Ability2;
AbilityID Ability3;
AbilityID Ability4;
AbilityID Ability5;
}unknownenemyability2;
struct HardEnemyAbility{
AbilityID Ability1;
AbilityID Ability2;
AbilityID Ability3;
AbilityID Ability4;
AbilityID Ability5;
}hardenemyability;
struct LunaticEnemyAbility{
AbilityID Ability1;
AbilityID Ability2;
AbilityID Ability3;
AbilityID Ability4;
AbilityID Ability5;
}lunaticenemyability;
}classblock<name="Class Block",read=MyStructToStringC>;
}classdata<bgcolor=cDkBlue,name="Class Data">;
FSeek(sectionpointers.PointerToGenderLock);
struct GenderLock
{
uint32 GenderLockMagic;
uint32 numGenderLock;
uint32 SizeOfGenderLock;
struct GenderLockHeaderPadding{
byte Padding[0x34];
}genderlockheaderpadding<name="Padding">;
local int i;
struct Requirements{
for( i = 0; i < numGenderLock; i++ )
struct GenderLockID{
local ClassName Class<hidden=true>;
Class = i; // keeping a localvar so we can add classname to the struct indice
ubyte MinLv<name="Min Lv Requirement (?)">;
ItemID RequiredItem<name="Required Item for Reclassing">;
ubyte MaleFlag<name="Male Flag">;
ubyte FemaleFlag<name="Female Flag">;
MinRanks rank0<name="Minimum Sword Requirement">;
MinRanks rank1<name="Minimum Lances Requirement">;
MinRanks rank2<name="Minimum Axes Requirement">;
MinRanks rank3<name="Minimum Bows Requirement">;
MinRanks rank4<name="Minimum Brawling Requirement">;
MinRanks rank5<name="Minimum Reason Requirement">;
MinRanks rank6<name="Minimum Faith Requirement">;
MinRanks rank7<name="Minimum Authority Requirement">;
MinRanks rank8<name="Minimum Armor Requirement">;
MinRanks rank9<name="Minimum Riding Requirement">;
MinRanks rank10<name="Minimum Flying Requirement">;
}genderlockid<name="Class Requirements",read=MyStructToString>;
}requirements<name="Class Requirements">;
}genderlock<bgcolor=cDkGreen,name="Certification Requirements">;
FSeek(sectionpointers.TierLevelPointer);
struct TierLevel
{
uint32 TierLevelMagic;
uint32 numTierLevel;
uint32 SizeOfTierLevel;
struct TierLevelHeaderPadding{
byte Padding[0x34];
}tierlevelheaderpadding<name="Padding">;
byte Zero;
byte Beginner;
byte Intermediate;
byte Advanced;
byte Master;
byte Padding[3];
}tierlevel<bgcolor=cDkRed,name="Tier Level Requirements">;
FSeek(sectionpointers.ClassAbilityPointer);
struct ClassAbility
{
uint32 ClassAbilityMagic;
uint32 numClassAbility;
uint32 SizeOfClassAbility;
struct ClassAbilityHeaderPadding{
byte Padding[0x34];
}classabilityheaderpadding<name="Padding">;
local int i;
for( i = 0; i < numClassAbility; i++ )
struct AbilityBlock{
local ClassName Class<hidden=true>;
Class = i; // keeping a localvar so we can add classname to the struct indice
AbilityID MasteredAbility;
ArtID MasterArt;
AbilityID ClassAbility1;
AbilityID ClassAbility2;
AbilityID ClassAbility3;
}classblock<name="Ability Block",read=MyStructToStringA>;
}classabilities<bgcolor=cDkBlue,name="Class Abilities">;
}file;
string MyStructToString(GenderLockID& value)
{
return EnumToString(value.Class);
}
string MyStructToStringA(AbilityBlock& value)
{
return EnumToString(value.Class);
}
string MyStructToStringC(ClassBlock& value)
{
return EnumToString(value.Class);
}