From 4dceefb3994a3830c78ca372152178f911d2a76b Mon Sep 17 00:00:00 2001 From: aseemrai Date: Mon, 23 Mar 2026 19:43:00 -0400 Subject: [PATCH 1/5] Create AI_GOATFormat.ydk --- Decks/AI_GOATFormat.ydk | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Decks/AI_GOATFormat.ydk diff --git a/Decks/AI_GOATFormat.ydk b/Decks/AI_GOATFormat.ydk new file mode 100644 index 00000000..e31b9967 --- /dev/null +++ b/Decks/AI_GOATFormat.ydk @@ -0,0 +1,44 @@ +#created by ... +#main +70781052 +67284908 +11091375 +69140098 +69140098 +69140098 +14531242 +39256679 +11549357 +15025844 +13039848 +77585513 +40659562 +88240808 +88240808 +40133511 +7572887 +74131780 +130000045 +71413901 +54652250 +19613556 +55144522 +66788016 +70368879 +70368879 +72302403 +79571449 +5318639 +40619825 +56747793 +70828912 +83746708 +44095762 +53582587 +60082869 +83555667 +83968380 +97077563 +14315573 +#extra +!side From 003dec80869cf0ad6caf45244bf0512782066c00 Mon Sep 17 00:00:00 2001 From: aseemrai Date: Mon, 23 Mar 2026 20:13:12 -0400 Subject: [PATCH 2/5] Create GOATFormatExecutor.cs --- Game/AI/Decks/GOATFormatExecutor.cs | 124 ++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 Game/AI/Decks/GOATFormatExecutor.cs diff --git a/Game/AI/Decks/GOATFormatExecutor.cs b/Game/AI/Decks/GOATFormatExecutor.cs new file mode 100644 index 00000000..673d0d67 --- /dev/null +++ b/Game/AI/Decks/GOATFormatExecutor.cs @@ -0,0 +1,124 @@ +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("AI_GOATFormat", "AI_GOATFormat")] + public class GoatFormatExecutor : DefaultExecutor + { + public class CardId + { + public const int Tsukuyomi = 70781052; + public const int BlackLusterSoldier_EnvoyOfTheBeginning = 72302403; + public const int Jinzo = 83968380; + public const int AirknightParsath = 13039848; + public const int ThunderDragon = 69140098; + public const int KycooTheGhostDestroyer = 39256679; + public const int BladeKnight = 11549357; + public const int BreakerTheMagicalWarrior = 71413901; + public const int SkilledDarkMage = 40659562; + public const int SkilledWhiteMage = 77585513; + public const int AbyssSoldier = 40133511; + public const int AsuraPriest = 14531242; + public const int ExiledForce = 15025844; + public const int DDMasterOfPuppets = 11091375; + public const int MagicianOfFaith = 88240808; + public const int Sangan = 7572887; + public const int SinisterSerpent = 74131780; + public const int MorphingJar = 33508719; // ID 33508719 + + // Spells + public const int PotOfGreed = 55144522; + public const int GracefulCharity = 79571449; + public const int DelinquentDuo = 44095762; + public const int HeavyStorm = 19613556; + public const int MysticalSpaceTyphoon = 5318639; + public const int SnatchSteal = 45986603; // Corrected ID 45986603 + public const int NoblemanOfCrossout = 70828912; + public const int Metamorphosis = 40619825; + public const int Scapegoat = 70368879; + public const int PrematureBurial = 70828912; + + // Traps + public const int MirrorForce = 44095762; + public const int TorrentialTribute = 53582587; + public const int RingOfDestruction = 83555667; + public const int CallOfTheHaunted = 97077563; + public const int DustTornado = 60082869; + public const int SakuretsuArmor = 56747793; + public const int Ceasefire = 36468556; // 14315573 + } + + public GoatFormatExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // Priority 1: Game-Winning Spells + AddExecutor(ExecutorType.Activate, CardId.PotOfGreed); + AddExecutor(ExecutorType.Activate, CardId.GracefulCharity, DiscardSerpentLogic); + AddExecutor(ExecutorType.Activate, CardId.DelinquentDuo); + + // Priority 2: Board Clears + AddExecutor(ExecutorType.Activate, CardId.HeavyStorm, DefaultHeavyStorm); + AddExecutor(ExecutorType.Activate, CardId.NoblemanOfCrossout, DefaultNoblemanOfCrossout); + AddExecutor(ExecutorType.Activate, CardId.ExiledForce, DefaultExiledForce); + + // Priority 3: Special Summons + AddExecutor(ExecutorType.SpSummon, CardId.BlackLusterSoldier_EnvoyOfTheBeginning, BLSSummon); + AddExecutor(ExecutorType.Activate, CardId.BlackLusterSoldier_EnvoyOfTheBeginning, BLSEffect); + AddExecutor(ExecutorType.Activate, CardId.Metamorphosis, MetaLogic); + + // Priority 4: Deck Thinning & Utility + AddExecutor(ExecutorType.Activate, CardId.ThunderDragon); + AddExecutor(ExecutorType.Summon, CardId.BreakerTheMagicalWarrior, DefaultBreakerTheMagicalWarrior); + AddExecutor(ExecutorType.Summon, CardId.Jinzo); + + // Priority 5: Normal Summons + AddExecutor(ExecutorType.Summon, CardId.BladeKnight); + AddExecutor(ExecutorType.Summon, CardId.KycooTheGhostDestroyer); + AddExecutor(ExecutorType.Summon, CardId.AbyssSoldier); + AddExecutor(ExecutorType.MonsterSet, CardId.MagicianOfFaith); + AddExecutor(ExecutorType.MonsterSet, CardId.Sangan); + + // Priority 6: Traps + AddExecutor(ExecutorType.Activate, CardId.MirrorForce, DefaultUniqueTrap); + AddExecutor(ExecutorType.Activate, CardId.TorrentialTribute, DefaultTorrentialTribute); + AddExecutor(ExecutorType.Activate, CardId.RingOfDestruction, DefaultRingOfDestruction); + + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.SpellSet, DefaultSpellSet); + } + + private bool DiscardSerpentLogic() + { + // Discard Sinister Serpent (74131780) or Thunder Dragon (69140098) first + AI.SelectCard(new[] { CardId.SinisterSerpent, CardId.ThunderDragon }); + return true; + } + + private bool BLSSummon() + { + return Bot.Graveyard.GetMatchingCardsCount(c => c.HasAttribute(CardAttribute.Light)) >= 1 + && Bot.Graveyard.GetMatchingCardsCount(c => c.HasAttribute(CardAttribute.Dark)) >= 1; + } + + private bool BLSEffect() + { + ClientCard target = Enemy.GetMonsters().GetHighestAttackMonster(); + if (target != null && target.Attack >= 2400) { + AI.SelectOption(0); // Banish + AI.SelectCard(target); + return true; + } + return true; // Attack twice + } + + private bool MetaLogic() + { + // Use Metamorphosis on Scapegoat tokens (70368879) for Thousand-Eyes Restrict + return Bot.HasInMonstersZone(CardId.Scapegoat); + } + } +} From 8cc4428c768500c003e68c4055895922594b66fc Mon Sep 17 00:00:00 2001 From: aseemrai Date: Mon, 23 Mar 2026 21:43:14 -0400 Subject: [PATCH 3/5] Create GOATFormatExecutor --- Game/AI/Decks/GOATFormatExecutor | 243 +++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 Game/AI/Decks/GOATFormatExecutor diff --git a/Game/AI/Decks/GOATFormatExecutor b/Game/AI/Decks/GOATFormatExecutor new file mode 100644 index 00000000..8de9344a --- /dev/null +++ b/Game/AI/Decks/GOATFormatExecutor @@ -0,0 +1,243 @@ +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("GOATFormat", "AI_GOATFormat", "Easy")] + public class UltraBeatdownExecutor : DefaultExecutor + { + public class CardId + { + public const int SummonedSkull = 70781052; + public const int Jinzo = 77585513; + public const int LabyrinthWall = 67284908; + public const int GuardianSphinx = 40659562; + public const int LusterDragon = 11091375; + public const int GeminiElf = 69140098; + public const int KycooTheGhostDestroyer = 88240808; + public const int Opticlops = 14531242; + public const int BreakerTheMagicalWarrior = 71413901; + public const int BetaTheMagnetWarrior = 39256679; + public const int GammaTheMagnetWarrior = 11549357; + public const int BazooTheSoulEater = 40133511; + public const int ExiledForce = 74131780; + public const int ManEaterBug = 54652250; + public const int MysticalElf = 15025844; + public const int GiantSoldierOfStone = 13039848; + public const int Sangan = 7572887; + public const int SanganAlt = 130000045; + + // Spells + public const int PotOfGreed = 55144522; + public const int GracefulCharity = 79571449; + public const int UpstartGoblin = 70368879; + public const int HeavyStorm = 19613556; + public const int MysticalSpaceTyphoon = 5318639; + public const int UnitedWeStand = 56747793; + public const int MagePower = 83746708; + public const int AxeOfDespair = 40619825; + public const int Fissure = 66788016; + public const int SwordsOfRevealingLight = 72302403; + public const int PrematureBurial = 70828912; + + // Traps + public const int MirrorForce = 44095762; + public const int TorrentialTribute = 53582587; + public const int RingOfDestruction = 83555667; + public const int CallOfTheHaunted = 83968380; + public const int MagicCylinder = 97077563; + public const int NegateAttack = 14315573; + public const int DustTornado = 60082869; + } + + public UltraBeatdownExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // --- DRAW & SEARCH LOGIC --- + AddExecutor(ExecutorType.Activate, CardId.PotOfGreed, PotOfGreedLogic); + AddExecutor(ExecutorType.Activate, CardId.GracefulCharity, GracefulCharityLogic); + AddExecutor(ExecutorType.Activate, CardId.UpstartGoblin, () => Bot.Deck.Count > 5); + AddExecutor(ExecutorType.Activate, CardId.Sangan, SanganSearchLogic); + AddExecutor(ExecutorType.Activate, CardId.SanganAlt, SanganSearchLogic); + + // --- SPELL LOGIC (OFFENSIVE) --- + AddExecutor(ExecutorType.Activate, CardId.HeavyStorm, HeavyStormLogic); + AddExecutor(ExecutorType.Activate, CardId.Fissure, FissureLogic); + AddExecutor(ExecutorType.Activate, CardId.SwordsOfRevealingLight, SwordsLogic); + AddExecutor(ExecutorType.Activate, CardId.MysticalSpaceTyphoon, MSTLogic); + AddExecutor(ExecutorType.Activate, CardId.PrematureBurial, PrematureBurialLogic); + + // --- EQUIPMENT LOGIC --- + AddExecutor(ExecutorType.Activate, CardId.UnitedWeStand, UnitedWeStandLogic); + AddExecutor(ExecutorType.Activate, CardId.MagePower, MagePowerLogic); + AddExecutor(ExecutorType.Activate, CardId.AxeOfDespair, AxeOfDespairLogic); + + // --- TRAP LOGIC (PROTECTION) --- + AddExecutor(ExecutorType.Activate, CardId.MirrorForce, MirrorForceLogic); + AddExecutor(ExecutorType.Activate, CardId.TorrentialTribute, TorrentialTributeLogic); + AddExecutor(ExecutorType.Activate, CardId.RingOfDestruction, RingOfDestructionLogic); + AddExecutor(ExecutorType.Activate, CardId.MagicCylinder, MagicCylinderLogic); + AddExecutor(ExecutorType.Activate, CardId.NegateAttack, NegateAttackLogic); + AddExecutor(ExecutorType.Activate, CardId.CallOfTheHaunted, CallOfTheHauntedLogic); + AddExecutor(ExecutorType.Activate, CardId.DustTornado, DustTornadoLogic); + + // --- MONSTER SUMMONS --- + AddExecutor(ExecutorType.Summon, CardId.Jinzo, JinzoSummonLogic); + AddExecutor(ExecutorType.Summon, CardId.BreakerTheMagicalWarrior, () => Enemy.GetSpellCount() > 0); + AddExecutor(ExecutorType.Summon, CardId.SummonedSkull, TributeLogic); + AddExecutor(ExecutorType.Summon, CardId.KycooTheGhostDestroyer); + AddExecutor(ExecutorType.Summon, CardId.LusterDragon); + AddExecutor(ExecutorType.Summon, CardId.GeminiElf); + AddExecutor(ExecutorType.Summon, CardId.Opticlops); + AddExecutor(ExecutorType.MonsterSet, CardId.GuardianSphinx); + AddExecutor(ExecutorType.MonsterSet, CardId.Sangan); + AddExecutor(ExecutorType.MonsterSet, CardId.SanganAlt); + AddExecutor(ExecutorType.MonsterSet, CardId.ManEaterBug); + AddExecutor(ExecutorType.MonsterSet, CardId.LabyrinthWall); + + AddExecutor(ExecutorType.SpellSet, DefaultSpellSet); + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + } + + // --- SPELL LOGIC METHODS --- + + private bool PotOfGreedLogic() + { + return Bot.Deck.Count > 2; // Prevent self-deck out + } + + private bool GracefulCharityLogic() + { + // Discard Sangan or duplicate Normal monsters + return true; + } + + private bool HeavyStormLogic() + { + // Only use if opponent has 2+ cards or more than us + if (Bot.HasInSpellZone(CardId.SwordsOfRevealingLight)) return false; + return Enemy.GetSpellCount() >= 2 || (Enemy.GetSpellCount() > Bot.GetSpellCount()); + } + + private bool FissureLogic() + { + return Enemy.GetMonsterCount() > 0; + } + + private bool SwordsLogic() + { + // Use if opponent has a stronger monster or we have 0 monsters + ClientCard bestEnemy = Enemy.GetMonsters().GetHighestAttackMonster(); + ClientCard myBest = Bot.GetMonsters().GetHighestAttackMonster(); + return (bestEnemy != null && (myBest == null || bestEnemy.Attack > myBest.Attack)) || Bot.GetMonsterCount() == 0; + } + + private bool MSTLogic() + { + // Targets only if opponent has backrow, prioritizes face-down + return Enemy.GetSpellCount() > 0; + } + + private bool PrematureBurialLogic() + { + if (Bot.LifePoints <= 800) return false; + // Target high-impact monsters in GY + return Bot.Graveyard.Any(m => m.Id == CardId.Jinzo || m.Id == CardId.SummonedSkull || m.Id == CardId.KycooTheGhostDestroyer); + } + + private bool UnitedWeStandLogic() + { + // Only use if we have 2+ monsters to maximize boost + return Bot.GetMonsterCount() >= 2 && DefaultAequip(); + } + + private bool MagePowerLogic() + { + // Only use if we have at least 2 spells/traps set + return Bot.GetSpellCount() >= 2 && DefaultAequip(); + } + + private bool AxeOfDespairLogic() + { + return DefaultAequip(); + } + + // --- TRAP LOGIC METHODS --- + + private bool MirrorForceLogic() + { + if (Bot.HasInMonstersZone(CardId.Jinzo)) return false; + // Save Mirror Force for when 2+ monsters attack, or a 2000+ ATK monster attacks + return Duel.Phase == DuelPhase.BattleStart && (Enemy.GetMonsterCount() >= 2 || Enemy.GetMonsters().Any(m => m.Attack >= 2000)); + } + + private bool TorrentialTributeLogic() + { + if (Bot.HasInMonstersZone(CardId.Jinzo)) return false; + // Activate only if it wipes more of theirs than ours + return Enemy.GetMonsterCount() > Bot.GetMonsterCount(); + } + + private bool RingOfDestructionLogic() + { + if (Bot.HasInMonstersZone(CardId.Jinzo)) return false; + ClientCard target = Enemy.GetMonsters().GetHighestAttackMonster(); + if (target == null) return false; + // Don't kill ourselves, target 2000+ ATK monsters + return Bot.LifePoints > target.Attack && target.Attack >= 2000; + } + + private bool CallOfTheHauntedLogic() + { + // Activate in opponent's End Phase to bring back a boss + if (Duel.Player == 1 && Duel.Phase == DuelPhase.End) + return Bot.Graveyard.Any(m => m.Id == CardId.Jinzo || m.Id == CardId.SummonedSkull); + return false; + } + + private bool MagicCylinderLogic() + { + if (Bot.HasInMonstersZone(CardId.Jinzo)) return false; + // Use on attacks from 1800+ ATK monsters + return Duel.Phase == DuelPhase.BattleStart && Enemy.GetMonsters().Any(m => m.Attack >= 1800); + } + + private bool NegateAttackLogic() + { + if (Bot.HasInMonstersZone(CardId.Jinzo)) return false; + // Use only if health is below 4000 or it's a game-ending attack + return Bot.LifePoints < 4000 || AI.Utils.IsOpponentBetterThanMe(); + } + + private bool DustTornadoLogic() + { + // Activate on opponent's turn to disrupt backrow + return Duel.Player == 1 && Enemy.GetSpellCount() > 0; + } + + // --- MONSTER SEARCH & SUMMON LOGIC --- + + private bool SanganSearchLogic() + { + if (Enemy.GetMonsterCount() > 0) AI.SelectCard(CardId.ExiledForce); + else if (Bot.Graveyard.Count >= 3) AI.SelectCard(CardId.BazooTheSoulEater); + else AI.SelectCard(CardId.LusterDragon); + return true; + } + + private bool JinzoSummonLogic() + { + if (Bot.GetMonsters().Any(m => m.EquipCards.Count > 0)) return false; + return Enemy.GetSpellCount() > 0 || AI.Utils.IsOpponentBetterThanMe(); + } + + private bool TributeLogic() + { + return Bot.GetMonsters().Any(m => m.Attack < 1700); + } + } +} From d6131b5b82a797485cb5e66fd1128330d1aa2946 Mon Sep 17 00:00:00 2001 From: aseemrai Date: Mon, 23 Mar 2026 21:45:21 -0400 Subject: [PATCH 4/5] Delete Game/AI/Decks/GOATFormatExecutor.cs --- Game/AI/Decks/GOATFormatExecutor.cs | 124 ---------------------------- 1 file changed, 124 deletions(-) delete mode 100644 Game/AI/Decks/GOATFormatExecutor.cs diff --git a/Game/AI/Decks/GOATFormatExecutor.cs b/Game/AI/Decks/GOATFormatExecutor.cs deleted file mode 100644 index 673d0d67..00000000 --- a/Game/AI/Decks/GOATFormatExecutor.cs +++ /dev/null @@ -1,124 +0,0 @@ -using YGOSharp.OCGWrapper.Enums; -using System.Collections.Generic; -using WindBot; -using WindBot.Game; -using WindBot.Game.AI; - -namespace WindBot.Game.AI.Decks -{ - [Deck("AI_GOATFormat", "AI_GOATFormat")] - public class GoatFormatExecutor : DefaultExecutor - { - public class CardId - { - public const int Tsukuyomi = 70781052; - public const int BlackLusterSoldier_EnvoyOfTheBeginning = 72302403; - public const int Jinzo = 83968380; - public const int AirknightParsath = 13039848; - public const int ThunderDragon = 69140098; - public const int KycooTheGhostDestroyer = 39256679; - public const int BladeKnight = 11549357; - public const int BreakerTheMagicalWarrior = 71413901; - public const int SkilledDarkMage = 40659562; - public const int SkilledWhiteMage = 77585513; - public const int AbyssSoldier = 40133511; - public const int AsuraPriest = 14531242; - public const int ExiledForce = 15025844; - public const int DDMasterOfPuppets = 11091375; - public const int MagicianOfFaith = 88240808; - public const int Sangan = 7572887; - public const int SinisterSerpent = 74131780; - public const int MorphingJar = 33508719; // ID 33508719 - - // Spells - public const int PotOfGreed = 55144522; - public const int GracefulCharity = 79571449; - public const int DelinquentDuo = 44095762; - public const int HeavyStorm = 19613556; - public const int MysticalSpaceTyphoon = 5318639; - public const int SnatchSteal = 45986603; // Corrected ID 45986603 - public const int NoblemanOfCrossout = 70828912; - public const int Metamorphosis = 40619825; - public const int Scapegoat = 70368879; - public const int PrematureBurial = 70828912; - - // Traps - public const int MirrorForce = 44095762; - public const int TorrentialTribute = 53582587; - public const int RingOfDestruction = 83555667; - public const int CallOfTheHaunted = 97077563; - public const int DustTornado = 60082869; - public const int SakuretsuArmor = 56747793; - public const int Ceasefire = 36468556; // 14315573 - } - - public GoatFormatExecutor(GameAI ai, Duel duel) - : base(ai, duel) - { - // Priority 1: Game-Winning Spells - AddExecutor(ExecutorType.Activate, CardId.PotOfGreed); - AddExecutor(ExecutorType.Activate, CardId.GracefulCharity, DiscardSerpentLogic); - AddExecutor(ExecutorType.Activate, CardId.DelinquentDuo); - - // Priority 2: Board Clears - AddExecutor(ExecutorType.Activate, CardId.HeavyStorm, DefaultHeavyStorm); - AddExecutor(ExecutorType.Activate, CardId.NoblemanOfCrossout, DefaultNoblemanOfCrossout); - AddExecutor(ExecutorType.Activate, CardId.ExiledForce, DefaultExiledForce); - - // Priority 3: Special Summons - AddExecutor(ExecutorType.SpSummon, CardId.BlackLusterSoldier_EnvoyOfTheBeginning, BLSSummon); - AddExecutor(ExecutorType.Activate, CardId.BlackLusterSoldier_EnvoyOfTheBeginning, BLSEffect); - AddExecutor(ExecutorType.Activate, CardId.Metamorphosis, MetaLogic); - - // Priority 4: Deck Thinning & Utility - AddExecutor(ExecutorType.Activate, CardId.ThunderDragon); - AddExecutor(ExecutorType.Summon, CardId.BreakerTheMagicalWarrior, DefaultBreakerTheMagicalWarrior); - AddExecutor(ExecutorType.Summon, CardId.Jinzo); - - // Priority 5: Normal Summons - AddExecutor(ExecutorType.Summon, CardId.BladeKnight); - AddExecutor(ExecutorType.Summon, CardId.KycooTheGhostDestroyer); - AddExecutor(ExecutorType.Summon, CardId.AbyssSoldier); - AddExecutor(ExecutorType.MonsterSet, CardId.MagicianOfFaith); - AddExecutor(ExecutorType.MonsterSet, CardId.Sangan); - - // Priority 6: Traps - AddExecutor(ExecutorType.Activate, CardId.MirrorForce, DefaultUniqueTrap); - AddExecutor(ExecutorType.Activate, CardId.TorrentialTribute, DefaultTorrentialTribute); - AddExecutor(ExecutorType.Activate, CardId.RingOfDestruction, DefaultRingOfDestruction); - - AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); - AddExecutor(ExecutorType.SpellSet, DefaultSpellSet); - } - - private bool DiscardSerpentLogic() - { - // Discard Sinister Serpent (74131780) or Thunder Dragon (69140098) first - AI.SelectCard(new[] { CardId.SinisterSerpent, CardId.ThunderDragon }); - return true; - } - - private bool BLSSummon() - { - return Bot.Graveyard.GetMatchingCardsCount(c => c.HasAttribute(CardAttribute.Light)) >= 1 - && Bot.Graveyard.GetMatchingCardsCount(c => c.HasAttribute(CardAttribute.Dark)) >= 1; - } - - private bool BLSEffect() - { - ClientCard target = Enemy.GetMonsters().GetHighestAttackMonster(); - if (target != null && target.Attack >= 2400) { - AI.SelectOption(0); // Banish - AI.SelectCard(target); - return true; - } - return true; // Attack twice - } - - private bool MetaLogic() - { - // Use Metamorphosis on Scapegoat tokens (70368879) for Thousand-Eyes Restrict - return Bot.HasInMonstersZone(CardId.Scapegoat); - } - } -} From c3d1f8ad7679a0cbf75497915cc8716d732b7d80 Mon Sep 17 00:00:00 2001 From: aseemrai Date: Mon, 23 Mar 2026 21:46:03 -0400 Subject: [PATCH 5/5] Rename GOATFormatExecutor to GOATFormatExecutor.cs --- Game/AI/Decks/{GOATFormatExecutor => GOATFormatExecutor.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Game/AI/Decks/{GOATFormatExecutor => GOATFormatExecutor.cs} (100%) diff --git a/Game/AI/Decks/GOATFormatExecutor b/Game/AI/Decks/GOATFormatExecutor.cs similarity index 100% rename from Game/AI/Decks/GOATFormatExecutor rename to Game/AI/Decks/GOATFormatExecutor.cs