跳转到内容

物品数据表

全游戏唯一的物品登记表 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.csTask_Hydrate.cs

在游戏循环中的位置:生产与制作产出物品 → 存入容器 → 被船员消耗(吃喝、装弹、烧锅炉)或在港口交易。每一步引用的都是本表的 ItemId。

物品类别由 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)。

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

格式同上;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.csTask_Hydrate.cs
DrinkPriority int 序号(越小越优先) 自动饮用优先级。-1 = 船员永不主动喝(仅紧急救援喂水时作为最后兜底) FoodItemExtension.cs

物品入库时按 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)。
  • 这是有意的玩法设计:持续补新货可以“摊薄”老货年龄,鼓励玩家主动轮转库存(避免“一滴老货污染整桶”的反向棘轮)。

腐烂由保质期系统驱动(ShelfLifeSystem.cs),每个游戏日结算一次(订阅日期变更事件,见时间与调度):

  1. 每游戏日给所有容器中带年龄属性、且 FreshDays ≥ 0 的堆叠年龄 +1 天。
  2. 状态判定(FreshnessState.cs):
    • 新鲜(Fresh):年龄 ≤ FreshDays
    • 陈旧(Stale):FreshDays < 年龄 ≤ FreshDays + StaleDays
    • 腐烂:年龄 > FreshDays + StaleDays → 整堆移除,按原数量 1:1 转化为 RotItemId 物品(RotItemId 为空则直接消失;容器拒收转化物时也直接丢弃)
  3. 年龄恰好等于 FreshDays + StaleDays 的当天,触发“明日腐烂”预警事件(玩家船上弹提示),给玩家整整一天去消耗、出售或再加工。
  4. 腐烂清堆前会释放该格上的所有任务预约,防止预约残留导致库存计数永久虚低。

按当前 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.5FreshnessState.cs 的 StaleValueMultiplier,需要程序改):

  • 实际饱食恢复 = DefaultHungry × 0.5;实际解渴恢复 = DefaultThirst × 0.5(NeedRequestHelper.cs
  • 实际卖价 = round(基础价 × 0.5),但最低 1 金,防止低价品折后归零(PlayerTrader.csTradingSession.cs
  • 新鲜与不腐物品系数为 1.0

船员产生口渴需求时(任务派发流程见任务与工作):

  • 自饮候选池:类别 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),详见交易

系统 关系
物品与库存 容器按本表初始化堆叠与属性;堆叠上限、合并规则、地面物品图标全部源于此
生产与制作 配方表 RecipeConfig.csv 的输入/输出全部引用本表 ItemId(水→蒸汽→饮用水、尸体→肉+兽油、肉→熟食、酿酒兑酒等 10 条配方)
武器与弹药 武器消耗表 WeaponConsumptionConfig.csv 引用本表 ItemId:机枪耗子弹、加农炮耗炮弹、火焰喷射器耗兽油、防空炮耗 AA 子弹+水
船员 吃喝恢复量、酒精与醉酒度、失禁掉落粪便均与本表字段联动
交易 卖价 = 基础价 ×(陈旧 0.5 折,下限 1 金);城市库存表与奢侈品产地表引用本表 ItemId
战利品与掉落 怪物尸体等掉落物以本表 ItemId 注册
时间与调度 保质期按游戏日结算(日期变更事件驱动)
配置表总览 本表是全部 CSV 配置表之一,生成流程相同

CSV 与代码的关系分两层:

  1. 数据行(改数值、加物品行、删物品行):游戏运行时动态读取 CSV(编辑器下读 Assets/StreamingAssets/StaticItemConfig.csv,打包后读 StreamingAssets),重新进 Play Mode 即生效。
  2. 列结构(加列、删列、改列名、改类型):生成的解析代码按列位置硬编码(当前要求每行至少 28 列),必须让程序重新跑代码生成器,否则解析错位或整行被静默丢弃。

生成器入口:Unity 菜单 Tools → CSV Code Generator → 批量生成所有CSVCSVCodeGeneratorMenu.cs)。它会扫描 StreamingAssets 下全部 CSV(含子目录),重新生成 Generated/ 目录下的对应代码,并自动清理已删除 CSV 的孤儿代码文件。只改数值不需要重新生成(生成代码不依赖数据行内容);改列结构必须重新生成。

CSV 格式硬规则:

  • 前三行固定为表头:第 1 行字段名 / 第 2 行类型(必须是合法类型标记,如 string、int、float、bool、ItemType)/ 第 3 行中文注释;数据从第 4 行起。
  • 数据行不足 28 列会被静默跳过(不报错),物品凭空消失——加行后务必数清逗号。
  • 带逗号的文本字段要用双引号包裹。
  • 布尔值写 true/false(大小写不敏感,1 也算 true)。
  • 解析失败的单元格静默回退为类型默认值(数字 0、布尔 false),不会报错——填错枚举名等问题只能靠人工核对。
想调的体验 改哪里 类型
某食物更顶饿 / 某饮品更解渴 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 的时长常量 代码常量(找程序)
  1. StaticItemConfig.csv 末尾加一行,28 列填全(不腐物品照抄 Wood 行的尾段模板:...,-1,0,,false,0,100)。
  2. 让程序跑 Tools → CSV Code Generator → 批量生成所有CSV
  3. 找程序在 ItemPriceConfig.cs 加基础价,否则按默认 10 金卖。
  4. 提供图标 Assets/Resources/UI/Icons/Items/{ItemId}.png,否则地面显示彩色方块占位。
  5. 如需城市售卖:在 CityInventory.csv 加行;如需配方产出/消耗:在 RecipeConfig.csv 引用;如作武器弹药:在 WeaponConsumptionConfig.csv 引用。
  6. 如会腐烂:确认 UseAge=true、MaxAge ≥ FreshDays + StaleDays + 1、RotItemId 指向表内已有物品。
  • 价格不在物品表里:基础售价是代码常量(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 等物品早已不在表内。