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 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 Person(Model): SIZE = 0x48 prof = Field(4) level = ByteField(8) exp = ByteField(9) no = ByteField(11) moved = ByteField(12) posx = ByteField(16) posy = ByteField(17) hpmax = ByteField(18) hp = ByteField(19) power = ByteField(20) skill = ByteField(21) speed = ByteField(22) defense = ByteField(23) magicdef = ByteField(24) lucky = ByteField(25) physical_add = ByteField(26) together = ByteField(27) # 同行人物序号 move_add = ByteField(29) items = ArrayField(30, 5, ModelField(0, ItemSlot)) proficiency = ArrayField(40, 8, ByteField( 0)) # 武器熟练度(剑、枪、斧、弓、杖、理、光、暗 E级:01 D级:1F C级:47 B级:79 A级:B5 S级:FB) status = ByteField(48) # 状态种类 status_turn = ByteField(49) # 状态持续回合数 support = ArrayField(50, 10, ByteField(0)) # 支援等级 unkonw_ptr = Field(60)
class ItemInfo(Model): SIZE = 0x3C name_ptr = Field(0x04) # 名称指针 desc_ptr = Field(0x08) # 介绍文本指针 icon = ByteField(0x0C) # 图标序号 type = ByteField(0x10) # 类型 0: 剑, 枪, 斧, 弓, 魔, 杖, 龙石, 弩车 level = ByteField(0x12) # 要求熟练度 00: -, 01: E, 1F: D, 4C: C, 88: B power = ByteField(0x15) # 威力 hit = ByteField(0x16) # 命中 kill = ByteField(0x17) # 必杀 weight = ByteField(0x18) # 重量 range_min = ByteField(0x19) # 最小射程 range_max = ByteField(0x1A) # 最大射程 move_add = ByteField(0x1B) # 属性增加效果 hp_add = ByteField(0x1C) power_add = ByteField(0x1D) magic_add = ByteField(0x1E) skill_add = ByteField(0x1F) speed_add = ByteField(0x20) lucky_add = ByteField(0x21) defense_add = ByteField(0x22) magicdef_add = ByteField(0x23) attr1 = ByteField(0x24) attr2 = ByteField(0x25) attr3 = ByteField(0x26) attr4 = ByteField(0x27) attr5 = ByteField(0x28) attr6 = ByteField(0x29) attr7 = ByteField(0x2A) attr8 = ByteField(0x2B) attr9 = ByteField(0x2C) attr10 = ByteField(0x2D) attr11 = ByteField(0x2E) attr12 = ByteField(0x2F)
class Vehicle(Entity, GTA3Vehicle): SIZE = 0xa18 hp = Field(0x4c0, float) num_passengers = Field(0x484, int, 1) max_passengers = Field(0x488, int, 1) dirt = Field(0x4b0, float) # 0.0~15.0 _tranler = Field(0x4c8, int) door_status = Field(0x4f8, int) body_color = Field(0x434, int, 1) stripe_color = Field(0x435, int, 1) body2_color = Field(0x436, int, 1) stripe2_color = Field(0x437, int, 1) @property def name(self): model_id = self.model_id try: item = next(filter(lambda x: x[1] == model_id, VEHICLE_LIST)) return item[0] except Exception: return None @property def grad(self): return self.pos.grad @grad.setter def grad(self, val): self.pos.grad = val @property def passengers(self): offset = 0x460 for i in range(9): yield Player(self.handler.read32(self.addr + offset), self.context) offset += 4 @property def driver(self): addr = self.handler.read32(self.addr + 0x460) if addr: return Player(addr, self.context) @property def trailer(self): ptr = self._tranler return Vehicle(ptr, self.context) if ptr else None def lock_door(self): self.door_status = 2 def unlock_door(self): self.door_status = 1 def flip(self): grad = self.grad grad[0] = -grad[0] grad[1] = -grad[1]
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 PlayerManager(Model): player_config = ModelPtrField(0xA4, PlayerConfig) physics_config = ModelPtrField(0xDC, PhysicsConfig) bank_size = Field((0x230, 0x40), label='仓库空间') weapon_deck_size = Field(0x1DC, label='武器装备空间') backpack_size = Field(0x1D8, label='背包大小') backpack_used_space = Field(0x1F8, label='背包已用空间')
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 RubyJp(RubySapphireJp): NAME = "红宝石(日文版)" # rom breed_list = ArrayField(0x081D09CC, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x00000000) # ^ exp_list = ArrayField(0x081CFD2C, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x0039A648) skill_list = Field(0x001CCEE0)
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 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 SapphireJp(RubySapphireJp): NAME = "蓝宝石(日文版)" # rom breed_list = ArrayField(0x081D095C, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x00000000) # ^ exp_list = ArrayField(0x081CFCBC, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x0039A62C) skill_list = Field(0x001CCE70)
class SapphireEn(RubySapphireEn): NAME = "蓝宝石(英文版)" # rom breed_list = ArrayField(0x081FEBA8, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x00000000) # ^ exp_list = ArrayField(0x081FDF08, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x003C55BC) skill_list = Field(0x001FB0BC)
class FireEn(FireLeafEn): NAME = "火红(英文版)" # rom breed_list = ArrayField(0x08254784, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x0025E026) # ^ exp_list = ArrayField(0x08253AE4, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x003DB028) skill_list = Field(0x00250C04)
class LeafEn(FireLeafEn): NAME = "叶绿(英文版)" # rom breed_list = ArrayField(0x08254760, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x0025E006) # ^ exp_list = ArrayField(0x08253AC0, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x003DAE64) skill_list = Field(0x00250BE0)
class LeafJp(FireLeafJp): NAME = "叶绿(日文版)" # rom breed_list = ArrayField(0x08211168, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x0021AA0E) # ^ exp_list = ArrayField(0x082104C8, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x003A0568) skill_list = Field(0x0020D5E8)
class FireJp(FireLeafJp): NAME = "火红(日文版)" # rom breed_list = ArrayField(0x0821118C, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x0021AA2E) # ^ exp_list = ArrayField(0x082104EC, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x003A06F8) skill_list = Field(0x0020D60C)
class RubyEn(RubySapphireEn): NAME = "红宝石(英文版)" # rom breed_list = ArrayField(0x081FEC18, 412, ModelField(0, BreedListEntry)) deoxys_breed_abilities = Field(0x00000000) # ^ exp_list = ArrayField(0x081FDF78, 8, ArrayField(0, 0x65, Field(0))) item_list = Field(0x003C5564) skill_list = Field(0x001FB12C)
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 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 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 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 WeaponItem(Model): id = Field(0) # 武器id state = Field(0x4, int) ammo_clip = Field(0x8, int) # 弹夹数 ammo = Field(0xC, int) # 弹药数 def set(self, other): if isinstance(other, WeaponItem): self.id = other.id self.ammo = other.ammo elif isinstance(other, (tuple, list)): self.id, self.ammo = other
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 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 TeamConfig(Model): """团队属性""" moxxi_drink_duration = FloatField(0x10BC, label='莫西饮酒时长') skill_mgr = ModelPtrField((0xC98, 0x58), SkillManager, label='技能') ability_cooldown = ModelPtrField(0xC58, AbilityCooldown, label='主技能冷却') damage_heals_self = FloatField(0xD54) team_ammo_regen = FloatField(0xFE0, label='团队弹药回复') explosives_heal_allies = FloatField(0x114C) bullets_heal_allies = FloatField(0x1110) badass_tokens = FloatField(0x182C, label='坏小子徽章') badass_bonuses = ArrayField((0x183C, 0), 14, Field(0)) # 坏小子加成效果 team_kill_skill_timer_mult = FloatField(0x1A7C) damage_taken_mult = FloatField(0x590, label='伤害倍数?') shock_time = FloatField(0x4A0, label='闪电时间') corrosive_time = FloatField(0x4B4, label='腐蚀时间') fire_time = FloatField(0x48C, label='火焰时间') frost_time = FloatField(0x4DC, label='冰冻时间') melee_damage = FloatField(0x374, label='近战伤害') physical_damage = FloatField(0x608, label='物理伤害') explosive_damage = FloatField(0x5E0, label='爆炸伤害') shock_damage = FloatField(0x5CC, label='闪电伤害') corrosive_damage = FloatField(0x5F4, label='腐蚀伤害') fire_damage = FloatField(0x5B8, label='火焰伤害') frost_damage = FloatField(0x630, label='冰冻伤害')
class TeamConfig(Model): """团队属性""" skill_mgr = ModelPtrField((0xB74, 0x58), SkillManager, label='技能') ability_cooldown = ModelPtrField(0xB64, AbilityCooldown, label='主技能冷却') damage_heals_self = FloatField(0xBF4) team_ammo_regen = FloatField(0xE58, label='团队弹药回复') explosives_heal_allies = FloatField(0xF90) bullets_heal_allies = FloatField(0xF54) badass_tokens = FloatField(0x1664, label='坏小子徽章') badass_bonuses = ArrayField((0x1678, 0), 14, Field(0)) # 坏小子加成效果 team_kill_skill_timer_mult = FloatField(0x18A4) bullets_resistance = FloatField(0x4A0, label='普通抗性') physical_resistance = FloatField(0x580, label='物理抗性') melee_resistance = FloatField(0x4C8, label='近战抗性') explosive_resistance = FloatField(0x5A8, label='爆炸抗性') shock_resistance = FloatField(0x5D0, label='闪电抗性') corrosive_resistance = FloatField(0x5F8, label='腐蚀抗性') fire_resistance = FloatField(0x620, label='火焰抗性') slag_resistance = FloatField(0x648, label='紫渣抗性') elemental_resistance = FloatField(0x4B4, label='元素抗性') grenades_resistance = FloatField(0x4DC, label='手榴弹/枪桶抗性') rockets_resistance = FloatField(0x4F0, label='火箭炮抗性') chock_time = FloatField(0x464, label='闪电时间') corrosive_time = FloatField(0x478, label='腐蚀时间') fire_time = FloatField(0x450, label='火焰时间') melee_damage = FloatField(0x374, label='近战伤害') physical_damage = FloatField(0x57C, label='物理伤害') explosive_damage = FloatField(0x554, label='爆炸伤害') shock_damage = FloatField(0x540, label='闪电伤害') corrosive_damage = FloatField(0x568, label='腐蚀伤害') fire_damage = FloatField(0x52C, label='火焰伤害') slag_damage = FloatField(0x590, label='紫渣伤害')
class Global(Model): turn = ByteField(0x058C, label='前/后半场') minutes = ByteField(0x06C2, label='剩余分钟') seconds_1 = ByteField(0x06C3, label='秒十位数') seconds_0 = ByteField(0x06C4, label='秒个位数') our_points = ByteField(0x0166, label='我方进球') enemy_points = ByteField(0x0167, label='敌方进球') basketry = Field(0x057E, size=6, label='球筐耐久') basketry_left_bottom = ByteField(0x057E, label='左下球框耐久') # 08 左下球框不掉 basketry_right_bottom = ByteField(0x057F, label='右下球框耐久') # 08 右下球框不掉 basketry_left_middle = ByteField(0x0580, label='左中球框耐久') # 06 左中球框不掉 basketry_right_middle = ByteField(0x0581, label='右中球框耐久') # 06 右中球框不掉 basketry_left_top = ByteField(0x0582, label='左上球框耐久') # 05 左上球框不掉 basketry_right_top = ByteField(0x0583, label='右上球框耐久') # 05 右上球框不掉 ball_owner = ByteField(0x053F, label='球所在') # 球在人手里(0~3),地上或空中(6) ball_form = ByteField(0x0518, label='球形态') # 原数据-->修改后 # 横坐标清除必杀释放限制静态地址: # 0x18cfc-10-->00 # 0x18d00-60-->80 # 0x18d91-10-->00 # 0x18d95-60-->80 # 纵坐标清除必杀释放限制静态地址: # 0x18d06-05-->06 # 0x18d9b-05-->06 skill_anywhere = ToggleFields()
class Weapon(Model): level = Field(0x230, label='需求等级') real_magazine_size = FloatField(0x3B0, label='计算弹夹容量') base_magazine_size = FloatField(0x3B4, label='基本弹夹容量') current_ammo = FloatField(0x3CC, label='当前弹药') total_ammo = FloatField(0x390, label='总弹药数') # all_ammo = ModelPtrField(0x3BC, Value, label='包含弹夹的总弹药数') calculated_damage = FloatField(0x2BC, label='计算伤害') base_damage = FloatField(0x2C0, label='基本伤害') calculated_accuracy = FloatField(0x2A8, label='计算偏移率') base_accuracy = FloatField(0x2AC, label='基本偏移率') calculated_fire_rate = FloatField(0x294, label='计算射击延迟') base_fire_rate = FloatField(0x298, label='基本射击延迟') calculated_bullets_used = Field(0x398, label='计算使用子弹') base_bullets_used = Field(0x39C, label='基本使用子弹') item_price = Field(0x21C, label='物品价格')