2 Commits

Author SHA1 Message Date
pan
068a2dc76c docs: 更新英雄配置规则与文档
调整英雄品质仅影响初始基础属性,移除lv6属性补偿配置,更新全部相关设计文档与注释,统一明确各机制的品质无关性。
2026-09-02 16:56:00 +08:00
pan
d9bccd7c93 refactor: 将代码中的card_lv统一替换为rarity
本次提交完成了全项目范围内术语的统一替换,将原本指代卡牌品质/等级的card_lv字段全部重命名为rarity,对齐了设计文档中的命名规范,避免了术语混淆:
1.  更新了所有配置文件、组件类、数据结构中的字段定义
2.  同步修改了注释、文档说明中的相关表述
3.  修正了英雄、技能、装备卡牌的品质显示逻辑
4.  调整了背景颜色切换、属性计算等相关业务逻辑
2026-09-02 16:42:54 +08:00
36 changed files with 316 additions and 324 deletions

View File

@@ -70,7 +70,7 @@ export interface DeadHeroRecord {
/** 死亡时的英雄等级(复活后继承) */
lv: number;
/** 卡牌等级(驱动 bg_node 颜色) */
card_lv: number;
rarity: number;
/** 死亡时占用的站位索引(复活时优先归位,-1 表示未分配) */
posIndex: number;
/** 死亡时的回合数(用于统计/按回合清理) */

View File

@@ -57,10 +57,10 @@ export interface CardConfig {
cost: number
weight: number
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)才能抽到
hero_lv?: number
base_card_lv?: number
base_rarity?: number
// 技能卡扩展属性
skill?: number // 关联的技能 UUID
@@ -126,22 +126,22 @@ export interface SpecialRefreshCardConfig extends CardConfig {
*/
export const SpecialUpgradeCardList: Record<number, SpecialUpgradeCardConfig> = {
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,
},
}
export const SpecialRefreshCardList: Record<number, SpecialRefreshCardConfig> = {
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,
},
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,
},
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,
},
}

View File

@@ -20,7 +20,7 @@ import { FieldEntry } from "./heroSet";
/** 装备卡原始数据(仅装备相关字段,由 EquipSet 内部转换为 CardConfig) */
interface EquipRawData {
uuid: number;
card_lv: number;
rarity: number;
name: string;
info: string;
icon?: string; // 图标ID(对应 ui6 图集 frame 名)
@@ -30,56 +30,56 @@ interface EquipRawData {
/** 装备卡原始数据表 */
const EquipRawList: EquipRawData[] = [
// ==================== card_lv 1 档(基础强度) ====================
{ uuid: 8701, card_lv: 1, icon: "Helmet-FA_Helmet_021_Gray", name: "战后恢复", info: "战斗结束生命回复量+10%", field: [{ uuid: 7001, value: 0.1 }] },
{ uuid: 8702, card_lv: 1, icon: "Sword-FA_WP_Main_Sword_003_GrayGold", name: "攻击加成", info: "全体攻击力+10%", field: [{ uuid: 7002, value: 0.1 }] },
{ uuid: 8703, card_lv: 1, icon: "Blunt-FA_WP_Main_Blunt_002_Wood", name: "击晕加成", info: "全体击晕概率+10%", field: [{ uuid: 7003, value: 0.1 }] },
{ uuid: 8704, card_lv: 1, icon: "Axe-FA_WP_Main_Axe_001_WoodGray", name: "暴击加成", info: "全体暴击率+10%", field: [{ uuid: 7004, value: 0.1 }] },
{ uuid: 8705, card_lv: 1, icon: "Bow-FA_WP_Main_Bow_003_WoodGreen", name: "暴伤加成", info: "全体暴击伤害+20%", field: [{ uuid: 7005, value: 0.2 }] },
{ uuid: 8706, card_lv: 1, icon: "Crossbow-FA_WP_Main_Crossbow_001_WoodWhite", name: "攻速加成", info: "全体攻击速度+10%", field: [{ uuid: 7006, value: 0.1 }] },
{ uuid: 8707, card_lv: 1, icon: "Chest-FA_Chest_014_Gray", name: "生命加成", info: "全体最大生命+10%", field: [{ uuid: 7007, value: 0.1 }] },
// ==================== rarity 1 档(基础强度) ====================
{ uuid: 8701, rarity: 1, icon: "Helmet-FA_Helmet_021_Gray", name: "战后恢复", info: "战斗结束生命回复量+10%", field: [{ uuid: 7001, 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, rarity: 1, icon: "Blunt-FA_WP_Main_Blunt_002_Wood", name: "击晕加成", info: "全体击晕概率+10%", field: [{ uuid: 7003, 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, rarity: 1, icon: "Bow-FA_WP_Main_Bow_003_WoodGreen", name: "暴伤加成", info: "全体暴击伤害+20%", field: [{ uuid: 7005, value: 0.2 }] },
{ uuid: 8706, rarity: 1, icon: "Crossbow-FA_WP_Main_Crossbow_001_WoodWhite", name: "攻速加成", info: "全体攻击速度+10%", field: [{ uuid: 7006, value: 0.1 }] },
{ uuid: 8707, rarity: 1, icon: "Chest-FA_Chest_014_Gray", name: "生命加成", info: "全体最大生命+10%", field: [{ uuid: 7007, value: 0.1 }] },
// 风怒机制已停用: 8708 风怒加成卡已移除
// { uuid: 8708, card_lv: 1, icon: "Wand-FA_WP_Main_Wand_001_GrayGreen", name: "风怒加成", info: "全体风怒概率+10%", field: [{ uuid: 7008, value: 0.1 }] },
{ uuid: 8709, card_lv: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "穿刺加成", info: "全体穿刺概率+10%", field: [{ uuid: 7009, value: 0.1 }] },
{ uuid: 8712, card_lv: 1, icon: "Spear-FA_WP_Main_Spear_004_WoodBlue", name: "破甲加成", info: "全体穿透后伤害+10%", field: [{ uuid: 7020, value: 0.1 }] },
// { uuid: 8708, rarity: 1, icon: "Wand-FA_WP_Main_Wand_001_GrayGreen", name: "风怒加成", info: "全体风怒概率+10%", field: [{ uuid: 7008, 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, 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) ====================
{ uuid: 8751, card_lv: 2, icon: "Helmet-FA_Helmet_022_DarkBlue", name: "战后恢复", info: "战斗结束生命回复量+20%", field: [{ uuid: 7001, value: 0.2 }] },
{ uuid: 8752, card_lv: 2, icon: "Sword-FA_WP_Main_Sword_007_Blue", name: "攻击加成", info: "全体攻击力+20%", field: [{ uuid: 7002, value: 0.2 }] },
{ uuid: 8753, card_lv: 2, icon: "Blunt-FA_WP_Main_Blunt_004_Gray", name: "击晕加成", info: "全体击晕概率+20%", field: [{ uuid: 7003, value: 0.2 }] },
{ uuid: 8754, card_lv: 2, icon: "Axe-FA_WP_Main_Axe_006_WoodBronze", name: "暴击加成", info: "全体暴击率+20%", field: [{ uuid: 7004, value: 0.2 }] },
{ uuid: 8755, card_lv: 2, icon: "Bow-FA_WP_Main_Bow_010_Blue", name: "暴伤加成", info: "全体暴击伤害+40%", field: [{ uuid: 7005, value: 0.4 }] },
{ uuid: 8756, card_lv: 2, icon: "Crossbow-FA_WP_Main_Crossbow_004_Gray", name: "攻速加成", info: "全体攻击速度+20%", field: [{ uuid: 7006, value: 0.2 }] },
{ uuid: 8757, card_lv: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "生命加成", info: "全体最大生命+20%", field: [{ uuid: 7007, value: 0.2 }] },
// ==================== rarity 2 档(强度 ×2) ====================
{ uuid: 8751, rarity: 2, icon: "Helmet-FA_Helmet_022_DarkBlue", name: "战后恢复", info: "战斗结束生命回复量+20%", field: [{ uuid: 7001, 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, rarity: 2, icon: "Blunt-FA_WP_Main_Blunt_004_Gray", name: "击晕加成", info: "全体击晕概率+20%", field: [{ uuid: 7003, 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, rarity: 2, icon: "Bow-FA_WP_Main_Bow_010_Blue", name: "暴伤加成", info: "全体暴击伤害+40%", field: [{ uuid: 7005, value: 0.4 }] },
{ uuid: 8756, rarity: 2, icon: "Crossbow-FA_WP_Main_Crossbow_004_Gray", name: "攻速加成", info: "全体攻击速度+20%", field: [{ uuid: 7006, value: 0.2 }] },
{ uuid: 8757, rarity: 2, icon: "Chest-FA_Chest_014_BlueGold", name: "生命加成", info: "全体最大生命+20%", field: [{ uuid: 7007, value: 0.2 }] },
// 风怒机制已停用: 8758 风怒加成卡已移除
// { uuid: 8758, card_lv: 2, icon: "Wand-FA_WP_Main_Wand_003_BlueWood", name: "风怒加成", info: "全体风怒概率+20%", field: [{ uuid: 7008, value: 0.2 }] },
{ uuid: 8759, card_lv: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "穿刺加成", info: "全体穿刺概率+20%", field: [{ uuid: 7009, value: 0.2 }] },
{ uuid: 8763, card_lv: 2, icon: "Spear-FA_WP_Main_Spear_007_GraySkyblue", name: "破甲加成", info: "全体穿透后伤害+20%", field: [{ uuid: 7020, value: 0.2 }] },
// { uuid: 8758, rarity: 2, icon: "Wand-FA_WP_Main_Wand_003_BlueWood", name: "风怒加成", info: "全体风怒概率+20%", field: [{ uuid: 7008, 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, 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) ====================
{ uuid: 8801, card_lv: 3, icon: "Helmet-FA_Helmet_021_RedGold", name: "战后恢复", info: "战斗结束生命回复量+30%", field: [{ uuid: 7001, value: 0.3 }] },
{ uuid: 8802, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击加成", info: "全体攻击力+30%", field: [{ uuid: 7002, value: 0.3 }] },
{ uuid: 8803, card_lv: 3, icon: "Blunt-FA_WP_Main_Blunt_006_OrangeGray", name: "击晕加成", info: "全体击晕概率+30%", field: [{ uuid: 7003, value: 0.3 }] },
{ uuid: 8804, card_lv: 3, icon: "Axe-FA_WP_Main_Axe_012_WoodGold", name: "暴击加成", info: "全体暴击率+30%", field: [{ uuid: 7004, value: 0.3 }] },
{ uuid: 8805, card_lv: 3, icon: "Bow-FA_WP_Main_Bow_010_Gold", name: "暴伤加成", info: "全体暴击伤害+60%", field: [{ uuid: 7005, value: 0.6 }] },
{ uuid: 8806, card_lv: 3, icon: "Crossbow-FA_WP_Main_Crossbow_005_WoodGold", name: "攻速加成", info: "全体攻击速度+30%", field: [{ uuid: 7006, value: 0.3 }] },
{ uuid: 8807, card_lv: 3, icon: "Chest-FA_Chest_015_RedGold", name: "生命加成", info: "全体最大生命+30%", field: [{ uuid: 7007, value: 0.3 }] },
// ==================== rarity 3 档(强度 ×3) ====================
{ uuid: 8801, rarity: 3, icon: "Helmet-FA_Helmet_021_RedGold", name: "战后恢复", info: "战斗结束生命回复量+30%", field: [{ uuid: 7001, 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, rarity: 3, icon: "Blunt-FA_WP_Main_Blunt_006_OrangeGray", name: "击晕加成", info: "全体击晕概率+30%", field: [{ uuid: 7003, 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, rarity: 3, icon: "Bow-FA_WP_Main_Bow_010_Gold", name: "暴伤加成", info: "全体暴击伤害+60%", field: [{ uuid: 7005, value: 0.6 }] },
{ uuid: 8806, rarity: 3, icon: "Crossbow-FA_WP_Main_Crossbow_005_WoodGold", name: "攻速加成", info: "全体攻击速度+30%", field: [{ uuid: 7006, value: 0.3 }] },
{ uuid: 8807, rarity: 3, icon: "Chest-FA_Chest_015_RedGold", name: "生命加成", info: "全体最大生命+30%", field: [{ uuid: 7007, value: 0.3 }] },
// 风怒机制已停用: 8808 风怒加成卡已移除
// { uuid: 8808, card_lv: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "风怒加成", info: "全体风怒概率+30%", field: [{ uuid: 7008, value: 0.3 }] },
{ uuid: 8809, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "穿刺加成", info: "全体穿刺概率+30%", field: [{ uuid: 7009, value: 0.3 }] },
{ uuid: 8817, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "破甲加成", info: "全体穿透后伤害+30%", field: [{ uuid: 7020, value: 0.3 }] },
// { uuid: 8808, rarity: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "风怒加成", info: "全体风怒概率+30%", field: [{ uuid: 7008, 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, 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: 8812, card_lv: 3, icon: "Staff-FA_WP_Main_Staff_005_WoodGold", name: "死亡强化", info: "死亡触发技能次数+1", field: [{ uuid: 7015, value: 1 }] },
{ uuid: 8813, card_lv: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "开场强化", info: "战斗开始触发技能次数+1", field: [{ uuid: 7016, value: 1 }] },
{ uuid: 8815, card_lv: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击强化", info: "攻击触发技能次数+1", field: [{ uuid: 7018, value: 1 }] },
{ uuid: 8816, card_lv: 3, icon: "Shield-FA_WP_Sub_Shield_009_RedGold", name: "受击强化", info: "被攻击触发技能次数+1", field: [{ uuid: 7019, value: 1 }] },
{ uuid: 8811, rarity: 3, icon: "Wand-FA_WP_Main_Wand_004_WoodGold", name: "召唤强化", info: "召唤触发技能次数+1", field: [{ uuid: 7014, value: 1 }] },
{ uuid: 8812, rarity: 3, icon: "Staff-FA_WP_Main_Staff_005_WoodGold", name: "死亡强化", info: "死亡触发技能次数+1", field: [{ uuid: 7015, value: 1 }] },
{ uuid: 8813, rarity: 3, icon: "Spear-FA_WP_Main_Spear_008_GrayGold", name: "开场强化", info: "战斗开始触发技能次数+1", field: [{ uuid: 7016, value: 1 }] },
{ uuid: 8815, rarity: 3, icon: "Sword-FA_WP_Main_Sword_001_Gold", name: "攻击强化", info: "攻击触发技能次数+1", field: [{ uuid: 7018, 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,
weight: 10,
kind: CKind.Skill,
card_lv: data.card_lv,
rarity: data.rarity,
icon: data.icon,
name: data.name,
info: data.info,

View File

@@ -103,7 +103,7 @@ export const HERO_UPGRADE_NEED_FRAGMENTS: Record<number, number> = {
/**
* 技能卡牌出现的回合配置(单一数据源)。
* 数组索引 i 对应卡牌档位 card_lv = i + 1:
* 数组索引 i 对应卡牌档位 rarity = i + 1:
* - 第 1 个回合 → LV1 档(基础强度)
* - 第 2 个回合 → LV2 档(强度 ×2)
* - 第 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 下子节点的显隐切换
*/
export const CARD_LV_BG_COLORS: string[] = ["green", "blue", "purple", "yellow", "red"];
export const RARITY_BG_COLORS: string[] = ["green", "blue", "purple", "yellow", "red"];
/**
* 战斗结算奖励配置(每局结束后发放:英雄碎片 + 金币 + 天赋经验)。

View File

@@ -8,7 +8,7 @@
## 编号体系
| 号段 | card_lv | 说明 |
| 号段 | rarity | 说明 |
|------|---------|------|
| 5001-5099 | 1 | 绿卡英雄池 |
| 5101-5199 | 2 | 蓝卡英雄池 |
@@ -44,26 +44,26 @@
## 规则 2:品质-档位标准
**card_lv = 基础 1 + 能力加成**
**rarity = 基础 1 + 能力加成**
| 能力项 | 加成 | 说明 |
|--------|------|------|
| 基础触发技能(1个,单体) | +0 | card_lv=1 |
| 更高数值 | +1 | card_lv=2 |
| ap/hp 成长 | +1 | card_lv=2 |
| 范围扩大(单体→全体) | +2 | card_lv=3 |
| 双技能(+revive/光环) | +4 | card_lv=5 |
| 基础触发技能(1个,单体) | +0 | rarity=1 |
| 更高数值 | +1 | rarity=2 |
| ap/hp 成长 | +1 | rarity=2 |
| 范围扩大(单体→全体) | +2 | rarity=3 |
| 双技能(+revive/光环) | +4 | rarity=5 |
**组合示例:**
- 1 + 0 = card_lv 1(基础)
- 1 + 1 = card_lv 2(数值强化 或 ap/hp 成长)
- 1 + 2 = card_lv 3(范围扩大)
- 1 + 1 + 2 = card_lv 4(数值 + 范围)
- 1 + 4 = card_lv 5(双技能)
- 1 + 0 = rarity 1(基础)
- 1 + 1 = rarity 2(数值强化 或 ap/hp 成长)
- 1 + 2 = rarity 3(范围扩大)
- 1 + 1 + 2 = rarity 4(数值 + 范围)
- 1 + 4 = rarity 5(双技能)
**双技能定义**:指英雄同时拥有**两个不同的触发类型字段**(如 atked + revive,或 dead + field)。同一触发类型下的 TriggerGrouped 挂多个 s_uuid 属于主触发类型内的能力组合,不算"双技能"。
**原则:每个英雄单独讨论,根据能力组合定 card_lv,不死板规定。**
**原则:每个英雄单独讨论,根据能力组合定 rarity,不死板规定。**
## 规则 3:命名规则
@@ -124,7 +124,7 @@
## 当前英雄池
| 编号 | 名称 | card_lv | 触发类型 | 能力 | 状态 |
| 编号 | 名称 | rarity | 触发类型 | 能力 | 状态 |
|------|------|---------|---------|------|------|
| 5001 | 铁壁战士 | 1 | atked | 护盾 | 保留(原 5011) |
| 5106 | 破甲射手 | 2 | atking | 穿透伤害(计时buff,技能 6512 + Buff 7022) | 已创建 |

View File

@@ -70,7 +70,7 @@ export const ItemCardList: CardConfig[] = ItemCardData.map(data => ({
cost: data.cost,
weight: data.weight,
kind: CKind.Potion,
card_lv: 1,
rarity: 1,
icon: data.icon,
name: data.name,
info: data.info,

View File

@@ -8,7 +8,7 @@
* 设计:
* - 技能卡不再按 wave 过滤,所有技能卡均可被抽取。
* - 所有技能卡均按次数触发(t_times),不再永久存在。
* - card_lv 直接显式配置,不再依赖 wave 推导。
* - rarity 直接显式配置,不再依赖 wave 推导。
* - 数值基线高于普通英雄普攻(ap:100),通过 overrides 附加 ap/crt/frz/stun/bck 等效果。
*
* 依赖:
@@ -22,7 +22,7 @@ import { SkillOverrides } from "./SkillSet";
interface SkillCardRaw {
uuid: number;
skill: number;
card_lv: number;
rarity: number;
name: string;
info: string;
icon?: string; // 图标ID(对应 ui6 图集 frame 名)
@@ -35,30 +35,30 @@ interface 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: 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: 8101, skill: 6001, rarity: 1, icon: "Sword-FA_WP_Main_Sword_003_PurpleSilver", name: "飞剑卷轴", info: "召唤飞剑攻击敌人,造成攻击力150%的伤害,25%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 25 } },
{ uuid: 8102, skill: 6002, rarity: 1, icon: "Sword-FA_WP_Main_Sword_019_WoodSilver", name: "匕首卷轴", info: "召唤匕首攻击敌人,造成攻击力150%的伤害,25%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 25 } },
// --- 斧锤系:击退 ---
{ uuid: 8103, skill: 6003, 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次) ---
{ 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: 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: 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: 8106, skill: 6006, rarity: 1, icon: "Stat_RangedAttack", name: "射击卷轴", info: "召唤射击攻击敌人,造成攻击力150%的伤害,30%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 30 } },
{ uuid: 8107, skill: 6007, rarity: 1, icon: "Stat_RangedAttack", name: "蓝箭卷轴", info: "召唤蓝箭攻击敌人,造成攻击力150%的伤害,30%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 30 } },
{ uuid: 8108, skill: 6008, rarity: 1, icon: "Stat_RangedAttack", name: "火箭卷轴", info: "召唤火箭攻击敌人,造成攻击力150%的伤害,30%暴击", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, crt: 30 } },
// --- 魔球系:击晕 ---
{ uuid: 8109, skill: 6009, 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: 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: 8109, skill: 6009, rarity: 1, icon: "Sub_Item-FA_WP_Sub_MagicBall_001_Blue", name: "蓝魔球卷轴", info: "召唤蓝魔球攻击敌人,造成攻击力150%的伤害,25%击晕", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, stun: 25 } },
{ uuid: 8110, skill: 6010, rarity: 1, icon: "Sub_Item-FA_WP_Sub_MagicBall_001_Purple", name: "紫魔球卷轴", info: "召唤紫魔球攻击敌人,造成攻击力150%的伤害,25%击晕", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, stun: 25 } },
// --- 药瓶系:冰冻 ---
{ uuid: 8111, skill: 6011, 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: 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: 8111, skill: 6011, rarity: 1, icon: "Sub_Item-FA_WP_Sub_Potion_001_Green", name: "绿药瓶卷轴", info: "召唤绿药瓶攻击敌人,造成攻击力150%的伤害,25%冰冻", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, frz: 25 } },
{ uuid: 8112, skill: 6012, rarity: 1, icon: "Sub_Item-FA_WP_Sub_Potion_001_Red", name: "红药瓶卷轴", info: "召唤红药瓶攻击敌人,造成攻击力150%的伤害,25%冰冻", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 150, frz: 25 } },
// ==================== card_lv 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: 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 } },
// ==================== rarity 2 · 中阶范围(ap:200,群体附加) ====================
{ uuid: 8201, skill: 6200, rarity: 2, icon: "Stat_FireDamage", name: "火球·双卷轴", info: "召唤火球·双攻击敌人,一次释放2发,造成攻击力200%的伤害,30%暴击,可命中2个目标", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 200, crt: 30, num: 1 } },
{ uuid: 8202, skill: 6201, rarity: 2, icon: "Stat_Mana", name: "飓风卷轴", info: "召唤飓风攻击敌人,造成攻击力200%的伤害,30%击晕,可命中2个目标", is_inst: false, t_times: 3, t_inv: 5, trigger_type: CardTriggerType.Interval, overrides: { ap: 200, stun: 30 } },
// ==================== card_lv 3 · 高阶范围(ap:250,群体附加) ====================
// ==================== rarity 3 · 高阶范围(ap:250,群体附加) ====================
];
/**
@@ -75,7 +75,7 @@ export const SkillCardList: CardConfig[] = SkillCardData.map(data => {
cost: 0,
weight: 10,
kind: CKind.Skill,
card_lv: data.card_lv,
rarity: data.rarity,
icon: data.icon,
name: data.name,
info: data.info,

View File

@@ -116,7 +116,7 @@
}
],
"info": "",
"card_lv": 4,
"rarity": 4,
"grow_type": "Mage",
"role": "Mage",
"trig_order": [
@@ -225,7 +225,7 @@
}
],
"info": "",
"card_lv": 5,
"rarity": 5,
"grow_type": "Warrior",
"role": "Warrior",
"trig_order": [
@@ -347,7 +347,7 @@
}
],
"info": "",
"card_lv": 4,
"rarity": 4,
"grow_type": "Warrior",
"role": "Warrior",
"trig_order": [
@@ -477,7 +477,7 @@
}
],
"info": "",
"card_lv": 4,
"rarity": 4,
"grow_type": "Mage",
"role": "Mage",
"trig_order": [
@@ -590,7 +590,7 @@
}
],
"info": "",
"card_lv": 5,
"rarity": 5,
"grow_type": "Tank",
"role": "Tank",
"trig_order": [
@@ -755,7 +755,7 @@
}
],
"info": "",
"card_lv": 4,
"rarity": 4,
"grow_type": "Support",
"role": "Support",
"trig_order": [
@@ -887,7 +887,7 @@
}
],
"info": "",
"card_lv": 3,
"rarity": 3,
"grow_type": "Tank",
"role": "Tank",
"trig_order": [
@@ -910,7 +910,7 @@
],
"block_comments": {
"ap_bonus": [
" // card_lv 3:lv9 无光环,改为基础属性+50%"
" // rarity 3:lv9 无光环,改为基础属性+50%"
]
},
"ap_bonus": [
@@ -1006,7 +1006,7 @@
}
],
"info": "",
"card_lv": 5,
"rarity": 5,
"grow_type": "Warrior",
"role": "Warrior",
"trig_order": [
@@ -1116,7 +1116,7 @@
}
],
"info": "",
"card_lv": 3,
"rarity": 3,
"grow_type": "Tank",
"role": "Tank",
"trig_order": [
@@ -1161,7 +1161,7 @@
],
"block_comments": {
"ap_bonus": [
" // card_lv 3:lv9 无光环,改为基础属性+50%"
" // rarity 3:lv9 无光环,改为基础属性+50%"
]
},
"ap_bonus": [

View File

@@ -117,15 +117,15 @@ export const HERO_GROW_COEF: Record<HGrowType, { hp: number; ap: number; def: nu
};
/**
* 英雄品质系数步长:相邻品质(card_lv)基础属性相差 5%。
* 系数 = 1 + HERO_QUALITY_STEP × (card_lv - 1),lv1~lv5 → 1.00/1.05/1.10/1.15/1.20。
* 英雄品质系数步长:相邻品质(rarity)基础属性相差 5%。
* 系数 = 1 + HERO_QUALITY_STEP × (rarity - 1),lv1~lv5 → 1.00/1.05/1.10/1.15/1.20。
* 仅作用于 lv1 初始基础属性(AP/HP/DEF),成长与等级 bonus 不随品质缩放。
*/
export const HERO_QUALITY_STEP = 0.05;
/** 计算英雄品质系数(相邻品质基础属性差 5%) */
export function getHeroQualityCoef(cardLv: number): number {
return 1 + HERO_QUALITY_STEP * (Math.max(1, cardLv) - 1);
export function getHeroQualityCoef(rarity: number): number {
return 1 + HERO_QUALITY_STEP * (Math.max(1, rarity) - 1);
}
/**
@@ -308,7 +308,7 @@ export interface heroInfo {
fac: FacSet; // 阵营(FacSet.HERO 或 FacSet.MON)
kind?: 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; // 攻击定位(近战/中程/远程)
grow_type?: HGrowType; // 成长类型(决定每级 hp/ap 标准增量,默认 Warrior)
role?: HRole; // 位置类型/职业定位(英雄专用,怪物用 monType 表达)
@@ -346,8 +346,8 @@ export interface HeroCardConfig {
name?: string;
info?: string;
cost: number;
card_lv: number;
base_card_lv?: number;
rarity: number;
base_rarity?: number;
}
/**
@@ -357,7 +357,7 @@ export interface HeroCardPoolEntry {
uuid: number;
cost: number;
weight: number;
card_lv: number;
rarity: number;
}
/** 英雄卡池:由 HeroList 动态生成(见文件末尾初始化代码) */
@@ -456,12 +456,11 @@ export interface LvBonusEntry {
*=============英雄配置列表================
* 几何王国复刻版 — 依据 英雄设计指引.md(A/B 级复刻英雄)配置
*
* 规则: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 有效值),
* 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%,
* 品质(card_lv)相邻基础属性差 5%(仅 lv1 初始 AP/HP/DEF)
* 编号:本批复刻英雄集中于 5001~5009,card_lv 按配置(不遵循段位规则)
* 品质(rarity)仅影响 lv1 初始基础属性(相邻差 5%,仅 lv1 初始 AP/HP/DEF),不影响 uuid 段位/光环/技能解锁/属性补偿
* 编号:本批复刻英雄集中于 5001~5009,rarity 按配置(不遵循段位规则)
*/
// @hero-setup:region-begin
@@ -470,7 +469,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5001 紫电魔女 — atking 麻痹 + 大招 6203 大能量波(击退/麻痹)+ 攻击光环(深渊女王复刻)
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: {
// 普攻:紫魔球底座 + overrides 注入麻痹
6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, para: 30 }, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹目标" },
@@ -497,7 +496,7 @@ export const HeroInfo: Record<number, heroInfo> = {
},
// 5002 刀刀暴击 — atking 暴击 + 大招 6100 光闪(出血/多段)+ 暴击/暴伤双光环(剑圣复刻)
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: {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥刀对{target}造成攻击力{ap}%伤害" },
// 大招:光闪,独立 cd,按英雄等级分档成长
@@ -523,7 +522,7 @@ export const HeroInfo: Record<number, heroInfo> = {
},
// 5003 格挡反杀 — fstart 剑气 + atked 护盾 + 大招 6103 闪电斩(减攻)(剑豪复刻)
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: {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥刀对{target}造成攻击力{ap}%伤害" },
// 大招:闪电斩,独立 cd,按英雄等级分档成长
@@ -554,7 +553,7 @@ export const HeroInfo: Record<number, heroInfo> = {
},
// 5004 冻住不谢 — atking 冰冻 + 大招 6203 大能量波(冰冻链)+ 击晕光环(巫妖王复刻)
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: {
6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "射出寒冰珠,对{target}造成攻击力{ap}%伤害" },
// 大招:大能量波,独立 cd,按英雄等级分档成长
@@ -580,7 +579,7 @@ export const HeroInfo: Record<number, heroInfo> = {
},
// 5005 叠甲骑士 — 护盾大招 + fstart 防御 + dead 治疗 + revive 回光返照(黑暗骑士复刻)
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: {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥剑对{target}造成攻击力{ap}%伤害" },
// 大招位辅助技能:护盾,按英雄等级分档成长(护盾层数)
@@ -616,7 +615,7 @@ export const HeroInfo: Record<number, heroInfo> = {
},
// 5006 光明奶爸 — 治疗大招 + atking 自疗 + fstart 防御 + 生命光环(光明骑士复刻)
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: {
6012: { uuid: 6012, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, desc: "投掷药瓶,对{target}造成攻击力{ap}%伤害" },
// 大招:治疗,独立 cd,按英雄等级分档成长
@@ -647,7 +646,7 @@ export const HeroInfo: Record<number, heroInfo> = {
},
// 5007 微醺战神 — atking 击退 + 大招 6101 气斩(易伤),lv9 属性补偿(酒仙复刻)
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: {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥拳对{target}造成攻击力{ap}%伤害" },
// 大招:气斩,独立 cd,按英雄等级分档成长
@@ -666,14 +665,11 @@ export const HeroInfo: Record<number, heroInfo> = {
{ lv: 6, s_lv: SkillLv.Lv1, name: "雷霆一击", t_num: 3, overrides: { bck: 40 }, desc: "重击{target},击退{bck}" },
],
},
// card_lv 3:lv6 无光环,改为基础属性+50%
ap_bonus: [{ lv: 6, value: 0.5 }],
hp_bonus: [{ lv: 6, value: 0.5 }],
info: "",
},
// 5008 眩晕暴击哥 — atking 暴击 + 大招 6104 开山斧(击晕)+ 暴伤光环(齐天大圣复刻)
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: {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥斧对{target}造成攻击力{ap}%伤害" },
// 大招:开山斧,独立 cd,按英雄等级分档成长
@@ -699,7 +695,7 @@ export const HeroInfo: Record<number, heroInfo> = {
},
// 5009 铁壳斧弟 — atked 叠防 + atking 自疗 + 大招 6101 气斩,lv9 属性补偿(斧小王复刻)
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: {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥斧对{target}造成攻击力{ap}%伤害" },
// 大招:气斩,独立 cd,按英雄等级分档成长
@@ -724,16 +720,13 @@ 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}秒" },
],
},
// card_lv 3:lv6 无光环,改为基础属性+50%
ap_bonus: [{ lv: 6, value: 0.5 }],
hp_bonus: [{ lv: 6, value: 0.5 }],
info: "",
},
/*
*=============怪物配置列表================
* 怪物与英雄采用同一套设定体系:基础值 = HERO_ROLE_BASE[role],品质(card_lv)
* 怪物与英雄采用同一套设定体系:基础值 = HERO_ROLE_BASE[role],品质(rarity)
* 相邻基础属性差 5%,成长系数走 HERO_GROW_COEF[grow_type]。
* 怪物普攻统一使用 SkillSet 基础单体攻击(6001~6012 段),
* 并通过 overrides.ap=100 显式声明伤害为攻击力的 100%。
@@ -744,63 +737,63 @@ export const HeroInfo: Record<number, heroInfo> = {
// 基础怪物 (全部固定点位站桩攻击,HType仅决定是前排还是后排)
// 前排怪物 — 战士系基准(Warrior 模板),变体按品质微分定位
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: "基础前排怪, 战士系基准"
},
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更快更痛"
},
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低攻承伤位"
},
// 后排怪物 — 射手/刺客/法系基准,变体按品质微分定位
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: "后排输出怪, 射手系基准"
},
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刺客"
},
// 特殊位怪物
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级坦克"
},
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: "后排辅助法师怪"
},
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: "后排召唤系法师怪"
},
// BOSS怪物 — 与英雄同一套设定(role 模板 + 品质系数),高品质承伤/输出位
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, 攻速型"
},
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"
},
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"
},
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, 均衡型"
},
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"
},
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+高速"
},
@@ -825,7 +818,7 @@ export interface HeroComboInfo {
name: string; // 阵容名称(体现流派)
heroes: number[]; // 英雄 uuid 列表,固定 3 个;索引 0=前排,其余按站位从近到远
desc: string; // 配合思路说明(信息面板展示)
low_heroes?: number[]; // 低配替代阵容(card_lv 1~2,供新手期引导)
low_heroes?: number[]; // 低配替代阵容(rarity 1~2,供新手期引导)
}
/**
@@ -883,21 +876,21 @@ export const HeroComboList: number[] = [8001, 8002, 8003, 8004, 8005, 8006];
* 英雄卡费用规则
* lv1=5, lv2=10, lv3+=15
*/
function getHeroCost(cardLv: number): number {
if (cardLv === 1) return 5;
if (cardLv === 2) return 10;
function getHeroCost(rarity: number): number {
if (rarity === 1) return 5;
if (rarity === 2) return 10;
return 15;
}
/**
* 英雄卡按 card_lv 分配抽取权重(几何递减,高等级越稀有)
* 英雄卡按 rarity 分配抽取权重(几何递减,高等级越稀有)
* 梯度:lv1=40, lv2=25, lv3=15, lv4=8, lv5=3
*/
const HERO_WEIGHT_BY_LV: Record<number, number> = {
1: 40, 2: 25, 3: 15, 4: 8, 5: 3,
};
function getHeroWeight(cardLv: number): number {
return HERO_WEIGHT_BY_LV[cardLv] ?? HERO_WEIGHT_BY_LV[1];
function getHeroWeight(rarity: number): number {
return HERO_WEIGHT_BY_LV[rarity] ?? HERO_WEIGHT_BY_LV[1];
}
// 动态生成英雄卡池:所有英雄统一生成 lv1 卡牌
@@ -906,9 +899,9 @@ HeroList.forEach(uuid => {
if (!hero) return;
HeroCardPoolList.push({
uuid: hero.uuid,
cost: getHeroCost(hero.card_lv ?? 1),
weight: getHeroWeight(hero.card_lv ?? 1),
card_lv: hero.card_lv ?? 1,
cost: getHeroCost(hero.rarity ?? 1),
weight: getHeroWeight(hero.rarity ?? 1),
rarity: hero.rarity ?? 1,
});
});
@@ -1039,7 +1032,7 @@ export function getEffectiveStats(hero: heroInfo, targetLv: number): { hp: numbe
*/
export function getHeroDisplayStats(hero: heroInfo, targetLv: number): { hp: number, ap: number, def: number } {
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 stats = {
hp: Math.round(hero.hp * coef) + (eff.hp - hero.hp),
@@ -1057,7 +1050,7 @@ export function getHeroDisplayStats(hero: heroInfo, targetLv: number): { hp: num
/** 内部:lv12 专项基数(不含 lv12 自身)的展示有效值 */
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);
return {
hp: Math.round(hero.hp * coef) + (eff.hp - hero.hp),

View File

@@ -27,7 +27,7 @@
| 剧毒利刃(普攻30%淬毒) | lv2 atking:6010 紫魔球(远程法师普攻)+ `overrides: { timed_buff_id: 7005(中毒) }`,t_num=3 模拟 30% |
| 强化声波(击退+30%) | lv3/5 提升 `bck` 档位 |
| 女王尖啸(第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。定位:远程控场法师。
@@ -106,7 +106,7 @@
## 四、复刻落地清单(按优先级)
| 优先级 | 英雄(新名) | card_lv 建议 | 核心组合 | 一句话卖点 |
| 优先级 | 英雄(新名) | rarity 建议 | 核心组合 | 一句话卖点 |
|---|---|---|---|---|
| P0 | 紫电魔女 | 4 | 6010 紫魔球 + 6203 大能量波(击退/击晕)+ 7005 中毒 + 攻击光环 | 远程群体击退+毒+控场法师 |
| P0 | 刀刀暴击 | 5 | 6100 光闪多段 + `crt` + 7007 出血 + 暴击光环 | 暴击流血剑士 |

View File

@@ -27,7 +27,7 @@
```
英雄名称:xxx
card_lv:4 // 品质 1~5,决定 uuid 段位与 lv6 是否有光环
rarity:4 // 品质 1~5,仅决定 lv1 初始基础属性(AP/HP/DEF)系数
类型:tank // HRole 职业定位(tank/warrior/assassin/mage/support)
形态:远程 // 攻击定位:近战/中距/远程(决定普攻底座与 dis)
ap:tank+5 // 职业基础值 + 手动偏移
@@ -41,7 +41,7 @@ atking[0]_lv6:攻击触发(t_num 模拟概率,1=每次 3≈33% 4≈25%)
atked[0]_lv6:无
fstart[0]_lv6:无
dead[0]_lv6:无
field[0]_lv6:驻场光环(仅 card_lv 4/5;card_lv 1/2/3 改为属性+30/40/50%)
field[0]_lv6:驻场光环(无品质门槛,所有英雄均可配置)
revive[0]_lv1:无(与 skills[1] 互斥二选一;配置时与大招同走 lv1/lv9/lv16 三档)
revive[0]_lv9:无
revive[0]_lv16:无
@@ -50,9 +50,9 @@ 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)
- **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)),不再决定 uuid 段位、光环/技能解锁、属性补偿等任何机制;其余配置参数完全一致
- 能力只能从能力池(BuffList 7001\~7024 / FieldSkillSet 7001\~7020 / SkillSet 底座)引用 + `overrides` 数值覆盖,**禁止新增同义底座**
**大招召唤数约束**(`summon_count` 覆写规则):
@@ -69,7 +69,7 @@ revive[0]_lv16:无
```
英雄名称:紫电魔女
card_lv:4
rarity:4
类型:mage
形态:远程
ap:mage+10
@@ -94,7 +94,7 @@ revive[0]_lv16:无
```
英雄名称:刀刀暴击
card_lv:5
rarity:5
类型:warrior
形态:近战
ap:warrior+15
@@ -119,7 +119,7 @@ revive[0]_lv16:无
```
英雄名称:格挡反杀
card_lv:4
rarity:4
类型:warrior
形态:近战
ap:warrior+5
@@ -144,7 +144,7 @@ revive[0]_lv16:无
```
英雄名称:冻住不谢
card_lv:4
rarity:4
类型:mage
形态:远程
ap:mage+5
@@ -173,7 +173,7 @@ revive[0]_lv16:无
```
英雄名称:叠甲骑士
card_lv:5
rarity:5
类型:tank
形态:近战
ap:tank+0
@@ -198,7 +198,7 @@ revive[0]_lv16:无
```
英雄名称:光明奶爸
card_lv:4
rarity:4
类型:support
形态:远程
ap:support+0
@@ -223,7 +223,7 @@ revive[0]_lv16:无
```
英雄名称:微醺战神
card_lv:3
rarity:3
类型:tank
形态:近战
ap:tank+5
@@ -237,7 +237,7 @@ atking[0]_lv6:雷霆一击——普攻3次附加击退强化(t_num3,bck40
atked[0]_lv6:无
fstart[0]_lv6:无
dead[0]_lv6:无
field[0]_lv6:无(card_lv3 → 基础属性+50%:ap_bonus/hp_bonus 按档)
field[0]_lv6:无(rarity3,光环无品质门槛,本英雄按定位不配置光环)
revive[0]_lv1:无
revive[0]_lv9:无
revive[0]_lv16:无
@@ -248,7 +248,7 @@ revive[0]_lv16:无
```
英雄名称:眩晕暴击哥
card_lv:5
rarity:5
类型:warrior
形态:近战
ap:warrior+20
@@ -273,7 +273,7 @@ revive[0]_lv16:无
```
英雄名称:铁壳斧弟
card_lv:3
rarity:3
类型:tank
形态:近战
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 可叠层)
fstart[0]_lv6:无
dead[0]_lv6:无
field[0]_lv6:无(card_lv3 → 基础属性+50%:ap_bonus/hp_bonus 按档)
field[0]_lv6:无(rarity3,光环无品质门槛,本英雄按定位不配置光环)
revive[0]_lv1:无
revive[0]_lv9:无
revive[0]_lv16:无
@@ -298,8 +298,8 @@ revive[0]_lv16:无
## 落地优先级与 uuid 段位
| 优先级 | 英雄 | uuid | card\_lv | 核心触发组合 |
| --- | ----- | ---- | -------- | -------------------------------------- |
| 优先级 | 英雄 | uuid | rarity | 核心触发组合 |
| --- | ----- | ---- | ------ | -------------------------------------- |
| P0 | 紫电魔女 | 5001 | 4 | atking 击晕 + 大招 6203 大能量波(击退/击晕)+ 攻击光环 |
| P0 | 刀刀暴击 | 5002 | 5 | atking 暴击 + 大招出血多段 + 暴击/暴伤双光环 |
| P1 | 格挡反杀 | 5003 | 4 | fstart 剑气 + atked 护盾 + 大招减攻 |
@@ -310,16 +310,16 @@ revive[0]_lv16:无
| P1 | 眩晕暴击哥 | 5008 | 5 | atking 暴击 + 大招击晕 + 暴伤光环 |
| P2 | 铁壳斧弟 | 5009 | 3 | atked 叠防 + atking 自疗 |
> 本批复刻英雄直接占用 5001\~5009 段位(按用户要求从 5001 起连续编号,不遵循 card\_lv 段位规则),已在 [heroSet.ts](./heroSet.ts) 落地。
> 本批复刻英雄直接占用 5001\~5009 段位(按用户要求从 5001 起连续编号,rarity 不再决定 uuid 段位),已在 [heroSet.ts](./heroSet.ts) 落地。
## 怪物设计原则
怪物与英雄采用同一套设定体系:
- **基础值与品质**:基础属性取 `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),与英雄一致
- **数值平衡**:怪物与英雄仅通过**品质差异**(`card_lv`)拉开数值,高难波次用更高 `card_lv` 的怪物变体承担压场
- **Boss**:同体系,通过高 `card_lv`(4/5)实现承伤/输出压制
- **数值平衡**:怪物与英雄仅通过**品质差异**(`rarity`)拉开数值,高难波次用更高 `rarity` 的怪物变体承担压场
- **Boss**:同体系,通过高 `rarity`(4/5)实现承伤/输出压制
- **成长驱动**:怪物按等级成长由后续肉鸽配置驱动;当前配置承担“职业基准 + 品质差异”的静态表达,运行时按品质系数缩放基础值
## 配置检查清单
@@ -328,11 +328,10 @@ revive[0]_lv16:无
- [ ] 大招(`skills[1]`)覆写 `summon_count`:lv1=1、lv9=1、lv16=2,通过 `lv_entries` 逐级覆写,不改动 SkillSet 底座
- [ ] `timed_buff_id` 指向 BuffList 已存在条目(能力池 2.1/2.2 内)
- [ ] debuff/buff 只通过 `overrides` 注入,未改动 SkillSet/BuffList 底座
- [ ] `atking`/`atked`/`fstart`/`dead`/`field` 按 s\_uuid 分组、按 lv 升序,触发类技能统一 lv6 激活
- [ ] `atking`/`atked`/`fstart`/`dead`/`field` 按 s\_uuid 分组、按 lv 升序,触发类技能统一 lv6 激活(无品质门槛,field 光环任意品质可配)
- [ ] `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%)
- [ ] lv12:按职业注入单项属性 +50%(坦克 def、战士/辅助 hp、刺客/射手/法师 ap),基数取 lv11 有效值
- [ ] 品质:card\_lv 相邻基础属性差 5%(运行时品质系数统一乘,配置保持裸值)
- [ ] 品质(rarity)仅影响 lv1 初始 AP/HP/DEF(相邻差 5%,运行时品质系数统一乘,配置保持裸值),不影响 uuid 段位/光环/技能解锁/属性补偿
- [ ] `t_num` 概率模拟符合预期(1=每次,3≈33%,4≈25%)
- [ ] `infos` 分级说明与配置档位一一对应(面板逐条展示)
- [ ] 近战/远程形态与 `type`/`dis` 匹配,美术资源 `path`/`icon` 就绪

View File

@@ -2,11 +2,11 @@
> **前置约束**(已确认的设计原则):
> - 局内固定(战斗开始召唤的时候同)等级成长移交局外(局外等级与碎片数量)
> - 单场战斗 30 左右秒
> - card_lv 角色品质(1~5):初始基础数值带有品质增量,每升 1级都是按 20% 增量。
> - rarity 角色品质(1~5):初始基础数值带有品质增量,每升 1级都是按 20% 增量。
> - 初始 技能 普通攻击和大招 skills[0]、skills[1](对应"普通攻击"、"大招"),| 复活 | `SkillTriggerType.Revive` | 属于大招
> - lv2: atking/atked/fstart 提升普通攻击能力,atking/atked 附加临时buff,fstart 局内持久 buff
> - 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是底座,已存在能力就不能添加,只要数值替代就可以)
---
@@ -76,7 +76,7 @@
| `bck` | 额外击退距离增量 | `overrides.bck` | 气斩、重击 |
### 2.4 驻场光环能力池(FieldSkillType)
| 能力 | FieldSkillType | 底座 uuid | 适用 card_lv | 几何王国对应场景 |
| 能力 | FieldSkillType | 底座 uuid | 适用 rarity | 几何王国对应场景 |
|---|---|---|---|---|
| 战后恢复 | WaveHeal | 7001 | 4/5 | 团队续航 |
| 攻击光环 | HeroAtk | 7002 | 4/5 | 团队输出强化 |
@@ -106,7 +106,7 @@
| 多段释放 | `num` | `overrides: { num: 2 }` |
### 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) | 暴击率→出血→被暴击率联动 |
| 冰冻控制 | `frz` + 冰冻(7003) | `frz` + 冰冻(7003)+ 减攻(7006) | 击晕光环(7003) | 冰冻→减攻→团队控制链 |

View File

@@ -98,13 +98,13 @@ interface HeroConfigFile {
| 不变量 | 依赖方 |
|---|---|
| 4 空格缩进、双引号、行尾无分号风格跟随原文件 | 全部 diff 工具 |
| 条目头字段单行紧凑(`uuid, name, path, fac, card_lv, lv, type, grow_type, role, hp, ap, def` 一行),触发块换行展开 | 现有阅读习惯 |
| 按 uuid 段位插入注释块(`// ===== card_lv=5(5401-5499)=====`) | 段位规则 |
| 条目头字段单行紧凑(`uuid, name, path, fac, rarity, lv, type, grow_type, role, hp, ap, def` 一行),触发块换行展开 | 现有阅读习惯 |
| 按 uuid 段位插入注释块(`// ===== rarity=5(5401-5499)=====`) | 段位规则 |
| **档位数组 lv 严格升序**(lv_entries / LvTriggerEntry[] / field / revive / ap_bonus / hp_bonus) | `HeroSkillDesc.ts:384` 的 `filter(e=>e.lv<=lv).pop()` |
| 数字键无引号、保持插入序 | Record 索引 |
| `ccd: 0` 占位字段不丢(HSkillInfo 必填) | Hero.ts 加载 |
| 字段顺序稳定(skills → atked/atking → dead → fstart → field → revive → info) | 减少 diff 噪音 |
| HeroList 按 card_lv 分组升序 | CardSet 卡池派生顺序 |
| HeroList 按 rarity 分组升序 | CardSet 卡池派生顺序 |
| `info: ""` 收尾、`path/icon/info` 字符串原样不转义变换 | 文本保真 |
| **文件头 BOM 原样保留**(读 utf-8 后首字符检测写回) | 避免整文件 diff |
@@ -163,8 +163,8 @@ interface HeroConfigFile {
| 规则 | 说明 |
|---|---|
| lv > 6 档位 | `HERO_MAX_LV=6` 封顶,lv7/9 档当前永不生效(数据先行,运行时扩展上限后自动生效) |
| card_lv 1/2/3 配了 field | 应改走 ap_bonus/hp_bonus(30/40/50% 补偿) |
| card_lv 4/5 的 lv9 未配 field | 按设计指引应有驻场光环 |
| rarity 1/2/3 配了 field | 应改走 ap_bonus/hp_bonus(30/40/50% 补偿) |
| rarity 4/5 的 lv9 未配 field | 按设计指引应有驻场光环 |
| infos 条数与实际档位不匹配 | 面板逐条展示依赖 |
## 六、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 基准+增量双输入(显示合计) │ 点击 │
│ ▾LV4 … │ ②技能: [普攻|大招] SkillPicker + 底座只读条 │ 定位 │
│ [+新建] │ + 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 联动锁定 |
| SkillPicker | 自制搜索下拉选 SkillSet,显示 `6200 火焰喷射 · 远程 · AOE` | SkillSet | 普攻限 6001~6012 按 IType 过滤;大招按形态过滤;辅助技能放行 |
| 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 |
| TriggerGroupEditor | s_uuid 卡片嵌套档位行(外层技能组、内层档位),保存时统一升序 | SkillSet | s_uuid 存在性 |
| 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 时禁用 | 校验器输出 | – |
### 6.3 关键交互
- **ui- 组件与 Vue 混用**:`isCustomElement` 已配置;ui- 元素 `v-model` 不生效,须 `:value` + `@change`/`@confirm` 手动双向;属性用 kebab-case
- **自制组件**(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 态
- **保存流程**:error>0 → 保存禁用(tooltip 显示错误数);仅 warning → 自制 modal 确认后执行保存流水线

View File

@@ -74,7 +74,7 @@ export class Hero extends ecs.Entity {
* 2) 初始化表现与属性数据
* 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
// 英雄等级上限以配置为准,合成可升到 HERO_MAX_LV
@@ -117,8 +117,8 @@ export class Hero extends ecs.Entity {
model.hero_uuid = uuid;
model.hero_name = hero.name;
model.lv = hero_lv;
model.card_lv = card_lv;
model.base_card_lv = hero.card_lv ?? 1;
model.rarity = rarity;
model.base_rarity = hero.rarity ?? 1;
model.type = hero.type;
model.grow_type = hero.grow_type;
model.role = hero.role;
@@ -144,7 +144,7 @@ export class Hero extends ecs.Entity {
// 基础属性:固定基础值 × 品质系数(相邻品质差 5%),成长由 grow_type 线性递增提供
// TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算
const qualityCoef = getHeroQualityCoef(hero.card_lv ?? 1);
const qualityCoef = getHeroQualityCoef(hero.rarity ?? 1);
let base_ap = Math.round(hero.ap * qualityCoef);
let base_hp = Math.round(hero.hp * qualityCoef);
let base_def = Math.round(hero.def * qualityCoef);

View File

@@ -428,7 +428,7 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
smc.mission.dead_heroes.push({
uuid: attrs.hero_uuid,
lv: attrs.lv,
card_lv: attrs.card_lv,
rarity: attrs.rarity,
posIndex: attrs.posIndex,
wave: Math.max(1, smc.vmdata?.mission_data?.level ?? 1),
});

View File

@@ -25,8 +25,8 @@ export class HeroAttrsComp extends ecs.Comp {
hero_uuid: number = 1001;
hero_name: string = "hero";
lv: number = 1;
card_lv: number = 1;
base_card_lv: number = 1;
rarity: number = 1;
base_rarity: number = 1;
type: number = 0; // 0近战 1远程 2辅助
fac: number = 0; // 0:hero 1:monster
grow_type?: number; // 成长类型(HGrowType),驱动每级 hp/ap 线性成长

View File

@@ -170,7 +170,7 @@ export class Monster extends ecs.Entity {
// 模型层参数:身份、阵营、基础数值(基础值按品质系数缩放,与英雄同一套设定)
model.hero_uuid = uuid;
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.ap = Math.round(hero.ap * coef);
// TODO: 局外升级机制落地后,此处基础值将与存档强化累加重算

View File

@@ -53,7 +53,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
heroView?: HeroViewComp,
triggerType?: string,
isCardSkill?: boolean,
card_lv?: number,
rarity?: number,
targetPos?: Vec3,
overrides?: any
}) {
@@ -61,7 +61,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
// 卡牌技能直接触发
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;
}
@@ -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];
if (!config) return;
config = mergeSkillParams(config, overrides);
@@ -102,7 +102,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
// 动态计算卡牌的虚拟攻击力:
// 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;
// 2. 获取场上最高攻击力的英雄,保证后期奶量/增益绝对够用
@@ -156,10 +156,10 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
const friendlyTargets = this.resolveFriendlyTargets(targetEids, FacSet.HERO);
mLogger.log(this.debugMode, "SCastSystem", "friendlyTargets count =", friendlyTargets.length);
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 {
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) {

View File

@@ -158,7 +158,7 @@ export class CHeroComp extends CCComp {
nodeUuid: this.node?.uuid,
uuid: data?.uuid ?? null,
name: data?.name ?? null,
card_lv: data?.card_lv ?? null,
rarity: data?.rarity ?? null,
cost: data?.cost ?? null,
nodeActiveBefore: this.node?.active
});
@@ -267,7 +267,7 @@ export class CHeroComp extends CCComp {
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();
// 描述富文本:展示英雄当前局外等级的能力(buildHeroSkillDesc 文本一)
@@ -301,13 +301,13 @@ export class CHeroComp extends CCComp {
}
/**
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
* 等级与颜色对应关系:
* card_lv 1 → green
* card_lv 2 → blue
* card_lv 3 → purple
* card_lv 4 → red
* card_lv 5 → yellow
* rarity 1 → green
* rarity 2 → blue
* rarity 3 → purple
* rarity 4 → red
* rarity 5 → yellow
*/
private updateBgNode() {
if (!this.bg_node || !this.cardData) return;
@@ -318,7 +318,7 @@ export class CHeroComp extends CCComp {
4: "red",
5: "yellow",
};
const targetColor = lvToColor[this.cardData.card_lv ?? 1];
const targetColor = lvToColor[this.cardData.rarity ?? 1];
this.bg_node.children.forEach(child => {
child.active = (child.name === targetColor);
});
@@ -542,7 +542,7 @@ export class CHeroComp extends CCComp {
reason: "",
uuid: 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);
if (guard.cancel) return;

View File

@@ -1,13 +1,13 @@
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;
@ccclass('CardBgComp')
export class CardBgComp extends Component {
apply(card_lv: number) {
const color = CARD_LV_BG_COLORS[Math.min(card_lv, 5) - 1];
apply(rarity: number) {
const color = RARITY_BG_COLORS[Math.min(rarity, 5) - 1];
this.node.children.forEach(c => c.active = c.name === color);
}

View File

@@ -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 { oops } from "db://oops-framework/core/Oops";
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 { GameEvent } from "../common/config/GameEvent";
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. 名称:英雄名。
* 3. 等级:局外成长等级(Lv.X),颜色按 getLvColor。
* 4. 图标:idle 动画首帧静态展示。
@@ -187,10 +187,10 @@ export class CardLiteComp extends CCComp {
this.iconVisualToken += 1;
if (this.opacityComp) this.opacityComp.opacity = 255;
// 背景:按 card_lv 切换颜色底框
// 背景:按 rarity 切换颜色底框
if (this.BG_node) {
const bgLv = Math.min(Math.max(hero.card_lv ?? 1, 1), 5);
const color = CARD_LV_BG_COLORS[bgLv - 1];
const bgLv = Math.min(Math.max(hero.rarity ?? 1, 1), 5);
const color = RARITY_BG_COLORS[bgLv - 1];
this.BG_node.children.forEach(child => child.active = (child.name === color));
}

View File

@@ -4,7 +4,7 @@
*
* 职责:
* 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。
@@ -16,7 +16,7 @@ import { _decorator, AnimationClip, Node, Sprite, resources, SpriteFrame } from
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
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;
@@ -55,9 +55,9 @@ export class ChipComp extends CCComp {
this.node.active = true;
this.iconVisualToken += 1;
// 背景:按 card_lv 切换颜色底框(green/blue/purple/yellow/red)
// 背景:按 rarity 切换颜色底框(green/blue/purple/yellow/red)
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));
}

View File

@@ -29,7 +29,7 @@ export class EBox extends ecs.Entity {
* 1) 创建节点并挂到 parent 下(未传时默认 SKILL 层)
* 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);
// 默认挂到实体显示层 SKILL 节点下
@@ -47,7 +47,7 @@ export class EBox extends ecs.Entity {
this.add(eboxComp);
// 初始化业务逻辑
eboxComp.init(uuid, card_lv);
eboxComp.init(uuid, rarity);
return node;
}

View File

@@ -82,7 +82,7 @@ export class EquipBoxComp extends CCComp {
/** 技能 UUID */
private s_uuid: number = 0;
/** 卡牌等级 */
private card_lv: number = 1;
private rarity: number = 1;
/** 是否为即时技能(true=使用后立即触发,false=战斗中定时触发) */
private is_instant: boolean = true;
/** 总触发次数 */
@@ -245,10 +245,10 @@ export class EquipBoxComp extends CCComp {
* 3. 按 trigger_type 注册对应事件监听并执行首次触发。
*
* @param uuid 卡牌 UUID
* @param card_lv 技能卡等级
* @param rarity 技能卡等级
*/
init(uuid: number, card_lv: number) {
this.card_lv = card_lv;
init(uuid: number, rarity: number) {
this.rarity = rarity;
// 装备卡配置已迁移至 EquipPoolList
const config = EquipPoolList.find(c => c.uuid === uuid);
@@ -381,9 +381,9 @@ export class EquipBoxComp extends CCComp {
/**
* 根据技能等级切换 bg_node 下的颜色子节点显示。
* 等级与颜色对应关系(技能卡 wave 档位):
* card_lv 1 (wave 1) → green
* card_lv 2 (wave 5) → blue
* card_lv 3 (wave 8) → purple
* rarity 1 (wave 1) → green
* rarity 2 (wave 5) → blue
* rarity 3 (wave 8) → purple
*/
private updateBgNode() {
if (!this.bg_node) return;
@@ -392,7 +392,7 @@ export class EquipBoxComp extends CCComp {
2: "blue",
3: "purple",
};
const targetColor = lvToColor[this.card_lv];
const targetColor = lvToColor[this.rarity];
this.bg_node.children.forEach(child => {
child.active = (child.name === targetColor);
});
@@ -625,7 +625,7 @@ export class EquipBoxComp extends CCComp {
oops.message.dispatchEvent(GameEvent.TriggerSkill, {
s_uuid: this.s_uuid,
isCardSkill: true, // 标记为卡牌技能(区别于英雄自身技能)
card_lv: this.card_lv,
rarity: this.rarity,
targetPos: targetPos,
overrides: this.overrides
});

View File

@@ -42,7 +42,7 @@ export class EquipListComp extends CCComp {
@property({ type: Node })
private icon_node: Node = null;
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 card_lv 激活) */
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 rarity 激活) */
@property({ type: Node })
private bg_node: Node = null;
@@ -148,11 +148,11 @@ export class EquipListComp extends CCComp {
// 等级标签(Lv.1 / Lv.2 / Lv.3)
if (this.level_label) {
const lv = this.cardData.card_lv ?? 1;
const lv = this.cardData.rarity ?? 1;
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();
// 属性词条富文本(多词条装备由 buildEquipRich 按 \n 多行渲染,数值实时高亮)
@@ -187,13 +187,13 @@ export class EquipListComp extends CCComp {
}
/**
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
* 等级与颜色对应关系:
* card_lv 1 → green
* card_lv 2 → blue
* card_lv 3 → purple
* card_lv 4 → red
* card_lv 5 → yellow
* rarity 1 → green
* rarity 2 → blue
* rarity 3 → purple
* rarity 4 → red
* rarity 5 → yellow
*/
private updateBgNode() {
if (!this.bg_node || !this.cardData) return;
@@ -204,7 +204,7 @@ export class EquipListComp extends CCComp {
4: "red",
5: "yellow",
};
const targetColor = lvToColor[this.cardData.card_lv ?? 1];
const targetColor = lvToColor[this.cardData.rarity ?? 1];
this.bg_node.children.forEach(child => {
child.active = (child.name === targetColor);
});

View File

@@ -512,8 +512,8 @@ export class HeroBoxComp extends CCComp {
const heroUuid = this.model.hero_uuid ?? 0;
const hero = HeroInfo[heroUuid];
// ---- 背景(按 card_lv 切换 bg_node 颜色子节点) ----
this.updateBgNode(hero?.card_lv ?? 1);
// ---- 背景(按 rarity 切换 bg_node 颜色子节点) ----
this.updateBgNode(hero?.rarity ?? 1);
// ---- 名称 ----
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
* card_lv 2 → blue
* card_lv 3 → purple
* card_lv 4 → red
* card_lv 5 → yellow
* @param cardLv 英雄卡牌等级(HeroInfo.card_lv,缺省按 1 处理)
* rarity 1 → green
* rarity 2 → blue
* rarity 3 → purple
* rarity 4 → red
* rarity 5 → yellow
* @param rarity 英雄卡牌等级(HeroInfo.rarity,缺省按 1 处理)
*/
private updateBgNode(cardLv: number) {
private updateBgNode(rarity: number) {
if (!this.bg_node || !this.bg_node.isValid) return;
const lvToColor: Record<number, string> = {
1: "green",
@@ -586,7 +586,7 @@ export class HeroBoxComp extends CCComp {
4: "red",
5: "yellow",
};
const targetColor = lvToColor[cardLv] ?? lvToColor[1];
const targetColor = lvToColor[rarity] ?? lvToColor[1];
this.bg_node.children.forEach(child => {
child.active = (child.name === targetColor);
});

View File

@@ -25,7 +25,7 @@ import { mLogger } from "../common/Logger";
import { HeroInfo, HeroList, SkillTriggerType, LvFieldEntry, LvReviveEntry, LvTriggerEntry, TriggerGrouped, getHeroDisplayStats } from "../common/config/heroSet";
import { buildHeroSkillDesc } from "../common/HeroSkillText";
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 { ChipComp } from "./ChipComp";
import { SmallTipComp } from "./SmallTipComp";
@@ -313,7 +313,7 @@ export class HerosListComp extends CCComp {
this.cards_node.removeAllChildren()
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) {
@@ -410,7 +410,7 @@ export class HerosListComp extends CCComp {
if (infoLabel) infoLabel.string = desc || hero.info || ""
}
this.updatePoolLvBg(hero.card_lv ?? 1)
this.updatePoolLvBg(hero.rarity ?? 1)
this.updateLvDisplay(uuid)
this.updateRoleDisplay(hero)
this.updateHeroAnimation(uuid)
@@ -418,10 +418,10 @@ export class HerosListComp extends CCComp {
this.updateSkillIcons(hero)
}
private updatePoolLvBg(card_lv: number) {
private updatePoolLvBg(rarity: number) {
if (!this.BG_node) return
// 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 => {
child.active = (child.name === color)
})

View File

@@ -44,7 +44,7 @@ export class ItemListComp extends CCComp {
@property({ type: Node })
private icon_node: Node = null;
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 card_lv 激活) */
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 rarity 激活) */
@property({ type: Node })
private bg_node: Node = null;
@@ -156,11 +156,11 @@ export class ItemListComp extends CCComp {
// 等级标签(★ 表示卡牌等级)
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) : "";
}
// 背景:按 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();
// 描述/属性词条富文本(装备逐词条多行;药品/技能卡数值随 overrides 档位自动同步)
@@ -201,13 +201,13 @@ export class ItemListComp extends CCComp {
}
/**
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
* 等级与颜色对应关系:
* card_lv 1 → green
* card_lv 2 → blue
* card_lv 3 → purple
* card_lv 4 → red
* card_lv 5 → yellow
* rarity 1 → green
* rarity 2 → blue
* rarity 3 → purple
* rarity 4 → red
* rarity 5 → yellow
*/
private updateBgNode() {
if (!this.bg_node || !this.cardData) return;
@@ -218,7 +218,7 @@ export class ItemListComp extends CCComp {
4: "red",
5: "yellow",
};
const targetColor = lvToColor[this.cardData.card_lv ?? 1];
const targetColor = lvToColor[this.cardData.rarity ?? 1];
this.bg_node.children.forEach(child => {
child.active = (child.name === targetColor);
});

View File

@@ -145,16 +145,16 @@ export class MissEquipComp extends CCComp {
}
/**
* 处理使用装备卡事件:提取 uuid 和 card_lv 后调用 addEquip。
* 处理使用装备卡事件:提取 uuid 和 rarity 后调用 addEquip。
* @param event 事件名
* @param args 卡牌数据(含 uuid、card_lv)
* @param args 卡牌数据(含 uuid、rarity)
*/
private onUseEquipCard(event: string, args: any) {
const payload = args ?? event;
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;
this.addSkill(uuid, card_lv);
this.addSkill(uuid, rarity);
}
start() {
@@ -168,9 +168,9 @@ export class MissEquipComp extends CCComp {
* 3. 获取或添加 EquipBoxComp 并初始化。
*
* @param uuid 装备 UUID
* @param card_lv 装备卡等级
* @param rarity 装备卡等级
*/
addSkill(uuid: number, card_lv: number) {
addSkill(uuid: number, rarity: number) {
if (!this.equip_box) {
mLogger.error(this.debugMode, "MissEquipComp", "equip_box prefab not set");
return;
@@ -190,7 +190,7 @@ export class MissEquipComp extends CCComp {
// 使用 ECS 实体创建装备节点,挂载到对应 ebar 子节点下
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].node = node;

View File

@@ -154,18 +154,18 @@ export class MissSkillsComp extends CCComp {
}
/**
* 处理使用技能卡事件:提取 uuid 和 card_lv 后调用 addSkill。
* 处理使用技能卡事件:提取 uuid 和 rarity 后调用 addSkill。
* @param event 事件名
* @param args 卡牌数据(含 uuid、card_lv)
* @param args 卡牌数据(含 uuid、rarity)
*/
private onUseSkillCard(event: string, args: any) {
const payload = args ?? event;
// 卡 uuid 仅用于查配置;真正施法用技能 id(payload.skill),缺省时退回 uuid(兼容技能卡直接用技能 id 的场景)
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;
// 药水/技能卡的 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 并初始化。
*
* @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) {
mLogger.error(this.debugMode, "MissSkillsComp", "skill_box prefab not set");
return;
@@ -234,7 +234,7 @@ export class MissSkillsComp extends CCComp {
// 使用 ECS 实体创建技能节点
let sbox = ecs.getEntity<SBox>(SBox);
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].node = node;

View File

@@ -2152,7 +2152,7 @@ export class MissionCardComp extends CCComp {
model.lv = nextLv;
// 同步 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_hp = Math.round(hero.hp * qualityCoef);
model.base_ap = base_ap;

View File

@@ -96,7 +96,7 @@ export class MissionHeroComp extends CCComp {
/** 是否正在消费召唤队列(防止并发) */
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
/** 预留英雄列表 */
@@ -160,12 +160,12 @@ export class MissionHeroComp extends CCComp {
/**
* 召唤请求入口:
* 从事件参数中提取 uuid / hero_lv / card_lv,放入串行队列。
* 从事件参数中提取 uuid / hero_lv / rarity,放入串行队列。
* 队列按职业优先级(坦克→战士→刺客→射手→法师→辅助,HRole 升序)排序,
* 保证高优先级职业先登场。
*
* @param event 事件名
* @param args { uuid, hero_lv, card_lv }
* @param args { uuid, hero_lv, rarity }
*/
private async call_hero(event: string, args: any) {
const payload = args ?? event;
@@ -174,10 +174,10 @@ export class MissionHeroComp extends CCComp {
// payload.hero_lv 保留作为下限兜底,防止外部显式指定更高等级
const outer_lv = smc.getHeroOuterLv(uuid);
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;
this.summon_queue.push({ uuid, hero_lv, card_lv, role });
this.summon_queue.push({ uuid, hero_lv, rarity, role });
// 按职业优先级稳定排序:HRole 升序,同职业保持入队先后
this.summon_queue.sort((a, b) => a.role - b.role);
this.processSummonQueue();
@@ -224,10 +224,10 @@ export class MissionHeroComp extends CCComp {
*
* @param uuid 英雄 UUID
* @param hero_lv 英雄等级
* @param card_lv 卡牌等级(驱动 bg_node 颜色)
* @param rarity 卡牌等级(驱动 bg_node 颜色)
* @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 scale = 1
const role = HeroInfo[uuid]?.role ?? HRole.Support;
@@ -241,7 +241,7 @@ export class MissionHeroComp extends CCComp {
const landingPos = slot.landingPos;
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);
@@ -289,7 +289,7 @@ export class MissionHeroComp extends CCComp {
while (this.summon_queue.length > 0) {
const payload = this.summon_queue.shift();
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) {
await new Promise<void>(resolve => setTimeout(resolve, MissionHeroComp.SUMMON_INTERVAL * 1000));

View File

@@ -30,7 +30,7 @@ export class SBox extends ecs.Entity {
* 1) 创建节点并挂到 SKILL 层
* 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 scene = smc.map.MapView.scene;
@@ -46,7 +46,7 @@ export class SBox extends ecs.Entity {
this.add(sboxComp);
// 初始化业务逻辑(透传药水卡 overrides,含 buff_value)
sboxComp.init(uuid, card_lv, overrides);
sboxComp.init(uuid, rarity, overrides);
return node;
}

View File

@@ -43,7 +43,7 @@ export class SCardComp extends CCComp {
@property({ type: Node })
private icon_node: Node = null;
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 card_lv 激活) */
/** 背景节点(含 green/blue/purple/red/yellow 颜色子节点,按 rarity 激活) */
@property({ type: Node })
private bg_node: Node = null;
@@ -189,11 +189,11 @@ export class SCardComp extends CCComp {
// 等级标签(★ 表示卡牌等级)
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) : "";
}
// 背景:按 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();
// 描述富文本(数值随 overrides 档位自动同步高亮)
@@ -228,13 +228,13 @@ export class SCardComp extends CCComp {
}
/**
* 根据 card_lv 切换 bg_node 下的颜色子节点显示。
* 根据 rarity 切换 bg_node 下的颜色子节点显示。
* 等级与颜色对应关系:
* card_lv 1 → green
* card_lv 2 → blue
* card_lv 3 → purple
* card_lv 4 → red
* card_lv 5 → yellow
* rarity 1 → green
* rarity 2 → blue
* rarity 3 → purple
* rarity 4 → red
* rarity 5 → yellow
*/
private updateBgNode() {
if (!this.bg_node || !this.cardData) return;
@@ -245,7 +245,7 @@ export class SCardComp extends CCComp {
4: "red",
5: "yellow",
};
const targetColor = lvToColor[this.cardData.card_lv ?? 1];
const targetColor = lvToColor[this.cardData.rarity ?? 1];
this.bg_node.children.forEach(child => {
child.active = (child.name === targetColor);
});

View File

@@ -46,7 +46,7 @@ export class SSkillBoxComp extends CCComp {
* 弹窗按槽位精确取档,避免自动定位命中错误分组 */
private hero_slot?: SkillTriggerType;
/** 卡牌等级 */
private card_lv: number = 1;
private rarity: number = 1;
/** 卡牌自定义图标ID(优先级最高,未定义则按 trigger_type 自动取) */
private card_icon?: string;
/** 技能名称(装备卡取卡牌名,英雄图鉴取技能名) */
@@ -75,7 +75,7 @@ export class SSkillBoxComp extends CCComp {
oops.audio.playEffect("music/button");
oops.gui.open(UIID.SInfo, {
uuid: this.s_uuid,
skill_lv: this.card_lv,
skill_lv: this.rarity,
card_icon: this.card_icon,
skill_name: this.resolveSkillName(),
field: this.field,
@@ -112,7 +112,7 @@ export class SSkillBoxComp extends CCComp {
this.s_uuid = s_uuid;
this.hero_uuid = heroUuid;
this.hero_slot = slot;
this.card_lv = s_lv;
this.rarity = s_lv;
this.hero_icon_source = isField ? "field" : "skill";
this.updateUI();
this.setLocked(locked);
@@ -244,7 +244,7 @@ export class SSkillBoxComp extends CCComp {
// 显示技能等级(Lv.x 样式)
if (this.lv_label) {
this.lv_label.string = `Lv.${this.card_lv}`;
this.lv_label.string = `Lv.${this.rarity}`;
}
}

View File

@@ -82,7 +82,7 @@ export class SkillBoxComp extends CCComp {
/** 技能 UUID */
private s_uuid: number = 0;
/** 卡牌等级 */
private card_lv: number = 1;
private rarity: number = 1;
/** 是否为即时技能(true=使用后立即触发,false=战斗中定时触发) */
private is_instant: boolean = true;
/** 总触发次数 */
@@ -218,7 +218,7 @@ export class SkillBoxComp extends CCComp {
});
ibox?.init({
skillUuid,
skillLv: this.card_lv,
skillLv: this.rarity,
overrides: this.overrides,
});
mLogger.log(this.debugMode, "SkillBoxComp", "ibox init done", {
@@ -241,10 +241,10 @@ export class SkillBoxComp extends CCComp {
* 3. 按 trigger_type 注册对应事件监听并执行首次触发。
*
* @param uuid 卡牌 UUID
* @param card_lv 技能卡等级
* @param rarity 技能卡等级
*/
init(uuid: number, card_lv: number, overrides?: SkillOverrides) {
this.card_lv = card_lv;
init(uuid: number, rarity: number, overrides?: SkillOverrides) {
this.rarity = rarity;
// 查询触发配置(药水卡不在 SkillCardList,会走 else 分支)
// 同时按 卡uuid 或 技能skill id 查找:MissSkillsComp.addSkill 传入的是 payload.skill(技能ID),
@@ -388,9 +388,9 @@ export class SkillBoxComp extends CCComp {
/**
* 根据技能等级切换 bg_node 下的颜色子节点显示。
* 等级与颜色对应关系(技能卡 wave 档位):
* card_lv 1 (wave 1) → green
* card_lv 2 (wave 5) → blue
* card_lv 3 (wave 8) → purple
* rarity 1 (wave 1) → green
* rarity 2 (wave 5) → blue
* rarity 3 (wave 8) → purple
*/
private updateBgNode() {
if (!this.bg_node) return;
@@ -399,7 +399,7 @@ export class SkillBoxComp extends CCComp {
2: "blue",
3: "purple",
};
const targetColor = lvToColor[this.card_lv];
const targetColor = lvToColor[this.rarity];
this.bg_node.children.forEach(child => {
child.active = (child.name === targetColor);
});
@@ -631,7 +631,7 @@ export class SkillBoxComp extends CCComp {
oops.message.dispatchEvent(GameEvent.TriggerSkill, {
s_uuid: this.s_uuid,
isCardSkill: true, // 标记为卡牌技能(区别于英雄自身技能)
card_lv: this.card_lv,
rarity: this.rarity,
targetPos: targetPos,
overrides: this.overrides
});