英雄召唤、局内进化与大招偏向
本页于 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 | 效果(多态子类) | 含义 |
|---|---|---|
| 1 | SummonHero | 召唤占位,无字段。由召唤动作本身达成 |
| 2 | GetSkill { SkillID } | 获得大招:把 SkillID 写成英雄运行时大招 |
| 3 | GetAttr { AttrID } | 获得词条:按 AttrID 授予 Perk |
| 4 | OverloadReplaceSkill { SkillIDA, DescB, SkillIDB } | 超载替换大招:弹面板二选一 |
| 5~9 | GetAttr { 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. 实现落点
| 环节 | 位置 |
|---|---|
| 效果等级解析 / 取行 / 收集进化技能 Id | TbBattleEvolutionEffectEX(Definitions/DataTableEX) |
| 效果应用(词条 / 大招) | HeroEvolutionEffectApplier(Gameplay/GameModes/Common/Service) |
| 进化入口 / 分支面板 / 快照读写 | LevelCardSelectService |
| 出卡与释放许可 | HeroCardOfferRule、LevelCardSelectService.TryReleaseHeroCard、ComCardPool.AutoRelease.CanAutoReleaseHeroCard |
3.1 效果应用(HeroEvolutionEffectApplier)
| 效果 | 落点 |
|---|---|
SummonHero | 无操作(召唤已在 TrySummonHeroOnce 完成并记为 1 级) |
GetAttr | CharacterFacade.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 并派发 EvtLevelGameStart | LevelBattleState |
所以在槽位绑定的那一刻,TryGetActive() 可能还是上一关或 null、CardSelectService 可能还没创建。
结论:等级与大招门禁的取值必须
- 用
ComHeroSpellItem.ResolveLevelForHeroQuery()(优先当前关卡、取不到服务再退到"即将进入"的关卡; 只看任一个都会漏 —— 预加载下一关时NextScene可能是个还没跑出服务的控制器); - 拿不到就挂起 + 补刷(
Update每帧一次、槽位重新可见时一次),而不是把这一次绑定当成最终结果; - 在
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,三处校验点同步更新。 |
| 不重置大招 CD | ReplaceHeroExSkill 原值传回 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。旧合成/能量/爆气路线已被替代。