跳转到内容

船员

船员是玩家船上的核心模拟单位:有六项属性与七项技能,靠吃喝睡和如厕维持生存,靠心情、压力与紧张三套情绪系统决定工作效率,从港口招募、按周期领薪,会因饥渴流血而死,并通过本地大语言模型生成头顶闲聊气泡。

船员(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.csCrewSpecialtyWorkTypeExtensions.cs)。

性别与姓名:性别 50/50(RollGender)。姓名三种形制——55% 中文名(姓 + 两字,字库分男性/女性/通用,性别字与通用字各 50%)、25% 西方译名(名·姓)、20% 绰号形制(如 “黑胡子”陈)(来源:代码常量 CandidateGenerator.GenerateName)。

  • 移动速度由寻路系统统一配置:3.3 米/秒(来源:Inspector 序列化字段 PathfindingConfig.assetdefaultMoveSpeed,见 寻路与移动)。
  • 每名船员自带 10 格随身容器(Crew.InitBaseContainer(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.csStaleValueMultiplier,见 物品与库存)。

当前可吃/可喝物品(CSV StaticItemConfig.csv,完整物品表见 物品数据表):

物品 饥饿恢复 口渴恢复 含酒精/单次 BAC 自动饮用优先级(越小越先选)
熟食 CookedMeal 50
咸肉 SaltPork 40
怪物肉 MonsterMeat 15
饮用水 DrinkableWater 50 10
格罗格酒 Grog 50 是 / +10 20
怪物酒 MonsterBrew 50 是 / +40 -1(船员永不主动喝,仅紧急救援可灌给倒地者)
  • 喝下含酒精饮品时 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.csCrewStatus.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 显示存在) 见“已知限制”
  • 最大 HP 按职级 50/60/75/100;战斗承伤走通用伤害管线(DamageableComponent,见 伤害与护甲)。
  • 自然恢复:HP 比例 ≥ 50% 且未满血时,每现实秒 +1 HP(代码常量 NATURAL_REGEN_RATECrew.UpdateNaturalRegen)。HP < 50% 不自然恢复,只能靠治疗任务。
  • 名牌血条配色:HP ≤ 30% 红、≤ 60% 黄、其余绿(代码常量 NeedsConfig.HP_DISPLAY_*)。

每名船员挂一个心情组件(MoodComponent.cs),由全局 MoodSystem.cs 在每个游戏日推进过期:

心情 = 50(基础值) + Σ 当前所有想法的心情变化值,夹紧到 [0, 100]

  • 心情 < 30 时,工作效率上限压到 ×0.7(代码常量 MoodComponent.LOW_MOOD_THRESHOLDCrewStatus.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 所在小队队长死亡

参考暗黑地牢的双轨情绪系统(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 秒。

仅“专家 → 水手”降职触发(CrewStatus.cs,设计文档 职级管理 R4/R5):

  • 持续 60 游戏天,期间工作效率上限 ×0.8(代码常量 DEMOTION_DURATION_DAYS / DEMOTION_PENALTY)。
  • 任意升职立即解除;60 天自然到期解除(到期时同时尝试移除 Demoted 想法)。
  • 水手期的原专业被暂存,重新升为专家时自动恢复(玩家显式指定专业则覆盖暂存)。

任务系统对每个工种询问船员的工作速度(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)。

候选人池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/

死亡条件Crew.CheckDeathConditions + 战斗死亡):

死因 条件
脱水 渴晕状态持续 10 秒
饥饿 饿晕状态持续 10 秒
流血 重伤状态流血计时累计 30 秒(治疗中暂停)
战斗伤亡 HP 归零(经 DamageableComponent.Die

死亡后果Crew.Die):

  1. 中断当前任务,取消针对该船员的所有救援/医疗任务。
  2. 释放占用/预约的全部床位。
  3. 随身物品全部掉落到脚下(见 战利品与掉落 不含此途径——这是掉自己的货)。
  4. 若是玩家阵营:全船其他存活船员获得 CrewmateDied(-15 心情)或 CaptainDied(-20 心情)想法,并经映射叠加压力(+10/+15)与紧张(+15/+25)。
  5. 社交侧:挚友获 BereavedFriend、同小队获 TeammateDied/LeaderDied 想法(见 船员社交与关系)。
  6. 对话侧:随机一名存活船员入队“目击死亡”事件(优先级 90),下个对话节拍由其发言。
  7. 船长死亡额外导致船长缺岗(船速 ×0.5,60 秒后全船 CaptainMissing)。
  8. GameObject 销毁,自动从任务管理器和船员管理器注销。

CrewDialogueManager.cs 每 5 秒触发一个对话节拍:

  1. 事件优先:先消费事件队列(同一船员同时最多挂 1 个事件,高优先级覆盖低的;超过 5 秒未消费即过期丢弃)。事件类型与优先级:目击队友死亡 90 > 自己被攻击 80 > 从失能恢复 70。
  2. 轮流闲聊:队列为空时按船员列表 round-robin 轮到谁谁发言。
  3. 每次发言随机抽一种性格(豪放/谨慎/幽默/暴躁,均匀 25%,PersonalityType)。
  4. 触发话题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 不可达时直接不冒泡,并不会回退到模板(见“已知限制”)。

公式 / 数值 来源
心情 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
  • 任务与工作:船员是任务消费者;需求/救援任务的优先级与抢占规则在任务页。
  • 寻路与移动:移动速度、可行走格判定。
  • 时间与调度:1 现实秒 = 1 游戏小时;发薪、想法过期、离港压力都按游戏天结算。
  • 伤害与护甲:船员承伤、HP 事件链;元素与状态效果 的元素状态同样作用于船员承伤管线。
  • 船员社交与关系:好感、小队、共餐共寝记录、死亡哀悼想法。
  • 船只:船长在岗给船速 ×1.0/缺岗 ×0.5;船金币是薪资唯一来源。
  • 物品与库存物品数据表:食物/饮品恢复量、新鲜度折损、失禁产物。
  • 城市与国家交易:港口招募、靠港减压、欠薪离队判定。
  • 界面总览:船员名牌、招募面板、船员抽屉、确认弹窗。
  • 开发者工具:初始船队注入、Odin 调试按钮(一键置危急需求/重伤/治愈)。
  • 配置表总览:ThoughtConfig / CrewDialogueTemplates / StaticItemConfig 三张 CSV。
想调的体验 改哪里 类型
想法的心情值/持续天数、新增想法 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.csDialogueHistory.cs 代码常量
LLM 模型与采样参数 LLMService.cs(CurrentModel 可运行时改,采样参数是常量) 代码常量
紧张/压力鉴定失败的后果权重 CrewStressEvents.cs 代码常量
  • 时间基准混用:需求增长、死亡计时、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 指向的船员设计目录是意图描述;凡与本页数值冲突,以本页(代码现状)为准。