Files
noname-shuying/mengsan/monsters/phrog-battle.js
T
Diuse d0e0792538 fixed # 补全梦三怪物、卡牌
fixed # 修复天书乱斗中,过关技能不会重置次数的问题
2026-10-03 04:42:19 +08:00

39 lines
2.1 KiB
JavaScript

import { INFESTED_COUNT, isPhrog, WRIGGLER_CHARACTER } from "./phrog-intent.js";
// 死亡钩子被原生die事件await;所有衍生物入场后才继续原伤害/卡牌结算。
export function createPhrogBattle(game, current, spawn) {
const consumed = new WeakSet();
let pending = 0, sequence = 0;
const controller = {
get pending() {
// 原生die先移入dead,再调整负生命至0,最后才调用dieAfter。
// changeHpAfter可能在这段间隙检查胜利;死体本身也须预留亡语。
return pending > 0 || current.session.active && game.dead.some(player =>
current.players.has(player) && isPhrog(player) && !consumed.has(player) &&
player.storage.mengsanInfested_shuying === INFESTED_COUNT);
},
async onDeath(player) {
if (!current.session.active || !isPhrog(player) || player.isAlive() ||
!current.players.has(player) || consumed.has(player)) return false;
const count = player.storage.mengsanInfested_shuying ?? 0;
if (count !== INFESTED_COUNT) throw new RangeError("寄生物召唤配置无效");
if (game.players.length + game.dead.length + count > 8) throw new Error("异蛙寄生虫召唤席位不足");
if (!Number.isSafeInteger(sequence + 1)) throw new RangeError("寄生物召唤序号溢出");
consumed.add(player); pending++;
const group = ++sequence;
try {
let anchor = player;
for (let position = 1; position <= count; position++) {
if (!current.session.active) break;
anchor = await spawn({ id: `wriggler_${player.playerid}_${group}_${position}`,
character: WRIGGLER_CHARACTER, camp: "enemy", inheritSkills: false,
hand: 4, wrigglerPosition: position, wrigglerSpawned: true }, anchor);
}
return true;
} finally { pending--; }
},
};
current.session.ownResource(controller, () => { if (current.phrog === controller) delete current.phrog; });
return controller;
}