mirror of
https://github.com/Shu-Ying/noname-shuying.git
synced 2026-10-17 20:59:58 +08:00
76 lines
3.8 KiB
JavaScript
76 lines
3.8 KiB
JavaScript
import { EYE_CHARACTER, isFogmog, isToothedEye } from "./fogmog-intent.js";
|
|
import { createDazedData } from "../cards/status-cards.js";
|
|
import { getIntentHostiles } from "../battle/intent-effects.js";
|
|
|
|
// 生命周期属于单场战斗;复活复用原席位,不追加玩家或定时器。
|
|
export function createFogmogBattle(game, current, spawn) {
|
|
const owners = new Map(), eyes = new Map(), pending = new Map();
|
|
let round = 0, sequence = 0, cardSequence = 0;
|
|
const active = () => current.session.active;
|
|
const canAct = player => active() && player.isAlive() &&
|
|
(isFogmog(player) || isToothedEye(player) && eyes.get(player)?.isAlive());
|
|
current.session.ownResource(owners, () => { owners.clear(); eyes.clear(); pending.clear(); });
|
|
return {
|
|
canAct,
|
|
register(player, spec) {
|
|
if (!isToothedEye(player)) return;
|
|
const owner = game.players.find(p => p.playerid === spec.fogmogOwner && isFogmog(p));
|
|
if (!owner || owners.has(owner)) throw new Error("利齿之眼缺少唯一雾菇召唤者");
|
|
owners.set(owner, player); eyes.set(player, owner);
|
|
player.storage.mengsanFogmogOwner_shuying = owner.playerid;
|
|
player.addSkill("mengsan_fogmog_illusion_shuying");
|
|
player.markSkill("mengsan_fogmog_illusion_shuying");
|
|
},
|
|
async summon(owner) {
|
|
if (!canAct(owner) || !isFogmog(owner) || owners.has(owner)) return;
|
|
if (game.players.length + game.dead.length >= 8) throw new Error("雾菇召唤需要一个空席位");
|
|
await spawn({ id: `fogmog_eye_${++sequence}`, character: EYE_CHARACTER,
|
|
camp: "enemy", tier: "normal", hp: 6, maxHp: 6, hand: 0,
|
|
inheritSkills: false, fogmogOwner: owner.playerid }, owner);
|
|
},
|
|
distract(source) {
|
|
if (!canAct(source)) return;
|
|
for (const target of getIntentHostiles(game, source)) {
|
|
const pile = target === game.me ? current.personalPiles : current.monsterPiles.get(target);
|
|
if (!pile) continue; // 无个人牌堆的剧情援军不向公共牌堆塞入状态牌。
|
|
for (let index = 0; index < 3 && canAct(source); index++) {
|
|
pile.addToDiscard(createDazedData(`dazed_${source.playerid}_${++cardSequence}`));
|
|
}
|
|
game.log(target, "的个人弃牌堆加入3张【晕眩】");
|
|
}
|
|
},
|
|
onDeath(player) {
|
|
if (eyes.has(player)) {
|
|
if (eyes.get(player).isAlive()) pending.set(player, round + 1);
|
|
player.storage.mengsanFogmogIntent_shuying = null;
|
|
game.mengsanSetEnemyIntent_shuying(player, null);
|
|
}
|
|
if (owners.has(player)) {
|
|
const eye = owners.get(player);
|
|
pending.delete(eye);
|
|
eye.storage.mengsanFogmogIntent_shuying = null;
|
|
game.mengsanSetEnemyIntent_shuying(eye, null);
|
|
}
|
|
},
|
|
beforeRound() {
|
|
if (!active()) return;
|
|
round++;
|
|
for (const [eye, due] of pending) {
|
|
const owner = eyes.get(eye);
|
|
if (!owner?.isAlive()) { pending.delete(eye); continue; }
|
|
if (round < due) continue;
|
|
pending.delete(eye);
|
|
if (!eye.isAlive()) {
|
|
eye.revive(6, false);
|
|
eye.hujia = 0;
|
|
eye.storage.mengsanEnergy_shuying = eye.storage.mengsanMaxEnergy_shuying;
|
|
eye.addSkill("mengsan_fogmog_illusion_shuying");
|
|
eye.markSkill("mengsan_fogmog_illusion_shuying");
|
|
eye.update();
|
|
game.log(eye, "以6点生命复活");
|
|
}
|
|
}
|
|
},
|
|
};
|
|
}
|