} //int is for a random number that breaks speed ties public void CalculateTurnOrder() { if (TurnOrder == null) { var activeMonsters = PlayerMonsters.Union(EnemyMonsters).ToList(); var randomNumbers = new List <int>(); foreach (var unused in activeMonsters) { var newRandom = UnityEngine.Random.Range(0, 1000); while (randomNumbers.Contains(newRandom)) { newRandom = UnityEngine.Random.Range(0, 1000); } randomNumbers.Add(newRandom); } using (var randomEnumerator = randomNumbers.GetEnumerator()) { TurnOrder = activeMonsters.Select(monster => { randomEnumerator.MoveNext(); return(new Tuple <Monster, int>(monster, randomEnumerator.Current)); }).ToList(); } } TurnOrder.RemoveAll(monster => !PlayerMonsters.Contains(monster.Item1) && !EnemyMonsters.Contains(monster.Item1)); TurnOrder = TurnOrder.OrderByDescending(monster => monster.Item1.MonsterData.SpeedScaling) .ThenBy(monster => monster.Item2).ToList(); }
private void GetNextTurn() { var nextTurnIndex = CurrentMonsterTurn != null?TurnOrder.FindIndex(monster => monster.Item1 == CurrentMonsterTurn.Item2) + 1 : 0; var nextMonster = TurnOrder[nextTurnIndex == TurnOrder.Count ? 0 : nextTurnIndex].Item1; CurrentMonsterTurn = new Tuple <Trainer, Monster>( PlayerMonsters.Contains(nextMonster) ? Player : Enemy, nextMonster); }
public void InitializeBattle(Trainer player, Trainer enemy) { _battleRoot?.SetActive(true); _fieldRoot?.SetActive(false); for (var i = 0; i < player.Team.ActiveMonsters.Count; i++) { player.Team.ActiveMonsters[i].transform.SetParent(_monsterPlacement[i].transform, false); player.Team.ActiveMonsters[i].gameObject.SetActive(true); PlayerMonsters.Add(player.Team.ActiveMonsters[i]); } for (var i = 0; i < enemy.Team.ActiveMonsters.Count; i++) { enemy.Team.ActiveMonsters[i].transform.SetParent(_monsterPlacement[i + 2].transform, false); enemy.Team.ActiveMonsters[i].gameObject.SetActive(true); EnemyMonsters.Add(enemy.Team.ActiveMonsters[i]); } CalculateTurnOrder(); BattleDisplay.Instance.Initialize(); }