using System.Collections.Generic; using UnityEngine; // SkillBase(SubSkill 部分):前置内嵌子技能的收集与投递。 // // 规则: // 从 packList 头部连续收集"纯静默前置子技能"(没有动作、非死亡复活、不触发死亡) // 直到遇到任何一个"需要等待"的包(带动作/SkillType==8/HB422)就停止。 // 已收集的前置子技能按 packUID 排序后投递到 ownRecordAction.innerRecordPlayer。 // // 子技能递归判断: // 当遇到 CustomHB426CombinePack 时,使用 combinePack.NeedWaiting() 判断, // NeedWaiting 内部会递归检查嵌套的 CustomHB426CombinePack, // 因此"子技能里面的子技能"也会被正确判断。 public partial class SkillBase { protected void ProcessSubSkill() { // 按packUID排序所有子技能 var allSubSkills = new List<(ulong packUID, SkillRecordAction action)>(); List removePackList = new List(); foreach (var pack in packList) { if (pack is HB427_tagSCUseSkill skillPack) { SkillConfig ssc = SkillConfig.Get((int)skillPack.SkillID); SkillSkinConfig sscSkin = ssc.GetOriginSkinConfig(); if (!string.IsNullOrEmpty(sscSkin.SkillMotionName)) { break; } if (ssc.SkillType == 8) { break; } SkillRecordAction skillRecordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List { skillPack }); allSubSkills.Add((skillPack.packUID, skillRecordAction)); removePackList.Add(pack); } else if (pack is HB422_tagMCTurnFightObjDead dead) { break; } else if (pack is CustomHB426CombinePack combinePack) { // 递归判断:combinePack 自身或其嵌套包里只要含有动作 / SkillType==8 / HB422, // 就视为"需要等待",不作为静默前置子技能处理, // 留给后续 ResolvePackList 走正常队列流程。 // NeedWaiting() 内部已递归遍历嵌套的 CustomHB426CombinePack。 if (combinePack.NeedWaiting()) { break; } HB427_tagSCUseSkill sp = combinePack.GetMainHB427SkillPack(); SkillRecordAction skillRecordAction = combinePack.CreateSkillAction(); allSubSkills.Add((sp.packUID, skillRecordAction)); removePackList.Add(pack); } } for (int i = 0; i < removePackList.Count; i++) { packList.Remove(removePackList[i]); } // 按packUID排序 allSubSkills.Sort((a, b) => a.packUID.CompareTo(b.packUID)); foreach (var (packUID, recordAction) in allSubSkills) { // 经过 NeedWaiting 过滤后,此处 recordAction.useParentRecordPlayer 理论上始终为 false, // 保留分支是防御式编码,行为与原实现一致。 if (recordAction.useParentRecordPlayer) { ownRecordAction.GetInnerRecordPlayer().PlayRecord(recordAction, ownRecordAction); } else { ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction); } } } }