夜之城铭记

夜之城铭记

你在生命中所做的一切,将会永久回响!或者,至少,大概...持续14天左右吧。或多或少几天。 ⚞◉⏖◉⚟ 我的游戏大修系列的第3/6部分。

夜之城有记忆

简介

在原版游戏中,你可以在沃森区消灭一半的漩涡帮成员,幸存者既不知道也不在乎,该派系当然也不会记仇。一个下午杀掉50个虎爪帮成员?你遇到的下一群人会像对待陌生人一样对待你。夜之城没有记忆。

夜之城有记忆让各个帮派有了一点记忆……如果你在足够短的时间内杀够某个派系足够多的成员,他们对你产生敌意。但这里有个转折——他们不能因为没人看见的事情而责怪你。每次击杀都会先进入一个待定队列。只有当同派系的NPC在尸体附近发现你时,这笔击杀才会算在你头上。在屋顶上用狙击枪射击而没有目击者?没人知道是谁杀了尼尔斯。可怜的尼尔斯。尼尔斯到底对你做了什么,你这个怪物?!总之……如果你在尸体附近被同派系成员认出,并且在给定的时间范围内,那么这笔击杀就会被归在你名下。

在战斗中,每个NPC都有机会认出你的身份,如果他们认出了你,而你没有足够快地杀掉他们,他们的派系就会知道是你干的。光天化日之下对付四个混混可能很容易,但也意味着你有可能被记上四次击杀,从而导致整个派系对你产生敌意。

然后是瘟疫。瘟疫就是你,而且瘟疫似乎只影响帮派成员。奇怪的是竟然会这样……把一个派系逼得太紧,他们的人口就会开始下降。继续逼迫,他们就会灭绝。从满员到被消灭共有八个等级。夜之城有记忆——但前提是它看见了,而且还有活着的目击者。

太长不看:帮派会追踪你的击杀、记仇,最终走向灭绝。但前提是他们能抓到你。( -_•)︻デ═一


基础设施

这个模组不仅是为了我自己的模组而运作,也是为了给其他模组提供一个集中追踪派系/帮派状态的平台。

因此,下面有一个专门给模组作者的部分,介绍相关API。


击杀归属

当你杀死一个NPC时,死亡事件会进入一个待定队列——不会立即归咎于你。只有当你在击杀地点(默认150米)范围内被同派系NPC认出时,这笔击杀才会被计入。

无人目击的击杀会在90分钟游戏时间后过期。如果没人把这些线索联系起来,你就全身而退了。

识别功能由街头感知的侦测系统处理——距离、潜行、伪装和时机都会影响识别。


派系敌对

一旦累积了足够多的目击击杀(默认25次),整个派系都会转为敌对。不仅仅是发现你的那个NPC——是整个帮派。附近新刷新的成员也会立即敌对。使用原版的敌对阵营系统来实现可靠的传播。

当击杀数衰减到阈值的一半以下时,敌对状态会清除。时间能治愈一切创伤,即使在夜之城也不例外。

派系敌对粘滞

在某些情况下,派系的敌对状态可能会变得粘滞——无法正确重置。这可能是由于竞态条件(两个系统同时试图操作相关参数,导致一个系统误以为操作成功而实际上并未成功),而且这类问题很难防御性地进行编码,因为我们也必须时刻注意性能,不能过度操作(比如反复检查:我们真的、真的、真的做到了吗?!),但我们至少可以为它做好规划并提供一个修复方案。

对于大多数派系来说,这是良性的(默认值是中立,NCR写入的也是中立值)。但该系统也会为拾荒者和幽灵写入敌对默认值,以及任何用户自定义的值——如果保存时态度是敌对的,即使NCR关闭后,引擎也会记住这一点。

修复方案是一个新的辅助函数,它会遍历所有NCR管理的引擎态度关系,并写入其持久化字段。

如果需要触发此功能,请按以下步骤操作:

  1. 打开设置,启用NCR的“启用派系态度”
  2. 保存游戏,退出到主菜单,重新加载存档
  3. 打开设置,禁用“启用派系态度”

关闭转换会触发自动重置,并将中立设置写入所有派系。当自动重置触发时,你应该会看到一条警告消息:“派系态度已重置为基线。”


记忆衰减

击杀记录存储在按天分组的桶中(可配置为7/14/21天)。当一天结束时,最旧的那个桶会被丢弃。如果每天只杀1个,而记忆窗口是7天,你就永远不会达到阈值。大开杀戒?那些击杀记录至少会保留一个星期。

这里没有随机性,只有干净的逐日递减。


派系灭绝

继续杀戮,派系人口就会开始下降。共有八个状态等级:

  • 满员 > 运转正常 > 捉襟见肘 > 枯竭 > 支离破碎 > 残余势力 > 背水一战 > 彻底清除

各派系初始人口:

  • 瓦伦蒂诺帮:6000
  • 虎爪帮:5500
  • NCPD:4000
  • 荒坂:3500
  • 军用科技:3000
  • 巴格斯特:2500
  • 第六街:2300
  • 野兽帮:2000
  • 漩涡帮:1300
  • 康陶:1000
  • 拾荒者:800
  • 幽灵:800
  • 创伤小组:500
  • 巫毒帮:350
  • 莫克斯帮:400
  • 阿德卡多:1200
  • 网监:200
  • 生物科技:600
  • NUSA:3000
  • 来世雇佣兵:500

启用刷新剔除后,已灭绝的派系将完全停止刷新。他们的地盘会变得出奇地空旷。任务NPC、同伴和人群始终受到保护——只有开放世界的帮派刷新会被剔除。

剔除几率随等级变化:在“捉襟见肘”时为15%,在“枯竭”时为35%,最高在“彻底清除”时达到100%。

警告此功能尚未经过充分测试,开启后可能对你的存档产生不良后果,因此该功能默认是关闭的


派系再生

帮派不会坐以待毙,至少大多数不会。每个游戏日,派系都会根据其故事背景中的规模和影响力招募新成员。

每日招募率:

  • NCPD:10/天
  • 瓦伦蒂诺帮:8/天
  • 虎爪帮:5/天
  • 第六街:5/天
  • 荒坂:4/天
  • 军用科技:4/天
  • 漩涡帮:3/天
  • 巴格斯特:3/天
  • 野兽帮:2/天
  • 拾荒者:2/天
  • 康陶:1/天
  • 创伤小组:1/天
  • 幽灵:1/天
  • 巫毒帮:0/天
  • 莫克斯帮:1/天
  • 阿德卡多:2/天
  • 网监:0/天
  • 生物科技:1/天
  • NUSA:6/天
  • 来世雇佣兵:1/天

计算方法很简单:剩余 = 人口上限 - 你的击杀数 + 补充成员。杀得比他们招募的快,他们就会减少。杀得慢,他们就会恢复。完全停止杀戮,给他们足够的时间,他们就会恢复到满员状态。


其他细节

  • 非致命制服 - 与击杀分开追踪。将某人击晕不会使派系敌对——只有击杀才会。致命制服算作击杀。
  • 强尼的问题 - 强尼闪回序列中的击杀不计算在内。
  • 持续敌对 - 派系敌对状态在存档/读档后依然保留。当你重新加载存档时,敌对派系会在首次遇到NPC时通过原版的态度系统重新生效。
  • 战斗识别 - 与街头感知的战斗识别系统配合。在战斗中转为敌对的NPC可以认出你,从而在战斗中将击杀归到你头上。不要留下目击者。

统计界面

枢纽菜单中的“派系状态”按钮会显示所有20个派系的击杀数(已归咎、待定、累计)、制服数、敌对状态、灭绝等级和人口。

这些计数器是NCR独有的,这意味着如果你在游戏中途安装它,你之前已经完成的击杀不会被计算在内。


选项

所有选项都在Modsettings中的“夜之城有记忆”下。

启用模组:开关。默认开启。 整个系统。

显示选项:开关。 显示下面的调节选项。

2. 击杀归属

归属半径(米):滑块。 同派系NPC需要离击杀地点多近才能将击杀归咎于你。

待定击杀过期时间(分钟):滑块。 无人目击的击杀在待定队列中保留多久后才会被遗忘。

3. 敌对

敌对阈值:滑块。 派系转为敌对所需的目击击杀次数。

允许NCPD敌对:开关。默认关闭。 允许NCPD像帮派一样累积基于击杀的敌对值。关闭 = NCPD永远不会仅因击杀而敌对,但你仍然可以通过派系态度将其设置为敌对。

4. 记忆衰减

击杀记忆(天数):滑块。 击杀记录会被记住多少个游戏日。更早的击杀会被丢弃。

5. 人口

启用人口下降:开关。 派系人口会随着你的击杀而减少。驱动灭绝等级。

击杀倍率:滑块。 每次击杀导致人口下降的速度。越高 = 灭绝越快。

<派系> - 人口上限:滑块。范围0-10000,步进100。 每个派系一个。夜之城的总体人口——你的累计击杀数将与此对比以确定灭绝等级。设为0可完全禁用该派系的灭绝追踪。

<派系> - 每日招募:滑块。范围0-50,步进1。 每个派系一个。每个游戏日招募的新成员,在击杀后补充人口。对于不在本地招募的派系设为0(巫毒帮和网监的默认值)。

根据故事背景调校的默认值与上述“派系灭绝”/“派系再生”部分列出的数值一致。如果你想创造一个更温和或更严酷的世界,滑块可以轻松调高或调低这些数字。

6. 刷新剔除

启用刷新剔除:开关。默认关闭。 已灭绝的派系停止刷新。他们的地盘变得安静。因为会显著改变游戏世界,所以默认是选择加入的。

7. 报告显示

显示已归咎 / 待定 / 击杀 / 制服列:开关。 在派系状态报告中分别显示或隐藏每一列。

显示枢纽菜单按钮:开关。 如果你不想让“派系状态”按钮碍事,就把它从枢纽菜单中隐藏。隐藏它会移除在游戏中查看报告的方式。

报告字体大小:滑块。范围24-48,默认36。 如果在你当前分辨率下列超出屏幕边缘,可以调低字号。表头和单元格会同步缩放。

30-43. 派系态度

NCR集成了派系态度切换器。启用派系态度显示态度设置以访问所有关系滑块。

  • 30. 派系态度 - 该系统的总开关。
  • 31. 玩家 vs 派系 - 你对每个派系的基础态度(0=友好,1=中立,2=敌对)。击杀追踪可以将中立升级为敌对。
  • 32. NCPD vs 派系 - NCPD如何对待每个帮派。
  • 33. 创伤小组 vs 派系 - 创伤小组的关系。
  • 34. 第六街关系 / 35. 漩涡帮关系 / 36. 虎爪帮关系 / 37. 野兽帮关系 / 38. 拾荒者关系 / 39. 瓦伦蒂诺关系 / 40. 巫毒帮关系 - 每个帮派对其他帮派的关系(三角关系——每对只列出一次)。
  • 41. 企业关系 - 荒坂 / 军用科技 / 康陶对帮派及彼此的关系。
  • 42. 其他关系 - 幽灵、巴格斯特、莫克斯帮中不适合放在其他类别的关系对。
  • 43. 阿德卡多关系 - 阿德卡多对其他派系的关系。

所有值:0=友好,1=中立,2=敌对。更改会在游戏加载时生效。取代派系态度切换器——如果使用本模组,请卸载FAT

8. 调试

调试日志:开关。 将击杀归属、敌对和灭绝事件打印到Gamelog。


面向模组作者

NCR提供了一个API,让其他模组可以在不重复造轮子的情况下,基于派系击杀数据构建功能。模块名称:NightCityRemembers

快速开始

保护你的代码,使其在有无NCR的情况下都能编译:

@if(ModuleExists("NightCityRemembers"))
import NightCityRemembers.*
@if(ModuleExists("NightCityRemembers"))
public static func MyMod_GetMaelstromKills(gi: GameInstance) -> Int32 {
let ncr = NCRSystem.Get(gi);
if !IsDefined(ncr) || !ncr.IsEnabled() { return 0; };
return ncr.GetKillCount(0); // 0 = Maelstrom
}
@if(!ModuleExists("NightCityRemembers"))
public static func MyMod_GetMaelstromKills(gi: GameInstance) -> Int32 {
return 0;
}

系统访问

let ncr: ref<NCRSystem> = NCRSystem.Get(gi);

返回系统实例,如果NCR未激活则返回null。务必进行null检查。

可用方法

击杀数据:

  • GetKillCount(factionIndex) - 当前衰减窗口内已归咎的击杀数
  • GetTotalKillCount(factionIndex) - 累计击杀数(永不衰减)
  • GetPendingKillCount(factionIndex) - 等待目击者归属的击杀数
  • GetTakedownCount(factionIndex) - 非致命制服数(单独追踪,不影响敌对)

派系状态:

  • IsFactionHostile(factionIndex) - 如果该派系目前对V敌对,则返回true
  • GetFactionExtinctionTier(factionIndex) - 0-7,其中0=满员,7=彻底清除
  • GetFactionExtinctionStatus(factionIndex) - 人类可读的等级名称(“捉襟见肘”、“枯竭”等)
  • GetFactionPopulationPercent(factionIndex) - 0.0-100.0,该派系剩余人口的百分比
  • GetFactionPopulationCap(factionIndex) - 该派系当前配置的上限(感知滑块变动)
  • GetFactionReplenishRate(factionIndex) - 当前配置的每日招募率(感知滑块变动)(自3.5.0起)

人口写入API (自3.5.0起)

  • AdjustPopulation(factionIndex, delta, reason) - 返回布尔值。将派系人口推进delta个成员。正数 = 增援(上限为累计击杀数),负数 = 损失(每日招募会按该派系的滑块速率随时间补回)。reason是一个字符串,在NCR的调试日志开启时会记录。如果NCR被禁用或派系索引超出范围,则返回false。

使用场景示例:招募激增事件(“巫毒帮本周大力招募,+50/天持续7天”)、中间人发布的帮派清剿任务(“在幕后消灭200个野兽帮”)、敌对派系屠杀(“幽灵刚刚消灭了一个漩涡帮小组”)。

实用工具:

  • IsEnabled() - NCR是否激活?
  • IsExtinctionEnabled() - 灭绝子系统是否开启?
  • IsSpawnCullingEnabled() - 刷新剔除是否开启?
  • GetFactionName(factionIndex) - “漩涡帮”、“虎爪帮”等。

派系索引映射

0 = Maelstrom        
1 = Tyger Claws
2 = Animals
3 = Scavengers
4 = Valentinos
5 = Voodoo Boys
6 = Sixth Street
7 = Arasaka
8 = Militech
9 = Kang Tao
10 = Trauma Team
11 = Wraiths
12 = Barghest
13 = NCPD
14 = The Moxes
15 = Aldecaldos
16 = NetWatch
17 = Biotechnica
18 = NUSA
19 = Afterlife Mercs

gamedataAffiliation转换:NCRFactions.GetIndex(affiliation)。对于不受追踪的隶属关系返回-1。

重要说明

  • 击杀/敌对/制服状态对外部是只读的。不要直接操作NCR的内部槽数据——它自己管理持久化、衰减计时和迁移。
  • 人口状态有一个官方写入入口点AdjustPopulation。它通过NCR自然的招募计算来应用变更,确保行为与玩家在报告中看到的一致。
  • GetKillCount返回衰减窗口计数(驱动敌对)。GetTotalKillCount是累计的,永远不会重置。
  • 敌对是确定性的——纯粹基于击杀数与阈值的比较。没有随机数生成。
  • 待定和已归咎的击杀都会在存档/读档后保留(自3.4.0起)。你不能再通过快速存档来洗白你的潜行突袭了。

更新日志

1.0.0 - 初始测试版本。击杀追踪、敌对、灭绝、枢纽菜单统计。 1.1.0 - 击杀归属系统(待定队列、目击者要求、按天分桶衰减)。 2.0.0 - 刷新剔除、强尼闪回开关、灭绝等级重命名、累计追踪。 2.1.0 - 致命制服修复、累计计数器与目击者解耦。 2.2.0 - 首次公开发布。 2.4.0 - 莫克斯帮加入为第15个受追踪派系。报告显示开关:单独隐藏/显示已归咎、待定、击杀、制服列。 3.0.0 - 集成派系态度切换器v1。派系动态:帮派之间的动态默认设置为符合故事背景的设置。可在ModSettings中调整。玩家对派系的默认值也已添加并可调整。情报报告现在会通过添加(基础)来报告帮派是否处于其基础水平。颜色更新略有变动,添加了更多派系。 3.1.0 - 显示枢纽菜单按钮开关、报告窗口字体滑块。四个新派系:网监、生物科技、NUSA、来世。 3.2.0 - 针对无群体派系的每NPC态度。 3.3.0 - 快速破解击晕追踪(短路、重启视觉等现在会登记为制服)。 3.4.0 - 重大更新!૮ ˆﻌˆ ა 新增:

  • 待定击杀现在在存档后保留。快速存档不再能洗白潜行突袭。
  • 灭绝现在读取累计击杀数,而不是滚动目击窗口。被消灭的帮派保持被消灭状态,而不是随着窗口衰减而悄悄恢复。
  • 制服去重修复 - 手动非致命制服不再在钩子之间重复计数。 Bug修复:
  • 外部模组API现在为派系14-19(莫克斯、阿德卡多、网监、生物科技、NUSA、来世)返回正确的人口数据——之前是硬编码为“满员”。
  • 移除了8个无效的NCPD/创伤小组态度滑块(更改它们在游戏世界中没有任何效果)。 性能: 待定击杀持久化从O(N)优化为O(1)热路径(大规模枪战大约快10倍)。派系状态页面分配从约160次降到2次。 3.4.1 - 不再覆盖任务敌对(赛博精神病等) 3.5.0 - 每个派系的人口滑块 + 写入API。 新增:
  • 40个新的ModSettings滑块:每个派系现在都有自己的人口上限每日招募滑块。可以单独调整每个帮派的难易程度。
  • 面向其他模组的AdjustPopulation API:正数增量 = 增援,负数 = 损失。驱动诸如中间人任务、招募激增、敌对帮派屠杀等风味模组。
  • GetFactionReplenishRate读取器,让外部模组可以查看当前配置的每日速率。 翻译: 所有ModSettings标签和描述现在都通过DigitalVixenCore的翻译层路由(需要DVCore ≥ 3.19.3)。 3.5.1 - 热修复:ModSettings调整静默破坏了派系灭绝报告 3.5.2 - 更多翻译修复。 3.5.3 - 修复:禁用系统后持久化态度状态仍然粘滞,参见**- 派系敌对粘滞 -** 了解说明。 3.5.4 - 不再尝试剔除由Drug Dealer模组生成的NPC,因此不再中断突袭导致无法清空。 3.7.0 - 更新为需要Redscript Configuration Framework。支持18种语言的翻译 + 英语 = 共19种语言,配置现在在游戏内通过一个干净整洁的弹窗完成。 3.7.1 - 日志已移至可选的RedLogger插件,为Mod Picker和游戏内百科添加了卡片和文档。

前置要求

此模组要求你安装以下内容: Redscript Codeware Street Sense DigitalVixen Core Redscript Configuration Framework

可选但推荐: RedLogger - 为日志增加粒度。

对于3.7.0之前的版本: Mod Settings

设计为可协同游玩:


我的其他模组

以下所有模组都能很好地协同工作:

基础设施模组和补丁:


推荐

我喜欢并且可以真正担保的模组:


不兼容性

夜之城有记忆取代或接替了以下模组。它们不兼容,在安装前应将其移除。

不兼容:

  • They Will Remember - NCR是从零开始的重制替代品。两者都会追踪派系击杀并应用敌对。同时运行会导致所有内容重复计数。
  • Faction Extinction - NCR包含自己的灭绝系统。存在同样的重复计数问题。
  • Night City Alive - NCA的派系设置与NCR不兼容,但其在车辆中生成帮派成员的功能是兼容的——这是针对RedMod版本的说明,我还没有研究过新的Redscript版本的做法。
  • Faction Attitudes Toggler - NCR现已完全集成FAT。非常感谢cradilyex允许我这样做!

安装

  1. 安装所有依赖项(包括Street Sense)。
  2. 如果已安装They Will Remember和/或Faction Extinction,请将其移除。
  3. 将下载的文件解压到你的游戏主目录中。
  4. 启动游戏并在Mod Settings -> Night City Remembers下进行配置。

卸载

删除目录 \Cyberpunk 2077\r6\scripts\NightCityRemembers

击杀数据保存在你的存档文件中,但在移除模组后不会引起问题。派系只是……忘记了。就像过去一样。


致谢

夜之城有记忆是一个从零开始的重制实现,灵感来源于They Will RememberFaction Extinction。没有复制任何代码,但最初的派系关系矩阵来源于TWR/FE的实现,并已扩展到20个派系。

感谢CET和redscript社区提供的工具和文档。

特别感谢NightlyNow推动我做得更好,敢于做更多。感谢NyxLachrimae帮助测试、提供想法和进行一般性讨论。感谢ApoKrytia进行测试和提供深刻的见解。还要感谢cradilyex的反馈和测试。没有你们我做不到!(˶ᵔᗜᵔ˶)ノ゙

感谢所有优秀的模组作者,他们持续为我们所有人创作免费的内容!


DigitalVixen模组套件的一部分。 你现在可以在Discord上找到我,点击这里