Move all battle state from IPokemon to an ephemeral IBattlePokemon wrapper
This commit is contained in:
@@ -26,70 +26,69 @@ public abstract class PokemonAI
|
||||
/// <summary>
|
||||
/// Gets the choice for the Pokémon.
|
||||
/// </summary>
|
||||
public abstract ITurnChoice GetChoice(IBattle battle, IPokemon pokemon);
|
||||
public abstract ITurnChoice GetChoice(IBattle battle, IBattlePokemon pokemon);
|
||||
|
||||
/// <summary>
|
||||
/// For a given user and move, returns the valid targets for that move.
|
||||
/// </summary>
|
||||
public IEnumerable<(byte side, byte position)> GetValidTargetsForMove(IPokemon user, ILearnedMove move)
|
||||
public IEnumerable<(byte side, byte position)> GetValidTargetsForMove(IBattlePokemon user, ILearnedMove move)
|
||||
{
|
||||
var userBattleData = user.BattleData!;
|
||||
switch (move.MoveData.Target)
|
||||
{
|
||||
case MoveTarget.Adjacent:
|
||||
yield return (GetOppositeSide(userBattleData.SideIndex), userBattleData.Position);
|
||||
yield return (GetOppositeSide(user.SideIndex), user.Position);
|
||||
break;
|
||||
case MoveTarget.AdjacentAlly:
|
||||
if (userBattleData.Position > 0)
|
||||
yield return (userBattleData.SideIndex, (byte)(userBattleData.Position - 1));
|
||||
if (userBattleData.Battle.PositionsPerSide > userBattleData.Position + 1)
|
||||
yield return (userBattleData.SideIndex, (byte)(userBattleData.Position + 1));
|
||||
if (user.Position > 0)
|
||||
yield return (user.SideIndex, (byte)(user.Position - 1));
|
||||
if (user.Battle.PositionsPerSide > user.Position + 1)
|
||||
yield return (user.SideIndex, (byte)(user.Position + 1));
|
||||
break;
|
||||
case MoveTarget.AdjacentAllySelf:
|
||||
if (userBattleData.Position > 0)
|
||||
yield return (userBattleData.SideIndex, (byte)(userBattleData.Position - 1));
|
||||
if (userBattleData.Battle.PositionsPerSide > userBattleData.Position + 1)
|
||||
yield return (userBattleData.SideIndex, (byte)(userBattleData.Position + 1));
|
||||
yield return (userBattleData.SideIndex, userBattleData.Position);
|
||||
if (user.Position > 0)
|
||||
yield return (user.SideIndex, (byte)(user.Position - 1));
|
||||
if (user.Battle.PositionsPerSide > user.Position + 1)
|
||||
yield return (user.SideIndex, (byte)(user.Position + 1));
|
||||
yield return (user.SideIndex, user.Position);
|
||||
break;
|
||||
case MoveTarget.AdjacentOpponent:
|
||||
yield return (GetOppositeSide(userBattleData.SideIndex), userBattleData.Position);
|
||||
if (userBattleData.Position > 0)
|
||||
yield return (GetOppositeSide(userBattleData.SideIndex), (byte)(userBattleData.Position - 1));
|
||||
if (userBattleData.Battle.PositionsPerSide > userBattleData.Position + 1)
|
||||
yield return (GetOppositeSide(userBattleData.SideIndex), (byte)(userBattleData.Position + 1));
|
||||
yield return (GetOppositeSide(user.SideIndex), user.Position);
|
||||
if (user.Position > 0)
|
||||
yield return (GetOppositeSide(user.SideIndex), (byte)(user.Position - 1));
|
||||
if (user.Battle.PositionsPerSide > user.Position + 1)
|
||||
yield return (GetOppositeSide(user.SideIndex), (byte)(user.Position + 1));
|
||||
break;
|
||||
case MoveTarget.All:
|
||||
yield return (userBattleData.SideIndex, userBattleData.Position);
|
||||
yield return (user.SideIndex, user.Position);
|
||||
break;
|
||||
case MoveTarget.AllAdjacent:
|
||||
yield return (userBattleData.SideIndex, userBattleData.Position);
|
||||
yield return (user.SideIndex, user.Position);
|
||||
break;
|
||||
case MoveTarget.AllAdjacentOpponent:
|
||||
yield return (GetOppositeSide(userBattleData.SideIndex), userBattleData.Position);
|
||||
yield return (GetOppositeSide(user.SideIndex), user.Position);
|
||||
break;
|
||||
case MoveTarget.AllAlly:
|
||||
yield return (userBattleData.SideIndex, userBattleData.Position);
|
||||
yield return (user.SideIndex, user.Position);
|
||||
break;
|
||||
case MoveTarget.AllOpponent:
|
||||
yield return (GetOppositeSide(userBattleData.SideIndex), userBattleData.Position);
|
||||
yield return (GetOppositeSide(user.SideIndex), user.Position);
|
||||
break;
|
||||
case MoveTarget.Any:
|
||||
foreach (var side in userBattleData.Battle.Sides)
|
||||
foreach (var side in user.Battle.Sides)
|
||||
{
|
||||
foreach (var pokemon in side.Pokemon)
|
||||
{
|
||||
if (pokemon?.BattleData == null)
|
||||
if (pokemon == null)
|
||||
continue;
|
||||
yield return (side.Index, pokemon.BattleData!.Position);
|
||||
yield return (side.Index, pokemon.Position);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MoveTarget.RandomOpponent:
|
||||
yield return (GetOppositeSide(userBattleData.SideIndex), userBattleData.Position);
|
||||
yield return (GetOppositeSide(user.SideIndex), user.Position);
|
||||
break;
|
||||
case MoveTarget.SelfUse:
|
||||
yield return (userBattleData.SideIndex, userBattleData.Position);
|
||||
yield return (user.SideIndex, user.Position);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
|
||||
Reference in New Issue
Block a user