Skip to content

游戏循环与胜负

This content is not available in your language yet.

本作是 RimWorld / 缺氧式的“海盗船殖民地”沙盒:玩家经营一艘船、四条胜利线并行推进(贸易 / 外交 / 征服 / 屠龙),失败不是 Game Over,而是沉船后损失一半金币与部分物资、在最后停靠港复活的“软重生”。

《Project Pirate》没有传统的“主菜单 → 新游戏 → 结局”结构:

  • 启动即开局。打包场景只有一个 mvp_002EditorBuildSettings.asset 中唯一启用的场景),游戏启动直接进入海上沙盒。
  • 胜利是成就式的。共 4 种胜利条件(贸易大亨 / 外交家 / 征服者 / 屠龙者),任意一种达成即弹出胜利结算弹窗并暂停游戏,但点击“继续游戏”后沙盒继续运行,可继续凑齐其余胜利(VictoryManager.csVictoryScreen.cs)。
  • 失败是局部惩罚。唯一的“死亡”是玩家船沉没(浮力系统水位涨满),触发金币与物资掉落惩罚 + 倒计时复活,复活后继续当前存盘局;没有任何“全员阵亡 → 游戏结束”的结算(ShipBuoyancy.cs)。
  • 屏幕右下角的“星 N/4”按钮(或按 V 键)随时可查看 4 条胜利线的实时进度(VictoryHUDPanel.csVictoryDetailPanel.cs)。

玩家接触本系统的入口:胜利进度 HUD(Top 层)、胜利详情面板(V 键)、胜利结算弹窗(达成时自动)、沉船复活倒计时浮窗(沉没时自动)、暂停菜单(仅“继续 / 退出”两项,MainMenuPanel.cs)。

游戏循环由四条互相喂养的玩法轴构成,每条轴各有详细页面:

内容 对胜负的贡献
经营(船上模拟) 船员需求(吃 / 喝 / 睡 / 如厕)、生产与制作(水泵 → 锅炉 → 引擎的动力链、弹药台)、修建 船能不能开、炮有没有弹、底层地板完整度直接决定浮力(失败条件)
航海与探索 驾船在三国 + 自由港的海图上移动,探索与情报解锁城市,遭遇与刷怪产生海怪战斗 到港才能贸易 / 外交;停靠港同时是沉没后的复活点
战斗 武器与弹药怪物、AI 巡逻船、城市海上炮台 征服者(打掉城防)与屠龙者(击杀 Boss)两条胜利线;战斗破洞也会降低浮力
社交 交易阵营与外交(声望、贸易协定、停火、国籍) 贸易大亨(累计卖出收入)与外交家(三国声望全部 ≥ 50)两条胜利线

典型一轮循环:备航(修船 / 补煤补弹补粮)→ 出航(探索 / 打怪 / 跑商)→ 回港(卖货、签协定、招募)→ 四条胜利线进度上涨。

全局时间走 Unity timeScale(GameSpeedManager.cs):速度 0 = 暂停,1 = 正常,可设任意正倍率。胜利弹窗与暂停菜单弹出时若游戏未暂停会自动暂停,关闭时只在“是它暂停的”情况下才恢复,不覆盖玩家手动暂停。详见时间与调度

开局初始状态:预设(Preset)系统

Section titled “开局初始状态:预设(Preset)系统”

开局内容完全由 JSON 预设驱动,不写死在场景里:

  1. 场景里的 ScenarioLoader.cs(执行顺序 -100,最早 Awake)读取 Assets/StreamingAssets/Presets/{预设名}.json
  2. 预设按“轴”组合数据集:world(地图缩放)/ cheats(作弊开关)/ fleet(初始船队)/ monsters(刷怪表覆盖)/ trading(城市库存覆盖),另有 aiShipsplayerNationalityinitialDiscoveredCountries/Cities 字段;
  3. StarterFleetInitializer.csfleet 轴在网格中央铺地板、放建筑、塞物资、生成船员、设置初始金币。

当前 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)。

世界由 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 座城及类型:马德里(首都)、塞维利亚(工业)、普利茅斯(渔村)、朴次茅斯(要塞)、自由港(贸易港)、勒阿弗尔(贸易港)、马赛(贸易港)。详见城市与国家

胜利判定中枢是 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 实际并未被放进任何场景,也没有运行时生成器,这条线在正常游玩中无法达成,见“已知限制”。
  • 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.csLoadDefaultConfig 硬编码;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;攻击本国实体 → 立即撤销玩家国籍。

失败的唯一通道是玩家船的浮力系统(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 秒“船体稳定”。

玩家船水位涨满的瞬间(ShipBuoyancy.cs):

  1. 禁用船体碰撞与移动控制;
  2. 金币惩罚:损失 当前金币 × 50%,在沉没点生成金币掉落物;
  3. 物品惩罚:船上每个容器的每种物品独立掷一次损失率——正态分布(均值 0.375、标准差 0.125,Box-Muller 采样)截断到 [0, 0.75],损失数量 = 向下取整(数量 × 损失率),即平均丢约 37.5%、最多丢 75%;丢失物品在沉没点 ±5 单位随机偏移处生成掉落物;
  4. 屏幕中央弹出“船只沉没”复古浮窗,副文案“金币与物资将随海葬失去”,显示复活倒计时(RespawnPresenter.cs);
  5. 倒计时结束后复活。

死魂灵规则DeathDropManager.cs):本次死亡生成的物品掉落在复活前不可拾取;复活后解锁,可以开回沉没点捞回;但下一次死亡会清空上一次还没捞的物品掉落——一条命的容错。金币掉落不受此规则管(不注册进死亡掉落管理器,也不会被下次死亡清除)。

AI 船的沉没走完全不同的分支:沉没 2 秒后直接销毁,掉落船上全部容器物品供玩家拾取,无惩罚无复活——这是战利品与掉落的来源之一。

没有“读档重来”或“重新开始”按钮(暂停菜单只有“继续游戏 / 退出游戏”两项,MainMenuPanel.cs)。重开 = 原地复活:

  1. 倒计时走完(mvp_002 场景当前配置 3 秒;代码默认值 6 秒);
  2. 免费自动重建所有被摧毁的底层地板(平时在港口修则按每块 10 金收费);
  3. 清空全部未修复战斗破洞记录;
  4. 传送到最后停靠过的港口(玩家船进入任意非敌对城市范围时自动记录,ShipRegistry.cs);若本局从未停靠过任何港口,复活在世界原点 (0,0,0);
  5. 水位归零、状态回 Safe、恢复碰撞与移动、解锁死亡掉落拾取。

胜利进度、声望、船员、建筑等一切状态在沉没复活后全部保留——损失只有金币与物资。

参数 单位 来源
贸易大亨阈值 50000 金币(累计卖出) 代码常量 VictoryManager.csVictoryConfig.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.csBossConfig.csv 同值但不生效)
Boss 检测半径 / 移速 40 / 1.5 世界单位 / 单位每秒 同上
Boss 攻击冷却 3 同上
Boss 游荡间隔 / 重生时间 300 / 600 同上
普通海怪血量(对比) 100 HP CSV 配置 StaticMonsterConfig.csv
贸易协定费用(+20 声望) 5000 金币 代码常量 CityDiplomacyTrigger.cs
停火协议费用(声望重置为 -20) 10000 金币 代码常量 CityDiplomacyTrigger.cs
声望事件数值 见上文声望事件表 声望点 代码常量 FactionManager.csReputationEventConfig.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 决定。

系统 关系 页面
交易 卖出收入喂贸易大亨;交易规模喂声望事件 交易
阵营与外交 声望最小值即外交家进度;占领/击沉的声望代价 阵营与外交
城市与国家 城防炮台全灭 → 占领 → 征服者计数与城市易主 城市与国家
怪物 Boss 击杀 → 屠龙者 + 海域归属国声望 怪物
修建 底层地板/外缘墙的存量直接构成浮力分子 修建
伤害与护甲 炮台与 Boss 都靠 DamageableComponent 的死亡事件驱动胜负计数 伤害与护甲
战利品与掉落 死亡惩罚生成的掉落物、AI 沉船全掉落 战利品与掉落
船只 浮力/沉没/复活全部挂在玩家船上 船只
船员 开局船员由 fleet 预设生成;船员死亡不构成失败 船员
时间与调度 胜利弹窗/菜单的自动暂停 时间与调度
探索与情报 预设的初始已发现国家/城市 探索与情报
界面 胜利 HUD / 详情面板 / 复活浮窗 / 暂停菜单 界面总览
开发者工具 预设系统、作弊轴(无限金币/上帝模式等)、外交调试 开发者工具
配置表 本页涉及的 CSV 生效情况汇总 配置表总览
想调的体验 改哪里 注意
四条胜利线的阈值 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/*.jsonfleet 字段 改 JSON 即生效,不需要动代码;金币只能从这里给
用哪个预设开局 mvp_002 场景里 ScenarioLoader 的 Preset Name 字段(Inspector) 当前是“战斗测试”;正式体验应切“正常游玩”或“外循环测试_真实地图”
初始声望 / 友好阈值 Assets/StreamingAssets/FactionSystem/FactionConfig.csv(生效) 友好阈值同时影响外交家观感(胜利阈值 50 仍在代码里)
声望事件涨跌幅 FactionManager.csLoadDefaultConfig 硬编码(需程序改) ReputationEventConfig.csv 无效
外交协定价格 CityDiplomacyTrigger.cs 两个常量(需程序改)
城防强度 CitySystemInitializer.csGetGarrisonConfig(城类型 → 驻防组合,需程序改)+ DataSets/fleet/harbor_*.json(炮台船布局,可直接改) CityDefenseConfig.csv 无效
Boss 数值 BossMonster.cs 序列化字段(挂载实例的 Inspector) BossConfig.csv 无效;且当前没有任何场景实例,见下
  • 三张“幽灵 CSV”VictoryConfig.csvBossConfig.csvCityDefenseConfig.csv 都有代码生成的读取器(Service/Common/Generated/),但运行时没有任何系统调用它们;真实数值分别硬编码在 VictoryManager.csBossMonster.cs 序列化字段、CitySystemInitializer.csReputationEventConfig.csv 同样不被读取(数值硬编码于 FactionManager.cs,且 CSV 缺 MonsterKill 行)。策划改这些 CSV 不会有任何效果。
  • 屠龙者线当前不可达成BossMonster 脚本未被任何场景或 prefab 引用(按脚本 GUID 全工程检索为零引用),也没有运行时生成器;BossDefeatedMessage 的唯一发布者就是它。胜利详情面板的提示语“Boss 在火山海域游荡”描述的是设计意图而非现状。
  • 胜利进度不进存档VictoryManager 的累计值(卖出收入 / 占领数 / 击杀数 / 已达成集合)全是内存字段,没有接入存档;重启进程即清零。声望、金币同理由各自系统管理。
  • 没有任何“团灭”失败:船员全部死亡不触发任何结算,沙盒继续运行;唯一失败通道是船沉。
  • 从未停靠就沉船 → 复活在世界原点ShipRegistry.GetRespawnPosition() 没有停靠记录时返回 (0,0,0)。场景里 RespawnPoint 组件登记的备用复活点实际永远不会被使用(取复活点时 ShipRegistry 分支恒先命中,ShipBuoyancy.cs Respawn)。
  • 金币掉落与物品掉落行为不对称:物品掉落受“复活前不可拾取、下次死亡清除”的死魂灵规则管;金币掉落两者都不受(不注册进 DeathDropManager)。
  • 胜利弹窗文案与实现有偏差VictoryScreen.cs 写“累计贸易额达到 50,000 金币”,实际只统计卖出毛收入,买入不计、不轧差。
  • 外交家国家清单硬编码country_001/002/003 写死在 VictoryManager.cs,与 FactionConfig.csv 行数解耦——加第四国不会自动纳入胜利判定。
  • 征服不可逆:每城的防御追踪器在首次占领后永久关闭(_isConquered),城市不会被夺回,征服者计数也不会回退。
  • HUD 的 N/4 与弹窗可能不同步:HUD 按“当前是否满足阈值”实时重算(外交声望跌回去会让 N 变小),而已达成集合是一次性的——弹过窗的胜利不会撤销。
  • mvp_002 场景当前序列化预设是“战斗测试”(compact 地图 + 武器作弊 + hard 怪物表),并非正式开局配置;验收游戏循环时记得切预设。