From cc6ee2c81f80c205cab646fd79e0927d5de8f12e Mon Sep 17 00:00:00 2001 From: MEMZ-CHROER Date: Wed, 19 Aug 2026 13:08:33 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(hnpedia):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=AD=98=E6=A1=A3=E7=B3=BB=E7=BB=9F=E3=80=81=E8=B4=A6=E6=88=B7?= =?UTF-8?q?=E4=B8=8E=E7=94=A8=E6=88=B7=E7=B3=BB=E7=BB=9F=E3=80=81=E9=98=B2?= =?UTF-8?q?=E5=BE=A1=E4=B8=8E=E8=BF=BD=E8=B8=AA=E6=B7=B1=E5=BA=A6=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/config.mts | 3 ++ docs/hnpedia/Accounts.md | 50 +++++++++++++++++++++++ docs/hnpedia/Defense.md | 82 ++++++++++++++++++++++++++++++++++++++ docs/hnpedia/Saves.md | 81 +++++++++++++++++++++++++++++++++++++ docs/hnpedia/index.md | 9 +++++ 5 files changed, 225 insertions(+) create mode 100644 docs/hnpedia/Accounts.md create mode 100644 docs/hnpedia/Defense.md create mode 100644 docs/hnpedia/Saves.md diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index d1bdf9f..c961483 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -101,6 +101,9 @@ export default defineConfig({ { text: "多语言与本地化", link: "/hnpedia/Locales" }, { text: "敌对黑客入侵事件", link: "/hnpedia/HostileHacker" }, { text: "随机生成系统", link: "/hnpedia/Generation" }, + { text: "存档系统", link: "/hnpedia/Saves" }, + { text: "账户与用户系统", link: "/hnpedia/Accounts" }, + { text: "防御与追踪深度解析", link: "/hnpedia/Defense" }, ], }, ], diff --git a/docs/hnpedia/Accounts.md b/docs/hnpedia/Accounts.md new file mode 100644 index 0000000..b256cf9 --- /dev/null +++ b/docs/hnpedia/Accounts.md @@ -0,0 +1,50 @@ +# 账户与用户系统 + +Hacknet 中存在多层"账户"概念:**玩家本地账户**(存档系统)、**服务器用户**(`UserDetail`)、**游戏内数据账号**(`Account` / `OnlineAccount` / `NeopalsAccount`)。它们用途不同、互不相通。 + +## 玩家账户(存档账户) + +见 [存档系统](./Saves.md):由 `SaveFileManager` 管理,含用户名/加密密码/存档文件,支持本地 + Steam 云双写。主菜单的新建/登录都走这套。 + +## 服务器用户(UserDetail) + +每台服务器有一组登录用户,用于邮箱、IRC 等需要认证的服务: + +```xml + +``` + +| 字段 | 含义 | +|---|---| +| `name` | 用户名 | +| `pass` | 密码 | +| `type` | 账户类型(0=已重置/管理员,1=普通,3=代理等) | +| `known` | 是否已被人知晓(影响登录后提示) | + +- 服务器构造时自带 `admin` 用户(`Computer.cs:29`,type=1,密码为管理员密码)。 +- `addNewUser` 可运行时添加用户;邮件服务器给每个新用户分配 `UsernameGenerator.getName()`。 +- 玩家自己的账户是 `os.defaultUser`(`UserDetail(username, "password", 1)`)。 + +## 数据账号(Account / OnlineAccount) + +DLC 中用于模拟现实账号的数据类: + +- **Account**:ID、现金、银行、公寓、车辆、天煞车辆、Rank、RP、击杀数——用于 GTA 风格数据展示(`Account.ToString()` 返回 ID)。 +- **OnlineAccount**:ID、用户名、封禁状态、备注,`ToString()` 返回 `用户名#ID`——用于论坛/社交数据。 + +这两类数据由对应的 Daemon 填充展示,属于"游戏内数据库内容",与玩家存档无关。 + +## Neopals 账户(NeopalsAccount) + +DLC 虚拟宠物站账户,随机生成(见 [随机生成系统](./Generation.md)): + +- 字段:账户名、NeoPoints、BankedPoints、InventoryID(GUID)、宠物列表。 +- 活跃用户(`isActiveUser`)点数更高(≤50k vs ≤5k),主要人物(Bit 等)的账户更豪华。 +- 在 Neopals 任务线中用于查案与彩蛋。 + +## 与存档的关系 + +- 玩家账户是存档的**门禁**:登录后 `os.SaveGameUserName` 指向存档文件名,`os.SaveUserAccountName` 是显示名。 +- 服务器 `UserDetail`、`Account`、`OnlineAccount`、`NeopalsAccount` 随网络节点一起被序列化进存档,读档后原样恢复。 + +> 相关页面:[存档系统](./Saves.md) · [随机生成系统](./Generation.md) · [服务器服务(Daemon)](./Daemons.md) \ No newline at end of file diff --git a/docs/hnpedia/Defense.md b/docs/hnpedia/Defense.md new file mode 100644 index 0000000..97f976f --- /dev/null +++ b/docs/hnpedia/Defense.md @@ -0,0 +1,82 @@ +# 防御与追踪深度解析 + +本文深入 `Firewall`、`TraceTracker`、`Administrator` 与 Shell 的**内部实现**,是 [核心机制](./Mechanics.md) 的技术延伸。 + +## 防火墙内部(Firewall) + +防火墙在等级 5+ 服务器上生成,构造时: + +- `solutionLength = 6 + complexity`(complexity = 安全等级 − 5)。 +- 密码 = `getRandomChar()`(**70% 字母 + 30% 数字**,见 `Utils`)生成后转大写。 +- 支持自定义 `solution` 与 `additionalDelay`(XML 的 `solution`/`additionalDelay` 属性)。 + +### analyze 输出原理 + +每次 `analyze` 显示一行 20 字符宽的矩阵(`generateOutputLine`): + +- 前 `20 − 3×analysisPasses` 位被随机字符遮蔽,**第 0 次分析每 20 位隐藏 1 位**,此后每轮修复 3 位。 +- 正确的字符被**随机插入**矩阵中的任意位置,位置完全随机。 +- 每轮每字符延迟 = `0.08 + 0.06×轮次 + additionalDelay` 秒(递增)。 +- 输入 `solve` 时:长度错误提示"Too few/many characters";完整匹配(忽略大小写)即 `solved = true`。 + +### 保存与重置 + +- 存档会保存 `complexity`、`solution`、`additionalDelay`,读档后原样恢复。 +- `resetSolutionProgress()` 清空分析轮次;管理员重置密码时防火墙同步重置。 + +## 追踪系统内部(TraceTracker) + +追踪时间在 `Computer` 构造时计算: + +``` +traceTime = max(10 − 安全等级, 3) × 15s +``` + +等级 4 → 90s;等级 10 → 45s;最低 45s。 + +### 启动与停止 + +- 触发:目标主机执行 `hostileActionTaken()` 且连接者就是目标 IP 时 `traceTracker.start()`。 +- 停止条件(`Update` 内): + - 断开连接或切换目标 → 若剩余时间 <0.5s,解锁 **`trace_close`** 成就。 + - 计时器归零 → `os.timerExpired()`(游戏结束/危险序列)。 +- **TraceKill.exe**:持续运行会冻结追踪(`timeSinceFreezeRequest = 0`,追踪在 <0.2s 内不推进);RAM 600;不追踪时不冻结。 + +### 警报与表现 + +- 剩余百分比 `timer/startingTimer×100`,红色 `TRACE :` 文本显示在左下角。 +- 报警节奏随剩余量加快:>45% 每 10%、15~45% 每 5%、<15% 每 1% 响一声 `SFX/beep` 并闪屏。 +- **SignalScramble.exe**(DLC 的 `DLCTraceSlower`,RAM 50→600 预热)运行时把 `trackSpeedFactor` 压到接近 0(抑制追踪),退出/被杀恢复 1×。另有 `AllTraceTimeSlowed` 全局减速开关(默认关闭,仅调试)。 + +## 管理员类型(Administrator) + +断线后管理员反应取决于类型(`Computer` 的 ``): + +| 类型 | 行为 | +|---|---| +| `BasicAdministrator` | 随机延迟 0~20s 后关闭全部端口、重置管理员 IP、重置防火墙;`ResetsPassword` 时重置密码 | +| `FastBasicAdministrator` | 立刻关端口/重置防火墙/重开代理;延迟后才重置密码与 admin IP;`IsSuper` 则立即全重置 | +| `FastProgressOnlyAdministrator` | 类似 FastBasic,但**不动密码**(只关端口、重置防火墙、重开代理);追踪踢出也会触发 | + +共同点:断线或追踪踢出后,已破端口会重新关闭,必须重新破解。`traceEjectionDetected` 默认空实现,`FastProgressOnly` 覆写为直接按断线处理。 + +## Shell 与代理过载(ShellExe) + +Shell 有 `Overload` 与 `Trap` 两种模式: + +- **Overload**(压测代理):`state=1`,每秒扣减目标 `proxyOverloadTicks`;归零后 `proxyActive=false`,代理解除。压测期间目标持续触发 `hostileActionTaken()`(可能被追踪)。RAM 基础 40。 +- **Trap**(陷阱):`state=2`,RAM 升至 100,可对目标服务器执行 `forkBombClients` 连接洪泛。 +- 日志:开壳 `[IP]_Opened_#SHELL`、压测 `#SHELL_Overload_@_`、陷阱激活 `#SHELL_TrapActivate_:_ConnectionsFlooded`、关壳 `#SHELL_Closed`。 +- 若管理员权限丢失或目标禁用,Shell 立即报错退出(`SHELL ERROR: Administrator account lost`)。 + +## 代理时间计算(openPortsForSecurityLevel) + +等级 ≥5 时按公式累加代理总时长: + +``` +for i in 4..安全等级: proxyTime += BASE_PROXY_TICKS / (i - 3) +``` + +等级越高代理越久;`proxyTime` 存入 `startingOverloadTicks` 并随存档保存。代理激活期间无法 `PortHack`,必须先 Overload 压完。 + +> 相关页面:[核心机制](./Mechanics.md) · [服务器服务(Daemon)](./Daemons.md) · [程序与工具大全](./Programs.md) \ No newline at end of file diff --git a/docs/hnpedia/Saves.md b/docs/hnpedia/Saves.md new file mode 100644 index 0000000..fc5d8bf --- /dev/null +++ b/docs/hnpedia/Saves.md @@ -0,0 +1,81 @@ +# 存档系统 + +Hacknet 的存档系统由 **账户(Account)** 与 **存档文件(Save File)** 两层构成。每个游戏内用户是一个账户,账户下有一份 `.xml` 存档。存档通过 `SaveFileManager` 统一管理,可同时写入**本地**与 **Steam 云**两份。 + +## 存档位置 + +存档按平台存放于不同目录(`LocalDocumentsStorageMethod`): + +| 平台 | 路径 | +|---|---| +| Windows | `我的文档\My Games\Hacknet\Accounts\` | +| Linux | `$XDG_DATA_HOME/Hacknet/Accounts/` 或 `~/.local/share/Hacknet/Accounts/` | +| macOS | `~/Library/Application Support/Hacknet/Accounts/` | +| 失败回退 | 游戏目录下 `Accounts/`(并提示 `AccumErrors`) | + +Extension 模式下,所有路径追加 `<扩展文件夹名>/`,实现**扩展存档隔离**(本地与云同规则)。 + +## 账户清单(Accounts.txt) + +`Accounts.txt` 记录所有账户,分隔符为 `\r\n%------%`,首行为最后登录用户名: + +``` +<最后登录用户名> +%------% +<用户名>\r\n__<加密密码>\r\n__<最后写入时间>\r\n__<文件用户名> +%------% +... +``` + +- 密码经 `FileEncrypter.EncryptString` 加密,读取时解密校验。 +- 存档文件名 = `save_<净化用户名>.xml`(`_` 会替换为 `-`)。 +- 登录校验:用户名不区分大小写;**特殊口令 `buffalo` 可免密登录任意账户**(源码中写死)。 + +## 存档文件结构 + +存档是 UTF-8 XML,由 `OS.writeSaveGame` 生成,根元素 ``: + +```xml + + + + + ... + ... + ... + ... + + +``` + +各模块可独立序列化:网络节点(`netMap.getSaveString()`)、当前任务、分支任务、派系进度、音乐/家节点。 + +## 保存触发 + +- 游戏内 `save` 命令(真正的保存由内部长口令 `save!(SJN!*SNL8vAewew57WewJdwl89(*4;;;&!)@&(ak'^&#@J3KH@!*` 触发,玩家无法直接输入)。 +- `saveGame()` 会在 Extension 模式下检查 `AllowSave`:不允许的扩展不写盘。 +- `threadedSaveExecute` 走线程安全队列(`SaveInProgress`/`SaveInQueue` 防重入),保存时锁定 `CurrentlySaving`。 + +## 云存档 + +`SaveFileManager` 按顺序注册存储方法: + +1. `LocalDocumentsStorageMethod`(本地,永远启用) +2. `SteamCloudStorageMethod`(Steam 运行且云可用时启用) + +写入时遍历全部存储方法写一份;读取/加载优先取第一个(本地)。启动时 `UpdateStorageMethodsFromSourcesToLatest` 会把旧版云存档/本地存档**迁移合并**到新账户系统(大于 100 字节的文件才会迁移)。 + +> ⚠️ 安装 Pathfinder 会禁用 Steam 云存档。 + +## 账户管理 API + +| 方法 | 功能 | +|---|---| +| `AddUser(username, pass)` | 新建账户(重名/空名拒绝,下划线转连字符) | +| `GetFilePathForLogin(user, pass)` | 校验登录,返回存档文件名(`buffalo` 万能口令) | +| `CanCreateAccountForName(name)` | 检查用户名是否可用 | +| `DeleteUser(username)` | 删除账户并修正最后登录者 | + +主菜单登录流程:新建账户 → `AddUser` → `GetFilePathForLogin` → 设置 `os.SaveGameUserName` 与 `SaveUserAccountName` → 启动 OS。 + +> 相关页面:[账户与用户系统](./Accounts.md) · [游戏模式与设置](./Modes.md) · [常见问题](../hnfaq.md) \ No newline at end of file diff --git a/docs/hnpedia/index.md b/docs/hnpedia/index.md index 1b43e67..976ed91 100644 --- a/docs/hnpedia/index.md +++ b/docs/hnpedia/index.md @@ -75,3 +75,12 @@ Labyrinths DLC 的"跳出游戏"机制:注入木马 DLL、系统锁死、真 ### [🎲 随机生成系统](./Generation.md) 公司名、NPC 用户名、学位、车辆、病历、Neopals 账户的程序化生成机制。 + +### [💾 存档系统](./Saves.md) +账户清单与存档文件结构、本地/Steam 云双写、存档编辑与备份。 + +### [👥 账户与用户系统](./Accounts.md) +玩家账户、服务器 UserDetail、Account/OnlineAccount/Neopals 账号分层解析。 + +### [🛡 防御与追踪深度解析](./Defense.md) +防火墙 analyze 原理、追踪计时与报警、管理员类型、Shell 过载/陷阱机制。 From 5e7d421125e5d554931d1ee827fc6ad4e9e18f60 Mon Sep 17 00:00:00 2001 From: MEMZ-CHROER Date: Wed, 19 Aug 2026 13:23:58 +0800 Subject: [PATCH 2/2] =?UTF-8?q?docs(hnpedia):=20=E5=AD=98=E6=A1=A3/?= =?UTF-8?q?=E8=B4=A6=E6=88=B7/=E9=98=B2=E5=BE=A1=E4=B8=89=E9=A1=B5?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=85=8D=E8=B4=A3=E5=A3=B0=E6=98=8E=EF=BC=88?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=9C=BA=E5=88=B6=E4=B8=8E=E8=99=9A=E6=9E=84?= =?UTF-8?q?=E8=AE=BE=E5=AE=9A=E5=A3=B0=E6=98=8E=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/hnpedia/Accounts.md | 2 ++ docs/hnpedia/Defense.md | 2 ++ docs/hnpedia/Saves.md | 2 ++ 3 files changed, 6 insertions(+) diff --git a/docs/hnpedia/Accounts.md b/docs/hnpedia/Accounts.md index b256cf9..99b5934 100644 --- a/docs/hnpedia/Accounts.md +++ b/docs/hnpedia/Accounts.md @@ -2,6 +2,8 @@ Hacknet 中存在多层"账户"概念:**玩家本地账户**(存档系统)、**服务器用户**(`UserDetail`)、**游戏内数据账号**(`Account` / `OnlineAccount` / `NeopalsAccount`)。它们用途不同、互不相通。 +> ⚠️ 本页所有账户、口令与用户数据均为**游戏内虚构设定**,仅作资料记录,请勿关联到任何真实系统或人物。 + ## 玩家账户(存档账户) 见 [存档系统](./Saves.md):由 `SaveFileManager` 管理,含用户名/加密密码/存档文件,支持本地 + Steam 云双写。主菜单的新建/登录都走这套。 diff --git a/docs/hnpedia/Defense.md b/docs/hnpedia/Defense.md index 97f976f..638ff0c 100644 --- a/docs/hnpedia/Defense.md +++ b/docs/hnpedia/Defense.md @@ -2,6 +2,8 @@ 本文深入 `Firewall`、`TraceTracker`、`Administrator` 与 Shell 的**内部实现**,是 [核心机制](./Mechanics.md) 的技术延伸。 +> ⚠️ 本页仅解析**游戏内的防御系统实现**(来自游戏源码)。所涉破解防火墙、压测代理、Shell 洪泛等均为游戏机制,请勿用于现实网络行为。 + ## 防火墙内部(Firewall) 防火墙在等级 5+ 服务器上生成,构造时: diff --git a/docs/hnpedia/Saves.md b/docs/hnpedia/Saves.md index fc5d8bf..5ac3f95 100644 --- a/docs/hnpedia/Saves.md +++ b/docs/hnpedia/Saves.md @@ -2,6 +2,8 @@ Hacknet 的存档系统由 **账户(Account)** 与 **存档文件(Save File)** 两层构成。每个游戏内用户是一个账户,账户下有一份 `.xml` 存档。存档通过 `SaveFileManager` 统一管理,可同时写入**本地**与 **Steam 云**两份。 +> ⚠️ 本页内容均为**游戏内的存档与账户机制**(含 `buffalo` 万能口令、存档编辑等游戏设定),仅作资料记录,请勿套用到现实系统。 + ## 存档位置 存档按平台存放于不同目录(`LocalDocumentsStorageMethod`):