138 lines
4.6 KiB
C#
138 lines
4.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace TBTK{
|
|
|
|
public enum _TurnMode{
|
|
FactionPerTurn,
|
|
UnitPerTurn,
|
|
}
|
|
public enum _CDTracking{
|
|
EveryTurn,
|
|
EveryRound,
|
|
}
|
|
|
|
public class TurnControl : MonoBehaviour {
|
|
|
|
#if UNITY_EDITOR
|
|
public static bool inspector=false;
|
|
#endif
|
|
|
|
|
|
public _TurnMode turnMode;
|
|
public static _TurnMode GetTurnMode(){ return instance.turnMode; }
|
|
public static bool IsUnitPerTurn(){ return instance.turnMode==_TurnMode.UnitPerTurn; }
|
|
public static bool IsFactionPerTurn(){ return instance.turnMode==_TurnMode.FactionPerTurn; }
|
|
|
|
public bool enableUnitLimit=false;
|
|
public int facUnitLimit=1;
|
|
public static bool EnableUnitLimit(){ return instance.enableUnitLimit; }
|
|
//public static float GetUnitLimit(){ return instance.enableUnitLimit ? 1 : Mathf.Infinity ; }
|
|
public static float GetUnitLimit(){ return instance.enableUnitLimit ? Mathf.Max(1, instance.facUnitLimit) : Mathf.Infinity ; }
|
|
|
|
public bool allowUnitSwitching=true;
|
|
public static bool AllowUnitSwitching(){ return instance.allowUnitSwitching; }
|
|
|
|
public bool waitForUnitDestroy=true;
|
|
public static bool WaitForUnitDestroy(){ return instance.waitForUnitDestroy; }
|
|
|
|
public _CDTracking cdTracking; //use in UnitPerTurn only
|
|
public static bool IterateCDEveryTurn(){ return instance.cdTracking==_CDTracking.EveryTurn; }
|
|
public static bool IterateCDEveryRound(){ return instance.cdTracking==_CDTracking.EveryRound; }
|
|
|
|
|
|
[Space(10)]
|
|
public int roundCounter=0; public static int GetRound(){ return instance.roundCounter; }
|
|
public int currentTurn=-1; public static int GetTurn(){ return instance.currentTurn; }
|
|
|
|
//only called in UnitPerTurn mode, when current unit or a unit prior to current unit in move order is removed from game
|
|
public static void RevertTurn(){ instance.currentTurn=Mathf.Max(-1, instance.currentTurn-1); }
|
|
|
|
//only called in UnitPerTurn mode, when current unit or a unit prior to current unit in move order is removed from game
|
|
public static void AddTurn(){ instance.currentTurn+=1; }
|
|
|
|
|
|
private static TurnControl instance;
|
|
|
|
public static void Init(bool useGlobalSetting){
|
|
if(instance==null) instance=(TurnControl)FindObjectOfType(typeof(TurnControl));
|
|
|
|
if(useGlobalSetting){
|
|
GlobalSettingDB db=GlobalSettingDB.Init();
|
|
instance.turnMode=db.turnMode;
|
|
instance.allowUnitSwitching=db.allowUnitSwitching;
|
|
instance.waitForUnitDestroy=db.waitForUnitDestroy;
|
|
instance.cdTracking=db.cdTracking;
|
|
}
|
|
}
|
|
|
|
|
|
public static void StartGame(){
|
|
instance.currentTurn=-1;
|
|
EndTurn();
|
|
}
|
|
|
|
|
|
public static void EndTurn(){ instance.StartCoroutine(instance._EndTurn()); }
|
|
public IEnumerator _EndTurn(bool endRound=false){
|
|
GridManager.EndTurn(); //to iterate node scanned by reveal fog-of-war
|
|
//yield return StartCoroutine(UnitManager.EndTurn()); //just to iterate unit ability and effect CD
|
|
|
|
//display new turn?
|
|
|
|
CollectibleManager.NewTurn();
|
|
|
|
currentTurn+=1;
|
|
endRound=UnitManager.CheckIfNewTurnEndRound(currentTurn);
|
|
if(endRound) currentTurn=0;
|
|
|
|
if(turnMode==_TurnMode.FactionPerTurn){
|
|
yield return StartCoroutine(UnitManager.EndTurn_IterateCD());
|
|
|
|
yield return new WaitForSeconds(0.25f);
|
|
UnitManager.EndTurn_FactionPerTurn(currentTurn);
|
|
}
|
|
else if(turnMode==_TurnMode.UnitPerTurn){
|
|
if(IterateCDEveryTurn() || (endRound && IterateCDEveryRound()))
|
|
yield return StartCoroutine(UnitManager.EndTurn_IterateCD());
|
|
|
|
yield return new WaitForSeconds(0.25f);
|
|
UnitManager.EndTurn_UnitPerTurn(currentTurn);
|
|
}
|
|
|
|
//~ if(turnMode==_TurnMode.FactionPerTurn){
|
|
//~ currentTurn=UnitManager.EndTurn_FactionPerTurn(currentTurn);
|
|
//~ if(currentTurn==0) endRound=true;
|
|
//~ yield return StartCoroutine(UnitManager.EndTurn_IterateCD());
|
|
//~ }
|
|
//~ else if(turnMode==_TurnMode.UnitPerTurn){
|
|
//~ currentTurn=UnitManager.EndTurn_UnitPerTurn(currentTurn);
|
|
//~ if(currentTurn==0) endRound=true;
|
|
|
|
//~ if(IterateCDEveryTurn() || (endRound && IterateCDEveryRound()))
|
|
//~ yield return StartCoroutine(UnitManager.EndTurn_IterateCD());
|
|
//~ }
|
|
|
|
if(endRound) roundCounter+=1;
|
|
|
|
//~ Debug.Log("Check if selected unit is destroyed by dot effect");
|
|
|
|
TBTK.OnNewTurn();
|
|
}
|
|
|
|
|
|
public static bool CanSwitchUnit(Unit unit){
|
|
if(TurnControl.IsUnitPerTurn()) return false;
|
|
if(!AllowUnitSwitching()) return false;
|
|
|
|
if(EnableUnitLimit() && !unit.HasTakenAction()){//UnitManager.GetSelectedFaction().GetMoveCount()>=GetUnitLimit()){
|
|
if(UnitManager.GetSelectedFaction().GetMoveCount()>=GetUnitLimit()) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
} |