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 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 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 BreedListEntry(Model): SIZE = 28 bHP = ByteField(0) bAtk = ByteField(1) bDef = ByteField(2) bDex = ByteField(3) bSAtk = ByteField(4) bSDef = ByteField(5) bType1 = ByteField(6) bType2 = ByteField(7) bCatchRatio = ByteField(8) bBaseExp = ByteField(9) wBattleBonuses = WordField(10) wDrop1 = WordField(12) wDrop2 = WordField(14) bFemaleRatio = ByteField(16) bHatchTime = ByteField(17) bInitIntimate = ByteField(18) bExpType = ByteField(19) bEggGroup1 = ByteField(20) bEggGroup2 = ByteField(21) bSpecialty1 = ByteField(22) bSpecialty2 = ByteField(23) bEscapeRatio = ByteField(24) # unk0 = ByteField(25) wReserved = WordField(26)
class Pilot(Model): SIZE = 0x20 START = 0x020285F4 # 我方 start: 0x020285F4, step: 0x20, length: 0x63 pilot = WordField(0, label="人物") exp = WordField(2, label="经验") # 决定等级 max:0xC000 sp = WordField(4, label="精神点数") # 03E7 killed = WordField(6, label="击坠") # 03E7 skill_1 = ByteField(8, label="特技1") skill_2 = ByteField(9, label="特技2") skill_1_status = ByteField(10, label="特技1状态") skill_2_status = ByteField(11, label="特技2状态") enable = ByteField(12, label="状态开关") help_atk = ByteField(13, label="援攻") # 09 help_def = ByteField(14, label="援防") # 09 energy = ByteField(15, label="气力") # 96 # group = ByteField(16, label="敌我状态") # 0: 我方(蓝), 1: 第三方(黄), 2: 不可控我方(蓝), 3: 敌方(红) points = ByteField(17, label="奖励点数") # FF # 养成能力 develop = ArrayField(18, 6, ByteField(0), label=( '养成:格斗', '养成:射击', '养成:防御', '养成:技量', '养成:回避', '养成:命中', )) skill_chip = ArrayField(24, 4, ByteField(0), label="技能芯片")
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): hp = WordField(0x0201326E, label="HP") hpmax = WordField(0x02013272, label="最大HP") mp = WordField(0x02013270, label="MP") mpmax = WordField(0x02013274, label="最大MP") str = WordField(0x02013276, label="STR") con = WordField(0x02013278, label="CON") int = WordField(0x0201327A, label="INT") lck = WordField(0x0201327C, label="LCK") level = ByteField(0x201326D, label="等级") invincible1 = ToggleField(0x08020910, enable=0, disable=0x04008008, label="不会扣血") enemy_static = ToggleField(0x020004BE, size=2, enable=0xFFFF, disable=0, label="敌人静止") invincible2 = ToggleField(0x02000502, size=1, enable=0xFF, disable=0, label="暂时无敌") monster_flag = ArrayField(0x02013394, 7, Field(0)) skill_flag = ArrayField(0x02013386, 3, WordField(0)) soul_flag = ArrayField(0x02013310, 31, Field(0)) equip_counts = ArrayField(0x020132A8, 104, ByteField(0)) tool_counts = ArrayField(0x02013288, 32, ByteField(0)) enemy_flag = ArrayField(0x02013394, 12, Field(0)) map_flag = ArrayField(0x020000AC, 0x145, WordField(0)) extra_flag = Fields(ByteField(0x02000060), ByteField(0x02000F4D)) boss_rush_flag = ByteField(0x020000A1)
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 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 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 Character(Model): health = WordField(0x1364, label="HP") health_max = WordField(0x1366, label="最大HP") coord = CoordField(0x30, label="坐标") # idle = Field(0x10E0) # target = Field(0x2DA4, label="目标") # ai = Field(0x2DA8, label="AI") # attack_reaction = Field(0x1358) # merce_kill_counter = Field(0x25BC) invincible = ToggleField(0x135C, label="无敌", enable=0, disable=1) items = ArrayField(0x21A8, 24, ModelField(0, IngameItem))
class Global(Model): tp = ByteField(0x020091CF, label="TP") favors = ArrayField(0x020091A0, 8, ByteField(0)) # 好感度 member_num = ByteField(0x020069DC, label="队伍人数") members = ArrayField(0x020069DD, 5, ByteField(0), label="队员") item_num = ByteField(0x020091DD, label="道具数量") items = ArrayField(0x02006DBC, 16, ModelField(0, ItemSlot)) kill_slot = WordField(0x020028E2, label="必杀槽") rage = WordField(0x020028EC, label="RAGE") battle_time = ByteField(0x020028F6, label="战斗时间") person_battles = ArrayField(0, 6, ModelField(0, PersonBattle)) # 战斗中人物信息 event_items = ArrayField(0x02008170, 10, WordField(0)) # 事件道具
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 Person(Model): SIZE = 0xA0 hp_max = WordField(0x020069F8, label="HP上限") resist = WordField(0x020069FA, label="RESIST") str = ByteField(0x020069FC, label="STR") mgc = ByteField(0x020069FD, label="MGC") agl = ByteField(0x020069FE, label="AGL") vit = ByteField(0x020069FF, label="VIT") hp_heal = ByteField(0x02006A01, label="HP回复%") resistance = ArrayField(0x02006A02, 5, SignedField(0, size=1), label="抗性") adaptive = ByteField(0x02006A07, label="全抗性") skills = Field(0x02006A18, bytes, 0x48)
class Global(BaseGlobal): time = Field(0x02041C9C) money = Field(0x02000250) get_money = Field(0x0203059C) get_exp = Field(0x020305A0) battlein = WordField(0x02000498) # 城镇中坐标 town_x = WordField(0x02030EC6) town_y = WordField(0x02030ECE) # 世界地图中坐标 map_x = WordField(0x02030DB6) map_y = WordField(0x02030DAE)
class SavedItem(Model): """整理界面个人物品""" SIZE = 0x2C type = WordField(0x0, label="种类") quantity = Field(0x4, label="数量/武器弹药") max_quantity = Field(0x8, label="最大数量/武器弹药") fire_power = WordField(0x1C, label="火力升级") reload_speed = ByteField(0x1E, label="装弹速度升级") capacity = ByteField(0x1F, label="容量升级") critical = ByteField(0x21, label="爆头率升级") attack_range = ByteField(0x21, label="攻击范围升级") piercing = ByteField(0x22, label="贯穿伤害升级") scope = ByteField(0x24, label="瞄准镜升级") model = Field(0x28, label="模型")
class Character(Model): """角色""" id = Field((0x010C, 0x16), bytes, 6) health = WordField(0x0F10, label="生命值") health_max = WordField(0x0F12, label="生命值上限") invincible = ToggleField(0x0FC4, enable=0, disable=1, label="无敌") stamina = Field(0x3B00, float, label="体力") stamina_max = Field(0x3B04, float, label="体力上限") coord = CoordField(0x50, label="坐标") moving_speed = Field(0x54, float, label="移动速度") cur_item = ByteField(0x46D8) # 当前使用的物品序号(只读) items = ArrayField(0x46E0, 24, ModelField( 0, IngameItem)) # 水平武器: 0~6, 药丸: 7, 垂直武器: 8~12 其他物品: 15~23 rapid_fire = Field(0x4F4C, float, label="快速开火") fix_weapon_switch = Field(0x46D0, float) # 竖行武器切换至横行武器时的修正? is_wet = Field(0x2E34, label="是否湿了")
class BattleCard(Model): SIZE = 2 _value = WordField(0) value = BitsField(0, 2, 0, 12) flag = BitsField(1, 1, 4, 4) # 1: 在卡组1中, 2: 在卡组2中, 4: 在卡组3中 def value_to_indexs(self): value = self.value if value < 430: return value // 10, value % 10 return value - 430, 1 def indexs_to_value(self, a, b): self.value = a * 10 + b if a < 43 else a + 430 @property def card_type(self): return self.value_to_indexs()[0] @card_type.setter def card_type(self, type): _, value = self.value_to_indexs() self.indexs_to_value(type, value) @property def card_value(self): return self.value_to_indexs()[1] @card_value.setter def card_value(self, value): type, _ = self.value_to_indexs() self.indexs_to_value(type, value)
class Person(Model): punch = ByteField(0) foot = ByteField(1) arms = ByteField(2) defense = ByteField(3) strong = ByteField(7) attack = ByteField(4) agile = ByteField(5) jump = ByteField(6) stamina = ByteField(8) hp = ByteField(10) hpmax = ByteField(12) money = Field(64) items = ArrayField(68, 12, WordField(0)) skills = ArrayField(92, 12, WordField(0)) skillkeys = ArrayField(116, 12, WordField(0))
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 Chariot(Model): SIZE = 0x256 # name = Field(0x021A1B8C, type=bytes, size=10) sp = WordField(0x21A1B9E, label="装甲") chassis = ModelField(0x021A1BA0, ChariotEquipInfo, label="底盘") equips = ArrayField(0x021A1BB4, 8, ModelField(0, ChariotEquipInfo), label="装备") # C装置,引擎,引擎2,洞1~5 items = ArrayField(0x021A1C54, 9, ModelField(0, ChariotItemInfo), label="道具") special_bullets = ArrayField(0x21A1DC6, 15, ModelField(0, ItemInfo), label="特殊炮弹") exportable_fields = ('equips', 'items', 'special_bullets') def health(self): for equip in self.equips: equip.status = 0 @classmethod def item_type(self, id): if 0x028F <= id < 0x02CC: return 'item' elif 0x02CC <= id < 0x0326: return 'engine' elif 0x0326 <= id < 0x034E: return 'control' elif 0x034E <= id < 0x04AE: return 'weapon'
class Global(Model): invincible = ByteField(0x0074) hp = ByteField(0x007A) lives = ByteField(0x007B) money = MulFieldPrep(10, WordField(0x007C)) weapon = ByteField(0x0081) arrow = ByteField(0x0527)
class Chariot(PersonChariot): sp = WordField(0x64E8) items = ArrayField(0x65CF, 8, ByteField(0)) equips = ArrayField(0x6627, 8, ModelField(0, ChariotEquip)) weight = WordField(0x64D2) defense = WordField(0x64FE) bullet = ByteField(0x651F) special_bullets = ArrayField(0x03003DE1, 8, ByteField(0)) # 特殊炮弹 special_bullets_count = ArrayField(0x03003E39, 8, ByteField(0)) # 特殊炮弹 main_bullets_count = ByteField(0x6535) # 主炮弹药 se_bullets_count = ByteField(0x654B) # SE弹药 def set_index(self, i): super().set_index(i) field = self.field('equips') field.offset = field.origin_offset + i self.equips.offset = field.offset
class Global(Model): hp = ByteField(0x0202B62C, label="HP") hpmax = ByteField(0x0202B723, label="最大HP") limit_time = ByteField(0x02022CDC, label="生命") # 限时关卡的时间 lives = ByteField(0x0202A5D0, label="限时关卡的时间") invincible = ByteField(0x0202B634, label="无敌") money = WordField(0x0202B79E, label="水晶") level = ByteField(0x0202B718, label="等级") weapon_flag = ByteField(0x0202B728, label="武器") element_flag = ByteField(0x0202B729) weapon_level = Field(0x0202B734) weapon_level_1 = ByteField(0x0202B734, label="光弹枪等级") weapon_level_2 = ByteField(0x0202B735, label="光束刀等级") weapon_level_3 = ByteField(0x0202B736, label="三尖矛等级") weapon_level_4 = ByteField(0x0202B737, label="护盾回旋镖等级") fairy_flag = ArrayField(0x0202B744, 5, Field(0)) fairy_use_count = ArrayField(0x0202B758, 5, WordField(0))
class Person(PersonChariot): # name = Field(0, bytes, 0xF) exp = Field(0x64C9, size=3) level = ByteField(0x647E) hp = WordField(0x6466) hpmax = WordField(0x6460) atk = WordField(0x646C) defense = WordField(0x6472) strength = ByteField(0x6481) intelli = ByteField(0x6484) stamina = ByteField(0x648A) speed = ByteField(0x6487) battle = ByteField(0x648d) fix = ByteField(0x6490) drive = ByteField(0x6493) equips = ArrayField(0x6496, 8, ByteField(0)) items = ArrayField(0x64AE, 8, ByteField(0)) equip_flag = ByteField(0x64C6) # 第一个装备状态是最高位0x80
class Global(BaseGlobal): money = Field(0x0202AA50) turns = WordField(0x0202AA58) chapter = ByteField(0x0202AA56) person_addr = Field(0x02003114) curx = WordField(0x0202AA1C) cury = WordField(0x0202AA1E) persons = ArrayField(0x202AB78, 0xff, ModelField(0, Person)) train_items = ArrayField(0x02039430, 100, ModelField(0, ItemSlot)) # 运输队 # Hack code inf_move = ToggleFields( ToggleField(0x08017B80, size=2, enable=0x2000, disable=0x2002), ToggleField(0x08017EEA, size=2, enable=0x2100, disable=0x2102), ToggleField(0x0801B976, size=2, enable=0x2000, disable=0x2040), ToggleField(0x0802A0C8, size=2, enable=0x2000, disable=0x2040)) # 无限行动 item_count_keep = ToggleField(0x08016940, size=2, enable=0x46C0, disable=0x1812) # 武器耐久度不减 proficiency_max = ToggleField(0x080256CC, size=2, enable=0x22FB, disable=0x1C02) # 武器熟练度最大 ability_up_1 = ToggleField(0x080250CC, size=2, enable=0x2001, disable=0x1C20) # 全能力成长1点 ability_up_2 = ToggleField(0x080250CC, size=2, enable=0x2002, disable=0x1C20) # 全能力成长2点 got_100exp = ToggleField(0x080258D0, size=2, enable=0x2464, disable=0x1824) # 战后升级 # got_100exp = ToggleFields( # ToggleField(0x080258BA, size=2, enable=0x2064, disable=0x2001), # ToggleField(0x080258D0, size=2, enable=0x2464, disable=0x1824), # ToggleField(0x08025994, size=2, enable=0x46C0, disable=0xDD00), # ToggleField(0x080259C6, size=2, enable=0x2064, disable=0x200A) # ToggleField(0x080259CC, size=2, enable=0x3064, disable=0x300A) # ) support_quickly = ToggleField(0x08022B72, size=2, enable=0x7039, disable=0x7038) # 好感度快速提升
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
class Person(Model): SIZE = 8 # name = Field(0, bytes, 0xF) exp = Field(0x0, size=3, label="经验") level = ByteField(0x03003D69, label="等级") hp = WordField(0x03003D41, label="HP") hpmax = WordField(0x03003D43, label="HP上限") atk = WordField(0x03003D45, label="攻击") defense = WordField(0x03003D47, label="守备") power = ByteField(0x03003D6A, label="腕力") intelli = ByteField(0x03003D6B, label="知力") stamina = ByteField(0x03003D6C, label="体力") speed = ByteField(0x03003D6D, label="速度") battle = ByteField(0x03003D6E, label="战斗") drive = ByteField(0x03003D6F, label="驾驶") fix = ByteField(0x03003D70, label="修理") # 装备、道具代码0x80以上表示装备状态 equips = ArrayField(0x03003D91, 8, BitsField(0, 1, 0, 7)) items = ArrayField(0x03003DB9, 8, BitsField(0, 1, 0, 7))
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)