using System.Collections;
namespace PkmnLib.Dynamic.Models;
///
/// A collection of Pokemon.
///
public interface IPokemonParty : IReadOnlyList
{
///
/// Sets the Pokemon at an index to a Pokemon, returning the old Pokemon.
///
IPokemon? SwapInto(IPokemon pokemon, int index);
///
/// Swaps two Pokemon in the party around.
///
void Swap(int index1, int index2);
///
/// Whether the party has any Pokemon that could be used in battle.
///
///
/// This will return false if all Pokemon are fainted, or eggs, etc.
///
bool HasUsablePokemon();
}
///
public class PokemonParty : IPokemonParty
{
private readonly IPokemon?[] _pokemon;
///
public PokemonParty(int size)
{
_pokemon = new IPokemon[size];
}
///
/// Sets the Pokemon at an index to a Pokemon, returning the old Pokemon.
///
public IPokemon? SwapInto(IPokemon? pokemon, int index)
{
var old = _pokemon[index];
_pokemon[index] = pokemon;
return old;
}
///
/// Swaps two Pokemon in the party around.
///
public void Swap(int index1, int index2) =>
(_pokemon[index1], _pokemon[index2]) = (_pokemon[index2], _pokemon[index1]);
///
public bool HasUsablePokemon() => _pokemon.Any(p => p is { IsUsable: true });
///
public IEnumerator GetEnumerator() => ((IEnumerable)_pokemon).GetEnumerator();
///
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
///
public int Count => _pokemon.Length;
///
public IPokemon? this[int index] => _pokemon[index];
public void Pack()
{
// Pack the party so that all Pokémon are at the front.
for (var i = 0; i < _pokemon.Length; i++)
{
if (_pokemon[i] != null)
continue;
for (var j = i + 1; j < _pokemon.Length; j++)
{
if (_pokemon[j] == null)
continue;
Swap(i, j);
break;
}
}
}
}