//AI routine for faction based turn mode, AI will move all available unit for the faction //called by UnitControl in OnNextTurn IEnumerator _AIRoutine(int factionID) { while (GameControlTB.IsActionInProgress()) { yield return(null); } yield return(new WaitForSeconds(1f)); Faction faction = UnitControl.GetFactionInTurn(factionID); List <UnitTB> allUnit = faction.allUnitList; int counter = 0; if (GameControlTB.GetMoveOrder() == _MoveOrder.Free) { int count = allUnit.Count; //create a list (1, 2, 3..... ) to the size of the unit, this is for unit shuffling List <int> IDList = new List <int>(); for (int i = 0; i < count; i++) { IDList.Add(i); } for (int i = 0; i < count; i++) { //randomly select a unit to move int rand = UnityEngine.Random.Range(0, IDList.Count); /* * //if(counter%2==0) rand=0; * //else rand=IDList.Count-1; * * string label="rand: "+rand+" ("+IDList.Count+")"; * for(int nn=0; nn<IDList.Count; nn++){ * label+=" "+IDList[nn]; * } * Debug.Log(label); */ int ID = IDList[rand]; UnitTB unit = allUnit[ID]; //remove the unit from allUnit list so that it wont be selected again IDList.RemoveAt(rand); counter += 1; //move the unit unitInAction = true; StartCoroutine(_MoveUnit(unit)); //wait a frame for the unit to start moving, set the inAction flag, etc.. yield return(null); //wait while the unit is in action (making its move) //and while the game event is in progress (counter attack, death effect/animation, etc.) //and while the unit localUnitInactionFlag hasn't been cleared while (unit.InAction() || GameControlTB.IsActionInProgress() || unitInAction) { yield return(null); } //for counter-attack enabled, in case the unit is destroyed in after being countered if (unit.IsDestroyed()) { //label=""; for (int n = rand; n < IDList.Count; n++) { if (IDList[n] >= ID) { //label+=" "+IDList[n]; IDList[n] -= 1; } } //Debug.Log("unit destroyed "+label); } /* * label="rand: "+rand+" ("+IDList.Count+")"; * for(int nn=0; nn<IDList.Count; nn++){ * label+=" "+IDList[nn]; * } * Debug.Log(label); */ if (GameControlTB.battleEnded) { yield break; } } } else if (GameControlTB.GetMoveOrder() == _MoveOrder.FixedRandom || GameControlTB.GetMoveOrder() == _MoveOrder.FixedStatsBased) { for (int i = 0; i < allUnit.Count; i++) { UnitTB unit = allUnit[i]; //move the unit unitInAction = true; StartCoroutine(_MoveUnit(unit)); yield return(null); //wait while the unit is in action (making its move) //and while the game event is in progress (counter attack, death effect/animation, etc.) while (unit.InAction() || GameControlTB.IsActionInProgress() || unitInAction) { yield return(null); } if (GameControlTB.battleEnded) { yield break; } } } faction.allUnitMoved = true; yield return(new WaitForSeconds(0.5f)); EndTurn(); }