class GmdHeader(Struct): STRUCT_SIZE = 40 magic: ft.uint() version: ft.uint() language: ft.uint() unk1: ft.uint() unk2: ft.uint() key_count: ft.uint() string_count: ft.uint() key_block_size: ft.uint() string_block_size: ft.uint() name_size: ft.uint() def __init__(self, parent, index, data, offset): super().__init__(parent, index, data, offset) self.name = self.read_name() def read_name(self): bstring = self.data[GmdHeader.name_size. after:GmdHeader.name_size.after + self.name_size] try: return bstring.decode("UTF-8") except Exception: return "" @property def total_size(self): return GmdHeader.name_size.after + self.name_size + 1
class MkitEntry(Struct): STRUCT_SIZE = 20 result_item_id: ft.uint() research_points: ft.uint() melding_points: ft.uint() category: ft.uint() unk1: ft.uint()
class MskEntry(Struct): STRUCT_SIZE = 20 id: ft.uint() note1: ft.uint( ) # note: any notes at FF FF FF FF means that it doesn't exist note2: ft.uint() note3: ft.uint() note4: ft.uint()
class RemFile(ft.Struct): STRUCT_SIZE = 110 signature: ft.uint() signatureExt: ft.short() id: ft.uint() drop_mechanic: ft.uint() item_ids: ext.blist(ft.uint(), count=16) item_qtys: ext.blist(ft.ubyte(), count=16) item_chances: ext.blist(ft.ubyte(), count=16) def iter_items(self): for i in range(16): item_id = self.item_ids[i] item_qty = self.item_qtys[i] item_chance = self.item_chances[i] if item_id and item_qty and item_chance: yield (item_id, item_qty, item_chance)
class GmdInfoItem(Struct): STRUCT_SIZE = 32 string_index: ft.uint() hash_key_2x: ft.int() hash_key_3x: ft.int() pad: ft.pad(4) key_offset: ft.long() list_index: ft.long()
class EqCrtEntry(Struct): STRUCT_SIZE = 33 equip_type: ft.ubyte() equip_id: ft.ushort() key_item: ft.ushort() unk1: ft.int() unk2: ft.uint() rank: ft.uint() item1_id: ft.ushort() item1_qty: ft.ubyte() item2_id: ft.ushort() item2_qty: ft.ubyte() item3_id: ft.ushort() item3_qty: ft.ubyte() item4_id: ft.ushort() item4_qty: ft.ubyte() unk3: ft.pad(4)
class RodInseEntry(Struct): STRUCT_SIZE = 28 id: ft.uint() attack_type: ft.ubyte() # 0 = Server, 1 = Blunt unk1: ft.ubyte() # unknown, could be GMD. Currently the same as id. unk2: ft.ubyte() base_model_id: ft.ushort() tree_id: ft.byte() cost: ft.uint() rarity: ft.ubyte() power: ft.ushort() speed: ft.ushort() heal: ft.ushort() unk3: ft.ushort() dust_type: ft.ushort() # 0 = blast, 1 = heal, 2 = paralysis, 3 = poison tree_position: ft.ubyte() unk4: ft.ushort() # can't be GMD, as dragonsoul is OOB
class LbmBaseEntry(Struct): STRUCT_SIZE = 14 rarity: ft.ubyte() equip_type: ft.ubyte() crafting_cost: ft.uint() item1_id: ft.ushort() item1_qty: ft.ushort() item2_id: ft.ushort() item2_qty: ft.ushort()
class KireEntry(Struct): STRUCT_SIZE = 18 id: ft.uint() red: ft.ushort() orange: ft.ushort() yellow: ft.ushort() green: ft.ushort() blue: ft.ushort() white: ft.ushort() purple: ft.ushort()
class AmDatEntry(Struct): STRUCT_SIZE = 60 id: ft.uint() order: ft.ushort() variant: ft.ubyte() set_id: ft.ushort() type: ft.ubyte() equip_slot: ft.ubyte() defense: ft.ushort() mdl_main_id: ft.ushort() mdl_secondary_id: ft.ushort() icon_color: ft.ubyte() pad8: ft.ubyte() icon_effect: ft.ubyte() rarity: ft.ubyte() cost: ft.uint() fire_res: ft.byte() water_res: ft.byte() ice_res: ft.byte() thunder_res: ft.byte() dragon_res: ft.byte() num_gem_slots: ft.ubyte() gem_slot1_lvl: ft.ubyte() gem_slot2_lvl: ft.ubyte() gem_slot3_lvl: ft.ubyte() set_skill1: ft.short() set_skill1_lvl: ft.ubyte() set_skill2: ft.short() set_skill2_lvl: ft.ubyte() skill1: ft.short() skill1_lvl: ft.ubyte() skill2: ft.short() skill2_lvl: ft.ubyte() skill3: ft.short() skill3_lvl: ft.ubyte() gender: ft.ubyte() pad11: ft.ubyte() pad12: ft.ubyte() pad13: ft.ubyte() set_group: ft.ushort() gmd_name_index: ft.ushort() gmd_desc_index: ft.ushort() is_permanent: ft.ubyte()
class SgpaEntry(Struct): STRUCT_SIZE = 28 id: ft.uint() order: ft.uint() size: ft.uint() skill1_id: ft.uint() skill1_incr: ft.uint() skill2_id: ft.uint() skill2_incr: ft.uint()
class WpDatGEntry(Struct): STRUCT_SIZE = 69 id: ft.uint() unk1: ft.ushort() base_model_id: ft.short() part1_id: ft.short() part2_id: ft.short() unk7: ft.ubyte() color: ft.ubyte() tree_id: ft.ubyte() is_fixed_upgrade: ft.ubyte() muzzle_type: ft.ubyte() barrel_type: ft.ubyte() magazine_type: ft.ubyte() scope_type: ft.ubyte() crafting_cost: ft.uint() rarity: ft.ubyte() raw_damage: ft.ushort() defense: ft.ushort() affinity: ft.byte() element_id: ft.ubyte() element_damage: ft.ushort() hidden_element_id: ft.ubyte() hidden_element_damage: ft.ushort() elderseal: ft.ubyte() shell_table_id: ft.ushort() deviation: ft.ubyte() num_gem_slots: ft.ubyte() gem_slot1_lvl: ft.ubyte() gem_slot2_lvl: ft.ubyte() gem_slot3_lvl: ft.ubyte() unk2: ft.uint() unk3: ft.uint() unk4: ft.uint() unk5: ft.ubyte() special_ammo_type: ft.ubyte() tree_position: ft.ubyte() order: ft.ushort() gmd_name_index: ft.ushort() gmd_description_index: ft.ushort() skill_id: ft.ushort() unk6: ft.ushort()
class WpDatEntry(Struct): STRUCT_SIZE = 66 id: ft.uint() unk1: ft.ubyte() unk6: ft.ubyte() base_model_id: ft.ushort() part1_id: ft.ushort() part2_id: ft.ushort() unk7: ft.ubyte() color: ft.ubyte() tree_id: ft.ubyte() is_fixed_upgrade: ft.ubyte() crafting_cost: ft.uint() rarity: ft.ubyte() kire_id: ft.ubyte() handicraft: ft.ubyte() raw_damage: ft.ushort() defense: ft.ushort() affinity: ft.byte() element_id: ft.ubyte() element_damage: ft.ushort() hidden_element_id: ft.ubyte() hidden_element_damage: ft.ushort() elderseal: ft.ubyte() num_gem_slots: ft.ubyte() gem_slot1_lvl: ft.ubyte() gem_slot2_lvl: ft.ubyte() gem_slot3_lvl: ft.ubyte() wep1_id: ft.ushort() wep2_id: ft.ushort() unk2: ft.uint() unk3: ft.uint() unk4: ft.uint() tree_position: ft.ubyte() order: ft.ushort() gmd_name_index: ft.ushort() gmd_description_index: ft.ushort() skill_id: ft.ushort() unk5: ft.ushort()
class EqCusEntry(Struct): STRUCT_SIZE = 41 equip_type: ft.ubyte() equip_id: ft.ushort() key_item_id: ft.ushort() unk1: ft.int() unk2: ft.uint() unk3: ft.uint() item1_id: ft.ushort() item1_qty: ft.ubyte() item2_id: ft.ushort() item2_qty: ft.ubyte() item3_id: ft.ushort() item3_qty: ft.ubyte() item4_id: ft.ushort() item4_qty: ft.ubyte() descendant1_idx: ft.ushort() descendant2_idx: ft.ushort() descendant3_idx: ft.ushort() descendant4_idx: ft.ushort() unk4: ft.ubyte() group: ft.ubyte() unk5: ft.ushort()
class OAmDatEntry(Struct): STRUCT_SIZE = 42 id: ft.uint() set_id: ft.ushort() equip_slot: ft.ubyte() unk1: ft.ubyte() defense: ft.uint() rarity: ft.ubyte() list_order: ft.ushort() model_id: ft.uint() crafting_cost: ft.uint() variant: ft.ubyte() unk2: ft.ubyte() unk3: ft.ubyte() unk4: ft.ubyte() fire_res: ft.byte() water_res: ft.byte() ice_res: ft.byte() thunder_res: ft.byte() dragon_res: ft.byte() unk5: ft.uint() set_group: ft.ushort() gmd_name_index: ft.ushort() gmd_desc_index: ft.ushort()
class StmpEntry(Struct): STRUCT_SIZE = 40 id: ft.uint() unk1: ft.ushort() unk3: ft.ushort() unk4: ft.ushort() unk6: ft.ushort() client_id: ft.int() unk7: ft.uint() rp_cost: ft.uint() item1_id: ft.uint() item2_id: ft.uint() item1_qty: ft.uint() item2_qty: ft.uint()
class ItmEntry(Struct): STRUCT_SIZE = 32 id: ft.uint() sub_type: ft.ubyte() type: ft.uint() rarity: ft.ubyte() carry_limit: ft.ubyte() unk_limit: ft.ubyte() order: ft.ushort() flags: ft.uint() icon_id: ft.uint() icon_color: ft.ubyte() carry_item: ft.ubyte() sell_price: ft.uint() buy_price: ft.uint()
class AmrsEntry(Struct): STRUCT_SIZE = 4 id: ft.uint()
class WepWslEntry(Struct): STRUCT_SIZE = 7 id: ft.uint() note1: ft.ubyte() note2: ft.ubyte() note3: ft.ubyte()
class MibHeader(ft.Struct): STRUCT_SIZE = (17 * 4) + (6 * 2) + 3 mibSignature: ft.ushort() padding: ft.uint() mibId: ft.uint() starRating: ft.ubyte() unk1: ft.uint( ) # Looks to be HR vs LR, in terms of damage modifiers (zorah quests are 6star and LR damage) unk2: ft.uint() rankRewards: ft.uint() # LR or HR? mapId: ft.uint() unk4: ft.uint() playerSpawn: ft.uint() binaryMapToggle: ft.uint() dayNightControl: ft.uint() weatherControl: ft.uint() unk5: ft.uint() zennyReward: ft.uint() faintPenalty: ft.uint() unk6: ft.uint() questTimer: ft.uint() unk7: ft.ubyte() monsterIconId: ext.blist(ft.ushort(), 5) hrRestriction: ft.ubyte() # difficulty modifier unk8: ft.uint()
class SedEntry(Struct): STRUCT_SIZE = 12 equip_type: ft.uint() equip_id: ft.uint() cost: ft.uint()
class WepGlanEntry(Struct): STRUCT_SIZE = 8 id: ft.uint() type: ft.ushort() level: ft.ushort()
class WepSaxeEntry(Struct): STRUCT_SIZE = 7 id: ft.uint() unk1: ft.ubyte() unk2: ft.ubyte() unk3: ft.ubyte()
class MibObjectiveSection(ft.Struct): STRUCT_SIZE = (13 * 4) + 4 unk1: ft.uint() unk2: ft.uint() highlightedUnknown2: ft.uint() questType: ft.ubyte() questTypeIcon: ft.ubyte() atFlag: ft.ubyte() # 02 enables AT global modifier unk3: ft.ubyte() rem_ids: ext.blist(ft.uint(), count=3) suppId1: ft.uint() unk4: ft.uint() # suppid 2? unk5: ft.uint() # suppid 3? unk6: ft.uint() hrPoints: ft.uint() unk7: ft.uint() unk8: ft.uint()