using System.Collections.Generic;
|
using UnityEngine;
|
using System;
|
using LitJson;
|
using DG.Tweening;
|
|
public class BattleField
|
{
|
public BattleObjMgr battleObjMgr;
|
|
public BattleEffectMgr battleEffectMgr;
|
|
public BattleTweenMgr battleTweenMgr;
|
|
public RecordPlayer recordPlayer;
|
|
public IOperationAgent operationAgent;
|
|
public int round = 0;
|
|
public string guid = string.Empty;//等于string.Empty的时候代表是StoryBattleField 是主线副本
|
|
public int MapID = 0;
|
|
public int FuncLineID = 0;
|
|
public JsonData extendData;
|
|
public bool IsBattleFinish
|
{
|
get;
|
protected set;
|
}
|
|
private bool m_IsPause = false;
|
|
public bool IsPause
|
{
|
get
|
{
|
return m_IsPause;
|
}
|
set
|
{
|
m_IsPause = value;
|
|
if (m_IsPause)
|
{
|
PauseGame();
|
}
|
else
|
{
|
ResumeGame();
|
}
|
|
OnBattlePause?.Invoke(m_IsPause);
|
}
|
}
|
|
public BattleRootNode battleRootNode;
|
|
private BattleMode battleMode;
|
|
public Action<bool> OnBattlePause;
|
|
protected List<TeamBase> redTeamList = null;
|
|
protected List<TeamBase> blueTeamList = null;
|
|
protected int redTeamIndex = 0;
|
|
protected int blueTeamIndex = 0;
|
|
public BattleField(string _guid)
|
{
|
guid = _guid;
|
|
GameObject go = ResManager.Instance.LoadAsset<GameObject>("Battle/Prefabs", "BattleRootNode");
|
GameObject battleRootNodeGO = GameObject.Instantiate(go);
|
battleRootNode = battleRootNodeGO.GetComponent<BattleRootNode>();
|
battleRootNodeGO.name = this.GetType().Name;
|
|
battleObjMgr = new BattleObjMgr();
|
battleEffectMgr = new BattleEffectMgr();
|
battleTweenMgr = new BattleTweenMgr();
|
recordPlayer = new RecordPlayer();
|
|
battleEffectMgr.Init(this);
|
battleTweenMgr.Init(this);
|
recordPlayer.Init(this);
|
}
|
|
public virtual void Init(int _MapID, int _FuncLineID, JsonData _extendData,
|
List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList)
|
{
|
MapID = _MapID;
|
redTeamList = _redTeamList;
|
blueTeamList = _blueTeamList;
|
FuncLineID = _FuncLineID;
|
extendData = _extendData;
|
|
redTeamIndex = 0;
|
blueTeamIndex = 0;
|
|
if (blueTeamList == null)
|
{
|
battleObjMgr.Init(this, redTeamList[redTeamIndex], null);
|
HaveRest();
|
}
|
else
|
{
|
battleObjMgr.Init(this, redTeamList[redTeamIndex], blueTeamList[blueTeamIndex]);
|
}
|
|
battleRootNode.SetBackground(ResManager.Instance.LoadAsset<Texture>("Texture/FullScreenBg", "battlebg1"));
|
}
|
|
// 在Run之前要设置完毕 要创建Agent
|
public void SetBattleMode(BattleMode _battleMode)
|
{
|
battleMode = _battleMode;
|
CreateAgent();
|
}
|
|
public virtual void Release()
|
{
|
battleObjMgr.Release();
|
}
|
|
public virtual void Run()
|
{
|
if (IsPause)
|
return;
|
|
if (IsRoundReachLimit())
|
{
|
return;
|
}
|
if (recordPlayer == null || battleObjMgr == null)
|
return;
|
recordPlayer.Run();
|
battleObjMgr.Run();
|
|
if (operationAgent == null)
|
{
|
Debug.LogError("you should SetBattleMode before Run");
|
return;
|
}
|
|
operationAgent.Run();
|
}
|
|
|
protected virtual void CreateAgent()
|
{
|
// Hand,//手动战斗
|
// Auto,//自动战斗
|
// Record,//战报
|
switch (battleMode)
|
{
|
case BattleMode.Hand:
|
operationAgent = new HandModeOperationAgent(this);
|
break;
|
case BattleMode.Auto:
|
operationAgent = new AutoModeOperationAgent(this);
|
break;
|
case BattleMode.Record:
|
operationAgent = new RecordModeOperationAgent(this);
|
break;
|
default:
|
operationAgent = new HandModeOperationAgent(this);
|
break;
|
}
|
|
Debug.LogError("battleMode is " + battleMode.ToString());
|
}
|
|
public virtual void PlayRecord(RecordAction recordAction)
|
{
|
recordPlayer.PlayRecord(recordAction);
|
}
|
|
public virtual void PlayRecord(List<RecordAction> recordList)
|
{
|
recordPlayer.PlayRecord(recordList);
|
}
|
|
protected virtual void ResumeGame()
|
{
|
battleObjMgr.ResumeGame();
|
recordPlayer.ResumeGame();
|
battleEffectMgr.ResumeGame();
|
battleTweenMgr.ResumeGame();
|
}
|
|
protected virtual void PauseGame()
|
{
|
// 怎么通知界面暂停了呢?
|
|
battleObjMgr.PauseGame();
|
recordPlayer.PauseGame();
|
battleEffectMgr.PauseGame();
|
battleTweenMgr.PauseGame();
|
}
|
|
public virtual void TurnFightState(int TurnNum, int State,
|
uint FuncLineID, JsonData extendData)
|
{
|
round = TurnNum;
|
}
|
|
public virtual void OnTurnFightObjAction(int turnNum, int ObjID)
|
{
|
|
}
|
|
public virtual void OnTurnFightState(int turnNum, int State, int FuncLineID, JsonData turnFightStateData)
|
{
|
// 切换回合
|
// 是每个战斗开始/每个回合的第一个战斗包
|
// MapID = MapID
|
|
// MapID; // 自定义地图ID,可用于绑定战斗地图场景功能(如主线关卡、主线boss、爬塔、竞技场等)
|
// FuncLineID; // MapID对应的扩展值,如具体某个关卡等 章节*10000+关卡编号*100+第x波,如第一章,第10关卡的boss值 = 11001
|
// State; // 0-起始状态标记;1-准备完毕;2-战斗中;3-战斗结束;4-结算奖励;5-结束状态标记
|
// TurnNum; // 当前轮次
|
// Len;
|
// Msg; //size = Len +
|
|
if (State == 4)
|
{
|
//已经结束并结算
|
OnBattleEnd(turnFightStateData);
|
return;
|
}
|
|
// 做表现
|
if (turnNum == 1)
|
{
|
if (State == 2)
|
{
|
Debug.Log("战斗开始");
|
}
|
}
|
else
|
{
|
Debug.Log("战斗回合 : " + turnNum + ",状态 " + State);
|
}
|
|
|
|
// 做一个Action 通知UI翻下牌子 然后结束Action
|
// TurnFightStateAction turnFightStateAction = new TurnFightStateAction(this, turnNum, State, FuncLineID, extendData);
|
// recordPlayer.PlayRecord(turnFightStateAction);
|
}
|
|
|
public void ObjInfoRefresh(H0418_tagObjInfoRefresh _refreshInfo)
|
{
|
BattleObject battleObj = battleObjMgr.GetBattleObject((int)_refreshInfo.ObjID);
|
|
if (null != battleObj)
|
{
|
battleObj.OnObjInfoRefresh(_refreshInfo);
|
}
|
}
|
|
public void ObjPropertyRefreshView(H0423_tagObjPropertyRefreshView vNetData)
|
{
|
|
}
|
|
public virtual void OnObjDead(int ObjID)
|
{
|
DeathRecordAction recordAction = new DeathRecordAction(this, battleObjMgr.GetBattleObject(ObjID));
|
recordPlayer.PlayRecord(recordAction);
|
}
|
|
public virtual void Destroy()
|
{
|
// 销毁全部内容
|
}
|
|
public void NPCDisappear(uint[] ObjIDArr)
|
{
|
// 让npc消失
|
battleObjMgr.DestroyObjIds(ObjIDArr);
|
}
|
|
|
public RectTransform GetTeamNode(BattleCamp battleCamp)
|
{
|
if (battleCamp == BattleCamp.Red)
|
{
|
return battleRootNode.redTeamNode;
|
}
|
else
|
{
|
return battleRootNode.blueTeamNode;
|
}
|
}
|
|
public RectTransform GetTeamNode(BattleCamp battleCamp, BattleObject target)
|
{
|
int index = target.teamHero.positionNum;
|
return GetTeamNode(battleCamp, index);
|
}
|
|
public RectTransform GetTeamNode(BattleCamp battleCamp, SkillConfig skillConfig)
|
{
|
int index = skillConfig.CastIndexNum - 1; // 技能配置的index是从1开始的,所以要减1
|
return GetTeamNode(battleCamp, index);
|
}
|
|
private RectTransform GetTeamNode(BattleCamp battleCamp, int index)
|
{
|
if (index < 0 || index >= battleRootNode.redTeamNodeList.Count)
|
{
|
Debug.LogError($"GetTeamNode: Index {index} is out of range for {battleCamp} camp.");
|
return null;
|
}
|
|
if (battleCamp == BattleCamp.Red)
|
{
|
return battleRootNode.redTeamNodeList[index].transform as RectTransform;
|
}
|
else
|
{
|
return battleRootNode.blueTeamNodeList[index].transform as RectTransform;
|
}
|
}
|
|
public bool IsRoundReachLimit()
|
{
|
// return round > xxx;
|
return false;
|
}
|
|
public void UpdateCanvas(Canvas canvas)
|
{
|
EffectPenetrationBlocker[] blockers = battleRootNode.GetComponentsInChildren<EffectPenetrationBlocker>(true);
|
|
if (null != blockers)
|
{
|
foreach (var blocker in blockers)
|
{
|
blocker.SetParentCanvas(canvas);
|
}
|
}
|
}
|
|
public void StartBattle(Action onMoveComplete)
|
{
|
List<BattleObject> redTeam = battleObjMgr.GetBattleObjList(BattleCamp.Red);
|
|
Tween tween = null;
|
|
foreach (var obj in redTeam)
|
{
|
obj.motionBase.PlayAnimation(MotionName.run, true);
|
RectTransform trans = obj.heroRectTrans;
|
tween = trans.DOMove(obj.GetAliasTeamNode().position, 0.5f).SetEase(Ease.Linear);
|
battleTweenMgr.OnPlayTween(tween);
|
}
|
|
tween.onComplete = () =>
|
{
|
foreach (var obj in redTeam)
|
{
|
obj.motionBase.PlayAnimation(MotionName.idle, true);
|
}
|
|
// 播放战斗开始的特效
|
var efplayer = battleEffectMgr.PlayEffect(0, BattleConst.BattleStartEffectID, battleRootNode.transform);
|
efplayer.onDestroy += a => onMoveComplete();
|
};
|
}
|
|
public void OnObjDropItem(int positionNum, ItemModel item)
|
{
|
// 处理掉落物品
|
//无论如何图层应该在人物上面 所以这里应该有个挂点
|
// YYL TODO
|
|
|
}
|
|
public void OnObjReborn(HB423_tagMCTurnFightObjReborn vNetData)
|
{
|
// 处理复活逻辑
|
BattleObject battleObj = battleObjMgr.GetBattleObject((int)vNetData.ObjID);
|
if (battleObj != null)
|
{
|
battleObj.OnReborn(vNetData);
|
}
|
else
|
{
|
Debug.LogError($"BattleObject with ID {vNetData.ObjID} not found for reborn.");
|
}
|
}
|
|
public void OnObjDropExp(BattleObject battleObject)
|
{
|
// 处理掉落经验
|
// YYL TODO
|
battleObject.DropExp();
|
}
|
|
public virtual void OnBattleEnd(JsonData turnFightStateData)
|
{
|
// 处理战斗结束逻辑
|
IsBattleFinish = true;
|
// 结算逻辑
|
|
// {"winFaction":获胜阵营, "statInfo":统计信息, “itemInfo“:[奖励物品信息列表]}
|
}
|
|
public virtual void HaveRest()
|
{
|
// 休息状态
|
battleObjMgr.HaveRest(BattleCamp.Red);
|
battleObjMgr.DestroyTeam(BattleCamp.Blue);
|
|
battleEffectMgr.HaveRest();
|
battleTweenMgr.HaveRest();
|
}
|
|
public bool IsBattleEnd()
|
{
|
return IsBattleFinish;
|
}
|
}
|