yyl
2025-08-29 5909666c81bd9a14a88d79d9f27229b1f14d2e55
125
【战斗】战斗系统
7个文件已修改
247 ■■■■■ 已修改文件
Main/Config/Configs/SkillConfig.cs 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/SkillConfig.Partial.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleManager.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillFactory.cs 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/Configs/SkillConfig.cs
@@ -1,6 +1,6 @@
//--------------------------------------------------------
//    [Author]:           YYL
//    [  Date ]:           2025年8月26日
//    [  Date ]:           2025年8月29日
//--------------------------------------------------------
using System.Collections.Generic;
@@ -38,7 +38,6 @@
    public int EffectID3;
    public int[] EffectValues3;
    public int CoolDownTime;
    public int[] EnhanceSkillList;
    public int FightPower;
    public string SkillMotionName;
    public string IconName;
@@ -59,6 +58,7 @@
    public int EffectId;
    public int EffectId2;
    public int MStartEffectId;
    public int TriggerEffect;
    public override int LoadKey(string _key)
    {
@@ -150,37 +150,23 @@
            int.TryParse(tables[21],out CoolDownTime); 
            if (tables[22].Contains("["))
            int.TryParse(tables[22],out FightPower);
            SkillMotionName = tables[23];
            IconName = tables[24];
            int.TryParse(tables[25],out EffectType);
            int.TryParse(tables[26],out StartupFrames);
            if (tables[27].Contains("["))
            {
                EnhanceSkillList = JsonMapper.ToObject<int[]>(tables[22]);
                ActiveFrames = JsonMapper.ToObject<int[]>(tables[27]);
            }
            else
            {
                string[] EnhanceSkillListStringArray = tables[22].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                EnhanceSkillList = new int[EnhanceSkillListStringArray.Length];
                for (int i=0;i<EnhanceSkillListStringArray.Length;i++)
                {
                     int.TryParse(EnhanceSkillListStringArray[i],out EnhanceSkillList[i]);
                }
            }
            int.TryParse(tables[23],out FightPower);
            SkillMotionName = tables[24];
            IconName = tables[25];
            int.TryParse(tables[26],out EffectType);
            int.TryParse(tables[27],out StartupFrames);
            if (tables[28].Contains("["))
            {
                ActiveFrames = JsonMapper.ToObject<int[]>(tables[28]);
            }
            else
            {
                string[] ActiveFramesStringArray = tables[28].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                string[] ActiveFramesStringArray = tables[27].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                ActiveFrames = new int[ActiveFramesStringArray.Length];
                for (int i=0;i<ActiveFramesStringArray.Length;i++)
                {
@@ -188,33 +174,35 @@
                }
            }
            int.TryParse(tables[29],out RecoveryFrames);
            int.TryParse(tables[28],out RecoveryFrames);
            int.TryParse(tables[30],out LoopCount);
            int.TryParse(tables[29],out LoopCount);
            int.TryParse(tables[31],out CastPosition);
            int.TryParse(tables[30],out CastPosition);
            int.TryParse(tables[32],out CastIndexNum);
            int.TryParse(tables[31],out CastIndexNum);
            float.TryParse(tables[33],out CastDistance);
            float.TryParse(tables[32],out CastDistance);
            DamageDivide = JsonMapper.ToObject<int[][]>(tables[34].Replace("(", "[").Replace(")", "]"));
            DamageDivide = JsonMapper.ToObject<int[][]>(tables[33].Replace("(", "[").Replace(")", "]"));
            int.TryParse(tables[35],out BulletEffectId);
            int.TryParse(tables[34],out BulletEffectId);
            int.TryParse(tables[36],out BulletPath);
            int.TryParse(tables[35],out BulletPath);
            float.TryParse(tables[37],out BulletFlyTime);
            float.TryParse(tables[36],out BulletFlyTime);
            int.TryParse(tables[38],out ExplosionEffectId);
            int.TryParse(tables[37],out ExplosionEffectId);
            int.TryParse(tables[39],out ExplosionEffect2);
            int.TryParse(tables[38],out ExplosionEffect2);
            int.TryParse(tables[40],out EffectId);
            int.TryParse(tables[39],out EffectId);
            int.TryParse(tables[41],out EffectId2);
            int.TryParse(tables[40],out EffectId2);
            int.TryParse(tables[42],out MStartEffectId);
            int.TryParse(tables[41],out MStartEffectId);
            int.TryParse(tables[42],out TriggerEffect);
        }
        catch (Exception exception)
        {
Main/Config/PartialConfigs/SkillConfig.Partial.cs
@@ -24,6 +24,15 @@
        skillType = (SkillType)SkillType;
        castMode = (SkillCastMode)CastPosition;
        effectType = (SkillEffectType)EffectType;
// #if UNITY_EDITOR
//         if (Launch.Instance.isOpenBattleDebug)
//         {
//             if (castMode == SkillCastMode.None)
//             {
//                 castMode = SkillCastMode.Target;
//             }
//         }
// #endif
    }
    public MotionName GetMotionName()
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs
@@ -1,11 +1,67 @@
using UnityEngine;
using System.Collections;
using LitJson;
using System.Collections.Generic;
// B4 24 回合战斗初始化 #tagSCTurnFightInit
public class DTCB424_tagSCTurnFightInit : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HB424_tagSCTurnFightInit vNetData = vNetPack as HB424_tagSCTurnFightInit;
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
        HB424_tagSCTurnFightInit vNetData = vNetPack as HB424_tagSCTurnFightInit;
        // 【战斗地图定义】
        // 前后端协议通讯时,如果有MapID、FuncLineID信息,一般代表的是某个战斗功能,
        // 并可绑定某个战斗场景(相当于MMO中的不同功能及战斗场景地图)
        // 卡牌中也可理解为不同的战斗功能及绑定不同的战斗背景图之类
        // 目前几个固定MapID定义
        // 主线小怪战斗 MapID = 1
        // FuncLineID = 章节*10000+关卡编号*100+第x波,如第一章,第10关卡,第5波时值 = 11005,
        // 单章最大支持99小关,单关最大支持99波怪
        // 主线boss战斗 MapID = 2
        // FuncLineID = 章节*10000+关卡编号*100+第x波,如第一章,第10关卡的boss值 = 11001,
        // 注:关卡boss波数固定为只有1波
        // 前端可通过MapID及对应的FuncLineID加载不同的战斗场景背景、背景音乐等
        // HB424_tagSCTurnFightInit
        // MapID;    // 自定义地图ID,可用于绑定战斗地图场景功能(如主线关卡、主线boss、爬塔、竞技场等)
        // FuncLineID;    // MapID对应的扩展值,如具体某个关卡等
        // TurnMax;    // 最大轮次
        // Len;
        // Msg;    // 本场战斗扩展信息,一般为json格式,具体内容由MapID决定
        // FactionCnt;
        // FactionList;    // 阵营列表,通常固定只有两个阵营
        List<TeamBase> redTeamList = new List<TeamBase>();
        List<TeamBase> blueTeamList = new List<TeamBase>();
        if (null != vNetData.FactionList)
        {
            foreach (var vFaction in vNetData.FactionList)
            {
                if (vFaction.Faction == 1)
                {
                    foreach (var lineUp in vFaction.LineupList)
                    {
                        redTeamList.Add(new TeamBase(lineUp));
                    }
                }
                else if (vFaction.Faction == 2)
                {
                    foreach (var lineUp in vFaction.LineupList)
                    {
                        blueTeamList.Add(new TeamBase(lineUp));
                    }
                }
            }
        }
        JsonData extendData = JsonMapper.ToObject(vNetData.Msg);
        string guid = BattleManager.Instance.GetGUID(vNetPack.packUID);
        BattleField battleField = BattleManager.Instance.CreateBattleField(guid, (int)vNetData.MapID, (int)vNetData.FuncLineID, extendData, redTeamList, blueTeamList);
        BattleStartAction battleStartAction = new BattleStartAction(battleField);
        battleField.recordPlayer.PlayRecord(battleStartAction);
    }
}
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs
@@ -7,5 +7,11 @@
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HB428_tagSCBuffRefresh vNetData = vNetPack as HB428_tagSCBuffRefresh;
        BattleField battleField = BattleManager.Instance.GetBattleField(vNetData.packUID);
        if (null != battleField)
        {
            battleField.OnRefreshBuff(vNetData);
        }
    }
}
Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -11,6 +11,7 @@
        : base(RecordActionType.Skill, _battleField, _caster)
    {
        skillBase = SkillFactory.CreateSkill(_caster, vNetData, packList, _battleField);
        BattleDebug.LogError("skill record action tpye : " + skillBase.GetType().Name);
    }
    public override bool IsFinished()
Main/System/Battle/BattleManager.cs
@@ -263,6 +263,7 @@
        if (!battlePackRelationList.TryGetValue(guid, out uidList))
        {
            uidList = new List<ulong>();
            battlePackRelationList.Add(guid, uidList);
        }
        uidList.Add(vNetPack.packUID);
@@ -387,9 +388,16 @@
    public void Run()
    {
        foreach (var battleField in battleFields)
        try
        {
            battleField.Value?.Run();
            foreach (var battleField in battleFields)
            {
                battleField.Value?.Run();
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex);
        }
    }
Main/System/Battle/Skill/SkillFactory.cs
@@ -5,45 +5,56 @@
public static class SkillFactory
{
// SkillType
// 技能类型    定义
// 特殊   0
// 攻击类   1    主动会造成瞬间伤害技能类型为1
// 恢复类   2    主动会恢复生命值的技能类型为2
// 持续增益BUFF  3    主动一段时间内间隔时间给予增益buff技能类型为3,比如持续回血
// 持续减益BUFF  4    主动一段时间内间隔时间给予减益buff技能类型为4,比如中毒
// 增益BUFF 5    主动持续一段时间给予增益buff,不会出现间隔时间buff类型为5,比如麒麟盾
// 减益BUFF 6    主动持续一段时间给予减益buff,不会出现间隔时间buff类型为6,比如减速
// 被动技   7    被动触发的技能类型为7
// 复活     8    牧师复活队友技能,暂时无用
// 增值技能(不可清除)9      和增益技能类似,无法点击图标取消,暂时无用
// 光环技能  10    队友共享该技能的光环,类似魔兽争霸的强击光环,荆棘光环,暂时无这样技能
// 装备技能  11    装备上附加了技能,比如套装附加攻击+50%,暂时无这样技能
// 区域技能  12    "布怪器里 有个配置技能ID  比如配个火区域灼烧
// "
// 召唤      13    主动召唤出一个怪物,则配置为13,暂时无这样的技能
// 控制型BUFF 14    比如眩晕,定身技能需要配置控制型buff
// 多段伤害buff攻击类型(类xp技能) 15    多段伤害主动每秒伤害buff技能类型为15
// 被动触发增益类buff 16    被动触发持续一段时间给予增益buff,不会出现间隔时间buff类型为16,如(50065疾风)
// 被动触发减益类buff 17    被动触发持续一段时间给予减益buff,不会出现间隔时间buff类型为17,如(50235负伤)
// 被动触发的控制类buff 18    被动触发持续一段时间的控制技能为17,如(50365激怒)
// 属性类技能 20(如坐骑属性,宠物属性)    被动增加了属性效果值,长期的技能为20,如(50605守护)
// 被动buff 19(暂时不知道干啥的)
// 被动触发持续类增益类buff 21    被动一段时间内间隔时间给予增益buff技能类型为3,比如(50635祝福)
// 被动触发持续类减益类buff 22    被动一段时间内间隔时间给予减益buff技能类型为4,比如毒龙嗜天
    // SkillType
    // 技能类型    定义
    // 特殊   0
    // 攻击类   1    主动会造成瞬间伤害技能类型为1
    // 恢复类   2    主动会恢复生命值的技能类型为2
    // 持续增益BUFF  3    主动一段时间内间隔时间给予增益buff技能类型为3,比如持续回血
    // 持续减益BUFF  4    主动一段时间内间隔时间给予减益buff技能类型为4,比如中毒
    // 增益BUFF 5    主动持续一段时间给予增益buff,不会出现间隔时间buff类型为5,比如麒麟盾
    // 减益BUFF 6    主动持续一段时间给予减益buff,不会出现间隔时间buff类型为6,比如减速
    // 被动技   7    被动触发的技能类型为7
    // 复活     8    牧师复活队友技能,暂时无用
    // 增值技能(不可清除)9      和增益技能类似,无法点击图标取消,暂时无用
    // 光环技能  10    队友共享该技能的光环,类似魔兽争霸的强击光环,荆棘光环,暂时无这样技能
    // 装备技能  11    装备上附加了技能,比如套装附加攻击+50%,暂时无这样技能
    // 区域技能  12    "布怪器里 有个配置技能ID  比如配个火区域灼烧
    // "
    // 召唤      13    主动召唤出一个怪物,则配置为13,暂时无这样的技能
    // 控制型BUFF 14    比如眩晕,定身技能需要配置控制型buff
    // 多段伤害buff攻击类型(类xp技能) 15    多段伤害主动每秒伤害buff技能类型为15
    // 被动触发增益类buff 16    被动触发持续一段时间给予增益buff,不会出现间隔时间buff类型为16,如(50065疾风)
    // 被动触发减益类buff 17    被动触发持续一段时间给予减益buff,不会出现间隔时间buff类型为17,如(50235负伤)
    // 被动触发的控制类buff 18    被动触发持续一段时间的控制技能为17,如(50365激怒)
    // 属性类技能 20(如坐骑属性,宠物属性)    被动增加了属性效果值,长期的技能为20,如(50605守护)
    // 被动buff 19(暂时不知道干啥的)
    // 被动触发持续类增益类buff 21    被动一段时间内间隔时间给予增益buff技能类型为3,比如(50635祝福)
    // 被动触发持续类减益类buff 22    被动一段时间内间隔时间给予减益buff技能类型为4,比如毒龙嗜天
// 攻击技能:本回合对敌人武将造成伤害
// 治疗技能:本回合对已方武将回复生命值,回复生命值不可超过生命上限
// 辅助技能:增加怒气、召唤、光环等
// BUFF技能:提升已方属性的增益BUFF(加攻、加血、加状态等),降低敌方属性的减益BUFF(减攻、减血、控制等),持续多回合
// 复活技能:复活已方已死武将并回复X生命值,复活:继承死亡前的所有状态(各种状态、各种BUFF、怒气值等),复活后错过本回合攻击时机则下一回合才能出手
    // 攻击技能:本回合对敌人武将造成伤害
    // 治疗技能:本回合对已方武将回复生命值,回复生命值不可超过生命上限
    // 辅助技能:增加怒气、召唤、光环等
    // BUFF技能:提升已方属性的增益BUFF(加攻、加血、加状态等),降低敌方属性的减益BUFF(减攻、减血、控制等),持续多回合
    // 复活技能:复活已方已死武将并回复X生命值,复活:继承死亡前的所有状态(各种状态、各种BUFF、怒气值等),复活后错过本回合攻击时机则下一回合才能出手
    public static SkillBase CreateSkill(BattleObject _caster, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> packList, BattleField battleField)
    {
        SkillConfig skillConfig = SkillConfig.Get((int)vNetData.SkillID);
        if (null == skillConfig)
        {
            Debug.LogError("skill config is null id is " + vNetData.SkillID);
            return null;
        }
        Debug.LogError("skill type is " + skillConfig.SkillType + " skill id is " + vNetData.SkillID);
        SkillBase skill = null;
        switch (skillConfig.SkillType)
@@ -56,16 +67,14 @@
                // skill = new DirectlyHealSkill(_skillConfig);
                break;
            case 3:
                // skill = new SupportSkill(_skillConfig);
                break;
            case 4:
                // skill = new MountBuffSkill(_skillConfig);
                break;
            case 5:
                // skill = new ReviveSkill(_skillConfig);
            case 6:
            case 14:
                // skill = new MountBuffSkill(_caster, skillConfig, vNetData, packList, battleField);
                break;
            default:
                BattleDebug.LogError("超出了技能类型范围 请检查配置");
                Debug.LogError("超出了技能类型范围 请检查配置");
                break;
        }