using System;
using Common.Utility.CombatEvent;
using Common.Utility.CombatTimer;
using Core.Audio;
using Core.Event.Event;
using Core.State;
using Fort23.Core;
using GameLogic.Combat.CombatGuide;
using GameLogic.Combat.CombatState;
using GameLogic.Combat.CombatType;
using GameLogic.Combat.Hero.HeroGPU;
using GameLogic.CombatScenesTool;
using UnityEngine;
using Utility.CustomizeTimeLogic.FxLogic.TimeLineEvent;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
namespace GameLogic.Combat.CombatTool
{
public class CombatController : ITimeLineAudio,IDisposable
{
public static CombatController currActiveCombat;
public CombatHeroController CombatHeroController;
public CombatCameraControllder CombatCameraControllder;
public CombatTypeBasic CombatTypeBasic;
protected StateControl stateControl;
public CombatSenceController CombatSenceController;
public GameTimeLineParticleFactory GameTimeLineParticleFactory;
public bool isUpdate;
///
/// 涨停游戏英雄AI行为
///
public bool isStopAi;
public float speed = 1;
private bool _isFullUIShow;
public CombatStateBasic CurrState
{
get { return stateControl.CurrIState as CombatStateBasic; }
}
public async CTask InitCombat(StartCombatInfo startCombatInfo)
{
CombatGuideManager.Instance.Init();
TimeLineSingletonEventManager.Instance.AddTimeLineBasic(this);
GameTimeLineParticleFactory = new GameTimeLineParticleFactory();
TimeLineFxParticleTool.Instance.Init(GameTimeLineParticleFactory);
currActiveCombat = this;
stateControl = new StateControl();
stateControl.AddState("idle", new CombatIdleState(this));
stateControl.AddState("update", new CombatUpdateState(this));
CombatSenceController = new CombatSenceController();
await CombatSenceController.InitScenes();
Camera camera = Camera.main;
CombatCameraControllder = new CombatCameraControllder();
CombatCameraControllder.Init(this, camera);
CombatHeroController = new CombatHeroController();
CombatHeroController.Init(this);
switch (startCombatInfo.CombatType)
{
case CombatType.CombatType.TestCombat:
CombatTypeBasic = new TestCombatType();
break;
case CombatType.CombatType.LevelBattle:
CombatTypeBasic = new LevelBattleCombatType();
break;
}
CombatTypeBasic.Init(this, startCombatInfo);
await CombatTypeBasic.StartGame();
ChangeState("update");
isUpdate = true;
EventManager.Instance.AddEventListener(CustomEventType.RefreshFull, RefreshFull);
}
private void RefreshFull(IEventData eventData)
{
RefreshFullEventData data = (RefreshFullEventData)eventData;
_isFullUIShow = data.isFullShow;
}
public void ChangeState(string name)
{
stateControl.ChangeState(name);
}
public void Update(float t)
{
CombatGestureController.Instance.Update();
if (!isUpdate||_isFullUIShow)
{
return;
}
t *= speed;
stateControl.Update(t);
CombatTypeBasic?.Update(t);
CombatTimerManager.Instance.ComabtUpdate(t);
CombatGuideManager.Instance.Update();
LateUpdate(t);
}
public void LateUpdate(float t)
{
CombatHeroController.LateUpdate(t);
}
public async CTask PlayAudio(string audioName, bool isLoop)
{
return await AudioManager.Instance.PlayAudio(audioName, isLoop);
}
public void Dispose()
{
TimeLineSingletonEventManager.Instance.RemoveTimeLineBasic(this);
CombatTypeBasic?.Dispose();
CombatHeroController?.Dispose();
CombatCameraControllder?.Dispose();
CombatSenceController?.Dispose();
GameTimeLineParticleFactory?.Dispose();
EventManager.Instance.RemoveAllEventListener(CustomEventType.RefreshFull);
}
}
}