船员
船员是玩家船上的核心模拟单位:有六项属性与七项技能,靠吃喝睡和如厕维持生存,靠心情、压力与紧张三套情绪系统决定工作效率,从港口招募、按周期领薪,会因饥渴流血而死,并通过本地大语言模型生成头顶闲聊气泡。
船员(Crew.cs)是参考 RimWorld / 缺氧殖民者的全功能模拟实体。每名船员同时是任务系统的执行者(接受建造、制作、搬运、炮术等工作分配,见 任务与工作),又是需求系统的发起者(饿了自己去找食物、困了自己去找床)。
玩家接触船员的途径:
- 获得:开局初始船队按场景预设生成(
StarterFleetInitializer.cs,开发者工具路径,见 开发者工具);游戏中在非敌对港口的招募面板雇佣(RecruitmentManager.cs,见 城市与国家)。 - 观察:每名船员头顶有 UGUI 名牌(名字、职级/专业色块、当前动作与进度条、受伤时的血条,
CrewNameTag.cs),并周期性弹出对话气泡。 - 管理:船员面板可升职/降职/转岗/解雇/驱逐(
CrewActionRouter.cs,见 界面总览),工作优先级面板调整各工种分配。 - 失去:战斗死亡、饿死/渴死/流血致死、长期欠薪在靠港时离队、玩家解雇或驱逐。
本页不展开船员之间的好感、小队与社交互动,见 船员社交与关系。
身份生成:属性、技能、职级、专业
Section titled “身份生成:属性、技能、职级、专业”招募候选人与初始船员都由 CandidateGenerator.cs 随机生成。
六项属性(1~20,生成时按高斯分布 均值 8、标准差 4 取整并夹紧;来源:代码常量 CandidateGenerator.cs):
| 属性 | 英文字段 | 主要用途 |
|---|---|---|
| 体能 | physique | 搬运(与耐力平均)、需求类动作 |
| 耐力 | endurance | 搬运(与体能平均)、紧张衰减与紧张鉴定成功率 |
| 气质 | temperament | 布道、指挥、社交、压力鉴定成功率 |
| 技艺 | craft | 建造、制作、烹饪 |
| 认知 | cognition | 医疗 |
| 战力 | combat | 炮术 |
七项技能(CrewSkills.cs):建造、制作、搬运、炮术、医疗、布道、指挥。生成时按高斯分布 均值 = 上限 × 0.4、标准差 = 上限 × 0.2 取整夹紧(CandidateGenerator.RollSkills),上限由职级与专业决定:
| 技能上限 | 水手 | 专家 | 军士 | 船长 |
|---|---|---|---|---|
| 普通技能 | 10 | 10 | 10 | 10 |
| 本专业相关技能 | 10 | 20 | 20 | 20 |
| 指挥 | 0 | 10 | 20 | 30 |
职级(CrewRank.cs)共四级,决定最大 HP、薪资系数和招募出现概率;专业(CrewSpecialty.cs)只有专家及以上可持有:
| 职级 | 最大 HP | 薪资系数 | 招募出现概率 | 可持专业 |
|---|---|---|---|---|
| 水手 Seaman | 50 | 1.0 | 70% | 否 |
| 专家 Specialist | 60 | 1.5 | 20% | 是 |
| 军士 PettyOfficer | 75 | 2.0 | 8% | 是 |
| 船长 Captain | 100 | 3.0 | 2% | 是 |
(HP 来源:代码常量 NeedsConfig.cs;薪资系数来源:Inspector 序列化字段 EconomyConfig.cs;概率来源:代码常量 CandidateGenerator.RollRank)
| 专业 | 关联工种(技能上限 20 的范围) |
|---|---|
| 工匠 Carpenter | 建造、制作 |
| 军械官 Gunner | 炮术 |
| 管事 Steward | 搬运、烹饪(烹饪复用制作技能) |
| 医生 Surgeon | 医疗(且重伤时可对自己发起自疗) |
| 牧师 Chaplain | 布道(暂不进入随机招募池,CandidateGenerator.RollSpecialty 显式排除) |
随机专业在工匠/军械官/管事/医生四者间均匀分布(来源:代码常量 CandidateGenerator.cs、CrewSpecialtyWorkTypeExtensions.cs)。
性别与姓名:性别 50/50(RollGender)。姓名三种形制——55% 中文名(姓 + 两字,字库分男性/女性/通用,性别字与通用字各 50%)、25% 西方译名(名·姓)、20% 绰号形制(如 “黑胡子”陈)(来源:代码常量 CandidateGenerator.GenerateName)。
- 移动速度由寻路系统统一配置:3.3 米/秒(来源:Inspector 序列化字段
PathfindingConfig.asset的defaultMoveSpeed,见 寻路与移动)。 - 每名船员自带 10 格随身容器(
Crew.Init中BaseContainer(10),代码常量)。任务被打断或船员死亡时,随身物品全部掉落到脚下地板容器(见 物品与库存)。 - 生成落点:在船上随机建筑附近螺旋搜索最近可行走格(
CrewManager.PickRandomShipSpawnPosition)。
四项需求值范围均为 0~100,每 1 现实秒结算一次(Crew.OnNeedsTick,TickFrequency.OncePerSecond)。注意:增长速率以现实秒计,而游戏时间默认 1 现实秒 = 1 游戏小时(DateTimeManager.cs,_timeScale = 1,见 时间与调度)。
| 需求 | 增长速率(点/秒) | 普通任务阈值 | 危急任务阈值 | 满值(100)后果 |
|---|---|---|---|---|
| 疲劳 Fatigue | +0.5(清醒时;睡眠/累晕时不增长) | 无(不会主动小睡) | ≥90 危急睡眠 | 累晕 Collapsed |
| 口渴 Thirst | +0.4 | ≥40 | ≥90 | 渴晕 Dehydrating |
| 饥饿 Hunger | +0.3 | ≥40 | ≥90 | 饿晕 Starving |
| 排泄 Bladder | +0.35 | ≥40 | ≥90 | 当场失禁:归零并在脚下掉落 1 个“粪便”物品 |
(全部来源:代码常量 NeedsConfig.cs;增长逻辑 CrewNeeds.UpdateNeeds)
- 睡眠期间,口渴/饥饿/排泄增长减半(×0.5,
SLEEPING_GROWTH_MULTIPLIER)。 - 由此换算:疲劳从 0 涨到 90(触发危急睡眠)需 180 秒;饥饿从 0 到 40(开始想吃饭)约 133 秒。
需求满足任务(由 CrewNeedsTaskIssuer.cs 每轮扫描生成,优先级数值越大越优先):
| 任务 | 触发 | 优先级 | 动作耗时 | 恢复量 |
|---|---|---|---|---|
进食 Task_Eat |
饥饿 ≥40 / ≥90 | 5 / 10 | 2 秒 | 食物的“默认饥饿值” × 新鲜度倍率 |
饮水 Task_Drink |
口渴 ≥40 / ≥90 | 5 / 10 | 1 秒 | 饮品的“默认口渴值” × 新鲜度倍率 |
睡眠 Task_Sleep |
仅疲劳 ≥90 | 10 | 持续到疲劳降到 20 | 床上 2 点/秒、无床就地 1 点/秒(任务侧速率,另见“已知限制”的双重恢复) |
如厕 Task_Relieve |
排泄 ≥40 / ≥90 | 5 / 10 | 3 秒 | 排泄值直接归零 |
(优先级与阈值:代码常量 NeedsConfig.cs;耗时:代码常量各 Task 文件;恢复量:CSV StaticItemConfig.csv 的 DefaultHungry / DefaultThirst 列)
新鲜度倍率:Fresh = 1.0,Stale(过保鲜期)= 0.5(代码常量 FreshnessState.cs 的 StaleValueMultiplier,见 物品与库存)。
当前可吃/可喝物品(CSV StaticItemConfig.csv,完整物品表见 物品数据表):
| 物品 | 饥饿恢复 | 口渴恢复 | 含酒精/单次 BAC | 自动饮用优先级(越小越先选) |
|---|---|---|---|---|
| 熟食 CookedMeal | 50 | — | 否 | — |
| 咸肉 SaltPork | 40 | — | 否 | — |
| 怪物肉 MonsterMeat | 15 | — | 否 | — |
| 饮用水 DrinkableWater | — | 50 | 否 | 10 |
| 格罗格酒 Grog | — | 50 | 是 / +10 | 20 |
| 怪物酒 MonsterBrew | — | 50 | 是 / +40 | -1(船员永不主动喝,仅紧急救援可灌给倒地者) |
醉酒(BAC 血液酒精浓度)
Section titled “醉酒(BAC 血液酒精浓度)”- 喝下含酒精饮品时 BAC 累加该物品的“单次饮用 BAC 增量”(
Task_Drink/Task_Hydrate)。 - BAC 每现实秒自然衰减 5/60 ≈ 0.083 点(代码常量
NeedsConfig.BAC_DECAY_RATE)。 - BAC ≥ 50 进入醉酒 Drunk;降到 < 20 才解除(迟滞窗口防抖动,
Crew.UpdateDrunkFromBAC)。 - 醉酒效果:工作效率上限压到 ×0.6(移动速度 ×0.7 的设计值存在但当前无消费方,见“已知限制”)。
失能状态机(IncapacityType)
Section titled “失能状态机(IncapacityType)”四种失能状态(IncapacityType.cs、CrewStatus.cs),进入时立刻中断当前任务:
| 状态 | 进入条件 | 退出条件 | 持续期间 | 死亡计时 |
|---|---|---|---|---|
| 累晕 Collapsed | 疲劳 = 100 | 疲劳 ≤ 30(被动恢复:床上 2 点/秒、地上 1 点/秒) | 无法执行任何任务;产生救援任务(抬上床,优先级 7) | 无 |
| 饿晕 Starving | 饥饿 = 100 | 饥饿 ≤ 30 | 完全无法行动;产生喂食任务(优先级 10) | 维持 10 秒后死亡 |
| 渴晕 Dehydrating | 口渴 = 100 | 口渴 ≤ 30 | 完全无法行动;产生喂水任务(优先级 10) | 维持 10 秒后死亡 |
| 重伤 Wounded | HP ≤ 30% | HP ≥ 50% | 无法执行任务(医生例外:可执行指向自己的自疗);产生治疗任务(优先级 8) | 流血计时 30 秒后死亡(治疗进行中暂停计时) |
(阈值与计时全部为代码常量 NeedsConfig.cs;任务发放 CrewNeedsTaskIssuer.cs)
治疗(Task_HealCrew.cs):他疗基础 5 秒、医生自疗基础 10 秒,目标恢复到 50% HP;实际耗时 = 基础秒数 × Lerp(1.2, 0.5, √(医疗工作速度系数)),即医术越高越快,全程在 0.5~1.2 倍之间。V1 不消耗医疗物资。
临时状态(Modifier / Control):
| 状态 | 来源 | 持续 | 工作效率 | 备注 |
|---|---|---|---|---|
| 眩晕 Dazed | 压力/紧张鉴定失败 | 5 秒 | ×0.5 | |
| 瘫痪 Paralyzed | 压力/紧张鉴定失败 | 8 秒 | 无法行动 | 同时使船长“在岗”判定失效 |
| 醉酒 Drunk | BAC ≥ 50 | 直到 BAC < 20 | ×0.6 | |
| 力竭 Winded / 脱水 Dehydrated / 强制唤醒 ForcedWakeup / 紧张免疫 TensionImmunity | 当前无任何系统施加(仅枚举与 UI 显示存在) | — | — | 见“已知限制” |
生命值与自然恢复
Section titled “生命值与自然恢复”- 最大 HP 按职级 50/60/75/100;战斗承伤走通用伤害管线(
DamageableComponent,见 伤害与护甲)。 - 自然恢复:HP 比例 ≥ 50% 且未满血时,每现实秒 +1 HP(代码常量
NATURAL_REGEN_RATE,Crew.UpdateNaturalRegen)。HP < 50% 不自然恢复,只能靠治疗任务。 - 名牌血条配色:HP ≤ 30% 红、≤ 60% 黄、其余绿(代码常量
NeedsConfig.HP_DISPLAY_*)。
心情与想法(Mood / Thought)
Section titled “心情与想法(Mood / Thought)”每名船员挂一个心情组件(MoodComponent.cs),由全局 MoodSystem.cs 在每个游戏日推进过期:
心情 = 50(基础值) + Σ 当前所有想法的心情变化值,夹紧到 [0, 100]
- 心情 < 30 时,工作效率上限压到 ×0.7(代码常量
MoodComponent.LOW_MOOD_THRESHOLD、CrewStatus.GetEfficiencyMultiplier)。 - 想法到期按游戏日计算(加入日 + 持续天数),持续天数 -1 表示条件型,仅由代码显式撤销。
- 同一想法允许叠加多个实例(例如连续两人阵亡会叠两条 -15)。
想法全表(CSV Assets/StreamingAssets/ThoughtConfig.csv,共 10 行,策划可直接改):
| Id | 显示文本 | 心情变化 | 持续(游戏天) | 触发来源 |
|---|---|---|---|---|
| Promoted | 升职了! | +20 | 7 | 任意升职(Crew.SetRank) |
| Demoted | 被贬职 | -15 | 14 | 专家→水手降职 |
| RankDownMinor | 降级了 | -10 | 7 | 其它降职 |
| TransferOther | 换了岗位 | -5 | 3 | 专家转换专业 |
| CaptainMissing | 群龙无首 | -10 | -1(条件型) | 船长缺岗 60 秒后全船获得;船长回岗时撤销(CaptaincyManager.cs,缺岗同时船速 ×0.5,见 船只) |
| CrewmateDied | {name} 阵亡了 | -15 | 7 | 玩家阵营船员死亡,发给所有其他存活船员(MoodSystem.cs) |
| CaptainDied | 船长 {name} 阵亡 | -20 | 14 | 玩家阵营船长死亡,发给所有其他存活船员 |
| BereavedFriend | 失去挚友 {name} | -20 | 5 | 死者与自己好感 ≥ +40(RelationshipHooks.cs,见 船员社交与关系) |
| TeammateDied | 小队战友 {name} 阵亡 | -10 | 5 | 同小队成员死亡 |
| LeaderDied | 队长 {name} 阵亡 | -20 | 10 | 所在小队队长死亡 |
压力与紧张(Stress / Tension)
Section titled “压力与紧张(Stress / Tension)”参考暗黑地牢的双轨情绪系统(CrewStressEvents.cs,仅玩家船船员参与;数值常量全在 NeedsConfig.cs)。
紧张 Tension(0~100,战斗短期)
| 来源 | 增量 |
|---|---|
| 自己受到伤害 | 伤害值 × 0.5 |
| 同船友军受到伤害 | 伤害值 × 0.1 |
| 同船船员阵亡(经 CrewmateDied 想法桥接) | +15 |
| 同船船长阵亡(经 CaptainDied 想法桥接) | +25 |
- 自然衰减:每秒 -(0.5 + 耐力 × 0.05) 点。
- 档位:0~49 = 0 档,50~79 = 1 档,80~99 = 2 档,≥100 = 3 档。
- 向上跨档时触发紧张鉴定:成功率 = 耐力 × 5%(耐力 10 → 50%,20 → 100%)。失败后果按权重:40% 眩晕 5 秒、30% 瘫痪 8 秒、15% 当场失禁(排泄值直接置 100)、15% 呕吐(饥饿 +20)。
- 跨档同时把紧张转化为压力:每跨过一档累加(1 档 +3、2 档 +5、3 档 +10;0 直跳 100 共 +18)。
- 鉴定后无论成败:紧张归零并获得 60 秒紧张免疫(免疫期内紧张不再增长)。
压力 Stress(0~100,长期累积)
| 来源 | 增量 |
|---|---|
| 首次跌破 30% HP(重伤) | +20(治愈回到 30% 以上后可再次触发) |
| 离港超过 14 天后,每天 | +2 |
| 紧张跨档转化 | +3 / +5 / +10 |
| CaptainDied 想法 | +15 |
| CrewmateDied 想法 | +10 |
| Demoted 想法 | +5 |
| RankDownMinor 想法 | +3 |
| CaptainMissing 想法存续期间每天 | +1 |
| Promoted 想法 | -5(减压) |
| 靠港停泊 | -20(唯一能击穿永久地板的途径) |
- 自然衰减:每秒 -(0.01 + 耐力 × 0.001) 点,但跌不破永久地板。
- 永久地板:压力向上跨过 50/80/100 时,地板升至 50/80/100(1/2/3 级),并触发一次压力鉴定;只有靠港 -20 后重新评定才可能降级。
- 永久地板的效率惩罚:1 级 ×0.85、2 级 ×0.70、3 级 ×0.50。
- 压力鉴定:成功率 = 气质 × 5%。失败:60% 眩晕 5 秒、40% 瘫痪 8 秒。
失意(Demotion)
Section titled “失意(Demotion)”仅“专家 → 水手”降职触发(CrewStatus.cs,设计文档 职级管理 R4/R5):
- 持续 60 游戏天,期间工作效率上限 ×0.8(代码常量
DEMOTION_DURATION_DAYS/DEMOTION_PENALTY)。 - 任意升职立即解除;60 天自然到期解除(到期时同时尝试移除 Demoted 想法)。
- 水手期的原专业被暂存,重新升为专家时自动恢复(玩家显式指定专业则覆盖暂存)。
工作能力与效率
Section titled “工作能力与效率”任务系统对每个工种询问船员的工作速度(Crew.GetWorkSpeedMultiplier):
工作速度 = 属性修正(主属性) × 属性修正(对应技能) × 状态效率系数
属性修正(等级) = 0.2 × e^(0.0805 × 等级) —— 等级 1 ≈ 0.22,10 ≈ 0.45,20 = 1.0(
CrewAttributes.CalcModifier)
| 工种 | 主属性 | 对应技能 |
|---|---|---|
| 建造 | 技艺 | 建造 |
| 制作 / 烹饪 | 技艺 | 制作 |
| 搬运 | (体能+耐力)/2 | 搬运 |
| 炮术 | 战力 | 炮术 |
| 医疗 | 认知 | 医疗 |
| 布道 | 气质 | 布道 |
| 指挥 | 气质 | 指挥 |
| 需求类 | 体能 | 0 |
| 社交 | 气质 | 0 |
状态效率系数(CrewStatus.GetEfficiencyMultiplier)取下列各项的最小值(不连乘):
| 状态 | 系数上限 |
|---|---|
| 眩晕 / 力竭 | 0.5 |
| 醉酒 | 0.6 |
| 心情 < 30 | 0.7 |
| 压力永久地板 1/2/3 级 | 0.85 / 0.70 / 0.50 |
| 失意 | 0.8 |
欠薪惩罚走另一条路:影响的是该船员认领任务的有效优先级(有效优先级 = 基础优先级 × 欠薪效率系数,Crew.CalculateEffectivePriority),欠薪 1 次 ×0.9、2 次 ×0.8、≥3 次 ×0.5(Inspector 序列化字段 EconomyConfig.cs 的 unpaidPenalty1/2/3)。
招募来源与成本
Section titled “招募来源与成本”候选人池(RecruitmentManager.cs):每个港口城市独立维护,进入港口或打开面板时按需刷新;刷新周期与发薪周期共用(当前游戏天 ÷ 4 取整变化即重刷)。每次刷新生成 5~10 人(含上下界,Inspector 序列化字段 candidateCountMin/Max)。
薪资公式(SalaryManager.CalcMonthlySalary,能力分 = 七项技能之和):
周期薪资 = 职级系数 × (基础薪资 10 + 能力分 × 0.5) × 随机浮动(0.7~1.3),下限为基础薪资 10
签约金 = 周期薪资 × 2(招募时一次性支付)
遣散费 = 周期薪资 × 1(解雇时一次性支付)
发薪:每 4 游戏天结算一次(Inspector 序列化字段 salaryIntervalDays),按职级从高到低依次支付;金币不足则欠薪计数 +1(但发薪日照常推进)。发薪成功欠薪计数清零。
欠薪离队:靠港时检查(SalaryManager.CheckUnpaidLeave,由进港触发),欠薪 ≥4 次的船员各自掷 30% 概率直接离队(销毁实体,不退签约金)。
编制上限:全船 20 人(Inspector 序列化字段 baseCrewCapacity),招募面板的待确认交易会预扣编制。
解雇与驱逐(CrewActionRouter.cs):
- 解雇:必须停靠在非敌对港口,支付遣散费后移除。
- 驱逐:任何时候可执行,零费用,播放抛物线落水动画后销毁(
ExpelAnimation.cs,2.8 秒飞行);声望惩罚字段已配置(expelReputationPenalty = 10)但未实装,UI 明示“待实装”。
注意:项目当前没有 Resources/Config/EconomyConfig.asset 资产文件,运行时落到 EconomyConfig.cs 中的代码默认值并打印警告。要调薪资必须先创建该 ScriptableObject 资产(菜单 Config/EconomyConfig)放到 Assets/Resources/Config/。
死亡条件与后果
Section titled “死亡条件与后果”死亡条件(Crew.CheckDeathConditions + 战斗死亡):
| 死因 | 条件 |
|---|---|
| 脱水 | 渴晕状态持续 10 秒 |
| 饥饿 | 饿晕状态持续 10 秒 |
| 流血 | 重伤状态流血计时累计 30 秒(治疗中暂停) |
| 战斗伤亡 | HP 归零(经 DamageableComponent.Die) |
死亡后果(Crew.Die):
- 中断当前任务,取消针对该船员的所有救援/医疗任务。
- 释放占用/预约的全部床位。
- 随身物品全部掉落到脚下(见 战利品与掉落 不含此途径——这是掉自己的货)。
- 若是玩家阵营:全船其他存活船员获得 CrewmateDied(-15 心情)或 CaptainDied(-20 心情)想法,并经映射叠加压力(+10/+15)与紧张(+15/+25)。
- 社交侧:挚友获 BereavedFriend、同小队获 TeammateDied/LeaderDied 想法(见 船员社交与关系)。
- 对话侧:随机一名存活船员入队“目击死亡”事件(优先级 90),下个对话节拍由其发言。
- 船长死亡额外导致船长缺岗(船速 ×0.5,60 秒后全船 CaptainMissing)。
- GameObject 销毁,自动从任务管理器和船员管理器注销。
对话气泡与 LLM 对话生成
Section titled “对话气泡与 LLM 对话生成”CrewDialogueManager.cs 每 5 秒触发一个对话节拍:
- 事件优先:先消费事件队列(同一船员同时最多挂 1 个事件,高优先级覆盖低的;超过 5 秒未消费即过期丢弃)。事件类型与优先级:目击队友死亡 90 > 自己被攻击 80 > 从失能恢复 70。
- 轮流闲聊:队列为空时按船员列表 round-robin 轮到谁谁发言。
- 每次发言随机抽一种性格(豪放/谨慎/幽默/暴躁,均匀 25%,
PersonalityType)。 - 触发话题(
DialogueTrigger.cs):取最高且 ≥70 的需求(判定顺序 饥饿 > 口渴 > 疲劳),都不到 70 则归为“空闲闲聊”。排泄不参与话题判定,但 ≥70 时会写进“当前最在意的事”。
提示词内容(DialoguePromptBuilder.cs):系统提示词包含船员名、性格描述与示例、身份(职级+专业)、当前游戏时刻与时段描述、天气描述、输出规则(以一个 emoji 开头、10~40 字、禁止括号旁白);用户提示词包含四项需求百分比、当前任务名、失能状态摘要、近期事件、以及由 LLM 预先生成的历史摘要(DialogueHistorySummarizer.cs,对最近 10 条发言记录做结构化总结)。
LLM 调用(LLMService.cs):本地 Ollama(localhost:11434/api/chat),默认模型 qwen3:8b(运行时可切换),temperature 1.5、repeat_penalty 1.5、top_k 50,关闭思考模式并强制剥离 <think> 段,单次请求超时 120 秒。Ollama 一旦探测不可达即静默停用本会话全部对话生成(需重启 Unity 或调用重置)。
展示:回复先经 DialogueReplyCleaner.cs 剥离中英文括号旁白,再交给 WorldBubbleSystem.cs 在船员头顶显示 5 秒;同一船员的多条消息自动排队。
保底对话:CSV Assets/StreamingAssets/CrewDialogueTemplates.csv 收录 48 条离线模板(4 性格 × 饥饿/口渴/疲劳/空闲 4 话题 × 各 3 条,策划可直接改),示例:
| Personality | TriggerType | Text |
|---|---|---|
| Bold | Hunger | 哈!这点饿算什么,当年我三天没吃饭照样打仗! |
| Cautious | Thirst | 我觉得我们应该节省着喝… |
| Humorous | Fatigue | 再干下去,我就要站着睡着了! |
| Grumpy | Idle | 看什么看,没见过帅气的海盗吗? |
注意:该 CSV 当前未接入运行时——Ollama 不可达时直接不冒泡,并不会回退到模板(见“已知限制”)。
公式与数值(集中速查)
Section titled “公式与数值(集中速查)”| 项 | 公式 / 数值 | 来源 |
|---|---|---|
| 心情 | 50 + Σ想法值,夹紧 [0,100];<30 → 效率上限 0.7 | 代码常量 MoodComponent.cs + CSV ThoughtConfig.csv |
| 属性修正 | 0.2 × e^(0.0805×等级),等级 20 = 1.0 | 代码常量 CrewAttributes.cs |
| 工作速度 | 属性修正(主属性) × 属性修正(技能) × min(各状态系数) | Crew.cs / CrewStatus.cs |
| 任务有效优先级 | 基础优先级 × 欠薪系数(1/0.9/0.8/0.5) | Crew.cs / EconomyConfig.cs |
| 周期薪资 | 职级系数 × (10 + 技能总和 × 0.5) × U(0.7,1.3),每 4 天发放 | Inspector EconomyConfig.cs(无 asset 时为代码默认值) |
| 签约金 / 遣散费 | 薪资 ×2 / 薪资 ×1 | 同上 |
| 需求增长 | 疲劳 0.5、口渴 0.4、饥饿 0.3、排泄 0.35 点/现实秒;睡眠时后三项 ×0.5 | 代码常量 NeedsConfig.cs |
| 失能进入/退出 | 进 100 / 出 ≤30(睡眠完成线 20) | 代码常量 NeedsConfig.cs |
| 死亡计时 | 饿晕/渴晕 10 秒;流血 30 秒 | 代码常量 NeedsConfig.cs |
| HP | 50/60/75/100;重伤 ≤30%、脱离 ≥50%;≥50% 时 +1 HP/秒自然恢复 | 代码常量 NeedsConfig.cs |
| 治疗 | 他疗 5 秒、自疗 10 秒,× Lerp(1.2→0.5, √医疗速度),回到 50% HP | 代码常量 Task_HealCrew.cs |
| BAC | 衰减 0.083/秒;≥50 醉(效率 0.6)、<20 醒 | 代码常量 NeedsConfig.cs |
| 紧张衰减 | (0.5 + 耐力×0.05)/秒;鉴定成功率 = 耐力×5%;鉴定后归零 + 免疫 60 秒 | 代码常量 NeedsConfig.cs |
| 紧张失败后果 | 40% 眩晕 5s / 30% 瘫痪 8s / 15% 失禁 / 15% 呕吐(+20 饥饿) | 代码常量 CrewStressEvents.cs |
| 压力衰减 | (0.01 + 耐力×0.001)/秒,封底于永久地板 50/80/100 | 代码常量 NeedsConfig.cs |
| 压力鉴定 | 成功率 = 气质×5%;失败 60% 眩晕 / 40% 瘫痪 | 代码常量 CrewStressEvents.cs |
| 压力地板效率惩罚 | 1/2/3 级 → 0.85 / 0.70 / 0.50 | 代码常量 CrewStatus.cs |
| 离港压力 | >14 天后每天 +2;靠港 -20 且可降地板 | 代码常量 NeedsConfig.cs |
| 失意 | 专家→水手,60 天,效率 ×0.8,升职即解 | 代码常量 CrewStatus.cs |
| 船长缺岗 | 缺岗 60 秒 → 全船 CaptainMissing(-10);船速 ×0.5 | 代码常量 CaptaincyConsts.cs |
| 招募职级分布 | 水手 70% / 专家 20% / 军士 8% / 船长 2% | 代码常量 CandidateGenerator.cs |
| 属性/技能生成 | 属性 N(8,4) 夹 [1,20];技能 N(0.4cap, 0.2cap) 夹 [0,cap] | 代码常量 CandidateGenerator.cs |
| 欠薪离队 | 靠港时欠薪 ≥4 次 → 30% 离队 | Inspector EconomyConfig.cs |
| 编制上限 | 20 人 | Inspector EconomyConfig.cs |
| 对话节拍 | 每 5 秒一人;气泡显示 5 秒;事件 5 秒过期;历史窗口 10 条 | 代码常量 CrewDialogueManager.cs / DialogueHistory.cs |
| 移动速度 | 3.3 米/秒 | Inspector PathfindingConfig.asset |
与其他系统的交互
Section titled “与其他系统的交互”- 任务与工作:船员是任务消费者;需求/救援任务的优先级与抢占规则在任务页。
- 寻路与移动:移动速度、可行走格判定。
- 时间与调度:1 现实秒 = 1 游戏小时;发薪、想法过期、离港压力都按游戏天结算。
- 伤害与护甲:船员承伤、HP 事件链;元素与状态效果 的元素状态同样作用于船员承伤管线。
- 船员社交与关系:好感、小队、共餐共寝记录、死亡哀悼想法。
- 船只:船长在岗给船速 ×1.0/缺岗 ×0.5;船金币是薪资唯一来源。
- 物品与库存、物品数据表:食物/饮品恢复量、新鲜度折损、失禁产物。
- 城市与国家、交易:港口招募、靠港减压、欠薪离队判定。
- 界面总览:船员名牌、招募面板、船员抽屉、确认弹窗。
- 开发者工具:初始船队注入、Odin 调试按钮(一键置危急需求/重伤/治愈)。
- 配置表总览:ThoughtConfig / CrewDialogueTemplates / StaticItemConfig 三张 CSV。
配置与调参指南
Section titled “配置与调参指南”| 想调的体验 | 改哪里 | 类型 |
|---|---|---|
| 想法的心情值/持续天数、新增想法 | Assets/StreamingAssets/ThoughtConfig.csv(新增想法还需代码里有触发点) |
CSV |
| 食物/饮品恢复量、酒精强度、自动饮用偏好 | Assets/StreamingAssets/StaticItemConfig.csv 的 DefaultHungry / DefaultThirst / BACPerDrink / DrinkPriority 列 |
CSV |
| 离线保底台词 | Assets/StreamingAssets/CrewDialogueTemplates.csv(注意当前未接入运行时) |
CSV |
| 薪资水平、发薪周期、欠薪惩罚、候选人数量、编制上限 | 创建 Assets/Resources/Config/EconomyConfig.asset 后改字段(当前缺失,落代码默认值) |
Inspector |
| 船员移动速度 | PathfindingConfig.asset 的 defaultMoveSpeed |
Inspector |
| 需求增长/阈值/死亡计时/HP/压力紧张全套 | NeedsConfig.cs(需要程序改) |
代码常量 |
| 心情基础值与低心情阈值 | MoodComponent.cs |
代码常量 |
| 失意时长与惩罚 | CrewStatus.cs |
代码常量 |
| 招募的职级概率、属性/技能分布、名字库 | CandidateGenerator.cs |
代码常量 |
| 想法→压力/紧张映射 | CrewStressMapping.cs |
代码常量 |
| 对话节拍/事件优先级/历史窗口 | CrewDialogueManager.cs、DialogueHistory.cs |
代码常量 |
| LLM 模型与采样参数 | LLMService.cs(CurrentModel 可运行时改,采样参数是常量) |
代码常量 |
| 紧张/压力鉴定失败的后果权重 | CrewStressEvents.cs |
代码常量 |
已知限制与注意事项
Section titled “已知限制与注意事项”- 时间基准混用:需求增长、死亡计时、BAC、压力/紧张衰减全部按现实秒计,而薪资、想法过期、失意按游戏天(1 天 = 24 现实秒)计。
NeedsConfig.BAC_DECAY_RATE的注释写“1 游戏小时 = 60 现实秒”,与DateTimeManager实际的“1 现实秒 = 1 游戏小时”不一致——注释陈旧,数值行为以每现实秒 -0.083 为准。 - 睡眠疲劳双重恢复:执行
Task_Sleep期间,任务步骤(床 2 点/秒、地 1 点/秒)与CrewNeeds.UpdateNeeds的被动恢复(同样床 2/地 1)同时生效,实际床上恢复约 4 点/秒、地上约 2 点/秒。调睡眠时长时两处都要看。 - 移动减速无消费方:
CrewStatus.GetMoveSpeedMultiplier()(眩晕/力竭 0.5、醉酒 0.7)与DEHYDRATED_SPEED_MULTIPLIER(0.1)定义了但没有任何系统调用,船员实际移动速度恒定 3.3 米/秒。 - 四个幽灵状态:力竭 Winded、脱水 Dehydrated、强制唤醒 ForcedWakeup、紧张免疫 TensionImmunity 这四个 Modifier 没有任何运行时系统施加(紧张免疫实际走
CrewNeeds的独立倒计时字段),但船员抽屉 UI 会显示它们——永远不会亮。 - 保底对话未接线:
FallbackDialoguePool.GetFallback在运行时无调用方;Ollama 不可达时船员直接沉默。Service/LLM/CLAUDE.md所述“失败时回退到 FallbackDialoguePool”“冷却 30-60s/人”“闲聊 5%”均为文档漂移,代码里不存在。 - 排泄不触发话题:
NeedTriggerType.Bladder与 Social 枚举存在,但DialogueTrigger只判饥饿/口渴/疲劳;保底 CSV 也没有 Bladder/Social 行。 - Demoted 想法与失意状态时长不一致:想法 14 天自动过期,失意状态持续 60 天;60 天到期时代码再调一次移除想法通常是空操作。
- EconomyConfig 资产缺失:
Resources/Config/EconomyConfig不存在,所有薪资参数实际取代码默认值;“月薪”叫法名不副实,实际每 4 游戏天(约 96 现实秒)发一次。 - 未实装/未使用的配置:proficiencyDisplayVariance(候选人技能显示模糊 ±3)定义未使用;expelReputationPenalty(驱逐声望 -10)未实装;SCHEDULED_SLEEP_PRIORITY(定时睡眠 9)无发起方——船员只有疲劳 ≥90 才睡觉,没有作息表;STRESS_BOOST_CHANCE(应激增益)、祷告/娱乐减压常量均为预留 hook。
- 驱逐绕过死亡链:驱逐直接销毁 GameObject,不触发
Crew.Die,因此不产生阵亡想法/压力/对话事件(符合“抛下海”语义,但注意与解雇路径一致也是静默销毁)。 - 多船隔离:压力/紧张系统只订阅玩家船船员;心情死亡广播只在死者属于 Player 阵营时触发;AI 船船员有这些组件但情绪事件不驱动。
- TODO(代码内标注):
Task_Sleep/Task_Relieve/Task_Rescue未处理床/厕所在执行中被摧毁的情况(DPP-953)。 - 设计文档差异:
.claude/rules/design-docs.md指向的船员设计目录是意图描述;凡与本页数值冲突,以本页(代码现状)为准。