This commit is contained in:
102
src/data/inventoryEffects.ts
Normal file
102
src/data/inventoryEffects.ts
Normal 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(",")}。`;
|
||||
}
|
||||
Reference in New Issue
Block a user