物品数据表
全游戏唯一的物品登记表
StaticItemConfig.csv:29 个物品的 ID、名称、类别、堆叠上限、保质期、食用/饮用恢复量、酒精度等 28 列属性的权威定义;物品价格不在本表(见下文“公式与数值”)。
物品数据表是整个物资流转链条的源头定义。船上每一份木头、每一发炮弹、每一壶格罗格酒,在容器中以“物品堆叠”形式存在,其堆叠上限、初始属性、腐烂规则全部由本表决定。
- 配置文件:
Assets/StreamingAssets/StaticItemConfig.csv(策划可直接编辑) - 生成代码:
Assets/Scripts/Service/Common/Generated/StaticItemConfig.cs(由代码生成器产出,禁止手改) - 当前规模:29 个物品,28 列属性
玩家在以下地方直接接触本表数据:
| 玩家可见内容 | 来自本表的列 | 出处 |
|---|---|---|
| 库存面板、容器弹窗里的物品中文名 | ItemName | StaticItemConfigExtension.cs 的显示名查询 |
| 一格最多堆多少个 | MaxStackSize | ItemStack.cs |
| 食物上的“新鲜/陈旧”徽章 | FreshDays、StaleDays | FreshnessState.cs |
| “明天就要腐烂”预警弹窗、腐烂后变成的废料 | FreshDays、StaleDays、RotItemId | ShelfLifeSystem.cs |
| 船员吃喝后恢复多少饱食/水分 | DefaultHungry、DefaultThirst | FoodItemExtension.cs |
| 喝酒后醉酒度上升 | IsAlcoholic、BACPerDrink | Task_Drink.cs、Task_Hydrate.cs |
在游戏循环中的位置:生产与制作产出物品 → 存入容器 → 被船员消耗(吃喝、装弹、烧锅炉)或在港口交易。每一步引用的都是本表的 ItemId。
物品类别体系
Section titled “物品类别体系”物品类别由 ItemType.cs(代码枚举,需要程序改)定义,共 8 类:
| 类别 | 含义 | 当前物品数 | 机制效果 |
|---|---|---|---|
| Food | 食物 | 6 | 唯一有机制意义的类别:只有 Food 类物品会进入船员吃喝候选池(FoodItemExtension.cs) |
| Resource | 资源 | 15 | 仅语义分类,无机制差异 |
| Material | 材料 | 4 | 仅语义分类,无机制差异 |
| Waste | 废料(腐烂物、排泄物等占位无用物品) | 3 | 仅语义分类,无机制差异 |
| Consumable | 消耗品 | 1(仅测试物品 Monster) | 仅语义分类 |
| Tool | 工具 | 0 | 枚举存在但无任何物品使用 |
| Weapon | 武器 | 0 | 同上(武器是建筑而非物品,见武器与弹药) |
| Equipment | 装备 | 0 | 同上 |
判定规则:船员“能吃”= 类别为 Food 且 UseHungry 为 true;“能喝”= 类别为 Food 且 UseThirst 为 true。把一个 Resource 改成 UseHungry=true 不会让船员去吃它——类别必须同时是 Food。
以下三张表合计覆盖 CSV 全部 28 列、全部 29 行(来源:CSV 配置表 StaticItemConfig.csv,策划可直接改;“基础售价”列例外,来源为代码常量 ItemPriceConfig.cs)。
表一:基础信息与价格
Section titled “表一:基础信息与价格”| ItemId | 名称 | 类别 | 最大堆叠(个/格) | 基础售价(金) | 图标 | 描述(CSV 原文,无界面读取,纯备注) |
|---|---|---|---|---|---|---|
| Monster | 怪物 | Consumable | 1 | 10(未配置,走默认价) | 无 | (空) |
| SaltPork | 咸肉 | Food | 20 | 10 | 有 | 保存期长的罐头食品 |
| DrinkableWater | 饮用水 | Food | 50 | 3 | 有 | 可饮用的淡水 |
| Water | 水 | Resource | 50 | 2 | 有 | 工业用水 |
| Steam | 蒸汽 | Resource | 50 | 3 | 有 | (空) |
| Bullet | 子弹 | Resource | 50 | 1 | 有 | 机枪弹药 |
| CannonShell | 炮弹 | Resource | 200 | 3 | 有 | 加农炮弹药 |
| Fuel | 燃料 | Resource | 500 | 10(未配置,走默认价) | 有 | 火焰喷射器燃料 |
| AA_Gun_Bullet | AA子弹 | Resource | 50 | 1 | 有 | 机枪弹药 |
| Wood | 木头 | Material | 100 | 3 | 有 | 建筑材料 |
| Stone | 石头 | Material | 100 | 4 | 有 | 建筑材料 |
| IronPlate | 铁板 | Material | 50 | 8 | 有 | 建筑材料 |
| Feces | 粪便 | Waste | 10 | 10(未配置,走默认价) | 有 | 船员失禁时产生的排泄物 |
| Coal | 煤炭 | Resource | 100 | 2 | 有 | 引擎燃料 |
| MonsterCorpse | 怪物尸体 | Material | 5 | 30 | 有 | 怪物掉落的尸体 |
| MonsterMeat | 怪物肉 | Food | 20 | 8 | 有 | 从怪物尸体屠宰获得 |
| BeastOil | 兽油 | Resource | 50 | 12 | 有 | 从怪物尸体提取的油脂 |
| CookedMeal | 熟食 | Food | 20 | 20 | 有 | 烹饪后的食物 |
| BlackPowder | 黑火药 | Resource | 50 | 6 | 无 | 制造弹药的原料 |
| MonsterBrew | 怪物酒 | Food | 30 | 40 | 有 | 海怪肉发酵的烈酒 |
| Grog | 格罗格酒 | Food | 50 | 8 | 有 | 怪物酒兑水后的日常饮品 |
| RottenFood | 腐食 | Waste | 50 | 1 | 有 | 腐烂的食物或肉 |
| StaleWater | 臭水 | Waste | 50 | 1 | 无 | 变质的饮用水或酒 |
| LuxuryWine | 奢侈红酒 | Resource | 30 | 10(未配置,走默认价) | 无 | 西班牙马德里产区奢侈品 |
| LuxuryTobacco | 奢侈烟草 | Resource | 30 | 10(未配置,走默认价) | 无 | 西班牙塞维利亚产区奢侈品 |
| LuxuryCloth | 奢侈布匹 | Resource | 30 | 10(未配置,走默认价) | 无 | 英格兰普利茅斯产区奢侈品 |
| LuxuryArtillery | 奢侈火炮 | Resource | 30 | 10(未配置,走默认价) | 无 | 英格兰朴次茅斯产区奢侈品 |
| LuxuryCoffee | 奢侈咖啡 | Resource | 30 | 10(未配置,走默认价) | 无 | 法兰西勒阿弗尔产区奢侈品 |
| LuxurySilk | 奢侈丝绸 | Resource | 30 | 10(未配置,走默认价) | 无 | 法兰西马赛产区奢侈品 |
- “图标”指
Assets/Resources/UI/Icons/Items/{ItemId}.png是否存在;缺图标的物品在甲板地面显示为按 ItemId 哈希取色的彩色方块占位(FloorItemVisualManager.cs)。 - 奢侈品的实际交易价不走基础售价,而是按原产城市价 + 距离溢价计算(配置在
GoodsOrigin.csv,见交易)。
表二:耐久 / 新鲜度 / 年龄 / 品质开关
Section titled “表二:耐久 / 新鲜度 / 年龄 / 品质开关”格式为“默认值/最大值”;“—“表示开关为 false(该属性不挂到物品上,后面的默认/最大值是 CSV 占位,不生效)。
| ItemId | HP(UseHP) | 新鲜度(UseFreshness,百分比) | 年龄(UseAge,天) | 品质(UseQuality) |
|---|---|---|---|---|
| Monster | 100/100 | — | 10/100 | 1 |
| SaltPork | — | — | — | 1 |
| DrinkableWater | — | — | 0/19 | — |
| Water | — | — | — | — |
| Steam | — | — | — | — |
| Bullet | — | — | — | — |
| CannonShell | — | — | — | — |
| Fuel | — | — | — | — |
| AA_Gun_Bullet | — | — | — | — |
| Wood | — | — | — | — |
| Stone | — | — | — | — |
| IronPlate | — | — | — | — |
| Feces | — | — | — | — |
| Coal | — | — | — | — |
| MonsterCorpse | — | 100/100 | — | — |
| MonsterMeat | — | 100/100 | 0/6 | — |
| BeastOil | — | — | — | — |
| CookedMeal | — | — | 0/31 | — |
| BlackPowder | — | — | — | — |
| MonsterBrew | — | — | — | 1 |
| Grog | — | — | 0/61 | 1 |
| RottenFood | — | — | — | 1 |
| StaleWater | — | — | — | 1 |
| LuxuryWine | — | — | — | — |
| LuxuryTobacco | — | — | — | — |
| LuxuryCloth | — | — | — | — |
| LuxuryArtillery | — | — | — | — |
| LuxuryCoffee | — | — | — | — |
| LuxurySilk | — | — | — | — |
表三:吃喝、腐烂与酒精
Section titled “表三:吃喝、腐烂与酒精”格式同上;FreshDays = -1 表示永不腐烂。
| ItemId | 饱食恢复(UseHungry,需求点) | 解渴恢复(UseThirst,需求点) | FreshDays(天) | StaleDays(天) | RotItemId(腐烂转化为) | 含酒精 | BACPerDrink(醉酒点/次) | DrinkPriority |
|---|---|---|---|---|---|---|---|---|
| Monster | 50/100 | — | -1 | 0 | (空) | 否 | 0 | 100 |
| SaltPork | 40/100 | — | -1 | 0 | (空) | 否 | 0 | 100 |
| DrinkableWater | — | 50/100 | 10 | 8 | StaleWater | 否 | 0 | 10 |
| Water | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| Steam | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| Bullet | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| CannonShell | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| Fuel | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| AA_Gun_Bullet | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| Wood | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| Stone | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| IronPlate | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| Feces | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| Coal | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| MonsterCorpse | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| MonsterMeat | 15/100 | — | 3 | 2 | RottenFood | 否 | 0 | 100 |
| BeastOil | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| CookedMeal | 50/100 | — | 18 | 12 | RottenFood | 否 | 0 | 100 |
| BlackPowder | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| MonsterBrew | — | 50/100 | -1 | 0 | (空) | 是 | 40 | -1(永不自饮) |
| Grog | — | 50/100 | 36 | 24 | StaleWater | 是 | 10 | 20 |
| RottenFood | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| StaleWater | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| LuxuryWine | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| LuxuryTobacco | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| LuxuryCloth | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| LuxuryArtillery | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| LuxuryCoffee | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
| LuxurySilk | — | — | -1 | 0 | (空) | 否 | 0 | 100 |
非饮品行的 DrinkPriority=100 是无意义的占位填充(只有“类别 Food 且 UseThirst=true”的物品才进入饮用候选池)。
CSV 共 28 列。前三行是表头(第 1 行字段名、第 2 行字段类型、第 3 行中文注释),数据从第 4 行开始。
| 列 | 类型 | 单位 | 含义 | 读取方 |
|---|---|---|---|---|
| ItemId | string | — | 唯一英文 ID,全游戏引用键(配方、容器、交易、武器弹药全部用它) | 所有系统 |
| ItemName | string | — | 中文显示名,界面统一经显示名查询取用;未填时回退显示 ItemId | StaticItemConfigExtension.cs |
| ItemType | 枚举 | — | 物品类别(见上节),仅 Food 有机制意义 | FoodItemExtension.cs |
| Description | string | — | 备注介绍文。当前没有任何界面读取,纯策划备注 | 无 |
| MaxStackSize | int | 个/格 | 单格堆叠上限。1 = 不可堆叠,每个实例独占一格且永不合并 | ItemStack.cs |
| UseHP | bool | — | 是否挂“耐久”属性(需同时 MaxHP > 0 才实际挂载) | ItemStack.cs |
| DefaultHP / MaxHP | int | 点 | 耐久初始值 / 上限。当前无任何玩法读取耐久,仅用于容器排序与开发监控 | ItemStackComparer.cs |
| UseFreshness | bool | — | 是否挂“新鲜度”属性(需 MaxFreshness > 0)。注意:没有任何系统衰减新鲜度,腐烂由“年龄”驱动 | ItemStack.cs |
| DefaultFreshness / MaxFreshness | float | 百分比(0-100) | 新鲜度初始值 / 上限 | Freshness.cs |
| UseAge | bool | — | 是否挂“年龄”属性(需 MaxAge > 0)。腐烂机制的开关:有年龄且 FreshDays ≥ 0 的物品才会变质 | ShelfLifeSystem.cs |
| DefaultAge / MaxAge | int | 天(游戏日) | 年龄初始值 / 硬上限。MaxAge 必须 ≥ FreshDays + StaleDays + 1,否则年龄被上限卡住、永远到不了腐烂阈值 | Age.cs |
| UseQuality / DefaultQuality | bool / int | 级 | 是否挂“品质”属性及初始品质。当前无玩法效果,仅容器排序与开发监控用 | Quality.cs |
| UseHungry | bool | — | 类别为 Food 时,true = 船员可食用 | FoodItemExtension.cs |
| DefaultHungry | float | 需求点 | 吃一份恢复的饱食量(陈旧时打 5 折,见下文) | NeedRequestHelper.cs |
| MaxHungry | float | 需求点 | 物品上挂载的饱食属性上限(合并计算用,无直接玩法效果) | Hungry.cs |
| UseThirst | bool | — | 类别为 Food 时,true = 船员可饮用 | FoodItemExtension.cs |
| DefaultThirst | float | 需求点 | 喝一份恢复的水分量(陈旧时打 5 折) | NeedRequestHelper.cs |
| MaxThirst | float | 需求点 | 占位列。物品不会实际挂“口渴”属性(属性系统没有对应实现) | 无 |
| FreshDays | int | 天(游戏日) | 新鲜段长度;-1 = 永不腐烂(整条腐烂逻辑跳过) | ShelfLifeSystem.cs |
| StaleDays | int | 天(游戏日) | 陈旧段长度 | ShelfLifeSystem.cs |
| RotItemId | string | — | 腐烂后整堆转化成的物品 ID(留空 = 腐烂后直接消失) | ShelfLifeSystem.cs |
| IsAlcoholic | bool | — | 是否含酒精,true 时每喝一次累积醉酒度 | Task_Drink.cs |
| BACPerDrink | float | 醉酒点/次 | 单次饮用增加的醉酒度(BAC),作用见船员 | Task_Drink.cs、Task_Hydrate.cs |
| DrinkPriority | int | 序号(越小越优先) | 自动饮用优先级。-1 = 船员永不主动喝(仅紧急救援喂水时作为最后兜底) | FoodItemExtension.cs |
属性挂载规则
Section titled “属性挂载规则”物品入库时按 CSV 开关自动挂属性(ItemStack.cs):
- 挂载条件:UseAge 且 MaxAge > 0 → 年龄;UseHungry 且 MaxHungry > 0 → 饱食;UseHP 且 MaxHP > 0 → 耐久;UseQuality → 品质(无 Max 条件);UseFreshness 且 MaxFreshness > 0 → 新鲜度。
- UseThirst 没有对应属性类,不会挂任何东西——它只作为“可饮用”标记和恢复量来源。
- 配置本身运行时只读,运行时只能改单个堆叠实例的属性值。
- 同 ItemId、MaxStackSize > 1、目标堆未满、双方属性类型一致 → 可合并;MaxStackSize = 1 的物品永不合并,每个占一格。
- 合并时属性按数量加权平均:合并后年龄 = round((本堆年龄 × 本堆数量 + 来堆年龄 × 来堆数量) ÷ 总数量),再钳制到 [0, MaxAge](
Age.cs)。新鲜度同理(Freshness.cs)。 - 这是有意的玩法设计:持续补新货可以“摊薄”老货年龄,鼓励玩家主动轮转库存(避免“一滴老货污染整桶”的反向棘轮)。
三段保质期与腐烂
Section titled “三段保质期与腐烂”腐烂由保质期系统驱动(ShelfLifeSystem.cs),每个游戏日结算一次(订阅日期变更事件,见时间与调度):
- 每游戏日给所有容器中带年龄属性、且 FreshDays ≥ 0 的堆叠年龄 +1 天。
- 状态判定(
FreshnessState.cs):- 新鲜(Fresh):年龄 ≤ FreshDays
- 陈旧(Stale):FreshDays < 年龄 ≤ FreshDays + StaleDays
- 腐烂:年龄 > FreshDays + StaleDays → 整堆移除,按原数量 1:1 转化为 RotItemId 物品(RotItemId 为空则直接消失;容器拒收转化物时也直接丢弃)
- 年龄恰好等于 FreshDays + StaleDays 的当天,触发“明日腐烂”预警事件(玩家船上弹提示),给玩家整整一天去消耗、出售或再加工。
- 腐烂清堆前会释放该格上的所有任务预约,防止预约残留导致库存计数永久虚低。
按当前 CSV,腐烂时间线(单位:游戏日):
| 物品 | 新鲜期 | 陈旧期 | 腐烂日(年龄达到) | 转化为 |
|---|---|---|---|---|
| 饮用水 | 第 0-10 天 | 第 11-18 天 | 第 19 天 | 臭水 |
| 怪物肉 | 第 0-3 天 | 第 4-5 天 | 第 6 天 | 腐食 |
| 熟食 | 第 0-18 天 | 第 19-30 天 | 第 31 天 | 腐食 |
| 格罗格酒 | 第 0-36 天 | 第 37-60 天 | 第 61 天 | 臭水 |
这条链构成食物保鲜玩法:怪物肉 3 天就开始变质,要么尽快进厨房做成熟食(保质期延长到 30 天),要么进酿酒坊做成永不腐烂的怪物酒,再兑水成格罗格酒(60 天)日常饮用——配方详见生产与制作。
陈旧(Stale)状态的物品“对玩家的价值”统一打折,折扣系数为代码常量 0.5(FreshnessState.cs 的 StaleValueMultiplier,需要程序改):
- 实际饱食恢复 = DefaultHungry × 0.5;实际解渴恢复 = DefaultThirst × 0.5(
NeedRequestHelper.cs) - 实际卖价 = round(基础价 × 0.5),但最低 1 金,防止低价品折后归零(
PlayerTrader.cs、TradingSession.cs) - 新鲜与不腐物品系数为 1.0
自动吃喝候选与饮用优先级
Section titled “自动吃喝候选与饮用优先级”船员产生口渴需求时(任务派发流程见任务与工作):
- 自饮候选池:类别 Food 且 UseThirst=true 且 DrinkPriority ≠ -1,按 DrinkPriority 升序 → 饮用水(10) 优先于 格罗格酒(20);怪物酒(-1) 被排除,船员宁可渴着也不主动喝 40 度烈酒。
- 救援喂水候选池:船员因脱水倒下时,护理者可用全部饮品(含 -1 项,排到末位)兜底强灌,怪物酒此时可救命,但同样累积醉酒度(
Task_Hydrate.cs)。 - 同优先级内按距离就近取。
- 吃饭候选池没有优先级列,纯按距离就近(咸肉/怪物肉/熟食一视同仁)。
饮水动作耗时 60 tick(60 帧/秒下约 1 秒,Task_Drink.cs 代码常量);喂水动作同为 60 tick(Task_Hydrate.cs)。
界面取物品名的统一规则(StaticItemConfigExtension.cs):有 ItemName 用 ItemName,否则回退英文 ItemId。将来接多语言只改这一处。
| 公式/数值 | 值 | 来源 |
|---|---|---|
| 新鲜判定 | 年龄 ≤ FreshDays | CSV 配置表 + FreshnessState.cs |
| 陈旧判定 | FreshDays < 年龄 ≤ FreshDays + StaleDays | 同上 |
| 腐烂触发 | 年龄 > FreshDays + StaleDays(按日结算,整堆转化) | ShelfLifeSystem.cs |
| 腐烂预警 | 年龄 == FreshDays + StaleDays 当日触发,提前 1 游戏日 | ShelfLifeSystem.cs |
| MaxAge 配置约束 | MaxAge ≥ FreshDays + StaleDays + 1,否则永不腐烂 | Age.cs 的取值范围校验 |
| 陈旧价值系数 | 0.5(恢复量与卖价统一适用) | 代码常量 FreshnessState.cs |
| 陈旧卖价下限 | 1 金 | 代码常量 PlayerTrader.cs / TradingSession.cs |
| 实际饱食恢复 | DefaultHungry × 新鲜度系数(新鲜 1.0 / 陈旧 0.5) | NeedRequestHelper.cs |
| 实际解渴恢复 | DefaultThirst × 新鲜度系数 | NeedRequestHelper.cs |
| 合并后年龄 | round(加权平均(两堆年龄, 按数量)) 钳制 [0, MaxAge] | Age.cs |
| 饮水/喂水动作时长 | 各 60 tick(约 1 秒) | 代码常量 Task_Drink.cs / Task_Hydrate.cs |
| 醉酒累积 | 每喝一次 BAC += BACPerDrink(格罗格酒 +10,怪物酒 +40) | CSV 配置表 + Task_Drink.cs |
| 未配置物品兜底价 | 10 金 | 代码常量 ItemPriceConfig.cs |
| CSV 缺失时堆叠上限兜底 | 50 个/格 | 代码常量 ItemStack.cs |
基础售价全表(代码常量,需程序改 ItemPriceConfig.cs)
Section titled “基础售价全表(代码常量,需程序改 ItemPriceConfig.cs)”| 物品 | 价(金) | 物品 | 价(金) | 物品 | 价(金) |
|---|---|---|---|---|---|
| SaltPork | 10 | Coal | 2 | MonsterCorpse | 30 |
| DrinkableWater | 3 | Bullet | 1 | MonsterMeat | 8 |
| Grog | 8 | CannonShell | 3 | CookedMeal | 20 |
| Water | 2 | AA_Gun_Bullet | 1 | MonsterBrew | 40 |
| Steam | 3 | Wood | 3 | RottenFood | 1 |
| BeastOil | 12 | Stone | 4 | StaleWater | 1 |
| BlackPowder | 6 | IronPlate | 8 | 其余未配置 | 10(默认) |
腐食与臭水显式定价 1 金,是为了堵“未配置默认价 10”的漏洞——过期物本应倒掉而不是当货卖。城市侧每个港口对每种物品另有独立买卖价与库存(CityInventory.csv),详见交易。
与其他系统的交互
Section titled “与其他系统的交互”| 系统 | 关系 |
|---|---|
| 物品与库存 | 容器按本表初始化堆叠与属性;堆叠上限、合并规则、地面物品图标全部源于此 |
| 生产与制作 | 配方表 RecipeConfig.csv 的输入/输出全部引用本表 ItemId(水→蒸汽→饮用水、尸体→肉+兽油、肉→熟食、酿酒兑酒等 10 条配方) |
| 武器与弹药 | 武器消耗表 WeaponConsumptionConfig.csv 引用本表 ItemId:机枪耗子弹、加农炮耗炮弹、火焰喷射器耗兽油、防空炮耗 AA 子弹+水 |
| 船员 | 吃喝恢复量、酒精与醉酒度、失禁掉落粪便均与本表字段联动 |
| 交易 | 卖价 = 基础价 ×(陈旧 0.5 折,下限 1 金);城市库存表与奢侈品产地表引用本表 ItemId |
| 战利品与掉落 | 怪物尸体等掉落物以本表 ItemId 注册 |
| 时间与调度 | 保质期按游戏日结算(日期变更事件驱动) |
| 配置表总览 | 本表是全部 CSV 配置表之一,生成流程相同 |
配置与调参指南
Section titled “配置与调参指南”代码生成流程(必读)
Section titled “代码生成流程(必读)”CSV 与代码的关系分两层:
- 数据行(改数值、加物品行、删物品行):游戏运行时动态读取 CSV(编辑器下读
Assets/StreamingAssets/StaticItemConfig.csv,打包后读 StreamingAssets),重新进 Play Mode 即生效。 - 列结构(加列、删列、改列名、改类型):生成的解析代码按列位置硬编码(当前要求每行至少 28 列),必须让程序重新跑代码生成器,否则解析错位或整行被静默丢弃。
生成器入口:Unity 菜单 Tools → CSV Code Generator → 批量生成所有CSV(CSVCodeGeneratorMenu.cs)。它会扫描 StreamingAssets 下全部 CSV(含子目录),重新生成 Generated/ 目录下的对应代码,并自动清理已删除 CSV 的孤儿代码文件。只改数值不需要重新生成(生成代码不依赖数据行内容);改列结构必须重新生成。
CSV 格式硬规则:
- 前三行固定为表头:第 1 行字段名 / 第 2 行类型(必须是合法类型标记,如 string、int、float、bool、ItemType)/ 第 3 行中文注释;数据从第 4 行起。
- 数据行不足 28 列会被静默跳过(不报错),物品凭空消失——加行后务必数清逗号。
- 带逗号的文本字段要用双引号包裹。
- 布尔值写 true/false(大小写不敏感,1 也算 true)。
- 解析失败的单元格静默回退为类型默认值(数字 0、布尔 false),不会报错——填错枚举名等问题只能靠人工核对。
常见调参对照
Section titled “常见调参对照”| 想调的体验 | 改哪里 | 类型 |
|---|---|---|
| 某食物更顶饿 / 某饮品更解渴 | StaticItemConfig.csv 的 DefaultHungry / DefaultThirst |
CSV 配置表 |
| 食物更耐放 / 更易腐 | 同步改 FreshDays、StaleDays,并保证 MaxAge ≥ 两者之和 + 1 | CSV 配置表 |
| 腐烂后变成别的东西 | RotItemId(必须是表内已有 ItemId) | CSV 配置表 |
| 一格能堆更多 | MaxStackSize | CSV 配置表 |
| 船员先喝什么 | DrinkPriority(越小越优先;-1 = 永不自饮) | CSV 配置表 |
| 酒更醉人 | BACPerDrink | CSV 配置表 |
| 陈旧折扣力度(当前 0.5) | FreshnessState.cs 的 StaleValueMultiplier |
代码常量(找程序) |
| 物品基础卖价 | ItemPriceConfig.cs 的价格字典 |
代码常量(找程序) |
| 城市买卖价与库存 | CityInventory.csv |
CSV 配置表 |
| 喝水动作时长(当前约 1 秒) | Task_Drink.cs 的时长常量 |
代码常量(找程序) |
新增物品检查单
Section titled “新增物品检查单”- 在
StaticItemConfig.csv末尾加一行,28 列填全(不腐物品照抄 Wood 行的尾段模板:...,-1,0,,false,0,100)。 - 让程序跑 Tools → CSV Code Generator → 批量生成所有CSV。
- 找程序在
ItemPriceConfig.cs加基础价,否则按默认 10 金卖。 - 提供图标
Assets/Resources/UI/Icons/Items/{ItemId}.png,否则地面显示彩色方块占位。 - 如需城市售卖:在
CityInventory.csv加行;如需配方产出/消耗:在RecipeConfig.csv引用;如作武器弹药:在WeaponConsumptionConfig.csv引用。 - 如会腐烂:确认 UseAge=true、MaxAge ≥ FreshDays + StaleDays + 1、RotItemId 指向表内已有物品。
已知限制与注意事项
Section titled “已知限制与注意事项”- 价格不在物品表里:基础售价是代码常量(
ItemPriceConfig.cs),策划不能直接改;未配置的物品一律按 10 金兜底,新物品忘配价就会出现“粪便卖 10 金”式怪象(Feces 当前确实未配价)。 - Monster 行是测试夹具:CSV 第一行物品“Monster(怪物)“只被容器单元测试使用(不可堆叠、带耐久的全属性样本),不是游戏内可获得的物品,不要随手删——删了容器测试会挂。
- Fuel(燃料)没有任何消耗方:描述写“火焰喷射器燃料”,但火焰喷射器实际烧的是兽油(
WeaponConsumptionConfig.csv)。Fuel 仅在部分城市有售,买了没用。 - 个别描述与实现有出入:Coal 描述“引擎燃料”,实际由锅炉燃烧(引擎吃蒸汽),另作弹药台配方原料;AA_Gun_Bullet 描述误写“机枪弹药”,实为防空炮弹药。描述列无界面读取,仅误导读表者。
- 新鲜度(Freshness)属性没有衰减系统:腐烂完全由年龄(Age)驱动。MonsterCorpse、MonsterMeat 挂着 100% 新鲜度但它永不变化;怪物尸体(无年龄属性、FreshDays=-1)实际永不腐烂。
- HP、Quality 属性无玩法效果:当前只用于容器排序比较(
ItemStackComparer.cs)和开发期容器监控窗口,没有耐久损坏或品质影响价格/效果的机制。 - ItemType 的 Tool / Weapon / Equipment 三类无人使用:枚举占位,没有任何物品、任何机制引用。
- MaxThirst 列是死列:属性系统没有“口渴”物品属性,这一列填什么都不生效。
- MaxAge 配错会导致永不腐烂:年龄写入有 [0, MaxAge] 硬校验(
Age.cs),若 MaxAge < FreshDays + StaleDays + 1,年龄涨到上限后写入失败被忽略,物品卡在“明日腐烂”预警里永远烂不掉。当前四个会腐烂的物品 MaxAge 都恰好等于腐烂阈值 + 1(19/6/31/61),改保质期时必须同步改 MaxAge。 - 解析容错偏宽松:列数不足 28 的行静默丢弃、类型解析失败静默取默认值,改完表务必进游戏抽查(开发期可用容器监控窗口核对,见开发者工具)。
- 内部文档存在过时描述:
Service/Common/AGENTS.md称 CSV 源在Assets/Resources/CSV/,实际在Assets/StreamingAssets/;容器系统的README_PropertyConfig.md示例中的 Apple/Sword/Bread 等物品早已不在表内。