poi-plugin-kancolle-tasks 1.8.3 → 1.8.4
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 +2 -1
- package/assets/tasks.html +2 -2
- package/index.js +52 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
- 普通浏览器离线打开时只显示需要准备的数量,不做库存判断
|
|
20
20
|
- 出击海域链内联 **NGA 推荐编成**(已去重精简:任务官方编成要求统一显示在表格「编成要求」列;NGA 块的通用「制空略高」与重复「与某图同图」套话不显示;高速/低速/索敌等硬性要求只在编成串内红色标出、不另行重复)。任务行**行首海域列**把海域编号做成金色高亮胶囊(v1.8.1,如 `2-4`),NGA 单元格内不再重复该编号
|
|
21
21
|
- **使用说明在页面底部**(默认收起),完整介绍销账 / 计数 / 折叠 / 搜索跳转 / 月份筛选 / 游戏联动各功能;不带插件的纯 HTML 打开也能用全部手动功能
|
|
22
|
-
- 窗口大小 /
|
|
22
|
+
- 窗口大小 / 位置记忆(拖到哪、拉到多大,下次打开原样恢复);插件窗口是**平等的独立窗口**——不与 POI 主窗口绑定层级,不会一直压着 POI,也不会在点 POI 时被一起置顶盖住别的程序(v1.8.4);POI 退出时随之关闭,不残留窗口或进程
|
|
23
23
|
- **与游戏实时关联**(需在 POI 里打开游戏并进母港一次):
|
|
24
24
|
- 每个任务名后自动挂状态徽标:`受注中(带 n/m 合计进度)` / `已达成·待报告` / `可接取` / `未开放或已清`,行底色同步(周常任务同样实时挂徽标)
|
|
25
25
|
- 徽标计数按**全部子目标合计**显示:单目标任务如 `受注中 1/3`;多海域 / 多次数任务如 Bq8=`受注中 3/12`(4 个海域各 3 次,POI 自动累计到哪一格都算在内)
|
|
@@ -131,6 +131,7 @@ node ./scripts/update-asset.js D:\path\to\任务.html
|
|
|
131
131
|
|
|
132
132
|
## 更新记录
|
|
133
133
|
|
|
134
|
+
- **v1.8.4**:**修复窗口层级问题(玩家反馈)**——此前插件窗口被设为 POI 主窗口的**子窗口**(`parent`),在 Windows 上有两个副作用:① 窗口永远压在 POI 之上,遮挡 POI 界面;② 点击 POI 主窗口时整个子窗口组被一起前置,顺带盖住其它程序。现在**不再设置 `parent`**,插件窗口与 POI 主窗口是彼此平等的独立窗口(谁在前由最后一次点击决定),POI 官方对插件窗口默认也是这个做法。为避免去掉 `parent` 后窗口拖住进程(POI 靠 `window-all-closed` 退出,多一个窗口会导致 `poi.exe` 残留、且单实例锁让下次启动直接失败),窗口改由 **POI 自带的窗口管理器**创建,从而登记进 POI 的窗口列表,**POI 退出时随之关闭**;万一取不到该内部模块(未来 POI 改结构),会自动回退为原生窗口并尽力跟随主窗口关闭。功能与数据无任何改动。
|
|
134
135
|
- **v1.8.3**:**收录 2026-09-10 游戏更新新增的 2 个出击年常**(任务总数 112→114,出击海域链 37→39)——① **By17「第九战队」拔锚!向前线展开!**(年常·9月,quest 1050):北上改二/改三 与 大井改二(旗舰及随伴舰)+ 驱逐舰 2,出击 1-4 / 2-1 / 2-2 / 2-3 BOSS 各 1 次 S 胜,行内含编成核对(北上/大井需改二以上,素体不放行);② **By18 改装「1YB3H」旗舰,突破敌阵!**(年常·8月,quest 1051):山城改二补 旗舰 + 扶桑或时雨 + 最上/满潮/朝云/山云 中 2 只,出击 1-5 / 2-3 / 2-5 / 4-3 BOSS 各 1 次 A 胜以上 + 1-6 到达终点,已接入编成核对;③ 引擎支持 2026 新增的「改二补」形态后缀(如 山城改二补 / 凉波改二补)正确解析为基础名 + 改二档,年常月份选择器新增 8 月分组(默认当月 9 月时该组自动收起,切「8 月」或「全部」可见)。注:同年更新的常驻单次任务 B217(改装多用途搭载母舰「北上改三」出击)与 F143(既存装备活用·对空兵装开发,工厂)非周期任务,未纳入本表。
|
|
135
136
|
- **v1.8.2**:**安装方式更新**(插件功能无改动)——以上「安装」章节改为以**从 npm 安装**为主(POI 设置 → 插件 → 输入包名 `poi-plugin-kancolle-tasks` → 安装),并补充换 npmmirror 源与离线 `.tgz` 安装两条备用路径;原「手动拷文件夹」方式标注为**不推荐**,因为 POI 开着「自动更新插件」时会做一次 npm 依赖整理,把未登记在 `plugins/package.json` 依赖清单里的手拷插件当成多余包删除(表现为"插件突然不见了")。本插件已发布到 npm:<https://www.npmjs.com/package/poi-plugin-kancolle-tasks>。
|
|
136
137
|
- **v1.8.1**:① 主表任务行**行首海域列的海域编号改为金色高亮胶囊**(与接取弹窗同一视觉语言,一眼看到每行要打哪张图),同时 **NGA 推荐编成单元格里不再重复显示该海域编号**(此前该格有一个与行首相同的蓝色小块,删掉避免同排"2-4 2-4 2CVL…"式重复);② **单图任务逐场计数兜底**:像 Bq1(冲之岛 2-4 S×2,quest 822)这类单图任务的游戏记录子目标不带 `@地图码` 尾缀,此前"达成条件"格的 `0/2` 一直不走、只有任务名后的徽标在动——现在页面只有 1 个海域格且记录只有 1 个计数子目标时会把计数同步进该格(打一场自动变 `1/2`、满 `2/2` 自动勾绿;多图任务仍按 `@尾缀` 精确对应,不受影响)。
|
package/assets/tasks.html
CHANGED
|
@@ -924,7 +924,7 @@ body.dark .rsTip{color:#d8b56a}
|
|
|
924
924
|
|
|
925
925
|
<h3>⑦ 数据说明</h3>
|
|
926
926
|
<ul>
|
|
927
|
-
<li>页面与插件版本号 <b>v1.8.
|
|
927
|
+
<li>页面与插件版本号 <b>v1.8.4</b>(显示在右上角标题旁),由插件 package.json 同一来源生成,改版不会漏同步。</li>
|
|
928
928
|
<li>任务编号 / 名称 / 达成条件与前置数据参考自<b>舰娘百科(zh.kcwiki.cn「任务」页)</b>,出击海域推荐编成参考自<b>NGA「梦美的常规图带路 & 出击配置 v3.0」</b>(快照日期见构建脚本);游戏更新后新任务可能滞后出现,以游戏内为准。</li>
|
|
929
929
|
<li>出击周常 10 个(Bw1~Bw10)仅收录“确实会在页面渲染”的任务,随 wiki 快照更新。</li>
|
|
930
930
|
</ul>
|
|
@@ -1110,7 +1110,7 @@ body.dark .rsTip{color:#d8b56a}
|
|
|
1110
1110
|
// 任何任务只要在页面上留下勾选 / 计数,就把“它所属的那个周期”记到 cyc[任务编号];
|
|
1111
1111
|
// 本机时间跨过日切后(该任务已进入新一期),自动清空它的旧记录 → 新一期可重新勾选,
|
|
1112
1112
|
// 不必为了清周常而把月常 / 季常一起全量重置。
|
|
1113
|
-
var APPVER='1.8.
|
|
1113
|
+
var APPVER='1.8.4';
|
|
1114
1114
|
var CLK={ now:null }; // 测试可注入当前时间:CLK.now = new Date(...)
|
|
1115
1115
|
function clockNow(){ return CLK.now ? new Date(CLK.now.getTime()) : new Date(); }
|
|
1116
1116
|
function pad2(n){ return (n<10?'0':'')+n; }
|
package/index.js
CHANGED
|
@@ -269,6 +269,45 @@ function ensureSnapshotLoop() {
|
|
|
269
269
|
dlog('游戏快照轮询已启动');
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
// 创建插件窗口
|
|
274
|
+
//
|
|
275
|
+
// 优先交给 POI 自带的窗口管理器(lib/window)创建:
|
|
276
|
+
// - 窗口会被登记进 POI 的窗口列表,主窗口关闭时由 closeWindows() 一并关闭,
|
|
277
|
+
// 不会出现「关掉 POI 还留着窗口 → window-all-closed 不触发 → poi.exe 残留」;
|
|
278
|
+
// - 这条路 **不设 parent**,避免本窗口成为 POI 主窗口的 owned window(见下)。
|
|
279
|
+
// 若拿不到 POI 内部模块(版本差异),回退为原生 BrowserWindow,
|
|
280
|
+
// 并尽量跟随主窗口关闭。
|
|
281
|
+
// ---------------------------------------------------------------------------
|
|
282
|
+
function createPluginWindow(remote, opts) {
|
|
283
|
+
try {
|
|
284
|
+
const wm = remote.require('./lib/window');
|
|
285
|
+
if (wm && typeof wm.createWindow === 'function') {
|
|
286
|
+
const w = wm.createWindow(opts);
|
|
287
|
+
dlog('窗口创建方式: POI windowManager(无 parent,随 POI 退出自动关闭)');
|
|
288
|
+
return w;
|
|
289
|
+
}
|
|
290
|
+
dlog('POI windowManager 未提供 createWindow → 回退原生创建');
|
|
291
|
+
} catch (e) {
|
|
292
|
+
dlog('调用 POI windowManager 失败 → 回退原生创建: ' + (e && e.message || e));
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const w = new remote.BrowserWindow(opts);
|
|
296
|
+
// 兜底:主窗口关闭时把本窗口也关掉(renderer 尚存活时有效)
|
|
297
|
+
try {
|
|
298
|
+
const cur = remote.getCurrentWindow && remote.getCurrentWindow();
|
|
299
|
+
if (cur && !cur.isDestroyed()) {
|
|
300
|
+
cur.once('closed', function () {
|
|
301
|
+
try { if (w && !w.isDestroyed()) w.close(); } catch (e2) { /* 忽略 */ }
|
|
302
|
+
});
|
|
303
|
+
dlog('已注册主窗口 closed 兜底关闭');
|
|
304
|
+
}
|
|
305
|
+
} catch (e3) {
|
|
306
|
+
dlog('注册主窗口 closed 兜底失败: ' + (e3 && e3.message || e3));
|
|
307
|
+
}
|
|
308
|
+
return w;
|
|
309
|
+
}
|
|
310
|
+
|
|
272
311
|
// ---------------------------------------------------------------------------
|
|
273
312
|
// 核心:点击插件时创建/唤起窗口
|
|
274
313
|
// ---------------------------------------------------------------------------
|
|
@@ -300,14 +339,15 @@ exports.handleClick = function handleClick() {
|
|
|
300
339
|
backgroundColor: '#1f2328',
|
|
301
340
|
webPreferences: { nodeIntegration: true, contextIsolation: false },
|
|
302
341
|
};
|
|
303
|
-
//
|
|
304
|
-
//
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
342
|
+
// ---- 窗口层级(2026-09-12 修复玩家反馈)--------------------------------
|
|
343
|
+
// 早期版本这里设了 parent = POI 主窗口,使本窗口成为它的 owned window。
|
|
344
|
+
// Windows 上 owned window 有两条硬性语义,正是玩家反馈的两个现象:
|
|
345
|
+
// ① 永远压在 owner(POI 主窗口)之上 → 遮挡 POI 界面;
|
|
346
|
+
// ② owner 被激活时整组一并前置 → 点 POI 时本窗口被同步置顶,盖住其它程序。
|
|
347
|
+
// 因此这里不再设 parent。POI 官方对插件窗口(window.open 路径)默认同样不设,
|
|
348
|
+
// 仅当用户主动「钉住」时才设。
|
|
349
|
+
// 代价是窗口不再随 POI 退出自动关闭,所以改由 POI 的窗口管理器创建窗口,
|
|
350
|
+
// 让它登记进 POI 的窗口列表,主窗口关闭时被 closeWindows() 一并关掉。
|
|
311
351
|
if (typeof st.x === 'number' && typeof st.y === 'number') {
|
|
312
352
|
let onScreen = false;
|
|
313
353
|
try {
|
|
@@ -320,9 +360,12 @@ exports.handleClick = function handleClick() {
|
|
|
320
360
|
} catch (e) { onScreen = false; }
|
|
321
361
|
if (onScreen) { opts.x = st.x; opts.y = st.y; }
|
|
322
362
|
}
|
|
363
|
+
// realClose:关闭即真的销毁(交给 POI 的 createWindow 识别),
|
|
364
|
+
// 不用它的「关闭仅隐藏」行为,避免残留隐藏窗口。
|
|
365
|
+
opts.realClose = true;
|
|
323
366
|
dlog('窗口参数: ' + JSON.stringify(opts));
|
|
324
367
|
|
|
325
|
-
pluginWindow =
|
|
368
|
+
pluginWindow = createPluginWindow(remote, opts);
|
|
326
369
|
pluginWindow.setMenuBarVisibility(false);
|
|
327
370
|
const url = pathToFileURL(ASSET_PATH).href;
|
|
328
371
|
dlog('加载 URL: ' + url);
|
package/package.json
CHANGED