class Global(BaseGlobal): # chapter = ByteField(0x0202BCFA) # turns = WordField(0x0202BCFC) person_addr = Field(0x021BED30) curx = ByteField(0x02273BD4) # 0x02272EA4 cury = ByteField(0x02273BD5) # 0x02272EA5 # persons = ArrayField(0x202be48, 0xff, ModelField(0, Person)) train_items = ArrayField(0x022C7420, 100, ModelField(0, ItemSlot)) # 运输队 ourturn = ToggleField(0x021CC278, enable=0xE3A01001, disable=0xE5D01000) control_enemy = ToggleField(0x021D5674, enable=0xE1500000, disable=0xE1510000) upgrade_max = ToggleField(0x02050AC0, enable=0xB1A06004, disable=0xB2866001) upgrade_all = ToggleField(0x02050A98, enable=0xE1A00000, disable=0xAA000009) lv1_can_transfer = ToggleField(0x02049EE0, enable=0x00000001, disable=0xE350000A) can_train = ToggleField(0x021EBE08, enable=0xE3A00002, disable=0xEBF98E8F) can_visit = ToggleField(0x021ECB14, enable=0xE3A00002, disable=0xEBF98B4C) can_holddown = ToggleField(0x021EBBD8, enable=0xE3A00002, disable=0xEBF98F1B) use_enemy_prof = ToggleField(0x021D4CEC, enable=0xEA000022, disable=0x1A000022) infinite_refine = ToggleField(0x02069683, size=1, enable=0, disable=0xE3) item_consume = ToggleField(0x02051650, size=2, enable=0x0000, disable=0x0001) enemy_item_drop = ToggleField(0x021F8CE0, size=8, enable=0xE3500000E1D006B0, disable=0xE3100020E5D00063) exp_rate = Field(0x021F4DA8) pro_rate = Field(0x021F4F5C) config = ModelPtrField(0x021BD44C, Config, 4) # iteminfo_base = Field(0x0227A748) _iteminfos = ArrayField(0x022AA97C, 0xff, ModelField(0, ItemInfo)) @property def _offset(self): return self.handler.read32(0x021BD44C) - 0x022BEAA0 @property def iteminfos(self): self.field('_iteminfos').offset = self.handler.read32(0x0227A748 + self._offset) return self._iteminfos
class RubySapphireJp(BaseGlobal): active_pokemon_count = Field(0x03004280) active_pokemon = ModelField(0x03004290, PokemonStructActives) stored_pokemon = Field(0x0202FDC0) _player_name = Field(0x02024C04, bytes, 10) _player_id = Field(0x02024C0E) xor_mask = 0 money = MaskedField(Field(0x02025924)) coin = MaskedField(WordField(0x02025928)) dust = WordField(0x02026864) menu = Field(0x020267B4) decorate = Field(0x02027B34) badge = Field(0x020267B5) clock_adjustment = Field(0x02024C9C) per_day_random = Field(0x0202681C) spray_time = WordField(0x02026816) safari_balls = ByteField(0x02038504) safari_time = WordField(0x02038506) daycare_center_step_1 = ByteField(0x02028540) daycare_center_step_2 = ByteField(0x02028544) step_counter = ByteField(0x0202854A) exp_gain = SignedField(0x0202494C, size=2) _iemfield = PokemonItemField(0) item_normal = ArrayField(0x020259F4, 0x14, _iemfield) item_keyitem = ArrayField(0x02025A44, 0x14, _iemfield) item_pokeball = ArrayField(0x02025A94, 0x10, _iemfield) item_machine = ArrayField(0x02025AD4, 0x40, _iemfield) item_berry = ArrayField(0x02025BD4, 0x2E, _iemfield) item_pokeblock = ArrayField(0x02025C8C, 0x28, _iemfield)
class EmeraldEn(PointerGlobal): NAME = "绿宝石(英文版)" active_pokemon_count = Field(0x020244E9) active_pokemon = ModelField(0x020244EC, PokemonStructActives) stored_pokemon = Field((0x03005D94, 4)) safari_balls = ByteField(0x0203A9FC) safari_time = WordField(0x0203A076) exp_gain = SignedField(0x020241F0, size=2) store = ArrayField(0x02005274, 8, ModelField(0, StoreItem)) area = WordField(0x020322E4) wild_pokemon = WordField(0x03007E28) furniture_purchase = ByteField(0x03005E3A) appearance = ByteField(0x02024A5C) Inner = EmeraldJp.Inner inner = ModelPtrField(0x03005D90, Inner) # rom breed_list = ArrayField(0x083203CC, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x00329D48) # ^ exp_list = ArrayField(0x0831F72C, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x005839A0) skill_list = Field(0x0031C898)
class Global(Model): bomb_count = ByteField(0x0082, label="炸弹数量") bomb_power = ByteField(0x0085, label="炸弹威力") lives = ByteField(0x04E5, label="生命") speed = ByteField(0x00A5, label="速度") invincible = ToggleField(0x04E6, size=1, enable=1, disable=0, label="无敌开启") invincible_time = ByteField(0x04E8, label="无敌时间") through_wall = ToggleField(0x009F, size=1, enable=1, disable=0, label="穿墙") through_bomb = ToggleField(0x00A0, size=1, enable=1, disable=0, label="穿炸弹") timebomb = ToggleField(0x00A1, size=1, enable=1, disable=0, label="定时炸弹") def time_getter(self, value, field): return ((value >> 16) & 0xFF) * 100 + ( (value >> 8) & 0xFF) * 10 + (value & 0xFF) def time_setter(self, value, field): value = int(value) return ((value // 100 % 10) << 16) | ( (value // 10 % 10) << 8) | (value % 10) time = FieldPrep(time_getter, time_setter, Field(0x0559, label="时间"))
class Inner(Model): _player_name = Field(0, bytes, 10) _player_id = Field(0x0A) xor_mask = Field(0x000000AC) money = MaskedField(Field(0x0000143C)) coin = MaskedField(WordField(0x00001440)) dust = WordField(0x000023D8) menu = Field(0x00002328) decorate = Field(0x000036E0) badge = Field(0x00002329) clock_adjustment = Field(0x00000098) per_day_random = Field(0x00002390) spray_time = WordField(0x0000238A) daycare_center_step_1 = ByteField(0x00004064) daycare_center_step_2 = ByteField(0x000040F0) step_counter = ByteField(0x000040F8) battle_points_current = WordField(0x00000EB8) battle_points_trainer_card = WordField(0x00000EBA) _iemfield = PokemonItemField(0) item_normal = ArrayField(0x0000150C, 0x1E, _iemfield) item_keyitem = ArrayField(0x00001584, 0x1E, _iemfield) item_pokeball = ArrayField(0x000015FC, 0x10, _iemfield) item_machine = ArrayField(0x0000163C, 0x40, _iemfield) item_berry = ArrayField(0x0000173C, 0x46, _iemfield) item_pokeblock = ArrayField(0x000017F4, 0x28, _iemfield)
class ItemSlot(Model): """ 第1字节为物品种类,有几个物品会用到第二个字节 (|1) 第二字节表示物品种类*8, |2 表示装备状态 """ SIZE = 2 _item = WordField(0) _item1 = ByteField(0) _count = ByteField(1) value = WordField(0) @property def item(self): return self._item & 0b0000000111111111 @item.setter def item(self, value): self._item = (self._item & 0b1111111000000000) | (int(value) & 0b0000000111111111) @property def count(self): return ((self._count & 0b11111100) >> 3) + 1 @count.setter def count(self, value): self._count = ((int(value) - 1) << 3) | (self._count & 0b11)
class RubySapphireEn(BaseGlobal): active_pokemon_count = Field(0x03004350) active_pokemon = ModelField(0x03004360, PokemonStructActives) stored_pokemon = Field(0x020300A4) _player_name = Field(0x02024EA4, bytes, 10) _player_id = Field(0x02024EAE) xor_mask = 0 money = MaskedField(Field(0x02025BC4)) coin = MaskedField(WordField(0x02025BC8)) dust = WordField(0x02026B04) menu = Field(0x02026A54) decorate = Field(0x02027DD4) badge = Field(0x02026A55) clock_adjustment = Field(0x02024F3C) per_day_random = Field(0x02026B0A) spray_time = WordField(0x02026AB6) safari_balls = ByteField(0x02038808) safari_time = WordField(0x0203880A) daycare_center_step_1 = ByteField(0x020287E0) daycare_center_step_2 = ByteField(0x020287E4) step_counter = ByteField(0x020287EA) exp_gain = SignedField(0x02024BEC, size=2) _iemfield = PokemonItemField(0) item_normal = ArrayField(0x02025C94, 0x14, _iemfield) item_keyitem = ArrayField(0x02025CE4, 0x14, _iemfield) item_pokeball = ArrayField(0x02025D34, 0x10, _iemfield) item_machine = ArrayField(0x02025D74, 0x40, _iemfield) item_berry = ArrayField(0x02025E74, 0x2E, _iemfield) item_pokeblock = ArrayField(0x02025F2C, 0x28, _iemfield)
class Global(Model): invincible = ByteField(0x0074) hp = ByteField(0x007A) lives = ByteField(0x007B) money = MulFieldPrep(10, WordField(0x007C)) weapon = ByteField(0x0081) arrow = ByteField(0x0527)
class Global(Model): hp = ByteField(0x0085) hpmax = ByteField(0x0086) tools = Field(0x009C) dragon = ByteField(0x009A) dragons = ByteField(0x00D1) invincible = ByteField(0x0056)
class Person(Model): SIZE = 0x70 prof = ByteField(0x021A0BD8, label="职业") figure = ByteField(0x021A0BD9, label="形象") level = WordField(0x021A0BDC, label="等级") level_max = ByteField(0x021A0BDE, label="等级上限") exp = WordField(0x021A0BE0, label="经验") hp = WordField(0x021A0BE4, label="当前HP") hpmax = WordField(0x021A0BE6, label="最大HP") battle_level = WordField(0x021A0BEE, label="战斗等级") drive_level = WordField(0x021A0BF0, label="驾驶等级") power = WordField(0x021A0C26, label="腕力") strength = WordField(0x021A0BEA, label="体力") speed = WordField(0x021A0BEC, label="速度") spirit = ByteField(0x021A0BF4, label="男子气概") scar = WordField(0x021A0BF2, label="伤痕") weapon_1 = WordField(0x021A0BF6, label="武器1") weapon_2 = WordField(0x021A0BF8, label="武器2") weapon_3 = WordField(0x021A0BFA, label="武器3") equip_head = WordField(0x021A0BFC, label="头部装备") equip_body = WordField(0x021A0BFE, label="上身装备") equip_hand = WordField(0x021A0C00, label="手部装备") equip_foot = WordField(0x021A0C02, label="脚部装备") equip_orn = WordField(0x021A0C04, label="装饰") skills = ArrayField(0x021A0C06, 9, ModelField(0, ItemInfo)) # (技能, 次数)数组 atk1 = WordField(0x021A0C20, label="武器1攻击力") atk2 = WordField(0x021A0C22, label="武器2攻击力") atk3 = WordField(0x021A0C24, label="武器3攻击力") defense = WordField(0x021A0C28, label="总防御力") resistance = ArrayField(0x021A0C30, 6, MinuendFieldPrep(100, WordField(0))) # 火光电声气冰
class Global(Model): bomb_count = ByteField(0x0074, label="炸弹数量") bomb_power = ByteField(0x0073, label="炸弹威力") level = ByteField(0x0058, label="选关") invincible = ByteField(0x007A, label="无敌时间") through_bomb = ToggleField(0x0078, size=1, enable=1, disable=0, label="穿炸弹") timebomb = ToggleField(0x0077, size=1, enable=1, disable=0, label="定时炸弹") through_wall = ToggleField(0x0076, size=1, enable=1, disable=0, label="穿墙")
class Global(Model): money = Field(0x02029750, label="金钱") turn = Field(0x02029760, label="回合") after_money = Field(0x020361D0, label="战后金钱") after_exp = Field(0x020361D4, label="战后经验") chapter = ByteField(0x02029776, label="关卡") intensified_parts = ArrayField(0x020297B0, 67, ByteField(0)) # 强化部件 mini_games = ArrayField(0x020297F4, 51, ByteField(0)) # 小游戏 skill_chip = ArrayField(0x02029786, 42, ByteField(0)) # 技能芯片
class Marker(BaseBlip): SIZE = 56 color = Field(0) blipType = Field(4) entity_handle = Field(8) coord = CoordField(24) index = WordField(36) bright = ByteField(38) active = ByteField(39) sprite = ByteField(52)
class PokemonStructRear(Model): SIZE = 20 bStatus = ByteField(0x00) bLevel = ByteField(0x04) wHPcur = WordField(0x06) wHPcap = WordField(0x08) wAtk = WordField(0x0A) wDef = WordField(0x0C) wDex = WordField(0x0E) wSAtk = WordField(0x10) wSDef = WordField(0x12)
class PokemonStructHeader(Model): SIZE = 32 bSex = ByteField(0x00) # @00, dwChar低8位表示性别 dwChar = DWordField(0x00) # @00, 性格値 dwID = DWordField(0x04) # @04, トレーナのID bNickName = Field(0x08, bytes, 10) # @08, ニックネーム bNickNameLanguage = ByteField(0x12) # @12, '01' = 6 bytes (jp), '02' = 10 bytes (en) bBadEgg = ByteField(0x13) # @12, '02' for daycare-center-enabled, '07' for ダメタマゴ bCatcherName = Field(0x14, bytes, 7) # @14, トレーナの名前 bMarkings = ByteField(0x1B) # @1B, only the lowest 4 bits are used wChecksum = WordField(0x1C) # @1C, Checksum
class Marker(BaseBlip): SIZE = 48 color = Field(0) blipType = Field(4) entity_handle = Field(8) coord = CoordField(20) index = WordField(3) bright = ByteField(34) active = ByteField(35) sprite = ByteField(44)
class Chariot(Model): SIZE = 8 sp = WordField(0x03003C78, label="装甲片") items = ArrayField(0x03003E91, 8, BitsField(0, 1, 0, 7)) equips = ArrayField(0x03003EE9, 8, BitsField(0, 1, 0, 7)) bullet = ByteField(0x0300404C, label="弹仓容量") defense = ByteField(0x0300404A, label="守备力") weight = WordField(0x0300404F, label="底盘重量") special_bullets = ArrayField(0x03003DE1, 8, ByteField(0)) # 特殊炮弹 special_bullets_count = ArrayField(0x03003E39, 8, ByteField(0)) # 特殊炮弹
class Global(Model): LifeField = FieldPrep(lambda ins, x, f: x - 1, lambda ins, x, f: int(x) + 1) hp_burns = LifeField(ByteField(0x00B3)) hp_smish = LifeField(ByteField(0x00B4)) hp_iron = LifeField(ByteField(0x00B5)) hp_beans = LifeField(ByteField(0x00B6)) invincible = ByteField(0x07C8) level = ByteField(0x0075) weapon_burns = ByteField(0x007F) weapon_smish = ByteField(0x0080) weapon_iron = ByteField(0x0081) weapon_beans = ByteField(0x0082)
class ChariotEquipInfo(Model): SIZE = 0x14 equip = WordField(0, label="种类") change = ByteField(5, label="超改次数") status = ByteField(6, label="损坏程度(>20:破损,>100:损坏)") ammo = ByteField(8, label="剩余弹药") star = ByteField(9, label="武器星级") defense = WordField(10, label="守备力") attr1 = WordField(12, label="C装置命中率/武器攻击力/引擎载重(0.01t)") attr2 = WordField(14, label="C装置回避率/武器弹舱容量") weight = WordField(18, label="重量(0.01t)")
class Global(Model): lives = ByteField(0x018D, label="战机数量") money = ByteField(0x018E, label="金钱") bomb_count = ByteField(0x018F, label="炸弹数量") bomb_type = ByteField(0x0190, label="炸弹种类") armor = ToggleField(0x0032, size=1, enable=0xC0, disable=0, label="护甲") power = ByteField(0x0033, label="子弹威力") bullet_type = ByteField(0x0034, label="子弹种类") bomb_power = ByteField(0x003B, label="炸弹威力") invincible = ByteField(0x06A0, label="无敌时间") bomb_time = ByteField(0x06A1, label="炸弹持续时间") level = ByteField(0x0180, label="关卡序号")
class Global(Model): lives_1 = ByteField(0x0076) lives_2 = ByteField(0x0076) medicine_1 = Fields(ByteField(0x0369), ByteField(0x0078)) medicine_2 = Fields(ByteField(0x0369), ByteField(0x0079)) invincible_1 = ByteField(0x03D2) invincible_2 = ByteField(0x03D2)
class Global(Model): # 角色指针起始 # 4.0.2: 9: 0x00914EC0-0x3F0*9 # 5.x 9: 0x00930C80-0x3F0*9 persons = ArrayField(0x0092E910, 0xff, ModelField(0, Person)) turn = WordField(0x003AE34A) # 回合数 money1 = Field(0x003AE350) money2 = Field(0x003AE354) money3 = Field(0x003AE358) exp1 = Field(0x003AE35C, type=float) exp2 = Field(0x003AE360, type=float) exp3 = Field(0x003AE364, type=float) pedid = ByteField(0x003AC8FC) # 当前人物编号 curx = ByteField(0x003C88B1) # 当前光标x坐标 cury = ByteField(0x003C88B3) # 当前光标y坐标
class Global(Model): continues = ByteField(0x03001A84, label="续关") lives = ByteField(0x03002C60, label="生命") invincible = ToggleField(0x03002CA0, size=1, enable=0xFF, disable=0, label="无敌") score = Field(0x03002C64, label="分数") weapon = ByteField(0x3002CA8, label="武器种类") hit_anywhere = ToggleField(0x080179AC, size=2, enable=0xE014, disable=0x72DC, label="Hit Anywhere")
class Person(Model): _locals = locals() for addr, name in PERSON_ATTRS: _locals[name] = ByteField(addr) del _locals
class FireLeafJp(PointerGlobal): active_pokemon_count = 0 active_pokemon = ModelField(0x020241E4, PokemonStructActives) stored_pokemon = Field((0x03005050, 4)) dust = 0 decorate = 0 clock_adjustment = 0 per_day_random = 0 safari_balls = ByteField(0x0203990C) safari_time = WordField(0x0203990E) exp_gain = SignedField(0x02023CB0, size=2) class Inner(Model): _player_name = Field(0, bytes, 10) _player_id = Field(0x0A) xor_mask = Field(0x00000AF8) money = MaskedField(Field(0x00001234)) coin = MaskedField(WordField(0x00001238)) menu = Field(0x00001F89) badge = Field(0x00001F8A) spray_time = WordField(0x00001FE4) daycare_center_step_1 = ByteField(0x00003FAC) daycare_center_step_2 = ByteField(0x00004038) step_counter = ByteField(0x0000403E) _iemfield = PokemonItemField(0) item_normal = ArrayField(0x000012B4, 0x2A, _iemfield) item_keyitem = ArrayField(0x0000135C, 0x1E, _iemfield) item_pokeball = ArrayField(0x000013D4, 0x0D, _iemfield) item_machine = ArrayField(0x00001408, 0x3A, _iemfield) item_berry = ArrayField(0x000014F0, 0x2B, _iemfield) item_pokeblock = None inner = ModelPtrField(0x0300504C, Inner)
class PokemonStructBreedInfo(Model): SIZE = 12 wBreed = WordField(0x00) # 种族ID wItem = WordField(0x02) # 持有物 dwExp = DWordField(0x04) bPointUp0, bPointUp1, bPointUp2, bPointUp3 = \ BitsField.create(0x08, 1, (2, 2, 2, 2)) bIntimate = ByteField(0x09) # 亲密度
class SkillHolder(Model): active_1 = ByteField(0x7AEB) active_2 = ByteField(0x7AEF) active_3 = ByteField(0x7B01) active_4 = ByteField(0x7B03) have_1 = ByteField(0x7C65) have_2 = ByteField(0x7C67) have_3 = ByteField(0x7C69) have_4 = ByteField(0x7C6B)
class Unit(Model): type = ModelPtrField(8, UnitType) player = ModelPtrField(0xC, Player) hp = FloatField(0x30, label='HP') ptr_unknow1 = Field(0x18, label='不明指针') selected = ByteField(0x36, label='选中状态') resource = FloatField(0x44, label='资源') ptr_unknow2 = Field(0x6C, label='不明指针2') construction_progress = FloatField(0x1FC, label="建造进度")
class IngameItem(Model): """游戏中个人物品""" SIZE = 0x1C enabled = ToggleField(4, size=1, enable=1, disable=0, label="激活") slot = ByteField(5, label="槽位") type = WordField(6, label="种类") quantity = WordField(0x0A, label="数量/武器弹药") double_quantity = WordField(0x0C, label="双枪弹药") max_quantity = WordField(0x10, label="最大数量/武器弹药") model = Field(0x18, label="模型")
class Inner(Model): _player_name = Field(0, bytes, 10) _player_id = Field(0x0A) xor_mask = Field(0x00000AF8) money = MaskedField(Field(0x00001234)) coin = MaskedField(WordField(0x00001238)) menu = Field(0x00001F89) badge = Field(0x00001F8A) spray_time = WordField(0x00001FE4) daycare_center_step_1 = ByteField(0x00003FAC) daycare_center_step_2 = ByteField(0x00004038) step_counter = ByteField(0x0000403E) _iemfield = PokemonItemField(0) item_normal = ArrayField(0x000012B4, 0x2A, _iemfield) item_keyitem = ArrayField(0x0000135C, 0x1E, _iemfield) item_pokeball = ArrayField(0x000013D4, 0x0D, _iemfield) item_machine = ArrayField(0x00001408, 0x3A, _iemfield) item_berry = ArrayField(0x000014F0, 0x2B, _iemfield) item_pokeblock = None