mirror of
https://github.com/Shu-Ying/noname-shuying.git
synced 2026-10-11 11:30:01 +08:00
42 lines
2.2 KiB
JavaScript
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();
|
|
}
|