refactor: 将代码中的card_lv统一替换为rarity
本次提交完成了全项目范围内术语的统一替换,将原本指代卡牌品质/等级的card_lv字段全部重命名为rarity,对齐了设计文档中的命名规范,避免了术语混淆: 1. 更新了所有配置文件、组件类、数据结构中的字段定义 2. 同步修改了注释、文档说明中的相关表述 3. 修正了英雄、技能、装备卡牌的品质显示逻辑 4. 调整了背景颜色切换、属性计算等相关业务逻辑
This commit is contained in:
@@ -70,7 +70,7 @@ export interface DeadHeroRecord {
|
|||||||
/** 死亡时的英雄等级(复活后继承) */
|
/** 死亡时的英雄等级(复活后继承) */
|
||||||
lv: number;
|
lv: number;
|
||||||
/** 卡牌等级(驱动 bg_node 颜色) */
|
/** 卡牌等级(驱动 bg_node 颜色) */
|
||||||
card_lv: number;
|
rarity: number;
|
||||||
/** 死亡时占用的站位索引(复活时优先归位,-1 表示未分配) */
|
/** 死亡时占用的站位索引(复活时优先归位,-1 表示未分配) */
|
||||||
posIndex: number;
|
posIndex: number;
|
||||||
/** 死亡时的回合数(用于统计/按回合清理) */
|
/** 死亡时的回合数(用于统计/按回合清理) */
|
||||||
|
|||||||
@@ -57,10 +57,10 @@ export interface CardConfig {
|
|||||||
cost: number
|
cost: number
|
||||||
weight: number
|
weight: number
|
||||||
kind: CKind
|
kind: CKind
|
||||||
card_lv: number // 卡牌等级(驱动 bg_node 颜色:1=green 2=blue 3=purple 4=red 5=yellow)
|
rarity: number // 卡牌等级(驱动 bg_node 颜色:1=green 2=blue 3=purple 4=red 5=yellow)
|
||||||
wave?: number // 针对技能卡:仅在指定回合(wave)才能抽到
|
wave?: number // 针对技能卡:仅在指定回合(wave)才能抽到
|
||||||
hero_lv?: number
|
hero_lv?: number
|
||||||
base_card_lv?: number
|
base_rarity?: number
|
||||||
|
|
||||||
// 技能卡扩展属性
|
// 技能卡扩展属性
|
||||||
skill?: number // 关联的技能 UUID
|
skill?: number // 关联的技能 UUID
|
||||||
@@ -126,22 +126,22 @@ export interface SpecialRefreshCardConfig extends CardConfig {
|
|||||||
*/
|
*/
|
||||||
export const SpecialUpgradeCardList: Record<number, SpecialUpgradeCardConfig> = {
|
export const SpecialUpgradeCardList: Record<number, SpecialUpgradeCardConfig> = {
|
||||||
7001: {
|
7001: {
|
||||||
uuid: 7001, type: CardType.SpecialUpgrade, cost: 10, weight: 18, card_lv: 1, kind: CKind.Card, name: t("scard_name_7001"), info: t("scard_info_7001"),
|
uuid: 7001, type: CardType.SpecialUpgrade, cost: 10, weight: 18, rarity: 1, kind: CKind.Card, name: t("scard_name_7001"), info: t("scard_info_7001"),
|
||||||
currentLv: 0, targetLv: 0,
|
currentLv: 0, targetLv: 0,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export const SpecialRefreshCardList: Record<number, SpecialRefreshCardConfig> = {
|
export const SpecialRefreshCardList: Record<number, SpecialRefreshCardConfig> = {
|
||||||
7101: {
|
7101: {
|
||||||
uuid: 7101, type: CardType.SpecialRefresh, cost: 3, weight: 14, card_lv: 1, kind: CKind.Card, name: t("scard_name_7101"), info: t("scard_info_7101"),
|
uuid: 7101, type: CardType.SpecialRefresh, cost: 3, weight: 14, rarity: 1, kind: CKind.Card, name: t("scard_name_7101"), info: t("scard_info_7101"),
|
||||||
refreshLv: 0, refreshHeroType: SpecialRefreshHeroType.Melee,
|
refreshLv: 0, refreshHeroType: SpecialRefreshHeroType.Melee,
|
||||||
},
|
},
|
||||||
7102: {
|
7102: {
|
||||||
uuid: 7102, type: CardType.SpecialRefresh, cost: 3, weight: 14, card_lv: 1, kind: CKind.Card, name: t("scard_name_7102"), info: t("scard_info_7102"),
|
uuid: 7102, type: CardType.SpecialRefresh, cost: 3, weight: 14, rarity: 1, kind: CKind.Card, name: t("scard_name_7102"), info: t("scard_info_7102"),
|
||||||
refreshLv: 0, refreshHeroType: SpecialRefreshHeroType.Ranged,
|
refreshLv: 0, refreshHeroType: SpecialRefreshHeroType.Ranged,
|
||||||
},
|
},
|
||||||
7103: {
|
7103: {
|
||||||
uuid: 7103, type: CardType.SpecialRefresh, cost: 4, weight: 12, card_lv: 1, kind: CKind.Card, name: t("scard_name_7103"), info: t("scard_info_7103"),
|
uuid: 7103, type: CardType.SpecialRefresh, cost: 4, weight: 12, rarity: 1, kind: CKind.Card, name: t("scard_name_7103"), info: t("scard_info_7103"),
|
||||||
refreshLv: 0, refreshHeroType: SpecialRefreshHeroType.Any,
|
refreshLv: 0, refreshHeroType: SpecialRefreshHeroType.Any,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import { FieldEntry } from "./heroSet";
|
|||||||
/** 装备卡原始数据(仅装备相关字段,由 EquipSet 内部转换为 CardConfig) */
|
/** 装备卡原始数据(仅装备相关字段,由 EquipSet 内部转换为 CardConfig) */
|
||||||
interface EquipRawData {
|
interface EquipRawData {
|
||||||
uuid: number;
|
uuid: number;
|
||||||
card_lv: number;
|
rarity: number;
|
||||||
name: string;
|
name: string;
|
||||||
info: string;
|
info: string;
|
||||||
icon?: string; // 图标ID(对应 ui6 图集 frame 名)
|
icon?: string; // 图标ID(对应 ui6 图集 frame 名)
|
||||||
@@ -30,56 +30,56 @@ interface EquipRawData {
|
|||||||
|
|
||||||
/** 装备卡原始数据表 */
|
/** 装备卡原始数据表 */
|
||||||
const EquipRawList: EquipRawData[] = [
|
const EquipRawList: EquipRawData[] = [
|
||||||
// ==================== card_lv 1 档(基础强度) ====================
|
// ==================== rarity 1 档(基础强度) ====================
|
||||||
{ uuid: 8701, card_lv: 1, icon: "Helmet-FA_Helmet_021_Gray", name: "战后恢复", info: "战斗结束生命回复量+10%", field: [{ uuid: 7001, value: 0.1 }] },
|
{ uuid: 8701, rarity: 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: 8702, rarity: 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: 8703, rarity: 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: 8704, rarity: 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: 8705, rarity: 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: 8706, rarity: 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: 8707, rarity: 1, icon: "Chest-FA_Chest_014_Gray", name: "生命加成", info: "全体最大生命+10%", field: [{ uuid: 7007, value: 0.1 }] },
|
||||||
// 风怒机制已停用: 8708 风怒加成卡已移除
|
// 风怒机制已停用: 8708 风怒加成卡已移除
|
||||||
// { uuid: 8708, card_lv: 1, icon: "Wand-FA_WP_Main_Wand_001_GrayGreen", name: "风怒加成", info: "全体风怒概率+10%", field: [{ uuid: 7008, value: 0.1 }] },
|
// { uuid: 8708, rarity: 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: 8709, rarity: 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: 8712, rarity: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "破甲加成", info: "全体穿透后伤害+10%", field: [{ uuid: 7020, value: 0.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 }] },
|
{ uuid: 8720, rarity: 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) ====================
|
// ==================== rarity 2 档(强度 ×2) ====================
|
||||||
{ uuid: 8751, card_lv: 2, icon: "Helmet-FA_Helmet_022_DarkBlue", name: "战后恢复", info: "战斗结束生命回复量+20%", field: [{ uuid: 7001, value: 0.2 }] },
|
{ uuid: 8751, rarity: 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: 8752, rarity: 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: 8753, rarity: 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: 8754, rarity: 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: 8755, rarity: 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: 8756, rarity: 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: 8757, rarity: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "生命加成", info: "全体最大生命+20%", field: [{ uuid: 7007, value: 0.2 }] },
|
||||||
// 风怒机制已停用: 8758 风怒加成卡已移除
|
// 风怒机制已停用: 8758 风怒加成卡已移除
|
||||||
// { uuid: 8758, card_lv: 2, icon: "Wand-FA_WP_Main_Wand_003_BlueWood", name: "风怒加成", info: "全体风怒概率+20%", field: [{ uuid: 7008, value: 0.2 }] },
|
// { uuid: 8758, rarity: 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: 8759, rarity: 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: 8763, rarity: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "破甲加成", info: "全体穿透后伤害+20%", field: [{ uuid: 7020, value: 0.2 }] },
|
||||||
// 多词条装备
|
// 多词条装备
|
||||||
{ 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 }] },
|
{ uuid: 8770, rarity: 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) ====================
|
// ==================== rarity 3 档(强度 ×3) ====================
|
||||||
{ uuid: 8801, card_lv: 3, icon: "Helmet-FA_Helmet_021_RedGold", name: "战后恢复", info: "战斗结束生命回复量+30%", field: [{ uuid: 7001, value: 0.3 }] },
|
{ uuid: 8801, rarity: 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: 8802, rarity: 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: 8803, rarity: 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: 8804, rarity: 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: 8805, rarity: 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: 8806, rarity: 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: 8807, rarity: 3, icon: "Chest-FA_Chest_015_RedGold", name: "生命加成", info: "全体最大生命+30%", field: [{ uuid: 7007, value: 0.3 }] },
|
||||||
// 风怒机制已停用: 8808 风怒加成卡已移除
|
// 风怒机制已停用: 8808 风怒加成卡已移除
|
||||||
// { uuid: 8808, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "风怒加成", info: "全体风怒概率+30%", field: [{ uuid: 7008, value: 0.3 }] },
|
// { uuid: 8808, rarity: 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: 8809, rarity: 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: 8817, rarity: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "破甲加成", info: "全体穿透后伤害+30%", field: [{ uuid: 7020, value: 0.3 }] },
|
||||||
// 触发次数强化
|
// 触发次数强化
|
||||||
{ uuid: 8811, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "召唤强化", info: "召唤触发技能次数+1", field: [{ uuid: 7014, value: 1 }] },
|
{ uuid: 8811, rarity: 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: 8812, rarity: 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: 8813, rarity: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "开场强化", info: "战斗开始触发技能次数+1", field: [{ uuid: 7016, value: 1 }] },
|
||||||
{ uuid: 8815, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击强化", info: "攻击触发技能次数+1", field: [{ uuid: 7018, value: 1 }] },
|
{ uuid: 8815, rarity: 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: 8816, rarity: 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 }] },
|
{ uuid: 8820, rarity: 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 }] },
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -98,7 +98,7 @@ export const EquipPoolList: CardConfig[] = EquipRawList.map(data => ({
|
|||||||
cost: data.cost ?? 0,
|
cost: data.cost ?? 0,
|
||||||
weight: 10,
|
weight: 10,
|
||||||
kind: CKind.Skill,
|
kind: CKind.Skill,
|
||||||
card_lv: data.card_lv,
|
rarity: data.rarity,
|
||||||
icon: data.icon,
|
icon: data.icon,
|
||||||
name: data.name,
|
name: data.name,
|
||||||
info: data.info,
|
info: data.info,
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ export const HERO_UPGRADE_NEED_FRAGMENTS: Record<number, number> = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 技能卡牌出现的回合配置(单一数据源)。
|
* 技能卡牌出现的回合配置(单一数据源)。
|
||||||
* 数组索引 i 对应卡牌档位 card_lv = i + 1:
|
* 数组索引 i 对应卡牌档位 rarity = i + 1:
|
||||||
* - 第 1 个回合 → LV1 档(基础强度)
|
* - 第 1 个回合 → LV1 档(基础强度)
|
||||||
* - 第 2 个回合 → LV2 档(强度 ×2)
|
* - 第 2 个回合 → LV2 档(强度 ×2)
|
||||||
* - 第 3 个回合 → LV3 档(强度 ×3)
|
* - 第 3 个回合 → LV3 档(强度 ×3)
|
||||||
@@ -207,10 +207,10 @@ export function getLvColor(lv: number): Color {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* card_lv → 背景颜色节点名映射:1=green 2=blue 3=purple 4=yellow 5=red
|
* rarity → 背景颜色节点名映射:1=green 2=blue 3=purple 4=yellow 5=red
|
||||||
* 用于 BG_node 下子节点的显隐切换
|
* 用于 BG_node 下子节点的显隐切换
|
||||||
*/
|
*/
|
||||||
export const CARD_LV_BG_COLORS: string[] = ["green", "blue", "purple", "yellow", "red"];
|
export const RARITY_BG_COLORS: string[] = ["green", "blue", "purple", "yellow", "red"];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 战斗结算奖励配置(每局结束后发放:英雄碎片 + 金币 + 天赋经验)。
|
* 战斗结算奖励配置(每局结束后发放:英雄碎片 + 金币 + 天赋经验)。
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
## 编号体系
|
## 编号体系
|
||||||
|
|
||||||
| 号段 | card_lv | 说明 |
|
| 号段 | rarity | 说明 |
|
||||||
|------|---------|------|
|
|------|---------|------|
|
||||||
| 5001-5099 | 1 | 绿卡英雄池 |
|
| 5001-5099 | 1 | 绿卡英雄池 |
|
||||||
| 5101-5199 | 2 | 蓝卡英雄池 |
|
| 5101-5199 | 2 | 蓝卡英雄池 |
|
||||||
@@ -44,26 +44,26 @@
|
|||||||
|
|
||||||
## 规则 2:品质-档位标准
|
## 规则 2:品质-档位标准
|
||||||
|
|
||||||
**card_lv = 基础 1 + 能力加成**
|
**rarity = 基础 1 + 能力加成**
|
||||||
|
|
||||||
| 能力项 | 加成 | 说明 |
|
| 能力项 | 加成 | 说明 |
|
||||||
|--------|------|------|
|
|--------|------|------|
|
||||||
| 基础触发技能(1个,单体) | +0 | card_lv=1 |
|
| 基础触发技能(1个,单体) | +0 | rarity=1 |
|
||||||
| 更高数值 | +1 | card_lv=2 |
|
| 更高数值 | +1 | rarity=2 |
|
||||||
| ap/hp 成长 | +1 | card_lv=2 |
|
| ap/hp 成长 | +1 | rarity=2 |
|
||||||
| 范围扩大(单体→全体) | +2 | card_lv=3 |
|
| 范围扩大(单体→全体) | +2 | rarity=3 |
|
||||||
| 双技能(+revive/光环) | +4 | card_lv=5 |
|
| 双技能(+revive/光环) | +4 | rarity=5 |
|
||||||
|
|
||||||
**组合示例:**
|
**组合示例:**
|
||||||
- 1 + 0 = card_lv 1(基础)
|
- 1 + 0 = rarity 1(基础)
|
||||||
- 1 + 1 = card_lv 2(数值强化 或 ap/hp 成长)
|
- 1 + 1 = rarity 2(数值强化 或 ap/hp 成长)
|
||||||
- 1 + 2 = card_lv 3(范围扩大)
|
- 1 + 2 = rarity 3(范围扩大)
|
||||||
- 1 + 1 + 2 = card_lv 4(数值 + 范围)
|
- 1 + 1 + 2 = rarity 4(数值 + 范围)
|
||||||
- 1 + 4 = card_lv 5(双技能)
|
- 1 + 4 = rarity 5(双技能)
|
||||||
|
|
||||||
**双技能定义**:指英雄同时拥有**两个不同的触发类型字段**(如 atked + revive,或 dead + field)。同一触发类型下的 TriggerGrouped 挂多个 s_uuid 属于主触发类型内的能力组合,不算"双技能"。
|
**双技能定义**:指英雄同时拥有**两个不同的触发类型字段**(如 atked + revive,或 dead + field)。同一触发类型下的 TriggerGrouped 挂多个 s_uuid 属于主触发类型内的能力组合,不算"双技能"。
|
||||||
|
|
||||||
**原则:每个英雄单独讨论,根据能力组合定 card_lv,不死板规定。**
|
**原则:每个英雄单独讨论,根据能力组合定 rarity,不死板规定。**
|
||||||
|
|
||||||
## 规则 3:命名规则
|
## 规则 3:命名规则
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@
|
|||||||
|
|
||||||
## 当前英雄池
|
## 当前英雄池
|
||||||
|
|
||||||
| 编号 | 名称 | card_lv | 触发类型 | 能力 | 状态 |
|
| 编号 | 名称 | rarity | 触发类型 | 能力 | 状态 |
|
||||||
|------|------|---------|---------|------|------|
|
|------|------|---------|---------|------|------|
|
||||||
| 5001 | 铁壁战士 | 1 | atked | 护盾 | 保留(原 5011) |
|
| 5001 | 铁壁战士 | 1 | atked | 护盾 | 保留(原 5011) |
|
||||||
| 5106 | 破甲射手 | 2 | atking | 穿透伤害(计时buff,技能 6512 + Buff 7022) | 已创建 |
|
| 5106 | 破甲射手 | 2 | atking | 穿透伤害(计时buff,技能 6512 + Buff 7022) | 已创建 |
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ export const ItemCardList: CardConfig[] = ItemCardData.map(data => ({
|
|||||||
cost: data.cost,
|
cost: data.cost,
|
||||||
weight: data.weight,
|
weight: data.weight,
|
||||||
kind: CKind.Potion,
|
kind: CKind.Potion,
|
||||||
card_lv: 1,
|
rarity: 1,
|
||||||
icon: data.icon,
|
icon: data.icon,
|
||||||
name: data.name,
|
name: data.name,
|
||||||
info: data.info,
|
info: data.info,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
* 设计:
|
* 设计:
|
||||||
* - 技能卡不再按 wave 过滤,所有技能卡均可被抽取。
|
* - 技能卡不再按 wave 过滤,所有技能卡均可被抽取。
|
||||||
* - 所有技能卡均按次数触发(t_times),不再永久存在。
|
* - 所有技能卡均按次数触发(t_times),不再永久存在。
|
||||||
* - card_lv 直接显式配置,不再依赖 wave 推导。
|
* - rarity 直接显式配置,不再依赖 wave 推导。
|
||||||
* - 数值基线高于普通英雄普攻(ap:100),通过 overrides 附加 ap/crt/frz/stun/bck 等效果。
|
* - 数值基线高于普通英雄普攻(ap:100),通过 overrides 附加 ap/crt/frz/stun/bck 等效果。
|
||||||
*
|
*
|
||||||
* 依赖:
|
* 依赖:
|
||||||
@@ -22,7 +22,7 @@ import { SkillOverrides } from "./SkillSet";
|
|||||||
interface SkillCardRaw {
|
interface SkillCardRaw {
|
||||||
uuid: number;
|
uuid: number;
|
||||||
skill: number;
|
skill: number;
|
||||||
card_lv: number;
|
rarity: number;
|
||||||
name: string;
|
name: string;
|
||||||
info: string;
|
info: string;
|
||||||
icon?: string; // 图标ID(对应 ui6 图集 frame 名)
|
icon?: string; // 图标ID(对应 ui6 图集 frame 名)
|
||||||
@@ -35,30 +35,30 @@ interface SkillCardRaw {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const SkillCardData: SkillCardRaw[] = [
|
const SkillCardData: SkillCardRaw[] = [
|
||||||
// ==================== card_lv 1 · 基础单体(ap:150,附加差异化效果) ====================
|
// ==================== rarity 1 · 基础单体(ap:150,附加差异化效果) ====================
|
||||||
// --- 刀剑系:暴击 ---
|
// --- 刀剑系:暴击 ---
|
||||||
{ uuid: 8101, skill: 6001, card_lv: 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: 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, card_lv: 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: 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, card_lv: 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 } },
|
{ 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次) ---
|
// --- 枪矛系:穿透(多命中1次) ---
|
||||||
{ uuid: 8105, skill: 6004, card_lv: 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: 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, card_lv: 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: 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, card_lv: 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, card_lv: 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, card_lv: 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: 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, card_lv: 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: 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, card_lv: 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: 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, card_lv: 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 } },
|
{ 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 } },
|
||||||
|
|
||||||
// ==================== card_lv 2 · 中阶范围(ap:200,群体附加) ====================
|
// ==================== rarity 2 · 中阶范围(ap:200,群体附加) ====================
|
||||||
{ uuid: 8201, skill: 6200, card_lv: 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: 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, card_lv: 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 } },
|
{ 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 } },
|
||||||
|
|
||||||
// ==================== card_lv 3 · 高阶范围(ap:250,群体附加) ====================
|
// ==================== rarity 3 · 高阶范围(ap:250,群体附加) ====================
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -75,7 +75,7 @@ export const SkillCardList: CardConfig[] = SkillCardData.map(data => {
|
|||||||
cost: 0,
|
cost: 0,
|
||||||
weight: 10,
|
weight: 10,
|
||||||
kind: CKind.Skill,
|
kind: CKind.Skill,
|
||||||
card_lv: data.card_lv,
|
rarity: data.rarity,
|
||||||
icon: data.icon,
|
icon: data.icon,
|
||||||
name: data.name,
|
name: data.name,
|
||||||
info: data.info,
|
info: data.info,
|
||||||
|
|||||||
@@ -116,7 +116,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 4,
|
"rarity": 4,
|
||||||
"grow_type": "Mage",
|
"grow_type": "Mage",
|
||||||
"role": "Mage",
|
"role": "Mage",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -225,7 +225,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 5,
|
"rarity": 5,
|
||||||
"grow_type": "Warrior",
|
"grow_type": "Warrior",
|
||||||
"role": "Warrior",
|
"role": "Warrior",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -347,7 +347,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 4,
|
"rarity": 4,
|
||||||
"grow_type": "Warrior",
|
"grow_type": "Warrior",
|
||||||
"role": "Warrior",
|
"role": "Warrior",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -477,7 +477,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 4,
|
"rarity": 4,
|
||||||
"grow_type": "Mage",
|
"grow_type": "Mage",
|
||||||
"role": "Mage",
|
"role": "Mage",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -590,7 +590,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 5,
|
"rarity": 5,
|
||||||
"grow_type": "Tank",
|
"grow_type": "Tank",
|
||||||
"role": "Tank",
|
"role": "Tank",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -755,7 +755,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 4,
|
"rarity": 4,
|
||||||
"grow_type": "Support",
|
"grow_type": "Support",
|
||||||
"role": "Support",
|
"role": "Support",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 3,
|
"rarity": 3,
|
||||||
"grow_type": "Tank",
|
"grow_type": "Tank",
|
||||||
"role": "Tank",
|
"role": "Tank",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -910,7 +910,7 @@
|
|||||||
],
|
],
|
||||||
"block_comments": {
|
"block_comments": {
|
||||||
"ap_bonus": [
|
"ap_bonus": [
|
||||||
" // card_lv 3:lv9 无光环,改为基础属性+50%"
|
" // rarity 3:lv9 无光环,改为基础属性+50%"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"ap_bonus": [
|
"ap_bonus": [
|
||||||
@@ -1006,7 +1006,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 5,
|
"rarity": 5,
|
||||||
"grow_type": "Warrior",
|
"grow_type": "Warrior",
|
||||||
"role": "Warrior",
|
"role": "Warrior",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -1116,7 +1116,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": "",
|
"info": "",
|
||||||
"card_lv": 3,
|
"rarity": 3,
|
||||||
"grow_type": "Tank",
|
"grow_type": "Tank",
|
||||||
"role": "Tank",
|
"role": "Tank",
|
||||||
"trig_order": [
|
"trig_order": [
|
||||||
@@ -1161,7 +1161,7 @@
|
|||||||
],
|
],
|
||||||
"block_comments": {
|
"block_comments": {
|
||||||
"ap_bonus": [
|
"ap_bonus": [
|
||||||
" // card_lv 3:lv9 无光环,改为基础属性+50%"
|
" // rarity 3:lv9 无光环,改为基础属性+50%"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"ap_bonus": [
|
"ap_bonus": [
|
||||||
|
|||||||
@@ -117,15 +117,15 @@ export const HERO_GROW_COEF: Record<HGrowType, { hp: number; ap: number; def: nu
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 英雄品质系数步长:相邻品质(card_lv)基础属性相差 5%。
|
* 英雄品质系数步长:相邻品质(rarity)基础属性相差 5%。
|
||||||
* 系数 = 1 + HERO_QUALITY_STEP × (card_lv - 1),lv1~lv5 → 1.00/1.05/1.10/1.15/1.20。
|
* 系数 = 1 + HERO_QUALITY_STEP × (rarity - 1),lv1~lv5 → 1.00/1.05/1.10/1.15/1.20。
|
||||||
* 仅作用于 lv1 初始基础属性(AP/HP/DEF),成长与等级 bonus 不随品质缩放。
|
* 仅作用于 lv1 初始基础属性(AP/HP/DEF),成长与等级 bonus 不随品质缩放。
|
||||||
*/
|
*/
|
||||||
export const HERO_QUALITY_STEP = 0.05;
|
export const HERO_QUALITY_STEP = 0.05;
|
||||||
|
|
||||||
/** 计算英雄品质系数(相邻品质基础属性差 5%) */
|
/** 计算英雄品质系数(相邻品质基础属性差 5%) */
|
||||||
export function getHeroQualityCoef(cardLv: number): number {
|
export function getHeroQualityCoef(rarity: number): number {
|
||||||
return 1 + HERO_QUALITY_STEP * (Math.max(1, cardLv) - 1);
|
return 1 + HERO_QUALITY_STEP * (Math.max(1, rarity) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -308,7 +308,7 @@ export interface heroInfo {
|
|||||||
fac: FacSet; // 阵营(FacSet.HERO 或 FacSet.MON)
|
fac: FacSet; // 阵营(FacSet.HERO 或 FacSet.MON)
|
||||||
kind?: number; // 未使用
|
kind?: number; // 未使用
|
||||||
lv: number; // 英雄等级
|
lv: number; // 英雄等级
|
||||||
card_lv?: number; // 卡牌等级(驱动 bg_node 颜色:1=green 2=blue 3=purple 4=red 5=yellow)
|
rarity?: number; // 卡牌等级(驱动 bg_node 颜色:1=green 2=blue 3=purple 4=red 5=yellow)
|
||||||
type: HType; // 攻击定位(近战/中程/远程)
|
type: HType; // 攻击定位(近战/中程/远程)
|
||||||
grow_type?: HGrowType; // 成长类型(决定每级 hp/ap 标准增量,默认 Warrior)
|
grow_type?: HGrowType; // 成长类型(决定每级 hp/ap 标准增量,默认 Warrior)
|
||||||
role?: HRole; // 位置类型/职业定位(英雄专用,怪物用 monType 表达)
|
role?: HRole; // 位置类型/职业定位(英雄专用,怪物用 monType 表达)
|
||||||
@@ -346,8 +346,8 @@ export interface HeroCardConfig {
|
|||||||
name?: string;
|
name?: string;
|
||||||
info?: string;
|
info?: string;
|
||||||
cost: number;
|
cost: number;
|
||||||
card_lv: number;
|
rarity: number;
|
||||||
base_card_lv?: number;
|
base_rarity?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -357,7 +357,7 @@ export interface HeroCardPoolEntry {
|
|||||||
uuid: number;
|
uuid: number;
|
||||||
cost: number;
|
cost: number;
|
||||||
weight: number;
|
weight: number;
|
||||||
card_lv: number;
|
rarity: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 英雄卡池:由 HeroList 动态生成(见文件末尾初始化代码) */
|
/** 英雄卡池:由 HeroList 动态生成(见文件末尾初始化代码) */
|
||||||
@@ -459,9 +459,9 @@ export interface LvBonusEntry {
|
|||||||
* 规则:lv1 激活 skills[0]/skills[1],lv6 解锁 atking/atked/fstart/dead/field 触发技能(触发类统一 lv6 激活),
|
* 规则:lv1 激活 skills[0]/skills[1],lv6 解锁 atking/atked/fstart/dead/field 触发技能(触发类统一 lv6 激活),
|
||||||
* 大招(skills[1])lv9/lv16 走 lv_entries 分档成长,lv12 按职业对单项基础属性 +50%(基数取 lv11 有效值),
|
* 大招(skills[1])lv9/lv16 走 lv_entries 分档成长,lv12 按职业对单项基础属性 +50%(基数取 lv11 有效值),
|
||||||
* revive[0] 与 skills[1] 互斥二选一(配置 revive 时按 lv1/lv9/lv16 走 lv_entries 3 级成长),
|
* revive[0] 与 skills[1] 互斥二选一(配置 revive 时按 lv1/lv9/lv16 走 lv_entries 3 级成长),
|
||||||
* lv6 card_lv 4/5 配 field 光环,card_lv 1/2/3 配 ap_bonus/hp_bonus 基础属性+30/40/50%,
|
* lv6 rarity 4/5 配 field 光环,rarity 1/2/3 配 ap_bonus/hp_bonus 基础属性+30/40/50%,
|
||||||
* 品质(card_lv)相邻基础属性差 5%(仅 lv1 初始 AP/HP/DEF)
|
* 品质(rarity)相邻基础属性差 5%(仅 lv1 初始 AP/HP/DEF)
|
||||||
* 编号:本批复刻英雄集中于 5001~5009,card_lv 按配置(不遵循段位规则)
|
* 编号:本批复刻英雄集中于 5001~5009,rarity 按配置(不遵循段位规则)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// @hero-setup:region-begin
|
// @hero-setup:region-begin
|
||||||
@@ -470,7 +470,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
|
|
||||||
// 5001 紫电魔女 — atking 麻痹 + 大招 6203 大能量波(击退/麻痹)+ 攻击光环(深渊女王复刻)
|
// 5001 紫电魔女 — atking 麻痹 + 大招 6203 大能量波(击退/麻痹)+ 攻击光环(深渊女王复刻)
|
||||||
5001: {
|
5001: {
|
||||||
uuid: 5001, name: "紫电魔女", path: "hm1", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp - 5, ap: HERO_ROLE_BASE[HRole.Mage].ap + 10, def: HERO_ROLE_BASE[HRole.Mage].def,
|
uuid: 5001, name: "紫电魔女", path: "hm1", fac: FacSet.HERO, rarity: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp - 5, ap: HERO_ROLE_BASE[HRole.Mage].ap + 10, def: HERO_ROLE_BASE[HRole.Mage].def,
|
||||||
skills: {
|
skills: {
|
||||||
// 普攻:紫魔球底座 + overrides 注入麻痹
|
// 普攻:紫魔球底座 + overrides 注入麻痹
|
||||||
6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, para: 30 }, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹目标" },
|
6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, para: 30 }, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹目标" },
|
||||||
@@ -497,7 +497,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
},
|
},
|
||||||
// 5002 刀刀暴击 — atking 暴击 + 大招 6100 光闪(出血/多段)+ 暴击/暴伤双光环(剑圣复刻)
|
// 5002 刀刀暴击 — atking 暴击 + 大招 6100 光闪(出血/多段)+ 暴击/暴伤双光环(剑圣复刻)
|
||||||
5002: {
|
5002: {
|
||||||
uuid: 5002, name: "刀刀暴击", path: "hk2", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 15, def: HERO_ROLE_BASE[HRole.Warrior].def,
|
uuid: 5002, name: "刀刀暴击", path: "hk2", fac: FacSet.HERO, rarity: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 15, def: HERO_ROLE_BASE[HRole.Warrior].def,
|
||||||
skills: {
|
skills: {
|
||||||
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥刀对{target}造成攻击力{ap}%伤害" },
|
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥刀对{target}造成攻击力{ap}%伤害" },
|
||||||
// 大招:光闪,独立 cd,按英雄等级分档成长
|
// 大招:光闪,独立 cd,按英雄等级分档成长
|
||||||
@@ -523,7 +523,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
},
|
},
|
||||||
// 5003 格挡反杀 — fstart 剑气 + atked 护盾 + 大招 6103 闪电斩(减攻)(剑豪复刻)
|
// 5003 格挡反杀 — fstart 剑气 + atked 护盾 + 大招 6103 闪电斩(减攻)(剑豪复刻)
|
||||||
5003: {
|
5003: {
|
||||||
uuid: 5003, name: "格挡反杀", path: "hk4", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 10, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 5, def: HERO_ROLE_BASE[HRole.Warrior].def + 5,
|
uuid: 5003, name: "格挡反杀", path: "hk4", fac: FacSet.HERO, rarity: 4, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 10, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 5, def: HERO_ROLE_BASE[HRole.Warrior].def + 5,
|
||||||
skills: {
|
skills: {
|
||||||
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥刀对{target}造成攻击力{ap}%伤害" },
|
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥刀对{target}造成攻击力{ap}%伤害" },
|
||||||
// 大招:闪电斩,独立 cd,按英雄等级分档成长
|
// 大招:闪电斩,独立 cd,按英雄等级分档成长
|
||||||
@@ -554,7 +554,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
},
|
},
|
||||||
// 5004 冻住不谢 — atking 冰冻 + 大招 6203 大能量波(冰冻链)+ 击晕光环(巫妖王复刻)
|
// 5004 冻住不谢 — atking 冰冻 + 大招 6203 大能量波(冰冻链)+ 击晕光环(巫妖王复刻)
|
||||||
5004: {
|
5004: {
|
||||||
uuid: 5004, name: "冻住不谢", path: "hm2", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap + 5, def: HERO_ROLE_BASE[HRole.Mage].def + 5,
|
uuid: 5004, name: "冻住不谢", path: "hm2", fac: FacSet.HERO, rarity: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap + 5, def: HERO_ROLE_BASE[HRole.Mage].def + 5,
|
||||||
skills: {
|
skills: {
|
||||||
6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "射出寒冰珠,对{target}造成攻击力{ap}%伤害" },
|
6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "射出寒冰珠,对{target}造成攻击力{ap}%伤害" },
|
||||||
// 大招:大能量波,独立 cd,按英雄等级分档成长
|
// 大招:大能量波,独立 cd,按英雄等级分档成长
|
||||||
@@ -580,7 +580,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
},
|
},
|
||||||
// 5005 叠甲骑士 — 护盾大招 + fstart 防御 + dead 治疗 + revive 回光返照(黑暗骑士复刻)
|
// 5005 叠甲骑士 — 护盾大招 + fstart 防御 + dead 治疗 + revive 回光返照(黑暗骑士复刻)
|
||||||
5005: {
|
5005: {
|
||||||
uuid: 5005, name: "叠甲骑士", path: "hk1", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 20, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def + 10,
|
uuid: 5005, name: "叠甲骑士", path: "hk1", fac: FacSet.HERO, rarity: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 20, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def + 10,
|
||||||
skills: {
|
skills: {
|
||||||
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥剑对{target}造成攻击力{ap}%伤害" },
|
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥剑对{target}造成攻击力{ap}%伤害" },
|
||||||
// 大招位辅助技能:护盾,按英雄等级分档成长(护盾层数)
|
// 大招位辅助技能:护盾,按英雄等级分档成长(护盾层数)
|
||||||
@@ -616,7 +616,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
},
|
},
|
||||||
// 5006 光明奶爸 — 治疗大招 + atking 自疗 + fstart 防御 + 生命光环(光明骑士复刻)
|
// 5006 光明奶爸 — 治疗大招 + atking 自疗 + fstart 防御 + 生命光环(光明骑士复刻)
|
||||||
5006: {
|
5006: {
|
||||||
uuid: 5006, name: "光明奶爸", path: "hh1", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, hp: HERO_ROLE_BASE[HRole.Support].hp + 15, ap: HERO_ROLE_BASE[HRole.Support].ap, def: HERO_ROLE_BASE[HRole.Support].def + 10,
|
uuid: 5006, name: "光明奶爸", path: "hh1", fac: FacSet.HERO, rarity: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, hp: HERO_ROLE_BASE[HRole.Support].hp + 15, ap: HERO_ROLE_BASE[HRole.Support].ap, def: HERO_ROLE_BASE[HRole.Support].def + 10,
|
||||||
skills: {
|
skills: {
|
||||||
6012: { uuid: 6012, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, desc: "投掷药瓶,对{target}造成攻击力{ap}%伤害" },
|
6012: { uuid: 6012, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, desc: "投掷药瓶,对{target}造成攻击力{ap}%伤害" },
|
||||||
// 大招:治疗,独立 cd,按英雄等级分档成长
|
// 大招:治疗,独立 cd,按英雄等级分档成长
|
||||||
@@ -647,7 +647,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
},
|
},
|
||||||
// 5007 微醺战神 — atking 击退 + 大招 6101 气斩(易伤),lv9 属性补偿(酒仙复刻)
|
// 5007 微醺战神 — atking 击退 + 大招 6101 气斩(易伤),lv9 属性补偿(酒仙复刻)
|
||||||
5007: {
|
5007: {
|
||||||
uuid: 5007, name: "微醺战神", path: "hk3", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 15, ap: HERO_ROLE_BASE[HRole.Tank].ap + 5, def: HERO_ROLE_BASE[HRole.Tank].def + 10,
|
uuid: 5007, name: "微醺战神", path: "hk3", fac: FacSet.HERO, rarity: 3, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 15, ap: HERO_ROLE_BASE[HRole.Tank].ap + 5, def: HERO_ROLE_BASE[HRole.Tank].def + 10,
|
||||||
skills: {
|
skills: {
|
||||||
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥拳对{target}造成攻击力{ap}%伤害" },
|
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥拳对{target}造成攻击力{ap}%伤害" },
|
||||||
// 大招:气斩,独立 cd,按英雄等级分档成长
|
// 大招:气斩,独立 cd,按英雄等级分档成长
|
||||||
@@ -666,14 +666,14 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
{ lv: 6, s_lv: SkillLv.Lv1, name: "雷霆一击", t_num: 3, overrides: { bck: 40 }, desc: "重击{target},击退{bck}" },
|
{ lv: 6, s_lv: SkillLv.Lv1, name: "雷霆一击", t_num: 3, overrides: { bck: 40 }, desc: "重击{target},击退{bck}" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
// card_lv 3:lv6 无光环,改为基础属性+50%
|
// rarity 3:lv6 无光环,改为基础属性+50%
|
||||||
ap_bonus: [{ lv: 6, value: 0.5 }],
|
ap_bonus: [{ lv: 6, value: 0.5 }],
|
||||||
hp_bonus: [{ lv: 6, value: 0.5 }],
|
hp_bonus: [{ lv: 6, value: 0.5 }],
|
||||||
info: "",
|
info: "",
|
||||||
},
|
},
|
||||||
// 5008 眩晕暴击哥 — atking 暴击 + 大招 6104 开山斧(击晕)+ 暴伤光环(齐天大圣复刻)
|
// 5008 眩晕暴击哥 — atking 暴击 + 大招 6104 开山斧(击晕)+ 暴伤光环(齐天大圣复刻)
|
||||||
5008: {
|
5008: {
|
||||||
uuid: 5008, name: "眩晕暴击哥", path: "hk5", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 5, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 20, def: HERO_ROLE_BASE[HRole.Warrior].def,
|
uuid: 5008, name: "眩晕暴击哥", path: "hk5", fac: FacSet.HERO, rarity: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 5, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 20, def: HERO_ROLE_BASE[HRole.Warrior].def,
|
||||||
skills: {
|
skills: {
|
||||||
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥斧对{target}造成攻击力{ap}%伤害" },
|
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥斧对{target}造成攻击力{ap}%伤害" },
|
||||||
// 大招:开山斧,独立 cd,按英雄等级分档成长
|
// 大招:开山斧,独立 cd,按英雄等级分档成长
|
||||||
@@ -699,7 +699,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
},
|
},
|
||||||
// 5009 铁壳斧弟 — atked 叠防 + atking 自疗 + 大招 6101 气斩,lv9 属性补偿(斧小王复刻)
|
// 5009 铁壳斧弟 — atked 叠防 + atking 自疗 + 大招 6101 气斩,lv9 属性补偿(斧小王复刻)
|
||||||
5009: {
|
5009: {
|
||||||
uuid: 5009, name: "铁壳斧弟", path: "hc1", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 10, ap: HERO_ROLE_BASE[HRole.Tank].ap + 5, def: HERO_ROLE_BASE[HRole.Tank].def + 15,
|
uuid: 5009, name: "铁壳斧弟", path: "hc1", fac: FacSet.HERO, rarity: 3, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 10, ap: HERO_ROLE_BASE[HRole.Tank].ap + 5, def: HERO_ROLE_BASE[HRole.Tank].def + 15,
|
||||||
skills: {
|
skills: {
|
||||||
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥斧对{target}造成攻击力{ap}%伤害" },
|
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥斧对{target}造成攻击力{ap}%伤害" },
|
||||||
// 大招:气斩,独立 cd,按英雄等级分档成长
|
// 大招:气斩,独立 cd,按英雄等级分档成长
|
||||||
@@ -724,7 +724,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
{ lv: 6, s_lv: SkillLv.Lv1, name: "坚硬皮肤", t_num: 2, overrides: { TGroup: TGroup.Self, timed_buff_id: 7023, buff_duration: 10 }, desc: "{target}防御提升{buff_value}%,持续{dur}秒" },
|
{ lv: 6, s_lv: SkillLv.Lv1, name: "坚硬皮肤", t_num: 2, overrides: { TGroup: TGroup.Self, timed_buff_id: 7023, buff_duration: 10 }, desc: "{target}防御提升{buff_value}%,持续{dur}秒" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
// card_lv 3:lv6 无光环,改为基础属性+50%
|
// rarity 3:lv6 无光环,改为基础属性+50%
|
||||||
ap_bonus: [{ lv: 6, value: 0.5 }],
|
ap_bonus: [{ lv: 6, value: 0.5 }],
|
||||||
hp_bonus: [{ lv: 6, value: 0.5 }],
|
hp_bonus: [{ lv: 6, value: 0.5 }],
|
||||||
info: "",
|
info: "",
|
||||||
@@ -733,7 +733,7 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
*=============怪物配置列表================
|
*=============怪物配置列表================
|
||||||
* 怪物与英雄采用同一套设定体系:基础值 = HERO_ROLE_BASE[role],品质(card_lv)
|
* 怪物与英雄采用同一套设定体系:基础值 = HERO_ROLE_BASE[role],品质(rarity)
|
||||||
* 相邻基础属性差 5%,成长系数走 HERO_GROW_COEF[grow_type]。
|
* 相邻基础属性差 5%,成长系数走 HERO_GROW_COEF[grow_type]。
|
||||||
* 怪物普攻统一使用 SkillSet 基础单体攻击(6001~6012 段),
|
* 怪物普攻统一使用 SkillSet 基础单体攻击(6001~6012 段),
|
||||||
* 并通过 overrides.ap=100 显式声明伤害为攻击力的 100%。
|
* 并通过 overrides.ap=100 显式声明伤害为攻击力的 100%。
|
||||||
@@ -744,63 +744,63 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
// 基础怪物 (全部固定点位站桩攻击,HType仅决定是前排还是后排)
|
// 基础怪物 (全部固定点位站桩攻击,HType仅决定是前排还是后排)
|
||||||
// 前排怪物 — 战士系基准(Warrior 模板),变体按品质微分定位
|
// 前排怪物 — 战士系基准(Warrior 模板),变体按品质微分定位
|
||||||
6001: {
|
6001: {
|
||||||
uuid: 6001, name: "兽人战士", path: "m1", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.Melee, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 70,
|
uuid: 6001, name: "兽人战士", path: "m1", fac: FacSet.MON, lv: 1, rarity: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.Melee, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 70,
|
||||||
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "基础前排怪, 战士系基准"
|
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "基础前排怪, 战士系基准"
|
||||||
},
|
},
|
||||||
6002: {
|
6002: {
|
||||||
uuid: 6002, name: "兽人精锐战士", path: "m2", fac: FacSet.MON, lv: 1, card_lv: 2, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.Melee, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 110,
|
uuid: 6002, name: "兽人精锐战士", path: "m2", fac: FacSet.MON, lv: 1, rarity: 2, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.Melee, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 110,
|
||||||
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 } }, info: "进阶前排怪, 品质2更快更痛"
|
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 } }, info: "进阶前排怪, 品质2更快更痛"
|
||||||
},
|
},
|
||||||
6003: {
|
6003: {
|
||||||
uuid: 6003, name: "兽人重装兵", path: "m3", fac: FacSet.MON, lv: 1, card_lv: 2, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.Heavy, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 50,
|
uuid: 6003, name: "兽人重装兵", path: "m3", fac: FacSet.MON, lv: 1, rarity: 2, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.Heavy, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 50,
|
||||||
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "重型坦克怪, 高HP低攻承伤位"
|
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "重型坦克怪, 高HP低攻承伤位"
|
||||||
},
|
},
|
||||||
// 后排怪物 — 射手/刺客/法系基准,变体按品质微分定位
|
// 后排怪物 — 射手/刺客/法系基准,变体按品质微分定位
|
||||||
6004: {
|
6004: {
|
||||||
uuid: 6004, name: "兽人射手", path: "m4", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, monType: MonType.Long, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, speed: 70,
|
uuid: 6004, name: "兽人射手", path: "m4", fac: FacSet.MON, lv: 1, rarity: 1, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, monType: MonType.Long, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, speed: 70,
|
||||||
skills: { 6006: { uuid: 6006, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排输出怪, 射手系基准"
|
skills: { 6006: { uuid: 6006, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排输出怪, 射手系基准"
|
||||||
},
|
},
|
||||||
6005: {
|
6005: {
|
||||||
uuid: 6005, name: "兽人刺客", path: "m5", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Long, grow_type: HGrowType.Assassin, role: HRole.Assassin, monType: MonType.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap, def: HERO_ROLE_BASE[HRole.Assassin].def, speed: 130,
|
uuid: 6005, name: "兽人刺客", path: "m5", fac: FacSet.MON, lv: 1, rarity: 1, type: HType.Long, grow_type: HGrowType.Assassin, role: HRole.Assassin, monType: MonType.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap, def: HERO_ROLE_BASE[HRole.Assassin].def, speed: 130,
|
||||||
skills: { 6002: { uuid: 6002, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "高攻速低HP刺客"
|
skills: { 6002: { uuid: 6002, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "高攻速低HP刺客"
|
||||||
},
|
},
|
||||||
// 特殊位怪物
|
// 特殊位怪物
|
||||||
6006: {
|
6006: {
|
||||||
uuid: 6006, name: "骷髅领主", path: "m6", fac: FacSet.MON, lv: 1, card_lv: 3, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 60,
|
uuid: 6006, name: "骷髅领主", path: "m6", fac: FacSet.MON, lv: 1, rarity: 3, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 60,
|
||||||
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排MiniBoss级坦克"
|
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排MiniBoss级坦克"
|
||||||
},
|
},
|
||||||
6007: {
|
6007: {
|
||||||
uuid: 6007, name: "兽人术士", path: "m7", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, monType: MonType.Support, hp: HERO_ROLE_BASE[HRole.Support].hp, ap: HERO_ROLE_BASE[HRole.Support].ap, def: HERO_ROLE_BASE[HRole.Support].def, speed: 70,
|
uuid: 6007, name: "兽人术士", path: "m7", fac: FacSet.MON, lv: 1, rarity: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, monType: MonType.Support, hp: HERO_ROLE_BASE[HRole.Support].hp, ap: HERO_ROLE_BASE[HRole.Support].ap, def: HERO_ROLE_BASE[HRole.Support].def, speed: 70,
|
||||||
skills: { 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排辅助法师怪"
|
skills: { 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排辅助法师怪"
|
||||||
},
|
},
|
||||||
6008: {
|
6008: {
|
||||||
uuid: 6008, name: "兽人火法", path: "m8", fac: FacSet.MON, lv: 1, card_lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.Summoner, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 70,
|
uuid: 6008, name: "兽人火法", path: "m8", fac: FacSet.MON, lv: 1, rarity: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.Summoner, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 70,
|
||||||
skills: { 6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排召唤系法师怪"
|
skills: { 6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排召唤系法师怪"
|
||||||
},
|
},
|
||||||
|
|
||||||
// BOSS怪物 — 与英雄同一套设定(role 模板 + 品质系数),高品质承伤/输出位
|
// BOSS怪物 — 与英雄同一套设定(role 模板 + 品质系数),高品质承伤/输出位
|
||||||
6101: {
|
6101: {
|
||||||
uuid: 6101, name: "兽人首领-双刀战士", path: "mb1", fac: FacSet.MON, lv: 6, card_lv: 4, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 120,
|
uuid: 6101, name: "兽人首领-双刀战士", path: "mb1", fac: FacSet.MON, lv: 6, rarity: 4, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap, def: HERO_ROLE_BASE[HRole.Warrior].def, speed: 120,
|
||||||
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排Boss, 攻速型"
|
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排Boss, 攻速型"
|
||||||
},
|
},
|
||||||
6102: {
|
6102: {
|
||||||
uuid: 6102, name: "兽人首领-斧头战士", path: "mb2", fac: FacSet.MON, lv: 6, card_lv: 5, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 60,
|
uuid: 6102, name: "兽人首领-斧头战士", path: "mb2", fac: FacSet.MON, lv: 6, rarity: 5, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 60,
|
||||||
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排Boss, 超高HP"
|
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排Boss, 超高HP"
|
||||||
},
|
},
|
||||||
6103: {
|
6103: {
|
||||||
uuid: 6103, name: "兽人首领-魔法师", path: "mb3", fac: FacSet.MON, lv: 6, card_lv: 4, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 110,
|
uuid: 6103, name: "兽人首领-魔法师", path: "mb3", fac: FacSet.MON, lv: 6, rarity: 4, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 110,
|
||||||
skills: { 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排法系Boss"
|
skills: { 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2 } } }, info: "后排法系Boss"
|
||||||
},
|
},
|
||||||
6104: {
|
6104: {
|
||||||
uuid: 6104, name: "兽人首领-射手", path: "mb4", fac: FacSet.MON, lv: 6, card_lv: 4, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, speed: 70,
|
uuid: 6104, name: "兽人首领-射手", path: "mb4", fac: FacSet.MON, lv: 6, rarity: 4, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap, def: HERO_ROLE_BASE[HRole.Archer].def, speed: 70,
|
||||||
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排位Boss, 均衡型"
|
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "后排位Boss, 均衡型"
|
||||||
},
|
},
|
||||||
6105: {
|
6105: {
|
||||||
uuid: 6105, name: "亡灵首领-法师", path: "mb5", fac: FacSet.MON, lv: 6, card_lv: 5, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 110,
|
uuid: 6105, name: "亡灵首领-法师", path: "mb5", fac: FacSet.MON, lv: 6, rarity: 5, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, monType: MonType.LongBoss, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap, def: HERO_ROLE_BASE[HRole.Mage].def, speed: 110,
|
||||||
skills: { 6011: { uuid: 6011, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2, timed_buff_id: 7002 } } }, info: "后排高AP Boss"
|
skills: { 6011: { uuid: 6011, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, hit_count: 2, timed_buff_id: 7002 } } }, info: "后排高AP Boss"
|
||||||
},
|
},
|
||||||
6106: {
|
6106: {
|
||||||
uuid: 6106, name: "亡灵首领-骑马战士", path: "mb6", fac: FacSet.MON, lv: 6, card_lv: 5, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 130,
|
uuid: 6106, name: "亡灵首领-骑马战士", path: "mb6", fac: FacSet.MON, lv: 6, rarity: 5, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, monType: MonType.MeleeBoss, hp: HERO_ROLE_BASE[HRole.Tank].hp, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def, speed: 130,
|
||||||
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排终极Boss, 最高HP+高速"
|
skills: { 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.VerySlow].cd, ccd: 0, overrides: { ap: 100 } } }, info: "前排终极Boss, 最高HP+高速"
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -825,7 +825,7 @@ export interface HeroComboInfo {
|
|||||||
name: string; // 阵容名称(体现流派)
|
name: string; // 阵容名称(体现流派)
|
||||||
heroes: number[]; // 英雄 uuid 列表,固定 3 个;索引 0=前排,其余按站位从近到远
|
heroes: number[]; // 英雄 uuid 列表,固定 3 个;索引 0=前排,其余按站位从近到远
|
||||||
desc: string; // 配合思路说明(信息面板展示)
|
desc: string; // 配合思路说明(信息面板展示)
|
||||||
low_heroes?: number[]; // 低配替代阵容(card_lv 1~2,供新手期引导)
|
low_heroes?: number[]; // 低配替代阵容(rarity 1~2,供新手期引导)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -883,21 +883,21 @@ export const HeroComboList: number[] = [8001, 8002, 8003, 8004, 8005, 8006];
|
|||||||
* 英雄卡费用规则
|
* 英雄卡费用规则
|
||||||
* lv1=5, lv2=10, lv3+=15
|
* lv1=5, lv2=10, lv3+=15
|
||||||
*/
|
*/
|
||||||
function getHeroCost(cardLv: number): number {
|
function getHeroCost(rarity: number): number {
|
||||||
if (cardLv === 1) return 5;
|
if (rarity === 1) return 5;
|
||||||
if (cardLv === 2) return 10;
|
if (rarity === 2) return 10;
|
||||||
return 15;
|
return 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 英雄卡按 card_lv 分配抽取权重(几何递减,高等级越稀有)
|
* 英雄卡按 rarity 分配抽取权重(几何递减,高等级越稀有)
|
||||||
* 梯度:lv1=40, lv2=25, lv3=15, lv4=8, lv5=3
|
* 梯度:lv1=40, lv2=25, lv3=15, lv4=8, lv5=3
|
||||||
*/
|
*/
|
||||||
const HERO_WEIGHT_BY_LV: Record<number, number> = {
|
const HERO_WEIGHT_BY_LV: Record<number, number> = {
|
||||||
1: 40, 2: 25, 3: 15, 4: 8, 5: 3,
|
1: 40, 2: 25, 3: 15, 4: 8, 5: 3,
|
||||||
};
|
};
|
||||||
function getHeroWeight(cardLv: number): number {
|
function getHeroWeight(rarity: number): number {
|
||||||
return HERO_WEIGHT_BY_LV[cardLv] ?? HERO_WEIGHT_BY_LV[1];
|
return HERO_WEIGHT_BY_LV[rarity] ?? HERO_WEIGHT_BY_LV[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 动态生成英雄卡池:所有英雄统一生成 lv1 卡牌
|
// 动态生成英雄卡池:所有英雄统一生成 lv1 卡牌
|
||||||
@@ -906,9 +906,9 @@ HeroList.forEach(uuid => {
|
|||||||
if (!hero) return;
|
if (!hero) return;
|
||||||
HeroCardPoolList.push({
|
HeroCardPoolList.push({
|
||||||
uuid: hero.uuid,
|
uuid: hero.uuid,
|
||||||
cost: getHeroCost(hero.card_lv ?? 1),
|
cost: getHeroCost(hero.rarity ?? 1),
|
||||||
weight: getHeroWeight(hero.card_lv ?? 1),
|
weight: getHeroWeight(hero.rarity ?? 1),
|
||||||
card_lv: hero.card_lv ?? 1,
|
rarity: hero.rarity ?? 1,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1039,7 +1039,7 @@ export function getEffectiveStats(hero: heroInfo, targetLv: number): { hp: numbe
|
|||||||
*/
|
*/
|
||||||
export function getHeroDisplayStats(hero: heroInfo, targetLv: number): { hp: number, ap: number, def: number } {
|
export function getHeroDisplayStats(hero: heroInfo, targetLv: number): { hp: number, ap: number, def: number } {
|
||||||
const lv = Math.max(1, Math.floor(targetLv));
|
const lv = Math.max(1, Math.floor(targetLv));
|
||||||
const coef = getHeroQualityCoef(hero.card_lv ?? 1);
|
const coef = getHeroQualityCoef(hero.rarity ?? 1);
|
||||||
const eff = getEffectiveStats(hero, lv);
|
const eff = getEffectiveStats(hero, lv);
|
||||||
const stats = {
|
const stats = {
|
||||||
hp: Math.round(hero.hp * coef) + (eff.hp - hero.hp),
|
hp: Math.round(hero.hp * coef) + (eff.hp - hero.hp),
|
||||||
@@ -1057,7 +1057,7 @@ export function getHeroDisplayStats(hero: heroInfo, targetLv: number): { hp: num
|
|||||||
|
|
||||||
/** 内部:lv12 专项基数(不含 lv12 自身)的展示有效值 */
|
/** 内部:lv12 专项基数(不含 lv12 自身)的展示有效值 */
|
||||||
function getHeroDisplayStatsBase(hero: heroInfo, targetLv: number): { hp: number, ap: number, def: number } {
|
function getHeroDisplayStatsBase(hero: heroInfo, targetLv: number): { hp: number, ap: number, def: number } {
|
||||||
const coef = getHeroQualityCoef(hero.card_lv ?? 1);
|
const coef = getHeroQualityCoef(hero.rarity ?? 1);
|
||||||
const eff = getEffectiveStats(hero, targetLv);
|
const eff = getEffectiveStats(hero, targetLv);
|
||||||
return {
|
return {
|
||||||
hp: Math.round(hero.hp * coef) + (eff.hp - hero.hp),
|
hp: Math.round(hero.hp * coef) + (eff.hp - hero.hp),
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
| 剧毒利刃(普攻30%淬毒) | lv2 atking:6010 紫魔球(远程法师普攻)+ `overrides: { timed_buff_id: 7005(中毒) }`,t_num=3 模拟 30% |
|
| 剧毒利刃(普攻30%淬毒) | lv2 atking:6010 紫魔球(远程法师普攻)+ `overrides: { timed_buff_id: 7005(中毒) }`,t_num=3 模拟 30% |
|
||||||
| 强化声波(击退+30%) | lv3/5 提升 `bck` 档位 |
|
| 强化声波(击退+30%) | lv3/5 提升 `bck` 档位 |
|
||||||
| 女王尖啸(第20秒全场失去18%当前生命+眩晕2秒,每场1次) | lv7 大招升级:6203 大能量波 + `overrides: { ap: 400, timed_buff_id: 7004(击晕) }`;"失去当前生命%"简化为高 ap 直接伤害 |
|
| 女王尖啸(第20秒全场失去18%当前生命+眩晕2秒,每场1次) | lv7 大招升级:6203 大能量波 + `overrides: { ap: 400, timed_buff_id: 7004(击晕) }`;"失去当前生命%"简化为高 ap 直接伤害 |
|
||||||
| 攻击增强 +25% | lv9(card_lv 4/5)攻击光环 7002 |
|
| 攻击增强 +25% | lv9(rarity 4/5)攻击光环 7002 |
|
||||||
|
|
||||||
**推荐配置**:普攻 6010 紫魔球(远程法师系);大招 6203 大能量波(远程群体,击退/击晕);光环 HeroAtk。定位:远程控场法师。
|
**推荐配置**:普攻 6010 紫魔球(远程法师系);大招 6203 大能量波(远程群体,击退/击晕);光环 HeroAtk。定位:远程控场法师。
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
|
|
||||||
## 四、复刻落地清单(按优先级)
|
## 四、复刻落地清单(按优先级)
|
||||||
|
|
||||||
| 优先级 | 英雄(新名) | card_lv 建议 | 核心组合 | 一句话卖点 |
|
| 优先级 | 英雄(新名) | rarity 建议 | 核心组合 | 一句话卖点 |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| P0 | 紫电魔女 | 4 | 6010 紫魔球 + 6203 大能量波(击退/击晕)+ 7005 中毒 + 攻击光环 | 远程群体击退+毒+控场法师 |
|
| P0 | 紫电魔女 | 4 | 6010 紫魔球 + 6203 大能量波(击退/击晕)+ 7005 中毒 + 攻击光环 | 远程群体击退+毒+控场法师 |
|
||||||
| P0 | 刀刀暴击 | 5 | 6100 光闪多段 + `crt` + 7007 出血 + 暴击光环 | 暴击流血剑士 |
|
| P0 | 刀刀暴击 | 5 | 6100 光闪多段 + `crt` + 7007 出血 + 暴击光环 | 暴击流血剑士 |
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:xxx
|
英雄名称:xxx
|
||||||
card_lv:4 // 品质 1~5,决定 uuid 段位与 lv6 是否有光环
|
rarity:4 // 品质 1~5,决定 uuid 段位与 lv6 是否有光环
|
||||||
类型:tank // HRole 职业定位(tank/warrior/assassin/mage/support)
|
类型:tank // HRole 职业定位(tank/warrior/assassin/mage/support)
|
||||||
形态:远程 // 攻击定位:近战/中距/远程(决定普攻底座与 dis)
|
形态:远程 // 攻击定位:近战/中距/远程(决定普攻底座与 dis)
|
||||||
ap:tank+5 // 职业基础值 + 手动偏移
|
ap:tank+5 // 职业基础值 + 手动偏移
|
||||||
@@ -41,7 +41,7 @@ atking[0]_lv6:攻击触发(t_num 模拟概率,1=每次 3≈33% 4≈25%)
|
|||||||
atked[0]_lv6:无
|
atked[0]_lv6:无
|
||||||
fstart[0]_lv6:无
|
fstart[0]_lv6:无
|
||||||
dead[0]_lv6:无
|
dead[0]_lv6:无
|
||||||
field[0]_lv6:驻场光环(仅 card_lv 4/5;card_lv 1/2/3 改为属性+30/40/50%)
|
field[0]_lv6:驻场光环(仅 rarity 4/5;rarity 1/2/3 改为属性+30/40/50%)
|
||||||
revive[0]_lv1:无(与 skills[1] 互斥二选一;配置时与大招同走 lv1/lv9/lv16 三档)
|
revive[0]_lv1:无(与 skills[1] 互斥二选一;配置时与大招同走 lv1/lv9/lv16 三档)
|
||||||
revive[0]_lv9:无
|
revive[0]_lv9:无
|
||||||
revive[0]_lv16:无
|
revive[0]_lv16:无
|
||||||
@@ -52,7 +52,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
- 等级节奏:lv1 激活 skills[0]/skills[1];lv6 解锁 atking/atked/fstart/dead/field 触发技能(触发类技能统一 lv6 激活,各触发槽最多 1 个);大招(skills[1])lv9/lv16 走 `lv_entries` 分档提升;lv12 按职业对单项基础属性 +50%(基数取 lv11 当前等级有效值:坦克→def、战士/辅助→hp、刺客/射手/法师→ap);lv6 光环或属性补偿
|
- 等级节奏:lv1 激活 skills[0]/skills[1];lv6 解锁 atking/atked/fstart/dead/field 触发技能(触发类技能统一 lv6 激活,各触发槽最多 1 个);大招(skills[1])lv9/lv16 走 `lv_entries` 分档提升;lv12 按职业对单项基础属性 +50%(基数取 lv11 当前等级有效值:坦克→def、战士/辅助→hp、刺客/射手/法师→ap);lv6 光环或属性补偿
|
||||||
- **revive 与大招互斥**:`revive[0]` 与 `skills[1]` 只能二选一;配置 revive 的英雄不走大招体系,revive 采用与大招相同的 3 级成长机制(lv1/lv9/lv16 走 `lv_entries` 分档强化)
|
- **revive 与大招互斥**:`revive[0]` 与 `skills[1]` 只能二选一;配置 revive 的英雄不走大招体系,revive 采用与大招相同的 3 级成长机制(lv1/lv9/lv16 走 `lv_entries` 分档强化)
|
||||||
- 品质差异:相邻品质(card_lv)lv1 初始基础属性(AP/HP/DEF)相差 5%(系数 1+0.05×(card_lv-1)),其余配置参数完全一致
|
- 品质差异:相邻品质(rarity)lv1 初始基础属性(AP/HP/DEF)相差 5%(系数 1+0.05×(rarity-1)),其余配置参数完全一致
|
||||||
- 能力只能从能力池(BuffList 7001\~7024 / FieldSkillSet 7001\~7020 / SkillSet 底座)引用 + `overrides` 数值覆盖,**禁止新增同义底座**
|
- 能力只能从能力池(BuffList 7001\~7024 / FieldSkillSet 7001\~7020 / SkillSet 底座)引用 + `overrides` 数值覆盖,**禁止新增同义底座**
|
||||||
|
|
||||||
**大招召唤数约束**(`summon_count` 覆写规则):
|
**大招召唤数约束**(`summon_count` 覆写规则):
|
||||||
@@ -69,7 +69,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:紫电魔女
|
英雄名称:紫电魔女
|
||||||
card_lv:4
|
rarity:4
|
||||||
类型:mage
|
类型:mage
|
||||||
形态:远程
|
形态:远程
|
||||||
ap:mage+10
|
ap:mage+10
|
||||||
@@ -94,7 +94,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:刀刀暴击
|
英雄名称:刀刀暴击
|
||||||
card_lv:5
|
rarity:5
|
||||||
类型:warrior
|
类型:warrior
|
||||||
形态:近战
|
形态:近战
|
||||||
ap:warrior+15
|
ap:warrior+15
|
||||||
@@ -119,7 +119,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:格挡反杀
|
英雄名称:格挡反杀
|
||||||
card_lv:4
|
rarity:4
|
||||||
类型:warrior
|
类型:warrior
|
||||||
形态:近战
|
形态:近战
|
||||||
ap:warrior+5
|
ap:warrior+5
|
||||||
@@ -144,7 +144,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:冻住不谢
|
英雄名称:冻住不谢
|
||||||
card_lv:4
|
rarity:4
|
||||||
类型:mage
|
类型:mage
|
||||||
形态:远程
|
形态:远程
|
||||||
ap:mage+5
|
ap:mage+5
|
||||||
@@ -173,7 +173,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:叠甲骑士
|
英雄名称:叠甲骑士
|
||||||
card_lv:5
|
rarity:5
|
||||||
类型:tank
|
类型:tank
|
||||||
形态:近战
|
形态:近战
|
||||||
ap:tank+0
|
ap:tank+0
|
||||||
@@ -198,7 +198,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:光明奶爸
|
英雄名称:光明奶爸
|
||||||
card_lv:4
|
rarity:4
|
||||||
类型:support
|
类型:support
|
||||||
形态:远程
|
形态:远程
|
||||||
ap:support+0
|
ap:support+0
|
||||||
@@ -223,7 +223,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:微醺战神
|
英雄名称:微醺战神
|
||||||
card_lv:3
|
rarity:3
|
||||||
类型:tank
|
类型:tank
|
||||||
形态:近战
|
形态:近战
|
||||||
ap:tank+5
|
ap:tank+5
|
||||||
@@ -237,7 +237,7 @@ atking[0]_lv6:雷霆一击——普攻3次附加击退强化(t_num3,bck40
|
|||||||
atked[0]_lv6:无
|
atked[0]_lv6:无
|
||||||
fstart[0]_lv6:无
|
fstart[0]_lv6:无
|
||||||
dead[0]_lv6:无
|
dead[0]_lv6:无
|
||||||
field[0]_lv6:无(card_lv3 → 基础属性+50%:ap_bonus/hp_bonus 按档)
|
field[0]_lv6:无(rarity3 → 基础属性+50%:ap_bonus/hp_bonus 按档)
|
||||||
revive[0]_lv1:无
|
revive[0]_lv1:无
|
||||||
revive[0]_lv9:无
|
revive[0]_lv9:无
|
||||||
revive[0]_lv16:无
|
revive[0]_lv16:无
|
||||||
@@ -248,7 +248,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:眩晕暴击哥
|
英雄名称:眩晕暴击哥
|
||||||
card_lv:5
|
rarity:5
|
||||||
类型:warrior
|
类型:warrior
|
||||||
形态:近战
|
形态:近战
|
||||||
ap:warrior+20
|
ap:warrior+20
|
||||||
@@ -273,7 +273,7 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
```
|
```
|
||||||
英雄名称:铁壳斧弟
|
英雄名称:铁壳斧弟
|
||||||
card_lv:3
|
rarity:3
|
||||||
类型:tank
|
类型:tank
|
||||||
形态:近战
|
形态:近战
|
||||||
ap:tank+5
|
ap:tank+5
|
||||||
@@ -287,7 +287,7 @@ atking[0]_lv6:嗜血战斧——攻击4次触发自疗(t_num4,6302 ap120
|
|||||||
atked[0]_lv6:坚硬皮肤——受击2次叠加防御(t_num2,buff 7023 防御强化,buff_duration 10 可叠层)
|
atked[0]_lv6:坚硬皮肤——受击2次叠加防御(t_num2,buff 7023 防御强化,buff_duration 10 可叠层)
|
||||||
fstart[0]_lv6:无
|
fstart[0]_lv6:无
|
||||||
dead[0]_lv6:无
|
dead[0]_lv6:无
|
||||||
field[0]_lv6:无(card_lv3 → 基础属性+50%:ap_bonus/hp_bonus 按档)
|
field[0]_lv6:无(rarity3 → 基础属性+50%:ap_bonus/hp_bonus 按档)
|
||||||
revive[0]_lv1:无
|
revive[0]_lv1:无
|
||||||
revive[0]_lv9:无
|
revive[0]_lv9:无
|
||||||
revive[0]_lv16:无
|
revive[0]_lv16:无
|
||||||
@@ -316,10 +316,10 @@ revive[0]_lv16:无
|
|||||||
|
|
||||||
怪物与英雄采用同一套设定体系:
|
怪物与英雄采用同一套设定体系:
|
||||||
|
|
||||||
- **基础值与品质**:基础属性取 `HERO_ROLE_BASE[role]`,`card_lv` 决定品质(相邻品质基础属性差 5%,仅作用 lv1 初始 AP/HP/DEF)
|
- **基础值与品质**:基础属性取 `HERO_ROLE_BASE[role]`,`rarity` 决定品质(相邻品质基础属性差 5%,仅作用 lv1 初始 AP/HP/DEF)
|
||||||
- **成长系数**:走 `HERO_GROW_COEF[grow_type]`(含 hp/ap/def),与英雄一致
|
- **成长系数**:走 `HERO_GROW_COEF[grow_type]`(含 hp/ap/def),与英雄一致
|
||||||
- **数值平衡**:怪物与英雄仅通过**品质差异**(`card_lv`)拉开数值,高难波次用更高 `card_lv` 的怪物变体承担压场
|
- **数值平衡**:怪物与英雄仅通过**品质差异**(`rarity`)拉开数值,高难波次用更高 `rarity` 的怪物变体承担压场
|
||||||
- **Boss**:同体系,通过高 `card_lv`(4/5)实现承伤/输出压制
|
- **Boss**:同体系,通过高 `rarity`(4/5)实现承伤/输出压制
|
||||||
- **成长驱动**:怪物按等级成长由后续肉鸽配置驱动;当前配置承担“职业基准 + 品质差异”的静态表达,运行时按品质系数缩放基础值
|
- **成长驱动**:怪物按等级成长由后续肉鸽配置驱动;当前配置承担“职业基准 + 品质差异”的静态表达,运行时按品质系数缩放基础值
|
||||||
|
|
||||||
## 配置检查清单
|
## 配置检查清单
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
> **前置约束**(已确认的设计原则):
|
> **前置约束**(已确认的设计原则):
|
||||||
> - 局内固定(战斗开始召唤的时候同)等级成长移交局外(局外等级与碎片数量)
|
> - 局内固定(战斗开始召唤的时候同)等级成长移交局外(局外等级与碎片数量)
|
||||||
> - 单场战斗 30 左右秒
|
> - 单场战斗 30 左右秒
|
||||||
> - card_lv 角色品质(1~5):初始基础数值带有品质增量,每升 1级都是按 20% 增量。
|
> - rarity 角色品质(1~5):初始基础数值带有品质增量,每升 1级都是按 20% 增量。
|
||||||
> - 初始 技能 普通攻击和大招 skills[0]、skills[1](对应"普通攻击"、"大招"),| 复活 | `SkillTriggerType.Revive` | 属于大招
|
> - 初始 技能 普通攻击和大招 skills[0]、skills[1](对应"普通攻击"、"大招"),| 复活 | `SkillTriggerType.Revive` | 属于大招
|
||||||
> - lv2: atking/atked/fstart 提升普通攻击能力,atking/atked 附加临时buff,fstart 局内持久 buff
|
> - lv2: atking/atked/fstart 提升普通攻击能力,atking/atked 附加临时buff,fstart 局内持久 buff
|
||||||
> - lv3/lv5/lv7: skills[1] 提升大招能力,攻击附加 buff 或 debuff
|
> - lv3/lv5/lv7: skills[1] 提升大招能力,攻击附加 buff 或 debuff
|
||||||
> - lv9 card_lv 4/5 英雄新增能力驻场光环;card_lv 1/2/3 额外提升基础属性30/40/50%
|
> - lv9 rarity 4/5 英雄新增能力驻场光环;rarity 1/2/3 额外提升基础属性30/40/50%
|
||||||
> - 能力的附加 采用引用+数值覆盖 skillset 和 bufflist(skillset 和 bufflist是底座,已存在能力就不能添加,只要数值替代就可以)
|
> - 能力的附加 采用引用+数值覆盖 skillset 和 bufflist(skillset 和 bufflist是底座,已存在能力就不能添加,只要数值替代就可以)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
| `bck` | 额外击退距离增量 | `overrides.bck` | 气斩、重击 |
|
| `bck` | 额外击退距离增量 | `overrides.bck` | 气斩、重击 |
|
||||||
|
|
||||||
### 2.4 驻场光环能力池(FieldSkillType)
|
### 2.4 驻场光环能力池(FieldSkillType)
|
||||||
| 能力 | FieldSkillType | 底座 uuid | 适用 card_lv | 几何王国对应场景 |
|
| 能力 | FieldSkillType | 底座 uuid | 适用 rarity | 几何王国对应场景 |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| 战后恢复 | WaveHeal | 7001 | 4/5 | 团队续航 |
|
| 战后恢复 | WaveHeal | 7001 | 4/5 | 团队续航 |
|
||||||
| 攻击光环 | HeroAtk | 7002 | 4/5 | 团队输出强化 |
|
| 攻击光环 | HeroAtk | 7002 | 4/5 | 团队输出强化 |
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
| 多段释放 | `num` | `overrides: { num: 2 }` |
|
| 多段释放 | `num` | `overrides: { num: 2 }` |
|
||||||
|
|
||||||
### 2.6 能力组合范式(英雄设计指引)
|
### 2.6 能力组合范式(英雄设计指引)
|
||||||
| 英雄定位 | 普攻(lv2) | 大招(lv3/5/7) | 光环(lv9,card_lv 4/5) | 核心能力组合 |
|
| 英雄定位 | 普攻(lv2) | 大招(lv3/5/7) | 光环(lv9,rarity 4/5) | 核心能力组合 |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| 暴击输出 | `crt` + 攻击强化(7001) | `crt` + 出血(7007) | 暴击光环(7004)/暴伤光环(7005) | 暴击率→出血→被暴击率联动 |
|
| 暴击输出 | `crt` + 攻击强化(7001) | `crt` + 出血(7007) | 暴击光环(7004)/暴伤光环(7005) | 暴击率→出血→被暴击率联动 |
|
||||||
| 冰冻控制 | `frz` + 冰冻(7003) | `frz` + 冰冻(7003)+ 减攻(7006) | 击晕光环(7003) | 冰冻→减攻→团队控制链 |
|
| 冰冻控制 | `frz` + 冰冻(7003) | `frz` + 冰冻(7003)+ 减攻(7006) | 击晕光环(7003) | 冰冻→减攻→团队控制链 |
|
||||||
|
|||||||
@@ -98,13 +98,13 @@ interface HeroConfigFile {
|
|||||||
| 不变量 | 依赖方 |
|
| 不变量 | 依赖方 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 4 空格缩进、双引号、行尾无分号风格跟随原文件 | 全部 diff 工具 |
|
| 4 空格缩进、双引号、行尾无分号风格跟随原文件 | 全部 diff 工具 |
|
||||||
| 条目头字段单行紧凑(`uuid, name, path, fac, card_lv, lv, type, grow_type, role, hp, ap, def` 一行),触发块换行展开 | 现有阅读习惯 |
|
| 条目头字段单行紧凑(`uuid, name, path, fac, rarity, lv, type, grow_type, role, hp, ap, def` 一行),触发块换行展开 | 现有阅读习惯 |
|
||||||
| 按 uuid 段位插入注释块(`// ===== card_lv=5(5401-5499)=====`) | 段位规则 |
|
| 按 uuid 段位插入注释块(`// ===== rarity=5(5401-5499)=====`) | 段位规则 |
|
||||||
| **档位数组 lv 严格升序**(lv_entries / LvTriggerEntry[] / field / revive / ap_bonus / hp_bonus) | `HeroSkillDesc.ts:384` 的 `filter(e=>e.lv<=lv).pop()` |
|
| **档位数组 lv 严格升序**(lv_entries / LvTriggerEntry[] / field / revive / ap_bonus / hp_bonus) | `HeroSkillDesc.ts:384` 的 `filter(e=>e.lv<=lv).pop()` |
|
||||||
| 数字键无引号、保持插入序 | Record 索引 |
|
| 数字键无引号、保持插入序 | Record 索引 |
|
||||||
| `ccd: 0` 占位字段不丢(HSkillInfo 必填) | Hero.ts 加载 |
|
| `ccd: 0` 占位字段不丢(HSkillInfo 必填) | Hero.ts 加载 |
|
||||||
| 字段顺序稳定(skills → atked/atking → dead → fstart → field → revive → info) | 减少 diff 噪音 |
|
| 字段顺序稳定(skills → atked/atking → dead → fstart → field → revive → info) | 减少 diff 噪音 |
|
||||||
| HeroList 按 card_lv 分组升序 | CardSet 卡池派生顺序 |
|
| HeroList 按 rarity 分组升序 | CardSet 卡池派生顺序 |
|
||||||
| `info: ""` 收尾、`path/icon/info` 字符串原样不转义变换 | 文本保真 |
|
| `info: ""` 收尾、`path/icon/info` 字符串原样不转义变换 | 文本保真 |
|
||||||
| **文件头 BOM 原样保留**(读 utf-8 后首字符检测写回) | 避免整文件 diff |
|
| **文件头 BOM 原样保留**(读 utf-8 后首字符检测写回) | 避免整文件 diff |
|
||||||
|
|
||||||
@@ -163,8 +163,8 @@ interface HeroConfigFile {
|
|||||||
| 规则 | 说明 |
|
| 规则 | 说明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| lv > 6 档位 | `HERO_MAX_LV=6` 封顶,lv7/9 档当前永不生效(数据先行,运行时扩展上限后自动生效) |
|
| lv > 6 档位 | `HERO_MAX_LV=6` 封顶,lv7/9 档当前永不生效(数据先行,运行时扩展上限后自动生效) |
|
||||||
| card_lv 1/2/3 配了 field | 应改走 ap_bonus/hp_bonus(30/40/50% 补偿) |
|
| rarity 1/2/3 配了 field | 应改走 ap_bonus/hp_bonus(30/40/50% 补偿) |
|
||||||
| card_lv 4/5 的 lv9 未配 field | 按设计指引应有驻场光环 |
|
| rarity 4/5 的 lv9 未配 field | 按设计指引应有驻场光环 |
|
||||||
| infos 条数与实际档位不匹配 | 面板逐条展示依赖 |
|
| infos 条数与实际档位不匹配 | 面板逐条展示依赖 |
|
||||||
|
|
||||||
## 六、UI 设计
|
## 六、UI 设计
|
||||||
@@ -177,7 +177,7 @@ interface HeroConfigFile {
|
|||||||
┌ [强度评估 | 英雄配置●] ────────────────────────── ●=有未保存改动 ┐
|
┌ [强度评估 | 英雄配置●] ────────────────────────── ●=有未保存改动 ┐
|
||||||
├────────────┬──────────────────────────────┬─────────┤
|
├────────────┬──────────────────────────────┬─────────┤
|
||||||
│ 🔍搜索 │ 锚点导航: 基础|技能|触发|光环|复活|加成|说明 │ 校验抽屉 │
|
│ 🔍搜索 │ 锚点导航: 基础|技能|触发|光环|复活|加成|说明 │ 校验抽屉 │
|
||||||
│ ▾LV5 │ ①基础: uuid/name/path/card_lv/role/type │ ✕2 ⚠1 │
|
│ ▾LV5 │ ①基础: uuid/name/path/rarity/role/type │ ✕2 ⚠1 │
|
||||||
│ ●5401 刀刀│ hp/ap/def 基准+增量双输入(显示合计) │ 点击 │
|
│ ●5401 刀刀│ hp/ap/def 基准+增量双输入(显示合计) │ 点击 │
|
||||||
│ ▾LV4 … │ ②技能: [普攻|大招] SkillPicker + 底座只读条 │ 定位 │
|
│ ▾LV4 … │ ②技能: [普攻|大招] SkillPicker + 底座只读条 │ 定位 │
|
||||||
│ [+新建] │ + OverridesEditor + 档位矩阵 │ [保存] │
|
│ [+新建] │ + OverridesEditor + 档位矩阵 │ [保存] │
|
||||||
@@ -188,7 +188,7 @@ interface HeroConfigFile {
|
|||||||
|
|
||||||
| 组件 | 职责 | 数据源 | 校验 |
|
| 组件 | 职责 | 数据源 | 校验 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| HeroListView | card_lv 分组、搜索、dirty 圆点、新建入口 | heroSet.data.json | – |
|
| HeroListView | rarity 分组、搜索、dirty 圆点、新建入口 | heroSet.data.json | – |
|
||||||
| BaseForm | 基础字段;hp/ap/def 基准+增量双输入 | HERO_ROLE_BASE | uuid 段位/重复;role→type 联动锁定 |
|
| BaseForm | 基础字段;hp/ap/def 基准+增量双输入 | HERO_ROLE_BASE | uuid 段位/重复;role→type 联动锁定 |
|
||||||
| SkillPicker | 自制搜索下拉选 SkillSet,显示 `6200 火焰喷射 · 远程 · AOE` | SkillSet | 普攻限 6001~6012 按 IType 过滤;大招按形态过滤;辅助技能放行 |
|
| SkillPicker | 自制搜索下拉选 SkillSet,显示 `6200 火焰喷射 · 远程 · AOE` | SkillSet | 普攻限 6001~6012 按 IType 过滤;大招按形态过滤;辅助技能放行 |
|
||||||
| SkillBasePanel | 底座关键参数只读展示(ap/cd/hit/IType/RType/DTType) | SkillSet | – |
|
| SkillBasePanel | 底座关键参数只读展示(ap/cd/hit/IType/RType/DTType) | SkillSet | – |
|
||||||
@@ -196,14 +196,14 @@ interface HeroConfigFile {
|
|||||||
| LvMatrix | lv 档位矩阵(技能 lv_entries / 触发档 / field / revive 复用变体):行=lv1/2/3/5/7/9、列=参数,可整行复制加档;**lv7/9 行黄色边框+⚠「运行时 HERO_MAX_LV=6 暂不生效」** | 当前英雄 | lv 升序不重复;t_num≥1 |
|
| LvMatrix | lv 档位矩阵(技能 lv_entries / 触发档 / field / revive 复用变体):行=lv1/2/3/5/7/9、列=参数,可整行复制加档;**lv7/9 行黄色边框+⚠「运行时 HERO_MAX_LV=6 暂不生效」** | 当前英雄 | lv 升序不重复;t_num≥1 |
|
||||||
| TriggerGroupEditor | s_uuid 卡片嵌套档位行(外层技能组、内层档位),保存时统一升序 | SkillSet | s_uuid 存在性 |
|
| TriggerGroupEditor | s_uuid 卡片嵌套档位行(外层技能组、内层档位),保存时统一升序 | SkillSet | s_uuid 存在性 |
|
||||||
| InfosEditor | 9 档分级说明文本 | 当前英雄 | 条数与档位对照提示 |
|
| InfosEditor | 9 档分级说明文本 | 当前英雄 | 条数与档位对照提示 |
|
||||||
| BonusEditor | ap_bonus/hp_bonus 档位(lv+value) | 当前英雄 | 仅 card_lv1/2/3 提示使用 |
|
| BonusEditor | ap_bonus/hp_bonus 档位(lv+value) | 当前英雄 | 仅 rarity1/2/3 提示使用 |
|
||||||
| ValidationPanel | 错误/警告列表(区域·字段·消息),点击 scrollIntoView + 字段红框高亮;保存按钮 error>0 时禁用 | 校验器输出 | – |
|
| ValidationPanel | 错误/警告列表(区域·字段·消息),点击 scrollIntoView + 字段红框高亮;保存按钮 error>0 时禁用 | 校验器输出 | – |
|
||||||
|
|
||||||
### 6.3 关键交互
|
### 6.3 关键交互
|
||||||
|
|
||||||
- **ui- 组件与 Vue 混用**:`isCustomElement` 已配置;ui- 元素 `v-model` 不生效,须 `:value` + `@change`/`@confirm` 手动双向;属性用 kebab-case
|
- **ui- 组件与 Vue 混用**:`isCustomElement` 已配置;ui- 元素 `v-model` 不生效,须 `:value` + `@change`/`@confirm` 手动双向;属性用 kebab-case
|
||||||
- **自制组件**(ui- 缺失):档位矩阵表格、可搜索 SkillPicker、BuffList 分组下拉、校验列表、确认 modal
|
- **自制组件**(ui- 缺失):档位矩阵表格、可搜索 SkillPicker、BuffList 分组下拉、校验列表、确认 modal
|
||||||
- **新建向导**:单屏 modal——选 card_lv → role →(形态按映射自动锁定为只读徽章)→ 模板预填:uuid 取段位内最小空位、职业基准属性(增量 0)、按指引 2.6 能力组合范式推荐技能(tank→6004+6301、support→6009+6302 等)、lv3/5/7 空档骨架;提供「空白模板」选项
|
- **新建向导**:单屏 modal——选 rarity → role →(形态按映射自动锁定为只读徽章)→ 模板预填:uuid 取段位内最小空位、职业基准属性(增量 0)、按指引 2.6 能力组合范式推荐技能(tank→6004+6301、support→6009+6302 等)、lv3/5/7 空档骨架;提供「空白模板」选项
|
||||||
- **状态管理**:dirty 深度 watch(加载时存 snapshot 对比),列表项与 tab 标题打点;切换英雄/切 tab 弹确认(放弃/留下);底座加载沿用 spawn 异步 + loading 态
|
- **状态管理**:dirty 深度 watch(加载时存 snapshot 对比),列表项与 tab 标题打点;切换英雄/切 tab 弹确认(放弃/留下);底座加载沿用 spawn 异步 + loading 态
|
||||||
- **保存流程**:error>0 → 保存禁用(tooltip 显示错误数);仅 warning → 自制 modal 确认后执行保存流水线
|
- **保存流程**:error>0 → 保存禁用(tooltip 显示错误数);仅 warning → 自制 modal 确认后执行保存流水线
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ export class Hero extends ecs.Entity {
|
|||||||
* 2) 初始化表现与属性数据
|
* 2) 初始化表现与属性数据
|
||||||
* 3) 播放下落入场并在落地后启用碰撞与移动
|
* 3) 播放下落入场并在落地后启用碰撞与移动
|
||||||
*/
|
*/
|
||||||
load(pos: Vec3 = Vec3.ZERO, scale: number = 1, uuid: number = 1001, dropToY: number = pos.y, hero_lv: number = 1, card_lv: number = 1, posIndex: number = -1) {
|
load(pos: Vec3 = Vec3.ZERO, scale: number = 1, uuid: number = 1001, dropToY: number = pos.y, hero_lv: number = 1, rarity: number = 1, posIndex: number = -1) {
|
||||||
// 英雄始终朝右,表现缩放固定为正向
|
// 英雄始终朝右,表现缩放固定为正向
|
||||||
scale = 1
|
scale = 1
|
||||||
// 英雄等级上限以配置为准,合成可升到 HERO_MAX_LV
|
// 英雄等级上限以配置为准,合成可升到 HERO_MAX_LV
|
||||||
@@ -117,8 +117,8 @@ export class Hero extends ecs.Entity {
|
|||||||
model.hero_uuid = uuid;
|
model.hero_uuid = uuid;
|
||||||
model.hero_name = hero.name;
|
model.hero_name = hero.name;
|
||||||
model.lv = hero_lv;
|
model.lv = hero_lv;
|
||||||
model.card_lv = card_lv;
|
model.rarity = rarity;
|
||||||
model.base_card_lv = hero.card_lv ?? 1;
|
model.base_rarity = hero.rarity ?? 1;
|
||||||
model.type = hero.type;
|
model.type = hero.type;
|
||||||
model.grow_type = hero.grow_type;
|
model.grow_type = hero.grow_type;
|
||||||
model.role = hero.role;
|
model.role = hero.role;
|
||||||
@@ -144,7 +144,7 @@ export class Hero extends ecs.Entity {
|
|||||||
|
|
||||||
// 基础属性:固定基础值 × 品质系数(相邻品质差 5%),成长由 grow_type 线性递增提供
|
// 基础属性:固定基础值 × 品质系数(相邻品质差 5%),成长由 grow_type 线性递增提供
|
||||||
// TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算
|
// TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算
|
||||||
const qualityCoef = getHeroQualityCoef(hero.card_lv ?? 1);
|
const qualityCoef = getHeroQualityCoef(hero.rarity ?? 1);
|
||||||
let base_ap = Math.round(hero.ap * qualityCoef);
|
let base_ap = Math.round(hero.ap * qualityCoef);
|
||||||
let base_hp = Math.round(hero.hp * qualityCoef);
|
let base_hp = Math.round(hero.hp * qualityCoef);
|
||||||
let base_def = Math.round(hero.def * qualityCoef);
|
let base_def = Math.round(hero.def * qualityCoef);
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
smc.mission.dead_heroes.push({
|
smc.mission.dead_heroes.push({
|
||||||
uuid: attrs.hero_uuid,
|
uuid: attrs.hero_uuid,
|
||||||
lv: attrs.lv,
|
lv: attrs.lv,
|
||||||
card_lv: attrs.card_lv,
|
rarity: attrs.rarity,
|
||||||
posIndex: attrs.posIndex,
|
posIndex: attrs.posIndex,
|
||||||
wave: Math.max(1, smc.vmdata?.mission_data?.level ?? 1),
|
wave: Math.max(1, smc.vmdata?.mission_data?.level ?? 1),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
hero_uuid: number = 1001;
|
hero_uuid: number = 1001;
|
||||||
hero_name: string = "hero";
|
hero_name: string = "hero";
|
||||||
lv: number = 1;
|
lv: number = 1;
|
||||||
card_lv: number = 1;
|
rarity: number = 1;
|
||||||
base_card_lv: number = 1;
|
base_rarity: number = 1;
|
||||||
type: number = 0; // 0近战 1远程 2辅助
|
type: number = 0; // 0近战 1远程 2辅助
|
||||||
fac: number = 0; // 0:hero 1:monster
|
fac: number = 0; // 0:hero 1:monster
|
||||||
grow_type?: number; // 成长类型(HGrowType),驱动每级 hp/ap 线性成长
|
grow_type?: number; // 成长类型(HGrowType),驱动每级 hp/ap 线性成长
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ export class Monster extends ecs.Entity {
|
|||||||
// 模型层参数:身份、阵营、基础数值(基础值按品质系数缩放,与英雄同一套设定)
|
// 模型层参数:身份、阵营、基础数值(基础值按品质系数缩放,与英雄同一套设定)
|
||||||
model.hero_uuid = uuid;
|
model.hero_uuid = uuid;
|
||||||
model.hero_name = hero.name;
|
model.hero_name = hero.name;
|
||||||
const coef = getHeroQualityCoef(hero.card_lv ?? 1);
|
const coef = getHeroQualityCoef(hero.rarity ?? 1);
|
||||||
model.hp = model.hp_max = Math.round(hero.hp * coef);
|
model.hp = model.hp_max = Math.round(hero.hp * coef);
|
||||||
model.ap = Math.round(hero.ap * coef);
|
model.ap = Math.round(hero.ap * coef);
|
||||||
// TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算
|
// TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
|||||||
heroView?: HeroViewComp,
|
heroView?: HeroViewComp,
|
||||||
triggerType?: string,
|
triggerType?: string,
|
||||||
isCardSkill?: boolean,
|
isCardSkill?: boolean,
|
||||||
card_lv?: number,
|
rarity?: number,
|
||||||
targetPos?: Vec3,
|
targetPos?: Vec3,
|
||||||
overrides?: any
|
overrides?: any
|
||||||
}) {
|
}) {
|
||||||
@@ -61,7 +61,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
|||||||
|
|
||||||
// 卡牌技能直接触发
|
// 卡牌技能直接触发
|
||||||
if (args.isCardSkill) {
|
if (args.isCardSkill) {
|
||||||
this.forceCastCardSkill(args.s_uuid, args.card_lv || 1, args.targetPos || new Vec3(FightSet.CSKILL_START_X, FightSet.CSKILL_START_Y, 0), args.overrides);
|
this.forceCastCardSkill(args.s_uuid, args.rarity || 1, args.targetPos || new Vec3(FightSet.CSKILL_START_X, FightSet.CSKILL_START_Y, 0), args.overrides);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
|||||||
* 强制执行卡牌技能
|
* 强制执行卡牌技能
|
||||||
* 卡牌技能没有施法者主体,直接从指定坐标释放,或者对全体/随机友方生效
|
* 卡牌技能没有施法者主体,直接从指定坐标释放,或者对全体/随机友方生效
|
||||||
*/
|
*/
|
||||||
public forceCastCardSkill(s_uuid: number, cardLv: number, spawnPos: Vec3, overrides?: SkillOverrides) {
|
public forceCastCardSkill(s_uuid: number, rarity: number, spawnPos: Vec3, overrides?: SkillOverrides) {
|
||||||
let config = SkillSet[s_uuid];
|
let config = SkillSet[s_uuid];
|
||||||
if (!config) return;
|
if (!config) return;
|
||||||
config = mergeSkillParams(config, overrides);
|
config = mergeSkillParams(config, overrides);
|
||||||
@@ -102,7 +102,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
|||||||
|
|
||||||
// 动态计算卡牌的虚拟攻击力:
|
// 动态计算卡牌的虚拟攻击力:
|
||||||
// 1. 根据卡牌等级给予基础成长(同英雄升级公式,基准设为 100)
|
// 1. 根据卡牌等级给予基础成长(同英雄升级公式,基准设为 100)
|
||||||
let baseAp = 100 * Math.pow(FightSet.HERO_LV_MULTIPLIER, cardLv - 1);
|
let baseAp = 100 * Math.pow(FightSet.HERO_LV_MULTIPLIER, rarity - 1);
|
||||||
let highestAp = baseAp;
|
let highestAp = baseAp;
|
||||||
|
|
||||||
// 2. 获取场上最高攻击力的英雄,保证后期奶量/增益绝对够用
|
// 2. 获取场上最高攻击力的英雄,保证后期奶量/增益绝对够用
|
||||||
@@ -156,10 +156,10 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
|||||||
const friendlyTargets = this.resolveFriendlyTargets(targetEids, FacSet.HERO);
|
const friendlyTargets = this.resolveFriendlyTargets(targetEids, FacSet.HERO);
|
||||||
mLogger.log(this.debugMode, "SCastSystem", "friendlyTargets count =", friendlyTargets.length);
|
mLogger.log(this.debugMode, "SCastSystem", "friendlyTargets count =", friendlyTargets.length);
|
||||||
if (friendlyTargets.length === 0) return;
|
if (friendlyTargets.length === 0) return;
|
||||||
this.applyFriendlySkillEffects(s_uuid, cardLv, config, null as any, mockAttrs, friendlyTargets, spawnPos);
|
this.applyFriendlySkillEffects(s_uuid, rarity, config, null as any, mockAttrs, friendlyTargets, spawnPos);
|
||||||
} else {
|
} else {
|
||||||
const enemyTargetPos = this.resolveRepeatCastTargetPos(targetPos, i);
|
const enemyTargetPos = this.resolveRepeatCastTargetPos(targetPos, i);
|
||||||
this.createSkillEntityForCard(s_uuid, cardLv, mockAttrs, spawnPos, enemyTargetPos, i, overrides);
|
this.createSkillEntityForCard(s_uuid, rarity, mockAttrs, spawnPos, enemyTargetPos, i, overrides);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ export class CHeroComp extends CCComp {
|
|||||||
nodeUuid: this.node?.uuid,
|
nodeUuid: this.node?.uuid,
|
||||||
uuid: data?.uuid ?? null,
|
uuid: data?.uuid ?? null,
|
||||||
name: data?.name ?? null,
|
name: data?.name ?? null,
|
||||||
card_lv: data?.card_lv ?? null,
|
rarity: data?.rarity ?? null,
|
||||||
cost: data?.cost ?? null,
|
cost: data?.cost ?? null,
|
||||||
nodeActiveBefore: this.node?.active
|
nodeActiveBefore: this.node?.active
|
||||||
});
|
});
|
||||||
@@ -267,7 +267,7 @@ export class CHeroComp extends CCComp {
|
|||||||
this.level_label.string = heroLv > 1 ? `Lv.${heroLv}` : "";
|
this.level_label.string = heroLv > 1 ? `Lv.${heroLv}` : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// 背景:按 card_lv 激活对应颜色子节点(1→green 2→blue 3→purple 4→red 5→yellow)
|
// 背景:按 rarity 激活对应颜色子节点(1→green 2→blue 3→purple 4→red 5→yellow)
|
||||||
this.updateBgNode();
|
this.updateBgNode();
|
||||||
|
|
||||||
// 描述富文本:展示英雄当前局外等级的能力(buildHeroSkillDesc 文本一)
|
// 描述富文本:展示英雄当前局外等级的能力(buildHeroSkillDesc 文本一)
|
||||||
@@ -301,13 +301,13 @@ export class CHeroComp extends CCComp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
|
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
|
||||||
* 等级与颜色对应关系:
|
* 等级与颜色对应关系:
|
||||||
* card_lv 1 → green
|
* rarity 1 → green
|
||||||
* card_lv 2 → blue
|
* rarity 2 → blue
|
||||||
* card_lv 3 → purple
|
* rarity 3 → purple
|
||||||
* card_lv 4 → red
|
* rarity 4 → red
|
||||||
* card_lv 5 → yellow
|
* rarity 5 → yellow
|
||||||
*/
|
*/
|
||||||
private updateBgNode() {
|
private updateBgNode() {
|
||||||
if (!this.bg_node || !this.cardData) return;
|
if (!this.bg_node || !this.cardData) return;
|
||||||
@@ -318,7 +318,7 @@ export class CHeroComp extends CCComp {
|
|||||||
4: "red",
|
4: "red",
|
||||||
5: "yellow",
|
5: "yellow",
|
||||||
};
|
};
|
||||||
const targetColor = lvToColor[this.cardData.card_lv ?? 1];
|
const targetColor = lvToColor[this.cardData.rarity ?? 1];
|
||||||
this.bg_node.children.forEach(child => {
|
this.bg_node.children.forEach(child => {
|
||||||
child.active = (child.name === targetColor);
|
child.active = (child.name === targetColor);
|
||||||
});
|
});
|
||||||
@@ -542,7 +542,7 @@ export class CHeroComp extends CCComp {
|
|||||||
reason: "",
|
reason: "",
|
||||||
uuid: this.cardData.uuid,
|
uuid: this.cardData.uuid,
|
||||||
hero_lv: smc.getHeroOuterLv(this.cardData.uuid),
|
hero_lv: smc.getHeroOuterLv(this.cardData.uuid),
|
||||||
card_lv: this.cardData.base_card_lv ?? this.cardData.card_lv ?? 1
|
rarity: this.cardData.base_rarity ?? this.cardData.rarity ?? 1
|
||||||
};
|
};
|
||||||
oops.message.dispatchEvent(GameEvent.UseHeroCard, guard);
|
oops.message.dispatchEvent(GameEvent.UseHeroCard, guard);
|
||||||
if (guard.cancel) return;
|
if (guard.cancel) return;
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { _decorator, Component } from "cc";
|
import { _decorator, Component } from "cc";
|
||||||
import { CARD_LV_BG_COLORS } from "../common/config/GameSet";
|
import { RARITY_BG_COLORS } from "../common/config/GameSet";
|
||||||
|
|
||||||
const { ccclass } = _decorator;
|
const { ccclass } = _decorator;
|
||||||
|
|
||||||
@ccclass('CardBgComp')
|
@ccclass('CardBgComp')
|
||||||
export class CardBgComp extends Component {
|
export class CardBgComp extends Component {
|
||||||
|
|
||||||
apply(card_lv: number) {
|
apply(rarity: number) {
|
||||||
const color = CARD_LV_BG_COLORS[Math.min(card_lv, 5) - 1];
|
const color = RARITY_BG_COLORS[Math.min(rarity, 5) - 1];
|
||||||
this.node.children.forEach(c => c.active = c.name === color);
|
this.node.children.forEach(c => c.active = c.name === color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ec
|
|||||||
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
||||||
import { oops } from "db://oops-framework/core/Oops";
|
import { oops } from "db://oops-framework/core/Oops";
|
||||||
import { HeroInfo } from "../common/config/heroSet";
|
import { HeroInfo } from "../common/config/heroSet";
|
||||||
import { getLvColor, CARD_LV_BG_COLORS } from "../common/config/GameSet";
|
import { getLvColor, RARITY_BG_COLORS } from "../common/config/GameSet";
|
||||||
import { canHeroUpgrade } from "../common/config/heroUpSet";
|
import { canHeroUpgrade } from "../common/config/heroUpSet";
|
||||||
import { GameEvent } from "../common/config/GameEvent";
|
import { GameEvent } from "../common/config/GameEvent";
|
||||||
import { smc } from "../common/SingletonModuleComp";
|
import { smc } from "../common/SingletonModuleComp";
|
||||||
@@ -178,7 +178,7 @@ export class CardLiteComp extends CCComp {
|
|||||||
/**
|
/**
|
||||||
* 渲染英雄卡面。
|
* 渲染英雄卡面。
|
||||||
*
|
*
|
||||||
* 1. 背景:按 card_lv 切换颜色底框(green/blue/purple/yellow/red)。
|
* 1. 背景:按 rarity 切换颜色底框(green/blue/purple/yellow/red)。
|
||||||
* 2. 名称:英雄名。
|
* 2. 名称:英雄名。
|
||||||
* 3. 等级:局外成长等级(Lv.X),颜色按 getLvColor。
|
* 3. 等级:局外成长等级(Lv.X),颜色按 getLvColor。
|
||||||
* 4. 图标:idle 动画首帧静态展示。
|
* 4. 图标:idle 动画首帧静态展示。
|
||||||
@@ -187,10 +187,10 @@ export class CardLiteComp extends CCComp {
|
|||||||
this.iconVisualToken += 1;
|
this.iconVisualToken += 1;
|
||||||
if (this.opacityComp) this.opacityComp.opacity = 255;
|
if (this.opacityComp) this.opacityComp.opacity = 255;
|
||||||
|
|
||||||
// 背景:按 card_lv 切换颜色底框
|
// 背景:按 rarity 切换颜色底框
|
||||||
if (this.BG_node) {
|
if (this.BG_node) {
|
||||||
const bgLv = Math.min(Math.max(hero.card_lv ?? 1, 1), 5);
|
const bgLv = Math.min(Math.max(hero.rarity ?? 1, 1), 5);
|
||||||
const color = CARD_LV_BG_COLORS[bgLv - 1];
|
const color = RARITY_BG_COLORS[bgLv - 1];
|
||||||
this.BG_node.children.forEach(child => child.active = (child.name === color));
|
this.BG_node.children.forEach(child => child.active = (child.name === color));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
* 职责:
|
* 职责:
|
||||||
* 1. 根据英雄 UUID 渲染 **图标**(idle 动画首帧静态展示,零运行时动画开销)。
|
* 1. 根据英雄 UUID 渲染 **图标**(idle 动画首帧静态展示,零运行时动画开销)。
|
||||||
* 2. 根据 HeroInfo.card_lv 切换 **背景底框颜色**(BG_node 下的 green/blue/purple/yellow/red 子节点)。
|
* 2. 根据 HeroInfo.rarity 切换 **背景底框颜色**(BG_node 下的 green/blue/purple/yellow/red 子节点)。
|
||||||
*
|
*
|
||||||
* 说明:
|
* 说明:
|
||||||
* - 仅处理英雄展示,数据源为 heroSet 的 HeroInfo,不依赖 CardSet。
|
* - 仅处理英雄展示,数据源为 heroSet 的 HeroInfo,不依赖 CardSet。
|
||||||
@@ -16,7 +16,7 @@ import { _decorator, AnimationClip, Node, Sprite, resources, SpriteFrame } from
|
|||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
||||||
import { HeroInfo } from "../common/config/heroSet";
|
import { HeroInfo } from "../common/config/heroSet";
|
||||||
import { CARD_LV_BG_COLORS } from "../common/config/GameSet";
|
import { RARITY_BG_COLORS } from "../common/config/GameSet";
|
||||||
|
|
||||||
const { ccclass, property } = _decorator;
|
const { ccclass, property } = _decorator;
|
||||||
|
|
||||||
@@ -55,9 +55,9 @@ export class ChipComp extends CCComp {
|
|||||||
this.node.active = true;
|
this.node.active = true;
|
||||||
this.iconVisualToken += 1;
|
this.iconVisualToken += 1;
|
||||||
|
|
||||||
// 背景:按 card_lv 切换颜色底框(green/blue/purple/yellow/red)
|
// 背景:按 rarity 切换颜色底框(green/blue/purple/yellow/red)
|
||||||
if (this.BG_node) {
|
if (this.BG_node) {
|
||||||
const color = CARD_LV_BG_COLORS[Math.min(Math.max(hero.card_lv ?? 1, 1), 5) - 1];
|
const color = RARITY_BG_COLORS[Math.min(Math.max(hero.rarity ?? 1, 1), 5) - 1];
|
||||||
this.BG_node.children.forEach(child => child.active = (child.name === color));
|
this.BG_node.children.forEach(child => child.active = (child.name === color));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export class EBox extends ecs.Entity {
|
|||||||
* 1) 创建节点并挂到 parent 下(未传时默认 SKILL 层)
|
* 1) 创建节点并挂到 parent 下(未传时默认 SKILL 层)
|
||||||
* 2) 初始化表现与属性数据
|
* 2) 初始化表现与属性数据
|
||||||
*/
|
*/
|
||||||
load(uuid: number, card_lv: number, pos: Vec3, prefab: Prefab, parent?: Node): Node {
|
load(uuid: number, rarity: number, pos: Vec3, prefab: Prefab, parent?: Node): Node {
|
||||||
let node = instantiate(prefab);
|
let node = instantiate(prefab);
|
||||||
|
|
||||||
// 默认挂到实体显示层 SKILL 节点下
|
// 默认挂到实体显示层 SKILL 节点下
|
||||||
@@ -47,7 +47,7 @@ export class EBox extends ecs.Entity {
|
|||||||
this.add(eboxComp);
|
this.add(eboxComp);
|
||||||
|
|
||||||
// 初始化业务逻辑
|
// 初始化业务逻辑
|
||||||
eboxComp.init(uuid, card_lv);
|
eboxComp.init(uuid, rarity);
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export class EquipBoxComp extends CCComp {
|
|||||||
/** 技能 UUID */
|
/** 技能 UUID */
|
||||||
private s_uuid: number = 0;
|
private s_uuid: number = 0;
|
||||||
/** 卡牌等级 */
|
/** 卡牌等级 */
|
||||||
private card_lv: number = 1;
|
private rarity: number = 1;
|
||||||
/** 是否为即时技能(true=使用后立即触发,false=战斗中定时触发) */
|
/** 是否为即时技能(true=使用后立即触发,false=战斗中定时触发) */
|
||||||
private is_instant: boolean = true;
|
private is_instant: boolean = true;
|
||||||
/** 总触发次数 */
|
/** 总触发次数 */
|
||||||
@@ -245,10 +245,10 @@ export class EquipBoxComp extends CCComp {
|
|||||||
* 3. 按 trigger_type 注册对应事件监听并执行首次触发。
|
* 3. 按 trigger_type 注册对应事件监听并执行首次触发。
|
||||||
*
|
*
|
||||||
* @param uuid 卡牌 UUID
|
* @param uuid 卡牌 UUID
|
||||||
* @param card_lv 技能卡等级
|
* @param rarity 技能卡等级
|
||||||
*/
|
*/
|
||||||
init(uuid: number, card_lv: number) {
|
init(uuid: number, rarity: number) {
|
||||||
this.card_lv = card_lv;
|
this.rarity = rarity;
|
||||||
|
|
||||||
// 装备卡配置已迁移至 EquipPoolList
|
// 装备卡配置已迁移至 EquipPoolList
|
||||||
const config = EquipPoolList.find(c => c.uuid === uuid);
|
const config = EquipPoolList.find(c => c.uuid === uuid);
|
||||||
@@ -381,9 +381,9 @@ export class EquipBoxComp extends CCComp {
|
|||||||
/**
|
/**
|
||||||
* 根据技能等级切换 bg_node 下的颜色子节点显示。
|
* 根据技能等级切换 bg_node 下的颜色子节点显示。
|
||||||
* 等级与颜色对应关系(技能卡 wave 档位):
|
* 等级与颜色对应关系(技能卡 wave 档位):
|
||||||
* card_lv 1 (wave 1) → green
|
* rarity 1 (wave 1) → green
|
||||||
* card_lv 2 (wave 5) → blue
|
* rarity 2 (wave 5) → blue
|
||||||
* card_lv 3 (wave 8) → purple
|
* rarity 3 (wave 8) → purple
|
||||||
*/
|
*/
|
||||||
private updateBgNode() {
|
private updateBgNode() {
|
||||||
if (!this.bg_node) return;
|
if (!this.bg_node) return;
|
||||||
@@ -392,7 +392,7 @@ export class EquipBoxComp extends CCComp {
|
|||||||
2: "blue",
|
2: "blue",
|
||||||
3: "purple",
|
3: "purple",
|
||||||
};
|
};
|
||||||
const targetColor = lvToColor[this.card_lv];
|
const targetColor = lvToColor[this.rarity];
|
||||||
this.bg_node.children.forEach(child => {
|
this.bg_node.children.forEach(child => {
|
||||||
child.active = (child.name === targetColor);
|
child.active = (child.name === targetColor);
|
||||||
});
|
});
|
||||||
@@ -625,7 +625,7 @@ export class EquipBoxComp extends CCComp {
|
|||||||
oops.message.dispatchEvent(GameEvent.TriggerSkill, {
|
oops.message.dispatchEvent(GameEvent.TriggerSkill, {
|
||||||
s_uuid: this.s_uuid,
|
s_uuid: this.s_uuid,
|
||||||
isCardSkill: true, // 标记为卡牌技能(区别于英雄自身技能)
|
isCardSkill: true, // 标记为卡牌技能(区别于英雄自身技能)
|
||||||
card_lv: this.card_lv,
|
rarity: this.rarity,
|
||||||
targetPos: targetPos,
|
targetPos: targetPos,
|
||||||
overrides: this.overrides
|
overrides: this.overrides
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export class EquipListComp extends CCComp {
|
|||||||
@property({ type: Node })
|
@property({ type: Node })
|
||||||
private icon_node: Node = null;
|
private icon_node: Node = null;
|
||||||
|
|
||||||
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 card_lv 激活) */
|
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 rarity 激活) */
|
||||||
@property({ type: Node })
|
@property({ type: Node })
|
||||||
private bg_node: Node = null;
|
private bg_node: Node = null;
|
||||||
|
|
||||||
@@ -148,11 +148,11 @@ export class EquipListComp extends CCComp {
|
|||||||
|
|
||||||
// 等级标签(Lv.1 / Lv.2 / Lv.3)
|
// 等级标签(Lv.1 / Lv.2 / Lv.3)
|
||||||
if (this.level_label) {
|
if (this.level_label) {
|
||||||
const lv = this.cardData.card_lv ?? 1;
|
const lv = this.cardData.rarity ?? 1;
|
||||||
this.level_label.string = `Lv.${lv}`;
|
this.level_label.string = `Lv.${lv}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 背景:按 card_lv 激活对应颜色子节点(1→green 2→blue 3→purple 4→red 5→yellow)
|
// 背景:按 rarity 激活对应颜色子节点(1→green 2→blue 3→purple 4→red 5→yellow)
|
||||||
this.updateBgNode();
|
this.updateBgNode();
|
||||||
|
|
||||||
// 属性词条富文本(多词条装备由 buildEquipRich 按 \n 多行渲染,数值实时高亮)
|
// 属性词条富文本(多词条装备由 buildEquipRich 按 \n 多行渲染,数值实时高亮)
|
||||||
@@ -187,13 +187,13 @@ export class EquipListComp extends CCComp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
|
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
|
||||||
* 等级与颜色对应关系:
|
* 等级与颜色对应关系:
|
||||||
* card_lv 1 → green
|
* rarity 1 → green
|
||||||
* card_lv 2 → blue
|
* rarity 2 → blue
|
||||||
* card_lv 3 → purple
|
* rarity 3 → purple
|
||||||
* card_lv 4 → red
|
* rarity 4 → red
|
||||||
* card_lv 5 → yellow
|
* rarity 5 → yellow
|
||||||
*/
|
*/
|
||||||
private updateBgNode() {
|
private updateBgNode() {
|
||||||
if (!this.bg_node || !this.cardData) return;
|
if (!this.bg_node || !this.cardData) return;
|
||||||
@@ -204,7 +204,7 @@ export class EquipListComp extends CCComp {
|
|||||||
4: "red",
|
4: "red",
|
||||||
5: "yellow",
|
5: "yellow",
|
||||||
};
|
};
|
||||||
const targetColor = lvToColor[this.cardData.card_lv ?? 1];
|
const targetColor = lvToColor[this.cardData.rarity ?? 1];
|
||||||
this.bg_node.children.forEach(child => {
|
this.bg_node.children.forEach(child => {
|
||||||
child.active = (child.name === targetColor);
|
child.active = (child.name === targetColor);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -512,8 +512,8 @@ export class HeroBoxComp extends CCComp {
|
|||||||
const heroUuid = this.model.hero_uuid ?? 0;
|
const heroUuid = this.model.hero_uuid ?? 0;
|
||||||
const hero = HeroInfo[heroUuid];
|
const hero = HeroInfo[heroUuid];
|
||||||
|
|
||||||
// ---- 背景(按 card_lv 切换 bg_node 颜色子节点) ----
|
// ---- 背景(按 rarity 切换 bg_node 颜色子节点) ----
|
||||||
this.updateBgNode(hero?.card_lv ?? 1);
|
this.updateBgNode(hero?.rarity ?? 1);
|
||||||
|
|
||||||
// ---- 名称 ----
|
// ---- 名称 ----
|
||||||
if (this.name_label && this.name_label.isValid) {
|
if (this.name_label && this.name_label.isValid) {
|
||||||
@@ -568,16 +568,16 @@ export class HeroBoxComp extends CCComp {
|
|||||||
// ======================== 内部工具 ========================
|
// ======================== 内部工具 ========================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
|
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
|
||||||
* 等级与颜色对应关系:
|
* 等级与颜色对应关系:
|
||||||
* card_lv 1 → green
|
* rarity 1 → green
|
||||||
* card_lv 2 → blue
|
* rarity 2 → blue
|
||||||
* card_lv 3 → purple
|
* rarity 3 → purple
|
||||||
* card_lv 4 → red
|
* rarity 4 → red
|
||||||
* card_lv 5 → yellow
|
* rarity 5 → yellow
|
||||||
* @param cardLv 英雄卡牌等级(HeroInfo.card_lv,缺省按 1 处理)
|
* @param rarity 英雄卡牌等级(HeroInfo.rarity,缺省按 1 处理)
|
||||||
*/
|
*/
|
||||||
private updateBgNode(cardLv: number) {
|
private updateBgNode(rarity: number) {
|
||||||
if (!this.bg_node || !this.bg_node.isValid) return;
|
if (!this.bg_node || !this.bg_node.isValid) return;
|
||||||
const lvToColor: Record<number, string> = {
|
const lvToColor: Record<number, string> = {
|
||||||
1: "green",
|
1: "green",
|
||||||
@@ -586,7 +586,7 @@ export class HeroBoxComp extends CCComp {
|
|||||||
4: "red",
|
4: "red",
|
||||||
5: "yellow",
|
5: "yellow",
|
||||||
};
|
};
|
||||||
const targetColor = lvToColor[cardLv] ?? lvToColor[1];
|
const targetColor = lvToColor[rarity] ?? lvToColor[1];
|
||||||
this.bg_node.children.forEach(child => {
|
this.bg_node.children.forEach(child => {
|
||||||
child.active = (child.name === targetColor);
|
child.active = (child.name === targetColor);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import { mLogger } from "../common/Logger";
|
|||||||
import { HeroInfo, HeroList, SkillTriggerType, LvFieldEntry, LvReviveEntry, LvTriggerEntry, TriggerGrouped, getHeroDisplayStats } from "../common/config/heroSet";
|
import { HeroInfo, HeroList, SkillTriggerType, LvFieldEntry, LvReviveEntry, LvTriggerEntry, TriggerGrouped, getHeroDisplayStats } from "../common/config/heroSet";
|
||||||
import { buildHeroSkillDesc } from "../common/HeroSkillText";
|
import { buildHeroSkillDesc } from "../common/HeroSkillText";
|
||||||
import { GameEvent } from "../common/config/GameEvent";
|
import { GameEvent } from "../common/config/GameEvent";
|
||||||
import { HERO_UPGRADE_NEED_FRAGMENTS, CARD_LV_BG_COLORS } from "../common/config/GameSet";
|
import { HERO_UPGRADE_NEED_FRAGMENTS, RARITY_BG_COLORS } from "../common/config/GameSet";
|
||||||
import { CardLiteComp } from "./CardLiteComp";
|
import { CardLiteComp } from "./CardLiteComp";
|
||||||
import { ChipComp } from "./ChipComp";
|
import { ChipComp } from "./ChipComp";
|
||||||
import { SmallTipComp } from "./SmallTipComp";
|
import { SmallTipComp } from "./SmallTipComp";
|
||||||
@@ -313,7 +313,7 @@ export class HerosListComp extends CCComp {
|
|||||||
this.cards_node.removeAllChildren()
|
this.cards_node.removeAllChildren()
|
||||||
|
|
||||||
const sorted = [...HeroList].sort((a, b) => {
|
const sorted = [...HeroList].sort((a, b) => {
|
||||||
return (HeroInfo[a]?.card_lv ?? 1) - (HeroInfo[b]?.card_lv ?? 1);
|
return (HeroInfo[a]?.rarity ?? 1) - (HeroInfo[b]?.rarity ?? 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const uuid of sorted) {
|
for (const uuid of sorted) {
|
||||||
@@ -410,7 +410,7 @@ export class HerosListComp extends CCComp {
|
|||||||
if (infoLabel) infoLabel.string = desc || hero.info || ""
|
if (infoLabel) infoLabel.string = desc || hero.info || ""
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updatePoolLvBg(hero.card_lv ?? 1)
|
this.updatePoolLvBg(hero.rarity ?? 1)
|
||||||
this.updateLvDisplay(uuid)
|
this.updateLvDisplay(uuid)
|
||||||
this.updateRoleDisplay(hero)
|
this.updateRoleDisplay(hero)
|
||||||
this.updateHeroAnimation(uuid)
|
this.updateHeroAnimation(uuid)
|
||||||
@@ -418,10 +418,10 @@ export class HerosListComp extends CCComp {
|
|||||||
this.updateSkillIcons(hero)
|
this.updateSkillIcons(hero)
|
||||||
}
|
}
|
||||||
|
|
||||||
private updatePoolLvBg(card_lv: number) {
|
private updatePoolLvBg(rarity: number) {
|
||||||
if (!this.BG_node) return
|
if (!this.BG_node) return
|
||||||
// BG_node 下直接放置颜色节点(green/blue/purple/yellow/red),按卡池等级激活对应颜色
|
// BG_node 下直接放置颜色节点(green/blue/purple/yellow/red),按卡池等级激活对应颜色
|
||||||
const color = CARD_LV_BG_COLORS[Math.min(card_lv, 5) - 1]
|
const color = RARITY_BG_COLORS[Math.min(rarity, 5) - 1]
|
||||||
this.BG_node.children.forEach(child => {
|
this.BG_node.children.forEach(child => {
|
||||||
child.active = (child.name === color)
|
child.active = (child.name === color)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export class ItemListComp extends CCComp {
|
|||||||
@property({ type: Node })
|
@property({ type: Node })
|
||||||
private icon_node: Node = null;
|
private icon_node: Node = null;
|
||||||
|
|
||||||
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 card_lv 激活) */
|
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 rarity 激活) */
|
||||||
@property({ type: Node })
|
@property({ type: Node })
|
||||||
private bg_node: Node = null;
|
private bg_node: Node = null;
|
||||||
|
|
||||||
@@ -156,11 +156,11 @@ export class ItemListComp extends CCComp {
|
|||||||
|
|
||||||
// 等级标签(★ 表示卡牌等级)
|
// 等级标签(★ 表示卡牌等级)
|
||||||
if (this.level_label) {
|
if (this.level_label) {
|
||||||
const lv = this.cardData.card_lv ?? 1;
|
const lv = this.cardData.rarity ?? 1;
|
||||||
this.level_label.string = lv >= 2 ? "★".repeat(lv - 1) : "";
|
this.level_label.string = lv >= 2 ? "★".repeat(lv - 1) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// 背景:按 card_lv 激活对应颜色子节点(1→green 2→blue 3→purple 4→red 5→yellow)
|
// 背景:按 rarity 激活对应颜色子节点(1→green 2→blue 3→purple 4→red 5→yellow)
|
||||||
this.updateBgNode();
|
this.updateBgNode();
|
||||||
|
|
||||||
// 描述/属性词条富文本(装备逐词条多行;药品/技能卡数值随 overrides 档位自动同步)
|
// 描述/属性词条富文本(装备逐词条多行;药品/技能卡数值随 overrides 档位自动同步)
|
||||||
@@ -201,13 +201,13 @@ export class ItemListComp extends CCComp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
|
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
|
||||||
* 等级与颜色对应关系:
|
* 等级与颜色对应关系:
|
||||||
* card_lv 1 → green
|
* rarity 1 → green
|
||||||
* card_lv 2 → blue
|
* rarity 2 → blue
|
||||||
* card_lv 3 → purple
|
* rarity 3 → purple
|
||||||
* card_lv 4 → red
|
* rarity 4 → red
|
||||||
* card_lv 5 → yellow
|
* rarity 5 → yellow
|
||||||
*/
|
*/
|
||||||
private updateBgNode() {
|
private updateBgNode() {
|
||||||
if (!this.bg_node || !this.cardData) return;
|
if (!this.bg_node || !this.cardData) return;
|
||||||
@@ -218,7 +218,7 @@ export class ItemListComp extends CCComp {
|
|||||||
4: "red",
|
4: "red",
|
||||||
5: "yellow",
|
5: "yellow",
|
||||||
};
|
};
|
||||||
const targetColor = lvToColor[this.cardData.card_lv ?? 1];
|
const targetColor = lvToColor[this.cardData.rarity ?? 1];
|
||||||
this.bg_node.children.forEach(child => {
|
this.bg_node.children.forEach(child => {
|
||||||
child.active = (child.name === targetColor);
|
child.active = (child.name === targetColor);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -145,16 +145,16 @@ export class MissEquipComp extends CCComp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理使用装备卡事件:提取 uuid 和 card_lv 后调用 addEquip。
|
* 处理使用装备卡事件:提取 uuid 和 rarity 后调用 addEquip。
|
||||||
* @param event 事件名
|
* @param event 事件名
|
||||||
* @param args 卡牌数据(含 uuid、card_lv)
|
* @param args 卡牌数据(含 uuid、rarity)
|
||||||
*/
|
*/
|
||||||
private onUseEquipCard(event: string, args: any) {
|
private onUseEquipCard(event: string, args: any) {
|
||||||
const payload = args ?? event;
|
const payload = args ?? event;
|
||||||
const uuid = Number(payload?.uuid ?? 0);
|
const uuid = Number(payload?.uuid ?? 0);
|
||||||
const card_lv = Math.max(1, Math.floor(Number(payload?.card_lv ?? 1)));
|
const rarity = Math.max(1, Math.floor(Number(payload?.rarity ?? 1)));
|
||||||
if (!uuid) return;
|
if (!uuid) return;
|
||||||
this.addSkill(uuid, card_lv);
|
this.addSkill(uuid, rarity);
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
@@ -168,9 +168,9 @@ export class MissEquipComp extends CCComp {
|
|||||||
* 3. 获取或添加 EquipBoxComp 并初始化。
|
* 3. 获取或添加 EquipBoxComp 并初始化。
|
||||||
*
|
*
|
||||||
* @param uuid 装备 UUID
|
* @param uuid 装备 UUID
|
||||||
* @param card_lv 装备卡等级
|
* @param rarity 装备卡等级
|
||||||
*/
|
*/
|
||||||
addSkill(uuid: number, card_lv: number) {
|
addSkill(uuid: number, rarity: number) {
|
||||||
if (!this.equip_box) {
|
if (!this.equip_box) {
|
||||||
mLogger.error(this.debugMode, "MissEquipComp", "equip_box prefab not set");
|
mLogger.error(this.debugMode, "MissEquipComp", "equip_box prefab not set");
|
||||||
return;
|
return;
|
||||||
@@ -190,7 +190,7 @@ export class MissEquipComp extends CCComp {
|
|||||||
|
|
||||||
// 使用 ECS 实体创建装备节点,挂载到对应 ebar 子节点下
|
// 使用 ECS 实体创建装备节点,挂载到对应 ebar 子节点下
|
||||||
let ebox = ecs.getEntity<EBox>(EBox);
|
let ebox = ecs.getEntity<EBox>(EBox);
|
||||||
let node = ebox.load(uuid, card_lv, Vec3.ZERO, this.equip_box, this.ebars_node.children[emptyIndex]);
|
let node = ebox.load(uuid, rarity, Vec3.ZERO, this.equip_box, this.ebars_node.children[emptyIndex]);
|
||||||
|
|
||||||
this.slots[emptyIndex].used = true;
|
this.slots[emptyIndex].used = true;
|
||||||
this.slots[emptyIndex].node = node;
|
this.slots[emptyIndex].node = node;
|
||||||
|
|||||||
@@ -154,18 +154,18 @@ export class MissSkillsComp extends CCComp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理使用技能卡事件:提取 uuid 和 card_lv 后调用 addSkill。
|
* 处理使用技能卡事件:提取 uuid 和 rarity 后调用 addSkill。
|
||||||
* @param event 事件名
|
* @param event 事件名
|
||||||
* @param args 卡牌数据(含 uuid、card_lv)
|
* @param args 卡牌数据(含 uuid、rarity)
|
||||||
*/
|
*/
|
||||||
private onUseSkillCard(event: string, args: any) {
|
private onUseSkillCard(event: string, args: any) {
|
||||||
const payload = args ?? event;
|
const payload = args ?? event;
|
||||||
// 卡 uuid 仅用于查配置;真正施法用技能 id(payload.skill),缺省时退回 uuid(兼容技能卡直接用技能 id 的场景)
|
// 卡 uuid 仅用于查配置;真正施法用技能 id(payload.skill),缺省时退回 uuid(兼容技能卡直接用技能 id 的场景)
|
||||||
const skillUuid = Number(payload?.skill ?? payload?.uuid ?? 0);
|
const skillUuid = Number(payload?.skill ?? payload?.uuid ?? 0);
|
||||||
const card_lv = Math.max(1, Math.floor(Number(payload?.card_lv ?? 1)));
|
const rarity = Math.max(1, Math.floor(Number(payload?.rarity ?? 1)));
|
||||||
if (!skillUuid) return;
|
if (!skillUuid) return;
|
||||||
// 药水/技能卡的 overrides(含 buff_value)需透传到技能实体
|
// 药水/技能卡的 overrides(含 buff_value)需透传到技能实体
|
||||||
this.addSkill(skillUuid, card_lv, payload?.overrides);
|
this.addSkill(skillUuid, rarity, payload?.overrides);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -215,9 +215,9 @@ export class MissSkillsComp extends CCComp {
|
|||||||
* 3. 获取或添加 SkillBoxComp 并初始化。
|
* 3. 获取或添加 SkillBoxComp 并初始化。
|
||||||
*
|
*
|
||||||
* @param uuid 技能 UUID
|
* @param uuid 技能 UUID
|
||||||
* @param card_lv 技能卡等级
|
* @param rarity 技能卡等级
|
||||||
*/
|
*/
|
||||||
addSkill(uuid: number, card_lv: number, overrides?: SkillOverrides) {
|
addSkill(uuid: number, rarity: number, overrides?: SkillOverrides) {
|
||||||
if (!this.skill_box) {
|
if (!this.skill_box) {
|
||||||
mLogger.error(this.debugMode, "MissSkillsComp", "skill_box prefab not set");
|
mLogger.error(this.debugMode, "MissSkillsComp", "skill_box prefab not set");
|
||||||
return;
|
return;
|
||||||
@@ -234,7 +234,7 @@ export class MissSkillsComp extends CCComp {
|
|||||||
// 使用 ECS 实体创建技能节点
|
// 使用 ECS 实体创建技能节点
|
||||||
let sbox = ecs.getEntity<SBox>(SBox);
|
let sbox = ecs.getEntity<SBox>(SBox);
|
||||||
let pos = new Vec3(this.slots[emptyIndex].x, this.slots[emptyIndex].y, 0);
|
let pos = new Vec3(this.slots[emptyIndex].x, this.slots[emptyIndex].y, 0);
|
||||||
let node = sbox.load(uuid, card_lv, pos, this.skill_box, overrides);
|
let node = sbox.load(uuid, rarity, pos, this.skill_box, overrides);
|
||||||
|
|
||||||
this.slots[emptyIndex].used = true;
|
this.slots[emptyIndex].used = true;
|
||||||
this.slots[emptyIndex].node = node;
|
this.slots[emptyIndex].node = node;
|
||||||
|
|||||||
@@ -2152,7 +2152,7 @@ export class MissionCardComp extends CCComp {
|
|||||||
model.lv = nextLv;
|
model.lv = nextLv;
|
||||||
|
|
||||||
// 同步 base 快照(与 Hero.load 同公式:固定基础值 × 品质系数,成长由 grow_type 线性递增提供)
|
// 同步 base 快照(与 Hero.load 同公式:固定基础值 × 品质系数,成长由 grow_type 线性递增提供)
|
||||||
const qualityCoef = getHeroQualityCoef(hero.card_lv ?? 1);
|
const qualityCoef = getHeroQualityCoef(hero.rarity ?? 1);
|
||||||
const base_ap = Math.round(hero.ap * qualityCoef);
|
const base_ap = Math.round(hero.ap * qualityCoef);
|
||||||
const base_hp = Math.round(hero.hp * qualityCoef);
|
const base_hp = Math.round(hero.hp * qualityCoef);
|
||||||
model.base_ap = base_ap;
|
model.base_ap = base_ap;
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ export class MissionHeroComp extends CCComp {
|
|||||||
/** 是否正在消费召唤队列(防止并发) */
|
/** 是否正在消费召唤队列(防止并发) */
|
||||||
is_processing_queue: boolean = false
|
is_processing_queue: boolean = false
|
||||||
/** 召唤请求队列:按职业优先级排序后串行登场 */
|
/** 召唤请求队列:按职业优先级排序后串行登场 */
|
||||||
summon_queue: { uuid: number; hero_lv: number; card_lv: number; role: HRole }[] = []
|
summon_queue: { uuid: number; hero_lv: number; rarity: number; role: HRole }[] = []
|
||||||
/** 英雄出生序计数器(编队排队/渲染排序的稳定决胜) */
|
/** 英雄出生序计数器(编队排队/渲染排序的稳定决胜) */
|
||||||
private heroSpawnOrder = 0
|
private heroSpawnOrder = 0
|
||||||
/** 预留英雄列表 */
|
/** 预留英雄列表 */
|
||||||
@@ -160,12 +160,12 @@ export class MissionHeroComp extends CCComp {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 召唤请求入口:
|
* 召唤请求入口:
|
||||||
* 从事件参数中提取 uuid / hero_lv / card_lv,放入串行队列。
|
* 从事件参数中提取 uuid / hero_lv / rarity,放入串行队列。
|
||||||
* 队列按职业优先级(坦克→战士→刺客→射手→法师→辅助,HRole 升序)排序,
|
* 队列按职业优先级(坦克→战士→刺客→射手→法师→辅助,HRole 升序)排序,
|
||||||
* 保证高优先级职业先登场。
|
* 保证高优先级职业先登场。
|
||||||
*
|
*
|
||||||
* @param event 事件名
|
* @param event 事件名
|
||||||
* @param args { uuid, hero_lv, card_lv }
|
* @param args { uuid, hero_lv, rarity }
|
||||||
*/
|
*/
|
||||||
private async call_hero(event: string, args: any) {
|
private async call_hero(event: string, args: any) {
|
||||||
const payload = args ?? event;
|
const payload = args ?? event;
|
||||||
@@ -174,10 +174,10 @@ export class MissionHeroComp extends CCComp {
|
|||||||
// payload.hero_lv 保留作为下限兜底,防止外部显式指定更高等级
|
// payload.hero_lv 保留作为下限兜底,防止外部显式指定更高等级
|
||||||
const outer_lv = smc.getHeroOuterLv(uuid);
|
const outer_lv = smc.getHeroOuterLv(uuid);
|
||||||
const hero_lv = Math.max(outer_lv, Math.max(1, Number(payload?.hero_lv ?? 1)));
|
const hero_lv = Math.max(outer_lv, Math.max(1, Number(payload?.hero_lv ?? 1)));
|
||||||
const card_lv = Math.max(1, Number(payload?.card_lv ?? 1));
|
const rarity = Math.max(1, Number(payload?.rarity ?? 1));
|
||||||
const role = HeroInfo[uuid]?.role ?? HRole.Support;
|
const role = HeroInfo[uuid]?.role ?? HRole.Support;
|
||||||
|
|
||||||
this.summon_queue.push({ uuid, hero_lv, card_lv, role });
|
this.summon_queue.push({ uuid, hero_lv, rarity, role });
|
||||||
// 按职业优先级稳定排序:HRole 升序,同职业保持入队先后
|
// 按职业优先级稳定排序:HRole 升序,同职业保持入队先后
|
||||||
this.summon_queue.sort((a, b) => a.role - b.role);
|
this.summon_queue.sort((a, b) => a.role - b.role);
|
||||||
this.processSummonQueue();
|
this.processSummonQueue();
|
||||||
@@ -224,10 +224,10 @@ export class MissionHeroComp extends CCComp {
|
|||||||
*
|
*
|
||||||
* @param uuid 英雄 UUID
|
* @param uuid 英雄 UUID
|
||||||
* @param hero_lv 英雄等级
|
* @param hero_lv 英雄等级
|
||||||
* @param card_lv 卡牌等级(驱动 bg_node 颜色)
|
* @param rarity 卡牌等级(驱动 bg_node 颜色)
|
||||||
* @returns 创建的 Hero 实体
|
* @returns 创建的 Hero 实体
|
||||||
*/
|
*/
|
||||||
private spawnHeroAt(uuid: number, hero_lv: number, card_lv: number) {
|
private spawnHeroAt(uuid: number, hero_lv: number, rarity: number) {
|
||||||
let hero = ecs.getEntity<Hero>(Hero);
|
let hero = ecs.getEntity<Hero>(Hero);
|
||||||
let scale = 1
|
let scale = 1
|
||||||
const role = HeroInfo[uuid]?.role ?? HRole.Support;
|
const role = HeroInfo[uuid]?.role ?? HRole.Support;
|
||||||
@@ -241,7 +241,7 @@ export class MissionHeroComp extends CCComp {
|
|||||||
const landingPos = slot.landingPos;
|
const landingPos = slot.landingPos;
|
||||||
|
|
||||||
let spawnPos: Vec3 = v3(landingPos.x, landingPos.y + MissionHeroComp.HERO_DROP_HEIGHT, 0);
|
let spawnPos: Vec3 = v3(landingPos.x, landingPos.y + MissionHeroComp.HERO_DROP_HEIGHT, 0);
|
||||||
hero.load(spawnPos, scale, uuid, landingPos.y, hero_lv, card_lv, finalPosIndex);
|
hero.load(spawnPos, scale, uuid, landingPos.y, hero_lv, rarity, finalPosIndex);
|
||||||
|
|
||||||
// 登记出生序,供编队排队/渲染排序做稳定决胜
|
// 登记出生序,供编队排队/渲染排序做稳定决胜
|
||||||
const move = hero.get(MoveComp);
|
const move = hero.get(MoveComp);
|
||||||
@@ -289,7 +289,7 @@ export class MissionHeroComp extends CCComp {
|
|||||||
while (this.summon_queue.length > 0) {
|
while (this.summon_queue.length > 0) {
|
||||||
const payload = this.summon_queue.shift();
|
const payload = this.summon_queue.shift();
|
||||||
if (!payload) continue;
|
if (!payload) continue;
|
||||||
this.spawnHeroAt(payload.uuid, payload.hero_lv, payload.card_lv);
|
this.spawnHeroAt(payload.uuid, payload.hero_lv, payload.rarity);
|
||||||
// 登场间隔:让掉落动画逐个播放,避免同帧堆叠
|
// 登场间隔:让掉落动画逐个播放,避免同帧堆叠
|
||||||
if (this.summon_queue.length > 0) {
|
if (this.summon_queue.length > 0) {
|
||||||
await new Promise<void>(resolve => setTimeout(resolve, MissionHeroComp.SUMMON_INTERVAL * 1000));
|
await new Promise<void>(resolve => setTimeout(resolve, MissionHeroComp.SUMMON_INTERVAL * 1000));
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export class SBox extends ecs.Entity {
|
|||||||
* 1) 创建节点并挂到 SKILL 层
|
* 1) 创建节点并挂到 SKILL 层
|
||||||
* 2) 初始化表现与属性数据
|
* 2) 初始化表现与属性数据
|
||||||
*/
|
*/
|
||||||
load(uuid: number, card_lv: number, pos: Vec3, prefab: Prefab, overrides?: SkillOverrides): Node {
|
load(uuid: number, rarity: number, pos: Vec3, prefab: Prefab, overrides?: SkillOverrides): Node {
|
||||||
let node = instantiate(prefab);
|
let node = instantiate(prefab);
|
||||||
let scene = smc.map.MapView.scene;
|
let scene = smc.map.MapView.scene;
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ export class SBox extends ecs.Entity {
|
|||||||
this.add(sboxComp);
|
this.add(sboxComp);
|
||||||
|
|
||||||
// 初始化业务逻辑(透传药水卡 overrides,含 buff_value)
|
// 初始化业务逻辑(透传药水卡 overrides,含 buff_value)
|
||||||
sboxComp.init(uuid, card_lv, overrides);
|
sboxComp.init(uuid, rarity, overrides);
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export class SCardComp extends CCComp {
|
|||||||
@property({ type: Node })
|
@property({ type: Node })
|
||||||
private icon_node: Node = null;
|
private icon_node: Node = null;
|
||||||
|
|
||||||
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 card_lv 激活) */
|
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 rarity 激活) */
|
||||||
@property({ type: Node })
|
@property({ type: Node })
|
||||||
private bg_node: Node = null;
|
private bg_node: Node = null;
|
||||||
|
|
||||||
@@ -189,11 +189,11 @@ export class SCardComp extends CCComp {
|
|||||||
|
|
||||||
// 等级标签(★ 表示卡牌等级)
|
// 等级标签(★ 表示卡牌等级)
|
||||||
if (this.level_label) {
|
if (this.level_label) {
|
||||||
const lv = this.cardData.card_lv ?? 1;
|
const lv = this.cardData.rarity ?? 1;
|
||||||
this.level_label.string = lv >= 2 ? "★".repeat(lv - 1) : "";
|
this.level_label.string = lv >= 2 ? "★".repeat(lv - 1) : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// 背景:按 card_lv 激活对应颜色子节点(1→green 2→blue 3→purple 4→red 5→yellow)
|
// 背景:按 rarity 激活对应颜色子节点(1→green 2→blue 3→purple 4→red 5→yellow)
|
||||||
this.updateBgNode();
|
this.updateBgNode();
|
||||||
|
|
||||||
// 描述富文本(数值随 overrides 档位自动同步高亮)
|
// 描述富文本(数值随 overrides 档位自动同步高亮)
|
||||||
@@ -228,13 +228,13 @@ export class SCardComp extends CCComp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
|
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
|
||||||
* 等级与颜色对应关系:
|
* 等级与颜色对应关系:
|
||||||
* card_lv 1 → green
|
* rarity 1 → green
|
||||||
* card_lv 2 → blue
|
* rarity 2 → blue
|
||||||
* card_lv 3 → purple
|
* rarity 3 → purple
|
||||||
* card_lv 4 → red
|
* rarity 4 → red
|
||||||
* card_lv 5 → yellow
|
* rarity 5 → yellow
|
||||||
*/
|
*/
|
||||||
private updateBgNode() {
|
private updateBgNode() {
|
||||||
if (!this.bg_node || !this.cardData) return;
|
if (!this.bg_node || !this.cardData) return;
|
||||||
@@ -245,7 +245,7 @@ export class SCardComp extends CCComp {
|
|||||||
4: "red",
|
4: "red",
|
||||||
5: "yellow",
|
5: "yellow",
|
||||||
};
|
};
|
||||||
const targetColor = lvToColor[this.cardData.card_lv ?? 1];
|
const targetColor = lvToColor[this.cardData.rarity ?? 1];
|
||||||
this.bg_node.children.forEach(child => {
|
this.bg_node.children.forEach(child => {
|
||||||
child.active = (child.name === targetColor);
|
child.active = (child.name === targetColor);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export class SSkillBoxComp extends CCComp {
|
|||||||
* 弹窗按槽位精确取档,避免自动定位命中错误分组 */
|
* 弹窗按槽位精确取档,避免自动定位命中错误分组 */
|
||||||
private hero_slot?: SkillTriggerType;
|
private hero_slot?: SkillTriggerType;
|
||||||
/** 卡牌等级 */
|
/** 卡牌等级 */
|
||||||
private card_lv: number = 1;
|
private rarity: number = 1;
|
||||||
/** 卡牌自定义图标ID(优先级最高,未定义则按 trigger_type 自动取) */
|
/** 卡牌自定义图标ID(优先级最高,未定义则按 trigger_type 自动取) */
|
||||||
private card_icon?: string;
|
private card_icon?: string;
|
||||||
/** 技能名称(装备卡取卡牌名,英雄图鉴取技能名) */
|
/** 技能名称(装备卡取卡牌名,英雄图鉴取技能名) */
|
||||||
@@ -75,7 +75,7 @@ export class SSkillBoxComp extends CCComp {
|
|||||||
oops.audio.playEffect("music/button");
|
oops.audio.playEffect("music/button");
|
||||||
oops.gui.open(UIID.SInfo, {
|
oops.gui.open(UIID.SInfo, {
|
||||||
uuid: this.s_uuid,
|
uuid: this.s_uuid,
|
||||||
skill_lv: this.card_lv,
|
skill_lv: this.rarity,
|
||||||
card_icon: this.card_icon,
|
card_icon: this.card_icon,
|
||||||
skill_name: this.resolveSkillName(),
|
skill_name: this.resolveSkillName(),
|
||||||
field: this.field,
|
field: this.field,
|
||||||
@@ -112,7 +112,7 @@ export class SSkillBoxComp extends CCComp {
|
|||||||
this.s_uuid = s_uuid;
|
this.s_uuid = s_uuid;
|
||||||
this.hero_uuid = heroUuid;
|
this.hero_uuid = heroUuid;
|
||||||
this.hero_slot = slot;
|
this.hero_slot = slot;
|
||||||
this.card_lv = s_lv;
|
this.rarity = s_lv;
|
||||||
this.hero_icon_source = isField ? "field" : "skill";
|
this.hero_icon_source = isField ? "field" : "skill";
|
||||||
this.updateUI();
|
this.updateUI();
|
||||||
this.setLocked(locked);
|
this.setLocked(locked);
|
||||||
@@ -244,7 +244,7 @@ export class SSkillBoxComp extends CCComp {
|
|||||||
|
|
||||||
// 显示技能等级(Lv.x 样式)
|
// 显示技能等级(Lv.x 样式)
|
||||||
if (this.lv_label) {
|
if (this.lv_label) {
|
||||||
this.lv_label.string = `Lv.${this.card_lv}`;
|
this.lv_label.string = `Lv.${this.rarity}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export class SkillBoxComp extends CCComp {
|
|||||||
/** 技能 UUID */
|
/** 技能 UUID */
|
||||||
private s_uuid: number = 0;
|
private s_uuid: number = 0;
|
||||||
/** 卡牌等级 */
|
/** 卡牌等级 */
|
||||||
private card_lv: number = 1;
|
private rarity: number = 1;
|
||||||
/** 是否为即时技能(true=使用后立即触发,false=战斗中定时触发) */
|
/** 是否为即时技能(true=使用后立即触发,false=战斗中定时触发) */
|
||||||
private is_instant: boolean = true;
|
private is_instant: boolean = true;
|
||||||
/** 总触发次数 */
|
/** 总触发次数 */
|
||||||
@@ -218,7 +218,7 @@ export class SkillBoxComp extends CCComp {
|
|||||||
});
|
});
|
||||||
ibox?.init({
|
ibox?.init({
|
||||||
skillUuid,
|
skillUuid,
|
||||||
skillLv: this.card_lv,
|
skillLv: this.rarity,
|
||||||
overrides: this.overrides,
|
overrides: this.overrides,
|
||||||
});
|
});
|
||||||
mLogger.log(this.debugMode, "SkillBoxComp", "ibox init done", {
|
mLogger.log(this.debugMode, "SkillBoxComp", "ibox init done", {
|
||||||
@@ -241,10 +241,10 @@ export class SkillBoxComp extends CCComp {
|
|||||||
* 3. 按 trigger_type 注册对应事件监听并执行首次触发。
|
* 3. 按 trigger_type 注册对应事件监听并执行首次触发。
|
||||||
*
|
*
|
||||||
* @param uuid 卡牌 UUID
|
* @param uuid 卡牌 UUID
|
||||||
* @param card_lv 技能卡等级
|
* @param rarity 技能卡等级
|
||||||
*/
|
*/
|
||||||
init(uuid: number, card_lv: number, overrides?: SkillOverrides) {
|
init(uuid: number, rarity: number, overrides?: SkillOverrides) {
|
||||||
this.card_lv = card_lv;
|
this.rarity = rarity;
|
||||||
|
|
||||||
// 查询触发配置(药水卡不在 SkillCardList,会走 else 分支)
|
// 查询触发配置(药水卡不在 SkillCardList,会走 else 分支)
|
||||||
// 同时按 卡uuid 或 技能skill id 查找:MissSkillsComp.addSkill 传入的是 payload.skill(技能ID),
|
// 同时按 卡uuid 或 技能skill id 查找:MissSkillsComp.addSkill 传入的是 payload.skill(技能ID),
|
||||||
@@ -388,9 +388,9 @@ export class SkillBoxComp extends CCComp {
|
|||||||
/**
|
/**
|
||||||
* 根据技能等级切换 bg_node 下的颜色子节点显示。
|
* 根据技能等级切换 bg_node 下的颜色子节点显示。
|
||||||
* 等级与颜色对应关系(技能卡 wave 档位):
|
* 等级与颜色对应关系(技能卡 wave 档位):
|
||||||
* card_lv 1 (wave 1) → green
|
* rarity 1 (wave 1) → green
|
||||||
* card_lv 2 (wave 5) → blue
|
* rarity 2 (wave 5) → blue
|
||||||
* card_lv 3 (wave 8) → purple
|
* rarity 3 (wave 8) → purple
|
||||||
*/
|
*/
|
||||||
private updateBgNode() {
|
private updateBgNode() {
|
||||||
if (!this.bg_node) return;
|
if (!this.bg_node) return;
|
||||||
@@ -399,7 +399,7 @@ export class SkillBoxComp extends CCComp {
|
|||||||
2: "blue",
|
2: "blue",
|
||||||
3: "purple",
|
3: "purple",
|
||||||
};
|
};
|
||||||
const targetColor = lvToColor[this.card_lv];
|
const targetColor = lvToColor[this.rarity];
|
||||||
this.bg_node.children.forEach(child => {
|
this.bg_node.children.forEach(child => {
|
||||||
child.active = (child.name === targetColor);
|
child.active = (child.name === targetColor);
|
||||||
});
|
});
|
||||||
@@ -631,7 +631,7 @@ export class SkillBoxComp extends CCComp {
|
|||||||
oops.message.dispatchEvent(GameEvent.TriggerSkill, {
|
oops.message.dispatchEvent(GameEvent.TriggerSkill, {
|
||||||
s_uuid: this.s_uuid,
|
s_uuid: this.s_uuid,
|
||||||
isCardSkill: true, // 标记为卡牌技能(区别于英雄自身技能)
|
isCardSkill: true, // 标记为卡牌技能(区别于英雄自身技能)
|
||||||
card_lv: this.card_lv,
|
rarity: this.rarity,
|
||||||
targetPos: targetPos,
|
targetPos: targetPos,
|
||||||
overrides: this.overrides
|
overrides: this.overrides
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user