ItemPMT(Item Parameter Table)是 PSO 客户端和服务器共享的「物品属性表」。 游戏里每一件武器、铠甲、盾牌、插件、mag、消耗品的基础属性、名称索引、装备要求、描述文本、外观模型全部定义在这张表里。 掉落分布(ItemPT)和稀有池(ItemRT)都不管「物品长什么样」,它们只管「什么时候、以什么概率掉」,最终要去 ItemPMT 里查这件物品的所有详细参数。
ItemPMT 可以理解为游戏的「物品字典」。任意物品 ID 拿到手,去 ItemPMT 查一次就能得到:
每次客户端把物品读到存档、每次玩家查看物品详情、每次服务器判定能否装备,都依赖这张表。
ItemPMT 是一个用 PRS 压缩封装的二进制文件,不同版本的 PSO 各有一份:
ItemPMT-bb-v4.prs — PSOBB 正式服 / Ephinea 使用ItemPMT-gc-v3.prs — GameCube 版(Episode I & II)ItemPMT-gc-ep3.prs — Episode III 卡片版ItemPMT-xb-v3.prs — Xbox 版ItemPMT-pc-v2.prs — PC v2 版ItemPMT-dc-v1.prs / ItemPMT-dc-v2.prs — Dreamcast v1/v2 版武器条目保存的字段大致分三类:
+9 就是 9)铠甲和盾牌使用相同的数据结构,只是分别存放在两张不同的子表里。每个条目包含:
min–max 范围,实际装备时随机)+N)插件是一个相对简单的条目:
/ 符号的插件(如 HP/Restorate、HP/Resurrect)的触发概率或冷却值
某些插件是「判定型」而不是「数值型」,比如 Smartlink(灵感之环)、V501/V502、Trap Vision。
它们在 ItemPMT 里并没有数值字段,而是被游戏代码按 ID 硬编码识别,触发特殊效果。
Mag 的参数表是 ItemPMT 里最特别的一块。每个 Mag 条目包含:
Mag 的「喂养规则」(feed table)在 ItemPMT 里是一张巨大的表:Mag 型号 × 29 种食物,每格决定吃这个食物时 DEF/POW/DEX/MIND/SYNC/IQ 怎么变。
消耗品条目最简单,基本只有:
魔法书(Technique Disk)虽然归在「Tool」大类,但结构不太一样:它是一个「技能编号 + 等级」的小结构,堆叠上限固定为 1。
武器的特殊能力(Charge / Spirit / Berserk / Geist / Hell / Demon's / Arrest / Chaos / Blizzard / Burning…) 是一张独立的表,ItemPMT 内部用编号引用它。每个特殊能力包含:
普通武器的 special 是怎么来的?
不是从 ItemPMT 直接读 Special 字段,而是由 ItemPT 根据区域生成一个「星级」(0–5 星),然后去 ItemPMT 的特殊能力表里挑一个对应星级的能力。
所以你在坑道捡到的 Gush 可能带 1 星的 Charge,在遗迹捡到的同型号可能带 3 星的 Berserk — 同一把武器,不同区域出来的 special 池不一样。
除了上面几大类物品条目外,ItemPMT 顶层还挂着若干小一些的「辅助表」,给游戏代码在各种场景下查:
存的是一组「用哪件道具 × 对哪件已装备物品 × 得到什么」的配方记录,附加一些约束条件:
注意这张表不是连击表 —— PSO 的 N-N-H / N-H-H 攻击序列修正是客户端硬编码的,不在 ItemPMT 里;
ItemPMT 里和连击有关的只有每件武器一个字节的 behavior_flags,其中一个 bit 表示「此武器不能参与连击」(例如某些特殊武器同一招只能用一次)。
法杖对特定技能的伤害/等级加成。典型例子:Psycho Wand 降 Simple/Mid 攻击技能等级上限、Glide Divine 对 Grants 的加成等。武器条目里有一个 tech_boost 字段指向这张表。
插件条目引用的实际加成数据 —— 插件本体只存一个 boost ID,去这张表才能拿到「加哪个属性、加几点」。
每个职业每种技能的学习上限(例如 FO 系可以学到 Lv30 Rafoie,而 HU 系只能学到 Lv15)。角色尝试使用超过上限的技能书时游戏会拒绝。
以下结构体描述的是 PSOBB (V4) 的 ItemPMT 二进制格式。其它版本(V1/V2/V3、DC/GC/XB)结构略有不同但语义一致。偏移量以 16 进制字节表示。
TableOffsetsV3V4ItemPMT 文件解压后的顶端就是这张表,每个字段都是一个指向子表的 4 字节偏移指针。BB 客户端启动时会读取它来定位所有其它子表。
| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | weapon_table | u32 | 武器表指针 → [{count, offset → [WeaponV4]}](0xED 项) |
| 0x04 | armor_table | u32 | 铠甲/盾牌表指针(两组:armors, shields) |
| 0x08 | unit_table | u32 | 插件表指针 → [UnitV4] |
| 0x0C | tool_table | u32 | 消耗品表指针 → [{count, offset → [ToolV4]}](0x1A 项) |
| 0x10 | mag_table | u32 | Mag 表指针 → [MagV4] |
| 0x14 | v1_replacement_table | u32 | PSO v1 老 ID → BB 新 ID 的替换表 |
| 0x18 | photon_color_table | u32 | 光子颜色表(0x20 种,每项 0x24 字节) |
| 0x1C | weapon_range_table | u32 | 武器射程/判定范围表 |
| 0x20 | weapon_sale_divisor_table | u32 | 武器售价除数 → [float] |
| 0x24 | sale_divisor_table | u32 | 非武器售价除数 |
| 0x28 | mag_feed_table | u32 | Mag 喂食表 |
| 0x2C | star_value_table | u32 | 物品 ID → 星级 (☆ 数量),0x330 项 |
| 0x30 | special_data_table | u32 | 特殊能力定义表 → [Special] |
| 0x34 | weapon_effect_table | u32 | 武器被动效果表(每项 0x10 字节) |
| 0x38 | stat_boost_table | u32 | 插件加成数据 → [StatBoost] |
| 0x3C | shield_effect_table | u32 | 盾牌被动效果表(每项 8 字节) |
| 0x40 | max_tech_level_table | u32 | 每职业每技能的学习上限 |
| 0x44 | combination_table | u32 | 合成/升级配方 → [ItemCombination] |
| 0x48 | unknown_a1 | u32 | 未解析 |
| 0x4C | tech_boost_table | u32 | 法杖对技能的加成 → [TechniqueBoost × 3] |
| 0x50 | unwrap_table | u32 | 礼物盒拆包结果 |
| 0x54 | unsealable_table | u32 | 封印武器解封结果 |
| 0x58 | ranged_special_table | u32 | 远程武器的特殊能力行为 |
ItemBaseV4所有具体物品条目(武器/铠甲/插件/Mag/消耗品)的前 12 字节都是这张共用基础头部:
| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | id | u32 | 物品 ID(同时也是名称文本档里的字符串索引) |
| 0x04 | type | u16 | 模型编号(对应客户端 .nj 模型 ID) |
| 0x06 | skin | u16 | 贴图编号 |
| 0x08 | team_points | u32 | 队伍点数价格(团战相关) |
WeaponV4(0x2C 字节)| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | base | ItemBaseV4 | 基础头部(0x0C 字节) |
| 0x0C | class_flags | u16 | 12 职业可装备位图(默认 0x00FF 全开) |
| 0x0E | atp_min | u16 | 基础攻击力下限 |
| 0x10 | atp_max | u16 | 基础攻击力上限(实际值在 min–max 之间随机) |
| 0x12 | atp_required | u16 | 装备所需最低 ATP |
| 0x14 | mst_required | u16 | 装备所需最低 MST |
| 0x16 | ata_required | u16 | 装备所需最低 ATA |
| 0x18 | mst | u16 | 武器自带的 MST 加成 |
| 0x1A | max_grind | u8 | 磨石上限(+9 就是 9) |
| 0x1B | photon | u8 | 光子类型(决定近战/远程/技能系) |
| 0x1C | special | u8 | 默认特殊能力编号(索引 special_data_table) |
| 0x1D | ata | u8 | 命中加成 |
| 0x1E | stat_boost_entry_index | u8 | 指向 stat_boost_table 的索引 |
| 0x1F | projectile | u8 | 远程武器的投射物 ID |
| 0x20 | trail1_x / y | i8×2 | 武器光迹起点偏移 |
| 0x22 | trail2_x / y | i8×2 | 武器光迹终点偏移 |
| 0x24 | color | i8 | 颜色索引(进入 photon_color_table) |
| 0x25 | unknown_a1 | u8×3 | 未解析 |
| 0x2A | tech_boost | u8 | 技能加成索引(进入 tech_boost_table) |
| 0x2B | behavior_flags | u8 | 行为位:0x01 禁止连击 / 0x08 不能带属性 |
ArmorOrShieldV4(0x20 字节)| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | base | ItemBaseV4 | 基础头部 |
| 0x0C | dfp | u16 | 基础防御力 |
| 0x0E | evp | u16 | 基础回避力 |
| 0x10 | block_particle | u8 | 格挡粒子特效 ID |
| 0x11 | block_effect | u8 | 格挡效果 ID |
| 0x12 | class_flags | u16 | 可装备职业位图 |
| 0x14 | required_level | u8 | 所需等级 |
| 0x15 | efr | u8 | 火抗 |
| 0x16 | eth | u8 | 雷抗 |
| 0x17 | eic | u8 | 冰抗 |
| 0x18 | edk | u8 | 暗抗 |
| 0x19 | elt | u8 | 光抗 |
| 0x1A | dfp_range | u8 | 精炼 DFP 上限(+N 能加的最大值) |
| 0x1B | evp_range | u8 | 精炼 EVP 上限 |
| 0x1C | stat_boost_entry_index | u8 | stat_boost_table 索引 |
| 0x1D | tech_boost | u8 | 技能加成(用于 Psycho Wand 类的铠甲配对) |
| 0x1E | flags_type | u8 | 行为标志(铠甲 0x01 / 盾牌 0x01 / 0x02 / 0x03 等) |
UnitV4(0x14 字节)| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | base | ItemBaseV4 | 基础头部 |
| 0x0C | stat | u16 | 主 stat 类型(对应 StatBoost 的 01–0F 编码,如 01=ATP) |
| 0x0E | stat_amount | u16 | 主 stat 加成数值 |
| 0x10 | modifier_amount | i16 | 触发型插件的阈值或冷却(如 HP/Restorate) |
| 0x12 | unused | u8×2 | 填充 |
MagV4(0x1C 字节)| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | base | ItemBaseV4 | 基础头部 |
| 0x0C | feed_table | u16 | 喂食反应表索引(进入 mag_feed_table) |
| 0x0E | photon_blast | u8 | 默认 Photon Blast ID |
| 0x0F | activation | u8 | 事件触发基础概率 |
| 0x10 | on_pb_full | u8 | PB 满时触发的事件 ID |
| 0x11 | on_low_hp | u8 | 低 HP 时触发的事件 ID |
| 0x12 | on_death | u8 | 死亡时触发的事件 ID |
| 0x13 | on_boss | u8 | 进入 BOSS 房时触发的事件 ID |
| 0x14 | on_pb_full_flag | u8 | 0–4 决定上面概率的计算方式(和 synchro 结合) |
| 0x15 | on_low_hp_flag | u8 | 同上 |
| 0x16 | on_death_flag | u8 | 同上 |
| 0x17 | on_boss_flag | u8 | 同上 |
| 0x18 | class_flags | u16 | 可装备职业位图 |
| 0x1A | unused | u8×2 | 填充 |
Mag 事件触发概率计算:先根据 synchro 值算出 step_synchro(0/15/25/30/35…分档),然后按 flag 值决定实际概率 ——
flag=0 取 activation、flag=1 取 activation+step_synchro、flag=2 取 step_synchro…
ToolV4(0x18 字节)| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | base | ItemBaseV4 | 基础头部 |
| 0x0C | amount | u16 | 数量/效果值(对 mate 类是回血量,对技能书是技能等级) |
| 0x0E | tech | u16 | 技能类 tool 的技能编号 |
| 0x10 | cost | i32 | 商店价格 |
| 0x14 | item_flags | u32 | 位标志:0x01 可使用 / 0x08 Android 可用 / 0x10 市镇可用 / 0x20 BOSS 房可用 / 0x40 挑战模式可用 / 0x80 稀有 |
Special(4 字节)| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | type | u16 | 能力类型编号(Charge / Spirit / Berserk / Hell…) |
| 0x02 | amount | u16 | 能力强度值(发动概率、额外伤害等) |
StatBoost(6 字节)插件和武器/铠甲都通过 stat_boost_entry_index 引用本表的一条记录。每条记录最多能同时加两项属性(但 DC 11/2000 之后 Sega 把循环改成只遍历一项,所以实际只第一项生效)。
| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | stats[0..1] | u8×2 | 两个 stat 类型编号(见下) |
| 0x02 | amounts[0..1] | u16×2 | 对应的加成数值 |
Stat 类型编号:
| 值 | 含义 | 值 | 含义 |
|---|---|---|---|
| 0x01 | ATP+ | 0x09 | ATP− |
| 0x02 | ATA+ | 0x0A | ATA− |
| 0x03 | EVP+ | 0x0B | EVP− |
| 0x04 | DFP+ | 0x0C | DFP− |
| 0x05 | MST+ | 0x0D | MST− |
| 0x06 | HP+ | 0x0E | HP− |
| 0x07 | LCK+ | 0x0F | LCK− |
| 0x08 | 所有 +(HP 除外) | 0x10 | 所有 −(HP 除外) |
ItemCombination(0x10 字节)| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | used_item | u8×3 | 使用的道具 ID(data1[0..2]) |
| 0x03 | equipped_item | u8×3 | 已装备的目标物品 ID |
| 0x06 | result_item | u8×3 | 合成结果物品 ID |
| 0x09 | mag_level | u8 | 所需 Mag 总等级 |
| 0x0A | grind | u8 | 目标武器所需磨石数 |
| 0x0B | level | u8 | 所需角色等级 |
| 0x0C | char_class | u8 | 职业限制 |
| 0x0D | unused | u8×3 | 填充 |
MagFeedResult(8 字节)喂食表按「Mag 型号 × 食物种类(11 种)」组织,每个格子是一条 MagFeedResult:
| 偏移 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 0x00 | def | i8 | DEF 增减 |
| 0x01 | pow | i8 | POW 增减 |
| 0x02 | dex | i8 | DEX 增减 |
| 0x03 | mind | i8 | MIND 增减 |
| 0x04 | iq | i8 | IQ 增减 |
| 0x05 | synchro | i8 | 同调率增减 |
| 0x06 | unused | u8×2 | 填充 |