Skip to main content

英雄召唤、局内进化与大招偏向

本页于 2026-10-15 整合现有功能稿、飞书内容及客户端 origin/develop@7f0636c9 的功能资料。原 draft/unknown 不因整理自动变为批准;设计规则、源配置与运行结果分别说明。本次只做文档及源码审阅,没有执行游戏功能测试。

入口与当前规则​

主线/材料关每波选卡后,专属卡先进入手牌;未上场显示“召唤”,已上场显示“进化”。拖到战场任意合法位置即可使用,英雄按可用坑位顺序出现,最多5名。召唤时提示下一空坑,进化时目标高亮、其他英雄灰化;松开打出或取消后移除预览。自动战斗也须经过入手牌过程。

主线默认每波5选3;第1波专属池,后续按玩法规则取候选。元素卡同轮不重复的D3规则与早期文档“所有卡可重复”不同:当前具体随机消费点尚需与设计统一,不把早期混合池重复规则宣布为新12卡规则。手牌空位不足则只能选可容纳数量并灰化其余;满手可直接确定跳过,点候选提示“手牌已满,请拖动手牌丢弃”。空位足够却选不足时二次确认“卡牌选择数量未满,是否放弃选牌?”。

Lv.1召唤、Lv.2解锁大招、Lv.4一次选择中性大招的集火/清场偏向。大招纯CD,不消耗元素球;三态分配预算,取消随机超载成功/失败。蓝紫无被动栏,金红Lv.3固定被动;红品Lv.3首次普攻强化、Lv.5完整普攻、Lv.6+只普攻威力+10%。基础英雄和红品的具体阶段按各英雄页,不用旧统一Lv.5–8逐步机制表覆盖新版模板。

配置与当前实现​

专属卡驱动的战斗内英雄成长:英雄不在场时用卡召唤,在场时用卡进化一级,按等级获得对应加成。 与局外英雄等级里程碑(hero_level_attr)无关,两者只是共享同一套 Perk ID 空间。


1. 配置​

battle_evolution_effect.csv → TbBattleEvolutionEffectconfig:ID / HeroID / Level / BattleHeroLevelAttrTypeData(多态,含 Desc)。

客户端进化说明所用的旧8英雄模板为每英雄9个效果等级(72行);这不是当前完整英雄配置的行数声明。实际最大效果等级逐英雄按当前表解析,红品入口已扩至12名英雄。旧模板的多态语义如下:

Level效果(多态子类)含义
1SummonHero召唤占位,无字段。由召唤动作本身达成
2GetSkill { SkillID }获得大招:把 SkillID 写成英雄运行时大招
3GetAttr { AttrID }获得词条:按 AttrID 授予 Perk
4OverloadReplaceSkill { SkillIDA, DescB, SkillIDB }超载替换大招:弹面板二选一
5~9GetAttr { AttrID }获得词条(同一 AttrID 可跨级重复,用于叠加)

AttrID 是 PerkId,与 battle_effect_select.csv(三选一池)、Perk_{id}.asset 同一 ID 空间。 已核对的 ID:20102 / 40101 / 40102 / 40103 / 40104,对应 Perk_*.asset 均已存在。

等级语义与技能组的对应关系:HeroSkillSetAsset 的 UltimateUnlockLevel = 2、OverloadChoiceLevel = 4 与上表的 L2 / L4 完全一致 —— 进化表是「新技能组」机制出现之前的旧表等价物,两者共用同一套等级编号。


2. 核心语义:进化无上限,效果钳到配置最后一级​

进化等级(无上限) 1 2 3 4 5 6 7 8 9 10 11 12 ...
↓ 效果等级(钳到 MaxConfiguredLevel = 9)
实际施加的效果等级 1 2 3 4 5 6 7 8 9 9 9 9 ...
  • 进化次数不设上限:专属卡在英雄已上场时始终可用(HeroCardOfferRule 不再有「满级不出进化卡」的规则)。
  • 效果等级钳到配置最后一级,由 TbBattleEvolutionEffectEX.ResolveEffectLevel(heroId, evolutionLevel) 统一解析; 配置有空洞时向下回退到最近的有配置等级,该英雄完全无配置时返回 0。
  • 叠加落在词条上:L9 之后的每次进化都再施加一次 L9 的 GetAttr 词条,而 SkillFacade.AddPerkToActor 对同一词条是叠加语义(每次授予 Stacks + 1,封顶由 PerkDefinition.SkillConfigurationMaxStacks 决定,0 = 不限层)。因此「一直叠加最后一级的加成」成立。

MaxConfiguredLevel = 9 是效果等级上限,不是进化次数上限;它是配置的安全边界, 真实上限由 ResolveEffectLevel 按表回退推导,配置加级不需要改代码。


3. 实现落点​

环节位置
效果等级解析 / 取行 / 收集进化技能 IdTbBattleEvolutionEffectEX(Definitions/DataTableEX)
效果应用(词条 / 大招)HeroEvolutionEffectApplier(Gameplay/GameModes/Common/Service)
进化入口 / 分支面板 / 快照读写LevelCardSelectService
出卡与释放许可HeroCardOfferRule、LevelCardSelectService.TryReleaseHeroCard、ComCardPool.AutoRelease.CanAutoReleaseHeroCard

3.1 效果应用(HeroEvolutionEffectApplier)​

效果落点
SummonHero无操作(召唤已在 TrySummonHeroOnce 完成并记为 1 级)
GetAttrCharacterFacade.ApplyPerkToActor —— 必须走它,内部有 TryGetPerkDefinition + LoadPerkConfigSync 兜底;直调 SkillFacade.AddPerkToActor 在未注册时会静默失败
GetSkill校验技能已注册(未注册则 LoadSkillConfigSync 兜底),再写实体 heroExSkill.superSkillId
OverloadReplaceSkill由 ChooseEvolutionSkillBranchesAsync 弹面板二选一后走 TryChooseOverloadSkill

新旧英雄分叉:绑定 HeroSkillSetAsset 的英雄(TryGetHeroNormalSkillId 为 true),其大招解锁与形态 由技能核心按 UltimateUnlockLevel / OverloadChoiceLevel 驱动,GetSkill 不覆盖实体大招, 避免绕开 ChooseHeroOverload 的一次性形态选择;未绑定的旧表英雄才直接替换。

等级变化统一入口:ApplyEvolutionLevelEffect(heroId, level) 由召唤(1 级)与进化(2 级起)共用 —— battle_evolution_effect 是「等级 → 效果」的表,任何等级变化的来源都应施加对应行。 区别只在「是否算进化过」:_evolvedHeroIds 只由 TryEvolveHeroOnce 标记,召唤只给 1 级基线。

调用顺序:TryEvolveHeroOnce 里必须先 SyncHeroSkillProgression(把技能核心的 BattleLevel 推到新等级)再 ApplyEvolutionLevelEffect。顺序反了,形态门槛会在「刚好达到等级」时被拒绝。

大招同步:SyncHeroSkillProgression 除了普攻,还会调 SkillFacade.TryGetHeroUltimateSkillId 把实体的 superSkillId 写成技能组当前形态 (已选形态优先,否则中立大招)。这是技能组英雄唯一的大招写入口 —— 在此之前没有任何地方 按技能组同步过大招,只能依赖 hero.csv 的初始值。旧表英雄该查询返回 false,实体大招不受影响。

3.3 大招解锁门槛(配置驱动)​

LevelCardSelectService.HasUnlockedHeroUltimate(heroId):

  • 已绑定技能组的英雄 → 交给技能核心(TryGetHeroUltimateSkillId 未到 UltimateUnlockLevel 时返回 false);
  • 旧表英雄 → 进化等级 >= GetUltimateUnlockLevel(heroId),该英雄没有配置「获得大招」时永不满足。

原先是硬编码的「至少进化过一次」,与「大招由配置解锁」是两套口径 —— 若某英雄的 L2 改成 GetAttr,旧门槛会先放开但大招没解锁,玩家点了只看到「配置缺失」。 改后门槛与大招来源同源。解锁等级按英雄缓存在 _heroUltimateUnlockLevelByHeroId(Shutdown 清理)。

3.2 新旧英雄分叉(当前实际走哪条)​

判据是英雄普攻技能资产是否绑定HeroSkillSet。当前配置已经包含红品9–12、普攻10900–11200及各自技能组,技能组分支已具备接线;旧“只有阿斯特拉且尚无hero.csv入口、分支休眠”判断失效。基础8英雄仍使用进化表的效果应用路径,不能由红品接线推断其独立完整新版技能也已实现。

两条路径的大招来源与门槛:

大招来源解锁门槛
旧表英雄battle_evolution_effect 的「获得大招」行写到实体 superSkillId进化等级 ≥ 该英雄第一个「获得大招」的等级(TbBattleEvolutionEffectEX.GetUltimateUnlockLevel)
技能组英雄技能核心按 HeroSkillSetAsset 决定(SkillFacade.TryGetHeroUltimateSkillId:已选形态优先,否则中立大招)HeroSkillSetAsset.UltimateUnlockLevel

两者都由 LevelCardSelectService.HasUnlockedHeroUltimate(heroId) 统一暴露, 大招释放的三处校验(SkillCasting、ComHeroSpellItem、ComAutoFightLogic.Execution)都调它。

⚠️ 英雄没有默认大招。hero.csv 的 Skill_super_group 不再是有效来源:

  • 英雄 2/6/7/8 该字段本来就为空,L2「获得大招」是唯一解锁点;
  • 英雄 1/3/4/5 仍留着 10107 / 10302 / 10402 / 10510 —— 这些值永远无法被释放 (门槛要求等级 ≥ 2,而升到 2 级时 L2 已把大招换成 10102 / 10301 / 10401 / 10502), 属 §8.2「删除原普通大招字段」未清理干净的残留,应在配置仓库清空。

3.4 预载​

进化给的技能与词条原本都不在资源预载清单里,已补:

  • 技能:TbHeroSkillEX.GetHeroSkillIds 追加 TbBattleEvolutionEffectEX.AddEvolutionSkillIds, 于是进关预载(BattleResourcePreloader)与创角同步加载(CharacterFacade)都会带上进化大招 (如 10102 / 10106)—— 它们不在 hero.csv 的 Skill_normal / Skill_super_group 里。
  • 词条:进化词条都在 battle_effect_select 池内,BuffSelectService.StartPreloadPoolPerkConfigs() 开局已逐个 LoadPerkConfigSync,无需额外处理。
  • 运行时仍保留一层同步兜底(ApplySuperSkill 里的 LoadSkillConfigSync),覆盖配置改动 / 中途召唤等漏预载场景。

3.3 断线读档​

快照 v8 起 HeroEvolutionLevels[] 记录 SuperSkillId。原因:大招是「进化等级 + 玩家超载分支选择」 共同派生的结果,只恢复等级无法还原玩家选了哪一条,重连后大招会退回 hero.csv 初始值。

恢复顺序(LevelCardSelectService.RestoreFromSnapshot):先 SyncHeroSkillProgression 推等级, 再 HeroEvolutionEffectApplier.TryChooseOverloadSkill 还原大招 —— 对已绑定技能组的英雄, 这一步同时补记技能核心里丢失的 ChosenOverloadSkillId。

⚠️ 只还原大招,不重放 GetAttr。进化词条已随 ActivePerkIds 由 BattleSnapshotWorldApplier.RestoreActorPerks 回填,再放一遍会叠成双份。

3.5 等级展示(卡面 / 场上技能入口)​

等级只在两个只读查询里算,界面一律取结果、不自己推(否则会出现「显示 LV.3、释放只到 LV.2」的脱钩):

查询含义消费点
LevelCardSelectService.GetHeroBattleEvolutionLevel(heroId)英雄当前等级:召唤与预上阵是 1 级基线,每进化一次 +1;不在场返回 0场上英雄技能入口 ComHeroSpellItem(imgLevelBG + textLevel,常显、不受大招状态与冷却影响)
LevelCardSelectService.GetHeroNextEvolutionLevel(heroId)进化卡卡面的下一级 = 当前等级 + 1;不在场返回 0手牌英雄卡 ComCardHeroItem、选卡界面英雄卡项 ComCardSelectHeroItem
  • 召唤 / 进化卡的辨识同源于 LevelCardSelectService.IsHeroOnField:不在场 = 召唤卡(显示 imgNew), 已在场 = 进化卡(显示 imgLevelBG + LV.{下一级})。手牌里同英雄的多张进化卡显示同一个等级。
  • 卡面描述文本按「这一级给什么」取(HeroExclusiveCardText.ResolveByEvolutionLevel,消费点只有选卡界面 ComCardSelectHeroItem —— 手牌英雄卡本来就没有描述位,长按说明仍按召唤 / 进化文案): 目标等级配了「获得大招」→ card_hero_new_skill(新技能,当前配置为 1→2 级);配了「进化分支」→ card_hero_evolve(进化,当前配置为 3→4 级);其余等级(2→3、5 级起只有「获得词条」)与召唤卡 (不在场,目标等级 0)不显示任何文本。判据取进化表的实际效果类型,不硬编码 2 / 4 级 —— 配置改级时 文案自动跟着走;解析为空时连文本节点一起收起(预制体节点默认激活且可能带默认字)。
  • 两类卡面已去掉的字段(2026-10-15 需求):元素卡(手牌 ComCardItem、选卡界面 ComCardSelectSkillItem) 不再显示等级文本 —— 等级仍参与卡面图(GetCardImageAsset)与品质卡框动画,只是不再以文字呈现; 英雄卡(手牌 ComCardHeroItem、选卡界面 ComCardSelectHeroItem)不再显示英雄名,靠英雄大图 + 元素图标辨认。 两处都必须在卡面刷新时显式 SetActive(false):卡是池化/复用对象,只停止赋值会残留上一张的字, 预制体节点默认激活也会把默认字直接露出来。
  • ComHeroSpellItem 挂在每个场上英雄的槽位上,由 ComHeroSpellSkillHandler 绑定英雄时 SetData 刷一次, 并在 EvtHeroEvolutionPerformed 后再刷一次;等级节点不在 HeroSpellTypeConfig 的 Show/Hide 列表里,故状态切换不会把它隐藏。
  • 升级时等级文本做一次「放大 → 压小 → 归位」的抖动缩放(ComHeroSpellItem.PlayEvolutionLevelPunch, 峰值/时长可在 Inspector 配)。DOTween 走 SetUpdate(true)(战斗暂停不冻结反馈)、SetTarget + OnKill 归位; 禁用 / 销毁 / 换绑英雄 / 重复升级前统一由 StopEvolutionLevelPunch 杀掉并还原缩放 —— 槽位会被不同英雄复用,DOScale 写到一半被打断若不归位,形变会被下一个英雄继承。

⚠ 进关阶段的时序窗口(等级 / 大招提示都栽在这里)​

战斗 HUD(含技能栏槽位)在关卡 OnPrepareEnter 阶段就打开,而:

事实位置
GameSceneService 要等 OnPrepareEnter() 返回后,才把 CurScene 切到本关控制器GameSceneService.PrepareEnterNextScene
EcsGameController.OnEnter 先 base.OnEnter()(启动关卡 FSM → LevelBattleInitState 创建预上阵英雄并广播 roster 事件 → 槽位绑定),再 OnInitialServices()(这里才 new LevelCardSelectService)EcsGameController.OnEnter / LevelBattleControllerBase.Lifecycle
战斗真正开始 = LevelBattleState.OnEnter:置 IsLevelBattleStarted 并派发 EvtLevelGameStartLevelBattleState

所以在槽位绑定的那一刻,TryGetActive() 可能还是上一关或 null、CardSelectService 可能还没创建。 结论:等级与大招门禁的取值必须

  1. 用 ComHeroSpellItem.ResolveLevelForHeroQuery()(优先当前关卡、取不到服务再退到"即将进入"的关卡; 只看任一个都会漏 —— 预加载下一关时 NextScene 可能是个还没跑出服务的控制器);
  2. 拿不到就挂起 + 补刷(Update 每帧一次、槽位重新可见时一次),而不是把这一次绑定当成最终结果;
  3. 在 EvtLevelGameStart 再整体对齐一次(服务此时必定就绪)—— 断线读档恢复的等级也靠它补上。

3.6 大招提示区(首次提示 / 技能定位动效)​

大招可释放(HeroSpellType.Ready)时显示按钮区与提示区(ShowInfo / TipsInfo 两块容器的显隐由代码按状态决定, 见 ComHeroSpellItem.RefreshSpellContentVisibility;原先按状态配 Show/Hide 节点列表的 HeroSpellTypeConfig 已删除 —— 那两张表恒等于"Ready 显示、其余隐藏",用代码表达省掉逐状态维护,也堵住了 None 状态下预制体默认值漏出来的问题)。 组内二选一,唯一裁决点是 ComHeroSpellItem.RefreshSpellTipsVisual(visible):

条件显示
大招门禁未解锁(现版本至少要进化过一次)什么都不显示(提示与定位动效都收起,避免引导玩家点会被拦下的按钮)
门禁已解锁 + 本机从未释放过该英雄大招首次大招提示节点 _firstUltimateHint(clickme)
门禁已解锁 + 释放过技能定位动效 _skillPurposeSpine,统一播 AOE
冷却中(visible = false)两者都不显示,只留冷却倒计时
  • 技能定位动效不再区分单体 / 群体:单体 / 群体曾按 hero 表定位列(Skill_Purpose_10101 / Skill_Purpose_10201) 映射到 AOE / Single 两个动作;该列随玩法调整移除、TbHeroConfigEX.GetHeroSkillPurpose 恒返回空, 于是动效从来没播出来过。现在直接播 AOE(Ui_06bq04 里 Single 动作仍在,只是不参与选择), 那条映射链(key 常量 / ResolveSkillPurposeAnimationName / BindSkillPurposeAnimation)已删除。
  • 「是否释放过」记在 HeroUltimateReleaseRecord(PlayerPrefs,按账号隔离;Key 沿用历史的 HeroUltimatePromptedIds_a{accountId},不换 Key 以免老账号记录丢失)。写入只有 LevelBattleControllerBase.OnEvtHeroUltimateRequest 里"确认释放成功"一处 —— 手动点击与自动战斗共用该入口; 读取侧(UI)只读。之前记账写在 UI 的点击回调里,自动战斗放掉的大招不记账, 玩家会一直看到"点我"首次提示。
  • 判定每次刷新现算,不用"当前是否正在显示提示"这类状态位缓存;原实现把它挂在 「NotProfile → Ready 那一次迁移」上,而绑定时大招通常已经是 Ready(大招默认解锁、按钮常显), 第一次进化走的是 Ready → Ready,条件永远不成立 —— 只有绑定瞬间 superSkillId 还是 0 的英雄才碰巧弹得出来 (表现就是"时有时无",清 PlayerPrefs 也没用,因为不是缓存问题)。

3.7 「超载」命名 ≠ 进化分支(别按名字删)​

结论:配置里叫「超载替换大招」的 OverloadReplaceSkill,实际玩法就是「进化到该等级时二选一分支」,是在用功能。 真正的"超载"是几个月前的另一个概念(元素能量攒够才能选强化大招),那个已经不存在,只剩命名与少量死字段。 ⚠️ 不要因为名字里有"超载"就删这条链(PanelHeroFeatureChoose / TryGetOverloadReplaceBranches / ChooseEvolutionSkillBranchesAsync)。

项状态
battle_evolution_effect 的 OverloadReplaceSkill 行(英雄 1~12 的局内 4 级,SkillIDA / SkillIDB 两条分支)在用:SkillIDA 是该英雄的中性大招(2 级「获得大招」行也在用,不要删),SkillIDB 是分支形态
二选一面板 PanelHeroFeatureChoose(PanelHeroFeatureChooseLogic + ComHeroFeatureChooseItem + PanelHeroFeatureChoose.prefab + UI 注册表条目)在用:LevelCardSelectService.TryEvolveHeroOnce → ChooseEvolutionSkillBranchesAsync 弹出让玩家 2 选 1
技能核心的一次性形态选择(HeroSkillSetAsset.OverloadChoiceLevel → ChooseHeroOverload → ChosenOverloadSkillId)在用:技能组英雄的选择结果记在核心,宿主经 HeroEvolutionEffectApplier.TryChooseOverloadSkill 落到核心/实体
老的"需要元素能量才能选超载分支"已不存在:客户端大招路径没有任何能量门禁(OnEvtHeroUltimateRequest 只校验共享 CD + 大招门禁),只剩过期注释(已清理)
宿主字段 HeroExSkill.overloadSkillId已删除(它从未写入非 0):手写组件 HeroExSkillComponent 去掉字段、Entitas 生成物 GameHeroExSkillComponent.cs 的 Add/ReplaceHeroExSkill 同步去掉参数(生成物与组件源一致,下次跑 Entitas 生成器结果相同),全部调用点改 4 参数;消费侧死分支(EvtShowLevelTips 的 isOverloadSkill、AIFSMController._heroSkillIds[2]、ActorSkillEventApplySystem.IsHeroActiveSkill 第二项)一并清掉
局外等级词条 OverloadUnlock(hero_level_attr)表里没有该类型的行(只有"初始获得词条"),CharacterFacade 的 case 不可达,只保留占位与说明

命名建议(属配置/策划决定):若这条链以后就叫"进化分支",可把配置类型 OverloadReplaceSkill 改名为 EvolutionBranch 之类,客户端相应方法(TryGetOverloadReplaceBranches / TryChooseOverloadSkill)同步改名; 现在保持旧名只是历史包袱,不影响功能。


4. 已知边界​

项说明
⚠️ 技能组英雄的初始大招来源hero.csv.Skill_super_group 不再是有效来源(英雄没有默认大招)。Astra 进表时需要保证:她的 Skill_super_group 留空,且 L2 之前不放行大招 —— 门槛已由 HasUnlockedHeroUltimate 按技能核心的 UltimateUnlockLevel 判定,无需额外配置。
✅ 技能组英雄的 superSkillId 同步已在 SyncHeroSkillProgression 补上:调 SkillFacade.TryGetHeroUltimateSkillId 写实体大招(已选形态优先,否则中立大招)。
✅ 「已进化」硬编码门槛已改为配置驱动的 HasUnlockedHeroUltimate,三处校验点同步更新。
不重置大招 CDReplaceHeroExSkill 原值传回 sharedCooldownSeconds,进化后大招不会立即就绪。策划若要「进化立即能用」,需显式置 0(策划案 §4.3 标注「暂不处理」)。
overloadSkillId 是死字段HeroExSkill.overloadSkillId 全项目从未写入非 0;EvtShowLevelTips 里 skillId == overloadSkillId 的分支永不命中(skillId == superSkillId 正常命中,所以功能不受影响)。属历史残留 —— 注意技能核心里的 ChosenOverloadSkillId 是另一回事、仍在用(见 §3.7)。
进化词条不进 TbAttrShowconfig进化 Perk(20102 / 40101~40104)只在 battle_effect_select.csv 里有名字与描述,不在 attr_show.csv。它们也不走 PreMatchPerkGrantRegistry(属战斗内 actor 词条),因此不出现在局外主角属性面板 —— 展示走三选一/进化 UI 自己的文案。
自动战斗行为进化不再封顶后,自动释放会把英雄卡持续投给场上英雄(召唤仍优先)。这是「一直叠加」的直接推论,如与预期不符需回退 CanAutoReleaseHeroCard 与出卡过滤。

5. 契约测试​

Gameplay/GameModes/Common/Tests/HeroEvolutionContractTests.cs(归属 WJGame.GameTest)覆盖 不依赖导表资源的纯规则(EditMode 下 DataTableEntry 未加载,见 GiftPackModelStageTests 的同款说明):

用例锁住的约定
ResolveEffectLevel_ClampsToLastConfiguredLevelBeyondCap策划案 §8.1:9 级后每次升级取第 9 级效果 —— 第 10 次、第 999 次进化都必须钳到最后一级
ResolveEffectLevel_FallsBackOverConfigGaps配置有空洞时向下回退到最近的有配置等级
ResolveEffectLevel_ReturnsZeroWhenNothingConfigured无配置 / 非法等级返回 0(调用方据此不施加任何效果)
ResolveEffectLevel_UsesConfiguredCapInsteadOfHardcodedOne上限不是硬编码:配置加级不需要改代码

为了能在无导表环境断言,ResolveEffectLevel 额外提供了一个把「该等级是否已配置」外提为 Func<int,bool> 的重载;带 heroId 的版本只是它的表查询包装。


附:关键文件​

主题文件
配置生成类Generated/DataTable/TbBattleEvolutionEffectconfig.cs、BattleHeroLevelAttrType.cs、{SummonHero,GetAttr,GetSkill,OverloadReplaceSkill}.cs
读表 / 等级解析Definitions/DataTableEX/TbBattleEvolutionEffectEX.cs
效果应用Gameplay/GameModes/Common/Service/HeroEvolutionEffectApplier.cs
进化入口 / 分支 / 快照Gameplay/GameModes/Common/Service/LevelCardSelectService.cs
出卡规则Gameplay/GameModes/Common/Service/HeroCardOfferRule.cs
英雄技能集合(预载)Definitions/DataTableEX/TbHeroSkillEX.cs、Gameplay/GameModes/Common/BattleResourcePreloader.cs
技能组资产SkillCore/Runtime/Core/Config/HeroSkillSetAsset.cs、SkillCore/Runtime/Core/Orchestration/SkillRuntime.HeroSkills.cs
事件与表现Gameplay/GameModes/Common/Events/EvtHeroEvolutionPerformed.cs、Gameplay/GameModes/Common/UI/ComHeroSpellItem.cs
快照Gameplay/Features/BattleSnapshot/BattleSnapshot{Models,BinaryCodec,WorldApplier}.cs

差异与边界​

旧稿“只有阿斯特拉具备入口”已被2026-10-15源配置审计推翻:红品9–12全部有专属卡109–112和大招组。OverloadReplaceSkill仍是Lv.4偏向的当前配置类型名,不能因英文旧名称就删掉这条有效行为。大招首次引导以每账号实际成功释放为记忆点,手动和自动都算;之后使用通用范围提示。

来源​

旧combat-skill、飞书NJP3dDMC6oZ0hdxKmXacVHZPncd与D3/新版英雄速查;客户端Docs/局内英雄进化.md、RoguelikeUpgrade/README.md、SkillEnergy/SKILL_CARD_MODULE.md。旧合成/能量/爆气路线已被替代。