Files
TankIC/3DTank/docs/ArchitectureModules.md
T
TermiNexus 61b57a3d11 docs(3dtank): 架构逆向:模块依赖图、6 条运行链路、TOState↔reducer 映射
names/module-graph.json:126 模块的 Kind/职责/依赖/导出/锚点,533 条依赖边,入口 13431(出度 46,依赖链深 17 层)。docs/ArchitectureModules.md:依赖图摘要 + 40 个游戏模块逐条 + 依赖分层(由数据生成)。docs/ArchitectureRuntime.md:启动引导/网络层/Redux/UI 系统/资源与渲染/空间与对象模型 6 条链路,64 条关键函数([证据] 77 / [推断] 15)。names/tostate-map.json + docs/StateMap.md:TOState 实为 89 字段(非估计的 60),89/89 由「toString 字段→槽位」与「根 reducer v8 的实参顺序→ntb 形参→w8 字段顺序」两条独立链路交叉验证,唯一未映射的是只读的 launchParams。
2026-09-18 09:30:30 +08:00

473 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 3DTank 架构模块调研
> 本文件内容全部由 `3DTank/names/module-graph.json` 的数据生成(一次性内联 node 命令,仓库不保留生成脚本);计数、依赖、分层均非手工绘制。
## 1. 总览
- 模块总数:**126**(均为 webpack 代码模块;index.json 中其余条目是资源模块,不在本调研范围)
- 按 Kind:游戏本体 **40** / Kotlin生态库 **22** / 第三方库 **64**
- 依赖边总数:**533**;孤立模块(无出度且无入度):**3** 个
- 依赖层次最深(最长依赖链):**Level 17**
### 1.1 依赖与结构的抽取方法(覆盖率)
- **依赖(DependsOn)**:取模块工厂第 3 个参数作为 webpack require(形如 `(t, n, i) => {` 里的 `i`),再扫描 `i(<id>)` 静态调用,且 id 必须命中已知代码模块 id 集合。**126/126 模块都执行了抽取**,其中 **97 个模块抽到 ≥1 条边(77%)**;**29 个模块 DependsOn 为空**,原因是:24 个模块工厂只有 1~2 个参数(编译产物里根本没有 require 参数),5 个模块有 require 参数但源码无静态 `i(<id>)` 调用(7793、14766、17323、55920、94965;其中 55920 用 `t.require(n)` 动态取模块,无法静态解析)。`index.json` 只含 id/type/path,**不含依赖信息**,故依赖全部来自源码扫描。
- **Kind**:按 dir.file 职责描述判定。职责点名可识别外部包/产品(React、ReactDOM、Scheduler、Sentry、qrcode、fflate、Emotion、underscore、inline-style-prefixer、prop-types、react-is、react-list、hoist-non-react-statics、@preact/signals-react、WebViewJavascriptBridge、Google Play Billing、Yandex Metrica、Dijkstra 库等)→ 第三方库;Kotlin/JS 编译出的通用基础设施(kotlin-stdlib、kotlinx.serialization、kotlinx.coroutines、atomicfu、ByteBuffer、DOM/CSS 构建器、RBuilder、Kotlin<->React 桥、kotlin-redux 框架核心、通用工具模块)→ Kotlin生态库;其余游戏业务逻辑(客户端、协议编解码、模型注册、UI/HUD、战斗、资源、音频、埋点、游戏引擎、启动入口)→ 游戏本体。规则表已写死为显式 id 列表,126 个模块全部命中、无默认兜底。
- **Anchors**:优先取字符串字面量(长度 3~90,滤掉 HTML/CSS 噪声词与纯符号/数字串,CSS 函数名如 `image-set(` 保留),按 `跨模块出现次数`(仅 1 个模块出现 +4、≤3 个 +2、>40 个 -4)+ `错误信息关键词`(not found / exception / invalid / failed / unknown 等 +5)+ `camelCase 标识符`(+4)打分取前 5;**字面量不足 3 个时**用该模块内出现次数少的高辨识度标识符(导出名 / 属性名,如 `getPositions`、`createRoot`)补齐,纯转发模块补转发目标 `i(<id>)`。仍有 6 个模块(17323、19074、29545、31584、58309、99295)没有任何可用锚点,其 `Anchors` 为空数组(不编造)。
- **顶层类/函数**:统计最浅缩进层的 `function NAME(` 声明(Kotlin/JS 产物会把函数声明提升到同一层);名称首字母大写计入 TopLevelClasses(Kotlin 类名 PascalCase,压缩后仍有大写开头,如 71105 中可见 `ResourceBatchLoadException`),其余计入 TopLevelFunctions。这是启发式口径,非精确语义。
### 1.2 代码量分布(按字节 Top 20)
| # | 模块 | 字节 | KB | Kind |
|---|---|---|---|---|
| 1 | `module_82347` | 5498676 | 5370 | 游戏本体 |
| 2 | `module_87072` | 3775340 | 3687 | 游戏本体 |
| 3 | `module_10032` | 1536764 | 1501 | 游戏本体 |
| 4 | `module_85183` | 1176860 | 1149 | 游戏本体 |
| 5 | `module_92980` | 822309 | 803.0 | 游戏本体 |
| 6 | `module_47243` | 534291 | 521.8 | 游戏本体 |
| 7 | `module_71105` | 372886 | 364.1 | 游戏本体 |
| 8 | `module_21300` | 355930 | 347.6 | 游戏本体 |
| 9 | `module_37036` | 347491 | 339.3 | Kotlin生态库 |
| 10 | `module_18334` | 303005 | 295.9 | 游戏本体 |
| 11 | `module_70130` | 293925 | 287.0 | 游戏本体 |
| 12 | `module_85196` | 235678 | 230.2 | 游戏本体 |
| 13 | `module_45555` | 224856 | 219.6 | 第三方库 |
| 14 | `module_36659` | 182712 | 178.4 | 游戏本体 |
| 15 | `module_63383` | 177741 | 173.6 | Kotlin生态库 |
| 16 | `module_55088` | 148469 | 145.0 | 游戏本体 |
| 17 | `module_52943` | 145059 | 141.7 | Kotlin生态库 |
| 18 | `module_3569` | 141181 | 137.9 | 游戏本体 |
| 19 | `module_9539` | 131066 | 128.0 | Kotlin生态库 |
| 20 | `module_30285` | 123696 | 120.8 | 第三方库 |
## 2. 依赖图摘要
### 2.1 入度 Top 15(被最多模块依赖)
| 模块 | 入度 | Kind | 职责 |
|---|---|---|---|
| `module_37036` | 59 | Kotlin生态库 | Kotlin/JS 标准库(kotlin-stdlib-js)的运行时核心模块 |
| `module_52943` | 39 | Kotlin生态库 | 网页游戏/应用底层工具库,认设备,管键盘,翻译,报错,调用浏览器本地存储,服务管理 |
| `module_61860` | 24 | 游戏本体 | 网络连接与游戏对象模型的核心模块,Kotlin/JS 编译产物。它把客户端和服务端连接起来,并管理游戏对象的生命周期。 |
| `module_24635` | 24 | Kotlin生态库 | Kotlin/JS 二进制序列化/反序列化(Protocol Buffer 风格)编解码框架 |
| `module_32088` | 18 | 游戏本体 | Alternativa3D,3D 数学库,用 Kotlin 编写 |
| `module_71105` | 15 | 游戏本体 | 游戏资源加载系统(Resource Loader) |
| `module_89613` | 15 | Kotlin生态库 | Kotlin Coroutines (kotlinx.coroutines) 核心基础设施的 JS 移植版 |
| `module_31908` | 12 | 游戏本体 | 游戏战斗(Battle)域的协议编解码模块 |
| `module_92980` | 11 | 游戏本体 | 使用 WebGL 技术开发的3D 游戏引擎或大型 3D 交互应用的渲染核心模块 |
| `module_7552` | 10 | 第三方库 | 转发实现 |
| `module_85196` | 8 | 游戏本体 | 游戏车库(Garage)系统的协议编解码模块,属于同一个坦克对战类游戏。它负责定义和注册与“车库/装备/商店”相关的网络协议消息的二进制编解码器。 |
| `module_3569` | 8 | 游戏本体 | 游戏客户端的输入与坦克预览模块 |
| `module_85667` | 8 | 游戏本体 | 客户端协议编解码模块 |
| `module_88693` | 8 | 游戏本体 | 网络协议与数据模型层的实现,主要负责处理客户端与服务器之间关于社交、好友、举报、通知权限等非战斗数据的序列化与反序列化,并管理相关的网络路由和回调。 |
| `module_10849` | 8 | Kotlin生态库 | Kotlin/JS 编译后的 Redux 状态管理框架核心模块 |
### 2.2 出度 Top 15(依赖最多模块)
| 模块 | 出度 | Kind | 职责 |
|---|---|---|---|
| `module_82347` | 46 | 游戏本体 | 负责注册大厅、车库、商店、部落、战斗结算等几乎所有核心 UI 界面的组件样式与逻辑。 |
| `module_13431` | 46 | 游戏本体 | Kotlin/JS 编译后的游戏客户端启动入口模块,负责整个游戏的初始化、渲染和启动流程。 |
| `module_18334` | 28 | 游戏本体 | 游戏客户端的总装配/依赖注入模块 |
| `module_10032` | 25 | 游戏本体 | 游戏客户端核心 Redux 状态管理模块。Redux 架构 |
| `module_87072` | 24 | 游戏本体 | 战斗系统,底盘与物理系统,战斗模式,物品池和特效系统,空投与补给系统,地图与场景渲染 |
| `module_21300` | 19 | 游戏本体 | Kotlin/JS 游戏战斗内 HUD(战斗界面)与用户交互系统 |
| `module_70130` | 19 | 游戏本体 | 游戏战斗场景(Battle)的模型注册与初始化模块 |
| `module_71105` | 16 | 游戏本体 | 游戏资源加载系统(Resource Loader) |
| `module_84441` | 13 | 第三方库 | 负责把文本数据编码成 QR 码的模块矩阵。qrcode 库 |
| `module_47243` | 11 | 游戏本体 | 游戏客户端"面板(Panel)系统"的协议编解码模块,用 Kotlin 编写。它是整个项目中最大的协议模块之一,定义了面板 UI 相关的所有枚举、数据类、编解码器。 |
| `module_52943` | 9 | Kotlin生态库 | 网页游戏/应用底层工具库,认设备,管键盘,翻译,报错,调用浏览器本地存储,服务管理 |
| `module_24923` | 9 | Kotlin生态库 | CSS-in-JS 样式引擎(类似 styled-components / Emotion / Stitches 的实现),用 Kotlin 编写并编译成 JS。它负责在运行时动态生成、管理和注入 CSS,支持 React 组件样式、主题、媒体查询、动画等。 |
| `module_57128` | 9 | 游戏本体 | UI 交互与触控/鼠标手势处理模块 |
| `module_85183` | 8 | 游戏本体 | 定义并注册游戏中各种网络协议消息的编解码器(Codec),用于在客户端与服务器之间序列化/反序列化数据。 |
| `module_3569` | 8 | 游戏本体 | 游戏客户端的输入与坦克预览模块 |
### 2.3 叶子模块(无出度,共 29 个)
其中属于游戏本体的(1 个):`module_26482`
其余叶子模块:`module_905`(第三方库)、`module_7793`(第三方库)、`module_13532`(第三方库)、`module_14766`(第三方库)、`module_15330`(第三方库)、`module_17259`(第三方库)、`module_17323`(第三方库)、`module_19074`(第三方库)、`module_21973`(第三方库)、`module_27736`(第三方库)、`module_29545`(第三方库)、`module_31509`(第三方库)、`module_31584`(Kotlin生态库)、`module_37036`(Kotlin生态库)、`module_38335`(第三方库)、`module_43319`(第三方库)、`module_44794`(第三方库)、`module_55920`(第三方库)、`module_57328`(第三方库)、`module_64280`(第三方库)、`module_66610`(第三方库)、`module_76074`(第三方库)、`module_77672`(第三方库)、`module_78231`(第三方库)、`module_78931`(第三方库)、`module_79763`(第三方库)、`module_94965`(Kotlin生态库)、`module_99295`(第三方库)
### 2.4 孤立模块(既不被依赖也不依赖别人,共 3 个)
- `module_26482`(0.7 KB,游戏本体)Service Worker 注册模块
- `module_76074`(1.4 KB,第三方库)Yandex Metrica(俄版 Google Analytics)的集成模块,用于加载分析脚本并暴露事件上报接口。
- `module_78231`(5.2 KB,第三方库)WebView JavaScript Bridge 的加载与实现模块,用于原生 App(iOS/Android)与网页之间的双向通信。
## 3. 游戏本体模块逐条(40 个)
### `module_82347`(5370 KB)
- 职责:负责注册大厅、车库、商店、部落、战斗结算等几乎所有核心 UI 界面的组件样式与逻辑。
- 依赖的模块:`59411`, `7552`, `40293`, `28485`, `1901`, `14766`, `37036`, `52943`, `59131`, `90875`, `24923`, `61860`, `10032`, `57128`, `18334`, …(共 46 个)
- 顶层类 / 其它顶层函数:5256 / 5656
- 锚点:`imageBackgroundMessageError`、`getDerivedStateFromError`、`commonBlockMessageError`
### `module_87072`(3687 KB)
- 职责:战斗系统,底盘与物理系统,战斗模式,物品池和特效系统,空投与补给系统,地图与场景渲染
- 依赖的模块:`37036`, `52943`, `61860`, `24635`, `85183`, `61378`, `10032`, `10849`, `32088`, `31908`, `72834`, `55088`, `3569`, `92980`, `97556`, …(共 24 个)
- 顶层类 / 其它顶层函数:3094 / 3327
- 锚点:`Invalid weapon effect timings`、`Mesh texture not found`、`Invalid supply type `
### `module_10032`(1501 KB)
- 职责:游戏客户端核心 Redux 状态管理模块。Redux 架构
- 依赖的模块:`37036`, `10849`, `9539`, `52943`, `61430`, `31908`, `89803`, `47243`, `85667`, `88693`, `54199`, `41164`, `99527`, `85196`, `31584`, …(共 25 个)
- 顶层类 / 其它顶层函数:1100 / 1196
- 锚点:`FPS seems awful but cannot decrease the settings`、`Not found params for property `、`Unexpected response status `
### `module_85183`(1149 KB)
- 职责:定义并注册游戏中各种网络协议消息的编解码器(Codec),用于在客户端与服务器之间序列化/反序列化数据。
- 依赖的模块:`37036`, `24635`, `71105`, `61860`, `31908`, `32088`, `85196`, `52943`
- 顶层类 / 其它顶层函数:1164 / 1241
- 锚点:`pointCaptureStartNegativeSound`、`pointCaptureStartPositiveSound`、`pointCaptureStopNegativeSound`
### `module_92980`(803.0 KB)
- 职责:使用 WebGL 技术开发的3D 游戏引擎或大型 3D 交互应用的渲染核心模块
- 依赖的模块:`52943`, `37036`, `32088`, `97556`, `72834`, `9345`
- 顶层类 / 其它顶层函数:494 / 534
- 锚点:`Cannot use default vertex array object`、`Cannot create empty LodGroup`、`Cannot remove last layout`
### `module_47243`(521.8 KB)
- 职责:游戏客户端"面板(Panel)系统"的协议编解码模块,用 Kotlin 编写。它是整个项目中最大的协议模块之一,定义了面板 UI 相关的所有枚举、数据类、编解码器。
- 依赖的模块:`37036`, `24635`, `71105`, `31908`, `52943`, `25377`, `85196`, `85667`, `61860`, `88693`, `99527`
- 顶层类 / 其它顶层函数:605 / 643
- 锚点:`disabledNotificationTypes`、`expireActiveTimeRewards`、`expireRewardTimeRewards`
### `module_71105`(364.1 KB)
- 职责:游戏资源加载系统(Resource Loader)
- 依赖的模块:`37036`, `9539`, `89613`, `52943`, `61860`, `24635`, `9345`, `92980`, `32088`, `72834`, `16100`, `61430`, `36734`, `97556`, `7426`, …(共 16 个)
- 顶层类 / 其它顶层函数:226 / 250
- 锚点:`Unexpected 3D file format for `、`Invalid file extension `、`Unknown resource type `
### `module_21300`(347.6 KB)
- 职责:Kotlin/JS 游戏战斗内 HUD(战斗界面)与用户交互系统
- 依赖的模块:`7552`, `36659`, `82347`, `37036`, `24923`, `3569`, `10032`, `59131`, `52943`, `63383`, `10849`, `7426`, `90875`, `41164`, `31908`, …(共 19 个)
- 顶层类 / 其它顶层函数:348 / 385
- 锚点:`containerUserNickNameClanTag`、`commonContainerIconOptions`、`inputContainerSpectators`
### `module_18334`(295.9 KB)
- 职责:游戏客户端的总装配/依赖注入模块
- 依赖的模块:`37036`, `37504`, `10849`, `52943`, `10032`, `61860`, `47243`, `85667`, `88693`, `10283`, `85196`, `32088`, `3569`, `71105`, `99527`, …(共 28 个)
- 顶层类 / 其它顶层函数:237 / 266
- 锚点:`vkInitFailed`、`initError`、`Cannot find SteamAPI for SteamPaymentModel`
### `module_70130`(287.0 KB)
- 职责:游戏战斗场景(Battle)的模型注册与初始化模块
- 依赖的模块:`37036`, `52943`, `61860`, `87072`, `10032`, `92980`, `61378`, `31908`, `85183`, `10849`, `3569`, `36734`, `97556`, `32088`, `71105`, …(共 19 个)
- 顶层类 / 其它顶层函数:260 / 280
- 锚点:`onGrahpicsSettingsChange`、`onBattleSettingsChange`、`lightingEffectService`
### `module_85196`(230.2 KB)
- 职责:游戏车库(Garage)系统的协议编解码模块,属于同一个坦克对战类游戏。它负责定义和注册与“车库/装备/商店”相关的网络协议消息的二进制编解码器。
- 依赖的模块:`37036`, `24635`, `71105`, `85667`, `32088`, `61860`, `52943`
- 顶层类 / 其它顶层函数:312 / 342
- 锚点:`staticCollisionBoxes`、`mainCollisionBox`、`skyboxFrontSide`
### `module_36659`(178.4 KB)
- 职责:游戏客户端的纹理/资源注册与加载系统
- 依赖的模块:`37036`, `89613`, `52943`, `92980`, `71105`
- 顶层类 / 其它顶层函数:292 / 319
- 锚点:`desktopHudNuclearRechargeFlashBackground`、`deviceFasterHorizontalTrackingRailgun`、`deviceFasterHorizontalTrackingVulcan`
### `module_55088`(145.0 KB)
- 职责:物理引擎与碰撞检测系统,同样是 Kotlin/JS 编译产物。
- 依赖的模块:`32088`, `37036`, `52943`
- 顶层类 / 其它顶层函数:105 / 112
- 锚点:`Bound box size is zero`、`Negative mass`、`Level `
### `module_3569`(137.9 KB)
- 职责:游戏客户端的输入与坦克预览模块
- 依赖的模块:`37036`, `32088`, `52943`, `92980`, `9345`, `55088`, `97556`, `7426`
- 顶层类 / 其它顶层函数:130 / 133
- 锚点:`onPointerLockError`、`Cannot get free screen pointer!`、`Cannot find parent`
### `module_37504`(104.5 KB)
- 职责:游戏客户端"氏族(Clan)系统"的协议编解码模块,用 Kotlin 编写
- 依赖的模块:`37036`, `24635`, `52943`, `61860`
- 顶层类 / 其它顶层函数:103 / 110
- 锚点:`Enum item not found for code `、`modelRegistry`、`modelService`
### `module_61378`(92.7 KB)
- 职责:游戏世界(World)与实体-组件系统(ECS)的核心模块
- 依赖的模块:`37036`, `52943`, `92980`, `3569`, `32088`, `55088`, `89613`, `97556`
- 顶层类 / 其它顶层函数:66 / 73
- 锚点:`World.addGameEffect cannot add effect during update.`、`Cannot remove all while dispatching`、`Cannot dispose while dispatching`
### `module_10283`(91.4 KB)
- 职责:Kotlin/JS 编译后的协议模型注册模块
- 依赖的模块:`37036`, `24635`, `71105`, `52943`, `61860`, `67222`
- 顶层类 / 其它顶层函数:77 / 82
- 锚点:`proBattlesLimitSound`、`socialNetworkParams`、`entranceBackgrounds`
### `module_97675`(90.0 KB)
- 职责:WebView JS‑Native 双向通信桥(Bridge)
- 依赖的模块:`37036`, `52943`, `61430`, `9539`, `89613`
- 顶层类 / 其它顶层函数:30 / 53
- 锚点:`Invalid result structure`、`checkUnfinishedPurchases`、`finishVerifiedPurchase`
### `module_89803`(85.1 KB)
- 职责:游戏/应用中用于处理“匹配系统”和“对战大厅”网络通信和数据序列化的核心代码库。
- 依赖的模块:`37036`, `24635`, `31908`, `61860`, `71105`, `85667`, `52943`
- 顶层类 / 其它顶层函数:78 / 91
- 锚点:`matchmakingModeRanks`、`optionsDefaults`、`supportedModes`
### `module_85667`(80.6 KB)
- 职责:客户端协议编解码模块
- 依赖的模块:`37036`, `24635`, `71105`, `52943`, `61860`
- 顶层类 / 其它顶层函数:143 / 141
- 锚点:`browserExtensionsToDetect`、`stateWithCaptcha`、`clientKey`
### `module_32088`(79.7 KB)
- 职责:Alternativa3D,3D 数学库,用 Kotlin 编写
- 依赖的模块:`37036`, `9539`
- 顶层类 / 其它顶层函数:26 / 35
- 锚点:`Failed requirement.`、` +
this.z1z_1 +
`、` +
this.a20_1 +
`
### `module_31908`(77.2 KB)
- 职责:游戏战斗(Battle)域的协议编解码模块
- 依赖的模块:`37036`, `24635`, `88693`, `52943`, `61860`
- 顶层类 / 其它顶层函数:104 / 110
- 锚点:`experiencePremiumBonusByActions`、`suspiciousByIpUserIds`、`suspiciousUserIds`
### `module_61860`(74.9 KB)
- 职责:网络连接与游戏对象模型的核心模块,Kotlin/JS 编译产物。它把客户端和服务端连接起来,并管理游戏对象的生命周期。
- 依赖的模块:`24635`, `37036`, `52943`, `32088`, `72834`, `89613`, `61430`, `9539`
- 顶层类 / 其它顶层函数:69 / 72
- 锚点:`Constructor codec not found for model `、`Param config-template not found in url`、`Config load exception with status `
### `module_9345`(69.5 KB)
- 职责:A3D 二进制 3D 模型格式 的完整解析器
- 依赖的模块:`37036`, `72834`, `32088`, `97556`
- 顶层类 / 其它顶层函数:52 / 68
- 锚点:`Unknown attribute type id `、`Unknown attribute type `、` not found `
### `module_89679`(58.4 KB)
- 职责:集成 Google Play 计费 API
- 依赖的模块:`89613`, `10032`, `37036`, `52943`, `97675`, `10849`, `56077`, `47243`
- 顶层类 / 其它顶层函数:32 / 32
- 锚点:`Failed to complete payment response with fail`、`API not supported in this browser context`、`Unknown BridgeBillingService shop type`
### `module_16100`(57.0 KB)
- 职责:Kotlin/JS 编译后的战斗地图(BattleMap)协议模型注册模块
- 依赖的模块:`37036`, `24635`, `52943`
- 顶层类 / 其它顶层函数:74 / 82
- 锚点:`collisionGeometryOutsideGamingZone`、`collisionGeometry`、`textureParameter`
### `module_25377`(52.7 KB)
- 职责:游戏客户端与服务器之间的"通知/事件"协议编解码层,用 Kotlin 编写。它基于模块 24635 的二进制编解码框架,定义了所有服务器→客户端的通知消息类型及其序列化格式。
- 依赖的模块:`37036`, `24635`, `31908`, `52943`, `61860`, `85667`, `99527`
- 顶层类 / 其它顶层函数:61 / 69
- 锚点:`Enum item not found for code `、`wsProto`、`modelRegistry`
### `module_13431`(46.6 KB)
- 职责:Kotlin/JS 编译后的游戏客户端启动入口模块,负责整个游戏的初始化、渲染和启动流程。
- 依赖的模块:`30285`, `81886`, `37036`, `82347`, `21300`, `10032`, `89613`, `41164`, `52943`, `7426`, `3569`, `92980`, `10849`, `97675`, `61860`, …(共 46 个)
- 顶层类 / 其它顶层函数:44 / 38
- 锚点:`onVisibilityChanged`、`lockScreenLandscape`、`requestFullscreen`
### `module_36734`(40.5 KB)
- 职责:游戏客户端的音频系统,用 Kotlin 编写。它基于 Web Audio API 实现了完整的音效播放引擎,包括:音频解码、声道管理、优先级调度、3D 空间音效、音量/静音控制、分组增益
- 依赖的模块:`37036`, `32088`, `52943`, `89613`, `7426`
- 顶层类 / 其它顶层函数:35 / 26
- 锚点:`audioContextService`、`onChannelRecycled`、`effectiveGain`
### `module_54199`(39.8 KB)
- 职责:游戏聊天系统的网络协议编解码模块
- 依赖的模块:`37036`, `24635`, `88693`, `52943`, `61860`
- 顶层类 / 其它顶层函数:37 / 54
- 锚点:`linksWhiteList`、`battleIdHex`、`battleLinks`
### `module_88693`(34.3 KB)
- 职责:网络协议与数据模型层的实现,主要负责处理客户端与服务器之间关于社交、好友、举报、通知权限等非战斗数据的序列化与反序列化,并管理相关的网络路由和回调。
- 依赖的模块:`37036`, `24635`, `52943`, `61860`
- 顶层类 / 其它顶层函数:27 / 49
- 锚点:`Enum item not found for code `、`No enum constant projects.tanks.multiplatform.users.model.keys.KeyTypeEnum.`、`modelRegistry`
### `module_1510`(30.9 KB)
- 职责:库Kotlin/JS 编译的支付/交易协议处理器模块
- 依赖的模块:`37036`, `24635`, `52943`, `61860`
- 顶层类 / 其它顶层函数:31 / 47
- 锚点:`questToAchievementMap`、`itemIdMap`、`Enum item not found for code `
### `module_57128`(29.9 KB)
- 职责:UI 交互与触控/鼠标手势处理模块
- 依赖的模块:`14766`, `32088`, `37036`, `52943`, `31908`, `92980`, `71105`, `7426`, `59131`
- 顶层类 / 其它顶层函数:26 / 13
- 锚点:`Not found icon for `、`getBattleModeLocalizedShortName`、`intertialScroll`
### `module_45686`(15.0 KB)
- 职责:游戏客户端的模型注册与空间(Space)加载系统,用 Kotlin 编写。它负责把服务器下发的模型数据注册到客户端的模型注册表中,并管理"空间"(游戏场景/实例)的加载与切换。
- 依赖的模块:`37036`, `61860`, `29554`, `52943`, `71105`, `24635`
- 顶层类 / 其它顶层函数:3 / 24
- 锚点:`onError`、`gameTypeRegistry`、`modelRegister`
### `module_41164`(13.2 KB)
- 职责:游戏客户端的分析(Analytics)与埋点系统,用 Kotlin 编写。它负责向多个分析平台(Google Analytics、Yandex Metrica、自有分析服务)上报用户行为事件,包括登录、注册、战斗开始、购买、教程进度等。
- 依赖的模块:`37036`, `61430`, `97675`, `52943`
- 顶层类 / 其它顶层函数:8 / 22
- 锚点:`currencyCode`、`ecommerce`、`substage`
### `module_99527`(10.9 KB)
- 职责:Protobuf媒体编解码器 + 时间周期配置 + 参数校验
- 依赖的模块:`37036`, `24635`, `52943`, `61860`
- 顶层类 / 其它顶层函数:20 / 11
- 锚点:`FORBIDDEN`、`Enum item not found for code `、`modelRegistry`
### `module_29554`(9.7 KB)
- 职责:游戏客户端的模型/对象数据加载协议编解码模块
- 依赖的模块:`37036`, `24635`, `61860`, `71105`, `52943`
- 顶层类 / 其它顶层函数:18 / 0
- 锚点:`modelsData`、`modelService`、`_loadDependencies_dependenciesCodec`
### `module_67222`(8.1 KB)
- 职责:社交网络登录与账号绑定的网络协议模块
- 依赖的模块:`37036`, `24635`, `52943`, `61860`
- 顶层类 / 其它顶层函数:19 / 2
- 锚点:`failedRedirectUrl`、`codec_failedRedirectUrl`、`Enum item not found for code `
### `module_85745`(4.0 KB)
- 职责:资源图片帧动画相关的网络序列化 / 反序列化
- 依赖的模块:`37036`, `24635`, `52943`
- 顶层类 / 其它顶层函数:5 / 2
- 锚点:`Enum item not found for code `、` +
this.y1we_1 +
`、` +
this.z1we_1 +
`
### `module_26482`(0.7 KB)
- 职责:Service Worker 注册模块
- 依赖的模块:无(DependsOn 为空)
- 顶层类 / 其它顶层函数:0 / 0
- 锚点:`serviceWorker`、`SW registration failed: `、`manifest`
## 4. 依赖层次(由 DependsOn 计算,非手工绘制)
Level 定义:无依赖 = Level 0,否则 = 1 + 依赖的最大 Level(存在少量循环依赖,回边被递归守卫截断,取近似最长链)。
- **Level 0**(29 个):游戏本体 1 个(`26482`);Kotlin生态库/第三方库 28 个
- **Level 1**(24 个):游戏本体 0 个;Kotlin生态库/第三方库 24 个
- **Level 2**(16 个):游戏本体 1 个(`32088`);Kotlin生态库/第三方库 15 个
- **Level 3**(10 个):游戏本体 0 个;Kotlin生态库/第三方库 10 个
- **Level 4**(5 个):游戏本体 1 个(`9345`);Kotlin生态库/第三方库 4 个
- **Level 5**(3 个):游戏本体 0 个;Kotlin生态库/第三方库 3 个
- **Level 6**(5 个):游戏本体 4 个(`92980`、`55088`、`97675`、`36734`);Kotlin生态库/第三方库 1 个
- **Level 7**(5 个):游戏本体 5 个(`3569`、`61860`、`16100`、`41164`、`85745`);Kotlin生态库/第三方库 0 个
- **Level 8**(8 个):游戏本体 7 个(`71105`、`37504`、`61378`、`88693`、`1510`、`99527`、`67222`);Kotlin生态库/第三方库 1 个
- **Level 9**(6 个):游戏本体 6 个(`36659`、`10283`、`85667`、`31908`、`54199`、`29554`);Kotlin生态库/第三方库 0 个
- **Level 10**(5 个):游戏本体 5 个(`85196`、`89803`、`25377`、`57128`、`45686`);Kotlin生态库/第三方库 0 个
- **Level 11**(2 个):游戏本体 2 个(`85183`、`47243`);Kotlin生态库/第三方库 0 个
- **Level 12**(1 个):游戏本体 1 个(`10032`);Kotlin生态库/第三方库 0 个
- **Level 13**(2 个):游戏本体 2 个(`87072`、`89679`);Kotlin生态库/第三方库 0 个
- **Level 14**(1 个):游戏本体 1 个(`18334`);Kotlin生态库/第三方库 0 个
- **Level 15**(2 个):游戏本体 2 个(`82347`、`70130`);Kotlin生态库/第三方库 0 个
- **Level 16**(1 个):游戏本体 1 个(`21300`);Kotlin生态库/第三方库 0 个
- **Level 17**(1 个):游戏本体 1 个(`13431`);Kotlin生态库/第三方库 0 个
### 4.1 骨架图(Mermaid,节点 = 入度最高的 12 个游戏本体模块 + 入口 `13431`/装配 `18334`,边取自 DependsOn 且两端都在节点集内)
```mermaid
graph LR
N61860["61860"]
N32088["32088"]
N71105["71105"]
N31908["31908"]
N92980["92980"]
N3569["3569"]
N85196["85196"]
N85667["85667"]
N88693["88693"]
N10032["10032"]
N36734["36734"]
N36659["36659"]
N13431["13431"]
N18334["18334"]
N61860 --> N32088
N71105 --> N61860
N71105 --> N92980
N71105 --> N32088
N71105 --> N36734
N31908 --> N88693
N31908 --> N61860
N92980 --> N32088
N3569 --> N32088
N3569 --> N92980
N85196 --> N71105
N85196 --> N85667
N85196 --> N32088
N85196 --> N61860
N85667 --> N71105
N85667 --> N61860
N88693 --> N61860
N10032 --> N31908
N10032 --> N85667
N10032 --> N88693
N10032 --> N85196
N10032 --> N32088
N10032 --> N3569
N10032 --> N36659
N10032 --> N92980
N10032 --> N36734
N10032 --> N61860
N36734 --> N32088
N36659 --> N92980
N36659 --> N71105
N13431 --> N10032
N13431 --> N3569
N13431 --> N92980
N13431 --> N61860
N13431 --> N31908
N13431 --> N85667
N13431 --> N88693
N13431 --> N85196
N13431 --> N36734
N13431 --> N71105
N13431 --> N18334
N13431 --> N36659
N18334 --> N10032
N18334 --> N61860
N18334 --> N85667
N18334 --> N88693
N18334 --> N85196
N18334 --> N32088
N18334 --> N3569
N18334 --> N71105
N18334 --> N92980
N18334 --> N31908
N18334 --> N36734
```
### 4.2 节点对照表
| 节点 | 入度 | 出度 | 职责 |
|---|---|---|---|
| `61860` | 24 | 8 | 网络连接与游戏对象模型的核心模块,Kotlin/JS 编译产物。它把客户端和服务端连接起来,并管理游戏对象的生命周期。 |
| `32088` | 18 | 2 | Alternativa3D,3D 数学库,用 Kotlin 编写 |
| `71105` | 15 | 16 | 游戏资源加载系统(Resource Loader) |
| `31908` | 12 | 5 | 游戏战斗(Battle)域的协议编解码模块 |
| `92980` | 11 | 6 | 使用 WebGL 技术开发的3D 游戏引擎或大型 3D 交互应用的渲染核心模块 |
| `3569` | 8 | 8 | 游戏客户端的输入与坦克预览模块 |
| `85196` | 8 | 7 | 游戏车库(Garage)系统的协议编解码模块,属于同一个坦克对战类游戏。它负责定义和注册与“车库/装备/商店”相关的网络协议消息的二进制编解码器。 |
| `85667` | 8 | 5 | 客户端协议编解码模块 |
| `88693` | 8 | 4 | 网络协议与数据模型层的实现,主要负责处理客户端与服务器之间关于社交、好友、举报、通知权限等非战斗数据的序列化与反序列化,并管理相关的网络路由和回调。 |
| `10032` | 7 | 25 | 游戏客户端核心 Redux 状态管理模块。Redux 架构 |
| `36734` | 7 | 5 | 游戏客户端的音频系统,用 Kotlin 编写。它基于 Web Audio API 实现了完整的音效播放引擎,包括:音频解码、声道管理、优先级调度、3D 空间音效、音量/静音控制、分组增益 |
| `36659` | 6 | 5 | 游戏客户端的纹理/资源注册与加载系统 |
| `13431` | 0 | 46 | Kotlin/JS 编译后的游戏客户端启动入口模块,负责整个游戏的初始化、渲染和启动流程。 |
| `18334` | 3 | 28 | 游戏客户端的总装配/依赖注入模块 |
## 5. 未能确认 / 需注意的点
1. **dir.file 中有两处职责与源码内容不符**(JSON 的 Duty 仍按 dir.file 原样抄录,未擅自改写):
- `module_96480` 标注“Underscore.js 1.13.6”,但源码是 inline-style-prefixer 的 transition 前缀插件(`Webkit`/`Moz` 分支、`-webkit-`/`-moz-` 常量)。
- `module_94965` 标注“ReactHTML HTML 标签构建器”,但源码是两段 UMD 包裹的 underscore 实现(导出映射含 `VERSION`、`restArguments`,字面量 `1.13.6`),且没有任何 `div`/`span` 等 HTML 标签字面量。
2. 6 个模块的 `Anchors` 为空数组(源码里没有可用的稳定字面量,且没有高辨识度标识符):17323、19074、29545、31584、58309、99295。
3. 5 个模块有 require 参数但抽不到依赖:7793、14766、17323、55920、94965。推测是 webpack 模块连接(concatenation)把 require 调用内联消除,或依赖指向资源模块 id(本调研只统计代码模块 id)。
4. DependsOn 只覆盖静态 `i(<id>)` 调用:动态取模块(55920 的 `t.require(n)`)不计入;对 `static/` 资源模块的引用也不计入。
5. 顶层类/函数是按缩进 + 首字母大写的启发式统计(`TopLevelClasses` 不等于真实 Kotlin 类数量,压缩后部分类名非 PascalCase);Kind 中有若干边界判定(如 89679 Google Play 计费、52943 通用工具库、94965)按“代码来源 + 职责”人工定案,规则见 1.1。
6. 分层为最长依赖链的近似值:图中存在循环依赖,回边在递归中被截断,Level 仅供骨架参考。