游戏循环与胜负
本作是 RimWorld / 缺氧式的“海盗船殖民地”沙盒:玩家经营一艘船、四条胜利线并行推进(贸易 / 外交 / 征服 / 屠龙),失败不是 Game Over,而是沉船后损失一半金币与部分物资、在最后停靠港复活的“软重生”。
《Project Pirate》没有传统的“主菜单 → 新游戏 → 结局”结构:
- 启动即开局。打包场景只有一个
mvp_002(EditorBuildSettings.asset中唯一启用的场景),游戏启动直接进入海上沙盒。 - 胜利是成就式的。共 4 种胜利条件(贸易大亨 / 外交家 / 征服者 / 屠龙者),任意一种达成即弹出胜利结算弹窗并暂停游戏,但点击“继续游戏”后沙盒继续运行,可继续凑齐其余胜利(
VictoryManager.cs、VictoryScreen.cs)。 - 失败是局部惩罚。唯一的“死亡”是玩家船沉没(浮力系统水位涨满),触发金币与物资掉落惩罚 + 倒计时复活,复活后继续当前存盘局;没有任何“全员阵亡 → 游戏结束”的结算(
ShipBuoyancy.cs)。 - 屏幕右下角的“星 N/4”按钮(或按 V 键)随时可查看 4 条胜利线的实时进度(
VictoryHUDPanel.cs、VictoryDetailPanel.cs)。
玩家接触本系统的入口:胜利进度 HUD(Top 层)、胜利详情面板(V 键)、胜利结算弹窗(达成时自动)、沉船复活倒计时浮窗(沉没时自动)、暂停菜单(仅“继续 / 退出”两项,MainMenuPanel.cs)。
核心循环:四条玩法轴
Section titled “核心循环:四条玩法轴”游戏循环由四条互相喂养的玩法轴构成,每条轴各有详细页面:
| 轴 | 内容 | 对胜负的贡献 |
|---|---|---|
| 经营(船上模拟) | 船员需求(吃 / 喝 / 睡 / 如厕)、生产与制作(水泵 → 锅炉 → 引擎的动力链、弹药台)、修建 | 船能不能开、炮有没有弹、底层地板完整度直接决定浮力(失败条件) |
| 航海与探索 | 驾船在三国 + 自由港的海图上移动,探索与情报解锁城市,遭遇与刷怪产生海怪战斗 | 到港才能贸易 / 外交;停靠港同时是沉没后的复活点 |
| 战斗 | 武器与弹药、怪物、AI 巡逻船、城市海上炮台 | 征服者(打掉城防)与屠龙者(击杀 Boss)两条胜利线;战斗破洞也会降低浮力 |
| 社交 | 交易、阵营与外交(声望、贸易协定、停火、国籍) | 贸易大亨(累计卖出收入)与外交家(三国声望全部 ≥ 50)两条胜利线 |
典型一轮循环:备航(修船 / 补煤补弹补粮)→ 出航(探索 / 打怪 / 跑商)→ 回港(卖货、签协定、招募)→ 四条胜利线进度上涨。
全局时间走 Unity timeScale(GameSpeedManager.cs):速度 0 = 暂停,1 = 正常,可设任意正倍率。胜利弹窗与暂停菜单弹出时若游戏未暂停会自动暂停,关闭时只在“是它暂停的”情况下才恢复,不覆盖玩家手动暂停。详见时间与调度。
开局初始状态:预设(Preset)系统
Section titled “开局初始状态:预设(Preset)系统”开局内容完全由 JSON 预设驱动,不写死在场景里:
- 场景里的
ScenarioLoader.cs(执行顺序 -100,最早 Awake)读取Assets/StreamingAssets/Presets/{预设名}.json; - 预设按“轴”组合数据集:
world(地图缩放)/cheats(作弊开关)/fleet(初始船队)/monsters(刷怪表覆盖)/trading(城市库存覆盖),另有aiShips、playerNationality、initialDiscoveredCountries/Cities字段; StarterFleetInitializer.cs按fleet轴在网格中央铺地板、放建筑、塞物资、生成船员、设置初始金币。
当前 mvp_002 场景序列化的预设名是 “战斗测试”(mvp_002.unity,开发用);面向正式体验的预设是 “正常游玩”(world=real、cheats=none、无 fleet 轴)。最接近“完整开局”的演示预设是 “外循环测试_真实地图”:真实地图 + 无作弊 + outer_loop_starter 船队 + 玩家国籍西班牙 + 预解锁 2 国 4 城。
outer_loop_starter 开局清单(Assets/StreamingAssets/DataSets/fleet/outer_loop_starter.json,CSV/JSON 配置,策划可直接改):
| 项 | 内容 |
|---|---|
| 初始金币 | 1000(这是金币唯一来源;不走 fleet 轴时船的默认金币为 0,ShipData.cs) |
| 甲板 | 14 × 14 底层地板 |
| 船员 | 6 人:船长 ×1、水手 ×3、炮手专员 ×2(姓名与性别随机生成) |
| 建筑 | 水泵、锅炉、引擎(动力链)、厕所、木箱、床 ×3、机枪 ×4 |
| 物资 | 咸猪肉 15、饮用水 15、煤 80、木材 30、铁板 10、子弹 800 |
日常开发用的 full.json 船队则是 16 × 16 地板、5 名专员、10500 金币、含厨房 / 屠宰台 / 弹药台的完整生产链。
设置 playerNationality 的预设会把玩家对母国声望直接设为 50(即开局对母国 Friendly,StarterFleetInitializer.cs)。
初始世界与声望
Section titled “初始世界与声望”世界由 4 个阵营、7 座城组成(countries.csv / cities.csv,CSV 配置):
| 国家 | 初始声望 | 友好阈值 | 敌对阈值 |
|---|---|---|---|
| country_001 西班牙 | 0 | 50 | -30 |
| country_002 英格兰 | -50(开局即敌对) | 50 | -30 |
| country_003 法兰西 | 0 | 50 | -30 |
| country_free 自由港联合 | 不参与外交(永久中立),也不参与攻防 | — | — |
(来源 FactionConfig.csv,CSV 配置,运行时确实被 FactionManager.cs 读取。)国家间初始关系:西班牙↔英格兰敌对、西班牙↔法兰西友好、英格兰↔法兰西中立(FactionRelationPreset.csv)。
7 座城及类型:马德里(首都)、塞维利亚(工业)、普利茅斯(渔村)、朴次茅斯(要塞)、自由港(贸易港)、勒阿弗尔(贸易港)、马赛(贸易港)。详见城市与国家。
胜利条件(4 条线)
Section titled “胜利条件(4 条线)”胜利判定中枢是 VictoryManager.cs:纯消息驱动累计 + 阈值判定,每种胜利只发布一次(幂等)。
| 胜利类型 | 名称 | 条件 | 阈值 | 事件来源 |
|---|---|---|---|---|
| TradeTycoon | 贸易大亨 | 累计卖出收入 ≥ 阈值 | 50000 金币 | 每次交易结算(TradingSession.cs) |
| Diplomat | 外交家 | 三国声望的最小值 ≥ 阈值 | 50 | 任意声望变化(FactionManager.cs) |
| Conqueror | 征服者 | 玩家占领城市数 ≥ 阈值 | 2 座 | 城防全灭(CityDefense.cs) |
| DragonSlayer | 屠龙者 | 玩家击杀游荡 Boss 次数 ≥ 阈值 | 1 次 | Boss 死亡(BossMonster.cs) |
四个阈值是 VictoryManager.cs 的代码常量(需要程序改)。VictoryConfig.csv 里有一份相同数值的表(TradeTycoon 50000 / Diplomat 50 / Conqueror 2 / DragonSlayer 1,共 4 行),但运行时没有任何代码读它——改 CSV 不会生效,见“已知限制”。
各条线的细则:
- 贸易大亨:只累计卖出方向的总收入(毛收入),买入花费不扣减;在自由港交易同样计入(但自由港不产声望)。
- 外交家:判定为“三国全部 ≥ 50”,等价于取
min(西班牙, 英格兰, 法兰西)与 50 比较;国家清单country_001/002/003硬编码在VictoryManager.cs。提升声望的主要途径见下方声望事件表。英格兰开局 -50,是这条线的主要工作量。 - 征服者:每座非自由港城市开局生成海上炮台驻防(渔村 1 门炮 → 首都 15 门炮,详见下表);该城所有炮的
DamageableComponent全部被摧毁 → 城市立刻易主,最后一击的阵营为占领者。只有AttackerFactionId == "Player"的占领计入玩家进度。每座城一局只能被占领一次(占领后防御追踪器永久关闭),所以 2 座必须是不同城市。注意占领会让旧宗主国声望 -50、其敌国 +10,与外交家线冲突。 - 屠龙者:游荡 Boss“Leviathan”(1000 HP,约为普通海怪 100 HP 的 10 倍)被玩家击杀即达成;Boss 击杀同时给所在海域归属国 +15 声望。Boss 死后 600 秒在随机路径点重生,可重复击杀(但阈值只要 1 次)。当前版本 Boss 实际并未被放进任何场景,也没有运行时生成器,这条线在正常游玩中无法达成,见“已知限制”。
胜利进度的画面呈现
Section titled “胜利进度的画面呈现”- HUD(Top 层右下角):圆形按钮显示“星 N/4”,N 为已满足阈值的胜利线数量(实时重算,不是已弹窗数量)(
VictoryHUDPanel.cs)。 - 详情面板(V 键或点 HUD):4 张卡片,各带进度条、进度文本与提示语(
VictoryDetailPanel.cs)。 - 胜利弹窗:达成瞬间弹出“胜利达成!”,自动暂停游戏;点“继续游戏”恢复(
VictoryScreen.cs)。
进度条公式(VictoryDetailPanel.cs,代码常量):
贸易大亨进度 = clamp01(累计卖出收入 / 50000)外交家进度 = clamp01((三国最低声望 + 100) / (50 + 100)) // 把 -100..50 映射为 0..1征服者进度 = clamp01(已占领城市数 / 2)屠龙者进度 = Boss击杀数 > 0 ? 1 : 0外交家未就绪(阵营系统未初始化)时最低声望按 -100 处理,进度显示为空。
声望事件(外交家线的数值来源)
Section titled “声望事件(外交家线的数值来源)”声望事件由 FactionEventHandler.cs 监听游戏事件触发。下表为运行时实际生效的代码常量(FactionManager.cs 的 LoadDefaultConfig 硬编码;ReputationEventConfig.csv 有一份几乎相同的表但运行时不读,且 CSV 缺少 MonsterKill 行):
| 事件 | 目标国声望 | 目标国的敌国声望 | 触发条件 |
|---|---|---|---|
| FirstVisit | +10 | 0 | 首次在某城完成交易 |
| TradeSmall | +3 | 0 | 单次交易卖出收入 1–100 金 |
| TradeMedium | +5 | 0 | 单次交易卖出收入 101–500 金 |
| TradeLarge | +8 | 0 | 单次交易卖出收入 > 500 金 |
| BossKill | +15 | 0 | 玩家击杀 Boss(加给海域归属国) |
| MonsterKill | +3 | 0 | (仅代码有此条目) |
| AttackShip | -30 | +5 | 玩家击沉某国船 |
| AttackCity | -50 | +10 | 玩家占领某国城市 |
| DeliverStrategic | +10 | -5 | 战略物资交付 |
| TradeAgreement | +20 | 0 | 在港口签贸易协定,花费 5000 金(CityDiplomacyTrigger.cs 代码常量) |
| Ceasefire | 重置为 -20 | 0 | 对敌对国签停火,花费 10000 金(重置式:直接把声望设为 -20,脱离敌对区间) |
另有特殊规则:击沉无国籍船(海盗)→ 三国声望各 +1;攻击本国实体 → 立即撤销玩家国籍。
失败条件:浮力与沉没
Section titled “失败条件:浮力与沉没”失败的唯一通道是玩家船的浮力系统(ShipBuoyancy.cs)。状态机三态:Safe(安全)→ Sinking(进水)→ Sunk(沉没)。
浮力 = max(0, 当前底层地板数 − 未修复战斗破洞数) / 历史最大底层地板数- “底层地板”= 网格 Y=0 且层级为 Floor 的建筑;分母取历史最大值,所以拆自己的地板也会降浮力。
- “战斗破洞”= 最底层甲板外缘墙被打爆时登记的坐标,必须在原坐标重建墙才能销账,与地板修复相互独立。
水位变化(单位:水位点/秒,水位满值 100):
浮力 ≥ 50% :水位每秒 −5(排水)浮力 < 50% :水位每秒 +(50% − 浮力) × 100(进水;浮力 0 时每秒 +50,从 0 到沉没只需 2 秒)水位 ≥ 100 :沉没进水过程有三档画面告警(ShipBuoyancyToast.cs):开始进水(持续告警)、水位 50%(“继续不修底层就会沉”)、水位 75%(“立即修复底层地板!”);恢复安全时弹 3 秒“船体稳定”。
沉没结算(死亡惩罚)
Section titled “沉没结算(死亡惩罚)”玩家船水位涨满的瞬间(ShipBuoyancy.cs):
- 禁用船体碰撞与移动控制;
- 金币惩罚:损失
当前金币 × 50%,在沉没点生成金币掉落物; - 物品惩罚:船上每个容器的每种物品独立掷一次损失率——正态分布(均值 0.375、标准差 0.125,Box-Muller 采样)截断到 [0, 0.75],损失数量 =
向下取整(数量 × 损失率),即平均丢约 37.5%、最多丢 75%;丢失物品在沉没点 ±5 单位随机偏移处生成掉落物; - 屏幕中央弹出“船只沉没”复古浮窗,副文案“金币与物资将随海葬失去”,显示复活倒计时(
RespawnPresenter.cs); - 倒计时结束后复活。
死魂灵规则(DeathDropManager.cs):本次死亡生成的物品掉落在复活前不可拾取;复活后解锁,可以开回沉没点捞回;但下一次死亡会清空上一次还没捞的物品掉落——一条命的容错。金币掉落不受此规则管(不注册进死亡掉落管理器,也不会被下次死亡清除)。
AI 船的沉没走完全不同的分支:沉没 2 秒后直接销毁,掉落船上全部容器物品供玩家拾取,无惩罚无复活——这是战利品与掉落的来源之一。
重开流程(复活)
Section titled “重开流程(复活)”没有“读档重来”或“重新开始”按钮(暂停菜单只有“继续游戏 / 退出游戏”两项,MainMenuPanel.cs)。重开 = 原地复活:
- 倒计时走完(
mvp_002场景当前配置 3 秒;代码默认值 6 秒); - 免费自动重建所有被摧毁的底层地板(平时在港口修则按每块 10 金收费);
- 清空全部未修复战斗破洞记录;
- 传送到最后停靠过的港口(玩家船进入任意非敌对城市范围时自动记录,
ShipRegistry.cs);若本局从未停靠过任何港口,复活在世界原点 (0,0,0); - 水位归零、状态回 Safe、恢复碰撞与移动、解锁死亡掉落拾取。
胜利进度、声望、船员、建筑等一切状态在沉没复活后全部保留——损失只有金币与物资。
| 参数 | 值 | 单位 | 来源 |
|---|---|---|---|
| 贸易大亨阈值 | 50000 | 金币(累计卖出) | 代码常量 VictoryManager.cs(VictoryConfig.csv 同值但不生效) |
| 外交家阈值 | 50 | 声望(三国最小值) | 代码常量 VictoryManager.cs |
| 征服者阈值 | 2 | 座城市 | 代码常量 VictoryManager.cs |
| 屠龙者阈值 | 1 | 次击杀 | 代码常量 VictoryManager.cs |
| 安全浮力阈值 | 0.5(50%) | 比例 | Inspector 序列化字段(mvp_002 玩家船 ShipBuoyancy,当前 0.5,可调 0.3–0.7) |
| 水位上限(沉没线) | 100 | 水位点 | Inspector 序列化字段(同上) |
| 排水速度 | 5 | 水位点/秒 | Inspector 序列化字段(同上) |
| 进水速度系数 | 100 | 水位点/秒(乘以浮力缺口) | Inspector 序列化字段(同上) |
| 复活倒计时 | 3(场景当前值;代码默认 6) | 秒 | Inspector 序列化字段(mvp_002.unity 第 3687 行 _respawnDelay: 3) |
| 死亡金币损失率 | 50% | 百分比 | Inspector 序列化字段(_goldLossPercent: 0.5) |
| 死亡物品损失率 | 正态 N(0.375, 0.125),截断 [0, 0.75] | 百分比/物品堆 | Inspector 序列化字段(_itemLossMean / _itemLossStdDev) |
| 港口修地板单价 | 10 | 金币/块 | Inspector 序列化字段(_repairCostPerFloor) |
| AI 船沉没销毁延迟 | 2 | 秒 | 代码常量 ShipBuoyancy.cs |
| 进水告警水位 | 50% / 75% | 百分比 | 代码常量 ShipBuoyancyToast.cs |
| Boss 血量 / 攻击 | 1000 / 30 | HP / 点 | Inspector 序列化字段默认值(BossMonster.cs;BossConfig.csv 同值但不生效) |
| Boss 检测半径 / 移速 | 40 / 1.5 | 世界单位 / 单位每秒 | 同上 |
| Boss 攻击冷却 | 3 | 秒 | 同上 |
| Boss 游荡间隔 / 重生时间 | 300 / 600 | 秒 | 同上 |
| 普通海怪血量(对比) | 100 | HP | CSV 配置 StaticMonsterConfig.csv |
| 贸易协定费用(+20 声望) | 5000 | 金币 | 代码常量 CityDiplomacyTrigger.cs |
| 停火协议费用(声望重置为 -20) | 10000 | 金币 | 代码常量 CityDiplomacyTrigger.cs |
| 声望事件数值 | 见上文声望事件表 | 声望点 | 代码常量 FactionManager.cs(ReputationEventConfig.csv 不生效) |
| 初始声望 / 友好阈值 / 敌对阈值 | 见上文国家表 | 声望点 | CSV 配置 FactionConfig.csv(生效) |
| 金币上限 | 9999999999 | 金币 | 代码常量 ShipData.cs |
| 船金币默认值(无 fleet 轴时) | 0 | 金币 | 代码常量 ShipData.cs |
城市驻防(征服者线的工作量,代码常量 CitySystemInitializer.cs;炮台船体布局在 DataSets/fleet/harbor_*.json,CSV/JSON 配置):
| 城市类型 | 驻防配置 | 总炮数 |
|---|---|---|
| FishingTown 渔村 | Picket ×1(1 炮) | 1 |
| TradePort 贸易港 | Battery ×2(各 2 炮) | 4 |
| IndustryCity 工业城 | Battery ×2 | 4 |
| Fortress 要塞 | Battery ×2 + Bastion ×1(4 炮) | 8 |
| Capital 首都 | Picket ×1 + Bastion ×2 + Citadel ×1(6 炮) | 15 |
注意 CityDefenseConfig.csv(tower_count / tower_hp / city_hp)运行时不被读取,实际防御强度由上表驻防船 + 炮自身的 DamageableComponent 决定。
与其他系统的交互
Section titled “与其他系统的交互”| 系统 | 关系 | 页面 |
|---|---|---|
| 交易 | 卖出收入喂贸易大亨;交易规模喂声望事件 | 交易 |
| 阵营与外交 | 声望最小值即外交家进度;占领/击沉的声望代价 | 阵营与外交 |
| 城市与国家 | 城防炮台全灭 → 占领 → 征服者计数与城市易主 | 城市与国家 |
| 怪物 | Boss 击杀 → 屠龙者 + 海域归属国声望 | 怪物 |
| 修建 | 底层地板/外缘墙的存量直接构成浮力分子 | 修建 |
| 伤害与护甲 | 炮台与 Boss 都靠 DamageableComponent 的死亡事件驱动胜负计数 |
伤害与护甲 |
| 战利品与掉落 | 死亡惩罚生成的掉落物、AI 沉船全掉落 | 战利品与掉落 |
| 船只 | 浮力/沉没/复活全部挂在玩家船上 | 船只 |
| 船员 | 开局船员由 fleet 预设生成;船员死亡不构成失败 | 船员 |
| 时间与调度 | 胜利弹窗/菜单的自动暂停 | 时间与调度 |
| 探索与情报 | 预设的初始已发现国家/城市 | 探索与情报 |
| 界面 | 胜利 HUD / 详情面板 / 复活浮窗 / 暂停菜单 | 界面总览 |
| 开发者工具 | 预设系统、作弊轴(无限金币/上帝模式等)、外交调试 | 开发者工具 |
| 配置表 | 本页涉及的 CSV 生效情况汇总 | 配置表总览 |
配置与调参指南
Section titled “配置与调参指南”| 想调的体验 | 改哪里 | 注意 |
|---|---|---|
| 四条胜利线的阈值 | Assets/Scripts/Service/VictorySystem/VictoryManager.cs 顶部 4 个常量(需程序改) |
改 VictoryConfig.csv 无效,运行时没人读它 |
| 沉没难度(进水/排水速度、安全阈值) | mvp_002 场景玩家船的 ShipBuoyancy 组件 Inspector |
进水速度 = (0.5 − 浮力) × 系数,调 _leakMultiplier 改容错时间 |
| 死亡惩罚轻重 | 同上:_goldLossPercent / _itemLossMean / _itemLossStdDev |
物品损失硬上限 0.75 写死在代码(GetNormalDistributedLossPercent) |
| 复活倒计时 | 同上:_respawnDelay |
场景值已覆盖为 3,改 prefab/代码默认值不影响该场景 |
| 开局资源 / 船员 / 建筑 / 金币 | Assets/StreamingAssets/DataSets/fleet/*.json + Assets/StreamingAssets/Presets/*.json 的 fleet 字段 |
改 JSON 即生效,不需要动代码;金币只能从这里给 |
| 用哪个预设开局 | mvp_002 场景里 ScenarioLoader 的 Preset Name 字段(Inspector) |
当前是“战斗测试”;正式体验应切“正常游玩”或“外循环测试_真实地图” |
| 初始声望 / 友好阈值 | Assets/StreamingAssets/FactionSystem/FactionConfig.csv(生效) |
友好阈值同时影响外交家观感(胜利阈值 50 仍在代码里) |
| 声望事件涨跌幅 | FactionManager.cs 的 LoadDefaultConfig 硬编码(需程序改) |
改 ReputationEventConfig.csv 无效 |
| 外交协定价格 | CityDiplomacyTrigger.cs 两个常量(需程序改) |
— |
| 城防强度 | CitySystemInitializer.cs 的 GetGarrisonConfig(城类型 → 驻防组合,需程序改)+ DataSets/fleet/harbor_*.json(炮台船布局,可直接改) |
改 CityDefenseConfig.csv 无效 |
| Boss 数值 | BossMonster.cs 序列化字段(挂载实例的 Inspector) |
改 BossConfig.csv 无效;且当前没有任何场景实例,见下 |
已知限制与注意事项
Section titled “已知限制与注意事项”- 三张“幽灵 CSV”:
VictoryConfig.csv、BossConfig.csv、CityDefenseConfig.csv都有代码生成的读取器(Service/Common/Generated/),但运行时没有任何系统调用它们;真实数值分别硬编码在VictoryManager.cs、BossMonster.cs序列化字段、CitySystemInitializer.cs。ReputationEventConfig.csv同样不被读取(数值硬编码于FactionManager.cs,且 CSV 缺 MonsterKill 行)。策划改这些 CSV 不会有任何效果。 - 屠龙者线当前不可达成:
BossMonster脚本未被任何场景或 prefab 引用(按脚本 GUID 全工程检索为零引用),也没有运行时生成器;BossDefeatedMessage的唯一发布者就是它。胜利详情面板的提示语“Boss 在火山海域游荡”描述的是设计意图而非现状。 - 胜利进度不进存档:
VictoryManager的累计值(卖出收入 / 占领数 / 击杀数 / 已达成集合)全是内存字段,没有接入存档;重启进程即清零。声望、金币同理由各自系统管理。 - 没有任何“团灭”失败:船员全部死亡不触发任何结算,沙盒继续运行;唯一失败通道是船沉。
- 从未停靠就沉船 → 复活在世界原点:
ShipRegistry.GetRespawnPosition()没有停靠记录时返回 (0,0,0)。场景里RespawnPoint组件登记的备用复活点实际永远不会被使用(取复活点时ShipRegistry分支恒先命中,ShipBuoyancy.csRespawn)。 - 金币掉落与物品掉落行为不对称:物品掉落受“复活前不可拾取、下次死亡清除”的死魂灵规则管;金币掉落两者都不受(不注册进
DeathDropManager)。 - 胜利弹窗文案与实现有偏差:
VictoryScreen.cs写“累计贸易额达到 50,000 金币”,实际只统计卖出毛收入,买入不计、不轧差。 - 外交家国家清单硬编码:
country_001/002/003写死在VictoryManager.cs,与FactionConfig.csv行数解耦——加第四国不会自动纳入胜利判定。 - 征服不可逆:每城的防御追踪器在首次占领后永久关闭(
_isConquered),城市不会被夺回,征服者计数也不会回退。 - HUD 的 N/4 与弹窗可能不同步:HUD 按“当前是否满足阈值”实时重算(外交声望跌回去会让 N 变小),而已达成集合是一次性的——弹过窗的胜利不会撤销。
mvp_002场景当前序列化预设是“战斗测试”(compact 地图 + 武器作弊 + hard 怪物表),并非正式开局配置;验收游戏循环时记得切预设。