Files
noname-shuying/mengsan/monsters/vine-tangled.js
T
Diuse 9e1732d2f8 fixed # 补全部分卡牌
fixed # 修复部分已知BUG
2026-10-04 19:32:38 +08:00

42 lines
2.2 KiB
JavaScript

import { consumeArtifact } from "./artifact-status.js";
import { cardDefinitions } from "../cards/card-definitions.js";
const KEY = "mengsanTangled_shuying";
const SKILL = "mengsan_tangled_shuying";
// 原版攻击分类优先;未配置类型的旧牌及原生攻击锦囊保留兼容判断。
const nativeAttacks = new Set(["nanman", "wanjian", "huogong"]);
export const isAttackCard = card => {
if (!card) return false;
const definition = Object.hasOwn(cardDefinitions, card.name) ? cardDefinitions[card.name] : null;
return definition?.cardType ? definition.cardType === "attack" :
nativeAttacks.has(card.name) || definition?.category === "damage";
};
const clear = target => { delete target.storage[KEY]; target.removeSkill(SKILL); };
const turnsOf = target => {
const turns = target.storage?.[KEY] ?? 0;
if (!Number.isSafeInteger(turns) || turns < 0) throw new RangeError("缠结持续回合无效");
return turns;
};
export function applyTangled(current, target, turns) {
if (!current?.session.active || !target.isAlive() || !current.players.has(target)) return false;
if (!Number.isSafeInteger(turns) || turns < 1) throw new RangeError("缠结回合数必须为正整数");
const total = turnsOf(target) + turns;
if (!Number.isSafeInteger(total)) throw new RangeError("缠结回合数溢出");
if (consumeArtifact(target)) return false;
if (!current.tangledTargets) {
const targets = current.tangledTargets = new Set();
current.session.ownResource(targets, () => {
for (const target of targets) clear(target);
targets.clear(); delete current.tangledTargets;
});
}
current.tangledTargets.add(target); target.storage[KEY] = total;
target.addSkill(SKILL); target.markSkill(SKILL); current.handUI?.refresh(); return true;
}
export function advanceTangled(current, target) {
if (!current?.session.active || !current.tangledTargets?.has(target)) return;
const remaining = Math.max(0, turnsOf(target) - 1);
if (remaining) { target.storage[KEY] = remaining; target.markSkill(SKILL); }
else { current.tangledTargets.delete(target); clear(target); }
current.handUI?.refresh();
}