using System.Collections; using PkmnLib.Static.Utils; namespace PkmnLib.Dynamic.Models; /// <summary> /// A collection of Pokemon. /// </summary> public interface IPokemonParty : IReadOnlyList<IPokemon?>, IDeepCloneable { event EventHandler<(IPokemon?, int index)>? OnSwapInto; event EventHandler<(int index1, int index2)>? OnSwap; /// <summary> /// Sets the Pokemon at an index to a Pokemon, returning the old Pokemon. /// </summary> IPokemon? SwapInto(IPokemon? pokemon, int index); /// <summary> /// Swaps two Pokemon in the party around. /// </summary> void Swap(int index1, int index2); /// <summary> /// Whether the party has any Pokemon that could be used in battle. /// </summary> /// <remarks> /// This will return false if all Pokemon are fainted, or eggs, etc. /// </remarks> bool HasUsablePokemon(); /// <summary> /// Packs the party so that all Pokémon are at the front, and the empty slots are at the back. /// </summary> void Pack(); } /// <inheritdoc /> public class PokemonParty : IPokemonParty { private readonly IPokemon?[] _pokemon; /// <inheritdoc cref="PokemonParty" /> public PokemonParty(int size) { _pokemon = new IPokemon[size]; } /// <inheritdoc /> public event EventHandler<(IPokemon?, int index)>? OnSwapInto; /// <inheritdoc /> public event EventHandler<(int index1, int index2)>? OnSwap; /// <summary> /// Sets the Pokemon at an index to a Pokemon, returning the old Pokemon. /// </summary> public IPokemon? SwapInto(IPokemon? pokemon, int index) { var old = _pokemon[index]; _pokemon[index] = pokemon; OnSwapInto?.Invoke(this, (pokemon, index)); return old; } /// <summary> /// Swaps two Pokemon in the party around. /// </summary> public void Swap(int index1, int index2) { (_pokemon[index1], _pokemon[index2]) = (_pokemon[index2], _pokemon[index1]); OnSwap?.Invoke(this, (index1, index2)); } /// <inheritdoc /> public bool HasUsablePokemon() => _pokemon.Any(p => p is { IsUsable: true }); /// <inheritdoc /> public IEnumerator<IPokemon?> GetEnumerator() => ((IEnumerable<IPokemon?>)_pokemon).GetEnumerator(); /// <inheritdoc /> IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); /// <inheritdoc /> public int Count => _pokemon.Length; /// <inheritdoc /> public IPokemon? this[int index] => _pokemon[index]; /// <inheritdoc /> 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; } } } }