Files
pixelheros/assets/script/game/common/config/SCardSet.ts
pan 30163e8dac refactor: 拆分技能卡配置到独立文件,优化抽卡逻辑
1. 新建SCardSet.ts单独管理技能卡池配置,将原CardSet.ts中的技能卡数据迁移
2. 重构多处业务代码,从SkillCardList而非CardPoolList获取技能卡配置
3. 简化技能卡抽卡逻辑,新增drawSkillCards工具函数统一处理抽卡
4. 修复TalentsComp中计算contentHeight的小语法问题
5. 新增技能卡商店显隐控制功能
2026-07-22 17:42:41 +08:00

126 lines
6.4 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 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;
}