1. 新增FieldEntry类型,将驻场词条的uuid与生效数值分离 2. 重构FieldSkillSet,移除各档位重复配置,仅保留基础元数据 3. 更新所有使用驻场词条的业务代码,适配新的数据结构 4. 修复数值渲染逻辑,使用词条携带的实际数值而非配置固化值
164 lines
11 KiB
TypeScript
164 lines
11 KiB
TypeScript
/**
|
||
* @file EquipSet.ts
|
||
* @description 装备卡池独立配置
|
||
*
|
||
* 职责:
|
||
* 定义所有装备卡的静态数据,与技能卡池(CardSet.CardPoolList)彻底分离。
|
||
* 装备卡不再参与抽卡,改为商店直购,任务开始时一次性全部展示。
|
||
*
|
||
* 装备生效机制:
|
||
* 购买 → 派发 GameEvent.UseEquipCard → MissEquipComp 接收 → EBox ECS 实体
|
||
* → EquipBoxComp(trigger_type=Field,被动驻场)→ FieldSkillHelper 全局聚合属性加成
|
||
*
|
||
* 依赖:
|
||
* - CardConfig / CardTriggerType / CardType / CKind(CardSet)
|
||
* - FieldSkillSet(SkillSet)—— 属性词条配置
|
||
*/
|
||
import { CardConfig, CardType, CKind, CardTriggerType } from "./CardSet";
|
||
import { FieldEntry } from "./heroSet";
|
||
|
||
/** 装备卡原始数据(仅装备相关字段,由 EquipSet 内部转换为 CardConfig) */
|
||
interface EquipRawData {
|
||
uuid: number;
|
||
card_lv: number;
|
||
name: string;
|
||
info: string;
|
||
icon?: string; // 图标ID(对应 ui6 图集 frame 名)
|
||
field: FieldEntry[]; // 驻场光环词条:uuid 指向 FieldSkillSet 底座,value 为实际生效数值
|
||
cost?: number;
|
||
}
|
||
|
||
/** 装备卡原始数据表 */
|
||
const EquipRawList: EquipRawData[] = [
|
||
// ==================== card_lv 1 档(基础强度) ====================
|
||
{ uuid: 8701, card_lv: 1, icon: "Helmet-FA_Helmet_021_Gray", name: "战后恢复", info: "战斗结束生命回复量+10%", field: [{ uuid: 7001, value: 0.1 }] },
|
||
{ uuid: 8702, card_lv: 1, icon: "Sword-FA_WP_Main_Sword_003_GrayGold", name: "攻击加成", info: "全体攻击力+10%", field: [{ uuid: 7002, value: 0.1 }] },
|
||
{ uuid: 8703, card_lv: 1, icon: "Blunt-FA_WP_Main_Blunt_002_Wood", name: "击晕加成", info: "全体击晕概率+10%", field: [{ uuid: 7003, value: 0.1 }] },
|
||
{ uuid: 8704, card_lv: 1, icon: "Axe-FA_WP_Main_Axe_001_WoodGray", name: "暴击加成", info: "全体暴击率+10%", field: [{ uuid: 7004, value: 0.1 }] },
|
||
{ uuid: 8705, card_lv: 1, icon: "Bow-FA_WP_Main_Bow_003_WoodGreen", name: "暴伤加成", info: "全体暴击伤害+20%", field: [{ uuid: 7005, value: 0.2 }] },
|
||
{ uuid: 8706, card_lv: 1, icon: "Crossbow-FA_WP_Main_Crossbow_001_WoodWhite", name: "攻速加成", info: "全体攻击速度+10%", field: [{ uuid: 7006, value: 0.1 }] },
|
||
{ uuid: 8707, card_lv: 1, icon: "Chest-FA_Chest_014_Gray", name: "生命加成", info: "全体最大生命+10%", field: [{ uuid: 7007, value: 0.1 }] },
|
||
{ uuid: 8708, card_lv: 1, icon: "Wand-FA_WP_Main_Wand_001_GrayGreen", name: "风怒加成", info: "全体风怒概率+10%", field: [{ uuid: 7008, value: 0.1 }] },
|
||
{ uuid: 8709, card_lv: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "穿刺加成", info: "全体穿刺概率+10%", field: [{ uuid: 7009, value: 0.1 }] },
|
||
{ uuid: 8712, card_lv: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "破甲加成", info: "全体穿透后伤害+10%", field: [{ uuid: 7020, value: 0.1 }] },
|
||
{ uuid: 8710, card_lv: 1, icon: "Shield-FA_WP_Sub_Shield_007_GoldGray", name: "金币收益", info: "每回合金币收益+1", field: [{ uuid: 7010, value: 1 }] },
|
||
{ uuid: 8711, card_lv: 1, icon: "Staff-FA_WP_Main_Staff_003_WoodSkyblue", name: "出售强化", info: "卖出英雄金币+1", field: [{ uuid: 7011, value: 1 }] },
|
||
// 多词条装备
|
||
{ uuid: 8720, card_lv: 1, icon: "Shield-FA_WP_Sub_Shield_007_GoldGray", name: "勇者护符", info: "全体攻击力+10%, 暴击率+10%, 暴击伤害+20%", field: [{ uuid: 7002, value: 0.1 }, { uuid: 7004, value: 0.1 }, { uuid: 7005, value: 0.2 }] },
|
||
|
||
// ==================== card_lv 2 档(强度 ×2) ====================
|
||
{ uuid: 8751, card_lv: 2, icon: "Helmet-FA_Helmet_022_DarkBlue", name: "战后恢复", info: "战斗结束生命回复量+20%", field: [{ uuid: 7001, value: 0.2 }] },
|
||
{ uuid: 8752, card_lv: 2, icon: "Sword-FA_WP_Main_Sword_007_Blue", name: "攻击加成", info: "全体攻击力+20%", field: [{ uuid: 7002, value: 0.2 }] },
|
||
{ uuid: 8753, card_lv: 2, icon: "Blunt-FA_WP_Main_Blunt_004_Gray", name: "击晕加成", info: "全体击晕概率+20%", field: [{ uuid: 7003, value: 0.2 }] },
|
||
{ uuid: 8754, card_lv: 2, icon: "Axe-FA_WP_Main_Axe_006_WoodBronze", name: "暴击加成", info: "全体暴击率+20%", field: [{ uuid: 7004, value: 0.2 }] },
|
||
{ uuid: 8755, card_lv: 2, icon: "Bow-FA_WP_Main_Bow_010_Blue", name: "暴伤加成", info: "全体暴击伤害+40%", field: [{ uuid: 7005, value: 0.4 }] },
|
||
{ uuid: 8756, card_lv: 2, icon: "Crossbow-FA_WP_Main_Crossbow_004_Gray", name: "攻速加成", info: "全体攻击速度+20%", field: [{ uuid: 7006, value: 0.2 }] },
|
||
{ uuid: 8757, card_lv: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "生命加成", info: "全体最大生命+20%", field: [{ uuid: 7007, value: 0.2 }] },
|
||
{ uuid: 8758, card_lv: 2, icon: "Wand-FA_WP_Main_Wand_003_BlueWood", name: "风怒加成", info: "全体风怒概率+20%", field: [{ uuid: 7008, value: 0.2 }] },
|
||
{ uuid: 8759, card_lv: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "穿刺加成", info: "全体穿刺概率+20%", field: [{ uuid: 7009, value: 0.2 }] },
|
||
{ uuid: 8763, card_lv: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "破甲加成", info: "全体穿透后伤害+20%", field: [{ uuid: 7020, value: 0.2 }] },
|
||
{ uuid: 8760, card_lv: 2, icon: "Shield-FA_WP_Sub_Shield_008_BlueGold", name: "金币收益", info: "每回合金币收益+2", field: [{ uuid: 7010, value: 2 }] },
|
||
{ uuid: 8761, card_lv: 2, icon: "Shield-FA_WP_Sub_Shield_008_BlueGold", name: "购买优惠", info: "购买卡牌费用-2金币", field: [{ uuid: 7012, value: 2 }] },
|
||
{ uuid: 8762, card_lv: 2, icon: "Staff-FA_WP_Main_Staff_007_WoodGray", name: "刷新优惠", info: "刷新卡牌费用-1金币", field: [{ uuid: 7013, value: 1 }] },
|
||
// 多词条装备
|
||
{ uuid: 8770, card_lv: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "守卫护甲", info: "全体最大生命+20%, 战后生命回复+20%, 攻速+20%", field: [{ uuid: 7007, value: 0.2 }, { uuid: 7001, value: 0.2 }, { uuid: 7006, value: 0.2 }] },
|
||
|
||
// ==================== card_lv 3 档(强度 ×3) ====================
|
||
{ uuid: 8801, card_lv: 3, icon: "Helmet-FA_Helmet_021_RedGold", name: "战后恢复", info: "战斗结束生命回复量+30%", field: [{ uuid: 7001, value: 0.3 }] },
|
||
{ uuid: 8802, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击加成", info: "全体攻击力+30%", field: [{ uuid: 7002, value: 0.3 }] },
|
||
{ uuid: 8803, card_lv: 3, icon: "Blunt-FA_WP_Main_Blunt_006_OrangeGray", name: "击晕加成", info: "全体击晕概率+30%", field: [{ uuid: 7003, value: 0.3 }] },
|
||
{ uuid: 8804, card_lv: 3, icon: "Axe-FA_WP_Main_Axe_012_WoodGold", name: "暴击加成", info: "全体暴击率+30%", field: [{ uuid: 7004, value: 0.3 }] },
|
||
{ uuid: 8805, card_lv: 3, icon: "Bow-FA_WP_Main_Bow_010_Gold", name: "暴伤加成", info: "全体暴击伤害+60%", field: [{ uuid: 7005, value: 0.6 }] },
|
||
{ uuid: 8806, card_lv: 3, icon: "Crossbow-FA_WP_Main_Crossbow_005_WoodGold", name: "攻速加成", info: "全体攻击速度+30%", field: [{ uuid: 7006, value: 0.3 }] },
|
||
{ uuid: 8807, card_lv: 3, icon: "Chest-FA_Chest_015_RedGold", name: "生命加成", info: "全体最大生命+30%", field: [{ uuid: 7007, value: 0.3 }] },
|
||
{ uuid: 8808, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "风怒加成", info: "全体风怒概率+30%", field: [{ uuid: 7008, value: 0.3 }] },
|
||
{ uuid: 8809, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "穿刺加成", info: "全体穿刺概率+30%", field: [{ uuid: 7009, value: 0.3 }] },
|
||
{ uuid: 8817, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "破甲加成", info: "全体穿透后伤害+30%", field: [{ uuid: 7020, value: 0.3 }] },
|
||
{ uuid: 8810, card_lv: 3, icon: "Shield-FA_WP_Sub_Shield_009_RedGold", name: "金币收益", info: "每回合金币收益+3", field: [{ uuid: 7010, value: 3 }] },
|
||
// 触发次数强化
|
||
{ uuid: 8811, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "召唤强化", info: "召唤触发技能次数+1", field: [{ uuid: 7014, value: 1 }] },
|
||
{ uuid: 8812, card_lv: 3, icon: "Staff-FA_WP_Main_Staff_005_WoodGold", name: "死亡强化", info: "死亡触发技能次数+1", field: [{ uuid: 7015, value: 1 }] },
|
||
{ uuid: 8813, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "开场强化", info: "战斗开始触发技能次数+1", field: [{ uuid: 7016, value: 1 }] },
|
||
{ uuid: 8814, card_lv: 3, icon: "Blunt-FA_WP_Main_Blunt_006_OrangeGray", name: "结束强化", info: "战斗结束触发技能次数+1", field: [{ uuid: 7017, value: 1 }] },
|
||
{ uuid: 8815, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击强化", info: "攻击触发技能次数+1", field: [{ uuid: 7018, value: 1 }] },
|
||
{ uuid: 8816, card_lv: 3, icon: "Shield-FA_WP_Sub_Shield_009_RedGold", name: "受击强化", info: "被攻击触发技能次数+1", field: [{ uuid: 7019, value: 1 }] },
|
||
// 多词条装备
|
||
{ uuid: 8820, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "神圣之刃", info: "全体攻击力+30%, 暴击率+30%, 暴击伤害+60%, 攻速+30%", field: [{ uuid: 7002, value: 0.3 }, { uuid: 7004, value: 0.3 }, { uuid: 7005, value: 0.6 }, { uuid: 7006, value: 0.3 }] },
|
||
];
|
||
|
||
/**
|
||
* 装备卡池列表(转换为 CardConfig 格式)
|
||
*
|
||
* 所有装备卡统一配置:
|
||
* - type: Skill(复用卡牌体系)
|
||
* - trigger_type: Field(被动驻场)
|
||
* - keep_waves: -1(持续到战斗结束)
|
||
* - is_inst: false(不主动施法)
|
||
* - cost: 由原始数据指定,默认 0
|
||
*/
|
||
export const EquipPoolList: CardConfig[] = EquipRawList.map(data => ({
|
||
uuid: data.uuid,
|
||
type: CardType.Skill,
|
||
cost: data.cost ?? 0,
|
||
weight: 10,
|
||
kind: CKind.Skill,
|
||
card_lv: data.card_lv,
|
||
icon: data.icon,
|
||
name: data.name,
|
||
info: data.info,
|
||
is_inst: false,
|
||
t_times: 999,
|
||
t_inv: 0,
|
||
keep_waves: -1,
|
||
field: data.field,
|
||
trigger_type: CardTriggerType.Field,
|
||
}));
|
||
|
||
/**
|
||
* 按权重抽取 N 张装备卡(unique 保证一次刷新内不重复,不足时允许重复补齐)。
|
||
* @param count 需要抽取的数量
|
||
*/
|
||
export function drawEquipCards(count: number): CardConfig[] {
|
||
const safeCount = Math.max(0, Math.floor(count));
|
||
if (EquipPoolList.length === 0 || safeCount <= 0) return [];
|
||
|
||
const picked: CardConfig[] = [];
|
||
let available = [...EquipPoolList];
|
||
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(EquipPoolList);
|
||
if (!fallback) break;
|
||
filled.push(fallback);
|
||
}
|
||
return filled;
|
||
}
|
||
|
||
/** 单次按权重抽取一张卡 */
|
||
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];
|
||
}
|
||
|
||
/**
|
||
* 按 UUID 查找装备卡配置
|
||
* @param uuid 装备卡 UUID
|
||
*/
|
||
export function findEquipByUuid(uuid: number): CardConfig | undefined {
|
||
return EquipPoolList.find(e => e.uuid === uuid);
|
||
}
|