poi-plugin-gimmick-tracker 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/i18n/zh-CN.json +35 -0
- package/index.js +1405 -0
- package/index.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# poi-plugin-gimmick-tracker
|
|
2
|
+
|
|
3
|
+
面向 poi 11.1.0 的舰队 Collection 活动图机关条件追踪 MVP。插件平时只在后台记录当前出击事实;只有检测到机关变化信号时才聚焦内嵌页签,展示待确认卡片。插件不使用独立窗口,不联网,也不依赖 `poi-plugin-battle-detail` 的战斗分组。
|
|
4
|
+
|
|
5
|
+
## 能做什么
|
|
6
|
+
|
|
7
|
+
- 直接监听 `window` 的 `game.response`,记录 `/api_req_map/start`、`next`、`air_raid` 路线。
|
|
8
|
+
- 直接覆盖 sortie / combined battle 的 `battle`、`airbattle`、`ld_airbattle`、`night_to_day`、`sp_midnight`、`midnight` 等响应,并由 `battleresult` 补充胜利 Rank。
|
|
9
|
+
- 观测节点到达、节点胜利、`api_kouku.api_stage1.api_disp_seiku` 节点制空,以及 `api_destruction_battle` 基地防空制空;路线明确标出 `ld_airbattle` 舰队空袭和基地防空,并保存时间戳与 API 路径引用。
|
|
10
|
+
- 从 FCD `fcd.map["<area>-<map>"].route[api_no][1]` 解析 `D`、`A2` 等节点标签;数据缺失时显示 `#<api_no>`,不会令监听器崩溃。
|
|
11
|
+
- 支持粘贴 `D点S胜2次`、`C2点到达2次`、`A2点空优1次`、`守家空优2次`,可用中英文逗号、分号、空格混排。
|
|
12
|
+
- 按海域显示事实观测数与人工确认状态。`A胜` 接受 A/S/SS,`S胜` 接受 S/SS;制空条件按“达到或优于”匹配,例如空确也满足空优。
|
|
13
|
+
- 待确认卡片左侧显示本次完整路线和触发时间,右侧下拉选择本次完成条件;按海域的清单会保留该图上一次触发出击的路线。
|
|
14
|
+
|
|
15
|
+
## 触发与确认语义
|
|
16
|
+
|
|
17
|
+
主信号是 `/kcsapi/api_port/port` 的 `body.api_event_object.api_m_flag2 === 1`。辅助信号包括任意 `*/battleresult` 的 `body.api_m2 === 1`,以及 `start` / `next` / `air_raid` 中对象或数组形态 `api_destruction_battle` 元素的 `api_m2 === 1`。
|
|
18
|
+
|
|
19
|
+
同一 sortie 只生成一张 review;辅助信号可先创建 pending,回港事件再封存完整快照。确认攻略 condition 只设置 `confirmed` / `confirmedAt`,不会把事实观测数再加一次。只有该海域没有攻略 condition 时,确认观测候选才生成自由完成记录。
|
|
20
|
+
|
|
21
|
+
如果插件在出击中途才加载,可能只收到带 `m_flag2` 的回港响应。此时仍会生成 pending 并聚焦,但路线为空且明确标记“未捕获到完整出击”,不会静默漏记。
|
|
22
|
+
|
|
23
|
+
## 本地数据与生命周期
|
|
24
|
+
|
|
25
|
+
状态按宿主 store 中的 `info.basic.api_member_id` 分开保存:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
<window.APPDATA_PATH>/gimmick-tracker/<memberId>/state-v1.json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
JSON 含 `schemaVersion`,写入采用同目录临时文件加 rename。memberId 未知或非法时不会创建目录,JSON 内也不重复保存 memberId。插件只保存地图、节点、Rank、制空、时间戳和用户确认状态,不保存 API token、舰队、装备或其他账号内容,不发起网络请求。
|
|
32
|
+
|
|
33
|
+
监听器在模块级 controller 中管理:`pluginDidLoad` 幂等注册一次,`pluginWillUnload` 对称移除;热重载不会在同一模块实例内重复监听。
|
|
34
|
+
|
|
35
|
+
自动聚焦优先使用 poi 11.1.0 从 `views/env` 暴露的 `ipc.access('MainWindow').ipcFocusPlugin(id)`,随后才尝试 deprecated `window.ipc`。IPC 不可用时按单栏/双栏布局 dispatch 新 shape `@@TabSwitch`;再失败只调用 `window.success`。所有路径都被隔离,宿主异常不会中断事件处理。
|
|
36
|
+
|
|
37
|
+
## 开发与验收
|
|
38
|
+
|
|
39
|
+
```powershell
|
|
40
|
+
npm install
|
|
41
|
+
npm test
|
|
42
|
+
npm run typecheck
|
|
43
|
+
npm run build
|
|
44
|
+
npm pack --dry-run
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
React 18、ReactDOM 和 Blueprint 5 都是 peer dependency,并在 CJS 构建中 external;安装进 poi 后复用宿主实例,不打包第二份 React。
|
package/i18n/zh-CN.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"机关条件追踪器": "机关条件追踪器",
|
|
3
|
+
"记录出击路线并在机关触发后请用户确认完成条件": "记录出击路线并在机关触发后请用户确认完成条件",
|
|
4
|
+
"title": "机关条件追踪器",
|
|
5
|
+
"subtitle": "平时安静记录;检测到机关变化后才请你确认。数据只保存在本机。",
|
|
6
|
+
"activeMap": "当前海域",
|
|
7
|
+
"pendingReviews": "待确认触发",
|
|
8
|
+
"pending": "待确认",
|
|
9
|
+
"noPending": "暂无待确认触发。普通出击不会自动切换到本页。",
|
|
10
|
+
"unknownMap": "未知海域",
|
|
11
|
+
"route": "本次路线",
|
|
12
|
+
"incompleteRoute": "未捕获到完整出击:插件可能在出击中途加载,或仅收到了回港信号。",
|
|
13
|
+
"emptyRoute": "没有可显示的节点路线。",
|
|
14
|
+
"candidates": "这次完成了哪一项?",
|
|
15
|
+
"chooseCandidate": "请选择本次完成条件(● 表示本次有直接证据)",
|
|
16
|
+
"noCandidates": "没有足够事实生成候选;可忽略本次,或先导入攻略条件后再观察下一次出击。",
|
|
17
|
+
"matchedThisSortie": "本次有证据",
|
|
18
|
+
"confirm": "确认完成",
|
|
19
|
+
"ignore": "忽略本次",
|
|
20
|
+
"ignored": "已忽略",
|
|
21
|
+
"guide": "导入攻略条件",
|
|
22
|
+
"guidePlaceholder": "例如:D点S胜2次;C2点到达2次 A2点空优1次,守家空优2次",
|
|
23
|
+
"import": "导入到当前海域",
|
|
24
|
+
"importNeedMap": "尚未识别当前海域,请先捕获一次地图出击。",
|
|
25
|
+
"importSuccess": "已识别 {count} 条条件。",
|
|
26
|
+
"noMatch": "未识别到受支持的条件格式。",
|
|
27
|
+
"completed": "按海域的上次触发与完成清单",
|
|
28
|
+
"lastTriggeredSortie": "上一次触发出击",
|
|
29
|
+
"triggerHistory": "每次机关触发出击",
|
|
30
|
+
"noCompleted": "尚未导入攻略条件,也没有自由完成记录。",
|
|
31
|
+
"observed": "观测",
|
|
32
|
+
"confirmed": "已确认",
|
|
33
|
+
"unconfirmed": "未确认",
|
|
34
|
+
"freeRecord": "无攻略时的自由记录"
|
|
35
|
+
}
|