Files
pixelheros/assets/script/game/common/config/heroUpSet.ts
panFD af4c45dc28 feat(hero card): add upgrade reminder feature
1. 新增英雄升级配置判定模块,封装升级条件校验逻辑
2. 为卡牌组件添加可升级标识节点和刷新逻辑
3. 实现英雄列表面板统一刷新所有卡牌的升级标识
4. 监听英雄成长变更事件实时更新升级提示状态
2026-08-30 23:10:08 +08:00

78 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file heroUpSet.ts
* @description 英雄局外升级规则与判定逻辑(纯逻辑模块,无 UI / 无单例依赖)
*
* 职责:
* 1. 封装 HERO_UPGRADE_NEED_FRAGMENTS 升级消耗表的查询口径(满级判定)。
* 2. 提供"是否可升级"的统一判定,供 smc.upgradeHero / HerosListComp / CardLiteComp 复用。
*
* 关键设计:
* - 不直接引用 smc 单例,由调用方传入成长数据(lv / fragments),保持纯函数可测试。
* - 升级表 key 为目标等级:need = HERO_UPGRADE_NEED_FRAGMENTS[lv + 1],查不到即满级。
*/
import { HERO_UPGRADE_NEED_FRAGMENTS } from "./GameSet";
/** 英雄升级状态快照 */
export interface HeroUpgradeState {
/** 当前局外等级 */
lv: number;
/** 下一级(满级时为当前等级) */
nextLv: number;
/** 当前拥有碎片数 */
fragments: number;
/** 升到下一级所需碎片数(满级为 0) */
needFragments: number;
/** 是否已满级 */
isMaxLv: boolean;
/** 是否满足升级条件(未满级且碎片充足) */
canUpgrade: boolean;
}
/** 英雄最高局外等级(升级表最大 key - 1) */
export const HERO_MAX_LV: number = Math.max(...Object.keys(HERO_UPGRADE_NEED_FRAGMENTS).map(Number)) - 1;
/**
* 查询从当前等级升到下一级所需的碎片数。
* @param lv 当前局外等级
* @returns 所需碎片数;已满级返回 undefined
*/
export function getHeroUpgradeNeedFragments(lv: number): number | undefined {
return HERO_UPGRADE_NEED_FRAGMENTS[lv + 1];
}
/**
* 判断英雄当前等级是否已满级。
* @param lv 当前局外等级
*/
export function isHeroMaxLv(lv: number): boolean {
return getHeroUpgradeNeedFragments(lv) === undefined;
}
/**
* 判断英雄是否满足升级条件(未满级且碎片充足)。
* @param lv 当前局外等级
* @param fragments 当前拥有碎片数
*/
export function canHeroUpgrade(lv: number, fragments: number): boolean {
const need = getHeroUpgradeNeedFragments(lv);
return need !== undefined && fragments >= need;
}
/**
* 汇总英雄升级状态快照(供 UI 一次性取用,避免重复查表)。
* @param lv 当前局外等级
* @param fragments 当前拥有碎片数
*/
export function getHeroUpgradeState(lv: number, fragments: number): HeroUpgradeState {
const need = getHeroUpgradeNeedFragments(lv);
const isMax = need === undefined;
return {
lv,
nextLv: isMax ? lv : lv + 1,
fragments,
needFragments: need ?? 0,
isMaxLv: isMax,
canUpgrade: !isMax && fragments >= (need as number),
};
}