45 lines
1.2 KiB
C#
45 lines
1.2 KiB
C#
|
using PkmnLib.Dynamic.Models;
|
||
|
using PkmnLib.Dynamic.Models.Choices;
|
||
|
using PkmnLib.Static.Utils;
|
||
|
|
||
|
namespace PkmnLib.Dynamic.AI;
|
||
|
|
||
|
/// <summary>
|
||
|
/// An AI that makes random choices.
|
||
|
/// </summary>
|
||
|
public class RandomAI : PokemonAI
|
||
|
{
|
||
|
private IRandom _random;
|
||
|
|
||
|
/// <inheritdoc />
|
||
|
public RandomAI() : base("Random")
|
||
|
{
|
||
|
_random = new RandomImpl();
|
||
|
}
|
||
|
|
||
|
/// <inheritdoc />
|
||
|
public override ITurnChoice GetChoice(IBattle battle, IPokemon pokemon)
|
||
|
{
|
||
|
var moves = pokemon.Moves.Where(x => x?.CurrentPp > 0).ToList();
|
||
|
while (moves.Count > 0)
|
||
|
{
|
||
|
var move = moves[_random.GetInt(moves.Count)];
|
||
|
var targets = GetValidTargetsForMove(pokemon, move!).ToArray();
|
||
|
if (targets.Length == 0)
|
||
|
{
|
||
|
moves.Remove(move);
|
||
|
continue;
|
||
|
}
|
||
|
var target = targets[_random.GetInt(targets.Length)];
|
||
|
var moveTurnChoice = new MoveChoice(pokemon, move!, target.side, target.position);
|
||
|
if (battle.CanUse(moveTurnChoice))
|
||
|
{
|
||
|
return moveTurnChoice;
|
||
|
}
|
||
|
moves.Remove(move);
|
||
|
}
|
||
|
return new PassChoice(pokemon);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|