/// <summary> /// Gets a List of ids from the current and next turns. /// </summary> /// <returns></returns> public IReadOnlyList <int>[] GetRoundOrderIds() { var displayCharacters = new List <int> [2]; displayCharacters[0] = new List <int>(CurrentRoundOrder.Select(chara => chara.Id)); displayCharacters[1] = new List <int>(NextRoundOrder.Select(chara => chara.Id)); return(displayCharacters); }
/// <summary> /// Makes a character wait until the end of the round to act. /// </summary> /// <param name="character">The character that is waiting.</param> internal void BeginWait(Character character) { CurrentRoundOrder.Add(character); if (!_anyWaitingCharacters) { _anyWaitingCharacters = true; _waitingCharactersIndex = CurrentRoundOrder.Count() - 1; } }
/// <summary> /// Potentially changes the round order of a round if a character has it's speed changed. /// </summary> /// <param name="characterId">The Id of the character whose speed changed.</param> /// <param name="RoundOrder">The round order list to change the order of.</param> /// <param name="speedChange">The amount that the character's speed is changed by.</param> private void ChangeRoundOrder(int characterId, List <Character> RoundOrder, int speedChange) { int startIndex = CurrentRoundOrder.FindIndex(chr => chr.Id == characterId); if (speedChange > 0) { bool foundMaxDisplacement = false; // Can never surpass current turn character while (startIndex > 1 && !foundMaxDisplacement) { if (RoundOrder[startIndex - 1].CurrentStats.Speed < RoundOrder[startIndex].CurrentStats.Speed) { Character temp = RoundOrder[startIndex - 1]; RoundOrder[startIndex - 1] = RoundOrder[startIndex]; RoundOrder[startIndex] = temp; startIndex--; } else { foundMaxDisplacement = true; } } } else if (speedChange < 0) { // If there are any waiting characters, can't be slower than them int maxIndex = (_anyWaitingCharacters) ? _waitingCharactersIndex - 1 : RoundOrder.Count() - 1; // Character is already the last to act in the round, can't be slower than anyone else if (startIndex >= maxIndex) { return; } bool foundMaxDisplacement = false; while (startIndex < maxIndex && !foundMaxDisplacement) { if (RoundOrder[startIndex + 1].CurrentStats.Speed > RoundOrder[startIndex].CurrentStats.Speed) { Character temp = RoundOrder[startIndex + 1]; RoundOrder[startIndex + 1] = RoundOrder[startIndex]; RoundOrder[startIndex] = temp; startIndex++; } else { foundMaxDisplacement = true; } } } }
/// <summary> /// Called whenever a character's turn has ended. Removes that character from the current round order. /// </summary> internal void EndTurn() { // If this is the last turn of the round, start the next round and prepare the round after if (CurrentRoundOrder.Count == 1) { CurrentRoundOrder = new List <Character>(NextRoundOrder); NextRoundOrder = DetermineTurnOrder(); _anyWaitingCharacters = false; _waitingCharactersIndex = -1; } // Remove the current turn from the round order list else { var indecesToCull = new List <int>(); int maxIndex = CurrentRoundOrder.Count - 1; if (_waitingCharactersIndex > 0 && _anyWaitingCharacters) { _waitingCharactersIndex--; } Character charToMove = null; for (int i = maxIndex; i >= 0; i--) { var temp = charToMove; charToMove = CurrentRoundOrder[i]; CurrentRoundOrder[i] = temp; if (CurrentRoundOrder[i] == null || CurrentRoundOrder[i].CurrentHealth <= 0) { indecesToCull.Add(i); } } foreach (var index in indecesToCull) { CurrentRoundOrder.RemoveAt(index); } } }
/// <summary> /// Called whenever a character has died. Removes that character from the current and next rounds. /// </summary> /// <param name="args"></param> internal void CharactersDied(CharactersDiedEventArgs args) { CurrentRoundOrder.RemoveAll(character => args.DyingCharacters.Contains(character)); NextRoundOrder.RemoveAll(character => args.DyingCharacters.Contains(character)); }