ProjectCreep/Assets/TBTK/Scripts/GameControl.cs

228 lines
7.1 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace TBTK{
[RequireComponent(typeof(TurnControl))]
public class GameControl : MonoBehaviour {
#if UNITY_EDITOR
public static bool inspector=false;
#endif
public bool useGlobalSetting=false;
public bool enableUnitDeployment=true;
public static bool EnableUnitDeployment(){ return instance.enableUnitDeployment; }
public bool autoEndTurn=false;
public static bool AutoEndTurn(){ return instance.autoEndTurn; }
public bool endMoveAfterAttack=false;
public static bool EndMoveAfterAttack(){ return instance.endMoveAfterAttack; }
public bool enableCounterAttack=false;
public static bool EnableCounterAttack(){ return instance.enableCounterAttack; }
public bool restoreAPOnTurn;
public static bool RestoreAPOnTurn(){ return instance.restoreAPOnTurn; }
public bool useAPToMove;
public static bool UseAPToMove(){ return instance.useAPToMove; }
public bool useAPToAttack;
public static bool UseAPToAttack(){ return instance.useAPToAttack; }
public int apPerMove=1;
public int apPerNode=0;
public int apPerAttack=1;
public static int GetAPPerMove(){ return instance.apPerMove; }
public static int GetAPPerNode(){ return instance.apPerNode; }
public static int GetAPPerAttack(){ return instance.apPerAttack; }
public bool enableCoverSystem;
public float coverCritBonus=0.25f;
public float coverDodgeBonus=0.3f;
public static bool EnableCoverSystem(){ return instance.enableCoverSystem; }
public static float GetCoverCritBonus(){ return EnableCoverSystem() ? instance.coverCritBonus : 0 ; }
public static float GetCoverDodgeBonus(){ return EnableCoverSystem() ? instance.coverDodgeBonus : 0 ; }
public bool enableSideStepping;
public static bool EnableSideStepping(){ return instance!=null ? instance.enableSideStepping : false; }
public bool enableFogOfWar;
public static bool EnableFogOfWar(){ return instance!=null ? instance.enableFogOfWar : false; }
public static GameControl instance;
void Awake() {
instance=this;
if(useGlobalSetting){
GlobalSettingDB db=GlobalSettingDB.Init();
enableUnitDeployment=db.enableUnitDeployment;
autoEndTurn=db.autoEndTurn;
endMoveAfterAttack=db.endMoveAfterAttack;
enableCounterAttack=db.enableCounterAttack;
restoreAPOnTurn=db.restoreAPOnTurn;
useAPToMove=db.useAPToMove;
useAPToAttack=db.useAPToAttack;
apPerMove=db.apPerMove;
apPerNode=db.apPerNode;
apPerAttack=db.apPerAttack;
enableSideStepping=db.enableSideStepping;
enableFogOfWar=db.enableFogOfWar;
enableCoverSystem=db.enableCoverSystem;
coverCritBonus=db.coverCritBonus;
coverDodgeBonus=db.coverDodgeBonus;
}
ObjectPoolManager.Init();
GridManager.Init();
UnitManager.Init();
TurnControl.Init(useGlobalSetting);
AbilityManager.Init();
CollectibleManager.Init();
//gameObject.AddComponent<RoutineManager>();
}
IEnumerator Start(){
yield return new WaitForSeconds(0.5f);
if(UnitManager.RequireManualDeployment()){
while(UnitManager.DeployingUnit()) yield return null;
}
Debug.Log("Start Game");
UnitManager.StartGame();
TurnControl.StartGame();
GridManager.SetupFogOfWar();
TBTK.OnGameStart(); //inform UI to start game
}
public static bool EndTurn(){
if(IsGameOver()) return false;
if(ActionInProgress()) return false;
if(AI.ActionInProgress()) return false;
UnitManager.TBSelectUnit(null);
instance.StartCoroutine(_EndTurn());
return true;
}
public static IEnumerator _EndTurn(){
yield return null; //wait a frame for the UI to update after end turn button is press
GridIndicator.HideAll();
TurnControl.EndTurn();
}
public bool actionInProgress=false;
public static bool ActionInProgress(){ return instance.actionInProgress || AI.ActionInProgress(); }
public void SetActionInProgress(bool flag){
actionInProgress=flag;
TBTK.OnActionInProgress(flag);
}
public static void UnitMove(Unit unit, Node node){
GridManager.ClearSelectUnit();
instance.StartCoroutine(instance.UnitMoveRoutine(unit, node));
}
public IEnumerator UnitMoveRoutine(Unit unit, Node node){
SetActionInProgress(true);
yield return StartCoroutine(unit.MoveRoutine(node));
SetActionInProgress(false);
if(unit.IsAllActionCompleted() && autoEndTurn) UnitManager.SelectNextUnit();
else UnitManager.TBSelectUnit(unit);
}
public static void UnitAttack(Unit unit, Node node){
GridManager.ClearSelectUnit();
instance.StartCoroutine(instance.UnitAttackRoutine(unit, node));
}
public IEnumerator UnitAttackRoutine(Unit unit, Node node){
SetActionInProgress(true);
yield return StartCoroutine(unit.AttackRoutine(node));
SetActionInProgress(false);
if(unit.IsAllActionCompleted() && autoEndTurn) UnitManager.SelectNextUnit();
else UnitManager.TBSelectUnit(unit);
}
public static void UnitUseAbility(Unit unit, Ability ability, Node node){
GridManager.ClearSelectUnit();
instance.StartCoroutine(instance.UnitAbilityRoutine(unit, ability, node));
}
public IEnumerator UnitAbilityRoutine(Unit unit, Ability ability, Node node){
SetActionInProgress(true);
yield return StartCoroutine(unit.UseAbilityRoutine(ability, node));
SetActionInProgress(false);
if(unit.IsAllActionCompleted() && autoEndTurn) UnitManager.SelectNextUnit();
else UnitManager.TBSelectUnit(unit);
}
public static void FactionUseAbility(Faction fac, Ability ability, Node node){
instance.StartCoroutine(instance.FacAbilityRoutine(fac, ability, node, UnitManager.GetSelectedUnit()));
GridManager.ClearSelectUnit();
}
public IEnumerator FacAbilityRoutine(Faction fac, Ability ability, Node node, Unit unit){
SetActionInProgress(true);
yield return StartCoroutine(fac.UseAbilityRoutine(ability, node));
SetActionInProgress(false);
UnitManager.TBSelectUnit(unit);
TBTK.OnSelectFaction(fac);
}
//~ public static void CollectibleUseAbility(Ability ability, Node node){
//~ instance.StartCoroutine(instance.ColAbilityRoutine(ability, node));
//~ //GridManager.ClearSelectUnit();
//~ }
//~ public IEnumerator ColAbilityRoutine(Faction fac, Ability ability, Node node){
//~ SetActionInProgress(true);
//~ yield return CRoutine.Get().StartCoroutine(ability.HitTarget(target));
//~ //yield return StartCoroutine(fac.UseAbilityRoutine(ability, node));
//~ SetActionInProgress(false);
//~ }
public bool gameOver=false;
public static bool IsGameOver(){ return instance.gameOver; }
//public int winFacIdx=-1;
public Faction winningFac;
public static int winningFacIdx(){ return instance.winningFac.factionID; }
public static int factionWon_ID=-1; //for loading/saving data from cache
public static void GameOver(Faction fac){//bool playableFaction, int winFacIdx){
Debug.Log("Game Over. fac-"+fac.factionID+" won!");
instance.gameOver=true;
instance.winningFac=fac;
TBTK.OnGameOver(fac.playableFaction);
factionWon_ID=fac.factionID;
UnitManager.GameOver();
}
}
}