| using System; | 
| using LitJson; | 
| using UnityEngine; | 
| using System.Collections.Generic; | 
|   | 
| // 【主线战斗流程】 | 
| // 发送 B413  (ReqType 为 2 或 3) | 
| //        后端回复  B425标记0开始   (中间N个战斗片段封包)  B425标记1结束 | 
| // 前端解析 N个战斗片段封包  ,拆解成前端支持的action指令,然后进行战斗表现 | 
| // 表现完毕后继续发送 B413  (ReqType 为 4) | 
| //        后端回复  B425标记0开始   (中间N个战斗片段封包)  B425标记1结束 | 
| // 前端解析表现,然后一直循环即可 | 
|   | 
| public enum StoryBattleState | 
| { | 
|     Break, | 
|     Battle, | 
| } | 
|   | 
| public class StoryBattleField : BattleField | 
| { | 
|     protected int chapter;//   章节 | 
|     protected int wave;//  波数 | 
|     protected int level;// 关卡 | 
|     protected JsonData extendData; | 
|   | 
|     protected MainChapterConfig chapterConfig; | 
|   | 
|     protected MainLevelConfig levelConfig; | 
|   | 
|     public StoryBattleState battleState; | 
|   | 
|     public StoryBattleField() : base(string.Empty) | 
|     { | 
|   | 
|     } | 
|   | 
|     public override void Init(int MapID, int FuncLineID, JsonData _extendData, | 
|         List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList, byte turnMax) | 
|     { | 
|         chapter = FuncLineID / 10000; | 
|         wave = MapID == 1 ? FuncLineID % 100 : 1;//第几波怪 | 
|         level = (FuncLineID % 10000) / 100; | 
|   | 
|         extendData = _extendData; | 
|         chapterConfig = MainChapterConfig.Get(chapter); | 
|         levelConfig = MainLevelConfig.Get(level); | 
|          | 
|         base.Init(MapID, FuncLineID, extendData, _redTeamList, _blueTeamList, turnMax); | 
|   | 
|         if (null == _blueTeamList || _blueTeamList.Count == 0) | 
|         { | 
|             battleState = StoryBattleState.Break; | 
|         } | 
|         else | 
|         { | 
|             battleState = StoryBattleState.Battle; | 
|         } | 
|   | 
|         // LoadBattleMode(); | 
|   | 
|   | 
|   | 
|   | 
|   | 
|         TeamManager.Instance.OnTeamChange += OnTeamChange; | 
|     } | 
|   | 
|     protected override void LoadMap(int mapID) | 
|     { | 
|         if (chapterConfig != null) | 
|         { | 
|             Texture texture = ResManager.Instance.LoadAsset<Texture>("Texture/FullScreenBg", chapterConfig.BG); | 
|             battleRootNode.SetBackground(texture); | 
|         } | 
|     } | 
|   | 
|     public override void Release() | 
|     { | 
|         base.Release(); | 
|         TeamManager.Instance.OnTeamChange -= OnTeamChange; | 
|     } | 
|   | 
|     protected void LoadBattleMode() | 
|     { | 
|         //主线模式:stop休息 无怪;Hand/Auto 有怪 等待指令 | 
|         BattleMode mode = BattleMode.Hand; | 
|         if (AutoFightModel.Instance.isAutoAttackSet) | 
|         { | 
|             mode = BattleMode.Auto; | 
|         } | 
|         if (GetBattleMode() == mode) | 
|             return; | 
|   | 
|         SetBattleMode(mode); | 
|     } | 
|   | 
|     public override void AutoSetBattleMode() | 
|     { | 
|         LoadBattleMode(); | 
|     } | 
|   | 
|   | 
|     public override void TurnFightState(int TurnNum, int State, | 
|         uint FuncLineID, JsonData extendData) | 
|     { | 
|         base.TurnFightState(TurnNum, State, FuncLineID, extendData); | 
|   | 
|         switch (State) | 
|         { | 
|             //  起始状态标记 | 
|             case 0: | 
|                 break; | 
|             case 1://准备完毕 | 
|                 break; | 
|             case 2://战斗中 | 
|                 break; | 
|             case 3://战斗结束 | 
|                 break; | 
|             case 4://结算奖励 | 
|                 break; | 
|             case 5://结束状态标记 | 
|                 break; | 
|             default: | 
|                 BattleDebug.LogError("recieve a unknown State"); | 
|                 break; | 
|         } | 
|     } | 
|   | 
|     public override void OnTurnFightObjAction(int turnNum, int ObjID) | 
|     { | 
|         base.OnTurnFightObjAction(turnNum, ObjID); | 
|     } | 
|   | 
|     public override void OnTurnFightState(int turnNum, int State, int FuncLineID, JsonData extendData) | 
|     { | 
|         base.OnTurnFightState(turnNum, State, FuncLineID, extendData); | 
|     } | 
|   | 
|     protected void OnTeamChange(TeamType teamType) | 
|     { | 
|         if (teamType == TeamType.Story) | 
|         { | 
|             if (battleState == StoryBattleState.Break) | 
|             { | 
|                 ReloadTeam(); | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|     protected override void OnSettlement(JsonData turnFightStateData) | 
|     { | 
|         base.OnSettlement(turnFightStateData); | 
|         if (battleState == StoryBattleState.Battle) | 
|         { | 
|             BattleManager.Instance.MainFightRequest(4); | 
|         } | 
|     } | 
|   | 
|   | 
|     public override void HaveRest() | 
|     { | 
|         base.HaveRest(); | 
|         battleState = StoryBattleState.Break; | 
|         BattleManager.Instance.MainFightRequest(0); | 
|     } | 
|   | 
|     protected void ReloadTeam() | 
|     { | 
|         battleObjMgr.ReloadTeam(TeamManager.Instance.GetTeam(TeamType.Story), BattleCamp.Red); | 
|     } | 
|   | 
|     // public override void OnBattleEnd(JsonData turnFightStateData) | 
|     // { | 
|     //     base.OnBattleEnd(turnFightStateData); | 
|     //     // HaveRest(); | 
|     // } | 
|   | 
|     public override void Run() | 
|     { | 
|         if (operationAgent == null) | 
|         { | 
|             //防范异常 | 
|             HaveRest(); | 
|             return; | 
|         } | 
|         base.Run(); | 
|     } | 
|   | 
|     public override void DistributeNextPackage() | 
|     { | 
|         //  不要调用base的函数 | 
|         BattleManager.Instance.DistributeNextPackage(); | 
|     } | 
|   | 
|   | 
|     //请求单次战斗, 返回是否成功操作(预判下一次是可以继续的状态) | 
|     public bool RequestFight() | 
|     { | 
|         if (IsPause) | 
|         { | 
|             //外部控制 IsPause | 
|             //还需考虑其他不可战斗状况,主线的BOSS战斗也是另外一个场景且不能切出来 等跳过或者结束 | 
|             return true; | 
|         } | 
|         if (BattleManager.Instance.isWaitServerStory) | 
|         { | 
|             return true; | 
|         } | 
|   | 
|         //    当前没有在播放战斗录像 | 
|         if (!recordPlayer.IsPlaying()) | 
|         { | 
|             // 没有下一个包可以发了 | 
|             if (!BattleManager.Instance.DistributeNextPackage()) | 
|             { | 
|   | 
|   | 
|                 //再检查一次有没装备未处理 | 
|                 if (PackManager.Instance.GetSinglePack(PackType.DropItem).GetItems().Count > 0) | 
|                 { | 
|                     //构建所有物品 | 
|                     List<int> dropList = new List<int>(); | 
|                     foreach (var item in PackManager.Instance.GetSinglePack(PackType.DropItem).GetItems()) | 
|                     { | 
|                         dropList.Add(item.gridIndex); | 
|                     } | 
|                     EquipModel.Instance.NotifyItemDrop(dropList, null); | 
|                     return false; | 
|                 } | 
|   | 
|                 //    检查一下锤子的消耗 | 
|                 if (!UIHelper.CheckMoneyCount(41, PlayerDatas.Instance.baseData.UseHarmerCount, 2)) | 
|                 { | 
|                     //多次防范 | 
|                     if (GetBattleMode() != BattleMode.Stop) | 
|                     { | 
|                         HaveRest(); | 
|                     } | 
|                     return true; | 
|                 } | 
|   | 
|                 // 请求下一个战斗包 或者检查战斗是否结束 | 
|                 // ReqType; // 0-停止战斗回城;1-设置消耗倍值;2-挑战关卡小怪;3-挑战关卡boss;4-继续战斗; | 
|                 // 需要发2的情况:休息转变为战斗 | 
|                 //    进入休息的逻辑:1.主动点击 2.没有战锤 3.断线重连太久(约定1分钟)仍停留在游戏内 4.回到登录界面(含断线超时) | 
|                 // 需要发4的情况:战场进行中都发4 | 
|                 //              1.武将战斗有消耗锤子 | 
|                 //              2.战斗结束,开始下一(小)波,此时发4 不扣锤子只有初始化战场 | 
|                 //              3.挑战BOSS结束后 | 
|                 // BOSS挑战说明:休息中挑战BOSS恢复到休息状态 不发包; | 
|                 //              战斗中挑战BOSS恢复到战斗状态 发4包;服务端挑战boss已经清小怪场 | 
|   | 
|                 byte reqType; | 
|   | 
|                 if (battleState == StoryBattleState.Break) | 
|                 { | 
|                     reqType = 2; | 
|                 } | 
|                 else if (battleState == StoryBattleState.Battle) | 
|                 { | 
|                     reqType = 4; // 继续战斗 | 
|                 } | 
|                 else | 
|                 { | 
|                     BattleDebug.LogError("unknown battle state"); | 
|                     return true; | 
|                 } | 
|   | 
|   | 
|   | 
|                 //    如果请求的是2 说明要初始化一下战场 | 
|                 BattleManager.Instance.MainFightRequest(reqType); | 
|   | 
|                 //  初始化战场后本来不会自动打 那么就需要再请求一次4继续战斗 来开始战斗 | 
|                 if (reqType == 2) | 
|                 { | 
|                     BattleManager.Instance.MainFightRequest(4); | 
|                 } | 
|                 return true; | 
|             } | 
|             else | 
|             { | 
|             } | 
|         } | 
|         else | 
|         { | 
|             if (!AutoFightModel.Instance.isAutoAttack) | 
|             { | 
|   | 
|                 BattleDebug.LogError("action doesnt finish, wait a moment please"); | 
|             } | 
|         } | 
|         return false; | 
|     } | 
|   | 
|     public override void ShowWindow(HB424_tagSCTurnFightInit vNetData) | 
|     { | 
|         BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>(); | 
|         if (null != battleWin) | 
|         { | 
|             battleWin.SetBattleField(this); | 
|         } | 
|     } | 
|   | 
|     protected override void SetRootNodePosition() | 
|     { | 
|         battleRootNode.imgBackground.rectTransform.anchoredPosition = battleRootNode.bgPos1.anchoredPosition; | 
|   | 
|         float screenRatio = (float)Screen.height / (float)Screen.width; | 
|   | 
|         if (screenRatio > 1.9f) | 
|         { | 
|             battleRootNode.battleNode.anchoredPosition = battleRootNode.battleNodePos1.anchoredPosition + new Vector2(0, 60f); | 
|         } | 
|         else | 
|         { | 
|             battleRootNode.battleNode.anchoredPosition = battleRootNode.battleNodePos1.anchoredPosition; | 
|         } | 
|     } | 
|      | 
|   | 
|     //暂停的原因有很多,需要检查各种状态 | 
|     protected override bool CanResumeGame() | 
|     { | 
|         if (NewBieCenter.Instance.IsPauseStoryBattleState()) | 
|         { | 
|             return false; | 
|         } | 
|   | 
|         if (UIManager.Instance.IsOpened<EquipExchangeWin>()) | 
|         { | 
|             return false; | 
|         } | 
|   | 
|         return true; | 
|     } | 
| } |