本次提交完成了全项目范围内术语的统一替换,将原本指代卡牌品质/等级的card_lv字段全部重命名为rarity,对齐了设计文档中的命名规范,避免了术语混淆: 1. 更新了所有配置文件、组件类、数据结构中的字段定义 2. 同步修改了注释、文档说明中的相关表述 3. 修正了英雄、技能、装备卡牌的品质显示逻辑 4. 调整了背景颜色切换、属性计算等相关业务逻辑
132 lines
7.9 KiB
TypeScript
132 lines
7.9 KiB
TypeScript
/**
|
||
* @file SCardSet.ts
|
||
* @description 技能卡池独立配置
|
||
*
|
||
* 职责:
|
||
* 维护所有技能卡(CardType.Skill)的原始数据,并构建为标准 CardConfig[]。
|
||
*
|
||
* 设计:
|
||
* - 技能卡不再按 wave 过滤,所有技能卡均可被抽取。
|
||
* - 所有技能卡均按次数触发(t_times),不再永久存在。
|
||
* - rarity 直接显式配置,不再依赖 wave 推导。
|
||
* - 数值基线高于普通英雄普攻(ap:100),通过 overrides 附加 ap/crt/frz/stun/bck 等效果。
|
||
*
|
||
* 依赖:
|
||
* - CardSet —— CardConfig / CardType / CKind / CardTriggerType
|
||
* - SkillSet —— SkillOverrides
|
||
*/
|
||
import { CardConfig, CardType, CKind, CardTriggerType } from "./CardSet";
|
||
import { SkillOverrides } from "./SkillSet";
|
||
|
||
/** 技能卡原始数据(平铺字段,构建后转为 CardConfig) */
|
||
interface SkillCardRaw {
|
||
uuid: number;
|
||
skill: number;
|
||
rarity: number;
|
||
name: string;
|
||
info: string;
|
||
icon?: string; // 图标ID(对应 ui6 图集 frame 名)
|
||
is_inst: boolean;
|
||
t_times?: number; // 触发次数(未设置时按 is_inst 取默认值:即时=1,定时=3)
|
||
t_inv?: number;
|
||
keep_waves?: number; // 维持回合数(默认 0=仅本回合)
|
||
trigger_type: CardTriggerType;
|
||
overrides?: SkillOverrides;
|
||
}
|
||
|
||
const SkillCardData: SkillCardRaw[] = [
|
||
// ==================== rarity 1 · 基础单体(ap:150,附加差异化效果) ====================
|
||
// --- 刀剑系:暴击 ---
|
||
{ uuid: 8101, skill: 6001, rarity: 1, icon: "Sword-FA_WP_Main_Sword_003_PurpleSilver", name: "飞剑卷轴", info: "召唤飞剑攻击敌人,造成攻击力150%的伤害,25%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 25 } },
|
||
{ uuid: 8102, skill: 6002, rarity: 1, icon: "Sword-FA_WP_Main_Sword_019_WoodSilver", name: "匕首卷轴", info: "召唤匕首攻击敌人,造成攻击力150%的伤害,25%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 25 } },
|
||
// --- 斧锤系:击退 ---
|
||
{ uuid: 8103, skill: 6003, rarity: 1, icon: "Axe-FA_WP_Main_Axe_004_WoodGray", name: "飞斧卷轴", info: "召唤飞斧攻击敌人,造成攻击力150%的伤害,25%击退", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, bck: 25 } },
|
||
// --- 枪矛系:穿透(多命中1次) ---
|
||
{ uuid: 8105, skill: 6004, rarity: 2, icon: "Stat_Attack_01", name: "突刺·双卷轴", info: "召唤突刺·双攻击敌人,一次释放2发,造成攻击力180%的伤害,可贯穿2个目标", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 180, hit_count: 2, num: 1 } },
|
||
// --- 远程射击系:高暴击 ---
|
||
{ uuid: 8106, skill: 6006, rarity: 1, icon: "Stat_RangedAttack", name: "射击卷轴", info: "召唤射击攻击敌人,造成攻击力150%的伤害,30%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 30 } },
|
||
{ uuid: 8107, skill: 6007, rarity: 1, icon: "Stat_RangedAttack", name: "蓝箭卷轴", info: "召唤蓝箭攻击敌人,造成攻击力150%的伤害,30%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 30 } },
|
||
{ uuid: 8108, skill: 6008, rarity: 1, icon: "Stat_RangedAttack", name: "火箭卷轴", info: "召唤火箭攻击敌人,造成攻击力150%的伤害,30%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 30 } },
|
||
// --- 魔球系:击晕 ---
|
||
{ uuid: 8109, skill: 6009, rarity: 1, icon: "Sub_Item-FA_WP_Sub_MagicBall_001_Blue", name: "蓝魔球卷轴", info: "召唤蓝魔球攻击敌人,造成攻击力150%的伤害,25%击晕", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, stun: 25 } },
|
||
{ uuid: 8110, skill: 6010, rarity: 1, icon: "Sub_Item-FA_WP_Sub_MagicBall_001_Purple", name: "紫魔球卷轴", info: "召唤紫魔球攻击敌人,造成攻击力150%的伤害,25%击晕", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, stun: 25 } },
|
||
// --- 药瓶系:冰冻 ---
|
||
{ uuid: 8111, skill: 6011, rarity: 1, icon: "Sub_Item-FA_WP_Sub_Potion_001_Green", name: "绿药瓶卷轴", info: "召唤绿药瓶攻击敌人,造成攻击力150%的伤害,25%冰冻", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, frz: 25 } },
|
||
{ uuid: 8112, skill: 6012, rarity: 1, icon: "Sub_Item-FA_WP_Sub_Potion_001_Red", name: "红药瓶卷轴", info: "召唤红药瓶攻击敌人,造成攻击力150%的伤害,25%冰冻", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, frz: 25 } },
|
||
|
||
// ==================== rarity 2 · 中阶范围(ap:200,群体附加) ====================
|
||
{ uuid: 8201, skill: 6200, rarity: 2, icon: "Stat_FireDamage", name: "火球·双卷轴", info: "召唤火球·双攻击敌人,一次释放2发,造成攻击力200%的伤害,30%暴击,可命中2个目标", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 200, crt: 30, num: 1 } },
|
||
{ uuid: 8202, skill: 6201, rarity: 2, icon: "Stat_Mana", name: "飓风卷轴", info: "召唤飓风攻击敌人,造成攻击力200%的伤害,30%击晕,可命中2个目标", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 200, stun: 30 } },
|
||
|
||
// ==================== rarity 3 · 高阶范围(ap:250,群体附加) ====================
|
||
];
|
||
|
||
/**
|
||
* 技能卡池(已构建为标准 CardConfig[])。
|
||
* 不再按 wave 过滤,所有技能卡均可被抽取。
|
||
*/
|
||
export const SkillCardList: CardConfig[] = SkillCardData.map(data => {
|
||
// 触发次数:显式配置优先;未配置时即时=1,定时=3
|
||
const defaultTimes = data.is_inst ? 1 : 3;
|
||
return {
|
||
uuid: data.uuid,
|
||
skill: data.skill || undefined,
|
||
type: CardType.Skill,
|
||
cost: 0,
|
||
weight: 10,
|
||
kind: CKind.Skill,
|
||
rarity: data.rarity,
|
||
icon: data.icon,
|
||
name: data.name,
|
||
info: data.info,
|
||
is_inst: data.is_inst,
|
||
t_times: data.t_times ?? defaultTimes,
|
||
t_inv: data.t_inv || 0,
|
||
keep_waves: data.keep_waves ?? 0,
|
||
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;
|
||
}
|