跳转到内容

修建

玩家在船上下达建筑蓝图,船员自动搬运材料并施工完成;拆除即时生效但不返还任何材料,受损建筑由船员免费维修。

修建系统是船只成长的核心循环之一:玩家通过建造模式在船体网格上放置建筑(地板、墙、工坊、武器、蒸汽设备等),建筑以“框架”形式落地,随后由分配了“建造”工作的船员自动完成两段劳动——先把所需材料从船上容器搬到工地,再到工地持续施工,直到建筑完工可用。整个流程参考 RimWorld:玩家只下指令,不直接操作船员。

玩家接触入口:

  • 底栏 BuildBar(B 键开关)进入建造模式,选择建筑后在甲板上点击/拖拽放置(BuildingController.cs、BuildBar 见界面总览)。
  • 建造模式下按住 Ctrl 点击/拖拽即为拆除。
  • 框架放置后无需再操作,搬料、施工、维修全部由任务系统自动派发给船员。

系统代码主体位于 Assets/Scripts/Service/ConstructionSystem/(放置、验证、预览、拆除),施工与维修的劳动部分位于 Core/BuildingSystem/Constructable.csRepairable.cs)与 Core/Task/Task_Build.csTask_Haul.csTask_Repair.cs)。

建筑状态定义在 BuildingState.cs,状态只能单向推进:

状态 含义 进入条件
Idle(空闲) 建筑实体不存在 初始
Frame(框架) 已放置蓝图,半透明显示,等材料和施工 玩家放置且该建筑在成本表中
Completed(完工) 可正常使用 工作进度 100%,或即时建造
Destroyed(已摧毁) 终态 被攻击摧毁
Removed(已拆除) 终态 玩家拆除

合法转换:Idle→Frame、Frame→Completed/Destroyed/Removed、Completed→Destroyed/Removed。非法转换会被拒绝并记录警告(BuildingData.cs 的 SetState)。

注意:框架阶段建筑不可被攻击——完工时才调用开启“可被攻击”开关(Constructable.cs 的 EnableBuildingCombat),框架本体不会被敌人打掉,但施工现场的材料堆和地板可能受战斗波及。

第一步:下蓝图(放置与验证)

Section titled “第一步:下蓝图(放置与验证)”

建造模式下鼠标悬停显示预览虚影(绿=可放置、红=不可放置,红色位置上的冲突建筑同时被红色高亮,BuildingPreview.cs)。点击(或拖拽后松开)执行放置。每个候选格逐一通过以下检查(ConstructionUtils.cs 的 ValidateCoordinate):

  1. 网格范围:建筑锚点格与全部占用格都必须在船体网格内。网格为船本地坐标系,跟随船移动旋转;默认 100 × 100 格、甲板层 Y 范围 -5 ~ +5(共 11 层)、每格 1 米(GridManager.cs 的 Inspector 序列化字段 xCount/zCount/gridSize/minDeck/maxDeck)。
  2. 同名排斥:占用格上已有同名建筑 → 拒绝(“已有相同建筑”)。
  3. 层级互斥:建筑分 5 个 Layer——Floor(0)/Facility(1)/Pipe(2)/Light(3)/Room(100)。同 Layer 互斥;Room 只与 Room 互斥;不同 Layer 可叠放在同一格(BuildingLayer.cs)。
  4. 地基检查:Facility/Pipe/Light 层建筑要求锚点格上存在 Floor 层建筑(BuildingLayer.RequiresFoundation + BuildingRegistry.HasFoundationAt)。注意两点:只查锚点格,多格建筑的其余占用格不查地板;地板处于框架状态也算地基(不要求完工)。
  5. 专用验证器:目前仅管道有——放置 Pipe 时检查不会把两种不兼容流体的管网连通(PipeCompatibilityValidator.cs,经 BuildingPlacementValidatorRegistry.cs 注册)。
  6. 批内重叠:一次拖拽放多个建筑时,占用格互相重叠的后续建筑被标记无效(ConstructionUtils.cs 的 BatchValidateBuildings)。

放置时不预扣任何材料——成本在后续搬运阶段从船上库存实际取走。放置预览还会向船只性能面板广播质量增量预估(墙按墙体重量、其他建筑按每格 1.0 计,BuildingPreview.cs 的 ComputePreviewMassDelta),详见船只

每种建筑的拖拽方式由 BuildingConfig.csv 的 ConstructStrategyType 列决定(PointConstructStrategy.cs / LineConstructStrategy.cs / RectangleConstructStrategy.cs):

策略 行为 典型建筑
Point(单点) 点一下放一个,拖拽无效 门、窗、锅炉、武器、工坊
Line(直线) 沿拖拽主轴(X/Z 取变化大者)每隔“建筑尺寸”放一个 墙、管道
Rectangle(矩形) 填满拖拽矩形,按建筑尺寸为步长、以起点对齐 地板

墙体直线拖拽有专门的朝向规则(BuildingController.cs 的 GetConstructionRotation):墙段长度方向自动跟随拖拽轴,反向拖拽会翻转墙的内外法线;原地单击放单面墙时,从四邻已有墙推断朝向(邻墙朝向不一致则放弃推断,用当前手动旋转值)。

按键 作用 生效范围 来源
B 开关 BuildBar / 建造模式 全局 保留键(UI 层)
R 预览顺时针旋转 90° 建造模式 BuildingController.cs Inspector 字段 rotateKey
Z / X 上一层 / 下一层甲板 任何时候(非建造模式也可巡视甲板) Inspector 字段 moveUpDeckKey/moveDownDeckKey
Ctrl + 左键(点/拖) 拆除 建造模式 代码固定
左键拖拽 按策略连续放置/批量拆除 建造模式 代码固定
W/A/S/D 推动建造焦点(相机锚点),相对镜头方向 建造模式 代码固定
CSV Hotkey 列(如 Alpha1=地板、L=锅炉) 直接选中建筑并进入建造模式 建造模式选择;非建造模式按下会触发进入 BuildingConfig.csv Hotkey 列

CSV Hotkey 禁止使用保留键 B / R / Q / E / F / Z / X / V(BuildingController.cs 的 ReservedHotkeys,大小写不敏感)。

建造模式相机焦点被限制在以船心为中心的椭圆内:短半轴(左右)6 米、长半轴(前后)18 米、推动速度 12 米/秒(BuildingController.cs Inspector 字段 buildFocusHalfWidth/buildFocusHalfLength/buildFocusPanSpeed)。切换甲板层时相机高度平滑过渡 0.6 秒,目标高度 = 10 + 层数 × 3 米(代码常量)。

框架落地后,ConstructionTaskIssuer.cs 持续扫描本船 BuildingRegistry(任务请求收集随 TaskManager 节拍每秒 5 次,TaskManager.cs 的 Frequency = FiveTimesPerSecond),对每个材料未齐的框架、按每种缺料一条生成搬运请求(FetchRequest):

  1. 在全船容器中查找该物品,最多取 8 个候选来源,按“来源交互点到工地的直线距离”升序尝试(FetchRequest.cs)。
  2. 对选中来源做预约(防止两个任务抢同一堆料),预约失败换下一个来源。单次搬运量 = min(还缺的数量, 该来源现有数量)。
  3. 创建 Task_Haul.cs:船员走到来源 → 拾起 → 走到工地 → 把材料放进框架脚下的地面容器(FloorContainer)。任务中途取消时预约自动释放、已拿起的物品就地丢弃。
  4. 材料送达回调刷新框架的材料进度。

材料进度 = Σ min(地面容器中该材料数, 需求数) / Σ 需求数(Constructable.cs 的 CalculateMaterialProgress)。注意材料是“堆在工地”而非锁进建筑——完工那一刻才真正消耗;在此之前如果地面容器里的料被其他系统取走,进度会回退。

搬运建材的工作类型是 Construction(建造)而不是 Hauling(搬运)TaskDefs.cs 的 FetchForConstruction = WorkType.Construction)——即只有开了“建造”工作的船员才会去运建材,搬运优先级不影响它。请求默认优先级 5(1-9 档,ConsumerPriorityConfig.cs)。

材料进度达 100% 后,Issuer 改为生成建造请求(BuildRequest → Task_Build.cs):

  1. 船员走到建筑的交互点——优先建筑自身格(可站立时),否则在占用格四邻中选连通性最好、偏向船体内侧的可站立格(InteractionPointResolver.cs)。可站立要求该格有完工地板且无阻挡设施(楼梯类除外)。

  2. 到位后每帧推进工作量(任务驱动循环每帧执行一次,TaskBase.cs 的 DriverTick):

    每帧工作量 = 15 × 船员建造速度系数(Task_Build.cs 的 BASE_WORK_PER_TICK = 15)

    工作进度 = 累计工作量 / 总工作量,总工作量 = round(ConstructionTime × 15),ConstructionTime 取自 BuildingConstructionCost.csvMultiConstructHandler.cs)。

  3. 施工期间每 10 帧复查一次材料是否仍齐全(Task_Build.cs 的 MATERIAL_CHECK_INTERVAL_TICKS = 10),料被拿走则中止任务(之后 Issuer 会重新发搬运请求)。

  4. 工作进度满 100% 即完工(Constructable.cs 的 OnWorkComplete):从地面容器实际扣除全部需求材料 → 状态切到 Completed → 半透明框架外观恢复为不透明 → 开启可被攻击。

框架头顶显示一条综合进度条:显示值 = (材料进度 + 工作进度) / 2,每 0.08 秒刷新(BuildingProgressBar.cs)。

船员建造速度系数Crew.cs 的 GetWorkSpeedMultiplier,详见船员):

建造速度系数 = 修正(技艺属性) × 修正(建造技能) × 状态效率系数 修正(x) = 0.2 × e^(0.0805 × x),x 取值 1-20(CrewAttributes.cs

无船员速度数据时回退 0.09(约等于 5 属性/5 技能船员);系数算出 ≤ 0 时强制按 15 × 0.04 = 0.6/帧 兜底(Task_Build.cs)。

两条路径跳过框架-运料-施工全流程,直接落地完工建筑:

  • 作弊开关:开发者工具面板“即时建造”勾选(DevToolsPanel.cs)置位 CheatFlags.InstantBuildCheatFlags.cs 代码静态字段,默认 false),玩家手动放置即变完工。见开发者工具
  • 系统调用:AI 船工厂、初始船队生成、自动船壳、墙体升级(WallUpgradeService.cs)等通过 API 参数显式声明 instantBuild=true,不读作弊开关。

此外,凡是不在 BuildingConstructionCost.csv 里的建筑,玩家放置时一律免费即时完工MultiConstructHandler.cs:costData == null 时按即时建造处理)。当前受影响建筑见下文成本表后的清单。

建造模式按住 Ctrl 即拆除模式,单击或按当前策略拖拽框选(拆除框选始终按 1×1 格计算,与建筑尺寸无关)。规则(MultiDestructHandler.csBuildingPreview.cs):

  • 按层匹配:拆除以“当前选中建筑的 Layer”为准——选中地板时命中范围内所有建筑;选中设施/管道/顶灯/房间时只拆同层建筑。
  • 整体拆除:多格建筑任一占用格被框中即整体拆除。
  • 即时生效:无拆除工时,无需船员,确认即从注册表移除并销毁。
  • 返还规则:零返还。 拆完工建筑不退任何材料(材料在完工时已消耗);拆框架时,已搬到工地、还堆在地面容器里的材料连容器一起删除、直接丢失Constructable.cs 的 OnBuildingDestroy → FloorContainerManager.cs 的 OnFloorDestroyed,日志明确记录“材料丢失”)。
  • 自动船壳标记:玩家拆除的每个坐标都会打上“玩家已清除”标记,阻止自动船壳生成器把该格补回自动墙(MultiDestructHandler.cs 的 Continue);墙体升级替换旧墙时刻意不打该标记。
  • 框架被拆除/摧毁时,关联的搬运与建造任务全部销毁(ConstructionTaskIssuer.cs 的 OnBuildingUnregistered)。

完工建筑掉血后自动进入维修流程,不消耗任何材料Steps.Repair.cs 注释明确“无材料消耗”):

  1. Repairable.cs 监听建筑伤害事件,受损时在头顶挂血条。受损程度分级(按当前血量百分比):

    等级 血量阈值 维修任务优先级
    Light(轻伤) ≤ 100%(未满血) 5(默认)
    Moderate(中伤) ≤ 70% 7
    Heavy(重伤) ≤ 40% 9
    Critical(危重) ≤ 15% 10(紧急档)

    (阈值为 Repairable.cs 代码常量;优先级映射在 RepairTaskIssuer.cs,运行中只升不降,避免任务抖动。)

  2. 血量 ≤ 30% 时建筑判定“重度受损”,工作效率系数压到 0.5(Repairable.cs 的 SevereDamageThreshold = 0.3f、EfficiencyModifier),影响该建筑作为工作台/设备的产出。

  3. RepairTaskIssuer.cs 扫描受损完工建筑发出维修请求,同一建筑同时只存在一个维修任务。

  4. Task_Repair.cs:船员走到交互点 → 每帧恢复血量,公式与施工同构:

    每帧维修量 = 15 × 船员建造速度系数(HP,小数累积、凑满 1 点才实际治疗)

    修到满血结束;中途建筑被别人修满会正常完成。维修与施工共用 Construction 工作类型与“技艺”属性。

只有 Completed 状态、有血量组件、未满血且未死亡的建筑可维修(Repairable.cs 的 CanRepair);框架不维修,被摧毁的建筑不可修复,只能重建。建筑血量与摧毁机制见建筑伤害与护甲

公式 表达式 出处
总工作量 round(ConstructionTime × 15),单位:工作点 MultiConstructHandler.cs(×15 为代码常量)
每帧施工量 15 × 速度系数,单位:工作点/帧 Task_Build.cs
每帧维修量 15 × 速度系数,单位:HP/帧 Task_Repair.cs
速度系数 0.2e^(0.0805×技艺) × 0.2e^(0.0805×建造技能) × 状态效率 Crew.csCrewAttributes.cs
速度系数回退值 0.09(无船员数据);≤0 时施工量按 0.6/帧 Task_Build.csTask_Repair.cs
纯施工耗时 ConstructionTime / (速度系数 × 帧率) 秒 由上式推导
材料进度 Σmin(工地现有, 需求) / Σ需求 Constructable.cs
工作进度 累计工作量 / 总工作量,上限 1 BuildingData.cs
进度条显示 (材料进度 + 工作进度) / 2 BuildingProgressBar.cs
施工中材料复查 每 10 帧一次 Task_Build.cs
任务请求扫描 每秒 5 次(200 毫秒) TaskManager.cs

速度系数参考值(属性=技能、状态效率 1.0 时):

技艺/技能 单项修正 速度系数 每帧施工量(点) 纯施工耗时(60 帧/秒)
1 / 1 0.217 0.047 0.70 ConstructionTime × 0.355 秒
5 / 5 0.299 0.089 1.34 ConstructionTime × 0.186 秒
10 / 10 0.447 0.200 3.00 ConstructionTime × 0.083 秒
20 / 20 1.000 1.000 15.0 ConstructionTime × 0.017 秒

可见纯施工时间极短(普遍不到 1 秒),实际建造节奏几乎完全由船员走路和搬料时间决定;ConstructionTime 数值目前对手感影响很小。另外施工按渲染帧推进,帧率越高建得越快(见已知限制)。

建造成本全表(BuildingConstructionCost.csv,共 23 行,全量)

Section titled “建造成本全表(BuildingConstructionCost.csv,共 23 行,全量)”

材料 ID 对照:Wood=木头、Stone=石头、IronPlate=铁板(StaticItemConfig.csv)。总工作量 = ConstructionTime × 15。

BuildingId 名称 材料 ConstructionTime(秒,名义值) 总工作量(点)
Floor 木地板 木头×5 1.0 15
WoodContainer 木箱 木头×30 + 石头×20 1.0 15
WallPine 松木墙 木头×2 1.0 15
WallOak 橡木墙 木头×4 2.0 30
WallBrass 黄铜墙 铁板×2 3.0 45
WallIron 铁墙 铁板×3 4.0 60
Door 木门 木头×15 1.5 23
Window 木窗 木头×8 1.5 23
WaterPump 水泵 木头×20 + 铁板×10 1.5 23
Boiler 锅炉 木头×30 + 石头×20 + 铁板×15 2.0 30
Engine 引擎 木头×40 + 石头×25 + 铁板×20 2.0 30
Cannon_Dev 加农炮(开发版) 木头×25 + 铁板×30 1.0 15
MachineGun_Dev 机枪(开发版) 木头×15 + 铁板×20 1.0 15
Flame_Dev 火焰喷射器(开发版) 木头×20 + 铁板×15 1.0 15
Cannon_Prod 加农炮 木头×25 + 铁板×30 1.0 15
MachineGun_Prod 机枪 木头×15 + 铁板×20 1.0 15
Flame_Prod 火焰喷射器 木头×20 + 铁板×15 1.0 15
AA_Gun_Dev 防空炮(开发版) 木头×30 + 铁板×35 1.0 15
AA_Gun_Prod 防空炮 木头×30 + 铁板×35 1.0 15
ButcherTable 屠宰台 木头×15 1.5 23
Galley 灶台 木头×25 2.0 30
AmmoBench 军械台 木头×30 2.0 30
Brewery 酒坊 木头×30 2.0 30

黄铜墙备注(CSV 原文):暂用铁板替代 Brass 材料。

免费即时建筑清单BuildingConfig.csv 中存在、但成本表中没有的建筑——Railing(栏杆)、LargeFacility、PipeDebug、Light(顶灯)、Pipe(管道)、PurchaseBox(买入箱)、Stair(楼梯)、MagicContainer(魔法箱)、Bed(床)、WaterBarrel(水桶)、Toilet(厕所)。这些放置即完工、零材料(MultiConstructHandler.cs 回退逻辑)。

建筑放置属性表(BuildingConfig.csv,共 30 行,全量)

Section titled “建筑放置属性表(BuildingConfig.csv,共 30 行,全量)”
Name 显示名 尺寸(X×Y 格) Layer 策略 最大生命值 快捷键
Floor 地板 1×1 Floor Rectangle 100 1
Railing 栏杆 1×1 Facility Point 1
WallPine 松木墙 1×1 Facility Line 30 2
WallOak 橡木墙 1×1 Facility Line 80
WallBrass 黄铜墙 1×1 Facility Line 100
WallIron 铁墙 1×1 Facility Line 150
Door 1×1 Facility Point 80 3
Window 1×2 Facility Point 60 4
LargeFacility 大型设施 2×2 Facility Point 300 5
PipeDebug 调试管道 1×1 Pipe Line 50 6
Light 顶灯 1×1 Light Point 30 7
Cannon_Prod 加农炮 1×2 Facility Point 100 8
MachineGun_Prod 机枪 1×2 Facility Point 100 9
Flame_Prod 火焰喷射器 1×2 Facility Point 100 0
WoodContainer 木箱 1×1 Facility Point 100 I
WaterPump 水泵 1×1 Facility Point 100 P
Pipe 管道 1×1 Pipe Line 50 O
Boiler 锅炉 2×2 Facility Point 150 L
Engine 引擎 2×2 Facility Point 150 K
AA_Gun_Prod 防空炮 1×2 Facility Point 100 U
PurchaseBox 买入箱 1×1 Facility Point 100 T
Stair 楼梯 1×1 Facility Point 150 N
MagicContainer 魔法箱 1×1 Facility Point 100 J
Bed 1×2 Facility Point 80 C
WaterBarrel 水桶 1×1 Facility Point 60
Toilet 厕所 1×1 Facility Point 50 G
ButcherTable 屠宰台 1×1 Facility Point 100
Galley 灶台 2×1 Facility Point 120
AmmoBench 军械台 2×1 Facility Point 100
Brewery 酒坊 2×2 Facility Point 120 Y

BuildingConfig.csv 还有一列 ConstructionTime,但实际工作量只读成本表的同名列,此列当前不参与任何计算,见已知限制。)

项目 数值 来源
维修材料消耗 Steps.Repair.cs 代码
受损分级阈值 危重 ≤15% / 重伤 ≤40% / 中伤 ≤70% / 轻伤 <100% Repairable.cs 代码常量
重度受损阈值 血量 ≤30% Repairable.cs SevereDamageThreshold
重度受损效率惩罚 建筑效率 ×0.5 Repairable.cs EfficiencyModifier
维修任务优先级 轻 5 / 中 7 / 重 9 / 危重 10 RepairTaskIssuer.cs 代码常量
每帧恢复量 15 × 速度系数 HP(5/5 船员约 1.34 HP/帧 ≈ 80 HP/秒 @60帧) Task_Repair.cs
维修对象 仅 Completed 状态且未满血 Repairable.cs CanRepair
  • 任务与工作:搬料(FetchForConstruction)、施工(Build)、维修(Repair)全部属于 Construction 工作类型;船员的建造工作优先级决定是否接单。任务请求由 Issuer 每秒 5 次扫描生成,TaskManager 统一去重分配。
  • 船员:施工/维修速度由“技艺”属性 × “建造”技能 × 状态效率决定;眩晕、力竭等状态效率系数会直接拖慢工地进度。
  • 物品与库存:建材从全船容器按距离就近预约取料;工地材料暂存在框架脚下的地面容器,完工瞬间才消耗。拆框架时地面容器连同剩料一起删除。
  • 生产与制作:木头/石头/铁板等建材的获取链路;工坊类建筑(屠宰台、灶台、军械台、酒坊)建成后才解锁对应配方。
  • 建筑:建筑完工后的功能、血量、效率机制;墙体升级走“拆旧墙 + 即时建新墙”的替换流程(WallUpgradeService.cs,材料扣除由调用方负责)。
  • 船只:建筑网格挂在船本地坐标系上随船移动;放置预览实时广播质量增量影响船只性能预估;自动船壳生成器与玩家拆除标记联动。
  • 伤害与护甲:维修的触发源是建筑受击掉血;框架在完工前不可被直接攻击。
  • 寻路与移动:交互点解析要求“完工地板 + 无阻挡设施”才可站立,工地不可达会导致任务无法分配(任务面板可见原因“材料未齐全/建筑状态不是Frame”等诊断文本)。
  • 开发者工具:即时建造作弊开关、场景测试中批量 InstantBuild。
  • 存档BuildingData.cs 为纯数据类,框架的材料/工作进度、需求表均可序列化恢复。
  • 配置表总览:本页涉及 BuildingConfig.csvBuildingConstructionCost.csv 两张表。
想调什么 改哪里 类型
某建筑的材料种类/数量 Assets/StreamingAssets/BuildingConstructionCost.csv MaterialsJson 列(JSON 格式,如 {"Wood":5} CSV(改后需 Tools → CSV Code Generator → Generate All)
某建筑的施工工作量 同上 ConstructionTime 列(总工作量 = 该值 × 15) CSV
让某建筑免费即时建造 从成本表删掉该行 CSV
建筑尺寸 / 所在 Layer / 拖拽策略 / 血量 / 快捷键 Assets/StreamingAssets/BuildingConfig.csv 对应列 CSV
全局施工/维修基础速度 Task_Build.cs / Task_Repair.cs 的 BASE_WORK_PER_TICK / BASE_REPAIR_PER_TICK(均 15) 代码常量
工作量换算倍率(×15) MultiConstructHandler.cs CreateBuildingInstance 内的硬编码 15 代码常量
船员速度成长曲线 CrewAttributes.cs 的 BASE_COEF(0.2) / GROWTH_RATE(0.0805) 代码常量
施工中材料复查间隔 Task_Build.cs MATERIAL_CHECK_INTERVAL_TICKS(10 帧) 代码常量
维修分级阈值 / 重伤效率惩罚 Repairable.cs 四个阈值常量 + EfficiencyModifier 代码常量
维修任务优先级 RepairTaskIssuer.cs ModerateDamagePriority(7) / HeavyDamagePriority(9) 代码常量
网格大小 / 甲板层数 / 格子尺寸 mvp_002 场景 GridManager 组件的 xCount/zCount/gridSize/minDeck/maxDeck Inspector 序列化字段
建造焦点椭圆 / 相机速度 BuildingController 组件的 buildFocus* / camera* 字段 Inspector 序列化字段
预览绿/红材质 BuildingPreview 组件的 validPreviewMaterial / invalidPreviewMaterial Inspector 序列化字段
BuildBar 分类归属 BuildBarCategories.cs 硬编码 7 类清单 代码常量
框架半透明度 MultiConstructHandler.cs SetFrameAppearance 的 alpha 0.5 代码常量
  1. 施工速度与帧率挂钩:工作量推进发生在任务驱动循环里、每渲染帧一次(TaskBase.cs 的 Do 循环逐帧 DriverTick),未做 deltaTime 归一。120 帧环境施工速度是 60 帧的两倍。维修同理。
  2. ConstructionTime 字段语义已过时MultiConstructHandler.cs 中有明确 TODO——“ConstructionTime 字段过时,需重构 CSV 并移除此计算”,其注释中的旧公式(workPerTick = level × 0.3、完成时间 ≈ ConstructionTime × 10 秒)与现行实现不符,现行真实公式见上文。当前纯施工时间普遍不足 1 秒,建造节奏由走路/搬料主导。
  3. BuildingConfig.csv 的 ConstructionTime 列完全未被使用:工作量只读 BuildingConstructionCost.csv,两表同名列数值还互相矛盾(如 WallIron 配置表写 4、ButcherTable 配置表写 3.0 而成本表写 1.5)。改工时只改成本表。
  4. 拆除零返还与设计文档冲突:Notion 设计文档(修建 Construction)规定框架/成品拆除应“掉落已送达的全部材料”,实际实现是直接删除(框架工地剩料丢失、成品无任何返还)。
  5. 设计文档中的交互未实现:C 键拆除 tab、Q/E/滚轮旋转(实际为 R 键)、Esc/右键退出、右键建筑菜单(调优先级/拆除)均未实现;逐建筑的建造优先级调整不存在,只有按船员的工作类型优先级。
  6. 地基检查只查锚点格:2×2 建筑(锅炉、引擎等)只要锚点格有地板即可放置,其余三格可悬空;且框架状态的地板也算合法地基。
  7. 同批拖拽的链式有效性不重算:批量验证只做静态重叠检查,不会因“本批某个地板无效”连锁判定依赖它的后续格无效。
  8. 不在成本表中的建筑免费即时完工,包括 Pipe、Stair、Bed、Light 等正经玩法建筑——这是回退逻辑而非有意设计的减负,加新建筑时若忘配成本行就会变成免费建筑。
  9. 施工期间材料可被抽走:工地材料存放于公共地面容器,完工前可能被其他需求拿走,导致每 10 帧的材料复查触发施工中止(行为正确但表现为船员反复跑空趟)。
  10. 维修无耗材、无上限次数,纯粹由船员时间换血量;被摧毁(Destroyed)的建筑不可维修。
  11. 框架不可被攻击:可被攻击开关在完工时才打开,敌人无法拆玩家的在建框架。
  12. StaticBuildingInfo.csConstructStrategyType.cs 为历史残留:前者整文件被注释掉(配置已迁移 CSV),后者是空命名空间占位(实际枚举由 CSV 代码生成器产出在 Service.Common.Generated)。
  13. 拆除预览的“按层匹配”在预览与执行间一致,但拆除高亮逻辑(BuildingPreview.cs 的 ShouldDestructBuilding)对 Floor 的处理是“全部高亮”,与执行层 MultiDestructHandler.cs(Floor 选中时收集所有相交建筑)行为一致——但二者是两份独立实现,改其一须同步另一处。