1. 新建SCardSet.ts单独管理技能卡池配置,将原CardSet.ts中的技能卡数据迁移 2. 重构多处业务代码,从SkillCardList而非CardPoolList获取技能卡配置 3. 简化技能卡抽卡逻辑,新增drawSkillCards工具函数统一处理抽卡 4. 修复TalentsComp中计算contentHeight的小语法问题 5. 新增技能卡商店显隐控制功能
126 lines
6.4 KiB
TypeScript
126 lines
6.4 KiB
TypeScript
/**
|
||
* @file SCardSet.ts
|
||
* @description 技能卡池独立配置
|
||
*
|
||
* 职责:
|
||
* 维护所有技能卡(CardType.Skill)的原始数据,并构建为标准 CardConfig[]。
|
||
*
|
||
* 设计:
|
||
* - 技能卡不再按 wave 过滤,所有技能卡均可被抽取(长期存在)。
|
||
* - 保留 wave / card_lv 字段仅用于 UI 排序与档位展示,不参与抽卡过滤。
|
||
*
|
||
* 依赖:
|
||
* - CardSet —— CardConfig / CardType / CKind / CardLV / CardTriggerType
|
||
* - GameSet —— SKILL_CARD_WAVES(档位定义)
|
||
* - SkillSet —— SkillOverrides
|
||
*/
|
||
import { CardConfig, CardType, CardLV, CKind, CardTriggerType } from "./CardSet";
|
||
import { SKILL_CARD_WAVES } from "./GameSet";
|
||
import { SkillOverrides } from "./SkillSet";
|
||
|
||
// wave→card_lv 映射由 SKILL_CARD_WAVES 索引+1 自动生成(wave 1→lv1, wave 5→lv2, wave 8→lv3)
|
||
const waveToCardLv: Record<number, number> = {};
|
||
SKILL_CARD_WAVES.forEach((w, i) => { waveToCardLv[w] = i + 1; });
|
||
|
||
/** 技能卡原始数据(平铺字段,构建后转为 CardConfig) */
|
||
interface SkillCardRaw {
|
||
uuid: number;
|
||
skill: number;
|
||
wave: number;
|
||
name: string;
|
||
info: string;
|
||
is_inst: boolean;
|
||
t_inv?: number;
|
||
keep_waves?: number;
|
||
trigger_type: CardTriggerType;
|
||
overrides?: SkillOverrides;
|
||
}
|
||
|
||
const SkillCardData: SkillCardRaw[] = [
|
||
// ==================== wave 5 档(强度 ×2) ====================
|
||
// --- 范围攻击卡(ap 递增,间隔缩短) ---
|
||
{ uuid: 8261, skill: 6201, wave: SKILL_CARD_WAVES[1], name: "雷墙+", info: "召唤雷墙阻挡敌人,有概率击晕", is_inst: false, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 150 } },
|
||
{ uuid: 8262, skill: 6202, wave: SKILL_CARD_WAVES[1], name: "火墙+", info: "召唤火墙阻挡敌人,有概率击晕", is_inst: false, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 150 } },
|
||
{ uuid: 8263, skill: 6203, wave: SKILL_CARD_WAVES[1], name: "飓风+", info: "召唤飓风攻击敌人,有概率击晕", is_inst: false, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 150 } },
|
||
{ uuid: 8264, skill: 6204, wave: SKILL_CARD_WAVES[1], name: "水墙+", info: "召唤水墙阻挡敌人,有概率击晕", is_inst: false, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 150 } },
|
||
{ uuid: 8265, skill: 6205, wave: SKILL_CARD_WAVES[1], name: "风墙+", info: "召唤风墙困住敌人,有概率击晕", is_inst: false, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 150 } },
|
||
{ uuid: 8266, skill: 6206, wave: SKILL_CARD_WAVES[1], name: "陨石术+", info: "召唤陨石范围攻击敌人,有概率击晕", is_inst: false, t_inv: 5, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 150 } },
|
||
|
||
// ==================== wave 8 档(强度 ×3) ====================
|
||
{ uuid: 8361, skill: 6201, wave: SKILL_CARD_WAVES[2], name: "雷墙++", info: "召唤雷墙阻挡敌人,有概率击晕", is_inst: false, t_inv: 4, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 250 } },
|
||
{ uuid: 8362, skill: 6202, wave: SKILL_CARD_WAVES[2], name: "火墙++", info: "召唤火墙阻挡敌人,有概率击晕", is_inst: false, t_inv: 4, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 250 } },
|
||
{ uuid: 8363, skill: 6203, wave: SKILL_CARD_WAVES[2], name: "飓风++", info: "召唤飓风攻击敌人,有概率击晕", is_inst: false, t_inv: 4, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 250 } },
|
||
{ uuid: 8364, skill: 6204, wave: SKILL_CARD_WAVES[2], name: "水墙++", info: "召唤水墙阻挡敌人,有概率击晕", is_inst: false, t_inv: 4, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 250 } },
|
||
{ uuid: 8365, skill: 6205, wave: SKILL_CARD_WAVES[2], name: "风墙++", info: "召唤风墙困住敌人,有概率击晕", is_inst: false, t_inv: 4, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 250 } },
|
||
{ uuid: 8366, skill: 6206, wave: SKILL_CARD_WAVES[2], name: "陨石术++", info: "召唤陨石范围攻击敌人,有概率击晕", is_inst: false, t_inv: 4, keep_waves: -1, trigger_type: CardTriggerType.Interval, overrides: { ap: 250 } },
|
||
];
|
||
|
||
/**
|
||
* 技能卡池(已构建为标准 CardConfig[])。
|
||
* 不再按 wave 过滤,所有技能卡均可被抽取。
|
||
*/
|
||
export const SkillCardList: CardConfig[] = SkillCardData.map(data => {
|
||
const cardLv = waveToCardLv[data.wave] ?? 1;
|
||
return {
|
||
uuid: data.uuid,
|
||
skill: data.skill || undefined,
|
||
type: CardType.Skill,
|
||
cost: 0,
|
||
weight: 10,
|
||
pool_lv: CardLV.LV1,
|
||
wave: data.wave,
|
||
kind: CKind.Skill,
|
||
card_lv: cardLv,
|
||
name: data.name,
|
||
info: data.info,
|
||
is_inst: data.is_inst,
|
||
t_times: data.is_inst ? 1 : 999,
|
||
t_inv: data.t_inv || 0,
|
||
keep_waves: data.keep_waves,
|
||
overrides: data.overrides,
|
||
trigger_type: data.trigger_type,
|
||
} as CardConfig;
|
||
});
|
||
|
||
/**
|
||
* 按权重抽取一张卡(带权重随机)。
|
||
*/
|
||
function weightedPick(cards: CardConfig[]): CardConfig | null {
|
||
if (cards.length === 0) return null;
|
||
const totalWeight = cards.reduce((total, card) => total + (card.weight ?? 0), 0);
|
||
let random = Math.random() * totalWeight;
|
||
for (const card of cards) {
|
||
random -= (card.weight ?? 0);
|
||
if (random <= 0) return card;
|
||
}
|
||
return cards[cards.length - 1];
|
||
}
|
||
|
||
/**
|
||
* 按权重抽取 N 张技能卡(unique 保证一次刷新内不重复,不足时允许重复补齐)。
|
||
* @param count 需要抽取的数量
|
||
*/
|
||
export function drawSkillCards(count: number): CardConfig[] {
|
||
const safeCount = Math.max(0, Math.floor(count));
|
||
if (SkillCardList.length === 0 || safeCount <= 0) return [];
|
||
|
||
const picked: CardConfig[] = [];
|
||
let available = [...SkillCardList];
|
||
while (picked.length < safeCount) {
|
||
if (available.length === 0) break;
|
||
const pick = weightedPick(available);
|
||
if (!pick) break;
|
||
picked.push(pick);
|
||
available = available.filter(c => c.uuid !== pick.uuid);
|
||
}
|
||
|
||
// 不足时允许重复补齐
|
||
const filled = [...picked];
|
||
while (filled.length < safeCount) {
|
||
const fallback = weightedPick(SkillCardList);
|
||
if (!fallback) break;
|
||
filled.push(fallback);
|
||
}
|
||
return filled;
|
||
}
|