From d2a82b5fe325456b551b600b2b7308754067c002 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Thu, 27 Aug 2026 17:11:12 +0200 Subject: [PATCH] Many more tests and fixes --- .claude/skills/bulbapedia-tests/SKILL.md | 6 + PkmnLib.Dynamic/AI/AIHelpers.cs | 3 + .../BattleFlow/MoveTurnExecutor.cs | 2 + PkmnLib.Dynamic/Models/ExecutingMove.cs | 8 + PkmnLib.Dynamic/ScriptHandling/Script.cs | 7 + .../HighJumpKickCrashOnSemiInvulnerable.json | 115 +++++ .../DataTests/ItemDataTests.cs | 33 ++ .../MoveVolatile/FireGrassPledgeMoveTests.cs | 222 +++++++++ .../MoveVolatile/FireWaterPledgeMoveTests.cs | 180 ++++++++ .../Scripts/Moves/FacadeTests.cs | 283 ++++++++++++ .../Scripts/Moves/FairyLockTests.cs | 210 +++++++++ .../Scripts/Moves/FakeOutTests.cs | 120 +++++ .../Scripts/Moves/FalseSwipeTests.cs | 82 ++++ .../Scripts/Moves/FeintTests.cs | 187 ++++++++ .../Scripts/Moves/FellStingerTests.cs | 116 +++++ .../Scripts/Moves/FinalGambitTests.cs | 102 +++++ .../Scripts/Moves/FireFangTests.cs | 224 ++++++++++ .../Scripts/Moves/FirePledgeTests.cs | 254 +++++++++++ .../Scripts/Moves/FireSpinTests.cs | 245 ++++++++++ .../Scripts/Moves/FirstImpressionTests.cs | 113 +++++ .../Scripts/Moves/FlailTests.cs | 113 +++++ .../Scripts/Moves/FlameBurstTests.cs | 288 ++++++++++++ .../Scripts/Moves/FlameWheelTests.cs | 185 ++++++++ .../Scripts/Moves/FlareBlitzTests.cs | 234 ++++++++++ .../Scripts/Moves/FlatterTests.cs | 142 ++++++ .../Scripts/Moves/FlingTests.cs | 142 ++++++ .../Scripts/Moves/FloralHealingTests.cs | 150 +++++++ .../Scripts/Moves/FlowerShieldTests.cs | 263 +++++++++++ .../Scripts/Moves/FlyTests.cs | 349 +++++++++++++++ .../Scripts/Moves/FlyingPressTests.cs | 96 ++++ .../Scripts/Moves/FocusEnergyTests.cs | 125 ++++++ .../Scripts/Moves/FocusPunchTests.cs | 229 ++++++++++ .../Scripts/Moves/FollowMeTests.cs | 421 ++++++++++++++++++ .../Scripts/Moves/ForesightTests.cs | 221 +++++++++ .../Scripts/Moves/ForestsCurseTests.cs | 226 ++++++++++ .../Scripts/Moves/FoulPlayTests.cs | 94 ++++ .../Scripts/Moves/FreezeDryTests.cs | 234 ++++++++++ .../Scripts/Moves/FreezeShockTests.cs | 131 ++++++ .../Scripts/Moves/FrustrationTests.cs | 106 +++++ .../Scripts/Moves/FuryCutterTests.cs | 173 +++++++ .../Scripts/Moves/FusionBoltTests.cs | 253 +++++++++++ .../Scripts/Moves/FusionFlareTests.cs | 253 +++++++++++ .../Scripts/Moves/FutureSightTests.cs | 360 +++++++++++++++ .../Scripts/Moves/GastroAcidTests.cs | 57 +++ .../Scripts/Moves/GearUpTests.cs | 229 ++++++++++ .../Scripts/Moves/GenesisSupernovaTests.cs | 65 +++ .../Scripts/Moves/GeomancyTests.cs | 144 ++++++ .../Scripts/Moves/GrassKnotTests.cs | 58 +++ .../Scripts/Moves/GrassPledgeTests.cs | 249 +++++++++++ .../Scripts/Moves/GrassyTerrainTests.cs | 66 +++ .../Scripts/Moves/GravityTests.cs | 251 +++++++++++ .../Scripts/Moves/GrowthTests.cs | 118 +++++ .../Scripts/Moves/GrudgeTests.cs | 89 ++++ .../Scripts/Moves/GuardSplitTests.cs | 123 +++++ .../Scripts/Moves/GuardSwapTests.cs | 145 ++++++ .../Scripts/Moves/GuardianOfAlolaTests.cs | 81 ++++ .../Scripts/Moves/GyroBallTests.cs | 108 +++++ .../Scripts/Moves/HealBellTests.cs | 193 ++++++++ .../Scripts/Moves/HealBlockTests.cs | 294 ++++++++++++ .../Scripts/Moves/HealingWishTests.cs | 275 ++++++++++++ .../Scripts/Moves/HeartSwapTests.cs | 165 +++++++ .../Scripts/Moves/HeatCrashTests.cs | 104 +++++ .../Scripts/Moves/HelpingHandTests.cs | 199 +++++++++ .../Scripts/Moves/HexTests.cs | 121 +++++ .../Scripts/Moves/HiddenPowerTests.cs | 104 ++++- .../Scripts/Moves/HighJumpKickTests.cs | 238 ++++++++++ .../Scripts/Moves/HyperspaceFuryTests.cs | 390 ++++++++++++++++ .../Scripts/Moves/IceBallTests.cs | 226 ++++++++++ .../Scripts/Moves/IceBurnTests.cs | 270 +++++++++++ .../Scripts/Moves/IceFangTests.cs | 224 ++++++++++ .../Scripts/Moves/ImprisonTests.cs | 161 +++++++ .../Scripts/Moves/IncinerateTests.cs | 158 +++++++ .../Moves/IncreasedCriticalStageTests.cs | 52 +++ .../Scripts/Moves/InfestationTests.cs | 313 +++++++++++++ .../Scripts/Moves/IngrainTests.cs | 237 ++++++++++ .../Scripts/Moves/InstructTests.cs | 169 +++++++ .../Scripts/Moves/IonDelugeTests.cs | 159 +++++++ .../Scripts/Moves/JudgementTests.cs | 189 ++++++++ .../Scripts/Moves/KingsShieldTests.cs | 385 ++++++++++++++++ .../Scripts/Moves/KnockOffTests.cs | 136 ++++++ .../Scripts/Moves/LaserFocusTests.cs | 134 ++++++ .../Scripts/Moves/LastResortTests.cs | 233 ++++++++++ .../Scripts/Moves/LeechSeedTests.cs | 205 +++++++++ .../Scripts/Moves/LightScreenTests.cs | 267 +++++++++++ .../Scripts/Moves/LockOnTests.cs | 158 +++++++ .../Scripts/Moves/LowKickTests.cs | 56 +++ .../Scripts/Moves/LuckyChantTests.cs | 111 +++++ .../Scripts/Moves/LunarDanceTests.cs | 242 ++++++++++ .../Scripts/Moves/MagicRoomTests.cs | 176 ++++++++ .../Scripts/Moves/MagmaStormTests.cs | 327 ++++++++++++++ .../Scripts/Moves/MagnetRiseTests.cs | 206 +++++++++ .../Scripts/Moves/MagneticFluxTests.cs | 244 ++++++++++ .../Scripts/Moves/MagnitudeTests.cs | 182 ++++++++ .../Scripts/Moves/MatBlockTests.cs | 202 +++++++++ .../Scripts/Moves/MeFirstTests.cs | 294 ++++++++++++ .../Scripts/Moves/MeanLookTests.cs | 188 ++++++++ .../Scripts/Moves/MementoTests.cs | 156 +++++++ .../Scripts/Moves/MetalBurstTests.cs | 301 +++++++++++++ .../Scripts/Moves/MetronomeTests.cs | 168 +++++++ .../Scripts/Moves/MimicTests.cs | 178 ++++++++ .../Scripts/Moves/MiracleEyeTests.cs | 133 ++++++ .../Scripts/Moves/MirrorCoatTests.cs | 278 ++++++++++++ .../Scripts/Moves/MirrorMoveTests.cs | 306 +++++++++++++ .../Scripts/Moves/MistTests.cs | 181 ++++++++ .../Scripts/Moves/MistyTerrainTests.cs | 247 ++++++++++ .../Scripts/Moves/MoongeistBeamTests.cs | 74 +++ .../Scripts/Moves/MoonlightTests.cs | 152 +++++++ .../Scripts/Moves/MudSportTests.cs | 172 +++++++ .../Scripts/Moves/MultiAttackTests.cs | 85 ++++ .../PkmnLib.Plugin.Gen7/Common/MoveFlags.cs | 1 + Plugins/PkmnLib.Plugin.Gen7/Data/Moves.jsonc | 13 +- .../Scripts/Abilities/Regenerator.cs | 2 +- .../Scripts/Battle/FairyLockEffect.cs | 6 +- .../Scripts/Battle/FutureSightEffect.cs | 73 ++- .../Scripts/Battle/IonDelugeEffect.cs | 7 +- .../Scripts/Battle/MagicRoomEffect.cs | 2 +- .../Scripts/Battle/MudSportEffect.cs | 2 +- .../Scripts/Moves/BaseChargeMove.cs | 5 + .../Scripts/Moves/ChangeUserStats.cs | 2 +- .../Scripts/Moves/DefenseCurl.cs | 13 + .../Scripts/Moves/Facade.cs | 20 +- .../Scripts/Moves/FalseSwipe.cs | 2 +- .../Scripts/Moves/Feint.cs | 22 +- .../Scripts/Moves/FellStinger.cs | 2 +- .../Scripts/Moves/FireSpin.cs | 8 +- .../Scripts/Moves/Flail.cs | 2 +- .../Scripts/Moves/FlameBurst.cs | 2 +- .../Scripts/Moves/FlareBlitz.cs | 14 +- .../Scripts/Moves/Fling.cs | 2 +- .../Scripts/Moves/FlowerShield.cs | 8 + .../Scripts/Moves/FocusEnergy.cs | 7 +- .../Scripts/Moves/FollowMe.cs | 19 +- .../Scripts/Moves/Foresight.cs | 9 +- .../Scripts/Moves/ForestsCurse.cs | 14 +- .../Scripts/Moves/FreezeDry.cs | 5 +- .../Scripts/Moves/FuryCutter.cs | 2 +- .../Scripts/Moves/FusionBolt.cs | 8 +- .../Scripts/Moves/FusionFlare.cs | 8 +- .../Scripts/Moves/FutureSight.cs | 23 +- .../Scripts/Moves/Gravity.cs | 14 +- .../Scripts/Moves/GuardianOfAlola.cs | 3 +- .../Scripts/Moves/GyroBall.cs | 7 +- .../Scripts/Moves/HealBell.cs | 5 +- .../Scripts/Moves/HealingWish.cs | 8 + .../Scripts/Moves/HeartSwap.cs | 4 +- .../Scripts/Moves/HeatCrash.cs | 8 +- .../PkmnLib.Plugin.Gen7/Scripts/Moves/Hex.cs | 2 +- .../Scripts/Moves/HiddenPower.cs | 12 +- .../Scripts/Moves/HighJumpKick.cs | 21 +- .../Scripts/Moves/HyperspaceFury.cs | 19 +- .../Scripts/Moves/IceBall.cs | 4 - .../Scripts/Moves/IceFang.cs | 16 +- .../Scripts/Moves/Imprison.cs | 2 +- .../Scripts/Moves/Incinerate.cs | 9 +- .../Scripts/Moves/Infestation.cs | 12 +- .../Scripts/Moves/Instruct.cs | 4 +- .../Scripts/Moves/Judgement.cs | 8 + .../Scripts/Moves/KingsShield.cs | 6 + .../Scripts/Moves/KnockOff.cs | 16 +- .../Scripts/Moves/LastResort.cs | 4 +- .../Scripts/Moves/LockOn.cs | 2 +- .../Scripts/Moves/LuckyChant.cs | 3 +- .../Scripts/Moves/LunarDance.cs | 5 +- .../Scripts/Moves/MagicRoom.cs | 9 +- .../Scripts/Moves/MagmaStorm.cs | 10 +- .../Scripts/Moves/MagnetRise.cs | 2 +- .../Scripts/Moves/MeFirst.cs | 10 +- .../Scripts/Moves/MeanLook.cs | 4 + .../Scripts/Moves/MetalBurst.cs | 20 +- .../Scripts/Moves/Metronome.cs | 6 +- .../Scripts/Moves/MiracleEye.cs | 6 + .../Scripts/Moves/MirrorCoat.cs | 22 +- .../Scripts/Moves/MirrorMove.cs | 10 +- .../Scripts/Moves/MultiAttack.cs | 7 + .../Scripts/Moves/TrickOrTreat.cs | 14 +- .../Scripts/Pokemon/ChargeBounceEffect.cs | 3 + .../Scripts/Pokemon/ChargeFlyEffect.cs | 5 +- .../Scripts/Pokemon/ChargeSkyDropEffect.cs | 3 + .../Scripts/Pokemon/Confusion.cs | 3 + .../Scripts/Pokemon/DefenseCurlEffect.cs | 14 + .../Scripts/Pokemon/DigEffect.cs | 3 + .../Scripts/Pokemon/DiveEffect.cs | 3 + .../Scripts/Pokemon/FireSpinEffect.cs | 25 +- .../Scripts/Pokemon/FocusEnergyEffect.cs | 15 + .../Scripts/Pokemon/FocusPunchEffect.cs | 4 + .../Scripts/Pokemon/HasHadTypeAddedEffect.cs | 15 + .../Scripts/Pokemon/HelpingHandEffect.cs | 11 +- .../Scripts/Pokemon/ImprisonEffect.cs | 3 + .../Scripts/Pokemon/InfestationEffect.cs | 10 +- .../Scripts/Pokemon/IngrainEffect.cs | 12 +- .../{KingsShield.cs => KingsShieldEffect.cs} | 11 +- .../Scripts/Pokemon/LaserFocusEffect.cs | 13 +- .../Scripts/Pokemon/LockOnEffect.cs | 14 +- .../Scripts/Pokemon/LuckyChantEffect.cs | 22 - .../Scripts/Pokemon/MagmaStormEffect.cs | 28 +- .../Scripts/Pokemon/MagnetRiseEffect.cs | 5 +- .../Scripts/Pokemon/PhantomForceCharge.cs | 3 + .../Scripts/Pokemon/ShadowForceCharge.cs | 3 + .../Scripts/Side/FollowMeEffect.cs | 42 ++ .../Scripts/Side/LuckyChantEffect.cs | 21 + .../Scripts/Side/MistEffect.cs | 13 +- .../Scripts/Side/RainbowEffect.cs | 2 +- .../Scripts/Terrain/MistyTerrain.cs | 10 +- .../Scripts/Utils/CopyableMoves.cs | 63 +++ 204 files changed, 20255 insertions(+), 242 deletions(-) create mode 100644 PkmnLib.Tests/Integration/Tests/HighJumpKickCrashOnSemiInvulnerable.json create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/DataTests/ItemDataTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/MoveVolatile/FireGrassPledgeMoveTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/MoveVolatile/FireWaterPledgeMoveTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FacadeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FairyLockTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FakeOutTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FalseSwipeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FeintTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FellStingerTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FinalGambitTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FireFangTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FirePledgeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FireSpinTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FirstImpressionTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlailTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlameBurstTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlameWheelTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlareBlitzTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlatterTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlingTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FloralHealingTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlowerShieldTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlyTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FlyingPressTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FocusEnergyTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FocusPunchTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FollowMeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/ForesightTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/ForestsCurseTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FoulPlayTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FreezeDryTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FreezeShockTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FrustrationTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FuryCutterTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FusionBoltTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FusionFlareTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/FutureSightTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GastroAcidTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GearUpTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GenesisSupernovaTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GeomancyTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GrassKnotTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GrassPledgeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GrassyTerrainTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GravityTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GrowthTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GrudgeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GuardSplitTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GuardSwapTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GuardianOfAlolaTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/GyroBallTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HealBellTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HealBlockTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HealingWishTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HeartSwapTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HeatCrashTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HelpingHandTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HexTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HighJumpKickTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/HyperspaceFuryTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/IceBallTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/IceBurnTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/IceFangTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/ImprisonTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/IncinerateTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/IncreasedCriticalStageTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/InfestationTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/IngrainTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/InstructTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/IonDelugeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/JudgementTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/KingsShieldTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/KnockOffTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/LaserFocusTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/LastResortTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/LeechSeedTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/LightScreenTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/LockOnTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/LowKickTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/LuckyChantTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/LunarDanceTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MagicRoomTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MagmaStormTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MagnetRiseTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MagneticFluxTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MagnitudeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MatBlockTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MeFirstTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MeanLookTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MementoTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MetalBurstTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MetronomeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MimicTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MiracleEyeTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MirrorCoatTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MirrorMoveTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MistTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MistyTerrainTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MoongeistBeamTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MoonlightTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7.Tests/Scripts/Moves/MudSportTests.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/DefenseCurl.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/DefenseCurlEffect.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/FocusEnergyEffect.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/HasHadTypeAddedEffect.cs rename Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/{KingsShield.cs => KingsShieldEffect.cs} (51%) delete mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Pokemon/LuckyChantEffect.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/FollowMeEffect.cs create mode 100644 Plugins/PkmnLib.Plugin.Gen7/Scripts/Side/LuckyChantEffect.cs diff --git a/.claude/skills/bulbapedia-tests/SKILL.md b/.claude/skills/bulbapedia-tests/SKILL.md index 57d34db..4c5aa79 100644 --- a/.claude/skills/bulbapedia-tests/SKILL.md +++ b/.claude/skills/bulbapedia-tests/SKILL.md @@ -107,6 +107,12 @@ Follow the existing conventions — `Scripts/Moves/DrainTests.cs` and division, overflow guards). - Cover the negative cases the description implies (non-contact move → no trigger, holding an item → no boost, attacker already fainted, null `BattleData`, ...). +- **Write the test even when the behavior is not implemented at all.** A described behavior the + script simply lacks (a missing check, a missing effect, a missing interface) still gets a test + encoding the correct Gen VII behavior — it will fail and be marked `[TestFailing]` in step 5, + which is the point: the gap stays tracked in the suite instead of in a report nobody rereads. + "Not implemented" is never a reason to skip writing the test, and reporting a known deviation + as a prose note instead of a `[TestFailing]` test is not acceptable. - `LibraryHelpers.LoadLibrary()` is available when a test genuinely needs the full Gen7 library (e.g. looking up real move data); prefer pure mocks otherwise. diff --git a/PkmnLib.Dynamic/AI/AIHelpers.cs b/PkmnLib.Dynamic/AI/AIHelpers.cs index 2d76774..147b2dd 100644 --- a/PkmnLib.Dynamic/AI/AIHelpers.cs +++ b/PkmnLib.Dynamic/AI/AIHelpers.cs @@ -40,6 +40,9 @@ public static class AIHelpers /// public uint Damage => 0; + /// + public bool HasExecuted => false; + /// public TypeIdentifier? Type { get; init; } diff --git a/PkmnLib.Dynamic/BattleFlow/MoveTurnExecutor.cs b/PkmnLib.Dynamic/BattleFlow/MoveTurnExecutor.cs index a3b1c83..0a8be67 100644 --- a/PkmnLib.Dynamic/BattleFlow/MoveTurnExecutor.cs +++ b/PkmnLib.Dynamic/BattleFlow/MoveTurnExecutor.cs @@ -142,6 +142,7 @@ public static class MoveTurnExecutor if (isInvulnerable) { battle.EventHook.Invoke(new MoveInvulnerableEvent(executingMove, target)); + executingMove.RunScriptHook(x => x.OnAfterHits(executingMove, target)); return; } @@ -311,6 +312,7 @@ public static class MoveTurnExecutor } } } + hitData.HasExecuted = true; } if (numberOfHits == 0) diff --git a/PkmnLib.Dynamic/Models/ExecutingMove.cs b/PkmnLib.Dynamic/Models/ExecutingMove.cs index dd71c42..2a632e5 100644 --- a/PkmnLib.Dynamic/Models/ExecutingMove.cs +++ b/PkmnLib.Dynamic/Models/ExecutingMove.cs @@ -32,6 +32,11 @@ public interface IHitData /// uint Damage { get; } + /// + /// Gets set to true after the hit has fully executed, and has not been interrupted by anything. + /// + bool HasExecuted { get; } + /// /// The type of the hit. Null if the move is typeless. /// @@ -78,6 +83,9 @@ public record HitData : IHitData /// public uint Damage { get; internal set; } + /// + public bool HasExecuted { get; internal set; } + /// public TypeIdentifier? Type { get; internal set; } diff --git a/PkmnLib.Dynamic/ScriptHandling/Script.cs b/PkmnLib.Dynamic/ScriptHandling/Script.cs index 2fa8cf2..9b82830 100644 --- a/PkmnLib.Dynamic/ScriptHandling/Script.cs +++ b/PkmnLib.Dynamic/ScriptHandling/Script.cs @@ -14,6 +14,13 @@ public abstract class Script : IDeepCloneable, IScriptOnRemove { internal event Action