init with react+axum+spacetimedb
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
2026-04-26 18:06:23 +08:00
commit cbc27bad4a
20199 changed files with 883714 additions and 0 deletions

View File

@@ -0,0 +1,102 @@
import { Character, InventoryItem, TimedBuildBuff } from "../types";
export type InventoryUseEffect = {
hpRestore: number;
manaRestore: number;
cooldownReduction: number;
buildBuffs: TimedBuildBuff[];
};
function getRarityMultiplier(rarity: InventoryItem["rarity"]) {
switch (rarity) {
case "legendary":
return 2.4;
case "epic":
return 1.9;
case "rare":
return 1.55;
case "uncommon":
return 1.2;
default:
return 1;
}
}
export function isInventoryItemUsable(item: InventoryItem) {
return (
Boolean(item.useProfile) ||
item.tags.includes("healing") ||
item.tags.includes("mana")
);
}
export function resolveInventoryItemUseEffect(
item: InventoryItem,
character: Character,
): InventoryUseEffect | null {
if (!isInventoryItemUsable(item)) return null;
if (item.useProfile) {
return {
hpRestore: item.useProfile.hpRestore ?? 0,
manaRestore: item.useProfile.manaRestore ?? 0,
cooldownReduction: item.useProfile.cooldownReduction ?? 0,
buildBuffs: item.useProfile.buildBuffs ?? [],
};
}
const rarityMultiplier = getRarityMultiplier(item.rarity);
const hasHealing =
item.tags.includes("healing") ||
/药|包|补给|恢复|疗伤|meat|apple|mushroom|water/i.test(item.name);
const hasMana =
item.tags.includes("mana") ||
/灵液|法力|mana|crystal|essence|spirit/i.test(item.name);
const hpRestore = hasHealing
? Math.max(
10,
Math.round((14 + character.attributes.spirit * 1.4) * rarityMultiplier),
)
: 0;
const manaRestore = hasMana
? Math.max(
8,
Math.round(
(12 + character.attributes.intelligence * 1.4) * rarityMultiplier,
),
)
: 0;
const cooldownReduction = /凝神|回气|醒神|booster|essence/i.test(item.name)
? 1
: 0;
if (hpRestore <= 0 && manaRestore <= 0 && cooldownReduction <= 0) {
return null;
}
return {
hpRestore,
manaRestore,
cooldownReduction,
buildBuffs: [],
};
}
export function buildInventoryUseResultText(
item: InventoryItem,
effect: InventoryUseEffect,
) {
const parts = [
effect.hpRestore > 0 ? `恢复 ${effect.hpRestore} 点气血` : null,
effect.manaRestore > 0 ? `恢复 ${effect.manaRestore} 点灵力` : null,
effect.cooldownReduction > 0
? `额外推进 ${effect.cooldownReduction} 回合冷却`
: null,
effect.buildBuffs.length > 0
? `获得 ${effect.buildBuffs.map(buff => buff.name).join("、")}`
: null,
].filter(Boolean);
return `你取出${item.name}立刻使用,${parts.join("")}`;
}