Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
],
},
],
Expand Down
52 changes: 52 additions & 0 deletions docs/hnpedia/Accounts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# 账户与用户系统

Hacknet 中存在多层"账户"概念:**玩家本地账户**(存档系统)、**服务器用户**(`UserDetail`)、**游戏内数据账号**(`Account` / `OnlineAccount` / `NeopalsAccount`)。它们用途不同、互不相通。

> ⚠️ 本页所有账户、口令与用户数据均为**游戏内虚构设定**,仅作资料记录,请勿关联到任何真实系统或人物。

## 玩家账户(存档账户)

见 [存档系统](./Saves.md):由 `SaveFileManager` 管理,含用户名/加密密码/存档文件,支持本地 + Steam 云双写。主菜单的新建/登录都走这套。

## 服务器用户(UserDetail)

每台服务器有一组登录用户,用于邮箱、IRC 等需要认证的服务:

```xml
<user name="admin" pass="..." type="1" known="false" />
```

| 字段 | 含义 |
|---|---|
| `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)
84 changes: 84 additions & 0 deletions docs/hnpedia/Defense.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# 防御与追踪深度解析

本文深入 `Firewall`、`TraceTracker`、`Administrator` 与 Shell 的**内部实现**,是 [核心机制](./Mechanics.md) 的技术延伸。

> ⚠️ 本页仅解析**游戏内的防御系统实现**(来自游戏源码)。所涉破解防火墙、压测代理、Shell 洪泛等均为游戏机制,请勿用于现实网络行为。

## 防火墙内部(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` 的 `<admin type="...">`):

| 类型 | 行为 |
|---|---|
| `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_@_<IP>`、陷阱激活 `#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)
83 changes: 83 additions & 0 deletions docs/hnpedia/Saves.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# 存档系统

Hacknet 的存档系统由 **账户(Account)** 与 **存档文件(Save File)** 两层构成。每个游戏内用户是一个账户,账户下有一份 `.xml` 存档。存档通过 `SaveFileManager` 统一管理,可同时写入**本地**与 **Steam 云**两份。

> ⚠️ 本页内容均为**游戏内的存档与账户机制**(含 `buffalo` 万能口令、存档编辑等游戏设定),仅作资料记录,请勿套用到现实系统。

## 存档位置

存档按平台存放于不同目录(`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` 生成,根元素 `<HacknetSave>`:

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<HacknetSave generatedMissionCount="2" Username="test" Language="en-us" DLCMode="False" DisableMailIcon="False">
<DLC ... /> <!-- DLC 专属数据 -->
<Flags ... /> <!-- 剧情进度标记 -->
<netmap ...> ... </netmap> <!-- 网络地图全部节点 -->
<mission next="..." goals="none" activeCheck="none"> ... </mission>
<branchMissions> ... </branchMissions>
<factions ...> ... </factions>
<other music="..." homeNode="..." homeAssetsNode="..." />
</HacknetSave>
```

各模块可独立序列化:网络节点(`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)
9 changes: 9 additions & 0 deletions docs/hnpedia/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,12 @@ Labyrinths DLC 的"跳出游戏"机制:注入木马 DLL、系统锁死、真

### [🎲 随机生成系统](./Generation.md)
公司名、NPC 用户名、学位、车辆、病历、Neopals 账户的程序化生成机制。

### [💾 存档系统](./Saves.md)
账户清单与存档文件结构、本地/Steam 云双写、存档编辑与备份。

### [👥 账户与用户系统](./Accounts.md)
玩家账户、服务器 UserDetail、Account/OnlineAccount/Neopals 账号分层解析。

### [🛡 防御与追踪深度解析](./Defense.md)
防火墙 analyze 原理、追踪计时与报警、管理员类型、Shell 过载/陷阱机制。