89 lines
4.1 KiB
C#
89 lines
4.1 KiB
C#
using PkmnLib.Dynamic.Models;
|
|
using PkmnLib.Static;
|
|
using PkmnLib.Static.Moves;
|
|
using PkmnLib.Static.Utils;
|
|
|
|
namespace PkmnLib.Dynamic.AI.Explicit;
|
|
|
|
public partial class ExplicitAI
|
|
{
|
|
private static readonly StringKey MistyTerrainName = "misty_terrain";
|
|
private static readonly StringKey PoisonName = "poison";
|
|
private static readonly StringKey SteelName = "steel";
|
|
private static readonly StringKey ImmunityName = "immunity";
|
|
private static readonly StringKey PastelVeilName = "pastel_veil";
|
|
private static readonly StringKey FlowerVeilName = "flower_veil";
|
|
private static readonly StringKey LeafGuardName = "leaf_guard";
|
|
private static readonly StringKey ComatoseName = "comatose";
|
|
private static readonly StringKey ShieldsDownName = "shields_down";
|
|
private static readonly StringKey HarshSunlightName = "harsh_sunlight";
|
|
private static readonly StringKey DesolateLandsName = "desolate_lands";
|
|
private static readonly StringKey BulletproofName = "bulletproof";
|
|
private static readonly StringKey FlashFireName = "flash_fire";
|
|
private static readonly StringKey LightningRodName = "lightning_rod";
|
|
private static readonly StringKey MotorDriveName = "motor_drive";
|
|
private static readonly StringKey VoltAbsorbName = "volt_absorb";
|
|
private static readonly StringKey SapSipperName = "sap_sipper";
|
|
private static readonly StringKey SoundproofName = "soundproof";
|
|
private static readonly StringKey StormDrainName = "storm_drain";
|
|
private static readonly StringKey WaterAbsorbName = "water_absorb";
|
|
private static readonly StringKey DrySkinName = "dry_skin";
|
|
private static readonly StringKey TelepathyName = "telepathy";
|
|
private static readonly StringKey WonderGuardName = "wonder_guard";
|
|
private static readonly StringKey FireName = "fire";
|
|
private static readonly StringKey ElectricName = "electric";
|
|
private static readonly StringKey WaterName = "water";
|
|
|
|
private static bool CanBePoisoned(IPokemon pokemon, IBattle battle)
|
|
{
|
|
if (battle.TerrainName == MistyTerrainName)
|
|
return false;
|
|
if (pokemon.Types.Any(x => x.Name == PoisonName || x.Name == SteelName))
|
|
return false;
|
|
if (pokemon.ActiveAbility?.Name == ImmunityName)
|
|
return false;
|
|
if (pokemon.ActiveAbility?.Name == PastelVeilName)
|
|
return false;
|
|
if (pokemon.ActiveAbility?.Name == FlowerVeilName && pokemon.Types.Any(x => x.Name == GrassName))
|
|
return false;
|
|
if ((pokemon.ActiveAbility?.Name == LeafGuardName && battle.WeatherName == HarshSunlightName) ||
|
|
battle.WeatherName == DesolateLandsName)
|
|
return false;
|
|
if (pokemon.ActiveAbility?.Name == ComatoseName && pokemon.Species.Name == "komala")
|
|
return false;
|
|
if (pokemon.ActiveAbility?.Name == ShieldsDownName && pokemon.Species.Name == "minior" &&
|
|
pokemon.Form.Name.Contains("-meteor"))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
private static bool CanAbsorbMove(IPokemon pokemon, IMoveData move, TypeIdentifier moveType, IBattle battle)
|
|
{
|
|
if (pokemon.ActiveAbility == null)
|
|
return false;
|
|
|
|
var abilityName = pokemon.ActiveAbility.Name;
|
|
|
|
if (abilityName == BulletproofName)
|
|
return move.HasFlag("bomb");
|
|
if (abilityName == FlashFireName)
|
|
return moveType.Name == FireName;
|
|
if (abilityName == LightningRodName || abilityName == MotorDriveName || abilityName == VoltAbsorbName)
|
|
return moveType.Name == ElectricName;
|
|
if (abilityName == SapSipperName)
|
|
return moveType.Name == GrassName;
|
|
if (abilityName == SoundproofName)
|
|
return move.HasFlag("sound");
|
|
if (abilityName == StormDrainName || abilityName == WaterAbsorbName || abilityName == DrySkinName)
|
|
return moveType.Name == WaterName;
|
|
if (abilityName == TelepathyName)
|
|
return false;
|
|
if (abilityName == WonderGuardName)
|
|
{
|
|
var effectiveness = battle.Library.StaticLibrary.Types.GetEffectiveness(moveType, pokemon.Types);
|
|
return effectiveness <= 1.0f;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
} |