refactor: avoid globalThis

This commit is contained in:
hyper 2026-04-18 14:40:56 +08:00
parent 03add589c6
commit e46822b45b
1 changed files with 20 additions and 22 deletions

View File

@ -9,8 +9,10 @@ import { EffectData } from "@/samples/slay-the-spire-like/system/types";
import { GameCard } from "@/samples/slay-the-spire-like/system/deck"; import { GameCard } from "@/samples/slay-the-spire-like/system/deck";
import { getAdjacentItems } from "@/samples/slay-the-spire-like/system/grid-inventory"; import { getAdjacentItems } from "@/samples/slay-the-spire-like/system/grid-inventory";
import { GameItemMeta } from "@/samples/slay-the-spire-like/system/progress"; import { GameItemMeta } from "@/samples/slay-the-spire-like/system/progress";
import getEffects from "../effect.csv";
export function addEffectTriggers(triggers: Triggers) { export function addEffectTriggers(triggers: Triggers) {
const effects = getEffects();
// ========== instant effects ========== // ========== instant effects ==========
triggers.onEffectApplied.use(async (ctx, next) => { triggers.onEffectApplied.use(async (ctx, next) => {
if (ctx.effect.id === "attack") { if (ctx.effect.id === "attack") {
@ -239,7 +241,7 @@ export function addEffectTriggers(triggers: Triggers) {
if (storm > 0) { if (storm > 0) {
for (let i = 0; i < storm; i++) { for (let i = 0; i < storm; i++) {
await triggers.onEffectApplied.execute(ctx.game, { await triggers.onEffectApplied.execute(ctx.game, {
effect: findEffect(ctx.game, "static"), effect: findEffect("static"),
entityKey: "player", entityKey: "player",
stacks: 1, stacks: 1,
sourceEntityKey: ctx.enemyId, sourceEntityKey: ctx.enemyId,
@ -321,7 +323,7 @@ export function addEffectTriggers(triggers: Triggers) {
const defendNext = ctx.game.value.player.effects.defendNext; const defendNext = ctx.game.value.player.effects.defendNext;
if (defendNext && defendNext.stacks > 0) { if (defendNext && defendNext.stacks > 0) {
await ctx.game.produceAsync(draft => { await ctx.game.produceAsync(draft => {
addEntityEffect(draft.player, findEffect(ctx.game, "defend"), defendNext.stacks); addEntityEffect(draft.player, findEffect("defend"), defendNext.stacks);
addEntityEffect(draft.player, defendNext.data, -defendNext.stacks); addEntityEffect(draft.player, defendNext.data, -defendNext.stacks);
}); });
} }
@ -386,7 +388,7 @@ export function addEffectTriggers(triggers: Triggers) {
const rollDamage = Math.floor(roll / 10) * 10; const rollDamage = Math.floor(roll / 10) * 10;
ctx.amount += rollDamage; ctx.amount += rollDamage;
await ctx.game.produceAsync(draft => { await ctx.game.produceAsync(draft => {
addEntityEffect(draft.player, findEffect(ctx.game, "roll"), -rollDamage); addEntityEffect(draft.player, findEffect("roll"), -rollDamage);
}); });
} }
} }
@ -419,7 +421,7 @@ export function addEffectTriggers(triggers: Triggers) {
if (consumed > 0) { if (consumed > 0) {
await ctx.game.produceAsync(draft => { await ctx.game.produceAsync(draft => {
const e = getCombatEntity(draft, ctx.entityKey); const e = getCombatEntity(draft, ctx.entityKey);
if (e) addEntityEffect(e, findEffect(ctx.game, "charge"), -consumed); if (e) addEntityEffect(e, findEffect("charge"), -consumed);
}); });
} }
} }
@ -438,7 +440,7 @@ export function addEffectTriggers(triggers: Triggers) {
if (consumed > 0) { if (consumed > 0) {
await ctx.game.produceAsync(draft => { await ctx.game.produceAsync(draft => {
const a = getCombatEntity(draft, ctx.sourceEntityKey!); const a = getCombatEntity(draft, ctx.sourceEntityKey!);
if (a) addEntityEffect(a, findEffect(ctx.game, "charge"), -consumed); if (a) addEntityEffect(a, findEffect("charge"), -consumed);
}); });
} }
} }
@ -526,32 +528,28 @@ export function addEffectTriggers(triggers: Triggers) {
if (!attacker || !("enemy" in attacker) || attacker.enemy.id !== "秃鹫") return; if (!attacker || !("enemy" in attacker) || attacker.enemy.id !== "秃鹫") return;
await triggers.onEffectApplied.execute(ctx.game, { await triggers.onEffectApplied.execute(ctx.game, {
effect: findEffect(ctx.game, "vultureEye"), effect: findEffect("vultureEye"),
entityKey: "player", entityKey: "player",
stacks: 1, stacks: 1,
sourceEntityKey: ctx.sourceEntityKey, sourceEntityKey: ctx.sourceEntityKey,
}); });
}); });
}
function getAllEnemyData(game: CombatGameContext) { function getAllEnemyData(game: CombatGameContext) {
const seen = new Set<string>(); const seen = new Set<string>();
const result: typeof game.value.enemies[number]["enemy"][] = []; const result: typeof game.value.enemies[number]["enemy"][] = [];
for (const enemy of game.value.enemies) { for (const enemy of game.value.enemies) {
if (!seen.has(enemy.enemy.id)) { if (!seen.has(enemy.enemy.id)) {
seen.add(enemy.enemy.id); seen.add(enemy.enemy.id);
result.push(enemy.enemy); result.push(enemy.enemy);
}
} }
return result;
} }
return result;
}
function findEffect(game: CombatGameContext | { value: CombatGameContext["value"] }, id: string): EffectData { function findEffect(id: string): EffectData {
const value = "value" in game ? game.value : game; const found = effects.find((e: EffectData) => e.id === id);
const dataModule = (globalThis as any).__desertEffects;
if (dataModule) {
const found = dataModule.find((e: EffectData) => e.id === id);
if (found) return found; if (found) return found;
return { id, name: id, description: "", lifecycle: "instant" } as EffectData;
} }
return { id, name: id, description: "", lifecycle: "instant" } as EffectData;
} }