From 3c40d4c46b1675ead366e7175027ba7a4914459f Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Tue, 7 Mar 2023 09:11:44 +0800 Subject: [PATCH 001/110] Update enum and default Vaylantz Worlds executor (#160) --- Game/AI/DefaultExecutor.cs | 55 +++++++++++ Game/AI/Enums/Floodgate.cs | 95 ++++++++++++++++++- Game/AI/Enums/FusionSpell.cs | 28 ++++++ Game/AI/Enums/InvincibleMonster.cs | 12 ++- .../Enums/PreventActivationEffectInBattle.cs | 5 + ...houldBeDisabledBeforeItUseEffectMonster.cs | 5 +- Game/AI/Enums/ShouldNotBeMonsterTarget.cs | 4 +- Game/AI/Enums/ShouldNotBeSpellTarget.cs | 3 +- 8 files changed, 201 insertions(+), 6 deletions(-) diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 0f72f0919..c2d2ec5ab 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -121,12 +121,17 @@ protected class _CardId public const int RoyalDecreel = 51452091; public const int NaturiaBeast = 33198837; public const int AntiSpellFragrance = 58921041; + + public const int VaylantzWorld_ShinraBansho = 49568943; + public const int VaylantzWorld_KonigWissen = 75952542; } protected DefaultExecutor(GameAI ai, Duel duel) : base(ai, duel) { AddExecutor(ExecutorType.Activate, _CardId.ChickenGame, DefaultChickenGame); + AddExecutor(ExecutorType.Activate, _CardId.VaylantzWorld_ShinraBansho, DefaultVaylantzWorld_ShinraBansho); + AddExecutor(ExecutorType.Activate, _CardId.VaylantzWorld_KonigWissen, DefaultVaylantzWorld_KonigWissen); AddExecutor(ExecutorType.Activate, _CardId.SantaClaws); } @@ -1182,5 +1187,55 @@ protected bool DefaultHonestEffect() return Util.IsTurn1OrMain2(); } + + /// + /// Always activate + /// + protected bool DefaultVaylantzWorld_ShinraBansho() + { + if (DefaultSpellWillBeNegated()) { + return false; + } + + return true; + } + + /// + /// Select enemy's best monster + /// + protected bool DefaultVaylantzWorld_KonigWissen() + { + if (DefaultSpellWillBeNegated()) { + return false; + } + + List monsters = Enemy.GetMonsters(); + if (monsters.Count == 0) { + return false; + } + + List targetList = new List(); + List floodgateCards = monsters + .Where(card => card?.Data != null && card.IsFloodgate() && card.IsFaceup() && !card.IsShouldNotBeTarget()) + .OrderBy(card => card.Attack).ToList(); + List dangerousCards = monsters + .Where(card => card?.Data != null && card.IsMonsterDangerous() && card.IsFaceup() && !card.IsShouldNotBeTarget()) + .OrderBy(card => card.Attack).ToList(); + List attackOrderedCards = monsters + .Where(card => card?.Data != null && card.HasType(CardType.Monster) && card.IsFaceup() && card.IsShouldNotBeTarget()) + .OrderBy(card => card.Attack).ToList(); + + targetList.AddRange(floodgateCards); + targetList.AddRange(dangerousCards); + targetList.AddRange(attackOrderedCards); + + if (targetList?.Count > 0) + { + AI.SelectCard(targetList); + return true; + } + + return false; + } } } diff --git a/Game/AI/Enums/Floodgate.cs b/Game/AI/Enums/Floodgate.cs index 9141c5034..da3feb9b5 100644 --- a/Game/AI/Enums/Floodgate.cs +++ b/Game/AI/Enums/Floodgate.cs @@ -106,6 +106,99 @@ public enum Floodgate AdamancipatorRisenDragite = 9464441, TeardroptheRikkaQueen = 33779875, CeruleanSkyFire = 54828837, - SacredBeastAwakening = 53701259 + SacredBeastAwakening = 53701259, + GrandSpiritualArtIchirin = 38057522, + DualAvatarFeetArmoredUnGyo = 7631534, + VirtualWorldKyubiShenshen = 92519087, + VirtualWorldGateChuche = 13364097, + DragunityKnightAreadbhair = 88234821, + AiwasstheMagistusSpellSpirit = 35877582, + OneirostheDreamMirrorErlking = 35187185, + PlunderPatrollshipBrann = 94253655, + PlunderPatrollshipMoerk = 20248754, + PlunderPatrollshipLys = 18832779, + HollowGiants = 15462014, + GrozaTyrantofThunder = 45420955, + SpringansCaptainSargas = 29601381, + S_ForceOrrafist = 95974848, + AncientWarriors_RebelliousLuFeng = 82791472, + OneirostheDreamMirrorTormentor = 37678339, + SacredTreeBeastHyperyton = 9349094, + S_ForceJustify = 35334193, + UnderworldGoddessoftheClosedWorld = 98127546, + VampireVoivode = 4918855, + NekrozofAreadbhair = 39468724, + NekrozofUnicore = 89463537, + BenghalancertheResurgent = 73345237, + UrsarcticSeptentrion = 53087962, + TheIrisSwordsoul = 62849088, + AntihumanIntelligenceME_PSY_YA = 58844135, + MagikeyMechmortar_Garesglasser = 45877457, + ShootingMajesticStarDragon = 40939228, + StellarWindWolfrayet = 3322931, + ChronomalyVimana = 2609443, + CyberdarknessDragon = 18967507, + ClearWingSynchroDragon = 82044279, + CrystalClearWingSynchroDragon = 59765225, + BaronnedeFleur = 84815190, + Lyrilusc_EnsemblueRobin = 72971064, + Number4StealthKragen = 67557908, + Floowandereeze_Snowl = 53212882, + Floowandereeze_Empen = 80611581, + MasqueradetheBlazingDragon = 6855503, + DestinyHERO_DestroyerPhoenixEnforcer = 60461804, + SwordsoulGrandmaster_Chixiao = 69248256, + ZoroatheMagistusConflagrantCalamity = 95911373, + MasterflareHyperion = 63101468, + FallenSanctuary = 90312154, + MyutantBeast = 34695290, + MyutantArsenal = 7574904, + MyutantUltimus = 6182103, + Underdog = 5779502, + IcejadeKosmochlor = 3355732, + IllusionofChaos = 12266229, + SwordsoulSinisterSovereign_QixingLongyuan = 47710198, + DDDDeviserKingDeusMachinex = 46593546, + IcejadeErosion = 46593546, + NordicRelicSvalinn = 64797746, + OceanDragonLord_Kairyu_Shin = 23931679, + MarincessAquaArgonaut = 20934852, + MirrorjadetheIcebladeDragon = 44146295, + WitchcrafterVice_Madame = 9603252, + Therion_King_Regulus = 10604644, + StarvingVenomPredapowerFusionDragon = 39915560, + DinomorphiaRexterm = 92798873, + ExosistersMagnifica = 59242457, + IcejadeCurse = 83670388, + MamonakatheVaylantzUnited = 40680521, + LabrynthLabyrinth = 33407125, + RunickFountain = 92107604, + SprightRed = 75922381, + SprightCarrot = 2311090, + RikkaKonkon = 76869711, + PowerToolBraverDragon = 63265554, + MagikeyDeity_Ashtartu = 26988374, + RainbowOverdragon = 37440988, + TheBystialAlbaLos = 69120785, + KashtiraFenrir = 32909498, + MitsutheInsectNinja = 67282505, + VeratheVernusylphGoddess = 55125728, + TearlamentsRulkallos = 84330567, + Black_WingedAssaultDragon = 73218989, + BrandedBeast = 32756828, + GraphaDragonOverlordofDarkWorld = 39552584, + EpurrelyBeauty = 98049934, + ExpurrelyNoir = 83827392, + BeetrooperScaleBomber = 39041550, + EvigishkiNeremanas = 88926295, + ArktosXII_ChronochasmVaylantz = 50687050, + IcejadeGymirAegirine = 86682165, + KashtiraArise_Heart = 48626373, + LaevateinGeneraiderBossofShadows = 74615388, + SynchroZone = 60306277, + BystialDisPater = 27572350, + DespianLuluwalilith = 53971455, + FirewallDragonSingularity = 21637210, + BrandedEtude = 45675980 } } diff --git a/Game/AI/Enums/FusionSpell.cs b/Game/AI/Enums/FusionSpell.cs index b4859b555..73dfd26ce 100644 --- a/Game/AI/Enums/FusionSpell.cs +++ b/Game/AI/Enums/FusionSpell.cs @@ -51,9 +51,37 @@ public enum FusionSpell FusionGate = 33550694, DFusion = 26841274, + FusionDestiny = 52947044, PyroxeneFusion = 55824220, FragmentFusion = 72029628, NecroFusion = 81223446, PredaplantVerteAnaconda = 70369116, + + DreamMirrorofChaos = 98570539, + PlunderPatrollShipshapeShipsShipping = 44227727, + FireFormationIngen = 29143457, + ParametalfoesFusion = 58549532, + ReadyFusion = 63854005, + BrandedinWhite = 34995106, + BrandedinRed = 82738008, + FaceCardFusion = 29062925, + MyutantFusion = 42577802, + MyutantCry = 31855260, + GreaterPolymerization = 7614732, + UltimateFusion = 71143015, + BrandedFusion = 44362883, + GhostFusion = 35705817, + WitchcrafterConfusionConfession = 35098357, + BrandedBanishment = 6763530, + DinomorphiaDomain = 26631975, + DinomorphiaFrenzy = 78420796, + SouloftheSupremeKing = 92428405, + InstantContact = 16169772, + ScatterFusion = 40597694, + FavoriteContact = 75047173, + AmazonessSecretArts = 86758746, + DarkWorldAccession = 65956182, + BeetrooperLanding = 13234975, + FusionReproduction = 43331750 } } diff --git a/Game/AI/Enums/InvincibleMonster.cs b/Game/AI/Enums/InvincibleMonster.cs index c4f4cc930..ad2aff17c 100644 --- a/Game/AI/Enums/InvincibleMonster.cs +++ b/Game/AI/Enums/InvincibleMonster.cs @@ -25,7 +25,9 @@ public enum InvincibleBotMonster DaigustoSphreez = 29552709, Number92HearteartHDragon = 97403510, NumberC96DarkStorm = 77205367, - Number54LionHeart = 54366836 + Number54LionHeart = 54366836, + Number2NinjaShadowMosquito = 32453837, + OhimetheManifestedMikanko = 81260679 } /// /// Cards that are invincible to battle. @@ -93,6 +95,12 @@ public enum InvincibleEnemyMonster GoukiTheGiantOgre = 47946130, BorrelswordDragon = 85289965, NumberF0UtopicFutureDragon = 26973555, - BorrelendDragon = 98630720 + BorrelendDragon = 98630720, + MimickingMan_EaterBug = 72427512, + ShiningPiecephilia = 49776811, + BrigrandtheGloryDragon = 34848821, + AmazonessQueen = 15951532, + Number2NinjaShadowMosquito = 32453837, + OhimetheManifestedMikanko = 81260679 } } diff --git a/Game/AI/Enums/PreventActivationEffectInBattle.cs b/Game/AI/Enums/PreventActivationEffectInBattle.cs index 34f98e6db..a916f8bfa 100644 --- a/Game/AI/Enums/PreventActivationEffectInBattle.cs +++ b/Game/AI/Enums/PreventActivationEffectInBattle.cs @@ -11,5 +11,10 @@ public enum PreventActivationEffectInBattle SamuraiDestroyer = 40509732, ArmadesKeeperOfBoundaries = 88033975, NumberS39UtopiaTheLightning = 56832966, + DualAvatarEmpoweredKonGyo = 33026283, + GGolemRockHammer = 98875863, + WishDragon = 64583600, + ChaosWitch = 30327674, + FissioningMotherSpider = 34034150 } } diff --git a/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs b/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs index ff5df1042..9ff2d93fa 100644 --- a/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs +++ b/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs @@ -56,6 +56,9 @@ public enum ShouldBeDisabledBeforeItUseEffectMonster ShiranuiSolitaire = 94801854, Mixeroid = 71340250, LonefireBlossom = 48686504, - BrotherhoodoftheFireFist_Leopard = 39699564 + BrotherhoodoftheFireFist_Leopard = 39699564, + SpringansPedor = 56818977, + GizmekNaganakitheSunriseSignaler = 96399967, + MyutantMutant = 26561172 } } diff --git a/Game/AI/Enums/ShouldNotBeMonsterTarget.cs b/Game/AI/Enums/ShouldNotBeMonsterTarget.cs index b5cb0f6f9..8ed6cb9ec 100644 --- a/Game/AI/Enums/ShouldNotBeMonsterTarget.cs +++ b/Game/AI/Enums/ShouldNotBeMonsterTarget.cs @@ -14,6 +14,8 @@ public enum ShouldNotBeMonsterTarget PaleozoicAnomalocaris = 61307542, PaleozoicOpabinia = 37649320, BorreloadDragon = 31833038, - BorrelendDragon = 98630720 + BorrelendDragon = 98630720, + DrytronMeteonisDraconids = 69815951, + MyutantBeast = 34695290 } } diff --git a/Game/AI/Enums/ShouldNotBeSpellTarget.cs b/Game/AI/Enums/ShouldNotBeSpellTarget.cs index ba8e69c67..e045246d5 100644 --- a/Game/AI/Enums/ShouldNotBeSpellTarget.cs +++ b/Game/AI/Enums/ShouldNotBeSpellTarget.cs @@ -9,6 +9,7 @@ public enum ShouldNotBeSpellTrapTarget ApoqliphortTowers = 27279764, ApoqliphortSkybase = 40061558, TheLegendaryFishermanIII = 44968687, - ChaosAncientGearGiant = 51788412 + ChaosAncientGearGiant = 51788412, + DrytronMeteonisQuadrantids = 95209656 } } From 72497b5d2b9a8b52232c8680c1b8badc713716a6 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Sun, 12 Mar 2023 00:54:07 +0800 Subject: [PATCH 002/110] add Exosister Deck (#161) --- BotWrapper/bot.conf | 7 +- Decks/AI_Exosister.ydk | 60 + Game/AI/Decks/ExosisterExecutor.cs | 2963 ++++++++++++++++++++++++++++ Game/AI/DefaultExecutor.cs | 4 +- Game/Duel.cs | 4 + Game/GameBehavior.cs | 7 +- WindBot.csproj | 1 + 7 files changed, 3043 insertions(+), 3 deletions(-) create mode 100644 Decks/AI_Exosister.ydk create mode 100644 Game/AI/Decks/ExosisterExecutor.cs diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 7c276289d..3e2d153fc 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -189,11 +189,16 @@ Name=我太帅了 Deck=Brave Dialog=smart.zh-CN 水机百头龙凤凰人勇者卡组。 AI_LV3 SUPPORT_MASTER_RULE_2020 -!玻璃女巫 +!玻璃女巫-魔女术 Name=玻璃女巫 Deck=Witchcraft Dialog=verre.zh-CN 魔女术卡组。 AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +!玻璃女巫-救祓少女 +Name=玻璃女巫 Deck=Exosister Dialog=verre.zh-CN +救祓少女卡组。 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + !神数不神-刹帝利 Name=神数不神 Deck=Kashtira Dialog=Zefra.zh-CN 俱舍怒威族卡组。 diff --git a/Decks/AI_Exosister.ydk b/Decks/AI_Exosister.ydk new file mode 100644 index 000000000..1e5c0fac3 --- /dev/null +++ b/Decks/AI_Exosister.ydk @@ -0,0 +1,60 @@ +#created by ... +#main +37343995 +37343995 +37343995 +16889337 +16889337 +16889337 +16474916 +16474916 +16474916 +67972302 +67972302 +67972302 +79858629 +79858629 +43863925 +43863925 +43863925 +5352328 +5352328 +14558127 +14558127 +14558127 +23434538 +23434538 +23434538 +84211599 +84211599 +4408198 +24224830 +24224830 +77913594 +77913594 +77913594 +197042 +197042 +10045474 +10045474 +77891946 +77891946 +77891946 +#extra +90448279 +59242457 +59242457 +9272381 +42741437 +42741437 +42741437 +78135071 +78135071 +41524885 +41524885 +46772449 +5530780 +58858807 +8728498 +!side +74689476 diff --git a/Game/AI/Decks/ExosisterExecutor.cs b/Game/AI/Decks/ExosisterExecutor.cs new file mode 100644 index 000000000..7d3d0d242 --- /dev/null +++ b/Game/AI/Decks/ExosisterExecutor.cs @@ -0,0 +1,2963 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using System.Linq; +using System; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Exosister", "AI_Exosister")] + + class ExosisterExecutor : DefaultExecutor + { + public class CardId + { + public const int ExosisterElis = 16474916; + public const int ExosisterStella = 43863925; + public const int ExosisterIrene = 79858629; + public const int ExosisterSophia = 5352328; + public const int ExosisterMartha = 37343995; + public const int Aratama = 16889337; + public const int Sakitama = 67972302; + // _CardId.MaxxC = 23434538; + // _CardId.AshBlossom = 14558127; + + public const int ExosisterPax = 77913594; + public const int ExosisterArment = 4408198; + public const int PotofExtravagance = 84211599; + // _CardId.CalledByTheGrave = 24224830; + + public const int ExosisterVadis = 77891946; + public const int ExosisterReturnia = 197042; + // _CardId.InfiniteImpermanence = 10045474; + + public const int ExosisterMikailis = 42741437; + public const int ExosisterKaspitell = 78135071; + public const int ExosisterGibrine = 5530780; + public const int ExosisterAsophiel = 41524885; + public const int ExosistersMagnifica = 59242457; + public const int TellarknightConstellarCaduceus = 58858807; + public const int StellarknightConstellarDiamond = 9272381; + public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int DonnerDaggerFurHire = 8728498; + // _CardId.EvilswarmExcitonKnight = 46772449; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int DimensionShifter = 91800273; + } + + public ExosisterExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // trigger + AddExecutor(ExecutorType.Activate, CardId.ExosistersMagnifica, ExosistersMagnificaActivateTrigger); + + // quick effect + AddExecutor(ExecutorType.Activate, CardId.ExosisterMikailis, ExosisterMikailisActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosistersMagnifica, ExosistersMagnificaActivateBanish); + AddExecutor(ExecutorType.Activate, CardId.ExosisterReturnia, ExosisterReturniaActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterVadis, ExosisterVadisActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.StellarknightConstellarDiamond); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, DefaultExosisterTransform); + AddExecutor(ExecutorType.Activate, CardId.ExosisterArment, ExosisterArmentActivate); + + // free chain + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + + // search + AddExecutor(ExecutorType.Activate, CardId.PotofExtravagance, PotofExtravaganceActivate); + + // field effect + AddExecutor(ExecutorType.Activate, CardId.Aratama); + AddExecutor(ExecutorType.Activate, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterKaspitell, ExosisterKaspitellActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterGibrine, ExosisterGibrineActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterAsophiel, ExosisterAsophielActivate); + + AddExecutor(ExecutorType.Activate, CardId.ExosisterSophia, ExosisterSophiaActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterIrene, ExosisterIreneActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterStella, ExosisterStellaActivate); + + // addition monster summmon + AddExecutor(ExecutorType.Activate, CardId.ExosisterElis, ExosisterElisActivate); + AddExecutor(ExecutorType.Activate, CardId.Sakitama, SakitamaActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterPax, ExosisterPaxActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterStella, ExosisterStellaSecondActivate); + + // xyz summon + AddExecutor(ExecutorType.SpSummon, CardId.StellarknightConstellarDiamond); + AddExecutor(ExecutorType.SpSummon, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireSpSummonCheck); + AddExecutor(ExecutorType.SpSummon, CardId.ExosisterMikailis, ExosisterMikailisAdvancedSpSummonCheck); + AddExecutor(ExecutorType.SpSummon, CardId.ExosisterKaspitell, ExosisterKaspitellAdvancedSpSummonCheck); + + AddExecutor(ExecutorType.SpSummon, CardId.ExosisterKaspitell, ExosisterKaspitellSpSummonCheck); + AddExecutor(ExecutorType.SpSummon, CardId.ExosisterMikailis, ExosisterMikailisSpSummonCheck); + AddExecutor(ExecutorType.SpSummon, CardId.TellarknightConstellarCaduceus, TellarknightConstellarCaduceusSpSummonCheck); + + AddExecutor(ExecutorType.SpSummon, CardId.ExosistersMagnifica, ExosistersMagnificaSpSummonCheck); + + AddExecutor(ExecutorType.SpSummon, _CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightSummon); + AddExecutor(ExecutorType.Activate, _CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect); + + // normal summon for xyz(avoiding MaxxC) + AddExecutor(ExecutorType.Summon, CardId.ExosisterStella, ExosisterAvoidMaxxCSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.ExosisterSophia, ExosisterAvoidMaxxCSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.ExosisterIrene, ExosisterAvoidMaxxCSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.ExosisterElis, ExosisterAvoidMaxxCSummonCheck); + + // activate martha + AddExecutor(ExecutorType.Activate, CardId.ExosisterMartha, ExosisterMarthaActivate); + + // normal summon for xyz + AddExecutor(ExecutorType.Summon, CardId.ExosisterStella, ExosisterStellaSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.Aratama, AratamaSummonCheck); + AddExecutor(ExecutorType.Summon, ExosisterForElisSummonCheck); + AddExecutor(ExecutorType.Summon, ForSakitamaSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.ExosisterIrene, ExosisterIreneSummonCheck); + AddExecutor(ExecutorType.Summon, Level4SummonCheck); + AddExecutor(ExecutorType.Summon, ExosisterForArmentSummonCheck); + AddExecutor(ExecutorType.Summon, ForDonnerSummonCheck); + + AddExecutor(ExecutorType.Activate, CardId.ExosisterPax, ExosisterPaxActivateForEndSearch); + + // other + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodeShadoll = 0x9d; + const int SetcodeInferoid = 0xbb; + const int SetcodeOrcust = 0x11b; + const int SetcodeExosister = 0x172; + const int SetcodeTearlaments = 0x181; + List SetcodeForDiamond = new List{SetcodeShadoll, SetcodeInferoid, SetcodeTearlaments}; + + List affectGraveCardIdList = new List{ + 71344451, 40975243, 87746184, 70534340, 45906428, 71490127, 3659803, 12071500, 6077601, 11827244, 95238394, 81223446, 40003819, + 72490637, 21011044, 59419719, 14735698, 45410988 + }; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.ExosisterElis, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.Aratama, CardId.Sakitama, + _CardId.MaxxC, _CardId.AshBlossom, CardId.ExosisterPax, CardId.ExosisterVadis }}, + {2, new List { CardId.ExosisterIrene, CardId.ExosisterSophia, CardId.PotofExtravagance, _CardId.CalledByTheGrave, + CardId.ExosisterReturnia, _CardId.InfiniteImpermanence }}, + {1, new List { CardId.ExosisterArment }}, + }; + Dictionary ExosisterMentionTable = new Dictionary{ + {CardId.ExosisterElis, CardId.ExosisterStella}, {CardId.ExosisterStella, CardId.ExosisterElis}, + {CardId.ExosisterIrene, CardId.ExosisterSophia}, {CardId.ExosisterSophia, CardId.ExosisterIrene}, + {CardId.ExosisterMartha, CardId.ExosisterElis} + }; + List ExosisterSpellTrapList = new List{CardId.ExosisterPax, CardId.ExosisterArment, CardId.ExosisterVadis, CardId.ExosisterReturnia}; + + Dictionary calledbytheGraveCount = new Dictionary(); + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + bool enemyMoveGrave = false; + bool paxCallToField = false; + List infiniteImpermanenceList = new List(); + + bool summoned = false; + bool elisEffect1Activated = false; + bool stellaEffect1Activated = false; + bool irenaEffect1Activated = false; + bool sophiaEffect1Activated = false; + bool marthaEffect1Activated = false; + bool mikailisEffect1Activated = false; + bool mikailisEffect3Activated = false; + bool kaspitellEffect1Activated = false; + bool kaspitellEffect3Activated = false; + bool gibrineEffect1Activated = false; + bool gibrineEffect3Activated = false; + bool asophielEffect1Activated = false; + bool asophielEffect3Activated = false; + bool sakitamaEffect1Activated = false; + List exosisterTransformEffectList = new List(); + List oncePerTurnEffectActivatedList = new List(); + List activatedMagnificaList = new List(); + List targetedMagnificaList = new List(); + List transformDestList = new List(); + List spSummonThisTurn = new List(); + bool potActivate = false; + List removeChosenList = new List(); + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(n + 1); + ClientCard temp = result[index]; + result[index] = result[n]; + result[n] = temp; + } + return result; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false) + { + List floodagateList = Enemy.GetMonsters().Where(c => c?.Data != null && + c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + return floodagateList[0]; + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count > 0) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + return dangerList[0]; + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + return invincibleList[0]; + } + + if (attack == 0) + attack = Util.GetBestAttack(Bot); + List betterList = Enemy.MonsterZone.GetMonsters() + .Where(card => card.GetDefensePower() >= attack && card.IsAttack() && (!canBeTarget || !card.IsShouldNotBeTarget())).ToList(); + if (betterList.Count > 0) + { + betterList.Sort(CardContainer.CompareCardAttack); + betterList.Reverse(); + return betterList[0]; + } + return null; + } + + public ClientCard GetProblematicEnemyCard(bool canBeTarget = false) + { + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !removeChosenList.Contains(c) && + c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + return floodagateList[0]; + } + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !removeChosenList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !removeChosenList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + return dangerList[0]; + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !removeChosenList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + return invincibleList[0]; + } + + List enemyMonsters = Enemy.GetMonsters().Where(c => !removeChosenList.Contains(c)).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach(ClientCard target in enemyMonsters) + { + if (target.HasType(CardType.Fusion) || target.HasType(CardType.Ritual) || target.HasType(CardType.Synchro) || target.HasType(CardType.Xyz) || (target.HasType(CardType.Link) && target.LinkCount >= 2) ) + { + if (!canBeTarget || !(target.IsShouldNotBeTarget() || target.IsShouldNotBeMonsterTarget())) return target; + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !removeChosenList.Contains(c) + && (c.HasType(CardType.Equip) || c.HasType(CardType.Pendulum) || c.HasType(CardType.Field) || c.HasType(CardType.Continuous))) + .ToList(); + if (spells.Count > 0) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget); + if (card != null) + return card; + + card = Enemy.MonsterZone.GetHighestAttackMonster(canBeTarget); + if (card != null) + return card; + + List monsters = Enemy.GetMonsters(); + + // after GetHighestAttackMonster, the left monsters must be face-down. + if (monsters.Count > 0 && !onlyFaceup) + return ShuffleCardList(monsters)[0]; + + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && + (ecard.HasType(CardType.Continuous) || ecard.HasType(CardType.Field) || ecard.HasType(CardType.Pendulum))).ToList(); + if (faceUpList.Count > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + if (checkGrave && Enemy.Graveyard.Count > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + /// + /// Check negated turn count of id + /// + public int CheckCalledbytheGrave(int id) + { + if (!calledbytheGraveCount.ContainsKey(id)) + { + return 0; + } + return calledbytheGraveCount[id]; + } + + public void CheckEnemyMoveGrave() + { + if (Duel.LastChainPlayer == 1) + { + ClientCard card = Util.GetLastChainCard(); + if (Duel.LastChainLocation == CardLocation.Grave && card.Location == CardLocation.Grave) + { + Logger.DebugWriteLine("===Exosister: enemy activate effect from GY."); + enemyMoveGrave = true; + } + else if (affectGraveCardIdList.Contains(card.Id)) + { + Logger.DebugWriteLine("===Exosister: enemy activate effect that affect GY."); + enemyMoveGrave = true; + } + else + { + foreach (ClientCard targetCard in Duel.LastChainTargets) + { + if (targetCard.Location == CardLocation.Grave) + { + Logger.DebugWriteLine("===Exosister: enemy target cards of GY."); + enemyMoveGrave = true; + break; + } + } + } + } + } + + /// + /// Check exosister's relative card. 0 for error. + /// + public int CheckExosisterMentionCard(int id) + { + if (!ExosisterMentionTable.ContainsKey(id)) + { + return 0; + } + return ExosisterMentionTable[id]; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + return true; + } + + /// + /// Check whether negate opposite's effect and clear flag + /// + public void CheckDeactiveFlag() + { + if (Util.GetLastChainCard() != null && Duel.LastChainPlayer == 1) + { + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + enemyActivateMaxxC = false; + } + if (Util.GetLastChainCard().IsCode(_CardId.LockBird)) + { + enemyActivateLockBird = false; + } + } + } + + /// + /// Check whether opposite use Maxx-C, and thus make less operation. + /// + public bool CheckLessOperation() + { + if (!enemyActivateMaxxC) + { + return false; + } + return CheckAtAdvantage(); + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && Bot.GetMonsters().Any(card => card.IsFaceup())) + { + return true; + } + return false; + } + + /// + /// Check whether bot is in danger and need to summon monster to defense. + /// + public bool CheckInDanger() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int totalAtk = 0; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsAttack() && !m.Attacked) totalAtk += m.Attack; + } + if (totalAtk >= Bot.LifePoints) return true; + } + return false; + } + + /// + /// Check whether can be used for xyz summon. + /// + public bool CheckAbleForXyz(ClientCard card) + { + return card.IsFaceup() && !card.HasType(CardType.Xyz) && !card.HasType(CardType.Link) && !card.HasType(CardType.Token) && card.Level == 4; + } + + /// + /// Check whether bot can activate martha. + /// + public bool CheckMarthaActivatable() + { + return !marthaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterMartha) == 0 && CheckRemainInDeck(CardId.ExosisterElis) > 0 + && !Bot.GetMonsters().Any(card => card.IsFacedown() || !card.HasType(CardType.Xyz)); + } + + /// + /// check enemy's dangerous card in grave + /// + public List CheckDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && card.HasSetcode(SetcodeOrcust)).ToList(); + return result; + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool SpellNegatable(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap()) + { + if (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true)) return true; + } + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) { + return true; + } + } + // how to get here? + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true){ + if (Card.IsSpell() || Card.IsTrap()){ + if (SpellNegatable()) return true; + } + if (CheckCalledbytheGrave(Card.Id) > 0){ + return true; + } + if (Card.IsMonster() && Card.Location == CardLocation.MonsterZone && Card.IsDefense()) + { + if (Enemy.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled()) != null + || Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled()) != null) + { + return true; + } + } + if (disablecheck){ + return Card.IsDisabled(); + } + return false; + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + List list = new List { 0, 1, 2, 3, 4 }; + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(n + 1); + int temp = list[index]; + list[index] = list[n]; + list[n] = temp; + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + AI.SelectPlace(zone); + return; + }; + } + AI.SelectPlace(0); + } + + public void SelectXyzMaterial(int num = 2, bool needExosister = false) + { + List materialList = Bot.GetMonsters().Where(card => CheckAbleForXyz(card)).ToList(); + if (materialList?.Count() < num) + { + return; + } + if (needExosister && !materialList.Any(card => card.HasSetcode(SetcodeExosister))) + { + return; + } + List selectedList = new List(); + + // if needed, select exosister with less atk first + if (needExosister) + { + List exosisterList = materialList.Where(card => card.HasSetcode(SetcodeExosister)).ToList(); + exosisterList.Sort(CardContainer.CompareCardAttack); + ClientCard firstSelect = exosisterList[0]; + selectedList.Add(firstSelect); + materialList.Remove(firstSelect); + } + + // select non-exosister or effecte used's exosister first + // never use martha first + List sortMaterialList = materialList.Where(card => + (card?.Data != null && !card.HasSetcode(SetcodeExosister)) || (exosisterTransformEffectList.Contains(card.Id) && card.Id != CardId.ExosisterMartha)).ToList(); + sortMaterialList.Sort(CardContainer.CompareCardAttack); + foreach (ClientCard card in sortMaterialList) + { + selectedList.Add(card); + if (selectedList.Count() >= num) + { + AI.SelectMaterials(selectedList); + return; + } + } + + List valuableMaterialList = materialList.Where(card => card.Id == CardId.ExosisterMartha || !exosisterTransformEffectList.Contains(card.Id)).ToList(); + valuableMaterialList.Sort(CardContainer.CompareCardAttack); + foreach (ClientCard card in valuableMaterialList) + { + selectedList.Add(card); + if (selectedList.Count() >= num) + { + AI.SelectMaterials(selectedList); + return; + } + } + } + + public void SelectDetachMaterial(ClientCard activateCard) + { + // TODO + AI.SelectCard(0); + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + /// + /// check whether enemy activate important card + /// + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.MaxxC) && CheckCalledbytheGrave(_CardId.MaxxC) == 0) + { + enemyActivateMaxxC = true; + } + if (card.IsCode(_CardId.LockBird) && CheckCalledbytheGrave(_CardId.LockBird) == 0) + { + enemyActivateLockBird = true; + } + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4-i); + break; + } + } + } + if (Duel.LastChainLocation == CardLocation.Grave && card.Location == CardLocation.Grave) + { + Logger.DebugWriteLine("===Exosister: enemy activate effect from GY."); + enemyMoveGrave = true; + } + } + base.OnChaining(player, card); + } + + public override void OnSelectChain(IList cards) + { + int player = Duel.LastChainPlayer; + ClientCard card = Util.GetLastChainCard(); + if (player == 1) + { + if (card != null && card.IsCode(_CardId.CalledByTheGrave)) + { + foreach (ClientCard targetCard in Duel.LastChainTargets) { + Logger.DebugWriteLine("===Exosister: " + targetCard?.Name + " is targeted by called by the grave."); + calledbytheGraveCount[targetCard.Id] = 2; + } + } + foreach (ClientCard targetCard in Duel.LastChainTargets) { + if (targetCard.Location == CardLocation.Grave) + { + Logger.DebugWriteLine("===Exosister: enemy target cards of GY."); + enemyMoveGrave = true; + break; + } + } + } + base.OnSelectChain(cards); + } + + /// + /// clear chain information + /// + public override void OnChainEnd() + { + enemyMoveGrave = false; + paxCallToField = false; + potActivate = false; + transformDestList.Clear(); + targetedMagnificaList.Clear(); + if (activatedMagnificaList.Count() > 0) + { + for (int idx = activatedMagnificaList.Count() - 1; idx >= 0; -- idx) + { + ClientCard checkTarget = activatedMagnificaList[idx]; + if (checkTarget == null || checkTarget.IsFacedown() || checkTarget.Location != CardLocation.MonsterZone) + { + activatedMagnificaList.RemoveAt(idx); + } + } + } + if (spSummonThisTurn.Count() > 0) + { + for (int idx = spSummonThisTurn.Count() - 1; idx >= 0; -- idx) + { + ClientCard checkTarget = spSummonThisTurn[idx]; + if (checkTarget == null || checkTarget.IsFacedown() || checkTarget.Location != CardLocation.MonsterZone) + { + spSummonThisTurn.RemoveAt(idx); + } + } + } + base.OnChainEnd(); + } + + public override void OnNewTurn() + { + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + infiniteImpermanenceList.Clear(); + // CalledbytheGrave refresh + List key_list = calledbytheGraveCount.Keys.ToList(); + foreach (int dic in key_list) + { + if (calledbytheGraveCount[dic] > 1) + { + calledbytheGraveCount[dic] -= 1; + } + } + + summoned = false; + elisEffect1Activated = false; + stellaEffect1Activated = false; + irenaEffect1Activated = false; + sophiaEffect1Activated = false; + marthaEffect1Activated = false; + mikailisEffect1Activated = false; + mikailisEffect3Activated = false; + kaspitellEffect1Activated = false; + kaspitellEffect3Activated = false; + gibrineEffect1Activated = false; + gibrineEffect3Activated = false; + asophielEffect1Activated = false; + asophielEffect3Activated = false; + sakitamaEffect1Activated = false; + exosisterTransformEffectList.Clear(); + oncePerTurnEffectActivatedList.Clear(); + activatedMagnificaList.Clear(); + spSummonThisTurn.Clear(); + } + + /// + /// override for exosister's transform + /// + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + bool beginTransformCheck = false; + // transform for main monster + if (hint == HintMsg.SpSummon && min == 1 && max == 1 && transformDestList.Count() > 0) + { + // check whether for transform + if (cards.All(card => card.Location == CardLocation.Extra && card.Rank == 4 && card.HasSetcode(SetcodeExosister))) + { + beginTransformCheck = true; + } + } + // transform for magnifica + if (hint == HintMsg.ToDeck && min == 1 && max == 1 && transformDestList.Count() > 0) + { + if (cards.All(card => card.Location == CardLocation.Overlay)) + { + beginTransformCheck = true; + } + } + if (beginTransformCheck) + { + for (int idx = 0; idx < transformDestList.Count(); ++ idx) + { + int targetId = transformDestList[idx]; + ClientCard targetCard = cards.FirstOrDefault(card => card.IsCode(targetId)); + if (targetCard != null) + { + List result = new List(); + result.Add(targetCard); + transformDestList.RemoveAt(idx); + spSummonThisTurn.AddRange(result); + return Util.CheckSelectCount(result, cards, min, max); + } + } + } + + if (Util.ChainContainsCard(_CardId.EvenlyMatched) && Util.ChainContainPlayer(1) && hint == HintMsg.Remove) + { + int botCount = Bot.GetMonsterCount() + Bot.GetSpellCount(); + int oppositeCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (botCount - oppositeCount == min && min == max) + { + Logger.DebugWriteLine("===Exosister: Evenly Matched activated."); + List allBotCards = new List(); + allBotCards.AddRange(Bot.GetMonsters()); + allBotCards.AddRange(Bot.GetSpells()); + List importantList = new List(); + + List magnificaList = allBotCards.Where(card => card.IsCode(CardId.ExosistersMagnifica)).ToList(); + if (magnificaList.Count > 0) + { + allBotCards.RemoveAll(c => magnificaList.Contains(c)); + importantList.AddRange(magnificaList); + } + if (!mikailisEffect1Activated) + { + List mikailisList = allBotCards.Where(card => spSummonThisTurn.Contains(card) + && card.IsCode(CardId.ExosisterMikailis) && card.IsFaceup()).ToList(); + if (mikailisList.Count > 0) + { + allBotCards.RemoveAll(c => mikailisList.Contains(c)); + importantList.AddRange(mikailisList); + } + } + if (!gibrineEffect1Activated) + { + List gibrineList = allBotCards.Where(card => spSummonThisTurn.Contains(card) + && card.IsCode(CardId.ExosisterGibrine) && card.IsFaceup()).ToList(); + if (gibrineList.Count > 0) + { + allBotCards.RemoveAll(c => gibrineList.Contains(c)); + importantList.AddRange(gibrineList); + } + } + if (!oncePerTurnEffectActivatedList.Contains(CardId.ExosisterVadis)) + { + List vadisList = allBotCards.Where(card => card.IsCode(CardId.ExosisterVadis) && card.IsFacedown()).ToList(); + if (vadisList.Count > 0) + { + allBotCards.RemoveAll(c => vadisList.Contains(c)); + importantList.AddRange(vadisList); + } + } + List xyzList = allBotCards.Where(card => card.IsMonster() && card.HasType(CardType.Xyz)).ToList(); + if (xyzList.Count > 0) + { + xyzList.Sort(CardContainer.CompareCardAttack); + xyzList.Reverse(); + allBotCards.RemoveAll(c => xyzList.Contains(c)); + importantList.AddRange(xyzList); + } + List monsterList = allBotCards.Where(card => card.IsMonster()).ToList(); + if (monsterList.Count > 0) + { + monsterList.Sort(CardContainer.CompareCardAttack); + monsterList.Reverse(); + allBotCards.RemoveAll(c => monsterList.Contains(c)); + importantList.AddRange(monsterList); + } + List faceDownList = allBotCards.Where(card => card.IsFacedown()).ToList(); + if (faceDownList.Count > 0) + { + allBotCards.RemoveAll(c => faceDownList.Contains(c)); + importantList.AddRange(ShuffleCardList(faceDownList)); + } + + importantList.Reverse(); + return Util.CheckSelectCount(importantList, cards, min, max); + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Util.IsTurn1OrMain2()) + { + bool turnDefense = false; + if (cardId == CardId.DivineArsenalAAZEUS_SkyThunder || cardId == CardId.ExosistersMagnifica) + { + turnDefense = true; + } + if (!cardData.HasType(CardType.Xyz)) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (!cardData.HasType(CardType.Xyz) || cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardData.Attack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + /// + /// override for magnifica's spsummon + /// + public override bool OnSelectYesNo(int desc) + { + // magnifica spsummon + if (desc == Util.GetStringId(CardId.ExosistersMagnifica, 2)) + { + return true; + } + // pax spsummon + if (desc == Util.GetStringId(CardId.ExosisterPax, 1)) + { + return paxCallToField; + } + + return base.OnSelectYesNo(desc); + } + + /// + /// override for returnia's option + /// + public override int OnSelectOption(IList options) + { + // check retunia + int spSummonOption = -1; + int banishOption = -1; + int doNothingOption = -1; + for (int idx = 0; idx < options.Count(); ++ idx) + { + int option = options[idx]; + if (option == Util.GetStringId(CardId.ExosisterReturnia, 0)) + { + spSummonOption = idx; + } else if (option == Util.GetStringId(CardId.ExosisterReturnia, 1)) + { + banishOption = idx; + } else if (option == Util.GetStringId(CardId.ExosisterReturnia, 2)) + { + doNothingOption = idx; + } + } + + if (spSummonOption >= 0 || banishOption >= 0 || doNothingOption >= 0) + { + if (spSummonOption < 0 && banishOption < 0) + { + return doNothingOption; + } + if (banishOption >= 0) + { + // banish problem card + ClientCard target = GetProblematicEnemyCard(true); + if (target != null) + { + AI.SelectCard(target); + return banishOption; + } + + // dump banish + target = GetBestEnemyCard(false, false); + if (target != null) + { + AI.SelectCard(target); + return banishOption; + } + } + if (spSummonOption >= 0) + { + // TODO + } + } + + // check pot + int potBanish6Option = -1; + int potBanish3Option = -1; + for (int idx = 0; idx < options.Count(); ++idx) + { + int option = options[idx]; + if (option == Util.GetStringId(CardId.PotofExtravagance, 0)) + { + potBanish3Option = idx; + } + else if (option == Util.GetStringId(CardId.PotofExtravagance, 1)) + { + potBanish6Option = idx; + } + } + if (potBanish3Option >= 0 || potBanish6Option >= 0) + { + if (Bot.ExtraDeck.Count() > 9 && potBanish6Option >= 0) + { + return potBanish6Option; + } + return potBanish3Option; + } + + return base.OnSelectOption(options); + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + if (CheckAtAdvantage()) + { + return false; + } + } + CheckDeactiveFlag(); + return DefaultAshBlossomAndJoyousSpring(); + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + // negate before effect used + foreach(ClientCard m in Enemy.GetMonsters()) + { + if (m.IsMonsterShouldBeDisabledBeforeItUseEffect() && !m.IsDisabled() && Duel.LastChainPlayer != 0) + { + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++ i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(m); + return true; + } + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ( (this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || (Util.IsChainTarget(Card)) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + List enemyMonsters = Enemy.GetMonsters(); + CheckDeactiveFlag(); + AI.SelectCard(target); + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + if ( (LastChainCard == null || LastChainCard.Controller != 1 || LastChainCard.Location != CardLocation.MonsterZone + || LastChainCard.IsDisabled() || LastChainCard.IsShouldNotBeTarget() || LastChainCard.IsShouldNotBeSpellTrapTarget()) ) + return false; + // negate monsters + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (LastChainCard != null) AI.SelectCard(LastChainCard); + else + { + List enemyMonsters = Enemy.GetMonsters(); + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach (ClientCard card in enemyMonsters) + { + if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + { + CheckDeactiveFlag(); + AI.SelectCard(card); + return true; + } + } + } + return true; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated(true)) return false; + if (Duel.LastChainPlayer == 1) + { + // negate + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().Id; + if (code == 0) return false; + if (CheckCalledbytheGrave(code) > 0) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + if (code == CardId.DimensionShifter) + { + return false; + } + if (Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)) != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + CheckDeactiveFlag(); + return true; + } + } + + // banish target + foreach (ClientCard cards in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(cards)) + { + int code = cards.Id; + AI.SelectCard(cards); + calledbytheGraveCount[code] = 2; + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = CheckDangerousCardinEnemyGrave(true); + if (targets.Count() > 0) { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + return true; + } + + return false; + } + + public List GetPotofExtravaganceBanish() + { + List banishList = new List(); + ClientCard aaZeus = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.DivineArsenalAAZEUS_SkyThunder)); + if (aaZeus != null) + { + banishList.Add(aaZeus); + } + + ClientCard diamond = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.StellarknightConstellarDiamond)); + if (diamond != null) + { + banishList.Add(diamond); + } + + ClientCard caduceus = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.TellarknightConstellarCaduceus)); + if (caduceus != null) + { + banishList.Add(caduceus); + } + + ClientCard evilswarm = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(_CardId.EvilswarmExcitonKnight)); + if (evilswarm != null) + { + banishList.Add(evilswarm); + } + + // second asophiel + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosisterAsophiel)) > 1) + { + ClientCard asophiel2 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterAsophiel)); + banishList.Add(asophiel2); + } + + ClientCard gibrine = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterGibrine)); + if (gibrine != null) + { + banishList.Add(gibrine); + } + + // 6 done + + // third mikailis + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosisterMikailis)) > 2) + { + ClientCard mikailis3 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterMikailis)); + banishList.Add(mikailis3); + } + + // first asophiel + ClientCard asophiel1 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterAsophiel) && !banishList.Contains(card)); + if (asophiel1 != null) + { + banishList.Add(asophiel1); + } + + ClientCard donner = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.DonnerDaggerFurHire)); + if (donner != null) + { + banishList.Add(donner); + } + + // 9 done + + // second kaspitell + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosisterKaspitell)) > 1) + { + ClientCard kaspitell = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterKaspitell)); + banishList.Add(kaspitell); + } + + // second magnifica + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosistersMagnifica)) > 1) + { + ClientCard magnifica2 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosistersMagnifica)); + banishList.Add(magnifica2); + } + + // second mikailis + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosisterMikailis)) > 1) + { + ClientCard mikailis2 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterMikailis) && !banishList.Contains(card)); + banishList.Add(mikailis2); + } + + // first magnifica + ClientCard magnifica1 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosistersMagnifica) && !banishList.Contains(card)); + if (magnifica1 != null) + { + banishList.Add(magnifica1); + } + + // first kaspitell + ClientCard kaspitell1 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterKaspitell) && !banishList.Contains(card)); + if (kaspitell1 != null) + { + banishList.Add(kaspitell1); + } + + // first mikailis1 + ClientCard mikailis1 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterMikailis) && !banishList.Contains(card)); + if (mikailis1 != null) + { + banishList.Add(mikailis1); + } + + return banishList; + } + + public bool PotofExtravaganceActivate() + { + if (CheckWhetherNegated()) + { + return false; + } + List banishList = GetPotofExtravaganceBanish(); + + List addToHandOrderList = new List(); + + bool marthaActivatable = CheckMarthaActivatable(); + if (marthaActivatable) + { + if (!Bot.HasInHand(CardId.ExosisterMartha)) + { + addToHandOrderList.Add(CardId.ExosisterMartha); + } + if (Bot.HasInHand(CardId.ExosisterMartha) && !Bot.HasInHandOrInSpellZone(_CardId.CalledByTheGrave)) + { + addToHandOrderList.Add(_CardId.CalledByTheGrave); + } + } + int exosisterCount = Bot.Hand.Count(card => card?.Data != null && card.HasSetcode(SetcodeExosister)); + if (!stellaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterStella) == 0) + { + if (!Bot.HasInHand(CardId.ExosisterStella) && exosisterCount > 0) + { + addToHandOrderList.Add(CardId.ExosisterStella); + } + if (Bot.HasInHand(CardId.ExosisterStella) && exosisterCount == 0) + { + addToHandOrderList.AddRange(new List{ + CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.ExosisterElis}); + } + } + if (exosisterCount >= 0 && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + addToHandOrderList.Add(CardId.ExosisterReturnia); + } + List remainOrderList = new List{ + CardId.Aratama, CardId.Sakitama, _CardId.MaxxC, _CardId.AshBlossom, _CardId.InfiniteImpermanence, + _CardId.CalledByTheGrave, CardId.ExosisterVadis, CardId.ExosisterReturnia, CardId.ExosisterPax + }; + addToHandOrderList.AddRange(remainOrderList); + + AI.SelectCard(banishList); + AI.SelectNextCard(addToHandOrderList); + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + + potActivate = true; + return true; + } + + public bool SakitamaActivate() + { + // summon + if (Card.Location == CardLocation.Hand) + { + // summon for xyz + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1) + { + AI.SelectCard(CardId.Aratama, CardId.Sakitama); + sakitamaEffect1Activated = true; + return true; + } + + // summon for summon donner + if (!CheckLessOperation() && Bot.HasInExtra(CardId.DonnerDaggerFurHire) && + !Bot.HasInHand(CardId.ExosisterMartha) || Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + List illegalList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz) && card.Level != 4 + && (card.Data == null || !card.HasSetcode(SetcodeExosister))).ToList(); + if (illegalList.Count() > 0) + { + if (illegalList.Count() == 1) + { + List otherMaterialList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz)).ToList(); + otherMaterialList.Sort(CardContainer.CompareCardAttack); + illegalList.AddRange(otherMaterialList); + } + if (illegalList.Count() == 1) + { + Logger.DebugWriteLine("===Exosister: activate sakitama for donner"); + AI.SelectCard(CardId.Aratama, CardId.Sakitama); + sakitamaEffect1Activated = true; + return true; + } + } + } + return false; + } + // add to hand + if (Card.Location == CardLocation.Grave) + { + AI.SelectCard(CardId.Sakitama, CardId.Aratama); + return true; + } + return true; + } + + public bool DonnerDaggerFurHireActivate() + { + if (CheckAtAdvantage() && !Bot.HasInHand(CardId.ExosisterMartha) && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + return false; + } + + ClientCard targetCard = Util.GetProblematicEnemyMonster(canBeTarget: true); + if (targetCard == null) + { + List enemyMonsters = Enemy.GetMonsters(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + targetCard = enemyMonsters[0]; + } + } + + if (targetCard != null) + { + AI.SelectCard(Card); + AI.SelectNextCard(targetCard); + return true; + } + + return false; + } + + public bool ExosisterElisActivate() + { + if (ActivateDescription != Util.GetStringId(CardId.ExosisterElis, 0)) + { + return false; + } + + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1) + { + elisEffect1Activated = true; + return true; + } + + return false; + } + + public bool ExosisterStellaActivate() + { + return ExosisterStellaActivateInner(true); + } + + public bool ExosisterStellaSecondActivate() + { + return ExosisterStellaActivateInner(false); + } + + public bool ExosisterStellaActivateInner(bool checkMartha = false) + { + if (ActivateDescription != Util.GetStringId(CardId.ExosisterStella, 0) || CheckWhetherNegated(true)) + { + return false; + } + + bool ableToXyz = Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) >= 2; + + if (CheckLessOperation() && ableToXyz) + { + return false; + } + if (checkMartha && Bot.HasInHand(CardId.ExosisterMartha) && ableToXyz + && Bot.Hand.Count(card => card.IsMonster() && card.HasSetcode(CardId.ExosisterMartha)) == 1) + { + return false; + } + + AI.SelectCard(CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterElis); + stellaEffect1Activated = true; + return true; + } + + public bool ExosisterIreneActivate() + { + if (ActivateDescription != Util.GetStringId(CardId.ExosisterIrene, 0) || CheckWhetherNegated(true)) + { + return false; + } + + List shuffleList = new List(); + foreach (int cardId in new List{CardId.ExosisterIrene, CardId.ExosisterSophia, CardId.ExosisterArment}) + { + if (Bot.HasInHand(cardId)) + { + shuffleList.Add(cardId); + } + } + if (elisEffect1Activated || Bot.Hand.Count(card => card.IsCode(CardId.ExosisterElis)) > 1) + { + shuffleList.Add(CardId.ExosisterElis); + } + foreach (int cardId in new List{CardId.ExosisterPax, CardId.ExosisterReturnia, CardId.ExosisterVadis}) + { + if ((oncePerTurnEffectActivatedList.Contains(cardId) && Bot.HasInHand(cardId)) || Bot.Hand.Count(card => card.IsCode(cardId)) > 1) + { + shuffleList.Add(cardId); + } + } + + if (shuffleList.Count() > 0) + { + Logger.DebugWriteLine("===Exosister: irene return " + shuffleList[0]); + AI.SelectCard(shuffleList); + return true; + } + return false; + } + + public bool ExosisterSophiaActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.ExosisterSophia, 0) && !CheckWhetherNegated(true)) + { + sophiaEffect1Activated = true; + return true; + } + return false; + } + + public bool ExosisterMarthaActivate() + { + if (ActivateDescription != Util.GetStringId(CardId.ExosisterMartha, 0)) { + return false; + } + if (CheckLessOperation() && Bot.GetMonsterCount() > 0) + { + return false; + } + + marthaEffect1Activated = true; + return true; + } + + public bool DefaultExosisterTransform() + { + List canTransformList = new List + { + CardId.ExosisterElis, CardId.ExosisterStella, CardId.ExosisterIrene, CardId.ExosisterSophia, CardId.ExosisterMartha + }; + if (Card.IsDisabled() || !canTransformList.Contains(Card.Id)) + { + return false; + } + List checkTransformCode = new List{ + Util.GetStringId(CardId.ExosisterElis, 1), + Util.GetStringId(CardId.ExosisterStella, 1), + Util.GetStringId(CardId.ExosisterIrene, 1), + Util.GetStringId(CardId.ExosisterSophia, 1), + Util.GetStringId(CardId.ExosisterMartha, 1) + }; + if (!checkTransformCode.Contains(ActivateDescription) && ActivateDescription != -1) + { + return false; + } + + // mikailis + if (!Bot.HasInMonstersZone(CardId.ExosisterMikailis) && !mikailisEffect1Activated && (Duel.Player == 1 || !mikailisEffect3Activated) + && !transformDestList.Contains(CardId.ExosisterMikailis) && Bot.HasInExtra(CardId.ExosisterMikailis)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterMikailis); + return true; + } + + // kaspitell on bot's turn + if (!Bot.HasInMonstersZone(CardId.ExosisterKaspitell) && !kaspitellEffect3Activated && Duel.Player == 0 + && !transformDestList.Contains(CardId.ExosisterKaspitell) && Bot.HasInExtra(CardId.ExosisterKaspitell)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterKaspitell); + return true; + } + + // gibrine + if (!Bot.HasInMonstersZone(CardId.ExosisterGibrine) && !gibrineEffect1Activated + && !transformDestList.Contains(CardId.ExosisterGibrine) && Bot.HasInExtra(CardId.ExosisterGibrine)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterGibrine); + return true; + } + + // asophiel + if (!Bot.HasInMonstersZone(CardId.ExosisterAsophiel) && !asophielEffect1Activated + && !transformDestList.Contains(CardId.ExosisterAsophiel) && Bot.HasInExtra(CardId.ExosisterAsophiel)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterAsophiel); + return true; + } + + // kaspitell on bot's turn + if (!Bot.HasInMonstersZone(CardId.ExosisterKaspitell) && !kaspitellEffect1Activated + && !transformDestList.Contains(CardId.ExosisterKaspitell) && Bot.HasInExtra(CardId.ExosisterKaspitell)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterKaspitell); + return true; + } + + return false; + } + + public bool ExosisterMikailisActivate() + { + // banish + if (ActivateDescription == Util.GetStringId(CardId.ExosisterMikailis, 0)) + { + // activate after search + if (Duel.Player == 0 && !mikailisEffect3Activated && Duel.Phase < DuelPhase.End && !DefaultOnBecomeTarget()) + { + return false; + } + + // banish problem card + ClientCard target = GetProblematicEnemyCard(true); + if (target != null && Duel.LastChainPlayer != 0) + { + removeChosenList.Add(target); + mikailisEffect1Activated = true; + AI.SelectCard(target); + return true; + } + + // banish target + if (Duel.LastChainPlayer == 1) + { + List targetList = Duel.LastChainTargets.Where(card => card.Controller == 1 && + (card.Location == CardLocation.Grave || card.Location == CardLocation.MonsterZone || card.Location == CardLocation.SpellZone || card.Location == CardLocation.FieldZone)).ToList(); + if (targetList.Count() > 0) + { + mikailisEffect1Activated = true; + AI.SelectCard(ShuffleCardList(targetList)); + return true; + } + } + + // dump banish + target = GetBestEnemyCard(false, true, true); + if ((DefaultOnBecomeTarget() && !Util.ChainContainsCard(_CardId.EvenlyMatched)) || Bot.UnderAttack || (Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0) + || (Duel.Player == 0 && Bot.GetMonsters().Count(card => card.HasType(CardType.Xyz) && card.Rank == 4 && card.HasSetcode(SetcodeExosister)) == 2 && Duel.LastChainPlayer != 0) + || (Duel.Player == 1 && Enemy.GetMonsterCount() >= 2)) + { + mikailisEffect1Activated = true; + AI.SelectCard(target); + return true; + } + return false; + } + + // search + if (CheckWhetherNegated(true)) + { + return false; + } + + List searchTarget = new List{ + CardId.ExosisterReturnia, + CardId.ExosisterVadis, + CardId.ExosisterPax, + CardId.ExosisterArment + }; + List firstSearchList = new List(); + List lastSearchList = new List(); + foreach (int cardId in searchTarget) + { + if (Bot.HasInHandOrInSpellZone(cardId) || CheckRemainInDeck(cardId) == 0) + { + lastSearchList.Add(cardId); + continue; + } + if (cardId == CardId.ExosisterReturnia && Bot.GetMonsters().Any(card => card.IsFacedown() || !card.HasSetcode(SetcodeExosister))) + { + lastSearchList.Add(cardId); + continue; + } + firstSearchList.Add(cardId); + } + firstSearchList.AddRange(lastSearchList); + + mikailisEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(firstSearchList); + return true; + } + + public bool ExosisterKaspitellActivate() + { + // block spsummon from GY + if (ActivateDescription == Util.GetStringId(CardId.ExosisterKaspitell, 0) || ActivateDescription == -1) + { + if (Enemy.HasInMonstersZone(CardId.InspectorBoarder, true)) + { + return false; + } + kaspitellEffect1Activated = true; + return true; + } + + // search + if (CheckWhetherNegated(true)) + { + return false; + } + + // search martha for activate + if (CheckMarthaActivatable() && CheckRemainInDeck(CardId.ExosisterMartha) > 0 && !Bot.HasInHand(CardId.ExosisterMartha)) + { + kaspitellEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(CardId.ExosisterMartha); + return true; + } + // search sophia for draw + if (!summoned && !sophiaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterSophia) == 0 && !Bot.HasInHand(CardId.ExosisterSophia) + && (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1 || (Bot.HasInHand(CardId.ExosisterElis) && !elisEffect1Activated))) + { + kaspitellEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(CardId.ExosisterSophia); + return true; + } + // search stella for next xyz + if (!summoned && !Bot.HasInHand(CardId.ExosisterStella) && !stellaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterStella) == 0 + && CheckRemainInDeck(CardId.ExosisterStella) > 0 && Bot.Hand.Any(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister))) + { + kaspitellEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(CardId.ExosisterStella); + return true; + } + kaspitellEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(CardId.ExosisterMartha, CardId.ExosisterStella, CardId.ExosisterElis, CardId.ExosisterSophia, CardId.ExosisterIrene); + return true; + } + + public bool ExosisterGibrineActivate() + { + // negate + if (ActivateDescription == Util.GetStringId(CardId.ExosisterGibrine, 0)) + { + if (Duel.Player == 1) + { + ClientCard target = Enemy.MonsterZone.GetShouldBeDisabledBeforeItUseEffectMonster(); + if (target != null) + { + gibrineEffect1Activated = true; + AI.SelectCard(target); + return true; + } + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + if (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone && + !LastChainCard.IsDisabled() && !LastChainCard.IsShouldNotBeTarget() && !LastChainCard.IsShouldNotBeMonsterTarget()) + { + gibrineEffect1Activated = true; + AI.SelectCard(LastChainCard); + return true; + } + + return false; + } + + // gain atk + if (CheckWhetherNegated(true)) + { + return false; + } + gibrineEffect3Activated = true; + SelectDetachMaterial(Card); + return true; + } + + public bool ExosisterAsophielActivate() + { + // block activate from GY + if (ActivateDescription == Util.GetStringId(CardId.ExosisterAsophiel, 0) || ActivateDescription == -1) + { + if (Enemy.HasInMonstersZone(CardId.InspectorBoarder, true)) + { + return false; + } + asophielEffect1Activated = true; + return true; + } + + // return hand + if (CheckWhetherNegated(true)) + { + return false; + } + ClientCard targetCard = Util.GetProblematicEnemyMonster(0, true); + if (targetCard != null) + { + asophielEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(targetCard); + return true; + } + + return false; + } + + public bool ExosistersMagnificaActivateTrigger() + { + // sp summon + if (ActivateDescription == Util.GetStringId(CardId.ExosistersMagnifica, 1)) + { + // return after effect used + if (activatedMagnificaList.Contains(Card)) + { + // return to Mikailis for danger card + if (Card.Overlays.Contains(CardId.ExosisterMikailis) && !mikailisEffect1Activated) + { + ClientCard target = GetProblematicEnemyCard(true); + if (target != null && !Duel.CurrentChain.Any(card => card == Card)) + { + transformDestList.Add(CardId.ExosisterMikailis); + return true; + } + } + + // negate important card + if (Card.Overlays.Contains(CardId.ExosisterGibrine) && !gibrineEffect1Activated) + { + ClientCard target = Enemy.MonsterZone.GetShouldBeDisabledBeforeItUseEffectMonster(); + if (target != null) + { + transformDestList.Add(CardId.ExosisterGibrine); + return true; + } + } + } + + // become target + if (DefaultOnBecomeTarget() || (Duel.CurrentChain.Any(c => c == Card) && Duel.LastChainPlayer != 0)) + { + targetedMagnificaList.Add(Card); + transformDestList.AddRange(new List{CardId.ExosistersMagnifica, CardId.ExosisterMikailis, CardId.ExosisterGibrine, CardId.ExosisterKaspitell, CardId.ExosisterAsophiel}); + return true; + } + } + return false; + } + public bool ExosistersMagnificaActivateBanish() + { + // banish + if (ActivateDescription == Util.GetStringId(CardId.ExosistersMagnifica, 0)) + { + if (CheckWhetherNegated()) + { + return false; + } + // banish problem card + ClientCard target = GetProblematicEnemyCard(); + bool isProblemCard = false; + if (target != null) + { + isProblemCard = true; + Logger.DebugWriteLine("===Exosister: magnifica target 1: " + target?.Name); + } + + // banish target + if (Duel.LastChainPlayer == 1 && target == null) + { + List currentTargetList = Duel.LastChainTargets.Where(card => card.Controller == 1 && + (card.Location == CardLocation.MonsterZone || card.Location == CardLocation.SpellZone || card.Location == CardLocation.FieldZone)).ToList(); + if (currentTargetList.Count() > 0) + { + target = ShuffleCardList(currentTargetList)[0]; + Logger.DebugWriteLine("===Exosister: magnifica target 2: " + target?.Name); + } + } + + // dump banish + if (target == null) + { + target = GetBestEnemyCard(false, false); + bool check1 = !DefaultOnBecomeTarget() || Util.ChainContainsCard(_CardId.EvenlyMatched); + bool check2 = !targetedMagnificaList.Contains(Card); + bool check3 = !Bot.UnderAttack; + bool check4 = Duel.Phase != DuelPhase.End; + bool check5 = Duel.Player == 0 || Enemy.GetMonsterCount() < 2; + Logger.DebugWriteLine("===Exosister: magnifica check flag: " + check1 + " " + check2 + " " + check3 + " " + check4 + " " + check5); + if (check1 && check2 && check3 && check4 && check5) + { + target = null; + } + } + + if (target != null && (Duel.LastChainPlayer != 0 || Util.GetLastChainCard() == Card)) + { + if (isProblemCard) + { + removeChosenList.Add(target); + } + Logger.DebugWriteLine("===Exosister: magnifica target final: " + target?.Name); + activatedMagnificaList.Add(Card); + AI.SelectCard(CardId.ExosisterGibrine, CardId.ExosisterAsophiel, CardId.ExosisterKaspitell, CardId.ExosisterMikailis); + AI.SelectNextCard(target); + return true; + } + + return false; + } + return false; + } + + public bool ExosisterPaxActivate() + { + if (potActivate) + { + return false; + } + + List checkListForSpSummon = new List{ + CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.ExosisterElis + }; + List checkListForSearch = new List{ + CardId.ExosisterMartha, CardId.ExosisterStella, CardId.ExosisterVadis, CardId.ExosisterReturnia, CardId.ExosisterSophia, + CardId.ExosisterIrene, CardId.ExosisterArment, CardId.ExosisterElis + }; + if (Duel.Player == 0 && Duel.LastChainPlayer != 0) + { + // search returnia for banish + if (CheckAtAdvantage() && GetProblematicEnemyCard(true) != null && CheckRemainInDeck(CardId.ExosisterReturnia) > 0 && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + if (Bot.GetMonsterCount() > 0 && Bot.GetMonsters().All(card => card.IsFaceup() && card.HasSetcode(SetcodeExosister))) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterReturnia); + paxCallToField = false; + return true; + } + } + + // search martha for activate + if (CheckMarthaActivatable() && CheckRemainInDeck(CardId.ExosisterMartha) > 0 && !Bot.HasInHand(CardId.ExosisterMartha)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterMartha); + paxCallToField = false; + return true; + } + + // stella relative + if (!stellaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterStella) == 0) + { + // try to search stella + if (Bot.Hand.Count(card => card.IsCode(CardId.ExosisterStella)) == 0 && CheckRemainInDeck(CardId.ExosisterStella) > 0) + { + bool shouldSpSummon = !CheckLessOperation() && summoned && Bot.HasInMonstersZoneOrInGraveyard(CardId.ExosisterElis); + if (Bot.Hand.Any(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister))) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterStella); + paxCallToField = shouldSpSummon; + return true; + } + } + + // search monster for stella to summon + bool searchExosisterMonster = false; + if (Bot.HasInHand(CardId.ExosisterStella) && Bot.Hand.Count(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister)) == 1) + { + searchExosisterMonster = true; + } + if (Bot.HasInMonstersZone(CardId.ExosisterStella) && Bot.Hand.Count(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister)) == 0) + { + searchExosisterMonster = true; + } + if (searchExosisterMonster) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterMartha, CardId.ExosisterStella, CardId.ExosisterElis); + paxCallToField = false; + return true; + } + } + + // addition summon + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1 && summoned && !CheckLessOperation()) + { + if ( (sakitamaEffect1Activated || !Bot.HasInHand(CardId.Sakitama)) + && (stellaEffect1Activated || !Bot.HasInMonstersZone(CardId.ExosisterStella)) + && (elisEffect1Activated || !Bot.HasInHand(CardId.ExosisterElis)) + ) + { + foreach (int checkId in checkListForSpSummon) + { + int checkTarget = CheckExosisterMentionCard(checkId); + if (checkTarget > 0 && Bot.HasInMonstersZoneOrInGraveyard(checkId) && CheckRemainInDeck(checkTarget) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(checkId); + paxCallToField = true; + return true; + } + } + } + } + } + + // in danger + bool inDanger = CheckInDanger(); + + // trigger transform + CheckEnemyMoveGrave(); + + bool forReturnia = false; + if (!oncePerTurnEffectActivatedList.Contains(CardId.ExosisterReturnia) && Bot.HasInSpellZone(CardId.ExosisterReturnia) && Bot.GetMonsters().Count() == 0) + { + forReturnia = true; + } + + // become target + if (enemyMoveGrave || DefaultOnBecomeTarget() || inDanger || forReturnia) + { + List checkList = checkListForSpSummon; + bool shouldSpSummon = enemyMoveGrave || inDanger || forReturnia; + if (!shouldSpSummon && !Bot.HasInMonstersZone(new List{ + CardId.ExosisterElis, CardId.ExosisterStella, CardId.ExosisterIrene, CardId.ExosisterSophia, CardId.ExosisterMartha})) + { + shouldSpSummon = true; + } + if (CheckAtAdvantage() && !enemyMoveGrave) + { + shouldSpSummon = false; + checkList = checkListForSearch; + } + foreach (int checkId in checkList) + { + bool checkSuccessFlag = false; + + if (shouldSpSummon) + { + int checkTarget = CheckExosisterMentionCard(checkId); + checkSuccessFlag = checkTarget > 0 && Bot.HasInMonstersZoneOrInGraveyard(checkTarget) && CheckRemainInDeck(checkId) > 0 + && !exosisterTransformEffectList.Contains(checkId) && !Bot.HasInMonstersZone(checkId); + } else + { + checkSuccessFlag = !Bot.HasInHandOrHasInMonstersZone(checkId) && !Bot.HasInSpellZone(checkId) && CheckRemainInDeck(checkId) > 0; + } + + if (checkSuccessFlag) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(checkId); + paxCallToField = shouldSpSummon; + return true; + } + } + } + + return false; + } + + public bool ExosisterPaxActivateForEndSearch() + { + if (potActivate) + { + return false; + } + + if (Duel.Player == 0 || Duel.Phase >= DuelPhase.End) + { + // search spell/trap + List checkSpellTrapListForSearch = new List{ + CardId.ExosisterVadis, CardId.ExosisterMartha, CardId.ExosisterReturnia, CardId.ExosisterStella, CardId.ExosisterSophia, + CardId.ExosisterIrene, CardId.ExosisterArment, CardId.ExosisterElis + }; + foreach (int checkId in checkSpellTrapListForSearch) + { + if (!Bot.HasInHandOrHasInMonstersZone(checkId) && !Bot.HasInSpellZone(checkId) && CheckRemainInDeck(checkId) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterMartha, CardId.ExosisterStella, CardId.ExosisterElis); + paxCallToField = false; + return true; + } + } + } + return false; + } + + public bool ExosisterArmentActivate() + { + ClientCard activateTarget = null; + + if (Duel.Player == 0) + { + bool decided = false; + + // addition summon + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1 && summoned && !CheckLessOperation()) + { + if ( (sakitamaEffect1Activated || !Bot.HasInHand(CardId.Sakitama)) + && (stellaEffect1Activated || !Bot.HasInMonstersZone(CardId.ExosisterStella)) + && (elisEffect1Activated || !Bot.HasInHand(CardId.ExosisterElis)) + ) + { + decided = true; + } + } + + if (Duel.LastChainPlayer == 1) + { + foreach (ClientCard target in Duel.LastChainTargets) + { + if (target.Controller == 0 && target.Location == CardLocation.MonsterZone && target.IsFaceup() && target.HasSetcode(SetcodeExosister)) + { + activateTarget = target; + decided = true; + break; + } + } + } + + if (!decided) + { + return false; + } + } + + if (activateTarget == null && Duel.LastChainPlayer == 1) + { + { + foreach (ClientCard target in Duel.LastChainTargets) + { + if (target.Controller == 0 && target.Location == CardLocation.MonsterZone && target.IsFaceup() && target.HasSetcode(SetcodeExosister)) + { + activateTarget = target; + break; + } + } + } + } + + if (activateTarget == null) + { + List targetList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeExosister) && !card.HasType(CardType.Xyz)).ToList(); + if (targetList.Count() > 0) + { + targetList.Sort(CardContainer.CompareCardAttack); + activateTarget = targetList[0]; + } + } + + if (activateTarget == null) + { + return false; + } + + // mikailis + if (!Bot.HasInMonstersZone(CardId.ExosisterMikailis) && !mikailisEffect1Activated && (Duel.Player == 1 || !mikailisEffect3Activated) + && !transformDestList.Contains(CardId.ExosisterMikailis) && Bot.HasInExtra(CardId.ExosisterMikailis)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterMikailis); + return true; + } + + // kaspitell on bot's turn + if (!Bot.HasInMonstersZone(CardId.ExosisterKaspitell) && !kaspitellEffect3Activated && Duel.Player == 0 + && !transformDestList.Contains(CardId.ExosisterKaspitell) && Bot.HasInExtra(CardId.ExosisterKaspitell)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterKaspitell); + return true; + } + + // gibrine + if (!Bot.HasInMonstersZone(CardId.ExosisterGibrine) && !gibrineEffect1Activated + && !transformDestList.Contains(CardId.ExosisterGibrine) && Bot.HasInExtra(CardId.ExosisterGibrine)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterGibrine); + return true; + } + + // asophiel + if (!Bot.HasInMonstersZone(CardId.ExosisterAsophiel) && !asophielEffect1Activated + && !transformDestList.Contains(CardId.ExosisterAsophiel) && Bot.HasInExtra(CardId.ExosisterAsophiel)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterAsophiel); + return true; + } + + // kaspitell on bot's turn + if (!Bot.HasInMonstersZone(CardId.ExosisterKaspitell) && !kaspitellEffect1Activated + && !transformDestList.Contains(CardId.ExosisterKaspitell) && Bot.HasInExtra(CardId.ExosisterKaspitell)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterKaspitell); + return true; + } + + return false; + } + + public bool ExosisterVadisActivate() + { + List checkListForSpSummon = new List{ + CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.ExosisterElis + }; + + bool decideToActivate = false; + bool checkTransform = false; + + // special summon for xyz + if (Duel.Player == 0 && Duel.Phase > DuelPhase.Draw && !CheckLessOperation()) + { + decideToActivate = true; + } + + // move grave + CheckEnemyMoveGrave(); + if (enemyMoveGrave) + { + decideToActivate = true; + checkTransform = true; + } + + // for returia + if (!oncePerTurnEffectActivatedList.Contains(CardId.ExosisterReturnia) && Bot.HasInSpellZone(CardId.ExosisterReturnia) && Bot.GetMonsters().Count() == 0) + { + decideToActivate = true; + } + + if (CheckInDanger() || (DefaultOnBecomeTarget() && !Util.ChainContainsCard(_CardId.EvenlyMatched))) + { + decideToActivate = true; + } + + if (decideToActivate) + { + foreach (int checkId in checkListForSpSummon) + { + int checkTarget = CheckExosisterMentionCard(checkId); + if (checkTarget > 0 && CheckRemainInDeck(checkId) > 0 && CheckRemainInDeck(checkTarget) > 0) + { + if (checkTransform) + { + int canTransformCount = 0; + foreach (int transformCheckId in new List{checkId, checkTarget}) + { + if (!Bot.HasInMonstersZone(checkId) && !exosisterTransformEffectList.Contains(checkId)) + { + canTransformCount ++; + } + } + + if (canTransformCount == 0) + { + continue; + } + } + oncePerTurnEffectActivatedList.Add(Card.Id); + Logger.DebugWriteLine("Exosiseter Vadis decide: " + checkId); + AI.SelectCard(checkId); + AI.SelectNextCard(checkTarget); + return true; + } + } + } + + return false; + } + + public bool ExosisterReturniaActivate() + { + // banish problem card + ClientCard target = GetProblematicEnemyCard(true); + if (target != null && Duel.LastChainPlayer != 0) + { + Logger.DebugWriteLine("===Exosister: returnia target 1: " + target?.Name); + removeChosenList.Add(target); + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(target); + return true; + } + + // banish target + if (Duel.LastChainPlayer == 1) + { + List targetList = Duel.LastChainTargets.Where(card => card.Controller == 1 && + (card.Location == CardLocation.Grave || card.Location == CardLocation.MonsterZone || card.Location == CardLocation.SpellZone || card.Location == CardLocation.FieldZone)).ToList(); + if (targetList.Count() > 0) + { + oncePerTurnEffectActivatedList.Add(Card.Id); + List shuffleTargetList = ShuffleCardList(targetList); + Logger.DebugWriteLine("===Exosister: returnia target 2: " + shuffleTargetList[0]?.Name); + AI.SelectCard(shuffleTargetList); + return true; + } + } + + // dump banish + target = GetBestEnemyCard(false, true, true); + bool check1 = DefaultOnBecomeTarget() && target.Id != _CardId.EvenlyMatched; + bool check2 = Bot.UnderAttack; + bool check3 = (Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0 && target != null && target.Location != CardLocation.Grave); + bool check4 = (Duel.Player == 1 && Enemy.GetMonsterCount() >= 2 && Duel.LastChainPlayer != 0); + Logger.DebugWriteLine("===Exosister: returnia check flag: " + check1 + " " + check2 + " " + check3 + " " + check4); + if (check1 || check2 || check3 || check4) + { + oncePerTurnEffectActivatedList.Add(Card.Id); + Logger.DebugWriteLine("===Exosister: returnia target 3: " + target?.Name); + AI.SelectCard(target); + return true; + } + + return false; + } + + /// + /// Check hand like exosister + elis + martha + /// + public bool ExosisterAvoidMaxxCSummonCheck() + { + if (!Bot.HasInHand(CardId.ExosisterMartha) || !Bot.HasInHand(CardId.ExosisterElis) || elisEffect1Activated || marthaEffect1Activated) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + // normal summon non-elis exosister + if (Card.Id != CardId.ExosisterElis && Card.Id != CardId.ExosisterMartha) + { + summoned = true; + return true; + } + // normal summon elis + if (Card.IsCode(CardId.ExosisterElis)) + { + int otherExosisterCount = Bot.Hand.Count(card => card?.Data != null && !card.IsCode(CardId.ExosisterElis) && !card.IsCode(CardId.ExosisterMartha) + && card.IsMonster() && card.HasSetcode(SetcodeExosister)); + if (otherExosisterCount > 0) + { + return false; + } + if (Bot.Hand.Count(card => card?.Data != null && card.IsCode(CardId.ExosisterElis)) > 1) + { + summoned = true; + return true; + } + } + + return false; + } + + /// + /// Check hand like exosister + stella + /// + public bool ExosisterStellaSummonCheck() + { + if (stellaEffect1Activated || Bot.HasInMonstersZone(CardId.ExosisterStella, true) || CheckWhetherNegated(true) || CheckLessOperation()) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + + int summonableCount = Bot.Hand.Count(card => card != Card && card?.Data != null && card.IsMonster() + && card.HasSetcode(SetcodeExosister)); + + if (summonableCount > 0) + { + summoned = true; + return true; + } + return false; + } + + /// + /// Check whether need Irene's redraw effect to search elis for xyz + /// + public bool ExosisterIreneSummonCheck() + { + if (irenaEffect1Activated || CheckLessOperation() + || CheckWhetherNegated(true) || CheckCalledbytheGrave(CardId.ExosisterElis) > 0 || CheckCalledbytheGrave(CardId.ExosisterIrene) > 0) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + + if (CheckRemainInDeck(CardId.ExosisterElis) > 0) + { + summoned = true; + return true; + } + return false; + } + + /// + /// Check hand like exosister + elis + /// + public bool ExosisterForElisSummonCheck() + { + if (elisEffect1Activated || CheckCalledbytheGrave(CardId.ExosisterElis) > 0 || CheckLessOperation()) + { + return false; + } + if (Card?.Data == null) + { + return false; + } + if (!Card.HasSetcode(SetcodeExosister) || (Card.IsCode(CardId.ExosisterMartha) && CheckRemainInDeck(CardId.ExosisterElis) > 0)) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + + if (Bot.Hand.Count(card => card != Card && card?.Data != null && card.IsCode(CardId.ExosisterElis)) > 0) + { + summoned = true; + return true; + } + + return false; + } + + public bool AratamaSummonCheck() + { + if (sakitamaEffect1Activated || CheckCalledbytheGrave(CardId.Aratama) > 0 || CheckCalledbytheGrave(CardId.Sakitama) > 0) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + if (CheckRemainInDeck(CardId.Sakitama) > 0) + { + summoned = true; + return true; + } + return false; + } + + public bool ForSakitamaSummonCheck() + { + if (sakitamaEffect1Activated || CheckCalledbytheGrave(CardId.Sakitama) > 0 || CheckLessOperation()) + { + return false; + } + if (Bot.Hand.Count(card => card?.Data != null && Card != card && card.IsCode(CardId.Sakitama)) == 0) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + if (Card?.Data != null && !Card.IsCode(CardId.ExosisterMartha) && Card.Level == 4) + { + summoned = true; + return true; + } + + return false; + } + + public bool Level4SummonCheck() + { + if (Card.Id == CardId.ExosisterMartha) + { + return false; + } + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1) + { + summoned = true; + return true; + } + return false; + } + + public bool ForDonnerSummonCheck() + { + if (!Bot.HasInExtra(CardId.DonnerDaggerFurHire) || (!Bot.HasInHand(CardId.ExosisterMartha) && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia))) + { + return false; + } + if (CheckLessOperation()) + { + return false; + } + + List illegalList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz) && card.Level != 4 + && (card.Data == null || !card.HasSetcode(SetcodeExosister))).ToList(); + if (illegalList.Count() == 0) + { + return false; + } + + if (illegalList.Count() == 1) + { + List otherMaterialList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz)).ToList(); + otherMaterialList.Sort(CardContainer.CompareCardAttack); + illegalList.AddRange(otherMaterialList); + } + if (illegalList.Count() == 1) + { + List hands = Bot.Hand.Where(card => card?.Data != null && card.IsMonster()).ToList(); + if (hands.Count() > 0) + { + hands.Sort(CardContainer.CompareCardAttack); + if (Card != hands[0]) + { + return false; + } + } + Logger.DebugWriteLine("===Exosister: summon for donner"); + summoned = true; + return true; + } + + return false; + } + + public bool ExosisterForArmentSummonCheck() + { + if (!Bot.HasInHandOrInSpellZone(CardId.ExosisterArment)) + { + return false; + } + if (Card?.Data == null) + { + return false; + } + if (!Card.HasSetcode(SetcodeExosister)) + { + return false; + } + + if (!Bot.GetMonsters().Any(card => card?.Data != null && card.IsFaceup() && card.HasSetcode(SetcodeExosister))) + { + summoned = true; + return true; + } + + return false; + } + + public bool ExosisterMikailisSpSummonCheck() + { + return ExosisterMikailisSpSummonCheckInner(true); + } + + public bool ExosisterMikailisAdvancedSpSummonCheck() + { + if (!CheckLessOperation() || enemyActivateLockBird) + { + return false; + } + + return ExosisterMikailisSpSummonCheckInner(false); + } + + public bool ExosisterMikailisSpSummonCheckInner(bool shouldCheckLessOperation = true) + { + if (Bot.HasInMonstersZone(CardId.ExosisterMikailis) || mikailisEffect3Activated || (CheckLessOperation() && shouldCheckLessOperation)) + { + return false; + } + + // check searched spell/trap + if (!enemyActivateLockBird) + { + foreach (int cardId in ExosisterSpellTrapList) + { + if (!Bot.HasInHandOrInSpellZone(cardId)) + { + SelectXyzMaterial(2); + return true; + } + } + } + + // clear enemy card + if (!mikailisEffect1Activated && !Bot.HasInMonstersZone(CardId.ExosisterMikailis)) + { + ClientCard target = GetProblematicEnemyCard(true); + if (target != null) + { + List exosisterMaterialList = Bot.GetMonsters().Where(card => CheckAbleForXyz(card) && card.HasSetcode(SetcodeExosister)).ToList(); + if (exosisterMaterialList?.Count() > 0) + { + SelectXyzMaterial(2, true); + return true; + } + } + } + + return false; + } + + public bool ExosisterKaspitellSpSummonCheck() + { + return ExosisterKaspitellSpSummonCheckInner(true); + } + + public bool ExosisterKaspitellAdvancedSpSummonCheck() + { + if (!CheckLessOperation() || enemyActivateLockBird) + { + return false; + } + return ExosisterKaspitellSpSummonCheckInner(false); + } + + public bool ExosisterKaspitellSpSummonCheckInner(bool shouldCheckLessOperation = true) + { + if (Bot.HasInMonstersZone(CardId.ExosisterKaspitell) || kaspitellEffect3Activated || (shouldCheckLessOperation && CheckLessOperation())) + { + return false; + } + + bool searchMartha = true; + bool searchStella = true; + bool forMagnifica = false; + if (marthaEffect1Activated || CheckCalledbytheGrave(CardId.ExosisterMartha) > 0 + || CheckRemainInDeck(CardId.ExosisterMartha) == 0 || CheckRemainInDeck(CardId.ExosisterElis) == 0) + { + searchMartha = false; + } + if (Bot.GetMonsters().Any(card => card.HasType(CardType.Link) || card.HasType(CardType.Token))) + { + searchMartha = false; + } + if (stellaEffect1Activated || CheckCalledbytheGrave(CardId.ExosisterStella) > 0 || CheckRemainInDeck(CardId.ExosisterStella) == 0 + || !Bot.Hand.Any(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister))) + { + searchStella = false; + } + if (Bot.GetMonsters().Count(card => card?.Data != null + && card.HasType(CardType.Xyz) && card.HasType(CardType.Xyz) && !card.IsCode(CardId.ExosistersMagnifica)) == 1) + { + forMagnifica = true; + } + if (enemyActivateLockBird) + { + searchMartha = false; + searchStella = false; + } + + if (!searchMartha && !searchStella && !forMagnifica) + { + return false; + } + + List materialCheckList = Bot.GetMonsters().Where(card => + !card.HasType(CardType.Xyz) && !card.HasType(CardType.Token) && !card.HasType(CardType.Link)).ToList(); + if (materialCheckList.Count() == 2 && materialCheckList.All(card => card.Level == 4)) + { + SelectXyzMaterial(2); + return true; + } + + return false; + } + + public bool ExosistersMagnificaSpSummonCheck() + { + if (CheckLessOperation()) + { + return false; + } + + List materialList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasType(CardType.Xyz) + && card.Rank == 4 && card.HasSetcode(SetcodeExosister)).ToList(); + materialList.Sort(CardContainer.CompareCardAttack); + + AI.SelectMaterials(materialList); + return true; + } + + public bool CheckCaduceusInner(ClientCard card) + { + if (card?.Data == null) + { + return false; + } + foreach (int setcode in SetcodeForDiamond) + { + if (card.HasSetcode(setcode)) + { + return true; + } + } + return false; + } + + public bool TellarknightConstellarCaduceusSpSummonCheck() + { + if (Duel.Turn == 1 || !Bot.HasInExtra(CardId.StellarknightConstellarDiamond)) + { + return false; + } + + // check whether need to call Diamond + if (Enemy.Graveyard.Any(card => CheckCaduceusInner(card))) + { + SelectXyzMaterial(2); + return true; + } + + return false; + } + + public bool DonnerDaggerFurHireSpSummonCheck() + { + if (!Bot.HasInHand(CardId.ExosisterMartha) && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + return false; + } + + if (CheckLessOperation()) + { + return false; + } + + List illegalList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz) && card.Level != 4 + && (card.Data == null || !card.HasSetcode(SetcodeExosister))).ToList(); + + if (illegalList.Count() == 1) + { + + List otherMaterialList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz)).ToList(); + otherMaterialList.Sort(CardContainer.CompareCardAttack); + illegalList.AddRange(otherMaterialList); + } + if (illegalList.Count() > 1) + { + AI.SelectMaterials(illegalList); + return true; + } + + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + List onlyOneSetList = new List{ + CardId.ExosisterPax, CardId.ExosisterArment, CardId.ExosisterVadis, CardId.ExosisterReturnia + }; + if (onlyOneSetList.Contains(Card.Id) && Bot.HasInSpellZone(Card.Id)) + { + return false; + } + + // select place + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } else + { + SelectSTPlace(); + } + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index c2d2ec5ab..4212a3769 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -124,6 +124,7 @@ protected class _CardId public const int VaylantzWorld_ShinraBansho = 49568943; public const int VaylantzWorld_KonigWissen = 75952542; + public const int DivineArsenalAAZEUS_SkyThunder = 90448279; } protected DefaultExecutor(GameAI ai, Duel duel) @@ -798,7 +799,8 @@ protected bool DefaultOnBecomeTarget() _CardId.BlackRoseDragon, _CardId.JudgmentDragon, _CardId.TopologicTrisbaena, - _CardId.EvenlyMatched + _CardId.EvenlyMatched, + _CardId.DivineArsenalAAZEUS_SkyThunder }; int[] destroyAllOpponentSpellList = { diff --git a/Game/Duel.cs b/Game/Duel.cs index 34f73a30e..cf4ed7d6a 100644 --- a/Game/Duel.cs +++ b/Game/Duel.cs @@ -18,8 +18,10 @@ public class Duel public BattlePhase BattlePhase { get; set; } public int LastChainPlayer { get; set; } + public CardLocation LastChainLocation { get; set; } public IList CurrentChain { get; set; } public IList ChainTargets { get; set; } + public IList LastChainTargets { get; set; } public IList ChainTargetOnly { get; set; } public int LastSummonPlayer { get; set; } public IList SummoningCards { get; set; } @@ -31,8 +33,10 @@ public Duel() Fields[0] = new ClientField(); Fields[1] = new ClientField(); LastChainPlayer = -1; + LastChainLocation = 0; CurrentChain = new List(); ChainTargets = new List(); + LastChainTargets = new List(); ChainTargetOnly = new List(); LastSummonPlayer = -1; SummoningCards = new List(); diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index b68a150f1..1b1091469 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -728,7 +728,8 @@ private void OnChaining(BinaryReader packet) card.SetId(cardId); int cc = GetLocalPlayer(packet.ReadByte()); if (_debug) - if (card != null) Logger.WriteLine("(" + cc.ToString() + " 's " + (card.Name ?? "UnKnowCard") + " activate effect)"); + if (card != null) Logger.WriteLine("(" + cc.ToString() + " 's " + (card.Name ?? "UnKnowCard") + " activate effect from " + (CardLocation)pcl + ")"); + _duel.LastChainLocation = (CardLocation)pcl; _ai.OnChaining(card, cc); //_duel.ChainTargets.Clear(); _duel.ChainTargetOnly.Clear(); @@ -742,8 +743,10 @@ private void OnChainEnd(BinaryReader packet) { _ai.OnChainEnd(); _duel.LastChainPlayer = -1; + _duel.LastChainLocation = 0; _duel.CurrentChain.Clear(); _duel.ChainTargets.Clear(); + _duel.LastChainTargets.Clear(); _duel.ChainTargetOnly.Clear(); } @@ -856,6 +859,7 @@ private void OnUpdateData(BinaryReader packet) private void OnBecomeTarget(BinaryReader packet) { + _duel.LastChainTargets.Clear(); int count = packet.ReadByte(); for (int i = 0; i < count; ++i) { @@ -868,6 +872,7 @@ private void OnBecomeTarget(BinaryReader packet) if (_debug) Logger.WriteLine("(" + (CardLocation)loc + " 's " + (card.Name ?? "UnKnowCard") + " become target)"); _duel.ChainTargets.Add(card); + _duel.LastChainTargets.Add(card); _duel.ChainTargetOnly.Add(card); } } diff --git a/WindBot.csproj b/WindBot.csproj index a3789f273..0f29b7e80 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -73,6 +73,7 @@ + From d7c88bdb9988045bba978f32061fe2afb1d80b55 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Wed, 3 May 2023 11:22:31 +0800 Subject: [PATCH 003/110] fix races count --- Game/GameBehavior.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 1b1091469..ff2cc9397 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1755,7 +1755,7 @@ private void OnAnnounceRace(BinaryReader packet) int count = packet.ReadByte(); int available = packet.ReadInt32(); int filter = 0x1; - for (int i = 0; i < 23; ++i) + for (int i = 0; i < 26; ++i) { if ((available & filter) != 0) races.Add((CardRace)filter); From 4b4220b07364ec33f18a2fae9889e7be72166df2 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Tue, 23 May 2023 14:00:47 +0800 Subject: [PATCH 004/110] Fix Exosister deck (#163) --- Game/AI/Decks/ExosisterExecutor.cs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Game/AI/Decks/ExosisterExecutor.cs b/Game/AI/Decks/ExosisterExecutor.cs index 7d3d0d242..03f1517f2 100644 --- a/Game/AI/Decks/ExosisterExecutor.cs +++ b/Game/AI/Decks/ExosisterExecutor.cs @@ -1950,7 +1950,7 @@ public bool ExosistersMagnificaActivateTrigger() } // become target - if (DefaultOnBecomeTarget() || (Duel.CurrentChain.Any(c => c == Card) && Duel.LastChainPlayer != 0)) + if ((DefaultOnBecomeTarget() && !Util.ChainContainsCard(_CardId.EvenlyMatched)) || (Duel.CurrentChain.Any(c => c == Card) && Duel.LastChainPlayer != 0)) { targetedMagnificaList.Add(Card); transformDestList.AddRange(new List{CardId.ExosistersMagnifica, CardId.ExosisterMikailis, CardId.ExosisterGibrine, CardId.ExosisterKaspitell, CardId.ExosisterAsophiel}); @@ -2025,7 +2025,7 @@ public bool ExosistersMagnificaActivateBanish() public bool ExosisterPaxActivate() { - if (potActivate) + if (potActivate || Bot.LifePoints <= 800) { return false; } @@ -2198,7 +2198,7 @@ public bool ExosisterPaxActivate() public bool ExosisterPaxActivateForEndSearch() { - if (potActivate) + if (potActivate || Bot.LifePoints <= 800) { return false; } @@ -2230,6 +2230,10 @@ public bool ExosisterPaxActivateForEndSearch() public bool ExosisterArmentActivate() { + if (Bot.LifePoints <= 800) + { + return false; + } ClientCard activateTarget = null; if (Duel.Player == 0) @@ -2366,6 +2370,11 @@ public bool ExosisterArmentActivate() public bool ExosisterVadisActivate() { + if (Bot.LifePoints <= 800) + { + return false; + } + List checkListForSpSummon = new List{ CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.ExosisterElis }; @@ -2435,6 +2444,11 @@ public bool ExosisterVadisActivate() public bool ExosisterReturniaActivate() { + if (Bot.LifePoints <= 800) + { + return false; + } + // banish problem card ClientCard target = GetProblematicEnemyCard(true); if (target != null && Duel.LastChainPlayer != 0) @@ -2463,7 +2477,7 @@ public bool ExosisterReturniaActivate() // dump banish target = GetBestEnemyCard(false, true, true); - bool check1 = DefaultOnBecomeTarget() && target.Id != _CardId.EvenlyMatched; + bool check1 = DefaultOnBecomeTarget() && target != null && (target.Location != CardLocation.Onfield || target.Id != _CardId.EvenlyMatched); bool check2 = Bot.UnderAttack; bool check3 = (Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0 && target != null && target.Location != CardLocation.Grave); bool check4 = (Duel.Player == 1 && Enemy.GetMonsterCount() >= 2 && Duel.LastChainPlayer != 0); From 1b401e3a250579b0f9107fd662502b7dc754331a Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 27 May 2023 17:05:12 +0800 Subject: [PATCH 005/110] version --- WindBotInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WindBotInfo.cs b/WindBotInfo.cs index 920369685..589670c01 100644 --- a/WindBotInfo.cs +++ b/WindBotInfo.cs @@ -24,7 +24,7 @@ public WindBotInfo() Host = "127.0.0.1"; Port = 7911; HostInfo = ""; - Version = 0x1354; + Version = 0x1360; Hand = 0; Debug = false; Chat = true; From d5995341eddbbf318a11d2c5d51d15d2f2e52063 Mon Sep 17 00:00:00 2001 From: YSPplayer <88619179+YSPplayer@users.noreply.github.com> Date: Mon, 12 Jun 2023 16:48:28 +0800 Subject: [PATCH 006/110] Add Bot Zefra (#166) --- Decks/AI_Zefra.ydk | 79 + Game/AI/AIUtil.cs | 110 + Game/AI/CardContainer.cs | 9 + Game/AI/CardExtension.cs | 16 + Game/AI/Decks/ZefraExecutor.cs | 2133 ++++++++++++++++++ Game/AI/Enums/NotBeSynchroMaterialMonster.cs | 32 + Game/AI/Enums/NotBeXyzMaterialMonster.cs | 13 + WindBot.csproj | 3 + 8 files changed, 2395 insertions(+) create mode 100644 Decks/AI_Zefra.ydk create mode 100644 Game/AI/Decks/ZefraExecutor.cs create mode 100644 Game/AI/Enums/NotBeSynchroMaterialMonster.cs create mode 100644 Game/AI/Enums/NotBeXyzMaterialMonster.cs diff --git a/Decks/AI_Zefra.ydk b/Decks/AI_Zefra.ydk new file mode 100644 index 000000000..a8c7aff67 --- /dev/null +++ b/Decks/AI_Zefra.ydk @@ -0,0 +1,79 @@ +#created by ... +#main +49036338 +29432356 +29432356 +29432356 +3611830 +76794549 +5560911 +96227613 +96227613 +27354732 +58990362 +58990362 +58990362 +20773176 +22617205 +69610326 +14785765 +95401059 +31314549 +96223501 +52159691 +21495657 +21495657 +57777714 +92559258 +92559258 +92559258 +38814750 +38814750 +38814750 +72291078 +23434538 +23434538 +23434538 +94693857 +9742784 +19580308 +11609969 +61488417 +2295440 +23581825 +38943357 +38943357 +38943357 +41620959 +41620959 +41620959 +73628505 +74580251 +74580251 +74580251 +81439173 +24224830 +24224830 +46372010 +32354768 +32354768 +32354768 +35561352 +57831349 +#extra +27548199 +74586817 +80696379 +33158448 +65536818 +79606837 +88581108 +96157835 +73347079 +74997493 +44097050 +24094258 +50588353 +36429703 +41999284 +!side diff --git a/Game/AI/AIUtil.cs b/Game/AI/AIUtil.cs index 0005cb12a..4a0718ce2 100644 --- a/Game/AI/AIUtil.cs +++ b/Game/AI/AIUtil.cs @@ -442,5 +442,115 @@ public IList CheckSelectCount(IList _selected, IList + /// Get all xyz materials lists that xyz monster required level in the 'pre_materials' list + /// + /// Original materials + /// Xyz monster required level + /// SpSummon rule:number of xyz materials + /// More xyz materials + /// Filter xyz materials func + /// + public List> GetXyzMaterials(IList param_pre_materials, int level, int material_count, bool material_count_above = false, Func material_func = null) + { + List> result = new List>(); + List pre_materials = param_pre_materials?.Where(card => card != null && !(card.IsFacedown() & card.Location == CardLocation.MonsterZone) && card.Level == level && !card.IsMonsterNotBeXyzMaterial()).ToList(); + if (pre_materials?.Count() < material_count) return result; + Func default_func = card => true; + material_func = material_func ?? default_func; + for (int i = 1; i < Math.Pow(2, pre_materials.Count); i++) + { + List temp_materials = new List(); + string binaryString = Convert.ToString(i, 2).PadLeft(pre_materials.Count, '0'); + char[] reversedBinaryChars = binaryString.Reverse().ToArray(); + for (int j = 0; j < pre_materials.Count; j++) + { + if (reversedBinaryChars[j] == '1' && material_func(pre_materials[j])) + { + temp_materials.Add(pre_materials[j]); + } + } + if (material_count_above ? temp_materials.Count >= material_count : temp_materials.Count == material_count) + { + result.Add(temp_materials); + } + } + return result; + } + + /// + /// Get all synchro materials lists that synchro monster level == param 'level' in the 'pre_materials' list + /// + /// Original materials + /// Synchro monster level + /// SpSummon rule:number of tuner monsters + /// SpSummon rule:number of non-tuner monsters count + /// More tuner monsters + /// More non-tuner monsters + /// Filter tuner monsters func + /// Filter non-tuner monsters func + /// + public List> GetSynchroMaterials(IList param_pre_materials, int level, int tuner_count, int n_tuner_count, bool tuner_count_above = false, bool n_tuner_count_above = true, Func tuner_func = null, Func n_tuner_func = null) + { + List> t_result = new List>(); + List pre_materials = param_pre_materials?.Where(card => card != null && !(card.IsFacedown() & card.Location == CardLocation.MonsterZone) && card.Level > 0 && !card.IsMonsterNotBeSynchroMaterial()).ToList(); + if (pre_materials?.Count() < tuner_count + n_tuner_count) return t_result; + Func default_func = card => true; + tuner_func = tuner_func ?? default_func; + n_tuner_func = n_tuner_func ?? default_func; + pre_materials.Sort(CardContainer.CompareCardLevel); + Stack materials_stack = new Stack(); + for (var i = 0; i < pre_materials.Count; i++) + { + if (pre_materials[i].Level > level) break; + materials_stack.Push(new object[] { pre_materials[i].Level, i, pre_materials[i].Level, new List { pre_materials[i] } }); + } + while (materials_stack.Count > 0) + { + object[] data = materials_stack.Pop(); + int num = (int)data[0]; + int index = (int)data[1]; + int sum = (int)data[2]; + List temp_materials = (List)data[3]; + if (sum == level) + { + t_result.Add(temp_materials); + } + else if (sum < level) + { + for (var i = index + 1; i < pre_materials.Count; i++) + { + if (pre_materials[i].Level > level - sum) break; + if (i > index + 1 && pre_materials[i].Level == pre_materials[i - 1].Level) continue; + var new_temp_materials = new List(temp_materials); + new_temp_materials.Add(pre_materials[i]); + materials_stack.Push(new object[] { pre_materials[i].Level, i, sum + pre_materials[i].Level, new_temp_materials }); + } + } + } + List> result = new List>(); + for (int i = 0; i < t_result.Count; i++) + { + List materials = t_result[i]; + List tuner_materials = new List(); + List n_tuner_materials = new List(); + foreach (ClientCard material in materials) + { + if (material.HasType(CardType.Tuner) && tuner_func(material)) + { + tuner_materials.Add(material); + } + else if (material.Level > 0 && n_tuner_func(material)) + { + n_tuner_materials.Add(material); + } + } + if ((tuner_count_above ? tuner_materials.Count >= tuner_count : tuner_materials.Count == tuner_count) + && (n_tuner_count_above ? n_tuner_materials.Count >= n_tuner_count : n_tuner_materials.Count == n_tuner_count)) + result.Add(materials); + } + return result; + } } } \ No newline at end of file diff --git a/Game/AI/CardContainer.cs b/Game/AI/CardContainer.cs index 1b263e591..bc69190c9 100644 --- a/Game/AI/CardContainer.cs +++ b/Game/AI/CardContainer.cs @@ -25,6 +25,15 @@ public static int CompareCardLevel(ClientCard cardA, ClientCard cardB) return 1; } + public static int CompareCardLink(ClientCard cardA, ClientCard cardB) + { + if (cardA.LinkCount < cardB.LinkCount) + return -1; + if (cardA.LinkCount == cardB.LinkCount) + return 0; + return 1; + } + public static int CompareDefensePower(ClientCard cardA, ClientCard cardB) { if (cardA == null && cardB == null) diff --git a/Game/AI/CardExtension.cs b/Game/AI/CardExtension.cs index 1fcc4530c..684848aa0 100644 --- a/Game/AI/CardExtension.cs +++ b/Game/AI/CardExtension.cs @@ -78,5 +78,21 @@ public static bool IsFusionSpell(this ClientCard card) { return Enum.IsDefined(typeof(FusionSpell), card.Id); } + + /// + /// Is this monster not be synchro material? + /// + public static bool IsMonsterNotBeSynchroMaterial(this ClientCard card) + { + return Enum.IsDefined(typeof(NotBeSynchroMaterialMonster), card.Id); + } + + /// + /// Is this monster not be xyz material? + /// + public static bool IsMonsterNotBeXyzMaterial(this ClientCard card) + { + return Enum.IsDefined(typeof(NotBeXyzMaterialMonster), card.Id); + } } } \ No newline at end of file diff --git a/Game/AI/Decks/ZefraExecutor.cs b/Game/AI/Decks/ZefraExecutor.cs new file mode 100644 index 000000000..68451f19a --- /dev/null +++ b/Game/AI/Decks/ZefraExecutor.cs @@ -0,0 +1,2133 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +namespace WindBot.Game.AI.Decks +{ + [Deck("Zefra", "AI_Zefra")] + class ZefraExecutor : DefaultExecutor + { + public class CardId + { + //main code + public const int PSY_FrameDriver = 49036338; + public const int Zefraath = 29432356; + public const int TheMightyMasterofMagic = 3611830; + public const int AstrographSorcerer = 76794549; + public const int DestrudotheLostDragon_Frisson = 5560911; + public const int SupremeKingGateZero = 96227613; + public const int MythicalBeastJackalKing = 27354732; + public const int SecretoftheYangZing = 58990362; + public const int FlameBeastoftheNekroz = 20773176; + public const int StellarknightZefraxciton = 22617205; + public const int SupremeKingDragonDarkwurm = 69610326; + public const int Blackwing_ZephyrostheElite = 14785765; + public const int ShaddollZefracore = 95401059; + public const int Raidraptor_SingingLanius = 31314549; + public const int SatellarknightZefrathuban = 96223501; + public const int Raider_Wing = 52159691; + public const int Zefraxi_TreasureoftheYangZing = 21495657; + public const int RitualBeastTamerZeframpilica = 57777714; + public const int ServantofEndymion = 92559258; + public const int PSY_FramegearGamma = 38814750; + public const int MechaPhantomBeastO_Lion = 72291078; + public const int MaxxC = 23434538; + public const int Deskbot001 = 94693857; + public const int JetSynchron = 9742784; + public const int DDLamia = 19580308; + public const int DDSavantKepler = 11609969; + public const int LightoftheYangZing = 61488417; + public const int Rank_Up_MagicSoulShaveForce = 23581825; + public const int SpellPowerMastery = 38943357; + public const int DragonShrine = 41620959; + public const int Terraforming = 73628505; + public const int ZefraProvidence = 74580251; + public const int FoolishBurial = 81439173; + public const int CalledbytheGrave = 24224830; + public const int DarkContractwiththGate = 46372010; + public const int OracleofZefra = 32354768; + public const int ZefraWar = 96073342; + public const int ZefraDivineStrike = 35561352; + public const int NinePillarsofYangZing = 57831349; + public const int OneforOne = 2295440; + + //extra code + public const int BorreloadSavageDragon = 27548199; + public const int Odd_EyesMeteorburstDragon = 80696379; + public const int F_A_DawnDragster = 33158448; + public const int Denglong_FirstoftheYangZing = 65536818; + public const int HeraldoftheArcLight = 79606837; + public const int TruKingofAllCalamities = 88581108; + public const int Raidraptor_ArsenalFalcon = 96157835; + public const int Raidraptor_ForceStrix = 73347079; + public const int SaryujaSkullDread = 74997493; + public const int MechaPhantomBeastAuroradon = 44097050; + public const int HeavymetalfoesElectrumite = 24094258; + public const int CrystronHalqifibrax = 50588353; + public const int Raidraptor_WiseStrix = 36429703; + public const int Linkuriboh = 41999284; + public const int PSY_FramelordOmega = 74586817; + + public const int MechaPhantomBeastToken = 44097051; + } + private bool opt_0 = false; + private bool opt_1 = false; + private bool opt_2 = false; + //edo false + private const bool IS_YGOPRO = true; + private const int P_ACTIVATE_DESC = 1160; + //private const int P_SPSUMMON_DESC = 1163; + private int p_count = 0; + private int spell_activate_count = 0; + private bool summoned = false; + private bool link_summoned = false; + private bool p_summoned = false; + private bool p_summoning = false; + private bool activate_SupremeKingDragonDarkwurm_1 = false; + private bool activate_p_Zefraath = false; + private bool activate_OracleofZefra = false; + private bool activate_ZefraProvidence = false; + private bool activate_SupremeKingDragonDarkwurm_2 = false; + private bool activate_JetSynchron = false; + private bool activate_Blackwing_ZephyrostheElite = false; + private bool activate_DragonShrine = false; + private bool activate_SpellPowerMastery = false; + private bool activate_DestrudotheLostDragon_Frisson = false; + private bool activate_DarkContractwiththGate = false; + private bool activate_SecretoftheYangZing = false; + private bool activate_ShaddollZefracore = false; + private bool activate_DDLamia = false; + private bool xyz_mode = false; + private bool Blackwing_ZephyrostheElite_activate = false; + private bool HeavymetalfoesElectrumite_activate = false; + private bool should_destory = false; + private List Odd_EyesMeteorburstDragon_materials = new List(); + private static class Toos + { + public delegate bool Delegate(ClientCard card); + private static bool DefaultFunc(ClientCard card) + { + return true; + } + public static bool LinqAny(IList cards, Delegate @delegate = null) + { + if (cards == null) return false; + @delegate = @delegate ?? DefaultFunc; + return cards.Any(card => card != null && @delegate(card)); + } + public static bool LinqAll(IList cards, Delegate @delegate = null, bool flag = true) + { + if (cards == null) return false; + IList rcards = new List(cards); + if (flag) rcards = cards.Where(card => card != null).ToList(); + @delegate = @delegate ?? DefaultFunc; + return rcards.All(card => card != null && @delegate(card)); + } + public static int LinqCount(IList cards, Delegate @delegate = null) + { + if (cards == null) return -1; + @delegate = @delegate ?? DefaultFunc; + return cards.Count(card => card != null && @delegate(card)); + } + public static List LinqWhere(IList cards, Delegate @delegate = null) + { + if (cards == null) return new List(); + @delegate = @delegate ?? DefaultFunc; + return cards.Where(card => card != null && @delegate(card)).ToList(); + } + } + private class Func + { + private IList _parameters = new List(); + private List no_p_spsummon_ids = new List() + { + CardId.Zefraath + }; + private List selectCardList = null; + private List selectCardIdList = null; + public List GetSelectCardList() + { + if (selectCardList == null) + { + selectCardList = new List(); + } + else + { + selectCardList.Clear(); + } + return selectCardList; + } + public List GetSelectCardIdList() + { + if (selectCardIdList == null) + { + selectCardIdList = new List(); + } + else + { + selectCardIdList.Clear(); + } + return selectCardIdList; + } + public bool IsLocation(ClientCard card) + { + return card.Location == (CardLocation)_parameters[0]; + } + public bool IsCode(ClientCard card) + { + return card.IsCode((int)_parameters[0]); + } + public static bool IsCode(ClientCard card, params int[] ids) + { + if (card == null) return false; + foreach (var id in ids) + { + if (card.IsCode(id)) return true; + } + return false; + } + public bool HasSetCode(ClientCard card) + { + return card.HasSetcode((int)_parameters[0]); + } + public static bool HasSetCode(ClientCard card, params int[] set_codes) + { + if (card == null) return false; + foreach (var set_code in set_codes) + { + if (card.HasSetcode(set_code)) return true; + } + return false; + } + public static bool IsFaceUp(ClientCard card) + { + return card.IsFaceup(); + } + public bool HasAttribute(ClientCard card) + { + return card.HasAttribute((CardAttribute)_parameters[0]); + } + public bool HasRace(ClientCard card) + { + return card.HasRace((CardRace)_parameters[0]); + } + public bool HasLevel(ClientCard card) + { + return card.Level == (int)_parameters[0]; + } + public bool HasType(ClientCard card) + { + return card.HasType((CardType)_parameters[0]); + } + public static bool IsOnfield(ClientCard card) + { + return (card.Location & CardLocation.MonsterZone) > 0 || (card.Location & CardLocation.SpellZone) > 0; + } + public static Toos.Delegate NegateFunc(Toos.Delegate @delegate) + { + return card => { return !@delegate(card); }; + } + private void SetParameters(IList parameters) + { + ClearParameters(); + for (int i = 0; i < parameters?.Count(); ++i) + { + _parameters.Add(parameters[i]); + } + } + private void ClearParameters() + { + _parameters.Clear(); + } + public bool CardsCheckAny(IList cards, Toos.Delegate @delegate = null, params object[] parameters) + { + SetParameters(parameters); + return Toos.LinqAny(cards, @delegate); + } + public bool CardsCheckALL(IList cards, Toos.Delegate @delegate = null, bool all = true, params object[] parameters) + { + SetParameters(parameters); + return Toos.LinqAll(cards, @delegate, all); + } + public int CardsCheckCount(IList cards, Toos.Delegate @delegate = null, params object[] parameters) + { + SetParameters(parameters); + return Toos.LinqCount(cards, @delegate); + } + public List CardsCheckWhere(IList cards, Toos.Delegate @delegate = null, params object[] parameters) + { + SetParameters(parameters); + return Toos.LinqWhere(cards, @delegate); + } + public static List MergeList(params List[] lists) + { + List result = new List(); + foreach (var list in lists) + { + if (list == null) continue; + result.AddRange(list); + } + return result; + } + public List CardsIdToClientCards(IList cardsId, IList cardsList, bool uniqueId = true) + { + if (cardsList?.Count() <= 0 || cardsId?.Count() <= 0) return new List(); + List result = new List(); + cardsId = cardsId.Distinct().ToList(); + foreach (var cardid in cardsId) + { + List cards = CardsCheckWhere(cardsList, IsCode, cardid); + if (cards.Count <= 0) continue; + if (uniqueId) result.Add(cards.First()); + else result.AddRange(cards); + } + return result; + } + public static List ClientCardsToCardsId(IList cardsList, bool uniqueId = false, bool alias = false) + { + if (cardsList?.Count <= 0) return new List(); + List res = new List(); + foreach (var card in cardsList) + { + if (card == null) continue; + if (card.Alias != 0 && alias && !(res.Contains(card.Alias) & uniqueId)) res.Add(card.Alias); + else if (card.Id != 0 && !(res.Contains(card.Id) & uniqueId)) res.Add(card.Id); + } + return res; + } + //AIUtil + public static IList CheckSelectCount(AIUtil util, IList _selected, IList cards, int min, int max) + { + return _selected?.Count() <= 0 ? null : util.CheckSelectCount(_selected, cards, min, max); + } + public static List GetZoneCards(ClientField player, CardLocation loc, bool feceup = false, bool disable = false) + { + if (!feceup) disable = false; + List result = new List(); + if ((loc & CardLocation.Hand) > 0) result.AddRange(Toos.LinqWhere(player.Hand)); + if ((loc & CardLocation.MonsterZone) > 0) result.AddRange(Toos.LinqWhere(player.MonsterZone, card => !(!card.IsFaceup() & feceup) && !(!card.IsDisabled() & disable))); + if ((loc & CardLocation.SpellZone) > 0) result.AddRange(Toos.LinqWhere(player.SpellZone, card => !(!card.IsFaceup() & feceup) && !(!card.IsDisabled() & disable))); + if ((loc & CardLocation.PendulumZone) > 0) result.AddRange(Toos.LinqWhere(new List() { player.SpellZone[0], player.SpellZone[4] }, card => !(!card.IsFaceup() & feceup) && !(!card.IsDisabled() & disable))); + if ((loc & CardLocation.Grave) > 0) result.AddRange(Toos.LinqWhere(player.Graveyard)); + if ((loc & CardLocation.Removed) > 0) result.AddRange(Toos.LinqWhere(player.Banished, card => !(!card.IsFaceup() & feceup))); + if ((loc & CardLocation.Extra) > 0) result.AddRange(Toos.LinqWhere(player.ExtraDeck, card => !(!card.IsFaceup() & feceup))); + result = result.Distinct().ToList(); + return result; + } + public bool HasInZone(ClientField player, CardLocation loc, int id, bool feceup = false, bool disable = false) + { + return CardsCheckAny(GetZoneCards(player, loc, feceup, disable), IsCode, id); + } + public static bool SpellActivate(ClientCard card) + { + return card.Location == CardLocation.Hand || (card.Location == CardLocation.SpellZone && card.IsFacedown()); + } + public static bool PendulumActivate(int desc, ClientCard card) + { + return desc == P_ACTIVATE_DESC && card.Location == CardLocation.Hand; + } + private static Toos.Delegate GetPSpSummonLimilt(ClientCard pcard) + { + int setcode = -1; + int setcode2 = -1; + switch (pcard.Id) + { + case CardId.SecretoftheYangZing: + case CardId.Zefraxi_TreasureoftheYangZing: { setcode = 0xc4; setcode2 = 0x9e; break; } + case CardId.FlameBeastoftheNekroz: { setcode = 0xc4; setcode2 = 0xb4; break; } + case CardId.StellarknightZefraxciton: + case CardId.SatellarknightZefrathuban: { setcode = 0xc4; setcode2 = 0x109c; break; } + case CardId.RitualBeastTamerZeframpilica: { setcode = 0xc4; setcode2 = 0x10b5; break; } + case CardId.ShaddollZefracore: { setcode = 0xc4; setcode2 = 0x9d; break; } + case CardId.DDSavantKepler: { setcode = 0xaf; break; } + default: break; + } + return card => { + return (setcode == -1 ? true : card.HasSetcode(setcode)) + || (setcode2 == -1 ? true : card.HasSetcode(setcode2)); + }; + } + public static int[] GetPScales(ClientField bot) + { + int[] pScales = new int[2]; + ClientCard lcard = bot.SpellZone[0]; + ClientCard rcard = bot.SpellZone[4]; + pScales[0] = (lcard == null || lcard.IsFacedown() || !lcard.HasType(CardType.Pendulum)) ? -1 : lcard.RScale; + pScales[1] = (rcard == null || rcard.IsFacedown() || !rcard.HasType(CardType.Pendulum)) ? -1 : rcard.LScale; + return pScales; + } + public static int GetPScale(ClientField bot, int id) + { + bool rscale = false; + ClientCard pcard = null; + if (bot.SpellZone[0] != null && bot.SpellZone[0].Id == id) + { + pcard = bot.SpellZone[4]; + } + else + { + pcard = bot.SpellZone[0]; + rscale = true; + } + if (pcard == null || pcard.IsFacedown() || !pcard.HasType(CardType.Pendulum)) return -1; + return rscale ? pcard.RScale : pcard.LScale; + } + public List GetPSpSummonMonster(ClientField bot, ClientCard lcard, ClientCard rcard) + { + if (lcard == null || rcard == null || !lcard.HasType(CardType.Pendulum) || !rcard.HasType(CardType.Pendulum) || (IsOnfield(lcard) & lcard.IsFacedown()) || (IsOnfield(lcard) & rcard.IsFacedown())) return null; + int MaxScale = Math.Max(lcard.RScale, rcard.LScale); + int MinScale = Math.Min(lcard.RScale, rcard.LScale); + Toos.Delegate @llimit = GetPSpSummonLimilt(lcard); + Toos.Delegate @rlimit = GetPSpSummonLimilt(rcard); + return CardsCheckWhere(GetZoneCards(bot, CardLocation.Hand | CardLocation.Extra, true), + card => { + return card != lcard && card != rcard && card.HasType(CardType.Monster) && card.Level > MinScale && card.Level < MaxScale + && !no_p_spsummon_ids.Contains(card.Id) && @llimit(card) && @rlimit(card); + }); ; + } + public bool IsActivateScale(ClientField bot, ClientCard card) + { + ClientCard lcard = bot.SpellZone[0]; + ClientCard rcard = bot.SpellZone[4]; + List spSummonMonster = null; + if (lcard != null && rcard != null) return false; + if (lcard == null && rcard == null) return true; + + spSummonMonster = lcard == null ? GetPSpSummonMonster(bot, card, rcard) : GetPSpSummonMonster(bot, lcard, card); + return spSummonMonster?.Count() > 0; + } + public static int CompareCardScale(ClientCard cardA, ClientCard cardB) + { + if (cardA.RScale < cardB.RScale) + return -1; + if (cardA.RScale == cardB.RScale) + return 0; + return 1; + } + public static List GetCardsRepeatCardsId(IList cards) + { + if (cards?.Count <= 0) return new List() { -1 }; + IList cardsid = new List(); + List res = new List(); + foreach (var card in cards) + { + if (card == null) continue; + cardsid.Add(card.Id); + } + for (int i = 0; i < cardsid.Count; i++) + { + if (res.Count >= 0 && res.Contains(cardsid[i])) continue; + int times = 0; + for (int j = 0; j < cardsid.Count; j++) + { + if (times > 1) { res.Add(cardsid[i]); break; } + if (cardsid[i] == cardsid[j]) ++times; + } + } + if (res.Count <= 0) return new List() { -1 }; + return res; + } + } + private Func func = new Func(); + public ZefraExecutor(GameAI ai, Duel duel) : base(ai, duel) + { + AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, CalledbytheGraveEffect); + AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonEffect_2); + AddExecutor(ExecutorType.Activate, CardId.F_A_DawnDragster); + AddExecutor(ExecutorType.Activate, CardId.NinePillarsofYangZing, NinePillarsofYangZingEffect); + AddExecutor(ExecutorType.Activate, CardId.ZefraDivineStrike, ZefraDivineStrikeEffect); + AddExecutor(ExecutorType.Activate, CardId.HeraldoftheArcLight, HeraldoftheArcLightEffect); + AddExecutor(ExecutorType.Activate, CardId.TruKingofAllCalamities,TruKingofAllCalamitiesEffect); + AddExecutor(ExecutorType.Activate, CardId.PSY_FramegearGamma); + AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC); + AddExecutor(ExecutorType.Activate, CardId.SupremeKingDragonDarkwurm, SupremeKingDragonDarkwurmEffect); + AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect); + AddExecutor(ExecutorType.Activate, CardId.Terraforming, TerraformingEffect); + AddExecutor(ExecutorType.Activate, CardId.SpellPowerMastery); + AddExecutor(ExecutorType.Activate, CardId.DragonShrine, DragonShrineEffect); + AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect); + AddExecutor(ExecutorType.Activate, CardId.DarkContractwiththGate, DarkContractwiththGateEffect); + AddExecutor(ExecutorType.Activate, CardId.Terraforming); + AddExecutor(ExecutorType.Activate, CardId.OracleofZefra, OracleofZefraEffect); + AddExecutor(ExecutorType.Activate, CardId.ZefraProvidence, ZefraProvidenceEffect); + AddExecutor(ExecutorType.Activate, CardId.AstrographSorcerer, AstrographSorcererEffect); + AddExecutor(ExecutorType.Activate, CardId.HeavymetalfoesElectrumite, HeavymetalfoesElectrumiteEffect); + AddExecutor(ExecutorType.Summon, CardId.SupremeKingDragonDarkwurm, SupremeKingDragonDarkwurmSummon); + AddExecutor(ExecutorType.Activate, CardId.SupremeKingGateZero, SupremeKingGateZeroEffect); + AddExecutor(ExecutorType.Activate, CardId.Zefraxi_TreasureoftheYangZing, Zefraxi_TreasureoftheYangZingEffect); + AddExecutor(ExecutorType.Activate, CardId.SatellarknightZefrathuban, SatellarknightZefrathubanEffect); + AddExecutor(ExecutorType.Activate, CardId.RitualBeastTamerZeframpilica, RitualBeastTamerZeframpilicaEffect); + AddExecutor(ExecutorType.Activate, CardId.SecretoftheYangZing, SecretoftheYangZingEffect); + AddExecutor(ExecutorType.Activate, CardId.FlameBeastoftheNekroz, FlameBeastoftheNekrozEffect); + AddExecutor(ExecutorType.Activate, CardId.ShaddollZefracore, ShaddollZefracoreEffect); + AddExecutor(ExecutorType.Activate, CardId.StellarknightZefraxciton, StellarknightZefraxcitonEffect); + AddExecutor(ExecutorType.Activate, CardId.SupremeKingDragonDarkwurm, SupremeKingGateZeroEffect); + AddExecutor(ExecutorType.Activate, CardId.AstrographSorcerer, SupremeKingGateZeroEffect); + AddExecutor(ExecutorType.Activate, CardId.Zefraath, ZefraathEffect); + AddExecutor(ExecutorType.Activate, CardId.DDSavantKepler, DDSavantKeplerEffect); + AddExecutor(ExecutorType.Summon, CardId.DDSavantKepler, DDSavantKeplerSummon); + AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect_3); + AddExecutor(ExecutorType.Activate, CardId.MythicalBeastJackalKing, MythicalBeastJackalKingEffect); + AddExecutor(ExecutorType.SpSummon, Psummon); + AddExecutor(ExecutorType.Activate, CardId.OneforOne, OneforOneEffect); + AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect_2); + AddExecutor(ExecutorType.Activate, CardId.CrystronHalqifibrax, CrystronHalqifibraxEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_ArsenalFalcon, Raidraptor_ArsenalFalconSummon); + AddExecutor(ExecutorType.Activate, CardId.Raidraptor_ArsenalFalcon, Raidraptor_ArsenalFalconEffect); + AddExecutor(ExecutorType.SpSummon, CardId.HeavymetalfoesElectrumite, HeavymetalfoesElectrumiteSummon); + //xyz mode + AddExecutor(ExecutorType.SpSummon, CardId.Odd_EyesMeteorburstDragon, Odd_EyesMeteorburstDragonSummon); + AddExecutor(ExecutorType.Activate, CardId.Odd_EyesMeteorburstDragon, Odd_EyesMeteorburstDragonEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_WiseStrix, Raidraptor_WiseStrixSummon); + AddExecutor(ExecutorType.Activate, CardId.Raidraptor_WiseStrix, Raidraptor_WiseStrixEffect); + AddExecutor(ExecutorType.Activate, CardId.Blackwing_ZephyrostheElite, Blackwing_ZephyrostheEliteEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixSummon); + AddExecutor(ExecutorType.Activate, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixEffect); + AddExecutor(ExecutorType.Activate, CardId.Rank_Up_MagicSoulShaveForce); + AddExecutor(ExecutorType.Activate, CardId.Raider_Wing, Raider_WingEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_SingingLanius); + //xyz mode + AddExecutor(ExecutorType.SpSummon, CardId.SaryujaSkullDread, SaryujaSkullDreadSummon); + AddExecutor(ExecutorType.Activate, CardId.SaryujaSkullDread, SaryujaSkullDreadEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Denglong_FirstoftheYangZing, Denglong_FirstoftheYangZingSummon_2); + AddExecutor(ExecutorType.SpSummon, CardId.BorreloadSavageDragon, BorreloadSavageDragonSummon_2); + AddExecutor(ExecutorType.SpSummon, CardId.CrystronHalqifibrax, CrystronHalqifibraxSummon); + AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, LinkuribohSummon); + AddExecutor(ExecutorType.Activate, CardId.DDLamia, DDLamiaEffect); + AddExecutor(ExecutorType.SpSummon, CardId.MechaPhantomBeastAuroradon, MechaPhantomBeastAuroradonSummon); + AddExecutor(ExecutorType.Activate, CardId.MechaPhantomBeastAuroradon, MechaPhantomBeastAuroradonEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Denglong_FirstoftheYangZing, Denglong_FirstoftheYangZingSummon); + AddExecutor(ExecutorType.Activate, CardId.Denglong_FirstoftheYangZing, Denglong_FirstoftheYangZingEffect); + AddExecutor(ExecutorType.SpSummon, CardId.BorreloadSavageDragon, BorreloadSavageDragonSummon); + AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonEffect); + AddExecutor(ExecutorType.SpSummon, CardId.HeraldoftheArcLight); + AddExecutor(ExecutorType.SpSummon, CardId.F_A_DawnDragster, F_A_DawnDragsterSummon); + AddExecutor(ExecutorType.SpSummon, CardId.PSY_FramelordOmega, BorreloadSavageDragonSummon); + AddExecutor(ExecutorType.Activate, CardId.PSY_FramelordOmega, PSY_FramelordOmegaEffect); + AddExecutor(ExecutorType.Activate, CardId.Linkuriboh, LinkuribohEffect); + AddExecutor(ExecutorType.Activate, CardId.MechaPhantomBeastO_Lion); + AddExecutor(ExecutorType.Activate, CardId.JetSynchron, JetSynchronEffect); + AddExecutor(ExecutorType.Activate, CardId.Blackwing_ZephyrostheElite, Blackwing_ZephyrostheEliteEffect_2); + AddExecutor(ExecutorType.Summon, CardId.JetSynchron, DDLamiaSummon); + AddExecutor(ExecutorType.Summon, CardId.DDLamia, DDLamiaSummon); + AddExecutor(ExecutorType.Summon, CardId.Deskbot001, DDLamiaSummon); + AddExecutor(ExecutorType.Summon, CardId.LightoftheYangZing, DDLamiaSummon); + List p_summon_ids = new List() {CardId.Zefraxi_TreasureoftheYangZing,CardId.SatellarknightZefrathuban,CardId.ServantofEndymion,CardId.RitualBeastTamerZeframpilica, + CardId.DDSavantKepler,CardId.StellarknightZefraxciton,CardId.ShaddollZefracore,CardId.SupremeKingDragonDarkwurm}; + for (int i = 0; i < p_summon_ids.Count; ++i) AddExecutor(ExecutorType.Summon, p_summon_ids[i], DefaultSummon); + AddExecutor(ExecutorType.Summon, DefaultSummon); + AddExecutor(ExecutorType.Activate, CardId.Deskbot001); + AddExecutor(ExecutorType.Activate, CardId.TheMightyMasterofMagic, TheMightyMasterofMagicEffect); + AddExecutor(ExecutorType.Activate, CardId.DestrudotheLostDragon_Frisson, DestrudotheLostDragon_FrissonEffect); + AddExecutor(ExecutorType.Summon, CardId.Blackwing_ZephyrostheElite, DefaultSummon_2); + AddExecutor(ExecutorType.Summon, DefaultSummon_2); + AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh); + AddExecutor(ExecutorType.SpellSet, SpellSet); + AddExecutor(ExecutorType.SpellSet, SpellSet_2); + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.Activate, DefaultPActivate); + } + public override void OnNewTurn() + { + activate_SupremeKingDragonDarkwurm_1 = false; + activate_SupremeKingDragonDarkwurm_2 = false; + activate_JetSynchron = false; + activate_DestrudotheLostDragon_Frisson = false; + activate_ZefraProvidence = false; + activate_OracleofZefra = false; + activate_DragonShrine = false; + activate_p_Zefraath = false; + p_summoned = false; + summoned = false; + activate_DarkContractwiththGate = false; + activate_SecretoftheYangZing = false; + activate_ShaddollZefracore = false; + activate_SpellPowerMastery = false; + link_summoned = false; + activate_DDLamia = false; + xyz_mode = false; + Blackwing_ZephyrostheElite_activate = false; + HeavymetalfoesElectrumite_activate = false; + spell_activate_count = 0; + p_count = 0; + } + private bool ZefraProvidenceEffect() + { + if (Card.Location == CardLocation.Grave) + { + return true; + } + else + { + activate_ZefraProvidence = true; + return true; + } + + } + private List CheckShouldSpsummonExtraMonster() + { + List extra_ids = new List() { CardId.HeavymetalfoesElectrumite, CardId.CrystronHalqifibrax }; + if (!Bot.HasInExtra(CardId.HeavymetalfoesElectrumite)) extra_ids.Remove(CardId.HeavymetalfoesElectrumite); + if (!Bot.HasInExtra(CardId.CrystronHalqifibrax)) extra_ids.Remove(CardId.CrystronHalqifibrax); + if (extra_ids.Count <= 0) return extra_ids; + bool DD_summon_check = false; + if (Bot.HasInExtra(CardId.CrystronHalqifibrax) && ((!summoned && HasInDeck(CardId.DDSavantKepler) && (HasInDeck(CardId.DarkContractwiththGate) || Bot.HasInHandOrInSpellZone(CardId.DarkContractwiththGate) + ) && !activate_DarkContractwiththGate && HasInDeck(CardId.DDLamia)) || (func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner) && + (HasInDeck(CardId.AstrographSorcerer) || Bot.HasInHand(CardId.AstrographSorcerer))))) + { + DD_summon_check = true; + } + if (Bot.SpellZone[0] != null && Bot.SpellZone[4] != null) + { + List spSummonMonster = func.GetPSpSummonMonster(Bot, Bot.SpellZone[0], Bot.SpellZone[4]); + if (DD_summon_check && spSummonMonster != null) + { + + List pSpsummonMonster = func.CardsCheckWhere(spSummonMonster, func.HasType, CardType.Pendulum); + List monsterCards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone), card => + { return card.IsFaceup() && card.HasType(CardType.Pendulum); }); + if (Func.MergeList(pSpsummonMonster, monsterCards).Count <= 0) extra_ids.Remove(CardId.HeavymetalfoesElectrumite); + } + else + { + extra_ids.Remove(CardId.HeavymetalfoesElectrumite); + } + } + else + { + if (!((Bot.HasInHand(CardId.OracleofZefra) && !activate_OracleofZefra) || (Bot.HasInHand(CardId.ZefraProvidence) + && !activate_ZefraProvidence) || (Bot.HasInHand(CardId.Zefraath) && !activate_p_Zefraath))) + { + extra_ids.Clear(); + } + } + if (!DD_summon_check) extra_ids.Remove(CardId.HeavymetalfoesElectrumite); + return extra_ids; + } + private bool DDLamiaSummon() + { + if (!IsCanSynchroSummon(Card.Level)) return false; + if (Bot.HasInExtra(CardId.Linkuriboh) || (Bot.HasInExtra(CardId.CrystronHalqifibrax) && + Func.GetZoneCards(Bot, CardLocation.MonsterZone, true).Count > 0)) + { + summoned = true; + return true; + } + return false; + } + private bool XyzModeCheck(bool flag1 = false) + { + return !link_summoned && !(!Bot.HasInExtra(CardId.Raidraptor_ArsenalFalcon) & flag1) && HasInDeck(CardId.Blackwing_ZephyrostheElite) && Bot.HasInExtra(CardId.Raidraptor_ForceStrix) && Bot.HasInExtra(CardId.Raidraptor_WiseStrix) + && Bot.HasInExtra(CardId.TruKingofAllCalamities) && (HasInDeck(CardId.Raider_Wing) || Bot.HasInHand(CardId.Raider_Wing)) + && (HasInDeck(CardId.Raidraptor_SingingLanius) || Bot.HasInHand(CardId.Raidraptor_SingingLanius)) + && (HasInDeck(CardId.Rank_Up_MagicSoulShaveForce) || Bot.HasInHand(CardId.Rank_Up_MagicSoulShaveForce)); + } + private bool Raidraptor_ForceStrixEffect() + { + AI.SelectCard(CardId.Raider_Wing); + AI.SelectNextCard(CardId.Raidraptor_SingingLanius); + return true; + } + private bool Raidraptor_ForceStrixSummon() + { + return xyz_mode; + } + + private bool Blackwing_ZephyrostheEliteEffect_2() + { + if (!xyz_mode && Bot.GetMonstersInMainZone().Count > 4) return false; + List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Onfield, true), card => { + return !IsNoLinkCards(card) && !card.IsExtraCard() && !(card.Location == CardLocation.SpellZone + && Func.IsCode(card,CardId.SaryujaSkullDread,CardId.MechaPhantomBeastAuroradon,CardId.HeavymetalfoesElectrumite,CardId.CrystronHalqifibrax,CardId.Raidraptor_WiseStrix, + CardId.Linkuriboh)); + }); + if (cards.Count <= 0 || (cards.Count < 2 && func.CardsCheckCount(cards, func.HasLevel, 4) == cards.Count)) + { + Blackwing_ZephyrostheElite_activate = true; + return false; + } + cards.Sort((cardA, cardB) => + { + if (cardA.Location != CardLocation.MonsterZone && cardB.Location == CardLocation.MonsterZone) return -1; + if (cardA.Location == CardLocation.MonsterZone && cardB.Location != CardLocation.MonsterZone) return 1; + if (cardA.Location == CardLocation.SpellZone && cardB.Location == CardLocation.SpellZone) + { + if(cardA.IsCode(CardId.OracleofZefra) && !cardB.IsCode(CardId.OracleofZefra)) return -1; + if(!cardA.IsCode(CardId.OracleofZefra) && cardB.IsCode(CardId.OracleofZefra))return 1; + return 0; + } + if (xyz_mode) + { + if (cardA.Level == 4 && cardB.Level != 4) return 1; + if (cardA.Level != 4 && cardB.Level == 4) return -1; + return CardContainer.CompareCardAttack(cardA, cardB); + } + else + { + return CardContainer.CompareCardAttack(cardA, cardB); + } + }); + Blackwing_ZephyrostheElite_activate = false; + AI.SelectCard(cards); + return true; + } + private bool DefaultPActivate() + { + if (PendulumActivate() && Func.IsCode(Card,CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing)) + { + return Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.SpellZone, + true), card => { return Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing); }) <= 0; + } + return false; + } + private bool Blackwing_ZephyrostheEliteEffect() + { + if (!xyz_mode) return false; + return Blackwing_ZephyrostheEliteEffect_2(); + } + private bool Raidraptor_WiseStrixSummon() + { + if (!xyz_mode) return false; + AI.SelectMaterials(CardId.Raidraptor_ArsenalFalcon, CardId.Blackwing_ZephyrostheElite); + return true; + } + private bool Raidraptor_WiseStrixEffect() + { + if (ActivateDescription == -1) + { + int count = 0; + if (HasInDeck(CardId.Raidraptor_SingingLanius)) ++count; + if (HasInDeck(CardId.Blackwing_ZephyrostheElite)) ++count; + if (HasInDeck(CardId.Raider_Wing)) ++count; + if (count <= 1) return false; + AI.SelectCard(CardId.Raider_Wing); + return true; + } + return true; + } + private bool Raidraptor_ArsenalFalconEffect() + { + if (Card.Location == CardLocation.MonsterZone) + { + AI.SelectCard(CardId.SupremeKingGateZero); + AI.SelectNextCard(new int[] {CardId.Blackwing_ZephyrostheElite,CardId.Raider_Wing,CardId.Raidraptor_SingingLanius}); + return true; + } + return false; + } + private bool Raidraptor_ArsenalFalconSummon() + { + if (!XyzModeCheck(true)) return false; + var materials_lists = Util.GetXyzMaterials(Bot.MonsterZone, 7, 2, false, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + xyz_mode = true; + return true; + } + private bool Odd_EyesMeteorburstDragonCheck() + { + if (!XyzModeCheck()) return false; + var materials_lists = Util.GetXyzMaterials(Func.MergeList(new List() { Card }, + Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.PendulumZone)), 7, 2, false, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); }); + if (materials_lists.Count <= 0) return false; + List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), SecretoftheYangZingCheck); + var materials_sy_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_sy_lists.Count <= 0) return false; + Odd_EyesMeteorburstDragon_materials.Clear(); + Odd_EyesMeteorburstDragon_materials.AddRange(materials_sy_lists[0]); + return true; + } + private bool Odd_EyesMeteorburstDragonSummon() + { + if (!Odd_EyesMeteorburstDragonCheck()) return false; + AI.SelectMaterials(Odd_EyesMeteorburstDragon_materials); + return true; + } + private bool Odd_EyesMeteorburstDragonEffect() + { + AI.SelectCard(CardId.SupremeKingGateZero); + return true; + } + private bool DDSavantKeplerSummon() + { + if (HasInDeck(CardId.DarkContractwiththGate)) + { + summoned = true; + return true; + } + return false; + } +// private void DebugCards(string msg, IList cards) +// { +//#if DEBUG +// Logger.DebugWriteLine(cards.Count + msg); +// foreach (var card in cards) +// { +// if (card == null) continue; +// NamedCard namedCard = NamedCard.Get(card.Id); +// if (namedCard == null) continue; +// Logger.DebugWriteLine(msg + namedCard.Name); +// } +//#endif +// } + private bool ServantofEndymionEffect_2() + { + if (Card.Location == CardLocation.SpellZone) return true; + return false; + } + private bool IsSpsummonPMonster(ClientCard card) + { + return IsZefraScaleAbove(card) || IsZefraScaleBelow(card) || card.Id == CardId.SupremeKingGateZero || card.Id == CardId.ServantofEndymion; + } + private int GetSpellActivateCount() + { + int count = 0; + if (!activate_DragonShrine && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.DragonShrine) && + (HasInDeck(CardId.FlameBeastoftheNekroz) || HasInDeck(CardId.DestrudotheLostDragon_Frisson) || HasInDeck(CardId.SupremeKingDragonDarkwurm))) ++count; + if (!activate_SpellPowerMastery && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.SpellPowerMastery) + && (HasInDeck(CardId.TheMightyMasterofMagic) || HasInDeck(CardId.ServantofEndymion))) ++count; + if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.DarkContractwiththGate)) ++count; + if (!activate_ZefraProvidence && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.ZefraProvidence)) + { + if (func.CardsCheckCount(Bot.Hand, func.IsCode, CardId.OracleofZefra) <= 0 && !activate_OracleofZefra + && HasInDeck(CardId.OracleofZefra)) + { + count += 2; + } + else + { + ++count; + } + } + if (!activate_OracleofZefra && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.OracleofZefra)) ++count; + if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.Terraforming) && HasInDeck(CardId.OracleofZefra)) ++count; + if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.FoolishBurial)) ++count; + if (func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Pendulum) > 1 && Bot.SpellZone[0] == null && + Bot.SpellZone[4] == null) ++count; + if (!summoned && Bot.HasInHand(CardId.DDSavantKepler) && HasInDeck(CardId.DarkContractwiththGate)) ++count; + return count; + } + private bool ServantofEndymionEffect_3() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + return false; + } + private bool ZefraDivineStrikeEffect() + { + if (Duel.LastChainPlayer == 0) return false; + AI.SelectCard(CardId.RitualBeastTamerZeframpilica, CardId.SatellarknightZefrathuban, CardId.StellarknightZefraxciton, CardId.FlameBeastoftheNekroz, CardId.ShaddollZefracore, + CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing); + return true; + } + private bool NinePillarsofYangZingEffect() + { + if (Duel.LastChainPlayer == 0) return false; + List cards = func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing },Bot.MonsterZone); + cards.AddRange(func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing,CardId.Zefraxi_TreasureoftheYangZing }, Bot.SpellZone)); + AI.SelectCard(cards); + return true; + } + private bool IsActivateBlackwing_ZephyrostheElite() + { + return (Blackwing_ZephyrostheElite_activate || HeavymetalfoesElectrumite_activate) && Func.GetZoneCards(Bot, CardLocation.PendulumZone, true).Count <= 0; + } + private bool PendulumDefaultActivate() + { + return IsActivateBlackwing_ZephyrostheElite() || (checkPActivate() && IsActivateScale()); + } + private bool ServantofEndymionEffect() + { + if (PendulumActivate()) + { + if (IsActivateBlackwing_ZephyrostheElite()) return true; + if ((!HasInDeck(CardId.TheMightyMasterofMagic) && !HasInDeck(CardId.MythicalBeastJackalKing) || GetSpellActivateCount() < 2)) return false; + return true; + } + else if (Card.Location == CardLocation.SpellZone) + { + if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) + { + return func.CardsCheckAny(Bot.Hand, IsSpsummonPMonster); + } + return true; + } + else if (Card.Location == CardLocation.MonsterZone) return true; + else return false; + } + private bool IsZefraScaleAbove(ClientCard card) + { + return Func.IsCode(card, CardId.StellarknightZefraxciton, CardId.SecretoftheYangZing, CardId.FlameBeastoftheNekroz, CardId.ShaddollZefracore); + } + private bool IsZefraScaleBelow(ClientCard card) + { + return Func.IsCode(card, CardId.RitualBeastTamerZeframpilica, CardId.Zefraxi_TreasureoftheYangZing, CardId.SatellarknightZefrathuban); + } + private bool TerraformingEffect() + { + return Bot.HasInHand(CardId.OracleofZefra); + } + private bool DDSavantKeplerEffect() + { + if (PendulumActivate()) return false; + return true; + } + private bool FoolishBurialEffect() + { + return true; + } + private List GetSynchroMaterials() + { + List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), + card => { return !IsNoLinkCards(card) && !card.HasType(CardType.Link | CardType.Xyz); }); + return materials; + } + private bool DestrudotheLostDragon_FrissonEffect() + { + if (Bot.HasInExtra(CardId.CrystronHalqifibrax)) return true; + if (!Bot.HasInExtra(CardId.F_A_DawnDragster) && !Bot.HasInExtra(CardId.Odd_EyesMeteorburstDragon)) return false; + List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true),card => { return SecretoftheYangZingCheck(card) && !IsNoLinkCards(card) && !card.HasType(CardType.Tuner) && card.Level > 0;}); + if (pre_materials.Count <= 0) return false; + List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),card=> + { + return !IsNoLinkCards(card) && card.Level > 0 && !card.HasType(CardType.Tuner); + }); + if (cards.Count <= 0) return false; + AI.SelectCard(cards); + return true; + } + private bool IsCanSynchroSummon(int level) + { + return func.CardsCheckAny(GetSynchroMaterials(), card => { return (card.Level + level == 8 + && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.BorreloadSavageDragon, CardId.PSY_FramelordOmega); })) + || (card.Level + level == 7 && SecretoftheYangZingCheck(card) && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.Odd_EyesMeteorburstDragon, CardId.F_A_DawnDragster); })) + || (card.Level + level == 5 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)) + || (card.Level + level == 4 && Bot.HasInExtra(CardId.HeraldoftheArcLight)); }); + } + private bool DDLamiaEffect() + { + if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && !IsCanSynchroSummon(Card.Level)) return false; + AI.SelectCard(CardId.DarkContractwiththGate, CardId.DDSavantKepler); + activate_DDLamia = true; + return true; + } + private bool DragonShrineEffect() + { + return true; + } + private bool ZefraathEffect() + { + if (PendulumActivate()) return !activate_p_Zefraath || IsActivateBlackwing_ZephyrostheElite(); + if (Card.Location == CardLocation.SpellZone) + { + activate_p_Zefraath = true; + return true; + } + return false; + } + private bool RitualBeastTamerZeframpilicaEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + return true; + } + private bool BorreloadSavageDragonSummon_2() + { + if (xyz_mode) return BorreloadSavageDragonSummon(); + return false; + } + private bool BorreloadSavageDragonSummon() + { + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,Card.Level,1,1,false,true,null, + card=> { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic) && !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_lists.Count <= 0) return false; + foreach (var materials in materials_lists) + { + if (func.CardsCheckAny(materials, func.IsCode, CardId.MechaPhantomBeastToken)) + { + AI.SelectMaterials(materials); + return true; + } + } + AI.SelectMaterials(materials_lists[0]); + return true; + } + private bool BorreloadSavageDragonEffect() + { + /* + * effect1 bug: Unable to read card info in the func "OnselectCard" + * Unable to run in the "ActivateDescription == -1" + */ + AI.SelectCard(new[] + { + CardId.SaryujaSkullDread, + CardId.MechaPhantomBeastAuroradon, + CardId.HeavymetalfoesElectrumite, + CardId.CrystronHalqifibrax, + CardId.Raidraptor_WiseStrix + }); + return true; + } + private bool TheMightyMasterofMagicEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + else if (Card.Location == CardLocation.MonsterZone) + { + if (Duel.LastChainPlayer == 0) return false; + AI.SelectCard(CardId.ServantofEndymion, CardId.TheMightyMasterofMagic); + return true; + } + else + { + return true; + } + } + private bool checkPActivate() + { + if (p_summoned) return false; + if (func.HasInZone(Bot, CardLocation.PendulumZone, CardId.Zefraath, true)) return true; + if (Bot.HasInHand(CardId.Zefraath) && (Bot.SpellZone[0] != null || Bot.SpellZone[4] != null)) return false; + if (Bot.SpellZone[0] == null && Bot.SpellZone[4] == null) + { + if (!Bot.HasInHand(CardId.Zefraath) && !func.CardsCheckAny(Bot.Hand, card => { return IsSpsummonPMonster(card) && + (Card.LScale >= 5 ? card.LScale < 5 : card.LScale > 5) && func.GetPSpSummonMonster(Bot,card,Card)?.Count > 0; })) return false; + } + else + { + if (func.GetPSpSummonMonster(Bot, Bot.SpellZone[0], Card)?.Count <= 0 && func.GetPSpSummonMonster(Bot, Bot.SpellZone[4], Card)?.Count <= 0) return false; + } + + return true; + } + private bool SecretoftheYangZingEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + activate_SecretoftheYangZing = true; + return true; + } + private bool SatellarknightZefrathubanEffect() + { + + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + return false; + } + private bool BorreloadSavageDragonEffect_2() + { + if (Duel.LastChainPlayer == 1) + { + ClientCard card = Util.GetLastChainCard(); + return card != null && !card.HasType(CardType.Continuous | CardType.Field) && card.HasType(CardType.Spell | CardType.Trap); + } + return false; + } + private bool Zefraxi_TreasureoftheYangZingEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + return true; + } + private bool OracleofZefraEffect() + { + activate_OracleofZefra = true; + return true; + + } + private bool FlameBeastoftheNekrozEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + else + { + return true; + } + + } + private bool AstrographSorcererEffect() + { + if (PendulumActivate()) return false; + return true; + } + private bool StellarknightZefraxcitonEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + else + { + return true; + } + } + private bool IsNoLinkCards(ClientCard card) + { + if (card == null) return false; + return ((card.IsCode(CardId.MythicalBeastJackalKing) || card.IsCode(CardId.TheMightyMasterofMagic)) && !card.IsDisabled()) + || card.IsCode(CardId.BorreloadSavageDragon) || card.IsCode(CardId.PSY_FramelordOmega) || card.IsCode(CardId.F_A_DawnDragster) + || card.IsCode(CardId.TruKingofAllCalamities) || card.IsCode(CardId.HeraldoftheArcLight) || card.LinkCount >= 3; + } + private bool LinkuribohSummon() + { + List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true),func.HasLevel,1); + if (func.CardsCheckCount(materials, Func.NegateFunc(func.HasType), CardType.Tuner) <= 0 && + func.CardsCheckCount(materials, func.HasType, CardType.Tuner) <= 1) return false; + materials.Sort((cardA, cardB) => + { + if (cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner)) return 1; + if (!cardA.HasType(CardType.Tuner) && cardB.HasType(CardType.Tuner)) return -1; + return 0; + }); + AI.SelectMaterials(materials); + return true; + } + private bool SpellSet() + { + if (Card.HasType(CardType.Trap)) + { + AI.SelectPlace(Zones.z1|Zones.z2|Zones.z3|Zones.z4|Zones.z0); + return true; + } + return false; + } + private bool SpellSet_2() + { + if (Card.HasType(CardType.QuickPlay)) + { + AI.SelectPlace(Zones.z1 | Zones.z2 | Zones.z3 | Zones.z4 | Zones.z0); + return true; + } + return false; + } + private bool ShaddollZefracoreEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate(); + } + else + { + return true; + } + } + private bool PSY_FramelordOmegaEffect() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (Duel.Player == 0) return true; + else + { + if (Bot.Banished.Count <= 0) return false; + AI.SelectCard(func.CardsIdToClientCards(new List { CardId.JetSynchron, CardId.DDLamia }, Bot.Banished)); + return true; + } + } + else + { + if (Bot.Graveyard.Count <= 0) return false; + AI.SelectCard(func.CardsIdToClientCards(new List { CardId.Zefraath, CardId.CrystronHalqifibrax, CardId.Denglong_FirstoftheYangZing,CardId.BorreloadSavageDragon, CardId.DDLamia }, Bot.Graveyard)); + return true; + } + } + private bool Psummon() + { + //if (ActivateDescription == P_SPSUMMON_DESC) + if (Card.Location == CardLocation.SpellZone) + { + p_summoning = true; + p_summoned = true; + return true; + } + return false; + } + private bool IsExtraZoneCard(ClientCard card) + { + if (card == null) return false; + ClientCard ex_card = Bot.MonsterZone[5]; + if (ex_card == card) return true; + ex_card = Bot.MonsterZone[6]; + if (ex_card == card) return true; + return false; + } + private bool HeavymetalfoesElectrumiteSummon() + { + if (Odd_EyesMeteorburstDragonCheck()) return false; + List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum); + if (materials.Count > 0) + { + materials.Sort((cardA,cardB) => + { + if ((cardA.Level == 3 || cardA.HasType(CardType.Tuner)) && cardB.Level != 3 && !cardB.HasType(CardType.Tuner)) return -1; + if (cardA.Level != 3 && !cardA.HasType(CardType.Tuner) && (cardB.Level == 3 || cardB.HasType(CardType.Tuner))) return 1; + return CardContainer.CompareCardLevel(cardA, cardB); + }); + materials.Reverse(); + List result = new List(); + foreach (var material in materials) + { + if (IsExtraZoneCard(material)) result.Insert(0, material); + else if (IsNoLinkCards(material) || (material.HasType(CardType.Tuner) && Bot.HasInExtra(CardId.CrystronHalqifibrax) + && func.CardsCheckCount(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),func.HasType,CardType.Tuner) <= 0)) continue; + else result.Add(material); + } + if (result.Count < 2) return false; + AI.SelectMaterials(result); + return true; + } + return false; + } + private bool SecretoftheYangZingCheck(ClientCard card) + { + if (card.IsCode(CardId.SecretoftheYangZing) && Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing)) + { + return func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.PendulumZone | CardLocation.MonsterZone, true), p_card => { + return p_card.HasSetcode(0xc4) && p_card.HasType(CardType.Pendulum);}) <= 0; + } + return true; + } + private bool F_A_DawnDragsterSummon() + { + List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),SecretoftheYangZingCheck); + var materials_lists = Util.GetSynchroMaterials(pre_materials, 7,1,1,false,true,null,card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_lists.Count <= 0) return false ; + foreach (var materials in materials_lists) + { + if (func.CardsCheckCount(materials, card=> + { + return card.HasType(CardType.Tuner) && card.HasRace(CardRace.Machine); + })<=0) + { + AI.SelectMaterials(materials); + return true; + } + } + AI.SelectMaterials(materials_lists[0]); + return true; + } + private bool CrystronHalqifibraxEffect() + { + return true; + } + private bool MechaPhantomBeastAuroradonSummon() + { + if (Bot.GetMonstersInMainZone().Count >= 4 || (!HasInDeck(CardId.MechaPhantomBeastO_Lion) && !IsCanSPSummonTunerLevel1() + && !func.CardsCheckAny(Func.GetZoneCards(Bot,CardLocation.MonsterZone|CardLocation.Grave,true),func.IsCode,CardId.Deskbot001))) return false; + if (XyzModeCheck()) + { + List pre_materials = new List(); + List key_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Grave), card => { + return (card.IsCode(CardId.DDLamia) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), scard => + { return Func.HasSetCode(scard, 0xaf, 0xae) && scard.Id != CardId.DDLamia; }) > 0); + }); + List key_materials_2 = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Grave), card => { return card.IsCode(CardId.JetSynchron) && !activate_JetSynchron; }); + pre_materials.AddRange(key_materials); + pre_materials.AddRange(key_materials_2); + if (!summoned) pre_materials.AddRange(func.CardsCheckWhere(Bot.Hand,Func.NegateFunc(func.IsCode),CardId.DestrudotheLostDragon_Frisson)); + pre_materials.AddRange(Bot.MonsterZone); + var materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1,false,true,null,card=> { return !card.IsCode(CardId.MythicalBeastJackalKing);}); + if (materials_lists.Count > 0) return false; + } + List m = new List(); + int link_count = 0; + List cards = Bot.GetMonsters(); + cards.Sort(CardContainer.CompareCardLink); + cards.Reverse(); + foreach (var card in Bot.GetMonsters()) + { + if (card == null) continue; + if (card.IsFacedown() || !card.HasRace(CardRace.Machine) || IsNoLinkCards(card)) continue; + m.Add(card); + link_count += (card.HasType(CardType.Link)) ? card.LinkCount : 1; + if (link_count >= 3) break; + } + if (link_count < 3) return false; + AI.SelectMaterials(m); + return true; + } + private bool SaryujaSkullDreadEffect() + { + if (ActivateDescription == Util.GetStringId(CardId.SaryujaSkullDread, 2)) + { + AI.SelectCard(GetSendToDeckIds()); + return true; + } + return true; + } + private bool SaryujaSkullDreadSummon() + { + if (Bot.GetMonstersInMainZone().Count < 4 || (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && !xyz_mode)) return false; + List materials = new List(); + int link_count = 0; + int materials_count = 0; + int tuner_count = func.CardsCheckCount(Bot.MonsterZone, func.HasType, CardType.Tuner); + List temp_materials = Bot.GetMonsters(); + temp_materials.Sort((cardA, cardB) => + { + if ((cardA.HasType(CardType.Tuner) && cardB.HasType(CardType.Tuner)) + || (!cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner))) { + return CardContainer.CompareCardLevel(cardA, cardB); + } + else if (cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner)) return 1; + return -1; + }); + foreach (var material in temp_materials) + { + ++materials_count; + if (IsExtraZoneCard(material)) materials.Insert(0, material); + else if (IsNoLinkCards(material)) { --materials_count; continue; } + else materials.Add(material); + link_count += material.HasType(CardType.Link) ? material.LinkCount : 1; + if (link_count >= 4) + { + if (materials_count == 3 && Bot.Deck.Count > 4 && ((func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Tuner) > 0 + || (Bot.HasInMonstersZone(CardId.DDLamia,false,false,true) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards + (Bot,CardLocation.Onfield|CardLocation.Hand,true),card=> { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) + > 0) || (Bot.HasInMonstersZone(CardId.JetSynchron, false, false, true) && !activate_JetSynchron)) || xyz_mode)) + { + --link_count; + continue; + } + break; + } + } + if (materials.Count < 3) return false; + AI.SelectMaterials(materials); + return true; + } + private bool CrystronHalqifibraxSummon() + { + List materials = new List(); + if (Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon)) + { + materials.Add(Bot.MonsterZone[5]); + materials.Add(Bot.MonsterZone[6]); + } + List mainMonsters = Bot.GetMonstersInMainZone(); + mainMonsters.Sort(CardContainer.CompareCardAttack); + materials.AddRange(mainMonsters); + AI.SelectMaterials(materials); + return true; + } + private bool PendulumActivate() + { + return Func.PendulumActivate(ActivateDescription, Card); + } + private bool IsActivateScale() + { + return func.IsActivateScale(Bot, Card); + } + private bool SpellActivate() + { + return Func.SpellActivate(Card); + } + private bool SupremeKingGateZeroEffect() + { + if (PendulumActivate()) return PendulumDefaultActivate(); + return false; + } + private bool MythicalBeastJackalKingEffect() + { + if (PendulumActivate()) return PendulumDefaultActivate(); + return true; + } + private bool Denglong_FirstoftheYangZingSummon_2() + { + if (xyz_mode) return Denglong_FirstoftheYangZingSummon(); + return false; + } + private bool Denglong_FirstoftheYangZingSummon() + { + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, 5, 1, 1, false, true, null, + card => { return !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + return true; + } + private bool Denglong_FirstoftheYangZingEffect() + { + if (ActivateDescription == Util.GetStringId(CardId.Denglong_FirstoftheYangZing, 1)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + AI.SelectCard(CardId.NinePillarsofYangZing, CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing); + } + else + { + AI.SelectCard(CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing,CardId.LightoftheYangZing); + } + return true; + } + private bool DarkContractwiththGateEffect() + { + if (SpellActivate()) + { + return HasInDeck(CardId.DDLamia) || func.HasInZone(Bot, CardLocation.PendulumZone, CardId.ServantofEndymion, true, true); + } + return true; + } + private int DisabledSort(ClientCard cardA,ClientCard cardB) + { + bool RitualBeastTamerZeframpilica_flag = !summoned && Bot.HasInExtra(CardId.HeraldoftheArcLight) && IsCanSPSummonTunerLevel1(); + if (((cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardA, CardId.MaxxC,CardId.Zefraath,CardId.MythicalBeastJackalKing,CardId.TheMightyMasterofMagic) || cardA.HasType(CardType.Trap) || cardA.HasType(CardType.Tuner)) + && !cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardB.HasType(CardType.Trap) && !Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardB.HasType(CardType.Tuner)) return 1; + else if (!cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardA.HasType(CardType.Trap) && !Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardA.HasType(CardType.Tuner) + && ((cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardB.HasType(CardType.Trap) || cardB.HasType(CardType.Tuner))) return -1; + return 0; + } + private List GetDisabledIds() + { + List ids = new List(); + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.Blackwing_ZephyrostheElite); + ids.Add(CardId.Raider_Wing); + ids.Add(CardId.Raidraptor_SingingLanius); + ids.Add(CardId.PSY_FrameDriver); + if (!Bot.HasInGraveyard(CardId.Raidraptor_ArsenalFalcon) || !Bot.HasInExtra(CardId.TruKingofAllCalamities)) ids.Add(CardId.Rank_Up_MagicSoulShaveForce); + if (Bot.HasInBanished(CardId.PSY_FrameDriver)) ids.Add(CardId.PSY_FramegearGamma); + ids.Add(CardId.LightoftheYangZing); + ids.Add(CardId.DDLamia); + ids.AddRange(Func.GetCardsRepeatCardsId(Bot.Hand)); + List hands = Func.GetZoneCards(Bot, CardLocation.Hand); + hands.Sort(DisabledSort); + List hand_ids = Func.ClientCardsToCardsId(hands, true); + ids.AddRange(hand_ids); + return ids; + } + private List GetSendToDeckIds() + { + List ids = new List(); + List repeat_ids = Func.GetCardsRepeatCardsId(Func.GetZoneCards(Bot, CardLocation.Hand)); + ids.Add(CardId.MechaPhantomBeastO_Lion); + ids.AddRange(repeat_ids); + ids.Add(CardId.Raidraptor_SingingLanius); + ids.Add(CardId.Raider_Wing); + ids.Add(CardId.Blackwing_ZephyrostheElite); + ids.Add(CardId.PSY_FrameDriver); + ids.Add(CardId.LightoftheYangZing); + ids.Add(CardId.Rank_Up_MagicSoulShaveForce); + if (activate_ZefraProvidence) ids.Add(CardId.ZefraProvidence); + if(activate_OracleofZefra) ids.Add(CardId.OracleofZefra); + if(activate_DragonShrine) ids.Add(CardId.DragonShrine); + if(activate_SpellPowerMastery) ids.Add(CardId.SpellPowerMastery); + List hands = Func.GetZoneCards(Bot, CardLocation.Hand); + hands.Sort(DisabledSort); + List hand_ids = Func.ClientCardsToCardsId(hands, true); + ids.AddRange(hand_ids); + return ids; + } + private bool TruKingofAllCalamitiesEffect() + { + if (Duel.Player == 1) + { + AI.SelectAttributes(new CardAttribute[] { CardAttribute.Divine }); + return true; + } + return false; + } + private bool JetSynchronEffect() + { + + if (Card.Location == CardLocation.Grave) + { + if (!IsCanSynchroSummon(Card.Level)) return false; + if (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Extra), card => { return card.HasType(CardType.Synchro) || Func.IsCode(card, CardId.CrystronHalqifibrax, CardId.Linkuriboh); })) + { + activate_JetSynchron = true; + List dcards = func.CardsIdToClientCards(GetDisabledIds(), Bot.Hand); + if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && dcards.Count <= 0) return false; + AI.SelectCard(dcards); + return true; + } + } + return false; + } + private bool MechaPhantomBeastAuroradonEffect() + { + if (ActivateDescription == -1) { link_summoned = true; return true; } + else + { + if (!HasInDeck(CardId.MechaPhantomBeastO_Lion) + && Func.GetZoneCards(Enemy,CardLocation.Onfield).Count <= 0 && func.CardsCheckCount(Bot.Graveyard,func.HasType,CardType.Trap) <= 0) return false; + List tRelease = new List(); + List nRelease = new List(); + foreach (var card in Bot.GetMonsters()) + { + if (card == null || IsNoLinkCards(card)) continue; + if (card.Id == CardId.MechaPhantomBeastToken) tRelease.Add(card); else nRelease.Add(card); + } + int count = tRelease.Count() + nRelease.Count(); + opt_0 = false; + opt_1 = false; + opt_2 = false; + if (count >= 3 && func.CardsCheckCount(Bot.Graveyard, func.HasType, CardType.Trap) > 0) opt_2 = true; + if (count >= 2 && CheckRemainInDeck(CardId.MechaPhantomBeastO_Lion) > 0) opt_1 = true; + if (count >= 1 && Func.GetZoneCards(Enemy, CardLocation.Onfield).Count > 0) opt_0 = true; + if (!opt_0 && !opt_1 && !opt_2) return false; + return true; + } + } + private bool SupremeKingDragonDarkwurmEffect() + { + if (Card.Location == CardLocation.Grave) + { + activate_SupremeKingDragonDarkwurm_1 = true; + return true; + } + if (Card.Location == CardLocation.MonsterZone) + { + activate_SupremeKingDragonDarkwurm_2 = true; + return true; + } + return false; + } + private bool SupremeKingDragonDarkwurmSummon() + { + if ((!activate_p_Zefraath && Bot.HasInHand(CardId.Zefraath) && !activate_SupremeKingDragonDarkwurm_1 && HasInDeck(CardId.SupremeKingGateZero) && func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner)) + ||(func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand), card => { return card.LinkCount > 5; }) && + !Bot.HasInHand(CardId.SupremeKingGateZero) && !activate_SupremeKingDragonDarkwurm_2)) + { + summoned = true; + return true; + } + return false; + } + private bool DefaultSummon_2() + { + if (Card.Location == CardLocation.Hand && Card.Level <= 4 + && Bot.HasInExtra(CardId.CrystronHalqifibrax) && (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return Card.HasType(CardType.Tuner) ? true : card.HasType(CardType.Tuner); }))) { + summoned = true; + return true; + } + return false; + } + private bool IsCanSPSummonTunerLevel1() { + return func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.Grave, true), card => { + return (card.IsCode(CardId.DDLamia) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), scard => { return Func.HasSetCode(scard, 0xaf, 0xae) && scard.Id != CardId.DDLamia; }) + > 0) || (card.IsCode(CardId.JetSynchron) && !activate_JetSynchron) && Bot.GetMonstersInMainZone().Count <= 3; + }); + } + private bool DefaultSummon() + { + if (Card.Level > 4) return false; + if ((!link_summoned && Bot.HasInExtra(CardId.HeavymetalfoesElectrumite) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum) > 0 + && Card.HasType(CardType.Pendulum)) + || (IsCanSPSummonTunerLevel1() && ((Card.Level == 3 && Bot.HasInExtra(CardId.HeraldoftheArcLight)) || ( + Card.Level == 4 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)))) || + (Card.Id == CardId.SupremeKingDragonDarkwurm && !activate_SupremeKingDragonDarkwurm_2) + ||(Bot.HasInExtra(CardId.CrystronHalqifibrax) && Bot.HasInHandOrInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)) + { + summoned = true; + return true; + } + return false; + } + private bool OneforOneEffect() + { + AI.SelectCard(GetDisabledIds()); + AI.SelectNextCard(CardId.JetSynchron, CardId.LightoftheYangZing,CardId.DDLamia); + return true; + } + private void HeavymetalfoesElectrumiteAddIds (List ids) + { + if (!summoned && HasInDeck(CardId.DarkContractwiththGate) && HasInDeck(CardId.DDLamia)) + { + if (!func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Tuner)) + { + ids.Add(CardId.DDSavantKepler); + } + else + { + ids.Add(CardId.AstrographSorcerer); + ids.Add(CardId.DDSavantKepler); + } + } + ids.Add(CardId.AstrographSorcerer); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.DDSavantKepler); + } + private bool LinkuribohEffect() + { + if (Card.Location == CardLocation.Grave) + { + if (Duel.Player != 0) return true; + return false; + } + return true; + } + private bool Raider_WingEffect() + { + if (!Bot.HasInMonstersZone(CardId.Raidraptor_ForceStrix, false, true, true)) return false; + AI.SelectCard(CardId.Raidraptor_ForceStrix); + return true; + } + private bool HeavymetalfoesElectrumiteEffect() + { + if (ActivateDescription != -1) + { + List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.SpellZone, true),Func.NegateFunc(func.IsCode),CardId.DarkContractwiththGate); + if (cards.Count <= 0) + { + HeavymetalfoesElectrumite_activate = true; + return false; + } + HeavymetalfoesElectrumite_activate = false; + return true; + } + return true; + } + public override bool OnSelectHand() + { + return true; + } + private bool HeraldoftheArcLightEffect() + { + if (Card.Location == CardLocation.MonsterZone) + { + return Duel.LastChainPlayer != 0; + } + return false; + } + private bool CalledbytheGraveEffect() + { + if ((Bot.SpellZone[5] == Card || Bot.SpellZone[0] == Card) && Duel.Player == 0) return true; + ClientCard card = Util.GetLastChainCard(); + if (card == null) return false; + int id = card.Id; + List g_cards = func.CardsCheckWhere(Enemy.Graveyard, func.IsCode, id); + if (Duel.LastChainPlayer != 0) + { + if (card.Location == CardLocation.Grave && card.HasType(CardType.Monster)) + { + AI.SelectCard(card); + return true; + } + else if (g_cards.Count() > 0 && card.HasType(CardType.Monster)) + { + AI.SelectCard(g_cards); + return true; + } + } + return false; + } + public override bool OnSelectYesNo(int desc) + { + /* + can't get code 74580251 Duel.SelectEffectYesNo(tp,e:GetHandler(),96) + */ + return base.OnSelectYesNo(desc); + } + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + NamedCard card = NamedCard.Get(cardId); + if (cardId == CardId.F_A_DawnDragster && Duel.Turn > 1) return CardPosition.FaceUpAttack; + if (card.Attack <= 1000) return CardPosition.FaceUpDefence; + return base.OnSelectPosition(cardId, positions); + } + public override int OnSelectOption(IList options) + { + if (options.Contains(Util.GetStringId(CardId.MechaPhantomBeastAuroradon, 3))) + { + if (opt_1) return options.IndexOf(Util.GetStringId(CardId.MechaPhantomBeastAuroradon, 3)); + else if (opt_0) return 0; + return options[options.Count - 1]; + } + return base.OnSelectOption(options); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + NamedCard card = NamedCard.Get(cardId); + if (player == 0) + { + if (location == CardLocation.SpellZone) + { + if (card.HasType(CardType.Pendulum)) + { + if ((available & Zones.z4) > 0) return Zones.z4; + if ((available & Zones.z0) > 0) return Zones.z0; + } + else + { + List keys = new List() { 1, 2, 3 }; + while (keys.Count > 0) + { + int index = Program.Rand.Next(keys.Count); + int key = keys[index]; + int zone = 1 << key; + if ((zone & available) > 0) return zone; + keys.Remove(key); + } + } + } + else if (location == CardLocation.MonsterZone) + { + if (card.HasType(CardType.Link)) + { + if ((available & Zones.z5) > 0) return Zones.z5; + if ((available & Zones.z6) > 0) return Zones.z6; + } + } + } + + return base.OnSelectPlace(cardId, player, location, available); + } + public override void OnChainEnd() + { + should_destory = false; + base.OnChainEnd(); + } + public override IList OnSelectSynchroMaterial(IList cards, int sum, int min, int max) + { + return base.OnSelectSynchroMaterial(cards, sum, min, max); + } + private IList _OnSelectPendulumSummon(IList cards, int min,int max) + { + List ids = func.GetSelectCardIdList(); + List result = func.GetSelectCardList(); + List exs = func.CardsCheckWhere(cards, func.IsLocation, CardLocation.Extra); + List hs = func.CardsCheckWhere(cards,Func.NegateFunc(func.IsLocation), CardLocation.Extra); + if (func.CardsCheckAny(Func.GetZoneCards(Bot,CardLocation.PendulumZone,true),card=> { + return card.HasSetcode(0xc4) && !card.IsCode(CardId.Zefraath);}) && func.CardsCheckAny(exs, func.IsCode, CardId.ShaddollZefracore)) ids.Add(CardId.ShaddollZefracore); + result = func.CardsIdToClientCards(ids,cards); + List temp_cards = func.CardsCheckWhere(cards, Func.NegateFunc(func.IsCode), CardId.MaxxC); + result.AddRange(temp_cards); + if(result.Count <= 0) return Func.CheckSelectCount(Util, result, cards, min, min); + if (result[0] != null && result[0].Location != CardLocation.Extra) ++p_count; + return Func.CheckSelectCount(Util, result, cards, max, max); + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (AI.HaveSelectedCards()) return null; + List ids = func.GetSelectCardIdList(); + List result = func.GetSelectCardList(); + if (hint == HintMsg.AddToHand) + { + if (func.CardsCheckAny(cards, card => { return card.Location == CardLocation.Deck && card.HasSetcode(0xc4); })) + { + if (!activate_ZefraProvidence) ids.Add(CardId.ZefraProvidence); + if (p_summoned) + { + if (!summoned && Bot.HasInExtra(CardId.HeavymetalfoesElectrumite) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum) == 1) + { + List pre_ids = new List {CardId.Zefraxi_TreasureoftheYangZing,CardId.StellarknightZefraxciton,CardId.RitualBeastTamerZeframpilica,CardId.NinePillarsofYangZing + ,CardId.StellarknightZefraxciton,CardId.ShaddollZefracore}; + ids.AddRange(pre_ids); + } + ids.Add(CardId.ZefraDivineStrike); + } + if (!activate_OracleofZefra) ids.Add(CardId.OracleofZefra); + if (!activate_p_Zefraath && !func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) ids.Add(CardId.Zefraath); + if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.SupremeKingGateZero, true) && !func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner) + && !Bot.HasInHand(CardId.Zefraxi_TreasureoftheYangZing)) ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + List pMonsters = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Hand), card => + { + return card.HasType(CardType.Pendulum) && !card.IsCode(CardId.Zefraath); + }); + if (pMonsters.Count > 0) + { + List zefraPMonsters = func.CardsCheckWhere(pMonsters, func.HasSetCode, 0xc4); + if (zefraPMonsters.Count > 0) + { + zefraPMonsters.Sort(Func.CompareCardScale); + int minScale = zefraPMonsters[0].RScale; + if (Bot.HasInHand(CardId.Zefraath)) + { + if (minScale < 5) + { + if (func.CardsCheckCount(cards, IsZefraScaleAbove) > 1) + { + ids.Add(CardId.ShaddollZefracore); + if (!Bot.HasInHand(CardId.Zefraxi_TreasureoftheYangZing)) ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + } + else + { + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.RitualBeastTamerZeframpilica); + ids.Add(CardId.SatellarknightZefrathuban); + } + } + else + { + if (func.CardsCheckCount(cards, IsZefraScaleBelow) > 1) + { + ids.Add(CardId.ShaddollZefracore); + if (!Bot.HasInHand(CardId.Zefraxi_TreasureoftheYangZing)) ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + } + else + { + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.ShaddollZefracore); + } + } + } + else + { + if (Bot.HasInGraveyard(CardId.FlameBeastoftheNekroz)) ids.Add(CardId.RitualBeastTamerZeframpilica); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + } + } + else + { + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + } + } + else + { + if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true) && + !activate_p_Zefraath) + { + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + } + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + } + result = func.CardsIdToClientCards(ids, cards); + } + else if (func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Extra)) + { + HeavymetalfoesElectrumiteAddIds(ids); + result = func.CardsIdToClientCards(ids, cards); + } + else if (func.CardsCheckALL(cards, func.HasSetCode, true, 0x12a)) + { + if (!func.HasInZone(Bot, CardLocation.PendulumZone | CardLocation.Hand, CardId.ServantofEndymion, true) || + (func.HasInZone(Bot, CardLocation.PendulumZone | CardLocation.Hand, CardId.ServantofEndymion, true) && (!HasInDeck(CardId.TheMightyMasterofMagic) || !HasInDeck(CardId.MythicalBeastJackalKing)))) ids.Add(CardId.ServantofEndymion); + ids.Add(CardId.TheMightyMasterofMagic); + ids.Add(CardId.MythicalBeastJackalKing); + result = func.CardsIdToClientCards(ids, cards); + } + else if (func.CardsCheckALL(cards, func.HasSetCode, true, 0xaf)) + { + ids.Add(CardId.DDLamia); + ids.Add(CardId.DDSavantKepler); + result = func.CardsIdToClientCards(ids, cards); + } + } + else if (hint == HintMsg.ToDeck && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand) && min == 3 && max ==3) + { + result = func.CardsIdToClientCards(GetSendToDeckIds(),cards); + } + else if (hint == HintMsg.ToGrave && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Deck)) + { + List extra_ids = CheckShouldSpsummonExtraMonster(); + //if (func.CardsCheckAny(cards, Func.HasRace, CardRace.Dragon)) + if (extra_ids.Count <= 0) + { + if (!activate_SupremeKingDragonDarkwurm_2 && Bot.GetMonsterCount() <= 0) ids.Add(CardId.SupremeKingDragonDarkwurm); + if (!activate_DestrudotheLostDragon_Frisson) ids.Add(CardId.DestrudotheLostDragon_Frisson); + if (!activate_JetSynchron) ids.Add(CardId.JetSynchron); + ids.Add(CardId.FlameBeastoftheNekroz); + } + else if (extra_ids.Count > 1) + { + if (Bot.GetMonsterCount() <= 0 && !activate_SupremeKingDragonDarkwurm_2) ids.Add(CardId.SupremeKingDragonDarkwurm); + if (func.CardsCheckAny(Bot.Hand, card => { return card.Level < 7 && card.HasType(CardType.Monster); })) ids.Add(CardId.DestrudotheLostDragon_Frisson); + if (Bot.GetHandCount() > 0) ids.Add(CardId.JetSynchron); + if (!summoned && Bot.HasInHand(CardId.RitualBeastTamerZeframpilica)) ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.FlameBeastoftheNekroz); + } + else if (extra_ids.Contains(CardId.HeavymetalfoesElectrumite)) + { + if (Bot.GetMonsterCount() <= 0 && !activate_SupremeKingDragonDarkwurm_2) ids.Add(CardId.SupremeKingDragonDarkwurm); + if (!summoned && Bot.HasInHand(CardId.RitualBeastTamerZeframpilica)) ids.Add(CardId.FlameBeastoftheNekroz); + //if (!summoned && func.CardsCheckAny(Bot.Hand, card => { return card.Level < 7 && card.HasType(CardType.Monster); })) ids.Add(CardId.DestrudotheLostDragon_Frisson); + //if (Bot.GetHandCount() > 0) ids.Add(CardId.JetSynchron); + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.FlameBeastoftheNekroz); + } + else if (extra_ids.Contains(CardId.CrystronHalqifibrax)) + { + if (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.MonsterZone, true), func.HasType, CardType.Tuner)) + { + if (Bot.GetMonsterCount() <= 0 && !activate_SupremeKingDragonDarkwurm_2) ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.FlameBeastoftheNekroz); + } + else + { + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.FlameBeastoftheNekroz); + + } + } + result = func.CardsIdToClientCards(ids, cards); + } + else if (hint == Util.GetStringId(CardId.Zefraath, 1)) + { + int[] pScales = Func.GetPScales(Bot); + int rScale = pScales[0]; + int lScale = pScales[1]; + int pScale = (rScale != 5) ? rScale : lScale; + if (pScale < 5) + { + if (!activate_SecretoftheYangZing && !func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.Extra, true), func.IsCode, CardId.SecretoftheYangZing)) ids.Add(CardId.SecretoftheYangZing); + if (!activate_ShaddollZefracore && func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.PendulumZone, true), card => { return !card.IsCode(CardId.Zefraath) && card.HasSetcode(0xc4); })) ids.Add(CardId.ShaddollZefracore); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.ShaddollZefracore); + } + else + { + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + } + result = func.CardsIdToClientCards(ids, cards); + } + else if (hint == Util.GetStringId(CardId.HeavymetalfoesElectrumite, 3)) + { + HeavymetalfoesElectrumiteAddIds(ids); + result = func.CardsIdToClientCards(ids, cards); + } + else if (!(IS_YGOPRO & !(hint == HintMsg.SpSummon)) && func.CardsCheckALL(cards, card =>{return card.IsCode(CardId.TheMightyMasterofMagic) || card.IsCode(CardId.MythicalBeastJackalKing); + }, true)) + { + ids.Add(CardId.MythicalBeastJackalKing); + ids.Add(CardId.TheMightyMasterofMagic); + result = func.CardsIdToClientCards(ids, cards); + } + else if (p_summoning || ((Card == Bot.SpellZone[0] || Card == Bot.SpellZone[4]) && hint == HintMsg.SpSummon && + Card.HasType(CardType.Pendulum))) + { + p_summoning = false; + if (p_count >= 3 && !Bot.HasInExtra(CardId.SaryujaSkullDread) && Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon)) return Func.CheckSelectCount(Util, result, cards, min, min); + return _OnSelectPendulumSummon(cards,min,max); + } + else if (hint == HintMsg.Destroy) + { + if (func.CardsCheckALL(cards, card => { return card.Controller == 0 && card.IsFaceup(); }, true)) + { + should_destory = true; + if (func.CardsCheckALL(cards, func.HasSetCode, true, 0x9e)) + { + if (!activate_SecretoftheYangZing) result = func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing }, func.CardsCheckWhere(cards, + func.IsLocation,CardLocation.MonsterZone)); + result.AddRange(func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing }, func.CardsCheckWhere(cards, + Func.NegateFunc(func.IsLocation), CardLocation.MonsterZone))); + } + else + { + List scards = func.CardsCheckWhere(cards, card => { return card.Location == CardLocation.SpellZone; }); + scards.Sort((cardA, cardB) => + { + if (Func.IsCode(cardA, CardId.OracleofZefra, CardId.DarkContractwiththGate) && !Func.IsCode(cardB, CardId.OracleofZefra, CardId.DarkContractwiththGate)) return 1; + if (!Func.IsCode(cardA, CardId.OracleofZefra, CardId.DarkContractwiththGate) && Func.IsCode(cardB, CardId.OracleofZefra, CardId.DarkContractwiththGate)) return -1; + return 0; + }); + result.AddRange(scards); + } + + } + else if (func.CardsCheckAny(cards, card => { return card.Controller == 1 && (card.Location & CardLocation.Onfield) > 0; }) && min == 1 && max == 1) + { + ClientCard card = Util.GetBestEnemyCard(); + if (card != null && cards.Contains(card)) result.Add(card); + else + { + result = new List(func.CardsCheckWhere(cards, ecard => { return ecard.Controller == 1; })); + if (result.Count <= 0) return null; + result.Sort(CardContainer.CompareCardAttack); + result.Reverse(); + } + } + } + else if (hint == HintMsg.SpSummon) + { + List tuner_ids = new List() + { + CardId.DestrudotheLostDragon_Frisson, CardId.PSY_FrameDriver, CardId.JetSynchron, CardId.PSY_FramegearGamma,CardId.LightoftheYangZing + }; + List no_tuner_ids = new List() + { + CardId.TheMightyMasterofMagic, CardId.MythicalBeastJackalKing, CardId.SecretoftheYangZing + }; + if (func.CardsCheckALL(cards, func.IsLocation,true,CardLocation.Hand)) + { + if(summoned && Bot.HasInExtra(CardId.CrystronHalqifibrax) && func.CardsCheckCount(Bot.MonsterZone,card => {return card.IsFaceup() + && card.HasType(CardType.Tuner);}) <= 0 && !(Bot.HasInGraveyard(CardId.DDLamia) && !activate_DDLamia + && func.CardsCheckCount(Func.GetZoneCards (Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) + <= 0) && !(Bot.HasInGraveyard(CardId.JetSynchron) && !activate_JetSynchron) + && !(Bot.HasInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)){ + ids.AddRange(tuner_ids); + ids.AddRange(no_tuner_ids); + } + else + { + ids.AddRange(no_tuner_ids); + ids.AddRange(tuner_ids); + } + result = func.CardsIdToClientCards(ids, cards); + } + else if (func.CardsCheckALL(cards, card => { return Func.IsCode(card, CardId.LightoftheYangZing, CardId.PSY_FramegearGamma, + CardId.MechaPhantomBeastO_Lion, CardId.JetSynchron, CardId.Deskbot001, CardId.DDLamia); })){ + if (Bot.GetMonstersInMainZone().Count <= 1) ids.Add(CardId.Deskbot001); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.Deskbot001); + ids.Add(CardId.LightoftheYangZing); + ids.Add(CardId.PSY_FramegearGamma); + result = func.CardsIdToClientCards(ids, cards); + } + + } + else if (hint == HintMsg.Release && func.CardsCheckAny(cards, func.IsLocation, CardLocation.MonsterZone)) + { + List tRelease = new List(); + List nRelease = new List(); + foreach (var card in cards) + { + if (card == null || IsNoLinkCards(card)) continue; + if (card.Id == CardId.MechaPhantomBeastToken) tRelease.Add(card); + else if(card.Id == CardId.Raidraptor_WiseStrix) tRelease.Insert(0,card); + else nRelease.Add(card); + } + result.AddRange(tRelease); + result.AddRange(nRelease); + } + return Func.CheckSelectCount(Util, result, cards, min, max); + } + private bool HasInDeck(int id) + { + return CheckRemainInDeck(id) > 0; + } + private int CheckRemainInDeck(int id) + { + switch (id) + { + case CardId.PSY_FrameDriver: + return Bot.GetRemainingCount(CardId.PSY_FrameDriver, 1); + case CardId.Zefraath: + return Bot.GetRemainingCount(CardId.Zefraath, 3); + case CardId.TheMightyMasterofMagic: + return Bot.GetRemainingCount(CardId.TheMightyMasterofMagic, 1); + case CardId.AstrographSorcerer: + return Bot.GetRemainingCount(CardId.AstrographSorcerer, 1); + case CardId.DestrudotheLostDragon_Frisson: + return Bot.GetRemainingCount(CardId.DestrudotheLostDragon_Frisson, 1); + case CardId.SupremeKingGateZero: + return Bot.GetRemainingCount(CardId.SupremeKingGateZero, 2); + case CardId.MythicalBeastJackalKing: + return Bot.GetRemainingCount(CardId.MythicalBeastJackalKing, 1); + case CardId.SecretoftheYangZing: + return Bot.GetRemainingCount(CardId.SecretoftheYangZing, 3); + case CardId.FlameBeastoftheNekroz: + return Bot.GetRemainingCount(CardId.FlameBeastoftheNekroz, 1); + case CardId.StellarknightZefraxciton: + return Bot.GetRemainingCount(CardId.StellarknightZefraxciton, 1); + case CardId.SupremeKingDragonDarkwurm: + return Bot.GetRemainingCount(CardId.SupremeKingDragonDarkwurm, 1); + case CardId.Blackwing_ZephyrostheElite: + return Bot.GetRemainingCount(CardId.Blackwing_ZephyrostheElite, 1); + case CardId.ShaddollZefracore: + return Bot.GetRemainingCount(CardId.ShaddollZefracore, 1); + case CardId.Raidraptor_SingingLanius: + return Bot.GetRemainingCount(CardId.Raidraptor_SingingLanius, 1); + case CardId.SatellarknightZefrathuban: + return Bot.GetRemainingCount(CardId.SatellarknightZefrathuban, 1); + case CardId.Raider_Wing: + return Bot.GetRemainingCount(CardId.Raider_Wing, 1); + case CardId.Zefraxi_TreasureoftheYangZing: + return Bot.GetRemainingCount(CardId.Zefraxi_TreasureoftheYangZing, 2); + case CardId.RitualBeastTamerZeframpilica: + return Bot.GetRemainingCount(CardId.RitualBeastTamerZeframpilica, 1); + case CardId.ServantofEndymion: + return Bot.GetRemainingCount(CardId.ServantofEndymion, 3); + case CardId.PSY_FramegearGamma: + return Bot.GetRemainingCount(CardId.PSY_FramegearGamma, 3); + case CardId.MechaPhantomBeastO_Lion: + return Bot.GetRemainingCount(CardId.MechaPhantomBeastO_Lion, 1); + case CardId.MaxxC: + return Bot.GetRemainingCount(CardId.MaxxC, 3); + case CardId.Deskbot001: + return Bot.GetRemainingCount(CardId.Deskbot001, 1); + case CardId.JetSynchron: + return Bot.GetRemainingCount(CardId.JetSynchron, 1); + case CardId.DDLamia: + return Bot.GetRemainingCount(CardId.DDLamia, 1); + case CardId.DDSavantKepler: + return Bot.GetRemainingCount(CardId.DDSavantKepler, 1); + case CardId.LightoftheYangZing: + return Bot.GetRemainingCount(CardId.LightoftheYangZing, 1); + case CardId.Rank_Up_MagicSoulShaveForce: + return Bot.GetRemainingCount(CardId.Rank_Up_MagicSoulShaveForce, 1); + case CardId.SpellPowerMastery: + return Bot.GetRemainingCount(CardId.SpellPowerMastery, 3); + case CardId.DragonShrine: + return Bot.GetRemainingCount(CardId.DragonShrine, 3); + case CardId.Terraforming: + return Bot.GetRemainingCount(CardId.Terraforming, 1); + case CardId.ZefraProvidence: + return Bot.GetRemainingCount(CardId.ZefraProvidence, 3); + case CardId.FoolishBurial: + return Bot.GetRemainingCount(CardId.FoolishBurial, 1); + case CardId.CalledbytheGrave: + return Bot.GetRemainingCount(CardId.CalledbytheGrave, 2); + case CardId.DarkContractwiththGate: + return Bot.GetRemainingCount(CardId.DarkContractwiththGate, 1); + case CardId.OracleofZefra: + return Bot.GetRemainingCount(CardId.OracleofZefra, 3); + case CardId.ZefraWar: + return Bot.GetRemainingCount(CardId.ZefraWar, 1); + case CardId.ZefraDivineStrike: + return Bot.GetRemainingCount(CardId.ZefraDivineStrike, 1); + case CardId.NinePillarsofYangZing: + return Bot.GetRemainingCount(CardId.NinePillarsofYangZing, 1); + default: + return 0; + } + } + } +} diff --git a/Game/AI/Enums/NotBeSynchroMaterialMonster.cs b/Game/AI/Enums/NotBeSynchroMaterialMonster.cs new file mode 100644 index 000000000..a7d6491ec --- /dev/null +++ b/Game/AI/Enums/NotBeSynchroMaterialMonster.cs @@ -0,0 +1,32 @@ +namespace WindBot.Game.AI.Enums +{ + public enum NotBeSynchroMaterialMonster + { + Ronintoadin = 1357146, + GagagaCaesar = 9583383, + VagueShadowToken = 9929399, + TourGuideFromtheUnderworld = 10802915, + PhotonToken = 17418745, + KagemuchaKnight = 19353570, + SharkStickers = 20838380, + GagagaMagician = 26082117, + RadianToken = 28674153, + Kurivolt = 40817915, + BlueMountainButterspy = 54582424, + Lightserpent = 55501446, + SaberShark = 63193879, + ConstellarKaus = 70908596, + CeremonialToken = 82340057, + HeroicChallenger_DoubleLance = 89774530, + SteelswarmScout = 90727556, + Kagetokage = 94656263, + YellowDuston = 16366810, + BlueDuston = 40217358, + Centerfrog = 47346782, + GreenDuston = 52182715, + RedDuston = 61019812, + EaterofMillions = 63845230, + PutridPuddingBodyBuddies = 85101097 + + } +} \ No newline at end of file diff --git a/Game/AI/Enums/NotBeXyzMaterialMonster.cs b/Game/AI/Enums/NotBeXyzMaterialMonster.cs new file mode 100644 index 000000000..23b74da85 --- /dev/null +++ b/Game/AI/Enums/NotBeXyzMaterialMonster.cs @@ -0,0 +1,13 @@ +namespace WindBot.Game.AI.Enums +{ + public enum NotBeXyzMaterialMonster + { + YellowDuston = 16366810, + BlueDuston = 40217358, + Centerfrog = 47346782, + GreenDuston = 52182715, + RedDuston = 61019812, + EaterofMillions = 63845230, + PutridPuddingBodyBuddies = 85101097 + } +} \ No newline at end of file diff --git a/WindBot.csproj b/WindBot.csproj index 0f29b7e80..c40a8c761 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -115,12 +115,15 @@ + + + From cfbdc0de0c00d2d6fb77f3b9c8d64b163bfa4025 Mon Sep 17 00:00:00 2001 From: YSPplayer <88619179+YSPplayer@users.noreply.github.com> Date: Sun, 18 Jun 2023 23:15:02 +0800 Subject: [PATCH 007/110] Update dialog and bot Zefra (#167) --- BotWrapper/bot.conf | 5 + Dialogs/Zefra.zh-CN.json | 5 + Game/AI/Decks/ZefraExecutor.cs | 510 +++++++++++++++++++-------------- Game/AI/Dialogs.cs | 17 +- Game/AI/Executor.cs | 1 + Game/GameAI.cs | 8 + 6 files changed, 328 insertions(+), 218 deletions(-) diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 3e2d153fc..8330018da 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -213,3 +213,8 @@ SUPPORT_MASTER_RULE_2020 Name=神数不神 Deck=Tearlaments Dialog=Zefra.zh-CN 旧式地天使珠泪哀歌族卡组。 AI_LV3 SUPPORT_MASTER_RULE_2020 + +!神数不神-神数 +Name=神数不神 Deck=Zefra Dialog=Zefra.zh-CN +神数卡组。 +AI_LV3 SUPPORT_MASTER_RULE_2020 diff --git a/Dialogs/Zefra.zh-CN.json b/Dialogs/Zefra.zh-CN.json index 346780ec9..fbe3870fb 100644 --- a/Dialogs/Zefra.zh-CN.json +++ b/Dialogs/Zefra.zh-CN.json @@ -50,5 +50,10 @@ "乎,我发动{0}!", "不好意思拉,我有{0}", "哈哈,发动{0}的效果!" + ], + "custom": [ + "呱!本体出征!", + "凸(艹皿艹 )卡手不玩拉!!!", + "嘿不慌,还有摆子场( ̄y▽ ̄)╭" ] } diff --git a/Game/AI/Decks/ZefraExecutor.cs b/Game/AI/Decks/ZefraExecutor.cs index 68451f19a..40bef73ab 100644 --- a/Game/AI/Decks/ZefraExecutor.cs +++ b/Game/AI/Decks/ZefraExecutor.cs @@ -106,6 +106,16 @@ public class CardId private bool HeavymetalfoesElectrumite_activate = false; private bool should_destory = false; private List Odd_EyesMeteorburstDragon_materials = new List(); + private bool duel_start = true; + private int activate_count = 0; + private int summon_count = 0; + private bool enemy_activate = false; + private enum CustomMessage + { + Happy, + Angry, + Surprise + } private static class Toos { public delegate bool Delegate(ClientCard card); @@ -437,21 +447,21 @@ public ZefraExecutor(GameAI ai, Duel duel) : base(ai, duel) { AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, CalledbytheGraveEffect); AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonEffect_2); - AddExecutor(ExecutorType.Activate, CardId.F_A_DawnDragster); + AddExecutor(ExecutorType.Activate, CardId.F_A_DawnDragster, ResetFlag); AddExecutor(ExecutorType.Activate, CardId.NinePillarsofYangZing, NinePillarsofYangZingEffect); AddExecutor(ExecutorType.Activate, CardId.ZefraDivineStrike, ZefraDivineStrikeEffect); AddExecutor(ExecutorType.Activate, CardId.HeraldoftheArcLight, HeraldoftheArcLightEffect); - AddExecutor(ExecutorType.Activate, CardId.TruKingofAllCalamities,TruKingofAllCalamitiesEffect); - AddExecutor(ExecutorType.Activate, CardId.PSY_FramegearGamma); + AddExecutor(ExecutorType.Activate, CardId.TruKingofAllCalamities, TruKingofAllCalamitiesEffect); + AddExecutor(ExecutorType.Activate, CardId.PSY_FramegearGamma, ResetFlag); AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC); AddExecutor(ExecutorType.Activate, CardId.SupremeKingDragonDarkwurm, SupremeKingDragonDarkwurmEffect); AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect); AddExecutor(ExecutorType.Activate, CardId.Terraforming, TerraformingEffect); - AddExecutor(ExecutorType.Activate, CardId.SpellPowerMastery); + AddExecutor(ExecutorType.Activate, CardId.SpellPowerMastery, ResetFlag); AddExecutor(ExecutorType.Activate, CardId.DragonShrine, DragonShrineEffect); AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect); AddExecutor(ExecutorType.Activate, CardId.DarkContractwiththGate, DarkContractwiththGateEffect); - AddExecutor(ExecutorType.Activate, CardId.Terraforming); + AddExecutor(ExecutorType.Activate, CardId.Terraforming, ResetFlag); AddExecutor(ExecutorType.Activate, CardId.OracleofZefra, OracleofZefraEffect); AddExecutor(ExecutorType.Activate, CardId.ZefraProvidence, ZefraProvidenceEffect); AddExecutor(ExecutorType.Activate, CardId.AstrographSorcerer, AstrographSorcererEffect); @@ -487,7 +497,7 @@ public ZefraExecutor(GameAI ai, Duel duel) : base(ai, duel) AddExecutor(ExecutorType.Activate, CardId.Blackwing_ZephyrostheElite, Blackwing_ZephyrostheEliteEffect); AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixSummon); AddExecutor(ExecutorType.Activate, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixEffect); - AddExecutor(ExecutorType.Activate, CardId.Rank_Up_MagicSoulShaveForce); + AddExecutor(ExecutorType.Activate, CardId.Rank_Up_MagicSoulShaveForce, ResetFlag); AddExecutor(ExecutorType.Activate, CardId.Raider_Wing, Raider_WingEffect); AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_SingingLanius); //xyz mode @@ -520,7 +530,7 @@ public ZefraExecutor(GameAI ai, Duel duel) : base(ai, duel) CardId.DDSavantKepler,CardId.StellarknightZefraxciton,CardId.ShaddollZefracore,CardId.SupremeKingDragonDarkwurm}; for (int i = 0; i < p_summon_ids.Count; ++i) AddExecutor(ExecutorType.Summon, p_summon_ids[i], DefaultSummon); AddExecutor(ExecutorType.Summon, DefaultSummon); - AddExecutor(ExecutorType.Activate, CardId.Deskbot001); + AddExecutor(ExecutorType.Activate, CardId.Deskbot001, ResetFlag); AddExecutor(ExecutorType.Activate, CardId.TheMightyMasterofMagic, TheMightyMasterofMagicEffect); AddExecutor(ExecutorType.Activate, CardId.DestrudotheLostDragon_Frisson, DestrudotheLostDragon_FrissonEffect); AddExecutor(ExecutorType.Summon, CardId.Blackwing_ZephyrostheElite, DefaultSummon_2); @@ -530,9 +540,15 @@ public ZefraExecutor(GameAI ai, Duel duel) : base(ai, duel) AddExecutor(ExecutorType.SpellSet, SpellSet_2); AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); AddExecutor(ExecutorType.Activate, DefaultPActivate); + AddExecutor(ExecutorType.GoToEndPhase, GoToEndPhase); } public override void OnNewTurn() { + if (duel_start) + { + duel_start = false; + AI.SendCustomChat((int)CustomMessage.Happy); + } activate_SupremeKingDragonDarkwurm_1 = false; activate_SupremeKingDragonDarkwurm_2 = false; activate_JetSynchron = false; @@ -554,17 +570,25 @@ public override void OnNewTurn() HeavymetalfoesElectrumite_activate = false; spell_activate_count = 0; p_count = 0; + activate_count = 0; + summon_count = 0; + enemy_activate = false; } private bool ZefraProvidenceEffect() { - if (Card.Location == CardLocation.Grave) + if (ActivateDescription == 96) { - return true; + if (should_destory) + { + should_destory = false; + return false; + } + return BeforeResult(ExecutorType.Activate); } else { activate_ZefraProvidence = true; - return true; + return BeforeResult(ExecutorType.Activate); } } @@ -589,7 +613,7 @@ private List CheckShouldSpsummonExtraMonster() List pSpsummonMonster = func.CardsCheckWhere(spSummonMonster, func.HasType, CardType.Pendulum); List monsterCards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone), card => - { return card.IsFaceup() && card.HasType(CardType.Pendulum); }); + { return card.IsFaceup() && card.HasType(CardType.Pendulum); }); if (Func.MergeList(pSpsummonMonster, monsterCards).Count <= 0) extra_ids.Remove(CardId.HeavymetalfoesElectrumite); } else @@ -615,7 +639,7 @@ private bool DDLamiaSummon() Func.GetZoneCards(Bot, CardLocation.MonsterZone, true).Count > 0)) { summoned = true; - return true; + return BeforeResult(ExecutorType.Summon); } return false; } @@ -630,11 +654,11 @@ private bool Raidraptor_ForceStrixEffect() { AI.SelectCard(CardId.Raider_Wing); AI.SelectNextCard(CardId.Raidraptor_SingingLanius); - return true; + return BeforeResult(ExecutorType.Activate); } private bool Raidraptor_ForceStrixSummon() { - return xyz_mode; + return xyz_mode && BeforeResult(ExecutorType.Summon); } private bool Blackwing_ZephyrostheEliteEffect_2() @@ -642,22 +666,22 @@ private bool Blackwing_ZephyrostheEliteEffect_2() if (!xyz_mode && Bot.GetMonstersInMainZone().Count > 4) return false; List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Onfield, true), card => { return !IsNoLinkCards(card) && !card.IsExtraCard() && !(card.Location == CardLocation.SpellZone - && Func.IsCode(card,CardId.SaryujaSkullDread,CardId.MechaPhantomBeastAuroradon,CardId.HeavymetalfoesElectrumite,CardId.CrystronHalqifibrax,CardId.Raidraptor_WiseStrix, + && Func.IsCode(card, CardId.SaryujaSkullDread, CardId.MechaPhantomBeastAuroradon, CardId.HeavymetalfoesElectrumite, CardId.CrystronHalqifibrax, CardId.Raidraptor_WiseStrix, CardId.Linkuriboh)); }); if (cards.Count <= 0 || (cards.Count < 2 && func.CardsCheckCount(cards, func.HasLevel, 4) == cards.Count)) { Blackwing_ZephyrostheElite_activate = true; return false; - } + } cards.Sort((cardA, cardB) => { if (cardA.Location != CardLocation.MonsterZone && cardB.Location == CardLocation.MonsterZone) return -1; if (cardA.Location == CardLocation.MonsterZone && cardB.Location != CardLocation.MonsterZone) return 1; if (cardA.Location == CardLocation.SpellZone && cardB.Location == CardLocation.SpellZone) { - if(cardA.IsCode(CardId.OracleofZefra) && !cardB.IsCode(CardId.OracleofZefra)) return -1; - if(!cardA.IsCode(CardId.OracleofZefra) && cardB.IsCode(CardId.OracleofZefra))return 1; + if (cardA.IsCode(CardId.OracleofZefra) && !cardB.IsCode(CardId.OracleofZefra)) return -1; + if (!cardA.IsCode(CardId.OracleofZefra) && cardB.IsCode(CardId.OracleofZefra)) return 1; return 0; } if (xyz_mode) @@ -673,14 +697,46 @@ private bool Blackwing_ZephyrostheEliteEffect_2() }); Blackwing_ZephyrostheElite_activate = false; AI.SelectCard(cards); + return BeforeResult(ExecutorType.Activate); + } + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + if (player == 1 && Func.IsCode(card, 14558127, 59438930, 94145021, 38814750, 73642296, 97268402)) + enemy_activate = true; + base.OnChaining(player, card); + } + private bool BeforeResult(ExecutorType type) + { + if (type == ExecutorType.Activate) + { + ResetFlag(); + ++activate_count; + } + if (type == ExecutorType.Summon) + { + ++summon_count; + } return true; } + private bool GoToEndPhase() + { + if (Duel.Player == 0 && Duel.Turn == 1 && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), IsNoLinkCards) <= 0 + && activate_count + summon_count < 5 && !enemy_activate) + { + + AI.SendCustomChat((int)CustomMessage.Angry); + return true; + } + return false; + + } private bool DefaultPActivate() { - if (PendulumActivate() && Func.IsCode(Card,CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing)) + if (PendulumActivate() && Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing)) { return Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.SpellZone, - true), card => { return Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing); }) <= 0; + true), card => { return Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing); }) <= 0 && BeforeResult(ExecutorType.Activate); } return false; } @@ -693,7 +749,7 @@ private bool Raidraptor_WiseStrixSummon() { if (!xyz_mode) return false; AI.SelectMaterials(CardId.Raidraptor_ArsenalFalcon, CardId.Blackwing_ZephyrostheElite); - return true; + return BeforeResult(ExecutorType.Summon); } private bool Raidraptor_WiseStrixEffect() { @@ -705,17 +761,17 @@ private bool Raidraptor_WiseStrixEffect() if (HasInDeck(CardId.Raider_Wing)) ++count; if (count <= 1) return false; AI.SelectCard(CardId.Raider_Wing); - return true; + return BeforeResult(ExecutorType.Activate); } - return true; + return BeforeResult(ExecutorType.Activate); } private bool Raidraptor_ArsenalFalconEffect() { if (Card.Location == CardLocation.MonsterZone) { AI.SelectCard(CardId.SupremeKingGateZero); - AI.SelectNextCard(new int[] {CardId.Blackwing_ZephyrostheElite,CardId.Raider_Wing,CardId.Raidraptor_SingingLanius}); - return true; + AI.SelectNextCard(new int[] { CardId.Blackwing_ZephyrostheElite, CardId.Raider_Wing, CardId.Raidraptor_SingingLanius }); + return BeforeResult(ExecutorType.Activate); } return false; } @@ -727,7 +783,7 @@ private bool Raidraptor_ArsenalFalconSummon() if (materials_lists.Count <= 0) return false; AI.SelectMaterials(materials_lists[0]); xyz_mode = true; - return true; + return BeforeResult(ExecutorType.Summon); } private bool Odd_EyesMeteorburstDragonCheck() { @@ -740,6 +796,14 @@ private bool Odd_EyesMeteorburstDragonCheck() var materials_sy_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); if (materials_sy_lists.Count <= 0) return false; Odd_EyesMeteorburstDragon_materials.Clear(); + foreach (var materials in materials_sy_lists) + { + if (func.CardsCheckCount(materials, func.IsCode, CardId.SupremeKingGateZero) > 0) + { + Odd_EyesMeteorburstDragon_materials.AddRange(materials); + return true; + } + } Odd_EyesMeteorburstDragon_materials.AddRange(materials_sy_lists[0]); return true; } @@ -747,38 +811,38 @@ private bool Odd_EyesMeteorburstDragonSummon() { if (!Odd_EyesMeteorburstDragonCheck()) return false; AI.SelectMaterials(Odd_EyesMeteorburstDragon_materials); - return true; + return BeforeResult(ExecutorType.Summon); } private bool Odd_EyesMeteorburstDragonEffect() { AI.SelectCard(CardId.SupremeKingGateZero); - return true; + return BeforeResult(ExecutorType.Activate); } private bool DDSavantKeplerSummon() { if (HasInDeck(CardId.DarkContractwiththGate)) { summoned = true; - return true; + return BeforeResult(ExecutorType.Summon); } return false; } -// private void DebugCards(string msg, IList cards) -// { -//#if DEBUG -// Logger.DebugWriteLine(cards.Count + msg); -// foreach (var card in cards) -// { -// if (card == null) continue; -// NamedCard namedCard = NamedCard.Get(card.Id); -// if (namedCard == null) continue; -// Logger.DebugWriteLine(msg + namedCard.Name); -// } -//#endif -// } + // private void DebugCards(string msg, IList cards) + // { + //#if DEBUG + // Logger.DebugWriteLine(cards.Count + msg); + // foreach (var card in cards) + // { + // if (card == null) continue; + // NamedCard namedCard = NamedCard.Get(card.Id); + // if (namedCard == null) continue; + // Logger.DebugWriteLine(msg + namedCard.Name); + // } + //#endif + // } private bool ServantofEndymionEffect_2() { - if (Card.Location == CardLocation.SpellZone) return true; + if (Card.Location == CardLocation.SpellZone) return BeforeResult(ExecutorType.Activate); return false; } private bool IsSpsummonPMonster(ClientCard card) @@ -808,7 +872,7 @@ private int GetSpellActivateCount() if (!activate_OracleofZefra && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.OracleofZefra)) ++count; if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.Terraforming) && HasInDeck(CardId.OracleofZefra)) ++count; if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.FoolishBurial)) ++count; - if (func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Pendulum) > 1 && Bot.SpellZone[0] == null && + if (func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Pendulum) > 1 && Bot.SpellZone[0] == null && Bot.SpellZone[4] == null) ++count; if (!summoned && Bot.HasInHand(CardId.DDSavantKepler) && HasInDeck(CardId.DarkContractwiththGate)) ++count; return count; @@ -817,7 +881,7 @@ private bool ServantofEndymionEffect_3() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } return false; } @@ -826,15 +890,16 @@ private bool ZefraDivineStrikeEffect() if (Duel.LastChainPlayer == 0) return false; AI.SelectCard(CardId.RitualBeastTamerZeframpilica, CardId.SatellarknightZefrathuban, CardId.StellarknightZefraxciton, CardId.FlameBeastoftheNekroz, CardId.ShaddollZefracore, CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing); - return true; + return BeforeResult(ExecutorType.Activate); } private bool NinePillarsofYangZingEffect() { if (Duel.LastChainPlayer == 0) return false; - List cards = func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing },Bot.MonsterZone); - cards.AddRange(func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing,CardId.Zefraxi_TreasureoftheYangZing }, Bot.SpellZone)); + List cards = func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing }, Bot.MonsterZone); + cards.AddRange(func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing }, Bot.SpellZone)); AI.SelectCard(cards); - return true; + should_destory = true; + return BeforeResult(ExecutorType.Activate); } private bool IsActivateBlackwing_ZephyrostheElite() { @@ -848,19 +913,19 @@ private bool ServantofEndymionEffect() { if (PendulumActivate()) { - if (IsActivateBlackwing_ZephyrostheElite()) return true; + if (IsActivateBlackwing_ZephyrostheElite()) return BeforeResult(ExecutorType.Activate); if ((!HasInDeck(CardId.TheMightyMasterofMagic) && !HasInDeck(CardId.MythicalBeastJackalKing) || GetSpellActivateCount() < 2)) return false; - return true; + return BeforeResult(ExecutorType.Activate); } else if (Card.Location == CardLocation.SpellZone) { if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) { - return func.CardsCheckAny(Bot.Hand, IsSpsummonPMonster); + return func.CardsCheckAny(Bot.Hand, IsSpsummonPMonster) && BeforeResult(ExecutorType.Activate); } - return true; + return BeforeResult(ExecutorType.Activate); } - else if (Card.Location == CardLocation.MonsterZone) return true; + else if (Card.Location == CardLocation.MonsterZone) return BeforeResult(ExecutorType.Activate); else return false; } private bool IsZefraScaleAbove(ClientCard card) @@ -873,16 +938,16 @@ private bool IsZefraScaleBelow(ClientCard card) } private bool TerraformingEffect() { - return Bot.HasInHand(CardId.OracleofZefra); + return Bot.HasInHand(CardId.OracleofZefra) && BeforeResult(ExecutorType.Activate); } private bool DDSavantKeplerEffect() { if (PendulumActivate()) return false; - return true; + return BeforeResult(ExecutorType.Activate); } private bool FoolishBurialEffect() { - return true; + return BeforeResult(ExecutorType.Activate); } private List GetSynchroMaterials() { @@ -892,28 +957,31 @@ private List GetSynchroMaterials() } private bool DestrudotheLostDragon_FrissonEffect() { - if (Bot.HasInExtra(CardId.CrystronHalqifibrax)) return true; + if (Bot.HasInExtra(CardId.CrystronHalqifibrax)) return BeforeResult(ExecutorType.Activate); if (!Bot.HasInExtra(CardId.F_A_DawnDragster) && !Bot.HasInExtra(CardId.Odd_EyesMeteorburstDragon)) return false; - List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true),card => { return SecretoftheYangZingCheck(card) && !IsNoLinkCards(card) && !card.HasType(CardType.Tuner) && card.Level > 0;}); + List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return SecretoftheYangZingCheck(card) && !IsNoLinkCards(card) && !card.HasType(CardType.Tuner) && card.Level > 0; }); if (pre_materials.Count <= 0) return false; - List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),card=> + List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return !IsNoLinkCards(card) && card.Level > 0 && !card.HasType(CardType.Tuner); }); if (cards.Count <= 0) return false; AI.SelectCard(cards); - return true; + return BeforeResult(ExecutorType.Activate); } - private bool IsCanSynchroSummon(int level) + private bool IsCanSynchroSummon(int level) { - return func.CardsCheckAny(GetSynchroMaterials(), card => { return (card.Level + level == 8 - && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.BorreloadSavageDragon, CardId.PSY_FramelordOmega); })) - || (card.Level + level == 7 && SecretoftheYangZingCheck(card) && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.Odd_EyesMeteorburstDragon, CardId.F_A_DawnDragster); })) - || (card.Level + level == 5 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)) - || (card.Level + level == 4 && Bot.HasInExtra(CardId.HeraldoftheArcLight)); }); + return func.CardsCheckAny(GetSynchroMaterials(), card => { + return (card.Level + level == 8 + && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.BorreloadSavageDragon, CardId.PSY_FramelordOmega); })) + || (card.Level + level == 7 && SecretoftheYangZingCheck(card) && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.Odd_EyesMeteorburstDragon, CardId.F_A_DawnDragster); })) + || (card.Level + level == 5 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)) + || (card.Level + level == 4 && Bot.HasInExtra(CardId.HeraldoftheArcLight)); + }); } private bool DDLamiaEffect() { + if (Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon) && Bot.GetMonstersInMainZone().Count >= 3) return false; if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && !IsCanSynchroSummon(Card.Level)) return false; AI.SelectCard(CardId.DarkContractwiththGate, CardId.DDSavantKepler); activate_DDLamia = true; @@ -921,15 +989,15 @@ private bool DDLamiaEffect() } private bool DragonShrineEffect() { - return true; + return BeforeResult(ExecutorType.Activate); } private bool ZefraathEffect() { - if (PendulumActivate()) return !activate_p_Zefraath || IsActivateBlackwing_ZephyrostheElite(); - if (Card.Location == CardLocation.SpellZone) + if (PendulumActivate()) return !activate_p_Zefraath || IsActivateBlackwing_ZephyrostheElite(); + if (Card.Location == CardLocation.SpellZone) { activate_p_Zefraath = true; - return true; + return BeforeResult(ExecutorType.Activate); } return false; } @@ -937,9 +1005,9 @@ private bool RitualBeastTamerZeframpilicaEffect() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } - return true; + return BeforeResult(ExecutorType.Activate); } private bool BorreloadSavageDragonSummon_2() { @@ -948,19 +1016,19 @@ private bool BorreloadSavageDragonSummon_2() } private bool BorreloadSavageDragonSummon() { - var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,Card.Level,1,1,false,true,null, - card=> { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic) && !card.IsCode(CardId.HeraldoftheArcLight); }); + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, Card.Level, 1, 1, false, true, null, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic) && !card.IsCode(CardId.HeraldoftheArcLight); }); if (materials_lists.Count <= 0) return false; foreach (var materials in materials_lists) { if (func.CardsCheckAny(materials, func.IsCode, CardId.MechaPhantomBeastToken)) { AI.SelectMaterials(materials); - return true; + return BeforeResult(ExecutorType.Summon); } } AI.SelectMaterials(materials_lists[0]); - return true; + return BeforeResult(ExecutorType.Summon); } private bool BorreloadSavageDragonEffect() { @@ -976,23 +1044,23 @@ private bool BorreloadSavageDragonEffect() CardId.CrystronHalqifibrax, CardId.Raidraptor_WiseStrix }); - return true; + return BeforeResult(ExecutorType.Activate); } private bool TheMightyMasterofMagicEffect() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } else if (Card.Location == CardLocation.MonsterZone) { if (Duel.LastChainPlayer == 0) return false; AI.SelectCard(CardId.ServantofEndymion, CardId.TheMightyMasterofMagic); - return true; + return BeforeResult(ExecutorType.Activate); } else { - return true; + return BeforeResult(ExecutorType.Activate); } } private bool checkPActivate() @@ -1002,31 +1070,33 @@ private bool checkPActivate() if (Bot.HasInHand(CardId.Zefraath) && (Bot.SpellZone[0] != null || Bot.SpellZone[4] != null)) return false; if (Bot.SpellZone[0] == null && Bot.SpellZone[4] == null) { - if (!Bot.HasInHand(CardId.Zefraath) && !func.CardsCheckAny(Bot.Hand, card => { return IsSpsummonPMonster(card) && - (Card.LScale >= 5 ? card.LScale < 5 : card.LScale > 5) && func.GetPSpSummonMonster(Bot,card,Card)?.Count > 0; })) return false; + if (!Bot.HasInHand(CardId.Zefraath) && !func.CardsCheckAny(Bot.Hand, card => { + return IsSpsummonPMonster(card) && +(Card.LScale >= 5 ? card.LScale < 5 : card.LScale > 5) && func.GetPSpSummonMonster(Bot, card, Card)?.Count > 0; + })) return false; } else { if (func.GetPSpSummonMonster(Bot, Bot.SpellZone[0], Card)?.Count <= 0 && func.GetPSpSummonMonster(Bot, Bot.SpellZone[4], Card)?.Count <= 0) return false; } - + return true; } private bool SecretoftheYangZingEffect() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } activate_SecretoftheYangZing = true; - return true; + return BeforeResult(ExecutorType.Activate); } private bool SatellarknightZefrathubanEffect() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } return false; } @@ -1035,7 +1105,7 @@ private bool BorreloadSavageDragonEffect_2() if (Duel.LastChainPlayer == 1) { ClientCard card = Util.GetLastChainCard(); - return card != null && !card.HasType(CardType.Continuous | CardType.Field) && card.HasType(CardType.Spell | CardType.Trap); + return card != null && !card.HasType(CardType.Continuous | CardType.Field) && card.HasType(CardType.Spell | CardType.Trap) && BeforeResult(ExecutorType.Activate); } return false; } @@ -1043,42 +1113,42 @@ private bool Zefraxi_TreasureoftheYangZingEffect() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } - return true; + return BeforeResult(ExecutorType.Activate); } private bool OracleofZefraEffect() { activate_OracleofZefra = true; - return true; - + return BeforeResult(ExecutorType.Activate); + } private bool FlameBeastoftheNekrozEffect() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } else { - return true; + return BeforeResult(ExecutorType.Activate); } } private bool AstrographSorcererEffect() { if (PendulumActivate()) return false; - return true; + return BeforeResult(ExecutorType.Activate); } private bool StellarknightZefraxcitonEffect() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } else { - return true; + return BeforeResult(ExecutorType.Activate); } } private bool IsNoLinkCards(ClientCard card) @@ -1090,7 +1160,7 @@ private bool IsNoLinkCards(ClientCard card) } private bool LinkuribohSummon() { - List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true),func.HasLevel,1); + List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasLevel, 1); if (func.CardsCheckCount(materials, Func.NegateFunc(func.HasType), CardType.Tuner) <= 0 && func.CardsCheckCount(materials, func.HasType, CardType.Tuner) <= 1) return false; materials.Sort((cardA, cardB) => @@ -1106,7 +1176,7 @@ private bool SpellSet() { if (Card.HasType(CardType.Trap)) { - AI.SelectPlace(Zones.z1|Zones.z2|Zones.z3|Zones.z4|Zones.z0); + AI.SelectPlace(Zones.z1 | Zones.z2 | Zones.z3 | Zones.z4 | Zones.z0); return true; } return false; @@ -1124,30 +1194,30 @@ private bool ShaddollZefracoreEffect() { if (PendulumActivate()) { - return PendulumDefaultActivate(); + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); } else { - return true; + return BeforeResult(ExecutorType.Activate); } } private bool PSY_FramelordOmegaEffect() { if (Card.Location == CardLocation.MonsterZone) { - if (Duel.Player == 0) return true; + if (Duel.Player == 0) return BeforeResult(ExecutorType.Activate); else { if (Bot.Banished.Count <= 0) return false; AI.SelectCard(func.CardsIdToClientCards(new List { CardId.JetSynchron, CardId.DDLamia }, Bot.Banished)); - return true; + return BeforeResult(ExecutorType.Activate); } } else { if (Bot.Graveyard.Count <= 0) return false; - AI.SelectCard(func.CardsIdToClientCards(new List { CardId.Zefraath, CardId.CrystronHalqifibrax, CardId.Denglong_FirstoftheYangZing,CardId.BorreloadSavageDragon, CardId.DDLamia }, Bot.Graveyard)); - return true; + AI.SelectCard(func.CardsIdToClientCards(new List { CardId.Zefraath, CardId.CrystronHalqifibrax, CardId.Denglong_FirstoftheYangZing, CardId.BorreloadSavageDragon, CardId.DDLamia }, Bot.Graveyard)); + return BeforeResult(ExecutorType.Activate); } } private bool Psummon() @@ -1176,7 +1246,7 @@ private bool HeavymetalfoesElectrumiteSummon() List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum); if (materials.Count > 0) { - materials.Sort((cardA,cardB) => + materials.Sort((cardA, cardB) => { if ((cardA.Level == 3 || cardA.HasType(CardType.Tuner)) && cardB.Level != 3 && !cardB.HasType(CardType.Tuner)) return -1; if (cardA.Level != 3 && !cardA.HasType(CardType.Tuner) && (cardB.Level == 3 || cardB.HasType(CardType.Tuner))) return 1; @@ -1188,12 +1258,12 @@ private bool HeavymetalfoesElectrumiteSummon() { if (IsExtraZoneCard(material)) result.Insert(0, material); else if (IsNoLinkCards(material) || (material.HasType(CardType.Tuner) && Bot.HasInExtra(CardId.CrystronHalqifibrax) - && func.CardsCheckCount(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),func.HasType,CardType.Tuner) <= 0)) continue; + && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Tuner) <= 0)) continue; else result.Add(material); } if (result.Count < 2) return false; AI.SelectMaterials(result); - return true; + return BeforeResult(ExecutorType.Summon); } return false; } @@ -1202,37 +1272,38 @@ private bool SecretoftheYangZingCheck(ClientCard card) if (card.IsCode(CardId.SecretoftheYangZing) && Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing)) { return func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.PendulumZone | CardLocation.MonsterZone, true), p_card => { - return p_card.HasSetcode(0xc4) && p_card.HasType(CardType.Pendulum);}) <= 0; + return p_card.HasSetcode(0xc4) && p_card.HasType(CardType.Pendulum); + }) <= 0; } return true; } private bool F_A_DawnDragsterSummon() { - List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot,CardLocation.MonsterZone,true),SecretoftheYangZingCheck); - var materials_lists = Util.GetSynchroMaterials(pre_materials, 7,1,1,false,true,null,card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); - if (materials_lists.Count <= 0) return false ; + List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), SecretoftheYangZingCheck); + var materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_lists.Count <= 0) return false; foreach (var materials in materials_lists) { - if (func.CardsCheckCount(materials, card=> + if (func.CardsCheckCount(materials, card => { return card.HasType(CardType.Tuner) && card.HasRace(CardRace.Machine); - })<=0) + }) <= 0) { AI.SelectMaterials(materials); - return true; + return BeforeResult(ExecutorType.Summon); } } AI.SelectMaterials(materials_lists[0]); - return true; + return BeforeResult(ExecutorType.Summon); } private bool CrystronHalqifibraxEffect() { - return true; + return BeforeResult(ExecutorType.Activate); } - private bool MechaPhantomBeastAuroradonSummon() + private bool MechaPhantomBeastAuroradonSummon() { if (Bot.GetMonstersInMainZone().Count >= 4 || (!HasInDeck(CardId.MechaPhantomBeastO_Lion) && !IsCanSPSummonTunerLevel1() - && !func.CardsCheckAny(Func.GetZoneCards(Bot,CardLocation.MonsterZone|CardLocation.Grave,true),func.IsCode,CardId.Deskbot001))) return false; + && !func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.Grave, true), func.IsCode, CardId.Deskbot001))) return false; if (XyzModeCheck()) { List pre_materials = new List(); @@ -1243,10 +1314,14 @@ private bool MechaPhantomBeastAuroradonSummon() List key_materials_2 = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Grave), card => { return card.IsCode(CardId.JetSynchron) && !activate_JetSynchron; }); pre_materials.AddRange(key_materials); pre_materials.AddRange(key_materials_2); - if (!summoned) pre_materials.AddRange(func.CardsCheckWhere(Bot.Hand,Func.NegateFunc(func.IsCode),CardId.DestrudotheLostDragon_Frisson)); + if (!summoned) pre_materials.AddRange(func.CardsCheckWhere(Bot.Hand, card => { return !card.IsCode(CardId.DestrudotheLostDragon_Frisson) && card.Level < 5; })); pre_materials.AddRange(Bot.MonsterZone); - var materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1,false,true,null,card=> { return !card.IsCode(CardId.MythicalBeastJackalKing);}); - if (materials_lists.Count > 0) return false; + var synchro_materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing); }); + var xyz_materials_lists = Util.GetXyzMaterials(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.PendulumZone), 7, 1, false, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); }); + var xyz_materials_lists_2 = Util.GetXyzMaterials(Func.GetZoneCards(Bot, CardLocation.MonsterZone), 7, 2, false, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); }); + if ((synchro_materials_lists.Count > 0 && xyz_materials_lists.Count > 0) || xyz_materials_lists_2.Count > 0) return false; } List m = new List(); int link_count = 0; @@ -1267,12 +1342,12 @@ private bool MechaPhantomBeastAuroradonSummon() } private bool SaryujaSkullDreadEffect() { - if (ActivateDescription == Util.GetStringId(CardId.SaryujaSkullDread, 2)) + if (ActivateDescription == Util.GetStringId(CardId.SaryujaSkullDread, 2)) { AI.SelectCard(GetSendToDeckIds()); - return true; + return BeforeResult(ExecutorType.Activate); } - return true; + return BeforeResult(ExecutorType.Activate); } private bool SaryujaSkullDreadSummon() { @@ -1285,7 +1360,8 @@ private bool SaryujaSkullDreadSummon() temp_materials.Sort((cardA, cardB) => { if ((cardA.HasType(CardType.Tuner) && cardB.HasType(CardType.Tuner)) - || (!cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner))) { + || (!cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner))) + { return CardContainer.CompareCardLevel(cardA, cardB); } else if (cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner)) return 1; @@ -1294,15 +1370,15 @@ private bool SaryujaSkullDreadSummon() foreach (var material in temp_materials) { ++materials_count; - if (IsExtraZoneCard(material)) materials.Insert(0, material); + if (IsExtraZoneCard(material)) materials.Insert(0, material); else if (IsNoLinkCards(material)) { --materials_count; continue; } else materials.Add(material); link_count += material.HasType(CardType.Link) ? material.LinkCount : 1; if (link_count >= 4) { if (materials_count == 3 && Bot.Deck.Count > 4 && ((func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Tuner) > 0 - || (Bot.HasInMonstersZone(CardId.DDLamia,false,false,true) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards - (Bot,CardLocation.Onfield|CardLocation.Hand,true),card=> { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) + || (Bot.HasInMonstersZone(CardId.DDLamia, false, false, true) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards + (Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) > 0) || (Bot.HasInMonstersZone(CardId.JetSynchron, false, false, true) && !activate_JetSynchron)) || xyz_mode)) { --link_count; @@ -1313,7 +1389,7 @@ private bool SaryujaSkullDreadSummon() } if (materials.Count < 3) return false; AI.SelectMaterials(materials); - return true; + return BeforeResult(ExecutorType.Summon); } private bool CrystronHalqifibraxSummon() { @@ -1327,6 +1403,10 @@ private bool CrystronHalqifibraxSummon() mainMonsters.Sort(CardContainer.CompareCardAttack); materials.AddRange(mainMonsters); AI.SelectMaterials(materials); + if (materials.Distinct().Count() <= 3) + { + AI.SendCustomChat((int)CustomMessage.Surprise); + } return true; } private bool PendulumActivate() @@ -1343,13 +1423,13 @@ private bool SpellActivate() } private bool SupremeKingGateZeroEffect() { - if (PendulumActivate()) return PendulumDefaultActivate(); + if (PendulumActivate()) return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); return false; } private bool MythicalBeastJackalKingEffect() { - if (PendulumActivate()) return PendulumDefaultActivate(); - return true; + if (PendulumActivate()) return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + return BeforeResult(ExecutorType.Activate); } private bool Denglong_FirstoftheYangZingSummon_2() { @@ -1362,7 +1442,7 @@ private bool Denglong_FirstoftheYangZingSummon() card => { return !card.IsCode(CardId.HeraldoftheArcLight); }); if (materials_lists.Count <= 0) return false; AI.SelectMaterials(materials_lists[0]); - return true; + return BeforeResult(ExecutorType.Summon); } private bool Denglong_FirstoftheYangZingEffect() { @@ -1373,7 +1453,7 @@ private bool Denglong_FirstoftheYangZingEffect() } else { - AI.SelectCard(CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing,CardId.LightoftheYangZing); + AI.SelectCard(CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing, CardId.LightoftheYangZing); } return true; } @@ -1381,17 +1461,17 @@ private bool DarkContractwiththGateEffect() { if (SpellActivate()) { - return HasInDeck(CardId.DDLamia) || func.HasInZone(Bot, CardLocation.PendulumZone, CardId.ServantofEndymion, true, true); + return (HasInDeck(CardId.DDLamia) || func.HasInZone(Bot, CardLocation.PendulumZone, CardId.ServantofEndymion, true, true)) && BeforeResult(ExecutorType.Activate); } - return true; + return BeforeResult(ExecutorType.Activate); } - private int DisabledSort(ClientCard cardA,ClientCard cardB) + private int DisabledSort(ClientCard cardA, ClientCard cardB) { bool RitualBeastTamerZeframpilica_flag = !summoned && Bot.HasInExtra(CardId.HeraldoftheArcLight) && IsCanSPSummonTunerLevel1(); - if (((cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardA, CardId.MaxxC,CardId.Zefraath,CardId.MythicalBeastJackalKing,CardId.TheMightyMasterofMagic) || cardA.HasType(CardType.Trap) || cardA.HasType(CardType.Tuner)) + if (((cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardA.HasType(CardType.Trap) || cardA.HasType(CardType.Tuner)) && !cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardB.HasType(CardType.Trap) && !Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardB.HasType(CardType.Tuner)) return 1; - else if (!cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardA.HasType(CardType.Trap) && !Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardA.HasType(CardType.Tuner) - && ((cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardB.HasType(CardType.Trap) || cardB.HasType(CardType.Tuner))) return -1; + else if (!cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardA.HasType(CardType.Trap) && !Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardA.HasType(CardType.Tuner) + && ((cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardB.HasType(CardType.Trap) || cardB.HasType(CardType.Tuner))) return -1; return 0; } private List GetDisabledIds() @@ -1426,21 +1506,21 @@ private List GetSendToDeckIds() ids.Add(CardId.LightoftheYangZing); ids.Add(CardId.Rank_Up_MagicSoulShaveForce); if (activate_ZefraProvidence) ids.Add(CardId.ZefraProvidence); - if(activate_OracleofZefra) ids.Add(CardId.OracleofZefra); - if(activate_DragonShrine) ids.Add(CardId.DragonShrine); - if(activate_SpellPowerMastery) ids.Add(CardId.SpellPowerMastery); + if (activate_OracleofZefra) ids.Add(CardId.OracleofZefra); + if (activate_DragonShrine) ids.Add(CardId.DragonShrine); + if (activate_SpellPowerMastery) ids.Add(CardId.SpellPowerMastery); List hands = Func.GetZoneCards(Bot, CardLocation.Hand); hands.Sort(DisabledSort); List hand_ids = Func.ClientCardsToCardsId(hands, true); ids.AddRange(hand_ids); return ids; } - private bool TruKingofAllCalamitiesEffect() + private bool TruKingofAllCalamitiesEffect() { if (Duel.Player == 1) { AI.SelectAttributes(new CardAttribute[] { CardAttribute.Divine }); - return true; + return BeforeResult(ExecutorType.Activate); } return false; } @@ -1456,18 +1536,18 @@ private bool JetSynchronEffect() List dcards = func.CardsIdToClientCards(GetDisabledIds(), Bot.Hand); if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && dcards.Count <= 0) return false; AI.SelectCard(dcards); - return true; + return BeforeResult(ExecutorType.Activate); } } return false; } private bool MechaPhantomBeastAuroradonEffect() { - if (ActivateDescription == -1) { link_summoned = true; return true; } + if (ActivateDescription == -1) { link_summoned = true; return true; } else { if (!HasInDeck(CardId.MechaPhantomBeastO_Lion) - && Func.GetZoneCards(Enemy,CardLocation.Onfield).Count <= 0 && func.CardsCheckCount(Bot.Graveyard,func.HasType,CardType.Trap) <= 0) return false; + && Func.GetZoneCards(Enemy, CardLocation.Onfield).Count <= 0) return false; List tRelease = new List(); List nRelease = new List(); foreach (var card in Bot.GetMonsters()) @@ -1491,39 +1571,41 @@ private bool SupremeKingDragonDarkwurmEffect() if (Card.Location == CardLocation.Grave) { activate_SupremeKingDragonDarkwurm_1 = true; - return true; + return BeforeResult(ExecutorType.Activate); } if (Card.Location == CardLocation.MonsterZone) { activate_SupremeKingDragonDarkwurm_2 = true; - return true; + return BeforeResult(ExecutorType.Activate); } return false; } private bool SupremeKingDragonDarkwurmSummon() { if ((!activate_p_Zefraath && Bot.HasInHand(CardId.Zefraath) && !activate_SupremeKingDragonDarkwurm_1 && HasInDeck(CardId.SupremeKingGateZero) && func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner)) - ||(func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand), card => { return card.LinkCount > 5; }) && + || (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand), card => { return card.LinkCount > 5; }) && !Bot.HasInHand(CardId.SupremeKingGateZero) && !activate_SupremeKingDragonDarkwurm_2)) { summoned = true; - return true; + return BeforeResult(ExecutorType.Summon); } return false; } private bool DefaultSummon_2() { if (Card.Location == CardLocation.Hand && Card.Level <= 4 - && Bot.HasInExtra(CardId.CrystronHalqifibrax) && (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return Card.HasType(CardType.Tuner) ? true : card.HasType(CardType.Tuner); }))) { + && Bot.HasInExtra(CardId.CrystronHalqifibrax) && (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return Card.HasType(CardType.Tuner) ? true : card.HasType(CardType.Tuner); }))) + { summoned = true; - return true; + return BeforeResult(ExecutorType.Summon); } return false; } - private bool IsCanSPSummonTunerLevel1() { + private bool IsCanSPSummonTunerLevel1() + { return func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.Grave, true), card => { return (card.IsCode(CardId.DDLamia) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), scard => { return Func.HasSetCode(scard, 0xaf, 0xae) && scard.Id != CardId.DDLamia; }) - > 0) || (card.IsCode(CardId.JetSynchron) && !activate_JetSynchron) && Bot.GetMonstersInMainZone().Count <= 3; + > 0) || (card.IsCode(CardId.JetSynchron) && !activate_JetSynchron) && Bot.GetMonstersInMainZone().Count <= 3; }); } private bool DefaultSummon() @@ -1534,20 +1616,20 @@ private bool DefaultSummon() || (IsCanSPSummonTunerLevel1() && ((Card.Level == 3 && Bot.HasInExtra(CardId.HeraldoftheArcLight)) || ( Card.Level == 4 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)))) || (Card.Id == CardId.SupremeKingDragonDarkwurm && !activate_SupremeKingDragonDarkwurm_2) - ||(Bot.HasInExtra(CardId.CrystronHalqifibrax) && Bot.HasInHandOrInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)) + || (Bot.HasInExtra(CardId.CrystronHalqifibrax) && Bot.HasInHandOrInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)) { summoned = true; - return true; + return BeforeResult(ExecutorType.Summon); } return false; } private bool OneforOneEffect() { AI.SelectCard(GetDisabledIds()); - AI.SelectNextCard(CardId.JetSynchron, CardId.LightoftheYangZing,CardId.DDLamia); - return true; + AI.SelectNextCard(CardId.JetSynchron, CardId.LightoftheYangZing, CardId.DDLamia); + return BeforeResult(ExecutorType.Activate); } - private void HeavymetalfoesElectrumiteAddIds (List ids) + private void HeavymetalfoesElectrumiteAddIds(List ids) { if (!summoned && HasInDeck(CardId.DarkContractwiththGate) && HasInDeck(CardId.DDLamia)) { @@ -1569,47 +1651,52 @@ private bool LinkuribohEffect() { if (Card.Location == CardLocation.Grave) { - if (Duel.Player != 0) return true; + if (Duel.Player != 0) return BeforeResult(ExecutorType.Activate); return false; } - return true; + return BeforeResult(ExecutorType.Activate); } private bool Raider_WingEffect() { if (!Bot.HasInMonstersZone(CardId.Raidraptor_ForceStrix, false, true, true)) return false; AI.SelectCard(CardId.Raidraptor_ForceStrix); - return true; + return BeforeResult(ExecutorType.Activate); } private bool HeavymetalfoesElectrumiteEffect() { if (ActivateDescription != -1) { - List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.SpellZone, true),Func.NegateFunc(func.IsCode),CardId.DarkContractwiththGate); + List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.SpellZone, true), Func.NegateFunc(func.IsCode), CardId.DarkContractwiththGate); if (cards.Count <= 0) { HeavymetalfoesElectrumite_activate = true; return false; } HeavymetalfoesElectrumite_activate = false; - return true; + return BeforeResult(ExecutorType.Activate); } - return true; + return BeforeResult(ExecutorType.Activate); } public override bool OnSelectHand() { return true; } + private bool ResetFlag() + { + should_destory = false; + return true; + } private bool HeraldoftheArcLightEffect() { if (Card.Location == CardLocation.MonsterZone) { - return Duel.LastChainPlayer != 0; + return Duel.LastChainPlayer != 0 && BeforeResult(ExecutorType.Activate); } return false; } private bool CalledbytheGraveEffect() { - if ((Bot.SpellZone[5] == Card || Bot.SpellZone[0] == Card) && Duel.Player == 0) return true; + if ((Bot.SpellZone[5] == Card || Bot.SpellZone[0] == Card) && Duel.Player == 0) return BeforeResult(ExecutorType.Activate); ClientCard card = Util.GetLastChainCard(); if (card == null) return false; int id = card.Id; @@ -1619,23 +1706,16 @@ private bool CalledbytheGraveEffect() if (card.Location == CardLocation.Grave && card.HasType(CardType.Monster)) { AI.SelectCard(card); - return true; + return BeforeResult(ExecutorType.Activate); } else if (g_cards.Count() > 0 && card.HasType(CardType.Monster)) { AI.SelectCard(g_cards); - return true; + return BeforeResult(ExecutorType.Activate); } } return false; } - public override bool OnSelectYesNo(int desc) - { - /* - can't get code 74580251 Duel.SelectEffectYesNo(tp,e:GetHandler(),96) - */ - return base.OnSelectYesNo(desc); - } public override CardPosition OnSelectPosition(int cardId, IList positions) { NamedCard card = NamedCard.Get(cardId); @@ -1653,7 +1733,7 @@ public override int OnSelectOption(IList options) } return base.OnSelectOption(options); } - + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { NamedCard card = NamedCard.Get(cardId); @@ -1691,31 +1771,23 @@ public override int OnSelectPlace(int cardId, int player, CardLocation location, return base.OnSelectPlace(cardId, player, location, available); } - public override void OnChainEnd() - { - should_destory = false; - base.OnChainEnd(); - } - public override IList OnSelectSynchroMaterial(IList cards, int sum, int min, int max) - { - return base.OnSelectSynchroMaterial(cards, sum, min, max); - } - private IList _OnSelectPendulumSummon(IList cards, int min,int max) + private IList _OnSelectPendulumSummon(IList cards, int min, int max) { List ids = func.GetSelectCardIdList(); List result = func.GetSelectCardList(); List exs = func.CardsCheckWhere(cards, func.IsLocation, CardLocation.Extra); - List hs = func.CardsCheckWhere(cards,Func.NegateFunc(func.IsLocation), CardLocation.Extra); - if (func.CardsCheckAny(Func.GetZoneCards(Bot,CardLocation.PendulumZone,true),card=> { - return card.HasSetcode(0xc4) && !card.IsCode(CardId.Zefraath);}) && func.CardsCheckAny(exs, func.IsCode, CardId.ShaddollZefracore)) ids.Add(CardId.ShaddollZefracore); - result = func.CardsIdToClientCards(ids,cards); + List hs = func.CardsCheckWhere(cards, Func.NegateFunc(func.IsLocation), CardLocation.Extra); + if (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.PendulumZone, true), card => { + return card.HasSetcode(0xc4) && !card.IsCode(CardId.Zefraath); + }) && func.CardsCheckAny(exs, func.IsCode, CardId.ShaddollZefracore)) ids.Add(CardId.ShaddollZefracore); + result = func.CardsIdToClientCards(ids, cards); List temp_cards = func.CardsCheckWhere(cards, Func.NegateFunc(func.IsCode), CardId.MaxxC); result.AddRange(temp_cards); - if(result.Count <= 0) return Func.CheckSelectCount(Util, result, cards, min, min); + if (result.Count <= 0) return Func.CheckSelectCount(Util, result, cards, min, min); if (result[0] != null && result[0].Location != CardLocation.Extra) ++p_count; return Func.CheckSelectCount(Util, result, cards, max, max); } - + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { if (AI.HaveSelectedCards()) return null; @@ -1735,7 +1807,7 @@ public override IList OnSelectCard(IList cards, int min, ids.AddRange(pre_ids); } ids.Add(CardId.ZefraDivineStrike); - } + } if (!activate_OracleofZefra) ids.Add(CardId.OracleofZefra); if (!activate_p_Zefraath && !func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) ids.Add(CardId.Zefraath); if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.SupremeKingGateZero, true) && !func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner) @@ -1848,9 +1920,9 @@ public override IList OnSelectCard(IList cards, int min, result = func.CardsIdToClientCards(ids, cards); } } - else if (hint == HintMsg.ToDeck && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand) && min == 3 && max ==3) - { - result = func.CardsIdToClientCards(GetSendToDeckIds(),cards); + else if (hint == HintMsg.ToDeck && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand) && min == 3 && max == 3) + { + result = func.CardsIdToClientCards(GetSendToDeckIds(), cards); } else if (hint == HintMsg.ToGrave && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Deck)) { @@ -1933,8 +2005,9 @@ public override IList OnSelectCard(IList cards, int min, HeavymetalfoesElectrumiteAddIds(ids); result = func.CardsIdToClientCards(ids, cards); } - else if (!(IS_YGOPRO & !(hint == HintMsg.SpSummon)) && func.CardsCheckALL(cards, card =>{return card.IsCode(CardId.TheMightyMasterofMagic) || card.IsCode(CardId.MythicalBeastJackalKing); - }, true)) + else if (!(IS_YGOPRO & !(hint == HintMsg.SpSummon)) && func.CardsCheckALL(cards, card => { + return card.IsCode(CardId.TheMightyMasterofMagic) || card.IsCode(CardId.MythicalBeastJackalKing); + }, true)) { ids.Add(CardId.MythicalBeastJackalKing); ids.Add(CardId.TheMightyMasterofMagic); @@ -1945,7 +2018,7 @@ public override IList OnSelectCard(IList cards, int min, { p_summoning = false; if (p_count >= 3 && !Bot.HasInExtra(CardId.SaryujaSkullDread) && Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon)) return Func.CheckSelectCount(Util, result, cards, min, min); - return _OnSelectPendulumSummon(cards,min,max); + return _OnSelectPendulumSummon(cards, min, max); } else if (hint == HintMsg.Destroy) { @@ -1955,7 +2028,7 @@ public override IList OnSelectCard(IList cards, int min, if (func.CardsCheckALL(cards, func.HasSetCode, true, 0x9e)) { if (!activate_SecretoftheYangZing) result = func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing }, func.CardsCheckWhere(cards, - func.IsLocation,CardLocation.MonsterZone)); + func.IsLocation, CardLocation.MonsterZone)); result.AddRange(func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing }, func.CardsCheckWhere(cards, Func.NegateFunc(func.IsLocation), CardLocation.MonsterZone))); } @@ -1970,7 +2043,7 @@ public override IList OnSelectCard(IList cards, int min, }); result.AddRange(scards); } - + } else if (func.CardsCheckAny(cards, card => { return card.Controller == 1 && (card.Location & CardLocation.Onfield) > 0; }) && min == 1 && max == 1) { @@ -1995,13 +2068,15 @@ public override IList OnSelectCard(IList cards, int min, { CardId.TheMightyMasterofMagic, CardId.MythicalBeastJackalKing, CardId.SecretoftheYangZing }; - if (func.CardsCheckALL(cards, func.IsLocation,true,CardLocation.Hand)) - { - if(summoned && Bot.HasInExtra(CardId.CrystronHalqifibrax) && func.CardsCheckCount(Bot.MonsterZone,card => {return card.IsFaceup() - && card.HasType(CardType.Tuner);}) <= 0 && !(Bot.HasInGraveyard(CardId.DDLamia) && !activate_DDLamia - && func.CardsCheckCount(Func.GetZoneCards (Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) + if (func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand)) + { + if (summoned && Bot.HasInExtra(CardId.CrystronHalqifibrax) && func.CardsCheckCount(Bot.MonsterZone, card => { + return card.IsFaceup() && card.HasType(CardType.Tuner); + }) <= 0 && !(Bot.HasInGraveyard(CardId.DDLamia) && !activate_DDLamia + && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) <= 0) && !(Bot.HasInGraveyard(CardId.JetSynchron) && !activate_JetSynchron) - && !(Bot.HasInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)){ + && !(Bot.HasInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)) + { ids.AddRange(tuner_ids); ids.AddRange(no_tuner_ids); } @@ -2012,8 +2087,11 @@ public override IList OnSelectCard(IList cards, int min, } result = func.CardsIdToClientCards(ids, cards); } - else if (func.CardsCheckALL(cards, card => { return Func.IsCode(card, CardId.LightoftheYangZing, CardId.PSY_FramegearGamma, - CardId.MechaPhantomBeastO_Lion, CardId.JetSynchron, CardId.Deskbot001, CardId.DDLamia); })){ + else if (func.CardsCheckALL(cards, card => { + return Func.IsCode(card, CardId.LightoftheYangZing, CardId.PSY_FramegearGamma, + CardId.MechaPhantomBeastO_Lion, CardId.JetSynchron, CardId.Deskbot001, CardId.DDLamia); + })) + { if (Bot.GetMonstersInMainZone().Count <= 1) ids.Add(CardId.Deskbot001); ids.Add(CardId.JetSynchron); ids.Add(CardId.Deskbot001); @@ -2021,7 +2099,7 @@ public override IList OnSelectCard(IList cards, int min, ids.Add(CardId.PSY_FramegearGamma); result = func.CardsIdToClientCards(ids, cards); } - + } else if (hint == HintMsg.Release && func.CardsCheckAny(cards, func.IsLocation, CardLocation.MonsterZone)) { @@ -2031,13 +2109,13 @@ public override IList OnSelectCard(IList cards, int min, { if (card == null || IsNoLinkCards(card)) continue; if (card.Id == CardId.MechaPhantomBeastToken) tRelease.Add(card); - else if(card.Id == CardId.Raidraptor_WiseStrix) tRelease.Insert(0,card); + else if (card.Id == CardId.Raidraptor_WiseStrix) tRelease.Insert(0, card); else nRelease.Add(card); } result.AddRange(tRelease); result.AddRange(nRelease); } - return Func.CheckSelectCount(Util, result, cards, min, max); + return Func.CheckSelectCount(Util, result, cards, min, max); } private bool HasInDeck(int id) { diff --git a/Game/AI/Dialogs.cs b/Game/AI/Dialogs.cs index 478783ed8..008356497 100644 --- a/Game/AI/Dialogs.cs +++ b/Game/AI/Dialogs.cs @@ -34,7 +34,9 @@ public class DialogsData [DataMember] public string[] setmonster { get; set; } [DataMember] - public string[] chaining { get; set; } + public string[] chaining { get; set; } + [DataMember] + public string[] custom { get; set; } } public class Dialogs { @@ -53,7 +55,8 @@ public class Dialogs private string[] _summon; private string[] _setmonster; private string[] _chaining; - + private string[] _custom; + public Dialogs(GameClient game) { _game = game; @@ -75,6 +78,7 @@ public Dialogs(GameClient game) _summon = data.summon; _setmonster = data.setmonster; _chaining = data.chaining; + _custom = data.custom; } } @@ -173,5 +177,14 @@ private void InternalSendMessageForced(IList array, params object[] opts if (message != "") _game.Chat(message); } + + public void SendCustomChat(int index, params object[] opts) + { + if (!_game._chat || _custom == null) + return; + string message = string.Format(_custom[index], opts); + if (message != "") + _game.Chat(message); + } } } diff --git a/Game/AI/Executor.cs b/Game/AI/Executor.cs index f3939ff85..d2a43e1c4 100644 --- a/Game/AI/Executor.cs +++ b/Game/AI/Executor.cs @@ -165,6 +165,7 @@ public virtual IList OnCardSorting(IList cards) // For overriding return null; } + public virtual void OnSelectChain(IList cards) { return; diff --git a/Game/GameAI.cs b/Game/GameAI.cs index e2d0e2c30..1c1209154 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -54,6 +54,14 @@ public void OnStart() _dialogs.SendDuelStart(); } + /// + /// Customized called when the AI do something in a duel. + /// + public void SendCustomChat(int index, params object[] opts) + { + _dialogs.SendCustomChat(index, opts); + } + /// /// Called when the AI do the rock-paper-scissors. /// From e28a0fb97f7cbe915d2cf057c2b94c0e53b3273f Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Sun, 6 Aug 2023 22:17:04 +0800 Subject: [PATCH 008/110] Add AI_Swordsoul (#170) --- BotWrapper/bot.conf | 5 + Decks/AI_Swordsoul.ydk | 59 + Dialogs/ecclesia.zh-CN.json | 48 + Game/AI/Decks/SwordsoulExecutor.cs | 3121 ++++++++++++++++++++++++++++ Game/AI/DefaultExecutor.cs | 34 + Game/AI/Executor.cs | 4 +- Game/GameAI.cs | 9 +- Game/GameBehavior.cs | 4 +- WindBot.csproj | 1 + 9 files changed, 3278 insertions(+), 7 deletions(-) create mode 100644 Decks/AI_Swordsoul.ydk create mode 100644 Dialogs/ecclesia.zh-CN.json create mode 100644 Game/AI/Decks/SwordsoulExecutor.cs diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 8330018da..fd8fcb1fd 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -199,6 +199,11 @@ Name=玻璃女巫 Deck=Exosister Dialog=verre.zh-CN 救祓少女卡组。 AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +!艾克莉西娅-相剑 +Name=艾克莉西娅 Deck=Swordsoul Dialog=ecclesia.zh-CN +相剑卡组。 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + !神数不神-刹帝利 Name=神数不神 Deck=Kashtira Dialog=Zefra.zh-CN 俱舍怒威族卡组。 diff --git a/Decks/AI_Swordsoul.ydk b/Decks/AI_Swordsoul.ydk new file mode 100644 index 000000000..2adb8e2ae --- /dev/null +++ b/Decks/AI_Swordsoul.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +27204311 +87052196 +87052196 +23431858 +93490856 +93490856 +93490856 +56495147 +56495147 +56495147 +20001443 +20001443 +20001443 +55273560 +55273560 +55273560 +14558127 +14558127 +14558127 +23434538 +23434538 +23434538 +97268402 +97268402 +97268402 +98159737 +35261759 +35261759 +56465981 +56465981 +56465981 +93850690 +24224830 +24224830 +65681983 +10045474 +10045474 +10045474 +14821890 +14821890 +#extra +42632209 +60465049 +96633955 +84815190 +47710198 +9464441 +5041348 +69248256 +69248256 +83755611 +43202238 +78917791 +32519092 +32519092 +32519092 +!side diff --git a/Dialogs/ecclesia.zh-CN.json b/Dialogs/ecclesia.zh-CN.json new file mode 100644 index 000000000..e8bae03eb --- /dev/null +++ b/Dialogs/ecclesia.zh-CN.json @@ -0,0 +1,48 @@ +{ + "welcome": [ + "这里就是大灵峰吗?" + ], + "deckerror": [ + "{0}被冰水咒缚了!" + ], + "duelstart": [ + "走了好久,肚子饿了……", + "前方会遇到怎样的同伴呢?", + "有阿不思在一起的话……" + ], + "newturn": [ + "我的回合!" + ], + "endturn": [ + "姐姐到底在哪里……", + "阿不思的干粮也吃完了啊。", + "什么时候开饭呢?" + ], + "directattack": [ + "{0},直接攻击!", + "开饭!" + ], + "attack": [ + "用{0}攻击{1}!" + ], + "ondirectattack": [ + "好饿……", + "呜呜……", + "姐姐……" + ], + "facedownmonstername": "怪兽", + "activate": [ + "发动{0}的效果!" + ], + "summon": [ + "{0}召唤!", + "出来吧,{0}!" + ], + "setmonster": [ + "……" + ], + "chaining": [ + "发动{0}的效果!", + "{0}!" + ] +} diff --git a/Game/AI/Decks/SwordsoulExecutor.cs b/Game/AI/Decks/SwordsoulExecutor.cs new file mode 100644 index 000000000..d0aebee4e --- /dev/null +++ b/Game/AI/Decks/SwordsoulExecutor.cs @@ -0,0 +1,3121 @@ +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Swordsoul", "AI_Swordsoul")] + + public class SwordsoulExecutor : DefaultExecutor + { + public class CardId + { + public const int NibiruThePrimalBeing = 27204311; + public const int TenyiSpirit_Ashuna = 87052196; + public const int TenyiSpirit_Vishuda = 23431858; + public const int SwordsoulStrategistLongyuan = 93490856; + public const int SwordsoulOfTaia = 56495147; + public const int SwordsoulOfMoYe = 20001443; + public const int IncredibleEcclesiaTheVirtuous = 55273560; + // _CardId.AshBlossom = 14558127; + // _CardId.MaxxC = 23434538; + // _CardId.EffectVeiler = 97268402; + public const int TenyiSpirit_Adhara = 98159737; + + // _CardId.PotOfDesires = 35261759; + public const int SwordsoulEmergence = 56465981; + public const int SwordsoulSacredSummit = 93850690; + // _CardId.CalledByTheGrave = 24224830; + public const int CrossoutDesignator = 65681983; + + // _CardId.InfiniteImpermanence = 10045474; + public const int SwordsoulBlackout = 14821890; + + public const int GeomathmechFinalSigma = 42632209; + public const int PsychicEndPunisher = 60465049; + public const int SwordsoulSupremeSovereign_Chengying = 96633955; + public const int BaronneDeFleur = 84815190; + public const int SwordsoulSinisterSovereign_QixingLongyuan = 47710198; + public const int AdamancipatorRisen_Dragite = 9464441; + public const int DracoBerserkerOfTheTenyi = 5041348; + public const int SwordsoulGrandmaster_Chixiao = 69248256; + public const int BaxiaBrightnessOfTheYangZing = 83755611; + public const int YaziEvilOfTheYangZing = 43202238; + public const int ShamanOfTheTenyi = 78917791; + public const int MonkOfTheTenyi = 32519092; + + public const int SwordsoulToken = 20001444; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + } + + public SwordsoulExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // startup effect + AddExecutor(ExecutorType.Activate, CardId.BaxiaBrightnessOfTheYangZing, BaxiaBrightnessOfTheYangZingActivate); + AddExecutor(ExecutorType.Activate, CardId.YaziEvilOfTheYangZing, YaziEvilOfTheYangZingActivate); + AddExecutor(ExecutorType.Activate, CardId.IncredibleEcclesiaTheVirtuous, IncredibleEcclesiaTheVirtuousActivate); + + // quick effect + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulGrandmaster_Chixiao, SwordsoulGrandmaster_ChixiaoActivate); + AddExecutor(ExecutorType.Activate, _CardId.EffectVeiler, EffectVeilerActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulSinisterSovereign_QixingLongyuan, SwordsoulSinisterSovereign_QixingLongyuanActivate); + AddExecutor(ExecutorType.Activate, CardId.DracoBerserkerOfTheTenyi, DracoBerserkerOfTheTenyiActivate); + AddExecutor(ExecutorType.Activate, CardId.AdamancipatorRisen_Dragite, AdamancipatorRisen_DragiteActivate); + AddExecutor(ExecutorType.Activate, CardId.BaronneDeFleur, BaronneDeFleurActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulSupremeSovereign_Chengying, SwordsoulSupremeSovereign_ChengyingActivate); + + // free chain + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, CardId.NibiruThePrimalBeing, NibiruThePrimalBeingActivate); + + // startup effect + AddExecutor(ExecutorType.Activate, CardId.SwordsoulEmergence, SwordsoulEmergenceActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulBlackout, SwordsoulBlackoutActivate); + + // synchro + AddExecutor(ExecutorType.SpSummon, CardId.YaziEvilOfTheYangZing, YaziEvilOfTheYangZingSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.BaxiaBrightnessOfTheYangZing, BaxiaBrightnessOfTheYangZingSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SwordsoulGrandmaster_Chixiao, SwordsoulGrandmaster_ChixiaoSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.AdamancipatorRisen_Dragite, AdamancipatorRisen_DragiteSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.DracoBerserkerOfTheTenyi, DracoBerserkerOfTheTenyiSpSummon); + + AddExecutor(ExecutorType.SpSummon, Level10SpSummonCheckInit); + AddExecutor(ExecutorType.SpSummon, Level10SpSummonCheckCount); + AddExecutor(ExecutorType.SpSummon, Level10SpSummonCheckDecide); + AddExecutor(ExecutorType.SpSummon, Level10SpSummonCheckFinal); + + // startup effect + AddExecutor(ExecutorType.Activate, CardId.SwordsoulOfMoYe, SwordsoulOfMoYeActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulOfTaia, SwordsoulOfTaiaActivate); + + // summon + AddExecutor(ExecutorType.Activate, TenyiForShamanSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.IncredibleEcclesiaTheVirtuous, IncredibleEcclesiaTheVirtuousSpSummon); + AddExecutor(ExecutorType.Summon, CardId.SwordsoulOfMoYe, SwordsoulOfMoYeSummon); + AddExecutor(ExecutorType.Summon, CardId.IncredibleEcclesiaTheVirtuous, IncredibleEcclesiaTheVirtuousSummon); + AddExecutor(ExecutorType.Summon, CardId.SwordsoulOfTaia, SwordsoulOfTaiaSummon); + + // activate + AddExecutor(ExecutorType.Activate, CardId.SwordsoulStrategistLongyuan, SwordsoulStrategistLongyuanActivate); + AddExecutor(ExecutorType.Activate, _CardId.PotOfDesires, PotOfDesiresActivate); + AddExecutor(ExecutorType.Activate, CardId.ShamanOfTheTenyi, ShamanOfTheTenyiActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulSacredSummit, SwordsoulSacredSummitActivate); + AddExecutor(ExecutorType.Activate, CardId.TenyiSpirit_Vishuda, TenyiSpirit_VishudaActivate); + AddExecutor(ExecutorType.Activate, CardId.TenyiSpirit_Ashuna, TenyiSpirit_AshunaActivate); + AddExecutor(ExecutorType.Activate, CardId.TenyiSpirit_Adhara, TenyiSpirit_AdharaActivate); + AddExecutor(ExecutorType.Activate, TenyiForBlackoutSpSummon); + + // other + AddExecutor(ExecutorType.SpSummon, CardId.GeomathmechFinalSigma, GeomathmechFinalSigmaSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.PsychicEndPunisher, PsychicEndPunisherSpSummon); + AddExecutor(ExecutorType.Summon, TunerForSynchroSummon); + AddExecutor(ExecutorType.Summon, WyrmForBlackoutSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ShamanOfTheTenyi, ShamanOfTheTenyiSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.MonkOfTheTenyi, MonkOfTheTenyiSpSummon); + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + + AddExecutor(ExecutorType.Activate, CardId.PsychicEndPunisher, PsychicEndPunisherActivate); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodeYangZing = 0x9e; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeTenyi = 0x12c; + const int SetcodeSwordsoul = 0x16b; + const int SetcodeFloowandereeze = 0x16d; + List normalCounterList = new List + { + _CardId.AshBlossom, CardId.BaronneDeFleur, 27548199, 4280258, 53262004 + }; + List notToNegateIdList = new List{ + 58699500 + }; + const int hintTimingMainEnd = 0x4; + const int hintReplaceDestroy = 96; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.IncredibleEcclesiaTheVirtuous, + _CardId.AshBlossom, _CardId.MaxxC, _CardId.EffectVeiler, CardId.SwordsoulEmergence, _CardId.InfiniteImpermanence }}, + {2, new List { CardId.TenyiSpirit_Ashuna, _CardId.PotOfDesires, _CardId.CalledByTheGrave, CardId.SwordsoulBlackout }}, + {1, new List { CardId.NibiruThePrimalBeing, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Adhara, CardId.SwordsoulSacredSummit, + CardId.CrossoutDesignator }}, + }; + + Dictionary calledbytheGraveCount = new Dictionary(); + List CrossoutDesignatorTargetList = new List(); + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + List infiniteImpermanenceList = new List(); + + bool summoned = false; + bool onlyWyrmSpSummon = false; + List activatedCardIdList = new List(); + List canSpSummonLevel10IdList = new List(); + + List effectUsedBaronneDeFleurList = new List(); + List currentNegateMonsterList = new List(); + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + ClientCard tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false) + { + List floodagateList = Enemy.GetMonsters().Where(c => c?.Data != null && + c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count() > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + return floodagateList[0]; + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count() > 0) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + return dangerList[0]; + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count() > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + return invincibleList[0]; + } + + if (attack == 0) + attack = Util.GetBestAttack(Bot); + List betterList = Enemy.MonsterZone.GetMonsters() + .Where(card => card.GetDefensePower() >= attack && card.IsAttack() && (!canBeTarget || !card.IsShouldNotBeTarget())).ToList(); + if (betterList.Count() > 0) + { + betterList.Sort(CardContainer.CompareCardAttack); + betterList.Reverse(); + return betterList[0]; + } + return null; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreNormalSpell = false) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count() > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + resultList.AddRange(floodagateList); + } + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count() > 0) + { + resultList.AddRange(ShuffleCardList(problemEnemySpellList)); + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count() > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + resultList.AddRange(dangerList); + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count() > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + resultList.AddRange(invincibleList); + } + + List enemyMonsters = Enemy.GetMonsters().ToList(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach(ClientCard target in enemyMonsters) + { + if (target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2) ) + { + if (!canBeTarget || !(target.IsShouldNotBeTarget() || target.IsShouldNotBeMonsterTarget())) + { + if (!resultList.Contains(target)) + { + resultList.Add(target); + } + } + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous)).ToList(); + if (spells.Count() > 0 && !ignoreNormalSpell) + { + resultList.AddRange(ShuffleCardList(spells)); + } + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget); + if (card != null) + return card; + + card = Enemy.MonsterZone.GetHighestAttackMonster(canBeTarget); + if (card != null) + return card; + + List monsters = Enemy.GetMonsters(); + + // after GetHighestAttackMonster, the left monsters must be face-down. + if (monsters.Count() > 0 && !onlyFaceup) + return ShuffleCardList(monsters)[0]; + + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count() > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && + ecard.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous)).ToList(); + if (faceUpList.Count() > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count() > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + if (checkGrave && Enemy.Graveyard.Count() > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count() > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true) + { + List targetList = GetProblematicEnemyCardList(canBeTarget); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleCardList(Enemy.GetSpells())); + targetList.AddRange(ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFacedown()).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeMonsterTarget = false, bool canBeTrapTarget = false) + { + List resultList = new List(); + if (CheckWhetherNegated(true)) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && (!canBeMonsterTarget || !card.IsShouldNotBeMonsterTarget()) && (!canBeTrapTarget || !card.IsShouldNotBeSpellTrapTarget()) + && !currentNegateMonsterList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && (!canBeMonsterTarget || !chainingCard.IsShouldNotBeMonsterTarget()) && (!canBeTrapTarget || !chainingCard.IsShouldNotBeSpellTrapTarget()) + && !chainingCard.IsShouldNotBeTarget() && !currentNegateMonsterList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + /// + /// Check whether negate opposite's effect and clear flag + /// + public void CheckDeactiveFlag() + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && Duel.LastChainPlayer == 1) + { + if (lastChainCard.IsCode(_CardId.MaxxC)) + { + enemyActivateMaxxC = false; + } + if (lastChainCard.IsCode(_CardId.LockBird)) + { + enemyActivateLockBird = false; + } + if (lastChainCard.IsCode(_CardId.CalledByTheGrave) && !CrossoutDesignatorTargetList.Contains(_CardId.CalledByTheGrave)) + { + foreach (ClientCard target in Duel.LastChainTargets) + { + if (target.IsMonster() && target.Controller == 0 && target.Location == CardLocation.Grave) + { + calledbytheGraveCount[target.Id] = 0; + } + } + } + if (lastChainCard.Controller == 1 && lastChainCard.Location == CardLocation.MonsterZone) + { + currentNegateMonsterList.Add(lastChainCard); + } + } + } + + /// + /// Check negated turn count of id + /// + public int CheckCalledbytheGrave(int id) + { + if (!calledbytheGraveCount.ContainsKey(id)) + { + return 0; + } + return calledbytheGraveCount[id]; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap()) + { + if (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true)) return true; + } + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) { + return true; + } + } + // how to get here? + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true) + { + if ((Card.IsSpell() || Card.IsTrap()) && CheckSpellWillBeNegate()){ + return true; + } + if (CheckCalledbytheGrave(Card.Id) > 0 || CrossoutDesignatorTargetList.Contains(Card.Id)){ + return true; + } + if (Card.IsMonster() && Card.Location == CardLocation.MonsterZone && Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) + { + return true; + } + } + if (disablecheck){ + return Card.IsDisabled(); + } + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && + (Bot.GetMonsters().Any(card => card.IsFaceup()) || (Duel.Player == 0 && Duel.Turn == 1))) + { + return true; + } + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (Duel.CurrentChain.Count >= 2) + { + ClientCard lastlastChainCard = Duel.CurrentChain[Duel.CurrentChain.Count - 2]; + ClientCard lastChainCard = Duel.CurrentChain[Duel.CurrentChain.Count - 1]; + if (lastlastChainCard?.Controller == 0 && lastChainCard?.Controller == 1 && lastChainCard.IsCode(normalCounterList)) + { + bool notImportantFlag = lastlastChainCard.Location == CardLocation.Grave + && (lastlastChainCard.IsCode(CardId.SwordsoulOfTaia) || lastlastChainCard.IsCode(CardId.SwordsoulOfMoYe) || lastlastChainCard.IsCode(CardId.SwordsoulStrategistLongyuan)); + notImportantFlag |= lastlastChainCard.IsCode(CardId.PsychicEndPunisher) && Bot.LifePoints < Enemy.LifePoints; + if (notImportantFlag) + { + return false; + } + } + } + + return true; + } + + /// + /// check enemy's dangerous card in grave + /// + public List CheckDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Vishuda, + 9411399, 28954097, 30680659 + }; + return result; + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + // Geomathmech Final Sigma always place on extra monster zone + if (cardId == CardId.GeomathmechFinalSigma && location == CardLocation.MonsterZone) + { + if ((Zones.z5 & available) > 0) return Zones.z5; + if ((Zones.z6 & available) > 0) return Zones.z6; + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (cardData.Id == CardId.PsychicEndPunisher) + { + return CardPosition.FaceUpAttack; + } + if (Util.IsTurn1OrMain2()) + { + bool turnDefense = false; + if (!cardData.HasType(CardType.Synchro) || cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (!cardData.HasType(CardType.Synchro) || cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } else if (cardData.HasType(CardType.Synchro)) + { + return CardPosition.FaceUpAttack; + } + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardData.Attack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (Util.ChainContainPlayer(1) && hint == HintMsg.Remove && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int botCount = Bot.GetMonsterCount() + Bot.GetSpellCount(); + int oppositeCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (botCount - oppositeCount == min && min == max) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // non-synchro monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List nonSynchroMonsters = botMonsters.Where(card => !card.HasType(CardType.Synchro) && !banishList.Contains(card)).ToList(); + nonSynchroMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(nonSynchroMonsters); + + // spells + List spells = Bot.GetSpells(); + banishList.AddRange(ShuffleCardList(spells)); + + // synchro monster + List synchroMonsters = botMonsters.Where(card => card.HasType(CardType.Synchro) && !banishList.Contains(card)).ToList(); + synchroMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(synchroMonsters); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override void OnNewTurn() + { + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + + List keyList = calledbytheGraveCount.Keys.ToList(); + foreach (int dic in keyList) + { + if (calledbytheGraveCount[dic] > 1) + { + calledbytheGraveCount[dic] -= 1; + } + } + CrossoutDesignatorTargetList.Clear(); + infiniteImpermanenceList.Clear(); + + summoned = false; + onlyWyrmSpSummon = false; + activatedCardIdList.Clear(); + } + + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.MaxxC) && CheckCalledbytheGrave(_CardId.MaxxC) == 0 && !CrossoutDesignatorTargetList.Contains(_CardId.MaxxC)) + { + enemyActivateMaxxC = true; + } + if (card.IsCode(_CardId.LockBird) && CheckCalledbytheGrave(_CardId.LockBird) == 0 && !CrossoutDesignatorTargetList.Contains(_CardId.LockBird)) + { + enemyActivateLockBird = true; + } + if (card.IsCode(_CardId.InfiniteImpermanence) && !CrossoutDesignatorTargetList.Contains(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4-i); + break; + } + } + } + if (card.IsCode(_CardId.CalledByTheGrave) && !CrossoutDesignatorTargetList.Contains(_CardId.CalledByTheGrave)) + { + foreach (ClientCard target in Duel.LastChainTargets) + { + if (target.IsMonster() && target.Controller == 0 && target.Location == CardLocation.Grave) + { + calledbytheGraveCount[target.Id] = 2; + } + } + } + } + base.OnChaining(player, card); + } + + public override void OnChainEnd() + { + currentNegateMonsterList.Clear(); + for (int idx = effectUsedBaronneDeFleurList.Count() - 1; idx >= 0; -- idx) + { + ClientCard checkTarget = effectUsedBaronneDeFleurList[idx]; + if (checkTarget == null || checkTarget.IsFacedown() || checkTarget.Location != CardLocation.MonsterZone) + { + effectUsedBaronneDeFleurList.RemoveAt(idx); + } + } + base.OnChainEnd(); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + List list = new List { 0, 1, 2, 3, 4 }; + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + AI.SelectPlace(zone); + return; + }; + } + AI.SelectPlace(0); + } + + + public bool NibiruThePrimalBeingActivate() + { + if (Duel.Player == 0 || Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasType(CardType.Synchro))) + { + return false; + } + + if (Util.GetBestAttack(Enemy) > Util.GetBestAttack(Bot)) + { + // end main phase + if ((CurrentTiming & hintTimingMainEnd) != 0) + { + SelectNibiruPosition(); + return true; + } + + // avoid Baronne de Fleur + List tunerList = Enemy.GetMonsters().Where(card => card.IsFaceup() && card.IsTuner() && !card.HasType(CardType.Xyz | CardType.Link)).ToList(); + List nonTunerList = Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsTuner() && !card.HasType(CardType.Xyz | CardType.Link)).ToList(); + foreach (ClientCard tuner in tunerList) + { + foreach (ClientCard nonTuner in nonTunerList) + { + if (tuner.Level + nonTuner.Level == 10) + { + SelectNibiruPosition(); + return true; + } + } + } + } + + return false; + } + + public void SelectNibiruPosition() + { + int totalAttack = Bot.GetMonsters().Where(card => card.IsFaceup()).Sum(m => (int?)m.Attack) ?? 0; + totalAttack += Enemy.GetMonsters().Where(card => card.IsFaceup()).Sum(m => (int?)m.Attack) ?? 0; + Logger.DebugWriteLine("Nibiru token attack: " + totalAttack.ToString()); + if (totalAttack >= 3000) + { + AI.SelectPosition(CardPosition.FaceUpDefence); + AI.SelectPosition(CardPosition.FaceUpDefence); + } else { + AI.SelectPosition(CardPosition.FaceUpAttack); + AI.SelectPosition(CardPosition.FaceUpAttack); + } + } + + public bool TenyiSpirit_AshunaActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Ashuna, 0)) + { + // special summon + if (TenyiSpSummonForTaiaCheck() || Level7TenyiSpSummonCheck()) + { + return true; + } + + } else if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Ashuna, 1) && Card.Location == CardLocation.Grave && CheckCalledbytheGrave(Card.Id) == 0) + { + // deck summon + + // trigger blackout + if (Bot.HasInHandOrInSpellZone(CardId.SwordsoulBlackout)) + { + List blackoutTarget = Bot.GetMonsters().Where(card => card.IsFaceup() + && !card.HasType(CardType.Synchro) && card.HasRace(CardRace.Wyrm)).ToList(); + if (blackoutTarget.Count() == 0) + { + AI.SelectCard(CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Vishuda); + onlyWyrmSpSummon = true; + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // for level8/10 synchro + List tunerIdList = new List{_CardId.AshBlossom, _CardId.EffectVeiler, CardId.TenyiSpirit_Adhara}; + bool hasTuner = Bot.GetMonsters().Any(card => card.IsFaceup() && card.IsCode(tunerIdList)); + hasTuner |= !summoned && Bot.HasInHand(tunerIdList); + if (hasTuner && CheckRemainInDeck(CardId.TenyiSpirit_Vishuda) > 0) + { + AI.SelectCard(CardId.TenyiSpirit_Ashuna); + onlyWyrmSpSummon = true; + activatedCardIdList.Add(Card.Id); + return true; + } + if (Bot.HasInMonstersZone(CardId.TenyiSpirit_Ashuna, false, false, true) && CheckRemainInDeck(CardId.TenyiSpirit_Adhara) > 0) + { + AI.SelectCard(CardId.TenyiSpirit_Adhara); + onlyWyrmSpSummon = true; + activatedCardIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public bool TenyiSpirit_VishudaActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Vishuda, 0)) + { + // special summon + if (TenyiSpSummonForTaiaCheck() || Level7TenyiSpSummonCheck()) + { + return true; + } + + } else if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Vishuda, 1) && Card.Location == CardLocation.Grave && CheckCalledbytheGrave(Card.Id) == 0) + { + // bounce + List dangerList = GetProblematicEnemyCardList(true, true); + if (dangerList.Count() > 0) + { + AI.SelectCard(dangerList); + return true; + } + } + return false; + } + + public bool Level7TenyiSpSummonCheck() + { + List advanceSummonCheckList = new List{CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia, CardId.IncredibleEcclesiaTheVirtuous}; + List tunerList = new List{CardId.TenyiSpirit_Adhara, _CardId.EffectVeiler, _CardId.AshBlossom}; + if (!summoned && !Bot.HasInHand(advanceSummonCheckList) && Bot.HasInHand(tunerList)) + { + return true; + } + + return false; + } + + public bool SwordsoulStrategistLongyuanActivate() + { + // damage effect + if (Card.Location != CardLocation.Hand) + { + return true; + } + + // special summon token + if (CheckWhetherNegated() || (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2())) + { + return false; + } + List discardIdList = new List(); + + // discard Taia to SS + if (CheckAtAdvantage()) + { + if (Bot.HasInHand(CardId.SwordsoulSacredSummit) && Bot.HasInHand(CardId.SwordsoulOfTaia) + && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && !activatedCardIdList.Contains(CardId.SwordsoulSacredSummit)) + { + discardIdList.Add(CardId.SwordsoulOfTaia); + } + } + + // discard tenyi + if (discardIdList.Count() == 0) + { + List tenyiList = new List{CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Adhara}; + foreach (int tenyiId in tenyiList) + { + if (Bot.HasInHand(tenyiId)) + { + discardIdList.Add(tenyiId); + } + } + } + + // discard dump card + if (discardIdList.Count() == 0) + { + List checkIdList = new List{ + CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.SwordsoulBlackout, CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulEmergence + }; + foreach (int checkId in checkIdList) + { + if (Bot.Hand.Count(card => card != Card && card.IsCode(checkIdList)) > 1) + { + discardIdList.Add(checkId); + } + } + } + + // discard card + if (discardIdList.Count() == 0) + { + List checkIdList = new List{ + CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.SwordsoulBlackout, CardId.SwordsoulStrategistLongyuan, + CardId.SwordsoulSacredSummit, CardId.SwordsoulEmergence + }; + foreach (int checkId in checkIdList) + { + if (Bot.Hand.Count(card => card != Card && card.IsCode(checkIdList)) >= 1) + { + discardIdList.Add(checkId); + } + } + } + + if (discardIdList.Count() > 0) + { + AI.SelectCard(discardIdList); + AI.SelectPosition(CardPosition.FaceUpAttack); + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } + + return false; + } + + public bool SwordsoulOfTaiaActivate() + { + // send to GY effect + if (Card.Location != CardLocation.MonsterZone) + { + List sendToGYTarget = new List(); + + // send Mo Ye to SS + if (!Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0) + { + bool sendMoYe = false; + // baxia + if (Bot.HasInMonstersZone(CardId.BaxiaBrightnessOfTheYangZing, true, false, true + && !activatedCardIdList.Contains(CardId.BaxiaBrightnessOfTheYangZing))) + { + sendMoYe = true; + + } + if (Bot.HasInHand(CardId.SwordsoulSacredSummit) && !activatedCardIdList.Contains(CardId.SwordsoulSacredSummit)) { + if (Bot.Hand.Any(card => card.Id != CardId.SwordsoulSacredSummit && (card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm)))) + { + sendMoYe = true; + } + } + + if (sendMoYe) + { + sendToGYTarget.Add(CardId.SwordsoulOfMoYe); + } + } + + // send Tenyi + List checkTenyiList = new List {CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna}; + foreach (int id in checkTenyiList) + { + if (CheckRemainInDeck(id) > 0) + { + sendToGYTarget.Add(id); + } + } + + if (sendToGYTarget.Count() > 0) + { + AI.SelectCard(sendToGYTarget); + return true; + } + return false; + } + + // special summon token + // ignore negate check if blackout in GY + if (Bot.HasInGraveyard(CardId.SwordsoulBlackout) && !activatedCardIdList.Contains(CardId.SwordsoulBlackout)) + { + AI.SelectCard(CardId.SwordsoulBlackout); + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } + + if (CheckWhetherNegated()) + { + return false; + } + List banishIdList = new List(); + + List checkIdList = new List{ + CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulEmergence, CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.MonkOfTheTenyi, + CardId.ShamanOfTheTenyi, CardId.SwordsoulSacredSummit, CardId.SwordsoulGrandmaster_Chixiao, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Vishuda, + CardId.SwordsoulSinisterSovereign_QixingLongyuan, CardId.SwordsoulSupremeSovereign_Chengying, CardId.DracoBerserkerOfTheTenyi, + CardId.TenyiSpirit_Adhara + }; + + // dump check + foreach (int checkId in checkIdList) + { + if (Bot.Graveyard.Count(card => card.IsCode(checkId)) > 1) + { + banishIdList.Add(checkId); + } + } + + // priority check + if (banishIdList.Count() == 0) + { + foreach (int checkId in checkIdList) + { + if (Bot.HasInGraveyard(checkId)) + { + banishIdList.Add(checkId); + } + } + } + + if (banishIdList.Count() > 0) + { + AI.SelectCard(banishIdList); + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } + + return false; + } + + public bool SwordsoulOfTaiaSummon() + { + if (Bot.HasInGraveyard(CardId.SwordsoulBlackout)) + { + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && !activatedCardIdList.Contains(CardId.SwordsoulBlackout)) + { + summoned = true; + return true; + } + } + if (SummonLevel4ForSynchro()) + { + summoned = true; + return true; + } + if (CheckWhetherNegated()) + { + return false; + } + if (SwordsoulOfTaiaEffectCheck() && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia)) + { + summoned = true; + return true; + } + + return false; + } + + public bool SwordsoulOfTaiaEffectCheck(ClientCard exceptTarget = null) + { + if (exceptTarget == null) + { + exceptTarget = Card; + } + return Bot.Graveyard.Count(card => card != exceptTarget && (card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm))) > 0; + } + + public bool SwordsoulOfMoYeActivate() + { + // draw effect + if (Card.Location != CardLocation.MonsterZone) + { + return true; + } + + // special summon token + if (CheckWhetherNegated()) + { + return false; + } + List revealList = Bot.Hand.Where(card => card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm)).ToList(); + if (revealList.Count() > 0) + { + revealList = ShuffleCardList(revealList); + AI.SelectCard(revealList); + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool SwordsoulOfMoYeSummon() + { + if (SummonLevel4ForSynchro()) + { + summoned = true; + return true; + } + if (CheckWhetherNegated()) + { + return false; + } + if (SwordsoulOfMoYeEffectCheck() && !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe)) + { + summoned = true; + return true; + } + + return false; + } + + public bool SwordsoulOfMoYeEffectCheck(List exceptList = null) + { + if (exceptList == null) + { + exceptList = new List{Card}; + } + return Bot.Hand.Count(card => !exceptList.Contains(card) && (card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm))) > 0; + } + + public bool SummonLevel4ForSynchro() + { + bool hasNonTuner = Bot.GetMonsters().Any(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link) && !card.IsTuner()); + if (hasNonTuner) + { + return false; + } + List tunerList = Bot.GetMonsters().Where(card => + card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link) && card.IsTuner()).ToList(); + if (tunerList.Count() > 0) + { + foreach (ClientCard tuner in tunerList) + { + int checkLevel = tuner.Level + 4; + if (Bot.ExtraDeck.Any(card => card.HasType(CardType.Synchro) && card.Level == checkLevel)) + { + return true; + } + } + } + + return false; + } + + public bool IncredibleEcclesiaTheVirtuousActivate() + { + if (Card.Location == CardLocation.Grave) + { + return true; + } + if (Duel.Player == 0 && !CheckWhetherNegated()) + { + bool canActivateMoye = !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck(); + bool canActivateTaia = !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 && SwordsoulOfTaiaEffectCheck(); + if (canActivateMoye && !summoned && !Bot.HasInHand(CardId.SwordsoulOfMoYe)) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + return true; + } + if (canActivateTaia && !summoned && !Bot.HasInHand(CardId.SwordsoulOfTaia)) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + return true; + } + if (canActivateMoye) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + return true; + } + if (canActivateTaia) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + return false; + } + + public bool IncredibleEcclesiaTheVirtuousSummon() + { + if (CheckWhetherNegated()) + { + return false; + } + if (SwordsoulOfMoYeSummon() && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0) + { + summoned = true; + return true; + } + if (SwordsoulOfTaiaSummon() && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0) + { + summoned = true; + return true; + } + + return false; + } + + public bool IncredibleEcclesiaTheVirtuousSpSummon() + { + if (CheckWhetherNegated()) + { + return false; + } + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + return false; + } + + return true; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (DefaultAshBlossomAndJoyousSpring()) + { + CheckDeactiveFlag(); + return true; + } + return false; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool EffectVeilerActivate() + { + if (CheckWhetherNegated(true)) return false; + + List shouldNegateList = GetMonsterListForTargetNegate(true); + if (shouldNegateList.Count() > 0) + { + ClientCard target = shouldNegateList[0]; + currentNegateMonsterList.Add(target); + AI.SelectCard(target); + return true; + } + + return false; + } + + public bool TunerForSynchroSummon() + { + if (!Card.IsCode(_CardId.AshBlossom) && !Card.IsCode(CardId.TenyiSpirit_Adhara) && !Card.IsCode(_CardId.EffectVeiler)) + { + return false; + } + // taia check + if (Bot.HasInExtra(CardId.MonkOfTheTenyi) && Bot.HasInHand(CardId.SwordsoulOfTaia) + && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + return false; + } + + // already has tuner, skip (maybe affected by Dimensional Barrier) + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.IsTuner())) + { + return false; + } + + // level10 check + List checkOnField = new List{CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna}; + bool hasLevel7NonTuner = Bot.GetMonsters().Any(card => card.IsFaceup() && checkOnField.Contains(card.Id) && !card.IsTuner()); + if (hasLevel7NonTuner) + { + int totalLevel = Card.Level + 7; + if (Bot.ExtraDeck.Any(card => card.HasType(CardType.Synchro) && card.Level == totalLevel && (!onlyWyrmSpSummon || card.HasRace(CardRace.Wyrm)))) + { + summoned = true; + return true; + } + } + + List checkNonTuner = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.IsTuner()).ToList(); + checkNonTuner.Sort(CardContainer.CompareCardAttack); + // level7 check + if (Bot.HasInExtra(CardId.YaziEvilOfTheYangZing)) + { + foreach (ClientCard checkCard in checkNonTuner) + { + if (Card.Level + checkCard.Level == 7) + { + summoned = true; + return true; + } + } + } + // level 11 check + if (Bot.HasInExtra(CardId.PsychicEndPunisher)) + { + foreach (ClientCard checkCard in checkNonTuner) + { + if ((checkCard.IsDisabled() || !checkCard.HasType(CardType.Synchro)) && (Card.Level + checkCard.Level == 11)) + { + summoned = true; + return true; + } + } + } + + return false; + } + + public bool WyrmForBlackoutSummon() + { + if (Card.Level > 4 || !Card.HasRace(CardRace.Wyrm)) + { + return false; + } + if (Bot.HasInHandOrInSpellZone(CardId.SwordsoulBlackout) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasRace(CardRace.Wyrm))) + { + summoned = true; + return true; + } + return false; + } + + public bool TenyiSpirit_AdharaActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Adhara, 0)) + { + // special summon + if (TenyiSpSummonForTaiaCheck()) + { + return true; + } + + } + else if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Adhara, 1) && Card.Location == CardLocation.Grave && CheckCalledbytheGrave(Card.Id) == 0) + { + // recycle + if (!activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) && SwordsoulOfMoYeEffectCheck() + && Bot.HasInBanished(CardId.SwordsoulStrategistLongyuan)) + { + AI.SelectCard(CardId.SwordsoulStrategistLongyuan); + return true; + } + if (!summoned) + { + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && SwordsoulOfMoYeEffectCheck() + && Bot.HasInBanished(CardId.SwordsoulOfMoYe)) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + return true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && SwordsoulOfTaiaEffectCheck() + && Bot.HasInBanished(CardId.SwordsoulOfTaia)) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + return true; + } + } + List recycleList = new List{CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna}; + foreach (int recycle in recycleList) + { + if (Bot.HasInBanished(recycle)) + { + AI.SelectCard(recycle); + return true; + } + } + } + + return false; + } + + public bool TenyiSpSummonForTaiaCheck() + { + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + bool hasTaia = (!summoned && Bot.HasInHand(CardId.SwordsoulOfTaia)) || Bot.HasInMonstersZone(CardId.SwordsoulOfTaia); + bool noTargetInGrave = !Bot.Graveyard.Any(card => card.HasRace(CardRace.Wyrm) || card.HasSetcode(SetcodeSwordsoul)); + bool hasInExtra = Bot.HasInExtra(CardId.MonkOfTheTenyi); + bool notLongyuan = activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) || !Bot.HasInHand(CardId.SwordsoulStrategistLongyuan); + + if (hasTaia && noTargetInGrave && hasInExtra && notLongyuan) + { + return true; + } + } + return false; + } + + public bool TenyiForShamanSpSummon() + { + List checkEffectDesc = new List{ + Util.GetStringId(CardId.TenyiSpirit_Adhara, 0), Util.GetStringId(CardId.TenyiSpirit_Vishuda, 0), + Util.GetStringId(CardId.TenyiSpirit_Ashuna, 0) + }; + if (!checkEffectDesc.Contains(ActivateDescription) || summoned || !Bot.HasInExtra(CardId.ShamanOfTheTenyi) + || (CheckAtAdvantage() && enemyActivateMaxxC)) + { + return false; + } + ClientCard toSummonMoye = Bot.Hand.FirstOrDefault(card => card.IsCode(CardId.SwordsoulOfMoYe)); + if (toSummonMoye == null) + { + return false; + } + List notRevealCheckList = new List{Card, toSummonMoye}; + if (!SwordsoulOfMoYeEffectCheck(notRevealCheckList) || activatedCardIdList.Contains(CardId.SwordsoulOfMoYe)) + { + return false; + } + if (activatedCardIdList.Contains(CardId.SwordsoulOfTaia) || !Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia)) + { + return false; + } + + return true; + } + + public bool TenyiForBlackoutSpSummon() + { + List checkEffectDesc = new List{ + Util.GetStringId(CardId.TenyiSpirit_Adhara, 0), Util.GetStringId(CardId.TenyiSpirit_Vishuda, 0), + Util.GetStringId(CardId.TenyiSpirit_Ashuna, 0) + }; + if (!checkEffectDesc.Contains(ActivateDescription)) + { + return false; + } + if (CheckAtAdvantage() && enemyActivateMaxxC) + { + return false; + } + if (Bot.HasInHandOrInSpellZone(CardId.SwordsoulBlackout) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasRace(CardRace.Wyrm))) + { + return true; + } + return false; + } + + public bool PotOfDesiresActivate() + { + if (CheckWhetherNegated()) + { + return false; + } + if (CheckAtAdvantage()) + { + bool result = Bot.Deck.Count() >= 15; + if (result) + { + SelectSTPlace(null, true); + } + return result; + } + SelectSTPlace(null, true); + return true; + } + + public bool SwordsoulEmergenceActivate() + { + if (Card.Location == CardLocation.Removed) + { + return SwordsoulSpellBanishedEffect(); + } + + // Mo Ye + if (!Bot.HasInHand(CardId.SwordsoulOfMoYe) && !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) + && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + + // Taia + if (!Bot.HasInHand(CardId.SwordsoulOfTaia) && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) + && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0 && SwordsoulOfTaiaEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + + // Longyuan + if (!Bot.HasInHand(CardId.SwordsoulStrategistLongyuan) && !activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) + && CheckRemainInDeck(CardId.SwordsoulStrategistLongyuan) > 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulStrategistLongyuan); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + + // dump check + if (!Bot.HasInHand(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + List checkIdList = new List{CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.SwordsoulStrategistLongyuan}; + foreach (int checkId in checkIdList) + { + if (CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + } + + return false; + } + + public bool SwordsoulSacredSummitActivate() + { + if (Card.Location == CardLocation.Removed) + { + return SwordsoulSpellBanishedEffect(); + } + if (CheckAtAdvantage()) + { + if (enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + return false; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + ClientCard taia = Bot.Graveyard.FirstOrDefault(card => card.IsCode(CardId.SwordsoulOfTaia)); + if (taia != null && SwordsoulOfTaiaEffectCheck(taia)) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + } + } + bool controlSynchro = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasType(CardType.Synchro)); + + List rebornTargetList = Bot.Graveyard.Where(card => + card.IsMonster() && (card.HasSetcode(SetcodeSwordsoul) || (controlSynchro && card.HasRace(CardRace.Wyrm)))).ToList(); + rebornTargetList.Sort(CardContainer.CompareCardAttack); + rebornTargetList.Reverse(); + + if (rebornTargetList.Count() > 0) + { + ClientCard rebornTarget = rebornTargetList[0]; + if (rebornTarget.IsCode(CardId.SwordsoulOfMoYe) && (activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) || !SwordsoulOfMoYeEffectCheck())) + { + return false; + } + if (rebornTarget.IsCode(CardId.SwordsoulOfTaia) && activatedCardIdList.Contains(CardId.SwordsoulOfTaia)) + { + return false; + } + AI.SelectCard(rebornTargetList); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool SwordsoulSpellBanishedEffect() + { + // TODO + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + // negate + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().Id; + if (code == 0) return false; + if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTargetList.Contains(code)) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + if (Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)) != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + CheckDeactiveFlag(); + return true; + } + } + + // banish target + foreach (ClientCard cards in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(cards) && cards.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = cards.Id; + AI.SelectCard(cards); + calledbytheGraveCount[code] = 2; + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = CheckDangerousCardinEnemyGrave(true); + if (targets.Count() > 0) { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + return true; + } + + return false; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + // negate + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTargetList.Contains(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + CrossoutDesignatorTargetList.Add(code); + CheckDeactiveFlag(); + return true; + } + } + return false; + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ( (this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + CheckDeactiveFlag(); + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectCard(target); + } else { + AI.SelectCard(Enemy.GetMonsters()); + } + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(false, true); + if (shouldNegateList.Count() > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateMonsterList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++ i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + public bool SwordsoulBlackoutActivate() + { + // sp summon token + if (Card.Location == CardLocation.Removed) + { + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } + + // self destroy targer + List selfDestroyList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasRace(CardRace.Wyrm)).ToList(); + selfDestroyList.Sort(CardContainer.CompareCardAttack); + ClientCard selfDestroyTarget = selfDestroyList[0]; + bool selfTargetIsImportant = selfDestroyTarget.HasType(CardType.Synchro); + + // choose Chengying + List chengyingList = Bot.GetMonsters().Where(card => + card.IsCode(CardId.SwordsoulSupremeSovereign_Chengying) && card.IsFaceup() && !card.IsDisabled()).ToList(); + if (chengyingList.Count() > 0 && Bot.Graveyard.Count() > 0) + { + selfDestroyTarget = chengyingList[0]; + selfTargetIsImportant = false; + } + foreach (ClientCard selfCard in selfDestroyList) + { + if (Duel.LastChainTargets.Contains(selfCard)) + { + selfDestroyTarget = selfCard; + selfTargetIsImportant = false; + } + } + + // destroy problem card + List problemCardList = GetProblematicEnemyCardList(true); + if (problemCardList.Count() >= 2 && Duel.Player == 1) + { + AI.SelectCard(selfDestroyTarget); + AI.SelectNextCard(problemCardList); + return true; + } + + List faceUpEnemyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup()).ToList(); + faceUpEnemyMonsterList.Sort(CardContainer.CompareCardAttack); + faceUpEnemyMonsterList.Reverse(); + if (!selfTargetIsImportant && Duel.Player == 1) + { + // destroy multi monster + if (faceUpEnemyMonsterList.Count() >= 2) + { + AI.SelectCard(selfDestroyTarget); + AI.SelectNextCard(GetNormalEnemyTargetList()); + return true; + } + + // destroy card in EP + if (Duel.Phase == DuelPhase.End) + { + AI.SelectCard(selfDestroyTarget); + AI.SelectNextCard(GetNormalEnemyTargetList()); + return true; + } + } + + // destroy attack monster + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2 && faceUpEnemyMonsterList.Count() > 0) + { + int botBestAttack = Util.GetBestAttack(Bot); + int enemyBestAttack = faceUpEnemyMonsterList[0].GetDefensePower(); + if (enemyBestAttack >= botBestAttack) + { + AI.SelectCard(selfDestroyTarget); + AI.SelectNextCard(GetNormalEnemyTargetList()); + return true; + } + } + + return false; + } + + + public bool GeomathmechFinalSigmaSpSummon() + { + if (Bot.GetMonstersExtraZoneCount() > 0) return false; + bool hasFloowandereeze = Enemy.GetMonsters().Any(card => card.HasSetcode(SetcodeFloowandereeze)); + hasFloowandereeze |= Enemy.GetSpells().Any(card => card.HasSetcode(SetcodeFloowandereeze)); + hasFloowandereeze |= Enemy.Graveyard.Any(card => card.HasSetcode(SetcodeFloowandereeze)); + hasFloowandereeze |= Enemy.Banished.Any(card => card.HasSetcode(SetcodeFloowandereeze)); + if (hasFloowandereeze) + { + AI.SelectMaterials(GetSynchroMaterial(12)); + AI.SelectPosition(CardPosition.FaceUpAttack); + return true; + } + + return false; + } + + public bool PsychicEndPunisherSpSummon() + { + List materialList = GetSynchroMaterial(11); + if (materialList.Count() > 1) + { + AI.SelectMaterials(materialList); + AI.SelectPosition(CardPosition.FaceUpAttack); + return true; + } + + return false; + } + + /// + /// remove level10 summon filter + /// + public bool Level10SpSummonCheckInit() + { + canSpSummonLevel10IdList.Clear(); + return false; + } + + /// + /// check which level10 monster can be summoned + /// + public bool Level10SpSummonCheckCount() + { + List checkIdList = new List{ + CardId.SwordsoulSupremeSovereign_Chengying, CardId.SwordsoulSinisterSovereign_QixingLongyuan, CardId.BaronneDeFleur + }; + foreach (int checkId in checkIdList) + { + if (Card.IsCode(checkId)) + { + canSpSummonLevel10IdList.Add(checkId); + } + } + return false; + } + + /// + /// decide which level10 monster to summon + /// + public bool Level10SpSummonCheckDecide() + { + if (canSpSummonLevel10IdList.Count <= 1) + { + return false; + } + List decideIdList = new List(); + + // BaronneDeFleur + if (canSpSummonLevel10IdList.Contains(CardId.BaronneDeFleur)) + { + // protect maxxc + if (Bot.HasInHand(_CardId.MaxxC)) + { + canSpSummonLevel10IdList.Clear(); + canSpSummonLevel10IdList.Add(CardId.BaronneDeFleur); + return false; + } + + // continue to use taia for synchro + ClientCard taia = Bot.Graveyard.FirstOrDefault(card => card.IsCode(CardId.SwordsoulOfTaia)); + if (taia != null && SwordsoulOfTaiaEffectCheck(taia) && Bot.HasInHand(CardId.SwordsoulSacredSummit)) + { + canSpSummonLevel10IdList.Clear(); + canSpSummonLevel10IdList.Add(CardId.BaronneDeFleur); + return false; + } + + decideIdList.Add(CardId.BaronneDeFleur); + } + + // QixingLongyuan + if (canSpSummonLevel10IdList.Contains(CardId.SwordsoulSinisterSovereign_QixingLongyuan)) + { + if (CheckAtAdvantage()) + { + decideIdList.Add(CardId.SwordsoulSinisterSovereign_QixingLongyuan); + } + } + + // Chengying + if (canSpSummonLevel10IdList.Contains(CardId.SwordsoulSupremeSovereign_Chengying)) + { + int banishCount = Bot.Banished.Count() + Enemy.Banished.Count(); + // use blackout or chixiao to trigger + bool decideFlag = Bot.HasInHandOrInSpellZone(CardId.SwordsoulBlackout) + || Bot.HasInMonstersZone(CardId.SwordsoulGrandmaster_Chixiao, true, false, true); + if (CheckAtAdvantage()) + { + // overkill + if (3000 + banishCount * 100 >= Enemy.LifePoints) + { + decideFlag = true; + } + } else { + ClientCard enemyMonster = GetBestEnemyMonster(true); + if (enemyMonster != null && decideIdList.Count() == 0) + { + // for high-power monster + if (3000 + banishCount * 200 >= enemyMonster.GetDefensePower()) + { + decideFlag = true; + } + } + } + + if (decideFlag) + { + decideIdList.Add(CardId.SwordsoulSupremeSovereign_Chengying); + } + } + + if (decideIdList.Count() > 0) + { + // if multi selections, select randomly + canSpSummonLevel10IdList.Clear(); + int index = Program.Rand.Next(decideIdList.Count()); + int lastDecide = decideIdList[index]; + canSpSummonLevel10IdList.Add(lastDecide); + } + return false; + } + + /// + /// perform level10 monster's synchro summon + /// + public bool Level10SpSummonCheckFinal() + { + if (canSpSummonLevel10IdList.Count() == 1) + { + int finalDecideId = canSpSummonLevel10IdList[0]; + if (Card.IsCode(finalDecideId)) + { + List materialList = GetSynchroMaterial(10, Card.IsCode(CardId.SwordsoulSinisterSovereign_QixingLongyuan)); + if (materialList.Count() > 1) + { + AI.SelectMaterials(materialList); + return true; + } + return true; + } + } + + return false; + } + + public bool AdamancipatorRisen_DragiteSpSummon() + { + if (!Bot.HasInMonstersZone(CardId.SwordsoulGrandmaster_Chixiao, true)) + { + return false; + } + bool containWaterMonsterInGY = Bot.Graveyard.Any(card => card.IsMonster() && card.HasAttribute(CardAttribute.Water)); + bool canContainWaterInGY = containWaterMonsterInGY; + canContainWaterInGY |= Bot.GetMonsters().Any(card => card.HasAttribute(CardAttribute.Water) && card.IsFaceup()); + if (!canContainWaterInGY) + { + return false; + } + + SelectLevel8SynchroMaterial(false, !containWaterMonsterInGY); + return true; + } + + public bool DracoBerserkerOfTheTenyiSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + return false; + } + + SelectLevel8SynchroMaterial(true); + return true; + } + + public bool SwordsoulGrandmaster_ChixiaoSpSummon() + { + if (CheckAtAdvantage() && enemyActivateLockBird) + { + return false; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulGrandmaster_Chixiao)) + { + SelectLevel8SynchroMaterial(true); + return true; + } + + return false; + } + + public bool BaxiaBrightnessOfTheYangZingSpSummon() + { + if (CheckAtAdvantage()) + { + return false; + } + + List problemList = GetProblematicEnemyCardList(true); + if (problemList.Count() > 1 && !activatedCardIdList.Contains(CardId.BaxiaBrightnessOfTheYangZing + 1)) + { + SelectLevel8SynchroMaterial(true); + return true; + } + if (problemList.Count() == 1 && Bot.GetSpellCount() > 0 && !activatedCardIdList.Contains(CardId.BaxiaBrightnessOfTheYangZing + 2)) + { + bool checkFlag = false; + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && SwordsoulOfMoYeEffectCheck() && Bot.HasInGraveyard(CardId.SwordsoulOfMoYe)) + { + checkFlag = true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && Bot.HasInGraveyard(CardId.SwordsoulOfTaia)) + { + checkFlag = true; + } + if (checkFlag) + { + SelectLevel8SynchroMaterial(true); + return true; + } + } + + return false; + } + + public void SelectLevel8SynchroMaterial(bool needWyrmNonTuner = false, bool needWaterNonTuner = false) + { + List tunerList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.IsTuner() && card.Level < 8).ToList(); + List nonTunerList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.IsTuner() && card.Level < 8 + && (!needWyrmNonTuner || card.HasRace(CardRace.Wyrm) && (!needWaterNonTuner || card.HasAttribute(CardAttribute.Water)))).ToList(); + tunerList.Sort(CardContainer.CompareCardAttack); + nonTunerList.Sort(CardContainer.CompareCardAttack); + + List materialList = new List(); + foreach (ClientCard tuner in tunerList) + { + materialList.Clear(); + materialList.Add(tuner); + if (tuner.Level == 4) + { + // use moye first + if (activatedCardIdList.Contains(CardId.SwordsoulOfMoYe)) + { + ClientCard moye = nonTunerList.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulOfMoYe)); + if (moye != null) + { + materialList.Add(moye); + AI.SelectMaterials(materialList); + return; + } + } + + // use taia + if (activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && !needWaterNonTuner) + { + ClientCard taia = nonTunerList.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulOfTaia)); + if (taia != null) + { + materialList.Add(taia); + AI.SelectMaterials(materialList); + return; + } + } + } + + foreach (ClientCard nonTuner in nonTunerList) + { + if (tuner.Level + nonTuner.Level == 8) + { + materialList.Add(nonTuner); + AI.SelectMaterials(materialList); + return; + } + } + } + } + + public bool YaziEvilOfTheYangZingSpSummon() + { + if (Enemy.GetMonsterCount() + Enemy.GetSpellCount() == 0) + { + return false; + } + bool shouldSummon = GetProblematicEnemyCardList(true, true).Count() > 0; + shouldSummon |= !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 + && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 && SwordsoulOfMoYeEffectCheck(); + shouldSummon |= !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 + && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0; + + if (shouldSummon) + { + List materialList = GetSynchroMaterial(7); + if (materialList.Count() > 1) + { + AI.SelectMaterials(materialList); + return true; + } + } + + return false; + } + + public List GetSynchroMaterial(int level, bool needWyrmNonTuner = false) + { + List tunerList = Bot.GetMonsters().Where(card => + card.IsFaceup() && card.IsTuner() && !card.HasType(CardType.Xyz | CardType.Link)).ToList(); + List nonTunerList = Bot.GetMonsters().Where(card => + card.IsFaceup() && !card.IsTuner() && !card.HasType(CardType.Xyz | CardType.Link) && (!needWyrmNonTuner || card.HasRace(CardRace.Wyrm))).ToList(); + tunerList.Sort(CardContainer.CompareCardAttack); + nonTunerList.Sort(CardContainer.CompareCardAttack); + List selectList = new List(); + foreach (ClientCard tuner in tunerList) + { + selectList.Clear(); + selectList.Add(tuner); + foreach (ClientCard nonTuner in nonTunerList) + { + if (tuner.Level + nonTuner.Level == level && (nonTuner.IsDisabled() || !nonTuner.HasType(CardType.Synchro))) + { + selectList.Add(nonTuner); + return selectList; + } + } + } + selectList.Clear(); + return selectList; + } + + public bool ShamanOfTheTenyiSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + Logger.DebugWriteLine("[Shaman] advantage & maxxc, skip"); + return false; + } + // check extra summon + List extraZoneMonsters = Bot.GetMonstersInExtraZone(); + if (extraZoneMonsters.Count() > 0 && extraZoneMonsters.Any(card => card.IsFacedown() || !card.HasType(CardType.Link) || !card.HasRace(CardRace.Wyrm))) + { + Logger.DebugWriteLine("[Shaman] extra zone occupied, skip"); + return false; + } + // check spsummon target + bool hasSpSummonTaret = !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 + && Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia); + hasSpSummonTaret |= !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 + && Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) && SwordsoulOfMoYeEffectCheck(); + hasSpSummonTaret |= Bot.GetGraveyardMonsters().Any(card => card.HasType(CardType.Synchro) && card.IsCanRevive() && card.HasRace(CardRace.Wyrm)); + if (!hasSpSummonTaret) + { + Logger.DebugWriteLine("[Shaman] no target, skip"); + return false; + } + + // select material + List materialList = new List(extraZoneMonsters); + List mainMonsterZoneMonsters = Bot.GetMonstersInMainZone().Where(card => + card.IsFaceup() && !card.HasType(CardType.Synchro) && card.HasRace(CardRace.Wyrm)).ToList(); + mainMonsterZoneMonsters.Sort(CardContainer.CompareCardAttack); + materialList.AddRange(mainMonsterZoneMonsters); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList.GetRange(0, 2)); + return true; + } + + return false; + } + + public bool MonkOfTheTenyiSpSummon() + { + List materialList = Bot.GetMonsters().Where(card => + card.IsFaceup() && !card.HasType(CardType.Synchro | CardType.Link) && card.HasSetcode(SetcodeTenyi)).ToList(); + if (materialList.Count() > 0) + { + materialList.Sort(CardContainer.CompareCardAttack); + AI.SelectMaterials(materialList); + return true; + } + return false; + } + + + public bool PsychicEndPunisherActivate() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + return true; + } + if (Bot.LifePoints <= 1500 || CheckWhetherNegated()) + { + return false; + } + List selfBanishTarget = Bot.GetMonsters().Where(card => card != Card && (card.IsFacedown() || card.GetDefensePower() <= 1000)).ToList(); + if (selfBanishTarget.Count() == 0) + { + return false; + } + selfBanishTarget.Sort(CardContainer.CompareCardAttack); + AI.SelectCard(selfBanishTarget); + AI.SelectNextCard(GetNormalEnemyTargetList(true)); + return true; + } + + public bool SwordsoulSupremeSovereign_ChengyingActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.SwordsoulSupremeSovereign_Chengying, 0) || ActivateDescription == -1) + { + activatedCardIdList.Add(Card.Id); + List banishTargetList = Duel.CurrentChain.Where(card => card.Controller == 1 && card.Location == CardLocation.Grave).ToList(); + banishTargetList.AddRange(CheckDangerousCardinEnemyGrave(false)); + if (banishTargetList.Count() > 0) + { + ClientCard graveTarget = banishTargetList[0]; + Logger.DebugWriteLine("Chengying banish grave: " + graveTarget?.Name); + } + List fieldTargetList = GetNormalEnemyTargetList(); + if (fieldTargetList.Count() > 0) + { + ClientCard fieldTarget = fieldTargetList[0]; + Logger.DebugWriteLine("Chengying banish field: " + fieldTarget?.Name); + } + banishTargetList.AddRange(fieldTargetList); + AI.SelectCard(banishTargetList); + + } else if (ActivateDescription == hintReplaceDestroy) + { + List removeCardIdList = new List{ + _CardId.CalledByTheGrave, CardId.CrossoutDesignator, _CardId.InfiniteImpermanence, _CardId.AshBlossom, + _CardId.MaxxC, _CardId.EffectVeiler, CardId.MonkOfTheTenyi, CardId.ShamanOfTheTenyi, CardId.SwordsoulGrandmaster_Chixiao, + CardId.SwordsoulOfTaia, CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfMoYe + }; + AI.SelectCard(removeCardIdList); + } else + { + Logger.DebugWriteLine("Chengying desc: " + ActivateDescription.ToString()); + } + + return true; + } + + public bool BaronneDeFleurActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.BaronneDeFleur, 1)) + { + // negate + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (CheckAtAdvantage() && lastChainCard.IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainTargets.Contains(Card) && lastChainCard.IsCode(_CardId.EffectVeiler, _CardId.InfiniteImpermanence, _CardId.BreakthroughSkill)) + { + return false; + } + } + CheckDeactiveFlag(); + effectUsedBaronneDeFleurList.Add(Card); + return true; + } else if (Duel.Phase == DuelPhase.Standby) + { + // special summon after effect used + if (effectUsedBaronneDeFleurList.Contains(Card) && !CheckWhetherNegated(true)) + { + if (Duel.Player == 1) + { + if (!Bot.HasInMonstersZone(CardId.SwordsoulGrandmaster_Chixiao) && Bot.HasInGraveyard(CardId.SwordsoulGrandmaster_Chixiao)) + { + AI.SelectCard(CardId.SwordsoulGrandmaster_Chixiao); + return true; + } + } else if (GetProblematicEnemyCardList(true, true).Count() > 0) + { + return false; + } else if (CheckAtAdvantage()) { + if (Bot.ExtraDeck.Any(card => card.IsFacedown() && card.HasType(CardType.Synchro) && card.Level == 8)) + { + if (Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) && SwordsoulOfMoYeEffectCheck() && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + return true; + } + if (CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + ClientCard taia = Bot.Graveyard.FirstOrDefault(card => card.IsCode(CardId.SwordsoulOfTaia)); + if (taia != null && SwordsoulOfTaiaEffectCheck(taia)) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + return true; + } + } + } + } + } + } else { + // destroy + List targetList = GetNormalEnemyTargetList(); + if (targetList.Count() > 0) + { + AI.SelectCard(targetList); + return true; + } + } + + return false; + } + + public bool SwordsoulSinisterSovereign_QixingLongyuanActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.SwordsoulSinisterSovereign_QixingLongyuan, 0)) + { + // draw + return true; + } else if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SwordsoulSinisterSovereign_QixingLongyuan, 1)) + { + // remove monster + return true; + } else if (ActivateDescription == Util.GetStringId(CardId.SwordsoulSinisterSovereign_QixingLongyuan, 2)) + { + // remove spell/trap + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.Controller == 1) + { + bool activateFlag = DefaultOnBecomeTarget(); + activateFlag |= Enemy.LifePoints <= 1200; + activateFlag |= lastChainCard.HasType(CardType.Continuous | CardType.Equip | CardType.Field | CardType.Pendulum); + if (activateFlag) + { + return true; + } + } + } else + { + Logger.DebugWriteLine("qixinglongyuan desc: " + ActivateDescription); + } + + return false; + } + + public bool AdamancipatorRisen_DragiteActivate() + { + // bounce + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.AdamancipatorRisen_Dragite, 0)) + { + if (CheckWhetherNegated()) + { + return false; + } + if (CheckRemainInDeck(CardId.NibiruThePrimalBeing) > 0 && (Enemy.GetMonsterCount() + Enemy.GetSpellCount() > 0)) + { + AI.SelectCard(GetNormalEnemyTargetList(false)); + return true; + } + return false; + } + + // negate + if (CheckWhetherNegated()) + { + return false; + } + + return true; + } + + public bool DracoBerserkerOfTheTenyiActivate() + { + // do not banish Nibiru + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.IsCode(CardId.NibiruThePrimalBeing) && lastChainCard.Controller == 1) + { + return false; + } + return true; + } + + public bool SwordsoulGrandmaster_ChixiaoActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.SwordsoulGrandmaster_Chixiao, 1)) + { + // negate + if (CheckWhetherNegated(true)) return false; + + List negateTargetList = new List(); + + List shouldNegateList = GetMonsterListForTargetNegate(true); + if (shouldNegateList.Count() > 0) + { + ClientCard target = shouldNegateList[0]; + currentNegateMonsterList.Add(target); + negateTargetList.AddRange(shouldNegateList); + } + + // negate unbreakable monster + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + bool botCanAttack = Bot.GetMonsters().Any(card => card.IsAttack()); + if (Duel.Player == 0 && botCanAttack) + { + negateTargetList.AddRange(Enemy.GetMonsters().Where(card => card.IsFaceup() && card.IsMonsterDangerous()).ToList()); + } + if (Duel.Player == 1) + { + ClientCard enemyMonster = Enemy.BattlingMonster; + if (enemyMonster != null && enemyMonster.IsMonsterInvincible()) + { + negateTargetList.Add(enemyMonster); + } + } + } + + // trigger Chengying + if (Bot.HasInMonstersZone(CardId.SwordsoulSupremeSovereign_Chengying, true, false, true) + && !activatedCardIdList.Contains(CardId.SwordsoulSupremeSovereign_Chengying) && Enemy.Graveyard.Count() > 0) + { + if (GetProblematicEnemyMonster() != null || (Duel.Phase == DuelPhase.End && Duel.Player == 1)) + { + bool triggerFlag = true; + List enemyTargetList = Enemy.GetMonsters().Where(card => + card.IsFaceup() && card.HasType(CardType.Effect) && !card.IsShouldNotBeMonsterTarget() && card.IsShouldNotBeTarget()).ToList(); + if (enemyTargetList.Count() == 0) + { + List botTargetList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasType(CardType.Effect) + && !card.IsDisabled() && card != Card && !card.IsCode(CardId.SwordsoulSupremeSovereign_Chengying)).ToList(); + if (botTargetList.Count() == 0) + { + triggerFlag = false; + } else { + botTargetList.Sort(CardContainer.CompareCardAttack); + enemyTargetList.AddRange(botTargetList); + } + } else { + enemyTargetList.Sort(CardContainer.CompareCardAttack); + enemyTargetList.Reverse(); + } + if (triggerFlag) + { + negateTargetList.AddRange(enemyTargetList); + } + } + } + + if (negateTargetList.Count() > 0) + { + // select banish card + List graveBanishList = Bot.Graveyard.Where(card => card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm)).ToList(); + + if (graveBanishList.Count() > 0) + { + bool selectFlag = false; + // trigger blackout + ClientCard blackOut = graveBanishList.FirstOrDefault(card => card.IsCode(CardId.SwordsoulBlackout)); + if (Duel.Player == 0 && !activatedCardIdList.Contains(CardId.SwordsoulBlackout) && blackOut != null) + { + AI.SelectCard(blackOut); + selectFlag = true; + } + if (!selectFlag) + { + // banish dump card + List checkIdList = new List{ + CardId.SwordsoulEmergence, CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.SwordsoulStrategistLongyuan, CardId.MonkOfTheTenyi, + CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna + }; + foreach (int checkId in checkIdList) + { + List checkCardList = graveBanishList.Where(card => card.IsCode(checkId)).ToList(); + if (checkCardList.Count() > 1) + { + AI.SelectCard(checkCardList); + selectFlag = true; + break; + } + } + } + if (!selectFlag) + { + // banish exists card + List checkIdList = new List{ + CardId.SwordsoulEmergence, CardId.MonkOfTheTenyi, CardId.ShamanOfTheTenyi, CardId.SwordsoulOfTaia, + CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfMoYe, CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna + }; + foreach (int checkId in checkIdList) + { + List checkCardList = graveBanishList.Where(card => card.IsCode(checkId)).ToList(); + if (checkCardList.Count() > 0) + { + AI.SelectCard(checkCardList); + selectFlag = true; + break; + } + } + } + if (!selectFlag) + { + AI.SelectCard(ShuffleCardList(graveBanishList)); + } + } + AI.SelectNextCard(negateTargetList); + activatedCardIdList.Add(Card.Id); + return true; + } + + } else { + // search + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + if (CheckRemainInDeck(CardId.SwordsoulBlackout) > 0) + { + AI.SelectCard(CardId.SwordsoulBlackout); + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + + List searchIdList = new List{ + CardId.SwordsoulBlackout, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia, CardId.SwordsoulEmergence, + CardId.SwordsoulStrategistLongyuan + }; + foreach (int checkId in searchIdList) + { + if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) + { + AI.SelectCard(checkId); + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + if (CheckAtAdvantage()) + { + if (!activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) && !Bot.HasInHand(CardId.SwordsoulStrategistLongyuan) + && SwordsoulOfMoYeEffectCheck() && CheckRemainInDeck(CardId.SwordsoulStrategistLongyuan) > 0) + { + AI.SelectCard(CardId.SwordsoulStrategistLongyuan); + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + + if (!activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) && Bot.HasInHand(CardId.SwordsoulStrategistLongyuan) + && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && !activatedCardIdList.Contains(CardId.SwordsoulSacredSummit)) + { + // ready for another level 8 synchro + if (Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia) && !Bot.HasInHand(CardId.SwordsoulSacredSummit)) + { + if (CheckRemainInDeck(CardId.SwordsoulSacredSummit) > 0) + { + AI.SelectCard(CardId.SwordsoulSacredSummit); + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (!Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia) && Bot.HasInHand(CardId.SwordsoulSacredSummit)) + { + if (CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + } + + if (!Bot.HasInMonstersZone(CardId.SwordsoulToken) && Bot.HasInMonstersZone(CardId.SwordsoulStrategistLongyuan) + && Bot.HasInMonstersZone(CardId.SwordsoulStrategistLongyuan) && CheckRemainInDeck(CardId.SwordsoulBlackout) > 0 + && !activatedCardIdList.Contains(CardId.SwordsoulBlackout)) + { + Logger.DebugWriteLine("Chixiao banish blackout"); + AI.SelectCard(CardId.SwordsoulBlackout); + AI.SelectYesNo(false); + activatedCardIdList.Add(Card.Id); + return true; + } + + if (CheckAtAdvantage()) + { + List searchIdList = new List{ + CardId.SwordsoulBlackout, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia, CardId.SwordsoulEmergence, + CardId.SwordsoulStrategistLongyuan + }; + foreach (int checkId in searchIdList) + { + if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) + { + AI.SelectCard(checkId); + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + List checkIdList = new List{ + CardId.SwordsoulBlackout, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia, CardId.SwordsoulEmergence, + CardId.SwordsoulStrategistLongyuan + }; + foreach (int checkId in checkIdList) + { + if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) + { + AI.SelectCard(checkId); + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + return false; + } + + public bool BaxiaBrightnessOfTheYangZingActivate() + { + Logger.DebugWriteLine("Baxia desc: " + ActivateDescription.ToString()); + + if (ActivateDescription == Util.GetStringId(CardId.BaxiaBrightnessOfTheYangZing, 0)) + { + List enemyTargetList = GetNormalEnemyTargetList(true); + if (enemyTargetList.Count() > 0) + { + AI.SelectCard(enemyTargetList); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } else + { + List destroyTarget = Bot.GetSpells(); + destroyTarget.AddRange(Bot.GetMonsters().Where(card => card.IsFacedown() || card.Attack <= 1000).ToList()); + if (destroyTarget.Count() == 0) + { + return false; + } + + bool canUseMoye = !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck(); + bool canUseTaia = !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) + && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 && SwordsoulOfTaiaEffectCheck(); + + if (canUseMoye && Bot.HasInGraveyard(CardId.SwordsoulOfMoYe)) + { + AI.SelectCard(destroyTarget); + AI.SelectNextCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + if (canUseTaia && Bot.HasInGraveyard(CardId.SwordsoulOfTaia)) + { + AI.SelectCard(destroyTarget); + AI.SelectNextCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + if (Bot.HasInGraveyard(CardId.IncredibleEcclesiaTheVirtuous)) + { + // sp summon ecclesia for moye/taia + if (!activatedCardIdList.Contains(CardId.IncredibleEcclesiaTheVirtuous)) + { + if ((canUseMoye && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0) + || (canUseTaia && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0)) + { + AI.SelectCard(destroyTarget); + AI.SelectNextCard(CardId.IncredibleEcclesiaTheVirtuous); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + // sp summon ecclesia as tuner + if (Bot.GetMonsters().Any(card => card.IsFaceup() && !card.IsTuner() && card.Level == 4)) + { + AI.SelectCard(destroyTarget); + AI.SelectNextCard(CardId.IncredibleEcclesiaTheVirtuous); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + } + + return false; + } + + public bool YaziEvilOfTheYangZingActivate() + { + if (Card.Location == CardLocation.Grave) + { + // special summon + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + return true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + return true; + } + if (Bot.HasInMonstersZone(CardId.SwordsoulToken)) + { + List specialSummonIdListForSynchro = new List{CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia}; + foreach (int checkId in specialSummonIdListForSynchro) + { + if (CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + return true; + } + } + } + List specialSummonIdList = new List{ + CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Adhara, + CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia + }; + foreach (int checkId in specialSummonIdList) + { + if (CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + return true; + } + } + } else + { + // destroy + if (CheckWhetherNegated(true)) + { + return false; + } + bool selfDestroy = false; + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck()) + { + selfDestroy = true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + selfDestroy = true; + } + if (selfDestroy) + { + AI.SelectCard(Card); + } else + { + List YangZingList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeYangZing)).ToList(); + YangZingList.Sort(CardContainer.CompareCardAttack); + AI.SelectCard(YangZingList); + } + AI.SelectNextCard(GetNormalEnemyTargetList(true)); + return true; + } + + return false; + } + + public bool ShamanOfTheTenyiActivate() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + // destroy + AI.SelectCard(GetNormalEnemyTargetList()); + return true; + } else + { + // special summon + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + return false; + } + + bool canUseMoye = Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 + && !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe); + bool canUseTaia = Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 + && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia); + bool shouldDiscardTaia = !Bot.HasInGraveyard(CardId.SwordsoulOfTaia) && Bot.HasInHand(CardId.SwordsoulOfTaia); + List sortedReviveTargetList = Bot.GetGraveyardMonsters().Where(card => + card.IsCanRevive() && card.HasRace(CardRace.Wyrm)).ToList(); + sortedReviveTargetList.Sort(CardContainer.CompareCardAttack); + sortedReviveTargetList.Reverse(); + + if (CheckAtAdvantage()) + { + // try to kill + if (Duel.Turn > 1 && Enemy.GetMonsterCount() == 0) + { + int currentAttack = Util.GetTotalAttackingMonsterAttack(0); + if (currentAttack < Enemy.LifePoints) + { + List overkillList = sortedReviveTargetList.Where(card => + card.Attack + currentAttack >= Enemy.LifePoints).ToList(); + if (overkillList.Count() > 0) + { + SelectDiscardForShamanOfTheTenyi(shouldDiscardTaia); + AI.SelectNextCard(overkillList); + return true; + } + } + } + + // for next synchro + if (canUseMoye) + { + SelectDiscardForShamanOfTheTenyi(); + AI.SelectNextCard(CardId.SwordsoulOfMoYe); + return true; + } + if (canUseTaia) + { + SelectDiscardForShamanOfTheTenyi(shouldDiscardTaia); + AI.SelectNextCard(CardId.SwordsoulOfTaia); + return true; + } + + // choose max attack + SelectDiscardForShamanOfTheTenyi(); + AI.SelectNextCard(sortedReviveTargetList); + return true; + + } else { + // reborn synchro monster + List synchroMonsterList = sortedReviveTargetList.Where(card => card.HasType(CardType.Synchro)).ToList(); + if (synchroMonsterList.Count() > 0) + { + SelectDiscardForShamanOfTheTenyi(); + AI.SelectNextCard(synchroMonsterList); + return true; + } + + // for next synchro + if (canUseMoye) + { + SelectDiscardForShamanOfTheTenyi(); + AI.SelectNextCard(CardId.SwordsoulOfMoYe); + return true; + } + if (canUseTaia) + { + SelectDiscardForShamanOfTheTenyi(shouldDiscardTaia); + AI.SelectNextCard(CardId.SwordsoulOfTaia); + return true; + } + } + } + + return false; + } + + public void SelectDiscardForShamanOfTheTenyi(bool useTaia = false) + { + if (useTaia) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + } else { + // drop tenyi + List tenyiList = new List{CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Adhara}; + foreach (int tenyiId in tenyiList) + { + if (Bot.HasInHand(tenyiId)) + { + AI.SelectCard(tenyiId); + return; + } + } + + // drop dump card + foreach (ClientCard hand in Bot.Hand) + { + if (Bot.Hand.Where(card => card.IsCode(hand.Id)).Count() > 1) + { + AI.SelectCard(hand); + return; + } + } + + // check discard list + List discardList = new List{ + CardId.CrossoutDesignator, _CardId.PotOfDesires, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Vishuda, + CardId.TenyiSpirit_Adhara, CardId.NibiruThePrimalBeing, CardId.SwordsoulSacredSummit, CardId.IncredibleEcclesiaTheVirtuous, + _CardId.InfiniteImpermanence, _CardId.CalledByTheGrave, CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, + CardId.SwordsoulStrategistLongyuan, _CardId.AshBlossom, _CardId.MaxxC, _CardId.EffectVeiler, + CardId.SwordsoulEmergence, CardId.SwordsoulBlackout + }; + foreach (int discardCheck in discardList) + { + if (Bot.HasInHand(discardCheck)) + { + AI.SelectCard(discardCheck); + return; + } + } + + } + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + List onlyOneSetList = new List{ + CardId.SwordsoulBlackout + }; + if (onlyOneSetList.Contains(Card.Id) && Bot.HasInSpellZone(Card.Id)) + { + return false; + } + + // select place + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + } +} \ No newline at end of file diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 4212a3769..30c20fd5c 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -319,6 +319,40 @@ public override bool OnSelectMonsterSummonOrSet(ClientCard card) return card.Level <= 4 && Bot.GetMonsters().Count(m => m.IsFaceup()) == 0 && Util.IsAllEnemyBetterThanValue(card.Attack, true); } + /// + /// Called when the AI has to select one or more cards. + /// + /// List of available cards. + /// Minimal quantity. + /// Maximal quantity. + /// The hint message of the select. + /// True if you can return an empty list. + /// A new list containing the selected cards. + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + // wordaround for Dogmatika Alba Zoa + int albaZoaCount = Bot.ExtraDeck.Count / 2; + if (!cancelable && min == albaZoaCount && max == albaZoaCount + && Duel.Player == 1 && (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && cards.All(card => + card.Controller == 0 && (card.Location == CardLocation.Hand || card.Location == CardLocation.Extra))) + { + Logger.DebugWriteLine("Dogmatika Alba Zoa solved"); + List extraDeck = new List(Bot.ExtraDeck); + int shuffleCount = extraDeck.Count; + while (shuffleCount-- > 1) + { + int index = Program.Rand.Next(extraDeck.Count); + ClientCard tempCard = extraDeck[shuffleCount]; + extraDeck[shuffleCount] = extraDeck[index]; + extraDeck[index] = tempCard; + } + + return Util.CheckSelectCount(extraDeck, cards, min, max); + } + + return null; + } + /// /// Destroy face-down cards first, in our turn. /// diff --git a/Game/AI/Executor.cs b/Game/AI/Executor.cs index d2a43e1c4..b6a804a89 100644 --- a/Game/AI/Executor.cs +++ b/Game/AI/Executor.cs @@ -22,6 +22,7 @@ public abstract class Executor protected ExecutorType Type { get; private set; } protected ClientCard Card { get; private set; } protected int ActivateDescription { get; private set; } + protected int CurrentTiming { get; private set; } protected ClientField Bot { get; private set; } protected ClientField Enemy { get; private set; } @@ -233,11 +234,12 @@ public void SetBattle(BattlePhase battle) /// /// Set global variables Type, Card, ActivateDescription for Executor /// - public void SetCard(ExecutorType type, ClientCard card, int description) + public void SetCard(ExecutorType type, ClientCard card, int description, int timing = -1) { Type = type; Card = card; ActivateDescription = description; + CurrentTiming = timing; } /// diff --git a/Game/GameAI.cs b/Game/GameAI.cs index 1c1209154..d25a1f838 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -309,8 +309,9 @@ public IList OnSelectCard(IList cards, int min, int max, /// List of activable cards. /// List of effect descriptions. /// You can't return -1 if this param is true. + /// Current hint timing /// Index of the activated card or -1. - public int OnSelectChain(IList cards, IList descs, bool forced) + public int OnSelectChain(IList cards, IList descs, bool forced, int timing = -1) { Executor.OnSelectChain(cards); foreach (CardExecutor exec in Executor.Executors) @@ -318,7 +319,7 @@ public int OnSelectChain(IList cards, IList descs, bool forced) for (int i = 0; i < cards.Count; ++i) { ClientCard card = cards[i]; - if (ShouldExecute(exec, card, ExecutorType.Activate, descs[i])) + if (ShouldExecute(exec, card, ExecutorType.Activate, descs[i], timing)) { _dialogs.SendChaining(card.Name); return i; @@ -1121,7 +1122,7 @@ public BattlePhaseAction ToMainPhase2() return new BattlePhaseAction(BattlePhaseAction.BattleAction.ToMainPhaseTwo); } - private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type, int desc = -1) + private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type, int desc = -1, int timing = -1) { if (card.Id != 0 && type == ExecutorType.Activate) { @@ -1130,7 +1131,7 @@ private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type if (!Executor.OnPreActivate(card)) return false; } - Executor.SetCard(type, card, desc); + Executor.SetCard(type, card, desc, timing); bool result = card != null && exec.Type == type && (exec.CardId == -1 || exec.CardId == card.Id) && (exec.Func == null || exec.Func()); diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index ff2cc9397..e41527a34 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1078,7 +1078,7 @@ private void OnSelectChain(BinaryReader packet) packet.ReadByte(); // specount bool forced = packet.ReadByte() != 0; packet.ReadInt32(); // hint1 - packet.ReadInt32(); // hint2 + int hint2 = packet.ReadInt32(); // hint2 IList cards = new List(); IList descs = new List(); @@ -1118,7 +1118,7 @@ private void OnSelectChain(BinaryReader packet) return; } - Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forced)); + Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forced, hint2)); } private void OnSelectCounter(BinaryReader packet) diff --git a/WindBot.csproj b/WindBot.csproj index c40a8c761..b4e228087 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -106,6 +106,7 @@ + From 4c5989bc03d09175016601bf5729592fb1e25cb5 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Sat, 23 Sep 2023 11:31:30 +0800 Subject: [PATCH 009/110] Enum update (#171) --- Game/AI/Decks/SwordsoulExecutor.cs | 15 ++++++--------- Game/AI/Enums/DangerousMonster.cs | 2 ++ Game/AI/Enums/Floodgate.cs | 13 ++++++++++++- Game/AI/Enums/FusionSpell.cs | 5 ++++- Game/AI/Enums/InvincibleMonster.cs | 12 ++++++++++-- Game/AI/Enums/NotBeSynchroMaterialMonster.cs | 3 ++- Game/AI/Enums/NotBeXyzMaterialMonster.cs | 3 ++- .../ShouldBeDisabledBeforeItUseEffectMonster.cs | 6 +++++- 8 files changed, 43 insertions(+), 16 deletions(-) diff --git a/Game/AI/Decks/SwordsoulExecutor.cs b/Game/AI/Decks/SwordsoulExecutor.cs index d0aebee4e..e9a967fce 100644 --- a/Game/AI/Decks/SwordsoulExecutor.cs +++ b/Game/AI/Decks/SwordsoulExecutor.cs @@ -936,6 +936,10 @@ public bool Level7TenyiSpSummonCheck() { return true; } + if (Bot.HasInExtra(CardId.PsychicEndPunisher) && Bot.HasInMonstersZone(CardId.SwordsoulToken) && !onlyWyrmSpSummon) + { + return true; + } return false; } @@ -1387,7 +1391,7 @@ public bool TunerForSynchroSummon() List checkNonTuner = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.IsTuner()).ToList(); checkNonTuner.Sort(CardContainer.CompareCardAttack); // level7 check - if (Bot.HasInExtra(CardId.YaziEvilOfTheYangZing)) + if (Bot.HasInExtra(CardId.YaziEvilOfTheYangZing) && GetProblematicEnemyCardList(true, true).Count() > 0) { foreach (ClientCard checkCard in checkNonTuner) { @@ -2673,7 +2677,6 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() if (CheckRemainInDeck(CardId.SwordsoulBlackout) > 0) { AI.SelectCard(CardId.SwordsoulBlackout); - AI.SelectYesNo(true); activatedCardIdList.Add(Card.Id); return true; } @@ -2687,7 +2690,6 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) { AI.SelectCard(checkId); - AI.SelectYesNo(true); activatedCardIdList.Add(Card.Id); return true; } @@ -2700,7 +2702,6 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() && SwordsoulOfMoYeEffectCheck() && CheckRemainInDeck(CardId.SwordsoulStrategistLongyuan) > 0) { AI.SelectCard(CardId.SwordsoulStrategistLongyuan); - AI.SelectYesNo(true); activatedCardIdList.Add(Card.Id); return true; } @@ -2714,7 +2715,6 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() if (CheckRemainInDeck(CardId.SwordsoulSacredSummit) > 0) { AI.SelectCard(CardId.SwordsoulSacredSummit); - AI.SelectYesNo(true); activatedCardIdList.Add(Card.Id); return true; } @@ -2724,7 +2724,6 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() if (CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0) { AI.SelectCard(CardId.SwordsoulOfTaia); - AI.SelectYesNo(true); activatedCardIdList.Add(Card.Id); return true; } @@ -2738,7 +2737,7 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() { Logger.DebugWriteLine("Chixiao banish blackout"); AI.SelectCard(CardId.SwordsoulBlackout); - AI.SelectYesNo(false); + AI.SelectOption(1); activatedCardIdList.Add(Card.Id); return true; } @@ -2754,7 +2753,6 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) { AI.SelectCard(checkId); - AI.SelectYesNo(true); activatedCardIdList.Add(Card.Id); return true; } @@ -2770,7 +2768,6 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) { AI.SelectCard(checkId); - AI.SelectYesNo(true); activatedCardIdList.Add(Card.Id); return true; } diff --git a/Game/AI/Enums/DangerousMonster.cs b/Game/AI/Enums/DangerousMonster.cs index 66276534b..fe956dd82 100644 --- a/Game/AI/Enums/DangerousMonster.cs +++ b/Game/AI/Enums/DangerousMonster.cs @@ -24,5 +24,7 @@ public enum DangerousMonster ZushintheSleepingGiant = 67547370, Heart_eartHDragon = 97403510, DaigustoSphreeze = 29552709, + OhimetheManifestedMikanko = 81260679, + ArahimetheManifestedMikanko = 75771170 } } diff --git a/Game/AI/Enums/Floodgate.cs b/Game/AI/Enums/Floodgate.cs index da3feb9b5..e74040835 100644 --- a/Game/AI/Enums/Floodgate.cs +++ b/Game/AI/Enums/Floodgate.cs @@ -199,6 +199,17 @@ public enum Floodgate BystialDisPater = 27572350, DespianLuluwalilith = 53971455, FirewallDragonSingularity = 21637210, - BrandedEtude = 45675980 + BrandedEtude = 45675980, + EvolzarLars = 35103106, + AltergeistAdminia = 61470213, + EmperorCharlesTheGreat = 97864322, + YouReFinished = 88346805, + VolcanicEmperor = 46412900, + VolcanicInferno = 84138874, + RedZone = 50056656, + TGGlaiveBlaster = 95973569, + StellarNemesisTPHON_DoomsdayStar = 93039339, + SPLittleKnight = 29301450, + AngelRing = 40678060 } } diff --git a/Game/AI/Enums/FusionSpell.cs b/Game/AI/Enums/FusionSpell.cs index 73dfd26ce..f157cc3a2 100644 --- a/Game/AI/Enums/FusionSpell.cs +++ b/Game/AI/Enums/FusionSpell.cs @@ -82,6 +82,9 @@ public enum FusionSpell AmazonessSecretArts = 86758746, DarkWorldAccession = 65956182, BeetrooperLanding = 13234975, - FusionReproduction = 43331750 + FusionReproduction = 43331750, + ChimeraFusion = 63136489, + HarmonicSynchroFusion = 7473735, + SouloftheSupremeCelestialKing = 76840111 } } diff --git a/Game/AI/Enums/InvincibleMonster.cs b/Game/AI/Enums/InvincibleMonster.cs index ad2aff17c..fe9a32c27 100644 --- a/Game/AI/Enums/InvincibleMonster.cs +++ b/Game/AI/Enums/InvincibleMonster.cs @@ -27,7 +27,9 @@ public enum InvincibleBotMonster NumberC96DarkStorm = 77205367, Number54LionHeart = 54366836, Number2NinjaShadowMosquito = 32453837, - OhimetheManifestedMikanko = 81260679 + OhimetheManifestedMikanko = 81260679, + NightmareMagician = 40221691, + ArahimetheManifestedMikanko = 75771170 } /// /// Cards that are invincible to battle. @@ -101,6 +103,12 @@ public enum InvincibleEnemyMonster BrigrandtheGloryDragon = 34848821, AmazonessQueen = 15951532, Number2NinjaShadowMosquito = 32453837, - OhimetheManifestedMikanko = 81260679 + OhimetheManifestedMikanko = 81260679, + CornfieldCoatl = 92565383, + MirrorSwordknight = 28954097, + NightmareMagician = 40221691, + ArahimetheManifestedMikanko = 75771170, + UFOLight = 9275482, + TaotheGreatChanter = 34541543 } } diff --git a/Game/AI/Enums/NotBeSynchroMaterialMonster.cs b/Game/AI/Enums/NotBeSynchroMaterialMonster.cs index a7d6491ec..032331205 100644 --- a/Game/AI/Enums/NotBeSynchroMaterialMonster.cs +++ b/Game/AI/Enums/NotBeSynchroMaterialMonster.cs @@ -26,7 +26,8 @@ public enum NotBeSynchroMaterialMonster GreenDuston = 52182715, RedDuston = 61019812, EaterofMillions = 63845230, - PutridPuddingBodyBuddies = 85101097 + PutridPuddingBodyBuddies = 85101097, + Click_Echo = 2992467 } } \ No newline at end of file diff --git a/Game/AI/Enums/NotBeXyzMaterialMonster.cs b/Game/AI/Enums/NotBeXyzMaterialMonster.cs index 23b74da85..94c8f1f3d 100644 --- a/Game/AI/Enums/NotBeXyzMaterialMonster.cs +++ b/Game/AI/Enums/NotBeXyzMaterialMonster.cs @@ -8,6 +8,7 @@ public enum NotBeXyzMaterialMonster GreenDuston = 52182715, RedDuston = 61019812, EaterofMillions = 63845230, - PutridPuddingBodyBuddies = 85101097 + PutridPuddingBodyBuddies = 85101097, + Click_Echo = 2992467 } } \ No newline at end of file diff --git a/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs b/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs index 9ff2d93fa..0eaa62950 100644 --- a/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs +++ b/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs @@ -59,6 +59,10 @@ public enum ShouldBeDisabledBeforeItUseEffectMonster BrotherhoodoftheFireFist_Leopard = 39699564, SpringansPedor = 56818977, GizmekNaganakitheSunriseSignaler = 96399967, - MyutantMutant = 26561172 + MyutantMutant = 26561172, + ThreeEyedGhost = 31464658, + UrsarcticPolarStar = 62714453, + BattlinBoxerPromoter = 83315222, + TGRocketSalamander = 77392987 } } From 34dd165ec5a6490569d12df4c99d321d29292dba Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Tue, 10 Oct 2023 20:14:17 +0800 Subject: [PATCH 010/110] AI_Dogmatika (#173) --- Decks/AI_Dogmatika.ydk | 59 + Dialogs/ecclesia.zh-CN.json | 3 +- Game/AI/Decks/DogmatikaExecutor.cs | 2823 ++++++++++++++++++++++++++++ Game/AI/Executor.cs | 5 + Game/GameAI.cs | 5 + Game/GameBehavior.cs | 25 +- WindBot.csproj | 1 + 7 files changed, 2919 insertions(+), 2 deletions(-) create mode 100644 Decks/AI_Dogmatika.ydk create mode 100644 Game/AI/Decks/DogmatikaExecutor.cs diff --git a/Decks/AI_Dogmatika.ydk b/Decks/AI_Dogmatika.ydk new file mode 100644 index 000000000..c66e48b2c --- /dev/null +++ b/Decks/AI_Dogmatika.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +51522296 +51522296 +62849088 +69680031 +69680031 +95679145 +72270339 +60303688 +60303688 +60303688 +14558127 +14558127 +14558127 +23434538 +23434538 +23434538 +10158145 +10158145 +10158145 +1984618 +1984618 +1984618 +31002402 +60921537 +16240772 +24224830 +24224830 +65681983 +80845034 +80845034 +80845034 +35569555 +35569555 +35569555 +10045474 +10045474 +10045474 +82956214 +82956214 +82956214 +#extra +24915933 +41373230 +11765832 +11765832 +80532587 +80532587 +80532587 +53971455 +53971455 +74586817 +79606837 +93039339 +2220237 +24842059 +60303245 +!side \ No newline at end of file diff --git a/Dialogs/ecclesia.zh-CN.json b/Dialogs/ecclesia.zh-CN.json index e8bae03eb..c2be9788e 100644 --- a/Dialogs/ecclesia.zh-CN.json +++ b/Dialogs/ecclesia.zh-CN.json @@ -1,6 +1,7 @@ { "welcome": [ - "这里就是大灵峰吗?" + "这里就是大灵峰吗?", + "这里是教导龙国。" ], "deckerror": [ "{0}被冰水咒缚了!" diff --git a/Game/AI/Decks/DogmatikaExecutor.cs b/Game/AI/Decks/DogmatikaExecutor.cs new file mode 100644 index 000000000..7b231bb62 --- /dev/null +++ b/Game/AI/Decks/DogmatikaExecutor.cs @@ -0,0 +1,2823 @@ +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using System.CodeDom; +using System.Security.AccessControl; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Dogmatika", "AI_Dogmatika")] + + public class DogmatikaExecutor : DefaultExecutor + { + public class CardId + { + public const int DogmatikaAlbaZoa = 51522296; + public const int ThesIrisSwordsoul = 62849088; + public const int DogmatikaFleurdelis = 69680031; + public const int DogmatikaMaximus = 95679145; + public const int DiabellstarTheBlackWitch = 72270339; + public const int DogmatikaEcclesia = 60303688; + // _CardId.AshBlossom = 14558127; + // _CardId.MaxxC = 23434538; + public const int KnightmareCorruptorIblee = 10158145; + + public const int NadirServant = 1984618; + public const int DogmatikaLamity = 31002402; + public const int DogmatikaMacabre = 60921537; + public const int SinfulSpoilsOfDoom_Rciela = 16240772; + // _CardId.CalledByTheGrave = 24224830; + public const int CrossoutDesignator = 65681983; + public const int WANTED_SeekerOfSinfulSpoils = 80845034; + public const int DogmatikaMatrix = 35569555; + + // _CardId.InfiniteImpermanence = 10045474; + public const int DogmatikaPunishment = 82956214; + + public const int GranguignolTheDuskDragon = 24915933; + public const int TitanikladTheAshDragon = 41373230; + public const int GaruraWingsOfResonantLife = 11765832; + public const int ElderEntityNtss = 80532587; + public const int DespianLuluwalilith = 53971455; + public const int PSYFramelordOmega = 74586817; + public const int HeraldOfTheArcLight = 79606837; + public const int SuperStarslayerTYPHON = 93039339; + public const int SPLittleKnight = 29301450; + public const int SecureGardna = 2220237; + public const int Linguriboh = 24842059; + public const int SalamangreatAlmiraj = 60303245; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + } + + public DogmatikaExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // startup effect + AddExecutor(ExecutorType.Activate, CardId.WANTED_SeekerOfSinfulSpoils, WANTED_SeekerOfSinfulSpoilsActivate); + AddExecutor(ExecutorType.Activate, CardId.SalamangreatAlmiraj, SalamangreatAlmirajActivate); + + AddExecutor(ExecutorType.Activate, CardId.PSYFramelordOmega, PSYFramelordOmegaActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaAlbaZoa, DogmatikaAlbaZoaActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaMaximus, DogmatikaMaximusActivate); + AddExecutor(ExecutorType.Activate, CardId.DiabellstarTheBlackWitch, DiabellstarTheBlackWitchActivate); + + // quick effect + AddExecutor(ExecutorType.Activate, CardId.ThesIrisSwordsoul, ThesIrisSwordsoulActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.Linguriboh, LinguribohActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaPunishment, DogmatikaPunishmentActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaFleurdelis, DogmatikaFleurdelisActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.SinfulSpoilsOfDoom_Rciela, SinfulSpoilsOfDoom_RcielaActivate); + AddExecutor(ExecutorType.Activate, ClearIrisFlag); + + AddExecutor(ExecutorType.Activate, CardId.HeraldOfTheArcLight, HeraldOfTheArcLightActivate); + AddExecutor(ExecutorType.Activate, CardId.ElderEntityNtss, ElderEntityNtssActivate); + AddExecutor(ExecutorType.Activate, CardId.GranguignolTheDuskDragon, GranguignolTheDuskDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.GaruraWingsOfResonantLife, GaruraWingsOfResonantLifeActivate); + AddExecutor(ExecutorType.Activate, CardId.KnightmareCorruptorIblee, KnightmareCorruptorIbleeActivate); + AddExecutor(ExecutorType.Activate, CardId.TitanikladTheAshDragon, TitanikladTheAshDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.DespianLuluwalilith, DespianLuluwalilithActivate); + + // free chain + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, CardId.SuperStarslayerTYPHON, SuperStarslayerTYPHONActivate); + + // spsummon + AddExecutor(ExecutorType.SpSummon, CardId.Linguriboh, LinguribohSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SalamangreatAlmiraj, SalamangreatAlmirajSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SecureGardna, SecureGardnaSpSummon); + + // startup effect + AddExecutor(ExecutorType.Summon, CardId.KnightmareCorruptorIblee, KnightmareCorruptorIbleeSummon); + AddExecutor(ExecutorType.Activate, CardId.NadirServant, NadirServantActivate); + + // summon + AddExecutor(ExecutorType.Summon, CardId.DogmatikaEcclesia, DogmatikaEcclesiaSummon); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaEcclesia, DogmatikaEcclesiaActivate); + + // ritual + AddExecutor(ExecutorType.Activate, CardId.DogmatikaMatrix, DogmatikaMatrixActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaLamity, DogmatikaLamityActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaMacabre, DogmatikaMacabreActivate); + + // other + AddExecutor(ExecutorType.Activate, CardId.DogmatikaFleurdelis, DogmatikaFleurdelisActivateDelay); + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.Summon, SummonForTYPHONCheck); + AddExecutor(ExecutorType.SpSummon, CardId.DiabellstarTheBlackWitch, DiabellstarTheBlackWitchSpSummon); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaLamity, DogmatikaLamityDelayActivate); + AddExecutor(ExecutorType.SpSummon, CardId.SuperStarslayerTYPHON, SuperStarslayerTYPHONSpSummon); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeDogmatika = 0x145; + const int hintTimingMainEnd = 0x4; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.DogmatikaEcclesia, _CardId.AshBlossom, _CardId.MaxxC, CardId.KnightmareCorruptorIblee, CardId.NadirServant, + CardId.WANTED_SeekerOfSinfulSpoils, CardId.DogmatikaMatrix, _CardId.InfiniteImpermanence, CardId.DogmatikaPunishment }}, + {2, new List { CardId.DogmatikaAlbaZoa, CardId.DogmatikaFleurdelis, _CardId.CalledByTheGrave }}, + {1, new List { CardId.ThesIrisSwordsoul, CardId.DogmatikaMaximus, CardId.DiabellstarTheBlackWitch, CardId.DogmatikaLamity, CardId.DogmatikaMacabre, + CardId.SinfulSpoilsOfDoom_Rciela, CardId.CrossoutDesignator }}, + }; + List notToNegateIdList = new List{ + 58699500, 20343502 + }; + List discardEnemyExtraIdList = new List{ + _CardId.DivineArsenalAAZEUS_SkyThunder, CardId.SuperStarslayerTYPHON, CardId.SPLittleKnight, CardId.Number41BagooskatheTerriblyTiredTapir, + 70534340, 60465049, 24094258, 86066372 + }; + + Dictionary calledbytheGraveCount = new Dictionary(); + List CrossoutDesignatorTargetList = new List(); + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + List infiniteImpermanenceList = new List(); + bool summoned = false; + List activatedCardIdList = new List(); + List currentNegateMonsterList = new List(); + List currentDestroyCardList = new List(); + List discardExtraThisTurn = new List(); + int banSpSummonFromExTurn = 0; + List activatedMatrixList = new List(); + List maximusDiscardExtraIdList = new List(); + bool checkedEnemyExtra = false; + bool matrixActivating = false; + bool avoid2Monster = true; + bool confirmLink2 = false; + int omegaActivateCount = 0; + int dimensionShifterCount = 0; + + int enemySpSummonFromExLastTurn = 0; + int enemySpSummonFromExThisTurn = 0; + bool enemySpSummonFromDeck = false; + bool enemySpSummonFromExtra = false; + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + ClientCard tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public void UpdateBanSpSummonFromExTurn(int newTurn) + { + if (Duel.Player == 1) newTurn -= 1; + banSpSummonFromExTurn = Math.Max(banSpSummonFromExTurn, newTurn); + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false) + { + List floodagateList = Enemy.GetMonsters().Where(c => c?.Data != null && + c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget()) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).ToList(); + if (floodagateList.Count() > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + return floodagateList[0]; + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget()) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).ToList(); + if (dangerList.Count() > 0) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + return dangerList[0]; + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget()) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).ToList(); + if (invincibleList.Count() > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + return invincibleList[0]; + } + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + List betterList = Enemy.MonsterZone.GetMonsters() + .Where(card => card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && (!canBeTarget || !card.IsShouldNotBeTarget()) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + if (betterList.Count() > 0) + { + betterList.Sort(CardContainer.CompareCardAttack); + betterList.Reverse(); + return betterList[0]; + } + } + return null; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreNormalSpell = false) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count() > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + resultList.AddRange(floodagateList); + } + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count() > 0) + { + resultList.AddRange(ShuffleCardList(problemEnemySpellList)); + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count() > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + resultList.AddRange(dangerList); + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count() > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + resultList.AddRange(invincibleList); + } + + List enemyMonsters = Enemy.GetMonsters().ToList(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach(ClientCard target in enemyMonsters) + { + if (target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2) ) + { + if (!canBeTarget || !(target.IsShouldNotBeTarget() || target.IsShouldNotBeMonsterTarget())) + { + if (!resultList.Contains(target)) + { + resultList.Add(target); + } + } + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous)).ToList(); + if (spells.Count() > 0 && !ignoreNormalSpell) + { + resultList.AddRange(ShuffleCardList(spells)); + } + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false, bool ignoreCurrentDestroy = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget, ignoreCurrentDestroy); + if (card != null) + return card; + + card = Enemy.MonsterZone.Where(c => c?.Data != null && c.HasType(CardType.Monster) && c.IsFaceup() + && !(canBeTarget && c.IsShouldNotBeTarget()) && (!ignoreCurrentDestroy || currentDestroyCardList.Contains(c))) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + if (card != null) + return card; + + List monsters = Enemy.GetMonsters().Where(c => !ignoreCurrentDestroy || currentDestroyCardList.Contains(c)).ToList(); + + // after GetHighestAttackMonster, the left monsters must be face-down. + if (monsters.Count() > 0 && !onlyFaceup) + return ShuffleCardList(monsters)[0]; + + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count() > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && + ecard.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous)).ToList(); + if (faceUpList.Count() > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count() > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + if (checkGrave && Enemy.Graveyard.Count() > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count() > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + + /// + /// check enemy's dangerous card in grave + /// + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, 9411399, 28954097, 30680659, CardId.PSYFramelordOmega + }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool targetKnightmare = true, bool ignoreCurrentDestroy = false) + { + List targetList = GetProblematicEnemyCardList(canBeTarget); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && !card.IsCode(CardId.KnightmareCorruptorIblee) && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleCardList(Enemy.GetSpells().Where(card => !ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)).ToList())); + targetList.AddRange(ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + if (targetKnightmare) + { + List enemyKnightmare = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) && card.IsCode(CardId.KnightmareCorruptorIblee) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + targetList.AddRange(enemyKnightmare); + } + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeMonsterTarget = false, bool canBeTrapTarget = false) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && (!canBeMonsterTarget || !card.IsShouldNotBeMonsterTarget()) && (!canBeTrapTarget || !card.IsShouldNotBeSpellTrapTarget()) + && !currentNegateMonsterList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && (!canBeMonsterTarget || !chainingCard.IsShouldNotBeMonsterTarget()) && (!canBeTrapTarget || !chainingCard.IsShouldNotBeSpellTrapTarget()) + && !chainingCard.IsShouldNotBeTarget() && !currentNegateMonsterList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + /// + /// Get ritual monster/spell's ids that need to search, in order to perform ritual summon. + /// + public List GetNeedSearchRitualCardIdList() + { + List result = new List(); + + bool canSearchAlbaZoa = !Bot.HasInHand(CardId.DogmatikaAlbaZoa) && CheckRemainInDeck(CardId.DogmatikaAlbaZoa) > 0; + int totalLevelInGY = Bot.Graveyard.Where(card => card != null && card.HasType(CardType.Fusion | CardType.Synchro)).Sum(c => (int?)c.Level ?? 0); + + bool needSearchAlbaZoa = Bot.HasInHandOrInSpellZone(CardId.DogmatikaLamity) && Bot.HasInExtra(CardId.DespianLuluwalilith) && canSearchAlbaZoa; + if (Bot.HasInHandOrInGraveyard(CardId.DogmatikaMacabre)) + { + needSearchAlbaZoa |= totalLevelInGY >= 12 && canSearchAlbaZoa; + } + if (needSearchAlbaZoa) + { + result.Add(CardId.DogmatikaAlbaZoa); + } + + if (Bot.HasInHand(CardId.DogmatikaAlbaZoa) && Bot.HasInExtra(CardId.DespianLuluwalilith) && !Bot.HasInHandOrInSpellZone(CardId.DogmatikaLamity) + && CheckRemainInDeck(CardId.DogmatikaLamity) > 0) + { + result.Add(CardId.DogmatikaLamity); + } + + if (Bot.HasInHand(CardId.DogmatikaAlbaZoa) && !Bot.HasInHandOrInSpellZone(CardId.DogmatikaMacabre) && CheckRemainInDeck(CardId.DogmatikaMacabre) > 0 + && totalLevelInGY >= 12) + { + result.Add(CardId.DogmatikaMacabre); + } + + return result; + } + + public ClientCard GetExtraToDiscard(int baseAtk = 0, ClientCard avoidDestroyEnemyCard = null) + { + ClientCard selectResult = null; + // Ntss + if (baseAtk <= 2500 && Bot.HasInExtra(CardId.ElderEntityNtss) && CheckCalledbytheGrave(CardId.ElderEntityNtss) == 0) + { + List destroyList = GetNormalEnemyTargetList(true, false); + if (destroyList.Count() > 0) + { + if (!(destroyList.Count() == 1 && destroyList[0] == avoidDestroyEnemyCard)) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ElderEntityNtss)); + if (selectResult != null) + { + return selectResult; + } + } + } + } + + // Garura + if (baseAtk <= 1500 && Bot.HasInExtra(CardId.GaruraWingsOfResonantLife) && CheckCalledbytheGrave(CardId.GaruraWingsOfResonantLife) == 0 + && !activatedCardIdList.Contains(CardId.GaruraWingsOfResonantLife) && !enemyActivateLockBird) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.GaruraWingsOfResonantLife)); + if (selectResult != null) + { + return selectResult; + } + } + + // Ash Dragon + if (baseAtk <= 2500 && Bot.HasInExtra(CardId.TitanikladTheAshDragon) && CheckCalledbytheGrave(CardId.TitanikladTheAshDragon) == 0 + && !discardExtraThisTurn.Contains(CardId.TitanikladTheAshDragon) && !enemyActivateLockBird) + { + bool successFlag = !activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0; + successFlag |= Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)) && !Bot.HasInHand(CardId.DogmatikaFleurdelis) && CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0; + if (successFlag) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.TitanikladTheAshDragon)); + if (selectResult != null) + { + return selectResult; + } + } + } + + // dusk dragon + if (baseAtk <= 2500 && Bot.HasInExtra(CardId.GranguignolTheDuskDragon)) + { + bool successFlag = Bot.HasInExtra(CardId.DespianLuluwalilith); + successFlag |= CheckRemainInDeck(CardId.DogmatikaEcclesia, CardId.DogmatikaFleurdelis, CardId.DogmatikaMaximus) > 0; + if (successFlag) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.GranguignolTheDuskDragon)); + if (selectResult != null) + { + return selectResult; + } + } + } + + if (baseAtk <= 600 && Bot.HasInExtra(CardId.HeraldOfTheArcLight) && !enemyActivateLockBird) + { + if (GetNeedSearchRitualCardIdList().Count() > 0) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.HeraldOfTheArcLight)); + if (selectResult != null) + { + return selectResult; + } + } + } + + if (baseAtk <= 2800 && Bot.HasInExtra(CardId.PSYFramelordOmega)) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.PSYFramelordOmega)); + if (selectResult != null) + { + return selectResult; + } + } + + List discardableList = Bot.ExtraDeck.Where(card => card != null && card.Attack >= baseAtk).ToList(); + if (discardableList.Count() > 0) + { + discardableList.Sort(CardContainer.CompareCardAttack); + return discardableList[0]; + } + + return selectResult; + } + + /// + /// Check whether negate opposite's effect and clear flag + /// + public void CheckDeactiveFlag() + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && Duel.LastChainPlayer == 1) + { + if (lastChainCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = false; + if (lastChainCard.IsCode(_CardId.LockBird)) enemyActivateLockBird = false; + if (lastChainCard.IsCode(CardId.DimensionShifter)) dimensionShifterCount = 0; + if (lastChainCard.IsCode(_CardId.CalledByTheGrave) && !CrossoutDesignatorTargetList.Contains(_CardId.CalledByTheGrave)) + { + foreach (ClientCard target in Duel.LastChainTargets) + { + if (target.IsMonster() && target.Controller == 0 && target.Location == CardLocation.Grave) + { + calledbytheGraveCount[target.Id] = 0; + } + } + } + if (lastChainCard.Controller == 1 && lastChainCard.Location == CardLocation.MonsterZone) + { + currentNegateMonsterList.Add(lastChainCard); + } + } + } + + /// + /// Check negated turn count of id + /// + public int CheckCalledbytheGrave(int id) + { + if (!calledbytheGraveCount.ContainsKey(id)) + { + return 0; + } + return calledbytheGraveCount[id]; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + public int CheckRemainInDeck(params int[] ids) + { + int sumResult = 0; + foreach (int id in ids) + { + sumResult += CheckRemainInDeck(id); + } + + return sumResult; + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap()) + { + if (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true)) return true; + } + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) { + return true; + } + } + // how to get here? + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false) + { + if ((Card.IsSpell() || Card.IsTrap()) && CheckSpellWillBeNegate()){ + return true; + } + if (CheckCalledbytheGrave(Card.Id) > 0 || CrossoutDesignatorTargetList.Contains(Card.Id)){ + return true; + } + if (Card.IsMonster() && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if (toFieldCheck || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) + { + return true; + } + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true, true)) + { + return true; + } + } + if (disablecheck){ + return Card.IsDisabled(); + } + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { CardId.BanisheroftheRadiance, CardId.BanisheroftheLight, CardId.MacroCosmos, CardId.DimensionalFissure }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true) || cf.HasInSpellZone(cardid, true)) + { + return true; + } + } + } + return false; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && + (!Bot.GetMonsters().Any(card => card.IsFaceup() && !card.IsCode(CardId.KnightmareCorruptorIblee)) || (Duel.Player == 0 && Duel.Turn == 1))) + { + return true; + } + return false; + } + + public bool CheckShouldNoMoreSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + bool successFlag = false; + successFlag |= Bot.HasInHandOrInSpellZone(CardId.DogmatikaPunishment); + successFlag |= Bot.GetMonsters().Any(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster)); + successFlag |= Bot.HasInHand(CardId.DogmatikaFleurdelis) + && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)); + return successFlag; + } + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (lastcard.IsCode(_CardId.LockBird)) + { + bool needToSearch = false; + List searchEffectIdList = new List{ CardId.DogmatikaEcclesia, CardId.NadirServant }; + foreach (int checkId in searchEffectIdList) + { + if (Bot.HasInHandOrInSpellZone(checkId) && !activatedCardIdList.Contains(checkId)) needToSearch = true; + } + if (discardExtraThisTurn.Contains(CardId.TitanikladTheAshDragon)) needToSearch = true; + + if (!needToSearch) return false; + } + + return true; + } + + public bool CheckHasExtraOnField() + { + List fieldMonsterList = Bot.GetMonsters(); + fieldMonsterList.AddRange(Enemy.GetMonsters()); + bool hasExtraOnField = fieldMonsterList.Any(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + return hasExtraOnField; + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + public override int OnSelectOption(IList options) + { + // override for iris + List checkOptionList = new List{Util.GetStringId(CardId.ThesIrisSwordsoul, 4), Util.GetStringId(CardId.ThesIrisSwordsoul, 2)}; + foreach (int checkOption in checkOptionList) + { + for (int i = 0; i < options.Count(); ++ i) + { + if (options[i] == checkOption) return i; + } + } + return base.OnSelectOption(options); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (!cardData.HasType(CardType.Ritual) || cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } else if (cardData.HasType(CardType.Ritual)) + { + return CardPosition.FaceUpAttack; + } + int cardAttack = cardData.Attack; + if (cardId == CardId.DogmatikaFleurdelis && !activatedCardIdList.Contains(cardId + 1)) cardAttack += 500; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (Util.ChainContainPlayer(1) && hint == HintMsg.Remove && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int botCount = Bot.GetMonsterCount() + Bot.GetSpellCount(); + int oppositeCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (botCount - oppositeCount == min && min == max) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // non-ritual monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List nonSynchroMonsters = botMonsters.Where(card => !card.HasType(CardType.Ritual) && !banishList.Contains(card)).ToList(); + nonSynchroMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(nonSynchroMonsters); + + // spells + List spells = Bot.GetSpells(); + banishList.AddRange(ShuffleCardList(spells)); + + // ritual monster + List synchroMonsters = botMonsters.Where(card => card.HasType(CardType.Ritual) && !banishList.Contains(card)).ToList(); + synchroMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(synchroMonsters); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + } + if (maximusDiscardExtraIdList.Count() > 0 && min == 1 && max == 1 && hint == HintMsg.ToGrave) + { + List discardList = new List(); + foreach (int checkId in maximusDiscardExtraIdList) + { + ClientCard discardTarget = cards.FirstOrDefault(card => card.IsCode(checkId)); + if (discardTarget != null) discardList.Add(discardTarget); + } + if (discardList.Count() >= max) + { + if (discardList.Count() > 0) discardExtraThisTurn.Add(discardList[0]?.Id ?? 0); + return Util.CheckSelectCount(discardList, cards, min, max); + } + } + if (matrixActivating && hint == HintMsg.ToGrave && min == 1 && max == 1) + { + bool extraFlag = true; + // 0=not yet, 1=only bot, 2=only enemy, 3=mixed & skip + int enemyFlag = 0; + foreach (ClientCard card in cards) + { + extraFlag &= card.Location == CardLocation.Extra; + if (enemyFlag == 0) enemyFlag = card.Controller + 1; + else if (enemyFlag < 3 && enemyFlag != card.Controller + 1) enemyFlag = 3; + } + Logger.DebugWriteLine("===Matrix: extraFlag = " + extraFlag.ToString() + ", enemyFlag = " + enemyFlag.ToString()); + if (extraFlag && enemyFlag < 3) + { + List discardList = new List(); + // discard bot's extra + if (enemyFlag == 1) + { + ClientCard elder = null; + ClientCard ashDragon = null; + ClientCard garura = null; + ClientCard arcLight = null; + ClientCard psy = null; + ClientCard duskDragon = null; + ClientCard lilith = null; + foreach (ClientCard card in cards) + { + if (card.Id == CardId.ElderEntityNtss) elder = card; + if (card.Id == CardId.TitanikladTheAshDragon) ashDragon = card; + if (card.Id == CardId.GaruraWingsOfResonantLife) garura = card; + if (card.Id == CardId.HeraldOfTheArcLight) arcLight = card; + if (card.Id == CardId.PSYFramelordOmega) psy = card; + if (card.Id == CardId.GranguignolTheDuskDragon) duskDragon = card; + if (card.Id == CardId.DespianLuluwalilith) lilith = card; + } + + List destroyList = GetNormalEnemyTargetList(true, true, true); + if (elder != null && destroyList.Count() > 0) discardList.Add(elder); + if (ashDragon != null && !activatedCardIdList.Contains(CardId.TitanikladTheAshDragon) && !discardEnemyExtraIdList.Contains(CardId.TitanikladTheAshDragon)) + { + bool checkFlag = !activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0 + && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0; + checkFlag |= CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0 && !Bot.HasInHand(CardId.DogmatikaFleurdelis) && !enemyActivateLockBird; + if (checkFlag) discardList.Add(ashDragon); + } + if (garura != null && !activatedCardIdList.Contains(CardId.GaruraWingsOfResonantLife) && !enemyActivateLockBird) discardList.Add(garura); + if (arcLight != null && GetNeedSearchRitualCardIdList().Count() > 0) discardList.Add(arcLight); + if (psy != null) discardList.Add(psy); + if (duskDragon != null) discardList.Add(duskDragon); + if (lilith != null && !activatedCardIdList.Contains(CardId.DespianLuluwalilith) && !discardEnemyExtraIdList.Contains(CardId.DespianLuluwalilith)) + { + discardList.Add(lilith); + } + + if (discardList.Count() > 0) discardExtraThisTurn.Add(discardList[0]?.Id ?? 0); + } + // discard enemy's extra + if (enemyFlag == 2) + { + checkedEnemyExtra = true; + avoid2Monster = false; + confirmLink2 = false; + List discardIfKnightmare = new List{ 96380700, 48068378, 14812471, 32995276, 30342076, CardId.Linguriboh, 3679218 }; + foreach (ClientCard card in cards) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(card.Id); + if (cardData != null) + { + confirmLink2 |= cardData.HasType(CardType.Link) && cardData.Level <= 2; + avoid2Monster |= (cardData.HasType(CardType.Link) && cardData.Level <= 2) || cardData.HasType(CardType.Synchro | CardType.Xyz); + if (Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee)) + { + if (discardIfKnightmare.Contains(card.Id)) discardList.Add(card); + } + } + } + discardList = ShuffleCardList(discardList); + + // avoid link summon + foreach (ClientCard card in cards) + { + if (discardList.Contains(card)) continue; + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(card.Id); + if (cardData != null && Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee) + && cardData.HasType(CardType.Link) && cardData.Level <= Enemy.GetMonsterCount()) + { + discardList.Add(card); + } + } + + // discard important card + foreach (ClientCard card in cards) + { + if (discardList.Contains(card)) continue; + if (discardEnemyExtraIdList.Contains(card.Id)) discardList.Add(card); + } + + // discard single card first + List singleCardList = new List(); + List multiCardList = new List(); + foreach (ClientCard card in cards) + { + if (discardList.Contains(card)) continue; + if (cards.Any(oc => card != oc && card.IsCode(oc.Id))) multiCardList.Add(card); + else singleCardList.Add(card); + } + + discardList.AddRange(singleCardList.OrderByDescending(c => { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(c.Id); + return cardData?.Attack ?? 0; + })); + discardList.AddRange(multiCardList.OrderByDescending(c => { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(c.Id); + return cardData?.Attack ?? 0; + })); + } + + if (discardList.Count() > 0) return Util.CheckSelectCount(discardList, cards, min, max); + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override void OnNewTurn() + { + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + omegaActivateCount = 0; + enemySpSummonFromExLastTurn = enemySpSummonFromExThisTurn; + enemySpSummonFromExThisTurn = 0; + + List keyList = calledbytheGraveCount.Keys.ToList(); + foreach (int dic in keyList) + { + if (calledbytheGraveCount[dic] > 1) + { + calledbytheGraveCount[dic] -= 1; + } + } + if (dimensionShifterCount > 0) dimensionShifterCount--; + CrossoutDesignatorTargetList.Clear(); + infiniteImpermanenceList.Clear(); + + summoned = false; + activatedCardIdList.Clear(); + discardExtraThisTurn.Clear(); + activatedMatrixList.Clear(); + if (Duel.Player == 1 && banSpSummonFromExTurn > 0) + { + banSpSummonFromExTurn -= 1; + } + } + + public override void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (previousControler == 1 && currentLocation == (int)CardLocation.MonsterZone) + { + if (previousLocation == (int)CardLocation.Deck) enemySpSummonFromDeck = true; + if (previousLocation == (int)CardLocation.Extra) + { + enemySpSummonFromExtra = true; + enemySpSummonFromExThisTurn ++; + } + } + + base.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); + } + + public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) + { + if (!defender.IsMonsterHasPreventActivationEffectInBattle()) + { + if (!activatedCardIdList.Contains(CardId.DogmatikaFleurdelis + 1) && Bot.HasInMonstersZone(CardId.DogmatikaFleurdelis, true, false, true) + && attacker.HasSetcode(SetcodeDogmatika)) + { + attacker.RealPower += 500; + } + } + return base.OnPreBattleBetween(attacker, defender); + } + + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.MaxxC) && CheckCalledbytheGrave(_CardId.MaxxC) == 0 && !CrossoutDesignatorTargetList.Contains(_CardId.MaxxC)) + { + enemyActivateMaxxC = true; + } + if (card.IsCode(_CardId.LockBird) && CheckCalledbytheGrave(_CardId.LockBird) == 0 && !CrossoutDesignatorTargetList.Contains(_CardId.LockBird)) + { + enemyActivateLockBird = true; + } + if (card.IsCode(CardId.DimensionShifter) && CheckCalledbytheGrave(CardId.DimensionShifter) == 0 && !CrossoutDesignatorTargetList.Contains(CardId.DimensionShifter)) + { + dimensionShifterCount = 2; + } + if (card.IsCode(_CardId.InfiniteImpermanence) && !CrossoutDesignatorTargetList.Contains(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + Logger.DebugWriteLine("Enemy activate InfiniteImpermanence at " + i.ToString()); + infiniteImpermanenceList.Add(4-i); + break; + } + } + } + if (card.IsCode(_CardId.CalledByTheGrave) && !CrossoutDesignatorTargetList.Contains(_CardId.CalledByTheGrave)) + { + foreach (ClientCard target in Duel.LastChainTargets) + { + if (target.IsMonster() && target.Controller == 0 && target.Location == CardLocation.Grave) + { + calledbytheGraveCount[target.Id] = 2; + } + } + } + } + base.OnChaining(player, card); + } + + public override void OnChainEnd() + { + currentNegateMonsterList.Clear(); + currentDestroyCardList.Clear(); + maximusDiscardExtraIdList.Clear(); + matrixActivating = false; + base.OnChainEnd(); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool DogmatikaAlbaZoaActivate() + { + if (CheckWhetherNegated()) return false; + if (Enemy.GetMonsters().Any(card => card != null && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) + && Duel.Phase == DuelPhase.Main1 && Enemy.ExtraDeck.Count() > 1) + { + return false; + } + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool ThesIrisSwordsoulActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.Hand) + { + if (CheckShouldNoMoreSpSummon()) + { + return false; + } + return true; + } + if (enemySpSummonFromDeck || enemySpSummonFromExtra) return true; + + return false; + } + + public bool ClearIrisFlag() + { + enemySpSummonFromDeck = false; + enemySpSummonFromExtra = false; + + return false; + } + + public bool DogmatikaFleurdelisActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.Hand) + { + bool canNegate = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)) && Enemy.GetMonsters().Any(card => card.IsFaceup()); + if (canNegate) + { + // for negate effect + List shouldNegateList = GetMonsterListForTargetNegate(true); + if (shouldNegateList.Count() > 0) + { + ClientCard target = shouldNegateList[0]; + currentNegateMonsterList.Add(target); + AI.SelectYesNo(true); + AI.SelectCard(target); + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + return true; + } + // for iris + if (Bot.HasInHand(CardId.ThesIrisSwordsoul)) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectYesNo(true); + AI.SelectCard(target); + } else { + List enemyTargetList = ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsDisabled()).ToList()); + if (enemyTargetList.Count() > 0) + { + AI.SelectYesNo(true); + AI.SelectCard(enemyTargetList); + } else AI.SelectYesNo(false); + } + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + return true; + } + } + // for total attack + if (Duel.Player == 0 && Enemy.GetMonsterCount() == 0) { + int totalAttack = Util.GetTotalAttackingMonsterAttack(0); + if (totalAttack < Enemy.LifePoints) + { + totalAttack += Bot.GetMonsters().Where(card => card.HasSetcode(SetcodeDogmatika)).Count() * 500 + 3000; + if (totalAttack >= Enemy.LifePoints) + { + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + AI.SelectYesNo(false); + return true; + } + } + } + // for avoid lose + if (Duel.Player == 1 && Bot.GetMonsterCount() == 0 && Util.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints + && Duel.Phase == DuelPhase.Main1 && (CurrentTiming & hintTimingMainEnd) != 0) + { + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + List enemyTargetList = ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsDisabled()).ToList()); + if (enemyTargetList.Count() > 0) + { + AI.SelectYesNo(true); + AI.SelectCard(enemyTargetList); + } + else + { + AI.SelectYesNo(false); + } + return true; + } + } + if (Card.Location == CardLocation.MonsterZone) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool DogmatikaFleurdelisActivateDelay() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.Hand) + { + bool checkFlag = false; + if (Duel.Player == 0 && Duel.Phase == DuelPhase.Main1) + { + int attack = Util.GetBestAttack(Bot); + List currentBetterList = Enemy.MonsterZone.GetMonsters().Where(card => card.GetDefensePower() >= attack).ToList(); + List newBetterList = Enemy.MonsterZone.GetMonsters().Where(card => card.GetDefensePower() >= 3000).ToList(); + if (currentBetterList.Count() > newBetterList.Count()) checkFlag = true; + } + if ((Bot.HasInHandOrInSpellZone(CardId.SinfulSpoilsOfDoom_Rciela) && Duel.Player == 0) + || Bot.GetSpells().Any(card => card.IsCode(CardId.SinfulSpoilsOfDoom_Rciela) && card.IsFacedown())) + { + if (!Bot.GetMonsters().Any(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster))) checkFlag = true; + } + if (checkFlag) + { + List enemyTargetList = ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsDisabled()).ToList()); + if (enemyTargetList.Count() > 0) + { + AI.SelectYesNo(true); + AI.SelectCard(enemyTargetList); + } + else AI.SelectYesNo(false); + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + return true; + } + } + return false; + } + + public bool DogmatikaMaximusActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.Hand) + { + if (CheckShouldNoMoreSpSummon()) return false; + // banish dump extra + List dumpIdCheck = new List{ CardId.ElderEntityNtss, CardId.GaruraWingsOfResonantLife, CardId.DespianLuluwalilith }; + foreach (int dumpId in dumpIdCheck) + { + IEnumerable checkList = Bot.GetGraveyardMonsters().Where(card => card.IsCode(dumpId)); + if (checkList.Count() > 1) + { + IEnumerable notSummonList = checkList.Where(card => card.ProcCompleted == 0); + if (notSummonList.Count() > 0) + { + AI.SelectCard(notSummonList.ToList()); + return true; + } + AI.SelectCard(checkList.ToList()); + return true; + } + } + + // find not summoned card + List notSummonedList = ShuffleCardList(Bot.Graveyard.Where(card => card != null && card.IsMonster() && card.ProcCompleted == 0 + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).ToList()); + if (notSummonedList.Count() > 0) + { + AI.SelectCard(notSummonedList); + return true; + } + + // sort by attack + List graveTargetList = Bot.Graveyard.Where(card => card != null && card.IsMonster() + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).OrderBy(card => card.Attack).ToList(); + if (graveTargetList.Count() > 0) + { + AI.SelectCard(graveTargetList); + return true; + } + } + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherWillbeRemoved()) return false; + List decidedToDiscard = new List(); + List checkDiscardIdList = new List{ CardId.ElderEntityNtss, CardId.HeraldOfTheArcLight, CardId.GaruraWingsOfResonantLife, + CardId.TitanikladTheAshDragon, CardId.GranguignolTheDuskDragon, CardId.PSYFramelordOmega, CardId.DespianLuluwalilith }; + foreach (int checkId in checkDiscardIdList) + { + if (Bot.HasInExtra(checkId) && !discardExtraThisTurn.Contains(checkId) && !activatedCardIdList.Contains(checkId)) + { + if (checkId == CardId.ElderEntityNtss) + { + List destroyList = GetNormalEnemyTargetList(true, false); + if (destroyList.Count() == 0) continue; + } + if (enemyActivateLockBird && (checkId == CardId.HeraldOfTheArcLight || checkId == CardId.GaruraWingsOfResonantLife)) + { + continue; + } + if (checkId == CardId.HeraldOfTheArcLight) + { + if (Bot.HasInMonstersZone(CardId.DogmatikaAlbaZoa)) continue; + if (GetNeedSearchRitualCardIdList().Count() == 0) continue; + } + if (checkId == CardId.GaruraWingsOfResonantLife && activatedCardIdList.Contains(CardId.GaruraWingsOfResonantLife)) + { + continue; + } + if (discardExtraThisTurn.Contains(checkId) && (checkId == CardId.TitanikladTheAshDragon || checkId == CardId.DespianLuluwalilith)) + { + continue; + } + decidedToDiscard.Add(checkId); + } + } + + maximusDiscardExtraIdList.AddRange(decidedToDiscard); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + + return false; + } + + public bool DiabellstarTheBlackWitchSpSummon() + { + bool hasEmptyMonsterZone = false; + for (int i = 0; i < 5; ++ i) + { + if (Bot.MonsterZone[i] == null) + { + hasEmptyMonsterZone = true; + break; + } + } + if (hasEmptyMonsterZone) + { + if (Bot.HasInHandOrInSpellZone(CardId.WANTED_SeekerOfSinfulSpoils)) + { + AI.SelectCard(CardId.WANTED_SeekerOfSinfulSpoils); + return true; + } + if (activatedMatrixList.Count() > 0) + { + AI.SelectCard(activatedMatrixList); + return true; + } + if (Bot.GetSpells().Where(card => card.IsCode(CardId.DogmatikaMatrix)).Count() > 1) + { + AI.SelectCard(CardId.DogmatikaMatrix); + return true; + } + } + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) || Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)).Count() > 1) + { + List checkIdList = new List{ CardId.DogmatikaEcclesia, CardId.DogmatikaMaximus}; + foreach (int checkId in checkIdList) + { + ClientCard costMonster = null; + if (activatedCardIdList.Contains(checkId)) costMonster = Bot.GetMonsters().FirstOrDefault(card => card.IsCode(checkId)); + if (costMonster == null) costMonster = Bot.GetMonsters().FirstOrDefault(card => card.IsCode(checkId) && card.IsDisabled()); + if (costMonster != null) + { + AI.SelectCard(costMonster); + return true; + } + } + } + if (hasEmptyMonsterZone) + { + List checkIdList = new List { CardId.KnightmareCorruptorIblee, CardId.ThesIrisSwordsoul }; + foreach (int checkId in checkIdList) + { + if (Bot.HasInHand(checkId)) + { + AI.SelectCard(checkId); + return true; + } + } + } + List faceDownMonsters = Bot.GetMonsters().Where(card => card.IsFacedown()).OrderBy(card => { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(card.Id); + if (cardData != null) + { + return cardData.Attack; + } + return card.Attack; + }).ToList(); + if (faceDownMonsters.Count() > 0) + { + AI.SelectCard(faceDownMonsters); + return true; + } + if (hasEmptyMonsterZone) + { + if (Bot.HasInHand(CardId.DogmatikaFleurdelis) && Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)).Count() == 0) + { + AI.SelectCard(CardId.DogmatikaFleurdelis); + return true; + } + if (CheckRemainInDeck(CardId.DogmatikaMacabre) > 0) + { + ClientCard albaZoaInHand = Bot.Hand.FirstOrDefault(card => card.IsCode(CardId.DogmatikaAlbaZoa)); + if (albaZoaInHand != null) + { + AI.SelectCard(albaZoaInHand); + return true; + } + } + List dumpIdList = new List{ CardId.DogmatikaPunishment, _CardId.InfiniteImpermanence, _CardId.CalledByTheGrave, _CardId.AshBlossom, _CardId.MaxxC }; + foreach (int dumpId in dumpIdList) + { + int checkCount = Bot.Hand.Where(card => card.IsCode(dumpId)).Count(); + checkCount += Bot.SpellZone.Where(card => card != null && card.IsCode(dumpId)).Count(); + if (checkCount > 1) + { + AI.SelectCard(dumpId); + return true; + } + } + } + if (Bot.GetMonsterCount() == 0) + { + List spellIdList = new List{ _CardId.InfiniteImpermanence, CardId.CrossoutDesignator, CardId.DogmatikaPunishment, _CardId.CalledByTheGrave }; + foreach (int spellId in spellIdList) + { + if (Bot.HasInHandOrInSpellZone(spellId)) + { + AI.SelectCard(spellId); + return true; + } + } + } + + return false; + } + + public bool DiabellstarTheBlackWitchActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.MonsterZone) + { + AI.SelectCard(CardId.SinfulSpoilsOfDoom_Rciela, CardId.WANTED_SeekerOfSinfulSpoils); + SelectSTPlace(); + activatedCardIdList.Add(Card.Id); + return true; + } + + return false; + } + + public bool DogmatikaEcclesiaSummon() + { + if (enemyActivateLockBird) return false; + if (CheckWhetherNegated(true, true)) return false; + if (activatedCardIdList.Contains(Card.Id)) return false; + + summoned = true; + return true; + } + + public bool DogmatikaEcclesiaActivate() + { + if (CheckWhetherNegated(true, true)) return false; + // sp summon + if (Card.Location == CardLocation.Hand) + { + if (CheckShouldNoMoreSpSummon() || activatedCardIdList.Contains(Card.Id)) return false; + if (enemyActivateLockBird) + { + if (Bot.HasInHand(CardId.DogmatikaFleurdelis) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + return true; + } + return false; + } + return true; + } + // search + if (Card.Location == CardLocation.MonsterZone) + { + if ((Duel.Player == 0 && Duel.Phase == DuelPhase.End) || (Duel.Player == 1 && Duel.Phase < DuelPhase.End)) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) && CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0) + { + AI.SelectCard(CardId.DogmatikaFleurdelis); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + } + + // for maxxc + if (CheckAtAdvantage() && enemyActivateMaxxC) + { + List checkIdListFirstPart = new List{ CardId.DogmatikaPunishment, CardId.DogmatikaFleurdelis }; + if (DogmatikaMatrixCanActivate()) + { + checkIdListFirstPart.Add(CardId.DogmatikaMatrix); + } + checkIdListFirstPart.AddRange(new List{ CardId.DogmatikaMaximus, CardId.DogmatikaAlbaZoa, CardId.DogmatikaMacabre, CardId.DogmatikaLamity }); + checkIdListFirstPart.Add(CardId.DogmatikaMatrix); + foreach (int checkId in checkIdListFirstPart) + { + if (!Bot.HasInHandOrInSpellZone(checkId) && CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + } + } + + // search matrix + bool canSearchMatrix = DogmatikaMatrixCanActivate() && !activatedCardIdList.Contains(CardId.DogmatikaMatrix) + && CheckRemainInDeck(CardId.DogmatikaMatrix) > 0 && !Bot.HasInHand(CardId.DogmatikaMatrix); + if (canSearchMatrix && Enemy.GetMonsterCount() > 0) + { + AI.SelectCard(CardId.DogmatikaMatrix); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + + // search for ritual + List needSearchRitualIdList = GetNeedSearchRitualCardIdList(); + bool canSearchMaximus = CheckRemainInDeck(CardId.DogmatikaMaximus) > 0 && !activatedCardIdList.Contains(CardId.DogmatikaMaximus) + && Bot.Graveyard.Where(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).Count() > 0; + if (needSearchRitualIdList.Count() > 0) + { + // matrix + if (canSearchMatrix) + { + AI.SelectCard(CardId.DogmatikaMatrix); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + // maximus + if (canSearchMaximus && Bot.HasInExtra(CardId.HeraldOfTheArcLight)) + { + AI.SelectCard(CardId.DogmatikaMaximus); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + + } + + // search maximus + if (canSearchMaximus) + { + AI.SelectCard(CardId.DogmatikaMaximus); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + + List checkIdListSecondPart = new List{ CardId.DogmatikaPunishment, CardId.DogmatikaFleurdelis }; + if (DogmatikaMatrixCanActivate()) + { + checkIdListSecondPart.Add(CardId.DogmatikaMatrix); + } + checkIdListSecondPart.AddRange(new List{ CardId.DogmatikaMaximus, CardId.DogmatikaAlbaZoa, CardId.DogmatikaMacabre, CardId.DogmatikaLamity }); + checkIdListSecondPart.Add(CardId.DogmatikaMatrix); + foreach (int checkId in checkIdListSecondPart) + { + if (!Bot.HasInHandOrInSpellZone(checkId) && CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + } + } + + return false; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (DefaultAshBlossomAndJoyousSpring()) + { + CheckDeactiveFlag(); + return true; + } + return false; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + if (Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee, true, false, true) && !confirmLink2) return false; + return DefaultMaxxC(); + } + + public bool KnightmareCorruptorIbleeSummon() + { + if (banSpSummonFromExTurn > 0) return false; + if (CheckWhetherWillbeRemoved()) return false; + if (activatedCardIdList.Contains(CardId.KnightmareCorruptorIblee)) return false; + if (Bot.HasInExtra(CardId.SalamangreatAlmiraj) || Bot.HasInExtra(CardId.Linguriboh)) + { + summoned = true; + return true; + } + + if (Bot.HasInExtra(CardId.SPLittleKnight)) + { + // TODO + } + + return false; + } + + public bool KnightmareCorruptorIbleeActivate() + { + if (Util.IsTurn1OrMain2()) return true; + if (Duel.Turn > 1) + { + if (Bot.HasInHand(CardId.DogmatikaMatrix) && DogmatikaMatrixCanActivate()) + { + return true; + } + if (Enemy.GetMonsterCount() > 0) + { + return true; + } + } + return false; + } + + public bool NadirServantActivate() + { + if (CheckWhetherNegated() || CheckWhetherWillbeRemoved()) return false; + ClientCard discardExtra = null; + int searchId = 0; + + // search ecclesia + if (!activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0 && !Bot.HasInHand(CardId.DogmatikaEcclesia)) + { + if (CheckHasExtraOnField() || !summoned) + { + if (Bot.HasInGraveyard(CardId.DogmatikaEcclesia) || CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0) + { + searchId = CardId.DogmatikaEcclesia; + discardExtra = GetExtraToDiscard(1500, null); + } + } + } + + // search maximus + if (searchId == 0 || discardExtra == null) + { + if (!activatedCardIdList.Contains(CardId.DogmatikaMaximus) && CheckCalledbytheGrave(CardId.DogmatikaMaximus) == 0 + && Bot.HasInGraveyard(CardId.DogmatikaMaximus) || CheckRemainInDeck(CardId.DogmatikaMaximus) > 0) + { + searchId = CardId.DogmatikaMaximus; + discardExtra = GetExtraToDiscard(1500, null); + } + } + + // search Fleurdelis + if (searchId == 0 || discardExtra == null) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)) + && Bot.HasInGraveyard(CardId.DogmatikaFleurdelis) || CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0) + { + searchId = CardId.DogmatikaFleurdelis; + discardExtra = GetExtraToDiscard(2500, null); + } + } + + // search ecclesia for next turn + if (searchId == 0 || discardExtra == null) + { + if (Bot.HasInGraveyard(CardId.DogmatikaEcclesia) || CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0) + { + searchId = CardId.DogmatikaEcclesia; + discardExtra = GetExtraToDiscard(1500, null); + } + } + + if (discardExtra != null && searchId > 0) + { + discardExtraThisTurn.Add(discardExtra?.Id ?? 0); + AI.SelectCard(discardExtra); + ClientCard targetInGY = Bot.Graveyard.FirstOrDefault(card => card != null && card.IsCode(searchId)); + if (targetInGY != null) + { + AI.SelectNextCard(targetInGY); + } else { + AI.SelectNextCard(searchId); + } + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool DogmatikaLamityActivate() + { + if (CheckWhetherNegated()) return false; + // use lilith + if (Bot.HasInExtra(CardId.DespianLuluwalilith)) + { + AI.SelectYesNo(true); + AI.SelectCard(CardId.DogmatikaAlbaZoa); + AI.SelectNextCard(CardId.DespianLuluwalilith); + discardExtraThisTurn.Add(CardId.DespianLuluwalilith); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool DogmatikaLamityDelayActivate() + { + if (CheckWhetherNegated() || Bot.HasInExtra(CardId.DespianLuluwalilith)) return false; + if (Bot.HasInMonstersZone(CardId.DogmatikaAlbaZoa, false, false, true)) return false; + List materialList = new List(); + int totalLevel = 0; + List faceDownMonsterList = Bot.GetMonsters().Where(card => !card.HasType(CardType.Xyz) && card.IsFacedown()).OrderByDescending(card => card.Level).ToList(); + foreach (ClientCard faceDownMonster in faceDownMonsterList) + { + materialList.Add(faceDownMonster); + totalLevel += faceDownMonster.Level; + if (totalLevel >= 12) break; + } + + ClientCard handSummonTarget = Bot.Hand.FirstOrDefault(card => card.IsCode(CardId.DogmatikaAlbaZoa)); + if (handSummonTarget == null) return false; + int extraUseCount = 0; + List extraMonsterList = Bot.GetMonsters().Where(card => !card.HasType(CardType.Xyz | CardType.Link) && card.IsFaceup()) + .OrderByDescending(card => card.Level).ToList(); + extraMonsterList.AddRange(Bot.Hand.Where(card => card.IsMonster() && card != handSummonTarget).OrderByDescending(card => card.Level).ToList()); + foreach (ClientCard faceUpMonster in extraMonsterList) + { + if (totalLevel >= 12 || extraUseCount >= 1) break; + materialList.Add(faceUpMonster); + totalLevel += faceUpMonster.Level; + extraUseCount ++; + } + + if (totalLevel >= 12) + { + AI.SelectYesNo(false); + AI.SelectCard(CardId.DogmatikaAlbaZoa); + AI.SelectNextCard(materialList); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool DogmatikaMacabreActivate() + { + if (Bot.HasInMonstersZone(CardId.DogmatikaAlbaZoa)) return false; + if (CheckWhetherNegated()) return false; + List gyMaterialList = Bot.Graveyard.Where(card => card != null && card.HasType(CardType.Fusion | CardType.Synchro)) + .OrderByDescending(card => card.Level).ToList(); + List selectMaterialList = new List(); + int totalLevel = 0; + List checkDiscardThisTurnIdList = new List { CardId.DespianLuluwalilith, CardId.TitanikladTheAshDragon }; + foreach (ClientCard material in gyMaterialList) + { + if (material.IsCode(CardId.PSYFramelordOmega)) continue; + if (CheckAtAdvantage()) + { + foreach (int checkId in checkDiscardThisTurnIdList) + { + if (material.IsCode(checkId) && discardExtraThisTurn.Contains(checkId)) continue; + } + } + totalLevel += material.Level; + selectMaterialList.Add(material); + if (totalLevel >= 12) break; + } + if (totalLevel >= 12) + { + ClientCard graveAlbaZoa = Bot.Graveyard.FirstOrDefault(card => card.IsCode(CardId.DogmatikaAlbaZoa)); + if (graveAlbaZoa != null) + { + AI.SelectCard(graveAlbaZoa); + } else { + AI.SelectCard(CardId.DogmatikaAlbaZoa); + } + AI.SelectMaterials(selectMaterialList, HintMsg.Release); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool SinfulSpoilsOfDoom_RcielaActivate() + { + // select self target + ClientCard selfTarget = null; + bool activateFlag = false; + List selfCasterList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster)) + .OrderByDescending(card => card.Attack).ThenByDescending(card => card.Level).ToList(); + bool onlyAlbaZoa = selfCasterList.Count() == 1 && selfCasterList[0].IsCode(CardId.DogmatikaAlbaZoa); + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.Controller == 1 && lastChainCard.IsMonster()) + { + foreach (ClientCard chainTarget in Duel.LastChainTargets) + { + if (selfCasterList.Contains(chainTarget)) + { + selfTarget = chainTarget; + activateFlag = true; + break; + } + } + } + if (selfTarget == null && !onlyAlbaZoa) + { + selfTarget = selfCasterList.FirstOrDefault(card => !card.IsCode(CardId.DogmatikaAlbaZoa)); + } + if (DefaultOnBecomeTarget() && !onlyAlbaZoa) + { + activateFlag = true; + } + + if (selfTarget != null) + { + int targetAttack = selfTarget.Attack; + // destroy danger monster + ClientCard dangerCard = GetProblematicEnemyMonster(-1, true, true); + if (dangerCard != null) + { + activateFlag = true; + } + + // destroy multi monster + if (!onlyAlbaZoa) + { + List toDestroyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup() + && card.Attack > 0 && card.Attack <= targetAttack && !currentDestroyCardList.Contains(card)).ToList(); + if (toDestroyMonsterList.Count() > 1) + { + activateFlag = true; + currentDestroyCardList.AddRange(toDestroyMonsterList); + } + } + + // decrease attack + if (Bot.UnderAttack && !onlyAlbaZoa && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0)) + { + activateFlag = true; + } + } + + if (activateFlag) + { + SelectSTPlace(null, true); + AI.SelectCard(selfTarget); + return true; + } + + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + // negate + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().Id; + if (code == 0) return false; + if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTargetList.Contains(code)) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + if (Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)) != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + CheckDeactiveFlag(); + return true; + } + } + + // banish target + foreach (ClientCard cards in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(cards) && cards.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = cards.Id; + AI.SelectCard(cards); + calledbytheGraveCount[code] = 2; + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count() > 0) { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + calledbytheGraveCount[code] = 2; + return true; + } + + return false; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + // negate + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + // do not negate black witch + if (code == CardId.DiabellstarTheBlackWitch) return false; + if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTargetList.Contains(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + CrossoutDesignatorTargetList.Add(code); + CheckDeactiveFlag(); + return true; + } + } + return false; + } + + public bool WANTED_SeekerOfSinfulSpoilsActivate() + { + if (Card.Location == CardLocation.Hand || (Card.Location == CardLocation.SpellZone && Card.HasPosition(CardPosition.FaceDown))) + { + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + + return true; + } + + public bool DogmatikaMatrixCanActivate() + { + return CheckRemainInDeck(CardId.DogmatikaAlbaZoa, CardId.DogmatikaLamity, CardId.DogmatikaMacabre) > 0; + } + + public bool DogmatikaMatrixActivate() + { + if (CheckWhetherNegated()) return false; + + // activate for search + if (Card.Location == CardLocation.Hand || (Card.Location == CardLocation.SpellZone && Card.HasPosition(CardPosition.FaceDown))) + { + List neededRitualCardIdList = GetNeedSearchRitualCardIdList(); + // can only search ritual + if (Enemy.GetMonsterCount() == 0) + { + if (!Bot.MonsterZone.Any(card => card != null && card.IsFaceup() && card.HasType(CardType.Ritual) && card.HasSetcode(SetcodeDogmatika)) + && neededRitualCardIdList.Count() <= 0) + { + return false; + } + SelectSTPlace(null, true); + AI.SelectCard(neededRitualCardIdList); + // in case enemy summon monster after activated + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + // can search both + else + { + if (neededRitualCardIdList.Count() <= 0) + { + SelectSTPlace(null, true); + AI.SelectYesNo(true); + // search both monster and spell + if (CheckRemainInDeck(CardId.DogmatikaAlbaZoa) > 0 && CheckRemainInDeck(CardId.DogmatikaLamity, CardId.DogmatikaMacabre) > 0) + { + AI.SelectCard(CardId.DogmatikaAlbaZoa); + AI.SelectNextCard(CardId.DogmatikaLamity, CardId.DogmatikaMacabre); + } + else + { + AI.SelectCard(CardId.DogmatikaAlbaZoa, CardId.DogmatikaLamity, CardId.DogmatikaMacabre); + DogmatikaMatrixNextSearch(); + } + activatedCardIdList.Add(Card.Id); + return true; + } + else + { + SelectSTPlace(null, true); + AI.SelectCard(neededRitualCardIdList); + AI.SelectYesNo(true); + DogmatikaMatrixNextSearch(); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + // discard extra + else + { + int option = 0; + if (CheckWhetherWillbeRemoved()) option = 1; + if (!checkedEnemyExtra && Enemy.ExtraDeck.Count() > 0) option = 1; + if (Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee) && avoid2Monster) option = 1; + if (!Bot.HasInExtra(CardId.ElderEntityNtss) || GetNormalEnemyTargetList(true, false, false).Count() <= 0) + { + List checkActivatedIdList = new List{ CardId.GaruraWingsOfResonantLife, CardId.DespianLuluwalilith, + CardId.TitanikladTheAshDragon, CardId.GranguignolTheDuskDragon, CardId.PSYFramelordOmega }; + bool checkFlag = false; + foreach (int checkId in checkActivatedIdList) + { + checkFlag |= !discardExtraThisTurn.Contains(checkId) && !activatedCardIdList.Contains(checkId) && Bot.HasInExtra(checkId); + } + if (!checkFlag) + { + option = 1; + } + } + + Logger.DebugWriteLine("===Matrix option: " + option.ToString()); + matrixActivating = true; + AI.SelectOption(option); + activatedMatrixList.Add(Card); + return true; + } + } + + public void DogmatikaMatrixNextSearch() + { + List fieldMonsterList = Bot.GetMonsters(); + fieldMonsterList.AddRange(Enemy.GetMonsters()); + bool hasExtraOnField = fieldMonsterList.Any(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + + // search ecclesia + if (!activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0) + { + if (hasExtraOnField || !summoned) + { + if (CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0) + { + AI.SelectNextCard(CardId.DogmatikaEcclesia); + return; + } + } + } + + // seach Maximus + if (CheckRemainInDeck(CardId.DogmatikaMaximus) > 0 && !activatedCardIdList.Contains(CardId.DogmatikaMaximus) + && Bot.Graveyard.Where(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).Count() > 0) + { + AI.SelectNextCard(CardId.DogmatikaMaximus); + return; + } + + // search Fleurdelis + if (CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0 && !Bot.HasInHand(CardId.DogmatikaFleurdelis) && hasExtraOnField + && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + AI.SelectNextCard(CardId.DogmatikaFleurdelis); + return; + } + + List searchIdList = new List{ CardId.DogmatikaPunishment, CardId.DogmatikaEcclesia, CardId.DogmatikaMatrix, + CardId.DogmatikaMaximus, CardId.DogmatikaFleurdelis, CardId.DogmatikaAlbaZoa, CardId.DogmatikaLamity, CardId.DogmatikaMacabre }; + foreach (int searchId in searchIdList) + { + if (CheckRemainInDeck(searchId) > 0) + { + AI.SelectNextCard(searchId); + return; + } + } + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ( (this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + CheckDeactiveFlag(); + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectCard(target); + } else { + AI.SelectCard(Enemy.GetMonsters()); + } + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(false, true); + if (shouldNegateList.Count() > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateMonsterList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++ i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + public bool DogmatikaPunishmentActivate() + { + if (CheckWhetherNegated() || CheckWhetherWillbeRemoved()) return false; + + ClientCard targetCard = null; + ClientCard extraToDiscard = null; + + // destroy problem card by ntss + List targetList = GetProblematicEnemyCardList(true, true); + if (targetList.Count() > 0 && Duel.LastChainPlayer != 0 && Bot.HasInExtra(CardId.ElderEntityNtss)) + { + foreach (ClientCard target in targetList) + { + if (target.IsFaceup() && target.IsMonster() && target.Attack <= 2500) + { + targetCard = target; + extraToDiscard = GetExtraToDiscard(2500, target); + if (extraToDiscard != null) + { + break; + } + } + } + if (targetCard == null || extraToDiscard == null) + { + List enemyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup() + && !card.IsShouldNotBeTarget() && card.IsShouldNotBeSpellTrapTarget()).ToList(); + enemyMonsterList.Sort(CardContainer.CompareCardAttack); + foreach (ClientCard target in enemyMonsterList) + { + if (target.IsFaceup() && target.IsMonster() && target.Attack <= 2500) + { + targetCard = target; + extraToDiscard = GetExtraToDiscard(2500, target); + if (extraToDiscard != null) + { + break; + } + } + } + } + } + + if (targetCard == null || extraToDiscard == null) + { + targetCard = GetProblematicEnemyMonster(0, true, true); + if (targetCard != null) + { + extraToDiscard = GetExtraToDiscard(targetCard.Attack, targetCard); + } + } + + if (targetCard == null || extraToDiscard == null) + { + bool check1 = DefaultOnBecomeTarget(); + bool check2 = Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0); + bool check3 = Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0; + bool check4 = Duel.Player == 1 && avoid2Monster && Enemy.GetMonsterCount() >= 2 && Duel.LastChainPlayer != 0; + Logger.DebugWriteLine("===punishment check flag: " + check1 + " " + check2 + " " + check3 + " " + check4); + if (check1 || check2 || check3 || check4) + { + List checkList = Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsShouldNotBeTarget() && !currentDestroyCardList.Contains(card)) + .OrderByDescending(c => c.Attack).ToList(); + foreach (ClientCard checkTarget in checkList) + { + extraToDiscard = GetExtraToDiscard(checkTarget.Attack, checkTarget); + if (extraToDiscard != null) + { + targetCard = checkTarget; + break; + } + } + } + } + + if (targetCard != null && extraToDiscard != null) + { + AI.SelectCard(targetCard); + AI.SelectNextCard(extraToDiscard); + currentDestroyCardList.Add(targetCard); + discardExtraThisTurn.Add(extraToDiscard?.Id ?? 0); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(2); + return true; + } + + return false; + } + + + public bool GranguignolTheDuskDragonActivate() + { + if (Card.Location == CardLocation.Grave) + { + AI.SelectCard(CardId.DespianLuluwalilith, CardId.DogmatikaEcclesia, CardId.DogmatikaMaximus, CardId.DogmatikaFleurdelis); + return true; + } + return false; + } + + public bool TitanikladTheAshDragonActivate() + { + if (!activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0 && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0) + { + AI.SelectOption(1); + AI.SelectCard(CardId.DogmatikaEcclesia); + return true; + } + if (CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) && !enemyActivateLockBird) + { + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + AI.SelectOption(0); + AI.SelectCard(CardId.DogmatikaFleurdelis); + return true; + } + } + if (Duel.Player == 1 && Enemy.GetMonsterCount() == 0) + { + AI.SelectOption(1); + AI.SelectCard(CardId.DogmatikaFleurdelis); + return true; + } + } + if (CheckRemainInDeck(CardId.DogmatikaMaximus) > 0) + { + AI.SelectOption(1); + AI.SelectCard(CardId.DogmatikaMaximus); + return true; + } + + return false; + } + + public bool GaruraWingsOfResonantLifeActivate() + { + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool ElderEntityNtssActivate() + { + if (Card.Location == CardLocation.Grave) + { + List destroyList = GetNormalEnemyTargetList(true, true, true); + if (destroyList.Count() > 0) + { + currentDestroyCardList.Add(destroyList[0]); + AI.SelectCard(destroyList); + return true; + } + } + + return false; + } + + public bool DespianLuluwalilithActivate() + { + // spsummon + if (Card.Location == CardLocation.Grave) + { + if (!activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0 + && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0 && !enemyActivateLockBird) + { + AI.SelectCard(CardId.DogmatikaEcclesia); + return true; + } + if (CheckRemainInDeck(CardId.ThesIrisSwordsoul) > 0) + { + AI.SelectCard(CardId.ThesIrisSwordsoul); + return true; + } + if (Duel.Turn > 1 && Enemy.GetMonsterCount() == 0 && CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0) + { + AI.SelectCard(CardId.DogmatikaFleurdelis); + return true; + } + if (Bot.HasInHand(CardId.DogmatikaFleurdelis) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + List checkIdList = new List{ CardId.DogmatikaMaximus, CardId.DogmatikaEcclesia, CardId.DogmatikaFleurdelis }; + foreach (int checkId in checkIdList) + { + if (CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + return true; + } + } + } + } + // increase atk & negate + if (Card.Location == CardLocation.MonsterZone) + { + List currentChainEnemyCard = Duel.CurrentChain.Where(card => card.Controller == 1 && !currentNegateMonsterList.Contains(card) + && (card.Location == CardLocation.MonsterZone || card.Location == CardLocation.SpellZone)).ToList(); + currentChainEnemyCard.AddRange(GetProblematicEnemyCardList(false, false)); + currentChainEnemyCard.AddRange(ShuffleCardList(Enemy.GetSpells().Where(card => card.IsFaceup()).ToList())); + currentChainEnemyCard.AddRange(ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup()).ToList())); + if (currentChainEnemyCard.Count() > 0) + { + currentNegateMonsterList.Add(currentChainEnemyCard[0]); + AI.SelectYesNo(true); + AI.SelectCard(currentChainEnemyCard); + } + return true; + } + return false; + } + + public bool PSYFramelordOmegaActivate() + { + if (Card.Location == CardLocation.Grave && omegaActivateCount <= 5) + { + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count() > 0) { + AI.SelectCard(targets); + omegaActivateCount ++; + return true; + } + + List recycleExtraIdList = new List{ CardId.GaruraWingsOfResonantLife, CardId.ElderEntityNtss }; + foreach (int checkId in recycleExtraIdList) + { + if (!Bot.HasInExtra(checkId) && Bot.HasInGraveyard(checkId)) + { + AI.SelectCard(checkId); + omegaActivateCount ++; + return true; + } + } + + List recycleMainIdList = new List{ CardId.DogmatikaMacabre, CardId.DogmatikaLamity, CardId.DogmatikaAlbaZoa, CardId.DogmatikaPunishment, + CardId.DogmatikaEcclesia, CardId.DogmatikaFleurdelis, CardId.DogmatikaMatrix }; + foreach (int checkId in recycleMainIdList) + { + if (CheckRemainInDeck(checkId) <= 0 && Bot.HasInGraveyard(checkId)) + { + AI.SelectCard(checkId); + omegaActivateCount ++; + return true; + } + } + + recycleExtraIdList.AddRange(new List { + CardId.SuperStarslayerTYPHON, CardId.TitanikladTheAshDragon, CardId.HeraldOfTheArcLight, CardId.DespianLuluwalilith, CardId.Linguriboh, + CardId.SalamangreatAlmiraj, CardId.SecureGardna + }); + foreach (int checkId in recycleExtraIdList) + { + if (!Bot.HasInExtra(checkId) && Bot.HasInGraveyard(checkId)) + { + AI.SelectCard(checkId); + omegaActivateCount ++; + return true; + } + } + } + + return false; + } + + public bool HeraldOfTheArcLightActivate() + { + AI.SelectCard(GetNeedSearchRitualCardIdList()); + return true; + } + + public bool SuperStarslayerTYPHONSpSummon() + { + ClientCard material = Bot.GetMonsters().Where(card => card.IsFaceup()).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (material == null || material.Attack >= 3000) return false; + + bool checkFlag = GetProblematicEnemyMonster(material.Attack) != null; + if (checkFlag) + { + AI.SelectMaterials(material); + return true; + } + + return false; + } + + public bool SuperStarslayerTYPHONActivate() + { + List targetList = new List(); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsFloodgate() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsMonsterDangerous() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsMonsterInvincible() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.GetDefensePower() >= Util.GetBestAttack(Bot) && c.IsAttack()).OrderByDescending(card => card.Attack)); + if (Duel.Phase >= DuelPhase.Main2) + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link | CardType.SpSummon)).OrderByDescending(card => card.Attack)); + + if (targetList.Count() > 0) + { + targetList.AddRange(Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).OrderByDescending(card => card.Attack)); + targetList.AddRange(ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFacedown() && !targetList.Contains(card)).ToList())); + targetList.AddRange(ShuffleCardList(Bot.GetMonsters().Where(card => card.IsFacedown() && !targetList.Contains(card)).ToList())); + targetList.AddRange(Bot.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).OrderBy(card => card.Attack)); + AI.SelectCard(Card.Overlays); + AI.SelectNextCard(targetList); + return true; + } + + return false; + } + + public bool SPLittleKnightActivate() + { + // TODO + return false; + } + + public bool SecureGardnaSpSummon() + { + if (Bot.HasInHand(CardId.DogmatikaMaximus)) + { + if (!Bot.Graveyard.Any(card => card.IsMonster() && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link))) + { + return true; + } + } + return false; + } + + public bool LinguribohSpSummon() + { + if (Enemy.GetSpells().Any(card => card.IsFacedown())) return true; + if (!Bot.HasInExtra(CardId.SalamangreatAlmiraj)) return true; + return false; + } + + public bool LinguribohActivate() + { + if (CheckLastChainShouldNegated()) return true; + return false; + } + + public bool SalamangreatAlmirajSpSummon() + { + if (Bot.HasInMonstersZone(CardId.KnightmareCorruptorIblee, faceUp: true)) + { + AI.SelectMaterials(CardId.KnightmareCorruptorIblee); + return true; + } + if (Bot.HasInHand(new List{ CardId.DogmatikaEcclesia, CardId.DogmatikaMaximus, CardId.NadirServant })) + { + List materialList = Bot.MonsterZone.Where(card => card != null && card.IsFaceup() && card.Attack <= 1000 + && !card.HasType(CardType.Ritual | CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).ToList(); + if (materialList.Count() > 0) + { + materialList.Sort(CardContainer.CompareCardAttack); + AI.SelectMaterials(materialList); + return true; + } + } + + return false; + } + + public bool SalamangreatAlmirajActivate() + { + if (Card.Location == CardLocation.Grave) return true; + bool checkFlag = Duel.Player == 1 && (!Bot.HasInHand(CardId.DogmatikaFleurdelis) || activatedCardIdList.Contains(CardId.DogmatikaFleurdelis)); + checkFlag |= DefaultOnBecomeTarget(); + checkFlag |= Bot.UnderAttack && Bot.BattlingMonster == Card; + if (checkFlag) + { + AI.SelectCard(Util.GetBestBotMonster()); + return true; + } + if (!Util.ChainContainsCard(CardId.SinfulSpoilsOfDoom_Rciela)) + { + List checkList = Bot.GetMonsters().Where(card => card.IsFaceup() && card != Card).OrderByDescending(card => card.Attack).ToList(); + checkList.AddRange(Bot.GetMonsters().GetMatchingCards(card => card.IsFacedown())); + foreach (ClientCard card in checkList) + { + if (Util.IsChainTarget(card)) + { + AI.SelectCard(card); + return true; + } + } + } + + return false; + } + + + public bool SummonForTYPHONCheck() + { + if (!Bot.HasInExtra(CardId.SuperStarslayerTYPHON) || Bot.GetMonsters().Any(card => card.IsFaceup()) || banSpSummonFromExTurn > 0) return false; + if (enemySpSummonFromExLastTurn < 2 && enemySpSummonFromExThisTurn < 2) return false; + if (Card.IsCode(CardId.KnightmareCorruptorIblee) && !CheckWhetherNegated(true, true)) return false; + if (Card.Level > 4) return false; + + int currentAttack = 0; + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(Card.Id); + if (cardData != null) currentAttack = cardData.Attack; + List summonList = Bot.Hand.Where(card => card.IsMonster() && card.Level <= 4).ToList(); + foreach (ClientCard checkCard in summonList) + { + cardData = YGOSharp.OCGWrapper.NamedCard.Get(checkCard.Id); + if (cardData != null && cardData.Attack < currentAttack) return false; + } + + return true; + } + + public bool MonsterRepos() + { + int selfAttack = Card.Attack + 1; + int extraAttackForDogmatika = 0; + if (!activatedCardIdList.Contains(CardId.DogmatikaFleurdelis + 1) && Bot.HasInMonstersZone(CardId.DogmatikaFleurdelis, true, false, true)) extraAttackForDogmatika += 500; + if (Card.HasSetcode(SetcodeDogmatika)) + { + selfAttack += extraAttackForDogmatika; + } + + if (Card.IsFaceup() && Card.IsDefense() && selfAttack <= 1) + return false; + + int bestAttack = 0; + foreach (ClientCard card in Bot.GetMonsters()) + { + int attack = card.Attack; + if (card.HasSetcode(SetcodeDogmatika)) + { + attack += extraAttackForDogmatika; + } + if (attack >= bestAttack) + { + bestAttack = attack; + } + } + + bool enemyBetter = Util.IsAllEnemyBetterThanValue(bestAttack, true); + + if (Card.IsAttack() && enemyBetter) + return true; + if (Card.IsDefense() && !enemyBetter && selfAttack >= Card.Defense) + return true; + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + if (Card.IsCode(CardId.DogmatikaPunishment) && Bot.HasInSpellZone(Card.Id)) return false; + if (Card.IsCode(CardId.SinfulSpoilsOfDoom_Rciela)) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster))) + { + return false; + } + } + + // select place + if (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) + { + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + } +} \ No newline at end of file diff --git a/Game/AI/Executor.cs b/Game/AI/Executor.cs index b6a804a89..8750679ce 100644 --- a/Game/AI/Executor.cs +++ b/Game/AI/Executor.cs @@ -113,6 +113,11 @@ public virtual void OnDraw(int player) // Some AI need do something on draw } + public virtual void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + // Some AI need do something on card's moving + } + public virtual IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { // For overriding diff --git a/Game/GameAI.cs b/Game/GameAI.cs index d25a1f838..5af7c349a 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -119,6 +119,11 @@ public void OnNewPhase() Executor.OnNewPhase(); } + public void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + Executor.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); + } + /// /// Called when the AI got attack directly. /// diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index e41527a34..bf1906ad3 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -94,7 +94,7 @@ private void RegisterPackets() _messages.Add(GameMessage.ShuffleHand, OnShuffleHand); _messages.Add(GameMessage.ShuffleExtra, OnShuffleExtra); _messages.Add(GameMessage.ShuffleSetCard, OnShuffleSetCard); - _messages.Add(GameMessage.SwapGraveDeck, OnSwapGraveDeck); + _messages.Add(GameMessage.SwapGraveDeck, OnSwapGraveDeck); _messages.Add(GameMessage.TagSwap, OnTagSwap); _messages.Add(GameMessage.NewTurn, OnNewTurn); _messages.Add(GameMessage.NewPhase, OnNewPhase); @@ -144,6 +144,7 @@ private void RegisterPackets() _messages.Add(GameMessage.SpSummoned, OnSpSummoned); _messages.Add(GameMessage.FlipSummoning, OnSummoning); _messages.Add(GameMessage.FlipSummoned, OnSummoned); + _messages.Add(GameMessage.ConfirmCards, OnConfirmCards); } private void OnJoinGame(BinaryReader packet) @@ -634,6 +635,8 @@ private void OnMove(BinaryReader packet) (CardLocation)previousLocation + " move to " + (CardLocation)currentLocation + ")"); } } + + _ai.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); } private void OnSwap(BinaryReader packet) @@ -955,7 +958,10 @@ private void InternalOnSelectCard(BinaryReader packet, Func, i if (((int)loc & (int)CardLocation.Overlay) != 0) card = new ClientCard(id, CardLocation.Overlay, -1); else + { card = _duel.GetCard(player, loc, seq); + card.Controller = player; + } if (card == null) continue; if (card.Id == 0) card.SetId(id); @@ -1891,5 +1897,22 @@ private void OnSpSummoned(BinaryReader packet) } _duel.SummoningCards.Clear(); } + + private void OnConfirmCards(BinaryReader packet) + { + /*int playerid = */packet.ReadByte(); + int count = packet.ReadByte(); + for (int i = 0; i < count; ++ i) + { + int cardId = packet.ReadInt32(); + int player = GetLocalPlayer(packet.ReadByte()); + int loc = packet.ReadByte(); + int seq = packet.ReadByte(); + ClientCard card = _duel.GetCard(player, (CardLocation)loc, seq); + if (cardId > 0) card.SetId(cardId); + if (_debug) + Logger.WriteLine("(Confirm " + player.ToString() + "'s " + (CardLocation)loc + " card: " + (card.Name ?? "UnKnowCard") + ")"); + } + } } } diff --git a/WindBot.csproj b/WindBot.csproj index b4e228087..f2af022fd 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -83,6 +83,7 @@ + From f0581a879add03bbafc43fa00c4720f4f64da3d0 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Tue, 10 Oct 2023 21:44:37 +0800 Subject: [PATCH 011/110] Fix Dogmatika (#174) --- Game/AI/Decks/DogmatikaExecutor.cs | 88 +++++++++++++++++++++++++----- Game/AI/DefaultExecutor.cs | 10 ++++ Game/ClientCard.cs | 3 + 3 files changed, 87 insertions(+), 14 deletions(-) diff --git a/Game/AI/Decks/DogmatikaExecutor.cs b/Game/AI/Decks/DogmatikaExecutor.cs index 7b231bb62..4b6f5f78d 100644 --- a/Game/AI/Decks/DogmatikaExecutor.cs +++ b/Game/AI/Decks/DogmatikaExecutor.cs @@ -119,7 +119,7 @@ public DogmatikaExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, CardId.DogmatikaMacabre, DogmatikaMacabreActivate); // other - AddExecutor(ExecutorType.Activate, CardId.DogmatikaFleurdelis, DogmatikaFleurdelisActivateDelay); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaFleurdelis, DogmatikaFleurdelisDelayActivate); AddExecutor(ExecutorType.Repos, MonsterRepos); AddExecutor(ExecutorType.Summon, SummonForTYPHONCheck); AddExecutor(ExecutorType.SpSummon, CardId.DiabellstarTheBlackWitch, DiabellstarTheBlackWitchSpSummon); @@ -145,7 +145,7 @@ public DogmatikaExecutor(GameAI ai, Duel duel) 58699500, 20343502 }; List discardEnemyExtraIdList = new List{ - _CardId.DivineArsenalAAZEUS_SkyThunder, CardId.SuperStarslayerTYPHON, CardId.SPLittleKnight, CardId.Number41BagooskatheTerriblyTiredTapir, + _CardId.DivineArsenalAAZEUS_SkyThunder, CardId.SPLittleKnight, CardId.Number41BagooskatheTerriblyTiredTapir, 70534340, 60465049, 24094258, 86066372 }; @@ -803,11 +803,11 @@ public bool CheckLastChainShouldNegated() return true; } - public bool CheckHasExtraOnField() + public bool CheckHasExtraOnField(ClientCard exceptCard = null) { List fieldMonsterList = Bot.GetMonsters(); fieldMonsterList.AddRange(Enemy.GetMonsters()); - bool hasExtraOnField = fieldMonsterList.Any(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + bool hasExtraOnField = fieldMonsterList.Any(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && card != exceptCard); return hasExtraOnField; } @@ -861,7 +861,7 @@ public override CardPosition OnSelectPosition(int cardId, IList po return CardPosition.FaceUpAttack; } int cardAttack = cardData.Attack; - if (cardId == CardId.DogmatikaFleurdelis && !activatedCardIdList.Contains(cardId + 1)) cardAttack += 500; + if (cardId == CardId.DogmatikaFleurdelis && !activatedCardIdList.Contains(cardId + 1) && Duel.Player == 0) cardAttack += 500; int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) { @@ -1042,6 +1042,17 @@ public override IList OnSelectCard(IList cards, int min, public override void OnNewTurn() { + if (Duel.Turn <= 1) + { + calledbytheGraveCount.Clear(); + banSpSummonFromExTurn = 0; + checkedEnemyExtra = false; + avoid2Monster = true; + dimensionShifterCount = 0; + + enemySpSummonFromExLastTurn = 0; + enemySpSummonFromExThisTurn = 0; + } enemyActivateMaxxC = false; enemyActivateLockBird = false; omegaActivateCount = 0; @@ -1085,6 +1096,31 @@ public override void OnMove(int cardId, int previousControler, int previousLocat base.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); } + public override ClientCard OnSelectAttacker(IList attackers, IList defenders) + { + if (attackers.Count() > 0) return attackers[attackers.Count() - 1]; + return null; + } + + public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList defenders) + { + foreach (ClientCard defender in defenders) + { + attacker.RealPower = attacker.Attack; + defender.RealPower = defender.GetDefensePower(); + if (!OnPreBattleBetween(attacker, defender)) + continue; + + if (attacker.RealPower > defender.RealPower) + return AI.Attack(attacker, defender); + } + + if (attacker.CanDirectAttack) + return AI.Attack(attacker, null); + + return null; + } + public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) { if (!defender.IsMonsterHasPreventActivationEffectInBattle()) @@ -1122,7 +1158,6 @@ public override void OnChaining(int player, ClientCard card) { if (Enemy.SpellZone[i] == card) { - Logger.DebugWriteLine("Enemy activate InfiniteImpermanence at " + i.ToString()); infiniteImpermanenceList.Add(4-i); break; } @@ -1159,6 +1194,7 @@ public override void OnChainEnd() /// Whether need to avoid set in this place public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) { + if (card == null) card = Card; List list = new List(); for (int seq = 0; seq < 5; ++seq) { @@ -1289,7 +1325,7 @@ public bool DogmatikaFleurdelisActivate() } // for avoid lose if (Duel.Player == 1 && Bot.GetMonsterCount() == 0 && Util.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints - && Duel.Phase == DuelPhase.Main1 && (CurrentTiming & hintTimingMainEnd) != 0) + && Duel.Phase == DuelPhase.Main1 && (CurrentTiming & hintTimingMainEnd) != 0 && Duel.Turn > 1) { activatedCardIdList.Add(CardId.DogmatikaFleurdelis); List enemyTargetList = ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsDisabled()).ToList()); @@ -1314,20 +1350,22 @@ public bool DogmatikaFleurdelisActivate() return false; } - public bool DogmatikaFleurdelisActivateDelay() + public bool DogmatikaFleurdelisDelayActivate() { if (CheckWhetherNegated()) return false; if (Card.Location == CardLocation.Hand) { bool checkFlag = false; - if (Duel.Player == 0 && Duel.Phase == DuelPhase.Main1) + bool notQuickTiming = Duel.LastChainPlayer == -1 && CurrentTiming <= 0; + if (Duel.Player == 0 && Duel.Phase == DuelPhase.Main1 && notQuickTiming && Duel.Turn > 1) { + Logger.DebugWriteLine("=== timing: " + CurrentTiming.ToString()); int attack = Util.GetBestAttack(Bot); List currentBetterList = Enemy.MonsterZone.GetMonsters().Where(card => card.GetDefensePower() >= attack).ToList(); List newBetterList = Enemy.MonsterZone.GetMonsters().Where(card => card.GetDefensePower() >= 3000).ToList(); if (currentBetterList.Count() > newBetterList.Count()) checkFlag = true; } - if ((Bot.HasInHandOrInSpellZone(CardId.SinfulSpoilsOfDoom_Rciela) && Duel.Player == 0) + if ((Bot.HasInHandOrInSpellZone(CardId.SinfulSpoilsOfDoom_Rciela) && Duel.Player == 0 && notQuickTiming) || Bot.GetSpells().Any(card => card.IsCode(CardId.SinfulSpoilsOfDoom_Rciela) && card.IsFacedown())) { if (!Bot.GetMonsters().Any(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster))) checkFlag = true; @@ -1398,7 +1436,7 @@ public bool DogmatikaMaximusActivate() CardId.TitanikladTheAshDragon, CardId.GranguignolTheDuskDragon, CardId.PSYFramelordOmega, CardId.DespianLuluwalilith }; foreach (int checkId in checkDiscardIdList) { - if (Bot.HasInExtra(checkId) && !discardExtraThisTurn.Contains(checkId) && !activatedCardIdList.Contains(checkId)) + if (Bot.HasInExtra(checkId) && !activatedCardIdList.Contains(checkId)) { if (checkId == CardId.ElderEntityNtss) { @@ -1531,10 +1569,21 @@ public bool DiabellstarTheBlackWitchSpSummon() return true; } } + List extraCheckList = Bot.GetMonsters().Where(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Link)) + .OrderBy(card => card.Attack).ToList(); + foreach (ClientCard checkCard in extraCheckList) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) || CheckHasExtraOnField(checkCard)) + { + AI.SelectCard(checkCard); + return true; + } + } } - if (Bot.GetMonsterCount() == 0) + if (Bot.GetMonsterCount() == 0 || CheckRemainInDeck(CardId.SinfulSpoilsOfDoom_Rciela) > 0) { - List spellIdList = new List{ _CardId.InfiniteImpermanence, CardId.CrossoutDesignator, CardId.DogmatikaPunishment, _CardId.CalledByTheGrave }; + List spellIdList = new List{ CardId.CrossoutDesignator, _CardId.InfiniteImpermanence, _CardId.CalledByTheGrave, + CardId.DogmatikaPunishment, CardId.DogmatikaMacabre, CardId.DogmatikaLamity }; foreach (int spellId in spellIdList) { if (Bot.HasInHandOrInSpellZone(spellId)) @@ -1578,7 +1627,14 @@ public bool DogmatikaEcclesiaActivate() // sp summon if (Card.Location == CardLocation.Hand) { - if (CheckShouldNoMoreSpSummon() || activatedCardIdList.Contains(Card.Id)) return false; + if (activatedCardIdList.Contains(Card.Id)) return false; + if (CheckShouldNoMoreSpSummon()) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) || Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + return false; + } + } if (enemyActivateLockBird) { if (Bot.HasInHand(CardId.DogmatikaFleurdelis) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) @@ -2520,6 +2576,7 @@ public bool DespianLuluwalilithActivate() AI.SelectYesNo(true); AI.SelectCard(currentChainEnemyCard); } + else AI.SelectYesNo(false); return true; } return false; @@ -2589,6 +2646,8 @@ public bool SuperStarslayerTYPHONSpSummon() if (material == null || material.Attack >= 3000) return false; bool checkFlag = GetProblematicEnemyMonster(material.Attack) != null; + checkFlag |= material.HasType(CardType.Link); + checkFlag |= material.Level <= 4; if (checkFlag) { AI.SelectMaterials(material); @@ -2600,6 +2659,7 @@ public bool SuperStarslayerTYPHONSpSummon() public bool SuperStarslayerTYPHONActivate() { + if (CheckWhetherNegated()) return false; List targetList = new List(); targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && c.IsFloodgate() && c.IsFaceup()).OrderByDescending(card => card.Attack)); diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 30c20fd5c..fe1ac360a 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -125,6 +125,13 @@ protected class _CardId public const int VaylantzWorld_ShinraBansho = 49568943; public const int VaylantzWorld_KonigWissen = 75952542; public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + + public const int RescueACEHydrant = 37617348; + } + + protected class _Setcode + { + public const int RescueACE = 0x18b; } protected DefaultExecutor(GameAI ai, Duel duel) @@ -252,6 +259,9 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender if (defender.OwnTargets.Any(card => card.IsCode(_CardId.PhantomKnightsFogBlade) && !card.IsDisabled())) return false; + + if (defender.IsCode(_CardId.RescueACEHydrant) && !defender.IsDisabled() && Enemy.GetMonsters().Any(monster => monster.HasSetcode(_Setcode.RescueACE) && !monster.IsCode(_CardId.RescueACEHydrant))) + return false; return true; } diff --git a/Game/ClientCard.cs b/Game/ClientCard.cs index 1eec6b7b2..970e0f6e3 100644 --- a/Game/ClientCard.cs +++ b/Game/ClientCard.cs @@ -82,6 +82,9 @@ public void SetId(int id) Name = Data.Name; if (Data.Alias != 0) Alias = Data.Alias; + } else { + Name = null; + Alias = 0; } } From 18b0cc485a432654f2efb39f9c999456c5942409 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Wed, 10 Jan 2024 10:16:20 +0800 Subject: [PATCH 012/110] Update default excutor (#178) --- Game/AI/CardExtension.cs | 3 +- Game/AI/DefaultExecutor.cs | 225 +++++++++++++++++++++++++---- Game/AI/Enums/DangerousMonster.cs | 3 +- Game/AI/Enums/Floodgate.cs | 3 +- Game/AI/Enums/InvincibleMonster.cs | 7 +- Game/AI/Enums/ShouldNotBeTarget.cs | 4 +- Game/AI/Executor.cs | 5 + Game/Duel.cs | 17 ++- Game/GameAI.cs | 7 + Game/GameBehavior.cs | 47 +++++- 10 files changed, 286 insertions(+), 35 deletions(-) diff --git a/Game/AI/CardExtension.cs b/Game/AI/CardExtension.cs index 684848aa0..55ce1f773 100644 --- a/Game/AI/CardExtension.cs +++ b/Game/AI/CardExtension.cs @@ -21,7 +21,8 @@ public static bool IsMonsterInvincible(this ClientCard card) /// public static bool IsMonsterDangerous(this ClientCard card) { - return !card.IsDisabled() && Enum.IsDefined(typeof(DangerousMonster), card.Id); + return !card.IsDisabled() && + (Enum.IsDefined(typeof(DangerousMonster), card.Id) || (card.HasSetcode(0x18d) && (card.HasType(CardType.Ritual) || card.EquipCards.Count > 0))); } /// diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index fe1ac360a..5ff3b3b6e 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -126,12 +126,92 @@ protected class _CardId public const int VaylantzWorld_KonigWissen = 75952542; public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int BelialMarquisOfDarkness = 33655493; + public const int ChirubiméPrincessOfAutumnLeaves = 87294988; + public const int PerformapalBarokuriboh = 19050066; + public const int LabrynthArchfiend = 48745395; + public const int HarpiesPetDragonFearsomeFireBlast = 4991081; + public const int DynaHeroFurHire = 25123713; + public const int Hieracosphinx = 82260502; + public const int SpeedroidPassinglider = 26420373; + public const int TyrOfTheNordicChampions = 2333365; + public const int ValkyrianKnight = 99348756; + public const int Victoria = 75162696; + public const int MadolcheChouxvalier = 75363626; + public const int LadyOfD = 67511500; + public const int MermailAbysslung = 95466842; + public const int HarpiesPetBabyDragon = 6924874; + public const int HandHoldingGenie = 94535485; + public const int GolemDragon = 9666558; + public const int TwilightRoseKnight = 2986553; + public const int PerformapalThunderhino = 70458081; + public const int MiracleFlipper = 131182; + public const int Decoyroid = 25034083; + public const int AltergeistFifinellag = 12977245; + public const int BatterymanD = 55401221; + public const int Watthopper = 61380658; + public const int EgyptianGodSlime = 42166000; + public const int DinowrestlerChimeraTWrextle = 22900219; + public const int DinowrestlerGigaSpinosavate = 58672736; + public const int ScarredWarrior = 45298492; + public const int SharkFortress = 50449881; + public const int HeroicChampionClaivesolish = 97453744; + public const int GhostrickAlucard = 75367227; + public const int DinowrestlerKingTWrextle = 77967790; + + public const int PerformapalMissDirector = 92932860; + public const int AncientWarriorsMasterfulSunMou = 40140448; + public const int AncientWarriorsVirtuousLiuXuan = 40428851; + public const int CommandKnight = 10375182; + public const int HunterOwl = 51962254; + public const int RokketRecharger = 5969957; + public const int EmissaryOfTheOasis = 6103294; + public const int Zuttomozaurus = 24454387; + public const int Otoshidamashi = 14957440; + public const int NaturiaMosquito = 17285476; public const int RescueACEHydrant = 37617348; + public const int MeizenTheBattleNinja = 11825276; + public const int VindikiteRGenex = 73483491; + public const int PrincessCologne = 75574498; + public const int Number48ShadowLich = 1426714; + public const int PhantomToken = 1426715; + public const int DuelLinkDragonTheDuelDragon = 60025883; + public const int DuelDragonToken = 60025884; + public const int SeleneQueenOfTheMasterMagicians = 45819647; + public const int TheWingedDragonofRaSphereMode = 10000080; + + public const int RockOfTheVanquisher = 28168628; + public const int SpiralDischarge = 29477860; + public const int GaiaTheDragonChampion = 66889139; + public const int CrusadiaVanguard = 55312487; + public const int GladiatorBeastDomitianus = 33652635; + public const int PatricianOfDarkness = 19153634; + public const int DictatorOfD = 66961194; + + public const int NovoxTheSilenforcerDisciple = 25801745; + public const int SilenforcingBarrier = 98477480; } protected class _Setcode { + public const int Watt = 0xe; + public const int Speedroid = 0x2016; + public const int EarthboundImmortal = 0x1021; + public const int Naturia = 0x2a; + public const int Nordic = 0x42; + public const int Harpie = 0x64; + public const int Madolche = 0x71; + public const int Ghostrick = 0x8d; + public const int OddEyes = 0x99; + public const int Performapal = 0x9f; + public const int BlueEyes = 0xdd; + public const int FurHire = 0x114; + public const int Altergeist = 0x103; + public const int Crusadia = 0x116; + public const int Endymion = 0x12a; + public const int AncientWarriors = 0x137; public const int RescueACE = 0x18b; + public const int VanquishSoul = 0x195; } protected DefaultExecutor(GameAI ai, Duel duel) @@ -143,6 +223,77 @@ protected DefaultExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, _CardId.SantaClaws); } + /// + /// Defined: + /// if monster with code as KEY, other monsters with rules as VALUE won't be targeted for attack. + /// + protected Dictionary> DefenderProtectRule = new Dictionary> { + {_CardId.BelialMarquisOfDarkness, defender => defender.IsFaceup()}, + {_CardId.ChirubiméPrincessOfAutumnLeaves, defender => defender.HasRace(CardRace.Plant)}, + {_CardId.PerformapalBarokuriboh, defender => true}, + {_CardId.LabrynthArchfiend, defender => defender.HasRace(CardRace.Fiend) && !defender.IsCode(_CardId.LabrynthArchfiend)}, + {_CardId.HarpiesPetDragonFearsomeFireBlast, defender => defender.Level <= 6 && defender.HasSetcode(_Setcode.Harpie)}, + {_CardId.DynaHeroFurHire, defender => defender.HasSetcode(_Setcode.FurHire)}, + {_CardId.Hieracosphinx, defender => defender.IsFacedown()}, + {_CardId.SpeedroidPassinglider, defender => defender.HasSetcode(_Setcode.Speedroid)}, + {_CardId.TyrOfTheNordicChampions, defender => defender.HasSetcode(_Setcode.Nordic)}, + {_CardId.ValkyrianKnight, defender => defender.HasRace(CardRace.Warrior) && !defender.IsCode(_CardId.ValkyrianKnight)}, + {_CardId.Victoria, defender => defender.HasRace(CardRace.Fairy)}, + {_CardId.MadolcheChouxvalier, defender => defender.HasSetcode(_Setcode.Madolche) && !defender.IsCode(_CardId.MadolcheChouxvalier)}, + {_CardId.LadyOfD, defender => defender.HasRace(CardRace.Dragon)}, + {_CardId.MermailAbysslung, defender => defender.HasAttribute(CardAttribute.Water)}, + {_CardId.HarpiesPetBabyDragon, defender => defender.HasSetcode(_Setcode.Harpie) && !defender.IsCode(_CardId.HarpiesPetBabyDragon)}, + {_CardId.HandHoldingGenie, defender => true}, + {_CardId.GolemDragon, defender => defender.HasRace(CardRace.Dragon)}, + {_CardId.MaraudingCaptain, defender => defender.HasRace(CardRace.Warrior)}, + {_CardId.TwilightRoseKnight, defender => defender.HasRace(CardRace.Plant)}, + {_CardId.PerformapalThunderhino, defender => defender.HasSetcode(_Setcode.Performapal)}, + {_CardId.MiracleFlipper, defender => defender.IsFaceup()}, + {_CardId.Decoyroid, defender => defender.IsFaceup()}, + {_CardId.DupeFrog, defender => true}, + {_CardId.AltergeistFifinellag, defender => defender.HasSetcode(_Setcode.Altergeist)}, + {_CardId.BatterymanD, defender => defender.HasRace(CardRace.Thunder) && !defender.IsCode(_CardId.BatterymanD)}, + {_CardId.Watthopper, defender => defender.HasSetcode(_Setcode.Watt) && defender.IsFaceup()}, + + {_CardId.EgyptianGodSlime, defender => true}, + {_CardId.DinowrestlerChimeraTWrextle, defender => true}, + {_CardId.DinowrestlerGigaSpinosavate, defender => true}, + {_CardId.ScarredWarrior, defender => defender.HasRace(CardRace.Warrior) && defender.IsFaceup()}, + {_CardId.SharkFortress, defender => true}, + {_CardId.HeroicChampionClaivesolish, defender => true}, + {_CardId.GhostrickAlucard, defender => defender.HasSetcode(_Setcode.Ghostrick) || defender.IsFacedown()}, + {_CardId.MekkKnightCrusadiaAstram, defender => true}, + {_CardId.DinowrestlerKingTWrextle, defender => true} + }; + + /// + /// Defined: + /// if monster with KEY on field, and meet VALUE(monster, all monster), it cannot be targeted for attack. + /// + protected Dictionary, bool>> DefenderInvisbleRule = new Dictionary, bool>> { + {_CardId.UltimayaTzolkin, (defender, list) => list.Any(monster => !monster.Equals(defender) && monster.HasType(CardType.Synchro))}, + {_CardId.PerformapalMissDirector, (defender, list) => list.Any(monster => monster.HasSetcode(_Setcode.OddEyes))}, + {_CardId.AncientWarriorsMasterfulSunMou, (defender, list) => list.Any(monster => !monster.Equals(defender) && monster.HasSetcode(_Setcode.AncientWarriors))}, + {_CardId.AncientWarriorsVirtuousLiuXuan, (defender, list) => list.Any(monster => !monster.Equals(defender) && monster.HasSetcode(_Setcode.AncientWarriors))}, + {_CardId.CommandKnight, (defender, list) => list.Any(monster => !monster.Equals(defender))}, + {_CardId.HunterOwl, (defender, list) => list.Any(monster => !monster.Equals(defender) && monster.HasAttribute(CardAttribute.Wind))}, + {_CardId.RokketRecharger, (defender, list) => list.Any(monster => monster.IsExtraCard() && monster.HasAttribute(CardAttribute.Dark))}, + {_CardId.EmissaryOfTheOasis, (defender, list) => list.Any(monster => monster.HasType(CardType.Normal) && monster.Level <= 3)}, + {_CardId.Zuttomozaurus, (defender, list) => list.Any(monster => !monster.Equals(defender) && monster.HasRace(CardRace.Dinosaur))}, + {_CardId.Otoshidamashi, (defender, list) => list.Any(monster => !monster.HasType(CardType.Tuner))}, + {_CardId.NaturiaMosquito, (defender, list) => list.Any(monster => !monster.Equals(defender) && monster.HasSetcode(_Setcode.Naturia))}, + {_CardId.RescueACEHydrant, (defender, list) => list.Any(monster => !monster.IsCode(_CardId.RescueACEHydrant) && monster.HasSetcode(_Setcode.RescueACE))}, + + {_CardId.MeizenTheBattleNinja, (defender, list) => list.Any(monster => monster.IsFacedown())}, + {_CardId.VindikiteRGenex, (defender, list) => true}, + {_CardId.PrincessCologne, (defender, list) => list.Any(monster => !monster.Equals(defender))}, + {_CardId.Number48ShadowLich, (defender, list) => list.Any(monster => monster.IsCode(_CardId.PhantomToken))}, + {_CardId.DuelLinkDragonTheDuelDragon, (defender, list) => list.Any(monster => monster.IsCode(_CardId.DuelDragonToken))}, + {_CardId.SeleneQueenOfTheMasterMagicians, (defender, list) => list.Any(monster => monster.HasSetcode(_Setcode.Endymion))}, + + {_CardId.TheWingedDragonofRaSphereMode, (defender, list) => true} + }; + /// /// Decide which card should the attacker attack. /// @@ -192,21 +343,16 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender return false; } - foreach (ClientCard equip in defender.EquipCards) - { - if (equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled()) - { - return false; - } - } + if (defender.EquipCards.Any(equip => equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled())) + return false; if (!defender.IsDisabled()) { if (defender.IsCode(_CardId.MekkKnightCrusadiaAstram) && defender.IsAttack() && attacker.IsSpecialSummoned) - return false; + defender.RealPower += attacker.Attack; if (defender.IsCode(_CardId.CrystalWingSynchroDragon) && defender.IsAttack() && attacker.Level >= 5) - return false; + defender.RealPower += attacker.Attack; if (defender.IsCode(_CardId.AllyOfJusticeCatastor) && !attacker.HasAttribute(CardAttribute.Dark)) return false; @@ -232,37 +378,62 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender if (attacker.IsMonsterInvincible()) attacker.RealPower = 9999; + + if (attacker.EquipCards.Any(equip => equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled())) + attacker.RealPower = defender.RealPower + 100; + } - foreach (ClientCard equip in attacker.EquipCards) + foreach (ClientCard protecter in Enemy.GetMonsters()) + { + if (!protecter.IsDisabled() && protecter != defender) { - if (equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled()) + Func defenderRule = card => false; + if (DefenderProtectRule.TryGetValue(protecter.Id, out defenderRule)) { - attacker.RealPower = defender.RealPower + 100; + if (defenderRule(defender)) return false; } } } - if (Enemy.HasInMonstersZone(_CardId.MekkKnightCrusadiaAstram, true) && !(defender).IsCode(_CardId.MekkKnightCrusadiaAstram)) - return false; - - if (Enemy.HasInMonstersZone(_CardId.DupeFrog, true) && !(defender).IsCode(_CardId.DupeFrog)) - return false; + if (!defender.IsDisabled()) + { + Func, bool> defenderRule = (card, monsterList) => false; + if (DefenderInvisbleRule.TryGetValue(defender.Id, out defenderRule)) + { + if (defenderRule(defender, Enemy.GetMonsters())) return false; + } + } - if (Enemy.HasInMonstersZone(_CardId.MaraudingCaptain, true) && !defender.IsCode(_CardId.MaraudingCaptain) && defender.Race == (int)CardRace.Warrior) + if (Enemy.GetMonsters().Any(monster => !monster.Equals(defender) && monster.IsCode(_CardId.HamonLordofStrikingThunder) && !monster.IsDisabled() && monster.IsDefense())) return false; - if (defender.IsCode(_CardId.UltimayaTzolkin) && !defender.IsDisabled() && Enemy.GetMonsters().Any(monster => !monster.Equals(defender) && monster.HasType(CardType.Synchro))) + if (defender.OwnTargets.Any(card => card.IsCode(_CardId.PhantomKnightsFogBlade) && !card.IsDisabled())) return false; - - if (Enemy.GetMonsters().Any(monster => !monster.Equals(defender) && monster.IsCode(_CardId.HamonLordofStrikingThunder) && !monster.IsDisabled() && monster.IsDefense())) + + if (defender.HasSetcode(_Setcode.EarthboundImmortal) && !defender.IsDisabled()) return false; + + bool attackHighestMonster = + Enemy.HasInMonstersZone(_CardId.RockOfTheVanquisher, true) && Enemy.GetMonsters().Any(card => card.HasSetcode(_Setcode.VanquishSoul)) || + Enemy.HasInMonstersZone(_CardId.GladiatorBeastDomitianus, true) || Enemy.HasInMonstersZone(_CardId.PatricianOfDarkness) || + Enemy.HasInMonstersZone(_CardId.DictatorOfD, true) && Enemy.GetMonsters().Any(card => card.HasSetcode(_Setcode.BlueEyes)); + if (attackHighestMonster) + { + if (defender.HasPosition(CardPosition.FaceDown)) + return false; + if (Enemy.GetMonsters().Any(card => card.IsFaceup() && card.Attack > defender.Attack)) + return false; + } - if (defender.OwnTargets.Any(card => card.IsCode(_CardId.PhantomKnightsFogBlade) && !card.IsDisabled())) + if (Enemy.HasInSpellZone(_CardId.SpiralDischarge, true) && Enemy.HasInMonstersZone(_CardId.GaiaTheDragonChampion) && !defender.IsCode(_CardId.GaiaTheDragonChampion)) return false; - if (defender.IsCode(_CardId.RescueACEHydrant) && !defender.IsDisabled() && Enemy.GetMonsters().Any(monster => monster.HasSetcode(_Setcode.RescueACE) && !monster.IsCode(_CardId.RescueACEHydrant))) + if (Enemy.HasInSpellZone(_CardId.CrusadiaVanguard, true) && Enemy.GetMonsters().Any(card => card.HasSetcode(_Setcode.Crusadia) && card.HasType(CardType.Link)) && !defender.HasType(CardType.Link)) return false; + if (Enemy.HasInSpellZone(_CardId.SilenforcingBarrier, true) && Enemy.HasInMonstersZone(_CardId.NovoxTheSilenforcerDisciple, faceUp: true) && !defender.HasType(CardType.Ritual)) + return false; + return true; } @@ -1227,7 +1398,7 @@ protected bool DefaultHonestEffect() if (Card.Location == CardLocation.Hand) { return Bot.BattlingMonster.IsAttack() && - (((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Attack) || Bot.BattlingMonster.Attack >= Enemy.LifePoints) + ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Attack) || Bot.BattlingMonster.Attack >= Enemy.LifePoints || ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Defense) && (Bot.BattlingMonster.Attack + Enemy.BattlingMonster.Attack > Enemy.BattlingMonster.Defense))); } @@ -1263,13 +1434,13 @@ protected bool DefaultVaylantzWorld_KonigWissen() List targetList = new List(); List floodgateCards = monsters .Where(card => card?.Data != null && card.IsFloodgate() && card.IsFaceup() && !card.IsShouldNotBeTarget()) - .OrderBy(card => card.Attack).ToList(); + .OrderByDescending(card => card.Attack).ToList(); List dangerousCards = monsters .Where(card => card?.Data != null && card.IsMonsterDangerous() && card.IsFaceup() && !card.IsShouldNotBeTarget()) - .OrderBy(card => card.Attack).ToList(); + .OrderByDescending(card => card.Attack).ToList(); List attackOrderedCards = monsters .Where(card => card?.Data != null && card.HasType(CardType.Monster) && card.IsFaceup() && card.IsShouldNotBeTarget()) - .OrderBy(card => card.Attack).ToList(); + .OrderByDescending(card => card.Attack).ToList(); targetList.AddRange(floodgateCards); targetList.AddRange(dangerousCards); diff --git a/Game/AI/Enums/DangerousMonster.cs b/Game/AI/Enums/DangerousMonster.cs index fe956dd82..caa7648b7 100644 --- a/Game/AI/Enums/DangerousMonster.cs +++ b/Game/AI/Enums/DangerousMonster.cs @@ -25,6 +25,7 @@ public enum DangerousMonster Heart_eartHDragon = 97403510, DaigustoSphreeze = 29552709, OhimetheManifestedMikanko = 81260679, - ArahimetheManifestedMikanko = 75771170 + ArahimetheManifestedMikanko = 75771170, + YubelDasEwigLiebeWächter = 47172959 } } diff --git a/Game/AI/Enums/Floodgate.cs b/Game/AI/Enums/Floodgate.cs index e74040835..bf2bd36ac 100644 --- a/Game/AI/Enums/Floodgate.cs +++ b/Game/AI/Enums/Floodgate.cs @@ -210,6 +210,7 @@ public enum Floodgate TGGlaiveBlaster = 95973569, StellarNemesisTPHON_DoomsdayStar = 93039339, SPLittleKnight = 29301450, - AngelRing = 40678060 + AngelRing = 40678060, + SkullGuardianTheSilenforcingProtector = 10774240 } } diff --git a/Game/AI/Enums/InvincibleMonster.cs b/Game/AI/Enums/InvincibleMonster.cs index fe9a32c27..160968264 100644 --- a/Game/AI/Enums/InvincibleMonster.cs +++ b/Game/AI/Enums/InvincibleMonster.cs @@ -109,6 +109,11 @@ public enum InvincibleEnemyMonster NightmareMagician = 40221691, ArahimetheManifestedMikanko = 75771170, UFOLight = 9275482, - TaotheGreatChanter = 34541543 + TaotheGreatChanter = 34541543, + SpiritOfYubel = 90829280, + DarkGuardian = 26746975, + EnvoyOfTheWaxState = 87462901, + Fluffyfluff = 85401123, + YubelDasEwigLiebeWächter = 47172959 } } diff --git a/Game/AI/Enums/ShouldNotBeTarget.cs b/Game/AI/Enums/ShouldNotBeTarget.cs index 7adcc587c..6bb3d1b60 100644 --- a/Game/AI/Enums/ShouldNotBeTarget.cs +++ b/Game/AI/Enums/ShouldNotBeTarget.cs @@ -49,6 +49,8 @@ public enum ShouldNotBeTarget Blackwing_FullArmoredWing = 54082269, DragunofRedEyes = 37818794, RedEyesBDragon = 74677422, // sometimes the name of DragunofRedEyes will be changed to RedEyesBDragon - TheArrivalCyberseIgnister = 11738489 + TheArrivalCyberseIgnister = 11738489, + MajespecterPorcupineYamaarashi = 51073802, + RaidraptorRisingRebellionFalcon = 71222868 } } diff --git a/Game/AI/Executor.cs b/Game/AI/Executor.cs index 8750679ce..b1284a9cb 100644 --- a/Game/AI/Executor.cs +++ b/Game/AI/Executor.cs @@ -95,6 +95,11 @@ public virtual void OnChaining(int player, ClientCard card) // For overriding } + public virtual void OnChainSolved(int chainIndex) + { + // For overriding + } + public virtual void OnChainEnd() { // For overriding diff --git a/Game/Duel.cs b/Game/Duel.cs index cf4ed7d6a..02d71cdb5 100644 --- a/Game/Duel.cs +++ b/Game/Duel.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using YGOSharp.OCGWrapper.Enums; namespace WindBot.Game @@ -26,6 +26,8 @@ public class Duel public int LastSummonPlayer { get; set; } public IList SummoningCards { get; set; } public IList LastSummonedCards { get; set; } + public int SolvingChainIndex { get; set; } + public IList NegatedChainIndexList { get; set; } public Duel() { @@ -41,6 +43,8 @@ public Duel() LastSummonPlayer = -1; SummoningCards = new List(); LastSummonedCards = new List(); + SolvingChainIndex = 0; + NegatedChainIndexList = new List(); } public ClientCard GetCard(int player, CardLocation loc, int seq) @@ -169,5 +173,16 @@ public int GetLocalPlayer(int player) { return IsFirst ? player : 1 - player; } + + public ClientCard GetCurrentSolvingChainCard() + { + if (SolvingChainIndex == 0 || SolvingChainIndex > CurrentChain.Count) return null; + return CurrentChain[SolvingChainIndex - 1]; + } + + public bool IsCurrentSolvingChainNegated() + { + return SolvingChainIndex > 0 && NegatedChainIndexList.Contains(SolvingChainIndex); + } } } \ No newline at end of file diff --git a/Game/GameAI.cs b/Game/GameAI.cs index 5af7c349a..5ab235bcc 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -141,6 +141,11 @@ public void OnChaining(ClientCard card, int player) { Executor.OnChaining(player,card); } + + public void OnChainSolved(int chainIndex) + { + Executor.OnChainSolved(chainIndex); + } /// /// Called when a chain has been solved. @@ -300,6 +305,8 @@ public IList OnSelectCard(IList cards, int min, int max, // Always select the first available cards and choose the minimum. IList selected = new List(); + if (hint == HintMsg.AttackTarget && cancelable) return selected; + if (cards.Count >= min) { for (int i = 0; i < min; ++i) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index bf1906ad3..9bf8eb057 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -109,6 +109,10 @@ private void RegisterPackets() _messages.Add(GameMessage.AttackDisabled, OnAttackDisabled); _messages.Add(GameMessage.PosChange, OnPosChange); _messages.Add(GameMessage.Chaining, OnChaining); + _messages.Add(GameMessage.ChainSolving, OnChainSolving); + _messages.Add(GameMessage.ChainNegated, OnChainNegated); + _messages.Add(GameMessage.ChainDisabled, OnChainDisabled); + _messages.Add(GameMessage.ChainSolved, OnChainSolved); _messages.Add(GameMessage.ChainEnd, OnChainEnd); _messages.Add(GameMessage.SortCard, OnCardSorting); _messages.Add(GameMessage.SortChain, OnChainSorting); @@ -362,6 +366,19 @@ private void OnStart(BinaryReader packet) extra = packet.ReadInt16(); _duel.Fields[GetLocalPlayer(1)].Init(deck, extra); + // in case of ending duel in chain's solving + _duel.LastChainPlayer = -1; + _duel.LastChainLocation = 0; + _duel.CurrentChain.Clear(); + _duel.ChainTargets.Clear(); + _duel.LastChainTargets.Clear(); + _duel.ChainTargetOnly.Clear(); + _duel.LastSummonPlayer = -1; + _duel.SummoningCards.Clear(); + _duel.LastSummonedCards.Clear(); + _duel.SolvingChainIndex = 0; + _duel.NegatedChainIndexList.Clear(); + Logger.DebugWriteLine("Duel started: " + _room.Names[0] + " versus " + _room.Names[1]); _ai.OnStart(); } @@ -742,6 +759,30 @@ private void OnChaining(BinaryReader packet) } + private void OnChainSolving(BinaryReader packet) + { + int chainIndex = packet.ReadByte(); + _duel.SolvingChainIndex = chainIndex; + } + + private void OnChainNegated(BinaryReader packet) + { + int chainIndex = packet.ReadByte(); + _duel.NegatedChainIndexList.Add(chainIndex); + } + + private void OnChainDisabled(BinaryReader packet) + { + int chainIndex = packet.ReadByte(); + _duel.NegatedChainIndexList.Add(chainIndex); + } + + private void OnChainSolved(BinaryReader packet) + { + int chainIndex = packet.ReadByte(); + _ai.OnChainSolved(chainIndex); + } + private void OnChainEnd(BinaryReader packet) { _ai.OnChainEnd(); @@ -751,6 +792,8 @@ private void OnChainEnd(BinaryReader packet) _duel.ChainTargets.Clear(); _duel.LastChainTargets.Clear(); _duel.ChainTargetOnly.Clear(); + _duel.SolvingChainIndex = 0; + _duel.NegatedChainIndexList.Clear(); } private void OnCardSorting(BinaryReader packet) @@ -1083,7 +1126,7 @@ private void OnSelectChain(BinaryReader packet) int count = packet.ReadByte(); packet.ReadByte(); // specount bool forced = packet.ReadByte() != 0; - packet.ReadInt32(); // hint1 + int hint1 = packet.ReadInt32(); // hint1 int hint2 = packet.ReadInt32(); // hint2 IList cards = new List(); @@ -1124,7 +1167,7 @@ private void OnSelectChain(BinaryReader packet) return; } - Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forced, hint2)); + Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forced, hint1 | hint2)); } private void OnSelectCounter(BinaryReader packet) From eec2779ce13c5f62484d4bd791256b6bd9a73017 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Wed, 10 Jan 2024 10:17:03 +0800 Subject: [PATCH 013/110] Update custom executor (#177) --- BotWrapper/bot.conf | 5 ++ Game/AI/Decks/AltergeistExecutor.cs | 61 +++++++++++++++++----- Game/AI/Decks/BlueEyesExecutor.cs | 3 +- Game/AI/Decks/DogmatikaExecutor.cs | 58 ++++++++++++++++----- Game/AI/Decks/ExosisterExecutor.cs | 40 +++++++++++---- Game/AI/Decks/SwordsoulExecutor.cs | 31 ++++++++--- Game/AI/Decks/TrickstarExecutor.cs | 79 +++++++++++++++++++++++------ Game/AI/Decks/WitchcraftExecutor.cs | 42 ++++++++++----- Game/AI/Decks/ZefraExecutor.cs | 4 +- 9 files changed, 249 insertions(+), 74 deletions(-) diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index fd8fcb1fd..e30e48f90 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -204,6 +204,11 @@ Name=艾克莉西娅 Deck=Swordsoul Dialog=ecclesia.zh-CN 相剑卡组。 AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +!艾克莉西娅-教导 +Name=艾克莉西娅 Deck=Dogmatika Dialog=ecclesia.zh-CN +教导卡组。 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + !神数不神-刹帝利 Name=神数不神 Deck=Kashtira Dialog=Zefra.zh-CN 俱舍怒威族卡组。 diff --git a/Game/AI/Decks/AltergeistExecutor.cs b/Game/AI/Decks/AltergeistExecutor.cs index 33733f8a0..93b14c353 100644 --- a/Game/AI/Decks/AltergeistExecutor.cs +++ b/Game/AI/Decks/AltergeistExecutor.cs @@ -3,6 +3,7 @@ using WindBot; using WindBot.Game; using WindBot.Game.AI; +using System.Linq; namespace WindBot.Game.AI.Decks { @@ -324,23 +325,37 @@ public int GetTotalATK(IList list) public int SelectSTPlace(ClientCard card=null, bool avoid_Impermanence = false) { - List list = new List { 0, 1, 2, 3, 4 }; + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; + list.Add(seq); + } + } int n = list.Count; while (n-- > 1) { - int index = Program.Rand.Next(n + 1); - int temp = list[index]; - list[index] = list[n]; - list[n] = temp; + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; } - foreach (int seq in list) + if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) { - int zone = (int)System.Math.Pow(2, seq); - if (Bot.SpellZone[seq] == null) + foreach (int seq in list) { - if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; - return zone; - }; + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + return (int)System.Math.Pow(2, seq); + } + } + foreach (int seq in list) + { + return (int)System.Math.Pow(2, seq); } return 0; } @@ -2656,6 +2671,27 @@ public override void OnNewTurn() attacked_Meluseek.Clear(); } + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + Impermanence_list.Add(4-i); + break; + } + } + } + } + base.OnChaining(player, card); + } + public bool MonsterRepos() { if (Card.Attack == 0) return (Card.IsAttack()); @@ -2797,7 +2833,8 @@ public override IList OnSelectCard(IList cards, int min, // throw all?? return null; } - return null; + + return base.OnSelectCard(cards, min, max, hint, cancelable); } public override CardPosition OnSelectPosition(int cardId, IList positions) diff --git a/Game/AI/Decks/BlueEyesExecutor.cs b/Game/AI/Decks/BlueEyesExecutor.cs index d20e37561..b09198a0e 100644 --- a/Game/AI/Decks/BlueEyesExecutor.cs +++ b/Game/AI/Decks/BlueEyesExecutor.cs @@ -146,7 +146,8 @@ public override IList OnSelectCard(IList cards, int min, return Util.CheckSelectCount(result, cards, min, max); } Logger.DebugWriteLine("Use default."); - return null; + + return base.OnSelectCard(cards, min, max, hint, cancelable); } public override IList OnSelectXyzMaterial(IList cards, int min, int max) diff --git a/Game/AI/Decks/DogmatikaExecutor.cs b/Game/AI/Decks/DogmatikaExecutor.cs index 4b6f5f78d..db5d2b6b4 100644 --- a/Game/AI/Decks/DogmatikaExecutor.cs +++ b/Game/AI/Decks/DogmatikaExecutor.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.Linq; using System; -using System.CodeDom; -using System.Security.AccessControl; namespace WindBot.Game.AI.Decks { @@ -62,6 +60,7 @@ public class CardId public const int DimensionalFissure = 81674782; public const int BanisheroftheRadiance = 94853057; public const int BanisheroftheLight = 61528025; + public const int GhostMournerMoonlitChill = 52038441; } public DogmatikaExecutor(GameAI ai, Duel duel) @@ -133,6 +132,7 @@ public DogmatikaExecutor(GameAI ai, Duel duel) const int SetcodeOrcust = 0x11b; const int SetcodeDogmatika = 0x145; const int hintTimingMainEnd = 0x4; + const int hintDamageStep = 0x2000; Dictionary> DeckCountTable = new Dictionary>{ {3, new List { CardId.DogmatikaEcclesia, _CardId.AshBlossom, _CardId.MaxxC, CardId.KnightmareCorruptorIblee, CardId.NadirServant, @@ -1096,10 +1096,26 @@ public override void OnMove(int cardId, int previousControler, int previousLocat base.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); } - public override ClientCard OnSelectAttacker(IList attackers, IList defenders) + public override BattlePhaseAction OnBattle(IList attackers, IList defenders) { - if (attackers.Count() > 0) return attackers[attackers.Count() - 1]; - return null; + if (attackers.Count() == 1 && defenders.Count() == 1) + { + if (defenders[0].IsCode(CardId.KnightmareCorruptorIblee) && !confirmLink2) return new BattlePhaseAction(BattlePhaseAction.BattleAction.ToMainPhaseTwo); + } + if (attackers.Count() > 0 && defenders.Count() > 0) + { + List sortedAttacker = attackers.OrderBy(card => card.Attack).ToList(); + for (int k = 0; k < sortedAttacker.Count; ++k) + { + ClientCard attacker = sortedAttacker[k]; + attacker.IsLastAttacker = k == sortedAttacker.Count - 1; + BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders); + if (result != null) + return result; + } + } + + return base.OnBattle(attackers, defenders); } public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList defenders) @@ -1113,6 +1129,9 @@ public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, ILis if (attacker.RealPower > defender.RealPower) return AI.Attack(attacker, defender); + + if (attacker.RealPower == defender.RealPower && defender.IsAttack() && Bot.GetMonsterCount() >= Enemy.GetMonsterCount()) + return AI.Attack(attacker, defender); } if (attacker.CanDirectAttack) @@ -1989,13 +2008,17 @@ public bool SinfulSpoilsOfDoom_RcielaActivate() ClientCard lastChainCard = Util.GetLastChainCard(); if (lastChainCard != null && lastChainCard.Controller == 1 && lastChainCard.IsMonster()) { - foreach (ClientCard chainTarget in Duel.LastChainTargets) + bool negateFlag = lastChainCard.IsCode(_CardId.EffectVeiler, CardId.GhostMournerMoonlitChill); + if (Duel.Turn > 1 || !negateFlag) { - if (selfCasterList.Contains(chainTarget)) + foreach (ClientCard chainTarget in Duel.LastChainTargets) { - selfTarget = chainTarget; - activateFlag = true; - break; + if (selfCasterList.Contains(chainTarget) && (!negateFlag || !chainTarget.IsCode(CardId.DiabellstarTheBlackWitch))) + { + selfTarget = chainTarget; + activateFlag = true; + break; + } } } } @@ -2022,7 +2045,8 @@ public bool SinfulSpoilsOfDoom_RcielaActivate() if (!onlyAlbaZoa) { List toDestroyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup() - && card.Attack > 0 && card.Attack <= targetAttack && !currentDestroyCardList.Contains(card)).ToList(); + && card.Attack > 0 && card.Attack <= targetAttack && !currentDestroyCardList.Contains(card) + && (Duel.Player == 1 || card != Enemy.BattlingMonster)).ToList(); if (toDestroyMonsterList.Count() > 1) { activateFlag = true; @@ -2031,7 +2055,13 @@ public bool SinfulSpoilsOfDoom_RcielaActivate() } // decrease attack - if (Bot.UnderAttack && !onlyAlbaZoa && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0)) + int botWorstPower = Util.GetWorstBotMonster()?.GetDefensePower() ?? 0; + bool decreaseFlag = Duel.Player == 1 && Enemy.GetMonsters().Any(card => card.Attack >= botWorstPower + && card.IsMonsterHasPreventActivationEffectInBattle()) && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2; + decreaseFlag |= (!onlyAlbaZoa || (Bot.BattlingMonster?.IsCode(CardId.DogmatikaAlbaZoa) ?? false)) + && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) + && Duel.LastChainPlayer != 0 && (CurrentTiming & hintDamageStep) != 0 && CurrentTiming > 0; + if (decreaseFlag) { activateFlag = true; } @@ -2425,7 +2455,7 @@ public bool DogmatikaPunishmentActivate() if (targetCard == null || extraToDiscard == null) { bool check1 = DefaultOnBecomeTarget(); - bool check2 = Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0); + bool check2 = Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && Duel.LastChainPlayer != 0;; bool check3 = Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0; bool check4 = Duel.Player == 1 && avoid2Monster && Enemy.GetMonsterCount() >= 2 && Duel.LastChainPlayer != 0; Logger.DebugWriteLine("===punishment check flag: " + check1 + " " + check2 + " " + check3 + " " + check4); @@ -2820,7 +2850,7 @@ public bool MonsterRepos() if (Card.IsAttack() && enemyBetter) return true; - if (Card.IsDefense() && !enemyBetter && selfAttack >= Card.Defense) + if (Card.IsDefense() && !enemyBetter) return true; return false; } diff --git a/Game/AI/Decks/ExosisterExecutor.cs b/Game/AI/Decks/ExosisterExecutor.cs index 03f1517f2..396121edb 100644 --- a/Game/AI/Decks/ExosisterExecutor.cs +++ b/Game/AI/Decks/ExosisterExecutor.cs @@ -629,25 +629,42 @@ public bool CheckWhetherNegated(bool disablecheck = true){ /// Whether need to avoid set in this place public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) { - List list = new List { 0, 1, 2, 3, 4 }; + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } int n = list.Count; while (n-- > 1) { - int index = Program.Rand.Next(n + 1); - int temp = list[index]; - list[index] = list[n]; - list[n] = temp; + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; } - foreach (int seq in list) + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) { - int zone = (int)System.Math.Pow(2, seq); - if (Bot.SpellZone[seq] == null) + foreach (int seq in list) { - if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; - if (avoidList != null && avoidList.Contains(seq)) continue; + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); AI.SelectPlace(zone); return; - }; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; } AI.SelectPlace(0); } @@ -816,6 +833,7 @@ public override void OnChainEnd() public override void OnNewTurn() { + if (Duel.Turn <= 1) calledbytheGraveCount.Clear(); enemyActivateMaxxC = false; enemyActivateLockBird = false; infiniteImpermanenceList.Clear(); diff --git a/Game/AI/Decks/SwordsoulExecutor.cs b/Game/AI/Decks/SwordsoulExecutor.cs index e9a967fce..29433a6d5 100644 --- a/Game/AI/Decks/SwordsoulExecutor.cs +++ b/Game/AI/Decks/SwordsoulExecutor.cs @@ -700,6 +700,7 @@ public override IList OnSelectCard(IList cards, int min, public override void OnNewTurn() { + if (Duel.Turn <= 1) calledbytheGraveCount.Clear(); enemyActivateMaxxC = false; enemyActivateLockBird = false; @@ -780,7 +781,17 @@ public override void OnChainEnd() /// Whether need to avoid set in this place public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) { - List list = new List { 0, 1, 2, 3, 4 }; + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } int n = list.Count; while (n-- > 1) { @@ -790,16 +801,22 @@ public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false list[index] = list[nextIndex]; list[nextIndex] = tempInt; } - foreach (int seq in list) + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) { - int zone = (int)System.Math.Pow(2, seq); - if (Bot.SpellZone[seq] == null) + foreach (int seq in list) { - if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; - if (avoidList != null && avoidList.Contains(seq)) continue; + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); AI.SelectPlace(zone); return; - }; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; } AI.SelectPlace(0); } diff --git a/Game/AI/Decks/TrickstarExecutor.cs b/Game/AI/Decks/TrickstarExecutor.cs index 2e79cfadf..d5ddaadc8 100644 --- a/Game/AI/Decks/TrickstarExecutor.cs +++ b/Game/AI/Decks/TrickstarExecutor.cs @@ -3,6 +3,7 @@ using WindBot; using WindBot.Game; using WindBot.Game.AI; +using System.Linq; namespace WindBot.Game.AI.Decks { @@ -67,6 +68,7 @@ public int getLinkMarker(int id) return 1; } + List Impermanence_list = new List(); bool NormalSummoned = false; ClientCard stage_locked = null; bool pink_ss = false; @@ -190,21 +192,39 @@ public bool Five_Rainbow() return false; } - public int SelectSTPlace() + public int SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false) { - List list = new List { 0, 1, 2, 3, 4 }; + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; + list.Add(seq); + } + } int n = list.Count; while (n-- > 1) { - int index = Program.Rand.Next(n + 1); - int temp = list[index]; - list[index] = list[n]; - list[n] = temp; + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; } - foreach(int seq in list) + if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) { - int zone = (int)System.Math.Pow(2, seq); - if (Bot.SpellZone[seq] == null) return zone; + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + return (int)System.Math.Pow(2, seq); + } + } + foreach (int seq in list) + { + return (int)System.Math.Pow(2, seq); } return 0; } @@ -505,7 +525,7 @@ public bool GalaxyCyclone() if (selected == null) return false; AI.SelectCard(selected); - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } @@ -526,13 +546,13 @@ public bool Feather_Act() if (self_card.IsCode(CardId.Galaxy)) return false; } - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } // activate when more than 2 cards if (Enemy.GetSpellCount() <= 1) return false; - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } @@ -627,7 +647,7 @@ public bool Pot_Act() if (!spell_trap_activate()) return false; if (Bot.Deck.Count > 15) { - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } return false; @@ -1003,7 +1023,7 @@ public bool Crown_eff() if (!spell_trap_activate()) return false; if (Duel.Phase <= DuelPhase.Main1 && Ts_reborn()) { - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } return false; @@ -1634,14 +1654,14 @@ public bool DarkHole_eff() { if (enemy.IsMonsterDangerous()) { - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } if (enemy.IsFaceup() && (enemy.GetDefensePower() > bestenemy)) bestenemy = enemy.GetDefensePower(); } if (bestPower <= bestenemy) { - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } } @@ -1697,6 +1717,11 @@ public override bool OnSelectHand() public override void OnNewTurn() { + if (Duel.Turn <= 1) + { + GraveCall_count = 0; + GraveCall_id = 0; + } NormalSummoned = false; stage_locked = null; pink_ss = false; @@ -1705,6 +1730,7 @@ public override void OnNewTurn() white_eff_used = false; lockbird_useful = false; lockbird_used = false; + Impermanence_list.Clear(); if (GraveCall_count > 0) { if (--GraveCall_count <= 0) @@ -1714,6 +1740,27 @@ public override void OnNewTurn() } } + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + Impermanence_list.Add(4-i); + break; + } + } + } + } + base.OnChaining(player, card); + } + public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList defenders) { ClientCard lowestattack = null; diff --git a/Game/AI/Decks/WitchcraftExecutor.cs b/Game/AI/Decks/WitchcraftExecutor.cs index b977c8ac8..0b66222a6 100644 --- a/Game/AI/Decks/WitchcraftExecutor.cs +++ b/Game/AI/Decks/WitchcraftExecutor.cs @@ -269,6 +269,7 @@ public override void OnChaining(int player, ClientCard card) // new turn reset public override void OnNewTurn() { + if (Duel.Turn <= 1) CalledbytheGraveCount.Clear(); CrossoutDesignatorTarget = 0; MadameVerreGainedATK = false; summoned = false; @@ -858,27 +859,44 @@ public bool NegatedCheck(bool disablecheck = true){ /// Card to set(default current card) /// Whether need to avoid InfiniteImpermanence /// Whether need to avoid set in this place - public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List avoid_list=null) + public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List avoid_list = null) { - List list = new List { 0, 1, 2, 3, 4 }; + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; + if (avoid_list != null && avoid_list.Contains(seq)) continue; + list.Add(seq); + } + } int n = list.Count; while (n-- > 1) { - int index = Program.Rand.Next(n + 1); - int temp = list[index]; - list[index] = list[n]; - list[n] = temp; + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; } - foreach (int seq in list) + if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) { - int zone = (int)System.Math.Pow(2, seq); - if (Bot.SpellZone[seq] == null) + foreach (int seq in list) { - if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; - if (avoid_list != null && avoid_list.Contains(seq)) continue; + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); AI.SelectPlace(zone); return; - }; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; } AI.SelectPlace(0); } diff --git a/Game/AI/Decks/ZefraExecutor.cs b/Game/AI/Decks/ZefraExecutor.cs index 40bef73ab..b6ed0fd47 100644 --- a/Game/AI/Decks/ZefraExecutor.cs +++ b/Game/AI/Decks/ZefraExecutor.cs @@ -2115,7 +2115,9 @@ public override IList OnSelectCard(IList cards, int min, result.AddRange(tRelease); result.AddRange(nRelease); } - return Func.CheckSelectCount(Util, result, cards, min, max); + IList selectResult = Func.CheckSelectCount(Util, result, cards, min, max); + if (selectResult == null) return base.OnSelectCard(cards, min, max, hint, cancelable); + return selectResult; } private bool HasInDeck(int id) { From 6d4d8bbc4ae0be4e5bb4f70ac8a7522ce00f38e6 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Thu, 11 Jan 2024 16:56:01 +0800 Subject: [PATCH 014/110] AI_Labrynth (#181) --- BotWrapper/bot.conf | 5 + Decks/AI_Labrynth.ydk | 59 + Game/AI/Decks/DogmatikaExecutor.cs | 4 +- Game/AI/Decks/LabrynthExecutor.cs | 4368 ++++++++++++++++++++++++++++ Game/AI/DefaultExecutor.cs | 39 +- Game/AI/Enums/Floodgate.cs | 1 + Game/AI/Enums/FusionSpell.cs | 1 + Game/AI/Executor.cs | 8 +- Game/AI/HintMsg.cs | 7 +- Game/GameAI.cs | 14 +- Game/GameBehavior.cs | 11 +- WindBot.csproj | 1 + 12 files changed, 4505 insertions(+), 13 deletions(-) create mode 100644 Decks/AI_Labrynth.ydk create mode 100644 Game/AI/Decks/LabrynthExecutor.cs diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index e30e48f90..8bea59a4c 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -99,6 +99,11 @@ Name=尼亚 Deck=Altergeist Dialog=near.zh-CN 幻变骚灵卡组。 AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +!尼亚-拉比林斯迷宫 +Name=尼亚 Deck=Labrynth Dialog=near.zh-CN +拉比林斯迷宫卡组。 +AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + !复制梁龙-闪刀姬 Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN 旧式闪刀姬卡组。 diff --git a/Decks/AI_Labrynth.ydk b/Decks/AI_Labrynth.ydk new file mode 100644 index 000000000..d5bcea379 --- /dev/null +++ b/Decks/AI_Labrynth.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +81497285 +81497285 +2347656 +41165831 +73602965 +73602965 +75730490 +1225009 +1225009 +1225009 +37629703 +37629703 +37629703 +14558127 +14558127 +14558127 +23434538 +23434538 +23434538 +74018812 +74018812 +74018812 +2511 +2511 +2511 +49238328 +49238328 +5380979 +5380979 +6351147 +6351147 +10045474 +10045474 +10045474 +30748475 +53417695 +83326048 +92714517 +92714517 +92714517 +#extra +22850702 +22850702 +93039339 +93039339 +29479265 +93084621 +93084621 +24269961 +24269961 +24269961 +67680512 +67680512 +29301450 +71607202 +94259633 +!side diff --git a/Game/AI/Decks/DogmatikaExecutor.cs b/Game/AI/Decks/DogmatikaExecutor.cs index db5d2b6b4..2e6c7b394 100644 --- a/Game/AI/Decks/DogmatikaExecutor.cs +++ b/Game/AI/Decks/DogmatikaExecutor.cs @@ -1081,7 +1081,7 @@ public override void OnNewTurn() } } - public override void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) { if (previousControler == 1 && currentLocation == (int)CardLocation.MonsterZone) { @@ -1093,7 +1093,7 @@ public override void OnMove(int cardId, int previousControler, int previousLocat } } - base.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); } public override BattlePhaseAction OnBattle(IList attackers, IList defenders) diff --git a/Game/AI/Decks/LabrynthExecutor.cs b/Game/AI/Decks/LabrynthExecutor.cs new file mode 100644 index 000000000..9a20f7479 --- /dev/null +++ b/Game/AI/Decks/LabrynthExecutor.cs @@ -0,0 +1,4368 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Labrynth", "AI_Labrynth")] + public class LabrynthExecutor : DefaultExecutor + { + public class CardId + { + public const int LadyLabrynthOfTheSilverCastle = 81497285; + public const int LovelyLabrynthOfTheSilverCastle = 2347656; + public const int UnchainedSoulOfSharvara = 41165831; + public const int AriasTheLabrynthButler = 73602965; + public const int ArianeTheLabrynthServant = 75730490; + public const int AriannaTheLabrynthServant = 1225009; + public const int LabrynthChandraglier = 37629703; + // _CardId.AshBlossom = 14558127; + // _CardId.MaxxC = 23434538; + public const int LabrynthStovieTorbie = 74018812; + public const int LabrynthCooclock = 2511; + + public const int PotOfExtravagance = 49238328; + + public const int WelcomeLabrynth = 5380979; + public const int TransactionRollback = 6351147; + // _CardId.InfiniteImpermanence = 10045474; + public const int DestructiveDarumaKarmaCannon = 30748475; + public const int EscapeOfTheUnchained = 53417695; + // _CardId.DimensionalBarrier = 83326048; + public const int BigWelcomeLabrynth = 92714517; + + public const int ChaosAngel = 22850702; + public const int SuperStarslayerTYPHON = 93039339; + public const int UnchainedAbomination = 29479265; + public const int UnchainedSoulOfAnguish = 93084621; + public const int UnchainedSoulLordOfYama = 24269961; + public const int UnchainedSoulOfRage = 67680512; + public const int SPLittleKnight = 29301450; + public const int MuckrakerFromTheUnderworld = 71607202; + public const int RelinquishedAnima = 94259633; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int AccesscodeTalker = 86066372; + public const int GhostMournerMoonlitChill = 52038441; + } + + public LabrynthExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // startup effect/triggered chain + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, CardId.PotOfExtravagance, PotOfExtravaganceActivate); + AddExecutor(ExecutorType.Repos, CardId.LovelyLabrynthOfTheSilverCastle, ReposForLabrynth); + AddExecutor(ExecutorType.Activate, CardId.ChaosAngel, ChaosAngelActivate); + AddExecutor(ExecutorType.Activate, CardId.LovelyLabrynthOfTheSilverCastle, LovelyLabrynthOfTheSilverCastleActivate); + AddExecutor(ExecutorType.Activate, CardId.RelinquishedAnima, RelinquishedAnimaActivate); + AddExecutor(ExecutorType.Activate, CardId.AriannaTheLabrynthServant, AriannaTheLabrynthServantActivate); + AddExecutor(ExecutorType.Activate, CardId.ArianeTheLabrynthServant, ArianeTheLabrynthServantActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthChandraglier, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthStovieTorbie, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthCooclock, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.UnchainedSoulLordOfYama, UnchainedSoulLordOfYamaActivate); + AddExecutor(ExecutorType.Activate, CardId.WelcomeLabrynth, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.SuperStarslayerTYPHON, SuperStarslayerTYPHONActivate); + AddExecutor(ExecutorType.Activate, CardId.UnchainedAbomination, UnchainedAbominationActivate); + + // repos + AddExecutor(ExecutorType.Repos, CardId.ArianeTheLabrynthServant, ReposForLabrynth); + AddExecutor(ExecutorType.Repos, CardId.AriannaTheLabrynthServant, ReposForLabrynth); + + // negate/chain + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.LadyLabrynthOfTheSilverCastle, LadyLabrynthOfTheSilverCastleFieldActivate); + AddExecutor(ExecutorType.Activate, CardId.AriasTheLabrynthButler, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.SPLittleKnight, SPLittleKnightActivate); + AddExecutor(ExecutorType.Activate, _CardId.DimensionalBarrier, DimensionalBarrierActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + + AddExecutor(ExecutorType.Activate, CardId.MuckrakerFromTheUnderworld, MuckrakerFromTheUnderworldActivate); + AddExecutor(ExecutorType.Activate, CardId.UnchainedSoulOfRage, UnchainedSoulOfRageActivate); + AddExecutor(ExecutorType.Activate, CardId.TransactionRollback, TransactionRollbackActivate); + AddExecutor(ExecutorType.Activate, CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonActivate); + AddExecutor(ExecutorType.Activate, CardId.EscapeOfTheUnchained, EscapeOfTheUnchainedActivate); + + // sp summon + AddExecutor(ExecutorType.Activate, CardId.LadyLabrynthOfTheSilverCastle, LadyLabrynthOfTheSilverCastleHandActivate); + AddExecutor(ExecutorType.Activate, CardId.BigWelcomeLabrynth, BigWelcomeLabrynthBecomeTargetActivate); + AddExecutor(ExecutorType.Activate, CardId.WelcomeLabrynth, WelcomeLabrynthActivate); + AddExecutor(ExecutorType.Activate, CardId.BigWelcomeLabrynth, BigWelcomeLabrynthActivate); + + // clock + AddExecutor(ExecutorType.Activate, CardId.AriasTheLabrynthButler, AriasTheLabrynthButlerActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthCooclock, LabrynthCooclockActivate); + AddExecutor(ExecutorType.Activate, CardId.BigWelcomeLabrynth, BigWelcomeLabrynthGraveActivate); + AddExecutor(ExecutorType.Activate, CardId.UnchainedSoulOfAnguish, UnchainedSoulOfAnguishActivate); + + // summon step + AddExecutor(ExecutorType.SpellSet, SpellSetForCooClockCheck); + AddExecutor(ExecutorType.Summon, CardId.ArianeTheLabrynthServant, ArianeTheLabrynthServantForRollbackSummon); + AddExecutor(ExecutorType.Summon, CardId.AriannaTheLabrynthServant, AriannaTheLabrynthServantSummon); + AddExecutor(ExecutorType.Summon, CardId.ArianeTheLabrynthServant, ArianeTheLabrynthServantSummon); + AddExecutor(ExecutorType.Summon, LabrynthForCooClockSummon); + AddExecutor(ExecutorType.Summon, ForLinkSummon); + AddExecutor(ExecutorType.Summon, ForSynchroSummon); + AddExecutor(ExecutorType.Summon, CardId.LabrynthCooclock, ForAnimaSummon); + + // furniture set + AddExecutor(ExecutorType.Activate, CardId.LabrynthChandraglier, FurnitureSetWelcomeActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthStovieTorbie, FurnitureSetWelcomeActivate); + + // sp summon from extra + AddExecutor(ExecutorType.SpSummon, CardId.ChaosAngel, ChaosAngelSpSummonWith2Monster); + AddExecutor(ExecutorType.SpSummon, CardId.RelinquishedAnima, RelinquishedAnimaSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.UnchainedSoulLordOfYama, UnchainedSoulLordOfYamaSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.UnchainedSoulOfAnguish, UnchainedSoulOfAnguishSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.UnchainedSoulOfRage, UnchainedSoulOfRageSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.UnchainedAbomination, UnchainedAbominationSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SPLittleKnight, SPLittleKnightSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ChaosAngel, ChaosAngelSpSummonWith3Monster); + AddExecutor(ExecutorType.SpSummon, CardId.MuckrakerFromTheUnderworld, MuckrakerFromTheUnderworldSpSummon); + + // hand eff + AddExecutor(ExecutorType.Activate, CardId.UnchainedSoulOfSharvara, UnchainedSoulOfSharvaraActivate); + + AddExecutor(ExecutorType.SpSummon, CardId.SuperStarslayerTYPHON, SuperStarslayerTYPHONSpSummon); + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.Summon, SummonForTYPHONCheck); + AddExecutor(ExecutorType.SummonOrSet, ForBigWelcomeSummon); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeUnchained = 0x130; + const int SetcodeLabrynth = 0x17e; + const int SetcodeHorus = 0x19d; + const int hintTimingMainEnd = 0x4; + const int hintBattleStart = 0x8; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.AriannaTheLabrynthServant, CardId.LabrynthChandraglier, _CardId.AshBlossom, _CardId.MaxxC, + CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, _CardId.InfiniteImpermanence, CardId.BigWelcomeLabrynth }}, + {2, new List { CardId.LadyLabrynthOfTheSilverCastle, CardId.AriasTheLabrynthButler, CardId.PotOfExtravagance, CardId.WelcomeLabrynth, + CardId.TransactionRollback }}, + {1, new List { CardId.LovelyLabrynthOfTheSilverCastle, CardId.UnchainedSoulOfSharvara, CardId.ArianeTheLabrynthServant, + CardId.DestructiveDarumaKarmaCannon, CardId.EscapeOfTheUnchained, _CardId.DimensionalBarrier }} + }; + List notToNegateIdList = new List{ + 58699500, 20343502 + }; + List notToBeTrapTargetList = new List{ + 72144675, 86188410, 41589166, 11443677, 72566043, 1688285, 59071624, 6511113, 48183890, 952523, 22423493, 73639099 + }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + List notToDestroySpellTrap = new List { 50005218, 6767771 }; + + Dictionary calledbytheGraveCount = new Dictionary(); + bool enemyActivateMaxxC = false; + List infiniteImpermanenceList = new List(); + bool summoned = false; + List activatedCardIdList = new List(); + List currentNegateMonsterList = new List(); + List currentDestroyCardList = new List(); + List setTrapThisTurn = new List(); + List summonThisTurn = new List(); + List enemySetThisTurn = new List(); + List escapeTargetList = new List(); + List summonInChainList = new List(); + bool cooclockAffected = false; + bool cooclockActivating = false; + bool furnitureActivating = false; + bool dimensionBarrierAnnouncing = false; + int banSpSummonExceptFiendCount = 0; + int dimensionShifterCount = 0; + int enemySpSummonFromExLastTurn = 0; + int enemySpSummonFromExThisTurn = 0; + bool enemyActivateInfiniteImpermanenceFromHand = false; + int rollbackCopyCardId = 0; + List dimensionalBarrierAnnouced = new List(); + List chainSummoningIdList = new List(3); + ClientCard bigwelcomeEscaseTarget = null; + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List floodagateList = Enemy.GetMonsters().Where(c => c?.Data != null && + c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count() > 0) return floodagateList[0]; + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count() > 0) return dangerList[0]; + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count() > 0) return invincibleList[0]; + + List equippedList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.EquipCards.Count() > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).OrderByDescending(card => card.Attack).ToList(); + if (equippedList.Count() > 0) return equippedList[0]; + + List enemyMonsters = Enemy.GetMonsters().OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count() > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && CheckCanBeTargeted(target, canBeTarget, selfType) && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(target)) + ) return target; + } + } + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + List betterList = Enemy.MonsterZone.GetMonsters() + .Where(card => card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).ToList(); + if (betterList.Count() > 0) return betterList[0]; + } + return null; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count() > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count() > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count() > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count() > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count() > 0) + { + foreach(ClientCard target in enemyMonsters) + { + if ( (target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType) + ) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !notToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count() > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget, ignoreCurrentDestroy, selfType); + if (card != null) + return card; + + card = Enemy.MonsterZone.Where(c => c?.Data != null && c.HasType(CardType.Monster) && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) && (!ignoreCurrentDestroy || currentDestroyCardList.Contains(c))) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + if (card != null) + return card; + + List monsters = Enemy.GetMonsters().Where(c => !ignoreCurrentDestroy || currentDestroyCardList.Contains(c)).ToList(); + + // after GetHighestAttackMonster, the left monsters must be face-down. + if (monsters.Count() > 0 && !onlyFaceup) + return ShuffleList(monsters)[0]; + + return null; + } + + /// + /// check enemy's dangerous card in grave + /// + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom) || card.HasSetcode(SetcodeHorus))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, 9411399, 28954097, 30680659 + }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public int GetEmptyMainMonsterZoneCount() + { + int remainCount = 0; + for (int idx = 0; idx < 5; ++idx) + { + if (Bot.MonsterZone[idx] == null) remainCount++; + } + return remainCount; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemySetThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemySetThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateMonsterList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateMonsterList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public int GetMaterialAttack(List materials) + { + if (Util.IsTurn1OrMain2()) return 0; + int result = 0; + foreach (ClientCard material in materials) + { + if (material.IsAttack() || !summonThisTurn.Contains(material)) result += material.Attack; + } + return result; + } + + public int GetBotCurrentTotalAttack(List exceptList = null) + { + if (Util.IsTurn1OrMain2()) return 0; + int result = 0; + foreach (ClientCard monster in Bot.GetMonsters()) + { + if (exceptList != null && exceptList.Contains(monster)) continue; + if (monster.IsAttack() || !summonThisTurn.Contains(monster)) result += monster.Attack; + } + return result; + } + + public List GetCanBeUsedForLinkMaterial(bool useAdvancedMonster = false, Func exceptRule = null) + { + List materialList = Bot.GetMonsters().Where(card => { + if (card.IsFacedown() || (exceptRule != null && exceptRule(card))) return false; + if (card.IsCode(CardId.MuckrakerFromTheUnderworld) && summonThisTurn.Contains(card)) return false; + if (card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle) && !card.IsDisabled() && Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth)) return false; + if ((card.IsCode(CardId.ChaosAngel) || card.IsCode(CardId.LadyLabrynthOfTheSilverCastle)) + && !useAdvancedMonster && (card.IsAttack() || !summonThisTurn.Contains(card))) return false; + + return true; + }).ToList(); + materialList.Sort(CompareUsableAttack); + return materialList; + } + + public bool CheckCanDirectAttack() + { + return Enemy.GetMonsterCount() == 0 && !activatedCardIdList.Contains(CardId.SPLittleKnight) && Duel.Turn > 1 && Duel.Player == 0 && Duel.Phase < DuelPhase.Main2; + } + + /// + /// Check negated turn count of id + /// + public int CheckCalledbytheGrave(int id) + { + if (!calledbytheGraveCount.ContainsKey(id)) + { + return 0; + } + return calledbytheGraveCount[id]; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 + && (card.IsShouldNotBeSpellTrapTarget() || (!card.IsDisabled() && notToBeTrapTargetList.Contains(card.Id)))) return false; + } + return true; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + public int CheckRemainInDeck(params int[] ids) + { + int sumResult = 0; + foreach (int id in ids) + { + sumResult += CheckRemainInDeck(id); + } + + return sumResult; + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + // how to get here? + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0) + { + if ((Card.IsSpell() || Card.IsTrap() || (((int)type & (int)CardType.Spell) == 0) || (((int)type & (int)CardType.Trap) == 0)) && CheckSpellWillBeNegate()) + return true; + if (CheckCalledbytheGrave(Card.Id) > 0) return true; + if ((Card.IsMonster() || (((int)type & (int)CardType.Monster) == 0)) && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) == 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) return true; + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true, true)) return true; + } + if (disablecheck) return Card.IsDisabled(); + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { CardId.BanisheroftheRadiance, CardId.BanisheroftheLight, CardId.MacroCosmos, CardId.DimensionalFissure, + CardId.KashtiraAriseHeart, 58481572 }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true, false, true) || cf.HasInSpellZone(cardid, true, true)) + { + return true; + } + } + } + return false; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && (Duel.Player == 0 || Bot.GetMonsterCount() > 0)) return true; + return false; + } + + public bool CheckShouldNoMoreSpSummon(bool isLabrynth = true) + { + if (CheckAtAdvantage() && enemyActivateMaxxC && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2)) + { + if (!isLabrynth) return true; + if (cooclockAffected) + { + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth))) return true; + if (Duel.Player == 0 && !summoned) return true; + if (setTrapThisTurn.Count() == 0) return true; + return false; + } + return true; + } + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + + return true; + } + + public bool CheckChainContainEnemyMaxxC() + { + foreach (ClientCard card in Duel.CurrentChain) + { + if (card.Controller == 1 && card.IsCode(_CardId.MaxxC)) return true; + } + + return false; + } + + public bool CheckBigWelcomeCanSpSummon(int cardId) + { + return Bot.HasInHandOrInGraveyard(cardId) || CheckRemainInDeck(cardId) > 0; + } + + public int CompareUsableAttack(ClientCard cardA, ClientCard cardB) + { + if (cardA == null && cardB == null) + return 0; + if (cardA == null) + return -1; + if (cardB == null) + return 1; + int powerA = (cardA.IsDefense() && summonThisTurn.Contains(cardA)) ? 0 : cardA.Attack; + int powerB = (cardB.IsDefense() && summonThisTurn.Contains(cardB)) ? 0 : cardB.Attack; + if (powerA < powerB) + return -1; + if (powerA == powerB) + return CardContainer.CompareCardLevel(cardA, cardB); + return 1; + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + if (currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.EvenlyMatched)) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List notImportantMonster = botMonsters.Where(card => !banishList.Contains(card) + && ((card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && Bot.HasInExtra(card.Id)) + || CheckRemainInDeck(card.Id) > 0)).ToList(); + notImportantMonster.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(notImportantMonster); + + // spells + List faceUpSpells = Bot.GetSpells().Where(c => c.IsFaceup()).ToList(); + banishList.AddRange(ShuffleList(faceUpSpells)); + List faceDownSpells = Bot.GetSpells().Where(c => c.IsFacedown()).ToList(); + banishList.AddRange(ShuffleList(faceDownSpells)); + + List importantMonster = botMonsters.Where(card => !banishList.Contains(card) && !card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle) + && ((card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && !Bot.HasInExtra(card.Id)) + || CheckRemainInDeck(card.Id) == 0)).ToList(); + importantMonster.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(importantMonster); + + // lovely + List lovelyList = botMonsters.Where(card => !banishList.Contains(card) && card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)).ToList(); + lovelyList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(lovelyList); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + + if (currentSolvingChain.IsCode(CardId.LadyLabrynthOfTheSilverCastle) && min == 1 && max == 1 && hint == HintMsg.Set) + { + SortedDictionary> trapCheckDict = new SortedDictionary>{ + {_CardId.DimensionalBarrier, DimensionalBarrierActivate}, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonSetCheck}, + {_CardId.InfiniteImpermanence, InfiniteImpermanenceSetCheck} + }; + foreach (KeyValuePair> pair in trapCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + SelectSTPlace(null, true); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + + ClientCard rollback = cards.FirstOrDefault(card => card.IsCode(CardId.TransactionRollback)); + if (rollback != null) + { + bool haveUnchainSoul = false; + if (!activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara)) + { + haveUnchainSoul |= Bot.HasInHand(CardId.UnchainedSoulOfSharvara); + haveUnchainSoul |= Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 + && Bot.HasInExtra(CardId.UnchainedSoulLordOfYama) && !activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama) + && (CheckRemainInDeck(CardId.UnchainedSoulOfSharvara) > 0 || Bot.HasInGraveyard(CardId.UnchainedSoulOfSharvara)) + && Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasRace(CardRace.Fiend) && card.Level <= 4).Count() >= 2; + } + bool haveAriane = false; + if (!activatedCardIdList.Contains(CardId.ArianeTheLabrynthServant) && Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2) + { + haveAriane |= Bot.HasInMonstersZone(CardId.ArianeTheLabrynthServant); + haveAriane |= Bot.HasInHand(CardId.ArianeTheLabrynthServant) && !summoned; + haveAriane |= Bot.GetSpells().Any(card => card.IsFacedown() && + ( + (card.IsCode(CardId.WelcomeLabrynth) && !activatedCardIdList.Contains(CardId.WelcomeLabrynth) && (cooclockAffected || !setTrapThisTurn.Contains(card))) + || + (card.IsCode(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && (cooclockAffected || !setTrapThisTurn.Contains(card))) + ) + ); + } + + if (haveUnchainSoul || haveAriane) + { + return Util.CheckSelectCount(new List { rollback }, cards, min, max); + } + } + + // welcome check + SortedDictionary welcomeCheck = new SortedDictionary { + {CardId.BigWelcomeLabrynth, cards.FirstOrDefault(card => card.IsCode(CardId.BigWelcomeLabrynth))}, + {CardId.WelcomeLabrynth, cards.FirstOrDefault(card => card.IsCode(CardId.WelcomeLabrynth))} + }; + List welcomeCheckIdList = new List { CardId.BigWelcomeLabrynth, CardId.WelcomeLabrynth }; + foreach (KeyValuePair checkPair in welcomeCheck) + { + if (checkPair.Value != null && !Bot.HasInHand(checkPair.Key) && !Bot.HasInGraveyard(checkPair.Key) + && !Bot.GetSpells().Any(card => card.IsCode(checkPair.Key) && card.IsFacedown())) + { + SelectSTPlace(null, true); + return Util.CheckSelectCount(new List { checkPair.Value }, cards, min, max); + } + } + if (welcomeCheck[CardId.BigWelcomeLabrynth] != null && + !Bot.HasInHand(CardId.BigWelcomeLabrynth) && !Bot.GetSpells().Any(card => card.IsCode(CardId.BigWelcomeLabrynth) && card.IsFacedown())) + { + SelectSTPlace(null, true); + return Util.CheckSelectCount(new List { welcomeCheck[CardId.BigWelcomeLabrynth] }, cards, min, max); + } + + // normal set + List checkIdList = new List{_CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon, + CardId.BigWelcomeLabrynth, CardId.TransactionRollback, CardId.WelcomeLabrynth}; + foreach (int checkId in checkIdList) + { + ClientCard checkCard = cards.FirstOrDefault(card => card.IsCode(checkId)); + if (checkCard != null) + { + SelectSTPlace(null, true); + return Util.CheckSelectCount(new List { checkCard }, cards, min, max); + } + } + } + + if (currentSolvingChain.IsCode(CardId.WelcomeLabrynth)) + { + banSpSummonExceptFiendCount = 2; + } + + if (currentSolvingChain.IsCode(CardId.WelcomeLabrynth) || (currentSolvingChain.IsCode(CardId.TransactionRollback) && rollbackCopyCardId == CardId.WelcomeLabrynth)) + { + Logger.DebugWriteLine("rewrite welcome's select."); + List selection = new List(); + + ClientCard ariane = GetWelcomeOrBigWelcomeTarget(cards, CardId.ArianeTheLabrynthServant); + if (ariane != null && !summonInChainList.Any(card => card.IsCode(CardId.ArianeTheLabrynthServant))) + { + if ((Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 || Duel.Player == 1 && Duel.Phase >= DuelPhase.Main2) + && Bot.HasInHandOrInSpellZone(CardId.TransactionRollback)) + { + selection.Add(ariane); + } + } + + ClientCard arianna = GetWelcomeOrBigWelcomeTarget(cards, CardId.AriannaTheLabrynthServant); + if (arianna != null && !summonInChainList.Any(card => card.IsCode(CardId.AriannaTheLabrynthServant))) + { + bool canActivateCheck = !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !CheckWhetherNegated(true, true, CardType.Monster); + if (canActivateCheck) + { + bool checkFlag = !(!activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && + (Bot.HasInGraveyard(CardId.BigWelcomeLabrynth) || Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth)))); + checkFlag |= !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && (CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle) || Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true)) + && Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth) + && (!setTrapThisTurn.Contains(card) || cooclockAffected)); + checkFlag |= !(Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) + || CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle)); + if (checkFlag) + { + selection.Add(arianna); + } + } + } + + ClientCard arias = GetWelcomeOrBigWelcomeTarget(cards, CardId.AriasTheLabrynthButler); + if (arias != null && !summonInChainList.Any(card => card.IsCode(CardId.AriasTheLabrynthButler)) && !Bot.HasInHandOrHasInMonstersZone(CardId.AriasTheLabrynthButler)) + { + bool canActivateCheck = !activatedCardIdList.Contains(CardId.AriasTheLabrynthButler) && !CheckWhetherNegated(true, true, CardType.Monster); + if (canActivateCheck && Bot.HasInHand(CardId.LovelyLabrynthOfTheSilverCastle)) + { + selection.Add(arias); + } + } + + ClientCard lovely = GetWelcomeOrBigWelcomeTarget(cards, CardId.LovelyLabrynthOfTheSilverCastle); + if (lovely != null && !summonInChainList.Any(card => card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle))) + { + if (Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)) + { + selection.Add(lovely); + } + } + + ClientCard lady = GetWelcomeOrBigWelcomeTarget(cards, CardId.LadyLabrynthOfTheSilverCastle); + if (lady != null) + { + if (Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasRace(CardRace.Fiend) && card.Level >= 8 && !card.HasType(CardType.Xyz | CardType.Link))) + { + selection.Add(lady); + } + } + + bool attackFlag = CheckCanDirectAttack(); + bool defenseFlag = Bot.UnderAttack && Bot.GetMonsterCount() == 0; + if (attackFlag || defenseFlag) + { + ClientCard bestPowerMonster = null; + int bestPower = -1; + foreach (ClientCard target in cards) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(target.Id); + if (cardData != null) + { + int power = attackFlag ? cardData.Attack : Math.Max(cardData.Attack, cardData.Defense); + if (bestPowerMonster == null || power > bestPower) + { + bestPowerMonster = target; + bestPower = power; + } + } + } + if (defenseFlag || GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack() + bestPower >= Enemy.LifePoints) + { + ClientCard realTarget = GetWelcomeOrBigWelcomeTarget(cards, bestPowerMonster.Id); + if (realTarget != null) selection.Add(realTarget); + } + } + + List checkIdList = new List{CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock, CardId.AriasTheLabrynthButler}; + foreach (int checkId in checkIdList) + { + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId)) + { + ClientCard target = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (target != null) selection.Add(target); + } + } + + List fullCheckIdList = new List{ + CardId.LadyLabrynthOfTheSilverCastle, CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock, + CardId.AriasTheLabrynthButler, CardId.ArianeTheLabrynthServant, CardId.AriannaTheLabrynthServant + }; + foreach (int checkId in fullCheckIdList) + { + ClientCard target = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (target != null && !selection.Contains(target)) selection.Add(target); + } + + if (selection.Count() > 0) return Util.CheckSelectCount(selection, cards, min, max); + } + + bool searchFlag = currentSolvingChain.IsCode(CardId.AriannaTheLabrynthServant) && hint == HintMsg.AddToHand; + bool bigwelcomeSoving = currentSolvingChain.IsCode(CardId.BigWelcomeLabrynth) || (currentSolvingChain.IsCode(CardId.TransactionRollback) && rollbackCopyCardId == CardId.BigWelcomeLabrynth); + searchFlag |= bigwelcomeSoving && hint == HintMsg.SpSummon && Bot.GetMonsterCount() == 0; + if (searchFlag) + { + Logger.DebugWriteLine("rewrite search."); + List selection = new List(); + + List furnitureCheckIdList = new List { CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.LabrynthChandraglier }; + ClientCard bigWelcome = GetWelcomeOrBigWelcomeTarget(cards, CardId.BigWelcomeLabrynth); + ClientCard welcome = GetWelcomeOrBigWelcomeTarget(cards, CardId.WelcomeLabrynth); + ClientCard arianna = GetWelcomeOrBigWelcomeTarget(cards, CardId.AriannaTheLabrynthServant); + + // search big welcome to activate this turn + if (Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2) + { + if (!summoned && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !CheckWhetherNegated(true, true, CardType.Monster) + && CheckCalledbytheGrave(CardId.AriannaTheLabrynthServant) == 0 && arianna != null && !Bot.HasInHand(CardId.AriannaTheLabrynthServant)) + { + return Util.CheckSelectCount(new List { arianna }, cards, min, max); + } + if (!CheckShouldNoMoreSpSummon()) + { + if (bigWelcome != null && !activatedCardIdList.Contains(CardId.AriasTheLabrynthButler) + && Bot.HasInHandOrHasInMonstersZone(CardId.AriasTheLabrynthButler)) + { + return Util.CheckSelectCount(new List { bigWelcome }, cards, min, max); + } + + bool canActivateSetTrap = (cooclockAffected || Bot.HasInHand(CardId.LabrynthCooclock)) + && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)); + if (canActivateSetTrap && !Bot.HasInHandOrInSpellZone(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, CardId.BigWelcomeLabrynth) }, cards, min, max); + } + } + } + + // search cooclock/bulter to activate trap + ClientCard arias = null; + ClientCard cooclock = null; + if (!activatedCardIdList.Contains(CardId.AriasTheLabrynthButler) && CheckRemainInDeck(CardId.AriasTheLabrynthButler) > 0 + && !Bot.HasInHand(CardId.AriasTheLabrynthButler)) + { + arias = GetWelcomeOrBigWelcomeTarget(cards, CardId.AriasTheLabrynthButler); + } + if (!activatedCardIdList.Contains(CardId.LabrynthCooclock) && CheckRemainInDeck(CardId.LabrynthCooclock) > 0 + && !Bot.HasInHand(CardId.LabrynthCooclock)) + { + cooclock = GetWelcomeOrBigWelcomeTarget(cards, CardId.LabrynthCooclock); + } + if (arias != null || cooclock != null) + { + SortedDictionary> trapCheckDict = new SortedDictionary> { + {CardId.BigWelcomeLabrynth, BigWelcomeLabrynthSetCheck}, + {_CardId.DimensionalBarrier, DimensionalBarrierActivate}, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonSetCheck}, + {CardId.WelcomeLabrynth, WelcomeLabrynthSetCheck} + }; + foreach (KeyValuePair> checkPair in trapCheckDict) + { + if (Bot.GetSpells().Any(card => card.IsFacedown() && !setTrapThisTurn.Contains(card) && card.IsCode(checkPair.Key))) continue; + if (!activatedCardIdList.Contains(checkPair.Key)) + { + if (Bot.GetSpells().Any(card => card.IsFacedown() && setTrapThisTurn.Contains(card) && card.IsCode(checkPair.Key)) + && cooclock != null) + { + return Util.CheckSelectCount(new List { cooclock }, cards, min, max); + } + else if (Bot.HasInHand(checkPair.Key)) + { + if (checkPair.Value()) + { + if (arias != null) + { + return Util.CheckSelectCount(new List { arias }, cards, min, max); + } + if (Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 && cooclock != null) + { + return Util.CheckSelectCount(new List { cooclock }, cards, min, max); + } + } + } + } + } + } + + bool lackUnimportantCost = !Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)); + if (lackUnimportantCost) + { + List handCost = Bot.Hand.Where(card => card != Card).ToList(); + lackUnimportantCost &= handCost.Count() <= 2 && !handCost.Any(card => !card.IsCode(_CardId.MaxxC, _CardId.AshBlossom, CardId.LabrynthCooclock)); + } + if (!lackUnimportantCost && cooclock != null && bigWelcome != null) + { + foreach (int furnitureId in furnitureCheckIdList) + { + if (furnitureId == CardId.LabrynthCooclock) continue; + if (CheckCalledbytheGrave(furnitureId) == 0 && !activatedCardIdList.Contains(furnitureId) && Bot.HasInHand(furnitureId)) + { + return Util.CheckSelectCount(new List { cooclock }, cards, min, max); + } + } + } + + if (Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2) + { + // search not exist furniture + if (!lackUnimportantCost) + { + foreach (int checkId in furnitureCheckIdList) + { + ClientCard furniture = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && furniture != null) + { + if (checkId == CardId.LabrynthCooclock) + { + if (Enemy.GetMonsterCount() > 0 && !Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.LabrynthChandraglier)) continue; + } + return Util.CheckSelectCount(new List { furniture }, cards, min, max); + } + } + } + + // search big welcome + if (bigWelcome != null) + { + bool needSpSummonLovely = !Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) + && !Bot.HasInHandOrInSpellZone(CardId.BigWelcomeLabrynth) && cards.Any(c => c.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)); + needSpSummonLovely |= Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) && !Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth); + if (needSpSummonLovely) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, CardId.BigWelcomeLabrynth) }, cards, min, max); + } + } + // search welcome + if (welcome != null && Bot.HasInHandOrInSpellZone(CardId.BigWelcomeLabrynth) && !Bot.HasInHandOrInSpellZone(CardId.WelcomeLabrynth)) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, CardId.WelcomeLabrynth) }, cards, min, max); + } + } + + // search big welcome/arias + if (Duel.Player == 1 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) + && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.AriasTheLabrynthButler) + && !Bot.HasInSpellZone(CardId.BigWelcomeLabrynth)) + { + if (Bot.HasInHand(CardId.BigWelcomeLabrynth) && !Bot.HasInHandOrHasInMonstersZone(CardId.AriasTheLabrynthButler) && arias != null) + { + return Util.CheckSelectCount(new List { arias }, cards, min, max); + } + if (Bot.HasInHand(CardId.AriasTheLabrynthButler) && !Bot.HasInHandOrHasInMonstersZone(CardId.BigWelcomeLabrynth) && bigWelcome != null) + { + return Util.CheckSelectCount(new List { bigWelcome }, cards, min, max); + } + } + + // search lady + ClientCard lady = GetWelcomeOrBigWelcomeTarget(cards, CardId.LadyLabrynthOfTheSilverCastle); + bool haveTrap = Duel.Player == 0 && Bot.Hand.Any(card => card.Type == (int)CardType.Trap) && Duel.Phase <= DuelPhase.Main2; + haveTrap |= Bot.GetSpells().Any(card => card.IsFacedown() && card.Type == (int)CardType.Trap); + if (!Bot.HasInHandOrHasInMonstersZone(CardId.LadyLabrynthOfTheSilverCastle) && !activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle) + && haveTrap && lady != null) + { + return Util.CheckSelectCount(new List { lady }, cards, min, max); + } + + if (!activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !CheckWhetherNegated(true, true, CardType.Monster) + && CheckCalledbytheGrave(CardId.AriannaTheLabrynthServant) == 0 && arianna != null && !Bot.HasInHand(CardId.AriannaTheLabrynthServant)) + { + return Util.CheckSelectCount(new List { arianna }, cards, min, max); + } + + // search not exist furniture + if (!lackUnimportantCost) + { + foreach (int checkId in furnitureCheckIdList) + { + ClientCard furniture = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && furniture != null) + { + if (checkId == CardId.LabrynthCooclock) + { + if (Enemy.GetMonsterCount() > 0 && !Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.LabrynthChandraglier)) continue; + } + return Util.CheckSelectCount(new List { furniture }, cards, min, max); + } + } + } + + // search not exist card + List uniqueCheckIdList = new List{ + CardId.BigWelcomeLabrynth, CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.LabrynthChandraglier, + CardId.LadyLabrynthOfTheSilverCastle, CardId.AriasTheLabrynthButler, CardId.ArianeTheLabrynthServant, CardId.WelcomeLabrynth}; + foreach (int checkId in uniqueCheckIdList) + { + ClientCard targetCard = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (!Bot.HasInMonstersZone(checkId) && !Bot.HasInHandOrInSpellZone(checkId) && targetCard != null) + { + if (checkId == CardId.BigWelcomeLabrynth || checkId == CardId.WelcomeLabrynth) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, checkId) }, cards, min, max); + } + else + { + return Util.CheckSelectCount(new List { targetCard }, cards, min, max); + } + } + } + + foreach (int checkId in uniqueCheckIdList) + { + ClientCard targetCard = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (CheckRemainInDeck(checkId) > 0) + { + if (checkId == CardId.BigWelcomeLabrynth || checkId == CardId.WelcomeLabrynth) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, checkId) }, cards, min, max); + } + else + { + return Util.CheckSelectCount(new List { targetCard }, cards, min, max); + } + } + } + } + + // solved when have more than 1 monster + if (bigwelcomeSoving && hint == HintMsg.SpSummon) + { + bool activateTimingFlag = Duel.Phase > DuelPhase.Main2 || (Card.IsCode(CardId.AriasTheLabrynthButler) && (CurrentTiming & hintTimingMainEnd) > 0); + + bool needDestroyFlag = GetProblematicEnemyCardList(false).Count() > 0; + needDestroyFlag |= activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && activateTimingFlag; + needDestroyFlag |= Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && Duel.LastChainPlayer != 0; + needDestroyFlag |= Duel.Turn == 1 && Duel.Player == 0 && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + needDestroyFlag |= Duel.Turn == 1 && Enemy.GetMonsterCount() == 0 && Enemy.GetSpellCount() == 0 && Enemy.Hand.Count > 0 + && (CurrentTiming & hintTimingMainEnd) > 0; + + if (needDestroyFlag && cards.Any(c => c.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) + && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.LovelyLabrynthOfTheSilverCastle) }, cards, min, max); + } + if (cards.Any(c => c.IsCode(CardId.AriannaTheLabrynthServant)) + && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !Bot.HasInMonstersZone(CardId.AriannaTheLabrynthServant)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.AriannaTheLabrynthServant) }, cards, min, max); + } + if (cards.Any(c => c.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) + && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.LovelyLabrynthOfTheSilverCastle) }, cards, min, max); + } + if (cards.Any(c => c.IsCode(CardId.AriannaTheLabrynthServant)) + && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.AriannaTheLabrynthServant) }, cards, min, max); + } + if (cards.Any(c => c.IsCode(CardId.LadyLabrynthOfTheSilverCastle)) + && Duel.Turn > 1 && Duel.Phase < DuelPhase.Main2 && Duel.Player == 0 && Enemy.GetMonsterCount() == 0) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.LadyLabrynthOfTheSilverCastle) }, cards, min, max); + } + List furnitureCheckIdList = new List { CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.LabrynthChandraglier, CardId.AriasTheLabrynthButler }; + foreach (int furniture in furnitureCheckIdList) + { + if (cards.Any(c => c.IsCode(furniture)) && !Bot.HasInHandOrInMonstersZoneOrInGraveyard(furniture)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, furniture) }, cards, min, max); + } + } + List checkIdList = new List{CardId.ArianeTheLabrynthServant, CardId.LadyLabrynthOfTheSilverCastle, CardId.AriannaTheLabrynthServant, + CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.LabrynthChandraglier, CardId.AriasTheLabrynthButler}; + foreach (int checkId in checkIdList) + { + if (cards.Any(c => c.IsCode(checkId))) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, checkId) }, cards, min, max); + } + } + // should not get here + Logger.DebugWriteLine("[warning] call BigWelcomeSpSummon with no select."); + } + + if (bigwelcomeSoving && hint == HintMsg.ReturnToHand) + { + if (bigwelcomeEscaseTarget != null && cards.Contains(bigwelcomeEscaseTarget)) + { + return Util.CheckSelectCount(new List { bigwelcomeEscaseTarget }, cards, min, max); + } + + ClientCard cooclock = cards.FirstOrDefault(c => c.IsCode(CardId.LabrynthCooclock)); + bool canSearchWelcome = CheckRemainInDeck(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth) > 0 + && (Bot.HasInHandOrHasInMonstersZone(new List { CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie }) + || summonInChainList.Any(c => c.IsCode(CardId.AriannaTheLabrynthServant)) + || (Duel.Player == 0 && !summoned && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && Bot.HasInHand(CardId.AriannaTheLabrynthServant))); + if (cooclock != null) + { + if (setTrapThisTurn.Count() > 0 + || (Duel.Turn == 1 && ( + (!activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle) && Bot.HasInHandOrHasInMonstersZone(CardId.LadyLabrynthOfTheSilverCastle)) + || canSearchWelcome + ) + ) + || Duel.Turn == 0 && canSearchWelcome + ) + return Util.CheckSelectCount(new List { cooclock }, cards, min, max); + } + + ClientCard defenseLady = cards.FirstOrDefault(c => c.IsDefense() && c.IsCode(CardId.LadyLabrynthOfTheSilverCastle)); + ClientCard attackLady = cards.FirstOrDefault(c => c.IsAttack() && c.IsCode(CardId.LadyLabrynthOfTheSilverCastle)); + if (Bot.GetMonsters().Any(card => (Duel.Player == 1 || card.IsDefense()) && card.IsCode(CardId.LadyLabrynthOfTheSilverCastle)) + && (!activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle) || activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle + 1))) + { + if (defenseLady != null) return Util.CheckSelectCount(new List { defenseLady }, cards, min, max); + if (attackLady != null) return Util.CheckSelectCount(new List { attackLady }, cards, min, max); + } + if (summonInChainList.Any(c => c.IsCode(CardId.LovelyLabrynthOfTheSilverCastle))) + { + List returnCheckIdList = new List{ + _CardId.MaxxC, CardId.AriannaTheLabrynthServant, _CardId.AshBlossom, CardId.LabrynthCooclock, CardId.LadyLabrynthOfTheSilverCastle, + CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, CardId.AriasTheLabrynthButler, CardId.UnchainedSoulOfSharvara, CardId.ArianeTheLabrynthServant + }; + foreach (int checkId in returnCheckIdList) + { + ClientCard returnTarget = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (returnTarget != null) return Util.CheckSelectCount(new List { returnTarget }, cards, min, max); + } + return Util.CheckSelectCount(cards.OrderBy(card => card.Attack).ToList(), cards, min, max); + } + if (cards.Count() == 1) return Util.CheckSelectCount(cards.OrderBy(card => card.Attack).ToList(), cards, min, max); + ClientCard ariannaNotSummon = cards.FirstOrDefault(c => c.IsCode(CardId.AriannaTheLabrynthServant) && !summonInChainList.Contains(c)); + if (ariannaNotSummon != null) return Util.CheckSelectCount(new List { ariannaNotSummon }, cards, min, max); + else + { + // compare which have lower attack + ClientCard fieldTarget = Bot.GetMonsters().Where(card => !card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) + .OrderBy(card => card.Attack).FirstOrDefault(); + if (fieldTarget != null) return Util.CheckSelectCount(new List { fieldTarget }, cards, min, max); + } + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public ClientCard GetWelcomeOrBigWelcomeTarget(IList cards, int cardId) + { + ClientCard graveTarget = cards.FirstOrDefault(card => card.IsCode(cardId) && card.Location == CardLocation.Grave); + if (graveTarget != null) return graveTarget; + ClientCard deckTarget = cards.FirstOrDefault(card => card.IsCode(cardId) && card.Location == CardLocation.Deck); + if (deckTarget != null) return deckTarget; + ClientCard handTarget = cards.FirstOrDefault(card => card.IsCode(cardId) && card.Location == CardLocation.Hand); + if (handTarget != null) return handTarget; + return null; + } + + public ClientCard AriannaSearchWelcomeTrap(IList cards, int welcomeId) + { + bool haveCostToSolve = Bot.HasInHand(new List { CardId.LovelyLabrynthOfTheSilverCastle, CardId.TransactionRollback, CardId.AriasTheLabrynthButler }); + if (haveCostToSolve) + { + List checkIdList = new List { CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier }; + foreach (int checkId in checkIdList) + { + ClientCard targetCard = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (targetCard != null && !Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && CheckCalledbytheGrave(checkId) == 0 && !activatedCardIdList.Contains(checkId)) + { + return targetCard; + } + } + foreach (int checkId in checkIdList) + { + ClientCard targetCard = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (targetCard != null && CheckCalledbytheGrave(checkId) == 0 && !activatedCardIdList.Contains(checkId)) + { + return targetCard; + } + } + } + + return GetWelcomeOrBigWelcomeTarget(cards, welcomeId); + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + public override bool OnSelectMonsterSummonOrSet(ClientCard card) + { + if (card.Attack > 0 && CheckCanDirectAttack()) return false; + if (card.Attack <= 1000) return true; + + return base.OnSelectMonsterSummonOrSet(card); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + // selected in summon process + if (cardId == CardId.RelinquishedAnima) + { + return base.OnSelectPlace(cardId, player, location, available); + } + if (cardId == CardId.UnchainedSoulLordOfYama || cardId == CardId.UnchainedSoulOfAnguish) + { + if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null && (Zones.z6 & available) != 0) return Zones.z6; + if (Bot.MonsterZone[2] != null && Bot.MonsterZone[4] != null && (Zones.z5 & available) != 0) return Zones.z5; + } + if (cardId == CardId.MuckrakerFromTheUnderworld || cardId == CardId.UnchainedSoulOfRage) + { + if (Bot.MonsterZone[1] != null && (Zones.z6 & available) != 0) return Zones.z6; + if (Bot.MonsterZone[3] != null && (Zones.z5 & available) != 0) return Zones.z5; + } + + List zoneIdList = ShuffleList(new List { 0, 2, 4 }); + zoneIdList.AddRange(ShuffleList(new List { 1, 3 })); + zoneIdList.AddRange(ShuffleList(new List { 5, 6 })); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + return zone; + } + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override int OnSelectOption(IList options) + { + // override for cooclock + if (options.Count() == 2 && options.Contains(1190) && options.Contains(1152)) + { + // 1190=Add to Hand, 1152=Special Summon + // return to hand to activate trap set this turn + bool canLink = Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2; + if (!canLink && !Bot.HasInHand(CardId.LabrynthCooclock) && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)) + && !activatedCardIdList.Contains(CardId.LabrynthCooclock) && !CheckWhetherWillbeRemoved() + && (activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) || Bot.GetSpells().All(card => setTrapThisTurn.Contains(card) || !card.IsCode(CardId.BigWelcomeLabrynth))) + && setTrapThisTurn.Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth, _CardId.DimensionalBarrier, _CardId.InfiniteImpermanence, CardId.DestructiveDarumaKarmaCannon))) + { + return options.IndexOf(1190); + } + if (!enemyActivateMaxxC) return options.IndexOf(1152); + if (activatedCardIdList.Contains(CardId.LabrynthCooclock)) + { + if (!CheckShouldNoMoreSpSummon()) return options.IndexOf(1152); + } + return options.IndexOf(1190); + } + + // overrride for lovely + if (options.Contains(Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 3)) && options.Contains(Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 4))) + { + int botWorstAttack = 0; + ClientCard botWorstMonster = Util.GetWorstBotMonster(true); + if (botWorstMonster != null) + { + botWorstAttack = botWorstMonster.Attack; + } + List targetList = GetProblematicEnemyCardList(false); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && card.GetDefensePower() >= botWorstAttack && !currentDestroyCardList.Contains(card)).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => !currentDestroyCardList.Contains(card) && card.IsFacedown()).ToList())); + if (targetList.Count() > 0) + { + currentDestroyCardList.Add(targetList[0]); + AI.SelectCard(targetList); + return options.IndexOf(Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 4)); + } + else + { + return options.IndexOf(Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 3)); + } + } + + // override for dimensional barrier + if (options.IndexOf(HintMsg.RITUAL) >= 0 || options.IndexOf(HintMsg.FUSION) >= 0 || options.IndexOf(HintMsg.SYNCHRO) >= 0 + || options.IndexOf(HintMsg.XYZ) >= 0 || options.IndexOf(HintMsg.PENDULUM) >= 0) + { + Dictionary> barrierCheckDict = new Dictionary> + { + {HintMsg.RITUAL, DimensionalBarrierForRitual}, + {HintMsg.FUSION, DimensionalBarrierForFusion}, + {HintMsg.SYNCHRO, DimensionalBarrierForSynchro}, + {HintMsg.XYZ, DimensionalBarrierForXyz}, + {HintMsg.PENDULUM, DimensionalBarrierForPendulum}, + }; + dimensionBarrierAnnouncing = true; + foreach (KeyValuePair> checkPair in barrierCheckDict) + { + if (options.Contains(checkPair.Key) && checkPair.Value()) + { + dimensionBarrierAnnouncing = false; + dimensionalBarrierAnnouced.Add(checkPair.Key); + return options.IndexOf(checkPair.Key); + } + } + dimensionBarrierAnnouncing = false; + List enemyMonsterList = new List(Enemy.GetMonsters()); + enemyMonsterList.AddRange(Enemy.GetGraveyardMonsters()); + Dictionary barrierCheckSecondark = new Dictionary + { + {HintMsg.RITUAL, enemyMonsterList.Any(card => card.HasType(CardType.Ritual))}, + {HintMsg.FUSION, enemyMonsterList.Any(card => card.HasType(CardType.Fusion))}, + {HintMsg.SYNCHRO, enemyMonsterList.Any(card => card.HasType(CardType.Synchro))}, + {HintMsg.XYZ, enemyMonsterList.Any(card => card.HasType(CardType.Xyz))}, + {HintMsg.PENDULUM, enemyMonsterList.Any(card => card.HasType(CardType.Pendulum))}, + }; + foreach (KeyValuePair checkPair in barrierCheckSecondark) + { + if (options.Contains(checkPair.Key) && checkPair.Value) + { + dimensionBarrierAnnouncing = false; + dimensionalBarrierAnnouced.Add(checkPair.Key); + return options.IndexOf(checkPair.Key); + } + } + List annouceList = new List { HintMsg.XYZ, HintMsg.SYNCHRO, HintMsg.FUSION, HintMsg.PENDULUM, HintMsg.RITUAL }; + foreach (int annouce in annouceList) + { + if (options.Contains(annouce)) + { + return options.IndexOf(annouce); + } + } + } + + // override for servant + // sp summon + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 2)) || options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 2))) + { + if (GetEmptyMainMonsterZoneCount() > chainSummoningIdList.Count()) + { + bool checkFlag = false; + if (!activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && Bot.HasInHand(CardId.AriannaTheLabrynthServant) + && !CheckWhetherNegated(true, true, CardType.Monster) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + checkFlag = true; + AI.SelectCard(CardId.AriannaTheLabrynthServant); + } + if (!checkFlag) + { + List checkIdList = new List { CardId.LovelyLabrynthOfTheSilverCastle, CardId.LadyLabrynthOfTheSilverCastle }; + foreach (int checkId in checkIdList) + { + if (Bot.HasInHand(checkId)) + { + checkFlag = true; + AI.SelectCard(checkId); + break; + } + } + } + if (!checkFlag && Duel.Player == 0 && Duel.Phase < DuelPhase.End) + { + List linkMaterialList = GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)); + if (linkMaterialList.Count() + chainSummoningIdList.Count() == 2) + { + // summon less atk for link + ClientCard selected = null; + int attack = 0; + foreach (ClientCard hand in Bot.Hand) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(hand.Id); + if (cardData == null || cardData.Race != (int)CardRace.Fiend) continue; + if (selected == null || attack > hand.Attack) + { + selected = hand; + attack = hand.Attack; + } + } + if (selected != null) + { + checkFlag = true; + AI.SelectCard(selected); + } + } + } + if (!checkFlag && CheckCanDirectAttack()) + { + // summon best attack for attack + ClientCard selected = null; + int attack = 0; + foreach (ClientCard hand in Bot.Hand) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(hand.Id); + if (cardData == null || cardData.Race != (int)CardRace.Fiend) continue; + if (selected == null || attack < hand.Attack) + { + selected = hand; + attack = hand.Attack; + } + } + if (selected != null) + { + checkFlag = true; + AI.SelectCard(selected); + } + } + + if (checkFlag) + { + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 2))) return options.IndexOf(Util.GetStringId(CardId.AriannaTheLabrynthServant, 2)); + if (options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 2))) return options.IndexOf(Util.GetStringId(CardId.ArianeTheLabrynthServant, 2)); + } + } + } + + // set + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 3)) || options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 3))) + { + if (!Util.ChainContainsCard(CardId.WelcomeLabrynth) || Bot.GetSpellCountWithoutField() < 4) + { + List checkIdList = new List { CardId.BigWelcomeLabrynth, CardId.WelcomeLabrynth, _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon }; + foreach (int checkId in checkIdList) + { + if (Bot.HasInHand(checkId) && (checkId == _CardId.InfiniteImpermanence || !Bot.HasInSpellZone(checkId, faceUp:false))) + { + AI.SelectCard(checkId); + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 3))) return options.IndexOf(Util.GetStringId(CardId.AriannaTheLabrynthServant, 3)); + if (options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 3))) return options.IndexOf(Util.GetStringId(CardId.ArianeTheLabrynthServant, 3)); + } + } + } + } + + // do nothing + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 4))) return options.IndexOf(Util.GetStringId(CardId.AriannaTheLabrynthServant, 4)); + if (options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 4))) return options.IndexOf(Util.GetStringId(CardId.ArianeTheLabrynthServant, 4)); + + return base.OnSelectOption(options); + } + + public override bool OnSelectYesNo(int desc) + { + if (desc == 96) + { + Logger.DebugWriteLine("*** muckraker replace."); + AI.SelectCard(Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasRace(CardRace.Fiend)).OrderBy(card => card.Attack).ToList()); + return true; + } + return base.OnSelectYesNo(desc); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + calledbytheGraveCount.Clear(); + dimensionShifterCount = 0; + + enemySpSummonFromExLastTurn = 0; + enemySpSummonFromExThisTurn = 0; + banSpSummonExceptFiendCount = 0; + } + enemyActivateMaxxC = false; + enemySpSummonFromExLastTurn = enemySpSummonFromExThisTurn; + enemySpSummonFromExThisTurn = 0; + rollbackCopyCardId = 0; + + List keyList = calledbytheGraveCount.Keys.ToList(); + foreach (int dic in keyList) + { + if (calledbytheGraveCount[dic] > 1) calledbytheGraveCount[dic] -= 1; + } + if (dimensionShifterCount > 0) dimensionShifterCount--; + if (banSpSummonExceptFiendCount > 0) banSpSummonExceptFiendCount--; + infiniteImpermanenceList.Clear(); + + summoned = false; + cooclockAffected = false; + activatedCardIdList.Clear(); + setTrapThisTurn.Clear(); + summonThisTurn.Clear(); + enemySetThisTurn.Clear(); + dimensionalBarrierAnnouced.Clear(); + summonInChainList.Clear(); + } + + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + if (chainSummoningIdList.Count() > 0) + Logger.DebugWriteLine("[Welcome] Summoning: " + string.Join(",", chainSummoningIdList) + "\n"); + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + if (enemyActivateInfiniteImpermanenceFromHand) + { + enemyActivateInfiniteImpermanenceFromHand = false; + } + else { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4-i); + break; + } + } + } + } + } + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated()) + { + if (currentCard.Controller == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(CardId.DimensionShifter)) + dimensionShifterCount = 2; + } + if (currentCard.Controller == 0) + { + if (currentCard.IsCode(CardId.LabrynthCooclock)) + cooclockAffected = true; + } + } + + base.OnChainSolved(chainIndex); + } + + public override void OnChainEnd() + { + rollbackCopyCardId = 0; + currentNegateMonsterList.Clear(); + currentDestroyCardList.Clear(); + escapeTargetList.Clear(); + chainSummoningIdList.Clear(); + summonInChainList.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + for (int idx = enemySetThisTurn.Count() - 1; idx >= 0; idx --) + { + ClientCard checkTarget = enemySetThisTurn[idx]; + if (checkTarget == null || checkTarget.Location != CardLocation.SpellZone || checkTarget.HasPosition(CardPosition.FaceUp)) + { + enemySetThisTurn.RemoveAt(idx); + } + } + if (cooclockActivating) + cooclockActivating = false; + furnitureActivating = false; + dimensionBarrierAnnouncing = false; + bigwelcomeEscaseTarget = null; + base.OnChainEnd(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (previousControler == 1) + { + if (previousLocation == (int)CardLocation.Extra && currentLocation == (int)CardLocation.MonsterZone) enemySpSummonFromExThisTurn ++; + if (card != null) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && previousLocation == (int)CardLocation.Hand && currentLocation == (int)CardLocation.SpellZone) + enemyActivateInfiniteImpermanenceFromHand = true; + if (card.Location == CardLocation.SpellZone && card.HasPosition(CardPosition.FaceDown)) + enemySetThisTurn.Add(card); + } + } + if (previousControler == 0) + { + if (previousLocation == (int)CardLocation.MonsterZone && currentLocation != (int)CardLocation.MonsterZone) + { + if (summonThisTurn.Contains(card)) summonThisTurn.Remove(card); + if (summonInChainList.Contains(card)) summonInChainList.Remove(card); + } + if (previousLocation == (int)CardLocation.SpellZone && currentLocation != (int)CardLocation.SpellZone) + { + if (setTrapThisTurn.Contains(card)) setTrapThisTurn.Remove(card); + } + } + if (currentControler == 0) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentLocation == (int)CardLocation.SpellZone && (currentSolvingChain == null || !currentSolvingChain.IsCode(CardId.AriasTheLabrynthButler)) + && card != null && (card.HasType(CardType.Trap) || card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)) + ) + { + Logger.DebugWriteLine("[setTrapThisTurn]set " + card.Name ?? "UnknowCard"); + setTrapThisTurn.Add(card); + } + if (currentLocation == (int)CardLocation.MonsterZone) + { + summonThisTurn.Add(card); + if (currentSolvingChain != null) summonInChainList.Add(card); + } + if (previousLocation == (int)CardLocation.Grave && currentLocation == (int)CardLocation.Removed) + { + if (currentSolvingChain != null && currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.CalledByTheGrave)) + { + Logger.DebugWriteLine("*** " + (card.Name ?? "UnknowCard") + " is banished by CallByTheGrave"); + calledbytheGraveCount[card.Id] = 2; + } + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + public override BattlePhaseAction OnBattle(IList attackers, IList defenders) + { + if (attackers.Count() > 0 && defenders.Count() > 0) + { + List sortedAttacker = attackers.OrderBy(card => card.Attack).ToList(); + for (int k = 0; k < sortedAttacker.Count; ++k) + { + ClientCard attacker = sortedAttacker[k]; + attacker.IsLastAttacker = k == sortedAttacker.Count - 1; + BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders); + if (result != null) + return result; + } + } + + return base.OnBattle(attackers, defenders); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public void ResetCooclockEffect(bool onlyCheck) + { + if (!onlyCheck && cooclockAffected && setTrapThisTurn.Contains(Card)) + { + cooclockAffected = false; + setTrapThisTurn.Remove(Card); + } + } + + + + + + public bool LadyLabrynthOfTheSilverCastleFieldActivate() + { + if (Card.Location == CardLocation.MonsterZone && (Util.GetLastChainCard() == null || !Util.GetLastChainCard().IsCode(_CardId.EvenlyMatched)) + && (!CheckWhetherNegated() || Enemy.HasInMonstersZone(CardId.LadyLabrynthOfTheSilverCastle))) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + return false; + } + + public bool LadyLabrynthOfTheSilverCastleHandActivate() + { + if (Card.Location == CardLocation.Hand) + { + // sp summon from hand + if (CheckShouldNoMoreSpSummon(true) || Util.ChainContainsCard(_CardId.EvenlyMatched)) return false; + bool activateFlag = false; + activateFlag |= CheckChainContainEnemyMaxxC(); + if (!activateFlag && GetEmptyMainMonsterZoneCount() + chainSummoningIdList.Count() <= 0) + { + return false; + } + activateFlag |= cooclockAffected && setTrapThisTurn.Count() > 0 && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)); + activateFlag |= Bot.GetSpells().Any(card => card.IsFacedown() && card.HasType(CardType.Trap) && !setTrapThisTurn.Contains(card)) + && !Bot.HasInMonstersZone(Card.Id, true, faceUp: true); + activateFlag |= Duel.Player == 1 && Duel.Phase >= DuelPhase.End; + activateFlag |= setTrapThisTurn.Count() > 0 && Duel.Phase >= DuelPhase.End; + activateFlag |= Bot.UnderAttack && Bot.GetMonsterCount() == 0 && !Util.ChainContainsCard(CardId.DestructiveDarumaKarmaCannon); + // for link + if (Bot.HasInExtra(CardId.UnchainedSoulLordOfYama) && Duel.Player == 0 && Duel.Phase < DuelPhase.End) + { + // check whether need summon for material count + List materialList = GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)); + int materialCount = materialList.Count(); + if (!activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara) && Bot.GetSpells().Any(card => card.IsFacedown()) + && (!activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama) || Bot.HasInHand(CardId.UnchainedSoulOfSharvara))) materialCount++; + if ( (materialCount == 2 || materialCount == 1 && materialList.Any(card => card.IsCode(CardId.UnchainedSoulLordOfYama))) + && Bot.HasInExtra(CardId.UnchainedSoulLordOfYama) || materialList.Any(card => card.HasSetcode(SetcodeUnchained))) + { + activateFlag |= Enemy.GetMonsterCount() > 0 && Bot.HasInExtra(CardId.UnchainedSoulOfAnguish); + activateFlag |= Bot.HasInExtra(CardId.UnchainedSoulOfRage); + } + } + + if (activateFlag) + { + activatedCardIdList.Add(Card.Id); + chainSummoningIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public bool LovelyLabrynthOfTheSilverCastleActivate() + { + if (CheckWhetherNegated()) return false; + if (ActivateDescription == Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 0)) + { + // set from GY + List checkIdList = new List{CardId.BigWelcomeLabrynth, _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, + CardId.DestructiveDarumaKarmaCannon, CardId.WelcomeLabrynth}; + foreach (int checkId in checkIdList) + { + if (Bot.HasInGraveyard(checkId) && !Bot.HasInHandOrInSpellZone(checkId)) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + return true; + } + } + foreach (int checkId in checkIdList) + { + if (Bot.HasInGraveyard(checkId)) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + if (GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)).Count() == 2 + && !activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama) + && (Bot.HasInGraveyard(CardId.UnchainedSoulOfSharvara) || CheckRemainInDeck(CardId.UnchainedSoulOfSharvara) > 0)) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + else + { + // destroy + if (Enemy.GetHandCount() == 0) + { + int botWorstAttack = 0; + ClientCard botWorstMonster = Util.GetWorstBotMonster(true); + if (botWorstMonster != null) + { + botWorstAttack = botWorstMonster.Attack; + } + List targetList = GetProblematicEnemyCardList(false); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && card.GetDefensePower() >= botWorstAttack && !currentDestroyCardList.Contains(card)).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => !currentDestroyCardList.Contains(card)).ToList())); + + if (targetList.Count() > 0) + { + currentDestroyCardList.Add(targetList[0]); + AI.SelectCard(targetList); + AI.SelectOption(1); + } + else + { + AI.SelectOption(0); + } + } + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool UnchainedSoulOfSharvaraActivate() + { + // search + if (Card.Location == CardLocation.Grave) + { + activatedCardIdList.Add(Card.Id + 1); + SelectSTPlace(null, false); + return true; + } + + // sp summon + if (Bot.HasInSpellZone(CardId.TransactionRollback) && GetEmptyMainMonsterZoneCount() > chainSummoningIdList.Count() + && !CheckWhetherWillbeRemoved() && !CheckShouldNoMoreSpSummon(false)) + { + AI.SelectCard(CardId.TransactionRollback); + activatedCardIdList.Add(Card.Id); + return true; + } + + // escape target + if (Duel.LastChainPlayer == 1) + { + ClientCard chainCard = Util.GetLastChainCard(); + if (chainCard != null && chainCard.IsCode(targetNegateIdList)) + { + if (Duel.LastChainTargets.Any(card => card.Controller == 0 && card.IsFaceup() && card.HasRace(CardRace.Fiend) + && Duel.CurrentChain.Any(chain => chain == card) && !card.IsCode(CardId.UnchainedSoulOfRage, CardId.UnchainedSoulOfAnguish))) + { + escapeTargetList.AddRange(Duel.LastChainTargets); + AI.SelectCard(Duel.LastChainTargets); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + // for link + bool destroySpells = Duel.Player == 0 && GetEmptyMainMonsterZoneCount() > chainSummoningIdList.Count() && Bot.GetMonsterCount() > 0 && CurrentTiming <= 0; + if (destroySpells) + { + List materialList = GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)); + destroySpells = CheckAtAdvantage() && !Bot.HasInMonstersZone(CardId.UnchainedSoulOfRage) + && Bot.HasInExtra(CardId.UnchainedSoulOfRage) && materialList.Count() == 1; + if (Bot.HasInExtra(CardId.UnchainedSoulOfAnguish) && !Bot.HasInMonstersZone(CardId.UnchainedSoulOfAnguish) + && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish) && Enemy.GetMonsters().Where(card => card.IsFaceup()).Count() > 0) + { + destroySpells |= materialList.Count() == 2; + destroySpells |= materialList.Count() == 1 && materialList.Any(card => card.HasType(CardType.Link) && card.LinkCount == 2); + } + } + // for attack + destroySpells |= CheckCanDirectAttack() && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack() + 2000 >= Enemy.LifePoints + && GetEmptyMainMonsterZoneCount() > chainSummoningIdList.Count(); + // for avoid lose + destroySpells |= Duel.Player == 1 && Duel.Phase == DuelPhase.Main1 && Bot.GetMonsterCount() == 0 && (CurrentTiming & hintTimingMainEnd) != 0 + && Util.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints; + if (destroySpells) + { + List destroyIdList = new List{_CardId.InfiniteImpermanence, CardId.TransactionRollback, CardId.WelcomeLabrynth, + _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon, CardId.BigWelcomeLabrynth}; + foreach (int checkId in destroyIdList) + { + ClientCard target = Bot.GetSpells().FirstOrDefault(card => card.IsFacedown() && card.IsCode(checkId)); + if (target != null) + { + AI.SelectCard(target); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + return false; + } + + public bool AriasTheLabrynthButlerActivate() + { + if (Card.Location != CardLocation.Grave) + { + if (Util.ChainContainsCard(new int[] { _CardId.DivineArsenalAAZEUS_SkyThunder, _CardId.EvenlyMatched, _CardId.EvilswarmExcitonKnight })) return false; + if (Duel.CurrentChain.Any(card => card.Controller == 0 && card.IsCode(CardId.AriannaTheLabrynthServant))) return false; + + // set trap to activate + SortedList> checkList = new SortedList> { + {CardId.BigWelcomeLabrynth, BigWelcomeLabrynthSetCheck}, + {CardId.WelcomeLabrynth, WelcomeLabrynthSetCheck}, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonSetCheck}, + {_CardId.DimensionalBarrier, DimensionalBarrierActivate} + }; + foreach (KeyValuePair> pair in checkList) + { + ClientCard setTarget = Bot.Hand.FirstOrDefault(card => card.IsCode(pair.Key)); + if (setTarget != null && !activatedCardIdList.Contains(pair.Key) && pair.Value()) + { + AI.SelectOption(1); + AI.SelectCard(pair.Key); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(setTarget, true); + return true; + } + } + + // special summon monster + if (Bot.HasInHand(CardId.LovelyLabrynthOfTheSilverCastle)) + { + // before main end + if (Duel.Player == 0 || (CurrentTiming & hintTimingMainEnd) != 0) + { + AI.SelectOption(0); + AI.SelectCard(CardId.LovelyLabrynthOfTheSilverCastle); + chainSummoningIdList.Add(CardId.LovelyLabrynthOfTheSilverCastle); + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Bot.HasInHand(CardId.AriannaTheLabrynthServant) && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) + && !CheckWhetherNegated(true, true) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + bool searchFlag = false; + if (Duel.Player == 1) + { + searchFlag |= (CurrentTiming & hintTimingMainEnd) != 0; + searchFlag |= GetProblematicEnemyCardList(false).Count() > 0 + && (Bot.HasInMonstersZoneOrInGraveyard(CardId.LovelyLabrynthOfTheSilverCastle) || CheckRemainInDeck(CardId.LovelyLabrynthOfTheSilverCastle) > 0) + && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + } + if (Duel.Player == 0) searchFlag |= summoned && !CheckShouldNoMoreSpSummon(); + if (searchFlag) + { + AI.SelectOption(0); + AI.SelectCard(CardId.AriannaTheLabrynthServant); + chainSummoningIdList.Add(CardId.AriannaTheLabrynthServant); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + return false; + } + + public bool ArianeTheLabrynthServantSummon() + { + // for attack + if (Duel.Turn > 1 && Enemy.GetMonsterCount() == 0) + { + summoned = true; + return true; + } + // for activate effect + if (!activatedCardIdList.Contains(Card.Id) && !CheckWhetherNegated(true, true) && !CheckWhetherWillbeRemoved()) + { + bool haveCost = Bot.Hand.Any(card => card.Type == (int)CardType.Trap) || Bot.GetSpells().Any(card => card.IsFacedown() && card.Type == (int)CardType.Trap); + if (haveCost && !CheckShouldNoMoreSpSummon(true)) + { + summoned = true; + return true; + } + } + + return false; + } + public bool ArianeTheLabrynthServantForRollbackSummon() + { + if (activatedCardIdList.Contains(Card.Id)) return false; + if (Bot.HasInHandOrInSpellZone(CardId.TransactionRollback) && !CheckWhetherWillbeRemoved()) + { + summoned = true; + return true; + } + + return false; + } + public bool ArianeTheLabrynthServantActivate() + { + // special summon + if (ActivateDescription == Util.GetStringId(Card.Id, 0)) + { + bool haveRollback = Bot.HasInHandOrInSpellZone(CardId.TransactionRollback); + if (CheckWhetherNegated() && !haveRollback) return false; + if (CheckShouldNoMoreSpSummon() && !(haveRollback && Bot.Graveyard.Any(card => card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)))) return false; + int specialSummonId = 0; + // arianna + if (!activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && CheckRemainInDeck(CardId.AriannaTheLabrynthServant) > 0) + { + specialSummonId = CardId.AriannaTheLabrynthServant; + } + // sp summon not used furniture + if (specialSummonId == 0) + { + List checkIdList = new List{CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock}; + foreach (int checkId in checkIdList) + { + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && CheckRemainInDeck(checkId) > 0) + { + specialSummonId = checkId; + break; + } + } + } + // for attack/link + if (specialSummonId == 0) + { + List checkIdList = new List(); + if (Enemy.GetMonsterCount() == 0) checkIdList.AddRange(new List{ + CardId.AriannaTheLabrynthServant, CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock + }); + else checkIdList.AddRange(new List{ + CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.AriannaTheLabrynthServant + }); + foreach (int checkId in checkIdList) + { + if (CheckRemainInDeck(checkId) > 0) + { + specialSummonId = checkId; + break; + } + } + } + + if (specialSummonId > 0) + { + bool costSelected = false; + if (haveRollback) + { + AI.SelectCard(CardId.TransactionRollback); + costSelected = true; + } + if (!costSelected) { + ClientCard welcome = Bot.GetSpells().FirstOrDefault(card => card.IsCode(CardId.WelcomeLabrynth)); + if (welcome != null) + { + AI.SelectCard(welcome); + costSelected = true; + } + } + List costCheckList = Bot.Hand.Where(card => card.IsFacedown() && card.Type == (int)CardType.Trap).ToList(); + costCheckList.AddRange(Bot.GetSpells().Where(card => card.IsFacedown() && card.Type == (int)CardType.Trap).ToList()); + if (!costSelected) + { + List checkIdList = new List{_CardId.InfiniteImpermanence, CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth}; + foreach (int checkId in checkIdList) + { + ClientCard dumpCard = costCheckList.FirstOrDefault(card => card.IsCode(checkId)); + if (costCheckList.Count(card => card.IsCode(checkId)) > 1 && dumpCard != null) + { + AI.SelectCard(dumpCard); + costSelected = true; + break; + } + } + } + if (!costSelected) + { + List checkIdList = new List{_CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon, + CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth}; + foreach (int checkId in checkIdList) + { + ClientCard checkCard = costCheckList.FirstOrDefault(card => card.IsCode(checkId)); + if (checkCard != null) + { + AI.SelectCard(checkCard); + costSelected = true; + break; + } + } + } + } + } else { + // draw + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool AriannaTheLabrynthServantSummon() + { + // summon for search + if (!CheckWhetherNegated(true, true) && !activatedCardIdList.Contains(Card.Id)) + { + summoned = true; + return true; + } + + // summon for attack + if (Duel.Turn > 1 && Duel.Player == 0 && Duel.Phase < DuelPhase.Main2 && Enemy.GetMonsterCount() == 0 && !Bot.HasInHand(CardId.ArianeTheLabrynthServant)) + { + summoned = true; + return true; + } + + return false; + } + public bool AriannaTheLabrynthServantActivate() + { + if (CheckWhetherNegated()) return false; + // search or draw + // search target is overrided in OnSelectCard() + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC)) return false; + if (DefaultAshBlossomAndJoyousSpring()) + { + if (Util.GetLastChainCard().Location == CardLocation.MonsterZone) currentNegateMonsterList.Add(Util.GetLastChainCard()); + return true; + } + return false; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool FurnitureSetWelcomeActivate() + { + if (furnitureActivating && (Card.Location == CardLocation.Hand || !DefaultOnBecomeTarget())) return false; + if (Util.ChainContainsCard(new int[]{ _CardId.DivineArsenalAAZEUS_SkyThunder, _CardId.EvenlyMatched, _CardId.EvilswarmExcitonKnight })) return false; + + if (CheckWhetherNegated()) return false; + if (Card.Location != CardLocation.Grave) + { + bool becomeTarget = Card.Location == CardLocation.MonsterZone && DefaultOnBecomeTarget() && !escapeTargetList.Contains(Card); + bool lackUnimportantCost = Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)); + if (lackUnimportantCost) + { + List handCost = Bot.Hand.Where(card => card != Card).ToList(); + lackUnimportantCost &= handCost.Count() <= 2 && handCost.All(card => card.IsCode(_CardId.MaxxC, _CardId.AshBlossom)); + } + bool activateFlag = becomeTarget; + // set big welcome for lovely + bool canActivateSetBigWelcomeThisTurn = CheckRemainInDeck(CardId.BigWelcomeLabrynth) > 0 && cooclockAffected && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && (Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle)) + && (!Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth) && !setTrapThisTurn.Contains(card))) + && ( + Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)) + || (Bot.HasInGraveyard(CardId.LabrynthCooclock) && !activatedCardIdList.Contains(CardId.LabrynthCooclock + 1)) + || (Bot.HasInHand(CardId.LadyLabrynthOfTheSilverCastle) && !activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle)) + ); + if (canActivateSetBigWelcomeThisTurn && ShouldSetBigWelcome()) + { + bool force = becomeTarget | GetProblematicEnemyCardList(false).Count() > 0; + ClientCard cost = FurnitureGetCost(force); + if (cost != null) + { + AI.SelectCard(cost); + AI.SelectNextCard(CardId.BigWelcomeLabrynth); + activatedCardIdList.Add(Card.Id); + furnitureActivating = true; + SelectSTPlace(null, true); + return true; + } + } + bool keepOnField = (cooclockActivating || cooclockAffected) && activatedCardIdList.Contains(CardId.LabrynthCooclock + 1) + && Card.Location == CardLocation.MonsterZone && !Bot.GetMonsters().Any(card => card.IsFaceup() && card != Card && card.HasSetcode(SetcodeLabrynth)) + && setTrapThisTurn.Count() > 0; + // normal set + activateFlag |= Duel.Phase > DuelPhase.Main2 && !lackUnimportantCost && !keepOnField; + activateFlag |= Bot.HasInGraveyard(new List { CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth }) + && Bot.HasInHand(CardId.TransactionRollback) && !activatedCardIdList.Contains(CardId.TransactionRollback); + if (Duel.CurrentChain.Any(card => card != null && card.Controller == 0 && card.IsCode(CardId.BigWelcomeLabrynth) && card.Location == CardLocation.SpellZone) + && !(Bot.GetMonsterCount() == 1 && Card.Location == CardLocation.MonsterZone)) + { + activateFlag |= !lackUnimportantCost && Bot.GetMonsters().Any(card => card != Card) && !Bot.HasInGraveyard(Card.Id) && !activatedCardIdList.Contains(Card.Id + 1); + } + // trigger cooclock to defense + activateFlag |= !Util.ChainContainPlayer(0) && Duel.Player == 1 && Bot.UnderAttack && Bot.GetMonsterCount() == 0 + && Bot.HasInGraveyard(CardId.LabrynthCooclock) && !activatedCardIdList.Contains(CardId.LabrynthCooclock + 1) + && !(Bot.HasInHand(CardId.LadyLabrynthOfTheSilverCastle) && !activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle)); + + if (activateFlag) + { + ClientCard cost = FurnitureGetCost(becomeTarget); + if (cost != null) + { + AI.SelectCard(cost); + activatedCardIdList.Add(Card.Id); + furnitureActivating = true; + bool setWelcome = Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth)); + setWelcome |= Bot.GetMonsterCount() == 0 && !Bot.HasInHandOrInSpellZone(CardId.WelcomeLabrynth) + && (!Bot.HasInGraveyard(CardId.LabrynthCooclock) || activatedCardIdList.Contains(CardId.LabrynthCooclock + 1)) + && ((Duel.Player == 0 && Duel.Phase > DuelPhase.Main2) || !Bot.Hand.Any(card => card != Card && card.Level <= 4)); + if (setWelcome) + { + AI.SelectNextCard(CardId.WelcomeLabrynth); + } else { + AI.SelectNextCard(CardId.BigWelcomeLabrynth); + } + SelectSTPlace(null, true); + return true; + } + } + } + + return false; + } + + public ClientCard FurnitureGetCost(bool force = false, List ignoreList = null) + { + if (ignoreList == null) ignoreList = new List(); + // advance cost + List advancedCostIdList = new List{ + CardId.TransactionRollback, CardId.LovelyLabrynthOfTheSilverCastle, CardId.AriasTheLabrynthButler, CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, + CardId.WelcomeLabrynth + }; + foreach (int checkId in advancedCostIdList) + { + ClientCard cost = Bot.Hand.FirstOrDefault(card => !ignoreList.Contains(card) && card.IsCode(checkId) && card != Card); + if (cost != null) return cost; + } + // dump cost + List canCostHand = Bot.Hand.Where(card => !ignoreList.Contains(card)).ToList(); + List appearedCode = new List(canCostHand.Count()); + foreach (ClientCard hand in canCostHand) + { + if (Duel.CurrentChain.Contains(hand)) continue; + if (appearedCode.Contains(hand.Id)) return hand; + appearedCode.Add(hand.Id); + } + List costIdList = new List{ + _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.UnchainedSoulOfSharvara, CardId.EscapeOfTheUnchained, CardId.DestructiveDarumaKarmaCannon, + CardId.LabrynthCooclock, CardId.ArianeTheLabrynthServant, CardId.WelcomeLabrynth, CardId.PotOfExtravagance, CardId.LadyLabrynthOfTheSilverCastle + }; + if (force) costIdList.AddRange(new List{CardId.AriannaTheLabrynthServant, _CardId.AshBlossom, CardId.BigWelcomeLabrynth, _CardId.MaxxC}); + foreach (int checkId in costIdList) + { + ClientCard target = canCostHand.FirstOrDefault(card => !Duel.CurrentChain.Contains(card) && card.IsCode(checkId) && !Duel.CurrentChain.Contains(card)); + if (target != null) return target; + } + foreach (int checkId in costIdList) + { + ClientCard target = canCostHand.FirstOrDefault(card => card.IsCode(checkId) && !Duel.CurrentChain.Contains(card)); + if (target != null) return target; + } + + return null; + } + + public bool ShouldSetBigWelcome(bool checkArianna = true) + { + if (CheckWhetherWillbeRemoved()) return false; + bool shouldTriggerBigWelcomeFlag = GetProblematicEnemyCardList(false).Count() > 0; + shouldTriggerBigWelcomeFlag |= Duel.Player == 1 && Duel.Phase > DuelPhase.Main2; + shouldTriggerBigWelcomeFlag |= Duel.Player == 1 && GetProblematicEnemyCardList(false).Count() == 0 && GetProblematicEnemyMonster(selfType: CardType.Monster) == null + && Enemy.Hand.Count() == 1; + if (checkArianna) shouldTriggerBigWelcomeFlag |= Duel.Player == 0 && !summoned && Bot.HasInHandOrHasInMonstersZone(CardId.AriannaTheLabrynthServant) + && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant); + shouldTriggerBigWelcomeFlag |= Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2; + return shouldTriggerBigWelcomeFlag; + } + + public bool LabrynthCooclockActivate() + { + if (Card.Location == CardLocation.Hand) + { + bool shouldTriggerBigWelcomeFlag = false; + if (Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle)) { + shouldTriggerBigWelcomeFlag |= ShouldSetBigWelcome(); + } + shouldTriggerBigWelcomeFlag &= !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth); + if (shouldTriggerBigWelcomeFlag && !Bot.GetSpells().Any(card => card.IsFacedown() && !setTrapThisTurn.Contains(card) && card.IsCode(CardId.BigWelcomeLabrynth))) + { + // whether have labrynth to trigger cooclock + bool haveBigWelcome = Duel.Player == 0 && Bot.HasInHand(CardId.BigWelcomeLabrynth) + && (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)) || (!summoned && Bot.Hand.Any(card => card != Card && card.HasType(CardType.Monster) && card.Level <= 4 && card.HasSetcode(SetcodeLabrynth)))); + if (CheckRemainInDeck(CardId.BigWelcomeLabrynth) > 0) + { + foreach (int checkId in new List { CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie }) + { + if (activatedCardIdList.Contains(checkId) || CheckCalledbytheGrave(checkId) > 0) continue; + if (Bot.HasInHand(checkId) && Bot.Hand.Count > 2 || Bot.GetMonsters().Any(card => card.IsFaceup() && !card.IsDisabled() && card.IsCode(checkId)) && Bot.Hand.Count > 1) + { + haveBigWelcome = true; + break; + } + } + } + if (haveBigWelcome) + { + activatedCardIdList.Add(Card.Id); + cooclockActivating = true; + return true; + } + } + + bool haveLabrynth = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)); + bool triggerFlag = Duel.Player == 1 && Duel.Phase <= DuelPhase.Main2 && setTrapThisTurn.Any(card => !activatedCardIdList.Contains(card.Id)) && haveLabrynth; + triggerFlag |= Duel.Player == 1 && activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle + 1) + && (Bot.GetSpells().Any(card => card.IsFacedown() && card.Type == (int)CardType.Trap) || Util.ChainContainsCard(CardId.LadyLabrynthOfTheSilverCastle)); + triggerFlag |= setTrapThisTurn.Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)) && haveLabrynth; + triggerFlag |= setTrapThisTurn.Any(card => card.IsFacedown() && card.IsCode(CardId.WelcomeLabrynth) && !activatedCardIdList.Contains(CardId.WelcomeLabrynth)) && haveLabrynth; + + if (triggerFlag) + { + activatedCardIdList.Add(Card.Id); + cooclockActivating = true; + return true; + } + } + + return false; + } + + public bool RecycleActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (Card.IsCode(CardId.LabrynthStovieTorbie, CardId.AriasTheLabrynthButler)) + { + if (CheckShouldNoMoreSpSummon() || GetEmptyMainMonsterZoneCount() + chainSummoningIdList.Count() <= 0) return false; + chainSummoningIdList.Add(Card.Id); + } + if (Card.IsCode(CardId.WelcomeLabrynth)) SelectSTPlace(Card, false); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool ForLinkSummon() + { + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained))) return false; + if (Card.Level > 4) return false; + if (CheckShouldNoMoreSpSummon()) return false; + if (!Bot.HasInExtra(CardId.UnchainedSoulLordOfYama)) return false; + + // check whether need summon for material count + List materialList = GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)); + int materialCount = materialList.Count(); + if (!activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara) && Bot.GetSpells().Any(card => card.IsFacedown()) + && (!activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama) || Bot.HasInHand(CardId.UnchainedSoulOfSharvara))) materialCount++; + if (materialCount != 2) + { + if (materialCount != 1 || !materialList.Any(card => card.IsCode(CardId.UnchainedSoulLordOfYama))) return false; + } + + if (!Bot.HasInExtra(CardId.UnchainedSoulLordOfYama) && !materialList.Any(card => card.HasSetcode(SetcodeUnchained))) return false; + bool needSummon = false; + needSummon |= Enemy.GetMonsterCount() > 0 && Bot.HasInExtra(CardId.UnchainedSoulOfAnguish); + needSummon |= Bot.HasInExtra(CardId.UnchainedSoulOfRage); + if (needSummon) + { + // use monster with least attack + YGOSharp.OCGWrapper.NamedCard thisCardData = YGOSharp.OCGWrapper.NamedCard.Get(Card.Id); + if (thisCardData == null) return false; + if (thisCardData.Race != (int)CardRace.Fiend) return false; + foreach (ClientCard hand in Bot.Hand) + { + YGOSharp.OCGWrapper.NamedCard compareCardData = YGOSharp.OCGWrapper.NamedCard.Get(hand.Id); + if (compareCardData == null) continue; + if (!compareCardData.HasType(CardType.Monster) || compareCardData.Level > 4) continue; + if (compareCardData.Attack < thisCardData.Attack) return false; + } + summoned = true; + return true; + } + + return false; + } + public bool ForSynchroSummon() + { + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained))) return false; + if (!Card.IsCode(new List { CardId.LabrynthStovieTorbie, CardId.ArianeTheLabrynthServant, CardId.AriannaTheLabrynthServant })) return false; + if (CheckShouldNoMoreSpSummon()) return false; + if (!Bot.HasInExtra(CardId.ChaosAngel) || dimensionalBarrierAnnouced.Contains(HintMsg.SYNCHRO)) return false; + + bool checkFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); + if (Card.IsCode(CardId.LabrynthStovieTorbie)) + { + if (!Bot.GetMonsters().Any(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link) + && card.Level == 8 && card.HasAttribute(CardAttribute.Light | CardAttribute.Dark))) return false; + summoned = true; + return true; + } + else + { + if (!Bot.GetMonsters().Any(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link) + && card.Level == 6 && card.HasAttribute(CardAttribute.Light | CardAttribute.Dark))) return false; + summoned = true; + return true; + } + } + public bool ForAnimaSummon() + { + if (banSpSummonExceptFiendCount > 0 || !Bot.HasInExtra(CardId.RelinquishedAnima)) return false; + if (CheckWhetherNegated() || Duel.Turn == 1) return false; + + bool checkFlag = Bot.MonsterZone[1] == null && Enemy.MonsterZone[6] != null && Enemy.MonsterZone[6].HasType(CardType.Link) && Enemy.MonsterZone[6].HasLinkMarker(CardLinkMarker.Top); + checkFlag |= Bot.MonsterZone[3] == null && Enemy.MonsterZone[5] != null && Enemy.MonsterZone[5].HasType(CardType.Link) && Enemy.MonsterZone[5].HasLinkMarker(CardLinkMarker.Top); + if (Bot.GetMonstersExtraZoneCount() == 0) checkFlag |= Enemy.MonsterZone[1] != null || Enemy.MonsterZone[3] != null; + + return checkFlag; + } + + public bool LabrynthForCooClockSummon() + { + if (!cooclockAffected) return false; + if (Card.Level > 4 || !Card.HasSetcode(SetcodeLabrynth)) return false; + bool welcomeFlag = Bot.Hand.Any(card => (card.IsCode(CardId.WelcomeLabrynth) && !activatedCardIdList.Contains(CardId.WelcomeLabrynth)) + || (card.IsCode(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth))); + welcomeFlag |= Bot.GetSpells().Any(card => card.IsFacedown() && setTrapThisTurn.Contains(card) && ( + (card.IsCode(CardId.WelcomeLabrynth) && !activatedCardIdList.Contains(CardId.WelcomeLabrynth)) + || (card.IsCode(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)))); + if (welcomeFlag && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth))) + { + // summon highest attack + int currentAttack = 0; + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(Card.Id); + if (cardData != null) currentAttack = cardData.Attack; + List summonList = Bot.Hand.Where(card => card.IsMonster() && card.Level <= 4 && card.HasSetcode(SetcodeLabrynth)).ToList(); + foreach (ClientCard checkCard in summonList) + { + cardData = YGOSharp.OCGWrapper.NamedCard.Get(checkCard.Id); + if (cardData != null && cardData.Attack < currentAttack) return false; + } + + return true; + } + return false; + } + + public bool ForBigWelcomeSummon() + { + if (Bot.HasInSpellZone(CardId.BigWelcomeLabrynth) && Bot.GetMonsterCount() == 0 && Card.Level <= 4) + { + summoned = true; + return true; + } + return false; + } + + public bool PotOfExtravaganceActivate() + { + if (CheckWhetherNegated()) return false; + SelectSTPlace(Card, true); + activatedCardIdList.Add(Card.Id); + AI.SelectOption(1); + return true; + } + + public bool WelcomeLabrynthActivate() + { + return WelcomeLabrynthActivateCheck(false); + } + public bool WelcomeLabrynthActivateCopy() + { + return WelcomeLabrynthActivateCheck(true); + } + public bool WelcomeLabrynthSetCheck() + { + return !CheckShouldNoMoreSpSummon() && WelcomeLabrynthActivateCheck(true, true); + } + public bool WelcomeLabrynthActivateCheck(bool onlyCheck = false, bool noSelect = false) + { + if (Card.Location == CardLocation.SpellZone || onlyCheck) + { + if (GetEmptyMainMonsterZoneCount() == 0) return false; + if (CheckShouldNoMoreSpSummon()) return false; + bool activateTimingFlag = Duel.Phase > DuelPhase.Main2 || (Card.IsCode(CardId.AriasTheLabrynthButler) && (CurrentTiming & hintTimingMainEnd) > 0); + + bool becomeTarget = Card.Location == CardLocation.SpellZone && DefaultOnBecomeTarget(); + if ((Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 || Duel.Player == 1 && activateTimingFlag) + && CheckRemainInDeck(CardId.ArianeTheLabrynthServant) > 0 && Bot.HasInHandOrInSpellZone(CardId.TransactionRollback) + && !chainSummoningIdList.Contains(CardId.ArianeTheLabrynthServant)) + { + if (!noSelect) + { + chainSummoningIdList.Add(CardId.ArianeTheLabrynthServant); + activatedCardIdList.Add(Card.Id); + } + return true; + } + bool ariannaCheck = !Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) + || !(Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle)); + ariannaCheck |= Duel.Player == 1 && activateTimingFlag; + ariannaCheck |= Duel.Player == 0; + if (ariannaCheck) + { + if (CheckRemainInDeck(CardId.AriannaTheLabrynthServant) > 0 && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) + && !CheckWhetherNegated(true, true, CardType.Monster) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + if (!noSelect) + { + chainSummoningIdList.Add(CardId.AriannaTheLabrynthServant); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + if (Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)) + { + if (Bot.HasInHand(CardId.LovelyLabrynthOfTheSilverCastle) && CheckRemainInDeck(CardId.AriasTheLabrynthButler) > 0 + && !chainSummoningIdList.Contains(CardId.AriasTheLabrynthButler) && !Bot.HasInMonstersZone(CardId.AriasTheLabrynthButler, true, false, true)) + { + if (!noSelect) + { + chainSummoningIdList.Add(CardId.AriasTheLabrynthButler); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + + bool activateFlag = becomeTarget; + activateFlag |= Bot.UnderAttack && Bot.GetMonsterCount() == 0; + activateFlag |= ShouldSetBigWelcome(false); + if (activateFlag) + { + if (!noSelect) + { + if (Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && CheckRemainInDeck(CardId.LovelyLabrynthOfTheSilverCastle) > 0 && !chainSummoningIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle)) + { + chainSummoningIdList.Add(CardId.LovelyLabrynthOfTheSilverCastle); + } + else if (!activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && CheckRemainInDeck(CardId.AriannaTheLabrynthServant) > 0 + && !CheckWhetherNegated(true, true, CardType.Monster) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + chainSummoningIdList.Add(CardId.AriannaTheLabrynthServant); + } + else if (Bot.HasInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasRace(CardRace.Fiend) && card.Level >= 8) + && CheckRemainInDeck(CardId.LadyLabrynthOfTheSilverCastle) > 0 && !chainSummoningIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle)) + { + chainSummoningIdList.Add(CardId.LadyLabrynthOfTheSilverCastle); + } + else { + int selectId = 0; + List checkIdList = new List{CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock}; + foreach (int checkId in checkIdList) + { + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && CheckRemainInDeck(checkId) > 0 + && !chainSummoningIdList.Contains(checkId)) + { + selectId = checkId; + break; + } + } + List fullCheckIdList = new List{ + CardId.LadyLabrynthOfTheSilverCastle, CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock, + CardId.AriasTheLabrynthButler, CardId.ArianeTheLabrynthServant, CardId.AriannaTheLabrynthServant + }; + if (selectId == 0) + { + foreach (int checkId in fullCheckIdList) + { + if (CheckRemainInDeck(checkId) > 0 && !chainSummoningIdList.Contains(checkId)) + { + selectId = checkId; + break; + } + } + } + if (selectId > 0) { + chainSummoningIdList.Add(selectId); + } + } + ResetCooclockEffect(onlyCheck); + + activatedCardIdList.Add(Card.Id); + } + return true; + } + + } + + return false; + } + + public bool TransactionRollbackActivate() + { + if (Card.Location == CardLocation.Grave) + { + SortedList> checkList = new SortedList> { + {CardId.BigWelcomeLabrynth, BigWelcomeLabrynthActivateCopy}, + {_CardId.DimensionalBarrier, DimensionalBarrierActivate}, + {CardId.EscapeOfTheUnchained, EscapeOfTheUnchainedActivateCopy}, + {_CardId.InfiniteImpermanence, InfiniteImpermanenceActivateCopy}, + {CardId.WelcomeLabrynth, WelcomeLabrynthActivateCopy}, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonActivate} + }; + foreach (KeyValuePair> pair in checkList) + { + if (Bot.HasInGraveyard(pair.Key) && pair.Value()) + { + rollbackCopyCardId = pair.Key; + AI.SelectCard(pair.Key); + return true; + } + } + } + if (Card.Location == CardLocation.SpellZone) + { + if (CheckWhetherNegated()) return false; + SortedList> checkList = new SortedList> { + {CardId.WelcomeLabrynth, WelcomeLabrynthActivateCopy}, + {_CardId.CompulsoryEvacuationDevice, DefaultCompulsoryEvacuationDevice }, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonActivate}, + {_CardId.DimensionalBarrier, DimensionalBarrierActivate}, + {CardId.EscapeOfTheUnchained, EscapeOfTheUnchainedActivateCopy}, + {_CardId.InfiniteImpermanence, InfiniteImpermanenceActivateCopy}, + {_CardId.BreakthroughSkill, DefaultBreakthroughSkill}, + {CardId.BigWelcomeLabrynth, BigWelcomeLabrynthActivateCopy} + }; + foreach (KeyValuePair> pair in checkList) + { + if (Enemy.HasInGraveyard(pair.Key) && pair.Value()) + { + rollbackCopyCardId = pair.Key; + AI.SelectCard(pair.Key); + ResetCooclockEffect(false); + return true; + } + } + } + return false; + } + + public bool InfiniteImpermanenceActivate() + { + return InfiniteImpermanenceActivateCheck(false); + } + public bool InfiniteImpermanenceActivateCopy() + { + return InfiniteImpermanenceActivateCheck(true); + } + public bool InfiniteImpermanenceSetCheck() + { + return InfiniteImpermanenceActivateCheck(true, true); + } + public bool InfiniteImpermanenceActivateCheck(bool onlyCheck = false, bool noSelect = false) + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int thisSeq = -1; + int thatSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) thisSeq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) thatSeq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) thatSeq = i; + } + if ( (thisSeq * thatSeq >= 0 && thisSeq + thatSeq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true, selfType: CardType.Trap); + if (!noSelect) + { + if (target != null) + { + AI.SelectCard(target); + } else { + AI.SelectCard(Enemy.GetMonsters()); + } + } + if (!onlyCheck) + { + infiniteImpermanenceList.Add(thatSeq); + if (cooclockAffected && setTrapThisTurn.Contains(Card)) + { + cooclockAffected = false; + setTrapThisTurn.Remove(Card); + } + } + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Trap); + if (shouldNegateList.Count() > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateMonsterList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone && !onlyCheck) + { + for (int i = 0; i < 5; ++ i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (!noSelect) AI.SelectCard(negateTarget); + currentDestroyCardList.Add(negateTarget); + ResetCooclockEffect(onlyCheck); + return true; + } + + return false; + } + + public bool DestructiveDarumaKarmaCannonActivate() + { + return DestructiveDarumaKarmaCannonActivateCheck(false); + } + public bool DestructiveDarumaKarmaCannonSetCheck() + { + return DestructiveDarumaKarmaCannonActivateCheck(true); + } + public bool DestructiveDarumaKarmaCannonActivateCheck(bool noSelect = false) + { + bool becomeTarget = Card.Location == CardLocation.SpellZone && DefaultOnBecomeTarget(); + bool activateFlag = becomeTarget && Util.IsOneEnemyBetter(true); + bool canTriggerLovely = + (!activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth) && (!cooclockAffected || !setTrapThisTurn.Contains(card))) + || Util.ChainContainsCard(CardId.BigWelcomeLabrynth)) + && (Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || (CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle) && Bot.GetMonsterCount() > 0)) + && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + + activateFlag |= Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && !Util.ChainContainPlayer(0) && !canTriggerLovely; + activateFlag |= Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2 && Bot.GetMonsterCount() == 0 && Enemy.GetMonsterCount() > 0; + activateFlag |= Enemy.HasInMonstersZone(CardId.AccesscodeTalker, true) && !Util.ChainContainPlayer(0); + int linkCount = 0; + foreach (ClientCard monster in Enemy.GetMonsters()) + { + if (monster.IsFacedown()) continue; + if (!monster.HasType(CardType.Link)) linkCount++; + else linkCount += monster.LinkCount; + } + activateFlag |= linkCount >= 6 && Util.IsOneEnemyBetter(true); + if (activateFlag) + { + if (!noSelect) + { + currentDestroyCardList.AddRange(Enemy.GetMonsters()); + escapeTargetList.AddRange(Bot.GetMonsters()); + } + return true; + } + + return false; + } + + public bool EscapeOfTheUnchainedActivate() + { + return EscapeOfTheUnchainedActivateCheck(false); + } + public bool EscapeOfTheUnchainedActivateCopy() + { + return EscapeOfTheUnchainedActivateCheck(true); + } + public bool EscapeOfTheUnchainedActivateCheck(bool onlyCheck = false, bool noSelect = false) + { + if (Card.Location == CardLocation.SpellZone || onlyCheck) + { + // select targeted unchained + ClientCard selfTarget = Bot.GetMonsters().FirstOrDefault(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained) + && Duel.ChainTargets.Contains(card) && !escapeTargetList.Contains(card)); + if (selfTarget == null) + { + selfTarget = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained)) + .OrderBy(card => card.Attack).FirstOrDefault(); + } + if (selfTarget == null) return false; + // destroy danger card + List dangerList = GetProblematicEnemyCardList(true, selfType: CardType.Trap); + if (dangerList.Count() > 0 && Duel.LastChainPlayer != 0) + { + if (!noSelect) + { + AI.SelectCard(selfTarget); + AI.SelectNextCard(dangerList); + escapeTargetList.Add(selfTarget); + currentDestroyCardList.Add(dangerList[0]); + activatedCardIdList.Add(Card.Id); + } + return true; + } + + // best monster + int botBestPower = Util.GetBestPower(Bot); + if (Duel.Player == 1 && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + List dangerMonsters = Enemy.GetMonsters().Where(card => card.IsFaceup() && card.Attack >= botBestPower + && !currentDestroyCardList.Contains(card) && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + .OrderByDescending(card => card.Attack).ToList(); + if (dangerMonsters.Count() > 0) + { + if (!noSelect) + { + AI.SelectCard(selfTarget); + AI.SelectNextCard(dangerMonsters); + escapeTargetList.Add(selfTarget); + currentDestroyCardList.Add(dangerMonsters[0]); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + + // end phase + bool activateFlag = Duel.Player == 1 && Duel.Phase > DuelPhase.Main2 + && ((Bot.HasInGraveyard(CardId.UnchainedSoulLordOfYama) && !activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama + 1)) + || (Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1))); + activateFlag |= DefaultOnBecomeTarget() && Card.Location == CardLocation.SpellZone && !Util.ChainContainsCard(_CardId.EvenlyMatched); + if (activateFlag) + { + List destroyTarget = GetNormalEnemyTargetList(true, true, CardType.Trap); + if (destroyTarget.Count() > 0) + { + if (!noSelect) + { + AI.SelectCard(selfTarget); + AI.SelectNextCard(destroyTarget); + escapeTargetList.Add(selfTarget); + currentDestroyCardList.Add(destroyTarget[0]); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + + } else { + if (!noSelect) + { + AI.SelectCard(CardId.UnchainedSoulOfSharvara); + activatedCardIdList.Add(Card.Id + 1); + } + return true; + } + + return false; + } + + public bool DimensionalBarrierActivate() + { + if (Duel.Player == 0 && Duel.Turn == 1) return false; + if (CheckWhetherNegated()) return false; + Dictionary> checkDict = new Dictionary> + { + {HintMsg.RITUAL, DimensionalBarrierForRitual}, + {HintMsg.FUSION, DimensionalBarrierForFusion}, + {HintMsg.SYNCHRO, DimensionalBarrierForSynchro}, + {HintMsg.XYZ, DimensionalBarrierForXyz}, + {HintMsg.PENDULUM, DimensionalBarrierForPendulum}, + }; + foreach (KeyValuePair> checkType in checkDict) + { + if (dimensionalBarrierAnnouced.Contains(checkType.Key)) continue; + if (checkType.Value()) { + ResetCooclockEffect(false); + return true; + } + } + + return DefaultOnBecomeTarget(); + } + public bool DimensionalBarrierForRitual() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() && chainCard.HasType(CardType.Ritual) + && (chainCard.HasType(CardType.Spell) || (chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)))) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + + return false; + } + public bool DimensionalBarrierForFusion() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() && (chainCard.IsFusionSpell() + || (chainCard.HasType(CardType.Fusion) && chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)))) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + + return false; + } + public bool DimensionalBarrierForSynchro() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() + && chainCard.HasType(CardType.Synchro) && chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + if (Duel.Player == 1 && !Util.ChainContainsCard(CardId.DestructiveDarumaKarmaCannon) && Enemy.ExtraDeck.Count() > 0) + { + bool tunerCheck = false; + bool nontunerCheck = false; + foreach (ClientCard monster in Enemy.GetMonsters()) + { + if (monster.IsFacedown() || monster.HasType(CardType.Xyz | CardType.Link)) continue; + if (monster.HasType(CardType.Tuner)) tunerCheck = true; + else nontunerCheck = true; + } + if (tunerCheck && nontunerCheck) return true; + } + + return false; + } + public bool DimensionalBarrierForXyz() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() + && chainCard.HasType(CardType.Xyz) && chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + if (Duel.Player == 1 && !Util.ChainContainsCard(CardId.DestructiveDarumaKarmaCannon) && Enemy.ExtraDeck.Count() > 0) + { + List existsLevel = new List(6); + foreach (ClientCard monster in Enemy.GetMonsters()) + { + if (monster.IsFacedown()) continue; + if (monster.IsOneForXyz()) return true; + if (monster.HasType(CardType.Xyz | CardType.Token)) continue; + int level = monster.Level; + if (level != 2 && monster.HasType(CardType.Link)) continue; + if (existsLevel.Contains(level)) return true; + existsLevel.Add(level); + } + } + + return false; + } + public bool DimensionalBarrierForPendulum() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() + && chainCard.HasType(CardType.Pendulum) && chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + + ClientCard l = Enemy.SpellZone[6]; + ClientCard r = Enemy.SpellZone[7]; + if (l != null && r != null && l.LScale != r.RScale) return true; + + return false; + } + + public bool BigWelcomeLabrynthActivate() + { + return BigWelcomeLabrynthActivateCheck(false); + } + public bool BigWelcomeLabrynthBecomeTargetActivate() + { + if (DefaultOnBecomeTarget()) return BigWelcomeLabrynthActivateCheck(false); + return false; + } + public bool BigWelcomeLabrynthActivateCopy() + { + return BigWelcomeLabrynthActivateCheck(true); + } + public bool BigWelcomeLabrynthSetCheck() + { + return !CheckShouldNoMoreSpSummon() && BigWelcomeLabrynthActivateCheck(true, true); + } + public bool BigWelcomeLabrynthActivateCheck(bool onlyCheck = false, bool noSelect = false) + { + if (CheckWhetherNegated()) return false; + if (Card.Location != CardLocation.SpellZone && !onlyCheck) return false; + if (GetEmptyMainMonsterZoneCount() == 0) return false; + bool activateTimingFlag = Duel.Phase > DuelPhase.Main2 || (Card.IsCode(CardId.AriasTheLabrynthButler) && (CurrentTiming & hintTimingMainEnd) > 0); + + bool needDestroyFlag = GetProblematicEnemyCardList(false).Count() > 0; + needDestroyFlag |= activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && activateTimingFlag; + needDestroyFlag |= Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && Duel.LastChainPlayer != 0; + needDestroyFlag |= Duel.Turn == 1 && Duel.Player == 0 && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + needDestroyFlag |= Duel.Turn == 1 && Enemy.GetMonsterCount() == 0 && Enemy.GetSpellCount() == 0 && Enemy.Hand.Count > 0 + && (CurrentTiming & hintTimingMainEnd) > 0; + + // do not activate when welcome is activating + bool haveEnemyChain = false; + bool haveWelcome = false; + foreach (ClientCard chain in Duel.CurrentChain) + { + if (chain != null) + { + if (chain.Controller == 1) + { + haveEnemyChain = true; + break; + } + if (chain.IsCode(CardId.WelcomeLabrynth, CardId.TransactionRollback, CardId.LadyLabrynthOfTheSilverCastle)) haveWelcome = true; + } + } + if (haveWelcome && !haveEnemyChain) return false; + + // escape target + List targetList = Bot.GetMonsters(); + foreach (ClientCard target in targetList) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target) + && !(target.IsCode(CardId.UnchainedSoulOfRage, CardId.UnchainedSoulOfAnguish) && Duel.CurrentChain.Contains(target))) + { + Logger.DebugWriteLine("[BigWelcome]escape target"); + if (!noSelect) + { + bigwelcomeEscaseTarget = target; + escapeTargetList.Add(target); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + + if (Bot.GetMonsterCount() > 0) + { + bool flag1 = needDestroyFlag && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1) && (Util.ChainContainPlayer(1) || Duel.LastChainPlayer != 0); + bool flag2 = DefaultOnBecomeTarget(); + bool flag3 = Duel.Player == 1 && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && activateTimingFlag; + bool flag4 = Duel.Player == 0 && Duel.LastChainPlayer != 0 && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth); + Logger.DebugWriteLine("[BigWelcome count>0]flag: "+ flag1 + " " + flag2 + " " + flag3 + " " + flag4); + needDestroyFlag |= flag3; + if (flag1 || flag2 || flag3 || flag4) + { + bool spSummonLovely = CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle) && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + bool haveLovely = Bot.GetMonsters().Any(card => card.IsFaceup() && card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)); + if (!noSelect) + { + activatedCardIdList.Add(Card.Id); + } + ResetCooclockEffect(onlyCheck); + return true; + } + } + else { + bool activateFlag = DefaultOnBecomeTarget(); + activateFlag |= Duel.Player == 1 && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && activateTimingFlag; + activateFlag |= Duel.Player == 0 && !summoned && !Bot.HasInHand(CardId.AriannaTheLabrynthServant) && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) + && !(Duel.Phase < DuelPhase.Main1 && Bot.HasInHand(CardId.PotOfExtravagance) && Bot.ExtraDeck.Count() >= 3) + && !(Duel.CurrentChain.Any(card => card.IsCode(CardId.PotOfExtravagance) && card.Controller == 0)); + if (activateFlag && !noSelect) + { + activatedCardIdList.Add(Card.Id); + ResetCooclockEffect(onlyCheck); + return true; + } + } + + return false; + } + + public bool BigWelcomeLabrynthGraveActivate() + { + if (Card.Location == CardLocation.Grave) + { + // bounce enemy + if (Bot.GetMonsters().Any(card => card.Level >= 8 && card.IsFaceup() && card.HasRace(CardRace.Fiend) && !card.HasType(CardType.Xyz | CardType.Link))) + { + // danger monster + ClientCard problemCard = GetProblematicEnemyMonster(-1, true, true, CardType.Trap); + if (problemCard != null) + { + AI.SelectCard(problemCard); + currentDestroyCardList.Add(problemCard); + activatedCardIdList.Add(Card.Id); + return true; + } + // problem spell + if (!Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || + activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle) && activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1)) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && c.IsFaceup() + && c.IsFloodgate() + && !c.IsShouldNotBeTarget() && (c.HasType(CardType.Trap) || Duel.Player == 0)).ToList(); + + problemEnemySpellList.AddRange(Enemy.SpellZone.Where(c => c?.Data != null && c.IsFaceup() && !problemEnemySpellList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) + && !c.IsShouldNotBeTarget() && (c.HasType(CardType.Trap) || Duel.Player == 0)).ToList()); + + if (problemEnemySpellList.Count() > 0) + { + AI.SelectCard(problemEnemySpellList); + currentDestroyCardList.Add(problemEnemySpellList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + // best monster + int botBestPower = Util.GetBestPower(Bot); + if (Duel.Player == 1 && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + List dangerMonsters = Enemy.GetMonsters().Where(card => card.IsFaceup() && card.Attack >= botBestPower + && !currentDestroyCardList.Contains(card) && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + .OrderByDescending(card => card.Attack).ToList(); + if (dangerMonsters.Count() > 0) + { + AI.SelectCard(dangerMonsters); + currentDestroyCardList.Add(dangerMonsters[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + // end phase + if (Duel.Phase > DuelPhase.Main2) + { + List returnList = GetNormalEnemyTargetList(true, true, CardType.Trap); + if (returnList.Count() > 0) + { + AI.SelectCard(returnList); + currentDestroyCardList.Add(returnList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + // escape target + List targetList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasRace(CardRace.Fiend)).ToList(); + foreach (ClientCard target in targetList) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target) + && !(target.IsCode(CardId.UnchainedSoulOfRage, CardId.UnchainedSoulOfAnguish) && Duel.CurrentChain.Contains(target))) + { + AI.SelectCard(target); + escapeTargetList.Add(target); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // bounce arianna + if (Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 && !summoned && !Bot.HasInHand(CardId.AriannaTheLabrynthServant) + && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + ClientCard target = targetList.FirstOrDefault(card => card.IsCode(CardId.AriannaTheLabrynthServant)); + if (target != null) + { + AI.SelectCard(target); + escapeTargetList.Add(target); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // trigger furniture/welcome + List checkFurnitureList = new List(Bot.Hand); + checkFurnitureList.AddRange(Bot.GetMonsters()); + if ((CheckRemainInDeck(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth) == 0 + || !checkFurnitureList.Any(card => card.IsCode(CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie))) + && Duel.LastChainPlayer < 0 && Duel.Player == 0 && !Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) + && !(cooclockAffected && Bot.HasInHandOrInSpellZone(CardId.BigWelcomeLabrynth))) + { + int checkCount = 0; + List checkIdList = new List { CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, CardId.WelcomeLabrynth }; + foreach (int checkId in checkIdList) + { + if (Bot.HasInGraveyard(checkId) && !activatedCardIdList.Contains(checkId + 1)) checkCount++; + } + if (checkCount > 0) + { + ClientCard target = targetList.FirstOrDefault(card => card.IsFaceup() && card.HasRace(CardRace.Fiend) && + ((card.Level <= 4 && !card.HasType(CardType.Link | CardType.Xyz | CardType.Synchro)) || card.IsCode(CardId.LadyLabrynthOfTheSilverCastle))); + if (target != null) + { + AI.SelectCard(target); + escapeTargetList.Add(target); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + } + + return false; + } + + public bool ChaosAngelSpSummonWith2Monster() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + + List level2MonsterList = new List(); + List level4MonsterList = new List(); + List level6MonsterList = new List(); + List level8MonsterList = new List(); + foreach (ClientCard monster in Bot.GetMonsters()) + { + if (monster.IsFaceup() && !monster.HasType(CardType.Xyz | CardType.Link) && monster.HasAttribute(CardAttribute.Light | CardAttribute.Dark)) + { + if (monster.Level == 2) level2MonsterList.Add(monster); + if (monster.Level == 4) level4MonsterList.Add(monster); + if (monster.Level == 6) level6MonsterList.Add(monster); + if (monster.Level == 8) level8MonsterList.Add(monster); + } + } + level2MonsterList.Sort(CompareUsableAttack); + level4MonsterList.Sort(CompareUsableAttack); + level6MonsterList.Sort(CompareUsableAttack); + level8MonsterList.Sort(CompareUsableAttack); + bool checkFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); + if (Util.GetBestPower(Bot, true) <= Util.GetBestPower(Enemy)) + { + checkFlag |= Util.GetBestPower(Enemy) <= 3500; + checkFlag |= !Util.GetBestEnemyMonster().IsShouldNotBeTarget() && !Util.GetBestEnemyMonster().IsShouldNotBeMonsterTarget(); + } + // 4+6 + if (level4MonsterList.Count() > 0 && level6MonsterList.Count() > 0) + { + List materials = new List{level4MonsterList[0], level6MonsterList[0]}; + bool summonFlag = checkFlag; + if (Enemy.GetMonsterCount() == 0 && Duel.Phase < DuelPhase.Main2) + summonFlag |= GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(materials) + 3500 >= Enemy.LifePoints; + if (summonFlag) + { + AI.SelectMaterials(materials); + return true; + } + } + // 2+8 + if (level2MonsterList.Count() > 0 && level8MonsterList.Count() > 0) + { + foreach (ClientCard level2 in level2MonsterList) + { + foreach (ClientCard level8 in level8MonsterList) + { + List materials = new List{level2, level8}; + if (checkFlag && !(level8.IsCode(CardId.LovelyLabrynthOfTheSilverCastle) && !level8.IsDisabled() && Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth))) + { + AI.SelectMaterials(materials); + return true; + } + if (Enemy.GetMonsterCount() == 0 && GetMaterialAttack(materials) < 3500 && Duel.Phase < DuelPhase.Main2) + { + if (GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(materials) + 3500 >= Enemy.LifePoints) + { + AI.SelectMaterials(materials); + return true; + } + } + } + } + } + return false; + } + public bool ChaosAngelSpSummonWith3Monster() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + + List level2MonsterList = new List(); + List level4MonsterList = new List(); + foreach (ClientCard monster in Bot.GetMonsters()) + { + if (monster.IsFaceup() && !monster.HasType(CardType.Xyz | CardType.Link) && monster.HasAttribute(CardAttribute.Light | CardAttribute.Dark)) + { + if (monster.Level == 2) level2MonsterList.Add(monster); + if (monster.Level == 4) level4MonsterList.Add(monster); + } + } + level2MonsterList.Sort(CompareUsableAttack); + level4MonsterList.Sort(CompareUsableAttack); + bool checkFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); + if (Util.GetBestPower(Bot, true) <= Util.GetBestPower(Enemy)) + { + checkFlag |= Util.GetBestPower(Enemy) <= 3500; + checkFlag |= !Util.GetBestEnemyMonster().IsShouldNotBeTarget() && !Util.GetBestEnemyMonster().IsShouldNotBeMonsterTarget(); + } + // 2+4+4 + if (level2MonsterList.Count() >= 1 && level4MonsterList.Count() >= 2) + { + foreach (ClientCard level2 in level2MonsterList) + { + for (int level4Index1 = 0; level4Index1 < level4MonsterList.Count() - 1; ++level4Index1) + { + ClientCard level41 = level4MonsterList[level4Index1]; + for (int level4Index2 = level4Index1 + 1; level4Index2 < level4MonsterList.Count(); ++level4Index2) + { + ClientCard level42 = level4MonsterList[level4Index2]; + List materials = new List { level2, level41, level42 }; + bool summonFlag = checkFlag; + if (Enemy.GetMonsterCount() == 0 && Duel.Phase < DuelPhase.Main2) + summonFlag |= GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(materials) + 3500 >= Enemy.LifePoints; + if (summonFlag) + { + AI.SelectMaterials(materials); + return true; + } + } + } + } + } + return false; + } + public bool ChaosAngelActivate() + { + List targetList = GetNormalEnemyTargetList(true, true, CardType.Monster); + if (targetList.Count() > 0) + { + AI.SelectCard(targetList); + currentDestroyCardList.Add(targetList[0]); + return true; + } + + return false; + } + + public bool SummonForTYPHONCheck() + { + if (!Bot.HasInExtra(CardId.SuperStarslayerTYPHON) || Bot.GetMonsters().Any(card => card.IsFaceup())) return false; + if (enemySpSummonFromExLastTurn < 2 && enemySpSummonFromExThisTurn < 2) return false; + if (Card.Level > 4) return false; + + int currentAttack = 0; + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(Card.Id); + if (cardData != null) currentAttack = cardData.Attack; + List summonList = Bot.Hand.Where(card => card.IsMonster() && card.Level <= 4).ToList(); + foreach (ClientCard checkCard in summonList) + { + cardData = YGOSharp.OCGWrapper.NamedCard.Get(checkCard.Id); + if (cardData != null && cardData.Attack < currentAttack) return false; + } + + return true; + } + public bool SuperStarslayerTYPHONSpSummon() + { + ClientCard material = Bot.GetMonsters().Where(card => card.IsFaceup()).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (material == null || (material.Attack >= 2900 && material.Owner == 0)) return false; + + bool checkFlag = GetProblematicEnemyMonster(material.Attack) != null; + checkFlag |= material.Level <= 4; + checkFlag &= !(material.HasType(CardType.Link) && Duel.Phase >= DuelPhase.Main2); + if (checkFlag) + { + Logger.DebugWriteLine("*** TYPHON select: " + material.Name ?? "UnkonwCard"); + AI.SelectMaterials(material); + return true; + } + + return false; + } + public bool SuperStarslayerTYPHONActivate() + { + if (CheckWhetherNegated()) return false; + List targetList = new List(); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsFloodgate() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsMonsterDangerous() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsMonsterInvincible() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.GetDefensePower() >= Util.GetBestAttack(Bot) && c.IsAttack()).OrderByDescending(card => card.Attack)); + if (Duel.Phase >= DuelPhase.Main2) + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link | CardType.SpSummon)).OrderByDescending(card => card.Attack)); + + if (targetList.Count() > 0) + { + targetList.AddRange(Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).OrderByDescending(card => card.Attack)); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && !targetList.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Bot.GetMonsters().Where(card => card.IsFacedown() && !targetList.Contains(card)).ToList())); + targetList.AddRange(Bot.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).OrderBy(card => card.Attack)); + AI.SelectCard(Card.Overlays); + Logger.DebugWriteLine("TYPHON first target: " + targetList[0]?.Name ?? "UNKNOWN"); + AI.SelectNextCard(targetList); + return true; + } + + return false; + } + + public bool UnchainedAbominationSpSummon() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + if (Enemy.GetMonsterCount() > 0 && Bot.HasInMonstersZone(CardId.UnchainedSoulOfAnguish) && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish)) return false; + List> usableMaterialMultiList = new List>(); + // anguish + 1 + ClientCard anguish = Bot.GetMonsters().FirstOrDefault(card => card.IsCode(CardId.UnchainedSoulOfAnguish)); + if (anguish != null) + { + List materials = GetCanBeUsedForLinkMaterial(true, card => card == anguish); + if (materials.Count() > 0) + { + usableMaterialMultiList.Add(new List { anguish, materials[0] }); + } + } + // link2 + 1 + 1 or link2 + link2 + List link2List = Bot.GetMonsters().Where(card => card.HasType(CardType.Link) && card.LinkCount == 2 + && !(card.IsCode(CardId.MuckrakerFromTheUnderworld) && summonThisTurn.Contains(card))).OrderBy(card => card.Attack).ToList(); + if (link2List.Count() > 0) + { + ClientCard link2Material = null; + ClientCard littleKnight = link2List.FirstOrDefault(card => card.Sequence >= 5 && card.IsCode(CardId.SPLittleKnight)); + if (littleKnight != null) link2Material = littleKnight; + else link2Material = link2List[0]; + if (link2List.Count() >= 2) + { + usableMaterialMultiList.Add(new List { link2Material, link2List.FirstOrDefault(card => card != link2Material) }); + } + List remainList = GetCanBeUsedForLinkMaterial(false, card => card != link2Material && !(card.HasType(CardType.Link) && card.LinkMarker > 2)); + if (remainList.Count() >= 2) + { + usableMaterialMultiList.Add(new List { link2Material, remainList[0], remainList[1] }); + } + } + + // check material list + foreach (List currMaterials in usableMaterialMultiList) + { + bool summonFlag = CheckCanDirectAttack() && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(currMaterials) + 3000 >= Enemy.LifePoints; + summonFlag |= GetProblematicEnemyMonster(0) != null && GetProblematicEnemyMonster(3000) == null; + + if (summonFlag) + { + AI.SelectMaterials(currMaterials); + return true; + } + } + + return false; + } + public bool UnchainedAbominationActivate() + { + if (CheckWhetherNegated()) return false; + List targetList = GetNormalEnemyTargetList(true, true, CardType.Monster); + if (targetList.Count() == 0) return false; + int logDesc = ActivateDescription; + if (logDesc >= Util.GetStringId(CardId.UnchainedAbomination, 0)) + { + logDesc = Util.GetStringId(CardId.UnchainedAbomination, 0) - 10; + } + Logger.DebugWriteLine("[UnchainedAbomination]desc: " + logDesc + ", timing = " + CurrentTiming); + if (ActivateDescription == Util.GetStringId(CardId.UnchainedAbomination, 0)) activatedCardIdList.Add(Card.Id); + if (ActivateDescription == Util.GetStringId(CardId.UnchainedAbomination, 1) || ActivateDescription == -1) activatedCardIdList.Add(Card.Id + 1); + if (ActivateDescription == Util.GetStringId(CardId.UnchainedAbomination, 2)) activatedCardIdList.Add(Card.Id + 2); + AI.SelectCard(targetList); + + return true; + } + + public bool UnchainedSoulOfAnguishSpSummon() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + + ClientCard unchainedNonLink = Bot.GetMonsters().FirstOrDefault(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained) && !card.HasType(CardType.Link)); + ClientCard unchainedLink2 = Bot.GetMonsters().FirstOrDefault(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained) && card.HasType(CardType.Link) && card.LinkCount == 2); + Logger.DebugWriteLine("[Anguish summon] unchainedNonLink = " + unchainedNonLink?.Name + ", unchainedLink2 = " + unchainedLink2?.Name); + if (unchainedNonLink == null && unchainedLink2 == null) return false; + int needMonsterCount = 2; + if (unchainedLink2 != null) needMonsterCount = 1; + if (needMonsterCount == 2 && Bot.HasInExtra(CardId.UnchainedSoulLordOfYama)) return false; + bool needAnguish = !Bot.HasInMonstersZone(CardId.UnchainedSoulOfAnguish) && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish) + && Enemy.GetMonsters().Any(card => card.IsFaceup()); + if (needAnguish) + { + needAnguish = Bot.HasInExtra(CardId.UnchainedSoulOfRage); + needAnguish |= Bot.HasInExtra(CardId.UnchainedAbomination); + needAnguish |= Bot.HasInExtra(CardId.SPLittleKnight) && banSpSummonExceptFiendCount == 0; + } + Logger.DebugWriteLine("[Anguish summon] needAnguish = " + needAnguish.ToString()); + + // check material + if (needMonsterCount == 1) + { + List materialList = GetCanBeUsedForLinkMaterial(needAnguish, card => card == unchainedLink2); + Logger.DebugWriteLine("[Anguish summon 1] material count = " + materialList.Count().ToString()); + if (materialList.Count() == 0) return false; + List selectMaterials = new List{ unchainedLink2, materialList[0]}; + bool summonFlag = needAnguish; + summonFlag |= CheckCanDirectAttack() && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(selectMaterials) + 2400 >= Enemy.LifePoints; + Logger.DebugWriteLine("[Anguish summon 1] summon flag " + summonFlag.ToString()); + if (summonFlag) + { + AI.SelectMaterials(selectMaterials); + return true; + } + } + if (needMonsterCount == 2) + { + List materialList = GetCanBeUsedForLinkMaterial(needAnguish, card => card == unchainedNonLink); + Logger.DebugWriteLine("[Anguish summon 2] material count = " + materialList.Count().ToString()); + if (materialList.Count() >= 2) + { + List selectMaterials = new List { unchainedNonLink, materialList[0], materialList[1] }; + if (needAnguish || GetMaterialAttack(selectMaterials) < 2400) + { + AI.SelectMaterials(selectMaterials); + return true; + } + } + } + + return false; + } + public bool UnchainedSoulOfAnguishActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated()) return false; + List targetList = Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeMonsterTarget()).OrderByDescending(card => card.Attack).ToList(); + if (targetList.Count() > 0) + { + currentDestroyCardList.Add(targetList[0]); + int summonId = 0; + if (Bot.HasInExtra(CardId.UnchainedAbomination) && GetProblematicEnemyMonster(3000, ignoreCurrentDestroy:true) == null) + summonId = CardId.UnchainedAbomination; + else if (banSpSummonExceptFiendCount == 0 && Bot.HasInExtra(CardId.SPLittleKnight) && GetProblematicEnemyCardList(true, false, CardType.Monster).Count() > 0) + summonId = CardId.SPLittleKnight; + else if (Bot.HasInExtra(CardId.UnchainedSoulOfRage)) summonId = CardId.UnchainedSoulOfRage; + if (summonId > 0) + { + List materialList = new List(targetList){Card}; + Logger.DebugWriteLine("*** Anguish select: " + summonId.ToString()); + + AI.SelectCard(targetList); + AI.SelectNextCard(summonId); + AI.SelectMaterials(materialList); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + return UnchainRecycleActivate(); + } + + return false; + } + + public bool UnchainedSoulLordOfYamaSpSummon() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + if (Bot.HasInMonstersZone(CardId.UnchainedSoulLordOfYama) || activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama)) return false; + + bool need3Monster = Bot.HasInExtra(CardId.UnchainedSoulOfAnguish) && !Bot.HasInMonstersZone(CardId.UnchainedSoulOfAnguish) + && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish) && GetProblematicEnemyMonster(canBeTarget:true, selfType: CardType.Monster) != null; + need3Monster |= CheckAtAdvantage() && Duel.Phase == DuelPhase.Main2 + && Bot.HasInExtra(CardId.UnchainedSoulOfRage) && !Bot.HasInMonstersZone(CardId.UnchainedSoulOfRage); + bool haveUnchainSoul = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained)); + if (need3Monster) + { + need3Monster = Bot.HasInExtra(CardId.UnchainedSoulOfRage); + need3Monster |= Bot.HasInExtra(CardId.UnchainedAbomination); + need3Monster |= Bot.HasInExtra(CardId.SPLittleKnight) && banSpSummonExceptFiendCount == 0; + } + // check material + List materialList = GetCanBeUsedForLinkMaterial(need3Monster, + card => !card.HasRace(CardRace.Fiend) || (card.HasType(CardType.Link) && card.HasSetcode(SetcodeUnchained))); + Logger.DebugWriteLine("[Yama Summon]need3Monster = " + need3Monster.ToString() + ", material count = " + materialList.Count()); + for (int index1 = 0; index1 < materialList.Count() - 1; ++ index1) + { + ClientCard material1 = materialList[index1]; + for (int index2 = index1 + 1; index2 < materialList.Count(); ++ index2) + { + ClientCard material2 = materialList[index2]; + List selectMaterials = new List{material1, material2}; + if (need3Monster && materialList.Count() == 2 && (activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara) || Bot.GetSpells().Count() == 0)) + { + // only for attack + if (GetProblematicEnemyMonster() != null || !CheckCanDirectAttack() || GetMaterialAttack(selectMaterials) >= 2000) return false; + } + bool summonFlag = need3Monster; + summonFlag |= Enemy.GetMonsterCount() == 0 && GetMaterialAttack(selectMaterials) < 2000; + summonFlag |= CheckAtAdvantage() && !haveUnchainSoul; + if (summonFlag) + { + AI.SelectMaterials(selectMaterials); + return true; + } + } + } + + return false; + } + public bool UnchainedSoulLordOfYamaActivate() + { + if (Card.Location == CardLocation.MonsterZone && (ActivateDescription == Util.GetStringId(CardId.UnchainedSoulLordOfYama, 0) || ActivateDescription == -1)) + { + // search + if (CheckWhetherNegated()) return false; + AI.SelectCard(CardId.UnchainedSoulOfSharvara, CardId.UnchainedAbomination, CardId.UnchainedSoulOfAnguish, CardId.UnchainedSoulOfRage); + activatedCardIdList.Add(Card.Id); + return true; + } + else if (Card.Location == CardLocation.Grave) + { + // spsummon & destroy + ClientCard chaosAngel = null; + ClientCard abomination = null; + ClientCard lady = null; + ClientCard lovely = null; + ClientCard arianna = null; + ClientCard bestAttack = null; + ClientCard rage = null; + foreach (ClientCard grave in Bot.Graveyard) + { + if (grave.IsCode(CardId.ChaosAngel) && grave.ProcCompleted != 0 && !dimensionalBarrierAnnouced.Contains(HintMsg.SYNCHRO)) chaosAngel = grave; + if (grave.IsCode(CardId.UnchainedSoulOfRage) && grave.ProcCompleted != 0) rage = grave; + if (grave.IsCode(CardId.UnchainedAbomination) && grave.ProcCompleted != 0) abomination = grave; + if (grave.IsCode(CardId.LadyLabrynthOfTheSilverCastle)) lady = grave; + if (grave.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) lovely = grave; + if (grave.IsCode(CardId.AriannaTheLabrynthServant)) arianna = grave; + if (Card != grave && grave.IsMonster() && grave.HasRace(CardRace.Fiend)) + { + if (!grave.IsCanRevive()) continue; + if (bestAttack == null || grave.Attack > bestAttack.Attack) bestAttack = grave; + } + } + + ClientCard select = null; + bool destroyWelcome = false; + if (chaosAngel != null && (GetProblematicEnemyCardList(selfType: CardType.Monster).Count() > 0 || + (Bot.GetMonsterCount() == 0 && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + select = chaosAngel; + } + if (select == null && abomination != null && (GetProblematicEnemyCardList(selfType: CardType.Monster).Count() > 0 || + (Bot.GetMonsterCount() == 0 && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + select = abomination; + Logger.DebugWriteLine("[Yama] timing: " + CurrentTiming.ToString()); + if (Bot.HasInSpellZone(CardId.WelcomeLabrynth) && !(Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + && !activatedCardIdList.Contains(CardId.UnchainedAbomination)) + { + destroyWelcome = true; + } + } + if (select == null && rage != null && (Duel.Player == 0 || (!activatedCardIdList.Contains(CardId.UnchainedSoulOfRage) && (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2))) + && Bot.HasInExtra(new List { CardId.UnchainedSoulOfAnguish, CardId.SPLittleKnight })) select = rage; + if (select == null && arianna != null && Duel.Player == 0 && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant)) select = arianna; + if (select == null && lovely != null && Duel.Player == 1 && Util.GetBestAttack(Enemy) < 2900) select = lovely; + if (select == null && lady != null && Duel.Player == 1 && Util.GetBestAttack(Enemy) < 3000) select = lady; + if (select == null && arianna != null && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant)) select = arianna; + if (select == null && bestAttack != null) select = bestAttack; + + if (select != null) + { + activatedCardIdList.Add(Card.Id + 1); + AI.SelectCard(select); + if (destroyWelcome) + { + AI.SelectYesNo(true); + AI.SelectNextCard(CardId.WelcomeLabrynth); + } else { + AI.SelectYesNo(false); + } + return true; + } + } + + return false; + } + + public bool UnchainedSoulOfRageSpSummon() + { + if (CheckShouldNoMoreSpSummon(false) || CheckWhetherNegated(true, true, CardType.Monster | CardType.Link)) return false; + if (Bot.HasInMonstersZone(CardId.UnchainedSoulOfRage)) return false; + + ClientCard unchained = Bot.GetMonsters().FirstOrDefault(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained) + && !card.IsCode(CardId.UnchainedSoulOfAnguish, CardId.UnchainedAbomination)); + if (unchained == null) return false; + + bool summonFlag = CheckAtAdvantage() && Util.IsTurn1OrMain2(); + summonFlag |= !(Bot.HasInExtra(CardId.UnchainedSoulOfAnguish) && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish)) && Util.IsTurn1OrMain2(); + if (summonFlag) + { + summonFlag = Bot.HasInExtra(CardId.UnchainedSoulOfAnguish); + summonFlag |= Bot.HasInExtra(CardId.SPLittleKnight) && banSpSummonExceptFiendCount == 0; + } + + List materialList = GetCanBeUsedForLinkMaterial(Util.IsTurn1OrMain2(), + card => !card.HasRace(CardRace.Fiend) || card == unchained); + if (materialList.Count() > 0) + { + List selectMaterials = new List{unchained, materialList[0]}; + summonFlag |= Enemy.GetMonsterCount() == 0 && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(selectMaterials) + 1800 >= Enemy.LifePoints; + if (summonFlag) + { + AI.SelectMaterials(selectMaterials); + return true; + } + } + + return false; + } + public bool UnchainedSoulOfRageActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated()) return false; + bool activateFlag = DefaultOnBecomeTarget() && !Util.ChainContainsCard(CardId.EscapeOfTheUnchained); + ClientCard problemMonster = GetProblematicEnemyMonster(-1, true, true, CardType.Monster); + List targetList = Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeTarget()).OrderBy(card => card.Attack).ToList(); + if (problemMonster != null) targetList.Insert(0, problemMonster); + + activateFlag |= (CurrentTiming & hintTimingMainEnd) > 0 && Util.IsOneEnemyBetterThanValue(Card.Attack, true); + activateFlag |= problemMonster != null; + + if (activateFlag && targetList.Count() > 0) + { + ClientCard target = targetList[0]; + int summonId = 0; + if (Bot.HasInExtra(CardId.UnchainedAbomination) && GetProblematicEnemyMonster(3000) == null + && target.HasType(CardType.Link) && target.LinkCount == 2) summonId = CardId.UnchainedSoulOfAnguish; + else if (banSpSummonExceptFiendCount == 0 && Bot.HasInExtra(CardId.SPLittleKnight)) summonId = CardId.SPLittleKnight; + else if (Bot.HasInExtra(CardId.UnchainedSoulOfAnguish) && GetProblematicEnemyMonster(2400) == null) summonId = CardId.UnchainedSoulOfAnguish; + List materialList = new List(targetList){Card}; + + AI.SelectCard(targetList); + AI.SelectNextCard(summonId); + AI.SelectMaterials(materialList); + activatedCardIdList.Add(Card.Id); + escapeTargetList.Add(Card); + currentDestroyCardList.Add(target); + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + return UnchainRecycleActivate(); + } + + return false; + } + + public bool UnchainRecycleActivate() + { + AI.SelectCard(CardId.UnchainedSoulOfSharvara, CardId.LovelyLabrynthOfTheSilverCastle, CardId.AriannaTheLabrynthServant, + CardId.UnchainedAbomination, CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock, + CardId.AriasTheLabrynthButler, CardId.ArianeTheLabrynthServant); + activatedCardIdList.Add(Card.Id + 1); + + return true; + } + + public bool SPLittleKnightSpSummon() + { + if (CheckCanDirectAttack()) + { + // for attack + List materialList = SPLittleKnightSelectMaterial(); + if (materialList.Count() >= 2 && GetMaterialAttack(materialList) < 1600) + { + AI.SelectMaterials(materialList); + return true; + } + } else if (!CheckWhetherNegated(true, true, CardType.Monster | CardType.Link) && GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0) + { + // for remove + List materialList = SPLittleKnightSelectMaterial(true); + if (materialList.Count() >= 2 && materialList.Any(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link))) + { + AI.SelectMaterials(materialList); + return true; + } + } + return false; + } + public List SPLittleKnightSelectMaterial(bool needToUseEffect = false) + { + List usedMaterialList = new List(); + if (Bot.GetMonstersExtraZoneCount() > 0) + { + ClientCard botMonsterExtraZome = Bot.GetMonstersInExtraZone()[0]; + if (botMonsterExtraZome.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Pendulum) || botMonsterExtraZome.IsCode(CardId.RelinquishedAnima)) + { + usedMaterialList.Add(botMonsterExtraZome); + if (botMonsterExtraZome.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) needToUseEffect = false; + } + List materialList = GetCanBeUsedForLinkMaterial(true, card => card == botMonsterExtraZome); + if (materialList.Count() > 0) + { + foreach (ClientCard card in materialList) + { + if (!needToUseEffect || card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz) || (card.HasType(CardType.Link) && card.LinkCount <= 2)) + { + usedMaterialList.Add(card); + if (card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) needToUseEffect = false; + } + if (usedMaterialList.Count() >= 2) break; + } + } + if (usedMaterialList.Count() < 2) usedMaterialList.Clear(); + } else { + List materialList = GetCanBeUsedForLinkMaterial(true, card => !needToUseEffect + || card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz) || (card.HasType(CardType.Link) && card.LinkCount <= 2)); + if (materialList.Count() >= 2) + { + for (int idx1 = 0; idx1 < materialList.Count() - 1; ++ idx1) + { + ClientCard material1 = materialList[idx1]; + if (material1.HasType(CardType.Link) && material1.LinkCount >= 3) continue; + bool flag1 = !needToUseEffect || material1.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + for (int idx2 = 0; idx2 < materialList.Count(); ++ idx2) + { + ClientCard material2 = materialList[idx2]; + if (material2.HasType(CardType.Link) && material2.LinkCount >= 3) continue; + bool flag2 = !needToUseEffect || material2.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + if (flag1 || flag2) + { + return new List{material1, material2}; + } + } + } + } + } + + return usedMaterialList; + } + + public bool SPLittleKnightActivate() + { + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 0)) + { + // banish card + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetDangerousCardinEnemyGrave(false)); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + if (problemCardList.Count() > 0) + { + AI.SelectCard(problemCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + } else if (ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 1)) + { + ClientCard selfMonster = null; + foreach (ClientCard target in Bot.GetMonsters()) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target)) + { + selfMonster = target; + break; + } + } + if (selfMonster == null) + { + if (Duel.Player == 1) + { + selfMonster = Bot.GetMonsters().Where(card => card.IsAttack()).OrderBy(card => card.Attack).FirstOrDefault(); + if (!Util.IsOneEnemyBetterThanValue(selfMonster.Attack, true)) selfMonster = null; + } + } + if (selfMonster != null) + { + ClientCard nextMonster = null; + List selfTargetList = Bot.GetMonsters().Where(card => card != selfMonster).ToList(); + if (Enemy.GetMonsterCount() == 0 && selfTargetList.Count() > 0) + { + selfTargetList.Sort(CompareUsableAttack); + nextMonster = selfTargetList[0]; + escapeTargetList.Add(nextMonster); + } + if (Enemy.GetMonsterCount() > 0) + { + nextMonster = GetBestEnemyMonster(false, true, true); + currentDestroyCardList.Add(nextMonster); + } + if (nextMonster != null) + { + AI.SelectCard(selfMonster); + AI.SelectNextCard(nextMonster); + escapeTargetList.Add(selfMonster); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + return false; + } + + public bool MuckrakerFromTheUnderworldSpSummon() + { + List materialList = GetCanBeUsedForLinkMaterial(true, card => card.HasType(CardType.Link)); + if (materialList.Count() < 2) return false; + bool willBeNegated = CheckWhetherNegated(true, true, CardType.Monster | CardType.Link) && Bot.Hand.Count() > 0; + bool canRebornAngel = Bot.Graveyard.Any(card => card.IsCanRevive() && card.IsCode(CardId.ChaosAngel)) && !willBeNegated; + bool canRebornLovely = Bot.Graveyard.Any(card => card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) && !willBeNegated; + int bestAttackGrave = 0; + bool chaosAngelFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); + foreach (ClientCard grave in Bot.Graveyard) + { + if (grave.IsMonster() && grave.HasRace(CardRace.Fiend)) + { + if (!grave.IsCanRevive()) continue; + if (grave.Attack > bestAttackGrave) bestAttackGrave = grave.Attack; + } + } + for (int idx1 = 0; idx1 < materialList.Count() - 1; ++ idx1) + { + ClientCard material1 = materialList[idx1]; + for (int idx2 = idx1 + 1; idx2 < materialList.Count(); ++ idx2) + { + ClientCard material2 = materialList[idx1]; + List currentList = new List { material1, material2 }; + bool summonFlag = chaosAngelFlag && (canRebornAngel || (currentList.Any(card => card.IsCode(CardId.ChaosAngel)) && !willBeNegated)); + summonFlag |= Enemy.GetMonsterCount() == 0 && canRebornLovely; + summonFlag |= !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle) && Bot.Graveyard.Any(card => card.Type == (int)CardType.Trap) + && currentList.Any(card => card.IsDisabled() && card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)); + if (CheckCanDirectAttack()) + { + summonFlag |= GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(currentList) + bestAttackGrave >= Enemy.LifePoints; + summonFlag |= GetMaterialAttack(currentList) < 1000; + } + if (summonFlag) + { + AI.SelectMaterials(currentList); + return true; + } + } + } + return false; + } + public bool MuckrakerFromTheUnderworldActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.MuckrakerFromTheUnderworld, 0)) + { + if (CheckWhetherNegated()) return false; + ClientCard chaosAngel = null; + ClientCard lovely = null; + ClientCard arianna = null; + ClientCard bestAttack = null; + foreach (ClientCard grave in Bot.Graveyard) + { + if (grave.IsCode(CardId.ChaosAngel) && grave.ProcCompleted != 0 && !dimensionalBarrierAnnouced.Contains(HintMsg.SYNCHRO)) chaosAngel = grave; + if (grave.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) lovely = grave; + if (grave.IsCode(CardId.AriannaTheLabrynthServant)) arianna = grave; + if (Card != grave && grave.IsMonster() && grave.HasRace(CardRace.Fiend)) + { + if (!grave.IsCanRevive()) continue; + if (bestAttack == null || grave.Attack > bestAttack.Attack) bestAttack = grave; + } + } + + ClientCard rebornTarget = null; + if (chaosAngel != null && (GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0)) rebornTarget = chaosAngel; + if (rebornTarget == null && lovely != null && Util.GetBestAttack(Enemy) < 2900 && + (!activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle) || Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth))) rebornTarget = lovely; + if (rebornTarget == null && bestAttack != null && CheckCanDirectAttack() + && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack() + bestAttack.Attack >= Enemy.LifePoints) rebornTarget = bestAttack; + if (rebornTarget == null && arianna != null && Duel.Player == 0 && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant)) rebornTarget = arianna; + if (rebornTarget == null && bestAttack != null) rebornTarget = bestAttack; + if (rebornTarget != null) + { + AI.SelectCard(rebornTarget); + AI.SelectNextCard(FurnitureGetCost()); + activatedCardIdList.Contains(Card.Id); + banSpSummonExceptFiendCount = Math.Max(1, banSpSummonExceptFiendCount); + return true; + } + } + + return false; + } + + public bool RelinquishedAnimaSpSummon() + { + if (CheckWhetherNegated()) return false; + // summon to use effect + ClientCard enemyLeftEx = Enemy.MonsterZone[6]; + if (enemyLeftEx != null && enemyLeftEx.HasLinkMarker((int)CardLinkMarker.Top) && !enemyLeftEx.IsShouldNotBeTarget() && !enemyLeftEx.IsShouldNotBeMonsterTarget()) + { + ClientCard selfMonsterZone1 = Bot.MonsterZone[1]; + if (selfMonsterZone1 == null) + { + AI.SelectMaterials(CardId.LabrynthCooclock); + AI.SelectPlace(Zones.z1); + return true; + } + else if (!selfMonsterZone1.HasType(CardType.Xyz | CardType.Link | CardType.Token) && selfMonsterZone1.Level == 1) + { + AI.SelectMaterials(selfMonsterZone1); + AI.SelectPlace(Zones.z1); + return true; + } + } + ClientCard enemyRightEx = Enemy.MonsterZone[5]; + if (enemyRightEx != null && enemyRightEx.HasLinkMarker((int)CardLinkMarker.Top) && !enemyRightEx.IsShouldNotBeTarget() && !enemyRightEx.IsShouldNotBeMonsterTarget()) + { + ClientCard selfMonsterZone3 = Bot.MonsterZone[3]; + if (selfMonsterZone3 == null) + { + AI.SelectMaterials(CardId.LabrynthCooclock); + AI.SelectPlace(Zones.z3); + return true; + } + else if (!selfMonsterZone3.HasType(CardType.Xyz | CardType.Link | CardType.Token) && selfMonsterZone3.Level == 1) + { + AI.SelectMaterials(selfMonsterZone3); + AI.SelectPlace(Zones.z3); + return true; + } + } + + if (Bot.MonsterZone[5] != null || Bot.MonsterZone[6] != null) return false; + ClientCard enemyMonsterLeft = Enemy.MonsterZone[3]; + ClientCard enemyMonsterRight = Enemy.MonsterZone[1]; + if (Enemy.MonsterZone[6] != null) enemyMonsterLeft = null; + if (enemyMonsterLeft != null && enemyMonsterLeft.IsFacedown()) enemyMonsterLeft = null; + if (enemyMonsterLeft != null && (enemyMonsterLeft.IsShouldNotBeMonsterTarget() || enemyMonsterLeft.IsShouldNotBeTarget())) enemyMonsterLeft = null; + + if (Enemy.MonsterZone[5] != null) enemyMonsterRight = null; + if (enemyMonsterRight != null && (enemyMonsterRight.IsShouldNotBeMonsterTarget() || enemyMonsterRight.IsShouldNotBeTarget())) enemyMonsterRight = null; + if (enemyMonsterRight != null && enemyMonsterRight.IsFacedown()) enemyMonsterRight = null; + + int place = -1; + if (enemyMonsterLeft != null && enemyMonsterRight == null) place = Zones.z5; + if (enemyMonsterLeft == null && enemyMonsterRight != null) place = Zones.z6; + if (enemyMonsterLeft != null && enemyMonsterRight != null) + { + if (enemyMonsterLeft.IsFloodgate() && !enemyMonsterRight.IsFloodgate()) place = Zones.z5; + else if (!enemyMonsterLeft.IsFloodgate() && enemyMonsterRight.IsFloodgate()) place = Zones.z6; + else + { + if (enemyMonsterLeft.GetDefensePower() >= enemyMonsterRight.GetDefensePower()) place = Zones.z5; + else place = Zones.z6; + } + } + if (place >= 0) + { + AI.SelectMaterials(Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link | CardType.Token) && card.Level == 1) + .OrderBy(card => card.Attack).ToList()); + AI.SelectPlace(place); + return true; + } + + // summon for little knight + if (Bot.HasInExtra(CardId.SPLittleKnight) && Bot.GetMonsters().Count(card => card.IsFaceup()) >= 2 + && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link))) + { + if (GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0) + { + AI.SelectMaterials(Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link | CardType.Token) && card.Level == 1) + .OrderBy(card => card.Attack).ToList()); + return true; + } + } + return false; + } + public bool RelinquishedAnimaActivate() + { + if (CheckWhetherNegated()) return false; + activatedCardIdList.Add(Card.Id); + Dictionary placeList = new Dictionary{ {1, 6}, {3, 5}, {5, 3}, {6, 1} }; + foreach (KeyValuePair placePair in placeList) + { + if (Bot.MonsterZone[placePair.Key] == Card && Enemy.MonsterZone[placePair.Value] != null) + { + currentDestroyCardList.Add(Enemy.MonsterZone[placePair.Value]); + break; + } + } + return true; + } + + public bool MonsterRepos() + { + int selfAttack = Card.Attack + 1; + + if (selfAttack <= 1) + return !Card.IsDefense(); + + int bestAttack = 0; + foreach (ClientCard card in Bot.GetMonsters()) + { + int attack = card.Attack; + if (attack >= bestAttack) + { + bestAttack = attack; + } + } + + bool enemyBetter = Util.IsAllEnemyBetterThanValue(bestAttack, true); + + if (Card.IsAttack() && enemyBetter) + return true; + if (Card.IsDefense() && !enemyBetter) + return true; + return false; + } + + public bool ReposForLabrynth() + { + if (!activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth)) + return Card.IsFacedown(); + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + if (Card.IsCode(CardId.BigWelcomeLabrynth) && Bot.HasInSpellZone(Card.Id)) return false; + if (Card.IsCode(CardId.TransactionRollback) && !Bot.HasInSpellZone(CardId.TransactionRollback)) + { + // check enemy grave trap + bool haveCopyTrap = false; + if (Enemy.Graveyard.Any(card => card.IsCode( + CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth, _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon, + _CardId.CompulsoryEvacuationDevice, _CardId.BreakthroughSkill + ))) + { + haveCopyTrap = true; + } + + if (!haveCopyTrap && !Bot.HasInHand(CardId.UnchainedSoulOfSharvara)) return false; + } + if (Card.IsCode(CardId.EscapeOfTheUnchained) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained))) return false; + + // select place + if (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) + { + List avoidList = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoidList.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } else + { + SelectSTPlace(Card, false, avoidList); + return true; + } + } else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + public bool SpellSetForCooClockCheck() + { + // set to destroy for Sharvara + if (Card.IsCode(CardId.PotOfExtravagance, CardId.TransactionRollback, CardId.WelcomeLabrynth) && Bot.HasInHand(CardId.UnchainedSoulOfSharvara) + && !activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara)) + { + SelectSTPlace(Card, false); + return true; + } + // set to activate by cooclock + bool haveLabrynth = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)); + if (!cooclockAffected || (haveLabrynth && Bot.HasInHand(CardId.LabrynthCooclock) && !activatedCardIdList.Contains(CardId.LabrynthCooclock))) return false; + if (!Card.IsCode(CardId.BigWelcomeLabrynth, CardId.WelcomeLabrynth, _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier)) return false; + if (haveLabrynth) + { + SelectSTPlace(Card, true); + return true; + } + if (!Card.IsCode(CardId.BigWelcomeLabrynth, CardId.WelcomeLabrynth)) return false; + if (!summoned && Bot.Hand.Any(card => card.IsMonster() && card.Level <= 4 && card.HasSetcode(SetcodeLabrynth))) + { + SelectSTPlace(Card, true); + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 5ff3b3b6e..bcd81b5ba 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -125,6 +125,7 @@ protected class _CardId public const int VaylantzWorld_ShinraBansho = 49568943; public const int VaylantzWorld_KonigWissen = 75952542; public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int LightningStorm = 14532163; public const int BelialMarquisOfDarkness = 33655493; public const int ChirubiméPrincessOfAutumnLeaves = 87294988; @@ -223,6 +224,8 @@ protected DefaultExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, _CardId.SantaClaws); } + protected int lightningStormOption = -1; + /// /// Defined: /// if monster with code as KEY, other monsters with rules as VALUE won't be targeted for attack. @@ -395,6 +398,9 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender } } + if (attacker.EquipCards.Any(equip => equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled())) + attacker.RealPower = defender.RealPower + 100; + if (!defender.IsDisabled()) { Func, bool> defenderRule = (card, monsterList) => false; @@ -430,6 +436,9 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender if (Enemy.HasInSpellZone(_CardId.CrusadiaVanguard, true) && Enemy.GetMonsters().Any(card => card.HasSetcode(_Setcode.Crusadia) && card.HasType(CardType.Link)) && !defender.HasType(CardType.Link)) return false; + + if (defender.IsCode(_CardId.RescueACEHydrant) && !defender.IsDisabled() && Enemy.GetMonsters().Any(monster => monster.HasSetcode(_Setcode.RescueACE) && !monster.IsCode(_CardId.RescueACEHydrant))) + return false; if (Enemy.HasInSpellZone(_CardId.SilenforcingBarrier, true) && Enemy.HasInMonstersZone(_CardId.NovoxTheSilenforcerDisciple, faceUp: true) && !defender.HasType(CardType.Ritual)) return false; @@ -1025,6 +1034,8 @@ protected bool DefaultOnBecomeTarget() if (Util.ChainContainsCard(destroyAllList)) return true; if (Enemy.HasInSpellZone(destroyAllOpponentSpellList, true) && Card.Location == CardLocation.SpellZone) return true; + if (lightningStormOption == 0 && Card.Location == CardLocation.MonsterZone && Card.IsAttack()) return true; + if (lightningStormOption == 1 && Card.Location == CardLocation.SpellZone) return true; // TODO: ChainContainsCard(id, player) return false; } @@ -1120,12 +1131,11 @@ protected bool DefaultDimensionalBarrier() bool nontuner = false; foreach (ClientCard monster in monsters) { - if (monster.HasType(CardType.Tuner)) - tuner = true; - else if (!monster.HasType(CardType.Xyz) && !monster.HasType(CardType.Link)) + if (!monster.HasType(CardType.Xyz | CardType.Link)) { - nontuner = true; - levels[monster.Level] = levels[monster.Level] + 1; + if (monster.HasType(CardType.Tuner)) tuner = true; + else nontuner = true; + if (!monster.HasType(CardType.Token)) levels[monster.Level] = levels[monster.Level] + 1; } if (monster.IsOneForXyz()) @@ -1156,7 +1166,8 @@ protected bool DefaultDimensionalBarrier() } } ClientCard lastchaincard = Util.GetLastChainCard(); - if (Duel.LastChainPlayer == 1 && lastchaincard != null && !lastchaincard.IsDisabled()) + if (Duel.LastChainPlayer == 1 && lastchaincard != null && !lastchaincard.IsDisabled() + && (lastchaincard.HasType(CardType.Spell | CardType.Trap) || lastchaincard.Location == CardLocation.MonsterZone)) { if (lastchaincard.HasType(CardType.Ritual)) { @@ -1454,5 +1465,21 @@ protected bool DefaultVaylantzWorld_KonigWissen() return false; } + + public override void OnReceivingAnnouce(int player, int data) + { + if (player == 1 && data == Util.GetStringId(_CardId.LightningStorm, 0) || data == Util.GetStringId(_CardId.LightningStorm, 1)) + { + lightningStormOption = data - Util.GetStringId(_CardId.LightningStorm, 0); + } + + base.OnReceivingAnnouce(player, data); + } + + public override void OnChainEnd() + { + lightningStormOption = -1; + base.OnChainEnd(); + } } } diff --git a/Game/AI/Enums/Floodgate.cs b/Game/AI/Enums/Floodgate.cs index bf2bd36ac..f3f192b8c 100644 --- a/Game/AI/Enums/Floodgate.cs +++ b/Game/AI/Enums/Floodgate.cs @@ -71,6 +71,7 @@ public enum Floodgate ElShaddollConstruct = 20366274, ElShaddollGrysra = 48424886, ElShaddollWinda = 94977269, + HotRedDragonArchfiendAbyss = 9753964, UltimateConductorTytanno = 18940556, OvertexCoatls = 41782653, FirePrison = 269510, diff --git a/Game/AI/Enums/FusionSpell.cs b/Game/AI/Enums/FusionSpell.cs index f157cc3a2..199558ab6 100644 --- a/Game/AI/Enums/FusionSpell.cs +++ b/Game/AI/Enums/FusionSpell.cs @@ -67,6 +67,7 @@ public enum FusionSpell FaceCardFusion = 29062925, MyutantFusion = 42577802, MyutantCry = 31855260, + FallenOfAlbaz = 68468459, GreaterPolymerization = 7614732, UltimateFusion = 71143015, BrandedFusion = 44362883, diff --git a/Game/AI/Executor.cs b/Game/AI/Executor.cs index b1284a9cb..7ef678d60 100644 --- a/Game/AI/Executor.cs +++ b/Game/AI/Executor.cs @@ -104,6 +104,12 @@ public virtual void OnChainEnd() { // For overriding } + + public virtual void OnReceivingAnnouce(int player, int data) + { + // For overriding + } + public virtual void OnNewPhase() { // Some AI need do something on new phase @@ -118,7 +124,7 @@ public virtual void OnDraw(int player) // Some AI need do something on draw } - public virtual void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) + public virtual void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) { // Some AI need do something on card's moving } diff --git a/Game/AI/HintMsg.cs b/Game/AI/HintMsg.cs index 65634b425..2f868d0ce 100644 --- a/Game/AI/HintMsg.cs +++ b/Game/AI/HintMsg.cs @@ -57,6 +57,11 @@ public static class HintMsg ToZone = 571, Counter = 572, Disable = 573, - OperateCard = 574; + OperateCard = 574, + RITUAL = 1057, + FUSION = 1056, + SYNCHRO = 1063, + XYZ = 1073, + PENDULUM = 1074; } } \ No newline at end of file diff --git a/Game/GameAI.cs b/Game/GameAI.cs index 5ab235bcc..77136319d 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -119,9 +119,9 @@ public void OnNewPhase() Executor.OnNewPhase(); } - public void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) + public void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) { - Executor.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); + Executor.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); } /// @@ -157,6 +157,16 @@ public void OnChainEnd() Executor.OnChainEnd(); } + /// + /// Called when receiving annouce + /// + /// Player who announce. + /// Annouced info. + public void OnReceivingAnnouce(int player, int data) + { + Executor.OnReceivingAnnouce(player, data); + } + /// /// Called when the AI has to do something during the battle phase. /// diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 9bf8eb057..ab24360dc 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -347,6 +347,10 @@ private void OnHint(BinaryReader packet) { _select_hint = data; } + if (type == 4) // HINT_OPSELECTED + { + _ai.OnReceivingAnnouce(player, data); + } } private void OnStart(BinaryReader packet) @@ -354,6 +358,11 @@ private void OnStart(BinaryReader packet) int type = packet.ReadByte(); _duel.IsFirst = (type & 0xF) == 0; _duel.Turn = 0; + _duel.LastChainLocation = 0; + _duel.LastChainPlayer = -1; + _duel.LastChainTargets.Clear(); + _duel.LastSummonedCards.Clear(); + _duel.LastSummonPlayer = -1; int duel_rule = packet.ReadByte(); _ai.Duel.IsNewRule = (duel_rule >= 4); _ai.Duel.IsNewRule2020 = (duel_rule >= 5); @@ -653,7 +662,7 @@ private void OnMove(BinaryReader packet) } } - _ai.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); + _ai.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); } private void OnSwap(BinaryReader packet) diff --git a/WindBot.csproj b/WindBot.csproj index f2af022fd..61125d4b8 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -103,6 +103,7 @@ + From 4769ca266dffd2eacbe5feb2f9f4733858c4dc5f Mon Sep 17 00:00:00 2001 From: Mercury233 Date: Thu, 11 Jan 2024 20:09:09 +0800 Subject: [PATCH 015/110] fix ChaosAngelSpSummonWith2Monster (#182) --- Game/AI/Decks/LabrynthExecutor.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Game/AI/Decks/LabrynthExecutor.cs b/Game/AI/Decks/LabrynthExecutor.cs index 9a20f7479..5af5c9f60 100644 --- a/Game/AI/Decks/LabrynthExecutor.cs +++ b/Game/AI/Decks/LabrynthExecutor.cs @@ -3382,10 +3382,11 @@ public bool ChaosAngelSpSummonWith2Monster() level6MonsterList.Sort(CompareUsableAttack); level8MonsterList.Sort(CompareUsableAttack); bool checkFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); - if (Util.GetBestPower(Bot, true) <= Util.GetBestPower(Enemy)) + ClientCard BestEnemyMonster = Util.GetBestEnemyMonster(); + if (BestEnemyMonster != null && Util.GetBestPower(Bot, true) <= Util.GetBestPower(Enemy)) { checkFlag |= Util.GetBestPower(Enemy) <= 3500; - checkFlag |= !Util.GetBestEnemyMonster().IsShouldNotBeTarget() && !Util.GetBestEnemyMonster().IsShouldNotBeMonsterTarget(); + checkFlag |= !BestEnemyMonster.IsShouldNotBeTarget() && !BestEnemyMonster.IsShouldNotBeMonsterTarget(); } // 4+6 if (level4MonsterList.Count() > 0 && level6MonsterList.Count() > 0) From 52f561fcdc8c0a969c0481b21e7f128156c484e1 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Mon, 15 Jan 2024 11:06:20 +0800 Subject: [PATCH 016/110] Fix null pointer (#183) --- Game/AI/Decks/LabrynthExecutor.cs | 59 ++++++++++++++++--------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/Game/AI/Decks/LabrynthExecutor.cs b/Game/AI/Decks/LabrynthExecutor.cs index 5af5c9f60..2286244ee 100644 --- a/Game/AI/Decks/LabrynthExecutor.cs +++ b/Game/AI/Decks/LabrynthExecutor.cs @@ -1713,39 +1713,42 @@ public override void OnMove(ClientCard card, int previousControler, int previous enemySetThisTurn.Add(card); } } - if (previousControler == 0) - { - if (previousLocation == (int)CardLocation.MonsterZone && currentLocation != (int)CardLocation.MonsterZone) - { - if (summonThisTurn.Contains(card)) summonThisTurn.Remove(card); - if (summonInChainList.Contains(card)) summonInChainList.Remove(card); - } - if (previousLocation == (int)CardLocation.SpellZone && currentLocation != (int)CardLocation.SpellZone) - { - if (setTrapThisTurn.Contains(card)) setTrapThisTurn.Remove(card); - } - } - if (currentControler == 0) + if (card != null) { - ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); - if (currentLocation == (int)CardLocation.SpellZone && (currentSolvingChain == null || !currentSolvingChain.IsCode(CardId.AriasTheLabrynthButler)) - && card != null && (card.HasType(CardType.Trap) || card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)) - ) + if (previousControler == 0) { - Logger.DebugWriteLine("[setTrapThisTurn]set " + card.Name ?? "UnknowCard"); - setTrapThisTurn.Add(card); - } - if (currentLocation == (int)CardLocation.MonsterZone) - { - summonThisTurn.Add(card); - if (currentSolvingChain != null) summonInChainList.Add(card); + if (previousLocation == (int)CardLocation.MonsterZone && currentLocation != (int)CardLocation.MonsterZone) + { + if (summonThisTurn.Contains(card)) summonThisTurn.Remove(card); + if (summonInChainList.Contains(card)) summonInChainList.Remove(card); + } + if (previousLocation == (int)CardLocation.SpellZone && currentLocation != (int)CardLocation.SpellZone) + { + if (setTrapThisTurn.Contains(card)) setTrapThisTurn.Remove(card); + } } - if (previousLocation == (int)CardLocation.Grave && currentLocation == (int)CardLocation.Removed) + if (currentControler == 0) { - if (currentSolvingChain != null && currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.CalledByTheGrave)) + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentLocation == (int)CardLocation.SpellZone && (currentSolvingChain == null || !currentSolvingChain.IsCode(CardId.AriasTheLabrynthButler)) + && (card.HasType(CardType.Trap) || card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)) + ) + { + Logger.DebugWriteLine("[setTrapThisTurn]set " + card.Name ?? "UnknowCard"); + setTrapThisTurn.Add(card); + } + if (currentLocation == (int)CardLocation.MonsterZone) { - Logger.DebugWriteLine("*** " + (card.Name ?? "UnknowCard") + " is banished by CallByTheGrave"); - calledbytheGraveCount[card.Id] = 2; + summonThisTurn.Add(card); + if (currentSolvingChain != null) summonInChainList.Add(card); + } + if (previousLocation == (int)CardLocation.Grave && currentLocation == (int)CardLocation.Removed) + { + if (currentSolvingChain != null && currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.CalledByTheGrave)) + { + Logger.DebugWriteLine("*** " + (card.Name ?? "UnknowCard") + " is banished by CallByTheGrave"); + calledbytheGraveCount[card.Id] = 2; + } } } } From 68276aa07b1eb7ab96fc5347b5a30e16e4fcbd27 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Mon, 15 Jan 2024 11:08:36 +0800 Subject: [PATCH 017/110] fix ChaosAngelSpSummonWith3Monster --- Game/AI/Decks/LabrynthExecutor.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Game/AI/Decks/LabrynthExecutor.cs b/Game/AI/Decks/LabrynthExecutor.cs index 2286244ee..96e1e9f52 100644 --- a/Game/AI/Decks/LabrynthExecutor.cs +++ b/Game/AI/Decks/LabrynthExecutor.cs @@ -3447,10 +3447,11 @@ public bool ChaosAngelSpSummonWith3Monster() level2MonsterList.Sort(CompareUsableAttack); level4MonsterList.Sort(CompareUsableAttack); bool checkFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); - if (Util.GetBestPower(Bot, true) <= Util.GetBestPower(Enemy)) + ClientCard BestEnemyMonster = Util.GetBestEnemyMonster(); + if (BestEnemyMonster != null && Util.GetBestPower(Bot, true) <= Util.GetBestPower(Enemy)) { checkFlag |= Util.GetBestPower(Enemy) <= 3500; - checkFlag |= !Util.GetBestEnemyMonster().IsShouldNotBeTarget() && !Util.GetBestEnemyMonster().IsShouldNotBeMonsterTarget(); + checkFlag |= !BestEnemyMonster.IsShouldNotBeTarget() && !BestEnemyMonster.IsShouldNotBeMonsterTarget(); } // 2+4+4 if (level2MonsterList.Count() >= 1 && level4MonsterList.Count() >= 2) From 06be1a9d12c8c50d75d24528e22634590064bda9 Mon Sep 17 00:00:00 2001 From: jwyxym <130654339+jwyxym@users.noreply.github.com> Date: Thu, 15 Feb 2024 20:53:53 +0800 Subject: [PATCH 018/110] a bot which can play the deck named superheavysamurai (#184) --- Decks/AI_SuperheavySamurai.ydk | 59 + Dialogs/superheavysamurai.zh-CN.json | 45 + Game/AI/Decks/SuperheavySamuraiExecutor.cs | 1134 ++++++++++++++++++++ WindBot.csproj | 5 +- 4 files changed, 1241 insertions(+), 2 deletions(-) create mode 100644 Decks/AI_SuperheavySamurai.ydk create mode 100644 Dialogs/superheavysamurai.zh-CN.json create mode 100644 Game/AI/Decks/SuperheavySamuraiExecutor.cs diff --git a/Decks/AI_SuperheavySamurai.ydk b/Decks/AI_SuperheavySamurai.ydk new file mode 100644 index 000000000..3e9a78415 --- /dev/null +++ b/Decks/AI_SuperheavySamurai.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +83334932 +83334932 +83334932 +82112494 +82112494 +82112494 +19510093 +19510093 +34496660 +34496660 +34496660 +90361010 +90361010 +90361010 +78391364 +78391364 +56727340 +56727340 +14624296 +95500396 +10604644 +23434538 +23434538 +23434538 +14558127 +14558127 +14558127 +49036338 +38814750 +38814750 +97268402 +97268402 +73642296 +73642296 +59438930 +59438930 +59438930 +94145021 +94145021 +94145021 +#extra +64193046 +84815190 +30983281 +44508094 +27548199 +76471944 +74586817 +28912357 +38342335 +27381364 +22423493 +65741786 +33918636 +33918636 +33918636 +!side diff --git a/Dialogs/superheavysamurai.zh-CN.json b/Dialogs/superheavysamurai.zh-CN.json new file mode 100644 index 000000000..8cc7d4f13 --- /dev/null +++ b/Dialogs/superheavysamurai.zh-CN.json @@ -0,0 +1,45 @@ +{ + "welcome": [ + "是宵夜哒哟!", + "什么灵摆卡组都会玩的哟!", + "什么?你说超重不是灵摆卡组?" + ], + "deckerror": [ + "{0}的数量不对!快去改成无禁限模式!。" + ], + "duelstart": [ + "给你展现一下超重的魅力!" + ], + "newturn": [ + "抽卡!弁庆你别上手救我了!", + "抽卡!P身子你别上手救我了!" + ], + "endturn": [ + "哼哼,到你的回合了!", + "喜不喜欢我的展开呢?" + ], + "directattack": [ + "我用{0}直接攻击!" + ], + "attack": [ + "我用{0}攻击{1}!" + ], + "ondirectattack": [ + "不许打!不许打呀!", + "呜哇!要被打倒惹~" + ], + "facedownmonstername": "怪兽", + "activate": [ + "呼呼呼,{0}的效果太厉害了!", + "呼呼呼,我使用{0}的效果。" + ], + "summon": [ + "呼呼呼,我召唤{0}!" + ], + "setmonster": [ + "呼呼呼,我盖放了一只怪兽。" + ], + "chaining": [ + "此刻!{0}的效果发动!" + ] +} diff --git a/Game/AI/Decks/SuperheavySamuraiExecutor.cs b/Game/AI/Decks/SuperheavySamuraiExecutor.cs new file mode 100644 index 000000000..45ace6bf8 --- /dev/null +++ b/Game/AI/Decks/SuperheavySamuraiExecutor.cs @@ -0,0 +1,1134 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +namespace WindBot.Game.AI.Decks +{ + [Deck("SuperheavySamurai", "AI_SuperheavySamurai")] + public class SuperheavySamuraiExecutor : DefaultExecutor + { + public class CardId + { + public const int Benkei = 19510093;//弁庆 + public const int Wagon = 34496660;//大八 + public const int Soulpiercer = 90361010;//岩融 + public const int Wakaushi = 82112494;//牛若 + public const int Scales = 78391364;//天秤 + public const int Booster = 56727340;//地铠 + public const int Motorbike = 83334932;//摩托 + public const int Soulhorns = 14624296;//双角 + public const int Soulpeacemaker = 95500396;//仲裁 + + public const int Regulus = 10604644;//轩辕十四 + + public const int MaxxG = 23434538;//增殖的G + public const int JoyousSpring = 14558127;//灰流丽 + public const int PsyFrameDriver = 49036338;//PSY骨架驱动者 + public const int PsyFramegearGamma = 38814750;//PSY骨架装备·γ + public const int EffectVeiler = 97268402;//效果遮蒙者 + public const int HauntedMansion = 73642296;//屋敷童 + public const int SnowRabbit = 59438930;//幽鬼兔 + public const int LockBird = 94145021;//小丑与锁鸟 + + //extra + public const int Masurawo = 64193046;//益荒男 + public const int Fleur = 84815190;//鲜花女男爵 + public const int ASStardustDragon = 30983281;//加速同调星尘龙 + public const int StardustDragon = 30983281;//星尘龙 + public const int SavageDragon = 27548199;//狞猛龙 + public const int Sarutobi = 76471944;//猿飞 + public const int PSYFramelordOmega = 74586817;//PSY骨架王·Ω + public const int GearGigant = 28912357;//齿轮齿巨人 + public const int Unicorn = 38342335;//独角兽 + public const int Elf = 27381364;//卫星闪灵·淘气精灵 + public const int Genius = 22423493;//路径灵 + public const int IP = 65741786;//I:P伪装舞会莱娜 + public const int Scarecrow = 33918636;//案山子 + + } + + private bool normal_summon = false; + private bool p_summoned = false; + private bool p_summoning = false; + private bool activate_Motorbike = false;//摩托 + private bool activate_Wakaushi = false;//神童 + private bool activate_Scales = false;//天秤 + private bool activate_Wagon = false;//大巴 + private bool activate_Booster = false;//地铠 + private bool activate_Soulpeacemaker = false;//仲裁 + private bool activate_Benkei = false;//弁庆 + private bool need_Gear = false;//齿轮齿巨人 + //案山子 + private bool activate_Scarecrow=false; + private bool summon_Scarecrow=false; + private bool activate_Sarutobi = false;//猿飞 + private bool activate_Genius = false;//路径灵 + //淘气精灵 + private bool activate_Elf = false; + private bool summon_Elf = false; + //手坑 + private bool activate_MaxxG = false;//增殖的G + private bool activate_PSY = false;//PSY + private bool activate_LockBird = false;//小丑与锁鸟 + private bool to_deck = false; + + public SuperheavySamuraiExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + AddExecutor(ExecutorType.Activate, CardId.PSYFramelordOmega); + AddExecutor(ExecutorType.Activate, CardId.IP,IPFunction); + AddExecutor(ExecutorType.Activate, CardId.Sarutobi,SarutobiFunction); + AddExecutor(ExecutorType.Activate, CardId.Unicorn,UnicornFunction); + AddExecutor(ExecutorType.Activate, CardId.MaxxG,MaxxCFunction); + AddExecutor(ExecutorType.Activate, CardId.JoyousSpring,DefaultAshBlossomAndJoyousSpring); + AddExecutor(ExecutorType.Activate, CardId.SnowRabbit,DefaultGhostOgreAndSnowRabbit); + AddExecutor(ExecutorType.Activate, CardId.EffectVeiler,DefaultBreakthroughSkill); + AddExecutor(ExecutorType.Activate, CardId.LockBird,LockBirdFunction); + AddExecutor(ExecutorType.Activate, CardId.PsyFramegearGamma,FunctionInHand); + AddExecutor(ExecutorType.Activate, CardId.HauntedMansion,FunctionInHand); + AddExecutor(ExecutorType.Activate, CardId.Masurawo,MasurawoFunction); + AddExecutor(ExecutorType.Activate, CardId.Genius,GeniusFunction); + + //Motorbike's Effect + AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); + + //Scales's Effect + AddExecutor(ExecutorType.SpSummon, CardId.Scales); + AddExecutor(ExecutorType.Activate, CardId.Scales,ScalesFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction2); + AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction2); + + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiFunction); + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiEffectFunction); + AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiEffectFunction); + + //Normal Summon & Effect + AddExecutor(ExecutorType.Summon, CardId.Soulpiercer,NormalSummonFunction); + AddExecutor(ExecutorType.Activate, CardId.Soulpiercer,SoulpiercerFunction); + + AddExecutor(ExecutorType.Summon, CardId.Wagon,NormalSummonFunction); + AddExecutor(ExecutorType.Activate, CardId.Wagon,WagonFunction); + AddExecutor(ExecutorType.Activate, CardId.Wagon,WagonFunction); + + AddExecutor(ExecutorType.Summon, CardId.Booster,BoosterNormalSummonFunction); + AddExecutor(ExecutorType.Summon, CardId.Scales,ScalesNormalSummonFunction); + + //boost & Gear + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + AddExecutor(ExecutorType.SpSummon, CardId.GearGigant,GearGigantXyzFunction); + AddExecutor(ExecutorType.Activate, CardId.GearGigant,GearGigantFunction); + + //equip Soulpiercer + AddExecutor(ExecutorType.Activate, CardId.Soulpiercer,SoulpiercerEquipFunction); + + //Link Scarecrow + AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction); + AddExecutor(ExecutorType.Activate, CardId.Scarecrow,ScarecrowFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction); + + //Effect After Synchron + AddExecutor(ExecutorType.Activate, CardId.SavageDragon,SavageDragonFunction); + AddExecutor(ExecutorType.Activate, CardId.ASStardustDragon,ASStardustDragonFunction); + + //Wakaushi's Effect After Synchron + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiReturnPFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction); + AddExecutor(ExecutorType.Activate, CardId.Fleur,FleurFunction); + + //equip Soulpeacemaker + AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker,SoulpeacemakerEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker,SoulpeacemakerFunction); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.Genius,GeniusLinkFunction); + + AddExecutor(ExecutorType.SpSummon, Psummon); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.Elf,ElfLinkFunction); + AddExecutor(ExecutorType.Activate, CardId.Elf,ElfFunction); + + AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); + + //Regulus's Effect + AddExecutor(ExecutorType.Activate, CardId.Regulus,RegulusFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.SavageDragon,SavageDragonSynchronFunction); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.IP,IPLinkFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.Masurawo,MasurawoSynchronFunction); + AddExecutor(ExecutorType.SpSummon, CardId.Sarutobi,DeSynchronFunction); + AddExecutor(ExecutorType.SpSummon, CardId.PSYFramelordOmega); + + //equip Soulhorns + AddExecutor(ExecutorType.Activate, CardId.Soulhorns,SoulhornsEquipFunction); + + //booster + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction2); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + + } + public override void OnNewTurn() + { + normal_summon = false; + p_summoned = false; + p_summoning = false; + activate_Motorbike = false; + activate_Wakaushi = false; + activate_Scales = false; + activate_Wagon = false; + activate_Booster = false; + activate_Soulpeacemaker = false; + activate_Benkei = false; + need_Gear = false; + activate_Scarecrow=false; + summon_Scarecrow=false; + activate_Elf = false; + summon_Elf = false; + activate_MaxxG = false; + activate_PSY = false; + activate_LockBird = false; + activate_Genius = false; + activate_Sarutobi = false; + to_deck = false; + } + public override bool OnSelectHand() + { + return true; + } + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + if (cardId == CardId.Scarecrow) + { + int a=(Zones.z6 & available); + int b=(Zones.z5 & available); + if (Bot.MonsterZone[2] != null && Bot.MonsterZone[2].Controller == 0 && !FinalCards(Bot.MonsterZone[2].Id)) + a = 0; + else if (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id)) + b = 0; + if (b > 0) return Zones.z5; + if (a > 0) return Zones.z6; + } + else if (cardId == CardId.Unicorn || cardId == CardId.Elf || cardId == CardId.IP) + { + if ((Zones.z6 & available) > 0) return Zones.z6; + if ((Zones.z5 & available) > 0) return Zones.z5; + } + else if (cardId == CardId.Genius) + { + int a=(Zones.z6 & available); + int b=(Zones.z5 & available); + if (Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) + a = 0; + else if (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id)) + b = 0; + if (a > 0) return Zones.z6; + if (b > 0) return Zones.z5; + } + else if (cardId == CardId.Regulus || cardId == CardId.GearGigant) + { + if ((Zones.z3 & available) > 0) return Zones.z3; + } + else + { + if ((Zones.z1 & available) > 0) return Zones.z1; + if ((Zones.z4 & available) > 0) return Zones.z4; + if ((Zones.z2 & available) > 0) return Zones.z2; + if ((Zones.z3 & available) > 0) return Zones.z3; + if ((Zones.z0 & available) > 0) return Zones.z0; + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (AI.HaveSelectedCards()) return null; + if (p_summoning || ((Card == Bot.SpellZone[0] || Card == Bot.SpellZone[4]) && hint == HintMsg.SpSummon && + Card.HasType(CardType.Pendulum))) + { + List result = new List(); + List scards = cards.Where(card => card != null && card.HasSetcode(0x9a) && card.Level == 4).ToList(); + if (scards.Count <2) scards = cards.Where(card => card != null && card.HasSetcode(0x9a)).ToList(); + p_summoning = false; + if (scards.Count > 0) return Util.CheckSelectCount(result, scards, 1, 1); + else if (min == 0) return result; // empty + } + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + private List GetZoneCards(CardLocation loc, ClientField player) + { + List res = new List(); + List temp = new List(); + if ((loc & CardLocation.Hand) > 0) { temp = player.Hand.Where(card => card != null).ToList(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.MonsterZone) > 0) { temp = player.GetMonsters(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.SpellZone) > 0) { temp = player.GetSpells(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.Grave) > 0) { temp = player.Graveyard.Where(card => card != null).ToList(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.Removed) > 0) { temp = player.Banished.Where(card => card != null).ToList(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.Extra) > 0) { temp = player.ExtraDeck.Where(card => card != null).ToList(); if (temp.Count() > 0) res.AddRange(temp); } + return res; + } + private bool FinalCards(int cname) + { + int[] cardsname = new[] {CardId.Masurawo,CardId.Fleur,CardId.SavageDragon,CardId.Sarutobi,CardId.Regulus,CardId.IP}; + foreach(var cardname in cardsname) + { + if (cname == cardname) return true; + } + return false; + } + private bool TurnerCards(int cname) + { + int[] cardsname =new[] {CardId.PsyFramegearGamma,CardId.Wakaushi,CardId.Motorbike}; + foreach(var cardname in cardsname) + { + if (cname == cardname) return true; + } + return false; + } + private bool Psummon() + { + List cards = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.HasSetcode(0x9a) && card.Level > 1 && card.Level < 8).ToList(); + if (cards.Count > 0 && Card.Location == CardLocation.SpellZone) + { + p_summoning = true; + p_summoned = true; + return true; + } + return false; + } + private bool MaxxCFunction() + { + activate_MaxxG = true; + return DefaultMaxxC() && !activate_LockBird; + } + private bool FunctionInHand() + { + return Duel.LastChainPlayer == 1; + } + private bool LockBirdFunction() + { + if (Duel.Player == 0) + { + return false; + } + activate_LockBird = true; + return !activate_MaxxG; + } + private bool MotorbikeFunction() + { + if (Card.Location == CardLocation.Hand) + { + int targetid = -1; + if (!(Bot.HasInHand(CardId.Wakaushi)||Bot.HasInMonstersZone(CardId.Wakaushi)||Bot.HasInSpellZone(CardId.Wakaushi))&&!activate_Wakaushi) + { + targetid = CardId.Wakaushi; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker && !normal_summon) + { + targetid = CardId.Soulpeacemaker; + } + else + { + targetid = CardId.Soulpiercer; + } + if (targetid > 0) AI.SelectCard(targetid); + activate_Motorbike = true; + return true; + } + else if (Card.Location == CardLocation.MonsterZone && activate_Elf) + { + AI.SelectCard(Card); + activate_Elf = false; + return true; + } + return false; + } + private bool BoosterNormalSummonFunction() + { + List cards = Bot.Hand.GetMonsters().Where(card => card != null && card.Id == CardId.Booster).ToList(); + return (NormalSummonFunction() && !activate_Booster && cards.Count >= 2); + } + private bool ScalesNormalSummonFunction() + { + return (NormalSummonFunction() && (Bot.HasInGraveyard(new[] { + CardId.Soulpiercer, + CardId.Motorbike, + CardId.Wakaushi, + CardId.Wagon, + CardId.Booster, + }) || (Bot.HasInHand(CardId.Booster) && !activate_Booster))); + } + private bool NormalSummonFunction() + { + normal_summon = true; + return DefaultMonsterSummon(); + } + private bool ScalesFunction() + { + AI.SelectCard(new[] { + CardId.Soulpiercer, + CardId.Motorbike, + CardId.Wakaushi, + CardId.Wagon, + CardId.Booster, + }); + activate_Scales = true; + return true; + } + private bool WagonFunction() + { + if (ActivateDescription == Util.GetStringId(CardId.Wagon, 0)) + return Card.IsAttack(); + if (ActivateDescription == Util.GetStringId(CardId.Wagon, 1)) + { + int targetid = -1; + if (!(Bot.HasInHand(CardId.Soulpiercer)||Bot.HasInMonstersZone(CardId.Soulpiercer))) + { + targetid = CardId.Soulpiercer; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker) + { + targetid = CardId.Soulpeacemaker; + } + else if (!Bot.HasInHand(CardId.Booster) && !activate_Booster) + { + targetid = CardId.Booster; + } + if (targetid > 0) AI.SelectCard(targetid); + activate_Wagon = true; + return true; + } + else + { + return true; + } + } + private bool SoulpiercerFunction() + { + if (Card.Location == CardLocation.Grave) + { + int CardCount = GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.HasSetcode(0x9a) && card.Level >= 2 && card.Level <= 7); + int targetid = -1; + if (!Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) + { + targetid = CardId.Motorbike; + } + else if (!(Bot.HasInHand(CardId.Wakaushi) || Bot.HasInMonstersZone(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) + { + targetid = CardId.Wakaushi; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker) + { + targetid = CardId.Soulpeacemaker; + } + else if (!Bot.HasInHand(CardId.Scales) && !activate_Scales && (!normal_summon || !p_summoned) && (activate_Soulpeacemaker || (!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker)))) + { + targetid = CardId.Scales; + } + else if (!Bot.HasInHand(CardId.Wagon) && !activate_Wagon) + { + targetid = CardId.Wagon; + } + else if (CardCount < 2 && !p_summoned) + { + targetid = CardId.Wakaushi; + } + else if (!Bot.HasInHand(CardId.Booster) && !activate_Booster) + { + targetid = CardId.Booster; + } + else if (!Bot.HasInHand(CardId.Soulhorns) && !Bot.HasInSpellZone(CardId.Soulhorns) && (Bot.HasInMonstersZone(CardId.Sarutobi) || Bot.HasInMonstersZone(CardId.Masurawo))) + { + targetid = CardId.Soulhorns; + } + else {targetid = CardId.Wakaushi;} + if (targetid > 0) AI.SelectCard(targetid); + return true; + } + return false; + } + private bool WakaushiFunction() + { + if (Card.Location != CardLocation.Hand||Bot.HasInMonstersZone(CardId.Wakaushi)) + return false; + ClientCard l = Util.GetPZone(0, 0); + ClientCard r = Util.GetPZone(0, 1); + if (l == null && r == null) + return true; + if (l == null && r.RScale != Card.LScale) + return true; + if (r == null && l.LScale != Card.RScale) + return true; + return false; + } + private bool WakaushiEffectFunction() + { + if (Card.Location == CardLocation.SpellZone) + { + AI.SelectCard(CardId.Benkei); + activate_Wakaushi = true; + return true; + } + return false; + } + private bool BenkeiEffectFunction() + { + if (Card.Location == CardLocation.SpellZone) + { + int targetid = -1; + if (!(Bot.HasInHand(CardId.Soulpiercer)||Bot.HasInMonstersZone(CardId.Soulpiercer))) + { + targetid = CardId.Soulpiercer; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker) + { + targetid = CardId.Soulpeacemaker; + } + else if (!Bot.HasInHand(CardId.Booster) && !activate_Booster) + { + targetid = CardId.Booster; + } + if (targetid > 0) AI.SelectCard(targetid); + activate_Benkei = true; + return true; + } + return false; + } + private bool WakaushiReturnPFunction() + { + if (Card.Location == CardLocation.Extra||Card.Location == CardLocation.Removed) + { + ClientCard l = Util.GetPZone(0, 0); + ClientCard r = Util.GetPZone(0, 1); + if (l == null && r == null) + return true; + if (l == null && r.RScale != Card.LScale) + return true; + if (r == null && l.LScale != Card.RScale) + return true; + } + return false; + } + private bool MasurawoFunction() + { + if (ActivateDescription == 96) + { + List cards = GetZoneCards(CardLocation.SpellZone, Bot).Where(card => card != null && card.HasSetcode(0x9a)).ToList(); + if (cards.Count > 0) + { + AI.SelectCard(cards); + return true; + } + else + { + cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.HasSetcode(0x9a) && !FinalCards(card.Id)).ToList(); + if (cards.Count > 0) + { + AI.SelectCard(cards); + return true; + } + } + } + return true; + + } + private bool MasurawoSynchronFunction() + { + bool chk = true; + if (Bot.HasInMonstersZone(CardId.ASStardustDragon) || Bot.HasInMonstersZone(CardId.Benkei)) + chk = false; + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,12,1,1,false,chk,null, + card => { return !FinalCards(card.Id); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + AI.SelectPosition(CardPosition.FaceUpDefence); + return true; + } + private bool FleurSynchronFunction() + { + bool chk = true; + if (Bot.HasInMonstersZone(CardId.Motorbike) && (Bot.HasInMonstersZone(CardId.ASStardustDragon) || Bot.HasInMonstersZone(CardId.Benkei))) + chk = false; + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,10,1,1,false,chk,null, + card => { return !FinalCards(card.Id); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + return true; + } + private bool FleurSynchronFunction2() + { + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,10,1,1,false,false,null, + card => { return !FinalCards(card.Id); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + return true; + } + private bool DeSynchronFunction() + { + AI.SelectPosition(CardPosition.FaceUpDefence); + return true; + } + private bool SavageDragonSynchronFunction() + { + if (Bot.HasInGraveyard(new[] { + CardId.Scarecrow, + CardId.IP, + CardId.Genius, + CardId.Unicorn, + CardId.Elf, + })) + { + return true; + } + return false; + } + private bool ASStardustDragonSynchronFunction() + { + if (Bot.HasInGraveyard(CardId.Motorbike) || Bot.HasInGraveyard(CardId.PsyFramegearGamma)) + { + return (Bot.HasInExtra(CardId.Fleur) || Bot.HasInExtra(CardId.Masurawo)); + } + return false; + } + private bool ASStardustDragonSynchronFunction2() + { + if (!activate_Scales || !activate_PSY) return false; + if (Bot.HasInGraveyard(CardId.Motorbike) || Bot.HasInGraveyard(CardId.PsyFramegearGamma)) + { + return (Bot.HasInExtra(CardId.Fleur) || Bot.HasInExtra(CardId.Masurawo)); + } + return false; + } + private bool SavageDragonFunction() + { + if (Duel.LastChainPlayer == 1) + return true; + AI.SelectCard(new[] + { + CardId.Unicorn, + CardId.Genius, + CardId.Elf, + CardId.IP, + CardId.Scarecrow + }); + return true; + } + private bool ASStardustDragonFunction() + { + if (Duel.LastChainPlayer == 1 && ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 0)) + { + return true; + } + else if (ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 0)) + { + + int targetid = -1; + if (Bot.HasInGraveyard(CardId.Motorbike)) + { + targetid = CardId.Motorbike; + } + else if (Bot.HasInGraveyard(CardId.PsyFramegearGamma)) + { + targetid = CardId.PsyFramegearGamma; + } + if (targetid > 0) AI.SelectCard(targetid); + if (targetid == CardId.Motorbike && !Bot.HasInExtra(CardId.Fleur) && Bot.HasInExtra(CardId.Masurawo)) + activate_Elf = true; + return true; + } + return false; + } + private bool ScarecrowLinkFunction() + { + List material = new List(); + List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); + if (cards.Count > 0 || summon_Scarecrow || activate_Scarecrow) return false; + int targetid = -1; + if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null) { + if (Bot.MonsterZone[0].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[0]); + else if (Bot.MonsterZone[2].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[2]); + else if (!FinalCards(Bot.MonsterZone[0].Id) && Bot.MonsterZone[0].HasSetcode(0x9a)) material.Add(Bot.MonsterZone[0]); + else if (!FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[2].HasSetcode(0x9a)) material.Add(Bot.MonsterZone[2]); + } + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + { + targetid = CardId.Soulpiercer; + } + else if (Bot.HasInMonstersZone(CardId.Wagon)) + { + targetid = CardId.Wagon; + } + if (material.Count > 0) AI.SelectMaterials(material); + else if (targetid > 0) AI.SelectMaterials(targetid); + summon_Scarecrow=true; + return (Bot.HasInGraveyard(new[] { + CardId.Soulpiercer, + CardId.Wakaushi, + CardId.Benkei, + CardId.Wagon, + })||Bot.HasInMonstersZone(new[] { + CardId.Soulpiercer, + CardId.Wagon, + CardId.Wakaushi, + })); + } + private bool DragonRavineField() + { + if (Card.Location == CardLocation.Hand) + return DefaultField(); + return false; + } + + private bool ScarecrowFunction() + { + int tributeId = -1; + if (Bot.HasInHand(CardId.PsyFrameDriver)) + {tributeId = CardId.PsyFrameDriver;} + else if (Bot.HasInHand(CardId.PsyFramegearGamma)) + {tributeId = CardId.PsyFramegearGamma;} + else if (Bot.HasInHand(CardId.Benkei)) + {tributeId = CardId.Benkei;} + else if (Bot.HasInHand(CardId.HauntedMansion)) + {tributeId = CardId.HauntedMansion;} + else if (Bot.HasInHand(CardId.EffectVeiler)) + {tributeId = CardId.EffectVeiler;} + else if (Bot.HasInHand(CardId.SnowRabbit)) + {tributeId = CardId.SnowRabbit;} + else if (Bot.HasInHand(CardId.JoyousSpring)) + {tributeId = CardId.JoyousSpring;} + else if (Bot.HasInHand(CardId.Booster)) + {tributeId = CardId.Booster;} + else if (Bot.HasInHand(CardId.Wagon)) + {tributeId = CardId.Wagon;} + else if (Bot.HasInHand(CardId.Scales)) + {tributeId = CardId.Scales;} + else if (Bot.HasInHand(CardId.LockBird)) + {tributeId = CardId.LockBird;} + else if (Bot.HasInHand(CardId.MaxxG)) + {tributeId = CardId.MaxxG;} + int needId = -1; + if (Bot.HasInGraveyard(CardId.Soulpiercer)) + { + if (Bot.HasInGraveyard(CardId.Scales) && !activate_Scales) + {needId = CardId.Scales;} + else + {needId = CardId.Soulpiercer;} + } + else if (Bot.HasInGraveyard(CardId.Masurawo)) + {needId = CardId.Masurawo;} + else if (Bot.HasInGraveyard(CardId.Sarutobi)) + {needId = CardId.Sarutobi;} + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + { + if (Bot.HasInGraveyard(CardId.Wakaushi)) + {needId = CardId.Wakaushi;} + if (Bot.HasInGraveyard(CardId.Motorbike)) + {needId = CardId.Motorbike;} + } + if (GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Grave, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Onfield, Bot).Count(card => card != null && card.Id == CardId.Scales) == 2 && GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales)>=1 && !activate_Scales) + { + tributeId = CardId.Scales; + needId = CardId.Scales; + } + AI.SelectCard(tributeId); + AI.SelectNextCard(needId); + activate_Scarecrow = true; + if (!summon_Scarecrow + && ((Bot.HasInHand(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) + && (Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) + && ((Bot.HasInHand(CardId.Soulpeacemaker) || Bot.HasInSpellZone(CardId.Soulpeacemaker)) && !activate_Soulpeacemaker) + && (Bot.HasInSpellZone(CardId.Benkei) && !activate_Benkei) + && (Bot.HasInHand(CardId.Soulpiercer) && !normal_summon) + && ((Bot.HasInGraveyard(CardId.Scales) || Bot.HasInHand(CardId.Soulpiercer)) && !activate_Scales && !normal_summon) + ) + { + activate_Scarecrow = false; + summon_Scarecrow = false; + } + else if (needId != CardId.Soulpiercer) + { + activate_Scarecrow = false; + summon_Scarecrow = false; + } + return true; + } + private bool UnicornFunction() + { + List Enemycards = GetZoneCards(CardLocation.Onfield,Enemy); + if (Bot.Hand.Count == 0 || Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0) + { + if (to_deck) to_deck = false; + return false; + } + int tributeId = -1; + if (Bot.HasInHand(CardId.PsyFrameDriver)) + {tributeId = CardId.PsyFrameDriver;} + else if (Bot.HasInHand(CardId.PsyFramegearGamma)) + {tributeId = CardId.PsyFramegearGamma;} + else if (Bot.HasInHand(CardId.Benkei)) + {tributeId = CardId.Benkei;} + else if (Bot.HasInHand(CardId.HauntedMansion)) + {tributeId = CardId.HauntedMansion;} + else if (Bot.HasInHand(CardId.EffectVeiler)) + {tributeId = CardId.EffectVeiler;} + else if (Bot.HasInHand(CardId.SnowRabbit)) + {tributeId = CardId.SnowRabbit;} + else if (Bot.HasInHand(CardId.JoyousSpring)) + {tributeId = CardId.JoyousSpring;} + else if (Bot.HasInHand(CardId.Booster)) + {tributeId = CardId.Booster;} + else if (Bot.HasInHand(CardId.Wagon)) + {tributeId = CardId.Wagon;} + else if (Bot.HasInHand(CardId.Scales)) + {tributeId = CardId.Scales;} + else if (Bot.HasInHand(CardId.LockBird)) + {tributeId = CardId.LockBird;} + else if (Bot.HasInHand(CardId.MaxxG)) + {tributeId = CardId.MaxxG;} + if (to_deck) to_deck = false; + AI.SelectCard(tributeId); + return true; + } + private bool BoosterEquipFunction() + { + if (Card.Location != CardLocation.Hand || activate_Booster) + return false; + List ChkCardsHand = Bot.Hand.GetMonsters().ToList(); + foreach (var card in ChkCardsHand) + { + if (card.Id == CardId.Motorbike && !activate_Motorbike) return false; + else if (card.Id == CardId.Soulpiercer) return false; + else if (card.Id == CardId.Soulpeacemaker && !activate_Soulpeacemaker) return false; + else if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; + else if (card.Id == CardId.Wagon && (!activate_Wagon || !normal_summon)) return false; + else if (card.Id == CardId.Benkei && !activate_Benkei) return false; + } + List ChkCardsSpell = GetZoneCards(CardLocation.SpellZone,Bot).Where(card => card != null && card.IsFaceup()).ToList(); + foreach (var card in ChkCardsSpell) + { + if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; + else if (card.Id == CardId.Soulpiercer) return false; + else if (card.Id == CardId.Soulpeacemaker && !activate_Soulpeacemaker) return false; + else if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; + else if (card.Id == CardId.Benkei && !activate_Benkei) return false; + } + List ChkCardsMonster = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Level == 4).ToList(); + if (ChkCardsMonster.Count == 0) return false; + foreach (var card in ChkCardsMonster) + { + if (card.Id == CardId.Soulpiercer) return false; + } + List ChkCardsGrave = GetZoneCards(CardLocation.Grave,Bot).ToList(); + foreach (var card in ChkCardsGrave) + { + if (card.Id == CardId.Soulpiercer && (Bot.HasInMonstersZone(CardId.Scarecrow) || Bot.HasInExtra(CardId.Scarecrow))) return false; + else if (card.Level == 4 && card.HasRace(CardRace.Machine) && Bot.HasInHand(CardId.Scales) && !normal_summon) return false; + } + if (Bot.HasInExtra(CardId.IP) && p_summoned) return true; + need_Gear = true; + return true; + } + private bool BoosterEquipFunction2() + { + if (Bot.HasInExtra(CardId.IP) && p_summoned) return true; + return false; + } + private bool BoosterFunction() + { + if (Card.Location == CardLocation.SpellZone) + { + activate_Booster = true; + return true; + } + return false; + } + private bool GearGigantXyzFunction() + { + if (need_Gear) + { + need_Gear = false; + return true; + } + return false; + } + private bool GearGigantFunction() + { + if (Card.Location == CardLocation.MonsterZone) + { + List ChkCards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.HasSetcode(0x9a)).ToList(); + int targetid = -1; + if (!Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) + { + targetid = CardId.Motorbike; + } + else if (!(Bot.HasInHand(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) + { + targetid = CardId.Wakaushi; + } + else if (!Bot.HasInHand(CardId.Soulpiercer) && (!normal_summon || (ChkCards.Count >= 1))) + { + targetid = CardId.Soulpiercer; + } + if (targetid > 0) AI.SelectCard(targetid); + return true; + } + return false; + } + private bool SoulpiercerEquipFunction() + { + if (Card.Location != CardLocation.Hand) + return false; + int tributeId = -1; + if (Bot.HasInMonstersZone(CardId.Wagon)) + {tributeId = CardId.Wagon;} + else if (Bot.HasInMonstersZone(CardId.Wakaushi)) + {tributeId = CardId.Wakaushi;} + AI.SelectCard(tributeId); + return Bot.HasInMonstersZone(new[] { + CardId.Wakaushi, + CardId.Wagon, + }); + } + private bool SoulpeacemakerEquipFunction() + { + if (Card.Location != CardLocation.Hand) + return false; + int tributeId = -1; + if (Bot.HasInMonstersZone(CardId.Scarecrow)) + {tributeId = CardId.Scarecrow;} + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + {tributeId = CardId.Soulpiercer;} + AI.SelectCard(tributeId); + return Bot.HasInMonstersZone(new[] { + CardId.Scarecrow, + CardId.Soulpiercer, + }); + } + private bool SoulhornsEquipFunction() + { + if (Card.Location != CardLocation.Hand) + return false; + int tributeId = -1; + if (Bot.HasInMonstersZone(CardId.Masurawo)) + {tributeId = CardId.Masurawo;} + else if (Bot.HasInMonstersZone(CardId.Sarutobi)) + {tributeId = CardId.Sarutobi;} + AI.SelectCard(tributeId); + return Bot.HasInMonstersZone(new[] { + CardId.Masurawo, + CardId.Sarutobi, + }); + } + private bool SoulpeacemakerFunction() + { + if (Card.Location == CardLocation.SpellZone) + { + int tributeId = -1; + if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + {tributeId = CardId.Wakaushi;} + else if (Bot.HasInGraveyard(CardId.Soulpiercer)||!activate_Scales) + {tributeId = CardId.Scales;} + else if (!Bot.HasInGraveyard(CardId.Soulpiercer)||activate_Scales) + {tributeId = CardId.Soulpiercer;} + AI.SelectCard(tributeId); + activate_Soulpeacemaker = true; + return true; + } + return false; + } + private bool GeniusLinkFunction() + { + if ((Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) && (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id))) + return false; + int CardCount = 0; + foreach (ClientCard card in Bot.Hand.GetMonsters()) + { + if (card.HasRace(CardRace.Machine) && (card.Level >= 2 && card.Level <= 7)) + {CardCount++;} + } + if (CardCount < 2 && !Bot.HasInMonstersZone(CardId.Soulpiercer)){return false;} + if (Bot.HasInHand(CardId.Regulus) || Bot.HasInGraveyard(CardId.Regulus) || Bot.HasInSpellZone(CardId.Regulus) || Bot.HasInMonstersZone(CardId.Regulus)) return false; + bool linkchk = false; + List materials = new List(); + if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[6].Id)) + { + materials.Add(Bot.MonsterZone[6]); + linkchk = true; + } + else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && Bot.MonsterZone[5].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[6].Id)) + { + materials.Add(Bot.MonsterZone[5]); + linkchk = true; + } + List cards = Bot.GetMonstersInMainZone().Where(card => card != null && card.IsFaceup() && card.HasRace(CardRace.Machine)).ToList(); + foreach (var card in cards) + { + if (card == null || FinalCards(card.Id)) continue; + else materials.Add(card); + } + if (materials.Count <=1) return false; + AI.SelectMaterials(materials); + return ((Bot.GetMonstersInExtraZone().Count == 0 || linkchk) && !p_summoned && !activate_Genius); + } + private bool GeniusFunction() + { + if (ActivateDescription == Util.GetStringId(CardId.Genius,1)) + { + AI.SelectCard(CardId.Regulus); + activate_Genius = true; + return true; + } + return false; + } + private bool ElfLinkFunction() + { + if (!Bot.HasInGraveyard(CardId.Motorbike)) return false; + List materials = new List(); + if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && !FinalCards(Bot.MonsterZone[6].Id)) + { + materials.Add(Bot.MonsterZone[6]); + } + else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && !FinalCards(Bot.MonsterZone[5].Id)) + { + materials.Add(Bot.MonsterZone[5]); + } + List TunrerCards = Bot.GetMonstersInMainZone().Where(card => card != null && card.IsFaceup() && TurnerCards(card.Id) && !FinalCards(card.Id)).ToList(); + List UnTunrercards = Bot.GetMonstersInMainZone().Where(card => card != null && card.IsFaceup() && !TurnerCards(card.Id) && !FinalCards(card.Id)).ToList(); + if (UnTunrercards.Count == 0) return false; + else if (TunrerCards.Count >= UnTunrercards.Count && UnTunrercards.Count > 0) + { + foreach (var card in TunrerCards) + { + if (card == null) continue; + else if (materials.Count(ccard =>ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); + } + } + else + { + foreach (var card in UnTunrercards) + { + if (card == null) continue; + else if (materials.Count(ccard =>ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); + } + } + if (materials.Count <=1) return false; + AI.SelectMaterials(materials); + summon_Elf = true; + return true; + } + private bool ElfFunction() + { + AI.SelectCard(CardId.Motorbike); + AI.SelectPosition(CardPosition.FaceUpDefence); + activate_Elf = true; + return Bot.HasInGraveyard(CardId.Motorbike); + } + private bool RegulusFunction() + { + if (Card.Location == CardLocation.Hand) + { + int tributeId = -1; + if (Bot.HasInGraveyard(CardId.Soulpiercer)) + {tributeId = CardId.Soulpiercer;} + else if (Bot.HasInGraveyard(CardId.Motorbike)) + {tributeId = CardId.Motorbike;} + AI.SelectCard(tributeId); + activate_Genius = true; + return true; + } + else if (Duel.LastChainPlayer == 1) + { + return true; + } + return false; + } + private bool FleurFunction() + { + if (ActivateDescription == Util.GetStringId(CardId.Fleur, 0)) + { + ClientCard card = Util.GetProblematicEnemyMonster(0, true); + if (card != null) + { + AI.SelectCard(card); + return true; + } + card = Util.GetBestEnemySpell(true); + if (card != null) + { + AI.SelectCard(card); + return true; + } + List cards = GetZoneCards(CardLocation.Onfield, Enemy); + cards = cards.Where(tcard => tcard != null && !tcard.IsShouldNotBeTarget()).ToList(); + if (cards.Count <= 0) return false; + AI.SelectCard(cards); + return true; + } + else if (ActivateDescription == Util.GetStringId(CardId.Fleur, 1)) + { + return Duel.LastChainPlayer == 1; + } + return false; + } + private bool IPLinkFunction() + { + List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Id != CardId.Scarecrow && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf)) && !FinalCards(card.Id)).ToList(); + if (cards.Count <=1) return false; + AI.SelectMaterials(cards); + return true; + } + private bool IPFunction() + { + if (Duel.LastChainPlayer == 0) return false; + if (Bot.HasInExtra(CardId.Unicorn)) + { + List material = new List(); + List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card != Card && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.IP && card.Id != CardId.Scarecrow).ToList(); + List Enemycards = GetZoneCards(CardLocation.MonsterZone,Enemy); + if (activate_Sarutobi) Enemycards = GetZoneCards(CardLocation.Onfield,Enemy); + if (Bot.Hand.Count == 0 || Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0 || cards.Count == 0) return false; + bool linkchk = false; + foreach (var card in cards) + { + if (card != null && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf))) + { + material.Add(card); + linkchk = true; + break; + } + } + AI.SelectCard(CardId.Unicorn); + material.Insert(0,Card); + AI.SelectMaterials(material); + if (!to_deck) to_deck = true; + return linkchk; + } + return false; + } + private bool SarutobiFunction() + { + List Enemycards = GetZoneCards(CardLocation.SpellZone,Enemy); + if (Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0 || to_deck) return false; + AI.SelectCard(Enemycards); + activate_Sarutobi = true; + return true; + } + } +} diff --git a/WindBot.csproj b/WindBot.csproj index 61125d4b8..5460336f8 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -1,4 +1,4 @@ - + @@ -108,6 +108,7 @@ + @@ -183,4 +184,4 @@ --> - \ No newline at end of file + From 8392e62e317fb6cdf400f73c4d3365506d2e287a Mon Sep 17 00:00:00 2001 From: mercury233 Date: Thu, 15 Feb 2024 20:54:23 +0800 Subject: [PATCH 019/110] fix CheckSelectCount --- Game/AI/AIUtil.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Game/AI/AIUtil.cs b/Game/AI/AIUtil.cs index 4a0718ce2..2ccbacc88 100644 --- a/Game/AI/AIUtil.cs +++ b/Game/AI/AIUtil.cs @@ -434,6 +434,15 @@ public IList CheckSelectCount(IList _selected, IList= max) break; } + if (selected.Count < min) + { +#if DEBUG + throw new Exception("Not enough cards to CheckSelectCount"); +#else + Logger.WriteErrorLine("Not enough cards to CheckSelectCount, using default"); + return null; +#endif + } } while (selected.Count > max) { From a75d41f00400e6fd51d7cb4f32c991db857f55e2 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Thu, 15 Feb 2024 20:55:13 +0800 Subject: [PATCH 020/110] update bots list --- BotWrapper/bot.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 8bea59a4c..a75c8104b 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -233,3 +233,8 @@ AI_LV3 SUPPORT_MASTER_RULE_2020 Name=神数不神 Deck=Zefra Dialog=Zefra.zh-CN 神数卡组。 AI_LV3 SUPPORT_MASTER_RULE_2020 + +!今晚有宵夜吗-超重武者 +Name=今晚有宵夜吗 Deck=SuperheavySamurai Dialog=superheavysamurai.zh-CN +超重武者卡组。 +AI_LV3 SUPPORT_MASTER_RULE_2020 From 82d8819ca6bbd250de29b056276039a855833251 Mon Sep 17 00:00:00 2001 From: jwyxym <130654339+jwyxym@users.noreply.github.com> Date: Thu, 28 Mar 2024 17:01:55 +0800 Subject: [PATCH 021/110] fix the bugs of SuperheavySamuraiExecutor (#185) --- Game/AI/Decks/SuperheavySamuraiExecutor.cs | 156 ++++++++++++++------- 1 file changed, 107 insertions(+), 49 deletions(-) diff --git a/Game/AI/Decks/SuperheavySamuraiExecutor.cs b/Game/AI/Decks/SuperheavySamuraiExecutor.cs index 45ace6bf8..4ef2f73a7 100644 --- a/Game/AI/Decks/SuperheavySamuraiExecutor.cs +++ b/Game/AI/Decks/SuperheavySamuraiExecutor.cs @@ -65,6 +65,7 @@ public class CardId //案山子 private bool activate_Scarecrow=false; private bool summon_Scarecrow=false; + private bool summon_Scarecrow2=true; private bool activate_Sarutobi = false;//猿飞 private bool activate_Genius = false;//路径灵 //淘气精灵 @@ -103,9 +104,11 @@ public SuperheavySamuraiExecutor(GameAI ai, Duel duel) //Synchron AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction2); AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction2); - + + //Pendulum AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiFunction); AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiEffectFunction); + AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiFunction); AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiEffectFunction); //Normal Summon & Effect @@ -131,6 +134,7 @@ public SuperheavySamuraiExecutor(GameAI ai, Duel duel) //Link Scarecrow AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction); AddExecutor(ExecutorType.Activate, CardId.Scarecrow,ScarecrowFunction); + AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction2); //Synchron AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction); @@ -161,15 +165,21 @@ public SuperheavySamuraiExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); - //Regulus's Effect - AddExecutor(ExecutorType.Activate, CardId.Regulus,RegulusFunction); - //Synchron AddExecutor(ExecutorType.SpSummon, CardId.SavageDragon,SavageDragonSynchronFunction); //Link AddExecutor(ExecutorType.SpSummon, CardId.IP,IPLinkFunction); + //Regulus's Effect + AddExecutor(ExecutorType.Activate, CardId.Regulus,RegulusFunction); + + //booster + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction2); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction3); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + //Synchron AddExecutor(ExecutorType.SpSummon, CardId.Masurawo,MasurawoSynchronFunction); AddExecutor(ExecutorType.SpSummon, CardId.Sarutobi,DeSynchronFunction); @@ -178,10 +188,6 @@ public SuperheavySamuraiExecutor(GameAI ai, Duel duel) //equip Soulhorns AddExecutor(ExecutorType.Activate, CardId.Soulhorns,SoulhornsEquipFunction); - //booster - AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction2); - AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); - } public override void OnNewTurn() { @@ -198,6 +204,7 @@ public override void OnNewTurn() need_Gear = false; activate_Scarecrow=false; summon_Scarecrow=false; + summon_Scarecrow2=true; activate_Elf = false; summon_Elf = false; activate_MaxxG = false; @@ -324,7 +331,7 @@ private bool FunctionInHand() } private bool LockBirdFunction() { - if (Duel.Player == 0) + if (Duel.Player == 0 || activate_LockBird) { return false; } @@ -336,11 +343,16 @@ private bool MotorbikeFunction() if (Card.Location == CardLocation.Hand) { int targetid = -1; - if (!(Bot.HasInHand(CardId.Wakaushi)||Bot.HasInMonstersZone(CardId.Wakaushi)||Bot.HasInSpellZone(CardId.Wakaushi))&&!activate_Wakaushi) + List cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup()).ToList(); + if (!(Bot.HasInHand(CardId.Wakaushi) || Bot.HasInMonstersZone(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) { targetid = CardId.Wakaushi; } - else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker && !normal_summon) + else if (cards.Count() == 0 && !normal_summon) + { + targetid = CardId.Soulpiercer; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker) && !activate_Soulpeacemaker && (normal_summon || Bot.HasInMonstersZone(CardId.Scarecrow))) { targetid = CardId.Soulpeacemaker; } @@ -488,12 +500,21 @@ private bool WakaushiEffectFunction() } return false; } + private bool BenkeiFunction() + { + if (Card.Location != CardLocation.Hand || Bot.HasInSpellZone(CardId.Benkei)) return false; + List cards1 = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.Id == CardId.Benkei).ToList(); + List cards2 = GetZoneCards(CardLocation.Removed, Bot).Where(card => card != null && card.Id == CardId.Benkei).ToList(); + if (cards1.Count() >= 2 || Bot.HasInGraveyard(CardId.Benkei) || Bot.HasInExtra(CardId.Benkei) || cards2.Count() > 0) + return true; + return false; + } private bool BenkeiEffectFunction() { if (Card.Location == CardLocation.SpellZone) { int targetid = -1; - if (!(Bot.HasInHand(CardId.Soulpiercer)||Bot.HasInMonstersZone(CardId.Soulpiercer))) + if (!(Bot.HasInHand(CardId.Soulpiercer) || Bot.HasInMonstersZone(CardId.Soulpiercer) || Bot.HasInSpellZone(CardId.Soulpiercer)) && !(Bot.HasInMonstersZone(CardId.Scarecrow) && !activate_Soulpeacemaker)) { targetid = CardId.Soulpiercer; } @@ -632,7 +653,7 @@ private bool SavageDragonFunction() } private bool ASStardustDragonFunction() { - if (Duel.LastChainPlayer == 1 && ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 0)) + if (Duel.LastChainPlayer == 1 && ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 1)) { return true; } @@ -659,7 +680,7 @@ private bool ScarecrowLinkFunction() { List material = new List(); List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); - if (cards.Count > 0 || summon_Scarecrow || activate_Scarecrow) return false; + if ((cards.Count() > 0 && !summon_Scarecrow) || summon_Scarecrow || activate_Scarecrow) return false; int targetid = -1; if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null) { if (Bot.MonsterZone[0].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[0]); @@ -749,25 +770,27 @@ private bool ScarecrowFunction() } AI.SelectCard(tributeId); AI.SelectNextCard(needId); - activate_Scarecrow = true; - if (!summon_Scarecrow - && ((Bot.HasInHand(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) - && (Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) - && ((Bot.HasInHand(CardId.Soulpeacemaker) || Bot.HasInSpellZone(CardId.Soulpeacemaker)) && !activate_Soulpeacemaker) - && (Bot.HasInSpellZone(CardId.Benkei) && !activate_Benkei) - && (Bot.HasInHand(CardId.Soulpiercer) && !normal_summon) - && ((Bot.HasInGraveyard(CardId.Scales) || Bot.HasInHand(CardId.Soulpiercer)) && !activate_Scales && !normal_summon) + if (((!Bot.HasInHand(CardId.Wakaushi) && !Bot.HasInSpellZone(CardId.Wakaushi)) || activate_Wakaushi) + && (!Bot.HasInHand(CardId.Motorbike) || activate_Motorbike) + && ((!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker)) || activate_Soulpeacemaker) + && (!Bot.HasInSpellZone(CardId.Benkei) || activate_Benkei) + && (needId == CardId.Soulpiercer) + && (!activate_Wakaushi || !activate_Motorbike || !activate_Soulpeacemaker || !activate_Benkei) ) { - activate_Scarecrow = false; - summon_Scarecrow = false; + summon_Scarecrow2 = false; } - else if (needId != CardId.Soulpiercer) + activate_Scarecrow = true; + return true; + } + private bool ScarecrowLinkFunction2() + { + if (!summon_Scarecrow2) { - activate_Scarecrow = false; - summon_Scarecrow = false; + summon_Scarecrow2 = true; + return true; } - return true; + return false; } private bool UnicornFunction() { @@ -847,7 +870,13 @@ private bool BoosterEquipFunction() } private bool BoosterEquipFunction2() { - if (Bot.HasInExtra(CardId.IP) && p_summoned) return true; + if (Bot.HasInExtra(CardId.IP) && p_summoned && !activate_Booster) return true; + return false; + } + private bool BoosterEquipFunction3() + { + List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.Scarecrow).ToList(); + if (Bot.HasInMonstersZone(CardId.IP) && p_summoned && !activate_Booster && cards.Count() == 0) return true; return false; } private bool BoosterFunction() @@ -911,11 +940,17 @@ private bool SoulpeacemakerEquipFunction() if (Card.Location != CardLocation.Hand) return false; int tributeId = -1; - if (Bot.HasInMonstersZone(CardId.Scarecrow)) - {tributeId = CardId.Scarecrow;} - else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) - {tributeId = CardId.Soulpiercer;} - AI.SelectCard(tributeId); + List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); + if (cards.Count() > 0) + AI.SelectCard(cards); + else + { + if (Bot.HasInMonstersZone(CardId.Scarecrow)) + {tributeId = CardId.Scarecrow;} + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + {tributeId = CardId.Soulpiercer;} + AI.SelectCard(tributeId); + } return Bot.HasInMonstersZone(new[] { CardId.Scarecrow, CardId.Soulpiercer, @@ -957,14 +992,10 @@ private bool GeniusLinkFunction() { if ((Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) && (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id))) return false; - int CardCount = 0; - foreach (ClientCard card in Bot.Hand.GetMonsters()) - { - if (card.HasRace(CardRace.Machine) && (card.Level >= 2 && card.Level <= 7)) - {CardCount++;} - } - if (CardCount < 2 && !Bot.HasInMonstersZone(CardId.Soulpiercer)){return false;} - if (Bot.HasInHand(CardId.Regulus) || Bot.HasInGraveyard(CardId.Regulus) || Bot.HasInSpellZone(CardId.Regulus) || Bot.HasInMonstersZone(CardId.Regulus)) return false; + List Pcards = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.HasSetcode(0x9a) && card.Level > 1 && card.Level < 8).ToList(); + if (Pcards.Count() < 2 && !Bot.HasInMonstersZone(CardId.Soulpiercer)) return false; + List Rcards = GetZoneCards(CardLocation.Removed, Bot).Where(card => card != null && card.Id == CardId.Regulus).ToList(); + if (Bot.HasInHand(CardId.Regulus) || Bot.HasInGraveyard(CardId.Regulus) || Bot.HasInSpellZone(CardId.Regulus) || Bot.HasInMonstersZone(CardId.Regulus) || Rcards.Count() > 0) return false; bool linkchk = false; List materials = new List(); if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[6].Id)) @@ -1035,10 +1066,27 @@ private bool ElfLinkFunction() } private bool ElfFunction() { - AI.SelectCard(CardId.Motorbike); - AI.SelectPosition(CardPosition.FaceUpDefence); - activate_Elf = true; - return Bot.HasInGraveyard(CardId.Motorbike); + if (Duel.Player == 0) + { + activate_Elf = true; + AI.SelectCard(CardId.Motorbike); + return Bot.HasInGraveyard(CardId.Motorbike); + } + List cards1 = GetZoneCards(CardLocation.MonsterZone, Enemy); + List cards2 = GetZoneCards(CardLocation.SpellZone, Enemy); + if (cards1.Count() > 0 || cards2.Count() >= 3) + { + if (Bot.HasInExtra(CardId.Unicorn) && Bot.HasInGraveyard(CardId.IP)) + AI.SelectCard(CardId.IP); + else + { + AI.SelectCard(CardId.Motorbike); + AI.SelectPosition(CardPosition.FaceUpDefence); + } + activate_Elf = true; + return Bot.HasInGraveyard(CardId.Motorbike) || Bot.HasInGraveyard(CardId.IP); + } + return false; } private bool RegulusFunction() { @@ -1089,9 +1137,19 @@ private bool FleurFunction() } private bool IPLinkFunction() { - List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Id != CardId.Scarecrow && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf)) && !FinalCards(card.Id)).ToList(); - if (cards.Count <=1) return false; - AI.SelectMaterials(cards); + List materials = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Id != CardId.Scarecrow && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf)) && !FinalCards(card.Id)).ToList(); + if (materials.Count <=1) return false; + if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].HasType(CardType.Link)) + { + if (Bot.MonsterZone[2] != null && FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[4] != null && FinalCards(Bot.MonsterZone[4].Id)) + return false; + } + else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && Bot.MonsterZone[5].HasType(CardType.Link)) + { + if (Bot.MonsterZone[2] != null && FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[0] != null && FinalCards(Bot.MonsterZone[0].Id)) + return false; + } + AI.SelectMaterials(materials); return true; } private bool IPFunction() From e832e9ccc7b298e67a4fe62565da4c8f54c02d5f Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Thu, 28 Mar 2024 17:03:59 +0800 Subject: [PATCH 022/110] Fix bot negating Horus monsters' special summoning (#186) --- Game/AI/Decks/DarkMagicianExecutor.cs | 1 + .../Decks/GrenMajuThunderBoarderExecutor.cs | 3 +- Game/AI/Decks/TimeThiefExecutor.cs | 1 + Game/AI/DefaultExecutor.cs | 30 +++++++++++++++++-- Game/ClientCard.cs | 2 ++ Game/GameBehavior.cs | 10 +++---- 6 files changed, 38 insertions(+), 9 deletions(-) diff --git a/Game/AI/Decks/DarkMagicianExecutor.cs b/Game/AI/Decks/DarkMagicianExecutor.cs index 024b31539..55c909286 100644 --- a/Game/AI/Decks/DarkMagicianExecutor.cs +++ b/Game/AI/Decks/DarkMagicianExecutor.cs @@ -496,6 +496,7 @@ private bool SolemnStrikeeff() { if (Bot.LifePoints > 1500 && Duel.LastChainPlayer == 1) return true; + if (DefaultOnlyHorusSpSummoning()) return false; return false; } diff --git a/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs b/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs index 78789cc07..fb08d0d5e 100644 --- a/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs +++ b/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs @@ -436,7 +436,8 @@ private bool ThunderKingRaiOhsummon() } private bool ThunderKingRaiOheff() - { + { + if (DefaultOnlyHorusSpSummoning()) return false; if(Duel.SummoningCards.Count > 0) { foreach(ClientCard m in Duel.SummoningCards) diff --git a/Game/AI/Decks/TimeThiefExecutor.cs b/Game/AI/Decks/TimeThiefExecutor.cs index 189dc8a2f..0d9a990c1 100644 --- a/Game/AI/Decks/TimeThiefExecutor.cs +++ b/Game/AI/Decks/TimeThiefExecutor.cs @@ -370,6 +370,7 @@ private bool ThunderKingRaiOhsummon() } private bool ThunderKingRaiOheff() { + if (DefaultOnlyHorusSpSummoning()) return false; if (Duel.SummoningCards.Count > 0) { foreach (ClientCard m in Duel.SummoningCards) diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index bcd81b5ba..67e72bdb9 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -213,6 +213,7 @@ protected class _Setcode public const int AncientWarriors = 0x137; public const int RescueACE = 0x18b; public const int VanquishSoul = 0x195; + public const int Horus = 0x19d; } protected DefaultExecutor(GameAI ai, Duel duel) @@ -834,7 +835,7 @@ protected bool DefaultDisableMonster() /// protected bool DefaultSolemnJudgment() { - return !Util.IsChainTargetOnly(Card) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && DefaultTrap(); + return !Util.IsChainTargetOnly(Card) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && !DefaultOnlyHorusSpSummoning() && DefaultTrap(); } /// @@ -842,7 +843,7 @@ protected bool DefaultSolemnJudgment() /// protected bool DefaultSolemnWarning() { - return (Bot.LifePoints > 2000) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && DefaultTrap(); + return (Bot.LifePoints > 2000) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && !DefaultOnlyHorusSpSummoning() && DefaultTrap(); } /// @@ -850,7 +851,30 @@ protected bool DefaultSolemnWarning() /// protected bool DefaultSolemnStrike() { - return (Bot.LifePoints > 1500) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && DefaultTrap(); + return (Bot.LifePoints > 1500) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && !DefaultOnlyHorusSpSummoning() && DefaultTrap(); + } + + /// + /// Check whether only Horus monster is special summoning. + /// If returning true, should not negate the special summon since it can be special summoned again. + /// + /// + protected bool DefaultOnlyHorusSpSummoning() + { + if (Duel.SummoningCards.Count != 0) + { + bool notOnlyHorusFlag = false; + foreach (ClientCard card in Duel.SummoningCards) + { + if (!card.HasSetcode(_Setcode.Horus) || card.LastLocation != CardLocation.Grave) + { + notOnlyHorusFlag = true; + break; + } + } + return !notOnlyHorusFlag; + } + return false; } /// diff --git a/Game/ClientCard.cs b/Game/ClientCard.cs index 970e0f6e3..1787fd7fd 100644 --- a/Game/ClientCard.cs +++ b/Game/ClientCard.cs @@ -15,6 +15,7 @@ public class ClientCard public int Position { get; set; } public int Sequence { get; set; } public CardLocation Location { get; set; } + public CardLocation LastLocation { get; set; } public int Alias { get; private set; } public int Level { get; private set; } public int Rank { get; private set; } @@ -70,6 +71,7 @@ public ClientCard(int id, CardLocation loc, int sequence, int position) ActionIndex = new int[16]; ActionActivateIndex = new Dictionary(); Location = loc; + LastLocation = 0; } public void SetId(int id) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index ab24360dc..e260fdb0a 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -376,15 +376,10 @@ private void OnStart(BinaryReader packet) _duel.Fields[GetLocalPlayer(1)].Init(deck, extra); // in case of ending duel in chain's solving - _duel.LastChainPlayer = -1; - _duel.LastChainLocation = 0; _duel.CurrentChain.Clear(); _duel.ChainTargets.Clear(); - _duel.LastChainTargets.Clear(); _duel.ChainTargetOnly.Clear(); - _duel.LastSummonPlayer = -1; _duel.SummoningCards.Clear(); - _duel.LastSummonedCards.Clear(); _duel.SolvingChainIndex = 0; _duel.NegatedChainIndexList.Clear(); @@ -615,6 +610,10 @@ private void OnMove(BinaryReader packet) packet.ReadInt32(); // reason ClientCard card = _duel.GetCard(previousControler, (CardLocation)previousLocation, previousSequence); + if (card != null) + { + card.LastLocation = (CardLocation)previousLocation; + } if ((previousLocation & (int)CardLocation.Overlay) != 0) { previousLocation = previousLocation & 0x7f; @@ -803,6 +802,7 @@ private void OnChainEnd(BinaryReader packet) _duel.ChainTargetOnly.Clear(); _duel.SolvingChainIndex = 0; _duel.NegatedChainIndexList.Clear(); + _duel.SummoningCards.Clear(); } private void OnCardSorting(BinaryReader packet) From 00e7031094a8c02955e3c46386d1147ef1166a97 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Thu, 28 Mar 2024 17:23:21 +0800 Subject: [PATCH 023/110] Update for Called by the Grave/Crossout Designator (#187) --- Game/AI/Decks/AltergeistExecutor.cs | 23 +- Game/AI/Decks/BlueEyesExecutor.cs | 1 + Game/AI/Decks/BlueEyesMaxDragonExecutor.cs | 2 + Game/AI/Decks/BraveExecutor.cs | 6 + Game/AI/Decks/ChainBurnExecutor.cs | 1 + Game/AI/Decks/DarkMagicianExecutor.cs | 4 + Game/AI/Decks/DogmatikaExecutor.cs | 125 ++--- Game/AI/Decks/DragunExecutor.cs | 4 + Game/AI/Decks/DragunityExecutor.cs | 1 + Game/AI/Decks/ExosisterExecutor.cs | 93 ++-- Game/AI/Decks/FrogExecutor.cs | 1 + .../Decks/GrenMajuThunderBoarderExecutor.cs | 6 +- Game/AI/Decks/KashtiraExecutor.cs | 1 + Game/AI/Decks/LabrynthExecutor.cs | 23 +- Game/AI/Decks/Level8Executor.cs | 3 +- .../LightswornShaddoldinosourExecutor.cs | 6 + Game/AI/Decks/LuckyExecutor.cs | 2 + Game/AI/Decks/OrcustExecutor.cs | 14 + Game/AI/Decks/PureWindsExecutor.cs | 1 + Game/AI/Decks/QliphortExecutor.cs | 2 + Game/AI/Decks/RainbowExecutor.cs | 2 + Game/AI/Decks/Rank5Executor.cs | 1 + Game/AI/Decks/ST1732Executor.cs | 1 + Game/AI/Decks/SalamangreatExecutor.cs | 3 + Game/AI/Decks/SkyStrikerExecutor.cs | 3 + Game/AI/Decks/SuperheavySamuraiExecutor.cs | 509 ++++++++---------- Game/AI/Decks/SwordsoulExecutor.cs | 144 ++--- Game/AI/Decks/TearlamentsExecutor.cs | 7 +- Game/AI/Decks/ThunderDragonExecutor.cs | 12 + Game/AI/Decks/TimeThiefExecutor.cs | 1 + Game/AI/Decks/ToadallyAwesomeExecutor.cs | 4 + Game/AI/Decks/TrickstarExecutor.cs | 92 ++-- Game/AI/Decks/WitchcraftExecutor.cs | 265 ++++----- Game/AI/Decks/YosenjuExecutor.cs | 1 + Game/AI/Decks/ZefraExecutor.cs | 1 + Game/AI/Decks/ZoodiacExecutor.cs | 5 +- Game/AI/DefaultExecutor.cs | 101 +++- Game/ClientCard.cs | 13 +- 38 files changed, 749 insertions(+), 735 deletions(-) diff --git a/Game/AI/Decks/AltergeistExecutor.cs b/Game/AI/Decks/AltergeistExecutor.cs index 93b14c353..d6218ede3 100644 --- a/Game/AI/Decks/AltergeistExecutor.cs +++ b/Game/AI/Decks/AltergeistExecutor.cs @@ -221,8 +221,7 @@ public bool isAltergeist(int id) public bool isAltergeist(ClientCard card) { - return card.IsCode(CardId.Marionetter, CardId.Hexstia, CardId.Protocol, CardId.Multifaker, CardId.Meluseek, - CardId.Kunquery, CardId.Manifestation, CardId.Silquitous); + return card != null && card.HasSetcode(0x103); } public int GetSequence(ClientCard card) @@ -391,6 +390,7 @@ public int SelectSetPlace(List avoid_list=null) public bool spell_trap_activate(bool isCounter = false, ClientCard target = null) { if (target == null) target = Card; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return true; if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !Bot.HasInHandOrHasInMonstersZone(CardId.GO_SR) && !isCounter && !Bot.HasInSpellZone(CardId.SolemnStrike)) return false; if (target.IsSpell()) @@ -664,7 +664,7 @@ public bool SecretVillage_activate() public bool G_activate() { - return (Duel.Player == 1); + return (Duel.Player == 1) && !DefaultCheckWhetherCardIsNegated(Card); } public bool NaturalExterio_eff() @@ -821,6 +821,7 @@ public bool Impermanence_activate() public bool Hand_act_eff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.IsCode(CardId.AB_JS) && Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect return false; if (Card.IsCode(CardId.GO_SR) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GO_SR)) return false; @@ -901,6 +902,7 @@ public bool WakingtheDragon_eff() public bool GR_WC_activate() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int warrior_count = 0; int pendulum_count = 0; int link_count = 0; @@ -1263,7 +1265,7 @@ public bool Hexstia_eff() if (linked_card != null && linked_card.IsCode(CardId.Hexstia)) { int next_seq = get_Hexstia_linkzone(this_seq); - if (next_seq != -1 && Bot.MonsterZone[next_seq] != null && isAltergeist(Bot.MonsterZone[next_seq].Id)) return false; + if (next_seq != -1 && Bot.MonsterZone[next_seq] != null && isAltergeist(Bot.MonsterZone[next_seq])) return false; } } return true; @@ -1690,7 +1692,7 @@ public bool Protocol_negate() if (target.IsCode(CardId.Hexstia)) { int next_index = get_Hexstia_linkzone(i); - if (next_index != -1 && Bot.MonsterZone[next_index] != null && Bot.MonsterZone[next_index].IsFaceup() && isAltergeist(Bot.MonsterZone[next_index].Id)) continue; + if (next_index != -1 && Bot.MonsterZone[next_index] != null && Bot.MonsterZone[next_index].IsFaceup() && isAltergeist(Bot.MonsterZone[next_index])) continue; } if (!get_linked_by_Hexstia(i)) { @@ -2669,6 +2671,7 @@ public override void OnNewTurn() ss_other_monster = false; Impermanence_list.Clear(); attacked_Meluseek.Clear(); + base.OnNewTurn(); } public override void OnChaining(int player, ClientCard card) @@ -2890,16 +2893,16 @@ public override int OnSelectPlace(int cardId, int player, CardLocation location, if (cardId == CardId.Hexstia) { // ex zone - if ((Zones.z5 & available) > 0 && Bot.MonsterZone[1] != null && isAltergeist(Bot.MonsterZone[1].Id)) return Zones.z5; - if ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] != null && isAltergeist(Bot.MonsterZone[3].Id)) return Zones.z6; - if ( ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] != null && !isAltergeist(Bot.MonsterZone[3].Id)) + if ((Zones.z5 & available) > 0 && Bot.MonsterZone[1] != null && isAltergeist(Bot.MonsterZone[1])) return Zones.z5; + if ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] != null && isAltergeist(Bot.MonsterZone[3])) return Zones.z6; + if ( ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] != null && !isAltergeist(Bot.MonsterZone[3])) || ((Zones.z5 & available) > 0 && Bot.MonsterZone[1] == null) ) return Zones.z5; - if (((Zones.z5 & available) > 0 && Bot.MonsterZone[1] != null && !isAltergeist(Bot.MonsterZone[1].Id)) + if (((Zones.z5 & available) > 0 && Bot.MonsterZone[1] != null && !isAltergeist(Bot.MonsterZone[1])) || ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] == null)) return Zones.z6; // main zone for (int i = 1; i < 5; ++i) { - if (Bot.MonsterZone[i] != null && isAltergeist(Bot.MonsterZone[i].Id)) + if (Bot.MonsterZone[i] != null && isAltergeist(Bot.MonsterZone[i])) { if ((available & (int)System.Math.Pow(2, i - 1)) > 0) return (int)System.Math.Pow(2, i - 1); } diff --git a/Game/AI/Decks/BlueEyesExecutor.cs b/Game/AI/Decks/BlueEyesExecutor.cs index b09198a0e..9939f7b77 100644 --- a/Game/AI/Decks/BlueEyesExecutor.cs +++ b/Game/AI/Decks/BlueEyesExecutor.cs @@ -131,6 +131,7 @@ public override void OnNewTurn() UsedGalaxyEyesCipherDragon = null; AlternativeWhiteDragonSummoned = false; SoulChargeUsed = false; + base.OnNewTurn(); } public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) diff --git a/Game/AI/Decks/BlueEyesMaxDragonExecutor.cs b/Game/AI/Decks/BlueEyesMaxDragonExecutor.cs index 5aa4ad0b3..6b26c1aa7 100644 --- a/Game/AI/Decks/BlueEyesMaxDragonExecutor.cs +++ b/Game/AI/Decks/BlueEyesMaxDragonExecutor.cs @@ -121,6 +121,7 @@ private void Count_check() private bool MaxxCeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } @@ -464,6 +465,7 @@ private bool Linkuribohsp() private bool Linkuriboheff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false; return true; } diff --git a/Game/AI/Decks/BraveExecutor.cs b/Game/AI/Decks/BraveExecutor.cs index f55c25581..42f80dc64 100644 --- a/Game/AI/Decks/BraveExecutor.cs +++ b/Game/AI/Decks/BraveExecutor.cs @@ -180,6 +180,7 @@ public override void OnNewTurn() FusionDestinyUsed = false; PhoenixTarget = null; PhoenixSelectingTarget = 0; + base.OnNewTurn(); } public override CardPosition OnSelectPosition(int cardId, IList positions) @@ -479,6 +480,7 @@ private bool JourneyOfDestinyEffect() private bool AquamancerOfTheSanctuarySearchEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.Location == CardLocation.Grave) { AI.SelectCard(CardLocation.Deck); @@ -626,6 +628,7 @@ private bool TGHyperLibrarianSummon() private bool JetSynchronEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int[] materials = new[] { CardId.MechaPhantomBeastToken }; @@ -786,6 +789,7 @@ private bool PredaplantVerteAnacondaSummon() private bool PredaplantVerteAnacondaEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (ActivateDescription == Util.GetStringId(CardId.PredaplantVerteAnaconda, 0)) return false; FusionDestinyUsed = true; @@ -858,6 +862,7 @@ private bool DestinyHeroDasherEffect() private bool DestinyHeroCelestialEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (!Bot.HasInGraveyard(CardId.DestinyHeroDasher)) return false; AI.SelectCard(CardId.DestinyHeroDasher); @@ -971,6 +976,7 @@ private bool VirtualWorldKyubiShenshenSummon() private bool VirtualWorldKyubiShenshenEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.Location == CardLocation.MonsterZone && Bot.HasInBanished(CardId.AquamancerOfTheSanctuary)) { AI.SelectCard(CardId.AquamancerOfTheSanctuary); diff --git a/Game/AI/Decks/ChainBurnExecutor.cs b/Game/AI/Decks/ChainBurnExecutor.cs index 8430b5e92..5de8b9d86 100644 --- a/Game/AI/Decks/ChainBurnExecutor.cs +++ b/Game/AI/Decks/ChainBurnExecutor.cs @@ -265,6 +265,7 @@ public override void OnNewTurn() prevent_used = false; Linkuribohused = true; Timelord_check = false; + base.OnNewTurn(); } public override void OnNewPhase() { diff --git a/Game/AI/Decks/DarkMagicianExecutor.cs b/Game/AI/Decks/DarkMagicianExecutor.cs index 55c909286..0e988e4f2 100644 --- a/Game/AI/Decks/DarkMagicianExecutor.cs +++ b/Game/AI/Decks/DarkMagicianExecutor.cs @@ -316,6 +316,7 @@ public override void OnNewTurn() big_attack = false; big_attack_used = false; soul_used = false; + base.OnNewTurn(); } public int GetTotalATK(IList list) { @@ -502,6 +503,7 @@ private bool SolemnStrikeeff() private bool ChainEnemy() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.UpstartGoblin)) return false; @@ -520,6 +522,7 @@ private bool CrystalWingSynchroDragoneff() private bool MaxxCeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } /* @@ -1418,6 +1421,7 @@ private bool MagiciansRodeff() } else { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInMonstersZone(CardId.VentriloauistsClaraAndLucika)) { AI.SelectCard(CardId.VentriloauistsClaraAndLucika); diff --git a/Game/AI/Decks/DogmatikaExecutor.cs b/Game/AI/Decks/DogmatikaExecutor.cs index 2e6c7b394..9bb4e8ff5 100644 --- a/Game/AI/Decks/DogmatikaExecutor.cs +++ b/Game/AI/Decks/DogmatikaExecutor.cs @@ -26,7 +26,7 @@ public class CardId public const int DogmatikaMacabre = 60921537; public const int SinfulSpoilsOfDoom_Rciela = 16240772; // _CardId.CalledByTheGrave = 24224830; - public const int CrossoutDesignator = 65681983; + // _CardId.CrossoutDesignator = 65681983; public const int WANTED_SeekerOfSinfulSpoils = 80845034; public const int DogmatikaMatrix = 35569555; @@ -78,7 +78,7 @@ public DogmatikaExecutor(GameAI ai, Duel duel) // quick effect AddExecutor(ExecutorType.Activate, CardId.ThesIrisSwordsoul, ThesIrisSwordsoulActivate); AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); - AddExecutor(ExecutorType.Activate, CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); AddExecutor(ExecutorType.Activate, CardId.Linguriboh, LinguribohActivate); AddExecutor(ExecutorType.Activate, CardId.DogmatikaPunishment, DogmatikaPunishmentActivate); @@ -139,7 +139,7 @@ public DogmatikaExecutor(GameAI ai, Duel duel) CardId.WANTED_SeekerOfSinfulSpoils, CardId.DogmatikaMatrix, _CardId.InfiniteImpermanence, CardId.DogmatikaPunishment }}, {2, new List { CardId.DogmatikaAlbaZoa, CardId.DogmatikaFleurdelis, _CardId.CalledByTheGrave }}, {1, new List { CardId.ThesIrisSwordsoul, CardId.DogmatikaMaximus, CardId.DiabellstarTheBlackWitch, CardId.DogmatikaLamity, CardId.DogmatikaMacabre, - CardId.SinfulSpoilsOfDoom_Rciela, CardId.CrossoutDesignator }}, + CardId.SinfulSpoilsOfDoom_Rciela, _CardId.CrossoutDesignator }}, }; List notToNegateIdList = new List{ 58699500, 20343502 @@ -149,8 +149,7 @@ public DogmatikaExecutor(GameAI ai, Duel duel) 70534340, 60465049, 24094258, 86066372 }; - Dictionary calledbytheGraveCount = new Dictionary(); - List CrossoutDesignatorTargetList = new List(); + List currentNegatingIdList = new List(); bool enemyActivateMaxxC = false; bool enemyActivateLockBird = false; List infiniteImpermanenceList = new List(); @@ -598,16 +597,6 @@ public void CheckDeactiveFlag() if (lastChainCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = false; if (lastChainCard.IsCode(_CardId.LockBird)) enemyActivateLockBird = false; if (lastChainCard.IsCode(CardId.DimensionShifter)) dimensionShifterCount = 0; - if (lastChainCard.IsCode(_CardId.CalledByTheGrave) && !CrossoutDesignatorTargetList.Contains(_CardId.CalledByTheGrave)) - { - foreach (ClientCard target in Duel.LastChainTargets) - { - if (target.IsMonster() && target.Controller == 0 && target.Location == CardLocation.Grave) - { - calledbytheGraveCount[target.Id] = 0; - } - } - } if (lastChainCard.Controller == 1 && lastChainCard.Location == CardLocation.MonsterZone) { currentNegateMonsterList.Add(lastChainCard); @@ -620,11 +609,9 @@ public void CheckDeactiveFlag() /// public int CheckCalledbytheGrave(int id) { - if (!calledbytheGraveCount.ContainsKey(id)) - { - return 0; - } - return calledbytheGraveCount[id]; + if (currentNegatingIdList.Contains(id)) return 1; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; } /// @@ -697,12 +684,13 @@ public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = n /// Check whether'll be negated /// /// check whether card itself is disabled. - public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false) + public bool CheckWhetherNegated(bool toFieldCheck = false) { if ((Card.IsSpell() || Card.IsTrap()) && CheckSpellWillBeNegate()){ return true; } - if (CheckCalledbytheGrave(Card.Id) > 0 || CrossoutDesignatorTargetList.Contains(Card.Id)){ + if (DefaultCheckWhetherCardIsNegated(Card)) + { return true; } if (Card.IsMonster() && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) @@ -719,9 +707,6 @@ public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = fa return true; } } - if (disablecheck){ - return Card.IsDisabled(); - } return false; } @@ -1044,7 +1029,6 @@ public override void OnNewTurn() { if (Duel.Turn <= 1) { - calledbytheGraveCount.Clear(); banSpSummonFromExTurn = 0; checkedEnemyExtra = false; avoid2Monster = true; @@ -1058,17 +1042,9 @@ public override void OnNewTurn() omegaActivateCount = 0; enemySpSummonFromExLastTurn = enemySpSummonFromExThisTurn; enemySpSummonFromExThisTurn = 0; + currentNegatingIdList.Clear(); - List keyList = calledbytheGraveCount.Keys.ToList(); - foreach (int dic in keyList) - { - if (calledbytheGraveCount[dic] > 1) - { - calledbytheGraveCount[dic] -= 1; - } - } if (dimensionShifterCount > 0) dimensionShifterCount--; - CrossoutDesignatorTargetList.Clear(); infiniteImpermanenceList.Clear(); summoned = false; @@ -1079,6 +1055,7 @@ public override void OnNewTurn() { banSpSummonFromExTurn -= 1; } + base.OnNewTurn(); } public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) @@ -1159,19 +1136,7 @@ public override void OnChaining(int player, ClientCard card) if (player == 1) { - if (card.IsCode(_CardId.MaxxC) && CheckCalledbytheGrave(_CardId.MaxxC) == 0 && !CrossoutDesignatorTargetList.Contains(_CardId.MaxxC)) - { - enemyActivateMaxxC = true; - } - if (card.IsCode(_CardId.LockBird) && CheckCalledbytheGrave(_CardId.LockBird) == 0 && !CrossoutDesignatorTargetList.Contains(_CardId.LockBird)) - { - enemyActivateLockBird = true; - } - if (card.IsCode(CardId.DimensionShifter) && CheckCalledbytheGrave(CardId.DimensionShifter) == 0 && !CrossoutDesignatorTargetList.Contains(CardId.DimensionShifter)) - { - dimensionShifterCount = 2; - } - if (card.IsCode(_CardId.InfiniteImpermanence) && !CrossoutDesignatorTargetList.Contains(_CardId.InfiniteImpermanence)) + if (card.IsCode(_CardId.InfiniteImpermanence) && !DefaultCheckWhetherCardIdIsNegated(_CardId.InfiniteImpermanence)) { for (int i = 0; i < 5; ++i) { @@ -1182,18 +1147,33 @@ public override void OnChaining(int player, ClientCard card) } } } - if (card.IsCode(_CardId.CalledByTheGrave) && !CrossoutDesignatorTargetList.Contains(_CardId.CalledByTheGrave)) + } + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) + enemyActivateLockBird = true; + if (currentCard.IsCode(CardId.DimensionShifter)) + dimensionShifterCount = 2; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) { - foreach (ClientCard target in Duel.LastChainTargets) + for (int i = 0; i < 5; ++i) { - if (target.IsMonster() && target.Controller == 0 && target.Location == CardLocation.Grave) + if (Enemy.SpellZone[i] == currentCard) { - calledbytheGraveCount[target.Id] = 2; + infiniteImpermanenceList.Add(4 - i); + break; } } } } - base.OnChaining(player, card); } public override void OnChainEnd() @@ -1601,7 +1581,7 @@ public bool DiabellstarTheBlackWitchSpSummon() } if (Bot.GetMonsterCount() == 0 || CheckRemainInDeck(CardId.SinfulSpoilsOfDoom_Rciela) > 0) { - List spellIdList = new List{ CardId.CrossoutDesignator, _CardId.InfiniteImpermanence, _CardId.CalledByTheGrave, + List spellIdList = new List{ _CardId.CrossoutDesignator, _CardId.InfiniteImpermanence, _CardId.CalledByTheGrave, CardId.DogmatikaPunishment, CardId.DogmatikaMacabre, CardId.DogmatikaLamity }; foreach (int spellId in spellIdList) { @@ -1633,7 +1613,7 @@ public bool DiabellstarTheBlackWitchActivate() public bool DogmatikaEcclesiaSummon() { if (enemyActivateLockBird) return false; - if (CheckWhetherNegated(true, true)) return false; + if (CheckWhetherNegated()) return false; if (activatedCardIdList.Contains(Card.Id)) return false; summoned = true; @@ -1642,7 +1622,7 @@ public bool DogmatikaEcclesiaSummon() public bool DogmatikaEcclesiaActivate() { - if (CheckWhetherNegated(true, true)) return false; + if (CheckWhetherNegated()) return false; // sp summon if (Card.Location == CardLocation.Hand) { @@ -1784,7 +1764,7 @@ public bool AshBlossomActivate() public bool MaxxCActivate() { - if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + if (CheckWhetherNegated() || Duel.LastChainPlayer == 0) return false; if (Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee, true, false, true) && !confirmLink2) return false; return DefaultMaxxC(); } @@ -2089,9 +2069,9 @@ public bool CalledbytheGraveActivate() // negate if (Util.GetLastChainCard().IsMonster()) { - int code = Util.GetLastChainCard().Id; + int code = Util.GetLastChainCard().GetOriginCode(); if (code == 0) return false; - if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTargetList.Contains(code)) return false; + if (CheckCalledbytheGrave(code) > 0) return false; if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) { return false; @@ -2103,7 +2083,7 @@ public bool CalledbytheGraveActivate() SelectSTPlace(null, true); } AI.SelectCard(code); - calledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); CheckDeactiveFlag(); return true; } @@ -2118,9 +2098,9 @@ public bool CalledbytheGraveActivate() { SelectSTPlace(null, true); } - int code = cards.Id; + int code = cards.GetOriginCode(); AI.SelectCard(cards); - calledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); return true; } } @@ -2134,8 +2114,8 @@ public bool CalledbytheGraveActivate() enemyMonsters.Sort(CardContainer.CompareCardAttack); enemyMonsters.Reverse(); int code = enemyMonsters[0].Id; - AI.SelectCard(code); - calledbytheGraveCount[code] = 2; + AI.SelectCard(enemyMonsters); + currentNegatingIdList.Add(code); return true; } } @@ -2150,8 +2130,8 @@ public bool CalledbytheGraveActivate() { SelectSTPlace(null, true); } - AI.SelectCard(code); - calledbytheGraveCount[code] = 2; + AI.SelectCard(targets); + currentNegatingIdList.Add(code); return true; } @@ -2160,17 +2140,15 @@ public bool CalledbytheGraveActivate() public bool CrossoutDesignatorActivate() { - if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; // negate if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) { - int code = Util.GetLastChainCard().Id; - int alias = Util.GetLastChainCard().Alias; - if (alias != 0 && alias - code < 10) code = alias; + int code = Util.GetLastChainCard().GetOriginCode(); if (code == 0) return false; // do not negate black witch if (code == CardId.DiabellstarTheBlackWitch) return false; - if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTargetList.Contains(code)) return false; + if (CheckCalledbytheGrave(code) > 0) return false; if (CheckRemainInDeck(code) > 0) { if (!(Card.Location == CardLocation.SpellZone)) @@ -2178,7 +2156,7 @@ public bool CrossoutDesignatorActivate() SelectSTPlace(null, true); } AI.SelectAnnounceID(code); - CrossoutDesignatorTargetList.Add(code); + currentNegatingIdList.Add(code); CheckDeactiveFlag(); return true; } @@ -2616,6 +2594,7 @@ public bool PSYFramelordOmegaActivate() { if (Card.Location == CardLocation.Grave && omegaActivateCount <= 5) { + if (CheckWhetherNegated()) return false; List targets = GetDangerousCardinEnemyGrave(true); if (targets.Count() > 0) { AI.SelectCard(targets); @@ -2803,7 +2782,7 @@ public bool SummonForTYPHONCheck() { if (!Bot.HasInExtra(CardId.SuperStarslayerTYPHON) || Bot.GetMonsters().Any(card => card.IsFaceup()) || banSpSummonFromExTurn > 0) return false; if (enemySpSummonFromExLastTurn < 2 && enemySpSummonFromExThisTurn < 2) return false; - if (Card.IsCode(CardId.KnightmareCorruptorIblee) && !CheckWhetherNegated(true, true)) return false; + if (Card.IsCode(CardId.KnightmareCorruptorIblee) && !CheckWhetherNegated()) return false; if (Card.Level > 4) return false; int currentAttack = 0; diff --git a/Game/AI/Decks/DragunExecutor.cs b/Game/AI/Decks/DragunExecutor.cs index 660cfba10..796c3a026 100644 --- a/Game/AI/Decks/DragunExecutor.cs +++ b/Game/AI/Decks/DragunExecutor.cs @@ -123,6 +123,7 @@ public override void OnNewTurn() { BeastOLionUsed = false; RedEyesFusionUsed = false; + base.OnNewTurn(); } public override CardPosition OnSelectPosition(int cardId, IList positions) @@ -198,6 +199,7 @@ private bool RedEyesFusionEffect() private bool TourGuideFromTheUnderworldSummon() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.GetRemainingCount(CardId.TourGuideFromTheUnderworld, 2) == 0 && Bot.GetRemainingCount(CardId.Sangan, 2) == 0) return false; return true; @@ -307,6 +309,7 @@ private bool SummonForMaterial() private bool MagiciansSoulsEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.Location == CardLocation.Hand) { if (RedEyesFusionUsed) @@ -375,6 +378,7 @@ private bool MagicalizedFusionEffect() private bool PredaplantVerteAnacondaEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (ActivateDescription == Util.GetStringId(CardId.PredaplantVerteAnaconda, 0)) return false; AI.SelectCard(CardId.RedEyesFusion); diff --git a/Game/AI/Decks/DragunityExecutor.cs b/Game/AI/Decks/DragunityExecutor.cs index 65ebd709c..1b84968ed 100644 --- a/Game/AI/Decks/DragunityExecutor.cs +++ b/Game/AI/Decks/DragunityExecutor.cs @@ -456,6 +456,7 @@ private bool DragunityPhalanxSet() private bool AssaultBeast() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (!Bot.HasInSpellZone(CardId.AssaultModeActivate)) return true; return false; diff --git a/Game/AI/Decks/ExosisterExecutor.cs b/Game/AI/Decks/ExosisterExecutor.cs index 396121edb..b87d4b341 100644 --- a/Game/AI/Decks/ExosisterExecutor.cs +++ b/Game/AI/Decks/ExosisterExecutor.cs @@ -164,7 +164,7 @@ public ExosisterExecutor(GameAI ai, Duel duel) }; List ExosisterSpellTrapList = new List{CardId.ExosisterPax, CardId.ExosisterArment, CardId.ExosisterVadis, CardId.ExosisterReturnia}; - Dictionary calledbytheGraveCount = new Dictionary(); + List currentNegatingIdList = new List(); bool enemyActivateMaxxC = false; bool enemyActivateLockBird = false; bool enemyMoveGrave = false; @@ -410,11 +410,9 @@ public int CheckRemainInDeck(int id) /// public int CheckCalledbytheGrave(int id) { - if (!calledbytheGraveCount.ContainsKey(id)) - { - return 0; - } - return calledbytheGraveCount[id]; + if (currentNegatingIdList.Contains(id)) return 1; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; } public void CheckEnemyMoveGrave() @@ -470,24 +468,6 @@ public bool CheckLastChainShouldNegated() return true; } - /// - /// Check whether negate opposite's effect and clear flag - /// - public void CheckDeactiveFlag() - { - if (Util.GetLastChainCard() != null && Duel.LastChainPlayer == 1) - { - if (Util.GetLastChainCard().IsCode(_CardId.MaxxC)) - { - enemyActivateMaxxC = false; - } - if (Util.GetLastChainCard().IsCode(_CardId.LockBird)) - { - enemyActivateLockBird = false; - } - } - } - /// /// Check whether opposite use Maxx-C, and thus make less operation. /// @@ -777,13 +757,6 @@ public override void OnSelectChain(IList cards) ClientCard card = Util.GetLastChainCard(); if (player == 1) { - if (card != null && card.IsCode(_CardId.CalledByTheGrave)) - { - foreach (ClientCard targetCard in Duel.LastChainTargets) { - Logger.DebugWriteLine("===Exosister: " + targetCard?.Name + " is targeted by called by the grave."); - calledbytheGraveCount[targetCard.Id] = 2; - } - } foreach (ClientCard targetCard in Duel.LastChainTargets) { if (targetCard.Location == CardLocation.Grave) { @@ -796,6 +769,30 @@ public override void OnSelectChain(IList cards) base.OnSelectChain(cards); } + public override void OnChainSolved(int chainIndex) + { + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) + enemyActivateLockBird = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + } + + /// /// clear chain information /// @@ -833,19 +830,10 @@ public override void OnChainEnd() public override void OnNewTurn() { - if (Duel.Turn <= 1) calledbytheGraveCount.Clear(); enemyActivateMaxxC = false; enemyActivateLockBird = false; infiniteImpermanenceList.Clear(); - // CalledbytheGrave refresh - List key_list = calledbytheGraveCount.Keys.ToList(); - foreach (int dic in key_list) - { - if (calledbytheGraveCount[dic] > 1) - { - calledbytheGraveCount[dic] -= 1; - } - } + currentNegatingIdList.Clear(); summoned = false; elisEffect1Activated = false; @@ -1133,7 +1121,6 @@ public bool AshBlossomActivate() return false; } } - CheckDeactiveFlag(); return DefaultAshBlossomAndJoyousSpring(); } @@ -1192,7 +1179,6 @@ public bool InfiniteImpermanenceActivate() { ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); List enemyMonsters = Enemy.GetMonsters(); - CheckDeactiveFlag(); AI.SelectCard(target); infiniteImpermanenceList.Add(this_seq); return true; @@ -1227,7 +1213,6 @@ public bool InfiniteImpermanenceActivate() { if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) { - CheckDeactiveFlag(); AI.SelectCard(card); return true; } @@ -1244,7 +1229,7 @@ public bool CalledbytheGraveActivate() // negate if (Util.GetLastChainCard().IsMonster()) { - int code = Util.GetLastChainCard().Id; + int code = Util.GetLastChainCard().GetOriginCode(); if (code == 0) return false; if (CheckCalledbytheGrave(code) > 0) return false; if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) @@ -1255,15 +1240,15 @@ public bool CalledbytheGraveActivate() { return false; } - if (Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)) != null) + ClientCard targetCard = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)); + if (targetCard != null) { if (!(Card.Location == CardLocation.SpellZone)) { SelectSTPlace(null, true); } - AI.SelectCard(code); - calledbytheGraveCount[code] = 2; - CheckDeactiveFlag(); + AI.SelectCard(targetCard); + currentNegatingIdList.Add(code); return true; } } @@ -1275,7 +1260,7 @@ public bool CalledbytheGraveActivate() { int code = cards.Id; AI.SelectCard(cards); - calledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); return true; } } @@ -1290,7 +1275,7 @@ public bool CalledbytheGraveActivate() enemyMonsters.Reverse(); int code = enemyMonsters[0].Id; AI.SelectCard(code); - calledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); return true; } } @@ -1300,13 +1285,13 @@ public bool CalledbytheGraveActivate() if (Duel.LastChainPlayer == 1) return false; List targets = CheckDangerousCardinEnemyGrave(true); if (targets.Count() > 0) { - int code = targets[0].Id; + int code = targets[0].GetOriginCode(); if (!(Card.Location == CardLocation.SpellZone)) { SelectSTPlace(null, true); } - AI.SelectCard(code); - calledbytheGraveCount[code] = 2; + AI.SelectCard(targets); + currentNegatingIdList.Add(code); return true; } diff --git a/Game/AI/Decks/FrogExecutor.cs b/Game/AI/Decks/FrogExecutor.cs index bae73e3ca..f44306eff 100644 --- a/Game/AI/Decks/FrogExecutor.cs +++ b/Game/AI/Decks/FrogExecutor.cs @@ -135,6 +135,7 @@ private bool FlipFlopFrog() private bool Ronintoadin() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; List monsters = Bot.GetGraveyardMonsters(); if (monsters.Count > 2) { diff --git a/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs b/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs index fb08d0d5e..c3be27557 100644 --- a/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs +++ b/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs @@ -128,6 +128,7 @@ public override void OnNewTurn() { eater_eff = false; CardOfDemiseeff_used = false; + base.OnNewTurn(); } public override void OnNewPhase() @@ -436,7 +437,7 @@ private bool ThunderKingRaiOhsummon() } private bool ThunderKingRaiOheff() - { + { if (DefaultOnlyHorusSpSummoning()) return false; if(Duel.SummoningCards.Count > 0) { @@ -548,7 +549,7 @@ private bool EaterOfMillionssp() { targets.Add(s_c); if (targets.Count >= 5) - { + { AI.SelectMaterials(targets, HintMsg.Remove); return true; } @@ -571,6 +572,7 @@ private bool WakingTheDragoneff() private bool MetalSnakesp() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (ActivateDescription == Util.GetStringId(CardId.MetalSnake, 0) && !Bot.HasInMonstersZone(CardId.MetalSnake)) { if(Duel.Player == 1 && Duel.Phase >= DuelPhase.BattleStart ) diff --git a/Game/AI/Decks/KashtiraExecutor.cs b/Game/AI/Decks/KashtiraExecutor.cs index 3b823110b..32db52116 100644 --- a/Game/AI/Decks/KashtiraExecutor.cs +++ b/Game/AI/Decks/KashtiraExecutor.cs @@ -175,6 +175,7 @@ public override void OnNewTurn() opt_2 = false; if (flag >= 0) ++flag; if (flag >= 2) { flag = -1; activate_DimensionShifter = false; } + base.OnNewTurn(); } public override bool OnSelectYesNo(int desc) { diff --git a/Game/AI/Decks/LabrynthExecutor.cs b/Game/AI/Decks/LabrynthExecutor.cs index 96e1e9f52..25423a5cd 100644 --- a/Game/AI/Decks/LabrynthExecutor.cs +++ b/Game/AI/Decks/LabrynthExecutor.cs @@ -179,7 +179,6 @@ public LabrynthExecutor(GameAI ai, Duel duel) }; List notToDestroySpellTrap = new List { 50005218, 6767771 }; - Dictionary calledbytheGraveCount = new Dictionary(); bool enemyActivateMaxxC = false; List infiniteImpermanenceList = new List(); bool summoned = false; @@ -455,11 +454,8 @@ public bool CheckCanDirectAttack() /// public int CheckCalledbytheGrave(int id) { - if (!calledbytheGraveCount.ContainsKey(id)) - { - return 0; - } - return calledbytheGraveCount[id]; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; } public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) @@ -1593,7 +1589,6 @@ public override void OnNewTurn() { if (Duel.Turn <= 1) { - calledbytheGraveCount.Clear(); dimensionShifterCount = 0; enemySpSummonFromExLastTurn = 0; @@ -1605,11 +1600,6 @@ public override void OnNewTurn() enemySpSummonFromExThisTurn = 0; rollbackCopyCardId = 0; - List keyList = calledbytheGraveCount.Keys.ToList(); - foreach (int dic in keyList) - { - if (calledbytheGraveCount[dic] > 1) calledbytheGraveCount[dic] -= 1; - } if (dimensionShifterCount > 0) dimensionShifterCount--; if (banSpSummonExceptFiendCount > 0) banSpSummonExceptFiendCount--; infiniteImpermanenceList.Clear(); @@ -1622,6 +1612,7 @@ public override void OnNewTurn() enemySetThisTurn.Clear(); dimensionalBarrierAnnouced.Clear(); summonInChainList.Clear(); + base.OnNewTurn(); } public override void OnChaining(int player, ClientCard card) @@ -1742,14 +1733,6 @@ public override void OnMove(ClientCard card, int previousControler, int previous summonThisTurn.Add(card); if (currentSolvingChain != null) summonInChainList.Add(card); } - if (previousLocation == (int)CardLocation.Grave && currentLocation == (int)CardLocation.Removed) - { - if (currentSolvingChain != null && currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.CalledByTheGrave)) - { - Logger.DebugWriteLine("*** " + (card.Name ?? "UnknowCard") + " is banished by CallByTheGrave"); - calledbytheGraveCount[card.Id] = 2; - } - } } } diff --git a/Game/AI/Decks/Level8Executor.cs b/Game/AI/Decks/Level8Executor.cs index 75800b853..10efebdaf 100644 --- a/Game/AI/Decks/Level8Executor.cs +++ b/Game/AI/Decks/Level8Executor.cs @@ -217,11 +217,12 @@ public override void OnNewTurn() JetSynchronUsed = false; ScrapWyvernUsed = false; MaskedChameleonUsed = false; + base.OnNewTurn(); } public override void OnChainEnd() { - + base.OnChainEnd(); } public override CardPosition OnSelectPosition(int cardId, IList positions) diff --git a/Game/AI/Decks/LightswornShaddoldinosourExecutor.cs b/Game/AI/Decks/LightswornShaddoldinosourExecutor.cs index 4e6d7b320..b00f101e6 100644 --- a/Game/AI/Decks/LightswornShaddoldinosourExecutor.cs +++ b/Game/AI/Decks/LightswornShaddoldinosourExecutor.cs @@ -274,6 +274,7 @@ public override void OnNewTurn() ShaddollSquamata_used = false; ShaddollDragon_used = false; ShaddollHedgehog_used = false; + base.OnNewTurn(); } private bool Luminasummon() @@ -290,6 +291,7 @@ private bool Luminasummon() } private bool Luminaeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInGraveyard(CardId.Raiden)) { AI.SelectCard(Useless_List()); @@ -555,6 +557,7 @@ private bool SouleatingOviraptoreff() private bool GlowUpBulbeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; IList check = Bot.GetMonstersInExtraZone(); foreach (ClientCard monster in check) if (monster.HasType(CardType.Fusion)) return false; @@ -627,6 +630,7 @@ private bool PotofAvariceeff() private bool MaxxC() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } @@ -977,6 +981,7 @@ private bool FoolishBurialEffect() public bool Hand_act_eff() { //if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.IsCode(CardId.GhostOgre) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GhostOgre)) return false; return (Duel.LastChainPlayer == 1); } @@ -998,6 +1003,7 @@ private bool Michaeleff() if (Card.Location == CardLocation.Grave) return true; if (Bot.LifePoints <= 1000) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; ClientCard select = Util.GetBestEnemyCard(); if (select == null) return false; if(select!=null) diff --git a/Game/AI/Decks/LuckyExecutor.cs b/Game/AI/Decks/LuckyExecutor.cs index 452b27d10..245790a6f 100644 --- a/Game/AI/Decks/LuckyExecutor.cs +++ b/Game/AI/Decks/LuckyExecutor.cs @@ -219,11 +219,13 @@ public override CardPosition OnSelectPosition(int cardId, IList po private bool ImFeelingLucky() { + if (Type == ExecutorType.Activate && DefaultCheckWhetherCardIsNegated(Card)) return false; return Program.Rand.Next(10) >= 5 && DefaultDontChainMyself(); } private bool ImFeelingUnlucky() { + if (Type == ExecutorType.Activate && DefaultCheckWhetherCardIsNegated(Card)) return false; return DefaultDontChainMyself(); } diff --git a/Game/AI/Decks/OrcustExecutor.cs b/Game/AI/Decks/OrcustExecutor.cs index b85214705..e202dd8a9 100644 --- a/Game/AI/Decks/OrcustExecutor.cs +++ b/Game/AI/Decks/OrcustExecutor.cs @@ -214,11 +214,13 @@ public override void OnNewTurn() CymbalSkeletonUsed = false; BorrelswordDragonUsed = false; RustyBardicheTarget = null; + base.OnNewTurn(); } public override void OnChainEnd() { RustyBardicheTarget = null; + base.OnChainEnd(); } public override CardPosition OnSelectPosition(int cardId, IList positions) @@ -465,6 +467,7 @@ private bool JetSynchronSummon() private bool JetSynchronEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(HandCosts); return true; } @@ -488,6 +491,7 @@ private bool AlmirajSummon() private bool DestrudoSummon() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Bot.GetMonsterCount() < 3 && Bot.HasInExtra(new[] { CardId.CrystronNeedlefiber, CardId.KnightmarePhoenix }); } @@ -659,6 +663,7 @@ private bool KnightmarePhoenixSummon() private bool KnightmarePhoenixEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int costcount = Bot.Hand.GetMatchingCardsCount(card => card.IsCode(HandCosts)); ClientCard target = Enemy.SpellZone.GetFloodgate(); ClientCard anytarget = Enemy.SpellZone.GetFirstMatchingCard(card => !card.OwnTargets.Any(cont => cont.IsCode(CardId.TrickstarLightStage))); @@ -685,6 +690,7 @@ private bool KnightmareMermaidSummon() private bool KnightmareMermaidEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(HandCosts); return true; } @@ -703,6 +709,7 @@ private bool GalateaSummonFirst() private bool OrcustKnightmareEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (!Bot.HasInGraveyard(CardId.OrcustHarpHorror)) { AI.SelectCard(Util.GetBestBotMonster()); @@ -726,6 +733,7 @@ private bool OrcustKnightmareEffect() private bool HarpHorrorEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; HarpHorrorUsed = true; AI.SelectCard(CardId.OrcustCymbalSkeleton); return true; @@ -733,6 +741,7 @@ private bool HarpHorrorEffect() private bool WorldWandEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(CardId.OrcustCymbalSkeleton); return true; } @@ -783,6 +792,7 @@ private ClientCard GetFogBladeTarget() private bool CymbalSkeletonEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int[] botTurnTargets = new[] { CardId.GalateaTheOrcustAutomaton, CardId.SheorcustDingirsu }; int[] emenyTurnTargets = new[] { CardId.SheorcustDingirsu, CardId.GalateaTheOrcustAutomaton }; if (Duel.Player == 0 && Bot.HasInGraveyard(CardId.GalateaTheOrcustAutomaton) && !Bot.HasInMonstersZone(CardId.GalateaTheOrcustAutomaton) && Bot.HasInExtra(CardId.SheorcustDingirsu) && !SheorcustDingirsuSummoned) @@ -867,6 +877,7 @@ private bool SheorcustDingirsuEffect() private bool AncientCloakEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInMonstersZone(CardId.SalamangreatAlmiraj) && Bot.HasInExtra(CardId.KnightmarePhoenix)) AI.SelectCard(CardId.ThePhantomKnightsofShadeBrigandine); else @@ -881,6 +892,7 @@ private bool SilentBootsSummon() private bool SilentBootsEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInMonstersZone(CardId.SalamangreatAlmiraj) && Bot.HasInExtra(CardId.KnightmarePhoenix)) AI.SelectCard(CardId.ThePhantomKnightsofShadeBrigandine); else @@ -1033,6 +1045,7 @@ private bool BabelEffect() { if (Card.Location == CardLocation.Grave) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; IList costCards = Bot.Hand.GetMatchingCards(card => card.IsCode(HandCosts)); if (costCards.Count > 0) { @@ -1113,6 +1126,7 @@ private bool FogBladeEffect() } else if (Bot.HasInGraveyard(CardId.ThePhantomKnightsofRustyBardiche) || Bot.GetMonsterCount() < 2) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(CardId.ThePhantomKnightsofRustyBardiche); return true; } diff --git a/Game/AI/Decks/PureWindsExecutor.cs b/Game/AI/Decks/PureWindsExecutor.cs index a6c4f3284..bfce9e924 100644 --- a/Game/AI/Decks/PureWindsExecutor.cs +++ b/Game/AI/Decks/PureWindsExecutor.cs @@ -555,6 +555,7 @@ private bool DaigustoGulldoseff() } private bool SpeedroidTaketomborgeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if ((Bot.GetRemainingCount(CardId.SpeedroidRedEyedDice, 1) >= 1) && Bot.HasInMonstersZone(CardId.SpeedroidTerrortop)) { diff --git a/Game/AI/Decks/QliphortExecutor.cs b/Game/AI/Decks/QliphortExecutor.cs index 5b12750fe..483d2dc1a 100644 --- a/Game/AI/Decks/QliphortExecutor.cs +++ b/Game/AI/Decks/QliphortExecutor.cs @@ -130,6 +130,7 @@ public override bool OnSelectHand() public override void OnNewTurn() { CardOfDemiseUsed = false; + base.OnNewTurn(); } public override IList OnSelectPendulumSummon(IList cards, int max) @@ -281,6 +282,7 @@ private bool ScoutEffect() { if (Card.Location == CardLocation.Hand) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int count = 0; int handcount = 0; int fieldcount = 0; diff --git a/Game/AI/Decks/RainbowExecutor.cs b/Game/AI/Decks/RainbowExecutor.cs index c98c71df4..03de70b47 100644 --- a/Game/AI/Decks/RainbowExecutor.cs +++ b/Game/AI/Decks/RainbowExecutor.cs @@ -142,6 +142,7 @@ public RainbowExecutor(GameAI ai, Duel duel) public override void OnNewTurn() { NormalSummoned = false; + base.OnNewTurn(); } public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) @@ -210,6 +211,7 @@ private bool UnexpectedDaiEffect() private bool RescueRabbitSummon() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Util.GetBotAvailZonesFromExtraDeck() > 0 || !Enemy.MonsterZone.IsExistingMatchingCard(card => card.GetDefensePower() >= 1900) || Enemy.MonsterZone.GetMatchingCardsCount(card => card.GetDefensePower() < 1900) > Bot.MonsterZone.GetMatchingCardsCount(card => card.Attack >= 1900); diff --git a/Game/AI/Decks/Rank5Executor.cs b/Game/AI/Decks/Rank5Executor.cs index 9cb45c923..ce5e736f2 100644 --- a/Game/AI/Decks/Rank5Executor.cs +++ b/Game/AI/Decks/Rank5Executor.cs @@ -116,6 +116,7 @@ public override void OnNewTurn() DoubleSummonUsed = false; CyberDragonInfinitySummoned = false; Number61VolcasaurusUsed = false; + base.OnNewTurn(); } public override IList OnSelectXyzMaterial(IList cards, int min, int max) diff --git a/Game/AI/Decks/ST1732Executor.cs b/Game/AI/Decks/ST1732Executor.cs index 0984be63b..92e052d2e 100644 --- a/Game/AI/Decks/ST1732Executor.cs +++ b/Game/AI/Decks/ST1732Executor.cs @@ -153,6 +153,7 @@ public override void OnNewTurn() { // reset BalancerLordUsed = false; + base.OnNewTurn(); } public override int OnSelectOption(IList options) diff --git a/Game/AI/Decks/SalamangreatExecutor.cs b/Game/AI/Decks/SalamangreatExecutor.cs index ed0049542..0d5319979 100644 --- a/Game/AI/Decks/SalamangreatExecutor.cs +++ b/Game/AI/Decks/SalamangreatExecutor.cs @@ -594,6 +594,7 @@ private bool Foxy_activate() } else { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInHand(CardId.Spinny) || FalcoToGY(false)) { if (Bot.HasInHand(CardId.Spinny) && !Bot.HasInGraveyard(CardId.Spinny)) @@ -779,10 +780,12 @@ private bool Rage_activate() public bool G_activate() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return (Duel.Player == 1); } public bool Hand_act_eff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return (Duel.LastChainPlayer == 1); } diff --git a/Game/AI/Decks/SkyStrikerExecutor.cs b/Game/AI/Decks/SkyStrikerExecutor.cs index 51e1688f7..7860349d8 100644 --- a/Game/AI/Decks/SkyStrikerExecutor.cs +++ b/Game/AI/Decks/SkyStrikerExecutor.cs @@ -146,6 +146,7 @@ public override void OnNewTurn() ShizukuSummoned = false; HayateSummoned = false; WidowAnchorTarget = null; + base.OnNewTurn(); } public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) @@ -194,6 +195,7 @@ public override bool OnSelectYesNo(int desc) private bool MaxxCEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } @@ -667,6 +669,7 @@ private bool SummonSorceressEffect() private bool JetSynchronEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInMonstersZone(CardId.Raye) || Bot.HasInMonstersZone(CardId.CrystronNeedlefiber)) { AI.SelectCard(GetDiscardHand()); diff --git a/Game/AI/Decks/SuperheavySamuraiExecutor.cs b/Game/AI/Decks/SuperheavySamuraiExecutor.cs index 4ef2f73a7..5e9c67438 100644 --- a/Game/AI/Decks/SuperheavySamuraiExecutor.cs +++ b/Game/AI/Decks/SuperheavySamuraiExecutor.cs @@ -1,4 +1,4 @@ -using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper; using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using System.Linq; @@ -17,7 +17,7 @@ public class CardId public const int Wagon = 34496660;//大八 public const int Soulpiercer = 90361010;//岩融 public const int Wakaushi = 82112494;//牛若 - public const int Scales = 78391364;//天秤 + public const int Scales = 78391364;//天秤 public const int Booster = 56727340;//地铠 public const int Motorbike = 83334932;//摩托 public const int Soulhorns = 14624296;//双角 @@ -60,12 +60,11 @@ public class CardId private bool activate_Wagon = false;//大巴 private bool activate_Booster = false;//地铠 private bool activate_Soulpeacemaker = false;//仲裁 - private bool activate_Benkei = false;//弁庆 - private bool need_Gear = false;//齿轮齿巨人 + private bool activate_Benkei = false;//弁庆 + private bool need_Gear = false;//齿轮齿巨人 //案山子 - private bool activate_Scarecrow=false; - private bool summon_Scarecrow=false; - private bool summon_Scarecrow2=true; + private bool activate_Scarecrow = false; + private bool summon_Scarecrow = false; private bool activate_Sarutobi = false;//猿飞 private bool activate_Genius = false;//路径灵 //淘气精灵 @@ -81,112 +80,107 @@ public SuperheavySamuraiExecutor(GameAI ai, Duel duel) : base(ai, duel) { AddExecutor(ExecutorType.Activate, CardId.PSYFramelordOmega); - AddExecutor(ExecutorType.Activate, CardId.IP,IPFunction); - AddExecutor(ExecutorType.Activate, CardId.Sarutobi,SarutobiFunction); - AddExecutor(ExecutorType.Activate, CardId.Unicorn,UnicornFunction); - AddExecutor(ExecutorType.Activate, CardId.MaxxG,MaxxCFunction); - AddExecutor(ExecutorType.Activate, CardId.JoyousSpring,DefaultAshBlossomAndJoyousSpring); - AddExecutor(ExecutorType.Activate, CardId.SnowRabbit,DefaultGhostOgreAndSnowRabbit); - AddExecutor(ExecutorType.Activate, CardId.EffectVeiler,DefaultBreakthroughSkill); - AddExecutor(ExecutorType.Activate, CardId.LockBird,LockBirdFunction); - AddExecutor(ExecutorType.Activate, CardId.PsyFramegearGamma,FunctionInHand); - AddExecutor(ExecutorType.Activate, CardId.HauntedMansion,FunctionInHand); - AddExecutor(ExecutorType.Activate, CardId.Masurawo,MasurawoFunction); - AddExecutor(ExecutorType.Activate, CardId.Genius,GeniusFunction); - - //Motorbike's Effect - AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); - - //Scales's Effect + AddExecutor(ExecutorType.Activate, CardId.IP, IPFunction); + AddExecutor(ExecutorType.Activate, CardId.Sarutobi, SarutobiFunction); + AddExecutor(ExecutorType.Activate, CardId.Unicorn, UnicornFunction); + AddExecutor(ExecutorType.Activate, CardId.MaxxG, MaxxCFunction); + AddExecutor(ExecutorType.Activate, CardId.JoyousSpring, DefaultAshBlossomAndJoyousSpring); + AddExecutor(ExecutorType.Activate, CardId.SnowRabbit, DefaultGhostOgreAndSnowRabbit); + AddExecutor(ExecutorType.Activate, CardId.EffectVeiler, DefaultBreakthroughSkill); + AddExecutor(ExecutorType.Activate, CardId.LockBird, LockBirdFunction); + AddExecutor(ExecutorType.Activate, CardId.PsyFramegearGamma, FunctionInHand); + AddExecutor(ExecutorType.Activate, CardId.HauntedMansion, FunctionInHand); + AddExecutor(ExecutorType.Activate, CardId.Masurawo, MasurawoFunction); + AddExecutor(ExecutorType.Activate, CardId.Genius, GeniusFunction); + + //Motorbike's Effect + AddExecutor(ExecutorType.Activate, CardId.Motorbike, MotorbikeFunction); + + //Scales's Effect AddExecutor(ExecutorType.SpSummon, CardId.Scales); - AddExecutor(ExecutorType.Activate, CardId.Scales,ScalesFunction); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction2); - AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction2); - - //Pendulum - AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiFunction); - AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiEffectFunction); - AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiFunction); - AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiEffectFunction); - - //Normal Summon & Effect - AddExecutor(ExecutorType.Summon, CardId.Soulpiercer,NormalSummonFunction); - AddExecutor(ExecutorType.Activate, CardId.Soulpiercer,SoulpiercerFunction); - - AddExecutor(ExecutorType.Summon, CardId.Wagon,NormalSummonFunction); - AddExecutor(ExecutorType.Activate, CardId.Wagon,WagonFunction); - AddExecutor(ExecutorType.Activate, CardId.Wagon,WagonFunction); - - AddExecutor(ExecutorType.Summon, CardId.Booster,BoosterNormalSummonFunction); - AddExecutor(ExecutorType.Summon, CardId.Scales,ScalesNormalSummonFunction); - - //boost & Gear - AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction); - AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); - AddExecutor(ExecutorType.SpSummon, CardId.GearGigant,GearGigantXyzFunction); - AddExecutor(ExecutorType.Activate, CardId.GearGigant,GearGigantFunction); - - //equip Soulpiercer - AddExecutor(ExecutorType.Activate, CardId.Soulpiercer,SoulpiercerEquipFunction); - - //Link Scarecrow - AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction); - AddExecutor(ExecutorType.Activate, CardId.Scarecrow,ScarecrowFunction); - AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction2); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction); - - //Effect After Synchron - AddExecutor(ExecutorType.Activate, CardId.SavageDragon,SavageDragonFunction); - AddExecutor(ExecutorType.Activate, CardId.ASStardustDragon,ASStardustDragonFunction); - - //Wakaushi's Effect After Synchron - AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiReturnPFunction); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction); - AddExecutor(ExecutorType.Activate, CardId.Fleur,FleurFunction); - - //equip Soulpeacemaker - AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker,SoulpeacemakerEquipFunction); - AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker,SoulpeacemakerFunction); - - //Link - AddExecutor(ExecutorType.SpSummon, CardId.Genius,GeniusLinkFunction); - - AddExecutor(ExecutorType.SpSummon, Psummon); - - //Link - AddExecutor(ExecutorType.SpSummon, CardId.Elf,ElfLinkFunction); - AddExecutor(ExecutorType.Activate, CardId.Elf,ElfFunction); + AddExecutor(ExecutorType.Activate, CardId.Scales, ScalesFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon, ASStardustDragonSynchronFunction2); + AddExecutor(ExecutorType.SpSummon, CardId.Fleur, FleurSynchronFunction2); - AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); + AddExecutor(ExecutorType.Activate, CardId.Wakaushi, WakaushiFunction); + AddExecutor(ExecutorType.Activate, CardId.Wakaushi, WakaushiEffectFunction); + AddExecutor(ExecutorType.Activate, CardId.Benkei, BenkeiEffectFunction); + + //Normal Summon & Effect + AddExecutor(ExecutorType.Summon, CardId.Soulpiercer, NormalSummonFunction); + AddExecutor(ExecutorType.Activate, CardId.Soulpiercer, SoulpiercerFunction); - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.SavageDragon,SavageDragonSynchronFunction); + AddExecutor(ExecutorType.Summon, CardId.Wagon, NormalSummonFunction); + AddExecutor(ExecutorType.Activate, CardId.Wagon, WagonFunction); + AddExecutor(ExecutorType.Activate, CardId.Wagon, WagonFunction); - //Link - AddExecutor(ExecutorType.SpSummon, CardId.IP,IPLinkFunction); + AddExecutor(ExecutorType.Summon, CardId.Booster, BoosterNormalSummonFunction); + AddExecutor(ExecutorType.Summon, CardId.Scales, ScalesNormalSummonFunction); + + //boost & Gear + AddExecutor(ExecutorType.Activate, CardId.Booster, BoosterEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Booster, BoosterFunction); + AddExecutor(ExecutorType.SpSummon, CardId.GearGigant, GearGigantXyzFunction); + AddExecutor(ExecutorType.Activate, CardId.GearGigant, GearGigantFunction); + + //equip Soulpiercer + AddExecutor(ExecutorType.Activate, CardId.Soulpiercer, SoulpiercerEquipFunction); + + //Link Scarecrow + AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow, ScarecrowLinkFunction); + AddExecutor(ExecutorType.Activate, CardId.Scarecrow, ScarecrowFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon, ASStardustDragonSynchronFunction); + + //Effect After Synchron + AddExecutor(ExecutorType.Activate, CardId.SavageDragon, SavageDragonFunction); + AddExecutor(ExecutorType.Activate, CardId.ASStardustDragon, ASStardustDragonFunction); + + //Wakaushi's Effect After Synchron + AddExecutor(ExecutorType.Activate, CardId.Wakaushi, WakaushiReturnPFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.Fleur, FleurSynchronFunction); + AddExecutor(ExecutorType.Activate, CardId.Fleur, FleurFunction); + + //equip Soulpeacemaker + AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker, SoulpeacemakerEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker, SoulpeacemakerFunction); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.Genius, GeniusLinkFunction); - //Regulus's Effect - AddExecutor(ExecutorType.Activate, CardId.Regulus,RegulusFunction); + AddExecutor(ExecutorType.SpSummon, Psummon); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.Elf, ElfLinkFunction); + AddExecutor(ExecutorType.Activate, CardId.Elf, ElfFunction); - //booster - AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction2); - AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); - AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction3); - AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.Masurawo,MasurawoSynchronFunction); - AddExecutor(ExecutorType.SpSummon, CardId.Sarutobi,DeSynchronFunction); - AddExecutor(ExecutorType.SpSummon, CardId.PSYFramelordOmega); - - //equip Soulhorns - AddExecutor(ExecutorType.Activate, CardId.Soulhorns,SoulhornsEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Motorbike, MotorbikeFunction); + + //Regulus's Effect + AddExecutor(ExecutorType.Activate, CardId.Regulus, RegulusFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.SavageDragon, SavageDragonSynchronFunction); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.IP, IPLinkFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.Masurawo, MasurawoSynchronFunction); + AddExecutor(ExecutorType.SpSummon, CardId.Sarutobi, DeSynchronFunction); + AddExecutor(ExecutorType.SpSummon, CardId.PSYFramelordOmega); + + //equip Soulhorns + AddExecutor(ExecutorType.Activate, CardId.Soulhorns, SoulhornsEquipFunction); + + //booster + AddExecutor(ExecutorType.Activate, CardId.Booster, BoosterEquipFunction2); + AddExecutor(ExecutorType.Activate, CardId.Booster, BoosterFunction); } public override void OnNewTurn() @@ -202,9 +196,8 @@ public override void OnNewTurn() activate_Soulpeacemaker = false; activate_Benkei = false; need_Gear = false; - activate_Scarecrow=false; - summon_Scarecrow=false; - summon_Scarecrow2=true; + activate_Scarecrow = false; + summon_Scarecrow = false; activate_Elf = false; summon_Elf = false; activate_MaxxG = false; @@ -213,6 +206,7 @@ public override void OnNewTurn() activate_Genius = false; activate_Sarutobi = false; to_deck = false; + base.OnNewTurn(); } public override bool OnSelectHand() { @@ -224,8 +218,8 @@ public override int OnSelectPlace(int cardId, int player, CardLocation location, { if (cardId == CardId.Scarecrow) { - int a=(Zones.z6 & available); - int b=(Zones.z5 & available); + int a = (Zones.z6 & available); + int b = (Zones.z5 & available); if (Bot.MonsterZone[2] != null && Bot.MonsterZone[2].Controller == 0 && !FinalCards(Bot.MonsterZone[2].Id)) a = 0; else if (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id)) @@ -240,8 +234,8 @@ public override int OnSelectPlace(int cardId, int player, CardLocation location, } else if (cardId == CardId.Genius) { - int a=(Zones.z6 & available); - int b=(Zones.z5 & available); + int a = (Zones.z6 & available); + int b = (Zones.z5 & available); if (Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) a = 0; else if (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id)) @@ -272,7 +266,7 @@ public override IList OnSelectCard(IList cards, int min, { List result = new List(); List scards = cards.Where(card => card != null && card.HasSetcode(0x9a) && card.Level == 4).ToList(); - if (scards.Count <2) scards = cards.Where(card => card != null && card.HasSetcode(0x9a)).ToList(); + if (scards.Count < 2) scards = cards.Where(card => card != null && card.HasSetcode(0x9a)).ToList(); p_summoning = false; if (scards.Count > 0) return Util.CheckSelectCount(result, scards, 1, 1); else if (min == 0) return result; // empty @@ -293,8 +287,8 @@ private List GetZoneCards(CardLocation loc, ClientField player) } private bool FinalCards(int cname) { - int[] cardsname = new[] {CardId.Masurawo,CardId.Fleur,CardId.SavageDragon,CardId.Sarutobi,CardId.Regulus,CardId.IP}; - foreach(var cardname in cardsname) + int[] cardsname = new[] { CardId.Masurawo, CardId.Fleur, CardId.SavageDragon, CardId.Sarutobi, CardId.Regulus, CardId.IP }; + foreach (var cardname in cardsname) { if (cname == cardname) return true; } @@ -302,10 +296,10 @@ private bool FinalCards(int cname) } private bool TurnerCards(int cname) { - int[] cardsname =new[] {CardId.PsyFramegearGamma,CardId.Wakaushi,CardId.Motorbike}; - foreach(var cardname in cardsname) - { - if (cname == cardname) return true; + int[] cardsname = new[] { CardId.PsyFramegearGamma, CardId.Wakaushi, CardId.Motorbike }; + foreach (var cardname in cardsname) + { + if (cname == cardname) return true; } return false; } @@ -327,10 +321,12 @@ private bool MaxxCFunction() } private bool FunctionInHand() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.LastChainPlayer == 1; } private bool LockBirdFunction() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Player == 0 || activate_LockBird) { return false; @@ -342,17 +338,13 @@ private bool MotorbikeFunction() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int targetid = -1; - List cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup()).ToList(); if (!(Bot.HasInHand(CardId.Wakaushi) || Bot.HasInMonstersZone(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) { targetid = CardId.Wakaushi; } - else if (cards.Count() == 0 && !normal_summon) - { - targetid = CardId.Soulpiercer; - } - else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker) && !activate_Soulpeacemaker && (normal_summon || Bot.HasInMonstersZone(CardId.Scarecrow))) + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker && !normal_summon) { targetid = CardId.Soulpeacemaker; } @@ -411,7 +403,7 @@ private bool WagonFunction() if (ActivateDescription == Util.GetStringId(CardId.Wagon, 1)) { int targetid = -1; - if (!(Bot.HasInHand(CardId.Soulpiercer)||Bot.HasInMonstersZone(CardId.Soulpiercer))) + if (!(Bot.HasInHand(CardId.Soulpiercer) || Bot.HasInMonstersZone(CardId.Soulpiercer))) { targetid = CardId.Soulpiercer; } @@ -470,7 +462,7 @@ private bool SoulpiercerFunction() { targetid = CardId.Soulhorns; } - else {targetid = CardId.Wakaushi;} + else { targetid = CardId.Wakaushi; } if (targetid > 0) AI.SelectCard(targetid); return true; } @@ -478,7 +470,7 @@ private bool SoulpiercerFunction() } private bool WakaushiFunction() { - if (Card.Location != CardLocation.Hand||Bot.HasInMonstersZone(CardId.Wakaushi)) + if (Card.Location != CardLocation.Hand || Bot.HasInMonstersZone(CardId.Wakaushi)) return false; ClientCard l = Util.GetPZone(0, 0); ClientCard r = Util.GetPZone(0, 1); @@ -500,21 +492,12 @@ private bool WakaushiEffectFunction() } return false; } - private bool BenkeiFunction() - { - if (Card.Location != CardLocation.Hand || Bot.HasInSpellZone(CardId.Benkei)) return false; - List cards1 = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.Id == CardId.Benkei).ToList(); - List cards2 = GetZoneCards(CardLocation.Removed, Bot).Where(card => card != null && card.Id == CardId.Benkei).ToList(); - if (cards1.Count() >= 2 || Bot.HasInGraveyard(CardId.Benkei) || Bot.HasInExtra(CardId.Benkei) || cards2.Count() > 0) - return true; - return false; - } private bool BenkeiEffectFunction() { if (Card.Location == CardLocation.SpellZone) { int targetid = -1; - if (!(Bot.HasInHand(CardId.Soulpiercer) || Bot.HasInMonstersZone(CardId.Soulpiercer) || Bot.HasInSpellZone(CardId.Soulpiercer)) && !(Bot.HasInMonstersZone(CardId.Scarecrow) && !activate_Soulpeacemaker)) + if (!(Bot.HasInHand(CardId.Soulpiercer) || Bot.HasInMonstersZone(CardId.Soulpiercer))) { targetid = CardId.Soulpiercer; } @@ -534,7 +517,7 @@ private bool BenkeiEffectFunction() } private bool WakaushiReturnPFunction() { - if (Card.Location == CardLocation.Extra||Card.Location == CardLocation.Removed) + if (Card.Location == CardLocation.Extra || Card.Location == CardLocation.Removed) { ClientCard l = Util.GetPZone(0, 0); ClientCard r = Util.GetPZone(0, 1); @@ -575,7 +558,7 @@ private bool MasurawoSynchronFunction() bool chk = true; if (Bot.HasInMonstersZone(CardId.ASStardustDragon) || Bot.HasInMonstersZone(CardId.Benkei)) chk = false; - var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,12,1,1,false,chk,null, + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, 12, 1, 1, false, chk, null, card => { return !FinalCards(card.Id); }); if (materials_lists.Count <= 0) return false; AI.SelectMaterials(materials_lists[0]); @@ -587,7 +570,7 @@ private bool FleurSynchronFunction() bool chk = true; if (Bot.HasInMonstersZone(CardId.Motorbike) && (Bot.HasInMonstersZone(CardId.ASStardustDragon) || Bot.HasInMonstersZone(CardId.Benkei))) chk = false; - var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,10,1,1,false,chk,null, + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, 10, 1, 1, false, chk, null, card => { return !FinalCards(card.Id); }); if (materials_lists.Count <= 0) return false; AI.SelectMaterials(materials_lists[0]); @@ -595,7 +578,7 @@ private bool FleurSynchronFunction() } private bool FleurSynchronFunction2() { - var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,10,1,1,false,false,null, + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, 10, 1, 1, false, false, null, card => { return !FinalCards(card.Id); }); if (materials_lists.Count <= 0) return false; AI.SelectMaterials(materials_lists[0]); @@ -653,7 +636,7 @@ private bool SavageDragonFunction() } private bool ASStardustDragonFunction() { - if (Duel.LastChainPlayer == 1 && ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 1)) + if (Duel.LastChainPlayer == 1 && ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 0)) { return true; } @@ -680,9 +663,10 @@ private bool ScarecrowLinkFunction() { List material = new List(); List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); - if ((cards.Count() > 0 && !summon_Scarecrow) || summon_Scarecrow || activate_Scarecrow) return false; + if (cards.Count > 0 || summon_Scarecrow || activate_Scarecrow) return false; int targetid = -1; - if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null) { + if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null) + { if (Bot.MonsterZone[0].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[0]); else if (Bot.MonsterZone[2].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[2]); else if (!FinalCards(Bot.MonsterZone[0].Id) && Bot.MonsterZone[0].HasSetcode(0x9a)) material.Add(Bot.MonsterZone[0]); @@ -698,13 +682,13 @@ private bool ScarecrowLinkFunction() } if (material.Count > 0) AI.SelectMaterials(material); else if (targetid > 0) AI.SelectMaterials(targetid); - summon_Scarecrow=true; + summon_Scarecrow = true; return (Bot.HasInGraveyard(new[] { CardId.Soulpiercer, CardId.Wakaushi, CardId.Benkei, CardId.Wagon, - })||Bot.HasInMonstersZone(new[] { + }) || Bot.HasInMonstersZone(new[] { CardId.Soulpiercer, CardId.Wagon, CardId.Wakaushi, @@ -721,80 +705,78 @@ private bool ScarecrowFunction() { int tributeId = -1; if (Bot.HasInHand(CardId.PsyFrameDriver)) - {tributeId = CardId.PsyFrameDriver;} + { tributeId = CardId.PsyFrameDriver; } else if (Bot.HasInHand(CardId.PsyFramegearGamma)) - {tributeId = CardId.PsyFramegearGamma;} + { tributeId = CardId.PsyFramegearGamma; } else if (Bot.HasInHand(CardId.Benkei)) - {tributeId = CardId.Benkei;} + { tributeId = CardId.Benkei; } else if (Bot.HasInHand(CardId.HauntedMansion)) - {tributeId = CardId.HauntedMansion;} + { tributeId = CardId.HauntedMansion; } else if (Bot.HasInHand(CardId.EffectVeiler)) - {tributeId = CardId.EffectVeiler;} + { tributeId = CardId.EffectVeiler; } else if (Bot.HasInHand(CardId.SnowRabbit)) - {tributeId = CardId.SnowRabbit;} + { tributeId = CardId.SnowRabbit; } else if (Bot.HasInHand(CardId.JoyousSpring)) - {tributeId = CardId.JoyousSpring;} + { tributeId = CardId.JoyousSpring; } else if (Bot.HasInHand(CardId.Booster)) - {tributeId = CardId.Booster;} + { tributeId = CardId.Booster; } else if (Bot.HasInHand(CardId.Wagon)) - {tributeId = CardId.Wagon;} + { tributeId = CardId.Wagon; } else if (Bot.HasInHand(CardId.Scales)) - {tributeId = CardId.Scales;} + { tributeId = CardId.Scales; } else if (Bot.HasInHand(CardId.LockBird)) - {tributeId = CardId.LockBird;} + { tributeId = CardId.LockBird; } else if (Bot.HasInHand(CardId.MaxxG)) - {tributeId = CardId.MaxxG;} + { tributeId = CardId.MaxxG; } int needId = -1; if (Bot.HasInGraveyard(CardId.Soulpiercer)) { if (Bot.HasInGraveyard(CardId.Scales) && !activate_Scales) - {needId = CardId.Scales;} + { needId = CardId.Scales; } else - {needId = CardId.Soulpiercer;} + { needId = CardId.Soulpiercer; } } else if (Bot.HasInGraveyard(CardId.Masurawo)) - {needId = CardId.Masurawo;} + { needId = CardId.Masurawo; } else if (Bot.HasInGraveyard(CardId.Sarutobi)) - {needId = CardId.Sarutobi;} + { needId = CardId.Sarutobi; } else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) { if (Bot.HasInGraveyard(CardId.Wakaushi)) - {needId = CardId.Wakaushi;} + { needId = CardId.Wakaushi; } if (Bot.HasInGraveyard(CardId.Motorbike)) - {needId = CardId.Motorbike;} + { needId = CardId.Motorbike; } } - if (GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Grave, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Onfield, Bot).Count(card => card != null && card.Id == CardId.Scales) == 2 && GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales)>=1 && !activate_Scales) + if (GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Grave, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Onfield, Bot).Count(card => card != null && card.Id == CardId.Scales) == 2 && GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales) >= 1 && !activate_Scales) { tributeId = CardId.Scales; needId = CardId.Scales; } AI.SelectCard(tributeId); AI.SelectNextCard(needId); - if (((!Bot.HasInHand(CardId.Wakaushi) && !Bot.HasInSpellZone(CardId.Wakaushi)) || activate_Wakaushi) - && (!Bot.HasInHand(CardId.Motorbike) || activate_Motorbike) - && ((!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker)) || activate_Soulpeacemaker) - && (!Bot.HasInSpellZone(CardId.Benkei) || activate_Benkei) - && (needId == CardId.Soulpiercer) - && (!activate_Wakaushi || !activate_Motorbike || !activate_Soulpeacemaker || !activate_Benkei) + activate_Scarecrow = true; + if (!summon_Scarecrow + && ((Bot.HasInHand(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) + && (Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) + && ((Bot.HasInHand(CardId.Soulpeacemaker) || Bot.HasInSpellZone(CardId.Soulpeacemaker)) && !activate_Soulpeacemaker) + && (Bot.HasInSpellZone(CardId.Benkei) && !activate_Benkei) + && (Bot.HasInHand(CardId.Soulpiercer) && !normal_summon) + && ((Bot.HasInGraveyard(CardId.Scales) || Bot.HasInHand(CardId.Soulpiercer)) && !activate_Scales && !normal_summon) ) { - summon_Scarecrow2 = false; + activate_Scarecrow = false; + summon_Scarecrow = false; } - activate_Scarecrow = true; - return true; - } - private bool ScarecrowLinkFunction2() - { - if (!summon_Scarecrow2) + else if (needId != CardId.Soulpiercer) { - summon_Scarecrow2 = true; - return true; + activate_Scarecrow = false; + summon_Scarecrow = false; } - return false; + return true; } private bool UnicornFunction() { - List Enemycards = GetZoneCards(CardLocation.Onfield,Enemy); + List Enemycards = GetZoneCards(CardLocation.Onfield, Enemy); if (Bot.Hand.Count == 0 || Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0) { if (to_deck) to_deck = false; @@ -802,29 +784,29 @@ private bool UnicornFunction() } int tributeId = -1; if (Bot.HasInHand(CardId.PsyFrameDriver)) - {tributeId = CardId.PsyFrameDriver;} + { tributeId = CardId.PsyFrameDriver; } else if (Bot.HasInHand(CardId.PsyFramegearGamma)) - {tributeId = CardId.PsyFramegearGamma;} + { tributeId = CardId.PsyFramegearGamma; } else if (Bot.HasInHand(CardId.Benkei)) - {tributeId = CardId.Benkei;} + { tributeId = CardId.Benkei; } else if (Bot.HasInHand(CardId.HauntedMansion)) - {tributeId = CardId.HauntedMansion;} + { tributeId = CardId.HauntedMansion; } else if (Bot.HasInHand(CardId.EffectVeiler)) - {tributeId = CardId.EffectVeiler;} + { tributeId = CardId.EffectVeiler; } else if (Bot.HasInHand(CardId.SnowRabbit)) - {tributeId = CardId.SnowRabbit;} + { tributeId = CardId.SnowRabbit; } else if (Bot.HasInHand(CardId.JoyousSpring)) - {tributeId = CardId.JoyousSpring;} + { tributeId = CardId.JoyousSpring; } else if (Bot.HasInHand(CardId.Booster)) - {tributeId = CardId.Booster;} + { tributeId = CardId.Booster; } else if (Bot.HasInHand(CardId.Wagon)) - {tributeId = CardId.Wagon;} + { tributeId = CardId.Wagon; } else if (Bot.HasInHand(CardId.Scales)) - {tributeId = CardId.Scales;} + { tributeId = CardId.Scales; } else if (Bot.HasInHand(CardId.LockBird)) - {tributeId = CardId.LockBird;} + { tributeId = CardId.LockBird; } else if (Bot.HasInHand(CardId.MaxxG)) - {tributeId = CardId.MaxxG;} + { tributeId = CardId.MaxxG; } if (to_deck) to_deck = false; AI.SelectCard(tributeId); return true; @@ -833,7 +815,7 @@ private bool BoosterEquipFunction() { if (Card.Location != CardLocation.Hand || activate_Booster) return false; - List ChkCardsHand = Bot.Hand.GetMonsters().ToList(); + List ChkCardsHand = Bot.Hand.GetMonsters().ToList(); foreach (var card in ChkCardsHand) { if (card.Id == CardId.Motorbike && !activate_Motorbike) return false; @@ -843,7 +825,7 @@ private bool BoosterEquipFunction() else if (card.Id == CardId.Wagon && (!activate_Wagon || !normal_summon)) return false; else if (card.Id == CardId.Benkei && !activate_Benkei) return false; } - List ChkCardsSpell = GetZoneCards(CardLocation.SpellZone,Bot).Where(card => card != null && card.IsFaceup()).ToList(); + List ChkCardsSpell = GetZoneCards(CardLocation.SpellZone, Bot).Where(card => card != null && card.IsFaceup()).ToList(); foreach (var card in ChkCardsSpell) { if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; @@ -852,13 +834,13 @@ private bool BoosterEquipFunction() else if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; else if (card.Id == CardId.Benkei && !activate_Benkei) return false; } - List ChkCardsMonster = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Level == 4).ToList(); + List ChkCardsMonster = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup() && card.Level == 4).ToList(); if (ChkCardsMonster.Count == 0) return false; foreach (var card in ChkCardsMonster) { if (card.Id == CardId.Soulpiercer) return false; } - List ChkCardsGrave = GetZoneCards(CardLocation.Grave,Bot).ToList(); + List ChkCardsGrave = GetZoneCards(CardLocation.Grave, Bot).ToList(); foreach (var card in ChkCardsGrave) { if (card.Id == CardId.Soulpiercer && (Bot.HasInMonstersZone(CardId.Scarecrow) || Bot.HasInExtra(CardId.Scarecrow))) return false; @@ -870,13 +852,7 @@ private bool BoosterEquipFunction() } private bool BoosterEquipFunction2() { - if (Bot.HasInExtra(CardId.IP) && p_summoned && !activate_Booster) return true; - return false; - } - private bool BoosterEquipFunction3() - { - List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.Scarecrow).ToList(); - if (Bot.HasInMonstersZone(CardId.IP) && p_summoned && !activate_Booster && cards.Count() == 0) return true; + if (Bot.HasInExtra(CardId.IP) && p_summoned) return true; return false; } private bool BoosterFunction() @@ -901,7 +877,7 @@ private bool GearGigantFunction() { if (Card.Location == CardLocation.MonsterZone) { - List ChkCards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.HasSetcode(0x9a)).ToList(); + List ChkCards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup() && card.HasSetcode(0x9a)).ToList(); int targetid = -1; if (!Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) { @@ -926,9 +902,9 @@ private bool SoulpiercerEquipFunction() return false; int tributeId = -1; if (Bot.HasInMonstersZone(CardId.Wagon)) - {tributeId = CardId.Wagon;} + { tributeId = CardId.Wagon; } else if (Bot.HasInMonstersZone(CardId.Wakaushi)) - {tributeId = CardId.Wakaushi;} + { tributeId = CardId.Wakaushi; } AI.SelectCard(tributeId); return Bot.HasInMonstersZone(new[] { CardId.Wakaushi, @@ -940,17 +916,11 @@ private bool SoulpeacemakerEquipFunction() if (Card.Location != CardLocation.Hand) return false; int tributeId = -1; - List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); - if (cards.Count() > 0) - AI.SelectCard(cards); - else - { - if (Bot.HasInMonstersZone(CardId.Scarecrow)) - {tributeId = CardId.Scarecrow;} - else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) - {tributeId = CardId.Soulpiercer;} - AI.SelectCard(tributeId); - } + if (Bot.HasInMonstersZone(CardId.Scarecrow)) + { tributeId = CardId.Scarecrow; } + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + { tributeId = CardId.Soulpiercer; } + AI.SelectCard(tributeId); return Bot.HasInMonstersZone(new[] { CardId.Scarecrow, CardId.Soulpiercer, @@ -962,9 +932,9 @@ private bool SoulhornsEquipFunction() return false; int tributeId = -1; if (Bot.HasInMonstersZone(CardId.Masurawo)) - {tributeId = CardId.Masurawo;} + { tributeId = CardId.Masurawo; } else if (Bot.HasInMonstersZone(CardId.Sarutobi)) - {tributeId = CardId.Sarutobi;} + { tributeId = CardId.Sarutobi; } AI.SelectCard(tributeId); return Bot.HasInMonstersZone(new[] { CardId.Masurawo, @@ -977,11 +947,11 @@ private bool SoulpeacemakerFunction() { int tributeId = -1; if (Bot.HasInMonstersZone(CardId.Soulpiercer)) - {tributeId = CardId.Wakaushi;} - else if (Bot.HasInGraveyard(CardId.Soulpiercer)||!activate_Scales) - {tributeId = CardId.Scales;} - else if (!Bot.HasInGraveyard(CardId.Soulpiercer)||activate_Scales) - {tributeId = CardId.Soulpiercer;} + { tributeId = CardId.Wakaushi; } + else if (Bot.HasInGraveyard(CardId.Soulpiercer) || !activate_Scales) + { tributeId = CardId.Scales; } + else if (!Bot.HasInGraveyard(CardId.Soulpiercer) || activate_Scales) + { tributeId = CardId.Soulpiercer; } AI.SelectCard(tributeId); activate_Soulpeacemaker = true; return true; @@ -992,10 +962,14 @@ private bool GeniusLinkFunction() { if ((Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) && (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id))) return false; - List Pcards = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.HasSetcode(0x9a) && card.Level > 1 && card.Level < 8).ToList(); - if (Pcards.Count() < 2 && !Bot.HasInMonstersZone(CardId.Soulpiercer)) return false; - List Rcards = GetZoneCards(CardLocation.Removed, Bot).Where(card => card != null && card.Id == CardId.Regulus).ToList(); - if (Bot.HasInHand(CardId.Regulus) || Bot.HasInGraveyard(CardId.Regulus) || Bot.HasInSpellZone(CardId.Regulus) || Bot.HasInMonstersZone(CardId.Regulus) || Rcards.Count() > 0) return false; + int CardCount = 0; + foreach (ClientCard card in Bot.Hand.GetMonsters()) + { + if (card.HasRace(CardRace.Machine) && (card.Level >= 2 && card.Level <= 7)) + { CardCount++; } + } + if (CardCount < 2 && !Bot.HasInMonstersZone(CardId.Soulpiercer)) { return false; } + if (Bot.HasInHand(CardId.Regulus) || Bot.HasInGraveyard(CardId.Regulus) || Bot.HasInSpellZone(CardId.Regulus) || Bot.HasInMonstersZone(CardId.Regulus)) return false; bool linkchk = false; List materials = new List(); if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[6].Id)) @@ -1014,13 +988,13 @@ private bool GeniusLinkFunction() if (card == null || FinalCards(card.Id)) continue; else materials.Add(card); } - if (materials.Count <=1) return false; + if (materials.Count <= 1) return false; AI.SelectMaterials(materials); return ((Bot.GetMonstersInExtraZone().Count == 0 || linkchk) && !p_summoned && !activate_Genius); } private bool GeniusFunction() { - if (ActivateDescription == Util.GetStringId(CardId.Genius,1)) + if (ActivateDescription == Util.GetStringId(CardId.Genius, 1)) { AI.SelectCard(CardId.Regulus); activate_Genius = true; @@ -1048,45 +1022,28 @@ private bool ElfLinkFunction() foreach (var card in TunrerCards) { if (card == null) continue; - else if (materials.Count(ccard =>ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); + else if (materials.Count(ccard => ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); } - } + } else { foreach (var card in UnTunrercards) { if (card == null) continue; - else if (materials.Count(ccard =>ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); + else if (materials.Count(ccard => ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); } } - if (materials.Count <=1) return false; + if (materials.Count <= 1) return false; AI.SelectMaterials(materials); summon_Elf = true; return true; } private bool ElfFunction() { - if (Duel.Player == 0) - { - activate_Elf = true; - AI.SelectCard(CardId.Motorbike); - return Bot.HasInGraveyard(CardId.Motorbike); - } - List cards1 = GetZoneCards(CardLocation.MonsterZone, Enemy); - List cards2 = GetZoneCards(CardLocation.SpellZone, Enemy); - if (cards1.Count() > 0 || cards2.Count() >= 3) - { - if (Bot.HasInExtra(CardId.Unicorn) && Bot.HasInGraveyard(CardId.IP)) - AI.SelectCard(CardId.IP); - else - { - AI.SelectCard(CardId.Motorbike); - AI.SelectPosition(CardPosition.FaceUpDefence); - } - activate_Elf = true; - return Bot.HasInGraveyard(CardId.Motorbike) || Bot.HasInGraveyard(CardId.IP); - } - return false; + AI.SelectCard(CardId.Motorbike); + AI.SelectPosition(CardPosition.FaceUpDefence); + activate_Elf = true; + return Bot.HasInGraveyard(CardId.Motorbike); } private bool RegulusFunction() { @@ -1094,9 +1051,9 @@ private bool RegulusFunction() { int tributeId = -1; if (Bot.HasInGraveyard(CardId.Soulpiercer)) - {tributeId = CardId.Soulpiercer;} + { tributeId = CardId.Soulpiercer; } else if (Bot.HasInGraveyard(CardId.Motorbike)) - {tributeId = CardId.Motorbike;} + { tributeId = CardId.Motorbike; } AI.SelectCard(tributeId); activate_Genius = true; return true; @@ -1137,19 +1094,9 @@ private bool FleurFunction() } private bool IPLinkFunction() { - List materials = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Id != CardId.Scarecrow && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf)) && !FinalCards(card.Id)).ToList(); - if (materials.Count <=1) return false; - if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].HasType(CardType.Link)) - { - if (Bot.MonsterZone[2] != null && FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[4] != null && FinalCards(Bot.MonsterZone[4].Id)) - return false; - } - else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && Bot.MonsterZone[5].HasType(CardType.Link)) - { - if (Bot.MonsterZone[2] != null && FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[0] != null && FinalCards(Bot.MonsterZone[0].Id)) - return false; - } - AI.SelectMaterials(materials); + List cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup() && card.Id != CardId.Scarecrow && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf)) && !FinalCards(card.Id)).ToList(); + if (cards.Count <= 1) return false; + AI.SelectMaterials(cards); return true; } private bool IPFunction() @@ -1158,9 +1105,9 @@ private bool IPFunction() if (Bot.HasInExtra(CardId.Unicorn)) { List material = new List(); - List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card != Card && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.IP && card.Id != CardId.Scarecrow).ToList(); - List Enemycards = GetZoneCards(CardLocation.MonsterZone,Enemy); - if (activate_Sarutobi) Enemycards = GetZoneCards(CardLocation.Onfield,Enemy); + List cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card != Card && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.IP && card.Id != CardId.Scarecrow).ToList(); + List Enemycards = GetZoneCards(CardLocation.MonsterZone, Enemy); + if (activate_Sarutobi) Enemycards = GetZoneCards(CardLocation.Onfield, Enemy); if (Bot.Hand.Count == 0 || Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0 || cards.Count == 0) return false; bool linkchk = false; foreach (var card in cards) @@ -1173,7 +1120,7 @@ private bool IPFunction() } } AI.SelectCard(CardId.Unicorn); - material.Insert(0,Card); + material.Insert(0, Card); AI.SelectMaterials(material); if (!to_deck) to_deck = true; return linkchk; @@ -1182,11 +1129,11 @@ private bool IPFunction() } private bool SarutobiFunction() { - List Enemycards = GetZoneCards(CardLocation.SpellZone,Enemy); + List Enemycards = GetZoneCards(CardLocation.SpellZone, Enemy); if (Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0 || to_deck) return false; AI.SelectCard(Enemycards); activate_Sarutobi = true; return true; } } -} +} \ No newline at end of file diff --git a/Game/AI/Decks/SwordsoulExecutor.cs b/Game/AI/Decks/SwordsoulExecutor.cs index 29433a6d5..1b55e3c67 100644 --- a/Game/AI/Decks/SwordsoulExecutor.cs +++ b/Game/AI/Decks/SwordsoulExecutor.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System; +using YGOSharp.OCGWrapper; namespace WindBot.Game.AI.Decks { @@ -156,10 +157,10 @@ public SwordsoulExecutor(GameAI ai, Duel duel) CardId.CrossoutDesignator }}, }; - Dictionary calledbytheGraveCount = new Dictionary(); - List CrossoutDesignatorTargetList = new List(); + List currentNegatingIdList = new List(); bool enemyActivateMaxxC = false; bool enemyActivateLockBird = false; + bool enemyActivateInfiniteImpermanenceFromHand = false; List infiniteImpermanenceList = new List(); bool summoned = false; @@ -390,7 +391,7 @@ public List GetNormalEnemyTargetList(bool canBeTarget = true) public List GetMonsterListForTargetNegate(bool canBeMonsterTarget = false, bool canBeTrapTarget = false) { List resultList = new List(); - if (CheckWhetherNegated(true)) + if (CheckWhetherNegated()) { return resultList; } @@ -427,24 +428,6 @@ public void CheckDeactiveFlag() ClientCard lastChainCard = Util.GetLastChainCard(); if (lastChainCard != null && Duel.LastChainPlayer == 1) { - if (lastChainCard.IsCode(_CardId.MaxxC)) - { - enemyActivateMaxxC = false; - } - if (lastChainCard.IsCode(_CardId.LockBird)) - { - enemyActivateLockBird = false; - } - if (lastChainCard.IsCode(_CardId.CalledByTheGrave) && !CrossoutDesignatorTargetList.Contains(_CardId.CalledByTheGrave)) - { - foreach (ClientCard target in Duel.LastChainTargets) - { - if (target.IsMonster() && target.Controller == 0 && target.Location == CardLocation.Grave) - { - calledbytheGraveCount[target.Id] = 0; - } - } - } if (lastChainCard.Controller == 1 && lastChainCard.Location == CardLocation.MonsterZone) { currentNegateMonsterList.Add(lastChainCard); @@ -457,11 +440,9 @@ public void CheckDeactiveFlag() /// public int CheckCalledbytheGrave(int id) { - if (!calledbytheGraveCount.ContainsKey(id)) - { - return 0; - } - return calledbytheGraveCount[id]; + if (currentNegatingIdList.Contains(id)) return 1; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; } /// @@ -523,12 +504,12 @@ public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = n /// Check whether'll be negated /// /// check whether card itself is disabled. - public bool CheckWhetherNegated(bool disablecheck = true) + public bool CheckWhetherNegated() { if ((Card.IsSpell() || Card.IsTrap()) && CheckSpellWillBeNegate()){ return true; } - if (CheckCalledbytheGrave(Card.Id) > 0 || CrossoutDesignatorTargetList.Contains(Card.Id)){ + if (DefaultCheckWhetherCardIsNegated(Card)) { return true; } if (Card.IsMonster() && Card.Location == CardLocation.MonsterZone && Card.IsDefense()) @@ -538,9 +519,6 @@ public bool CheckWhetherNegated(bool disablecheck = true) return true; } } - if (disablecheck){ - return Card.IsDisabled(); - } return false; } @@ -571,6 +549,7 @@ public bool CheckLastChainShouldNegated() if (lastcard == null || lastcard.Controller != 1) return false; if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (DefaultCheckWhetherCardIsNegated(lastcard)) return false; if (Duel.CurrentChain.Count >= 2) { ClientCard lastlastChainCard = Duel.CurrentChain[Duel.CurrentChain.Count - 2]; @@ -700,68 +679,47 @@ public override IList OnSelectCard(IList cards, int min, public override void OnNewTurn() { - if (Duel.Turn <= 1) calledbytheGraveCount.Clear(); enemyActivateMaxxC = false; enemyActivateLockBird = false; - List keyList = calledbytheGraveCount.Keys.ToList(); - foreach (int dic in keyList) - { - if (calledbytheGraveCount[dic] > 1) - { - calledbytheGraveCount[dic] -= 1; - } - } - CrossoutDesignatorTargetList.Clear(); infiniteImpermanenceList.Clear(); summoned = false; onlyWyrmSpSummon = false; + enemyActivateInfiniteImpermanenceFromHand = false; activatedCardIdList.Clear(); + currentNegateMonsterList.Clear(); + currentNegatingIdList.Clear(); + base.OnNewTurn(); } - public override void OnChaining(int player, ClientCard card) + public override void OnChainSolved(int chainIndex) { - if (card == null) return; - - if (player == 1) + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) { - if (card.IsCode(_CardId.MaxxC) && CheckCalledbytheGrave(_CardId.MaxxC) == 0 && !CrossoutDesignatorTargetList.Contains(_CardId.MaxxC)) - { + if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; - } - if (card.IsCode(_CardId.LockBird) && CheckCalledbytheGrave(_CardId.LockBird) == 0 && !CrossoutDesignatorTargetList.Contains(_CardId.LockBird)) - { + if (currentCard.IsCode(_CardId.LockBird)) enemyActivateLockBird = true; - } - if (card.IsCode(_CardId.InfiniteImpermanence) && !CrossoutDesignatorTargetList.Contains(_CardId.InfiniteImpermanence)) + if (currentCard.IsCode(_CardId.InfiniteImpermanence) && !enemyActivateInfiniteImpermanenceFromHand) { for (int i = 0; i < 5; ++i) { - if (Enemy.SpellZone[i] == card) + if (Enemy.SpellZone[i] == currentCard) { - infiniteImpermanenceList.Add(4-i); + infiniteImpermanenceList.Add(4 - i); break; } } } - if (card.IsCode(_CardId.CalledByTheGrave) && !CrossoutDesignatorTargetList.Contains(_CardId.CalledByTheGrave)) - { - foreach (ClientCard target in Duel.LastChainTargets) - { - if (target.IsMonster() && target.Controller == 0 && target.Location == CardLocation.Grave) - { - calledbytheGraveCount[target.Id] = 2; - } - } - } } - base.OnChaining(player, card); } public override void OnChainEnd() { currentNegateMonsterList.Clear(); + currentNegatingIdList.Clear(); for (int idx = effectUsedBaronneDeFleurList.Count() - 1; idx >= 0; -- idx) { ClientCard checkTarget = effectUsedBaronneDeFleurList[idx]; @@ -770,9 +728,24 @@ public override void OnChainEnd() effectUsedBaronneDeFleurList.RemoveAt(idx); } } + enemyActivateInfiniteImpermanenceFromHand = false; base.OnChainEnd(); } + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (previousControler == 1) + { + if (card != null) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && previousLocation == (int)CardLocation.Hand && currentLocation == (int)CardLocation.SpellZone) + enemyActivateInfiniteImpermanenceFromHand = true; + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + /// /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. /// @@ -821,9 +794,9 @@ public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false AI.SelectPlace(0); } - public bool NibiruThePrimalBeingActivate() { + if (CheckWhetherNegated()) return false; if (Duel.Player == 0 || Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasType(CardType.Synchro))) { return false; @@ -1338,7 +1311,7 @@ public bool IncredibleEcclesiaTheVirtuousSpSummon() public bool AshBlossomActivate() { - if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) { return false; @@ -1353,13 +1326,13 @@ public bool AshBlossomActivate() public bool MaxxCActivate() { - if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + if (CheckWhetherNegated() || Duel.LastChainPlayer == 0) return false; return DefaultMaxxC(); } public bool EffectVeilerActivate() { - if (CheckWhetherNegated(true)) return false; + if (CheckWhetherNegated()) return false; List shouldNegateList = GetMonsterListForTargetNegate(true); if (shouldNegateList.Count() > 0) @@ -1711,7 +1684,7 @@ public bool SwordsoulSpellBanishedEffect() public bool CalledbytheGraveActivate() { - if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) { return false; @@ -1721,21 +1694,22 @@ public bool CalledbytheGraveActivate() // negate if (Util.GetLastChainCard().IsMonster()) { - int code = Util.GetLastChainCard().Id; + int code = Util.GetLastChainCard().GetOriginCode(); if (code == 0) return false; - if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTargetList.Contains(code)) return false; + if (CheckCalledbytheGrave(code) > 0) return false; if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) { return false; } - if (Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)) != null) + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) { if (!(Card.Location == CardLocation.SpellZone)) { SelectSTPlace(null, true); } - AI.SelectCard(code); - calledbytheGraveCount[code] = 2; + AI.SelectCard(graveTarget); + currentNegatingIdList.Add(code); CheckDeactiveFlag(); return true; } @@ -1752,7 +1726,7 @@ public bool CalledbytheGraveActivate() } int code = cards.Id; AI.SelectCard(cards); - calledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); return true; } } @@ -1767,7 +1741,7 @@ public bool CalledbytheGraveActivate() enemyMonsters.Reverse(); int code = enemyMonsters[0].Id; AI.SelectCard(code); - calledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); return true; } } @@ -1783,7 +1757,7 @@ public bool CalledbytheGraveActivate() SelectSTPlace(null, true); } AI.SelectCard(code); - calledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); return true; } @@ -1792,7 +1766,7 @@ public bool CalledbytheGraveActivate() public bool CrossoutDesignatorActivate() { - if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; // negate if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) { @@ -1800,7 +1774,7 @@ public bool CrossoutDesignatorActivate() int alias = Util.GetLastChainCard().Alias; if (alias != 0 && alias - code < 10) code = alias; if (code == 0) return false; - if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTargetList.Contains(code)) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; if (CheckRemainInDeck(code) > 0) { if (!(Card.Location == CardLocation.SpellZone)) @@ -1808,7 +1782,7 @@ public bool CrossoutDesignatorActivate() SelectSTPlace(null, true); } AI.SelectAnnounceID(code); - CrossoutDesignatorTargetList.Add(code); + currentNegatingIdList.Add(code); CheckDeactiveFlag(); return true; } @@ -2427,7 +2401,7 @@ public bool BaronneDeFleurActivate() if (ActivateDescription == Util.GetStringId(CardId.BaronneDeFleur, 1)) { // negate - if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; if (Duel.LastChainPlayer == 1) { ClientCard lastChainCard = Util.GetLastChainCard(); @@ -2446,7 +2420,7 @@ public bool BaronneDeFleurActivate() } else if (Duel.Phase == DuelPhase.Standby) { // special summon after effect used - if (effectUsedBaronneDeFleurList.Contains(Card) && !CheckWhetherNegated(true)) + if (effectUsedBaronneDeFleurList.Contains(Card) && !CheckWhetherNegated()) { if (Duel.Player == 1) { @@ -2565,7 +2539,7 @@ public bool SwordsoulGrandmaster_ChixiaoActivate() if (ActivateDescription == Util.GetStringId(CardId.SwordsoulGrandmaster_Chixiao, 1)) { // negate - if (CheckWhetherNegated(true)) return false; + if (CheckWhetherNegated()) return false; List negateTargetList = new List(); @@ -2907,7 +2881,7 @@ public bool YaziEvilOfTheYangZingActivate() } else { // destroy - if (CheckWhetherNegated(true)) + if (CheckWhetherNegated()) { return false; } diff --git a/Game/AI/Decks/TearlamentsExecutor.cs b/Game/AI/Decks/TearlamentsExecutor.cs index 23c48a8cc..3641c2430 100644 --- a/Game/AI/Decks/TearlamentsExecutor.cs +++ b/Game/AI/Decks/TearlamentsExecutor.cs @@ -182,8 +182,8 @@ public TearlamentsExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, CardId.BaronnedeFleur, BaronnedeFleurEffect); AddExecutor(ExecutorType.Activate, CardId.ElderEntityNtss, ElderEntityNtssEffect); AddExecutor(ExecutorType.Activate, CardId.PredaplantDragostapelia, PredaplantDragostapeliaEffect); - AddExecutor(ExecutorType.Activate, CardId.HeraldofOrangeLight); - AddExecutor(ExecutorType.Activate, CardId.HeraldofGreenLight); + AddExecutor(ExecutorType.Activate, CardId.HeraldofOrangeLight, DefaultTrap); + AddExecutor(ExecutorType.Activate, CardId.HeraldofGreenLight, DefaultTrap); AddExecutor(ExecutorType.Activate, CardId.TearlamentsRulkallos, TearlamentsRulkallosEffect); AddExecutor(ExecutorType.Activate, CardId.FADawnDragster); AddExecutor(ExecutorType.Activate, CardId.PrimevalPlanetPerlereino, PrimevalPlanetPerlereinoEffect); @@ -275,6 +275,7 @@ public override void OnNewTurn() spsummoned = false; summon_SprightElf = false; TearlamentsKitkallos_summoned = false; + base.OnNewTurn(); } private List GetZoneCards(CardLocation loc, ClientField player) { @@ -2172,6 +2173,7 @@ private bool DivineroftheHeraldSummon() } private bool EvaEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; List cards = Bot.GetGraveyardMonsters().Where(card => card != null && card.HasAttribute(CardAttribute.Light) && card.HasRace(CardRace.Fairy) && card != Card).ToList(); if (cards.Count <= 0) return false; activate_Eva = true; @@ -2207,6 +2209,7 @@ private bool TearlamentsScreamEffect_1() } private bool MudoratheSwordOracleEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.Location == CardLocation.Hand) { if ((Bot.Hand.Count(card => card != null && card.Id == CardId.AgidotheAncientSentinel) <= 0 || activate_AgidotheAncientSentinel_2) diff --git a/Game/AI/Decks/ThunderDragonExecutor.cs b/Game/AI/Decks/ThunderDragonExecutor.cs index b073f9ac3..e5fb67312 100644 --- a/Game/AI/Decks/ThunderDragonExecutor.cs +++ b/Game/AI/Decks/ThunderDragonExecutor.cs @@ -278,6 +278,8 @@ public override void OnNewTurn() for (int i = 0; i < selectAtt.Count; i++) selectAtt[i] = false; + + base.OnNewTurn(); } private bool IsAvailableZone(int seq) { @@ -889,6 +891,7 @@ private int GetLinkMark(int cardId) } private bool AshBlossomEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.CurrentChain.Count > 0 && Duel.LastChainPlayer != 0; } public int CompareCardLink(ClientCard cardA, ClientCard cardB) @@ -1053,6 +1056,7 @@ private bool MekkKnightCrusadiaAvramaxSummon() } private bool GEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player != 0; } private bool ThunderDragonColossusSummon_2() @@ -1101,6 +1105,7 @@ private bool PredaplantVerteAnacondaEffect() { if (ActivateDescription == Util.GetStringId(CardId.PredaplantVerteAnaconda, 1)) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (CheckRemainInDeck(CardId.ThunderDragonFusion) <= 0) return false; if (Bot.GetMonstersInMainZone().Count > 4 && Bot.GetMonstersInMainZone().Count(card => card != null && !card.IsExtraCard() && card.HasSetcode(0x11c) && card.HasType(CardType.Monster) && card.IsFaceup()) <= 0) return false; List g_card = Bot.Graveyard.ToList(); @@ -1148,6 +1153,7 @@ private bool CrossSheepEffect() } private bool KnightmareUnicornEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; List cards = new List(); cards.AddRange(Enemy.SpellZone); cards.AddRange(Enemy.MonsterZone); @@ -1598,6 +1604,7 @@ private bool ThunderDragonhawkEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; List banish_cards = new List(); List grave_cards = new List(); foreach (var card in Bot.Banished) @@ -1792,6 +1799,7 @@ private bool ThunderDragonroarEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (handActivated) return false; handActivated = true; activate_ThunderDragonroar = true; @@ -2035,6 +2043,7 @@ private bool ThunderDragonmatrixEffect_2() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Player == 0) { if (IsShouldChainTunder()) @@ -2243,6 +2252,7 @@ private bool TheBystialLubellionEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (HasInZoneNoActivate(CardId.BystialMagnamhut,CardLocation.Deck) && !Bot.HasInHand(CardId.BystialMagnamhut)) AI.SelectCard(CardId.BystialMagnamhut); else if(HasInZoneNoActivate(CardId.BystialDruiswurm, CardLocation.Deck) && !Bot.HasInHand(CardId.BystialDruiswurm)) @@ -2420,6 +2430,7 @@ private bool ThunderDragondarkEffect_2() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Player == 0) { if (IsShouldChainTunder()) @@ -2498,6 +2509,7 @@ private bool ThunderDragondarkEffect() } private bool NormalThunderDragonEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; handActivated = true; ResetFlag(); selectFlag[(int)Select.NormalThunderDragon] = true; diff --git a/Game/AI/Decks/TimeThiefExecutor.cs b/Game/AI/Decks/TimeThiefExecutor.cs index 0d9a990c1..e30aad089 100644 --- a/Game/AI/Decks/TimeThiefExecutor.cs +++ b/Game/AI/Decks/TimeThiefExecutor.cs @@ -192,6 +192,7 @@ private bool RegulatorEffect() { if (Card.Location == CardLocation.MonsterZone) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(Monsters.TimeThiefCronocorder); AI.SelectCard(Monsters.TimeThiefWinder); return true; diff --git a/Game/AI/Decks/ToadallyAwesomeExecutor.cs b/Game/AI/Decks/ToadallyAwesomeExecutor.cs index 595b52750..a043e89c1 100644 --- a/Game/AI/Decks/ToadallyAwesomeExecutor.cs +++ b/Game/AI/Decks/ToadallyAwesomeExecutor.cs @@ -231,6 +231,7 @@ private bool SwapFrogEffect() } else { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInHand(CardId.DupeFrog)) { AI.SelectCard( @@ -267,6 +268,7 @@ private bool GraydleSlimeJrEffect() private bool RonintoadinEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectPosition(CardPosition.FaceUpDefence); return true; } @@ -297,6 +299,7 @@ private bool ToadallyAwesomeEffect() { if (Duel.CurrentChain.Count > 0) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; // negate effect, select a cost for it List monsters = Bot.GetMonsters(); IList suitableCost = new[] { @@ -381,6 +384,7 @@ private bool ToadallyAwesomeEffect() } else if (Duel.Phase == DuelPhase.Standby) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; SelectXYZDetach(Card.Overlays); if (Duel.Player == 0) { diff --git a/Game/AI/Decks/TrickstarExecutor.cs b/Game/AI/Decks/TrickstarExecutor.cs index d5ddaadc8..6eb135c7d 100644 --- a/Game/AI/Decks/TrickstarExecutor.cs +++ b/Game/AI/Decks/TrickstarExecutor.cs @@ -78,8 +78,7 @@ public int getLinkMarker(int id) bool white_eff_used = false; bool lockbird_useful = false; bool lockbird_used = false; - int GraveCall_id = 0; - int GraveCall_count = 0; + List currentNegatingIdList = new List(); List SkyStrike_list = new List { 26077387, 8491308, 63288573, 90673288, @@ -248,9 +247,9 @@ public bool SpellSet() return false; } - public bool IsTrickstar(int id) + public bool IsTrickstar(ClientCard card) { - return (id == CardId.Yellow || id == CardId.Red || id == CardId.Pink || id == CardId.White || id == CardId.Stage || id == CardId.Re || id == CardId.Crown); + return card.HasSetcode(0x8d); } public bool field_activate() @@ -266,18 +265,18 @@ public bool field_activate() public bool spell_trap_activate() { if (Card.Location != CardLocation.SpellZone && Card.Location != CardLocation.Hand) return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Enemy.HasInMonstersZone(CardId.Exterio,true) && !Bot.HasInHandOrHasInMonstersZone(CardId.Ghost)) return false; if (Card.IsSpell()) { - if (Enemy.HasInMonstersZone(33198837, true) && !Bot.HasInHandOrHasInMonstersZone(CardId.Ghost)) return false; - if (Enemy.HasInSpellZone(61740673, true) || Bot.HasInSpellZone(61740673,true)) return false; + if (Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true) && !Bot.HasInHandOrHasInMonstersZone(CardId.Ghost)) return false; + if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Bot.HasInSpellZone(_CardId.ImperialOrder, true)) return false; if (Enemy.HasInMonstersZone(37267041, true) || Bot.HasInMonstersZone(37267041, true)) return false; return true; } if (Card.IsTrap()) { - if (Enemy.HasInSpellZone(51452091, true) || Bot.HasInSpellZone(51452091, true)) return false; - if (Enemy.HasInSpellZone(51452091, true) || Bot.HasInSpellZone(51452091, true)) return false; + if (Enemy.HasInSpellZone(_CardId.RoyalDecreel, true) || Bot.HasInSpellZone(_CardId.RoyalDecreel, true)) return false; return true; } // how to get here? @@ -622,7 +621,7 @@ public bool Stage_act() stage_locked = null; return true; } - if (Enemy.GetMonsterCount() > 0 && Util.GetBestEnemyMonster().Attack >= Util.GetBestAttack(Bot) && !Bot.HasInHand(CardId.White)) + if (Enemy.GetMonsterCount() > 0 && Util.GetBestEnemyMonster().Attack >= Util.GetBestAttack(Bot) && !Bot.HasInHand(CardId.White) && !DefaultCheckWhetherCardIdIsNegated(CardId.White)) { AI.SelectCard(CardId.White, CardId.Yellow, CardId.Pink, CardId.Red); stage_locked = null; @@ -655,7 +654,7 @@ public bool Pot_Act() public bool Hand_act_eff() { - if (GraveCall_count > 0 && GraveCall_id == Card.Id) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.IsCode(CardId.Urara) && Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect return false; if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false; @@ -675,7 +674,7 @@ public bool Exterio_counter() public bool G_act() { - return (Duel.Player == 1 && !(GraveCall_count > 0 && GraveCall_id == Card.Id)); + return Duel.Player == 1 && !DefaultCheckWhetherCardIsNegated(Card); } public bool Pink_eff() @@ -762,7 +761,7 @@ public void Red_SelectPos(ClientCard return_card = null) monster_list.Reverse(); foreach(ClientCard card in monster_list) { - if (IsTrickstar(card.Id) && card != return_card && card.HasPosition(CardPosition.Attack)) + if (IsTrickstar(card) && card != return_card && card.HasPosition(CardPosition.Attack)) { int this_power = (Bot.HasInHand(CardId.White) && !white_eff_used) ? (card.RealPower + card.Attack) : card.RealPower; if (this_power >= self_power) self_power = this_power; @@ -777,12 +776,13 @@ public void Red_SelectPos(ClientCard return_card = null) public bool Red_ss() { - if ((Util.ChainContainsCard(CardId.DarkHole) || Util.ChainContainsCard(99330325) || Util.ChainContainsCard(53582587)) && Util.ChainContainsCard(CardId.Red)) return false; + if ((Util.ChainContainsCard(CardId.DarkHole) || Util.ChainContainsCard(_CardId.InterruptedKaijuSlumber) || Util.ChainContainsCard(_CardId.TorrentialTribute)) && Util.ChainContainsCard(CardId.Red)) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Red)) { foreach (ClientCard m in Bot.GetMonsters()) { - if (Util.IsChainTarget(m) && IsTrickstar(m.Id)) + if (Util.IsChainTarget(m) && IsTrickstar(m)) { AI.SelectCard(m); Red_SelectPos(); @@ -800,7 +800,7 @@ public bool Red_ss() ClientCard tosolve_enemy = Util.GetOneEnemyBetterThanMyBest(); foreach (ClientCard c in self_m) { - if (IsTrickstar(c.Id) && !c.IsCode(CardId.Red)) + if (IsTrickstar(c) && !c.IsCode(CardId.Red)) { if (c.Attacked) { @@ -854,7 +854,7 @@ public bool Red_ss() self_monster.Sort(CardContainer.CompareDefensePower); foreach(ClientCard card in self_monster) { - if (IsTrickstar(card.Id) && !card.IsCode(CardId.Red)) + if (IsTrickstar(card) && !card.IsCode(CardId.Red)) { AI.SelectCard(card); Red_SelectPos(card); @@ -934,10 +934,11 @@ public bool Yellow_eff() public bool White_eff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Phase >= DuelPhase.Main2) return false; if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) { - if (Bot.BattlingMonster == null || Enemy.BattlingMonster == null || !IsTrickstar(Bot.BattlingMonster.Id) || Bot.BattlingMonster.HasPosition(CardPosition.Defence)) return false; + if (Bot.BattlingMonster == null || Enemy.BattlingMonster == null || !IsTrickstar(Bot.BattlingMonster) || Bot.BattlingMonster.HasPosition(CardPosition.Defence)) return false; if (Bot.BattlingMonster.Attack <= Enemy.BattlingMonster.RealPower && Bot.BattlingMonster.Attack + Bot.BattlingMonster.BaseAttack >= Enemy.BattlingMonster.RealPower) { white_eff_used = true; @@ -954,7 +955,7 @@ public bool White_eff() { ClientCard tosolve = Util.GetBestEnemyMonster(true); ClientCard self_card = Bot.GetMonsters().GetHighestAttackMonster(); - if (tosolve == null || self_card == null || (tosolve != null && self_card != null && !IsTrickstar(self_card.Id))) + if (tosolve == null || self_card == null || (tosolve != null && self_card != null && !IsTrickstar(self_card))) { if (Enemy.GetMonsters().GetHighestAttackMonster()== null || Enemy.GetMonsters().GetHighestDefenseMonster() == null || @@ -966,7 +967,7 @@ public bool White_eff() } else return false; } - if (tosolve != null && self_card != null && IsTrickstar(self_card.Id) && !tosolve.IsMonsterHasPreventActivationEffectInBattle()) + if (tosolve != null && self_card != null && IsTrickstar(self_card) && !tosolve.IsMonsterHasPreventActivationEffectInBattle()) { int defender_power = tosolve.GetDefensePower(); Logger.DebugWriteLine("battle check 0:" + Duel.Phase.ToString()); @@ -990,6 +991,7 @@ public bool White_eff() public bool LockBird_act() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Player == 0 || lockbird_used) return false; lockbird_useful = true; if (Bot.HasInSpellZone(CardId.Re)) @@ -1028,7 +1030,7 @@ public bool Crown_eff() } return false; } - if (Bot.HasInHand(CardId.Pink) && GraveCall_id != CardId.Pink) + if (Bot.HasInHand(CardId.Pink) && DefaultCheckWhetherCardIdIsNegated(CardId.Pink)) { AI.SelectCard(CardId.Pink); return true; @@ -1037,7 +1039,7 @@ public bool Crown_eff() { foreach(ClientCard hand in Bot.Hand) { - if (hand.IsMonster() && IsTrickstar(hand.Id)) + if (hand.IsMonster() && IsTrickstar(hand)) { if (hand.Attack >= Enemy.LifePoints) return true; if (!hand.IsCode(CardId.Yellow)) @@ -1627,12 +1629,17 @@ public bool GraveCall_eff() if (!spell_trap_activate()) return false; if (Duel.LastChainPlayer == 1) { - if (Util.GetLastChainCard().IsMonster() && Enemy.HasInGraveyard(Util.GetLastChainCard().Id)) + if (Util.GetLastChainCard().IsMonster()) { - GraveCall_id = Util.GetLastChainCard().Id; - GraveCall_count = 2; - AI.SelectCard(GraveCall_id); - return true; + int code = Util.GetLastChainCard().GetOriginCode(); + if (CheckWhetherNegated(code)) return false; + ClientCard target = Enemy.Graveyard.GetFirstMatchingCard(c => c.GetOriginCode() == code); + if (target != null) + { + currentNegatingIdList.Add(code); + AI.SelectCard(target); + return true; + } } } return false; @@ -1676,7 +1683,7 @@ public bool IsAllEnemyBetter() ClientCard card = Bot.MonsterZone[i]; if (card == null || card.Data == null) continue; int newPower = card.Attack; - if (IsTrickstar(card.Id) && Bot.HasInHand(CardId.White) && !white_eff_used) newPower += card.RealPower; + if (IsTrickstar(card) && Bot.HasInHand(CardId.White) && !white_eff_used) newPower += card.RealPower; if (newPower > bestPower) bestPower = newPower; } @@ -1687,7 +1694,7 @@ public bool MonsterRepos() { if (Card.IsCode(CardId.Eater)) return (!Card.HasPosition(CardPosition.Attack)); - if (IsTrickstar(Card.Id) && !white_eff_used && Bot.HasInHand(CardId.White) && Card.IsAttack() && Duel.Phase == DuelPhase.Main1) return false; + if (IsTrickstar(Card) && !white_eff_used && Bot.HasInHand(CardId.White) && Card.IsAttack() && Duel.Phase == DuelPhase.Main1) return false; if (Card.IsFaceup() && Card.IsDefense() && Card.Attack == 0) return false; @@ -1717,11 +1724,6 @@ public override bool OnSelectHand() public override void OnNewTurn() { - if (Duel.Turn <= 1) - { - GraveCall_count = 0; - GraveCall_id = 0; - } NormalSummoned = false; stage_locked = null; pink_ss = false; @@ -1731,13 +1733,8 @@ public override void OnNewTurn() lockbird_useful = false; lockbird_used = false; Impermanence_list.Clear(); - if (GraveCall_count > 0) - { - if (--GraveCall_count <= 0) - { - GraveCall_id = 0; - } - } + currentNegatingIdList.Clear(); + base.OnNewTurn(); } public override void OnChaining(int player, ClientCard card) @@ -1761,6 +1758,17 @@ public override void OnChaining(int player, ClientCard card) base.OnChaining(player, card); } + public override void OnChainEnd() + { + currentNegatingIdList.Clear(); + base.OnChainEnd(); + } + + public bool CheckWhetherNegated(int cardId) + { + return !DefaultCheckWhetherCardIdIsNegated(cardId) && !currentNegatingIdList.Contains(cardId); + } + public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList defenders) { ClientCard lowestattack = null; @@ -1810,8 +1818,8 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender { if (!defender.IsMonsterHasPreventActivationEffectInBattle()) { - if (IsTrickstar(attacker.Id) && Bot.HasInHand(CardId.White) && !white_eff_used) - attacker.RealPower = attacker.RealPower + attacker.Attack; + if (IsTrickstar(attacker) && Bot.HasInHand(CardId.White) && !white_eff_used && !CheckWhetherNegated(CardId.White)) + attacker.RealPower += attacker.Attack; } return base.OnPreBattleBetween(attacker, defender); } diff --git a/Game/AI/Decks/WitchcraftExecutor.cs b/Game/AI/Decks/WitchcraftExecutor.cs index 0b66222a6..a46dcdbd1 100644 --- a/Game/AI/Decks/WitchcraftExecutor.cs +++ b/Game/AI/Decks/WitchcraftExecutor.cs @@ -21,30 +21,24 @@ public class CardId public const int Haine = 84523092; public const int Schmietta = 21744288; public const int Pittore = 95245544; - public const int AshBlossom_JoyousSpring = 14558127; public const int PSYGamma = 38814750; - public const int MaxxC = 23434538; public const int Potterie = 59851535; public const int Genni = 64756282; public const int Collaboration = 10805153; public const int ThatGrassLooksGreener = 11110587; - public const int LightningStorm = 14532163; public const int PotofExtravagance = 49238328; public const int DarkRulerNoMore = 54693926; public const int Creation = 57916305; public const int Reasoning = 58577036; public const int MetalfoesFusion = 73594093; public const int Holiday = 83301414; - public const int CalledbytheGrave = 24224830; public const int Draping = 56894757; - public const int CrossoutDesignator = 65681983; public const int Unveiling = 70226289; public const int MagiciansLeftHand = 13758665; public const int Scroll = 19673561; public const int MagiciansRestage = 40252269; public const int WitchcrafterBystreet = 83289866; public const int MagicianRightHand = 87769556; - public const int InfiniteImpermanence = 10045474; public const int Masterpiece = 55072170; public const int Patronus = 94553671; public const int BorreloadSavageDragon = 27548199; @@ -60,10 +54,7 @@ public class CardId public const int RelinquishedAnima = 94259633; public const int NaturalExterio = 99916754; - public const int NaturalBeast = 33198837; - public const int ImperialOrder = 61740673; public const int SwordsmanLV7 = 37267041; - public const int RoyalDecreel = 51452091; public const int Anti_Spell = 58921041; public const int Numbe41BagooskatheTerriblyTiredTapir = 90590303; public const int PerformapalFive_RainbowMagician = 19619755; @@ -84,7 +75,7 @@ public WitchcraftExecutor(GameAI ai, Duel duel) // clear AddExecutor(ExecutorType.Activate, CardId.DarkRulerNoMore, DarkRulerNoMoreActivate); - AddExecutor(ExecutorType.Activate, CardId.LightningStorm, LightningStormActivate); + AddExecutor(ExecutorType.Activate, _CardId.LightningStorm, LightningStormActivate); AddExecutor(ExecutorType.Activate, CardId.RelinquishedAnima); // counter & quick effect @@ -93,13 +84,13 @@ public WitchcraftExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, CardId.Potterie, DeckSSWitchcraft); AddExecutor(ExecutorType.Activate, CardId.Genni, DeckSSWitchcraft); AddExecutor(ExecutorType.Activate, CardId.PSYGamma, PSYGammaActivate); - AddExecutor(ExecutorType.Activate, CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); AddExecutor(ExecutorType.Activate, CardId.GolemAruru, GolemAruruActivate); AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonActivate); - AddExecutor(ExecutorType.Activate, CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); - AddExecutor(ExecutorType.Activate, CardId.AshBlossom_JoyousSpring, AshBlossom_JoyousSpringActivate); - AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, CalledbytheGraveActivate); - AddExecutor(ExecutorType.Activate, CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossom_JoyousSpringActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); AddExecutor(ExecutorType.Activate, CardId.MagicianRightHand, SpellsActivate); AddExecutor(ExecutorType.Activate, CardId.MagiciansLeftHand, SpellsActivate); AddExecutor(ExecutorType.Activate, CardId.Unveiling, UnveilingActivate); @@ -187,16 +178,13 @@ public WitchcraftExecutor(GameAI ai, Duel duel) List FirstCheckSS = new List(); List UseSSEffect = new List(); List ActivatedCards = new List(); - Dictionary CalledbytheGraveCount = new Dictionary(); - int CrossoutDesignatorTarget = 0; + List currentNegatingIdList = new List(); bool MadameVerreGainedATK = false; bool summoned = false; bool enemy_activate_MaxxC = false; bool enemy_activate_DimensionShifter = false; bool MagiciansLeftHand_used = false; bool MagicianRightHand_used = false; - ClientCard MagiciansLeftHand_negate = null; - ClientCard MagicianRightHand_negate = null; // go first public override bool OnSelectHand() @@ -207,91 +195,73 @@ public override bool OnSelectHand() // reset the negated card in case of activated again public override void OnChainEnd() { - if (MagiciansLeftHand_negate != null) - { - MagiciansLeftHand_used = true; - MagiciansLeftHand_negate = null; - } - if (MagicianRightHand_negate != null) - { - MagicianRightHand_used = true; - MagicianRightHand_negate = null; - } + currentNegatingIdList.Clear(); base.OnChainEnd(); } - // check whether enemy activate important card - public override void OnChaining(int player, ClientCard card) + public override void OnChainSolved(int chainIndex) { - if (card == null) return; - // MagiciansLeftHand / MagicianRightHand - if (!MagicianRightHand_used && card.IsSpell() && card.Controller == 1) + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + if (currentCard != null && currentCard.Controller == 1) { - if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster)) != null - && Bot.HasInSpellZone(CardId.MagicianRightHand, true)) + if (Duel.IsCurrentSolvingChainNegated()) { - Logger.DebugWriteLine("MagicianRightHand negate: " + card.Name ?? "???"); - MagicianRightHand_negate = card; - } - } - if (!MagiciansLeftHand_used && card.IsTrap() && card.Controller == 1) - { - if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster)) != null - && Bot.HasInSpellZone(CardId.MagiciansLeftHand, true)) - { - Logger.DebugWriteLine("MagiciansLeftHand negate: " + card.Name ?? "???"); - MagiciansLeftHand_negate = card; + // MagiciansLeftHand / MagicianRightHand + if (!MagicianRightHand_used && currentCard.IsSpell()) + { + if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null + && Bot.HasInSpellZone(CardId.MagicianRightHand, true)) + { + Logger.DebugWriteLine("MagicianRightHand negate: " + currentCard.Name ?? "???"); + MagicianRightHand_used = true; + } + } + if (!MagiciansLeftHand_used && currentCard.IsTrap() && currentCard.Controller == 1) + { + if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null + && Bot.HasInSpellZone(CardId.MagiciansLeftHand, true)) + { + Logger.DebugWriteLine("MagiciansLeftHand negate: " + currentCard.Name ?? "???"); + MagiciansLeftHand_used = true; + } + } } - } - - if (player == 1 && card.Id == CardId.MaxxC && CheckCalledbytheGrave(CardId.MaxxC) == 0) - { - enemy_activate_MaxxC = true; - } - if (player == 1 && card.Id == CardId.DimensionShifter && CheckCalledbytheGrave(CardId.DimensionShifter) == 0) - { - enemy_activate_DimensionShifter = true; - } - if (player == 1 && card.Id == CardId.InfiniteImpermanence && CrossoutDesignatorTarget != CardId.InfiniteImpermanence) - { - for (int i = 0; i < 5; ++i) + if (!Duel.IsCurrentSolvingChainNegated()) { - if (Enemy.SpellZone[i] == card) + if (currentCard.IsCode(_CardId.MaxxC)) + enemy_activate_MaxxC = true; + if (currentCard.IsCode(CardId.DimensionShifter)) + enemy_activate_DimensionShifter = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) { - Impermanence_list.Add(4-i); - break; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard) + { + Impermanence_list.Add(4 - i); + break; + } + } } } } - base.OnChaining(player, card); } // new turn reset public override void OnNewTurn() { - if (Duel.Turn <= 1) CalledbytheGraveCount.Clear(); - CrossoutDesignatorTarget = 0; MadameVerreGainedATK = false; summoned = false; enemy_activate_MaxxC = false; enemy_activate_DimensionShifter = false; MagiciansLeftHand_used = false; MagicianRightHand_used = false; - MagiciansLeftHand_negate = null; - MagicianRightHand_negate = null; Impermanence_list.Clear(); FirstCheckSS.Clear(); UseSSEffect.Clear(); ActivatedCards.Clear(); - // CalledbytheGrave refresh - List key_list = CalledbytheGraveCount.Keys.ToList(); - foreach (int dic in key_list) - { - if (CalledbytheGraveCount[dic] > 1) - { - CalledbytheGraveCount[dic] -= 1; - } - } + currentNegatingIdList.Clear(); + base.OnNewTurn(); } // power fix @@ -426,7 +396,7 @@ public override CardPosition OnSelectPosition(int cardId, IList po if (!Enemy.HasInMonstersZone(_CardId.BlueEyesChaosMAXDragon) && (Duel.Player == 1 && (cardId == CardId.MadameVerre || Util.GetOneEnemyBetterThanValue(Data.Attack + 1) != null)) - || cardId == CardId.MaxxC || cardId == CardId.AshBlossom_JoyousSpring) + || cardId == _CardId.MaxxC || cardId == _CardId.AshBlossom) { return CardPosition.FaceUpDefence; } @@ -455,11 +425,9 @@ public List CardListShuffle(List list) // check negated time count of id public int CheckCalledbytheGrave(int id) { - if (!CalledbytheGraveCount.ContainsKey(id)) - { - return 0; - } - return CalledbytheGraveCount[id]; + if (currentNegatingIdList.Contains(id)) return 1; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; } // check enemy's dangerous card in grave @@ -470,19 +438,6 @@ public List CheckDangerousCardinEnemyGrave(bool onlyMonster = false) return result; } - // check whether negate maxxc and InfiniteImpermanence - public void CheckDeactiveFlag() - { - if (Util.GetLastChainCard() != null && Util.GetLastChainCard().Id == CardId.MaxxC && Duel.LastChainPlayer == 1) - { - enemy_activate_MaxxC = false; - } - if (Util.GetLastChainCard() != null && Util.GetLastChainCard().Id == CardId.DimensionShifter && Duel.LastChainPlayer == 1) - { - enemy_activate_DimensionShifter = false; - } - } - /// /// Check count of discardable spells for witchcraft monsters. /// @@ -515,7 +470,26 @@ public bool CheckLastChainNegated() ClientCard lastcard = Util.GetLastChainCard(); if (lastcard == null || lastcard.Controller != 1) return false; if (lastcard.IsMonster() && lastcard.HasSetcode(TimeLord_setcode) && Duel.Phase == DuelPhase.Standby) return false; - return lastcard == MagiciansLeftHand_negate || lastcard == MagicianRightHand_negate; + if (DefaultCheckWhetherCardIdIsNegated(lastcard.GetOriginCode())) return false; + + // MagiciansLeftHand / MagicianRightHand + if (!MagicianRightHand_used && lastcard.IsSpell()) + { + if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null + && Bot.HasInSpellZone(CardId.MagicianRightHand, true)) + { + return true; + } + } + if (!MagiciansLeftHand_used && lastcard.IsTrap()) + { + if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null + && Bot.HasInSpellZone(CardId.MagiciansLeftHand, true)) + { + return true; + } + } + return false; } /// @@ -707,12 +681,12 @@ public int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.Schmietta, 3); case CardId.Pittore: return Bot.GetRemainingCount(CardId.Pittore, 3); - case CardId.AshBlossom_JoyousSpring: - return Bot.GetRemainingCount(CardId.AshBlossom_JoyousSpring, 1); + case _CardId.AshBlossom: + return Bot.GetRemainingCount(_CardId.AshBlossom, 1); case CardId.PSYGamma: return Bot.GetRemainingCount(CardId.PSYGamma, 3); - case CardId.MaxxC: - return Bot.GetRemainingCount(CardId.MaxxC, 1); + case _CardId.MaxxC: + return Bot.GetRemainingCount(_CardId.MaxxC, 1); case CardId.Potterie: return Bot.GetRemainingCount(CardId.Potterie, 1); case CardId.Genni: @@ -721,8 +695,8 @@ public int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.Collaboration, 1); case CardId.ThatGrassLooksGreener: return Bot.GetRemainingCount(CardId.ThatGrassLooksGreener, 2); - case CardId.LightningStorm: - return Bot.GetRemainingCount(CardId.LightningStorm, 2); + case _CardId.LightningStorm: + return Bot.GetRemainingCount(_CardId.LightningStorm, 2); case CardId.PotofExtravagance: return Bot.GetRemainingCount(CardId.PotofExtravagance, 3); case CardId.DarkRulerNoMore: @@ -735,12 +709,12 @@ public int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.MetalfoesFusion, 1); case CardId.Holiday: return Bot.GetRemainingCount(CardId.Holiday, 3); - case CardId.CalledbytheGrave: - return Bot.GetRemainingCount(CardId.CalledbytheGrave, 3); + case _CardId.CalledByTheGrave: + return Bot.GetRemainingCount(_CardId.CalledByTheGrave, 3); case CardId.Draping: return Bot.GetRemainingCount(CardId.Draping, 1); - case CardId.CrossoutDesignator: - return Bot.GetRemainingCount(CardId.CrossoutDesignator, 2); + case _CardId.CrossoutDesignator: + return Bot.GetRemainingCount(_CardId.CrossoutDesignator, 2); case CardId.Unveiling: return Bot.GetRemainingCount(CardId.Unveiling, 1); case CardId.MagiciansLeftHand: @@ -753,8 +727,8 @@ public int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.WitchcrafterBystreet, 3); case CardId.MagicianRightHand: return Bot.GetRemainingCount(CardId.MagicianRightHand, 1); - case CardId.InfiniteImpermanence: - return Bot.GetRemainingCount(CardId.InfiniteImpermanence, 3); + case _CardId.InfiniteImpermanence: + return Bot.GetRemainingCount(_CardId.InfiniteImpermanence, 3); case CardId.Masterpiece: return Bot.GetRemainingCount(CardId.Masterpiece, 1); case CardId.Patronus: @@ -809,7 +783,7 @@ public bool SpellNegatable(bool isCounter = false, ClientCard target = null) { // target default set if (target == null) target = Card; - if (target.Id == CrossoutDesignatorTarget) return true; + if (CheckCalledbytheGrave(target.GetOriginCode()) > 0) return true; // won't negate if not on field if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; @@ -817,13 +791,13 @@ public bool SpellNegatable(bool isCounter = false, ClientCard target = null) if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; if (target.IsSpell()) { - if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; - if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true)) return true; + if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Bot.HasInSpellZone(_CardId.ImperialOrder, true)) return true; if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; } if (target.IsTrap()) { - if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return true; + if (Enemy.HasInSpellZone(_CardId.RoyalDecreel, true) || Bot.HasInSpellZone(_CardId.RoyalDecreel, true)) return true; } // how to get here? return false; @@ -836,7 +810,7 @@ public bool NegatedCheck(bool disablecheck = true){ if (Card.IsSpell() || Card.IsTrap()){ if (SpellNegatable()) return true; } - if (CheckCalledbytheGrave(Card.Id) > 0 || Card.Id == CrossoutDesignatorTarget){ + if (CheckCalledbytheGrave(Card.GetOriginCode()) > 0){ return true; } if (Card.IsMonster() && Card.Location == CardLocation.MonsterZone && Card.IsDefense()) @@ -904,7 +878,7 @@ public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = fals // Spell&trap's set public bool SpellSet(){ if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; - if (Card.Id == CardId.CrossoutDesignator && Duel.Turn >= 5) return false; + if (Card.Id == _CardId.CrossoutDesignator && Duel.Turn >= 5) return false; // set condition int[] activate_with_condition = { CardId.Masterpiece, CardId.Draping }; @@ -957,9 +931,9 @@ public bool SpellSet(){ Impermanence_set += (int)System.Math.Pow(2, 4 - i); } } - if (Bot.HasInHand(CardId.InfiniteImpermanence)) + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) { - if (Card.IsCode(CardId.InfiniteImpermanence)) + if (Card.IsCode(_CardId.InfiniteImpermanence)) { AI.SelectPlace(Impermanence_set); return true; @@ -1119,7 +1093,7 @@ public void SelectDiscardSpell() } else { - AI.SelectCard(CardId.ThatGrassLooksGreener, CardId.LightningStorm, CardId.PotofExtravagance, CardId.MagiciansLeftHand, CardId.MagicianRightHand, CardId.CrossoutDesignator, CardId.CalledbytheGrave); + AI.SelectCard(CardId.ThatGrassLooksGreener, _CardId.LightningStorm, CardId.PotofExtravagance, CardId.MagiciansLeftHand, CardId.MagicianRightHand, _CardId.CrossoutDesignator, _CardId.CalledByTheGrave); } } @@ -1169,7 +1143,7 @@ public bool SpellsActivatewithCounter() { if (SpellNegatable()) return false; if ((Card.Id == CardId.ThatGrassLooksGreener || Card.Id == CardId.Reasoning) && CheckWhetherWillbeRemoved()) return false; - int[] counter_cards = { CardId.PSYGamma, CardId.CalledbytheGrave, CardId.CrossoutDesignator }; + int[] counter_cards = { CardId.PSYGamma, _CardId.CalledByTheGrave, _CardId.CrossoutDesignator }; int count = Bot.Hand.GetMatchingCardsCount(card => counter_cards.Contains(card.Id)); count += Bot.SpellZone.GetMatchingCardsCount(card => counter_cards.Contains(card.Id)); if (count > 0 || Bot.Hand.GetCardCount(Card.Id) >= 2) @@ -1668,7 +1642,6 @@ public bool PittoreActivate() public bool AshBlossom_JoyousSpringActivate() { if (NegatedCheck(true) || CheckLastChainNegated()) return false; - CheckDeactiveFlag(); return DefaultAshBlossomAndJoyousSpring(); } @@ -1676,7 +1649,6 @@ public bool AshBlossom_JoyousSpringActivate() public bool PSYGammaActivate() { if (NegatedCheck(true)) return false; - CheckDeactiveFlag(); return true; } @@ -1948,18 +1920,18 @@ public bool CalledbytheGraveActivate() // negate if (Util.GetLastChainCard().IsMonster()) { - int code = Util.GetLastChainCard().Id; + int code = Util.GetLastChainCard().GetOriginCode(); if (code == 0) return false; - if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTarget == code) return false; - if (Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)) != null) + if (CheckCalledbytheGrave(code) > 0) return false; + ClientCard target = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)); + if (target != null) { if (!(Card.Location == CardLocation.SpellZone)) { SelectSTPlace(null, true); } - AI.SelectCard(code); - CalledbytheGraveCount[code] = 2; - CheckDeactiveFlag(); + AI.SelectCard(target); + currentNegatingIdList.Add(code); return true; } } @@ -1969,9 +1941,9 @@ public bool CalledbytheGraveActivate() { if (Duel.ChainTargets.Contains(cards)) { - int code = cards.Id; + int code = cards.GetOriginCode(); AI.SelectCard(cards); - CalledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); return true; } } @@ -1984,9 +1956,9 @@ public bool CalledbytheGraveActivate() { enemy_monsters.Sort(CardContainer.CompareCardAttack); enemy_monsters.Reverse(); - int code = enemy_monsters[0].Id; - AI.SelectCard(code); - CalledbytheGraveCount[code] = 2; + int code = enemy_monsters[0].GetOriginCode(); + AI.SelectCard(enemy_monsters); + currentNegatingIdList.Add(code); return true; } } @@ -1996,13 +1968,13 @@ public bool CalledbytheGraveActivate() if (Duel.LastChainPlayer == 1) return false; List targets = CheckDangerousCardinEnemyGrave(true); if (targets.Count() > 0) { - int code = targets[0].Id; + int code = targets[0].GetOriginCode(); if (!(Card.Location == CardLocation.SpellZone)) { SelectSTPlace(null, true); } - AI.SelectCard(code); - CalledbytheGraveCount[code] = 2; + AI.SelectCard(targets); + currentNegatingIdList.Add(code); return true; } @@ -2045,11 +2017,9 @@ public bool CrossoutDesignatorActivate() // negate if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) { - int code = Util.GetLastChainCard().Id; - int alias = Util.GetLastChainCard().Alias; - if (alias != 0 && alias - code < 10) code = alias; + int code = Util.GetLastChainCard().GetOriginCode(); if (code == 0) return false; - if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTarget == code) return false; + if (CheckCalledbytheGrave(code) > 0) return false; if (CheckRemainInDeck(code) > 0) { if (!(Card.Location == CardLocation.SpellZone)) @@ -2057,8 +2027,7 @@ public bool CrossoutDesignatorActivate() SelectSTPlace(null, true); } AI.SelectAnnounceID(code); - CrossoutDesignatorTarget = code; - CheckDeactiveFlag(); + currentNegatingIdList.Add(code); return true; } } @@ -2072,7 +2041,7 @@ public bool UnveilingActivate() if (NegatedCheck(true)) return false; // LightningStorm check - if (Bot.HasInHandOrInSpellZone(CardId.LightningStorm)) + if (Bot.HasInHandOrInSpellZone(_CardId.LightningStorm)) { int faceup_count = Bot.SpellZone.GetMatchingCardsCount(card => card.IsFaceup()); faceup_count += Bot.MonsterZone.GetMatchingCardsCount(card => card.IsFaceup()); @@ -2170,7 +2139,6 @@ public bool WitchcrafterBystreetActivate() public bool InfiniteImpermanenceActivate() { if (SpellNegatable()) return false; - if (CrossoutDesignatorTarget == CardId.InfiniteImpermanence) return false; if (CheckLastChainNegated()) return false; // negate before monster's effect's used foreach (ClientCard m in Enemy.GetMonsters()) @@ -2291,7 +2259,7 @@ public bool MasterpieceActivate() // ss effect { // LightningStorm check - if (Bot.HasInHandOrInSpellZone(CardId.LightningStorm)) + if (Bot.HasInHandOrInSpellZone(_CardId.LightningStorm)) { int faceup_count = Bot.SpellZone.GetMatchingCardsCount(card => card.IsFaceup()); faceup_count += Bot.MonsterZone.GetMatchingCardsCount(card => card.IsFaceup()); @@ -2478,7 +2446,6 @@ public bool BorreloadSavageDragonActivate() // negate if (NegatedCheck(true) || Duel.LastChainPlayer != 1) return false; if (Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) return false; - CheckDeactiveFlag(); return false; } @@ -2530,10 +2497,10 @@ public bool PSYOmegaActivate() } if (CheckProblematicCards() == null) { - AI.SelectCard(CardId.CalledbytheGrave, CardId.CrossoutDesignator, - CardId.MaxxC, CardId.AshBlossom_JoyousSpring, + AI.SelectCard(_CardId.CalledByTheGrave, _CardId.CrossoutDesignator, + _CardId.MaxxC, _CardId.AshBlossom, CardId.MagicianRightHand, CardId.MagiciansLeftHand, CardId.MagiciansRestage, CardId.Patronus, - CardId.LightningStorm, CardId.Reasoning); + _CardId.LightningStorm, CardId.Reasoning); return true; } } @@ -2753,7 +2720,7 @@ public List CrystronHalqifibraxSummonCheck(ClientCard included = nul if (materials.Count < 2) return empty_list; // need CrystronHalqifibrax? - if (CheckRemainInDeck(CardId.PSYGamma, CardId.AshBlossom_JoyousSpring) == 0) return empty_list; + if (CheckRemainInDeck(CardId.PSYGamma, _CardId.AshBlossom) == 0) return empty_list; return empty_list; diff --git a/Game/AI/Decks/YosenjuExecutor.cs b/Game/AI/Decks/YosenjuExecutor.cs index 7a58d6ea9..b58247e55 100644 --- a/Game/AI/Decks/YosenjuExecutor.cs +++ b/Game/AI/Decks/YosenjuExecutor.cs @@ -155,6 +155,7 @@ public override bool OnSelectHand() public override void OnNewTurn() { CardOfDemiseUsed = false; + base.OnNewTurn(); } public override bool OnSelectYesNo(int desc) diff --git a/Game/AI/Decks/ZefraExecutor.cs b/Game/AI/Decks/ZefraExecutor.cs index b6ed0fd47..ba5bb7b34 100644 --- a/Game/AI/Decks/ZefraExecutor.cs +++ b/Game/AI/Decks/ZefraExecutor.cs @@ -573,6 +573,7 @@ public override void OnNewTurn() activate_count = 0; summon_count = 0; enemy_activate = false; + base.OnNewTurn(); } private bool ZefraProvidenceEffect() { diff --git a/Game/AI/Decks/ZoodiacExecutor.cs b/Game/AI/Decks/ZoodiacExecutor.cs index 469eb0361..81d3e5f56 100644 --- a/Game/AI/Decks/ZoodiacExecutor.cs +++ b/Game/AI/Decks/ZoodiacExecutor.cs @@ -127,6 +127,7 @@ public override void OnNewTurn() TigermortarSpsummoned = false; ChakanineSpsummoned = false; BroadbullSpsummoned = false; + base.OnNewTurn(); } public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) @@ -150,6 +151,7 @@ private bool AleisterTheInvokerEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (!(Duel.Phase == DuelPhase.BattleStep || Duel.Phase == DuelPhase.BattleStart || Duel.Phase == DuelPhase.Damage)) @@ -429,8 +431,7 @@ private bool WhiptailEffect() { if (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) return false; - if (Card.IsDisabled()) - return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; ClientCard target = null; List monsters = Bot.GetMonsters(); foreach (ClientCard monster in monsters) diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 67e72bdb9..c9383c5ba 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -102,6 +102,7 @@ protected class _CardId public const int ArtifactLancea = 34267821; public const int CalledByTheGrave = 24224830; + public const int CrossoutDesignator = 65681983; public const int InfiniteImpermanence = 10045474; public const int GalaxySoldier = 46659709; public const int MacroCosmos = 30241314; @@ -226,6 +227,8 @@ protected DefaultExecutor(GameAI ai, Duel duel) } protected int lightningStormOption = -1; + Dictionary calledbytheGraveIdCountMap = new Dictionary(); + List crossoutDesignatorIdList = new List(); /// /// Defined: @@ -544,6 +547,67 @@ public override IList OnSelectCard(IList cards, int min, return null; } + public override void OnReceivingAnnouce(int player, int data) + { + if (player == 1 && data == Util.GetStringId(_CardId.LightningStorm, 0) || data == Util.GetStringId(_CardId.LightningStorm, 1)) + { + lightningStormOption = data - Util.GetStringId(_CardId.LightningStorm, 0); + } + + base.OnReceivingAnnouce(player, data); + } + + public override void OnChainEnd() + { + lightningStormOption = -1; + base.OnChainEnd(); + } + + /// + /// Reset variables for new turn. + /// + public override void OnNewTurn() + { + if (Duel.Turn <= 1) calledbytheGraveIdCountMap.Clear(); + List keyList = calledbytheGraveIdCountMap.Keys.ToList(); + foreach (int dic in keyList) + { + if (calledbytheGraveIdCountMap[dic] > 0) + { + calledbytheGraveIdCountMap[dic] -= 1; + } + } + crossoutDesignatorIdList.Clear(); + + base.OnNewTurn(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (card != null) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null && currentLocation == (int)CardLocation.Removed) + { + int originId = card.Id; + if (card.Data != null) + { + if (card.Data.Alias > 0) originId = card.Data.Alias; + else originId = card.Id; + } + if (currentSolvingChain.IsCode(_CardId.CalledByTheGrave)) + { + calledbytheGraveIdCountMap[originId] = 2; + } + if (currentSolvingChain.IsCode(_CardId.CrossoutDesignator)) + { + crossoutDesignatorIdList.Add(originId); + } + } + } + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + /// /// Destroy face-down cards first, in our turn. /// @@ -692,6 +756,7 @@ protected bool DefaultScapegoat() /// protected bool DefaultMaxxC() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } /// @@ -699,6 +764,7 @@ protected bool DefaultMaxxC() /// protected bool DefaultAshBlossomAndJoyousSpring() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int[] ignoreList = { _CardId.MacroCosmos, _CardId.UpstartGoblin, @@ -716,6 +782,7 @@ protected bool DefaultAshBlossomAndJoyousSpring() /// protected bool DefaultGhostOgreAndSnowRabbit() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsDisabled()) return false; return DefaultTrap(); @@ -725,6 +792,7 @@ protected bool DefaultGhostOgreAndSnowRabbit() /// protected bool DefaultGhostBelleAndHauntedMansion() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return DefaultTrap(); } /// @@ -732,6 +800,7 @@ protected bool DefaultGhostBelleAndHauntedMansion() /// protected bool DefaultEffectVeiler() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; ClientCard LastChainCard = Util.GetLastChainCard(); if (LastChainCard != null && (LastChainCard.IsCode(_CardId.GalaxySoldier) && Enemy.Hand.Count >= 3 || LastChainCard.IsCode(_CardId.EffectVeiler, _CardId.InfiniteImpermanence))) @@ -771,6 +840,7 @@ protected bool DefaultCalledByTheGrave() /// protected bool DefaultInfiniteImpermanence() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; // TODO: disable s & t ClientCard LastChainCard = Util.GetLastChainCard(); if (LastChainCard != null && (LastChainCard.IsCode(_CardId.GalaxySoldier) && Enemy.Hand.Count >= 3 @@ -1016,7 +1086,8 @@ protected bool DefaultMonsterRepos() /// protected bool DefaultSpellWillBeNegated() { - return (Bot.HasInSpellZone(_CardId.ImperialOrder, true, true) || Enemy.HasInSpellZone(_CardId.ImperialOrder, true)) && !Util.ChainContainsCard(_CardId.ImperialOrder); + return (Bot.HasInSpellZone(_CardId.ImperialOrder, true, true) || Enemy.HasInSpellZone(_CardId.ImperialOrder, true)) && !Util.ChainContainsCard(_CardId.ImperialOrder) + || DefaultCheckWhetherCardIsNegated(Card); } /// @@ -1024,7 +1095,8 @@ protected bool DefaultSpellWillBeNegated() /// protected bool DefaultTrapWillBeNegated() { - return (Bot.HasInSpellZone(_CardId.RoyalDecreel, true, true) || Enemy.HasInSpellZone(_CardId.RoyalDecreel, true)) && !Util.ChainContainsCard(_CardId.RoyalDecreel); + return (Bot.HasInSpellZone(_CardId.RoyalDecreel, true, true) || Enemy.HasInSpellZone(_CardId.RoyalDecreel, true)) && !Util.ChainContainsCard(_CardId.RoyalDecreel) + || DefaultCheckWhetherCardIsNegated(Card); } /// @@ -1068,6 +1140,7 @@ protected bool DefaultOnBecomeTarget() /// protected bool DefaultTrap() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return (Duel.LastChainPlayer == -1 && Duel.LastSummonPlayer != 0) || Duel.LastChainPlayer == 1; } @@ -1432,6 +1505,7 @@ protected bool DefaultHonestEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Bot.BattlingMonster.IsAttack() && ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Attack) || Bot.BattlingMonster.Attack >= Enemy.LifePoints || ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Defense) && (Bot.BattlingMonster.Attack + Enemy.BattlingMonster.Attack > Enemy.BattlingMonster.Defense))); @@ -1490,20 +1564,21 @@ protected bool DefaultVaylantzWorld_KonigWissen() return false; } - public override void OnReceivingAnnouce(int player, int data) + protected bool DefaultCheckWhetherCardIsNegated(ClientCard card) { - if (player == 1 && data == Util.GetStringId(_CardId.LightningStorm, 0) || data == Util.GetStringId(_CardId.LightningStorm, 1)) - { - lightningStormOption = data - Util.GetStringId(_CardId.LightningStorm, 0); - } - - base.OnReceivingAnnouce(player, data); + if (card == null) return true; + if (card.Data == null) return card.IsDisabled(); + int originId = card.Data.Alias; + if (originId == 0) originId = card.Data.Id; + return crossoutDesignatorIdList.Contains(originId) + || (calledbytheGraveIdCountMap.ContainsKey(originId) && calledbytheGraveIdCountMap[originId] > 0) + || card.IsDisabled(); } - - public override void OnChainEnd() + + protected bool DefaultCheckWhetherCardIdIsNegated(int cardId) { - lightningStormOption = -1; - base.OnChainEnd(); + return crossoutDesignatorIdList.Contains(cardId) + || (calledbytheGraveIdCountMap.ContainsKey(cardId) && calledbytheGraveIdCountMap[cardId] > 0); } } } diff --git a/Game/ClientCard.cs b/Game/ClientCard.cs index 1787fd7fd..d9beebda7 100644 --- a/Game/ClientCard.cs +++ b/Game/ClientCard.cs @@ -348,7 +348,7 @@ public bool IsCode(params int[] ids) public bool IsOriginalCode(int id) { - return Id == id || Alias - Id < 10 && Alias == id; + return Id == id || Alias - Id < 20 && Alias == id; } public bool HasXyzMaterial() @@ -371,6 +371,17 @@ public int GetDefensePower() return IsAttack() ? Attack : Defense; } + public int GetOriginCode() + { + int code = Id; + if (Data != null) + { + if (Data.Alias > 0) code = Data.Alias; + else code = Data.Id; + } + return code; + } + public bool Equals(ClientCard card) { return ReferenceEquals(this, card); From 3f262905159a29a4a022e1dc96818110e0f313e5 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Thu, 28 Mar 2024 20:02:37 +0800 Subject: [PATCH 024/110] fix --- Game/AI/Decks/SuperheavySamuraiExecutor.cs | 501 ++++++++++++--------- 1 file changed, 279 insertions(+), 222 deletions(-) diff --git a/Game/AI/Decks/SuperheavySamuraiExecutor.cs b/Game/AI/Decks/SuperheavySamuraiExecutor.cs index 5e9c67438..619e3e368 100644 --- a/Game/AI/Decks/SuperheavySamuraiExecutor.cs +++ b/Game/AI/Decks/SuperheavySamuraiExecutor.cs @@ -17,7 +17,7 @@ public class CardId public const int Wagon = 34496660;//大八 public const int Soulpiercer = 90361010;//岩融 public const int Wakaushi = 82112494;//牛若 - public const int Scales = 78391364;//天秤 + public const int Scales = 78391364;//天秤 public const int Booster = 56727340;//地铠 public const int Motorbike = 83334932;//摩托 public const int Soulhorns = 14624296;//双角 @@ -60,11 +60,12 @@ public class CardId private bool activate_Wagon = false;//大巴 private bool activate_Booster = false;//地铠 private bool activate_Soulpeacemaker = false;//仲裁 - private bool activate_Benkei = false;//弁庆 - private bool need_Gear = false;//齿轮齿巨人 + private bool activate_Benkei = false;//弁庆 + private bool need_Gear = false;//齿轮齿巨人 //案山子 - private bool activate_Scarecrow = false; - private bool summon_Scarecrow = false; + private bool activate_Scarecrow=false; + private bool summon_Scarecrow=false; + private bool summon_Scarecrow2=true; private bool activate_Sarutobi = false;//猿飞 private bool activate_Genius = false;//路径灵 //淘气精灵 @@ -80,107 +81,112 @@ public SuperheavySamuraiExecutor(GameAI ai, Duel duel) : base(ai, duel) { AddExecutor(ExecutorType.Activate, CardId.PSYFramelordOmega); - AddExecutor(ExecutorType.Activate, CardId.IP, IPFunction); - AddExecutor(ExecutorType.Activate, CardId.Sarutobi, SarutobiFunction); - AddExecutor(ExecutorType.Activate, CardId.Unicorn, UnicornFunction); - AddExecutor(ExecutorType.Activate, CardId.MaxxG, MaxxCFunction); - AddExecutor(ExecutorType.Activate, CardId.JoyousSpring, DefaultAshBlossomAndJoyousSpring); - AddExecutor(ExecutorType.Activate, CardId.SnowRabbit, DefaultGhostOgreAndSnowRabbit); - AddExecutor(ExecutorType.Activate, CardId.EffectVeiler, DefaultBreakthroughSkill); - AddExecutor(ExecutorType.Activate, CardId.LockBird, LockBirdFunction); - AddExecutor(ExecutorType.Activate, CardId.PsyFramegearGamma, FunctionInHand); - AddExecutor(ExecutorType.Activate, CardId.HauntedMansion, FunctionInHand); - AddExecutor(ExecutorType.Activate, CardId.Masurawo, MasurawoFunction); - AddExecutor(ExecutorType.Activate, CardId.Genius, GeniusFunction); - - //Motorbike's Effect - AddExecutor(ExecutorType.Activate, CardId.Motorbike, MotorbikeFunction); - - //Scales's Effect + AddExecutor(ExecutorType.Activate, CardId.IP,IPFunction); + AddExecutor(ExecutorType.Activate, CardId.Sarutobi,SarutobiFunction); + AddExecutor(ExecutorType.Activate, CardId.Unicorn,UnicornFunction); + AddExecutor(ExecutorType.Activate, CardId.MaxxG,MaxxCFunction); + AddExecutor(ExecutorType.Activate, CardId.JoyousSpring,DefaultAshBlossomAndJoyousSpring); + AddExecutor(ExecutorType.Activate, CardId.SnowRabbit,DefaultGhostOgreAndSnowRabbit); + AddExecutor(ExecutorType.Activate, CardId.EffectVeiler,DefaultBreakthroughSkill); + AddExecutor(ExecutorType.Activate, CardId.LockBird,LockBirdFunction); + AddExecutor(ExecutorType.Activate, CardId.PsyFramegearGamma,FunctionInHand); + AddExecutor(ExecutorType.Activate, CardId.HauntedMansion,FunctionInHand); + AddExecutor(ExecutorType.Activate, CardId.Masurawo,MasurawoFunction); + AddExecutor(ExecutorType.Activate, CardId.Genius,GeniusFunction); + + //Motorbike's Effect + AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); + + //Scales's Effect AddExecutor(ExecutorType.SpSummon, CardId.Scales); - AddExecutor(ExecutorType.Activate, CardId.Scales, ScalesFunction); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon, ASStardustDragonSynchronFunction2); - AddExecutor(ExecutorType.SpSummon, CardId.Fleur, FleurSynchronFunction2); + AddExecutor(ExecutorType.Activate, CardId.Scales,ScalesFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction2); + AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction2); + + //Pendulum + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiFunction); + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiEffectFunction); + AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiFunction); + AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiEffectFunction); + + //Normal Summon & Effect + AddExecutor(ExecutorType.Summon, CardId.Soulpiercer,NormalSummonFunction); + AddExecutor(ExecutorType.Activate, CardId.Soulpiercer,SoulpiercerFunction); + + AddExecutor(ExecutorType.Summon, CardId.Wagon,NormalSummonFunction); + AddExecutor(ExecutorType.Activate, CardId.Wagon,WagonFunction); + AddExecutor(ExecutorType.Activate, CardId.Wagon,WagonFunction); + + AddExecutor(ExecutorType.Summon, CardId.Booster,BoosterNormalSummonFunction); + AddExecutor(ExecutorType.Summon, CardId.Scales,ScalesNormalSummonFunction); + + //boost & Gear + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + AddExecutor(ExecutorType.SpSummon, CardId.GearGigant,GearGigantXyzFunction); + AddExecutor(ExecutorType.Activate, CardId.GearGigant,GearGigantFunction); + + //equip Soulpiercer + AddExecutor(ExecutorType.Activate, CardId.Soulpiercer,SoulpiercerEquipFunction); + + //Link Scarecrow + AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction); + AddExecutor(ExecutorType.Activate, CardId.Scarecrow,ScarecrowFunction); + AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction2); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction); + + //Effect After Synchron + AddExecutor(ExecutorType.Activate, CardId.SavageDragon,SavageDragonFunction); + AddExecutor(ExecutorType.Activate, CardId.ASStardustDragon,ASStardustDragonFunction); + + //Wakaushi's Effect After Synchron + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiReturnPFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction); + AddExecutor(ExecutorType.Activate, CardId.Fleur,FleurFunction); + + //equip Soulpeacemaker + AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker,SoulpeacemakerEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker,SoulpeacemakerFunction); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.Genius,GeniusLinkFunction); + + AddExecutor(ExecutorType.SpSummon, Psummon); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.Elf,ElfLinkFunction); + AddExecutor(ExecutorType.Activate, CardId.Elf,ElfFunction); - AddExecutor(ExecutorType.Activate, CardId.Wakaushi, WakaushiFunction); - AddExecutor(ExecutorType.Activate, CardId.Wakaushi, WakaushiEffectFunction); - AddExecutor(ExecutorType.Activate, CardId.Benkei, BenkeiEffectFunction); - - //Normal Summon & Effect - AddExecutor(ExecutorType.Summon, CardId.Soulpiercer, NormalSummonFunction); - AddExecutor(ExecutorType.Activate, CardId.Soulpiercer, SoulpiercerFunction); + AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); - AddExecutor(ExecutorType.Summon, CardId.Wagon, NormalSummonFunction); - AddExecutor(ExecutorType.Activate, CardId.Wagon, WagonFunction); - AddExecutor(ExecutorType.Activate, CardId.Wagon, WagonFunction); + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.SavageDragon,SavageDragonSynchronFunction); - AddExecutor(ExecutorType.Summon, CardId.Booster, BoosterNormalSummonFunction); - AddExecutor(ExecutorType.Summon, CardId.Scales, ScalesNormalSummonFunction); - - //boost & Gear - AddExecutor(ExecutorType.Activate, CardId.Booster, BoosterEquipFunction); - AddExecutor(ExecutorType.Activate, CardId.Booster, BoosterFunction); - AddExecutor(ExecutorType.SpSummon, CardId.GearGigant, GearGigantXyzFunction); - AddExecutor(ExecutorType.Activate, CardId.GearGigant, GearGigantFunction); - - //equip Soulpiercer - AddExecutor(ExecutorType.Activate, CardId.Soulpiercer, SoulpiercerEquipFunction); - - //Link Scarecrow - AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow, ScarecrowLinkFunction); - AddExecutor(ExecutorType.Activate, CardId.Scarecrow, ScarecrowFunction); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon, ASStardustDragonSynchronFunction); - - //Effect After Synchron - AddExecutor(ExecutorType.Activate, CardId.SavageDragon, SavageDragonFunction); - AddExecutor(ExecutorType.Activate, CardId.ASStardustDragon, ASStardustDragonFunction); - - //Wakaushi's Effect After Synchron - AddExecutor(ExecutorType.Activate, CardId.Wakaushi, WakaushiReturnPFunction); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.Fleur, FleurSynchronFunction); - AddExecutor(ExecutorType.Activate, CardId.Fleur, FleurFunction); - - //equip Soulpeacemaker - AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker, SoulpeacemakerEquipFunction); - AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker, SoulpeacemakerFunction); - - //Link - AddExecutor(ExecutorType.SpSummon, CardId.Genius, GeniusLinkFunction); + //Link + AddExecutor(ExecutorType.SpSummon, CardId.IP,IPLinkFunction); - AddExecutor(ExecutorType.SpSummon, Psummon); - - //Link - AddExecutor(ExecutorType.SpSummon, CardId.Elf, ElfLinkFunction); - AddExecutor(ExecutorType.Activate, CardId.Elf, ElfFunction); + //Regulus's Effect + AddExecutor(ExecutorType.Activate, CardId.Regulus,RegulusFunction); - AddExecutor(ExecutorType.Activate, CardId.Motorbike, MotorbikeFunction); - - //Regulus's Effect - AddExecutor(ExecutorType.Activate, CardId.Regulus, RegulusFunction); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.SavageDragon, SavageDragonSynchronFunction); - - //Link - AddExecutor(ExecutorType.SpSummon, CardId.IP, IPLinkFunction); - - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.Masurawo, MasurawoSynchronFunction); - AddExecutor(ExecutorType.SpSummon, CardId.Sarutobi, DeSynchronFunction); - AddExecutor(ExecutorType.SpSummon, CardId.PSYFramelordOmega); - - //equip Soulhorns - AddExecutor(ExecutorType.Activate, CardId.Soulhorns, SoulhornsEquipFunction); - - //booster - AddExecutor(ExecutorType.Activate, CardId.Booster, BoosterEquipFunction2); - AddExecutor(ExecutorType.Activate, CardId.Booster, BoosterFunction); + //booster + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction2); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction3); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.Masurawo,MasurawoSynchronFunction); + AddExecutor(ExecutorType.SpSummon, CardId.Sarutobi,DeSynchronFunction); + AddExecutor(ExecutorType.SpSummon, CardId.PSYFramelordOmega); + + //equip Soulhorns + AddExecutor(ExecutorType.Activate, CardId.Soulhorns,SoulhornsEquipFunction); } public override void OnNewTurn() @@ -196,8 +202,9 @@ public override void OnNewTurn() activate_Soulpeacemaker = false; activate_Benkei = false; need_Gear = false; - activate_Scarecrow = false; - summon_Scarecrow = false; + activate_Scarecrow=false; + summon_Scarecrow=false; + summon_Scarecrow2=true; activate_Elf = false; summon_Elf = false; activate_MaxxG = false; @@ -218,8 +225,8 @@ public override int OnSelectPlace(int cardId, int player, CardLocation location, { if (cardId == CardId.Scarecrow) { - int a = (Zones.z6 & available); - int b = (Zones.z5 & available); + int a=(Zones.z6 & available); + int b=(Zones.z5 & available); if (Bot.MonsterZone[2] != null && Bot.MonsterZone[2].Controller == 0 && !FinalCards(Bot.MonsterZone[2].Id)) a = 0; else if (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id)) @@ -234,8 +241,8 @@ public override int OnSelectPlace(int cardId, int player, CardLocation location, } else if (cardId == CardId.Genius) { - int a = (Zones.z6 & available); - int b = (Zones.z5 & available); + int a=(Zones.z6 & available); + int b=(Zones.z5 & available); if (Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) a = 0; else if (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id)) @@ -266,7 +273,7 @@ public override IList OnSelectCard(IList cards, int min, { List result = new List(); List scards = cards.Where(card => card != null && card.HasSetcode(0x9a) && card.Level == 4).ToList(); - if (scards.Count < 2) scards = cards.Where(card => card != null && card.HasSetcode(0x9a)).ToList(); + if (scards.Count <2) scards = cards.Where(card => card != null && card.HasSetcode(0x9a)).ToList(); p_summoning = false; if (scards.Count > 0) return Util.CheckSelectCount(result, scards, 1, 1); else if (min == 0) return result; // empty @@ -287,8 +294,8 @@ private List GetZoneCards(CardLocation loc, ClientField player) } private bool FinalCards(int cname) { - int[] cardsname = new[] { CardId.Masurawo, CardId.Fleur, CardId.SavageDragon, CardId.Sarutobi, CardId.Regulus, CardId.IP }; - foreach (var cardname in cardsname) + int[] cardsname = new[] {CardId.Masurawo,CardId.Fleur,CardId.SavageDragon,CardId.Sarutobi,CardId.Regulus,CardId.IP}; + foreach(var cardname in cardsname) { if (cname == cardname) return true; } @@ -296,10 +303,10 @@ private bool FinalCards(int cname) } private bool TurnerCards(int cname) { - int[] cardsname = new[] { CardId.PsyFramegearGamma, CardId.Wakaushi, CardId.Motorbike }; - foreach (var cardname in cardsname) - { - if (cname == cardname) return true; + int[] cardsname =new[] {CardId.PsyFramegearGamma,CardId.Wakaushi,CardId.Motorbike}; + foreach(var cardname in cardsname) + { + if (cname == cardname) return true; } return false; } @@ -340,11 +347,16 @@ private bool MotorbikeFunction() { if (DefaultCheckWhetherCardIsNegated(Card)) return false; int targetid = -1; + List cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup()).ToList(); if (!(Bot.HasInHand(CardId.Wakaushi) || Bot.HasInMonstersZone(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) { targetid = CardId.Wakaushi; } - else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker && !normal_summon) + else if (cards.Count() == 0 && !normal_summon) + { + targetid = CardId.Soulpiercer; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker) && !activate_Soulpeacemaker && (normal_summon || Bot.HasInMonstersZone(CardId.Scarecrow))) { targetid = CardId.Soulpeacemaker; } @@ -403,7 +415,7 @@ private bool WagonFunction() if (ActivateDescription == Util.GetStringId(CardId.Wagon, 1)) { int targetid = -1; - if (!(Bot.HasInHand(CardId.Soulpiercer) || Bot.HasInMonstersZone(CardId.Soulpiercer))) + if (!(Bot.HasInHand(CardId.Soulpiercer)||Bot.HasInMonstersZone(CardId.Soulpiercer))) { targetid = CardId.Soulpiercer; } @@ -462,7 +474,7 @@ private bool SoulpiercerFunction() { targetid = CardId.Soulhorns; } - else { targetid = CardId.Wakaushi; } + else {targetid = CardId.Wakaushi;} if (targetid > 0) AI.SelectCard(targetid); return true; } @@ -470,7 +482,7 @@ private bool SoulpiercerFunction() } private bool WakaushiFunction() { - if (Card.Location != CardLocation.Hand || Bot.HasInMonstersZone(CardId.Wakaushi)) + if (Card.Location != CardLocation.Hand||Bot.HasInMonstersZone(CardId.Wakaushi)) return false; ClientCard l = Util.GetPZone(0, 0); ClientCard r = Util.GetPZone(0, 1); @@ -492,12 +504,21 @@ private bool WakaushiEffectFunction() } return false; } + private bool BenkeiFunction() + { + if (Card.Location != CardLocation.Hand || Bot.HasInSpellZone(CardId.Benkei)) return false; + List cards1 = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.Id == CardId.Benkei).ToList(); + List cards2 = GetZoneCards(CardLocation.Removed, Bot).Where(card => card != null && card.Id == CardId.Benkei).ToList(); + if (cards1.Count() >= 2 || Bot.HasInGraveyard(CardId.Benkei) || Bot.HasInExtra(CardId.Benkei) || cards2.Count() > 0) + return true; + return false; + } private bool BenkeiEffectFunction() { if (Card.Location == CardLocation.SpellZone) { int targetid = -1; - if (!(Bot.HasInHand(CardId.Soulpiercer) || Bot.HasInMonstersZone(CardId.Soulpiercer))) + if (!(Bot.HasInHand(CardId.Soulpiercer) || Bot.HasInMonstersZone(CardId.Soulpiercer) || Bot.HasInSpellZone(CardId.Soulpiercer)) && !(Bot.HasInMonstersZone(CardId.Scarecrow) && !activate_Soulpeacemaker)) { targetid = CardId.Soulpiercer; } @@ -517,7 +538,7 @@ private bool BenkeiEffectFunction() } private bool WakaushiReturnPFunction() { - if (Card.Location == CardLocation.Extra || Card.Location == CardLocation.Removed) + if (Card.Location == CardLocation.Extra||Card.Location == CardLocation.Removed) { ClientCard l = Util.GetPZone(0, 0); ClientCard r = Util.GetPZone(0, 1); @@ -558,7 +579,7 @@ private bool MasurawoSynchronFunction() bool chk = true; if (Bot.HasInMonstersZone(CardId.ASStardustDragon) || Bot.HasInMonstersZone(CardId.Benkei)) chk = false; - var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, 12, 1, 1, false, chk, null, + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,12,1,1,false,chk,null, card => { return !FinalCards(card.Id); }); if (materials_lists.Count <= 0) return false; AI.SelectMaterials(materials_lists[0]); @@ -570,7 +591,7 @@ private bool FleurSynchronFunction() bool chk = true; if (Bot.HasInMonstersZone(CardId.Motorbike) && (Bot.HasInMonstersZone(CardId.ASStardustDragon) || Bot.HasInMonstersZone(CardId.Benkei))) chk = false; - var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, 10, 1, 1, false, chk, null, + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,10,1,1,false,chk,null, card => { return !FinalCards(card.Id); }); if (materials_lists.Count <= 0) return false; AI.SelectMaterials(materials_lists[0]); @@ -578,7 +599,7 @@ private bool FleurSynchronFunction() } private bool FleurSynchronFunction2() { - var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, 10, 1, 1, false, false, null, + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,10,1,1,false,false,null, card => { return !FinalCards(card.Id); }); if (materials_lists.Count <= 0) return false; AI.SelectMaterials(materials_lists[0]); @@ -636,7 +657,7 @@ private bool SavageDragonFunction() } private bool ASStardustDragonFunction() { - if (Duel.LastChainPlayer == 1 && ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 0)) + if (Duel.LastChainPlayer == 1 && ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 1)) { return true; } @@ -663,10 +684,9 @@ private bool ScarecrowLinkFunction() { List material = new List(); List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); - if (cards.Count > 0 || summon_Scarecrow || activate_Scarecrow) return false; + if ((cards.Count() > 0 && !summon_Scarecrow) || summon_Scarecrow || activate_Scarecrow) return false; int targetid = -1; - if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null) - { + if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null) { if (Bot.MonsterZone[0].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[0]); else if (Bot.MonsterZone[2].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[2]); else if (!FinalCards(Bot.MonsterZone[0].Id) && Bot.MonsterZone[0].HasSetcode(0x9a)) material.Add(Bot.MonsterZone[0]); @@ -682,13 +702,13 @@ private bool ScarecrowLinkFunction() } if (material.Count > 0) AI.SelectMaterials(material); else if (targetid > 0) AI.SelectMaterials(targetid); - summon_Scarecrow = true; + summon_Scarecrow=true; return (Bot.HasInGraveyard(new[] { CardId.Soulpiercer, CardId.Wakaushi, CardId.Benkei, CardId.Wagon, - }) || Bot.HasInMonstersZone(new[] { + })||Bot.HasInMonstersZone(new[] { CardId.Soulpiercer, CardId.Wagon, CardId.Wakaushi, @@ -705,78 +725,80 @@ private bool ScarecrowFunction() { int tributeId = -1; if (Bot.HasInHand(CardId.PsyFrameDriver)) - { tributeId = CardId.PsyFrameDriver; } + {tributeId = CardId.PsyFrameDriver;} else if (Bot.HasInHand(CardId.PsyFramegearGamma)) - { tributeId = CardId.PsyFramegearGamma; } + {tributeId = CardId.PsyFramegearGamma;} else if (Bot.HasInHand(CardId.Benkei)) - { tributeId = CardId.Benkei; } + {tributeId = CardId.Benkei;} else if (Bot.HasInHand(CardId.HauntedMansion)) - { tributeId = CardId.HauntedMansion; } + {tributeId = CardId.HauntedMansion;} else if (Bot.HasInHand(CardId.EffectVeiler)) - { tributeId = CardId.EffectVeiler; } + {tributeId = CardId.EffectVeiler;} else if (Bot.HasInHand(CardId.SnowRabbit)) - { tributeId = CardId.SnowRabbit; } + {tributeId = CardId.SnowRabbit;} else if (Bot.HasInHand(CardId.JoyousSpring)) - { tributeId = CardId.JoyousSpring; } + {tributeId = CardId.JoyousSpring;} else if (Bot.HasInHand(CardId.Booster)) - { tributeId = CardId.Booster; } + {tributeId = CardId.Booster;} else if (Bot.HasInHand(CardId.Wagon)) - { tributeId = CardId.Wagon; } + {tributeId = CardId.Wagon;} else if (Bot.HasInHand(CardId.Scales)) - { tributeId = CardId.Scales; } + {tributeId = CardId.Scales;} else if (Bot.HasInHand(CardId.LockBird)) - { tributeId = CardId.LockBird; } + {tributeId = CardId.LockBird;} else if (Bot.HasInHand(CardId.MaxxG)) - { tributeId = CardId.MaxxG; } + {tributeId = CardId.MaxxG;} int needId = -1; if (Bot.HasInGraveyard(CardId.Soulpiercer)) { if (Bot.HasInGraveyard(CardId.Scales) && !activate_Scales) - { needId = CardId.Scales; } + {needId = CardId.Scales;} else - { needId = CardId.Soulpiercer; } + {needId = CardId.Soulpiercer;} } else if (Bot.HasInGraveyard(CardId.Masurawo)) - { needId = CardId.Masurawo; } + {needId = CardId.Masurawo;} else if (Bot.HasInGraveyard(CardId.Sarutobi)) - { needId = CardId.Sarutobi; } + {needId = CardId.Sarutobi;} else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) { if (Bot.HasInGraveyard(CardId.Wakaushi)) - { needId = CardId.Wakaushi; } + {needId = CardId.Wakaushi;} if (Bot.HasInGraveyard(CardId.Motorbike)) - { needId = CardId.Motorbike; } + {needId = CardId.Motorbike;} } - if (GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Grave, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Onfield, Bot).Count(card => card != null && card.Id == CardId.Scales) == 2 && GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales) >= 1 && !activate_Scales) + if (GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Grave, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Onfield, Bot).Count(card => card != null && card.Id == CardId.Scales) == 2 && GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales)>=1 && !activate_Scales) { tributeId = CardId.Scales; needId = CardId.Scales; } AI.SelectCard(tributeId); AI.SelectNextCard(needId); - activate_Scarecrow = true; - if (!summon_Scarecrow - && ((Bot.HasInHand(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) - && (Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) - && ((Bot.HasInHand(CardId.Soulpeacemaker) || Bot.HasInSpellZone(CardId.Soulpeacemaker)) && !activate_Soulpeacemaker) - && (Bot.HasInSpellZone(CardId.Benkei) && !activate_Benkei) - && (Bot.HasInHand(CardId.Soulpiercer) && !normal_summon) - && ((Bot.HasInGraveyard(CardId.Scales) || Bot.HasInHand(CardId.Soulpiercer)) && !activate_Scales && !normal_summon) + if (((!Bot.HasInHand(CardId.Wakaushi) && !Bot.HasInSpellZone(CardId.Wakaushi)) || activate_Wakaushi) + && (!Bot.HasInHand(CardId.Motorbike) || activate_Motorbike) + && ((!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker)) || activate_Soulpeacemaker) + && (!Bot.HasInSpellZone(CardId.Benkei) || activate_Benkei) + && (needId == CardId.Soulpiercer) + && (!activate_Wakaushi || !activate_Motorbike || !activate_Soulpeacemaker || !activate_Benkei) ) { - activate_Scarecrow = false; - summon_Scarecrow = false; + summon_Scarecrow2 = false; } - else if (needId != CardId.Soulpiercer) + activate_Scarecrow = true; + return true; + } + private bool ScarecrowLinkFunction2() + { + if (!summon_Scarecrow2) { - activate_Scarecrow = false; - summon_Scarecrow = false; + summon_Scarecrow2 = true; + return true; } - return true; + return false; } private bool UnicornFunction() { - List Enemycards = GetZoneCards(CardLocation.Onfield, Enemy); + List Enemycards = GetZoneCards(CardLocation.Onfield,Enemy); if (Bot.Hand.Count == 0 || Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0) { if (to_deck) to_deck = false; @@ -784,29 +806,29 @@ private bool UnicornFunction() } int tributeId = -1; if (Bot.HasInHand(CardId.PsyFrameDriver)) - { tributeId = CardId.PsyFrameDriver; } + {tributeId = CardId.PsyFrameDriver;} else if (Bot.HasInHand(CardId.PsyFramegearGamma)) - { tributeId = CardId.PsyFramegearGamma; } + {tributeId = CardId.PsyFramegearGamma;} else if (Bot.HasInHand(CardId.Benkei)) - { tributeId = CardId.Benkei; } + {tributeId = CardId.Benkei;} else if (Bot.HasInHand(CardId.HauntedMansion)) - { tributeId = CardId.HauntedMansion; } + {tributeId = CardId.HauntedMansion;} else if (Bot.HasInHand(CardId.EffectVeiler)) - { tributeId = CardId.EffectVeiler; } + {tributeId = CardId.EffectVeiler;} else if (Bot.HasInHand(CardId.SnowRabbit)) - { tributeId = CardId.SnowRabbit; } + {tributeId = CardId.SnowRabbit;} else if (Bot.HasInHand(CardId.JoyousSpring)) - { tributeId = CardId.JoyousSpring; } + {tributeId = CardId.JoyousSpring;} else if (Bot.HasInHand(CardId.Booster)) - { tributeId = CardId.Booster; } + {tributeId = CardId.Booster;} else if (Bot.HasInHand(CardId.Wagon)) - { tributeId = CardId.Wagon; } + {tributeId = CardId.Wagon;} else if (Bot.HasInHand(CardId.Scales)) - { tributeId = CardId.Scales; } + {tributeId = CardId.Scales;} else if (Bot.HasInHand(CardId.LockBird)) - { tributeId = CardId.LockBird; } + {tributeId = CardId.LockBird;} else if (Bot.HasInHand(CardId.MaxxG)) - { tributeId = CardId.MaxxG; } + {tributeId = CardId.MaxxG;} if (to_deck) to_deck = false; AI.SelectCard(tributeId); return true; @@ -815,7 +837,7 @@ private bool BoosterEquipFunction() { if (Card.Location != CardLocation.Hand || activate_Booster) return false; - List ChkCardsHand = Bot.Hand.GetMonsters().ToList(); + List ChkCardsHand = Bot.Hand.GetMonsters().ToList(); foreach (var card in ChkCardsHand) { if (card.Id == CardId.Motorbike && !activate_Motorbike) return false; @@ -825,7 +847,7 @@ private bool BoosterEquipFunction() else if (card.Id == CardId.Wagon && (!activate_Wagon || !normal_summon)) return false; else if (card.Id == CardId.Benkei && !activate_Benkei) return false; } - List ChkCardsSpell = GetZoneCards(CardLocation.SpellZone, Bot).Where(card => card != null && card.IsFaceup()).ToList(); + List ChkCardsSpell = GetZoneCards(CardLocation.SpellZone,Bot).Where(card => card != null && card.IsFaceup()).ToList(); foreach (var card in ChkCardsSpell) { if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; @@ -834,13 +856,13 @@ private bool BoosterEquipFunction() else if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; else if (card.Id == CardId.Benkei && !activate_Benkei) return false; } - List ChkCardsMonster = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup() && card.Level == 4).ToList(); + List ChkCardsMonster = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Level == 4).ToList(); if (ChkCardsMonster.Count == 0) return false; foreach (var card in ChkCardsMonster) { if (card.Id == CardId.Soulpiercer) return false; } - List ChkCardsGrave = GetZoneCards(CardLocation.Grave, Bot).ToList(); + List ChkCardsGrave = GetZoneCards(CardLocation.Grave,Bot).ToList(); foreach (var card in ChkCardsGrave) { if (card.Id == CardId.Soulpiercer && (Bot.HasInMonstersZone(CardId.Scarecrow) || Bot.HasInExtra(CardId.Scarecrow))) return false; @@ -852,7 +874,13 @@ private bool BoosterEquipFunction() } private bool BoosterEquipFunction2() { - if (Bot.HasInExtra(CardId.IP) && p_summoned) return true; + if (Bot.HasInExtra(CardId.IP) && p_summoned && !activate_Booster) return true; + return false; + } + private bool BoosterEquipFunction3() + { + List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.Scarecrow).ToList(); + if (Bot.HasInMonstersZone(CardId.IP) && p_summoned && !activate_Booster && cards.Count() == 0) return true; return false; } private bool BoosterFunction() @@ -877,7 +905,7 @@ private bool GearGigantFunction() { if (Card.Location == CardLocation.MonsterZone) { - List ChkCards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup() && card.HasSetcode(0x9a)).ToList(); + List ChkCards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.HasSetcode(0x9a)).ToList(); int targetid = -1; if (!Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) { @@ -902,9 +930,9 @@ private bool SoulpiercerEquipFunction() return false; int tributeId = -1; if (Bot.HasInMonstersZone(CardId.Wagon)) - { tributeId = CardId.Wagon; } + {tributeId = CardId.Wagon;} else if (Bot.HasInMonstersZone(CardId.Wakaushi)) - { tributeId = CardId.Wakaushi; } + {tributeId = CardId.Wakaushi;} AI.SelectCard(tributeId); return Bot.HasInMonstersZone(new[] { CardId.Wakaushi, @@ -916,11 +944,17 @@ private bool SoulpeacemakerEquipFunction() if (Card.Location != CardLocation.Hand) return false; int tributeId = -1; - if (Bot.HasInMonstersZone(CardId.Scarecrow)) - { tributeId = CardId.Scarecrow; } - else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) - { tributeId = CardId.Soulpiercer; } - AI.SelectCard(tributeId); + List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); + if (cards.Count() > 0) + AI.SelectCard(cards); + else + { + if (Bot.HasInMonstersZone(CardId.Scarecrow)) + {tributeId = CardId.Scarecrow;} + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + {tributeId = CardId.Soulpiercer;} + AI.SelectCard(tributeId); + } return Bot.HasInMonstersZone(new[] { CardId.Scarecrow, CardId.Soulpiercer, @@ -932,9 +966,9 @@ private bool SoulhornsEquipFunction() return false; int tributeId = -1; if (Bot.HasInMonstersZone(CardId.Masurawo)) - { tributeId = CardId.Masurawo; } + {tributeId = CardId.Masurawo;} else if (Bot.HasInMonstersZone(CardId.Sarutobi)) - { tributeId = CardId.Sarutobi; } + {tributeId = CardId.Sarutobi;} AI.SelectCard(tributeId); return Bot.HasInMonstersZone(new[] { CardId.Masurawo, @@ -947,11 +981,11 @@ private bool SoulpeacemakerFunction() { int tributeId = -1; if (Bot.HasInMonstersZone(CardId.Soulpiercer)) - { tributeId = CardId.Wakaushi; } - else if (Bot.HasInGraveyard(CardId.Soulpiercer) || !activate_Scales) - { tributeId = CardId.Scales; } - else if (!Bot.HasInGraveyard(CardId.Soulpiercer) || activate_Scales) - { tributeId = CardId.Soulpiercer; } + {tributeId = CardId.Wakaushi;} + else if (Bot.HasInGraveyard(CardId.Soulpiercer)||!activate_Scales) + {tributeId = CardId.Scales;} + else if (!Bot.HasInGraveyard(CardId.Soulpiercer)||activate_Scales) + {tributeId = CardId.Soulpiercer;} AI.SelectCard(tributeId); activate_Soulpeacemaker = true; return true; @@ -962,14 +996,10 @@ private bool GeniusLinkFunction() { if ((Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) && (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id))) return false; - int CardCount = 0; - foreach (ClientCard card in Bot.Hand.GetMonsters()) - { - if (card.HasRace(CardRace.Machine) && (card.Level >= 2 && card.Level <= 7)) - { CardCount++; } - } - if (CardCount < 2 && !Bot.HasInMonstersZone(CardId.Soulpiercer)) { return false; } - if (Bot.HasInHand(CardId.Regulus) || Bot.HasInGraveyard(CardId.Regulus) || Bot.HasInSpellZone(CardId.Regulus) || Bot.HasInMonstersZone(CardId.Regulus)) return false; + List Pcards = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.HasSetcode(0x9a) && card.Level > 1 && card.Level < 8).ToList(); + if (Pcards.Count() < 2 && !Bot.HasInMonstersZone(CardId.Soulpiercer)) return false; + List Rcards = GetZoneCards(CardLocation.Removed, Bot).Where(card => card != null && card.Id == CardId.Regulus).ToList(); + if (Bot.HasInHand(CardId.Regulus) || Bot.HasInGraveyard(CardId.Regulus) || Bot.HasInSpellZone(CardId.Regulus) || Bot.HasInMonstersZone(CardId.Regulus) || Rcards.Count() > 0) return false; bool linkchk = false; List materials = new List(); if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[6].Id)) @@ -988,13 +1018,13 @@ private bool GeniusLinkFunction() if (card == null || FinalCards(card.Id)) continue; else materials.Add(card); } - if (materials.Count <= 1) return false; + if (materials.Count <=1) return false; AI.SelectMaterials(materials); return ((Bot.GetMonstersInExtraZone().Count == 0 || linkchk) && !p_summoned && !activate_Genius); } private bool GeniusFunction() { - if (ActivateDescription == Util.GetStringId(CardId.Genius, 1)) + if (ActivateDescription == Util.GetStringId(CardId.Genius,1)) { AI.SelectCard(CardId.Regulus); activate_Genius = true; @@ -1022,28 +1052,45 @@ private bool ElfLinkFunction() foreach (var card in TunrerCards) { if (card == null) continue; - else if (materials.Count(ccard => ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); + else if (materials.Count(ccard =>ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); } - } + } else { foreach (var card in UnTunrercards) { if (card == null) continue; - else if (materials.Count(ccard => ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); + else if (materials.Count(ccard =>ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); } } - if (materials.Count <= 1) return false; + if (materials.Count <=1) return false; AI.SelectMaterials(materials); summon_Elf = true; return true; } private bool ElfFunction() { - AI.SelectCard(CardId.Motorbike); - AI.SelectPosition(CardPosition.FaceUpDefence); - activate_Elf = true; - return Bot.HasInGraveyard(CardId.Motorbike); + if (Duel.Player == 0) + { + activate_Elf = true; + AI.SelectCard(CardId.Motorbike); + return Bot.HasInGraveyard(CardId.Motorbike); + } + List cards1 = GetZoneCards(CardLocation.MonsterZone, Enemy); + List cards2 = GetZoneCards(CardLocation.SpellZone, Enemy); + if (cards1.Count() > 0 || cards2.Count() >= 3) + { + if (Bot.HasInExtra(CardId.Unicorn) && Bot.HasInGraveyard(CardId.IP)) + AI.SelectCard(CardId.IP); + else + { + AI.SelectCard(CardId.Motorbike); + AI.SelectPosition(CardPosition.FaceUpDefence); + } + activate_Elf = true; + return Bot.HasInGraveyard(CardId.Motorbike) || Bot.HasInGraveyard(CardId.IP); + } + return false; } private bool RegulusFunction() { @@ -1051,9 +1098,9 @@ private bool RegulusFunction() { int tributeId = -1; if (Bot.HasInGraveyard(CardId.Soulpiercer)) - { tributeId = CardId.Soulpiercer; } + {tributeId = CardId.Soulpiercer;} else if (Bot.HasInGraveyard(CardId.Motorbike)) - { tributeId = CardId.Motorbike; } + {tributeId = CardId.Motorbike;} AI.SelectCard(tributeId); activate_Genius = true; return true; @@ -1094,9 +1141,19 @@ private bool FleurFunction() } private bool IPLinkFunction() { - List cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup() && card.Id != CardId.Scarecrow && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf)) && !FinalCards(card.Id)).ToList(); - if (cards.Count <= 1) return false; - AI.SelectMaterials(cards); + List materials = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Id != CardId.Scarecrow && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf)) && !FinalCards(card.Id)).ToList(); + if (materials.Count <=1) return false; + if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].HasType(CardType.Link)) + { + if (Bot.MonsterZone[2] != null && FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[4] != null && FinalCards(Bot.MonsterZone[4].Id)) + return false; + } + else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && Bot.MonsterZone[5].HasType(CardType.Link)) + { + if (Bot.MonsterZone[2] != null && FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[0] != null && FinalCards(Bot.MonsterZone[0].Id)) + return false; + } + AI.SelectMaterials(materials); return true; } private bool IPFunction() @@ -1105,9 +1162,9 @@ private bool IPFunction() if (Bot.HasInExtra(CardId.Unicorn)) { List material = new List(); - List cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card != Card && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.IP && card.Id != CardId.Scarecrow).ToList(); - List Enemycards = GetZoneCards(CardLocation.MonsterZone, Enemy); - if (activate_Sarutobi) Enemycards = GetZoneCards(CardLocation.Onfield, Enemy); + List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card != Card && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.IP && card.Id != CardId.Scarecrow).ToList(); + List Enemycards = GetZoneCards(CardLocation.MonsterZone,Enemy); + if (activate_Sarutobi) Enemycards = GetZoneCards(CardLocation.Onfield,Enemy); if (Bot.Hand.Count == 0 || Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0 || cards.Count == 0) return false; bool linkchk = false; foreach (var card in cards) @@ -1120,7 +1177,7 @@ private bool IPFunction() } } AI.SelectCard(CardId.Unicorn); - material.Insert(0, Card); + material.Insert(0,Card); AI.SelectMaterials(material); if (!to_deck) to_deck = true; return linkchk; @@ -1129,7 +1186,7 @@ private bool IPFunction() } private bool SarutobiFunction() { - List Enemycards = GetZoneCards(CardLocation.SpellZone, Enemy); + List Enemycards = GetZoneCards(CardLocation.SpellZone,Enemy); if (Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0 || to_deck) return false; AI.SelectCard(Enemycards); activate_Sarutobi = true; From 02216b2475ca3bf4753f39b79842c53bf282a004 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Thu, 28 Mar 2024 21:50:34 +0800 Subject: [PATCH 025/110] fix GeniusLinkFunction --- Game/AI/Decks/SuperheavySamuraiExecutor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game/AI/Decks/SuperheavySamuraiExecutor.cs b/Game/AI/Decks/SuperheavySamuraiExecutor.cs index 619e3e368..261dc9b25 100644 --- a/Game/AI/Decks/SuperheavySamuraiExecutor.cs +++ b/Game/AI/Decks/SuperheavySamuraiExecutor.cs @@ -1007,7 +1007,7 @@ private bool GeniusLinkFunction() materials.Add(Bot.MonsterZone[6]); linkchk = true; } - else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && Bot.MonsterZone[5].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[6].Id)) + else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && Bot.MonsterZone[5].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[5].Id)) { materials.Add(Bot.MonsterZone[5]); linkchk = true; From 2d3295110ca0b0e44d8c914655366d46d1ae5e04 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Thu, 28 Mar 2024 21:51:19 +0800 Subject: [PATCH 026/110] wait on OnDuelEnd for server to close connection --- Game/GameBehavior.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index e260fdb0a..b3d7f2073 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; +using System.Threading; using WindBot.Game.AI; using YGOSharp.Network; using YGOSharp.Network.Enums; @@ -284,6 +285,7 @@ private void OnReplay(BinaryReader packet) private void OnDuelEnd(BinaryReader packet) { + Thread.Sleep(500); Connection.Close(); } From af9831b8d020e85e127c9a2682ba929ce3fa4481 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Wed, 17 Apr 2024 10:53:44 +0800 Subject: [PATCH 027/110] =?UTF-8?q?Fix=20bot=20against=20=E5=8E=9F?= =?UTF-8?q?=E7=BD=AA=E3=81=AE=E3=83=87=E3=82=A3=E3=82=A2=E3=83=99=E3=83=AB?= =?UTF-8?q?=E3=82=BC=20(#190)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Game/AI/Decks/AltergeistExecutor.cs | 10 ++++++ Game/AI/Decks/DogmatikaExecutor.cs | 10 ++++++ Game/AI/Decks/ExosisterExecutor.cs | 10 ++++++ Game/AI/Decks/SwordsoulExecutor.cs | 9 ++++++ Game/AI/Decks/TrickstarExecutor.cs | 10 ++++++ Game/AI/Decks/WitchcraftExecutor.cs | 10 ++++++ Game/AI/DefaultExecutor.cs | 49 +++++++++++++++++++++++------ 7 files changed, 98 insertions(+), 10 deletions(-) diff --git a/Game/AI/Decks/AltergeistExecutor.cs b/Game/AI/Decks/AltergeistExecutor.cs index d6218ede3..bd320cfc0 100644 --- a/Game/AI/Decks/AltergeistExecutor.cs +++ b/Game/AI/Decks/AltergeistExecutor.cs @@ -2916,5 +2916,15 @@ public override int OnSelectPlace(int cardId, int player, CardLocation location, } return base.OnSelectPlace(cardId, player, location, available); } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + AI.SelectPlace(SelectSTPlace(Card, true)); + return true; + } + return false; + } } } \ No newline at end of file diff --git a/Game/AI/Decks/DogmatikaExecutor.cs b/Game/AI/Decks/DogmatikaExecutor.cs index 9bb4e8ff5..e8fc860bf 100644 --- a/Game/AI/Decks/DogmatikaExecutor.cs +++ b/Game/AI/Decks/DogmatikaExecutor.cs @@ -2888,5 +2888,15 @@ public bool SpellSetCheck() return false; } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(null, true); + return true; + } + return false; + } } } \ No newline at end of file diff --git a/Game/AI/Decks/ExosisterExecutor.cs b/Game/AI/Decks/ExosisterExecutor.cs index b87d4b341..41f48bdcb 100644 --- a/Game/AI/Decks/ExosisterExecutor.cs +++ b/Game/AI/Decks/ExosisterExecutor.cs @@ -2976,5 +2976,15 @@ public bool SpellSetCheck() return false; } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(null, true); + return true; + } + return false; + } } } \ No newline at end of file diff --git a/Game/AI/Decks/SwordsoulExecutor.cs b/Game/AI/Decks/SwordsoulExecutor.cs index 1b55e3c67..d8676c858 100644 --- a/Game/AI/Decks/SwordsoulExecutor.cs +++ b/Game/AI/Decks/SwordsoulExecutor.cs @@ -3105,5 +3105,14 @@ public bool SpellSetCheck() return false; } + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(null, true); + return true; + } + return false; + } } } \ No newline at end of file diff --git a/Game/AI/Decks/TrickstarExecutor.cs b/Game/AI/Decks/TrickstarExecutor.cs index 6eb135c7d..861f0dfb7 100644 --- a/Game/AI/Decks/TrickstarExecutor.cs +++ b/Game/AI/Decks/TrickstarExecutor.cs @@ -1823,5 +1823,15 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender } return base.OnPreBattleBetween(attacker, defender); } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + AI.SelectPlace(SelectSTPlace(Card, true)); + return true; + } + return false; + } } } diff --git a/Game/AI/Decks/WitchcraftExecutor.cs b/Game/AI/Decks/WitchcraftExecutor.cs index a46dcdbd1..bc34df2f6 100644 --- a/Game/AI/Decks/WitchcraftExecutor.cs +++ b/Game/AI/Decks/WitchcraftExecutor.cs @@ -2899,5 +2899,15 @@ public bool ChickenGame() } return false; } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(null, true); + return true; + } + return false; + } } } \ No newline at end of file diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index c9383c5ba..057470a33 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -192,6 +192,9 @@ protected class _CardId public const int NovoxTheSilenforcerDisciple = 25801745; public const int SilenforcingBarrier = 98477480; + + public const int DiabellzeOfTheOriginalSin = 53765052; + public const int PotOfExtravagance = 49238328; } protected class _Setcode @@ -224,6 +227,7 @@ protected DefaultExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, _CardId.VaylantzWorld_ShinraBansho, DefaultVaylantzWorld_ShinraBansho); AddExecutor(ExecutorType.Activate, _CardId.VaylantzWorld_KonigWissen, DefaultVaylantzWorld_KonigWissen); AddExecutor(ExecutorType.Activate, _CardId.SantaClaws); + AddExecutor(ExecutorType.SpellSet, DefaultSetForDiabellze); } protected int lightningStormOption = -1; @@ -343,7 +347,7 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender if (defender.IsMonsterDangerous()) { bool canIgnoreIt = !attacker.IsDisabled() && ( - attacker.IsCode(_CardId.UltimateConductorTytanno) && defender.IsDefense() || + attacker.IsCode(_CardId.UltimateConductorTytanno) && defender.IsDefense() || attacker.IsCode(_CardId.ElShaddollConstruct) && defender.IsSpecialSummoned || attacker.IsCode(_CardId.AllyOfJusticeCatastor) && !defender.HasAttribute(CardAttribute.Dark)); if (!canIgnoreIt) @@ -385,7 +389,7 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender if (attacker.IsMonsterInvincible()) attacker.RealPower = 9999; - + if (attacker.EquipCards.Any(equip => equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled())) attacker.RealPower = defender.RealPower + 100; } @@ -419,13 +423,13 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender if (defender.OwnTargets.Any(card => card.IsCode(_CardId.PhantomKnightsFogBlade) && !card.IsDisabled())) return false; - + if (defender.HasSetcode(_Setcode.EarthboundImmortal) && !defender.IsDisabled()) return false; - + bool attackHighestMonster = - Enemy.HasInMonstersZone(_CardId.RockOfTheVanquisher, true) && Enemy.GetMonsters().Any(card => card.HasSetcode(_Setcode.VanquishSoul)) || - Enemy.HasInMonstersZone(_CardId.GladiatorBeastDomitianus, true) || Enemy.HasInMonstersZone(_CardId.PatricianOfDarkness) || + Enemy.HasInMonstersZone(_CardId.RockOfTheVanquisher, true) && Enemy.GetMonsters().Any(card => card.HasSetcode(_Setcode.VanquishSoul)) || + Enemy.HasInMonstersZone(_CardId.GladiatorBeastDomitianus, true) || Enemy.HasInMonstersZone(_CardId.PatricianOfDarkness) || Enemy.HasInMonstersZone(_CardId.DictatorOfD, true) && Enemy.GetMonsters().Any(card => card.HasSetcode(_Setcode.BlueEyes)); if (attackHighestMonster) { @@ -437,16 +441,16 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender if (Enemy.HasInSpellZone(_CardId.SpiralDischarge, true) && Enemy.HasInMonstersZone(_CardId.GaiaTheDragonChampion) && !defender.IsCode(_CardId.GaiaTheDragonChampion)) return false; - + if (Enemy.HasInSpellZone(_CardId.CrusadiaVanguard, true) && Enemy.GetMonsters().Any(card => card.HasSetcode(_Setcode.Crusadia) && card.HasType(CardType.Link)) && !defender.HasType(CardType.Link)) return false; - + if (defender.IsCode(_CardId.RescueACEHydrant) && !defender.IsDisabled() && Enemy.GetMonsters().Any(monster => monster.HasSetcode(_Setcode.RescueACE) && !monster.IsCode(_CardId.RescueACEHydrant))) return false; if (Enemy.HasInSpellZone(_CardId.SilenforcingBarrier, true) && Enemy.HasInMonstersZone(_CardId.NovoxTheSilenforcerDisciple, faceUp: true) && !defender.HasType(CardType.Ritual)) return false; - + return true; } @@ -540,7 +544,7 @@ public override IList OnSelectCard(IList cards, int min, extraDeck[shuffleCount] = extraDeck[index]; extraDeck[index] = tempCard; } - + return Util.CheckSelectCount(extraDeck, cards, min, max); } @@ -1580,5 +1584,30 @@ protected bool DefaultCheckWhetherCardIdIsNegated(int cardId) return crossoutDesignatorIdList.Contains(cardId) || (calledbytheGraveIdCountMap.ContainsKey(cardId) && calledbytheGraveIdCountMap[cardId] > 0); } + + + protected virtual bool DefaultSetForDiabellze() + { + if (Card == null) return false; + if (Card.Id == _CardId.PotOfExtravagance) return false; + if (Enemy.HasInMonstersZone(_CardId.DiabellzeOfTheOriginalSin, true, faceUp: true) && Card.HasType(CardType.Spell) && !Card.HasType(CardType.QuickPlay)) + { + if (Bot.SpellZone.Any(c => c != null && Duel.MainPhase.ActivableCards.Contains(c) && c.HasType(CardType.Spell) && !Card.HasType(CardType.QuickPlay) && c.IsFacedown())) + { + return false; + } + foreach (CardExecutor exec in Executors) + { + if (exec.Type == ExecutorType.Activate && exec.CardId == Card.Id) + { + if (exec.Func == null || exec.Func()) + { + return true; + } + } + } + } + return false; + } } } From 98f9b3ab9021dc5843dc868b073e4aa01823180f Mon Sep 17 00:00:00 2001 From: salix5 Date: Wed, 17 Apr 2024 11:09:30 +0800 Subject: [PATCH 028/110] update sqlite3 to 3.45.2.0 (#192) --- sqlite3.dll | Bin 852754 -> 2485248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/sqlite3.dll b/sqlite3.dll index f4fb34d310462d64bb0d754e7e29482f55a1a081..dd0c7364b4c3c3d217c0f2b9acaab7215fddd56f 100644 GIT binary patch literal 2485248 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⪼A{q`s8VlTT7EsIF~Pg-YD@V)ANqeuAu=u=3-+xsB$ZCUBFpCmyXO7nw7;FvYi#E6L=7 zYPWc?8x+xnbsaIn!E4!1G7R!hG7NH8hC%+xQ3m-Z83ws4!yx}8!yx~Bh(T^JuOIkt zWsvnHiu79S_*fkb-e=xa!oZh`Yc6MER;|D$_I6G*chO=i_=E-1Y5Ut$CwMyB30A1n}w4ohG!u#R6LFZF_XoPi0nAv^H5?D}WT>i<_)r zfaaY9phhg0Y-Jj#xSfLXt78G%Ahn2TR&H#K$HsnR(>G{Q4?!!sBs89RQ{fxpA}zNl zomiYRxCY9d2nFQo?y4M1VM(s7U5WWQgA0VJgEaA+1is5^Bq~x~vc^NtZRu(>A;rCH zzNkgk_>whV8Ar0lx+qv!t7b_URE-;`@#b5K+lOvPal38Ul4_DU^HQz2{ZsBiZG&Qc zt8VgIBOk}4h%qQ*#c0qxpBQi{=-)(p)JxJ4(=a(-SX>slK|fxxeqAK7@-Ga}kMq zNqcxe(%5XI&=WwzH`KfFv7kF0OCWld+9RW#i?1(dZdf1%*Q}!C}d`M4LdgvwB z9l_MO@nw1HwfL+c2eZ>l6GC01K@D_-r7 z9U=x&xkM+CPqQW)TadMH!Oh$sT#kLJ+7mOK_`e6;?wD+aFp)G05Fhh1DSHWYU0oCqBQCp~DhU_qZh-cn? z8*}^`H_ImTDYH#*hj_7`ZZ!(Ppwj9ta|S?8+3M}VYjvJ#(jIu5a_u%vM~ zc20vnT%B;18Q*`r4#C(Tq0(ezH>5w#tp#SZ7Oc%xkDd*J1=`A7#QI5+a+!YD?~v`dPY8eJ!4n~yKA3l4YN z*m-);>M6Vo1hYS8gm-(dDlyKbEJ8lfh=jRjd&zB8EFqZFtj-kNfCxpX5^dLgbxIG!tyWe}O9Y$bXzb1i2yJ_a&YclwR z`%YD{3~z(+<;#vMtMd=_e}EBa{t(^}&Jc!BAXnAB4CI_l4?WFymM#;1uvYj%@v0F0 z^KtbJcO>(maT7r#d^0Q@NIGk>MZVP>pW0(=SoZ;56h&cI_?T1Mg7fHvrc59Bp#AglCCKS9G-Y~GNk)3wC51`^%Q*=K3{kn zLG+>n0tnWp&EQ6Oj>gge7(dGiQr0@-VHeAwW5Xodslc9k1mS_FsTR&RJ5FZy0iO-w7j#4yX5+M)zUG}iK zdvrGaaRuWcSEE@?ekkOkewvgCC;OO2^TMIj4}S2~@gAh}oN#ayjUSRG{@_OjlP=Zh z9kWBV`;j(yBL=(cm{^}ZKHD?#>3E}8&32W|cDA_}$In)eY7=}{znpy><9hJvwN^AL z{M;!0A}3p{%;ZiX1)a5gmfBh0vt5~-r;*b`&aX>ORslKHPRV;n>x(&NyW%vp$Zy;s z?lrKToYseT8pfIDUmZ@T(UzPno4*^56>IoYB0K$Y zN$`qB6_!2!b9y81`=iToDDp|Zc?tO=xFXDfW$%IG(~FIr#uI4l`lHUWHzVUK98Z`1 zvQ6T3T2m<$K`vY3;&I^=q)kIf#_Nu4@S;)ZW1-4r&JH!lJ!U9mU36x|sGBP$kuNx8 zOrF$KA+X=tr|-zvKqjheCI0?3W0c{3*eL4NVjrcLpMbe$IP=vUaxYf1mxRUX7se*} zch3!Tm;6Umv;?3&K2H=2iD%KOmfu(3v<^t`ZKBbfGVzUcW9C$8K6PY&n VbBu0G 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

hvDVN$^?dUkf`Hm-fhy%if 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 z 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

m|y^M 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⪼`7 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


K{QkF($xFj3znoVAPa5jay$CUn>osBb+A z4U!txcBDh5f91gb2VrkM`9+3Z+#)WQgUe5YhX9`;Jd=XMDJKk*$%9C$C!DeYuWt6+ z(DASr?!0aQGf<}Y?=6J9a>(5+tEa;c?Wo*PGP@d?aP2_4hYf`U1_$^46i-hXZeE7} zP$-F=2198yz?r<^T;7Jn(dHz&3mFHT<>TWW@$`P6Nk7!g6Yy(=<(BcjbZ=%8(j90L z$@E0J4=k%{L9AjC;cD2Uep#^=hwev<>dK{NgS#QuVhpFu#}RAbRIlcmOQN<&)VliC z`Hk2_GSdFf&%Zt%Mx^+t);`Dr3vl6OgN;GTp!tE4;+hk*B!9WXW%4cvhE2g5dy-;!l17sLSL1zvDFi!v%$V#9YDMh3bID&U2 z(1L_Y@CZFOHPiEn_vrc3etN#P7thiMH+Ax#;7R`TL=*oB?BYL9*Ycm=y^5d59}2YL zM|GK%0K-d=UQXksk>g{;6=-U9ml8O^6IoF>4F;DTA^ZiYPvRw6lw`aG zIoj@UiX9)Ixe;*wZliV(&G5(1i16~e9RIb91)GnD{|*-r1CA8^%={Jx!sqm$aw^+Q z-%)fXI-jM%#0p44T&Y-!p5vh$1ovRw44*!8_n}YtJw>s%|Lg>fqnB{|58KeU9vlX& z0?X6XM8F?{dr)#PQ)0+mu5P80;JGKg*S$yTzHo{meX>1#5H6gSVN4>^A9mqTsFW(| z0Mko#MnJ0w9QHY8(wKog;DLRhFpSdIm>JXQfbD}wN3FOOt{S_hC`qfc$Ix?jDY8d0gHXCz@T zCtVCfFoT91vr)l?lwySP+{oytbz0wagYWw<%a%K*t^6{W^O@W^Y<0XZ3BGWGmGeQ* zzM)=c6FFIsYr#-d^P9IIeWZ*CPNFjGw{LQc3KR<~B&GV zD!J)wGNo?FO~XfObX}POn?jIGLd^+uE?80G-^eAQ zAiNL<9I4q^PPTAwVMPnE8qg!!kvxs|GzkaG-ib;0B?zZa zLNQ5&Q>OB%Vhhbpa4*CwB2T6-!&W1{qUJKXRR|1Z2)R8oeTWtdWl$@kwu6dT8YtBp zvSW_Adors)fsr|98BpDT)j3G@FCKOqWyI@Y51e%AQ{ru6x@r!+8|l(MFM7vqfBu-k z;H+Dn>%VlnV;6s&;2$fq%l#v##o-$spWsAiu;xj}B;8D{Gi@ftd^PQRun+aSrVYm; z$NvfW*=gDSM*(hx|NUvd!>fNk<$R0cj!t`l0^Xp29n)rx$NQh?oo?#^G2*JF7HyX6 zgKVDwj(tDZt6d5r_j+;hnkAg_I9j2nBeh{h(^c(hw3$A9e3r5$Gc)Y$hTZ5?7u~aZ zBkae$bT1Cs5aR+ZH9M~@jO$*yp!N+jvWUfvEVnCIKpG5Qa&onkU)hSB4}vniF+*EN z9Hl%;rJQKeOZhV)5nW1N9(=i{!arA=tMK2@VRK8p^`8pSWHN-u!V9DChuw-A=n1*{?^<#+-TvNWKU?eG$o@y13-k z5ITB82jXB-MqH5^!__Y?6!~%Q6&e>%EJAwINBKVr`eKmludM#U`iB{t5>jdSYG#9J zm3*neE9PAI93##ezLIT5I8h*8hwY5Ks#<6?nT>$GgjWzNZh1DS=NxQL!B#1Xr~!Ff zT?F!#J>_lg2_37KX9NeH&YppWMHIzL;><(f_yaAEMt;fYbU4fQ%~SGlBeA8?FzX|D z;e)Kd!Ht<8FJ51KV|E^~0eqAyd3W)j4J)y#2bJSPesUpF8sPOwakVYsWPg&#KIm%0 z|C4Su9((IN7B_E%edZv@!_|p|xF5Go+<<$UCuTQ7+Kr+~oo)5|%h4~he#s>q_D#-l zH9o7a75Fl3IPqG#sF!{het}kuFkOPHlP1=&D(v&9^8UdEY!VVu-NP$pvr*zbyka`D z>aR1HQGcDq+OhCJ;_!+oETq3qWi9$^Hv4b=bw1mpy>7h?ZN^^3m%IzNbfW2ah zL$gr(Y0cs~3z-ScrX@lW+#TF0nwOGvVzr4R7us?$&Dr`j*amJHpJ1q0jrE%uL?2vR zCwX}n!QSE6+-P3IjSc?1wuURa-i=G zjneAWjFF2vrHDGI$4Y=9E%2AA^|xM7*XVWCxFuH{fR*loo}-7A@-fJDA!`>J{8Per zFJ$wHqH-5{o$)ln{mFCMKvVuC8TZmliEefpZ~=ej`nZ zM4o+6J7})o_JT`9;wHc~T^1ra&5R%smecSLwo{XAMI*!z;<LvBpo)%0sudYf6FJU%TM6e`IuRy` zszrFl-?l{$s9VqQDm{uk8Z%(SFSrip>Z8KF=kBAmD85f0RintheN>2~QKM7(jSUZF+=#`Muek0w4~MCTOYzAo@Q^v}I-MfcCWQT_9qmwBB__5Rs* zI8vpQB8}AVN17rwmE$`{@1Gy=j1nwt#CRyicMrpR1y&j$xz0~`b?z(|46nPdX5pOl zg^04rOD?gqt5NP2ZSIjwSJl?DKZB6b7lTkQ@IP-T#MiA6NRg47YWCvPps?&8);h%A7>m522{Ygscb4w}KlF4uwZ3(g}TCgqt`GD((R4voMoRz{NboxHgbQlwcRBPs|HP zcz}gLPCx4ip}#^UqBL;&vXjF*Z-NU|1)pPy5Gyf5l?z;AW$PMhK23eZHHIE_CN(T! z%r#a%130f_Ik2xsPZy;D7EOdUypr@fn0-`QxeW%d@oHVedqe9VUVxHB@S`RwvK8GE?PYh-gWi0j*#e06w4oueEZa{}d+9-MzOn4G z*!U+Y>T!C|n{NzDjEy&h5!FTU^yW)rpFp0Ef`7}`h;q|o>PHix8)l8M@k=R+C%O%9 z5Yc`c8^4C){q(4y_&BycHr`L=-$jp#4-h||eLpt7f}-xB$D)A z6WC?3@sCo}Mtba}_=zkrHvUOM?NNF>MfjQ6ClIEh>R(GyHT2j;@n+T-8{b7yr|Dtn zLVN=IZEXA$gqEe#V=Bcbvh}g?3n^+oJ=_#;Vc(C9zl)-7r^gD4AH){K#&4vk2kAj? zzQOFW*!UJgt(hJt@bJa6#Mt;+%34E@U6g+a`vlt?@bKB$g4p=yDe5VD zY^C_&?6TPSjTE(k9*pXVZ2WwR%BBas`9`tt$Hp(As9WekZ@yHvAU1vqk#;&g zrsCln$1aPFcT-dzJ#L}+OITt|Jm=W(+E2<^?u$XSDfwMNbFd96Ty^?JtZarr3bO@% zfe9ycmzoxw^%Y>j_yjDpFr2cKPf=Ko-LCD=brwn2_!7%*LuVGU@4e4wYzWSi5H=eG zSjcXQgxNfvXb2P4#a&=|LF*k?hJj4 zt`@?c4SNGCTDlzEKMsmF?2}{@CY`tgJE@302_eb5-lR5$M)Ud3myXR(Y<(WsC#InF z4qm4ihTlKZI+jJj*#X`wwvEu74#7pD!hv*XnkPIXK;6P_C#j%~R>yX{-RC>2@56=S zYbM7Tu!R!Y=QP4;|7}eB7hb6_~$x8q-0!O@P(E3O=`R9k`J}0z3 za!?rSc)g}6Xj^JyjAYTe=pze9@0Pv*wY^_}|wrNz`9!rOF)_Lvgyv`d$om2aE zgw}>_UuhkV8pe`KD4AMM49~{_#?7w8^v8*)|0?&93V+18j9}gUSDCHb)4Oj0TkDWM zQsjhKcy^-C81{h=@tr5CZS7lay*2OA>)nfFM&Lp|T1K)tuki+aR6y#@9kkZFS%-2i zhK3nS<8f@$ANYic20RA^vJ4&CKg5-*Ugd~y6o?PZl|5`fI4Wn!efyuAMg8d45PAA^ zx>o%^>6uaeKD~iVRs;K0Q)~xoIUmz=j_rRY;H|{I(<`&ydG}pV?n(XU<}!JVbiSLn zyP(rvmyx25zQs{7#UuUf-*R2Qizt!G|KKHzb}Z&dybK^7~9aj#$9Bj^jR-- z@CLf58Wmo3m`!>LB-&|&BfB$y4MTy3%fjrZ_)A=OeRZ_bo;80#;letEJ;zgPAHPBj z+fI-7=6D5h-j!NvO`-z4uFw1hbI+*ac<(T}_bA&w74!Puc$BGApe#&GfL-ax;l7q3CAnp2Pm@dazQPum-ri$Wa?CZ+i~nv-P>> zXq(PwEKuLlCh-HyNbs+Ab!Het30KvI;9p_cA+Dof9N;#vFK1(v~0K?pYX?2Sh zwkg4IK^8*3&BzqZ)%5WL_+kRj0b?exu4{8ack|KvLJw2^Gt!RE4(ZcdmzBiM?%L?K^tT~_FkzbnBkLSkv?nV$ zu+~ada_nTSlpG~&>QG|0F#ev<|I2t>OzqB5k3P0y{iL(2i>>?$Qpe#U^^9+^vcMAW zhQil(hP4xRg0Td=R!!t4gDvU;v*J3TE`Y5MQy0Kc>ZG~= z`x_Cyeh(8urqcD*bu+L z>%N}XdhM0!M*D5Q)tC~m92sqh5)%AF+#dEB<|X2B5dM4CTRWlsq`tz55P(>*P)z`w zQ`qlPbM4{jYOWOz3c79>f)-g|Ft6}KB7Y#YX|7#0Kw!FlNArOUdr_%63$|*d&THXg z7Yf~!QuUs=QsmzEblZUP&y3ts(EbfkUB1C)mTu=^%g3CmoL{YbhBKVKB>r~ z)El`ti3F?Db}rq-NjJ4~0mmri0$0&sBawbHHJ8_0qHds5R!UM0L>twjB+aJZZ1a{Q zz^|SI-9SJI`XZ=3kR#H@J)HZZ-q0W0AB%L&?|WXSz*v}XWs)r+pO;1NsXa+5v{%tv zV7IVj#IdEtYOXc{**2&E1+_=kk8Dr9rY6wI-}Y>OLogO-_-->Sd&(l<1~uebjeOmy zL)i_^9b0qV@JyJWX+~(UL&Lw=k=4t7s0vG|zGMD}{e~{-6-wt9AvG5k`LlhCNg8|h z_vo)?+|~N^;#Jdv)?zRwLjmi+Vqfj_g33k*Z!}`2vJ@1tYDjmYu?Ay3LQ4=_z^qsA z(`R~DFRHSR+U-P%+3U&tUSkYaTxdy#d}J%Ejq9)&*N;KX+Iwz=JRQt=L+%`nLl}3* zVZIV{#bHI_R-5Fy^w>DsM6%OO?o`)B=txkzqaA!UH@Ln6RV~e$?jPwca~mgNA6QHF zH1Eaa%0?VfLV|1jBa6yziB3=@63`hEag60N@P(-A_I>4e7HE4~j>Bbp0J*S;m5~f6 zS%H&nTLLbQmgwT>uYs2D3fu}>Cru0DPUoyt|74%d9b8Z7_@Kv%gOZZ>gDpT;I+iNy zFF{Obmr~qSHXnF;*ayIeHcM<(&mlq3nrquOTFLLkQp-2>+wfJGDR*YuPW!67QnIuv zb$%dShj_a{71okESm~R-sRYtil?JH{iEULQ@S?i9RH;*Lh|9)0v^5(cSUd1dH5lgc z+3yiB>%Oh|kA;YV%f3$}zSu&O(GvA1B<;4>#o^BEZ24^1@4&X&)$&=Rf4qD)&Y!~W z2X!|Z$dHyD1xi3OG)g}Hw~$HR9jEZjp+q@}7JSe!o|EN?lF{Lq^TtDX25V2n-LJ_- z=x(+1)YI~9R-Dp%nne0u=aYEO%9B>~bI-~h(j2!N?2cbO1E8jt$<*1w(-0&JVCqR5 zSnQ5}r=Cqk^sr!nVlYpoVHkM5G=TX*xe|6e7AsK$u6Oflg?IHTJPp^qa|Dz?8UQ@J1Vk~m zUX2g72NH)2=>xjrU|y;cq+PV&qZ5HaFfUDcVhSY8?zjAs%1?yu0B-HvyIH^r5z ziE<+*#+}kvnP=X?xy4kZs0>r%tXiq=Q{gDUUg{i1ljyrNiMo-tK$}GCFp0h^9m6CV zKekqG;xq9N!4lN~6{haH$gB=zWiLRX={Q_fi=&o+;c?p@sb@dM$l$w~_lnTKVf6{B zqr1=zX97E5(-n$mkJG}9TFCEJd6h+4H}B^{_9{{ZgKio%yR5+i)Y~Z6p)R7mzs%h8 z&Kc~-;zTGVaf^mxp8=T#t#_ayMS&hxfX??2`LKl$K^EZB`67>E5(R1{{gkZ4b|q6+ z{U>r3d0OeZH4Phf6S8@|RbV!E@lakII}0i%2DAiWxGP~gZ~%j|Rjo%i*tRtZX3iP5 zZ`QZvGm?~J+ZMbEsiI=!Gk)oE1kdOlTq=zy&DwM|f+bvZ{@N_Oz>6{7C}^53@G%NO z0t(l7r2N{ol*krnLR3xb-@q@Ew3cDF*inIgEB+{~f;GOl75PMKUuaWL$1Fkj-Y57o zYKZu<0z`NFuu z3}OFYZPxnr6vnh#kMX>WE7Kl+f=0AHH!ngL_a4;$|9?aO(MdLrryr(C7AF{ORn!eI zH~I`Rs!;1JGDBrK7VMlK_!?fh*33_Q4T3nw#!)I=Rk0K~NyRt^)>gmQB0$*&2z@{M z6Vj;(7(&V1LVKt%*M`OQjS!e35H3Y(4{O4<49+LVm`K(GJ7D$hPY}i5&8&gHUu++7 zMh!R39#)O{%4flvtBo~og$~fw$+?Z$(H<&ezx)q)=(qAiDioH6GX_56I4n+P z^4ncJe7RZ3-ll}&SjKR+GdfijAeW_sH5amHg`7*Ek{IdI1fbB8GFmx$*bUgS6H=jv zJ#Hc+EO0^SxWjitk4e_75VEAPB**Mi#yi^8W;Es7jxZV$)1j*?G~B~hLywBX&+IzR z@}UD@yTDFWRKUY_;LTf7#9p9ZGK8ivd!daL({iyNyd4W2hdt`4tYZ7xiABM3dvKjO ze2pgIX8uf@S)?JkPRYLJV^TTP3z2IA2qP96zBJ03BHwY^Am7o3j$&`iA_h7g0>*!%lt%@of8kJ3TJql`TG%&jpAzI=X*{B>2MSi1l0_J zf?DkA5Xp(B&)+B-iuOV@c5c~kpbS=|PId*UDVrU&UXnRSVZ;_Gj^KS}jJQ%IF_=3& zJRKBVHkE{unez=;1enSS(9f`yg3i5$LdaEutE+4Zl4wz%J)*UqEsz3;z%G~v9U@nV`w# za08mBE}A009R?#CrZ#du2KF_Dm29W6mzx24wIg)aO%j4L*a8ZcOEV0?d1kpZ&7hP_ z!EtdebQiMAd7gg3+4=|9i9-xH!=&V9D7k4$F2PcBvqOK-r=A19=!cs6kk>yYfD=IF z$^Gb(7#W##Z+5aJR9>5fNfhld0rI!q<1S(nAJW#=jbH|HZJeoAH8-}(_;A!V24*8M zv3P~cZ5Y~5%%|*_M!t;{5N#LQ0%b^0DzA;3XA5v=uku>+GU2|yES;~!_WqLSPkCYn zvVvKF2yvl^A+zC~PK6g>tD?1=&$*;D%LK3OcvoMef?pxhYYb#-I23up4)&i|s&jcz zN>hhKOCcmzN?hP`o`I1W&n4GeE59a6SzE92(&hR%PQ(x#9|KOjEj0dU)yfY%Og#5B zDl~rGGEbpcF>oQ!%^n0F(_|qDXa>z!&q=_qP5v&PB(^*lPwNYj2NDiJDPkkgRBDhK zPDrx09EE>{5=3Zl#wsj*aVZD71)BqLwrwLJf!hMFAx8ji>c0R+SQFDvFhGsy_AL$u z^5{h@cl1R~5%whcLdRCMlk)5i7Nx6SDx35^t3;qWSYQW5TB$QjG=bzOm1i0Jm+9+( zQf1RzKv#K2EPSC^!=gZbjRFnQn~vRTT_};S4II0H^HiaX5Z30P@ zL3DK}ah}TiJeMv|=kVq3c-v1(Fpx2eSOSN!&kNv1>`E9_krNXk%QavL2fq41B{5i` zkS+iD|JbPdrwq+LK(w(+zWIB`sxW;rHYp&e;sEF3?q7e zDFcxpTY7Gy4A{L;!Q&TYh)O6y9<{*YG#~WOP|XL`CkP>R;X$*Kh7XEWmL4?ERe6U- zXOhpxuW1NP!XkV;<)a)4DsLHOky$|qFIAa;(2SJQ8lN$|+JZg=K(}vQ*^^{BZVbOf zII+*yP`%SI9%qYcZ70rMI^jVVC5J1Pbt^wB>qaBOI|t-C4GMcIfFbp+Xs}0if+g`9 zszD+ewZYV+45O`xgpet?$gCQb1*uSZeQkud9f8>bduXWqbv(9gwD08Q_0}SFYc{xU zk5z549cYM!Mm{BTO>e$l9c_ZY#B`i$rQ-vc-Ln7okF#dS1j))O(c~1G{ z{2ty2U7x;(D3r$@MS4|n?P8O$QdAf33g+)ew<`Hf>ep($;;NOyW}CbgohWz4`IF0L zKp451)&G>I^?KE&P_nuw2>zz&jOw8)+xN~H)z!2>m6~K%lT~qd1(R=}l_7*Xvu#@( zIUPrli+5$#lRuhi{-09|+$pmw{XzK)qpd2AN~0ILq75(p#qJ;=E8DgiOW0!=h(0rpzrQ4QhA=3XVo=VLzc#Hr<~ST) zO$){FHQ4cZpaL-6Y&}<6(>}cu$1bO1R8=-mJ$#Eje4A3V;CN(2E`&V|QCox!5fu{) zExxx=6Fg7NVyY=VdN=(dEI72SjftQ#o^MwA78kJu z5!P?Rk3JuI8ZJ14omFnVdoo@1x^2dN%mrztjIP5#vzB1blTWYyqy;!PwelG35UFcn z`Pb2_cCpYV>d-o{e&Rheq8F&+=LW?$s|Vbv*2@;O!Dx zf(#bLm&srd|LEv!Fvsj{@>{WgqzuFQz}X~qL~Z(CND>aK5jTBg*eh1>1!sIR-qCJ` z#`sjcwLzL~j8DVctN)#0Z;VgJTNB=5cb94?Q+*9(sIMVl^_wY6{bow89XHOmV9PIs zy^apm_OM1j$Q`*A*KelmiZOQH651Z@s`6~>d$N5576$)s$VTN2oXy>n?YT%cLa_gA z1u&AqA#o3+!HLjhOl*iVU^zf*qRUx4K>0?NDAU<@013zH?na8^>~mfT3cf)E-^RC| z;0{0z8~r2LzDWG#BK|twH0q3+V6G7ypgJKJbHSNRsVi5(ejh(hH`e*(-SNJOOG3kW z+VG4T+-+R}0|-#@vRf}$kICtaQvpr)@6m3oP98iIjMww}M)Y-2FfSaRiI>MZx_!5+ zZED?P%R0i#GU-MB$Yk1C*BK|*eqn0pv#TiJz*k}2WK5wI_a^4aP0$({rQsd`sw)A& z5;P`f=E2Il;NojL75G@knT`*}yc?X`+Zq-qbC4cZj70=DsfQ)E#lzg7$c|<&DX6@Y z8fe!r1{W>Ul-NwSp{Vm^Dkz}cOPmWF$tH0Mp{`t~P!G2rL7}u9gl4`-?e-1wo_Y?X zFpQn8)=9yGgrSkD39809*+t=S`7m}=j|2d^xd!^f23ObsJtBMrJ%V{$E$>uvlhsDA zcY8&Fk=kO%?1T*aolOYAJW-GatJ8LPxo7t&0A_zj%^4i&%ozRtC zcd?YDv#Z!&-tw?HjI`oWG>I4|SsQpOP9O^N(XmUl8!f1oTcPJ3#$Jk~8-{cthkBEl zro_{*5RlJ=*9}@Tinr)WRQTJ@J!{6SOPurJ7fb&A?qTdcJttbYp1P=~iJ|*{4#la( zr@da7cjYG6P!nSVx3iF)!iIy|w1WaVK2;W_Wi~@6Ja#8FHoA}Zf!^q~*;zNB(X+Fx z_pdpdr{vmwhD_`I0+zDK$|qK~1@L@{XnS<1mzvv9qqV)esE`E^EBYeW($R|i&A!=V z&m!V3L{M*OT>-7IatRD5qd0tQ1OEeGVsyf1Rg611VVw6SZQ(^csfqD}fv~+|`~!(a z>UEr2K$7?hCI@oS%9&@jS2&IvmFt{m)=Y)%#okN0=PC)#x;5kDwf8xOz(>Y4gXhK@ z?i<&Q1#1FqeH)C%W$MnDu^L+;UUESJco7Fr5>zS-seFb4cOfb8=U~@R?F=r+b%R+l z$D?3kocKFh)xWAuYU2(<3O&&AX=d}-vzdp+cB2-`CCXZJAiU1C#vC}j>iQZ=V?uX# zDVNCa8}i(UC205l0MH<+!2g=HvYrTo$0N4EU{s~9W!N;rW(eLqEMH3-5|s*l99xa^ zeQ8!!n!RKm(Lhw=d)U2X4oBXyCaAfyAlO~z%V3?vNkAvFSSr#ZobU4_vHKp-cZkSs zSFe&qPqIsByOH3H;Oui4ba_3TFuFT<`r_6$92|`B-s7}F>&ZMCUbP0y+zIHB-I+9; z8FzI#+TDuO#j>$XCv{TbbBxL?smoS{dkZlL@gt44Z5#INm^9Kye!LK-b1LwX9ZDkP)Nb3hnG}Jdc!4Ok z%~N!9L3mX%4ydrl&;Tegv;_8C4lJIR`{F#dCu*}jZvJI^yjHF?xr=;85BnjKYKh>O z7%?7C&>TRZK}-7t(hhb5FplCG+4UUq5;dh6ExnoHq28Fb%(=gO6j*D4vuRzvbI;nb z&ZhEFbj}$x?`&H0m2=O!FP%*=|K79aiskbxvrY48@-Uh1Y-5=0;bnM_G{iac2=(0) zwV~b4nJ4M>@!HVquw2<8Y|^~Y7x$vj|E*6>>C9IJ+9uz=!azy{{s>t13H;gGzJUc$ zq;!%@VD}WVYwyG;F1LbHBzrfw!qQ#Aw3lekhC70nXhsKTiC0&5g-q(IF4#}xGKogR zo%!}3pf^knzQoG9s~-=CO?5PTEYD9(%-m!8(j=uh7pJW=$qhmbh*Q6o%TwdkM3lKq zN_V!cO_M)Q42=TtLF$Z`W}%!=B3?RCut`c^?#h^La!sLra!tLni8@MkO*hq%xuuk% z%%uL`LS3eeqrpdAy@k4sq!VQ(5eBn??a+pD&Yk(4lz%hDo9cM7dz0b~OD~NNCsE4K z@HzCc#vX5Y>d@J6JcaR8$~YR(q5mM;FY%WZtos+xfxZqZC@6X(J8=>!(N$DtK;wev zxtWD;FViX+euXWeZ^@k#{p7478}opv7VE-Cp?DQOAqHdZjRhkjC%{Ux3yp#3Cak~s zs@ZSygg%5F!NW+RHh4>xooBA*G{qfZSbW*o>t^pqFuBC-_FWHJ;IUR%*@5uf>^D#V z$h*>e^c|BxdVPlphl|SwF-NjT?*}f;N^u*TfW1waNI2S2dvHTyyR_we>wOyM%?CH* zvgeCfz;IsdM9AhTU_)4-L)UPn`gW;0tkh|b*rLIT%jqUtv^q1y8*Yn+^^R_fMj4_u z6&j$lBO@;}6$ItPTpD29)5cJ!Z&)#w&fGV0eRw97$re(8`nJNqqTslgbeaGak-3jRW2+3@!ghwUd30@d$Ga zF=DzfVmcM+H2cOq+W6pRg|u3`UvNTOfII^cNw8BOZa#+SqIivqPQc9eJ=w!s&Vk+j=**>G7cJ*i(4-WqY7!{Dtc37hE zh?uaWY&M`W+WN;x@X#t|mAPyqg^l51c62=Z^=iG>uP+yGr&+;|kB67R+dpOt(fjv< zH2y_>&HJnJq?wo$`5EHJgXJWeQLyvcMLS1HG8L=SjY&-s|gni~euST4sN}P%HZs!>%nHPswycK-h{JdfV?IcgpvXyZ4GfFC1qk8J(H*p-l3&i1a?aG+@tW z<77B)c8GGNm_nuWcBP2r&j=BkP!tTWxQSpn}CX(rv`=ng5@1Rs{S2e zsE|t4+ys8B-K3qc;UyF6Z(xGwHmmKq2{vgY*}LYNC3Jpn989dT5+qZ0Xc4w+{ zTk71ua;%3Phw$d5?19~DasE(bhX4Q*jNF7BUtk}obkfesI$XXR-qAw0nc}8kB{u;n zVHyivM)Vp=Z{hxaqfkd{0(cxyPXufY^>KRH?YVL5U`L!aREnn)4>uCJxe;`CK~U%q z-3)@bW1T=(uDgGSA%bh%Md8ZvEN;CUEKgqta=n<}>T7YlyQHJt>9VezVfzEWmV#fD zlmrn3Lkt%s{TZ_oxFTJYWYKS)h`K20EpU{`r4{Eqm%tGy*lhW$7z~-fp4R9$EIl5E zf^-n18#mhuUgoIXL22ajE+d_jP@C2d?jw(Bu&ljcb>A8V>nA_tuqe%iz_M$w@-)0& zh=%2dk{41XZOf+7e&h&x3?lI&$!7`;q5e$t#f9Q<*a#XZ0@V-F8ubX=wNe&Fm-0E7 zE*64R@l7%InLG;(;f>&Byn!Pj&p>U_D+EwtLtcj7vnPZ~u<)kkVL~4}P~awPtec{ zI5BJVM&WWN*m-}QAPR>&RY552(tKZB3FIxNMCZN{!%HKSRHBiQ5keURLP>g`489?=cz+7suxp7XYjmA>{I3)2tz>?op196)oV+Fj z6&*R50QlcL+I)DLVaguxB22a`bs0(|r;&}Kdh8B*}+P38nt)c7dCp8rm98Jr>8db_=>yQ9D z${6!kXanEq&p?i&@wIjEK?kYW>}EHXNAw*1nPoaX`vgT@A{?y9-6}vm!O!% zoydo)YmXlPu%&(1{QFYd>(iwX1me){9uW4>E1si=3Xe9kHY~nC$vBOTWkiHDF6^aG zW#Q$U{h9+Dpt27m!G%_K2r4@o5{+KjxdJ#UJErIYD?7y3Q(4nLTG@Y+ukiDj2w?wT zTu+&jior`>z`1YN1AAcotle3L4&tp3hPj0j@ewXUbPwWsUhYBsz&>oI5{DQH4iRO5 z*jr%cAV_Fg523}|1A6aXmIo1qyK$Oad4|+^{?Yiwu<|E4YVig}4#_W%jNR&?&4HCr zb}T)y1T53t%={w&rWjrnjR%@5U~NP~eO;>=A~jYMraCttAM8aeccHC`;b1%`vK;!H zsN4fG|M8%shaBy#zr!GhD}?f)wr!37Nuvw~J-E+mv8AI9r~SYpvFlxS?9l5b6!l>X z4#BkV%8`uo+Fe8K(sx{P z553htD9KQPFvT?#$Y5`b1~fAXgyHYgP;j)F2em;Gw{7b{HR?V$SN?_SSNVB28f+Qe zY1#J*)QcE>usa-ztHdW0%xMHtZz$eI*ul%UQxf1e*#=zej+-%q4{0h@^1CtWqeguH z>5(|75LjgFFPGMfl{kw9)(&En=*r2I?BaS66qW|zJ03JqjH9*rLw9tdQ%Wc8Da9^@ z8L}1ILA^v@BRgEyFlr$UA}_&miy2a>In>n4`Xr`h1j_Q97e9q<%$o765+p0PT(1Y% zZND$>f~Z()`~BjszK5rHZY`~6&15zYxyjI^4O5e`o}IOLt1SsFIO z=~Q$(L_fWSbzEZ6u*R0EC5lZmh|)mdj6n+P^C_f!_zvV^y$ZLYMW4y`-yqL193%}? z4oSYKjzwFqhpvT|P&HJ}g3l0mw5yyoj($z>s70esy@SbHmYV%SF_9N zm?eY!a_rq36$-B|mO3`Rrx&qGaJnpa$3p>ATn}TQW}PHNe+?MREtfGjr9qFR?qhG! zLh!IsVo^%0N(ltmR=UR9akw<=5}qWh#ER9s5h-7R007>y1`b;`q=pWV*`zNF2kp@I zo#f(CI$}ra-sd)ED<@DPlTmvitD z0Jm@eKNA2F@{|R@joT~6P|SsV2&#g5lFl${hc5r@#)#Qvj}W5Xa9By={5`Co#-U(g zzjN>Hs6#_5cdMU{vrH568Ck+VZi2ZA<&Kl<%>+-{sseES3H6ZLk@;cW*KzY8 zNsL$9Lf5GyVJ-&McXixcGMIzyPUhm%*`}TF<%W$6=aauw6EwOp18P6NuC9d{HDdHIW%cIh*X(Qdtcw7!l`5@N+w4& zu=1e>!5^0W-G0=<7t*O0k%srJd~$k^9-UBg?dP^y)Yn&{heclpfe!kbP7*>`DN<5l z!JnWWP>P$C@*~RP7MNO~vrBxJdoiJ(_FYdu?WA(e$FbVeuvWeEds?@r23<$og@xFs ztANO+c2ZM?rTeJUkD$}9W-D+gR`2u%GaXr%o>9w>sEb?F528B#QfM$->d;_L9C}JW zA>eApCSiUX+Wnm~+1S;lzCY>wtMon&HWaci?(6CM(Qft;c2T`JlZt}bCxd`XW9tJL z;=KD?6xVyy{cY&}rK0;!Q}?4Vh+)Eog(wVH{(=hBJ(>CMaZ-T70flGQffB;d1qn*P zp7LpRahsq76^DnD=W^K6bE<22mAbreKQYgY z9mfuNo*7$_6A?`3_HPYUIl@KshYiN$)(icCKO>c+qx(_2%{Xep>xk1PJ+(}vTGAeu zsAXIsv-hp#;MIC9Z_sMFR@CxK%*~?uSHk%W*!|6@rP>UiM1wrcLn?CA53c2=%L~l7 zgAP-54h5?9C827aD_mZ3k@XY8P36f)G1j7nIW0x(g=B%RY}<c+&d10L9}Jj`MBlW0fbXHf{(!hvc)b#X*w=Mi`fmxS5nu^Bxv3p3{W=gn+KrR0ec7rpT{>z=$LK`I`&Tr5R^hlEiaOGvyCp5 zydwM(RgUnx2EV{hZJWhm`mN!YC_Ov&V@^Y@H-fRL0ZOgrnKLbQXX2FLUHDR-c#uCg z^5-M``6z!rj^~Cap2U-dL3KcoS_VIq0YA<3!+!QH-syxV;Ya`~W?dl-tIji4!3}Z6 znJc9DSxe&l=>pa8OH}(J9O1ya5cn#AGJJyr-aCsIMR*eob}8W<3{V@mag$38>P%*I z`8ax{RfD6ilHa>bvd>0ejV$x;y2PGY=QF#5=4v-{V*QIUkbNt%_iC6ovBt)c`OwT> z1^eSbO* znFWKqtJzwprXdI<%AdwL-SIOPiN@Icx;+*^aBMQX$cmyVpG(JdC?GgFe z^~j$2KE}j5XXg@uP|8U=3zYy7mDaa(-)Ij(TLhJaey2V`==iPxKg=|tcNI>$u;bul zCym1a+7FPx;GcmYdgC65j_{xfh2fV(2}GixwN7k)b6O*k2CXfOr7PbRf!Za~Qz%Lu zk-1Y;k`t6PM56g$!V`%F`?4AK;=%|)N4G?gm3hw#m(Z&CAvfy2c#hhvgx{cMA z?5f>3MX|HjdVt5`e4zz?6|mC_Q>C5nbn0nzy;d@vK_fSq&JBT^_mb8Fe~`Y_rJeN5_O6dRR#U+>g4#53z_h`Pl=CB9PH_6Gc3ChBS}_Y+Fsb59Bl(io580sd8j(g8t>hIIi&p(o_6v(I#fI!R{WvsV zZdvLdLO=Z#MTNn%zhZ4N^rYk&=wm2QybZa@27R&4kwHs-$=)tTqn2BOxfT!j!%s+w z!ackVmP@S$$`XR-&}1CQQr24G12D>wtj5H9K)p#Tcz&}NHPpXRnQ+TF6o)Y}k`$wy z3t0!t*FG?MAke|19thJe9Db>wd%umwgm;nU; z2}qH;){?c>%|I6MN59Q0mneZ zh#6?A90diU#W`4t;QQ81r)cIK)t1vR^0md=aI7!#jVTR zA|Kj$DH}AB?2(0pLhBX`B`m&40W}#qDpEiV;|iz+s4+=@l{D5!2?cyh>>(*y6ZKs# z?8RuJhCr_NvV36EM-%lG=4VI(y);otB6Os#%Gv|o>t$8}K-Waw8q;3`QEE>dZ%z2` zjaEec0+S8q&4}=*_YU?@jXt(@b2CO(?|pndpVTfjXTN#(1`8hMoj8QaSSh8`+6|se@`~R!*|tgqbfg z3sNEtL1Kqd#H7tOl_#gh%A~jkB-jQ~sw^IC5&DvpHC*(UhUuL$6H7!A+!u3Qwq1Vu z1X9B<%X|1yxOk`pNf1;5EqFEr7)7($Kpcw}vVX)6rNs}G<7UGkYN!E%g6`l-33dqN z9O)Qdg@GQ}Pbj1Pgkf_5h>K6dAsq_WhM?~ELAAQo-$0j0EV&MuM1#ea#`|}GYYo6Np%2S^e{)1aq@ zV@Is?;Je+T&dr0=CCb7jAm^Vi;JG|JTQn?Q?-$#5+Rch|r& z0Gt$utJ|=bfuED&hl!sP{3o`1_R=v7{G(Bb&HrFNd>Jz*G>h`&U8pBn+Q^;V((uN3 z`a}yD!YR8z)S;e~aqyUg*## zN9H_x--Ivevpq#+)PpbwpO=bbAK&IHdaJU^tgNyG@3Sg@O2Y_s)IO)~d+xdF%5-dx zZJ0kKHK+0n$M^Kf6Iybkno4R|=rvobNId+vN)3KAS@KRK<6}rZ(Hzu<~?u;BzDn2I<)lpy2e- zc-zYbMl3)>NzR56aa9cxatEr8#YoUvuVqzG4x&EZo-&q?3|!^n6p9U z5LWJvEM5;oL>ZX8`k}bLKS&K1sz-3J>;zQh=EdrAvvOC4Sv^^Kau!miah2)7B4b$Z}tXM zK*`C&Gx~O_tl&I5wE4mOui@QwUb47u1CA(h9P6}Oc;iIb55dx(3I#8im#iAL>_3o! z)7h*Y5;~65FDp_1T&#Y4Yk$+o-`_)ePFT?A(L^`J33;s@hVocLi5jdYp5z~zwR#~= z<*m-cCh8ADUU<_TMAfDfKdbX7d9l^$@Lz`5RCEbiDnYVUcJoF`^e_ji;8h(8Pudnv z(C19-kr|*7g4KOIn{f^C@4hzqYz-{3bTrTV3vOL8=PlyR((J}~x_OImXpE<6Y5yU5 zqxtL6W>obMb|=ax1(<^GZ_EuMft1h?Pq~d-#fEKcdF&C;pUA@A0ypuBIejw$uis37 zBU1%@q++)4u%QrXu%DN;!s0inE6lxFeP1J3&Oljaq#$wG_*&ic~ZWF2_M3YLnktor5XFf2Hl^VVGo``&W+- zmW(!iP#E_^>&-}QG0nBToMW8l+<*69FzHle8KfrFbz*^B3;X^P@DR501+}=P z5Or?MwIH8?!S@JS!7LC}QR*VAFCn?r8@;#7#$9K+5KAf(6HJeiic2ozkRUAObisY+Cusi5$B6%;Vo6o_S;3TKl z1r9w}MZIam#ExNs(a0)MrtM{@#$BD&`N>ra?W3hsSS#S5U=nR|g7D4mKpn4&3AR7I z2W$TmCocoepy(hS$^pZE0JIl1SbHTPO~LK4DTGW1806JSz?d7GLWiLxAQoZj2<6B@efuO8tF4d zVE$EbclhOtbL`eS*3~9%)B2lQ*KgNq71Oc)g8-px!=qyf>y79DV2XAcc?Jpq9@5Sv2lus9!$9CX-=vC#s6h^5>lxb^8z z?&I(+I%Nt|x4WovCLt{|X*-9eGY)hfSSY|0tT_PGWZl z2hJ(it(0pbS#*Z>Me(`VSAqFJh12{YYO?}`FXQ%@=P&#iYR(I955*Q3{iQeC_UCbK z#aXv{j{n~6j$Qn9od1V1yWD^0v^aeGzf0@!VtOpWDVETJX)`Hw;k55Tk>Ynv8*YJU zIBokM1(Xqf$F$$!)jyRoT!u$z*t8cYU@QfUoHlbj-r+S9_KZ-DOkM}(*xOrZG?uaN zdV^t|T6vb_AiuTpEUi_s?Qu8+zmuTTo7qIbRLe7P{NUxcIu6-hJ~eiC$2*hWrUSVh z2PaACRfqkFnBq+GWrhOigVQ3{u)A*#r=-IkalnN$Fw&bYdhbco{~N>xQZvQ_oa<<+ zk?32?=;{o<#}u1{gTyclr%*WdZ}{p#uP@BqO0%x@Pw>RJDs2?5O5vOo9!U`|9WM#a zja#PkJ+0}mKLN|s2ntX*z};9l5cSQF433bltf)rO$Ux=Gk_hC9xn=_BeA9okB>jiRT8-&|Ji`aVw zTxbE0yeSG(TrqiTzxpfQ@|d)AgUu04nWL{iNkp9n`L)P5$D?+$KVYuILXqqZZB=3L za%Y3Bssq2(*+#fzVZVlo1@1Vn*KuYf0w=gC^2I4#^l1+d%oWW2bi zH&b31DuQ1U54NgA7@3|>!wExENj7s(mWJTC%6faFz7k7p%>ilXr zqpr@$N~@Mm`OI(!__6~fAv5cO1qK8&Of3NY-4G19JJqk185=?#WVcmK1!=(;2e(7G zVXt7je>A=;VGt0$-XIjswZ1DO0)*jvObROkB8WDo1c)(8SR z@Pm<&%$AAt{EoDb5D0n^-bZL?6|z0EE@GJ+%m4oMUmD#f_t5=MuZ^brB|UWiER>WH zx+hP?ME4W%YulEGdkLXNp}wet0m^0~KiD~wt(`6KGqfY8L>dayK`>LXyimcnF5^j?cv3zt79uH+ zr-d%J0Ne;X9^_+!cps|89!9ZbnFfUs3`_&N?{VY$!G+-&8`x0f#)$9|Di|C2T{Jd+ zim~z2xmjsHrLh5W{>5}{Y_!nUl|DAU7b35^M9dpQMU>xGHIfF$A+ljDh;zPUyWbQw zI66T5faYckb!ZPqL9;t~T5xmuDfiT8nJiH+ye#%Q*Y2C z8%OJCgJO2F|G1g=g*@A7@Lxf<7IlSZI9VsR%psfg@v!voflzF)j*mdKy zqv$z(fgcfw^;p3eG&xkyX?q>Jp_T&dCa#6h(>HIa?RCr?V7EL?{=Dcky2Kr8Aoo{M z*@(QWl@y!kc8~*FWZ*>4TnMBw{X_aE82`m${LEDsfbsJXaiXhLLxfjf!)daH=(xUy zsI@*ioVQPLYdD<-i1zVkEHEP*8XH*c6b1)fxt_(+vtJdLUZK9f*t#PxR8b|h%`(m4#mH+@!+tBC z-Ts7%MN=w5lG@miJEfAmqx9EqXrdM%t~SeGhy9u8pv$mDpj9Oe+I6KQ6_;p81S>oA z4Y|`KW#H8kx`YB6bLmpg@Mb?63*2w8YOZO_wo}joIc%~8Zp9mF7wMY5HR&6I&8`i! z+2sVu`V!go7^Ysw;SI%~;DYBucGZ>m#2jd2DJX`W!sAayMCzMX<4co##4|w6JgwX^-k0vpB%XbsNhH$~?G5vT_Um9%~5AfCJ#R+yW}% zutbemBLo5N4tOLc)SeUl!X}&X zHD+MfjX5X5psXe;Yty($S(~sniZ1JJjy|?uNgNnUWbEZtj3(8-JF2wbYGAuC2cMf% zwO*rb;aR|8n1%z|5Hsyi9Sz}O0iCJNyd8CSXkHSc{H(#5MPEN_JFRefd4kS~UdiSR zjD}#!16W9X8{BL79?bsQ#nwp$-ej7|Rv)nl8 zj%z}lb<*ir4+?rUsg~)yu4802n5tG6WUsf@EW?Armab}&A!FJM8z7rX+2qmw8t=vrK z8V}ox36ZO?hO@m>^jfmZFqMUxQT$ajk%q>o4dfwfF!g*q+DSU#VaNDB6-1IF@*VpP zP?uXki94~z0!w?((BS$DZoch;P2CaIqU5(A-deyEfQ7aM-%9>_@)b`YFL$?DaAB!6)W%1Xy7-6^rw^zZ$PWZo5&$Qw1kmsb ziw7J1QS)o)3N)`;-VCWg&3_NrR|9ECuBh^u|pFXI{zClzT`4SbJp>Zz*z!6GW& z7yQNI9}4pd4A1ZoTVN8Y^G0wz0c|`a%+g9}z0Ekc= z-%Y_96zd)J5}dOqJ&)3p(6En<)H6K^z#04WWV@%J;RBp2uzc7`7IO*3H)Lc@Eb4iT3?X358Uoxn zGr-|3+;EnFdj1f`VsyEj|0{RRWT3-`ph`Y+cUHiQz? zT&rw}cxD~QM*B719v4t~-_)`Vgzn!k=mfgm&@&5kXVNld^9nqIX%E0Zh9bS^JmtSh zO+W{QuW_^grzyUL|aj{-w)EO=CY~=bi;hAYm6)1fkZqy zd&s_L9|#pOJ)gwX3mY9wgq_-4h&@+66$U}Hy{Ezf)wHjhz17fv_4UE6JGx~ zH1awTJBUO_Si7oUVvOC5YYih8KMpt+$52jvES7`~^KGXBd8@v{)JDVdOrLzh?s3;e2iL>+Zr-AX0uS+3i!K3Tl_!v-UmF& z;@ThIe@Qmkz`Hq> zR(rM9idB2P*S2bJ1w@5x0-FRZCP+0A(10it7coE#L1Om%IrF~n{z(={Y`ypXp6BNy z+4r4y=FFKhXU?3NIdhJv$1zgGhzUyum3uJJTqG?>UN8B4Yy>bh7qFjFV_;&RNPD*$ zig&5n7O2JL!dfXed40Oo2+v0FYZtyLse%T;$&nXXtj5XunL07C$7+XLwcAZbnsBYwqBHCk$mUL2+X?K_KT9VjP<6lg-BqLWfGF&yY z{nY!EKV8jlH7-Gc0e3uARIn%GeIQvHw_d8}INjJ&U+0=9^Zr&r&xNS44O;2664XmfzeVtxIhQm#yh_$>AEDI?v-N8UM1$> zUyg$NXofex4cl}*#q7=zn2q>}kqLoWAp{|$1Jh~turqVI!fqEy^Hp{mYi9?sdthU$ zFOxsQaD{vcwXuh=Hl!nim^>k40;_?wR0Wp{7y$00h%*IV!%@Eom-PQa-w<31eQ#qF zAD&nRS8tjd_^9lnQK<|zal~MKTk6`9kYD`{n4p; zo@RIEpu*de-LvRTLkGsio@*&1dpjamZgehk>$SK68>(CH-%nQk-07J&FU`j0Vx`D; zH>D4JU&ni9Y?k0(ZuWgm*^=Q2zNtIUi0#oJw8-9mmw`}h%;Wo?Zh!Xts{YgiI9z&V zNsMq=gPCSf3a8(FR%3P?VI}h$Xv8LA)@S3O8)x-!)PghO*;V5eJWC}*yt^(9ySn5* z4KmZ+pDeZoxj<$&g45koIAuy>NqS|IT?u{p7e$n?ca>u`x-u{zey+TT_DJl(!^z$Sc*cAg z4|8=Yg}rzB34BUE_s%Jf267f}6iqO$t7+TVjw=FE0z_OQMBGKVEL+T0V+XagbTf&O zu1he_dGhGexhFn`SvLpv966{gw!3@dgvTBQaY*rM0<_VHBakx+i+`Uk(39EJdOC0~ zE!YlX3%MlIcdC6tb9z&2r{(xE9n=@ZLf9iUd1u~lX>=u1u>=%@kDzWUXxS}(&zrnp z$MG+lcYGykcYO0f9Yz}frv<)@s3PCkdU{9iO3Bwr7AJ_w45+IsI4)+6i%=~>sU&<( za7+Zq`C((S0hkE(W+B7p5Jas*P;oH_jz;0qX+m98tr;Y!BNAARt-UdbIIxF?_dcKt zRIDy7jEY3PeDXb;XGh{tUTSKJ&du6r_f%k=&?ncl0Hg)8T@ z9b)Bg%awP5tomNmJ&qICr4kp_n^FDeF{%$d3>RXO50XjWYS|fTS3OYk{S!$YCNip1 zSe-T%$V+EB(2|aO4Rb7Au8}g!bKY$N?;@^zCs|uct(V_QI-*}Vr0s@9Xf-(#e+>L3L)4X%MhCFC59EtG& z)Tp!cirvz?gofNt6q_C6LU`;i3i3FNgz>Y{n=;38La4rlI2K_{5XgRxJWzl^SLd~O zrWQnY>CjtHtF{2W>+a~%`=|k<<>8Z{3?JZXMjNPy&(em@S80a?pJ&XGe3spEBh6@J zozCJ1rG4MQ&^qTp1vqcO{m|o<{5~*S&h>Ogt+R-I zU^W;HT25e3)E~&ptoJ6vX4Xie$InI2j2pPOn029pHB>O^avLyDp zAw={T4}C`_VEl zdO?w&Q8VOjMSjNU2(bU~d*Pb8&@~-|VWLd}zUsx;C)Xo8zH#{)c6=lH8XN+ipbOFK z2X%PDpB<;atZNYL3WTtRxcZ^6hA<5EM5t*2F~7Zv()kZ6C`I31LAekENZJYEuCIsZ zz6hz2xpT=7rBaLm5+jK-XPDB$V{YO9I+`{7w`O%zIC}j<9*<#i!xbz(z}qm z_1HPIaG~Z6lpDGx-bq6M`o`)9WIRSIcnH-G%IXF5a3H}4_mGhgv(K%7r;vW%16di> zWLg{ibLp+j+>sRDL{!Z;l8n9tJr1pq^eX5oq*KX~aVI3>?oKBit$kaaP^g(k#fPI8 zCg)jB%V;D34d{iZBlJQ!j1g&tq|z$*UmnI^sJU z>V>h}(D`T53zZ=T$!K{$irl;9iRho*^D&0sfFwQ|!Sz|q#rCZfy+X>CYzC>`$5PV$ z&{!?f38@jWG7z@IaD%jxAK&_#*ZNr*%AwtzXk#kA99fSt)n z1eN%byS6*)4y0T&*uO4kj$y5FwIN5locseS1ysZeg>7Xi#c+He?Xm;6_tT5aQX`@h zR2?Fm*d5&+L8lS6{}i8grDHjH8N3GpLHFdslX4bzG~IPU_nu&SWBU7Y2~)k83scLK z>8?wKKb`{A^a=_G0+^zi+6fB0&kTUNt|?&7YOX>oFGSSvnfxx@Yg)cbOkNC!wVA=2 z;yyYxYY$YmiT0YF2X&xoMY1=~R69P$YF>G%ls^@>(+h5+|NL_%YCR96vZYD1Ntg;( zBA;R}hAda#;Qce#Kz-xGnix0PrUu1~pg8$9+!jpbVUx}FLRO8d%kJ$N*!ME}6EvMK zqPX*3JF}nc;70~R^}iuyU4B~Sac$kfxJsX`*67dGYdRl7a!#RPZ4&xo%yNT2VcPt4 z)-Lhw{v=lcyVn4IZHK7;Vjc6 z#$A%%6-Y)_3SSb?`xCDAKBT4F{^%$yNvBq>O3{cTq$XCXrNhvvQc*W{eWgn7ghjJX zQ>z0w4h)AeD-+!ojqu1ejDOUH-D1dj0q%zoJeZDUih6}jdpt#lr4P6@(;AypXh_$m zx58z<-1)+$W|naR95cPtq4$An+`Ty~^m=QXl+RGQ7S3$pnepg+;g3xQPf;(z;4B1O zKu4J82RGo9NX(GFMtu4L_)}kw>!sL+$4TsbvWS{~r+0pEow4$?!xdL~I!}zNO_VcEfIyE{U&hN|Vb8%s<*88BA zUHBDMCY`WUbcv>#p4FvmN~k()P$EQqm1 zDK*vv*XpEtcU@wRHF@PFQvT#Y;_F3@2*eky8cBL(7p1u%=q3W)AR2_=7w#Ntq8_ed z;31zK!ZtdtR!Y{1(n)vrG%?<~trFU9(trjHTQ>V^o@^E($ztT=;Qe>)LN!2WbUz$|i zonlJm?CGN5)Wb(SMzEXfR9z4f#t*zw(%S*bh+*H|JvVR|dTF)8q^1169v zCUVBpD2(?wS)Yi#GVke6$=o+Gn)|>toaxeTqy7R<(q23|tw8U`%_v=%*Wxt+7(i2I z@EYpI{`^$VWvN5vGLCuySS5u|ltw$I9kAPt*+r?Y6zr?gsIYL3@i`g|)2D0jChf-l z0OH>+)cWHQrM?eyMNQq>D@FLfqW%^lG*eQc`A~J*+?#-`>;U*Hpp_cIMq@Ba7eDI1>ZB&s6i}(r% zaJyX7NDipap6i@$V;2Jih9-P~*A4e7MYL2?`WRPX)lNRDcJk4Io%{-Hl5hztYY%Eh zE8P`Gr{OZG@Ob?K%$^t|-WeA{198RSoGi1Rghf7JL8a&`uw%GqFuusz~P1f+WzlqlC;V z>nM;zim=g#TPl{8TI^68K`~)tMXGmV z4J-$P?o(QQ5O;i}88z7u58gb4x9L-FZHs-D6BFv@>KpWpLHRrG&R!r7W}poTq6-Hm zS$}4z!Ac} zVguCT^ms)l&g%rDffvMQ9C`%pm@eOF(?*2Kh(e8e$YlOQ$&t2XX8O^{WV zr5uPod`#<_5HsT$jGjQ&pz<1S*qIiX7_-p7a>rpA-*(7Fi=gwo@eZzh&;Y?Jfpj3J zYFnY6-Y0VdJb1CN;~057)Ri&F#QjvztdXYaJVkUZGvbz#-fhA>m6{ctg)zH!MS^o& zrvWTUzTB~J*v-;NTcyx-W~n$?y2Ds?h8(YW%6d^;ysj8iQdZE0=!+?~0#8M^r=pjg zf~6Q3AFy>Ey}Q>S{M>`uD%VWZpvTsv!bSV{bGE#MB=JTE#wv^@u`EP*#G<|xm*Rr7 z0CY_@djY!zIxOaP=l4o*_UzA_NXx?J2IPR5u^~sG=$s1kiV?(qHZY1@@1=JZ zQ{W$*yxXaEc6FaTU>Z7?gH-3~qkrHt?_MlufsHqRFT0fF4eahKE0~7dr0r#1APBHuhsarc=D==l^@c`*R0nB!U}Ra*`?ggK!KDD3%D9TW@B2yAW4*H6?Ogz7V~A#-v@ z;)x4ViLuah%3x(QZLxuIIOum_BhK64{MaEG7QCUUq?nyyBQ>5WBt(VkBruv(2Cjy) z7qDC-11;Im`s!$ntjPa~JIqUfdfom!w*}IcPg|IOJ&Ibe7ArOFbPRfFc+c|6lu3fB2 zx3sUGgv}mq7ehoYusahW2HCxbsD@NbO(T)pQes#(vU06f<1$j&TtmQ0ybVK=@1cgy z)nM#MAXrApP$sERTrIGX$JWgr&sb`OXY6D6%dO%5xr@ulz6Kw%iJz%FX;v8W;r-Mw z3=v{TN7uO+l5;jV=7UcM0+|&F
`$hOG5K6D5ILXKrF2t~y%>Rpl+bcKj=soQH{ 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 Qnx8=P6KH+{%}+r4FKdSVMgRZ+ literal 852754 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 z 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

HgL+0*rHXBmbn3Zis5U5C1z5>&W~?k{+3L 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

uj0Lx$3@C1QXzsAQ|{SX)B??G>}%2;vQ}`_!ph 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

DKaAI7)O{%Nt6c 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

67%vL%;bW@t7aX09MAr6t@d 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 From 7c629fcacb082e1b8226b505f5ee90772d7667b6 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Wed, 17 Apr 2024 14:52:13 +0800 Subject: [PATCH 030/110] fix UnderworldGoddessoftheClosedWorldLinkSummon --- Game/AI/Decks/TearlamentsExecutor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game/AI/Decks/TearlamentsExecutor.cs b/Game/AI/Decks/TearlamentsExecutor.cs index 3641c2430..2300de7ea 100644 --- a/Game/AI/Decks/TearlamentsExecutor.cs +++ b/Game/AI/Decks/TearlamentsExecutor.cs @@ -1705,7 +1705,7 @@ private bool UnderworldGoddessoftheClosedWorldLinkSummon(bool filter = true) if (Duel.Turn == 1 || Enemy.GetMonsterCount() <= 0) return false; List e_cards = Enemy.GetMonsters().Where(card => card != null && card.IsFaceup() && card.IsAttack()).ToList(); List b_cards = Bot.GetMonsters().Where(card => card != null && card.IsFaceup() && card.IsAttack()).ToList(); - if ((e_cards.Count <= 0 || b_cards.Count <= 0) && Enemy.MonsterZone.GetDangerousMonster() == null) return false; + if (e_cards.Count <= 0 || b_cards.Count <= 0 || Enemy.MonsterZone.GetDangerousMonster() == null) return false; e_cards.Sort(CardContainer.CompareCardAttack); e_cards.Reverse(); b_cards.Sort(CardContainer.CompareCardAttack); From 5a699ad2d344b77bb1b47fd2b7550adc5be45796 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 11 May 2024 16:03:19 +0800 Subject: [PATCH 031/110] update bots list --- BotWrapper/bot.conf | 58 ++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index a75c8104b..638935c6b 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -14,9 +14,19 @@ Random=AI_LV2 一些比较弱的卡组。 SUPPORT_MASTER_RULE_2020 -!随机-普通 +!随机-一般 Random=AI_LV3 -一些环境里可以看到的卡组。 +一些不是很弱的卡组。 +SUPPORT_MASTER_RULE_2020 + +!随机-普通 +Random=AI_LV4 +一些可以(或者曾经可以)在竞技环境里看到的卡组。 +SUPPORT_MASTER_RULE_2020 + +!随机-狂野 +Random=AI_WILD +普通的人机的卡组会符合其使用的卡池对应的环境的禁限卡表,但狂野模式的人机的卡组一般不符合任何禁限卡表。 SUPPORT_MASTER_RULE_2020 !随机-报社 @@ -67,17 +77,17 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !琪露诺-饼蛙 Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN 大师规则三的全盛饼蛙卡组。 -SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !复制植物-青眼 Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN 青眼卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !复制植物-十二兽 Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN 大师规则三的十四兽卡组。 -SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !尼亚-妖仙兽 Name=尼亚 Deck=Yosenju Dialog=near.zh-CN @@ -92,17 +102,17 @@ AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2 !尼亚-淘气仙星 Name=尼亚 Deck=Trickstar Dialog=near.zh-CN 旧式淘气仙星卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !尼亚-幻变骚灵 Name=尼亚 Deck=Altergeist Dialog=near.zh-CN 幻变骚灵卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !尼亚-拉比林斯迷宫 Name=尼亚 Deck=Labrynth Dialog=near.zh-CN 拉比林斯迷宫卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !复制梁龙-闪刀姬 Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN @@ -112,7 +122,7 @@ AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !复制梁龙-自奏圣乐 Name=复制梁龙 Deck=Orcust Dialog=anothercopy.zh-CN 旧式自奏圣乐卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !复制梁龙-转生炎兽 Name=复制梁龙 Deck=Salamangreat Dialog=anothercopy.zh-CN @@ -152,7 +162,7 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !试作型机器人1732 Name=试作型机器人1732 Deck=ST1732 Dialog=zh-CN 由三盒ST17和三盒SD32组成的卡组。 -AI_LV2 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV1 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !奇異果 Name=奇異果 Deck=LightswornShaddoldinosour Dialog=kiwi.zh-TW @@ -167,7 +177,7 @@ AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !MAX龍果 Name=MAX龍果 Deck=BlueEyesMaxDragon Dialog=kiwi.zh-TW 青眼混沌极龙卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !幻煌果 Name=幻煌果 Deck=Phantasm Dialog=kiwi.zh-TW @@ -187,54 +197,54 @@ AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2 !我太帅了-真红眼龙骑士 Name=我太帅了 Deck=Dragun Dialog=smart.zh-CN 超魔导真红眼龙骑士卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !我太帅了-水百凤凰勇者 Name=我太帅了 Deck=Brave Dialog=smart.zh-CN 水机百头龙凤凰人勇者卡组。 -AI_LV3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_2020 !玻璃女巫-魔女术 Name=玻璃女巫 Deck=Witchcraft Dialog=verre.zh-CN 魔女术卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !玻璃女巫-救祓少女 Name=玻璃女巫 Deck=Exosister Dialog=verre.zh-CN 救祓少女卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !艾克莉西娅-相剑 Name=艾克莉西娅 Deck=Swordsoul Dialog=ecclesia.zh-CN 相剑卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !艾克莉西娅-教导 Name=艾克莉西娅 Deck=Dogmatika Dialog=ecclesia.zh-CN 教导卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !神数不神-刹帝利 Name=神数不神 Deck=Kashtira Dialog=Zefra.zh-CN 俱舍怒威族卡组。 -AI_LV3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_2020 -![狂野模式]神数不神-雷龙 +![狂野]神数不神-雷龙 Name=神数不神 Deck=ThunderDragon Dialog=Zefra.zh-CN -深渊混沌雷龙卡组。(普通模式的人机的卡组会符合其使用的卡池对应的环境的禁限卡表,但在狂野模式中,人机的卡组不符合任何禁限卡表。) -SUPPORT_MASTER_RULE_2020 +深渊混沌雷龙卡组。 +AI_WILD SUPPORT_MASTER_RULE_2020 !神数不神-珠泪哀歌 Name=神数不神 Deck=Tearlaments Dialog=Zefra.zh-CN 旧式地天使珠泪哀歌族卡组。 -AI_LV3 SUPPORT_MASTER_RULE_2020 +AI_LV4 AI_WILD SUPPORT_MASTER_RULE_2020 !神数不神-神数 Name=神数不神 Deck=Zefra Dialog=Zefra.zh-CN 神数卡组。 -AI_LV3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_2020 !今晚有宵夜吗-超重武者 Name=今晚有宵夜吗 Deck=SuperheavySamurai Dialog=superheavysamurai.zh-CN 超重武者卡组。 -AI_LV3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_2020 From 3feb38fe12278c8a8a2304bf9378e1292c0204f6 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 11 May 2024 16:35:36 +0800 Subject: [PATCH 032/110] allow empty dialog --- Game/AI/Dialogs.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Game/AI/Dialogs.cs b/Game/AI/Dialogs.cs index 008356497..b62f9d421 100644 --- a/Game/AI/Dialogs.cs +++ b/Game/AI/Dialogs.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Collections.Generic; using System.Runtime.Serialization; @@ -166,6 +166,8 @@ private void InternalSendMessage(IList array, params object[] opts) { if (!_game._chat) return; + if (array == null || array.Count == 0) + return; string message = string.Format(array[Program.Rand.Next(array.Count)], opts); if (message != "") _game.Chat(message); From d18e943d45031e3e622e0f6c42eba8557ffd1a67 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 11 May 2024 16:51:31 +0800 Subject: [PATCH 033/110] add ExecutorType.Surrender --- Dialogs/default.json | 6 ++++++ Dialogs/gugugu.zh-CN.json | 5 +++++ Dialogs/zh-CN.json | 4 ++++ Game/AI/Dialogs.cs | 11 ++++++++++- Game/AI/ExecutorType.cs | 3 ++- Game/GameAI.cs | 16 ++++++++++++++++ Game/GameClient.cs | 5 +++++ 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/Dialogs/default.json b/Dialogs/default.json index 22ff2f284..311558d7e 100644 --- a/Dialogs/default.json +++ b/Dialogs/default.json @@ -64,5 +64,11 @@ "Before you do that, I'll chain {0}!", "Nice try, but I have {0}!", "Didn't expect {0}, did you?" + ], + "surrender": [ + "I surrender.", + "You win this time.", + "I can't win this duel.", + "Good game." ] } \ No newline at end of file diff --git a/Dialogs/gugugu.zh-CN.json b/Dialogs/gugugu.zh-CN.json index 5084819d8..72d899a32 100644 --- a/Dialogs/gugugu.zh-CN.json +++ b/Dialogs/gugugu.zh-CN.json @@ -55,5 +55,10 @@ "但我鸽了", "无此服务", "可怕" + ], + "surrender": [ + "太可怕了(跑路", + "这游戏好难玩(跑路", + "还好我不玩游戏王(跑路" ] } diff --git a/Dialogs/zh-CN.json b/Dialogs/zh-CN.json index c77ba9d4b..4a9d3b923 100644 --- a/Dialogs/zh-CN.json +++ b/Dialogs/zh-CN.json @@ -71,5 +71,9 @@ "我不认同。{0},发动!", "看样子你忘了我的{0}!", "你考虑过我有{0}吗?" + ], + "surrender": [ + "我认输。", + "我承认你的胜利。" ] } diff --git a/Game/AI/Dialogs.cs b/Game/AI/Dialogs.cs index b62f9d421..8be0c7161 100644 --- a/Game/AI/Dialogs.cs +++ b/Game/AI/Dialogs.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Collections.Generic; using System.Runtime.Serialization; @@ -36,6 +36,8 @@ public class DialogsData [DataMember] public string[] chaining { get; set; } [DataMember] + public string[] surrender { get; set; } + [DataMember] public string[] custom { get; set; } } public class Dialogs @@ -55,6 +57,7 @@ public class Dialogs private string[] _summon; private string[] _setmonster; private string[] _chaining; + private string[] _surrender; private string[] _custom; public Dialogs(GameClient game) @@ -78,6 +81,7 @@ public Dialogs(GameClient game) _summon = data.summon; _setmonster = data.setmonster; _chaining = data.chaining; + _surrender = data.surrender; _custom = data.custom; } } @@ -162,6 +166,11 @@ public void SendChaining(string card) InternalSendMessage(_chaining, card); } + public void SendSurrender() + { + InternalSendMessage(_surrender); + } + private void InternalSendMessage(IList array, params object[] opts) { if (!_game._chat) diff --git a/Game/AI/ExecutorType.cs b/Game/AI/ExecutorType.cs index 47a557d32..d505f4dc8 100644 --- a/Game/AI/ExecutorType.cs +++ b/Game/AI/ExecutorType.cs @@ -11,6 +11,7 @@ public enum ExecutorType SummonOrSet, GoToBattlePhase, GoToMainPhase2, - GoToEndPhase + GoToEndPhase, + Surrender } } \ No newline at end of file diff --git a/Game/GameAI.cs b/Game/GameAI.cs index 77136319d..4eda9711e 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -25,6 +25,18 @@ public GameAI(GameClient game, Duel duel) _activatedCards = new Dictionary(); } + private void CheckSurrender() + { + foreach (CardExecutor exec in Executor.Executors) + { + if (exec.Type == ExecutorType.Surrender && exec.Func()) + { + _dialogs.SendSurrender(); + Game.Surrender(); + } + } + } + ///

/// Called when the AI got the error message. /// @@ -117,6 +129,7 @@ public void OnNewPhase() _dialogs.SendNewTurn(); } Executor.OnNewPhase(); + CheckSurrender(); } public void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) @@ -130,6 +143,7 @@ public void OnMove(ClientCard card, int previousControler, int previousLocation, public void OnDirectAttack(ClientCard card) { _dialogs.SendOnDirectAttack(card.Name); + CheckSurrender(); } /// @@ -155,6 +169,7 @@ public void OnChainEnd() m_selector.Clear(); m_selector_pointer = -1; Executor.OnChainEnd(); + CheckSurrender(); } /// @@ -422,6 +437,7 @@ public bool OnSelectEffectYn(ClientCard card, int desc) public MainPhaseAction OnSelectIdleCmd(MainPhase main) { Executor.SetMain(main); + CheckSurrender(); foreach (CardExecutor exec in Executor.Executors) { if (exec.Type == ExecutorType.GoToEndPhase && main.CanEndPhase && exec.Func()) // check if should enter end phase directly diff --git a/Game/GameClient.cs b/Game/GameClient.cs index 89e0c5d7b..616cac04b 100644 --- a/Game/GameClient.cs +++ b/Game/GameClient.cs @@ -90,6 +90,11 @@ public void Chat(string message) Connection.Send(chat); } + public void Surrender() + { + Connection.Send(CtosMessage.Surrender); + } + private void OnPacketReceived(BinaryReader reader) { _behavior.OnPacket(reader); From 0310c20b9b0ba71a57c83cec6713fc11f9102f02 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 11 May 2024 17:37:01 +0800 Subject: [PATCH 034/110] encoding fix --- Game/AI/Enums/DangerousMonster.cs | 2 +- Game/AI/Enums/InvincibleMonster.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Game/AI/Enums/DangerousMonster.cs b/Game/AI/Enums/DangerousMonster.cs index caa7648b7..277aaf017 100644 --- a/Game/AI/Enums/DangerousMonster.cs +++ b/Game/AI/Enums/DangerousMonster.cs @@ -26,6 +26,6 @@ public enum DangerousMonster DaigustoSphreeze = 29552709, OhimetheManifestedMikanko = 81260679, ArahimetheManifestedMikanko = 75771170, - YubelDasEwigLiebeWächter = 47172959 + YubelDasEwigLiebeWachter = 47172959 } } diff --git a/Game/AI/Enums/InvincibleMonster.cs b/Game/AI/Enums/InvincibleMonster.cs index 160968264..85e6ae17b 100644 --- a/Game/AI/Enums/InvincibleMonster.cs +++ b/Game/AI/Enums/InvincibleMonster.cs @@ -114,6 +114,6 @@ public enum InvincibleEnemyMonster DarkGuardian = 26746975, EnvoyOfTheWaxState = 87462901, Fluffyfluff = 85401123, - YubelDasEwigLiebeWächter = 47172959 + YubelDasEwigLiebeWachter = 47172959 } } From a3590dc2d215012eb4fe2437b838a2282963e8f8 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Wed, 22 May 2024 17:15:10 +0800 Subject: [PATCH 035/110] include YGOSharp codes instead of using dll --- WindBot.csproj | 36 ++- YGOSharp.Network.dll | Bin 17408 -> 0 bytes YGOSharp.Network/BinaryClient.cs | 229 ++++++++++++++++++++ YGOSharp.Network/Enums/CtosMessage.cs | 23 ++ YGOSharp.Network/Enums/GameState.cs | 12 + YGOSharp.Network/Enums/PlayerChange.cs | 10 + YGOSharp.Network/Enums/PlayerState.cs | 8 + YGOSharp.Network/Enums/PlayerType.cs | 23 ++ YGOSharp.Network/Enums/StocMessage.cs | 26 +++ YGOSharp.Network/NetworkClient.cs | 161 ++++++++++++++ YGOSharp.Network/Utils/BinaryExtensions.cs | 32 +++ YGOSharp.Network/YGOClient.cs | 42 ++++ YGOSharp.OCGWrapper.Enums.dll | Bin 9728 -> 0 bytes YGOSharp.OCGWrapper.Enums/CardAttribute.cs | 13 ++ YGOSharp.OCGWrapper.Enums/CardLinkMarker.cs | 15 ++ YGOSharp.OCGWrapper.Enums/CardLocation.cs | 17 ++ YGOSharp.OCGWrapper.Enums/CardPosition.cs | 14 ++ YGOSharp.OCGWrapper.Enums/CardRace.cs | 32 +++ YGOSharp.OCGWrapper.Enums/CardType.cs | 31 +++ YGOSharp.OCGWrapper.Enums/DuelPhase.cs | 16 ++ YGOSharp.OCGWrapper.Enums/GameMessage.cs | 101 +++++++++ YGOSharp.OCGWrapper.Enums/Query.cs | 29 +++ YGOSharp.OCGWrapper.dll | Bin 16896 -> 0 bytes YGOSharp.OCGWrapper/Card.cs | 112 ++++++++++ YGOSharp.OCGWrapper/CardsManager.cs | 45 ++++ YGOSharp.OCGWrapper/NamedCard.cs | 21 ++ YGOSharp.OCGWrapper/NamedCardsManager.cs | 68 ++++++ 27 files changed, 1105 insertions(+), 11 deletions(-) delete mode 100644 YGOSharp.Network.dll create mode 100644 YGOSharp.Network/BinaryClient.cs create mode 100644 YGOSharp.Network/Enums/CtosMessage.cs create mode 100644 YGOSharp.Network/Enums/GameState.cs create mode 100644 YGOSharp.Network/Enums/PlayerChange.cs create mode 100644 YGOSharp.Network/Enums/PlayerState.cs create mode 100644 YGOSharp.Network/Enums/PlayerType.cs create mode 100644 YGOSharp.Network/Enums/StocMessage.cs create mode 100644 YGOSharp.Network/NetworkClient.cs create mode 100644 YGOSharp.Network/Utils/BinaryExtensions.cs create mode 100644 YGOSharp.Network/YGOClient.cs delete mode 100644 YGOSharp.OCGWrapper.Enums.dll create mode 100644 YGOSharp.OCGWrapper.Enums/CardAttribute.cs create mode 100644 YGOSharp.OCGWrapper.Enums/CardLinkMarker.cs create mode 100644 YGOSharp.OCGWrapper.Enums/CardLocation.cs create mode 100644 YGOSharp.OCGWrapper.Enums/CardPosition.cs create mode 100644 YGOSharp.OCGWrapper.Enums/CardRace.cs create mode 100644 YGOSharp.OCGWrapper.Enums/CardType.cs create mode 100644 YGOSharp.OCGWrapper.Enums/DuelPhase.cs create mode 100644 YGOSharp.OCGWrapper.Enums/GameMessage.cs create mode 100644 YGOSharp.OCGWrapper.Enums/Query.cs delete mode 100644 YGOSharp.OCGWrapper.dll create mode 100644 YGOSharp.OCGWrapper/Card.cs create mode 100644 YGOSharp.OCGWrapper/CardsManager.cs create mode 100644 YGOSharp.OCGWrapper/NamedCard.cs create mode 100644 YGOSharp.OCGWrapper/NamedCardsManager.cs diff --git a/WindBot.csproj b/WindBot.csproj index 5460336f8..6d9d022f9 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -1,4 +1,4 @@ - + @@ -50,15 +50,6 @@ - - .\YGOSharp.Network.dll - - - .\YGOSharp.OCGWrapper.dll - - - .\YGOSharp.OCGWrapper.Enums.dll - @@ -158,6 +149,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -184,4 +198,4 @@ --> - + \ No newline at end of file diff --git a/YGOSharp.Network.dll b/YGOSharp.Network.dll deleted file mode 100644 index 1df1f9c03b4d013a090f137cfa9dce7a58156f3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 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 diff --git a/YGOSharp.Network/BinaryClient.cs b/YGOSharp.Network/BinaryClient.cs new file mode 100644 index 000000000..c945a9587 --- /dev/null +++ b/YGOSharp.Network/BinaryClient.cs @@ -0,0 +1,229 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Sockets; + +namespace YGOSharp.Network +{ + public class BinaryClient + { + public event Action Connected; + public event Action Disconnected; + public event Action PacketReceived; + + protected int MaxPacketLength = 0xFFFF; + protected int HeaderSize = 2; + protected bool IsHeaderSizeIncluded = false; + + private NetworkClient _client; + + private List _receiveBuffer = new List(); + private Queue _pendingPackets = new Queue(); + private byte[] _lengthBuffer = new byte[16]; + + private int _pendingLength; + private bool _wasConnected; + private bool _wasDisconnected; + private bool _wasDisconnectedEventFired; + private Exception _closingException; + + public bool IsConnected + { + get { return !_wasDisconnectedEventFired; } + } + + public IPAddress RemoteIPAddress + { + get { return _client.RemoteIPAddress; } + } + + public BinaryClient(NetworkClient client) + { + _client = client; + + client.Connected += Client_Connected; + client.Disconnected += Client_Disconnected; + client.DataReceived += Client_DataReceived; + + if (_client.IsConnected) + { + _client.BeginReceive(); + } + } + + public void Connect(IPAddress address, int port) + { + _client.BeginConnect(address, port); + } + + public void Initialize(Socket socket) + { + _client.Initialize(socket); + } + + public void Update() + { + if (_wasConnected) + { + _wasConnected = false; + Connected?.Invoke(); + } + ReceivePendingPackets(); + if (_wasDisconnected && !_wasDisconnectedEventFired) + { + _wasDisconnectedEventFired = true; + Disconnected?.Invoke(_closingException); + } + } + + public void Send(byte[] packet) + { + if (packet.Length > MaxPacketLength) + { + throw new Exception("Tried to send a too large packet"); + } + + int packetLength = packet.Length; + if (IsHeaderSizeIncluded) packetLength += HeaderSize; + + byte[] header; + if (HeaderSize == 2) + { + header = BitConverter.GetBytes((ushort)packetLength); + } + else if (HeaderSize == 4) + { + header = BitConverter.GetBytes(packetLength); + } + else + { + throw new Exception("Unsupported header size: " + HeaderSize); + } + byte[] data = new byte[packet.Length + HeaderSize]; + Array.Copy(header, 0, data, 0, header.Length); + Array.Copy(packet, 0, data, header.Length, packet.Length); + _client.BeginSend(data); + } + + public void Close(Exception error = null) + { + _client.Close(error); + } + + private void ReceivePendingPackets() + { + bool hasReceived; + do + { + byte[] packet = null; + lock (_pendingPackets) + { + if (_pendingPackets.Count > 0) + { + packet = _pendingPackets.Dequeue(); + } + } + hasReceived = false; + if (packet != null) + { + hasReceived = true; + using (MemoryStream stream = new MemoryStream(packet, false)) + { + using (BinaryReader reader = new BinaryReader(stream)) + { + PacketReceived?.Invoke(reader); + } + } + } + } + while (hasReceived); + } + + private void Client_Connected() + { + _wasConnected = true; + } + + private void Client_Disconnected(Exception ex) + { + _wasDisconnected = true; + _closingException = ex; + } + + private void Client_DataReceived(byte[] data) + { + _receiveBuffer.AddRange(data); + ExtractPackets(); + } + + private void ExtractPackets() + { + bool hasExtracted; + do + { + if (_pendingLength == 0) + { + hasExtracted = ExtractPendingLength(); + } + else + { + hasExtracted = ExtractPendingPacket(); + } + } + while (hasExtracted); + } + + private bool ExtractPendingLength() + { + if (_receiveBuffer.Count >= HeaderSize) + { + _receiveBuffer.CopyTo(0, _lengthBuffer, 0, HeaderSize); + if (HeaderSize == 2) + { + _pendingLength = BitConverter.ToUInt16(_lengthBuffer, 0); + } + else if (HeaderSize == 4) + { + _pendingLength = BitConverter.ToInt32(_lengthBuffer, 0); + } + else + { + throw new Exception("Unsupported header size: " + HeaderSize); + } + _receiveBuffer.RemoveRange(0, HeaderSize); + + if (IsHeaderSizeIncluded) _pendingLength -= HeaderSize; + + if (_pendingLength < 0 || _pendingLength > MaxPacketLength) + { + _client.Close(new Exception("Tried to receive a too large packet")); + return false; + } + + return true; + } + return false; + } + + private bool ExtractPendingPacket() + { + if (_receiveBuffer.Count >= _pendingLength) + { + byte[] packet = new byte[_pendingLength]; + + _receiveBuffer.CopyTo(0, packet, 0, _pendingLength); + _receiveBuffer.RemoveRange(0, _pendingLength); + _pendingLength = 0; + + lock (_pendingPackets) + { + _pendingPackets.Enqueue(packet); + } + + return true; + } + return false; + } + } +} diff --git a/YGOSharp.Network/Enums/CtosMessage.cs b/YGOSharp.Network/Enums/CtosMessage.cs new file mode 100644 index 000000000..d798dc7a8 --- /dev/null +++ b/YGOSharp.Network/Enums/CtosMessage.cs @@ -0,0 +1,23 @@ +namespace YGOSharp.Network.Enums +{ + public enum CtosMessage + { + Response = 0x1, + UpdateDeck = 0x2, + HandResult = 0x3, + TpResult = 0x4, + PlayerInfo = 0x10, + CreateGame = 0x11, + JoinGame = 0x12, + LeaveGame = 0x13, + Surrender = 0x14, + TimeConfirm = 0x15, + Chat = 0x16, + HsToDuelist = 0x20, + HsToObserver = 0x21, + HsReady = 0x22, + HsNotReady = 0x23, + HsKick = 0x24, + HsStart = 0x25 + } +} diff --git a/YGOSharp.Network/Enums/GameState.cs b/YGOSharp.Network/Enums/GameState.cs new file mode 100644 index 000000000..048d39852 --- /dev/null +++ b/YGOSharp.Network/Enums/GameState.cs @@ -0,0 +1,12 @@ +namespace YGOSharp.Network.Enums +{ + public enum GameState + { + Lobby = 0, + Hand = 1, + Starting = 2, + Duel = 3, + End = 4, + Side = 5 + } +} \ No newline at end of file diff --git a/YGOSharp.Network/Enums/PlayerChange.cs b/YGOSharp.Network/Enums/PlayerChange.cs new file mode 100644 index 000000000..c5be0a956 --- /dev/null +++ b/YGOSharp.Network/Enums/PlayerChange.cs @@ -0,0 +1,10 @@ +namespace YGOSharp.Network.Enums +{ + public enum PlayerChange + { + Observe = 0x8, + Ready = 0x9, + NotReady = 0xA, + Leave = 0xB + } +} diff --git a/YGOSharp.Network/Enums/PlayerState.cs b/YGOSharp.Network/Enums/PlayerState.cs new file mode 100644 index 000000000..338529c97 --- /dev/null +++ b/YGOSharp.Network/Enums/PlayerState.cs @@ -0,0 +1,8 @@ +namespace YGOSharp.Network.Enums +{ + public enum PlayerState + { + None = 0, + Response = 1 + } +} \ No newline at end of file diff --git a/YGOSharp.Network/Enums/PlayerType.cs b/YGOSharp.Network/Enums/PlayerType.cs new file mode 100644 index 000000000..cf36a162f --- /dev/null +++ b/YGOSharp.Network/Enums/PlayerType.cs @@ -0,0 +1,23 @@ +namespace YGOSharp.Network.Enums +{ + public enum PlayerType + { + Undefined = -1, + Player1 = 0, + Player2 = 1, + Player3 = 2, + Player4 = 3, + Player5 = 4, + Player6 = 5, + Observer = 7, + Host = 0x10, + Red = 11, + Green = 12, + Blue = 13, + BabyBlue = 14, + Pink = 15, + Yellow = 16, + White = 17, + Gray = 18 + } +} \ No newline at end of file diff --git a/YGOSharp.Network/Enums/StocMessage.cs b/YGOSharp.Network/Enums/StocMessage.cs new file mode 100644 index 000000000..308f83d9e --- /dev/null +++ b/YGOSharp.Network/Enums/StocMessage.cs @@ -0,0 +1,26 @@ +namespace YGOSharp.Network.Enums +{ + public enum StocMessage + { + GameMsg = 0x1, + ErrorMsg = 0x2, + SelectHand = 0x3, + SelectTp = 0x4, + HandResult = 0x5, + TpResult = 0x6, + ChangeSide = 0x7, + WaitingSide = 0x8, + CreateGame = 0x11, + JoinGame = 0x12, + TypeChange = 0x13, + LeaveGame = 0x14, + DuelStart = 0x15, + DuelEnd = 0x16, + Replay = 0x17, + TimeLimit = 0x18, + Chat = 0x19, + HsPlayerEnter = 0x20, + HsPlayerChange = 0x21, + HsWatchChange = 0x22 + } +} diff --git a/YGOSharp.Network/NetworkClient.cs b/YGOSharp.Network/NetworkClient.cs new file mode 100644 index 000000000..eec028b3a --- /dev/null +++ b/YGOSharp.Network/NetworkClient.cs @@ -0,0 +1,161 @@ +using System; +using System.Net; +using System.Net.Sockets; + +namespace YGOSharp.Network +{ + public class NetworkClient + { + public event Action Connected; + public event Action Disconnected; + public event Action DataReceived; + + public bool IsConnected { get; private set; } + + public IPAddress RemoteIPAddress + { + get { return _endPoint.Address; } + } + + private const int BufferSize = 4096; + + private Socket _socket; + private IPEndPoint _endPoint; + private bool _isClosed; + private byte[] _receiveBuffer = new byte[BufferSize]; + + public NetworkClient() + { + } + + public NetworkClient(Socket socket) + { + Initialize(socket); + } + + public void Initialize(Socket socket) + { + _endPoint = (IPEndPoint)socket.RemoteEndPoint; + _socket = socket; + IsConnected = true; + Connected?.Invoke(); + } + + public void BeginConnect(IPAddress address, int port) + { + if (!IsConnected && !_isClosed) + { + IsConnected = true; + try + { + _endPoint = new IPEndPoint(address, port); + _socket = new Socket(_endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + _socket.BeginConnect(_endPoint, new AsyncCallback(ConnectCallback), null); + } + catch (Exception ex) + { + Close(ex); + } + } + } + + public void BeginSend(byte[] data) + { + try + { + _socket.BeginSend(data, 0, data.Length, SocketFlags.None, SendCallback, data.Length); + } + catch (Exception ex) + { + Close(ex); + } + } + + public void BeginReceive() + { + try + { + _socket.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, SocketFlags.None, ReceiveCallback, null); + } + catch (Exception ex) + { + Close(ex); + } + } + + public void Close(Exception error = null) + { + if (!_isClosed) + { + _isClosed = true; + try + { + if (_socket != null) + { + _socket.Close(); + } + } + catch (Exception ex) + { + ex = new AggregateException(error, ex); + } + IsConnected = false; + Disconnected?.Invoke(error); + } + } + + private void ConnectCallback(IAsyncResult result) + { + try + { + _socket.EndConnect(result); + } + catch (Exception ex) + { + Close(ex); + return; + } + Connected?.Invoke(); + BeginReceive(); + } + + private void SendCallback(IAsyncResult result) + { + try + { + int bytesSent = _socket.EndSend(result); + if (bytesSent != (int)result.AsyncState) + { + Close(); + } + } + catch (Exception ex) + { + Close(ex); + } + } + + private void ReceiveCallback(IAsyncResult result) + { + int bytesRead; + try + { + bytesRead = _socket.EndReceive(result); + } + catch (Exception ex) + { + Close(ex); + return; + } + if (bytesRead == 0) + { + Close(); + return; + } + byte[] data = new byte[bytesRead]; + Array.Copy(_receiveBuffer, data, bytesRead); + DataReceived?.Invoke(data); + BeginReceive(); + } + } +} diff --git a/YGOSharp.Network/Utils/BinaryExtensions.cs b/YGOSharp.Network/Utils/BinaryExtensions.cs new file mode 100644 index 000000000..85af6c551 --- /dev/null +++ b/YGOSharp.Network/Utils/BinaryExtensions.cs @@ -0,0 +1,32 @@ +using System; +using System.IO; +using System.Text; + +namespace YGOSharp.Network.Utils +{ + public static class BinaryExtensions + { + public static void WriteUnicode(this BinaryWriter writer, string text, int len) + { + byte[] unicode = Encoding.Unicode.GetBytes(text); + byte[] result = new byte[len * 2]; + int max = len * 2 - 2; + Array.Copy(unicode, result, unicode.Length > max ? max : unicode.Length); + writer.Write(result); + } + + public static string ReadUnicode(this BinaryReader reader, int len) + { + byte[] unicode = reader.ReadBytes(len * 2); + string text = Encoding.Unicode.GetString(unicode); + int index = text.IndexOf('\0'); + if (index > 0) text = text.Substring(0, index); + return text; + } + + public static byte[] ReadToEnd(this BinaryReader reader) + { + return reader.ReadBytes((int)(reader.BaseStream.Length - reader.BaseStream.Position)); + } + } +} diff --git a/YGOSharp.Network/YGOClient.cs b/YGOSharp.Network/YGOClient.cs new file mode 100644 index 000000000..92681e49b --- /dev/null +++ b/YGOSharp.Network/YGOClient.cs @@ -0,0 +1,42 @@ +using System.IO; +using YGOSharp.Network.Enums; + +namespace YGOSharp.Network +{ + public class YGOClient : BinaryClient + { + public YGOClient() + : base(new NetworkClient()) + { + } + + public YGOClient(NetworkClient client) + : base(client) + { + } + + public void Send(BinaryWriter writer) + { + Send(((MemoryStream)writer.BaseStream).ToArray()); + } + + public void Send(CtosMessage message) + { + using (BinaryWriter writer = new BinaryWriter(new MemoryStream())) + { + writer.Write((byte)message); + Send(writer); + } + } + + public void Send(CtosMessage message, int value) + { + using (BinaryWriter writer = new BinaryWriter(new MemoryStream())) + { + writer.Write((byte)message); + writer.Write(value); + Send(writer); + } + } + } +} diff --git a/YGOSharp.OCGWrapper.Enums.dll b/YGOSharp.OCGWrapper.Enums.dll deleted file mode 100644 index 199ff7e61c44a20c15a1b7736d817a1bdc56afec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9728 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 X!~;9MzfX8^-M^9X{(6`fdEkEor=@_3 diff --git a/YGOSharp.OCGWrapper/Card.cs b/YGOSharp.OCGWrapper/Card.cs new file mode 100644 index 000000000..ab716e864 --- /dev/null +++ b/YGOSharp.OCGWrapper/Card.cs @@ -0,0 +1,112 @@ +using YGOSharp.OCGWrapper.Enums; +using System.Data; + +namespace YGOSharp.OCGWrapper +{ + public class Card + { + public struct CardData + { + public int Code; + public int Alias; + public long Setcode; + public int Type; + public int Level; + public int Attribute; + public int Race; + public int Attack; + public int Defense; + public int LScale; + public int RScale; + public int LinkMarker; + } + + public int Id { get; private set; } + public int Ot { get; private set; } + public int Alias { get; private set; } + public long Setcode { get; private set; } + public int Type { get; private set; } + + public int Level { get; private set; } + public int LScale { get; private set; } + public int RScale { get; private set; } + public int LinkMarker { get; private set; } + + public int Attribute { get; private set; } + public int Race { get; private set; } + public int Attack { get; private set; } + public int Defense { get; private set; } + + internal CardData Data { get; private set; } + + public static Card Get(int id) + { + return CardsManager.GetCard(id); + } + + public bool HasType(CardType type) + { + return ((Type & (int)type) != 0); + } + + public bool HasSetcode(int setcode) + { + long setcodes = Setcode; + int settype = setcode & 0xfff; + int setsubtype = setcode & 0xf000; + while (setcodes > 0) + { + long check_setcode = setcodes & 0xffff; + setcodes >>= 16; + if ((check_setcode & 0xfff) == settype && (check_setcode & 0xf000 & setsubtype) == setsubtype) return true; + } + return false; + } + + public bool IsExtraCard() + { + return (HasType(CardType.Fusion) || HasType(CardType.Synchro) || HasType(CardType.Xyz) || HasType(CardType.Link)); + } + + internal Card(IDataRecord reader) + { + Id = reader.GetInt32(0); + Ot = reader.GetInt32(1); + Alias = reader.GetInt32(2); + Setcode = reader.GetInt64(3); + Type = reader.GetInt32(4); + + int levelInfo = reader.GetInt32(5); + Level = levelInfo & 0xff; + LScale = (levelInfo >> 24) & 0xff; + RScale = (levelInfo >> 16) & 0xff; + + Race = reader.GetInt32(6); + Attribute = reader.GetInt32(7); + Attack = reader.GetInt32(8); + Defense = reader.GetInt32(9); + + if (HasType(CardType.Link)) + { + LinkMarker = Defense; + Defense = 0; + } + + Data = new CardData() + { + Code = Id, + Alias = Alias, + Setcode = Setcode, + Type = Type, + Level = Level, + Attribute = Attribute, + Race = Race, + Attack = Attack, + Defense = Defense, + LScale = LScale, + RScale = RScale, + LinkMarker = LinkMarker + }; + } + } +} \ No newline at end of file diff --git a/YGOSharp.OCGWrapper/CardsManager.cs b/YGOSharp.OCGWrapper/CardsManager.cs new file mode 100644 index 000000000..d78e1bc70 --- /dev/null +++ b/YGOSharp.OCGWrapper/CardsManager.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.Data; +using Mono.Data.Sqlite; + +namespace YGOSharp.OCGWrapper +{ + internal static class CardsManager + { + private static IDictionary _cards; + + internal static void Init(string databaseFullPath) + { + _cards = new Dictionary(); + + using (SqliteConnection connection = new SqliteConnection("Data Source=" + databaseFullPath)) + { + connection.Open(); + + using (IDbCommand command = new SqliteCommand("SELECT id, ot, alias, setcode, type, level, race, attribute, atk, def FROM datas", connection)) + { + using (IDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + LoadCard(reader); + } + } + } + } + } + + internal static Card GetCard(int id) + { + if (_cards.ContainsKey(id)) + return _cards[id]; + return null; + } + + private static void LoadCard(IDataRecord reader) + { + Card card = new Card(reader); + _cards.Add(card.Id, card); + } + } +} \ No newline at end of file diff --git a/YGOSharp.OCGWrapper/NamedCard.cs b/YGOSharp.OCGWrapper/NamedCard.cs new file mode 100644 index 000000000..e3cc75181 --- /dev/null +++ b/YGOSharp.OCGWrapper/NamedCard.cs @@ -0,0 +1,21 @@ +using System.Data; + +namespace YGOSharp.OCGWrapper +{ + public class NamedCard : Card + { + public string Name { get; private set; } + public string Description { get; private set; } + + internal NamedCard(IDataRecord reader) : base(reader) + { + Name = reader.GetString(10); + Description = reader.GetString(11); + } + + public static new NamedCard Get(int id) + { + return NamedCardsManager.GetCard(id); + } + } +} diff --git a/YGOSharp.OCGWrapper/NamedCardsManager.cs b/YGOSharp.OCGWrapper/NamedCardsManager.cs new file mode 100644 index 000000000..a704d7cd9 --- /dev/null +++ b/YGOSharp.OCGWrapper/NamedCardsManager.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; +using System.Data; +using Mono.Data.Sqlite; +using System; +using System.IO; +using System.Linq; + +namespace YGOSharp.OCGWrapper +{ + public static class NamedCardsManager + { + private static IDictionary _cards; + + public static void Init(string databaseFullPath) + { + try + { + if (!File.Exists(databaseFullPath)) + { + throw new Exception("Could not find the cards database."); + } + + _cards = new Dictionary(); + + using (SqliteConnection connection = new SqliteConnection("Data Source=" + databaseFullPath)) + { + connection.Open(); + + using (IDbCommand command = new SqliteCommand( + "SELECT datas.id, ot, alias, setcode, type, level, race, attribute, atk, def, texts.name, texts.desc" + + " FROM datas INNER JOIN texts ON datas.id = texts.id", + connection)) + { + using (IDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + LoadCard(reader); + } + } + } + } + } + catch (Exception ex) + { + throw new Exception("Could not initialize the cards database. Check the inner exception for more details.", ex); + } + } + + internal static NamedCard GetCard(int id) + { + if (_cards.ContainsKey(id)) + return _cards[id]; + return null; + } + + public static IList GetAllCards() + { + return _cards.Values.ToList(); + } + + private static void LoadCard(IDataRecord reader) + { + NamedCard card = new NamedCard(reader); + _cards.Add(card.Id, card); + } + } +} \ No newline at end of file From ba5985d6ecbd61705405f4cbd496d876eb6aab74 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Wed, 22 May 2024 17:15:54 +0800 Subject: [PATCH 036/110] add TeammateSurrender --- Game/GameBehavior.cs | 7 +++++++ YGOSharp.Network/Enums/StocMessage.cs | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index b3d7f2073..26707e700 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -85,6 +85,7 @@ private void RegisterPackets() _packets.Add(StocMessage.Chat, OnChat); _packets.Add(StocMessage.ChangeSide, OnChangeSide); _packets.Add(StocMessage.ErrorMsg, OnErrorMsg); + _packets.Add(StocMessage.TeammateSurrender, OnTeammateSurrender); _messages.Add(GameMessage.Retry, OnRetry); _messages.Add(GameMessage.Start, OnStart); @@ -325,6 +326,12 @@ private void OnErrorMsg(BinaryReader packet) //Connection.Close(); } + private void OnTeammateSurrender(BinaryReader packet) + { + Thread.Sleep(500); + Game.Surrender(); + } + private void OnRetry(BinaryReader packet) { _ai.OnRetry(); diff --git a/YGOSharp.Network/Enums/StocMessage.cs b/YGOSharp.Network/Enums/StocMessage.cs index 308f83d9e..228502374 100644 --- a/YGOSharp.Network/Enums/StocMessage.cs +++ b/YGOSharp.Network/Enums/StocMessage.cs @@ -21,6 +21,7 @@ public enum StocMessage Chat = 0x19, HsPlayerEnter = 0x20, HsPlayerChange = 0x21, - HsWatchChange = 0x22 + HsWatchChange = 0x22, + TeammateSurrender = 0x23 } } From 4810822121425eb3a272d53ea23ffb75ec932015 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Mon, 3 Jun 2024 11:00:23 +0800 Subject: [PATCH 037/110] Fix attack target for Voiceless Voice (#195) --- Game/AI/DefaultExecutor.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 057470a33..0a49ca3ba 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -190,8 +190,8 @@ protected class _CardId public const int PatricianOfDarkness = 19153634; public const int DictatorOfD = 66961194; - public const int NovoxTheSilenforcerDisciple = 25801745; - public const int SilenforcingBarrier = 98477480; + public const int LoThePrayersOfTheVoicelessVoice = 25801745; + public const int BarrierOfTheVoicelessVoice = 98477480; public const int DiabellzeOfTheOriginalSin = 53765052; public const int PotOfExtravagance = 49238328; @@ -448,7 +448,8 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender if (defender.IsCode(_CardId.RescueACEHydrant) && !defender.IsDisabled() && Enemy.GetMonsters().Any(monster => monster.HasSetcode(_Setcode.RescueACE) && !monster.IsCode(_CardId.RescueACEHydrant))) return false; - if (Enemy.HasInSpellZone(_CardId.SilenforcingBarrier, true) && Enemy.HasInMonstersZone(_CardId.NovoxTheSilenforcerDisciple, faceUp: true) && !defender.HasType(CardType.Ritual)) + if (Enemy.HasInSpellZone(_CardId.BarrierOfTheVoicelessVoice, true) && Enemy.HasInMonstersZone(_CardId.LoThePrayersOfTheVoicelessVoice, faceUp: true) + && Enemy.GetMonsters().Any(card => card.HasType(CardType.Ritual) && card.IsFaceup()) && !defender.HasType(CardType.Ritual)) return false; return true; From 73905ecbbde912697b080e0b926662a9bed117eb Mon Sep 17 00:00:00 2001 From: Mercury233 Date: Mon, 3 Jun 2024 15:44:23 +0800 Subject: [PATCH 038/110] skip HINTMSG_FIELD_FIRST (#194) --- Game/GameBehavior.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 26707e700..0fa8dbba8 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1029,6 +1029,13 @@ private void InternalOnSelectCard(BinaryReader packet, Func, i cards.Add(card); } + if (_select_hint == 575 && cancelable) // HINTMSG_FIELD_FIRST + { + _select_hint = 0; + Connection.Send(CtosMessage.Response, -1); + return; + } + IList selected = func(cards, min, max, _select_hint, cancelable); _select_hint = 0; From eb5d8f489caf699de078326b8098b6dd2c44ba79 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Mon, 3 Jun 2024 15:52:46 +0800 Subject: [PATCH 039/110] version --- WindBotInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WindBotInfo.cs b/WindBotInfo.cs index 589670c01..1599b9380 100644 --- a/WindBotInfo.cs +++ b/WindBotInfo.cs @@ -24,7 +24,7 @@ public WindBotInfo() Host = "127.0.0.1"; Port = 7911; HostInfo = ""; - Version = 0x1360; + Version = 0x1361; Hand = 0; Debug = false; Chat = true; From 4a0dc0986c3fc90094f62a35588cf006d9cf79a8 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Tue, 9 Jul 2024 15:37:25 +0800 Subject: [PATCH 040/110] update SuperheavySamuraiExecutor merge #197 --- Game/AI/Decks/SuperheavySamuraiExecutor.cs | 66 ++++++++++++++-------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/Game/AI/Decks/SuperheavySamuraiExecutor.cs b/Game/AI/Decks/SuperheavySamuraiExecutor.cs index 261dc9b25..4a1adaecd 100644 --- a/Game/AI/Decks/SuperheavySamuraiExecutor.cs +++ b/Game/AI/Decks/SuperheavySamuraiExecutor.cs @@ -80,7 +80,8 @@ public class CardId public SuperheavySamuraiExecutor(GameAI ai, Duel duel) : base(ai, duel) { - AddExecutor(ExecutorType.Activate, CardId.PSYFramelordOmega); + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.Activate, CardId.PSYFramelordOmega,PSYFunction); AddExecutor(ExecutorType.Activate, CardId.IP,IPFunction); AddExecutor(ExecutorType.Activate, CardId.Sarutobi,SarutobiFunction); AddExecutor(ExecutorType.Activate, CardId.Unicorn,UnicornFunction); @@ -101,9 +102,8 @@ public SuperheavySamuraiExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.SpSummon, CardId.Scales); AddExecutor(ExecutorType.Activate, CardId.Scales,ScalesFunction); - //Synchron - AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction2); - AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction2); + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.PSYFramelordOmega,PSYFramelordOmegaSynchronFunction); //Pendulum AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiFunction); @@ -183,7 +183,6 @@ public SuperheavySamuraiExecutor(GameAI ai, Duel duel) //Synchron AddExecutor(ExecutorType.SpSummon, CardId.Masurawo,MasurawoSynchronFunction); AddExecutor(ExecutorType.SpSummon, CardId.Sarutobi,DeSynchronFunction); - AddExecutor(ExecutorType.SpSummon, CardId.PSYFramelordOmega); //equip Soulhorns AddExecutor(ExecutorType.Activate, CardId.Soulhorns,SoulhornsEquipFunction); @@ -213,12 +212,29 @@ public override void OnNewTurn() activate_Genius = false; activate_Sarutobi = false; to_deck = false; - base.OnNewTurn(); } public override bool OnSelectHand() { return true; } + private bool MonsterRepos() + { + if (Card.IsFacedown()) + return true; + if (Card.IsFaceup() && Card.IsAttack() && (Card.Id == CardId.Masurawo || Card.Id == CardId.Sarutobi)) + return true; + return false; + } + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (cardId == CardId.Masurawo || cardId == CardId.Sarutobi) + return CardPosition.FaceUpDefence; + } + return 0; + } public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (player == 0 && location == CardLocation.MonsterZone) @@ -597,14 +613,6 @@ private bool FleurSynchronFunction() AI.SelectMaterials(materials_lists[0]); return true; } - private bool FleurSynchronFunction2() - { - var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,10,1,1,false,false,null, - card => { return !FinalCards(card.Id); }); - if (materials_lists.Count <= 0) return false; - AI.SelectMaterials(materials_lists[0]); - return true; - } private bool DeSynchronFunction() { AI.SelectPosition(CardPosition.FaceUpDefence); @@ -630,17 +638,26 @@ private bool ASStardustDragonSynchronFunction() { return (Bot.HasInExtra(CardId.Fleur) || Bot.HasInExtra(CardId.Masurawo)); } - return false; - } - private bool ASStardustDragonSynchronFunction2() - { - if (!activate_Scales || !activate_PSY) return false; - if (Bot.HasInGraveyard(CardId.Motorbike) || Bot.HasInGraveyard(CardId.PsyFramegearGamma)) + else if (Bot.HasInMonstersZone(CardId.Motorbike)) { - return (Bot.HasInExtra(CardId.Fleur) || Bot.HasInExtra(CardId.Masurawo)); + AI.SelectMaterials(CardId.Motorbike); + return true; + } + else if (Bot.HasInMonstersZone(CardId.PsyFramegearGamma)) + { + AI.SelectMaterials(CardId.PsyFramegearGamma); + return true; } return false; } + private bool PSYFramelordOmegaSynchronFunction() + { + if (Bot.HasInMonstersZone(CardId.Motorbike)) + AI.SelectMaterials(CardId.Motorbike); + else if (Bot.HasInMonstersZone(CardId.PsyFramegearGamma)) + AI.SelectMaterials(CardId.PsyFramegearGamma); + return activate_PSY || activate_Scales; + } private bool SavageDragonFunction() { if (Duel.LastChainPlayer == 1) @@ -1156,6 +1173,11 @@ private bool IPLinkFunction() AI.SelectMaterials(materials); return true; } + private bool PSYFunction() + { + activate_PSY = true; + return true; + } private bool IPFunction() { if (Duel.LastChainPlayer == 0) return false; @@ -1193,4 +1215,4 @@ private bool SarutobiFunction() return true; } } -} \ No newline at end of file +} From 65954e36b573f49843e24daab4c202633a75314b Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Tue, 9 Jul 2024 15:38:13 +0800 Subject: [PATCH 041/110] Enum update (#196) --- Game/AI/DefaultExecutor.cs | 4 +++- Game/AI/Enums/Floodgate.cs | 13 ++++++++++++- Game/AI/Enums/FusionSpell.cs | 4 +++- Game/AI/Enums/InvincibleMonster.cs | 11 ++++++++++- Game/AI/Enums/PreventActivationEffectInBattle.cs | 6 +----- .../ShouldBeDisabledBeforeItUseEffectMonster.cs | 6 +++++- Game/AI/Enums/ShouldNotBeMonsterTarget.cs | 3 ++- 7 files changed, 36 insertions(+), 11 deletions(-) diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 0a49ca3ba..0828614f8 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -181,6 +181,7 @@ protected class _CardId public const int DuelDragonToken = 60025884; public const int SeleneQueenOfTheMasterMagicians = 45819647; public const int TheWingedDragonofRaSphereMode = 10000080; + public const int SelettriceVaalmonica = 23093373; public const int RockOfTheVanquisher = 28168628; public const int SpiralDischarge = 29477860; @@ -302,7 +303,8 @@ protected DefaultExecutor(GameAI ai, Duel duel) {_CardId.DuelLinkDragonTheDuelDragon, (defender, list) => list.Any(monster => monster.IsCode(_CardId.DuelDragonToken))}, {_CardId.SeleneQueenOfTheMasterMagicians, (defender, list) => list.Any(monster => monster.HasSetcode(_Setcode.Endymion))}, - {_CardId.TheWingedDragonofRaSphereMode, (defender, list) => true} + {_CardId.TheWingedDragonofRaSphereMode, (defender, list) => true}, + {_CardId.SelettriceVaalmonica, (defender, list) => list.Any(monster => !monster.IsCode(_CardId.SelettriceVaalmonica))} }; /// diff --git a/Game/AI/Enums/Floodgate.cs b/Game/AI/Enums/Floodgate.cs index f3f192b8c..39648b7ea 100644 --- a/Game/AI/Enums/Floodgate.cs +++ b/Game/AI/Enums/Floodgate.cs @@ -212,6 +212,17 @@ public enum Floodgate StellarNemesisTPHON_DoomsdayStar = 93039339, SPLittleKnight = 29301450, AngelRing = 40678060, - SkullGuardianTheSilenforcingProtector = 10774240 + SkullGuardianProtectorOfTheVoicelessVoice = 10774240, + FloweringEtoileTheMelodiousMagnificat = 83793721, + EnlightenmentDragon = 46186135, + GoldPrideEradicator = 45464587, + VarudrasTheFinalBringerOfTheEndTimes = 70636044, + RagnaraikaStagSovereign = 42307760, + DrytronMeteonisAlphaDraconids = 56863746, + TheUnstoppableExodiaIncarnate = 83257450, + LightAndDarknessDragonLord = 19652159, + FiendsmithDiesIrae = 82135803, + MementomictlanTecuhtlicaCombinedConqueror = 14529511, + MadolcheQueenTiaraalaFraise = 49689480 } } diff --git a/Game/AI/Enums/FusionSpell.cs b/Game/AI/Enums/FusionSpell.cs index 199558ab6..472baf02f 100644 --- a/Game/AI/Enums/FusionSpell.cs +++ b/Game/AI/Enums/FusionSpell.cs @@ -86,6 +86,8 @@ public enum FusionSpell FusionReproduction = 43331750, ChimeraFusion = 63136489, HarmonicSynchroFusion = 7473735, - SouloftheSupremeCelestialKing = 76840111 + SouloftheSupremeCelestialKing = 76840111, + MelodiousConcerto = 31458630, + MementotlanFusion = 66518509 } } diff --git a/Game/AI/Enums/InvincibleMonster.cs b/Game/AI/Enums/InvincibleMonster.cs index 85e6ae17b..7fb5fe70a 100644 --- a/Game/AI/Enums/InvincibleMonster.cs +++ b/Game/AI/Enums/InvincibleMonster.cs @@ -114,6 +114,15 @@ public enum InvincibleEnemyMonster DarkGuardian = 26746975, EnvoyOfTheWaxState = 87462901, Fluffyfluff = 85401123, - YubelDasEwigLiebeWachter = 47172959 + YubelDasEwigLiebeWachter = 47172959, + TenpaiDragonFadra = 65326118, + GolgoilTheSteelSeismicSmasher = 59369430, + TalonsOfShurilane = 74150658, + NightmareApprentice = 58143852, + MillenniumoonMaiden = 37552929, + MillenniumFiendReflection = 63947968, + HereticalPhoboscobos = 76078185, + TopHatHareTheSilhouetteMagician = 1528054, + Silhouhatte = 24440742 } } diff --git a/Game/AI/Enums/PreventActivationEffectInBattle.cs b/Game/AI/Enums/PreventActivationEffectInBattle.cs index a916f8bfa..6809bbcf7 100644 --- a/Game/AI/Enums/PreventActivationEffectInBattle.cs +++ b/Game/AI/Enums/PreventActivationEffectInBattle.cs @@ -11,10 +11,6 @@ public enum PreventActivationEffectInBattle SamuraiDestroyer = 40509732, ArmadesKeeperOfBoundaries = 88033975, NumberS39UtopiaTheLightning = 56832966, - DualAvatarEmpoweredKonGyo = 33026283, - GGolemRockHammer = 98875863, - WishDragon = 64583600, - ChaosWitch = 30327674, - FissioningMotherSpider = 34034150 + DualAvatarEmpoweredKonGyo = 33026283 } } diff --git a/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs b/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs index 0eaa62950..e9c2b36c7 100644 --- a/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs +++ b/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs @@ -63,6 +63,10 @@ public enum ShouldBeDisabledBeforeItUseEffectMonster ThreeEyedGhost = 31464658, UrsarcticPolarStar = 62714453, BattlinBoxerPromoter = 83315222, - TGRocketSalamander = 77392987 + TGRocketSalamander = 77392987, + GGolemRockHammer = 98875863, + WishDragon = 64583600, + ChaosWitch = 30327674, + FissioningMotherSpider = 34034150 } } diff --git a/Game/AI/Enums/ShouldNotBeMonsterTarget.cs b/Game/AI/Enums/ShouldNotBeMonsterTarget.cs index 8ed6cb9ec..aac5a937b 100644 --- a/Game/AI/Enums/ShouldNotBeMonsterTarget.cs +++ b/Game/AI/Enums/ShouldNotBeMonsterTarget.cs @@ -16,6 +16,7 @@ public enum ShouldNotBeMonsterTarget BorreloadDragon = 31833038, BorrelendDragon = 98630720, DrytronMeteonisDraconids = 69815951, - MyutantBeast = 34695290 + MyutantBeast = 34695290, + VeidosTheDragonOfEndlessDarkness = 8540986 } } From 11169f23463505e70d4da17b4e6e120548d2e103 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Tue, 9 Jul 2024 16:19:51 +0800 Subject: [PATCH 042/110] Fix bot's behavior in SelectUnSelect (#198) --- Game/ClientCard.cs | 5 ++--- Game/GameBehavior.cs | 10 +++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Game/ClientCard.cs b/Game/ClientCard.cs index d9beebda7..e3f9f1310 100644 --- a/Game/ClientCard.cs +++ b/Game/ClientCard.cs @@ -82,8 +82,7 @@ public void SetId(int id) if (Data != null) { Name = Data.Name; - if (Data.Alias != 0) - Alias = Data.Alias; + Alias = Data.Alias; } else { Name = null; Alias = 0; @@ -387,4 +386,4 @@ public bool Equals(ClientCard card) return ReferenceEquals(this, card); } } -} \ No newline at end of file +} diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 0fa8dbba8..3c7b2e605 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1090,7 +1090,7 @@ private void InternalOnSelectUnselectCard(BinaryReader packet, Func Date: Fri, 26 Jul 2024 10:11:14 +0800 Subject: [PATCH 043/110] Fix (#199) --- Game/AI/DefaultExecutor.cs | 2 +- Game/GameAI.cs | 2 +- Game/GameBehavior.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 0828614f8..e6f221f86 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -1579,7 +1579,7 @@ protected bool DefaultCheckWhetherCardIsNegated(ClientCard card) if (originId == 0) originId = card.Data.Id; return crossoutDesignatorIdList.Contains(originId) || (calledbytheGraveIdCountMap.ContainsKey(originId) && calledbytheGraveIdCountMap[originId] > 0) - || card.IsDisabled(); + || (card.IsDisabled() && ((int)card.Location & (int)CardLocation.Onfield) > 0); } protected bool DefaultCheckWhetherCardIdIsNegated(int cardId) diff --git a/Game/GameAI.cs b/Game/GameAI.cs index 4eda9711e..44e3c4e6a 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -1162,6 +1162,7 @@ public BattlePhaseAction ToMainPhase2() private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type, int desc = -1, int timing = -1) { + Executor.SetCard(type, card, desc, timing); if (card.Id != 0 && type == ExecutorType.Activate) { if (_activatedCards.ContainsKey(card.Id) && _activatedCards[card.Id] >= 9) @@ -1169,7 +1170,6 @@ private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type if (!Executor.OnPreActivate(card)) return false; } - Executor.SetCard(type, card, desc, timing); bool result = card != null && exec.Type == type && (exec.CardId == -1 || exec.CardId == card.Id) && (exec.Func == null || exec.Func()); diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 3c7b2e605..c0bdc8929 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1024,7 +1024,7 @@ private void InternalOnSelectCard(BinaryReader packet, Func, i card.Controller = player; } if (card == null) continue; - if (card.Id == 0) + if (card.Id == 0 || card.Location == CardLocation.Deck) card.SetId(id); cards.Add(card); } From 5eb4766a55b8766b98779b35529008473aea847a Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Fri, 26 Jul 2024 20:03:58 +0800 Subject: [PATCH 044/110] AI_Albaz (#200) --- BotWrapper/bot.conf | 5 + Decks/AI_Albaz.ydk | 64 + Dialogs/ecclesia.zh-CN.json | 3 +- Game/AI/Decks/AlbazExecutor.cs | 5861 +++++++++++++++++++++++++ Game/AI/DefaultExecutor.cs | 11 + WindBot.csproj | 1 + YGOSharp.OCGWrapper.Enums/CardRace.cs | 2 +- 7 files changed, 5945 insertions(+), 2 deletions(-) create mode 100644 Decks/AI_Albaz.ydk create mode 100644 Game/AI/Decks/AlbazExecutor.cs diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 638935c6b..fdb86fecf 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -224,6 +224,11 @@ Name=艾克莉西娅 Deck=Dogmatika Dialog=ecclesia.zh-CN 教导卡组。 AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +!艾克莉西娅-阿不思 +Name=艾克莉西娅 Deck=Albaz Dialog=ecclesia.zh-CN +以阿不思的落胤为中心的卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + !神数不神-刹帝利 Name=神数不神 Deck=Kashtira Dialog=Zefra.zh-CN 俱舍怒威族卡组。 diff --git a/Decks/AI_Albaz.ydk b/Decks/AI_Albaz.ydk new file mode 100644 index 000000000..19a1b0bff --- /dev/null +++ b/Decks/AI_Albaz.ydk @@ -0,0 +1,64 @@ +#created by ... +#main +32731036 +25451383 +60242223 +62962630 +62962630 +62962630 +68468459 +68468459 +45484331 +45883110 +95515789 +19096726 +14558127 +14558127 +14558127 +23434538 +23434538 +23434538 +36577931 +1984618 +1984618 +6498706 +6498706 +34995106 +44362883 +75500286 +81439173 +24224830 +24224830 +29948294 +36637374 +65681983 +82738008 +18973184 +10045474 +10045474 +10045474 +19271881 +32756828 +17751597 +#extra +11321089 +38811586 +44146295 +44146295 +92892239 +70534340 +3410461 +24915933 +72272462 +1906812 +41373230 +51409648 +87746184 +87746184 +53971455 +!side +56787189 +55273561 +68468460 +72554664 +95515790 \ No newline at end of file diff --git a/Dialogs/ecclesia.zh-CN.json b/Dialogs/ecclesia.zh-CN.json index c2be9788e..44630fd09 100644 --- a/Dialogs/ecclesia.zh-CN.json +++ b/Dialogs/ecclesia.zh-CN.json @@ -1,7 +1,8 @@ { "welcome": [ "这里就是大灵峰吗?", - "这里是教导龙国。" + "这里是教导龙国。", + "这里是开放的大地。" ], "deckerror": [ "{0}被冰水咒缚了!" diff --git a/Game/AI/Decks/AlbazExecutor.cs b/Game/AI/Decks/AlbazExecutor.cs new file mode 100644 index 000000000..5ad4f57f0 --- /dev/null +++ b/Game/AI/Decks/AlbazExecutor.cs @@ -0,0 +1,5861 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Albaz", "AI_Albaz")] + public class AlbazExecutor : DefaultExecutor + { + public class CardId + { + public const int TheBystialLubellion = 32731036; + public const int AlbionTheShroudedDragon = 25451383; + public const int BystialSaronir = 60242223; + public const int AluberTheJesterOfDespia = 62962630; + public const int FallenOfAlbaz = 68468459; + public const int SpringansKitt = 45484331; + public const int GuidingQuemTheVirtuous = 45883110; + public const int BlazingCartesiaTheVirtuous = 95515789; + public const int TriBrigadeMercourier = 19096726; + // _CardId.AshBlossom = 14558127; + // _CardId.MaxxC = 23434538; + public const int DespianTragedy = 36577931; + + public const int NadirServant = 1984618; + public const int FusionDeployment = 6498706; + public const int BrandedInWhite = 34995106; + public const int BrandedFusion = 44362883; + public const int GoldSarcophagus = 75500286; + public const int FoolishBurial = 81439173; + // _CardId.CalledByTheGrave = 24224830; + public const int BrandedInHighSpirits = 29948294; + public const int BrandedOpening = 36637374; + // _CardId.CrossoutDesignator = 65681983; + public const int BrandedInRed = 82738008; + public const int BrandedLost = 18973184; + + // _CardId.InfiniteImpermanence = 10045474; + public const int BrightestBlazingBrandedKing = 19271881; + public const int BrandedBeast = 32756828; + public const int BrandedRetribution = 17751597; + + public const int GuardianChimera = 11321089; + public const int AlbionTheSanctifireDragon = 38811586; + public const int MirrorjadeTheIcebladeDragon = 44146295; + public const int BorreloadFuriousDragon = 92892239; + public const int LubellionTheSearingDragon = 70534340; + public const int AlbaLenatusTheAbyssDragon = 3410461; + public const int GranguignolTheDuskDragon = 24915933; + public const int DespianQuaeritis = 72272462; + public const int SprindTheIrondashDragon = 1906812; + public const int TitanikladTheAshDragon = 41373230; + public const int RindbrummTheStrikingDragon = 51409648; + public const int AlbionTheBrandedDragon = 87746184; + public const int DespianLuluwalilith = 53971455; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int AccesscodeTalker = 86066372; + public const int GhostMournerMoonlitChill = 52038441; + public const int NibiruThePrimalBeing = 27204311; + } + + public AlbazExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + + // + AddExecutor(ExecutorType.Summon, AdvanceSummon); + AddExecutor(ExecutorType.SpSummon, CardId.AlbaLenatusTheAbyssDragon, AlbaLenatusTheAbyssDragonSpSummon); + AddExecutor(ExecutorType.MonsterSet, CardId.FallenOfAlbaz, FallenOfAlbazSet); + AddExecutor(ExecutorType.Activate, CardId.BlazingCartesiaTheVirtuous, BlazingCartesiaTheVirtuousActivateInGrave); + + // quick effect + AddExecutor(ExecutorType.Activate, CardId.BrandedRetribution, BrandedRetributionActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedBeast, BrandedBeastActivate); + AddExecutor(ExecutorType.Activate, CardId.BrightestBlazingBrandedKing, BrightestBlazingBrandedKingActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedOpening, BrandedOpeningActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedInHighSpirits, BrandedInHighSpiritsActivate); + AddExecutor(ExecutorType.Activate, CardId.RindbrummTheStrikingDragon, RindbrummTheStrikingDragonActivate); + + // remove + AddExecutor(ExecutorType.Activate, CardId.GuardianChimera, GuardianChimeraActivate); + AddExecutor(ExecutorType.Activate, CardId.BorreloadFuriousDragon, BorreloadFuriousDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.TriBrigadeMercourier, TriBrigadeMercourierActivate); + AddExecutor(ExecutorType.Activate, CardId.DespianQuaeritis, DespianQuaeritisActivate); + AddExecutor(ExecutorType.Activate, CardId.MirrorjadeTheIcebladeDragon, MirrorjadeTheIcebladeDragonActivate); + + // search + AddExecutor(ExecutorType.Activate, CardId.TheBystialLubellion, TheBystialLubellionActivate); + AddExecutor(ExecutorType.SpSummon, CardId.TheBystialLubellion, TheBystialLubellionSpSummon); + AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialActivate); + AddExecutor(ExecutorType.Activate, CardId.GoldSarcophagus, GoldSarcophagusActivate); + AddExecutor(ExecutorType.Activate, CardId.AluberTheJesterOfDespia, AluberTheJesterOfDespiaActivate); + + AddExecutor(ExecutorType.Activate, CardId.AlbionTheSanctifireDragon, AlbionTheSanctifireDragonActivate); + + // blazing + AddExecutor(ExecutorType.Activate, CardId.FusionDeployment, FusionDeploymentActivate); + + AddExecutor(ExecutorType.Activate, CardId.AlbionTheShroudedDragon, AlbionTheShroudedDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.BystialSaronir, BystialSaronirActivate); + + // summon for search + AddExecutor(ExecutorType.Summon, CardId.AluberTheJesterOfDespia, AluberTheJesterOfDespiaSummon); + AddExecutor(ExecutorType.Summon, CardId.GuidingQuemTheVirtuous, GuidingQuemTheVirtuousSummonForSearch); + AddExecutor(ExecutorType.Activate, CardId.SpringansKitt, SpringansKittActivate); + AddExecutor(ExecutorType.Summon, CardId.SpringansKitt, SpringansKittSummon); + + // fusion & lost + AddExecutor(ExecutorType.Activate, CardId.BrandedLost, BrandedLostCardActivate); + AddExecutor(ExecutorType.Activate, CardId.GranguignolTheDuskDragon, GranguignolTheDuskDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.AlbaLenatusTheAbyssDragon, AlbaLenatusTheAbyssDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.SprindTheIrondashDragon, SprindTheIrondashDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.TitanikladTheAshDragon, TitanikladTheAshDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.AlbionTheBrandedDragon, AlbionTheBrandedDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.LubellionTheSearingDragon, LubellionTheSearingDragonActivate); + AddExecutor(ExecutorType.Summon, CardId.BlazingCartesiaTheVirtuous, BlazingCartesiaTheVirtuousSummon); + AddExecutor(ExecutorType.Activate, CardId.FallenOfAlbaz, FallenOfAlbazActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedFusion, BrandedFusionActivate); + AddExecutor(ExecutorType.Activate, CardId.BlazingCartesiaTheVirtuous, BlazingCartesiaTheVirtuousActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedInWhite, BrandedInWhiteActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedInRed, BrandedInRedActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedLost, BrandedLostActivate); + + // albaz summon + AddExecutor(ExecutorType.Summon, CardId.FallenOfAlbaz, FallenOfAlbazSummon); + AddExecutor(ExecutorType.Summon, CardId.GuidingQuemTheVirtuous, GuidingQuemTheVirtuousSummon); + + // delay + AddExecutor(ExecutorType.Activate, CardId.DespianTragedy, DespianTragedyActivate); + AddExecutor(ExecutorType.Activate, CardId.TriBrigadeMercourier, TriBrigadeMercourierActivateForSearch); + AddExecutor(ExecutorType.Activate, CardId.NadirServant, NadirServantActivate); + + AddExecutor(ExecutorType.MonsterSet, SetForChimera); + AddExecutor(ExecutorType.MonsterSet, CardId.DespianTragedy, DespianTragedySet); + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + AddExecutor(ExecutorType.Activate, CardId.GuidingQuemTheVirtuous, GuidingQuemTheVirtuousActivate); + AddExecutor(ExecutorType.Activate, CardId.DespianLuluwalilith, DespianLuluwalilithActivate); + + AddExecutor(ExecutorType.Activate, FloogateActivate); + + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeBranded = 0x15d; + const int SetcodeDespain = 0x164; + const int SetcodeBystial = 0x188; + const int SetcodeHorus = 0x19d; + const int hintTimingMainEnd = 0x4; + const int hintBattleStart = 0x8; + List notToNegateIdList = new List{ + 58699500, 20343502, CardId.AlbionTheShroudedDragon, 19403423 + }; + List cannotBeFusionMaterialIdList = new List + { + CardId.AlbaLenatusTheAbyssDragon, CardId.AlbionTheSanctifireDragon, 79229522, 65029288, 30864377, 33964637, 87116928, 13735899, 28226490, 80453041, + _CardId.EaterOfMillions, 2992467, 16366810, 40217358, 47346782, 50893987, 71459017, 84433295, 85101097 + }; + List albazFusionMonster = new List + { + CardId.TitanikladTheAshDragon, CardId.SprindTheIrondashDragon, CardId.AlbionTheBrandedDragon, CardId.LubellionTheSearingDragon, CardId.AlbaLenatusTheAbyssDragon, + CardId.MirrorjadeTheIcebladeDragon, CardId.RindbrummTheStrikingDragon, CardId.AlbionTheSanctifireDragon + }; + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.AluberTheJesterOfDespia, _CardId.AshBlossom, _CardId.MaxxC, _CardId.InfiniteImpermanence }}, + {2, new List { CardId.FallenOfAlbaz, CardId.NadirServant, CardId.FusionDeployment, _CardId.CalledByTheGrave }}, + {1, new List { CardId.TheBystialLubellion, CardId.AlbionTheShroudedDragon, CardId.BystialSaronir, CardId.SpringansKitt, CardId.GuidingQuemTheVirtuous, + CardId.BlazingCartesiaTheVirtuous, CardId.TriBrigadeMercourier, CardId.DespianTragedy, CardId.BrandedInWhite, + CardId.BrandedFusion, CardId.GoldSarcophagus, CardId.FoolishBurial, CardId.BrandedInHighSpirits, CardId.BrandedOpening, + _CardId.CrossoutDesignator, CardId.BrandedInRed, CardId.BrandedLost, CardId.BrightestBlazingBrandedKing, + CardId.BrandedBeast, CardId.BrandedRetribution }} + }; + List dangerousDragonIdList = new List { 27548199, 92892239, 98630720, 9753964, 99585850, 24361622, 27572350, 69120785, 96402918, 74294676, 42752141, 18511599, 35103106, 26268488 }; + List notToDestroySpellTrap = new List { 50005218, 6767771 }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + + bool summoned = false; + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + int dimensionShifterCount = 0; + bool enemyActivateInfiniteImpermanenceFromHand = false; + bool theBystialLubellionSelecting = false; + bool albionTheShroudedDragonSelecting = false; + bool nadirActivated = false; + bool fusionToGYFlag = false; + bool spSummoningAlbaz = false; + int cartesiaSummonGoal = 0; + int sanctifireSelectPositionCount = 0; + int quemSummonFlag = 0; + List cartesiaMaterialList = new List(); + List brandedInRedMaterialList = new List(); + List infiniteImpermanenceList = new List(); + List currentNegateCardList = new List(); + List currentDestroyCardList = new List(); + List sendToGYThisTurn = new List(); + List activatedCardIdList = new List(); + ClientCard fusionTarget = null; + List selectedFusionMaterial = new List(); + List enemyPlaceThisTurn = new List(); + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 + && (card.IsShouldNotBeSpellTrapTarget() && !card.IsDisabled())) return false; + } + return true; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + public int CheckRemainInDeck(params int[] ids) + { + int sum = 0; + foreach (int id in ids) + { + sum += CheckRemainInDeck(id); + } + return sum; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= ((int)type & (int)CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (((int)type & (int)CardType.Spell) != 0) || (((int)type & (int)CardType.Trap) != 0); + bool isCounter = ((int)type & (int)CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck && CheckSpellWillBeNegate(isCounter)) + return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) return true; + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + // how to get here? + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (DefaultCheckWhetherCardIsNegated(lastcard)) return false; + if (Duel.Turn == 1 && lastcard.IsCode(_CardId.MaxxC)) return false; + + return true; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && (Duel.Player == 0 || Bot.GetMonsterCount() > 0)) return true; + return false; + } + + public bool CheckShouldNoMoreSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && !enemyActivateLockBird && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2)) + { + return true; + } + return false; + } + + public bool CheckWhetherCanSummon() + { + return Duel.Player == 0 && Duel.Phase < DuelPhase.End && !summoned; + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { CardId.BanisheroftheRadiance, CardId.BanisheroftheLight, CardId.MacroCosmos, CardId.DimensionalFissure, + CardId.KashtiraAriseHeart, 58481572 }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true, false, true) || cf.HasInSpellZone(cardid, true, true)) + { + return true; + } + } + } + return false; + } + + /// + /// Check whether it should be kept in grave to activate effect. + /// If should, return true. + /// + /// + /// + public bool CheckWhetherShouldKeepInGrave(ClientCard c) + { + if (c.IsCode(CardId.GranguignolTheDuskDragon) && c.Location == CardLocation.Grave) return true; + if (!c.IsCode(new int[] { CardId.AlbaLenatusTheAbyssDragon, CardId.AlbionTheBrandedDragon, CardId.TitanikladTheAshDragon, CardId.DespianLuluwalilith, + CardId.SprindTheIrondashDragon})) + { + return false; + } + return sendToGYThisTurn.Contains(c) && c.Location == CardLocation.Grave; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + ClientCard activatingAlbaz = Enemy.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz) && !c.IsDisabled() + && !currentDestroyCardList.Contains(c) && !currentNegateCardList.Contains(c) && Duel.CurrentChain.Contains(c)); + if (activatingAlbaz != null) return activatingAlbaz; + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentDestroyCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + /// + /// check enemy's dangerous card in grave + /// + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom) || card.HasSetcode(SetcodeHorus))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, 9411399, 28954097, 30680659 + }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType) + ) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !notToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public override BattlePhaseAction OnBattle(IList attackers, IList defenders) + { + if (attackers.Count() > 0 && defenders.Count() > 0) + { + List sortedAttacker = attackers.OrderBy(card => card.Attack).ToList(); + ClientCard abyssDragon = attackers.FirstOrDefault(c => c.IsCode(CardId.AlbaLenatusTheAbyssDragon) && !c.IsDisabled()); + if (abyssDragon != null) + { + sortedAttacker.Remove(abyssDragon); + sortedAttacker.Insert(0, abyssDragon); + } + for (int k = 0; k < sortedAttacker.Count; ++k) + { + ClientCard attacker = sortedAttacker[k]; + attacker.IsLastAttacker = k == sortedAttacker.Count - 1; + BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders); + if (result != null) + return result; + } + } + + return base.OnBattle(attackers, defenders); + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + if (currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.EvenlyMatched)) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List dumpMainMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && CheckRemainInDeck(card.Id) > 0).ToList(); + dumpMainMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpMainMonsterList); + + // spells + List faceUpSpells = Bot.GetSpells().Where(c => c.IsFaceup()).ToList(); + banishList.AddRange(ShuffleList(faceUpSpells)); + List faceDownSpells = Bot.GetSpells().Where(c => c.IsFacedown()).ToList(); + banishList.AddRange(ShuffleList(faceDownSpells)); + + List uniqueMainMonster = botMonsters.Where(card => !banishList.Contains(card) + && !card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && CheckRemainInDeck(card.Id) == 0).ToList(); + uniqueMainMonster.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(uniqueMainMonster); + + List dumpExtraMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && Bot.HasInExtra(card.Id)).ToList(); + dumpExtraMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpExtraMonsterList); + + List uniqueExtraMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && !Bot.HasInExtra(card.Id)).ToList(); + uniqueExtraMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(uniqueExtraMonsterList); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + + // search operation + if (hint == HintMsg.AddToHand) + { + Dictionary> checkDict = new Dictionary>(); + + switch (currentSolvingChain.Id) + { + case CardId.AluberTheJesterOfDespia: + case CardId.AluberTheJesterOfDespia + 1: + case CardId.SpringansKitt: + checkDict = new Dictionary> { + {CardId.BrandedFusion, () => BrandedFusionActivateCheck()}, + {CardId.BrandedLost, () => { + if (Duel.Player == 0 && Duel.Phase >= DuelPhase.End) return false; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) && BrandedFusionActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null) return true; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion()) return true; + if ((Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) || (!summoned && Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous)))) return true; + return false; + } + }, + {CardId.BrandedInHighSpirits, BrandedInHighSpiritsActivateCheck}, + {CardId.BrandedInRed, () => (Duel.Phase == DuelPhase.End && nadirActivated) || BrandedInRedActivateCheck() != null }, + {CardId.BrandedInWhite, BrandedInWhiteActivateCheck }, + {CardId.BrandedRetribution, () => cards.Any(c => c.IsCode(CardId.BrandedRetribution) && c.Location == CardLocation.Removed) }, + {CardId.BrightestBlazingBrandedKing, () => Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedOpening, () => Bot.Hand.Count > 2 } + }; + break; + case CardId.NadirServant: + if (!summoned) + { + ClientCard quem = cards.FirstOrDefault(c => c.IsCode(CardId.GuidingQuemTheVirtuous)); + if (quem != null) + { + return Util.CheckSelectCount(new List { quem }, cards, min, max); + } + } + List locList = new List { CardLocation.Grave, CardLocation.Deck }; + if (Bot.HasInGraveyard(CardId.RindbrummTheStrikingDragon) && cards.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz) && c.Location == CardLocation.Grave).Count() == 1) + { + locList = new List { CardLocation.Deck, CardLocation.Grave }; + } + foreach (int checkId in new[] { CardId.FallenOfAlbaz, CardId.GuidingQuemTheVirtuous }) + { + foreach (CardLocation loc in locList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(checkId) && c.Location == loc); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + case CardId.BrandedLost: + case CardId.TriBrigadeMercourier: + case CardId.BrandedInHighSpirits: + checkDict = new Dictionary>{ + {CardId.TriBrigadeMercourier, () => Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) + || (Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) && Bot.HasInHandOrHasInMonstersZone(CardId.FallenOfAlbaz))}, + {CardId.SpringansKitt, () => CheckWhetherCanSummon() && !activatedCardIdList.Contains(CardId.SpringansKitt + 1) }, + {CardId.FallenOfAlbaz, () => (CheckWhetherCanSummon() && CheckAlbazFusion()) || Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) }, + {CardId.GuidingQuemTheVirtuous, () => CheckWhetherCanSummon() }, + {CardId.BlazingCartesiaTheVirtuous, () => CheckWhetherCanSummon() || (!CheckShouldNoMoreSpSummon() && Bot.HasInMonstersZoneOrInGraveyard(CardId.FallenOfAlbaz))}, + {CardId.AlbionTheShroudedDragon, () => !CheckWhetherWillbeRemoved() && !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon) }, + }; + break; + case CardId.AlbaLenatusTheAbyssDragon: + checkDict = new Dictionary>{ + {CardId.BrandedFusion, () => BrandedFusionActivateCheck(false)}, + {CardId.FusionDeployment, () => true} + }; + break; + default: + break; + } + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + switch (currentSolvingChain.Id) + { + // for lubellion + case CardId.TheBystialLubellion: + { + Dictionary> lubellionCheckDict = new Dictionary>(); + if (hint == HintMsg.ToField) + { + lubellionCheckDict.Add(CardId.BrandedLost, () => { + bool fusionFlag = Bot.HasInHandOrHasInMonstersZone(CardId.BlazingCartesiaTheVirtuous); + if (!activatedCardIdList.Contains(CardId.BrandedFusion)) + { + if (Bot.HasInHand(CardId.BrandedFusion) || (!summoned && CheckRemainInDeck(CardId.BrandedFusion) > 0 && Bot.HasInHand(new int[] { + CardId.AluberTheJesterOfDespia, CardId.SpringansKitt + }))) + { + fusionFlag = true; + } + } + fusionFlag |= !summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion(); + fusionFlag |= Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck(); + fusionFlag |= Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null; + + return fusionFlag; + }); + lubellionCheckDict.Add(CardId.BrandedBeast, () => true); + } + else if (hint == HintMsg.AddToHand) + { + lubellionCheckDict.Add(CardId.BystialSaronir, () => true); + } + + foreach (KeyValuePair> pair in lubellionCheckDict) + { + ClientCard target = cards.FirstOrDefault(c => c.Id == pair.Key); + if (target != null && pair.Value()) + { + SelectSTPlace(target, false); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for albaz + case CardId.FallenOfAlbaz: + case CardId.FallenOfAlbaz + 1: + if (hint == HintMsg.SpSummon) + { + List fusionTargetIdList = new List { + CardId.MirrorjadeTheIcebladeDragon, CardId.AlbaLenatusTheAbyssDragon, CardId.AlbionTheBrandedDragon, CardId.AlbionTheSanctifireDragon, + CardId.LubellionTheSearingDragon, CardId.BorreloadFuriousDragon, CardId.TitanikladTheAshDragon, CardId.RindbrummTheStrikingDragon + }; + foreach (int targetId in fusionTargetIdList) + { + if (targetId == CardId.LubellionTheSearingDragon && Bot.Hand.Count == 0) continue; + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (hint == HintMsg.FusionMaterial) + { + if (cards.Count == 1) + { + selectedFusionMaterial.AddRange(cards); + return Util.CheckSelectCount(cards, cards, min, max); + } + // select best enemy monster + List sortedResult = cards.OrderByDescending(card => card.GetDefensePower()).ToList(); + selectedFusionMaterial.Add(sortedResult[0]); + return Util.CheckSelectCount(sortedResult, cards, min, max); + } + break; + + // for quem + case CardId.GuidingQuemTheVirtuous: + { + Dictionary> quemCheckDict = new Dictionary> + { + {CardId.BlazingCartesiaTheVirtuous, () => sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) && CheckRemainInDeck(CardId.BrandedInHighSpirits) > 0 }, + {CardId.BrandedFusion, () => Bot.HasInGraveyard(CardId.BrandedRetribution) }, + {CardId.FallenOfAlbaz, () => !Bot.HasInGraveyard(CardId.FallenOfAlbaz) }, + {CardId.TriBrigadeMercourier, () => Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) }, + {CardId.BrandedRetribution, () => true }, + {CardId.BrightestBlazingBrandedKing, () => !Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster) && fusionToGYFlag) }, + {CardId.BrandedInHighSpirits, () => fusionToGYFlag }, + {CardId.AlbionTheShroudedDragon, () => true }, + }; + + foreach (KeyValuePair> pair in quemCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for cartesia + case CardId.BlazingCartesiaTheVirtuous: + case CardId.BlazingCartesiaTheVirtuous + 1: + if (hint == HintMsg.SpSummon) + { + // fix material list + cartesiaMaterialList = cartesiaMaterialList.Where(c => c != null && (c.Location == CardLocation.MonsterZone || c.Location == CardLocation.Hand)).ToList(); + + // filter normal material + List materialList = Bot.MonsterZone.Where(c => c != null && c.GetDefensePower() <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + if (cartesiaSummonGoal > 0) + { + BlazingCartesiaTheVirtuousFusionCheck(cards, cartesiaSummonGoal, materialList, cartesiaMaterialList, out ClientCard _fusionTarget1, out _); + if (_fusionTarget1 != null) + { + fusionTarget = _fusionTarget1; + return Util.CheckSelectCount(new List { fusionTarget }, cards, min, max); + } + } + BlazingCartesiaTheVirtuousFusionCheck(cards, 0, materialList, cartesiaMaterialList, out ClientCard _fusionTarget2, out _); + if (_fusionTarget2 != null) + { + fusionTarget = _fusionTarget2; + return Util.CheckSelectCount(new List { fusionTarget }, cards, min, max); + } + + } + if (hint == HintMsg.FusionMaterial) + { + List mustSelectMaterialList = cartesiaMaterialList.Intersect(cards).ToList(); + if (mustSelectMaterialList != null && mustSelectMaterialList.Count > 0) + { + selectedFusionMaterial.Add(mustSelectMaterialList[0]); + return Util.CheckSelectCount(mustSelectMaterialList, cards, min, max); + } + + ClientCard lubellion = cards.FirstOrDefault(c => c != null && c.IsCode(CardId.TheBystialLubellion) && c.Location == CardLocation.MonsterZone); + if (lubellion != null && !Bot.HasInHandOrInSpellZone(CardId.BrandedBeast)) + { + if (activatedCardIdList.Contains(CardId.TheBystialLubellion + 1) || CheckRemainInDeck(CardId.BrandedLost, CardId.BrandedBeast) == 0) + { + if (Util.IsTurn1OrMain2() || Enemy.MonsterZone.Count(c => c != null && c.GetDefensePower() < 2500) > 0) + { + return Util.CheckSelectCount(new List { lubellion }, cards, min, max); + } + } + } + + ClientCard selectTarget = cards + .Where(c => c.Attack <= 2500 && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + .OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (selectTarget != null) + { + selectedFusionMaterial.Add(selectTarget); + return Util.CheckSelectCount(new List { selectTarget }, cards, min, max); + } + selectTarget = cards.OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (selectTarget != null) + { + selectedFusionMaterial.Add(selectTarget); + return Util.CheckSelectCount(new List { selectTarget }, cards, min, max); + } + } + break; + + // for nadir + case CardId.NadirServant: + if (hint == HintMsg.ToGrave) + { + if (summoned) + { + if (CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous) > 0) + { + ClientCard lulu = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.DespianLuluwalilith)); + if (lulu != null) + { + return Util.CheckSelectCount(new List { lulu }, cards, min, max); + } + } + if (!Bot.MonsterZone.Any(c => c != null && c.HasType(CardType.Fusion)) && CheckRemainInDeck(CardId.SpringansKitt) > 0) + { + ClientCard ironDragon = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.SprindTheIrondashDragon)); + if (ironDragon != null) + { + return Util.CheckSelectCount(new List { ironDragon }, cards, min, max); + } + } + } + NadirServantActivateCheck(cards, true, out ClientCard target); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + + // for deployment + case CardId.FusionDeployment: + { + int summonId = FusionDeploymentSpSummonTarget(); + if (summonId > 0) + { + if (hint == HintMsg.Confirm) + { + if (summonId == CardId.BlazingCartesiaTheVirtuous) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(CardId.GranguignolTheDuskDragon)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + else if (summonId == CardId.FallenOfAlbaz) + { + List shuffleList = ShuffleList(new List(cards)); + foreach (ClientCard target in shuffleList) + { + if (target.IsCode(albazFusionMonster)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + if (hint == HintMsg.SpSummon) + { + foreach (ClientCard target in cards) + { + if (target.IsCode(summonId)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + } + break; + + // for branded in white + case CardId.BrandedInWhite: + if (hint == HintMsg.SpSummon) + { + BrandedInWhiteFusionTarget(cards, out ClientCard target); + if (target != null) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (hint == HintMsg.FusionMaterial && fusionTarget != null) + { + if (fusionTarget.IsCode(CardId.BorreloadFuriousDragon)) + { + // select 2 dark dragon monster + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc).OrderBy(c => c.GetDefensePower()).ToList(); + int banishedAlbazCount = Bot.Banished.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz)).Count(); + banishedAlbazCount += selectedFusionMaterial.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz)).Count(); + foreach (ClientCard target in cardsInLoc) + { + // keep albaz + if (target.IsOriginalCode(CardId.FallenOfAlbaz) && banishedAlbazCount > 0) + { + continue; + } + selectedFusionMaterial.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (fusionTarget.IsCode(CardId.DespianQuaeritis)) + { + // select despain + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc && c.HasSetcode(SetcodeDespain) && (loc != CardLocation.Grave || !CheckWhetherShouldKeepInGrave(c))) + .OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsInLoc.Count > 0) + { + selectedFusionMaterial.Add(cardsInLoc[0]); + return Util.CheckSelectCount(cardsInLoc, cards, min, max); + } + } + } + // select light/dark + else + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) && (loc != CardLocation.Grave || !CheckWhetherShouldKeepInGrave(c))) + .OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsInLoc.Count > 0) + { + if (!activatedCardIdList.Contains(CardId.TriBrigadeMercourier + 1)) + { + ClientCard mercourier = cardsInLoc.FirstOrDefault(c => c.IsCode(CardId.TriBrigadeMercourier)); + if (mercourier != null) + { + selectedFusionMaterial.Add(mercourier); + return Util.CheckSelectCount(new List { mercourier }, cards, min, max); + } + } + if (!activatedCardIdList.Contains(CardId.DespianTragedy) && CheckRemainInDeck(CardId.AluberTheJesterOfDespia, CardId.GuidingQuemTheVirtuous) > 0) + { + ClientCard tragedy = cardsInLoc.FirstOrDefault(c => c.IsCode(CardId.DespianTragedy)); + if (tragedy != null) + { + selectedFusionMaterial.Add(tragedy); + return Util.CheckSelectCount(new List { tragedy }, cards, min, max); + } + } + + selectedFusionMaterial.Add(cardsInLoc[0]); + return Util.CheckSelectCount(cardsInLoc, cards, min, max); + } + } + } + } + if (fusionTarget.IsCode(CardId.GuardianChimera)) + { + List goalMaterialList = ChimeraFusionMaterialList().Intersect(cards).ToList(); + if (goalMaterialList.Count > 0) + { + return Util.CheckSelectCount(goalMaterialList, cards, min, max); + } + } + if (fusionTarget.IsCode(albazFusionMonster)) + { + // selecting albaz + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.MonsterZone, CardLocation.Hand }) + { + ClientCard albaz = cards.Where(c => c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (albaz != null) + { + selectedFusionMaterial.Add(albaz); + return Util.CheckSelectCount(new List { albaz }, cards, min, max); + } + } + } + else + { + if (fusionTarget.IsOriginalCode(CardId.AlbaLenatusTheAbyssDragon) && cancelable) + { + return null; + } + if (Util.IsTurn1OrMain2() && !CheckWhetherWillbeRemoved()) + { + ClientCard duskDragon = cards.FirstOrDefault(c => c.IsCode(CardId.GranguignolTheDuskDragon) && c.Location == CardLocation.MonsterZone); + if (duskDragon != null) + { + selectedFusionMaterial.Add(duskDragon); + return Util.CheckSelectCount(new List { duskDragon }, cards, min, max); + } + } + List> funcList = new List> + { + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.Location == CardLocation.MonsterZone && c.GetDefensePower() <= 2000, + (c) => c.Location == CardLocation.Hand, + (c) => c.Location == CardLocation.Grave, + (c) => c.Location == CardLocation.MonsterZone + }; + foreach (Func func in funcList) + { + List targetList = cards.Where(c => func(c)).OrderBy(c => c.GetDefensePower()).ToList(); + if (targetList.Count > 0) + { + selectedFusionMaterial.Add(targetList[0]); + return Util.CheckSelectCount(new List { targetList[0] }, cards, min, max); + } + } + } + } + } + break; + + // for branded fusion + case CardId.BrandedFusion: + if (hint == HintMsg.SpSummon) + { + Dictionary> brandedFusionCheckDict = new Dictionary> + { + {CardId.TitanikladTheAshDragon, () => Enemy.HasInMonstersZone(CardId.KashtiraAriseHeart) }, + {CardId.RindbrummTheStrikingDragon, () => CheckWhetherWillbeRemoved() && CheckRemainInDeck(CardId.TriBrigadeMercourier) > 0}, + {CardId.AlbionTheSanctifireDragon, () => CheckShouldNoMoreSpSummon()}, + {CardId.AlbionTheBrandedDragon, () => { + bool checkFlag = Bot.Graveyard.Any(c => c != null && c.IsMonster() && c.HasAttribute(CardAttribute.Dark) && !c.IsCode(cannotBeFusionMaterialIdList)); + checkFlag |= Bot.HasInHandOrHasInMonstersZone(CardId.TriBrigadeMercourier); + checkFlag |= Bot.GetMonsters().Any(c => c.GetDefensePower() <= 1800 && c.HasAttribute(CardAttribute.Dark) && !c.IsCode(cannotBeFusionMaterialIdList)); + return checkFlag; + } }, + {CardId.LubellionTheSearingDragon, () => !CheckWhetherNegated(true, true, CardType.Monster) && Bot.Hand.Count > 0 }, + {CardId.MirrorjadeTheIcebladeDragon, () => Bot.HasInMonstersZone(new List{ + CardId.GranguignolTheDuskDragon, CardId.AlbionTheBrandedDragon, CardId.LubellionTheSearingDragon}) } + }; + + foreach (KeyValuePair> pair in brandedFusionCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (hint == HintMsg.FusionMaterial) + { + // selecting albaz + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Deck, CardLocation.Hand, CardLocation.MonsterZone }) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.FallenOfAlbaz) && c.Location == loc); + if (target != null) + { + selectedFusionMaterial.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + // selecting another material + if (fusionTarget != null) + { + Dictionary> materialDict = new Dictionary> + { + { CardId.AlbionTheSanctifireDragon, new List{CardId.BlazingCartesiaTheVirtuous, _CardId.EffectVeiler, CardId.GuidingQuemTheVirtuous} }, + { CardId.MirrorjadeTheIcebladeDragon, new List{CardId.GranguignolTheDuskDragon, CardId.AlbionTheBrandedDragon, CardId.DespianLuluwalilith } }, + { CardId.LubellionTheSearingDragon, new List{ + CardId.DespianTragedy, CardId.BystialSaronir, CardId.AlbionTheShroudedDragon, CardId.AluberTheJesterOfDespia, CardId.TriBrigadeMercourier } }, + { CardId.TitanikladTheAshDragon, new List{CardId.TheBystialLubellion, CardId.AlbionTheShroudedDragon, CardId.BystialSaronir} }, + { CardId.RindbrummTheStrikingDragon, new List{CardId.TriBrigadeMercourier, CardId.SpringansKitt } }, + { CardId.AlbionTheBrandedDragon, new List{CardId.TheBystialLubellion, CardId.BlazingCartesiaTheVirtuous, CardId.GuidingQuemTheVirtuous } } + }; + materialDict.TryGetValue(fusionTarget.GetOriginCode(), out List checkIdList); + if (checkIdList != null && checkIdList.Count > 0) + { + foreach (CardLocation location in new List { CardLocation.Deck, CardLocation.Hand, CardLocation.MonsterZone }) + { + foreach (int checkId in checkIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.Location == location && c.IsCode(checkId)); + if (target != null) + { + selectedFusionMaterial.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + } + } + break; + + // for Sarcophagus + case CardId.GoldSarcophagus: + { + GoldSarcophagusTarget(cards, out ClientCard sarcophagusTarget); + if (sarcophagusTarget != null) + { + return Util.CheckSelectCount(new List { sarcophagusTarget }, cards, min, max); + } + } + break; + + // for burial + case CardId.FoolishBurial: + case CardId.FoolishBurial + 1: + { + FoolishBurialTarget(cards, out ClientCard burialTarget); + if (burialTarget != null) + { + return Util.CheckSelectCount(new List { burialTarget }, cards, min, max); + } + } + break; + + // for high spirit + case CardId.BrandedInHighSpirits: + // confirm + if (hint == HintMsg.Confirm) + { + if (Duel.Phase == DuelPhase.End && Bot.HasInMonstersZone(CardId.GuidingQuemTheVirtuous)) + { + ClientCard cartesia = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.BlazingCartesiaTheVirtuous)); + if (cartesia != null) + { + fusionTarget = cartesia; + return Util.CheckSelectCount(new List { cartesia }, cards, min, max); + } + } + bool activatingShroudedFlag = Duel.CurrentChain.Any(c => c.IsOriginalCode(CardId.AlbionTheShroudedDragon) && c.Location == CardLocation.Hand); + if (activatingShroudedFlag) + { + ClientCard shrouded = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.AlbionTheShroudedDragon)); + if (shrouded != null) + { + fusionTarget = shrouded; + return Util.CheckSelectCount(new List { shrouded }, cards, min, max); + } + } + List discardIdList = new List { + CardId.BystialSaronir, CardId.AlbionTheShroudedDragon, CardId.TheBystialLubellion, CardId.BlazingCartesiaTheVirtuous, + CardId.FallenOfAlbaz, CardId.TriBrigadeMercourier + }; + foreach (int discardId in discardIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(discardId)); + if (target != null) + { + // lubellion check + if (discardId == CardId.TheBystialLubellion && Duel.Player == 0 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) + && CheckRemainInDeck(CardId.BystialSaronir) > 0 && !activatedCardIdList.Contains(CardId.TheBystialLubellion)) + { + continue; + } + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + // discard + if (hint == HintMsg.ToGrave) + { + List discardIdList = new List { + CardId.AlbionTheBrandedDragon, CardId.TitanikladTheAshDragon, CardId.RindbrummTheStrikingDragon, CardId.AlbaLenatusTheAbyssDragon, + CardId.GranguignolTheDuskDragon + }; + foreach (int discardId in discardIdList) + { + if (sendToGYThisTurn.Any(c => c.IsOriginalCode(discardId))) continue; + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(discardId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for opening + case CardId.BrandedOpening: + if (hint == HintMsg.OperateCard) + { + Dictionary> openingCheckDict = new Dictionary>{ + {CardId.AluberTheJesterOfDespia, () => !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && !DefaultCheckWhetherCardIdIsNegated(CardId.AluberTheJesterOfDespia) + && !(CheckWhetherCanSummon() && Bot.HasInHand(CardId.AluberTheJesterOfDespia))}, + {CardId.GuidingQuemTheVirtuous, () => true }, + {CardId.DespianTragedy, () => true } + }; + foreach (KeyValuePair> pair in openingCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for branded in red + case CardId.BrandedInRed: + if (hint == HintMsg.SpSummon) + { + // filter normal material + List materialList = Bot.MonsterZone.Where(c => c != null && c.GetDefensePower() <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + BrandedInRedFusionCheck(cards, 0, materialList, brandedInRedMaterialList, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + fusionTarget = _fusionTarget; + return Util.CheckSelectCount(new List { fusionTarget }, cards, min, max); + } + + } + if (hint == HintMsg.FusionMaterial) + { + List mustSelectMaterialList = brandedInRedMaterialList.Intersect(cards).ToList(); + if (mustSelectMaterialList != null && mustSelectMaterialList.Count > 0) + { + selectedFusionMaterial.Add(mustSelectMaterialList[0]); + return Util.CheckSelectCount(mustSelectMaterialList, cards, min, max); + } + + ClientCard selectTarget = cards + .Where(c => c.Attack <= 2500 && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + .OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (selectTarget != null) + { + selectedFusionMaterial.Add(selectTarget); + return Util.CheckSelectCount(new List { selectTarget }, cards, min, max); + } + selectTarget = cards.OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (selectTarget != null) + { + selectedFusionMaterial.Add(selectTarget); + return Util.CheckSelectCount(new List { selectTarget }, cards, min, max); + } + } + break; + + // for branded king + case CardId.BrightestBlazingBrandedKing: + if (hint == HintMsg.Faceup) + { + List targetIdList = new List + { + CardId.MirrorjadeTheIcebladeDragon, CardId.AlbionTheSanctifireDragon, CardId.RindbrummTheStrikingDragon + }; + List> funcList = new List> + { + (c) => Duel.CurrentChain.Contains(c), + (c) => true + }; + foreach (Func func in funcList) + { + List chainedList = cards.Where(c => func(c)).ToList(); + if (chainedList.Count > 0) + { + foreach (int checkId in targetIdList) + { + ClientCard target = chainedList.FirstOrDefault(c => c.IsOriginalCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + ClientCard otherChainTarget = chainedList.FirstOrDefault(c => Duel.CurrentChain.Contains(c)); + if (otherChainTarget != null) + { + return Util.CheckSelectCount(new List { otherChainTarget }, cards, min, max); + } + } + } + } + break; + + // for retribution + case CardId.BrandedRetribution: + { + ClientCard searing = cards.FirstOrDefault(c => c.IsCode(CardId.LubellionTheSearingDragon)); + if (searing != null) + { + selectedFusionMaterial.Add(searing); + return Util.CheckSelectCount(new List { searing }, cards, min, max); + } + List checkIdList = new List { CardId.AlbionTheBrandedDragon, CardId.MirrorjadeTheIcebladeDragon, CardId.TitanikladTheAshDragon, CardId.AlbaLenatusTheAbyssDragon, + CardId.AlbionTheSanctifireDragon, CardId.SprindTheIrondashDragon}; + foreach (int checkId in checkIdList) + { + List gravePriorityList = cards.Where(c => c != null && c.IsCode(checkId) && c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c)).ToList(); + if (gravePriorityList.Count > 0) + { + selectedFusionMaterial.Add(gravePriorityList[0]); + return Util.CheckSelectCount(new List { gravePriorityList[0] }, cards, min, max); + } + } + List graveList = cards.Where(c => c != null && c.Location == CardLocation.Grave).ToList(); + if (graveList.Count > 0) + { + selectedFusionMaterial.Add(graveList[0]); + return Util.CheckSelectCount(new List { graveList[0] }, cards, min, max); + } + ClientCard monsterOnField = cards.Where(c => c != null && c.Location == CardLocation.MonsterZone).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (monsterOnField != null) + { + selectedFusionMaterial.Add(monsterOnField); + return Util.CheckSelectCount(new List { monsterOnField }, cards, min, max); + } + } + break; + + // for chimera + case CardId.GuardianChimera: + { + List targetList = new List(); + + targetList.AddRange(GetProblematicEnemyCardList(false, false, CardType.Monster)); + int bestBotPower = Util.GetBestPower(Bot); + targetList.AddRange(Enemy.MonsterZone.Where(c => c != null && !targetList.Contains(c) && c.GetDefensePower() >= bestBotPower).OrderByDescending(c => c.GetDefensePower())); + targetList.AddRange(ShuffleList(enemyPlaceThisTurn)); + + return Util.CheckSelectCount(targetList, cards, min, max); + } + break; + + // for sanctifire + case CardId.AlbionTheSanctifireDragon: + if (hint == Util.GetStringId(CardId.AlbionTheSanctifireDragon, 1)) + { + ClientCard albaz = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (albaz != null && CheckAlbazFusion()) + { + return Util.CheckSelectCount(new List { albaz }, cards, min, max); + } + + ClientCard floogate = cards.Where(c => c.IsFloodgate()).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (floogate != null) + { + return Util.CheckSelectCount(new List { floogate }, cards, min, max); + } + + return Util.CheckSelectCount(cards.OrderByDescending(c => c.GetDefensePower()).ToList(), cards, min, max); + } + break; + + // for mirrorjade + case CardId.MirrorjadeTheIcebladeDragon: + { + List floodgateList = ShuffleList(cards.Where(c => c.Controller == 1 && c.IsFloodgate()).ToList()); + if (floodgateList.Count > 0) + { + return Util.CheckSelectCount(floodgateList, cards, min, max); + } + + List extraMonsterList = cards.Where(c => c.Controller == 1 && ( + c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (c.HasType(CardType.Link) && c.LinkCount >= 2))).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (extraMonsterList.Count > 0) + { + return Util.CheckSelectCount(extraMonsterList, cards, min, max); + } + + ClientCard worstBotMonster = Util.GetWorstBotMonster(); + int worstBotPower = worstBotMonster == null ? 0 : worstBotMonster.GetDefensePower(); + List betterMonsterList = cards.Where(c => c.Controller == 1 && c.GetDefensePower() >= worstBotPower).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (betterMonsterList.Count > 0) + { + return Util.CheckSelectCount(betterMonsterList, cards, min, max); + } + + List dangerMonsterList = cards.Where(c => c.Controller == 1 && (c.IsMonsterDangerous() || c.IsMonsterInvincible())) + .OrderByDescending(c => c.GetDefensePower()).ToList(); + if (dangerMonsterList.Count > 0) + { + return Util.CheckSelectCount(dangerMonsterList, cards, min, max); + } + + List allEnemyMonsterList = cards.Where(c => c.Controller == 1).OrderByDescending(c => c.IsFacedown() ? 0 : c.GetDefensePower()).ToList(); + if (allEnemyMonsterList.Count > 0) + { + return Util.CheckSelectCount(allEnemyMonsterList, cards, min, max); + } + + ClientCard botMonsterWithEffect = cards.FirstOrDefault(c => c.Controller == 0 && c.IsCode(new[] { CardId.DespianTragedy, CardId.TriBrigadeMercourier })); + if (botMonsterWithEffect != null) + { + return Util.CheckSelectCount(new List { botMonsterWithEffect }, cards, min, max); + } + ClientCard botLubellion = cards.FirstOrDefault(c => c.Controller == 0 && c.IsCode(CardId.TheBystialLubellion)); + if (botLubellion != null) + { + return Util.CheckSelectCount(new List { botLubellion }, cards, min, max); + } + + + List allBotMonster = cards.Where(c => c.Controller == 0).OrderBy(c => c.IsFacedown() ? 0 : c.GetDefensePower()).ToList(); + if (allBotMonster.Count > 0) + { + return Util.CheckSelectCount(allBotMonster, cards, min, max); + } + } + break; + + // for searing dragon + case CardId.LubellionTheSearingDragon: + if (hint == HintMsg.SpSummon) + { + LubellionTheSearingDragonFusionTarget(cards, out ClientCard target); + if (target != null) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (hint == HintMsg.FusionMaterial && fusionTarget != null) + { + if (fusionTarget.IsCode(CardId.BorreloadFuriousDragon)) + { + // select 2 dark dragon monster + List> furiousFuncList = new List> + { + (c) => c.IsFaceup() && c.Location == CardLocation.Removed && c.IsCode(CardId.AlbionTheBrandedDragon), + (c) => c.IsFaceup() && c.Location == CardLocation.Removed && c.IsCode(CardId.FallenOfAlbaz), + (c) => c.Location == CardLocation.Grave && c.IsCode(CardId.AlbionTheBrandedDragon) && !CheckWhetherShouldKeepInGrave(c), + (c) => c.IsFaceup() && c.Location == CardLocation.Removed && c.IsCode(CardId.TitanikladTheAshDragon), + (c) => c.IsFaceup() && c.Location == CardLocation.Removed, + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.Location == CardLocation.Grave, + (c) => c.Location == CardLocation.Hand || c.Location == CardLocation.MonsterZone + }; + + foreach (Func func in furiousFuncList) + { + List cardWithFunc = cards.Where(c => func(c)).OrderBy(c => c.GetDefensePower()).ToList(); + if (cardWithFunc.Count > 0) + { + selectedFusionMaterial.Add(cardWithFunc[0]); + return Util.CheckSelectCount(new List { cardWithFunc[0] }, cards, min, max); + } + } + } + List> funcList = new List> + { + (c) => c.IsFaceup() && c.Location == CardLocation.Removed, + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.IsCode(CardId.LubellionTheSearingDragon), + (c) => c.Location == CardLocation.Grave, + (c) => c.Location == CardLocation.MonsterZone, + (c) => c.Location == CardLocation.Hand, + }; + if (selectedFusionMaterial.Count == 0) + { + if (fusionTarget.IsOriginalCode(CardId.DespianQuaeritis)) + { + foreach (Func func in funcList) + { + List cardsWithFunc = cards.Where(c => func(c) && c.HasSetcode(SetcodeDespain)).OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsWithFunc.Count > 0) + { + selectedFusionMaterial.Add(cardsWithFunc[0]); + return Util.CheckSelectCount(cardsWithFunc, cards, min, max); + } + } + } + if (fusionTarget.IsCode(albazFusionMonster)) + { + foreach (Func func in funcList) + { + List cardsWithFunc = cards.Where(c => func(c) && c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsWithFunc.Count > 0) + { + selectedFusionMaterial.Add(cardsWithFunc[0]); + return Util.CheckSelectCount(cardsWithFunc, cards, min, max); + } + } + } + } + if (fusionTarget.IsCode(CardId.AlbaLenatusTheAbyssDragon)) + { + // select non-albaz + if (selectedFusionMaterial.Count > 0) + { + funcList = new List> + { + (c) => c.IsFaceup() && c.Location == CardLocation.Removed, + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.IsCode(CardId.LubellionTheSearingDragon), + }; + } + } + foreach (Func func in funcList) + { + List cardsWithFunc = cards.Where(c => func(c)).OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsWithFunc.Count > 0) + { + selectedFusionMaterial.Add(cardsWithFunc[0]); + return Util.CheckSelectCount(cardsWithFunc, cards, min, max); + } + } + if (fusionTarget.IsOriginalCode(CardId.AlbaLenatusTheAbyssDragon) && cancelable) + { + return null; + } + } + break; + + // for granguignol + case CardId.GranguignolTheDuskDragon: + if (hint == HintMsg.ToGrave) + { + GranguignolTheDuskDragonSendToGYTarget(cards, out ClientCard target); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (hint == HintMsg.SpSummon) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.DespianQuaeritis, () => Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.Attack >= Util.GetBestPower(Bot) && !(c.HasType(CardType.Fusion) && c.Level >= 8)) }, + {CardId.GuidingQuemTheVirtuous, () => Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon) || Util.GetOneEnemyBetterThanValue(1500) == null }, + {CardId.DespianLuluwalilith, () => !(Duel.Player == 0 && Bot.HasInHandOrInSpellZone(CardId.BrandedFusion)) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for Quaeritis + case CardId.DespianQuaeritis: + { + Dictionary> checkDict = new Dictionary> + { + {CardId.FallenOfAlbaz, () => CheckAlbazFusion() }, + {CardId.GuidingQuemTheVirtuous, () => !DefaultCheckWhetherCardIdIsNegated(CardId.GuidingQuemTheVirtuous) }, + {CardId.AluberTheJesterOfDespia, () => !DefaultCheckWhetherCardIdIsNegated(CardId.AluberTheJesterOfDespia) }, + {CardId.DespianTragedy, () => true } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for irondash dragon + case CardId.SprindTheIrondashDragon: + { + Dictionary> checkDict = new Dictionary> + { + {CardId.FallenOfAlbaz, () => CheckAlbazFusion() }, + {CardId.SpringansKitt, () => !DefaultCheckWhetherCardIdIsNegated(CardId.SpringansKitt) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for ash dragon + case CardId.TitanikladTheAshDragon: + { + Dictionary> checkDict = new Dictionary> + { + {CardId.FallenOfAlbaz, () => CheckAlbazFusion() }, + {CardId.GuidingQuemTheVirtuous, () => !DefaultCheckWhetherCardIdIsNegated(CardId.GuidingQuemTheVirtuous) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for rindrumm + case CardId.RindbrummTheStrikingDragon: + if (hint == HintMsg.SpSummon) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.FallenOfAlbaz, () => CheckAlbazFusion() }, + {CardId.RindbrummTheStrikingDragon, () => true }, + {CardId.AlbionTheShroudedDragon, () => true } + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (hint == HintMsg.ReturnToHand) + { + List problemList = GetProblematicEnemyCardList(false, true, CardType.Monster).Intersect(cards).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (problemList.Count > 0) + { + return Util.CheckSelectCount(problemList, cards, min, max); + } + ClientCard worstBotMonster = Util.GetWorstBotMonster(); + int worstBotPower = worstBotMonster == null ? 0 : worstBotMonster.GetDefensePower(); + List dangerList = cards.Where(c => c.IsFaceup() && c.Controller == 1 && c.GetDefensePower() > worstBotPower).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (dangerList.Count > 0) + { + return Util.CheckSelectCount(dangerList, cards, min, max); + } + List checkIdList = new List { CardId.AluberTheJesterOfDespia, CardId.SpringansKitt }; + foreach (int checkId in checkIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.Controller == 0 && c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + List enemyMonsterList = cards.Where(c => c.Controller == 1).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (enemyMonsterList.Count > 0) + { + return Util.CheckSelectCount(enemyMonsterList, cards, min, max); + } + return Util.CheckSelectCount(cards.Where(c => c.Controller == 0).OrderByDescending(c => c.GetDefensePower()).ToList(), cards, min, max); + } + break; + + // for branded dragon + case CardId.AlbionTheBrandedDragon: + if (hint == HintMsg.SpSummon) + { + AlbionTheBrandedDragonFusionTarget(cards, out ClientCard target); + if (target != null) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (hint == HintMsg.FusionMaterial && fusionTarget != null) + { + if (fusionTarget.IsCode(CardId.BorreloadFuriousDragon)) + { + // select 2 dark dragon monster + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc).OrderBy(c => c.GetDefensePower()).ToList(); + int banishedAlbazCount = Bot.Banished.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz)).Count(); + banishedAlbazCount += selectedFusionMaterial.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz)).Count(); + foreach (ClientCard target in cardsInLoc) + { + // keep albaz + if (target.IsOriginalCode(CardId.FallenOfAlbaz) && banishedAlbazCount > 0) + { + continue; + } + selectedFusionMaterial.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (fusionTarget.IsCode(CardId.DespianQuaeritis)) + { + // select despain + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc && c.HasSetcode(SetcodeDespain) && (loc != CardLocation.Grave || !CheckWhetherShouldKeepInGrave(c))) + .OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsInLoc.Count > 0) + { + selectedFusionMaterial.Add(cardsInLoc[0]); + return Util.CheckSelectCount(cardsInLoc, cards, min, max); + } + } + } + // select light/dark + else + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) && (loc != CardLocation.Grave || !CheckWhetherShouldKeepInGrave(c))) + .OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsInLoc.Count > 0) + { + if (!activatedCardIdList.Contains(CardId.TriBrigadeMercourier + 1)) + { + ClientCard mercourier = cardsInLoc.FirstOrDefault(c => c.IsCode(CardId.TriBrigadeMercourier)); + if (mercourier != null) + { + selectedFusionMaterial.Add(mercourier); + return Util.CheckSelectCount(new List { mercourier }, cards, min, max); + } + } + if (!activatedCardIdList.Contains(CardId.DespianTragedy) && CheckRemainInDeck(CardId.AluberTheJesterOfDespia, CardId.GuidingQuemTheVirtuous) > 0) + { + ClientCard tragedy = cardsInLoc.FirstOrDefault(c => c.IsCode(CardId.DespianTragedy)); + if (tragedy != null) + { + selectedFusionMaterial.Add(tragedy); + return Util.CheckSelectCount(new List { tragedy }, cards, min, max); + } + } + + selectedFusionMaterial.Add(cardsInLoc[0]); + return Util.CheckSelectCount(cardsInLoc, cards, min, max); + } + } + } + } + if (fusionTarget.IsCode(albazFusionMonster)) + { + // selecting albaz + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.MonsterZone, CardLocation.Hand }) + { + ClientCard albaz = cards.Where(c => c.IsCode(CardId.FallenOfAlbaz) && c.Location == loc).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (albaz != null) + { + selectedFusionMaterial.Add(albaz); + return Util.CheckSelectCount(new List { albaz }, cards, min, max); + } + } + } + else + { + if (fusionTarget.IsOriginalCode(CardId.AlbaLenatusTheAbyssDragon) && cancelable) + { + return null; + } + List> funcList = new List> + { + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.Location == CardLocation.MonsterZone && c.GetDefensePower() <= 2000, + (c) => c.Location == CardLocation.Grave, + (c) => c.Location == CardLocation.Hand, + (c) => c.Location == CardLocation.MonsterZone + }; + foreach (Func func in funcList) + { + List targetList = cards.Where(c => func(c)).OrderBy(c => c.GetDefensePower()).ToList(); + if (targetList.Count > 0) + { + selectedFusionMaterial.Add(targetList[0]); + return Util.CheckSelectCount(new List { targetList[0] }, cards, min, max); + } + } + } + } + } + if (hint == HintMsg.OperateCard) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.BrandedInHighSpirits, () => Bot.HasInMonstersZone(CardId.GuidingQuemTheVirtuous) && BrandedInHighSpiritsActivateCheck() }, + {CardId.BrightestBlazingBrandedKing, () => Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedInRed, () => Bot.Graveyard.Any(c => c != null && (c.HasSetcode(SetcodeDespain) || c.IsCode(CardId.FallenOfAlbaz))) }, + {CardId.BrandedRetribution, () => Bot.Graveyard.Where(c => c != null && c.IsCode(albazFusionMonster)).Count() > 1 }, + {CardId.BrandedFusion, () => CheckRemainInDeck(CardId.FallenOfAlbaz) > 0 }, + {CardId.BrandedBeast, () => Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeBystial)) }, + {CardId.BrandedLost, () => true }, + {CardId.BrandedInWhite, () => true } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for luluwa + case CardId.DespianLuluwalilith: + if (hint == HintMsg.Disable) + { + List enemyCardList = cards.Where(c => c.IsFaceup() && c.Controller == 1).ToList(); + List problemCardList = GetProblematicEnemyCardList(false, false, 0).Intersect(enemyCardList).ToList(); + if (problemCardList.Count > 0) + { + return Util.CheckSelectCount(ShuffleList(problemCardList), cards, min, max); + } + List monsterList = GetMonsterListForTargetNegate(false, 0).Intersect(enemyCardList).ToList(); + if (monsterList.Count > 0) + { + return Util.CheckSelectCount(ShuffleList(monsterList), cards, min, max); + } + if (enemyCardList.Count > 0) + { + return Util.CheckSelectCount(ShuffleList(enemyCardList), cards, min, max); + } + } + if (hint == HintMsg.SpSummon) + { + foreach (CardLocation loc in new[] { CardLocation.Deck, CardLocation.Hand }) + { + foreach (int checkId in new List { CardId.BlazingCartesiaTheVirtuous, CardId.GuidingQuemTheVirtuous }) + { + ClientCard target = cards.FirstOrDefault(c => c.Location == loc && c.IsOriginalCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + break; + + default: + break; + } + } + + // drop 1 hand + bool discardHand = hint == HintMsg.Discard; + bool handToDeck = hint == HintMsg.ToDeck && cards.All(c => c.Location == CardLocation.Hand); + if (min == 1 && max == 1 && (discardHand || handToDeck)) + { + if (currentSolvingChain != null && currentSolvingChain.IsCode(CardId.BrandedOpening)) + { + ClientCard tragedy = cards.FirstOrDefault(card => card.IsCode(CardId.DespianTragedy)); + if (tragedy != null) + { + return Util.CheckSelectCount(new List { tragedy }, cards, min, max); + } + } + if (discardHand) + { + // discard activating shrouded + foreach (ClientCard target in cards) + { + if (target.IsCode(CardId.AlbionTheShroudedDragon) && Duel.CurrentChain.Contains(target)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + + List discardList = new List { + CardId.BrandedRetribution, CardId.AlbionTheShroudedDragon, CardId.BystialSaronir, CardId.BrightestBlazingBrandedKing, + CardId.BrandedInHighSpirits, CardId.BlazingCartesiaTheVirtuous, CardId.DespianTragedy }; + foreach (int id in discardList) + { + ClientCard card = cards.FirstOrDefault(c => c.IsCode(id)); + if (card != null) + { + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + } + // return dump card + foreach (ClientCard card in cards) + { + if (cards.Where(c => c.IsCode(card.Id)).Count() > 1) + { + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + List improperCardIdList = new List + { + CardId.BrandedRetribution, CardId.BrandedInHighSpirits, CardId.DespianTragedy, CardId.FusionDeployment, CardId.BrandedBeast, + CardId.AlbionTheShroudedDragon, CardId.BrandedOpening, CardId.GoldSarcophagus, CardId.FoolishBurial, CardId.FallenOfAlbaz, + CardId.BrandedInRed, _CardId.InfiniteImpermanence, CardId.TheBystialLubellion, CardId.BrandedLost, CardId.SpringansKitt, + CardId.GuidingQuemTheVirtuous, _CardId.CrossoutDesignator, _CardId.CalledByTheGrave, CardId.TriBrigadeMercourier, _CardId.AshBlossom, _CardId.MaxxC + }; + foreach (int id in improperCardIdList) + { + if (id == CardId.BrandedLost && Bot.HasInHand(CardId.BrandedFusion) && BrandedFusionActivateCheck()) continue; + ClientCard target = cards.FirstOrDefault(c => c.IsCode(id)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + else if (discardHand && min > 0 && min == max) + { + List discardList = new List(); + List graveEffectIdList = new List { CardId.AlbionTheShroudedDragon, CardId.BrandedRetribution, CardId.BrandedInHighSpirits, + CardId.BrightestBlazingBrandedKing, CardId.DespianTragedy }; + discardList.AddRange(ShuffleList(cards.Where(c => c.IsCode(graveEffectIdList)).ToList())); + List remainHandList = cards.Except(discardList).ToList(); + + HashSet seenIds = new HashSet(); + for (int idx = remainHandList.Count - 1; idx >= 0; idx --) + { + ClientCard currentCard = remainHandList[idx]; + if (!seenIds.Add(currentCard.Id)) + { + discardList.Add(currentCard); + remainHandList.Remove(currentCard); + } + } + + List improperCardIdList = new List + { + CardId.FusionDeployment, CardId.BrandedBeast, CardId.AlbionTheShroudedDragon, CardId.BrandedOpening, CardId.GoldSarcophagus, + CardId.FoolishBurial, CardId.FallenOfAlbaz, CardId.BrandedInRed, _CardId.InfiniteImpermanence, CardId.TheBystialLubellion, + CardId.BrandedLost, CardId.SpringansKitt, CardId.GuidingQuemTheVirtuous, _CardId.CrossoutDesignator, _CardId.CalledByTheGrave, + CardId.TriBrigadeMercourier, _CardId.AshBlossom, _CardId.MaxxC + }; + foreach (int id in improperCardIdList) + { + ClientCard target = remainHandList.FirstOrDefault(c => c.IsCode(id)); + if (target != null) + { + discardList.Add(target); + } + } + if (discardList.Count > min) + { + discardList = discardList.Take(min).ToList(); + } + + return Util.CheckSelectCount(discardList, cards, min, max); + } + + // for The Bystial Lubellion + if (theBystialLubellionSelecting) + { + theBystialLubellionSelecting = false; + ClientCard target = TheBystialLubellionSpSummonCost(cards); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } else + { + List targetList = new List(cards); + targetList.Sort(CardContainer.CompareCardAttack); + return Util.CheckSelectCount(targetList, cards, min, max); + } + } + + // for shrouded/saronir + if (albionTheShroudedDragonSelecting || (currentSolvingChain != null && currentSolvingChain.IsCode(CardId.BystialSaronir))) + { + // send retribution first + ClientCard retribution = cards.FirstOrDefault(c => c.IsCode(CardId.BrandedRetribution)); + if (retribution != null) + { + if (retribution.Location == CardLocation.Deck || Bot.GetGraveyardMonsters().Where(c => c.IsCode(albazFusionMonster)).Count() < 2) + { + return Util.CheckSelectCount(new List { retribution }, cards, min, max); + } + } + // send spells to recycle + if (Bot.HasInGraveyard(CardId.BrandedRetribution) || (Bot.HasInGraveyard(CardId.DespianTragedy) && !activatedCardIdList.Contains(CardId.DespianTragedy))) + { + Dictionary> deckCheckDict = new Dictionary>{ + {CardId.BrandedFusion, () => BrandedFusionActivateCheck()}, + {CardId.BrandedLost, () => { + if (Duel.Player == 0 && Duel.Phase >= DuelPhase.End) return false; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) && BrandedFusionActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null) return true; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion()) return true; + if ((Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) || (!summoned && Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous)))) return true; + return false; + } }, + {CardId.BrandedInHighSpirits, BrandedInHighSpiritsActivateCheck}, + {CardId.BrandedInRed, () => BrandedInRedActivateCheck() != null }, + {CardId.BrandedInWhite, BrandedInWhiteActivateCheck }, + {CardId.BrandedRetribution, () => cards.Any(c => c.IsCode(CardId.BrandedRetribution) && c.Location == CardLocation.Removed) }, + {CardId.BrightestBlazingBrandedKing, () => Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedOpening, () => Bot.Hand.Count > 2 } + }; + foreach (KeyValuePair> pair in deckCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.Location == CardLocation.Deck && card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + // for abyss dragon + if (albionTheShroudedDragonSelecting && + FallenOfAlbazSetCheck() && (summoned || !Bot.HasInHand(new List { CardId.FallenOfAlbaz, CardId.BrandedInHighSpirits }))) + { + List checkIdList = new List { + CardId.BrandedRetribution, CardId.BrandedInHighSpirits, CardId.BrightestBlazingBrandedKing, CardId.BrandedInWhite, CardId.BrandedOpening, + CardId.BrandedInRed, CardId.BrandedBeast, CardId.BrandedLost + }; + if (!BrandedFusionActivateCheck()) + { + checkIdList.Add(CardId.BrandedFusion); + } + foreach (int checkId in checkIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.Id == checkId); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + // send from deck + List checkList = new List { CardId.BrandedInHighSpirits, CardId.BrandedOpening, CardId.BrightestBlazingBrandedKing, CardId.BrandedBeast, CardId.BrandedLost }; + foreach (int checkId in checkList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId) && c.Location == CardLocation.Deck); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + return Util.CheckSelectCount(ShuffleList(new List(cards)), cards, min, max); + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override int OnSelectOption(IList options) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + // 1190=Add to Hand, 1152=Special Summon + if (options.Count == 2 && options.Contains(1190) && options.Contains(1152)) + { + if (currentSolvingChain.IsCode(CardId.BrandedOpening)) + { + return (CheckShouldNoMoreSpSummon() && !summoned && Duel.Player == 0) ? options.IndexOf(1190) : options.IndexOf(1152); + } + + if (fusionTarget != null && ( + currentSolvingChain.IsCode(CardId.DespianQuaeritis) + || currentSolvingChain.IsCode(CardId.TitanikladTheAshDragon) + || currentSolvingChain.IsCode(CardId.SprindTheIrondashDragon) + )) + { + if (fusionTarget.IsCode(CardId.FallenOfAlbaz)) + { + return CheckAlbazFusion() ? options.IndexOf(1152) : options.IndexOf(1190); + } + if (fusionTarget.IsCode(CardId.GuidingQuemTheVirtuous, CardId.SpringansKitt)) + { + return CheckShouldNoMoreSpSummon() ? options.IndexOf(1190) : options.IndexOf(1152); + } + if (fusionTarget.IsCode(CardId.AluberTheJesterOfDespia)) + { + return activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) ? options.IndexOf(1190) : options.IndexOf(1152); + } + return (CheckShouldNoMoreSpSummon() && !summoned) ? options.IndexOf(1190) : options.IndexOf(1152); + } + } + + // 1190=Add to Hand, 1153=Set + if (currentSolvingChain.IsCode(CardId.AlbionTheBrandedDragon) && fusionTarget != null) + { + if (fusionTarget.IsOriginalCode(CardId.BrandedInHighSpirits) && Duel.Player == 0) + { + return BrandedInHighSpiritsActivateCheck() ? options.IndexOf(1190) : options.IndexOf(1153); + } + if (fusionTarget.IsOriginalCode(CardId.BrandedInRed) && Duel.Player == 0) + { + if (nadirActivated) return options.IndexOf(1153); + return BrandedInRedActivateCheck() != null ? options.IndexOf(1190) : options.IndexOf(1153); + } + if (fusionTarget.Data != null) + { + bool setFlag = fusionTarget.Data.HasType(CardType.Trap); + setFlag |= fusionTarget.Data.HasType(CardType.QuickPlay) && Duel.Player == 0; + setFlag |= Bot.Hand.Count >= 6 && Duel.Player == 0; + return setFlag ? options.IndexOf(1153) : options.IndexOf(1190); + } + } + } + + return base.OnSelectOption(options); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + ClientCard currentSovingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSovingChain != null && currentSovingChain.Controller == 0 && currentSovingChain.IsCode(CardId.SprindTheIrondashDragon)) + { + return SprindTheIrondashDragonMoveZone(available, null); + } + + if (player == 0 && location == CardLocation.MonsterZone) + { + List zoneIdList = ShuffleList(new List { 5, 6 }); + zoneIdList.AddRange(ShuffleList(new List { 0, 2, 4 })); + zoneIdList.AddRange(ShuffleList(new List { 1, 3 })); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + return zone; + } + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.BrandedInHighSpirits, 2)) + { + if (CheckWhetherWillbeRemoved()) return false; + if (fusionTarget != null && fusionTarget.IsOriginalCode(CardId.TriBrigadeMercourier)) + { + return !Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster)); + } + } + + if (desc == Util.GetStringId(CardId.RindbrummTheStrikingDragon, 2)) + { + bool checkFlag = Enemy.MonsterZone.Any(c => c != null); + checkFlag |= Bot.MonsterZone.Any(c => c != null && (c.IsOriginalCode(CardId.AluberTheJesterOfDespia) || c.IsOriginalCode(CardId.SpringansKitt))); + return checkFlag; + } + + if (desc == Util.GetStringId(CardId.DespianLuluwalilith, 2)) + { + bool checkFlag = Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled()); + checkFlag |= Enemy.SpellZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled()); + return checkFlag; + } + + if (desc == Util.GetStringId(CardId.BrandedInRed, 0)) + { + // fix material list + brandedInRedMaterialList = brandedInRedMaterialList.Where(c => c != null && (c.Location == CardLocation.MonsterZone || c.Location == CardLocation.Hand)).ToList(); + + List materialList = Bot.MonsterZone.Where(c => c != null && c.Attack <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + BrandedInRedFusionCheck(Bot.ExtraDeck, 0, + materialList, brandedInRedMaterialList, + out ClientCard _fusionTarget, out _); + + return _fusionTarget != null; + } + + if (desc == Util.GetStringId(CardId.SprindTheIrondashDragon, 2)) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + int value = SprindTheIrondashDragonDestroyValue(currentSolvingChain.Sequence); + return value > 0; + } + } + + return base.OnSelectYesNo(desc); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null && currentSolvingChain.IsCode(CardId.AlbionTheSanctifireDragon)) + { + sanctifireSelectPositionCount++; + if (sanctifireSelectPositionCount >= 2) + { + if (Duel.Phase <= DuelPhase.Main2) + { + return CardPosition.FaceUpDefence; + } + } + } + + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + dimensionShifterCount = 0; + } + + summoned = false; + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + enemyActivateInfiniteImpermanenceFromHand = false; + nadirActivated = false; + fusionToGYFlag = false; + spSummoningAlbaz = false; + cartesiaSummonGoal = 0; + sanctifireSelectPositionCount = 0; + quemSummonFlag = 0; + if (dimensionShifterCount > 0) dimensionShifterCount--; + cartesiaMaterialList.Clear(); + brandedInRedMaterialList.Clear(); + infiniteImpermanenceList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + sendToGYThisTurn.Clear(); + activatedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + Duel.LastChainTargets.Clear(); + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + if (enemyActivateInfiniteImpermanenceFromHand) + { + enemyActivateInfiniteImpermanenceFromHand = false; + } + else + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + } + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + if (currentCard != null) + { + // if activation is negated, it can activate again. + if (currentCard.Controller == 0) + { + List activateCheck = new List { CardId.NadirServant, CardId.FusionDeployment, CardId.BrandedFusion, CardId.BrandedInRed }; + if (currentCard.IsCode(activateCheck)) + { + activatedCardIdList.Add(currentCard.Id); + } + } + if (!Duel.IsCurrentSolvingChainNegated()) + { + if (currentCard.Controller == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) + enemyActivateLockBird = true; + if (currentCard.IsCode(CardId.DimensionShifter)) + dimensionShifterCount = 2; + } + if (currentCard.Controller == 0 && currentCard.IsCode(CardId.NadirServant)) + { + nadirActivated = true; + } + } + } + fusionTarget = null; + selectedFusionMaterial.Clear(); + sanctifireSelectPositionCount = 0; + + base.OnChainSolved(chainIndex); + } + + public override void OnChainEnd() + { + cartesiaSummonGoal = 0; + cartesiaMaterialList.Clear(); + brandedInRedMaterialList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + theBystialLubellionSelecting = false; + albionTheShroudedDragonSelecting = false; + spSummoningAlbaz = false; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || (checkTarget.Location != CardLocation.SpellZone && checkTarget.Location != CardLocation.MonsterZone)) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + if (quemSummonFlag > 0) quemSummonFlag--; + base.OnChainEnd(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (previousControler == 1) + { + if (card != null) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && previousLocation == (int)CardLocation.Hand && currentLocation == (int)CardLocation.SpellZone) + enemyActivateInfiniteImpermanenceFromHand = true; + } + } + if (card != null) + { + if (currentControler == 1 && (currentLocation == (int)CardLocation.MonsterZone || currentLocation == (int)CardLocation.SpellZone)) + { + enemyPlaceThisTurn.Add(card); + } + if (currentControler == 0) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (previousLocation == (int)CardLocation.Grave && currentLocation != (int)CardLocation.Grave) + { + sendToGYThisTurn.Remove(card); + } + if (currentLocation == (int)CardLocation.Grave) + { + if (card.HasType(CardType.Fusion)) fusionToGYFlag = true; + sendToGYThisTurn.Add(card); + } + if (currentLocation == (int)CardLocation.MonsterZone && card != null && card.IsCode(CardId.GuidingQuemTheVirtuous)) + { + quemSummonFlag = 2; + } + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool TheBystialLubellionSpSummon() + { + if (Card.Location == CardLocation.Hand) + { + return false; + } + ClientCard costTarget = TheBystialLubellionSpSummonCost(Bot.GetMonsters()); + if (costTarget != null) + { + theBystialLubellionSelecting = true; + activatedCardIdList.Add(Card.Id - 1); + return true; + } + return false; + } + + public ClientCard TheBystialLubellionSpSummonCost(IList costList) + { + Dictionary> checkDict = new Dictionary>{ + {CardId.AlbionTheBrandedDragon, (card) => sendToGYThisTurn.All(c => !c.IsCode(CardId.AlbionTheBrandedDragon))}, + {CardId.BystialSaronir, (card) => !activatedCardIdList.Contains(CardId.BystialSaronir + 1) && !CheckWhetherWillbeRemoved() }, + {CardId.TitanikladTheAshDragon, (card) => Util.IsTurn1OrMain2() || card.GetDefensePower() < 2500 }, + {CardId.AlbaLenatusTheAbyssDragon, (card) => Util.IsTurn1OrMain2() || card.IsDisabled() || card.GetDefensePower() < 2500 }, + {CardId.AlbionTheShroudedDragon, (card) => Util.IsTurn1OrMain2() || card.GetDefensePower() < 2500 }, + {CardId.BorreloadFuriousDragon, (card) => card.IsDisabled() && CheckRemainInDeck(CardId.BrandedBeast, CardId.BrandedLost) > 0 }, + }; + + foreach (KeyValuePair> pair in checkDict) + { + List targetList = costList.Where(card => card.IsCode(pair.Key)).ToList(); + foreach (ClientCard target in targetList) + { + if (target != null && pair.Value(target)) + { + return target; + } + } + } + return null; + } + + public bool TheBystialLubellionActivate() + { + if (CheckWhetherNegated(true, Card.Location == CardLocation.MonsterZone, CardType.Monster)) return false; + if (Card.Location == CardLocation.Hand) + { + activatedCardIdList.Add(Card.Id); + } else + { + activatedCardIdList.Add(Card.Id + 1); + } + return true; + } + + public bool AlbionTheShroudedDragonActivate() + { + if (CheckWhetherNegated(true, false, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + bool checkFlag = CheckRemainInDeck(CardId.BrandedRetribution, CardId.BrandedOpening, CardId.BrightestBlazingBrandedKing, CardId.BrandedInHighSpirits) > 0; + if (Bot.HasInGraveyard(CardId.BrandedRetribution)) + { + checkFlag |= CheckRemainInDeck(CardId.BrandedFusion, CardId.BrandedBeast, CardId.BrandedInRed, CardId.BrandedInWhite, CardId.BrandedLost) > 0; + } + if (Bot.HasInSpellZone(CardId.BrandedBeast)) + { + checkFlag |= CheckRemainInDeck(CardId.BrandedLost) > 0; + } + if (Card.Location == CardLocation.Grave) + { + checkFlag |= CheckRemainInDeck(CardId.BrandedInWhite) > 0; + } + // for abyss dragon + if (FallenOfAlbazSetCheck() && (summoned || !Bot.HasInHand(new List { CardId.FallenOfAlbaz, CardId.BrandedInHighSpirits }))) + { + checkFlag |= Bot.HasInHand(new List { CardId.BrandedBeast, CardId.BrandedInHighSpirits, CardId.BrandedInWhite, CardId.BrandedInRed, CardId.BrandedLost, CardId.BrandedOpening, CardId.BrandedRetribution, CardId.BrightestBlazingBrandedKing }); + } + + if (checkFlag) + { + activatedCardIdList.Add(Card.Id); + albionTheShroudedDragonSelecting = true; + return true; + } + return false; + } + + public bool BystialSaronirActivate() + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + // banish & spsummon + if (Card.Location == CardLocation.Hand) + { + // banish enemy target + if (Util.GetLastChainCard() != null && Duel.LastChainPlayer == 1) + { + List chainTargetList = Duel.LastChainTargets.Where(c => CheckBystialCanBanish(c)).ToList(); + if (chainTargetList.Count > 0) + { + AI.SelectCard(chainTargetList); + currentDestroyCardList.Add(chainTargetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + List enemyChainList = Duel.CurrentChain.Where(c => c != null && c.Controller == 1 && CheckBystialCanBanish(c) && !currentDestroyCardList.Contains(c)) + .OrderByDescending(c => c.GetDefensePower()).ToList(); + if (enemyChainList.Count > 0) + { + AI.SelectCard(enemyChainList); + currentDestroyCardList.Add(enemyChainList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + + // banish cards with effect + if (!CheckShouldNoMoreSpSummon()) + { + ClientCard mercourier = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.TriBrigadeMercourier)); + if (mercourier != null && !activatedCardIdList.Contains(CardId.TriBrigadeMercourier + 1)) + { + AI.SelectCard(mercourier); + currentDestroyCardList.Add(mercourier); + activatedCardIdList.Add(Card.Id); + return true; + } + ClientCard tragedy = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.DespianTragedy)); + if (tragedy != null && !activatedCardIdList.Contains(CardId.DespianTragedy)) + { + AI.SelectCard(tragedy); + currentDestroyCardList.Add(tragedy); + activatedCardIdList.Add(Card.Id); + return true; + } + if (Bot.HasInGraveyard(CardId.TheBystialLubellion) && !activatedCardIdList.Contains(CardId.TheBystialLubellion) + && Duel.Player == 0 && CheckRemainInDeck(CardId.BrandedLost, CardId.BrandedBeast) > 0 + && CurrentTiming == -1) + { + List targetList = Enemy.Graveyard.Where(c => c != null && CheckBystialCanBanish(c)).OrderByDescending(card => card.Attack).ToList(); + targetList.AddRange(Bot.Graveyard + .Where(c => c != null && CheckBystialCanBanish(c) && !c.IsCode(CardId.TheBystialLubellion) && !CheckWhetherShouldKeepInGrave(c)) + .OrderBy(card => card.Attack).ToList() + ); + if (targetList.Count > 0) + { + AI.SelectCard(targetList); + currentDestroyCardList.Add(targetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + // defense + if (Bot.UnderAttack && Bot.BattlingMonster == null) + { + List targetList = Enemy.Graveyard.Where(c => CheckBystialCanBanish(c)).OrderByDescending(c => c.GetDefensePower()).ToList(); + targetList.AddRange(Bot.Graveyard.Where(c => CheckBystialCanBanish(c)).OrderBy(c => c.GetDefensePower())); + if (targetList.Count > 0) + { + AI.SelectCard(targetList); + currentDestroyCardList.Add(targetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // trigger beast + if (Duel.Player == 1 && (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) + && !activatedCardIdList.Contains(CardId.BrandedBeast) && Bot.SpellZone.Any(c => c != null && c.IsCode(CardId.BrandedBeast) && (c.IsFacedown() || !c.IsDisabled())) + && !Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeBystial))) + { + List dangerList = GetProblematicEnemyCardList(true, false, CardType.Trap); + if (dangerList.Count > 0) + { + List targetList = Enemy.Graveyard.Where(c => CheckBystialCanBanish(c)).OrderByDescending(c => c.GetDefensePower()).ToList(); + targetList.AddRange(Bot.Graveyard.Where(c => CheckBystialCanBanish(c)).OrderBy(c => c.GetDefensePower())); + if (targetList.Count > 0) + { + AI.SelectCard(targetList); + currentDestroyCardList.Add(targetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + } + // send to GY + if (Card.Location == CardLocation.Grave && !CheckWhetherWillbeRemoved()) + { + if (Bot.HasInGraveyard(CardId.BrandedRetribution)) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } else if (CheckRemainInDeck(CardId.TheBystialLubellion, CardId.BrandedRetribution, CardId.BrandedInHighSpirits, CardId.BrightestBlazingBrandedKing, CardId.BrandedOpening) > 0) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + return false; + } + + public bool CheckBystialCanBanish(ClientCard c) + { + return c != null && c.Location == CardLocation.Grave && c.IsMonster() && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark); + } + + public bool AluberTheJesterOfDespiaSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || enemyActivateLockBird || activatedCardIdList.Contains(Card.Id)) return false; + summoned = true; + return true; + } + + public bool AluberTheJesterOfDespiaActivate() + { + // search + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + // spsummon + else + { + List targetCardList = GetMonsterListForTargetNegate(true, CardType.Monster); + ClientCard lastChainCard = Util.GetLastChainCard(); + // chain to protect + if (lastChainCard != null && lastChainCard.Controller == 0) + { + AI.SelectCard(targetCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + AI.SelectCard(targetCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + public bool FallenOfAlbazSummon() + { + if (CheckAlbazFusion(Card)) + { + summoned = true; + return true; + } + return false; + } + + public bool FallenOfAlbazSet() + { + if (FallenOfAlbazSetCheck()) + { + summoned = true; + return true; + } + return false; + } + + public bool FallenOfAlbazSetCheck() + { + if (!Bot.HasInExtra(CardId.AlbaLenatusTheAbyssDragon) || nadirActivated) return false; + // check dangerous dragon + if (!Bot.HasInSpellZone(CardId.BrandedLost, true, true) || Bot.GetHandCount() < 2) + { + foreach (int dangerId in dangerousDragonIdList) + { + if (Enemy.HasInMonstersZone(dangerId, true, false, true)) + { + return true; + } + } + } + // check dragon count + int dragonCount = Enemy.GetMonsters().Where(c => c != null && c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Dragon)).Count(); + if (dragonCount > 1) + { + return true; + } + return false; + } + + /// + /// Check whether should call albaz. + /// + /// + /// + public bool CheckAlbazFusion(ClientCard exceptCost = null) { + return CheckAlbazFusion(exceptCost, out _); + } + + public bool CheckAlbazFusion(ClientCard exceptCost, out List enemyMonsterList) + { + enemyMonsterList = null; + int costHandCount = Bot.Hand.Where(c => c != exceptCost).Count(); + if (costHandCount <= 0 || Enemy.GetMonsterCount() == 0) return false; + if (CheckWhetherNegated(true, true, CardType.Monster) || activatedCardIdList.Contains(CardId.FallenOfAlbaz) || nadirActivated) return false; + if (!Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon) + && Bot.HasInExtra(CardId.MirrorjadeTheIcebladeDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.AlbaLenatusTheAbyssDragon)) + { + List targetList = Enemy.GetMonsters().Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Dragon)) + .OrderByDescending(c => c.GetDefensePower()).ToList(); + if (targetList.Count > 0) + { + enemyMonsterList = targetList; + return true; + } + } + if (Bot.HasInExtra(CardId.AlbionTheBrandedDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.AlbionTheSanctifireDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light) && c.HasRace(CardRace.SpellCaster)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.LubellionTheSearingDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (costHandCount >= 2 && target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.BorreloadFuriousDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.TitanikladTheAshDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.Attack >= 2500) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.RindbrummTheStrikingDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Beast | CardRace.BeastWarrior | CardRace.WindBeast)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.SprindTheIrondashDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c != null && c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && enemyPlaceThisTurn.Contains(c) && c.IsSpecialSummoned + && c.GetDefensePower() >= Util.GetBestPower(Bot)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + + return false; + } + + public bool FallenOfAlbazActivate() + { + if (Bot.HasInExtra(CardId.AlbaLenatusTheAbyssDragon) && Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(dangerousDragonIdList))) return false; + if (CheckAlbazFusion()) + { + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool SpringansKittSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || enemyActivateLockBird || activatedCardIdList.Contains(Card.Id + 1)) return false; + summoned = true; + return true; + } + + public bool SpringansKittActivate() + { + // spsummon + if (Card.Location == CardLocation.Hand) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + if (CheckShouldNoMoreSpSummon()) + { + bool skipFlag = !summoned; + skipFlag |= activatedCardIdList.Contains(CardId.BrandedFusion); + skipFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + if (skipFlag) + { + return false; + } + } + activatedCardIdList.Add(Card.Id); + return true; + } + // search + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool GuidingQuemTheVirtuousSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + if (activatedCardIdList.Contains(Card.Id)) return false; + summoned = true; + return true; + } + + public bool GuidingQuemTheVirtuousSummonForSearch() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + if (activatedCardIdList.Contains(Card.Id)) return false; + if (Bot.HasInGraveyard(CardId.BrandedRetribution) && CheckRemainInDeck(CardId.BrandedFusion, CardId.BrandedLost, CardId.BrandedInWhite, CardId.BrandedInRed) > 0) + { + summoned = true; + return true; + } + if (Bot.HasInGraveyard(new[] { CardId.BrandedFusion, CardId.BrandedLost, CardId.BrandedBeast }) && CheckRemainInDeck(CardId.BrandedRetribution) > 0) + { + summoned = true; + return true; + } + return false; + } + + public bool GuidingQuemTheVirtuousActivate() + { + int desc = -1; + if (ActivateDescription >= Util.GetStringId(CardId.GuidingQuemTheVirtuous, 0)) + { + desc = ActivateDescription - Util.GetStringId(CardId.GuidingQuemTheVirtuous, 0); + } + Logger.DebugWriteLine("Guiding desc: " + desc.ToString()); + Logger.DebugWriteLine("Guiding timing: " + CurrentTiming.ToString()); + Logger.DebugWriteLine("Guiding flag: " + quemSummonFlag.ToString()); + + // spsummon + if ((ActivateDescription == -1 && quemSummonFlag == 0) || ActivateDescription == Util.GetStringId(CardId.GuidingQuemTheVirtuous, 1)) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + List>> checkList = new List>> + { + new KeyValuePair>(CardId.AlbionTheSanctifireDragon, (c) => c.IsCanRevive() && !activatedCardIdList.Contains(CardId.AlbionTheSanctifireDragon) ), + new KeyValuePair>(CardId.MirrorjadeTheIcebladeDragon, (c) => c.IsCanRevive() ), + new KeyValuePair>(CardId.FallenOfAlbaz, (c) => + { + bool albazCanFusionFlag = CheckAlbazFusion(null, out List materialList); + if (albazCanFusionFlag && !Util.ChainContainsCard(new[] {CardId.AlbionTheBrandedDragon, CardId.LubellionTheSearingDragon}) && !spSummoningAlbaz) + { + bool albazFlag = materialList.Count > 1; + if (materialList.Count > 0) + { + ClientCard material = materialList[0]; + albazFlag |= material.HasType(CardType.Ritual | CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + albazFlag |= material.IsFloodgate() || material.IsOneForXyz() || Util.GetWorstBotMonster().GetDefensePower() < material.Attack; + } + return albazFlag; + } + return false; + } ), + new KeyValuePair>(CardId.AlbionTheBrandedDragon, (c) => c.IsCanRevive() && Bot.HasInSpellZone(CardId.BrandedBeast) + && Bot.MonsterZone.Any(oc => oc != null && oc.IsFaceup() && oc.HasSetcode(SetcodeBystial)) ), + new KeyValuePair>(CardId.BlazingCartesiaTheVirtuous, (c) => Duel.Player == 0 || !activatedCardIdList.Contains(CardId.BlazingCartesiaTheVirtuous + 1) ), + new KeyValuePair>(CardId.TriBrigadeMercourier, (c) => Bot.MonsterZone.Any(oc => oc != null && oc.IsFaceup() && oc.IsCode(albazFusionMonster)) ), + new KeyValuePair>(CardId.AlbionTheSanctifireDragon, (c) => c.IsCanRevive() ), + new KeyValuePair>(CardId.SpringansKitt, (c) => true ) + }; + foreach (KeyValuePair> pair in checkList) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsOriginalCode(pair.Key) && pair.Value(c)); + if (target != null) + { + if (target.IsOriginalCode(CardId.FallenOfAlbaz)) + { + spSummoningAlbaz = true; + } + AI.SelectCard(target); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + // send to GY + if ((ActivateDescription == -1 && quemSummonFlag > 0) || ActivateDescription == Util.GetStringId(CardId.GuidingQuemTheVirtuous, 0)) + { + if (CheckWhetherNegated(true, true, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + quemSummonFlag = 0; + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool BlazingCartesiaTheVirtuousSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + bool checkFlag = Bot.HasInHandOrInSpellZone(CardId.BrandedOpening) && !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && CheckRemainInDeck(CardId.AluberTheJesterOfDespia) > 0; + checkFlag |= Bot.HasInHand(CardId.AlbionTheShroudedDragon) && !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon); + checkFlag |= Bot.HasInHandOrHasInMonstersZone(CardId.BystialSaronir) && !activatedCardIdList.Contains(CardId.BystialSaronir + 1); + if (Bot.HasInExtra(CardId.GranguignolTheDuskDragon)) + { + bool hasMaterial = Bot.Hand.Any(c => c != Card && c.Attack < 2000 && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark)); + hasMaterial |= Bot.MonsterZone.Any(c => c != null && !c.IsCode(cannotBeFusionMaterialIdList) && c.Attack < 2000 && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark)); + checkFlag |= hasMaterial; + } + + if (checkFlag) + { + summoned = true; + return true; + } + + return false; + } + + public bool BlazingCartesiaTheVirtuousActivate() + { + // sp summon + if (Card.Location == CardLocation.Hand) + { + if (CheckShouldNoMoreSpSummon() || CheckWhetherNegated(true, true, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + // fusion + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + if (Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(CardId.BrandedInRed))) return false; + List materialList = Bot.MonsterZone.Where(c => c != null && c.Attack <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + // escape target + ClientCard lastCahinCard = Util.GetLastChainCard(); + if (lastCahinCard != null && Duel.LastChainPlayer == 1) + { + List chainTargetList = Duel.LastChainTargets.Where(c => c.Controller == 0 && c.Location == CardLocation.MonsterZone + && (!c.IsCode(cannotBeFusionMaterialIdList) || c.Attack <= 2500)).ToList(); + if (chainTargetList.Count > 0) + { + if (lastCahinCard.IsCode(targetNegateIdList)) + { + chainTargetList = chainTargetList.Where(c => c.Attack <= 2500).ToList(); + } + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, 0, materialList, chainTargetList, + out ClientCard _fusionTarget, out List usedMaterialList); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion1: " + _fusionTarget.Name); + cartesiaMaterialList.AddRange(usedMaterialList.Intersect(chainTargetList)); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + // fusion shrouded + bool skipShroudedFlag = CheckWhetherCanSummon() && !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && Bot.HasInHand(CardId.AluberTheJesterOfDespia); + skipShroudedFlag |= CheckWhetherCanSummon() && !activatedCardIdList.Contains(CardId.SpringansKitt) && Bot.HasInHand(CardId.SpringansKitt); + if (!skipShroudedFlag) + { + ClientCard shrouded = Duel.CurrentChain.FirstOrDefault(c => c.Controller == 0 && c.Location == CardLocation.Hand && c.IsOriginalCode(CardId.AlbionTheShroudedDragon)); + if (shrouded != null) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, 0, materialList, new List { shrouded }, + out ClientCard _fusionTarget, out List usedMaterialList); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion2: " + _fusionTarget.Name); + cartesiaMaterialList.AddRange(usedMaterialList.Intersect(new List { shrouded })); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + bool shouldActivateFlag = Duel.Player == 0 && !CheckShouldNoMoreSpSummon() || Duel.Player == 1; + + // summon mirrorjade + bool checkMirrorJadeFlag = !(Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) || Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true)) + && shouldActivateFlag; + if (checkMirrorJadeFlag) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, CardId.MirrorjadeTheIcebladeDragon, materialList, null, + out ClientCard _fusionTarget, out _); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion3: " + _fusionTarget.Name); + cartesiaSummonGoal = CardId.MirrorjadeTheIcebladeDragon; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + + // summon dusk dragon + if (shouldActivateFlag && Duel.Player == 0) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.BystialSaronir, () => !activatedCardIdList.Contains(CardId.BystialSaronir + 1) && !DefaultCheckWhetherCardIdIsNegated(CardId.BystialSaronir) }, + {CardId.DespianTragedy, () => !activatedCardIdList.Contains(CardId.DespianTragedy) && !DefaultCheckWhetherCardIdIsNegated(CardId.DespianTragedy) } + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard targetMaterial = materialList.FirstOrDefault(c => c.IsCode(pair.Key)); + if (targetMaterial != null && pair.Value()) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, CardId.GranguignolTheDuskDragon, materialList, new List { targetMaterial }, + out ClientCard _fusionTarget, out List usedMaterialList); + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion4: " + _fusionTarget.Name); + cartesiaSummonGoal = CardId.GranguignolTheDuskDragon; + cartesiaMaterialList.Add(targetMaterial); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + } + + // summon sanctifire + if (shouldActivateFlag) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, CardId.AlbionTheSanctifireDragon, materialList, new List { Card}, + out ClientCard _fusionTarget, out List usedMaterialList); + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion5: " + _fusionTarget.Name); + cartesiaSummonGoal = CardId.AlbionTheSanctifireDragon; + cartesiaMaterialList.Add(Card); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + + if (shouldActivateFlag && GetProblematicEnemyMonster(0, true, true, CardType.Monster) != null) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, CardId.BorreloadFuriousDragon, materialList, null, + out ClientCard _fusionTarget, out _); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion6: " + _fusionTarget.Name); + cartesiaSummonGoal = CardId.BorreloadFuriousDragon; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + + if (shouldActivateFlag) + { + bool checkFlag = Duel.Player == 0 && CurrentTiming == -1; + checkFlag |= Duel.Player == 1 && (CurrentTiming & hintTimingMainEnd) != 0; + if (checkFlag) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, 0, materialList, null, + out ClientCard _fusionTarget, out _); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion7: " + _fusionTarget.Name); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + } + return false; + } + + public bool BlazingCartesiaTheVirtuousActivateInGrave() + { + // recycle + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 2); + return true; + } + return false; + } + + public void BlazingCartesiaTheVirtuousFusionCheck( + IList canSummonList, int mustSummonId, + List materialList, List mustMaterialList, + out ClientCard fusionTarget, out List selectedFusionMaterialList) + { + fusionTarget = null; + selectedFusionMaterialList = new List(); + + Dictionary>> checkDict = new Dictionary>> + { + {CardId.GranguignolTheDuskDragon, new List>{ + (c) => c.IsCode(CardId.BlazingCartesiaTheVirtuous), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) + } }, + {CardId.AlbionTheSanctifireDragon, new List>{ + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light) && c.HasRace(CardRace.SpellCaster) + } }, + {CardId.MirrorjadeTheIcebladeDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) + } }, + {CardId.AlbionTheBrandedDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light) + } }, + {CardId.LubellionTheSearingDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) + } }, + {CardId.DespianQuaeritis, new List> + { + (c) => c.HasSetcode(SetcodeDespain), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) + } }, + {CardId.BorreloadFuriousDragon, new List> + { + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon) + } } + }; + Dictionary> extraCheckDict = new Dictionary> + { + {CardId.AlbionTheSanctifireDragon, (c1, c2) => + { + int reviveCount = Bot.Graveyard.Count(c => c != null && c.IsMonster() && c.IsCanRevive()); + reviveCount += Enemy.Graveyard.Count(c => c != null && c.IsMonster() && c.IsCanRevive()); + if (!CheckWhetherWillbeRemoved() || + (CurrentTiming & hintTimingMainEnd) > 0 && Util.GetOneEnemyBetterThanValue(Card.GetDefensePower()) != null + && Util.GetOneEnemyBetterThanValue(3000) == null) + { + reviveCount += 2; + } + return reviveCount >= 2; + } }, + {CardId.LubellionTheSearingDragon, (c1, c2) => Bot.Hand.Count(c => c != c1 && c != c2) > 0 }, + {CardId.MirrorjadeTheIcebladeDragon, (c1, c2) => !CheckWhetherWillbeRemoved() && + !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) } + }; + + foreach (KeyValuePair>> pair in checkDict) + { + if (mustSummonId > 0 && mustSummonId != pair.Key) continue; + ClientCard currentFusionTarget = canSummonList.FirstOrDefault(c => c != null && c.IsCode(pair.Key)); + if (currentFusionTarget == null) continue; + Func fusionFunc1 = pair.Value[0]; + Func fusionFunc2 = pair.Value[1]; + + if (mustMaterialList != null && mustMaterialList.Count > 0) + { + foreach (ClientCard mustMaterial in mustMaterialList) + { + if (!fusionFunc1(mustMaterial) && !fusionFunc2(mustMaterial)) continue; + foreach (ClientCard anotherMaterial in materialList) + { + if (anotherMaterial == mustMaterial) continue; + bool checkFlag = fusionFunc1(mustMaterial) && fusionFunc2(anotherMaterial); + checkFlag |= fusionFunc2(mustMaterial) && fusionFunc1(anotherMaterial); + extraCheckDict.TryGetValue(pair.Key, out Func extraCheckFunc); + checkFlag &= (extraCheckFunc == null || extraCheckFunc(mustMaterial, anotherMaterial)); + if (checkFlag) + { + fusionTarget = currentFusionTarget; + selectedFusionMaterialList.Add(mustMaterial); + selectedFusionMaterialList.Add(anotherMaterial); + return; + } + } + } + } + else + { + for (int index1 = 0; index1 < materialList.Count - 1; ++index1) + { + ClientCard material1 = materialList[index1]; + if (!fusionFunc1(material1) && !fusionFunc2(material1)) continue; + for (int index2 = index1 + 1; index2 < materialList.Count; ++index2) + { + ClientCard material2 = materialList[index2]; + bool checkFlag = fusionFunc1(material1) && fusionFunc2(material2); + checkFlag |= fusionFunc2(material1) && fusionFunc1(material2); + extraCheckDict.TryGetValue(pair.Key, out Func extraCheckFunc); + checkFlag &= (extraCheckFunc == null || extraCheckFunc(material1, material2)); + if (checkFlag) + { + fusionTarget = currentFusionTarget; + selectedFusionMaterial.Add(material1); + selectedFusionMaterial.Add(material2); + return; + } + } + } + } + } + } + + public bool TriBrigadeMercourierActivate() + { + // negate + if (Card.Location == CardLocation.Hand || Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, false, CardType.Monster) || !CheckLastChainShouldNegated()) return false; + if (Util.GetLastChainCard().Location == CardLocation.MonsterZone) currentNegateCardList.Add(Util.GetLastChainCard()); + activatedCardIdList.Add(Card.Id); + return true; + } + // search + if (Card.Location == CardLocation.Removed) + { + return false; + } + return false; + } + + public bool TriBrigadeMercourierActivateForSearch() + { + // negate + if (Card.Location == CardLocation.Hand || Card.Location == CardLocation.MonsterZone) + { + return false; + } + // search + if (Card.Location == CardLocation.Removed) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + return false; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC)) return false; + if (DefaultAshBlossomAndJoyousSpring()) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard.Location == CardLocation.MonsterZone || lastChainCard.Location == CardLocation.SpellZone) currentNegateCardList.Add(Util.GetLastChainCard()); + return true; + } + return false; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool DespianTragedyActivate() + { + // search + if (ActivateDescription != Util.GetStringId(Card.Id, 1)) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + // set + else { + if (CheckWhetherNegated(true, false, CardType.Trap)) return false; + Dictionary> checkDict = new Dictionary>{ + {CardId.BrandedFusion, () => BrandedFusionActivateCheck()}, + {CardId.BrandedLost, () => { + if (Duel.Player == 0 && Duel.Phase >= DuelPhase.End) return false; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) && BrandedFusionActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null) return true; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion()) return true; + if ((Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) || (!summoned && Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous)))) return true; + return false; + } }, + {CardId.BrandedInHighSpirits, BrandedInHighSpiritsActivateCheck}, + {CardId.BrandedInRed, () => BrandedInRedActivateCheck() != null }, + {CardId.BrandedInWhite, BrandedInWhiteActivateCheck }, + {CardId.BrightestBlazingBrandedKing, () => Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedOpening, () => Bot.Hand.Count > 2 && !activatedCardIdList.Contains(CardId.BrandedOpening) } + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + activatedCardIdList.Add(Card.Id); + AI.SelectCard(target); + SelectSTPlace(target, true); + return true; + } + } + } + return false; + } + + public bool DespianTragedySet() + { + if (Bot.Graveyard.Any(c => c != null && c.HasType(CardType.Spell | CardType.Trap) && c.HasSetcode(SetcodeBranded))) + { + summoned = true; + return true; + } + + return false; + } + + public bool NadirServantActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell) || CheckWhetherWillbeRemoved()) return false; + bool checkResult = NadirServantActivateCheck(null, false, out _); + if (checkResult) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool NadirServantActivateCheck(IList cards, bool force, out ClientCard target) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.AlbionTheBrandedDragon, () => !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) }, + {CardId.DespianLuluwalilith, () => CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous, CardId.GuidingQuemTheVirtuous) > 0 }, + {CardId.TitanikladTheAshDragon, () => CheckRemainInDeck(CardId.GuidingQuemTheVirtuous) > 0 }, + {CardId.SprindTheIrondashDragon, () => CheckRemainInDeck(CardId.SpringansKitt) > 0 }, + {CardId.RindbrummTheStrikingDragon, () => Bot.Graveyard.Any(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)) }, + {CardId.AlbaLenatusTheAbyssDragon, () => force && CheckRemainInDeck(CardId.FusionDeployment, CardId.BrandedFusion) > 0 }, + {CardId.GranguignolTheDuskDragon, () => force}, + }; + + foreach (KeyValuePair> pair in checkDict) + { + if (cards == null) + { + if (Bot.HasInExtra(pair.Key) && pair.Value()) + { + target = null; + return true; + } + } else + { + ClientCard tg = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (tg != null && pair.Value()) + { + target = tg; + return true; + } + } + } + + target = null; + return false; + } + + public bool FusionDeploymentActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + if (FusionDeploymentSpSummonTarget() > 0 && !Bot.HasInHand(CardId.BrandedLost)) + { + SelectSTPlace(Card, true); + return true; + } + + return false; + } + + public int FusionDeploymentSpSummonTarget() + { + if (CheckRemainInDeck(CardId.FallenOfAlbaz) > 0 && CheckAlbazFusion(Card) && GetProblematicEnemyMonster(0, false, false, CardType.Monster) != null) + { + return CardId.FallenOfAlbaz; + } + if (CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous) > 0 && Bot.HasInExtra(CardId.GranguignolTheDuskDragon)) + { + if (Bot.Hand.Any(c => c.IsMonster() && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark)) + || Bot.GetMonsters().Any(c => c.IsMonster() && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) && !c.IsCode(cannotBeFusionMaterialIdList))) + { + return CardId.BlazingCartesiaTheVirtuous; + } + } + if (CheckRemainInDeck(CardId.FallenOfAlbaz) > 0 && CheckAlbazFusion(Card)) + { + return CardId.FallenOfAlbaz; + } + return 0; + } + + public bool BrandedInWhiteActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Spell)) return false; + activatedCardIdList.Add(Card.Id + 1); + SelectSTPlace(Card); + return true; + } else + { + if (_BrandedInWhiteActivateCheck(true)) + { + activatedCardIdList.Add(Card.Id); + SelectSTPlace(Card, true); + return true; + } + } + return false; + } + + public bool BrandedInWhiteActivateCheck() + { + return _BrandedInWhiteActivateCheck(false); + } + + public bool _BrandedInWhiteActivateCheck(bool activate = false) + { + if (CheckWhetherNegated(true, true, CardType.Spell) || activatedCardIdList.Contains(CardId.BrandedInWhite) || nadirActivated) return false; + if (CheckShouldNoMoreSpSummon() && Bot.MonsterZone.Any(c => c != null && c.GetDefensePower() >= 2000)) return false; + if (BrandedInWhiteFusionTarget(Bot.ExtraDeck, out ClientCard _fusionTarget) > 0) + { + if (activate) Logger.DebugWriteLine("White prepare fusion: " + _fusionTarget?.Name); + return true; + } + + return false; + } + + public int BrandedInWhiteFusionTarget(IList cards, out ClientCard target) + { + target = null; + Dictionary> checkDict = new Dictionary> + { + {CardId.MirrorjadeTheIcebladeDragon, () => { + if (Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) || Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true)) return false; + bool albazFlag = Bot.Graveyard.Any(c => c.IsCode(CardId.FallenOfAlbaz)); + albazFlag |= Bot.MonsterZone.Any(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)); + albazFlag |= Bot.Hand.Any(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (!albazFlag) return false; + + bool checkFlag = Bot.Graveyard.Any(c => c != null && !sendToGYThisTurn.Contains(c) && !c.IsCode(cannotBeFusionMaterialIdList) + && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + checkFlag |= Bot.MonsterZone.Any(c => c != null && !c.IsCode(cannotBeFusionMaterialIdList) + && (c.IsCode(albazFusionMonster) || c.IsCode(CardId.GranguignolTheDuskDragon))); + return checkFlag; + } }, + {CardId.BorreloadFuriousDragon, () => { + if (Enemy.GetMonsterCount() + Enemy.GetSpellCount() > 0) + { + List darkDragonList = Bot.Hand.Where(c => c != null && c.IsMonster() && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon)).ToList(); + darkDragonList.AddRange(Bot.MonsterZone.Where(c => c != null && c.IsMonster() && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon) && !c.IsCode(cannotBeFusionMaterialIdList)).ToList()); + List graveDarkDragonList = Bot.Graveyard.Where(c => c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) + && !c.IsCode(cannotBeFusionMaterialIdList) && !CheckWhetherShouldKeepInGrave(c) ).ToList(); + + bool hasAlbaz = darkDragonList.Any(c => c.IsCode(CardId.FallenOfAlbaz)) || graveDarkDragonList.Any(c => c.IsCode(CardId.FallenOfAlbaz)); + int darkDragonCount = darkDragonList.Count; + if (hasAlbaz) + { + darkDragonCount += graveDarkDragonList.Count; + } + return darkDragonCount >= 2; + } + return false; + } }, + {CardId.GuardianChimera, () => + { + if (CheckWhetherNegated(true, true, CardType.Monster) || DefaultCheckWhetherCardIdIsNegated(CardId.GuardianChimera)) return false; + int enemyCardCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (enemyCardCount == 0) return false; + + return ChimeraFusionMaterialList().Count > 0; + } }, + {CardId.LubellionTheSearingDragon, () => + { + if (activatedCardIdList.Contains(CardId.LubellionTheSearingDragon) + || DefaultCheckWhetherCardIdIsNegated(CardId.LubellionTheSearingDragon) + || CheckWhetherNegated(true, true, CardType.Monster)) + { + return false; + } + List checkMaterialList = new List(Bot.Graveyard.Where(c => c != null && c.IsMonster()).OrderBy(c => c.GetDefensePower())).ToList(); + checkMaterialList.AddRange(Bot.GetMonsters().OrderBy(c => c.GetDefensePower())); + checkMaterialList.AddRange(Bot.Hand); + ClientCard albaz = checkMaterialList.Where(c => c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + ClientCard darkMonster = checkMaterialList.Where(c => c != albaz && c.HasAttribute(CardAttribute.Dark)).FirstOrDefault(); + if (albaz == null || darkMonster == null) return false; + if (Bot.Hand.Count(c => c != albaz && c != darkMonster && !c.IsCode(CardId.BrandedInWhite)) == 0) return false; + + return true; + } }, + {CardId.AlbionTheSanctifireDragon, () => + { + List checkMaterialList = new List(Bot.Graveyard.Where(c => c != null && c.IsMonster()).OrderBy(c => c.GetDefensePower())).ToList(); + checkMaterialList.AddRange(Bot.GetMonsters().OrderBy(c => c.GetDefensePower())); + checkMaterialList.AddRange(Bot.Hand); + ClientCard albaz = checkMaterialList.FirstOrDefault(c => c.IsCode(CardId.FallenOfAlbaz)); + ClientCard lightSpellcaster = checkMaterialList.FirstOrDefault(c => c.HasRace(CardRace.SpellCaster) && c.HasAttribute(CardAttribute.Light)); + if (albaz == null || lightSpellcaster == null) return false; + + int remainMonsterCount = Enemy.GetGraveyardMonsters().Count; + remainMonsterCount += Bot.Graveyard.Where(c => c.IsMonster() && c != albaz && c != lightSpellcaster).Count(); + remainMonsterCount += Bot.HasInHand(_CardId.MaxxC) ? 1 : 0; + return remainMonsterCount >= 2; + } }, + {CardId.RindbrummTheStrikingDragon, () => { + if (!Bot.HasInGraveyard(CardId.TriBrigadeMercourier)) return false; + bool albazCheck = Bot.HasInHandOrHasInMonstersZone(CardId.FallenOfAlbaz); + albazCheck |= Bot.HasInGraveyard(CardId.FallenOfAlbaz); + return albazCheck; + } }, + {CardId.DespianQuaeritis, () => + { + bool checkFlag = Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.Attack >= 2500 && !(c.HasType(CardType.Fusion) && c.Level >= 8)); + if (checkFlag) + { + ClientCard despianInGrave = Bot.Graveyard.Where(c => c != null && c.HasSetcode(SetcodeDespain) && !CheckWhetherShouldKeepInGrave(c)) + .OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (despianInGrave != null) + { + bool albazCheck = Bot.HasInHandOrHasInMonstersZone(CardId.FallenOfAlbaz); + albazCheck |= Bot.HasInGraveyard(CardId.FallenOfAlbaz); + return albazCheck; + } + List fusionMaterialList = Bot.Hand.Where(c => c.IsMonster()).OrderBy(c => c.GetDefensePower()).ToList(); + fusionMaterialList.AddRange(Bot.MonsterZone.Where(c => c != null && !c.IsCode(cannotBeFusionMaterialIdList)).OrderBy(c => c.GetDefensePower()).ToList()); + ClientCard despian = fusionMaterialList.FirstOrDefault(c => c.HasSetcode(SetcodeDespain)); + if (despian != null) + { + checkFlag = fusionMaterialList.Any(c => c != despian && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark)); + checkFlag |= Bot.HasInGraveyard(CardId.FallenOfAlbaz); + return checkFlag; + } + } + + return false; + } }, + {CardId.TitanikladTheAshDragon, () => + { + List checkMaterialList = new List(Bot.Graveyard.Where(c => c != null && c.IsMonster()).OrderBy(c => c.GetDefensePower())).ToList(); + checkMaterialList.AddRange(Bot.GetMonsters().OrderBy(c => c.GetDefensePower())); + checkMaterialList.AddRange(Bot.Hand); + ClientCard albaz = checkMaterialList.Where(c => c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + + foreach (ClientCard material in checkMaterialList) + { + if (material != albaz && material.IsMonster() && material.Attack >= 2500 && !material.IsCode(cannotBeFusionMaterialIdList) && !Util.IsTurn1OrMain2()) + { + bool checkFlag = Enemy.GetMonsterCount() == 0 && !CheckWhetherShouldKeepInGrave(material) && (material.IsFacedown() || material.Location != CardLocation.MonsterZone); + + int expectedAttack = 2900 + material.Level * 100; + int botBestPower = Util.GetBestPower(Bot); + int beforeBetterCount = Enemy.MonsterZone.Count(c => c != null && c.GetDefensePower() >= botBestPower); + int afterBetterCount = Enemy.MonsterZone.Count(c => c != null && c.GetDefensePower() >= expectedAttack); + checkFlag |= afterBetterCount < beforeBetterCount; + + return checkFlag; + } + } + return false; + } }, + {CardId.AlbaLenatusTheAbyssDragon, () => + { + if (Util.GetOneEnemyBetterThanMyBest() == null && Duel.MainPhase.CanBattlePhase) + { + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (albaz == null) + { + albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz)); + } + if (albaz == null) return false; + foreach (ClientCard material in Bot.Graveyard) + { + if (material != null && material != albaz && material.IsMonster() && material.HasRace(CardRace.Dragon) && !material.IsCode(cannotBeFusionMaterialIdList)) + { + return true; + } + } + } + return false; + } } + }; + + foreach (KeyValuePair> pair in checkDict) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return pair.Key; + } + } + + target = null; + return 0; + } + + public List ChimeraFusionMaterialList(bool dragonCheck = true) + { + int enemyCardCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + + List fieldMonsterList = Bot.MonsterZone.Where(c => c != null && c.GetDefensePower() <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)) + .OrderBy(c => c.GetDefensePower()).ToList(); + List handMonsterList = Bot.Hand.Where(c => c.IsMonster()) + .OrderBy(c => c.GetDefensePower()).ToList(); + // 2 monsters on field + 1 monster in hand + if (enemyCardCount >= 2 && fieldMonsterList.Count >= 2) + { + if (fieldMonsterList.Count < 2 || handMonsterList.Count < 1) return new List() ; + foreach (ClientCard handMonster in handMonsterList) + { + for (int fieldIndex1 = 0; fieldIndex1 < fieldMonsterList.Count - 1; ++fieldIndex1) + { + ClientCard fieldMonster1 = fieldMonsterList[fieldIndex1]; + if (fieldMonster1.IsCode(handMonster.Id) || handMonster.IsCode(fieldMonster1.Id)) continue; + for (int fieldIndex2 = fieldIndex1 + 1; fieldIndex2 < fieldMonsterList.Count; ++fieldIndex2) + { + ClientCard fieldMonster2 = fieldMonsterList[fieldIndex2]; + if (fieldMonster2.IsCode(handMonster.Id) || handMonster.IsCode(fieldMonster2.Id)) continue; + if (fieldMonster2.IsCode(fieldMonster1.Id) || fieldMonster1.IsCode(fieldMonster2.Id)) continue; + + List materialList = new List { handMonster, fieldMonster1, fieldMonster2 }; + bool checkFlag = dragonCheck && materialList.Any(c => c.HasRace(CardRace.Dragon)); + if (checkFlag) + { + return materialList; + } + } + } + } + } + // 1 monster on field + 2 monsters in hand + if (enemyCardCount == 1 || fieldMonsterList.Count == 1) + { + if (fieldMonsterList.Count < 1 || handMonsterList.Count < 2) return new List(); + foreach (ClientCard fieldMonster in fieldMonsterList) + { + for (int handIndex1 = 0; handIndex1 < handMonsterList.Count - 1; ++handIndex1) + { + ClientCard handMonster1 = handMonsterList[handIndex1]; + if (handMonster1.IsCode(fieldMonster.Id) || fieldMonster.IsCode(handMonster1.Id)) continue; + for (int handIndex2 = handIndex1 + 1; handIndex2 < handMonsterList.Count; ++handIndex2) + { + ClientCard handMonster2 = handMonsterList[handIndex2]; + if (handMonster2.IsCode(fieldMonster.Id) || fieldMonster.IsCode(handMonster2.Id)) continue; + if (handMonster2.IsCode(handMonster1.Id) || handMonster1.IsCode(handMonster2.Id)) continue; + + List materialList = new List { fieldMonster, handMonster1, handMonster2 }; + bool checkFlag = dragonCheck && materialList.Any(c => c.HasRace(CardRace.Dragon)); + if (checkFlag) + { + return materialList; + } + } + } + } + } + + return new List(); + } + + public bool BrandedFusionActivate() + { + if (BrandedFusionActivateCheck()) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool BrandedFusionActivateCheck(bool endPhaseCheck = true) + { + if (CheckWhetherNegated(true, true, CardType.Spell) || activatedCardIdList.Contains(CardId.BrandedFusion)) return false; + if (!Bot.HasInHandOrHasInMonstersZone(CardId.FallenOfAlbaz) && CheckRemainInDeck(CardId.FallenOfAlbaz) == 0) return false; + if (endPhaseCheck && Duel.Phase >= DuelPhase.End) return false; + return true; + } + + public bool GoldSarcophagusActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + if (GoldSarcophagusTarget(null, out _) > 0) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public int GoldSarcophagusTarget(IList cards, out ClientCard target) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.DespianTragedy, () => !activatedCardIdList.Contains(CardId.DespianTragedy) && !DefaultCheckWhetherCardIdIsNegated(CardId.DespianTragedy) }, + {CardId.TriBrigadeMercourier, () => !activatedCardIdList.Contains(CardId.TriBrigadeMercourier + 1) && !DefaultCheckWhetherCardIdIsNegated(CardId.TriBrigadeMercourier) } + }; + foreach (KeyValuePair> pair in checkDict) + { + int cardId = pair.Key; + if (pair.Value()) + { + if (cards != null) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return cardId; + } + } + else if (CheckRemainInDeck(cardId) > 0) + { + target = null; + return cardId; + } + } + } + + target = null; + return 0; + } + + public bool FoolishBurialActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell) || CheckWhetherWillbeRemoved()) return false; + if (FoolishBurialTarget(null, out _) > 0) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public int FoolishBurialTarget(IList cards, out ClientCard target) + { + // tragedy + if (!activatedCardIdList.Contains(CardId.DespianTragedy) && !DefaultCheckWhetherCardIdIsNegated(CardId.DespianTragedy)) + { + if (cards != null) + { + target = cards.FirstOrDefault(c => c.IsCode(CardId.DespianTragedy)); + if (target != null) + { + return CardId.DespianTragedy; + } + } else + { + if (CheckRemainInDeck(CardId.DespianTragedy) > 0) + { + target = null; + return CardId.DespianTragedy; + } + } + } + + // send to GY check + bool sendToGYFlag = CheckRemainInDeck(CardId.BrandedRetribution) > 0; + sendToGYFlag |= Bot.HasInGraveyard(CardId.BrandedRetribution) && CheckRemainInDeck(CardId.BrandedFusion) > 0; + if (sendToGYFlag) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.BystialSaronir, () => !activatedCardIdList.Contains(CardId.BystialSaronir + 1) && !DefaultCheckWhetherCardIdIsNegated(CardId.BystialSaronir) }, + {CardId.AlbionTheShroudedDragon, () => !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon) && !DefaultCheckWhetherCardIdIsNegated(CardId.AlbionTheShroudedDragon) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + int cardId = pair.Key; + if (pair.Value()) + { + if (cards != null) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return cardId; + } + } else if (CheckRemainInDeck(cardId) > 0) + { + target = null; + return cardId; + } + } + } + } + + // albaz + if (!Bot.HasInGraveyard(CardId.FallenOfAlbaz)) + { + bool albazCheckFlag = Bot.HasInHand(new List { CardId.BrandedInRed, CardId.BrandedInWhite }); + albazCheckFlag |= Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous) && Bot.MonsterZone.Count(c => c != null && c.Sequence < 5) < 5; + if (albazCheckFlag) + { + int albazCountCheck = Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) ? 2 : 1; + if (cards != null) + { + List albazList = cards.Where(c => c.IsCode(CardId.FallenOfAlbaz)).ToList(); + if (albazList.Count >= albazCountCheck) + { + target = albazList.First(); + return CardId.FallenOfAlbaz; + } + } else + { + if (CheckRemainInDeck(CardId.FallenOfAlbaz) >= albazCountCheck) + { + target = null; + return CardId.FallenOfAlbaz; + } + } + } + } + + target = null; + return 0; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + // negate + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentDestroyCardList.Add(graveTarget); + return true; + } + } + + // banish target + foreach (ClientCard graveCard in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(graveCard) && graveCard.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = graveCard.Id; + AI.SelectCard(graveCard); + currentDestroyCardList.Add(graveCard); + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentDestroyCardList.Add(enemyMonsters[0]); + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count > 0) + { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentDestroyCardList.Add(targets[0]); + return true; + } + + return false; + } + + public bool BrandedInHighSpiritsActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Spell)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } else + { + if (BrandedInHighSpiritsActivateCheck()) + { + activatedCardIdList.Add(Card.Id); + SelectSTPlace(Card, true); + return true; + } + } + return false; + } + + public bool BrandedInHighSpiritsActivateCheck() + { + bool lubellionCheck = Bot.HasInHand(CardId.TheBystialLubellion) && CheckRemainInDeck(CardId.BystialSaronir) > 0 && !activatedCardIdList.Contains(CardId.TheBystialLubellion) + && Duel.Player == 0 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && !CheckWhetherWillbeRemoved(); + + if (CheckWhetherNegated(true, true, CardType.Spell) || activatedCardIdList.Contains(CardId.BrandedInHighSpirits) || CheckWhetherWillbeRemoved()) return false; + Dictionary> checkDict = new Dictionary> + { + {CardId.AlbionTheBrandedDragon, () => !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) && !lubellionCheck + && Bot.Hand.Any(c => BrandedInHighSpiritDiscardDragonCheck(c) ) }, + {CardId.TitanikladTheAshDragon, () => !sendToGYThisTurn.Any(c => c.IsCode(CardId.TitanikladTheAshDragon)) && !lubellionCheck + && Bot.Hand.Any(c => BrandedInHighSpiritDiscardDragonCheck(c) ) + && CheckRemainInDeck(CardId.GuidingQuemTheVirtuous, CardId.FallenOfAlbaz) > 0}, + {CardId.GranguignolTheDuskDragon, () => Bot.Hand.Any(c => c.HasRace(CardRace.SpellCaster) && !(CheckWhetherCanSummon() && c.IsOriginalCode(CardId.GuidingQuemTheVirtuous))) }, + {CardId.RindbrummTheStrikingDragon, () => Bot.Hand.Any(c => c.HasRace(CardRace.WindBeast) + && (!c.IsCode(CardId.TriBrigadeMercourier) || !Bot.MonsterZone.Any(c2 => c2 != null && c2.IsFaceup() && c2.IsCode(albazFusionMonster)))) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + if (Bot.HasInExtra(pair.Key) && pair.Value()) + { + return true; + } + } + return false; + } + + public bool BrandedInHighSpiritDiscardDragonCheck(ClientCard card) + { + if (!card.HasRace(CardRace.Dragon)) return false; + if (Duel.Player == 0 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2)) + { + if (card.IsOriginalCode(CardId.AlbionTheShroudedDragon) && !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon)) return false; + if (card.IsOriginalCode(CardId.TheBystialLubellion) && !activatedCardIdList.Contains(CardId.TheBystialLubellion) && CheckRemainInDeck(CardId.BystialSaronir) > 0) return false; + } + + return true; + } + + public bool BrandedOpeningActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + if (Duel.Player == 0) + { + if (Bot.HasInHand(CardId.AlbionTheShroudedDragon) && !CheckWhetherWillbeRemoved() && !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon)) return false; + bool canCallCartesia = Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous) && !summoned; + canCallCartesia |= !activatedCardIdList.Contains(CardId.FusionDeployment) && Bot.HasInHandOrInSpellZone(CardId.FusionDeployment) + && !CheckShouldNoMoreSpSummon() && Bot.HasInExtra(CardId.GranguignolTheDuskDragon) && CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous) > 0; + if (canCallCartesia) return false; + } + bool goal = CheckRemainInDeck(CardId.AluberTheJesterOfDespia) > 0 && !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && !enemyActivateLockBird; + goal |= CheckRemainInDeck(CardId.GuidingQuemTheVirtuous) > 0; + if (goal) + { + SelectSTPlace(Card, true); + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + // negate + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + return true; + } + } + return false; + } + + public bool BrandedInRedActivate() + { + ClientCard targetCard = BrandedInRedActivateCheck(true); + if (targetCard != null) + { + AI.SelectCard(targetCard); + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public ClientCard BrandedInRedActivateCheck(bool updateMaterialList = false) + { + if (CheckWhetherNegated(true, true, CardType.Spell) || activatedCardIdList.Contains(CardId.BrandedInRed)) return null; + if (Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(CardId.BlazingCartesiaTheVirtuous))) return null; + if (Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(CardId.AlbionTheBrandedDragon)) + && !Util.ChainContainPlayer(1)) return null; + if (nadirActivated) return null; + + List materialList = Bot.MonsterZone.Where(c => c != null && c.Attack <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + List graveTargetList = Bot.Graveyard.Where(c => c != null && c.IsMonster() && !c.HasType(CardType.Fusion | CardType.Synchro) + && (c.IsCode(CardId.FallenOfAlbaz) || c.HasSetcode(SetcodeDespain))).ToList(); + + // select targeted monster + if (Duel.LastChainPlayer == 1) + { + // escape grave monster + List targetedList = Duel.LastChainTargets.Where(c => c != null && c.Location == CardLocation.Grave && c.Controller == 0 + && !c.HasType(CardType.Fusion | CardType.Synchro) && (c.IsCode(CardId.FallenOfAlbaz) || c.HasSetcode(SetcodeDespain))).ToList(); + + if (targetedList.Count > 0) + { + foreach (ClientCard target in targetedList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, 0, newMaterialList, new List { target }, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + if (updateMaterialList) Logger.DebugWriteLine("Red prepare fusion 1: " + _fusionTarget.Name); + return target; + } + } + } + + // escape target + ClientCard lastCahinCard = Util.GetLastChainCard(); + if (lastCahinCard != null) + { + List chainTargetList = Duel.LastChainTargets.Where(c => c.Controller == 0 && c.Location == CardLocation.MonsterZone + && (!c.IsCode(cannotBeFusionMaterialIdList) || c.Attack <= 2500)).ToList(); + if (chainTargetList.Count > 0) + { + if (lastCahinCard.IsCode(targetNegateIdList)) + { + chainTargetList = chainTargetList.Where(c => c.Attack <= 2500 && !c.IsCode(CardId.AlbionTheBrandedDragon)).ToList(); + } + + foreach (ClientCard target in graveTargetList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, 0, newMaterialList, chainTargetList, + out ClientCard _fusionTarget, out List usedMaterialList); + + if (_fusionTarget != null) + { + if (updateMaterialList) + { + Logger.DebugWriteLine("Red prepare fusion 2: " + _fusionTarget.Name); + brandedInRedMaterialList.AddRange(usedMaterialList.Intersect(chainTargetList)); + } + return target; + } + } + } + } + } + + bool shouldSummonFirst = Duel.Player == 0 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && !summoned + && (Bot.HasInHand(new int[] { CardId.AluberTheJesterOfDespia, CardId.GuidingQuemTheVirtuous, CardId.SpringansKitt }) + || Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion(Card)); + bool idleFlag = Duel.Player == 1 || CurrentTiming == -1; + + if (shouldSummonFirst || !idleFlag) return null; + + // for fusion searing dragon + if (!Bot.MonsterZone.Any(c => c != null && c.HasType(CardType.Fusion)) && Duel.LastChainPlayer != 0 + && !CheckWhetherNegated(true, true, CardType.Monster) && !activatedCardIdList.Contains(CardId.LubellionTheSearingDragon)) + { + foreach (ClientCard target in graveTargetList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, CardId.LubellionTheSearingDragon, newMaterialList, new List { target }, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + return target; + } + } + } + + // remove cards + List problemCardList = GetProblematicEnemyCardList(false, false, CardType.Monster); + if (problemCardList.Count > 0 || (Duel.Phase == DuelPhase.End && Duel.Player == 1)) + { + if (!enemyActivateLockBird) + { + foreach (ClientCard target in graveTargetList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, CardId.GuardianChimera, newMaterialList, new List { target }, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + if (updateMaterialList) Logger.DebugWriteLine("Red prepare fusion 3: " + _fusionTarget.Name); + return target; + } + } + } + + foreach (ClientCard target in graveTargetList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, CardId.BorreloadFuriousDragon, newMaterialList, new List { target }, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + if (updateMaterialList) Logger.DebugWriteLine("Red prepare fusion 4: " + _fusionTarget.Name); + return target; + } + } + } + + return null; + } + + public void BrandedInRedFusionCheck( + IList canSummonList, int mustSummonId, + List materialList, List mustMaterialList, + out ClientCard fusionTarget, out List selectedFusionMaterialList) + { + fusionTarget = null; + selectedFusionMaterialList = new List(); + + // fusion id + // material condition + // extra check function + // search material function + List>, + Func, bool>, + Func, List, List>, Func, bool>, List> + >> checkTupleList = new List>, Func, bool>, + Func, List, List>, Func, bool>, List> + >> + { + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.MirrorjadeTheIcebladeDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) + }, + (l) => !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true), + BrandedInRedUsing2SubFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.LubellionTheSearingDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) + }, + (l) => !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) + && Bot.Hand.Count(c => !l.Contains(c)) > 0 && !activatedCardIdList.Contains(CardId.LubellionTheSearingDragon), + BrandedInRedUsing2SubFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.GuardianChimera, + null, + null, + BrandedInRedForChimeraFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.DespianQuaeritis, new List> + { + (c) => c.HasSetcode(SetcodeDespain), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) + }, + null, + BrandedInRedUsing2SubFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.BorreloadFuriousDragon, new List> + { + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon) + }, + null, + BrandedInRedUsing2SubFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.AlbionTheSanctifireDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light) && c.HasRace(CardRace.SpellCaster) + }, + (l) => Enemy.Graveyard.Count(c => c != null && c.IsMonster() && c.IsCanRevive()) + + Bot.Graveyard.Count(c => c != null && !l.Contains(c)) >= 2, + BrandedInRedUsing2SubFunc + ), + }; + + foreach (Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>> tuple in checkTupleList) + { + if (mustSummonId > 0 && mustSummonId != tuple.Item1) continue; + ClientCard currentFusionTarget = canSummonList.FirstOrDefault(c => c != null && c.IsCode(tuple.Item1)); + if (currentFusionTarget == null) continue; + Func, List, List>, Func, bool>, List> materialFunc = tuple.Item4; + + List currentMaterialList = materialFunc(materialList, mustMaterialList, tuple.Item2, tuple.Item3); + if (currentMaterialList.Count > 0) + { + fusionTarget = currentFusionTarget; + selectedFusionMaterialList = currentMaterialList; + return; + } + } + } + + public List BrandedInRedUsing2SubFunc(List materialList, List mustMaterialList, + List> checkFuncList, Func, bool> extraCheckFunc) + { + List selectedFusionMaterialList = new List(); + + Func fusionFunc1 = checkFuncList[0]; + Func fusionFunc2 = checkFuncList[1]; + + if (mustMaterialList != null && mustMaterialList.Count > 0) + { + foreach (ClientCard mustMaterial in mustMaterialList) + { + if (!fusionFunc1(mustMaterial) && !fusionFunc2(mustMaterial)) continue; + foreach (ClientCard anotherMaterial in materialList) + { + if (anotherMaterial == mustMaterial) continue; + bool checkFlag = fusionFunc1(mustMaterial) && fusionFunc2(anotherMaterial); + checkFlag |= fusionFunc2(mustMaterial) && fusionFunc1(anotherMaterial); + checkFlag &= (extraCheckFunc == null || extraCheckFunc(new List { mustMaterial, anotherMaterial })); + if (checkFlag) + { + selectedFusionMaterialList.Add(mustMaterial); + selectedFusionMaterialList.Add(anotherMaterial); + return selectedFusionMaterialList; + } + } + } + } + else + { + for (int index1 = 0; index1 < materialList.Count - 1; ++index1) + { + ClientCard material1 = materialList[index1]; + if (!fusionFunc1(material1) && !fusionFunc2(material1)) continue; + for (int index2 = index1 + 1; index2 < materialList.Count; ++index2) + { + ClientCard material2 = materialList[index2]; + bool checkFlag = fusionFunc1(material1) && fusionFunc2(material2); + checkFlag |= fusionFunc2(material1) && fusionFunc1(material2); + checkFlag &= (extraCheckFunc == null || extraCheckFunc(new List { material1, material2 })); + if (checkFlag) + { + selectedFusionMaterial.Add(material1); + selectedFusionMaterial.Add(material2); + return selectedFusionMaterialList; + } + } + } + } + + return selectedFusionMaterial; + } + + public List BrandedInRedForChimeraFunc(List materialList, List mustMaterialList, + List> checkFuncList, Func, bool> extraCheckFunc) + { + List selectedFusionMaterialList = new List(); + + int enemyCardCount = Enemy.MonsterZone.Count(c => c != null); + enemyCardCount += Enemy.SpellZone.Count(c => c != null && c.Type != (int)CardType.Spell && c.Type != (int)CardType.Trap); + if (enemyCardCount == 0 || CheckWhetherNegated(true, true, CardType.Monster)) + { + return selectedFusionMaterialList; + } + + List fieldMaterialList = materialList.Where(c => c.Location == CardLocation.MonsterZone).OrderBy(c => c.Attack).ToList(); + List handMaterialList = materialList.Where(c => c.Location == CardLocation.Hand || c.Location == CardLocation.Grave).OrderBy(c => c.Attack).ToList(); + + // 2 field monster + 1 hand monster + if (enemyCardCount >= 2) + { + foreach (ClientCard handMonster in handMaterialList) + { + for (int fieldIndex1 = 0; fieldIndex1 < fieldMaterialList.Count - 1; ++fieldIndex1) + { + ClientCard fieldMonster1 = fieldMaterialList[fieldIndex1]; + if (fieldMonster1.IsCode(handMonster.Id) || handMonster.IsCode(fieldMonster1.Id)) continue; + for (int fieldIndex2 = fieldIndex1 + 1; fieldIndex2 < fieldMaterialList.Count; ++fieldIndex2) + { + ClientCard fieldMonster2 = fieldMaterialList[fieldIndex2]; + if (fieldMonster2.IsCode(fieldMonster1.Id) || fieldMonster1.IsCode(fieldMonster2.Id)) continue; + if (fieldMonster2.IsCode(handMonster.Id) || handMonster.IsCode(fieldMonster2.Id)) continue; + + return new List { handMonster, fieldMonster1, fieldMonster2 }; + } + } + } + } + + // 1 field monster + 2 hand monster + foreach (ClientCard fieldMonster in fieldMaterialList) + { + for (int handIndex1 = 0; handIndex1 < handMaterialList.Count - 1; ++ handIndex1) + { + ClientCard handMonster1 = handMaterialList[handIndex1]; + if (handMonster1.IsCode(fieldMonster.Id) || fieldMonster.IsCode(handMonster1.Id)) continue; + for (int handIndex2 = handIndex1 + 1; handIndex2 < handMaterialList.Count; ++handIndex2) + { + ClientCard handMonster2 = handMaterialList[handIndex2]; + if (handMonster2.IsCode(handMonster1.Id) || handMonster1.IsCode(handMonster2.Id)) continue; + if (handMonster2.IsCode(fieldMonster.Id) || fieldMonster.IsCode(handMonster2.Id)) continue; + + return new List { fieldMonster, handMonster1, handMonster2 }; + } + } + } + + return selectedFusionMaterialList; + } + + public bool BrandedLostActivate() + { + // search + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) + { + return true; + } + + return false; + } + + public bool BrandedLostCardActivate() + { + // search + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) return false; + + // activate + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion() && Bot.Hand.Count < 3) return false; + SelectSTPlace(Card, true); + return true; + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectCard(target); + } + else + { + AI.SelectCard(Enemy.GetMonsters()); + } + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Trap); + if (shouldNegateList.Count > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateCardList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + public bool BrightestBlazingBrandedKingActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Trap)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + if (Card.Location == CardLocation.SpellZone) + { + if (Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsFaceup() && (c.Location == CardLocation.MonsterZone || c.Location == CardLocation.SpellZone) + && !c.IsCode(albazFusionMonster))) + { + return false; + } + if (Duel.CurrentChain.Any(c => c.Controller == 1 && c.IsFaceup() && !currentNegateCardList.Contains(c) && !currentDestroyCardList.Contains(c) + && (c.Location == CardLocation.MonsterZone || c.Location == CardLocation.SpellZone))) + { + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup())); + currentNegateCardList.AddRange(Enemy.SpellZone.Where(c => c != null && c.IsFaceup())); + activatedCardIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public bool BrandedBeastActivate() + { + if (CheckWhetherNegated(true, true, CardType.Trap)) return false; + + int desc = -1; + if (ActivateDescription >= Util.GetStringId(CardId.BrandedBeast, 0)) + { + desc = ActivateDescription - Util.GetStringId(CardId.BrandedBeast, 0); + } + Logger.DebugWriteLine("Beast: " + desc.ToString()); + + // destroy + if (ActivateDescription == Util.GetStringId(Card.Id, 0)) + { + ClientCard destroyTarget = null; + ClientCard releaseMonster = null; + List dangerCardList = GetProblematicEnemyCardList(true, false, CardType.Trap); + if (dangerCardList.Count > 0) + { + destroyTarget = dangerCardList[0]; + } + if (destroyTarget == null) + { + if (Duel.Player == 1) + { + if ((CurrentTiming & hintTimingMainEnd) > 0) + { + List targetList = GetNormalEnemyTargetList(true, true, CardType.Trap); + if (targetList.Count > 0) + { + destroyTarget = targetList[0]; + } + } + } + else + { + destroyTarget = Util.GetOneEnemyBetterThanMyBest(true, true); + } + } + + bool forceActivateFlag = DefaultOnBecomeTarget(); + int bystialCount = Bot.MonsterZone.Count(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeBystial)); + forceActivateFlag |= bystialCount > 0 && Duel.ChainTargets.Count(c => c.Controller == 0 && c.Location == CardLocation.MonsterZone && c.IsFaceup() && c.HasSetcode(SetcodeBystial)) == bystialCount; + forceActivateFlag |= Duel.CurrentChain.Any(c => c.Controller == 1 && c.Location == CardLocation.SpellZone && c.IsCode(_CardId.Raigeki)); + if (destroyTarget == null && forceActivateFlag) + { + releaseMonster = Duel.ChainTargets.FirstOrDefault(c => c.Controller == 0 && c.Location == CardLocation.MonsterZone && c.IsFaceup() && c.HasSetcode(SetcodeBystial)); + if (releaseMonster == null) + { + if (!activatedCardIdList.Contains(CardId.AlbionTheBrandedDragon + 1) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon))) + { + List brandedDragonList = Bot.MonsterZone.Where(c => c != null && c.IsCode(CardId.AlbionTheBrandedDragon)).OrderBy(c => c.GetDefensePower()).ToList(); + if (brandedDragonList.Count > 0) + { + releaseMonster = brandedDragonList[0]; + } + } + if (releaseMonster == null) + { + releaseMonster = Bot.MonsterZone.Where(c => c != null && c.HasRace(CardRace.Dragon) + && !(c.IsOriginalCode(CardId.FallenOfAlbaz) && Util.ChainContainsCard(CardId.FallenOfAlbaz))).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + } + } + + List targetList = GetNormalEnemyTargetList(true, true, CardType.Trap); + if (targetList.Count > 0) + { + destroyTarget = targetList[0]; + } + } + + if (destroyTarget != null) + { + if (!activatedCardIdList.Contains(CardId.AlbionTheBrandedDragon + 1) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon))) + { + List brandedDragonList = Bot.MonsterZone.Where(c => c != null && c.IsCode(CardId.AlbionTheBrandedDragon)).OrderBy(c => c.GetDefensePower()).ToList(); + if (brandedDragonList.Count > 0) + { + releaseMonster = brandedDragonList[0]; + } + } + if (releaseMonster == null) + { + releaseMonster = Bot.MonsterZone.Where(c => c != null && c.HasRace(CardRace.Dragon) + && !(c.IsOriginalCode(CardId.FallenOfAlbaz) && Util.ChainContainsCard(CardId.FallenOfAlbaz))).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + } + } + + if (releaseMonster != null && destroyTarget != null) + { + activatedCardIdList.Add(Card.Id); + AI.SelectCard(releaseMonster); + AI.SelectNextCard(destroyTarget); + currentDestroyCardList.Add(destroyTarget); + return true; + } + } + + // place + if (Duel.Phase == DuelPhase.End && Bot.HasInGraveyard(CardId.BrandedLost)) + { + activatedCardIdList.Add(Card.Id + 1); + AI.SelectCard(CardId.BrandedLost); + return true; + } + + return false; + } + + public bool BrandedRetributionActivate() + { + if (Card.Location == CardLocation.SpellZone && Duel.LastChainPlayer == 1) + { + if (CheckWhetherNegated(true, true, CardType.Trap)) return false; + bool checkFlag = Bot.Graveyard.Where(c => c != null && c.IsCode(albazFusionMonster)).Count() > 1; + checkFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(new[] { CardId.LubellionTheSearingDragon, CardId.SprindTheIrondashDragon, CardId.AlbaLenatusTheAbyssDragon })); + if (checkFlag) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Trap)) return false; + Dictionary> checkDict = new Dictionary>{ + {CardId.BrandedFusion, () => BrandedFusionActivateCheck()}, + {CardId.BrandedLost, () => { + if (Duel.Player == 0 && Duel.Phase >= DuelPhase.End) return false; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) && BrandedFusionActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null) return true; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion()) return true; + if ((Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) || (!summoned && Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous)))) return true; + return false; + } }, + {CardId.BrandedInHighSpirits, () => !(Duel.Player == 1 && (fusionToGYFlag || Duel.Phase != DuelPhase.End)) && BrandedInHighSpiritsActivateCheck()}, + {CardId.BrandedInRed, () => BrandedInRedActivateCheck() != null }, + {CardId.BrandedInWhite, BrandedInWhiteActivateCheck }, + {CardId.BrightestBlazingBrandedKing, () => !(Duel.Player == 1 && (fusionToGYFlag || Duel.Phase != DuelPhase.End)) && Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedOpening, () => Bot.Hand.Count > 2 && !activatedCardIdList.Contains(CardId.BrandedOpening) } + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + activatedCardIdList.Add(Card.Id); + AI.SelectCard(target); + return true; + } + } + } + return false; + } + + public bool GuardianChimeraActivate() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + return true; + } + + public bool AlbionTheSanctifireDragonActivate() + { + // spsummon from grave + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + List allTargetList = Enemy.Graveyard.Where(c => c != null && c.IsMonster() && c.IsCanRevive()).ToList(); + allTargetList.AddRange(Bot.Graveyard.Where(c => c != null && c.IsMonster() && c.IsCanRevive()).ToList()); + + List targetList = new List(); + + // spsummon albaz + if (CheckAlbazFusion(null, out List materialList) && !spSummoningAlbaz) + { + bool albazFlag = materialList.Count > 1; + if (materialList.Count > 0) + { + ClientCard material = materialList[0]; + albazFlag |= material.HasType(CardType.Ritual | CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + albazFlag |= material.IsFloodgate() || material.IsOneForXyz() || Util.GetWorstBotMonster().GetDefensePower() < material.Attack; + albazFlag |= Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer == -1; + } + + if (albazFlag) + { + ClientCard albaz = allTargetList.FirstOrDefault(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + ClientCard worstMonster = allTargetList.Where(c => c != albaz && !currentDestroyCardList.Contains(c)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (albaz != null && worstMonster != null + && (GetProblematicEnemyMonster(0, false, false, CardType.Monster) != null || Math.Max(worstMonster.Attack, worstMonster.Defense) <= albaz.Defense)) + { + Logger.DebugWriteLine("Sanctifire 1"); + targetList.AddRange(new[] { albaz, worstMonster }); + spSummoningAlbaz = true; + } + } + } + + // spsummon floogate + if (targetList.Count == 0) + { + ClientCard floogateCard = allTargetList.Where(c => c.IsFloodgate()).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (floogateCard != null) + { + // select worst monster + ClientCard worstMonster = allTargetList.Where(c => c != floogateCard).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (worstMonster != null) + { + Logger.DebugWriteLine("Sanctifire 2"); + targetList.AddRange(new[] { floogateCard, worstMonster }); + } + } + } + + // spsummon target + if (targetList.Count == 0 && Duel.LastChainPlayer == 1) + { + List targetedList = Duel.LastChainTargets.Intersect(allTargetList).ToList(); + if (targetedList.Count > 0) + { + ClientCard target = ShuffleList(targetedList)[0]; + ClientCard anotherTarget = null; + if (target.GetDefensePower() >= 2000) + { + // select worst + anotherTarget = allTargetList.Where(c => c != target).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + } else + { + // select best + anotherTarget = allTargetList.Where(c => c != target).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + } + if (anotherTarget != null) + { + Logger.DebugWriteLine("Sanctifire 3"); + targetList.AddRange(new[] { target, anotherTarget }); + } + } + } + + // spsummon useful monster + if (targetList.Count == 0 && Duel.Player == 1 && Duel.Phase == DuelPhase.End) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.BorreloadFuriousDragon, () => Enemy.GetSpellCount() > 0 }, + {CardId.MirrorjadeTheIcebladeDragon, () => !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) }, + {CardId.AluberTheJesterOfDespia, () => !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) }, + {CardId.SpringansKitt, () => !activatedCardIdList.Contains(CardId.SpringansKitt + 1) }, + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = allTargetList.FirstOrDefault(c => c.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + // select worst + ClientCard anotherTarget = allTargetList.Where(c => c != target).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + targetList.Add(target); + targetList.Add(anotherTarget); + Logger.DebugWriteLine("Sanctifire 4"); + break; + } + } + } + + // avoid evenly match + if (targetList.Count == 0 && Duel.Player == 1 && Enemy.Hand.Count > 0 && Enemy.GetMonsterCount() + Enemy.GetSpellCount() == 0 && (CurrentTiming & hintBattleStart) > 0) + { + ClientCard summonTarget = allTargetList.OrderByDescending(c => c.Attack).FirstOrDefault(); + Dictionary> checkDict = new Dictionary> + { + {CardId.MirrorjadeTheIcebladeDragon, () => !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) }, + {CardId.AluberTheJesterOfDespia, () => !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) }, + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = allTargetList.FirstOrDefault(c => c.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + summonTarget = target; + break; + } + } + if (summonTarget != null) + { + // select worst + ClientCard anotherTarget = allTargetList.Where(c => c != summonTarget).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + targetList.Add(summonTarget); + targetList.Add(anotherTarget); + Logger.DebugWriteLine("Sanctifire 5"); + } + } + + if (targetList.Count > 0) + { + AI.SelectMaterials(targetList, HintMsg.SpSummon); + currentDestroyCardList.AddRange(targetList); + activatedCardIdList.Add(Card.Id); + return true; + } + } + // spsummon itself + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + List botCards = new List { Bot.MonsterZone[2], Bot.MonsterZone[5], Bot.MonsterZone[6] }; + List enemyCards = new List { Enemy.MonsterZone[2], Enemy.MonsterZone[5], Enemy.MonsterZone[6] }; + if (enemyCards.Any(c => c != null && (c.IsFloodgate() || c.IsMonsterDangerous()))) return true; + return botCards.Select(c => c == null ? 0 : c.GetDefensePower()).Sum() < enemyCards.Select(c => c == null ? 0 : c.GetDefensePower()).Sum(); + } + return false; + } + + public bool MirrorjadeTheIcebladeDragonActivate() + { + if (Card.Location != CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + return true; + } + if (Card.Location == CardLocation.MonsterZone) + { + bool checkFlag = GetProblematicEnemyMonster(0, false, false, CardType.Monster) != null; + if (Enemy.GetMonsterCount() > 0) + { + checkFlag |= Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0; + int enemyBattlePower = Enemy.BattlingMonster == null ? 0 : Enemy.BattlingMonster.GetDefensePower(); + int botBattlePower = Bot.BattlingMonster == null ? 0 : Bot.BattlingMonster.GetDefensePower(); + checkFlag |= enemyBattlePower > 0 && enemyBattlePower > botBattlePower && Duel.LastChainPlayer != 0 && !currentDestroyCardList.Contains(Enemy.BattlingMonster); + checkFlag |= DefaultOnBecomeTarget() && Duel.LastChainPlayer != 0; + } + if (Duel.CurrentChain.Any(c => c.IsCode(CardId.NibiruThePrimalBeing) && !DefaultCheckWhetherCardIdIsNegated(CardId.NibiruThePrimalBeing))) + { + checkFlag |= Enemy.GetMonsterCount() > 0; + checkFlag |= Bot.HasInMonstersZone(new[] { CardId.TheBystialLubellion, CardId.DespianTragedy, CardId.TriBrigadeMercourier }); + } + + if (checkFlag) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.AlbionTheBrandedDragon, + () =>!sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) && !DefaultCheckWhetherCardIdIsNegated(CardId.AlbionTheBrandedDragon) + && !(Duel.Player == 0 && Bot.HasInMonstersZone(CardId.AlbionTheBrandedDragon) && Bot.HasInGraveyard(CardId.TheBystialLubellion))}, + {CardId.RindbrummTheStrikingDragon, + () => Duel.Player == 1 && Bot.Graveyard.Any(c => c.IsOriginalCode(CardId.FallenOfAlbaz)) && Bot.Hand.Count > 0 + && !activatedCardIdList.Contains(CardId.FallenOfAlbaz) && !DefaultCheckWhetherCardIdIsNegated(CardId.FallenOfAlbaz)}, + {CardId.TitanikladTheAshDragon, () => CheckRemainInDeck(CardId.GuidingQuemTheVirtuous) > 0}, + {CardId.SprindTheIrondashDragon, () => CheckRemainInDeck(CardId.SpringansKitt) > 0}, + {CardId.AlbaLenatusTheAbyssDragon, () => CheckRemainInDeck(CardId.FusionDeployment, CardId.BrandedFusion) > 0 }, + {CardId.LubellionTheSearingDragon, () => true }, + {CardId.AlbionTheSanctifireDragon, () => true } + }; + + foreach (KeyValuePair> pair in checkDict) + { + if (Bot.HasInExtra(pair.Key) && pair.Value()) + { + AI.SelectCard(pair.Key); + return true; + } + } + } + } + return false; + } + + public bool BorreloadFuriousDragonActivate() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + + // destroy dangerous card + List dangerList = GetProblematicEnemyCardList(true, false, CardType.Monster); + if (dangerList.Count > 0) + { + ClientCard botTarget = Bot.GetMonsters().OrderBy(c => c.GetDefensePower() + (c.IsCode(albazFusionMonster) ? 1 : 0)).FirstOrDefault(); + if (botTarget != null) + { + AI.SelectCard(botTarget); + AI.SelectNextCard(dangerList); + currentDestroyCardList.Add(botTarget); + currentDestroyCardList.Add(dangerList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + List enemyTargetList = GetNormalEnemyTargetList(true, true, CardType.Monster); + + // become target + if (Duel.LastChainPlayer == 1) + { + List targetedBotMonsterList = Duel.LastChainTargets.Where(c => c.Location == CardLocation.MonsterZone && c.Controller == 0).ToList(); + ClientCard lastChainCard = Util.GetLastChainCard(); + // if it's a negate effect, only destroy not important monster + if (lastChainCard != null && lastChainCard.IsCode(targetNegateIdList)) + { + targetedBotMonsterList = targetedBotMonsterList.Where(c => !c.IsCode(CardId.BlazingCartesiaTheVirtuous) || c.Attack < 2500).OrderBy(c => c.Attack).ToList(); + } + if (targetedBotMonsterList.Count > 0) + { + AI.SelectCard(targetedBotMonsterList); + AI.SelectNextCard(enemyTargetList); + currentDestroyCardList.Add(targetedBotMonsterList[0]); + currentDestroyCardList.Add(enemyTargetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // end phase + if (Duel.Player == 1 && Duel.Phase == DuelPhase.End) + { + List botTargetList = Bot.MonsterZone.Where(c => c != null && c.GetDefensePower() <= 2500).OrderBy(c => c.GetDefensePower()).ToList(); + if (botTargetList.Count > 0) + { + AI.SelectCard(botTargetList); + AI.SelectNextCard(enemyTargetList); + currentDestroyCardList.Add(botTargetList[0]); + currentDestroyCardList.Add(enemyTargetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + return false; + } + + public bool LubellionTheSearingDragonActivate() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + int fusionTarget = LubellionTheSearingDragonFusionTarget(Bot.ExtraDeck, out _); + if (fusionTarget > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public int LubellionTheSearingDragonFusionTarget(IList cards, out ClientCard target) + { + target = null; + bool hasAlbaz = Bot.Banished.Any(c => c != null && c.IsFaceup() && c.IsOriginalCode(CardId.FallenOfAlbaz)); + hasAlbaz |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.IsOriginalCode(CardId.FallenOfAlbaz)); + Dictionary> checkDict = new Dictionary> + { + {CardId.MirrorjadeTheIcebladeDragon, () => hasAlbaz && !DefaultCheckWhetherCardIdIsNegated(CardId.MirrorjadeTheIcebladeDragon) }, + {CardId.GranguignolTheDuskDragon, () => Bot.HasInBanished(CardId.BlazingCartesiaTheVirtuous) }, + {CardId.BorreloadFuriousDragon, () => + { + int darkDragonCount = Bot.Banished.Where(c => c.IsFaceup() && c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) + && !c.IsCode(cannotBeFusionMaterialIdList) ).Count(); + darkDragonCount += Bot.Graveyard.Where(c => c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) + && !c.IsCode(cannotBeFusionMaterialIdList) + && (Duel.Player == 1 || !CheckWhetherShouldKeepInGrave(c)) ).Count(); + return darkDragonCount >= 2; + } }, + {CardId.RindbrummTheStrikingDragon, () => hasAlbaz && Bot.HasInBanished(CardId.TriBrigadeMercourier) }, + {CardId.TitanikladTheAshDragon, () => + { + if (!hasAlbaz) return false; + ClientCard enemyMonster = Util.GetBestEnemyMonster(true); + ClientCard botMonster = Util.GetBestBotMonster(true); + int enemyPower = enemyMonster == null ? 0 : enemyMonster.GetDefensePower(); + int botPower = botMonster == null ? 0 : botMonster.Attack; + if (enemyPower > 0 && enemyPower >= botPower) + { + List materialList = new List(Bot.Banished); + materialList.AddRange(Bot.Graveyard); + foreach (ClientCard material in materialList) + { + if (material != null && material.IsFaceup() && material.Attack >= 2500 && (2900 + material.Level >= enemyPower)) + { + return true; + } + } + } + return false; + } }, + {CardId.DespianQuaeritis, () => { + if (!Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.Attack > 2500 && !(c.HasType(CardType.Fusion) && c.Level >= 8))) return false; + bool checkFlag = Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeDespain)); + checkFlag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeDespain)); + + return checkFlag; + } }, + {CardId.AlbaLenatusTheAbyssDragon, () => hasAlbaz && !Bot.HasInExtra(CardId.AlbionTheBrandedDragon) }, + {CardId.AlbionTheBrandedDragon, () => { + if (activatedCardIdList.Contains(CardId.AlbionTheBrandedDragon) || DefaultCheckWhetherCardIdIsNegated(CardId.AlbionTheBrandedDragon)) return false; + bool checkFlag = Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasAttribute(CardAttribute.Light)); + checkFlag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasAttribute(CardAttribute.Light)); + + return checkFlag; + }} + }; + + foreach (KeyValuePair> pair in checkDict) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return pair.Key; + } + } + + target = null; + return 0; + } + + public bool AlbaLenatusTheAbyssDragonSpSummon() + { + // use albaz + enemy's dragon monster + List enemyDragon = Enemy.GetMonsters().Where(c => c != null && c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Dragon)).ToList(); + if (enemyDragon.Count > 0) + { + bool successFlag = enemyDragon.Count > 1; + int bestBotPower = Util.GetBestAttack(Bot); + successFlag |= enemyDragon.Any(c => c.GetDefensePower() >= bestBotPower); + if (successFlag) + { + if (!enemyDragon.Any(c => c.IsCode(CardId.FallenOfAlbaz))) + { + ClientCard botAlbaz = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz)); + if (botAlbaz != null) + { + enemyDragon.Add(botAlbaz); + } + } + AI.SelectMaterials(enemyDragon); + return true; + } + } + + return false; + } + + public bool AlbaLenatusTheAbyssDragonActivate() + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool GranguignolTheDuskDragonActivate() + { + int desc = -1; + if (ActivateDescription >= Util.GetStringId(CardId.GranguignolTheDuskDragon, 0)) + { + desc = ActivateDescription - Util.GetStringId(CardId.GranguignolTheDuskDragon, 0); + } + Logger.DebugWriteLine("granguignol: " + desc.ToString()); + + // send to GY + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.GranguignolTheDuskDragon, 0)) + { + if (CheckWhetherNegated(true, true, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + int checkId = GranguignolTheDuskDragonSendToGYTarget(null, out _); + if (checkId > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + // spsummon + if (ActivateDescription == Util.GetStringId(CardId.GranguignolTheDuskDragon, 1)) + { + if (CheckWhetherNegated(true, Card.Location == CardLocation.MonsterZone, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public int GranguignolTheDuskDragonSendToGYTarget(IList cards, out ClientCard target) + { + bool needSendBranded = Bot.HasInGraveyard(CardId.BrandedRetribution) && CheckRemainInDeck(CardId.BrandedFusion) > 0; + if (CheckRemainInDeck(CardId.BrandedRetribution) > 0) + { + needSendBranded |= Bot.Graveyard.Any(c => c != null && c.HasType(CardType.Spell | CardType.Trap) && c.HasSetcode(SetcodeBranded) + && !(fusionToGYFlag && c.IsCode(CardId.BrightestBlazingBrandedKing, CardId.BrandedInHighSpirits))); + needSendBranded |= !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon) && !CheckWhetherWillbeRemoved() && Bot.HasInHandOrInGraveyard(CardId.AlbionTheShroudedDragon); + needSendBranded |= Duel.CurrentChain.Any(c => c.Controller == 0 && c.Location == CardLocation.Grave && c.IsCode(CardId.BystialSaronir)); + } + List>> checkList = new List>> + { + new KeyValuePair>(CardId.BystialSaronir, () => !activatedCardIdList.Contains(CardId.BystialSaronir) && needSendBranded), + new KeyValuePair>(CardId.AlbionTheShroudedDragon, () => !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon) && needSendBranded ), + new KeyValuePair>(CardId.AlbionTheBrandedDragon, () => !activatedCardIdList.Contains(CardId.AlbionTheBrandedDragon + 1) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) ), + new KeyValuePair>(CardId.TitanikladTheAshDragon, () => !activatedCardIdList.Contains(CardId.TitanikladTheAshDragon) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.TitanikladTheAshDragon)) + && CheckRemainInDeck(CardId.GuidingQuemTheVirtuous, CardId.FallenOfAlbaz) > 0), + new KeyValuePair>(CardId.TheBystialLubellion, () => Bot.HasInMonstersZone(new[] {CardId.AlbionTheBrandedDragon, CardId.TitanikladTheAshDragon}) + && CheckRemainInDeck(CardId.BrandedLost, CardId.BrandedBeast) > 0 ), + new KeyValuePair>(CardId.SprindTheIrondashDragon, () => !activatedCardIdList.Contains(CardId.SprindTheIrondashDragon) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.SprindTheIrondashDragon)) + && CheckRemainInDeck(CardId.SpringansKitt) > 0), + new KeyValuePair>(CardId.DespianLuluwalilith, () => CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous, CardId.GuidingQuemTheVirtuous) > 0 ), + new KeyValuePair>(CardId.AlbionTheShroudedDragon, () => true ), + }; + + foreach (KeyValuePair> pair in checkList) + { + if (cards == null) + { + if ((CheckRemainInDeck(pair.Key) > 0 || Bot.HasInExtra(pair.Key)) && pair.Value()) + { + target = null; + return pair.Key; + } + } else + { + ClientCard tg = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (tg != null && pair.Value()) + { + target = tg; + return pair.Key; + } + } + } + + target = null; + return 0; + } + + public bool DespianQuaeritisActivate() + { + if (Card.Location == CardLocation.MonsterZone && Duel.Phase == DuelPhase.Main1 && !CheckWhetherNegated(true, true, CardType.Monster)) + { + if ((CurrentTiming & hintTimingMainEnd) != 0 && Duel.Player == 1) + { + int bestBotPower = Util.GetBestPower(Bot, false); + if (Enemy.GetMonsters().Any(c => c.GetDefensePower() >= bestBotPower && c.IsAttack() && !(c.HasType(CardType.Fusion) && c.Level >= 8))) { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Duel.Player == 0 && Enemy.GetMonsters().Any(c => c.IsAttack() && !(c.HasType(CardType.Fusion) && c.Level >= 8))) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Card.Location != CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return true; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + return false; + } + + public bool SprindTheIrondashDragonActivate() + { + // search + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + // destroy + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + int moveDest = SprindTheIrondashDragonMoveZone(0, Card); + if (moveDest > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public int SprindTheIrondashDragonMoveZone(int available = 0, ClientCard selfCard = null) + { + int maxZone = -1; + int maxValue = 0; + for (int zoneId = 0; zoneId < 5; ++zoneId) + { + // check whether can move + if (Bot.MonsterZone[zoneId] != null) continue; + int zone = (int)System.Math.Pow(2, zoneId); + if (available > 0 && (available & zone) == 0) continue; + + int currentValue = SprindTheIrondashDragonDestroyValue(zoneId, selfCard); + if (currentValue > maxValue) + { + maxZone = zone; + maxValue = currentValue; + } + } + return maxZone; + } + + public int SprindTheIrondashDragonDestroyValue(int zoneId, ClientCard selfCard = null) + { + int value = 0; + if (zoneId == 1 || zoneId == 3) + { + ClientCard botMonsterInExtraZone = Bot.MonsterZone[(zoneId + 9) / 2]; + if (botMonsterInExtraZone != null && botMonsterInExtraZone != selfCard && botMonsterInExtraZone.IsFaceup()) value -= 5; + + ClientCard enemyMonserInExtraZone = Enemy.MonsterZone[(11 - zoneId) / 2]; + if (enemyMonserInExtraZone != null && enemyMonserInExtraZone.IsFaceup()) value += 2; + } + ClientCard botSpell = Bot.SpellZone[zoneId]; + if (botSpell != null && botSpell.IsFaceup()) value--; + ClientCard enemyMonster = Enemy.MonsterZone[5 - zoneId]; + if (enemyMonster != null && enemyMonster.IsFaceup()) + { + value++; + if (enemyMonster.IsFloodgate() || enemyMonster.IsMonsterDangerous()) value += 5; + } + ClientCard enemySpell = Enemy.SpellZone[5 - zoneId]; + if (enemySpell != null && enemySpell.IsFaceup()) + { + value++; + if (enemySpell.IsFloodgate()) value += 5; + } + + return value; + } + + public bool TitanikladTheAshDragonActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool RindbrummTheStrikingDragonActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + bool checkFlag = false; + + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null) + { + checkFlag = Duel.LastChainPlayer == 1; + checkFlag |= Duel.LastChainPlayer == 0 && lastChainCard.IsCode(CardId.MirrorjadeTheIcebladeDragon) && lastChainCard.Location == CardLocation.MonsterZone && Enemy.GetMonsterCount() == 0; + } + + if (checkFlag) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, true, CardType.Monster) || Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.GuidingQuemTheVirtuous))) return false; + + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + bool checkFlag = Card.IsCanRevive() && Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + bool albazFlag = CheckAlbazFusion(null, out List materialList) && albaz != null && !spSummoningAlbaz; + if (albazFlag) + { + checkFlag |= materialList.Count > 1; + if (materialList.Count > 0) + { + ClientCard material = materialList[0]; + checkFlag |= material.HasType(CardType.Ritual | CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + checkFlag |= material.IsFloodgate() || material.IsOneForXyz() || Util.GetWorstBotMonster()?.GetDefensePower() < material.Attack; + checkFlag |= Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer == -1; + } + } + + if (checkFlag) + { + albaz = Bot.Graveyard.Where(c => c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + + if (checkFlag && albaz != null) + { + spSummoningAlbaz = true; + activatedCardIdList.Add(Card.Id + 1); + AI.SelectCard(albaz); + return true; + } + } + } + return false; + } + + public bool AlbionTheBrandedDragonActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + int fusionTarget = AlbionTheBrandedDragonFusionTarget(Bot.ExtraDeck, out _); + if (fusionTarget > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + return false; + } + + public int AlbionTheBrandedDragonFusionTarget(IList cards, out ClientCard target) + { + target = null; + Dictionary> checkDict = new Dictionary> + { + {CardId.MirrorjadeTheIcebladeDragon, () => { + bool checkFlag = !CheckWhetherNegated() && CheckShouldNoMoreSpSummon(); + checkFlag |= Bot.Graveyard.Any(c => c != null && !sendToGYThisTurn.Contains(c) && !c.IsCode(cannotBeFusionMaterialIdList) + && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + return checkFlag; + } }, + {CardId.LubellionTheSearingDragon, () => + { + if (!activatedCardIdList.Contains(CardId.LubellionTheSearingDragon)) + { + List checkMaterialList = new List(Bot.GetMonsters()); + checkMaterialList.AddRange(Bot.Graveyard); + bool albazChecked = false; + bool hasOriginalAlbaz = checkMaterialList.Any(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + foreach (ClientCard checkCard in checkMaterialList) + { + if (!albazChecked && checkCard.IsCode(CardId.FallenOfAlbaz) && (!hasOriginalAlbaz || !checkCard.IsOriginalCode(CardId.AlbionTheShroudedDragon))) + { + albazChecked = true; + continue; + } + if (checkCard.HasAttribute(CardAttribute.Dark)) return true; + } + if (Bot.HasInHand(CardId.TriBrigadeMercourier) && Bot.Hand.Count >= 2) return true; + } + return false; + } }, + {CardId.BorreloadFuriousDragon, () => { + if (Enemy.GetMonsterCount() + Enemy.GetSpellCount() > 0) + { + int darkDragonCount = Bot.Graveyard.Where(c => c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) + && !c.IsCode(cannotBeFusionMaterialIdList) + && (Duel.Player == 1 || !CheckWhetherShouldKeepInGrave(c)) ).Count(); + if (Duel.Player == 1 && Bot.GetMonsters().Any(c => c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) && !c.IsCode(cannotBeFusionMaterialIdList))) { + darkDragonCount ++; + } + return darkDragonCount >= 2; + } + return false; + } }, + {CardId.AlbionTheSanctifireDragon, () => + { + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c.IsCode(CardId.FallenOfAlbaz)); + ClientCard lightSpellcaster = Bot.Graveyard.FirstOrDefault(c => c.HasRace(CardRace.SpellCaster) && c.HasAttribute(CardAttribute.Light)); + int remainMonsterCount = Enemy.GetGraveyardMonsters().Count; + remainMonsterCount += Bot.Graveyard.Where(c => c.IsMonster() && c != albaz && c != lightSpellcaster).Count(); + remainMonsterCount += Bot.HasInHand(_CardId.MaxxC) ? 1 : 0; + return remainMonsterCount >= 2; + } }, + {CardId.RindbrummTheStrikingDragon, () => Bot.HasInGraveyard(CardId.TriBrigadeMercourier) }, + {CardId.DespianQuaeritis, () => + { + bool checkFlag = Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.Attack >= 2500 && !(c.HasType(CardType.Fusion) && c.Level >= 8)); + if (checkFlag) + { + ClientCard despian = Bot.Graveyard.Where(c => c != null && c.HasSetcode(SetcodeDespain) && !CheckWhetherShouldKeepInGrave(c)) + .OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (despian == null) + { + despian = Bot.MonsterZone.Where(c => c != null && c.HasSetcode(SetcodeDespain)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + } + if (despian != null) + { + return Bot.Graveyard.Any(c => c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) && !CheckWhetherShouldKeepInGrave(c) && c != despian); + } + } + + return false; + } }, + {CardId.TitanikladTheAshDragon, () => + { + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (albaz == null) + { + albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz)); + } + foreach (ClientCard material in Bot.Graveyard) + { + if (material != null && material != albaz && material.IsMonster() && material.Attack >= 2500 && !material.IsCode(cannotBeFusionMaterialIdList)) + { + bool checkFlag = !Util.IsTurn1OrMain2() && Enemy.GetMonsterCount() == 0; + checkFlag |= !CheckWhetherShouldKeepInGrave(material); + return checkFlag; + } + } + return false; + } }, + {CardId.AlbaLenatusTheAbyssDragon, () => + { + if (Util.GetOneEnemyBetterThanMyBest() == null) + { + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (albaz == null) + { + albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz)); + } + foreach (ClientCard material in Bot.Graveyard) + { + if (material != null && material != albaz && material.IsMonster() && material.HasRace(CardRace.Dragon) && !material.IsCode(cannotBeFusionMaterialIdList)) + { + return true; + } + } + } + return false; + } }, + {CardId.GranguignolTheDuskDragon, () => + { + if (cards == null) return false; + return true; + } } + }; + + foreach (KeyValuePair> pair in checkDict) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return pair.Key; + } + } + + target = null; + return 0; + } + + public bool DespianLuluwalilithActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + if (CheckRemainInDeck(CardId.GuidingQuemTheVirtuous, CardId.BlazingCartesiaTheVirtuous) > 0) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + return false; + } + + public bool SetForChimera() + { + if (Card.Level <= 4) return false; + if (Bot.GetMonsterCount() > 0 || !Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) || !Bot.HasInExtra(CardId.GuardianChimera)) return false; + if (DefaultCheckWhetherCardIdIsNegated(CardId.GuardianChimera) || CheckWhetherNegated(true, true, CardType.Monster)) return false; + if (Enemy.MonsterZone.All(c => c == null) && Enemy.SpellZone.All(c => c == null)) return false; + + for (int handIndex1 = 0; handIndex1 < Bot.Hand.Count - 1; ++ handIndex1) + { + ClientCard hand1 = Bot.Hand[handIndex1]; + if (!hand1.IsMonster() || hand1.IsCode(Card.Id) || Card.IsCode(hand1.Id)) continue; + for (int handIndex2 = handIndex1 + 1; handIndex2 < Bot.Hand.Count; ++ handIndex2) + { + ClientCard hand2 = Bot.Hand[handIndex2]; + if (!hand2.IsMonster()) continue; + if (hand2.IsCode(Card.Id) || Card.IsCode(hand2.Id) || hand2.IsCode(hand1.Id) || hand1.IsCode(hand2.Id)) continue; + bool checkFlag = Card.HasRace(CardRace.Dragon) || hand1.HasRace(CardRace.Dragon) || hand2.HasRace(CardRace.Dragon); + if (checkFlag) + { + summoned = true; + return true; + } + } + } + + return false; + } + + public bool AdvanceSummon() + { + if (Card.Level < 5) return false; + + List releaseGoal = Bot.MonsterZone.Where(c => c != null && c.IsFaceup() && !c.IsDisabled() && c.IsCode(10158145)).ToList(); + if (releaseGoal.Count > 0) + { + if (Card.Level <= 6) + { + AI.SelectMaterials(releaseGoal); + summoned = true; + return true; + } + + if (Card.Level >= 7) + { + if (releaseGoal.Count < 2) + { + ClientCard anotherMaterial = Bot.MonsterZone.Where(c => c != null && !releaseGoal.Contains(c)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (anotherMaterial.GetDefensePower() > Card.Attack) return false; + releaseGoal.Add(anotherMaterial); + } + if (releaseGoal.Count >= 2) + { + AI.SelectMaterials(releaseGoal); + summoned = true; + return true; + } + } + } + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + switch (Card.Id) + { + case CardId.BrandedInHighSpirits: + { + bool checkFlag = (Bot.HasInMonstersZone(CardId.GuidingQuemTheVirtuous) + || (CheckRemainInDeck(CardId.GuidingQuemTheVirtuous) > 0 && sendToGYThisTurn.Any(c => c.IsCode(CardId.TitanikladTheAshDragon)))); + if (!checkFlag) return false; + } + break; + case CardId.BrandedOpening: + { + bool checkFlag = CheckRemainInDeck(CardId.AluberTheJesterOfDespia, CardId.GuidingQuemTheVirtuous) > 0; + if (!checkFlag) return false; + } + break; + case CardId.BrightestBlazingBrandedKing: + { + bool checkFlag = Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster)); + if (!checkFlag) return false; + } + break; + case CardId.BrandedBeast: + { + bool checkFlag = Bot.HasInGraveyard(CardId.BrandedLost) || Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeBystial)); + checkFlag |= Bot.HasInHand(CardId.BystialSaronir) && (Enemy.Graveyard.Any(c => CheckBystialCanBanish(c)) || Bot.Graveyard.Any(c => CheckBystialCanBanish(c))); + if (!checkFlag) return false; + } + break; + case CardId.BrandedRetribution: + { + bool checkFlag = Bot.Graveyard.Where(c => c.IsCode(albazFusionMonster)).Count() > 1; + checkFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster)); + if (!checkFlag) return false; + } + break; + default: + break; + } + + // select place + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + List avoid_list = new List(); + int setForInfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setForInfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setForInfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + // for Sanctifire Dragon spsummoned monster + public bool FloogateActivate() + { + if (Card.Owner != 1 && !Card.IsFloodgate()) return false; + if (CheckWhetherNegated()) return false; + if (Executors.Any(e => e != null && e.Type == ExecutorType.Activate && e.CardId == Card.Id)) return false; + if (Duel.LastChainPlayer == 1) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.IsFaceup() && CheckCanBeTargeted(lastChainCard, true, CardType.Monster) + && (lastChainCard.Location == CardLocation.MonsterZone || lastChainCard.Location == CardLocation.SpellZone)) + { + AI.SelectCard(lastChainCard); + } + } + + return Duel.LastChainPlayer == 1; + } + } +} \ No newline at end of file diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index e6f221f86..8fb2fb8fe 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -1129,6 +1129,15 @@ protected bool DefaultOnBecomeTarget() _CardId.EvenlyMatched, _CardId.DivineArsenalAAZEUS_SkyThunder }; + int[] destroyAllMonsterList = + { + _CardId.DarkHole, + _CardId.InterruptedKaijuSlumber + }; + int[] destroyAllOpponentMonsterList = + { + _CardId.Raigeki + }; int[] destroyAllOpponentSpellList = { _CardId.HarpiesFeatherDuster, @@ -1137,6 +1146,8 @@ protected bool DefaultOnBecomeTarget() if (Util.ChainContainsCard(destroyAllList)) return true; if (Enemy.HasInSpellZone(destroyAllOpponentSpellList, true) && Card.Location == CardLocation.SpellZone) return true; + if (Util.ChainContainsCard(destroyAllMonsterList) && Card.Location == CardLocation.MonsterZone) return true; + if (Duel.CurrentChain.Any(c => c.Controller == 1 && c.IsCode(destroyAllOpponentMonsterList)) && Card.Location == CardLocation.MonsterZone) return true; if (lightningStormOption == 0 && Card.Location == CardLocation.MonsterZone && Card.IsAttack()) return true; if (lightningStormOption == 1 && Card.Location == CardLocation.SpellZone) return true; // TODO: ChainContainsCard(id, player) diff --git a/WindBot.csproj b/WindBot.csproj index 6d9d022f9..accc0589b 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -60,6 +60,7 @@ + diff --git a/YGOSharp.OCGWrapper.Enums/CardRace.cs b/YGOSharp.OCGWrapper.Enums/CardRace.cs index 397a3958e..0abb60667 100644 --- a/YGOSharp.OCGWrapper.Enums/CardRace.cs +++ b/YGOSharp.OCGWrapper.Enums/CardRace.cs @@ -17,7 +17,7 @@ public enum CardRace Thunder = 0x1000, Dragon = 0x2000, Beast = 0x4000, - BestWarrior = 0x8000, + BeastWarrior = 0x8000, Dinosaur = 0x10000, Fish = 0x20000, SeaSerpent = 0x40000, From d409521b182914fd032a81f5ff65a0a86020d67a Mon Sep 17 00:00:00 2001 From: Swerik <47034061+TheSwerik@users.noreply.github.com> Date: Wed, 7 Aug 2024 07:53:55 +0200 Subject: [PATCH 045/110] flip highest and lowest attack/defense monsters (#201) --- Game/AI/CardContainer.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Game/AI/CardContainer.cs b/Game/AI/CardContainer.cs index bc69190c9..888e03f47 100644 --- a/Game/AI/CardContainer.cs +++ b/Game/AI/CardContainer.cs @@ -55,28 +55,32 @@ public static ClientCard GetHighestAttackMonster(this IEnumerable ca { return cards .Where(card => card?.Data != null && card.HasType(CardType.Monster) && card.IsFaceup() && !(canBeTarget && card.IsShouldNotBeTarget())) - .OrderBy(card => card.Attack).FirstOrDefault(); + .OrderByDescending(card => card.Attack) + .FirstOrDefault(); } public static ClientCard GetHighestDefenseMonster(this IEnumerable cards, bool canBeTarget = false) { return cards .Where(card => card?.Data != null && card.HasType(CardType.Monster) && card.IsFaceup() && !(canBeTarget && card.IsShouldNotBeTarget())) - .OrderBy(card => card.Defense).FirstOrDefault(); + .OrderByDescending(card => card.Defense) + .FirstOrDefault(); } public static ClientCard GetLowestAttackMonster(this IEnumerable cards, bool canBeTarget = false) { return cards .Where(card => card?.Data != null && card.HasType(CardType.Monster) && card.IsFaceup() && !(canBeTarget && card.IsShouldNotBeTarget())) - .OrderByDescending(card => card.Attack).FirstOrDefault(); + .OrderBy(card => card.Attack) + .FirstOrDefault(); } public static ClientCard GetLowestDefenseMonster(this IEnumerable cards, bool canBeTarget = false) { return cards .Where(card => card?.Data != null && card.HasType(CardType.Monster) && card.IsFaceup() && !(canBeTarget && card.IsShouldNotBeTarget())) - .OrderByDescending(card => card.Defense).FirstOrDefault(); + .OrderBy(card => card.Defense) + .FirstOrDefault(); } public static bool ContainsMonsterWithLevel(this IEnumerable cards, int level) From 4c4c5c66eace60f235feb4a15dec36be8291ed8c Mon Sep 17 00:00:00 2001 From: mercury233 Date: Wed, 7 Aug 2024 13:58:38 +0800 Subject: [PATCH 046/110] fix --- Game/AI/Decks/SuperheavySamuraiExecutor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Game/AI/Decks/SuperheavySamuraiExecutor.cs b/Game/AI/Decks/SuperheavySamuraiExecutor.cs index 4a1adaecd..b0911a0b2 100644 --- a/Game/AI/Decks/SuperheavySamuraiExecutor.cs +++ b/Game/AI/Decks/SuperheavySamuraiExecutor.cs @@ -212,6 +212,7 @@ public override void OnNewTurn() activate_Genius = false; activate_Sarutobi = false; to_deck = false; + base.OnNewTurn(); } public override bool OnSelectHand() { From b0a420e20d002e30c232f46f0ae9477c84e6c94e Mon Sep 17 00:00:00 2001 From: mercury233 Date: Wed, 11 Sep 2024 09:32:39 +0800 Subject: [PATCH 047/110] quit when deck error --- Game/GameAI.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Game/GameAI.cs b/Game/GameAI.cs index 44e3c4e6a..18a81d2d0 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Collections.Generic; +using System.Threading; using WindBot.Game.AI; using YGOSharp.OCGWrapper.Enums; @@ -48,6 +49,9 @@ public void OnRetry() public void OnDeckError(string card) { _dialogs.SendDeckSorry(card); + Thread.Sleep(1000); + _dialogs.SendSurrender(); + Game.Connection.Close(); } /// From 64526e235af652dce4241e809903e54806006aff Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Mon, 23 Sep 2024 10:05:43 +0800 Subject: [PATCH 048/110] Add OnSpSummoned (#202) --- Game/AI/Decks/BlueEyesExecutor.cs | 17 ++++++++++++++++- Game/AI/Executor.cs | 10 ++++++++++ Game/GameAI.cs | 9 +++++++++ Game/GameBehavior.cs | 3 ++- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/Game/AI/Decks/BlueEyesExecutor.cs b/Game/AI/Decks/BlueEyesExecutor.cs index 9939f7b77..1abf3b4bb 100644 --- a/Game/AI/Decks/BlueEyesExecutor.cs +++ b/Game/AI/Decks/BlueEyesExecutor.cs @@ -177,6 +177,22 @@ public override IList OnSelectSynchroMaterial(IList card return null; } + public override void OnSpSummoned() + { + // not special summoned by chain + if (Duel.GetCurrentSolvingChainCard() == null) + { + foreach (ClientCard card in Duel.LastSummonedCards) + { + if (card.Controller == 0 && card.IsCode(CardId.AlternativeWhiteDragon)) + { + AlternativeWhiteDragonSummoned = true; + } + } + } + base.OnSpSummoned(); + } + private bool DragonShrineEffect() { AI.SelectCard( @@ -501,7 +517,6 @@ private bool WhiteStoneOfAncientsEffect() private bool AlternativeWhiteDragonSummon() { - AlternativeWhiteDragonSummoned = true; return true; } diff --git a/Game/AI/Executor.cs b/Game/AI/Executor.cs index 7ef678d60..548f1a49a 100644 --- a/Game/AI/Executor.cs +++ b/Game/AI/Executor.cs @@ -237,6 +237,16 @@ public virtual int OnAnnounceCard(IList avail) return 0; } + /// + /// Called when card is successfully special summoned. + /// Used on monsters that can only special summoned once per turn. + /// + public virtual void OnSpSummoned() + { + // For overriding + return; + } + public void SetMain(MainPhase main) { Main = main; diff --git a/Game/GameAI.cs b/Game/GameAI.cs index 18a81d2d0..1848dd17c 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -164,6 +164,15 @@ public void OnChainSolved(int chainIndex) { Executor.OnChainSolved(chainIndex); } + + /// + /// Called when card is successfully special summoned. + /// Used on monsters that can only special summoned once per turn. + /// + public void OnSpSummoned() + { + Executor.OnSpSummoned(); + } /// /// Called when a chain has been solved. diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index c0bdc8929..0770fe088 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -27,7 +27,7 @@ public class GameBehavior private Room _room; private Duel _duel; private int _hand; - private bool _debug; + private bool _debug; private int _select_hint; private GameMessage _lastMessage; @@ -1971,6 +1971,7 @@ private void OnSpSummoned(BinaryReader packet) card.IsSpecialSummoned = true; _duel.LastSummonedCards.Add(card); } + _ai.OnSpSummoned(); _duel.SummoningCards.Clear(); } From c914cc0a29ada1fc4595e7afc1a77236de10e588 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Mon, 27 Jan 2025 21:09:47 +0800 Subject: [PATCH 049/110] AI_Ryzeal (#208) --- BotWrapper/bot.conf | 5 + Decks/AI_Ryzeal.ydk | 74 + Game/AI/Decks/RyzealExecutor.cs | 4104 +++++++++++++++++++++++++++++++ Game/AI/DefaultExecutor.cs | 27 +- Game/ClientCard.cs | 5 + Game/GameBehavior.cs | 6 + WindBot.csproj | 1 + 7 files changed, 4220 insertions(+), 2 deletions(-) create mode 100644 Decks/AI_Ryzeal.ydk create mode 100644 Game/AI/Decks/RyzealExecutor.cs diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index fdb86fecf..814a3f27d 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -129,6 +129,11 @@ Name=复制梁龙 Deck=Salamangreat Dialog=anothercopy.zh-CN 转生炎兽卡组。 AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +!复制梁龙-雷火沸动 +Name=复制梁龙 Deck=Ryzeal Dialog=anothercopy.zh-CN +初代雷火沸动卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + !VI-1911-凭依装着 Name=VI-1911 Deck=FamiliarPossessed Dialog=VI-1911.zh-CN 凭依装着卡组。 diff --git a/Decks/AI_Ryzeal.ydk b/Decks/AI_Ryzeal.ydk new file mode 100644 index 000000000..a7f684165 --- /dev/null +++ b/Decks/AI_Ryzeal.ydk @@ -0,0 +1,74 @@ +#created by ... +#main +8633261 +8633261 +8633261 +35844557 +35844557 +35844557 +72238166 +34022970 +34022970 +34022970 +42141493 +42141493 +84192580 +87126721 +14558127 +14558127 +14558127 +59438930 +59438930 +23434538 +23434538 +94145021 +97268402 +97268402 +97268402 +7477101 +7477101 +7477101 +25311006 +35261759 +35261759 +85106525 +24224830 +24224830 +60394026 +65681983 +6798031 +10045474 +10045474 +10045474 +#extra +9940036 +34909328 +34909328 +2061963 +7511613 +7511613 +45852939 +45852939 +6983839 +90590303 +46772449 +16643334 +21044178 +66011101 +8728498 +!side +20292186 +34267821 +34267821 +34267821 +67173574 +18144507 +19613556 +35269904 +15693423 +83326048 +83326048 +83326048 +41420027 +41420027 +41420027 diff --git a/Game/AI/Decks/RyzealExecutor.cs b/Game/AI/Decks/RyzealExecutor.cs new file mode 100644 index 000000000..d887f3b5d --- /dev/null +++ b/Game/AI/Decks/RyzealExecutor.cs @@ -0,0 +1,4104 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Ryzeal", "AI_Ryzeal")] + public class RyzealExecutor : DefaultExecutor + { + public class CardId + { + public const int IceRyzeal = 8633261; + public const int ThodeRyzeal = 35844557; + public const int NodeRyzeal = 72238166; + public const int ExRyzeal = 34022970; + // _CardId.MulcharmyFuwalos; + // _CardId.MulcharmyPurulia; + // _CardId.MulcharmyNyalus; + // _CardId.AshBlossom; + // _CardId.GhostOgreAndSnowRabbit; + // _CardId.MaxxC; + // _CardId.LockBird; + // _CardId.EffectVeiler; + + public const int SeventhTachyon = 7477101; + public const int TripleTacticsTalent = 25311006; + // _CardId.PotOfDesires; + public const int Bonfire = 85106525; + // _CardId.CalledByTheGrave; + public const int RyzealPlugIn = 60394026; + // _CardId.CrossoutDesignator; + public const int RyzealCross = 6798031; + + // _CardId.InfiniteImpermanence = 10045474; + + public const int MereologicAggregator = 9940036; + public const int RyzealDeadnader = 34909328; + public const int Number104Masquerade = 2061963; + public const int RyzealDuodrive = 7511613; + public const int TwinsOfTheEclipse = 45852939; + public const int FullArmoredUtopicRayLancer = 1269512; + public const int TornadoDragon = 6983839; + // _CardId.Number41BagooskatheTerriblyTiredTapir + // _CardId.EvilswarmExcitonKnight + public const int StarliegePhotonBlastDragon = 16643334; + public const int AbyssDweller = 21044178; + public const int Number60DugaresTheTimeless = 66011101; + public const int DonnerDaggerFurHire = 8728498; + } + + public RyzealExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // counter + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, _CardId.EffectVeiler, EffectVeilerActivate); + AddExecutor(ExecutorType.Activate, _CardId.GhostOgreAndSnowRabbit, GhostOgreAndSnowRabbitActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + + AddExecutor(ExecutorType.Activate, _CardId.EvilswarmExcitonKnight, EvilswarmExcitonKnightActivate); + AddExecutor(ExecutorType.Activate, CardId.RyzealDeadnader, RyzealDeadnaderActivate); + AddExecutor(ExecutorType.Activate, CardId.RyzealDuodrive, RyzealDuodriveActivate); + AddExecutor(ExecutorType.Activate, CardId.TwinsOfTheEclipse, TwinsOfTheEclipseActivate); + AddExecutor(ExecutorType.Activate, CardId.AbyssDweller, AbyssDwellerActivate); + AddExecutor(ExecutorType.Activate, CardId.TornadoDragon, TornadoDragonActivate); + + // hand effect + AddExecutor(ExecutorType.Activate, _CardId.LockBird, LockBirdActivate); + AddExecutor(ExecutorType.Activate, _CardId.MulcharmyPurulia, MulcharmyPuruliaActivate); + AddExecutor(ExecutorType.Activate, _CardId.MulcharmyNyalus, MulcharmyNyalusActivate); + AddExecutor(ExecutorType.Activate, _CardId.MulcharmyFuwalos, MulcharmyFuwalosActivate); + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + + // pre-action activate + AddExecutor(ExecutorType.Activate, CardId.Bonfire, BonfireActivate); + AddExecutor(ExecutorType.Activate, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireActivate); + AddExecutor(ExecutorType.Activate, CardId.Number60DugaresTheTimeless, Number60DugaresTheTimelessActivate); + AddExecutor(ExecutorType.Activate, CardId.RyzealCross, RyzealCrossActivateCard); + AddExecutor(ExecutorType.Activate, CardId.TripleTacticsTalent, TripleTacticsTalentActivate); + AddExecutor(ExecutorType.Activate, CardId.Bonfire, BonfireActivateToSearchNecessary); + AddExecutor(ExecutorType.Activate, CardId.SeventhTachyon, SeventhTachyonActivate); + + AddExecutor(ExecutorType.Repos, ChangePositionFirst); + + // xyz summon + AddExecutor(ExecutorType.SpSummon, _CardId.EvilswarmExcitonKnight, EvilswarmExcitonKnightSpSummon); + AddExecutor(ExecutorType.SpSummon, LessSpSummonExtra); + AddExecutor(ExecutorType.SpSummon, CardId.RyzealDuodrive, FirstRyzealDuodriveSpSummon); + AddExecutor(ExecutorType.SpSummon, SecondXyzSummon); + AddExecutor(ExecutorType.SpSummon, CardId.TwinsOfTheEclipse, TwinsOfTheEclipseSpSummon); + AddExecutor(ExecutorType.SpSummon, FinalXyzSummon); + AddExecutor(ExecutorType.SpSummon, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireSpSummon); + + AddExecutor(ExecutorType.Activate, _CardId.PotOfDesires, PotOfDesireActivateForContinue); + + AddExecutor(ExecutorType.Activate, CardId.RyzealPlugIn, RyzealPlugInActivateFirst); + AddExecutor(ExecutorType.Activate, CardId.NodeRyzeal, NodeRyzealActivateFirst); + AddExecutor(ExecutorType.Activate, CardId.RyzealCross, RyzealCrossActivateRecycleFirst); + + // summon/spsummon + AddExecutor(ExecutorType.SpSummon, CardId.IceRyzeal, IceRyzealSpSummonFirst); + AddExecutor(ExecutorType.SpSummon, CardId.NodeRyzeal, NodeRyzealSpSummonFirst); + + AddExecutor(ExecutorType.Summon, CardId.ExRyzeal, ExRyzealSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ExRyzeal, ExRyzealSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ThodeRyzeal, ThodeRyzealSpSummon); + AddExecutor(ExecutorType.Summon, CardId.IceRyzeal, IceRyzealSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ExRyzeal, ExRyzealSpSummonLater); + AddExecutor(ExecutorType.Summon, CardId.ThodeRyzeal, ThodeRyzealSummon); + AddExecutor(ExecutorType.SpSummon, CardId.NodeRyzeal, NodeRyzealSpSummon); + AddExecutor(ExecutorType.Summon, Level4Summon); + + AddExecutor(ExecutorType.Activate, CardId.NodeRyzeal, NodeRyzealActivate); + AddExecutor(ExecutorType.Activate, CardId.RyzealPlugIn, RyzealPlugInActivate); + AddExecutor(ExecutorType.SpSummon, CardId.IceRyzeal, IceRyzealSpSummon); + + // activate + AddExecutor(ExecutorType.Activate, CardId.MereologicAggregator, MereologicAggregatorActivateFirst); + AddExecutor(ExecutorType.Activate, CardId.IceRyzeal, IceRyzealActivate); + AddExecutor(ExecutorType.Activate, CardId.ThodeRyzeal, ThodeRyzealActivate); + AddExecutor(ExecutorType.Activate, CardId.ExRyzeal, ExRyzealActivate); + AddExecutor(ExecutorType.Activate, CardId.MereologicAggregator, MereologicAggregatorActivateLater); + + // after summon + AddExecutor(ExecutorType.Activate, CardId.RyzealCross, RyzealCrossActivateRecycleLater); + AddExecutor(ExecutorType.Activate, _CardId.PotOfDesires, PotOfDesiresActivate); + + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + + } + + const int attrbuteLightDark = (int)CardAttribute.Light | (int)CardAttribute.Dark; + const int SetcodeTimeLord = 0x4a; + const int SetcodeAtlantean = 0x77; + const int SetcodeInfernoid = 0xbb; + const int SetcodeMajespecter = 0xd0; + const int SetcodePhantomKnight = 0x10db; + const int SetcodeSkyStriker = 0x115; + const int SetcodeOrcust = 0x11b; + const int SetcodeSangen = 0x1a9; + const int SetcodeTenpaiDragon = 0x1aa; + const int SetcodeBranded = 0x15d; + const int SetcodeFloowandereeze = 0x16d; + const int SetcodeLabrynth = 0x17e; + const int SetcodeTearlaments = 0x181; + const int SetcodeHorus = 0x19d; + const int SetcodeRyzeal = 0x1be; + const int hintTimingMainEnd = 0x4; + List NotToNegateIdList = new List + { + 58699500, 20343502, 25451383, 19403423 + }; + List AlbazFusionList = new List + { + 1906812, 38811586, 41373230, 44146295, 51409648, 51409648, 87746184 + }; + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal, _CardId.AshBlossom, _CardId.EffectVeiler, CardId.SeventhTachyon, + _CardId.InfiniteImpermanence}}, + {2, new List { _CardId.MulcharmyFuwalos, _CardId.GhostOgreAndSnowRabbit, _CardId.MaxxC, _CardId.PotOfDesires, _CardId.CalledByTheGrave }}, + {1, new List { CardId.NodeRyzeal, _CardId.MulcharmyPurulia, _CardId.MulcharmyNyalus, _CardId.LockBird, CardId.TripleTacticsTalent, + CardId.Bonfire, CardId.RyzealPlugIn, _CardId.CrossoutDesignator, CardId.RyzealCross}} + }; + List NotToDestroySpellTrap = new List { 50005218, 6767771 }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, _CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, CardId.MereologicAggregator, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + List NeedIceToSolveIdList = new List { 80978111, 87170768 }; + List currentCanActivateEffect = new List(); + + int maxSummonCount = 1; + int summonCount = 1; + bool enemyActivateMaxxC = false; + bool enemyActivatePurulia = false; + bool enemyActivateFuwalos = false; + bool enemyActivateNyalus = false; + bool lockBirdSolved = false; + int dimensionShifterCount = 0; + bool botActivateMulcharmy = false; + bool botSolvingCross = false; + List CheckSetcodeList = new List { SetcodePhantomKnight, SetcodeOrcust, SetcodeAtlantean, SetcodeRyzeal, SetcodeTenpaiDragon, SetcodeSangen, + SetcodeInfernoid, SetcodeSkyStriker, SetcodeLabrynth, SetcodeTearlaments }; + List CheckBotSolvedList = new List { _CardId.MaxxC, _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus, + CardId.AbyssDweller, _CardId.EvilswarmExcitonKnight, CardId.RyzealPlugIn }; + + bool enemyActivateInfiniteImpermanenceFromHand = false; + ClientCard deadnaderDestroySelf = null; + + List infiniteImpermanenceList = new List(); + List currentNegateCardList = new List(); + List currentDestroyCardList = new List(); + List activatedCardIdList = new List(); + List spSummonedCardIdList = new List(); + List botSolvedCardIdList = new List(); + List enemyPlaceThisTurn = new List(); + List summonThisTurn = new List(); + + List hardToDestroyCardList = new List(); + List cannotDestroyCardList = new List(); + HashSet enemyDeckTypeRecord = new HashSet(); + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 + && (card.IsShouldNotBeSpellTrapTarget() && !card.IsDisabled())) return false; + } + return true; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + public int CheckRemainInDeck(params int[] ids) + { + int sum = 0; + foreach (int id in ids) + { + sum += CheckRemainInDeck(id); + } + return sum; + } + + public bool CheckWhetherHaveFinalMonster() + { + foreach (ClientCard monster in Bot.MonsterZone) + { + if (monster == null) continue; + if (monster.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && monster.IsDefense()) return true; + if (monster.IsCode(CardId.AbyssDweller) && monster.Overlays.Count() > 0) return true; + if (monster.IsCode(CardId.RyzealDeadnader) && monster.Overlays.Count() > 0) return true; + } + + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0, bool ignore41 = false) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= ((int)type & (int)CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (((int)type & (int)CardType.Spell) != 0) || (((int)type & (int)CardType.Trap) != 0); + bool isCounter = ((int)type & (int)CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck && CheckSpellWillBeNegate(isCounter)) + return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card, ignore41)) || Bot.MonsterZone.Any(card => CheckNumber41(card, ignore41))) return true; + } + if (Enemy.HasInSpellZone(_CardId.SkillDrain, true, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card, bool ignoreSelf41 = false) + { + return card != null && card.IsFaceup() && card.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled() + && (!ignoreSelf41 || card.Controller == 0); + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(_CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true)) return true; + if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Bot.HasInSpellZone(_CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(_CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(_CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(_CardId.RoyalDecreel, true) || Bot.HasInSpellZone(_CardId.RoyalDecreel, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + // how to get here? + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + return CheckCardShouldNegate(lastcard); + } + + public bool CheckCardShouldNegate(ClientCard card) + { + if (card == null) return false; + if (card.IsMonster() && card.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (NotToNegateIdList.Contains(card.Id)) return false; + if (card.HasSetcode(_Setcode.Danger) && card.Location == CardLocation.Hand) return false; + if (card.IsMonster() && card.Location == CardLocation.MonsterZone && card.HasPosition(CardPosition.Defence)) + { + if (Enemy.MonsterZone.Any(c => CheckNumber41(c)) || Bot.MonsterZone.Any(c => CheckNumber41(c))) return false; + } + if (DefaultCheckWhetherCardIsNegated(card)) return false; + if (Duel.Player == 1 && card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus)) return false; + if (card.IsDisabled()) return false; + + return true; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && (Duel.Player == 0 || Bot.GetMonsterCount() > 0)) return true; + return false; + } + + public bool CheckShouldNoMoreSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && !lockBirdSolved && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2)) + { + return true; + } + return false; + } + + public bool CheckShouldNoMoreSpSummon(CardLocation loc) + { + if (CheckShouldNoMoreSpSummon()) return true; + if (lockBirdSolved || (Duel.Turn > 1 && Duel.Phase < DuelPhase.Main2)) return false; + if (enemyActivatePurulia && (loc & CardLocation.Hand) != 0) return true; + if (enemyActivateFuwalos && (loc & (CardLocation.Deck | CardLocation.Extra)) != 0) return true; + if (enemyActivateNyalus && (loc & (CardLocation.Grave | CardLocation.Removed)) != 0) return true; + + return false; + } + + public bool CheckWhetherCanSummon() + { + return Duel.Player == 0 && Duel.Phase < DuelPhase.End && summonCount > 0; + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { _CardId.BanisheroftheRadiance, _CardId.BanisheroftheLight, _CardId.MacroCosmos, _CardId.DimensionalFissure, + _CardId.KashtiraAriseHeart, _CardId.MaskedHERODarkLaw }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true, false, true) || cf.HasInSpellZone(cardid, true, true)) + { + return true; + } + } + } + return false; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + ClientCard activatingAlbaz = Enemy.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(68468459) && !c.IsDisabled() + && !currentDestroyCardList.Contains(c) && !currentNegateCardList.Contains(c) && Duel.CurrentChain.Contains(c)); + if (activatingAlbaz != null) return activatingAlbaz; + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentDestroyCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + public bool CheckCanContinueSummon(bool skipDuodriver = false) + { + bool checkFlag = summonCount > 0 && !activatedCardIdList.Contains(CardId.IceRyzeal) && Bot.HasInHand(CardId.IceRyzeal) + && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal); + if (Bot.HasInHand(CardId.ThodeRyzeal) && !spSummonedCardIdList.Contains(CardId.ThodeRyzeal) + && !activatedCardIdList.Contains(CardId.ThodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ThodeRyzeal)) + { + checkFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal)); + checkFlag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal)); + } + checkFlag |= !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal) + && Bot.HasInHand(CardId.ExRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal) && !CheckWhetherWillbeRemoved(); + + checkFlag |= !activatedCardIdList.Contains(CardId.RyzealDuodrive + 1) && Bot.HasInExtra(CardId.RyzealDuodrive) + && !DefaultCheckWhetherCardIdIsNegated(CardId.RyzealDuodrive) && !CheckWhetherNegated(true, true, CardType.Monster) + && summonCount > 0 && Bot.Hand.Count(c => c.Level == 4) > 0 && GetLevel4CountOnField() == 1 && !lockBirdSolved + && !skipDuodriver; + + return checkFlag; + } + + /// + /// check enemy's dangerous card in grave + /// + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantomKnight) || card.HasSetcode(SetcodeHorus))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, 9411399, 28954097, 30680659 + }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType) + ) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !NotToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0, bool forNegate = false) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) + && (!forNegate || (!card.IsDisabled() && card.HasType(CardType.Effect))) + ).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card) && card.IsFacedown()).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card) && card.IsFacedown()).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) + && (!forNegate || (!card.IsDisabled() && card.HasType(CardType.Effect))) + ).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + if (chainingCard.HasPosition(CardPosition.Defence)) + { + bool have41 = Bot.MonsterZone.Any(c => CheckNumber41(c)) | Enemy.MonsterZone.Any(c => CheckNumber41(c)); + } + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public List GetLevel4OnField(Func filter) + { + return Bot.GetMonsters().Where(c => (filter == null || filter(c)) + && c.IsFaceup() && !c.HasType(CardType.Xyz | CardType.Link) && c.Level == 4).OrderBy(c => c.GetDefensePower()).ToList(); + } + + public int GetLevel4CountOnField() + { + return Bot.GetMonsters().Count(c => c.IsFaceup() && !c.HasType(CardType.Xyz | CardType.Link) && c.Level == 4); + } + + public int GetLevel4FinalCountOnField(bool checkSupport, out bool hasNode) + { + // check whether have 4 monsters for material. + // if not, skip the second xyz monster. + int level4Count = GetLevel4CountOnField(); + if (Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !CheckWhetherWillbeRemoved()) + { + if (checkSupport || + (!activatedCardIdList.Contains(CardId.ExRyzeal) && Bot.MonsterZone.All(c => c != null && (c.IsFacedown() || !c.HasType(CardType.Link) && c.Level == 4)))) + { + level4Count++; + } + } + if (Bot.HasInHand(CardId.ThodeRyzeal) && !spSummonedCardIdList.Contains(CardId.ThodeRyzeal)) + { + bool flag = Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal)); + flag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal)); + if (flag) + { + if (checkSupport || !activatedCardIdList.Contains(CardId.ThodeRyzeal)) + { + level4Count++; + } + } + } + hasNode = Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(CardId.NodeRyzeal) && !c.IsDisabled()); + if (Bot.HasInHand(CardId.NodeRyzeal) && !spSummonedCardIdList.Contains(CardId.NodeRyzeal)) + { + bool flag = Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz)); + if (flag) + { + hasNode = true; + level4Count++; + } + } + if (Bot.HasInHand(CardId.RyzealPlugIn) && !CheckWhetherNegated(true, true, CardType.Spell) && checkSupport) + { + bool flag = false; + List graveTargetList = Bot.Graveyard.Where( + c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && !c.HasType(CardType.Xyz) && c.Level == 4).ToList(); + flag |= graveTargetList.Count() > 0; + hasNode |= graveTargetList.Any(c => c.IsCode(CardId.NodeRyzeal)); + + List banishedTargetList = Bot.Banished.Where( + c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && !c.HasType(CardType.Xyz) && c.Level == 4).ToList(); + flag |= banishedTargetList.Count() > 0; + hasNode |= banishedTargetList.Any(c => c.IsCode(CardId.NodeRyzeal)); + + if (flag) level4Count++; + } + hasNode &= !CheckWhetherWillbeRemoved() && !activatedCardIdList.Contains(CardId.NodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.NodeRyzeal); + hasNode &= Bot.Graveyard.Any(c => c != null && c.IsMonster() && c.HasSetcode(SetcodeRyzeal) && !c.IsCode(CardId.NodeRyzeal) && c.Level == 4); + if (hasNode) + { + bool flag = Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && !c.HasType(CardType.Xyz) && c.Level == 4 && !c.IsCode(CardId.NodeRyzeal)); + if (flag) + { + if (checkSupport || GetCostFromHandAndField(null, false).Count() > 0) level4Count++; + } + } + if (checkSupport) + { + int checkHandCount = 2; + if (summonCount > 0 && Bot.Hand.Any(c => c.Level == 4 && !c.IsCode(CardId.ExRyzeal, CardId.ThodeRyzeal, CardId.NodeRyzeal))) + { + level4Count++; + checkHandCount++; + } + if (Bot.Hand.Count() >= checkHandCount && Bot.HasInHand(CardId.IceRyzeal) && !spSummonedCardIdList.Contains(CardId.IceRyzeal) && !CheckWhetherWillbeRemoved()) + { + level4Count++; + } + } + + return level4Count; + } + + public List GetCostFromHandAndFieldFirst(ClientCard exceptCard) + { + return Bot.MonsterZone.Where(c => c != null && !c.IsDisabled() && c.IsCode(NeedIceToSolveIdList) && c != exceptCard && !c.HasType(CardType.Token)).ToList(); + } + + public List GetCostFromHandAndField(ClientCard exceptCard, bool sendNotNecessary) + { + List resultList = GetCostFromHandAndFieldFirst(exceptCard); + if (!activatedCardIdList.Contains(CardId.TwinsOfTheEclipse + 1)) + { + List xyzList = Bot.Graveyard.Where(c => c.HasType(CardType.Xyz)).ToList(); + // sending twins + ClientCard twins = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.TwinsOfTheEclipse) && !resultList.Contains(c)); + if (twins == null) + { + twins = Bot.SpellZone.FirstOrDefault(c => c != null && c.IsCode(CardId.TwinsOfTheEclipse) && !resultList.Contains(c)); + } + if (twins != null) + { + int twinsXyzCount = 0; + foreach (int cardId in twins.Overlays) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null && cardData.HasType(CardType.Xyz)) twinsXyzCount++; + } + bool flag = twinsXyzCount >= 2; + flag |= twinsXyzCount > 0 && xyzList.Count() > 0; + flag |= xyzList.Count() > 1 && xyzList.Count(c => c.IsCanRevive()) > 0; + if (flag) + { + resultList.Add(twins); + } + } + } + + if (Bot.HasInSpellZone(CardId.RyzealCross, true, true)) + { + // sending duodrive because not enough material on field + if (Bot.HasInExtra(CardId.RyzealDuodrive) && !activatedCardIdList.Contains(CardId.RyzealDuodrive + 1) && !lockBirdSolved) + { + bool checkOverlay = true; + ClientCard duoDrive = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.RyzealDuodrive) && !resultList.Contains(c)); + if (duoDrive == null) + { + checkOverlay = false; + duoDrive = Bot.SpellZone.FirstOrDefault(c => c != null && c.IsCode(CardId.RyzealDuodrive) && !resultList.Contains(c)); + } + if (duoDrive != null) + { + int overlayCount = Bot.MonsterZone.Sum(c => c != null ? c.Overlays.Count() : 0); + if (!checkOverlay || overlayCount < 2) + { + resultList.Add(duoDrive); + } + } + } + // send deadnader with no overlay + if (Bot.HasInExtra(CardId.RyzealDeadnader)) + { + ClientCard deadnader = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.RyzealDeadnader) && c.Overlays.Count() == 0 && !resultList.Contains(c)); + if (deadnader != null) + { + resultList.Add(deadnader); + } + } + } + + // sending monsters in spell zone + List monstersInSpellZone = Bot.SpellZone.Where(c => c != null && c.Data != null + && c.Data.HasType(CardType.Monster) && !c.Data.HasType(CardType.Pendulum | CardType.Token) && !resultList.Contains(c)).ToList(); + resultList.AddRange(monstersInSpellZone); + + // send enemy monsters + List enemyMonsters = Bot.MonsterZone.Where(c => c != null && !resultList.Contains(c) && c.Owner == 1).ToList(); + resultList.AddRange(enemyMonsters); + + if (sendNotNecessary) + { + // send xyz monster with no material + List xyzMonsterWithNoMaterial = Bot.MonsterZone.Where( + c => c != null && c.HasType(CardType.Xyz) && c.GetDefensePower() < 2500 && c.Overlays.Count() == 0 && !resultList.Contains(c)) + .OrderBy(c => c.GetDefensePower()).ToList(); + resultList.AddRange(xyzMonsterWithNoMaterial); + + // sending unimportant card in hand + List unimportantList = new List { _CardId.MulcharmyNyalus, _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, CardId.SeventhTachyon }; + resultList.AddRange(Bot.Hand.Where(c => c != null && c.IsCode(unimportantList) && !resultList.Contains(c))); + + // sending activated ryzeal monster + List checkRyzealIdList = new List { CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal }; + foreach (int checkId in checkRyzealIdList) + { + if (summonCount == 0 && spSummonedCardIdList.Contains(checkId)) + { + List ryzealList = Bot.Hand.Where(c => c != null && c != exceptCard && !resultList.Contains(c) && c.IsCode(checkId)).ToList(); + resultList.AddRange(ryzealList); + } + } + + // sending dump cards + foreach (ClientCard card in Bot.Hand) + { + if (Bot.Hand.Count(c => c != null && !resultList.Contains(c) && c.IsCode(card.Id)) > 1) + { + resultList.Add(card); + } + } + + if (resultList.Count() == 0) + { + // sending other cards + List checkIdList = new List { _CardId.CrossoutDesignator, _CardId.CalledByTheGrave, _CardId.InfiniteImpermanence, + _CardId.GhostOgreAndSnowRabbit, _CardId.LockBird, _CardId.AshBlossom, _CardId.MaxxC }; + foreach (int checkId in checkIdList) + { + List costList = Bot.Hand.Where(c => c != null && c != exceptCard && !resultList.Contains(c) && c.IsCode(checkId)).ToList(); + resultList.AddRange(costList); + } + } + } + + return resultList; + } + + public int GetBotCurrentTotalAttack(List exceptList = null) + { + if (Util.IsTurn1OrMain2() || botSolvedCardIdList.Contains(_CardId.EvilswarmExcitonKnight)) return 0; + int result = 0; + foreach (ClientCard monster in Bot.GetMonsters()) + { + if (exceptList != null && exceptList.Contains(monster)) continue; + if (monster.IsAttack() || !summonThisTurn.Contains(monster)) result += monster.Attack; + } + return result; + } + + public int GetNegateEffectCount() + { + int count = 0; + count += GetCalledbytheGraveIdCount(_CardId.MaxxC) < 2 && Bot.HasInHand(_CardId.MaxxC) ? 1 : 0; + count += GetCalledbytheGraveIdCount(_CardId.AshBlossom) < 2 && Bot.HasInHand(_CardId.AshBlossom) ? 1 : 0; + count += GetCalledbytheGraveIdCount(_CardId.EffectVeiler) < 2 && Bot.HasInHand(_CardId.EffectVeiler) ? 1 : 0; + count += GetCalledbytheGraveIdCount(_CardId.GhostOgreAndSnowRabbit) < 2 && Bot.HasInHand(_CardId.GhostOgreAndSnowRabbit) ? 1 : 0; + count += GetCalledbytheGraveIdCount(_CardId.LockBird) < 2 && Bot.HasInHand(_CardId.LockBird) ? 1 : 0; + count += Bot.SpellZone.Count(c => c != null && c.IsFacedown() && c.IsCode(_CardId.InfiniteImpermanence)); + count += Math.Min(4 - Bot.GetSpellCountWithoutField(), Bot.Hand.Count(c => c.IsCode(_CardId.InfiniteImpermanence))); + + return count; + } + + public override BattlePhaseAction OnBattle(IList attackers, IList defenders) + { + if (attackers.Count() > 0 && defenders.Count() > 0) + { + List sortedAttacker = attackers.OrderBy(card => card.Attack).ToList(); + ClientCard rayLancer = attackers.FirstOrDefault(c => c.IsCode(CardId.FullArmoredUtopicRayLancer) && !c.IsDisabled()); + if (rayLancer != null) + { + sortedAttacker.Remove(rayLancer); + sortedAttacker.Insert(0, rayLancer); + } + for (int k = 0; k < sortedAttacker.Count; ++k) + { + ClientCard attacker = sortedAttacker[k]; + attacker.IsLastAttacker = k == sortedAttacker.Count - 1; + BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders); + if (result != null) + return result; + } + } + + return base.OnBattle(attackers, defenders); + } + + public override ClientCard OnSelectAttacker(IList attackers, IList defenders) + { + ClientCard twin = attackers.FirstOrDefault(c => c.IsCode(CardId.TwinsOfTheEclipse) && !c.IsDisabled()); + if (twin != null) + { + if (Enemy.MonsterZone.Any(c => c != null && c.GetDefensePower() <= 2500)) + { + return twin; + } + } + return null; + } + + public override void OnSelectChain(IList cards) + { + if (cards != null && cards.Count() > 0) + { + currentCanActivateEffect.Clear(); + currentCanActivateEffect.AddRange(cards); + } + base.OnSelectChain(cards); + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + if (botSolvingCross) + { + if (hint == HintMsg.DeattachFrom) + { + List> funcList = new List> + { + (c) => c.IsDisabled() && c.IsCode(CardId.RyzealDuodrive), + (c) => c.IsCode(CardId.RyzealDuodrive), + (c) => c.IsDisabled() && c.IsCode(CardId.RyzealDeadnader), + (c) => c.IsCode(CardId.RyzealDeadnader) + }; + foreach (Func func in funcList) + { + ClientCard target = cards.FirstOrDefault(c => c != null && func(c)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + if (hint == HintMsg.RemoveXyz) + { + List targets = cards.OrderBy(c => c.Attack).ToList(); + botSolvingCross = false; + return Util.CheckSelectCount(targets, cards, min, max); + } + } + + if (currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.EvenlyMatched)) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List dumpMainMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && CheckRemainInDeck(card.Id) > 0).ToList(); + dumpMainMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpMainMonsterList); + + // spells + bool canUsePluginToSpSummonDeadnader = Bot.Graveyard.Any(c => c != null && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + canUsePluginToSpSummonDeadnader |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + + List faceUpSpells = Bot.GetSpells().Where(c => c.IsFaceup()).ToList(); + banishList.AddRange(ShuffleList(faceUpSpells)); + List faceDownSpells = Bot.GetSpells().Where(c => c.IsFacedown() + && !(canUsePluginToSpSummonDeadnader && c.IsCode(CardId.RyzealPlugIn))).ToList(); + banishList.AddRange(ShuffleList(faceDownSpells)); + + List uniqueMainMonster = botMonsters.Where(card => !banishList.Contains(card) + && !card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && CheckRemainInDeck(card.Id) == 0).ToList(); + uniqueMainMonster.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(uniqueMainMonster); + + List dumpExtraMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && Bot.HasInExtra(card.Id)).ToList(); + dumpExtraMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpExtraMonsterList); + + List uniqueExtraMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && !Bot.HasInExtra(card.Id)).ToList(); + uniqueExtraMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(uniqueExtraMonsterList); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + + if (currentSolvingChain.Controller == 0) + { + if (hint == HintMsg.AddToHand) + { + if (currentSolvingChain.IsCode(CardId.ThodeRyzeal)) + { + ClientCard ice = cards.FirstOrDefault(c => c.IsCode(CardId.IceRyzeal)); + ClientCard ex = cards.FirstOrDefault(c => c.IsCode(CardId.ExRyzeal)); + if (ice != null) + { + bool canSummonAndActivateIce = Duel.Player == 0 && summonCount > 0 && Duel.Phase < DuelPhase.End; + bool flag = canSummonAndActivateIce && !Bot.HasInHand(CardId.IceRyzeal) + && !activatedCardIdList.Contains(CardId.IceRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal); + flag |= ex == null; + flag |= Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && c.IsCode(NeedIceToSolveIdList)) + && !spSummonedCardIdList.Contains(CardId.IceRyzeal) && !CheckWhetherWillbeRemoved(); + if (!canSummonAndActivateIce) + { + flag |= DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal); + flag |= spSummonedCardIdList.Contains(CardId.ExRyzeal) || activatedCardIdList.Contains(CardId.ExRyzeal); + } + if (flag) + { + return Util.CheckSelectCount(new List { ice }, cards, min, max); + } + } + if (ex != null) + { + bool flag = !Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal); + flag |= Bot.HasInHand(CardId.IceRyzeal); + flag |= ice == null; + if (flag) + { + return Util.CheckSelectCount(new List { ex }, cards, min, max); + } + } + } + + if (currentSolvingChain.IsCode(CardId.ExRyzeal)) + { + ClientCard thode = cards.FirstOrDefault(c => c.IsCode(CardId.ThodeRyzeal)); + ClientCard node = cards.FirstOrDefault(c => c.IsCode(CardId.NodeRyzeal)); + if (thode != null) + { + bool flag = node == null; + flag |= !Bot.HasInHand(CardId.ThodeRyzeal) && !spSummonedCardIdList.Contains(CardId.ThodeRyzeal) && !activatedCardIdList.Contains(CardId.ThodeRyzeal); + + if (flag) + { + return Util.CheckSelectCount(new List { thode }, cards, min, max); + } + } + if (node != null) + { + bool flag = thode == null; + flag |= spSummonedCardIdList.Contains(CardId.ThodeRyzeal) && activatedCardIdList.Contains(CardId.ThodeRyzeal) + && !DefaultCheckWhetherCardIdIsNegated(CardId.ThodeRyzeal); + flag |= CheckShouldNoMoreSpSummon(CardLocation.Hand) && !CheckShouldNoMoreSpSummon(CardLocation.Grave) + && !spSummonedCardIdList.Contains(CardId.NodeRyzeal); + + if (flag) + { + return Util.CheckSelectCount(new List { node }, cards, min, max); + } + } + } + + if (currentSolvingChain.IsCode(CardId.Bonfire) || currentSolvingChain.IsCode(CardId.SeventhTachyon)) + { + if (!Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !CheckWhetherWillbeRemoved()) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(CardId.ExRyzeal)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (!Bot.HasInHand(CardId.IceRyzeal)) + { + bool flag = summonCount > 0 && !activatedCardIdList.Contains(CardId.IceRyzeal); + flag |= !spSummonedCardIdList.Contains(CardId.IceRyzeal) && Bot.Hand.Count > 0; + if (flag) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(CardId.IceRyzeal)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + List searchTargetList = new List { CardId.ExRyzeal, CardId.IceRyzeal }; + foreach (int targetId in searchTargetList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + if (currentSolvingChain.IsCode(CardId.RyzealDuodrive)) + { + // search spells + if (!CheckWhetherNegated(true, true, CardType.Spell)) + { + ClientCard cross = cards.FirstOrDefault(c => c.IsCode(CardId.RyzealCross)); + if (cross != null) + { + return Util.CheckSelectCount(new List { cross }, cards, min, max); + } + + ClientCard plugin = cards.FirstOrDefault(c => c.IsCode(CardId.RyzealPlugIn)); + if (plugin != null) + { + return Util.CheckSelectCount(new List { plugin }, cards, min, max); + } + } + + // search for spsummon + List>> checkList = new List>> + { + new KeyValuePair>(CardId.IceRyzeal, + () => Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && c.IsCode(NeedIceToSolveIdList)) + && !spSummonedCardIdList.Contains(CardId.IceRyzeal) && !CheckWhetherWillbeRemoved() ), + new KeyValuePair>(CardId.ExRyzeal, + () => !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal) + && !DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal) && !CheckWhetherWillbeRemoved() ), + new KeyValuePair>(CardId.IceRyzeal, + () => summonCount > 0 && !activatedCardIdList.Contains(CardId.IceRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal) ), + new KeyValuePair>(CardId.ThodeRyzeal, + () => !spSummonedCardIdList.Contains(CardId.ThodeRyzeal) && !activatedCardIdList.Contains(CardId.ThodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ThodeRyzeal) ), + new KeyValuePair>(CardId.NodeRyzeal, + () => !spSummonedCardIdList.Contains(CardId.NodeRyzeal) ) + }; + foreach (KeyValuePair> pair in checkList) + { + if (!Bot.HasInHand(pair.Key) && pair.Value()) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(pair.Key)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + // search not exists + List searchList = new List { CardId.ExRyzeal, CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.NodeRyzeal }; + foreach (int id in searchList) + { + if (!Bot.HasInHand(id)) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(id)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + // random search + return Util.CheckSelectCount(ShuffleList(cards.ToList()), cards, min, max); + } + } + + if (hint == HintMsg.SpSummon) + { + if (currentSolvingChain.IsCode(CardId.IceRyzeal)) + { + ClientCard thode = cards.FirstOrDefault(c => c.IsCode(CardId.ThodeRyzeal)); + ClientCard ex = cards.FirstOrDefault(c => c.IsCode(CardId.ExRyzeal)); + ClientCard node = cards.FirstOrDefault(c => c.IsCode(CardId.NodeRyzeal)); + if (thode != null) + { + bool flag = !activatedCardIdList.Contains(CardId.ThodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ThodeRyzeal); + flag |= Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal); + flag |= ex == null && node == null; + if (flag) + { + return Util.CheckSelectCount(new List { thode }, cards, min, max); + } + } + if (ex != null) + { + bool flag = !activatedCardIdList.Contains(CardId.ExRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal); + flag |= Bot.HasInHand(CardId.ThodeRyzeal) && !spSummonedCardIdList.Contains(CardId.ThodeRyzeal); + flag |= thode == null && node == null; + if (flag) + { + return Util.CheckSelectCount(new List { ex }, cards, min, max); + } + } + if (node != null) + { + return Util.CheckSelectCount(new List { node }, cards, min, max); + } + } + + if (currentSolvingChain.IsCode(CardId.TwinsOfTheEclipse)) + { + ClientCard target = TwinsOfTheEclipseRebornTarget(new List(cards)); + + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + + if (hint == HintMsg.ToDeck) + { + if (currentSolvingChain.IsCode(CardId.TripleTacticsTalent)) + { + foreach (ClientCard hand in cards) + { + foreach (int setcode in CheckSetcodeList) + { + if (hand.HasSetcode(setcode)) + { + enemyDeckTypeRecord.Add(setcode); + } + } + } + return Util.CheckSelectCount(ShuffleList(cards.ToList()), cards, min, max); + } + } + + if (hint == HintMsg.XyzMaterial) + { + if (currentSolvingChain.IsCode(CardId.RyzealDeadnader, CardId.RyzealDuodrive, CardId.RyzealPlugIn)) + { + // material that have effect + ClientCard effectTarget = cards.FirstOrDefault(c => c.IsCode(CardId.TwinsOfTheEclipse, CardId.MereologicAggregator)); + if (effectTarget != null) + { + return Util.CheckSelectCount(new List { effectTarget }, cards, min, max); + } + // cards in hand + foreach (ClientCard card in cards) + { + if (Bot.Hand.Count(c => c.IsCode(card.Id)) > 0) + { + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + // dump card + foreach (ClientCard card in cards) + { + if (cards.Count(c => c.IsCode(card.Id)) > 1) { + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + } + } + + if (hint == HintMsg.RemoveXyz) + { + if (currentSolvingChain.IsCode(CardId.RyzealDuodrive)) + { + List resultList = new List(); + + List detachOwnerIdList = new List { CardId.StarliegePhotonBlastDragon, CardId.RyzealDuodrive, CardId.TwinsOfTheEclipse, + CardId.FullArmoredUtopicRayLancer, _CardId.EvilswarmExcitonKnight, CardId.Number60DugaresTheTimeless, CardId.RyzealDeadnader }; + foreach (int ownerId in detachOwnerIdList) + { + // detach from DuoDrive first + List detachMaterialList = cards.Where(c => c.OwnTargets.Any(oc => oc.IsCode(ownerId))).ToList(); + if (detachMaterialList.Count() > 0) + { + // deadnader + ClientCard deadnader = detachMaterialList.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + if (deadnader != null) + { + resultList.Add(deadnader); + } + List> filterList = new List> + { + (c) => !resultList.Contains(c) + && !c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse) + && Bot.HasInSpellZone(CardId.RyzealCross) && c.HasSetcode(SetcodeRyzeal) + && (c.Data == null || ((c.Data.Attribute & attrbuteLightDark) != 0)), + (c) => !resultList.Contains(c) + && !c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse) + && Bot.HasInSpellZone(CardId.RyzealCross) && c.HasSetcode(SetcodeRyzeal), + (c) => !resultList.Contains(c) + && !c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse) + && (c.Data == null || ((c.Data.Attribute & attrbuteLightDark) != 0)), + (c) => !resultList.Contains(c) + && !c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse), + (c) => !resultList.Contains(c) + }; + foreach (Func filter in filterList) + { + foreach (ClientCard material in detachMaterialList) + { + if (filter(material)) + { + resultList.Add(material); + } + } + } + } + } + return Util.CheckSelectCount(resultList, cards, min, max); + } + } + + // gain material by plugin + if (currentSolvingChain.IsCode(CardId.RyzealPlugIn) && cards.All(c => c.Location == CardLocation.MonsterZone)) + { + ClientCard abyssDweller = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.AbyssDweller) && c.Overlays.Count() < 2); + if (abyssDweller != null && AbyssDwellerSummonCheck()) + { + return Util.CheckSelectCount(new List { abyssDweller }, cards, min, max); + } + + ClientCard duoDriver = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.RyzealDuodrive) && c.Overlays.Count() == 1); + if (duoDriver != null && Bot.HasInMonstersZone(CardId.StarliegePhotonBlastDragon, true, false, true)) + { + return Util.CheckSelectCount(new List { duoDriver }, cards, min, max); + } + + ClientCard deadnader = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.RyzealDeadnader)); + if (deadnader != null) + { + return Util.CheckSelectCount(new List { deadnader }, cards, min, max); + } + + if (Bot.HasInSpellZone(CardId.RyzealCross, true, true)) + { + ClientCard ryzealXyz = cards.FirstOrDefault(c => c != null && c.HasSetcode(SetcodeRyzeal)); + if (ryzealXyz != null) + { + return Util.CheckSelectCount(new List { ryzealXyz }, cards, min, max); + } + } + + ClientCard tornadoDragon = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.TornadoDragon) && c.Overlays.Count() == 1); + if (tornadoDragon != null && TornadoDragonSummonCheck()) + { + return Util.CheckSelectCount(new List { tornadoDragon }, cards, min, max); + } + + ClientCard no41 = cards.FirstOrDefault(c => c != null && c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null && Number41BagooskatheTerriblyTiredTapirSummonCheck()) + { + return Util.CheckSelectCount(new List { no41 }, cards, min, max); + } + + duoDriver = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.RyzealDuodrive)); + if (duoDriver != null) + { + return Util.CheckSelectCount(new List { duoDriver }, cards, min, max); + } + } + + // double attack + if (currentSolvingChain.IsCode(CardId.Number60DugaresTheTimeless) && cards.All(c => c.Location == CardLocation.MonsterZone)) + { + ClientCard maxAttackMonster = cards.Where(c => c != null && (c.HasPosition(CardPosition.FaceUpAttack) || !summonThisTurn.Contains(c))) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + if (maxAttackMonster != null) + { + return Util.CheckSelectCount(new List { maxAttackMonster }, cards, min, max); + } + } + } + + // hand solve + if (hint == HintMsg.ToDeck || hint == HintMsg.ToGrave || hint == HintMsg.Discard) + { + bool allBotHand = cards.All(c => c.Controller == 0 && c.Location == CardLocation.Hand); + if (allBotHand) + { + List resultList = new List(); + List returnList = new List { _CardId.MulcharmyNyalus, _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, + CardId.SeventhTachyon + }; + foreach (int code in returnList) + { + List targetList = cards.Where(c => c.IsCode(code) && !resultList.Contains(c)).ToList(); + if (targetList.Count() > 0) + { + resultList.AddRange(targetList); + } + } + // return dump card + foreach (ClientCard card in cards) + { + if (!resultList.Contains(card) && cards.Where(c => c.IsCode(card.Id) && !resultList.Contains(c)).Count() > 1) + { + resultList.Add(card); + } + } + List unproperCardList = new List { _CardId.EffectVeiler, _CardId.InfiniteImpermanence, _CardId.GhostOgreAndSnowRabbit, CardId.TripleTacticsTalent, + CardId.NodeRyzeal, _CardId.LockBird, CardId.RyzealPlugIn, _CardId.CrossoutDesignator, _CardId.CalledByTheGrave, CardId.RyzealCross, + CardId.ThodeRyzeal, CardId.ExRyzeal, CardId.IceRyzeal + }; + foreach (int code in unproperCardList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(code) && !resultList.Contains(c)); + if (target != null) + { + resultList.Add(target); + } + } + return Util.CheckSelectCount(resultList, cards, min, max); + } + } + } + + if (currentSolvingChain == null) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null) + { + // handle for RyzealDeadnader + if (lastChainCard.Controller == 0 && lastChainCard.IsCode(CardId.RyzealDeadnader)) + { + if (hint == HintMsg.RemoveXyz) + { + if (deadnaderDestroySelf != null) + { + ClientCard detachTarget = cards.FirstOrDefault(c => c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse)); + if (detachTarget != null) + { + return Util.CheckSelectCount(new List { detachTarget }, cards, min, max); + } + } + List targets = cards.OrderBy(c => c.Attack).ToList(); + return Util.CheckSelectCount(targets, cards, min, max); + } else if (hint == HintMsg.Destroy) + { + if (deadnaderDestroySelf != null && cards.Contains(deadnaderDestroySelf)) + { + return Util.CheckSelectCount(new List { deadnaderDestroySelf }, cards, min, max); + } + List targetList = CanDestroyList(); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentDestroyCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + + if (hint == HintMsg.RemoveXyz && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + List checkRyzealIdList = new List { CardId.NodeRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal }; + foreach (int checkId in checkRyzealIdList) + { + if (!activatedCardIdList.Contains(checkId)) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + HashSet tenpaiList = new HashSet { SetcodeTenpaiDragon, SetcodeSangen }; + bool maybeTenpai = enemyDeckTypeRecord.Count() > 0 && enemyDeckTypeRecord.All(c => tenpaiList.Contains(c)); + return !maybeTenpai; + } + + public override int OnSelectOption(IList options) + { + bool tripleCheck = false; + for (int opt = 0; opt < 3; ++ opt) + { + if (options.Contains(Util.GetStringId(CardId.TripleTacticsTalent, opt))) + { + tripleCheck = true; + break; + } + } + if (tripleCheck) + { + return TripleTacticsTalentDecision(options); + } + + bool no60Check = false; + for (int opt = 0; opt < 3; ++ opt) + { + if (options.Contains(Util.GetStringId(CardId.Number60DugaresTheTimeless, opt))) + { + no60Check = true; + break; + } + } + if (no60Check) + { + // double attack + if (options.Contains(Util.GetStringId(CardId.Number60DugaresTheTimeless, 2))) + { + if (Number60DugaresTheTimelessDoubleTarget() != null) + { + int res = options.IndexOf(Util.GetStringId(CardId.Number60DugaresTheTimeless, 2)); + if (res >= 0) + { + return res; + } + } + } + // draw effect + if (options.Contains(Util.GetStringId(CardId.Number60DugaresTheTimeless, 0))) + { + if (Number60DugaresTheTimelessDrawEffect()) + { + int res = options.IndexOf(Util.GetStringId(CardId.Number60DugaresTheTimeless, 0)); + if (res >= 0) + { + return res; + } + } + } + // reborn + if (options.Contains(Util.GetStringId(CardId.Number60DugaresTheTimeless, 1))) + { + if (Number60DugaresTheTimelessRebornEffect()) + { + int res = options.IndexOf(Util.GetStringId(CardId.Number60DugaresTheTimeless, 1)); + if (res >= 0) + { + return res; + } + } + } + } + + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + // TODO + } + + return base.OnSelectOption(options); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + List zoneIdList = ShuffleList(new List { 5, 6 }); + zoneIdList.AddRange(ShuffleList(new List { 0, 2, 4 })); + zoneIdList.AddRange(ShuffleList(new List { 1, 3 })); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + return zone; + } + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.RyzealPlugIn, 1)) + { + Logger.DebugWriteLine("** plugin set material"); + return true; + } + + return base.OnSelectYesNo(desc); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + if (cardId == _CardId.Number41BagooskatheTerriblyTiredTapir && (Util.IsTurn1OrMain2() || Duel.Player == 1)) + { + return CardPosition.FaceUpDefence; + } + + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + + if (Bot.HasInExtra(CardId.Number60DugaresTheTimeless) && GetLevel4FinalCountOnField(true, out _) >= 2) + { + bestBotAttack *= 2; + } + + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + dimensionShifterCount = 0; + // for doom bot + maxSummonCount = 1; + hardToDestroyCardList.Clear(); + cannotDestroyCardList.Clear(); + } + + summonCount = maxSummonCount; + enemyActivateMaxxC = false; + enemyActivatePurulia = false; + enemyActivateFuwalos = false; + enemyActivateNyalus = false; + lockBirdSolved = false; + if (dimensionShifterCount > 0) dimensionShifterCount--; + enemyActivateInfiniteImpermanenceFromHand = false; + botActivateMulcharmy = false; + deadnaderDestroySelf = null; + botSolvingCross = false; + infiniteImpermanenceList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + activatedCardIdList.Clear(); + spSummonedCardIdList.Clear(); + botSolvedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + summonThisTurn.Clear(); + currentCanActivateEffect.Clear(); + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + Duel.LastChainTargets.Clear(); + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + if (enemyActivateInfiniteImpermanenceFromHand) + { + enemyActivateInfiniteImpermanenceFromHand = false; + } + else + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + + if (card.HasSetcode(SetcodeFloowandereeze)) + { + enemyDeckTypeRecord.Add(SetcodeFloowandereeze); + } + } + + if (player == 0) + { + if (card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus)) + { + botActivateMulcharmy = true; + } + } + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + botSolvingCross = false; + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + if (currentCard != null) + { + if (!Duel.IsCurrentSolvingChainNegated()) + { + if (currentCard.IsCode(_CardId.LockBird)) + lockBirdSolved = true; + if (currentCard.IsCode(_CardId.DimensionShifter)) + dimensionShifterCount = 2; + if (currentCard.Controller == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.MulcharmyPurulia)) + enemyActivatePurulia = true; + if (currentCard.IsCode(_CardId.MulcharmyFuwalos)) + enemyActivateFuwalos = true; + if (currentCard.IsCode(_CardId.MulcharmyNyalus)) + enemyActivateNyalus = true; + } + if (currentCard.Controller == 0) + { + foreach (int checkId in CheckBotSolvedList) + { + if (currentCard.IsCode(checkId)) + { + botSolvedCardIdList.Add(checkId); + } + } + } + } + } + + base.OnChainSolved(chainIndex); + } + + public override void OnChainEnd() + { + for (int idx = cannotDestroyCardList.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = cannotDestroyCardList[idx]; + if (checkTarget == null || !checkTarget.IsOnField()) + { + cannotDestroyCardList.RemoveAt(idx); + } + } + for (int idx = hardToDestroyCardList.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = hardToDestroyCardList[idx]; + if (checkTarget == null || !checkTarget.IsOnField()) + { + hardToDestroyCardList.RemoveAt(idx); + } + } + foreach (ClientCard card in currentDestroyCardList) + { + if (card != null && card.IsOnField()) + { + if (hardToDestroyCardList.Contains(card)) + { + cannotDestroyCardList.Add(card); + } else + { + hardToDestroyCardList.Add(card); + } + } + } + + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + currentCanActivateEffect.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + botSolvingCross = false; + deadnaderDestroySelf = null; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || !checkTarget.IsOnField()) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + base.OnChainEnd(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (card != null) + { + if (previousControler == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && previousLocation == (int)CardLocation.Hand && currentLocation == (int)CardLocation.SpellZone) + enemyActivateInfiniteImpermanenceFromHand = true; + } + if (card.Owner == 1) + { + foreach (int setcode in CheckSetcodeList) + { + if (card.HasSetcode(setcode)) + { + enemyDeckTypeRecord.Add(setcode); + } + } + if (card.IsCode(AlbazFusionList)) + { + enemyDeckTypeRecord.Add(SetcodeBranded); + } + } + if (currentControler == 1 && (currentLocation == (int)CardLocation.MonsterZone || currentLocation == (int)CardLocation.SpellZone)) + { + enemyPlaceThisTurn.Add(card); + } + + if (previousControler == 0 && previousLocation == (int)CardLocation.MonsterZone && currentLocation != (int)CardLocation.MonsterZone && summonThisTurn.Contains(card)) + { + summonThisTurn.Remove(card); + } + if (currentControler == 0 && currentLocation == (int)CardLocation.MonsterZone) + { + summonThisTurn.Add(card); + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + public override void OnSpSummoned() + { + // not special summoned by chain + if (Duel.GetCurrentSolvingChainCard() == null) + { + foreach (ClientCard card in Duel.LastSummonedCards) + { + if (card.Controller == 0 && card.IsCode(CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.NodeRyzeal, CardId.ExRyzeal)) + { + spSummonedCardIdList.Add(card.GetOriginCode()); + } + } + } + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool IceRyzealSpSummonFirst() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= GetLevel4CountOnField() >= 2; + if (flag) return false; + } + List costList = GetCostFromHandAndFieldFirst(Card); + if (costList.Count() > 0) + { + AI.SelectCard(costList); + return true; + } + + return false; + } + + public bool IceRyzealSpSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= GetLevel4CountOnField() >= 2; + if (flag) return false; + } + if (Card.Level != 4) return false; + if (summonCount <= 0 && GetLevel4CountOnField() == 1) + { + List firstCostList = GetCostFromHandAndField(Card, false); + if (firstCostList.Count() > 0) + { + AI.SelectCard(firstCostList); + return true; + } + if (Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled() && c.IsFloodgate()) || !CheckWhetherHaveFinalMonster()) + { + List costList = GetCostFromHandAndField(Card, true); + if (costList.Count() > 0) + { + AI.SelectCard(costList); + return true; + } + } + } + + return false; + } + + public bool IceRyzealSummon() + { + if (CheckWhetherNegated(true, true)) return false; + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= GetLevel4CountOnField() >= 2; + if (flag) return false; + } + summonCount -= 1; + return true; + } + + public bool IceRyzealActivate() + { + if (CheckWhetherNegated(true)) return false; + if (CheckShouldNoMoreSpSummon(CardLocation.Deck) && GetLevel4CountOnField() >= 2) + { + return false; + } + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool ThodeRyzealSpSummon() + { + int lv4Count = GetLevel4CountOnField(); + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= lv4Count >= 2; + flag |= lv4Count == 1 && summonCount > 0; + if (flag) return false; + } + bool spsummonFlag = lv4Count == 1; + spsummonFlag |= !CheckWhetherNegated(true, true, CardType.Monster) && CheckRemainInDeck(CardId.IceRyzeal, CardId.ExRyzeal) > 0 + && !activatedCardIdList.Contains(CardId.ThodeRyzeal) && !lockBirdSolved; + if (GetLevel4CountOnField() == 0) + { + spsummonFlag |= GetLevel4FinalCountOnField(true, out _) >= 2 && !CheckWhetherHaveFinalMonster(); + } + + return spsummonFlag; + } + + public bool ThodeRyzealSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) + { + int lv4Count = GetLevel4CountOnField(); + if (lv4Count == 1) + { + bool flag = !activatedCardIdList.Contains(CardId.ThodeRyzeal); + flag &= !(Bot.HasInHand(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal)); + if (flag) + { + summonCount -= 1; + return true; + } + } + bool skipFlag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + skipFlag |= lv4Count >= 2; + if (skipFlag) return false; + } + if (CheckWhetherNegated(true)) return false; + + summonCount -= 1; + return true; + } + + public bool ThodeRyzealActivate() + { + if (CheckWhetherNegated(true)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool NodeRyzealSpSummon() + { + int lv4Count = GetLevel4CountOnField(); + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= lv4Count >= 2; + flag |= lv4Count == 1 && summonCount > 0; + if (flag) return false; + } + bool spsummonFlag = lv4Count == 1; + spsummonFlag |= !CheckWhetherNegated(true, true, CardType.Monster) && Bot.Graveyard.Any(c => !c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && c.Level == 4); + return spsummonFlag; + } + + public bool NodeRyzealSpSummonFirst() + { + int lv4Count = GetLevel4CountOnField(); + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= lv4Count >= 2; + flag |= lv4Count == 1 && summonCount > 0; + if (flag) return false; + } + if (!activatedCardIdList.Contains(Card.Id) && GetCostFromHandAndField(Card, false).Count() > 0) + { + return true; + } + return false; + } + + public bool NodeRyzealActivate() + { + if (NodeRyzealActivateInner(true)) + { + return true; + } + + return false; + } + + public bool NodeRyzealActivateFirst() + { + if (NodeRyzealActivateInner(false)) + { + return true; + } + + return false; + } + + public bool NodeRyzealActivateInner(bool sendNotNessary) + { + if (CheckWhetherNegated(true)) return false; + if (CheckShouldNoMoreSpSummon(CardLocation.Grave | CardLocation.Extra)) + { + if (Bot.GetMonsters().Count(c => c.HasType(CardType.Xyz) && c.IsFaceup()) > 0) return false; + } + + ClientCard nonLightDarkTarget = Bot.Graveyard.Where(c => c != null && !c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && c.Level == 4 + && !c.HasAttribute((CardAttribute)attrbuteLightDark)).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + ClientCard normalTarget = Bot.Graveyard.Where(c => c != null && !c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && c.Level == 4 + && c != nonLightDarkTarget).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (nonLightDarkTarget == null || normalTarget == null) return false; + List rebornTarget = new List { nonLightDarkTarget, normalTarget }; + + List firstCostList = GetCostFromHandAndField(Card, false); + if (firstCostList.Count() > 0) + { + AI.SelectCard(firstCostList); + AI.SelectNextCard(rebornTarget); + activatedCardIdList.Add(Card.Id); + return true; + } + if (GetLevel4CountOnField() == 1 && sendNotNessary) + { + List nextCostList = GetCostFromHandAndField(Card, true); + if (nextCostList.Count() > 0) + { + AI.SelectCard(nextCostList); + AI.SelectNextCard(rebornTarget); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + return false; + } + + public bool ExRyzealSpSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Extra)) + { + bool checkFlag = !CheckWhetherHaveFinalMonster() && GetLevel4CountOnField() == 1; + if (checkFlag && ExRyzealDiscardExtra()) + { + return true; + } + return false; + } + if (Duel.Turn == 1) + { + bool checkFlag = !activatedCardIdList.Contains(CardId.ExRyzeal) && !lockBirdSolved && !DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal) && !Bot.HasInMonstersZone(_CardId.Number41BagooskatheTerriblyTiredTapir); + checkFlag |= !Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz)) && GetLevel4CountOnField() == 1; + if (checkFlag) + { + // discard ryzeal + AI.SelectCard(CardId.RyzealDeadnader, CardId.RyzealDuodrive); + return true; + } + } + if (ExRyzealDiscardExtra()) + { + return true; + } + + return false; + } + + public bool ExRyzealDiscardExtra() + { + List discardIdCheckList = new List { CardId.MereologicAggregator, CardId.TwinsOfTheEclipse, CardId.Number104Masquerade, CardId.StarliegePhotonBlastDragon, + CardId.TornadoDragon, CardId.AbyssDweller, _CardId.EvilswarmExcitonKnight, CardId.FullArmoredUtopicRayLancer, CardId.Number60DugaresTheTimeless, + CardId.RyzealDuodrive, CardId.RyzealDeadnader}; + + // delay id + List discardIdList = new List(); + foreach (int discardId in discardIdCheckList) + { + if (discardId == CardId.MereologicAggregator) + { + if (!Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled() && !c.IsShouldNotBeMonsterTarget()) + && Enemy.SpellZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled() && !c.IsShouldNotBeMonsterTarget())) + { + continue; + } + } + if (discardId == CardId.TwinsOfTheEclipse) + { + if (Bot.Graveyard.Count(c => c.HasType(CardType.Xyz)) < 2 || !Bot.Graveyard.Any(c => c.HasType(CardType.Xyz) && c.IsCanRevive())) + { + continue; + } + } + if (discardId == CardId.Number104Masquerade) + { + if (CheckRemainInDeck(CardId.SeventhTachyon) > 0 || Bot.HasInHandOrInSpellZone(CardId.Number104Masquerade)) + { + continue; + } + } + if (discardId == CardId.TornadoDragon) + { + if (Enemy.GetSpellCount() > 0) + { + continue; + } + } + discardIdList.Add(discardId); + } + discardIdList.AddRange(discardIdCheckList); + + foreach (int id in discardIdList) + { + if (Bot.HasInExtra(id)) + { + AI.SelectCard(id); + return true; + } + } + + return false; + } + + public bool ExRyzealSpSummonLater() + { + // TODO + return false; + } + + public bool ExRyzealSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) + { + if (GetLevel4CountOnField() == 1) + { + bool flag = !activatedCardIdList.Contains(CardId.ExRyzeal); + flag &= !(Bot.HasInHand(CardId.ThodeRyzeal) && !activatedCardIdList.Contains(CardId.ThodeRyzeal)); + if (flag) + { + summonCount -= 1; + return true; + } + } + } + return false; + } + + public bool ExRyzealActivate() + { + if (CheckWhetherNegated(true)) + { + // use mero to negate No.41? + int count41 = Enemy.GetMonsters().Count(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && c.IsFaceup() + && !c.IsDisabled() && c.HasPosition(CardPosition.FaceUpDefence)); + bool canNegate41 = count41 == 1 && currentCanActivateEffect.Any(c => c != null && c.IsCode(CardId.MereologicAggregator)); + + if (canNegate41) + { + activatedCardIdList.Add(Card.Id); + return true; + } else + { + return false; + } + } + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool MulcharmyFuwalosActivate() + { + if (CheckWhetherNegated(true) || Duel.Player == 0) return false; + if (lockBirdSolved || Duel.CurrentChain.Any(c => c.IsCode(_CardId.LockBird))) return false; + if (Duel.Phase > DuelPhase.Main1) return false; + + botActivateMulcharmy = true; + return true; + } + + public bool MulcharmyPuruliaActivate() + { + if (CheckWhetherNegated(true) || Duel.Player == 0) return false; + if (lockBirdSolved || Duel.CurrentChain.Any(c => c.IsCode(_CardId.LockBird))) return false; + if (Duel.Phase > DuelPhase.Main1) return false; + if (botActivateMulcharmy) return false; + + botActivateMulcharmy = true; + return true; + } + + public bool MulcharmyNyalusActivate() + { + if (CheckWhetherNegated(true) || Duel.Player == 0) return false; + if (lockBirdSolved || Duel.CurrentChain.Any(c => c.IsCode(_CardId.LockBird))) return false; + if (Duel.Phase > DuelPhase.Main1) return false; + if (botActivateMulcharmy) return false; + + botActivateMulcharmy = true; + return true; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (DefaultAshBlossomAndJoyousSpring()) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard.Location == CardLocation.MonsterZone || lastChainCard.Location == CardLocation.SpellZone) currentNegateCardList.Add(Util.GetLastChainCard()); + return true; + } + return false; + } + + public bool GhostOgreAndSnowRabbitActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard == null || lastChainCard.IsDisabled()) return false; + if (lastChainCard.IsMonster() && !lastChainCard.HasType(CardType.Link | CardType.Fusion | CardType.Synchro | CardType.Xyz)) return false; + return true; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0 || lockBirdSolved) return false; + return DefaultMaxxC(); + } + + public bool LockBirdActivate() + { + if (CheckWhetherNegated(true)) return false; + if (Duel.Player == 0) return false; + List mulcharmyCheckIdList = new List { _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos }; + if (mulcharmyCheckIdList.Intersect(botSolvedCardIdList).Any()) + { + int enemyFieldCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (enemyFieldCount + 6 < Bot.Hand.Count()) return false; + } + if (botSolvedCardIdList.Contains(_CardId.MaxxC)) + { + if (!activatedCardIdList.Contains(_CardId.AshBlossom) || !activatedCardIdList.Contains(_CardId.EffectVeiler)) return false; + } + return true; + } + + public bool EffectVeilerActivate() + { + if (CheckWhetherNegated(true)) return false; + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Monster); + if (shouldNegateList.Count > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateCardList.Add(negateTarget); + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + public bool SeventhTachyonActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + bool flag = !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !Bot.HasInHand(CardId.ExRyzeal); + flag &= !(!activatedCardIdList.Contains(CardId.IceRyzeal) && summonCount > 0 && Bot.HasInHand(CardId.IceRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal)); + if (flag) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool TripleTacticsTalentActivate() + { + if (CheckWhetherNegated(true)) return false; + if (TripleTacticsTalentDecision(null) == -1) return false; + SelectSTPlace(Card, true); + return true; + } + + public int TripleTacticsTalentDecision(IList options) + { + // gain control? + bool dangerFlag = Enemy.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && (c.IsFloodgate() + || c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && c.HasPosition(CardPosition.FaceUpDefence))); + if (dangerFlag) + { + if (options == null) return 1; + int res = options.IndexOf(Util.GetStringId(CardId.TripleTacticsTalent, 1)); + if (res >= 0) return res; + } + // draw? + if (!lockBirdSolved) + { + bool checkFlag = CheckCanContinueSummon(); + if (!checkFlag) + { + if (options == null) return 1; + int res = options.IndexOf(Util.GetStringId(CardId.TripleTacticsTalent, 0)); + if (res >= 0) return res; + } + } + // shuffle hand + if (Enemy.Hand.Count() > 0) + { + if (options == null) return 1; + int res = options.IndexOf(Util.GetStringId(CardId.TripleTacticsTalent, 2)); + if (res >= 0) return res; + } + return -1; + } + + public bool PotOfDesiresActivate() + { + if (CheckWhetherNegated(true)) return false; + if (Bot.Deck.Count >= 15) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool PotOfDesireActivateForContinue() + { + if (CheckWhetherNegated(true)) return false; + if (Bot.Deck.Count >= 15 && !CheckCanContinueSummon() && CheckRemainInDeck(CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal) > 0) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool BonfireActivateToSearchNecessary() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + bool flag = !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !Bot.HasInHand(CardId.ExRyzeal); + flag |= !activatedCardIdList.Contains(CardId.IceRyzeal) && summonCount > 0 && !Bot.HasInHand(CardId.IceRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal); + if (flag) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool BonfireActivate() + { + if (CheckWhetherNegated(true)) return false; + // activate before no60 + if (!activatedCardIdList.Contains(CardId.Number60DugaresTheTimeless)) + { + ClientCard no60 = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.Number60DugaresTheTimeless) && !c.IsDisabled()); + if (no60 != null && no60.Overlays.Count() >= 2) + { + SelectSTPlace(Card, true); + return true; + } + } + + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + ClientCard lastChainCard = Util.GetLastChainCard(); + if (Duel.LastChainPlayer == 1) + { + // negate + if (lastChainCard != null && lastChainCard.IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + + // not to negate same card in hand + List mulcharmyIdList = new List { _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus }; + if (Duel.Player == 0 && Bot.HasInHand(code) && !mulcharmyIdList.Contains(code)) return false; + + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentDestroyCardList.Add(graveTarget); + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && c.IsCode(code))); + return true; + } + } + + // banish target + foreach (ClientCard graveCard in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(graveCard) && graveCard.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = graveCard.Id; + AI.SelectCard(graveCard); + currentDestroyCardList.Add(graveCard); + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentDestroyCardList.Add(enemyMonsters[0]); + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count > 0) + { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentDestroyCardList.Add(targets[0]); + return true; + } + + return false; + } + + public bool RyzealPlugInActivate() + { + if (CheckWhetherNegated(true)) return false; + + // spsummon lv4 + if (Duel.Player == 0 && CurrentTiming == -1) + { + bool summonFlag = GetLevel4CountOnField() == 1; + if (GetLevel4CountOnField() == 0) + { + summonFlag |= GetLevel4FinalCountOnField(true, out _) >= 2 && !CheckWhetherHaveFinalMonster(); + } + + // summon extra level4 monster to xyz summon + if (summonFlag) + { + List checkIdList = new List { CardId.NodeRyzeal, CardId.ExRyzeal, CardId.ThodeRyzeal, CardId.IceRyzeal }; + foreach (int id in checkIdList) + { + if (activatedCardIdList.Contains(id)) continue; + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + + foreach (int id in checkIdList) + { + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + } + } + + // spsummon deadnader + if (!Bot.HasInMonstersZone(CardId.RyzealDeadnader, true, true, true) && !Duel.CurrentChain.Any(c => c.IsCode(CardId.TwinsOfTheEclipse)) + && !DefaultCheckWhetherCardIdIsNegated(CardId.RyzealDeadnader) && !Util.ChainContainPlayer(0)) + { + ClientCard deadnader = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.RyzealDeadnader) && c.IsCanRevive()); + if (deadnader == null) + { + deadnader = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.RyzealDeadnader) && c.IsCanRevive()); + } + if (deadnader != null) + { + AI.SelectCard(deadnader); + SelectSTPlace(Card, true); + return true; + } + } + + // chain to negate monster effect + if (Bot.HasInSpellZone(CardId.RyzealCross, true, true) && !activatedCardIdList.Contains(CardId.RyzealCross + 2) + && CheckRemainInDeck(CardId.ExRyzeal, CardId.IceRyzeal, CardId.NodeRyzeal, CardId.ThodeRyzeal) > 0) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.IsMonster() && lastChainCard.Controller == 1 && CheckCardShouldNegate(lastChainCard)) + { + bool activateFlag = false; + bool shouldRebornXyz = false; + bool duodriverActivating = Duel.CurrentChain.Any(c => c.IsCode(CardId.RyzealDuodrive) && c.Controller == 0) && activatedCardIdList.Contains(CardId.RyzealDuodrive + 1); + if (duodriverActivating) + { + // check whether have 3+ material + activateFlag = Bot.MonsterZone.Where(c => c != null && c.HasType(CardType.Xyz)).Sum(c => c.Overlays.Count()) >= 3; + } else + { + if (!Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && c.Overlays.Count() > 0)) + { + activateFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal)); + if (!activateFlag) + { + bool hasXyzTarget = Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && c.IsCanRevive() && c.HasType(CardType.Xyz)); + hasXyzTarget |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && c.IsCanRevive() && c.HasType(CardType.Xyz)); + if (hasXyzTarget) + { + activateFlag = true; + shouldRebornXyz = true; + } + } + } + } + + if (activateFlag) + { + ClientCard deadnader = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + if (deadnader == null) + { + deadnader = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + } + if (deadnader != null) + { + AI.SelectCard(deadnader); + SelectSTPlace(Card, true); + return true; + } + + if (shouldRebornXyz) + { + ClientCard duoDriver = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDuodrive)); + if (duoDriver == null) + { + duoDriver = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDuodrive)); + } + if (duoDriver != null) + { + AI.SelectCard(duoDriver); + SelectSTPlace(Card, true); + return true; + } + } else + { + List checkIdList = new List { CardId.NodeRyzeal, CardId.ExRyzeal, CardId.ThodeRyzeal, CardId.IceRyzeal }; + foreach (int id in checkIdList) + { + if (activatedCardIdList.Contains(id)) continue; + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + foreach (int id in checkIdList) + { + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + } + } + } + } + + bool becomeTargetFlag = DefaultOnBecomeTarget() && Card.Location == CardLocation.SpellZone; + bool endPhaseFlag = Duel.Player == 1 && Duel.Phase == DuelPhase.End; + if (becomeTargetFlag || endPhaseFlag) + { + if (!(Duel.CurrentChain.Any(c => c != null && c.Controller == 1 && c.IsCode(_CardId.EvenlyMatched)) && deadnaderDestroySelf != null)) + { + ClientCard deadnader = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + if (deadnader == null) + { + deadnader = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + } + if (deadnader != null) + { + AI.SelectCard(deadnader); + SelectSTPlace(Card, true); + return true; + } + + ClientCard duoDriver = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDuodrive)); + if (duoDriver == null) + { + duoDriver = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDuodrive)); + } + if (duoDriver != null) + { + AI.SelectCard(duoDriver); + SelectSTPlace(Card, true); + return true; + } + + List checkIdList = new List { CardId.NodeRyzeal, CardId.ExRyzeal, CardId.ThodeRyzeal, CardId.IceRyzeal }; + foreach (int id in checkIdList) + { + if (activatedCardIdList.Contains(id)) continue; + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + + if (!endPhaseFlag) + { + foreach (int id in checkIdList) + { + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + } + } + } + + return false; + } + + public bool RyzealPlugInActivateFirst() + { + if (CheckWhetherNegated(true)) return false; + if (Duel.Player == 0 && CurrentTiming == -1 && !activatedCardIdList.Contains(CardId.NodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.NodeRyzeal)) + { + List nodeCostList = GetCostFromHandAndField(Card, false); + if (nodeCostList.Count() > 0) + { + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.NodeRyzeal)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.NodeRyzeal)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + } + + return false; + } + + public bool RyzealCrossActivateCard() + { + // whether to negate by cross + if (ActivateDescription == Util.GetStringId(CardId.RyzealCross, 3)) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null && !Duel.IsCurrentSolvingChainNegated()) + { + if (CheckCardShouldNegate(currentSolvingChain)) + { + Logger.DebugWriteLine("** cross negate"); + activatedCardIdList.Add(CardId.RyzealCross + 2); + botSolvingCross = true; + return true; + } + } + return false; + } + + if (CheckWhetherNegated(true)) return false; + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) return false; + bool flag = RyzealCrossActivateRecycleFirst(); + bool canSetMaterial = Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn) && CheckRemainInDeck(CardId.IceRyzeal, CardId.ExRyzeal, CardId.NodeRyzeal, CardId.ThodeRyzeal) > 0 + && (Bot.Graveyard.Any(c => c != null && c.HasSetcode(SetcodeRyzeal) && (c.IsCanRevive() || !c.HasType(CardType.Xyz))) || + Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && (c.IsCanRevive() || !c.HasType(CardType.Xyz)))); + flag |= Bot.MonsterZone.Count(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && (c.Overlays.Count() > 0 || canSetMaterial)) > 0; + + return flag; + } + + public bool RyzealCrossActivateRecycleFirst() + { + if (CheckWhetherNegated(true) || !(Card.Location == CardLocation.SpellZone && Card.IsFaceup())) return false; + if (ActivateDescription == Util.GetStringId(CardId.RyzealCross, 3)) + { + return false; + } + List checkIdList = new List { CardId.RyzealPlugIn, CardId.RyzealDuodrive, CardId.RyzealDeadnader, CardId.NodeRyzeal, CardId.ExRyzeal, CardId.IceRyzeal, CardId.ThodeRyzeal }; + List targetList = new List(); + foreach (int id in checkIdList) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(c => c.IsCode(id)); + if (target != null && (CheckRemainInDeck(id) + Bot.ExtraDeck.Count(c => c.IsCode(id)) + Bot.Hand.Count(c => c.IsCode(id))) == 0) + { + if (target.HasType(CardType.Xyz) && GetLevel4CountOnField() == 1) continue; + targetList.Add(target); + } + + if (targetList.Count() >= 2) + { + AI.SelectCard(targetList); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + + return false; + } + + public bool RyzealCrossActivateRecycleLater() + { + if (CheckWhetherNegated(true) || !(Card.Location == CardLocation.SpellZone && Card.IsFaceup())) return false; + if (ActivateDescription == Util.GetStringId(CardId.RyzealCross, 3)) + { + return false; + } + SortedDictionary> countDict = new SortedDictionary>(); + List checkIdList = new List { CardId.RyzealPlugIn, CardId.RyzealDuodrive, CardId.RyzealDeadnader, CardId.NodeRyzeal, CardId.ExRyzeal, CardId.IceRyzeal, CardId.ThodeRyzeal }; + foreach (int id in checkIdList) + { + int remainCount = CheckRemainInDeck(id) + Bot.ExtraDeck.Count(c => c.IsCode(id)); + if (!countDict.ContainsKey(remainCount)) + { + countDict.Add(remainCount, new List()); + } + countDict[remainCount].Add(id); + } + + List targetList = new List(); + foreach (KeyValuePair> pair in countDict) + { + foreach (int id in pair.Value) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(c => c.IsCode(id)); + if (target != null) targetList.Add(target); + } + } + + if (targetList.Count() >= 2) + { + AI.SelectCard(targetList); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + // negate + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && c.IsCode(code))); + return true; + } + } + return false; + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectCard(target); + } + else + { + AI.SelectCard(Enemy.GetMonsters()); + } + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Trap); + if (shouldNegateList.Count > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateCardList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + // TODO extra summon + + public bool AbyssDwellerSummonCheck() + { + bool flag = enemyDeckTypeRecord.Contains(SetcodeAtlantean); + flag |= enemyDeckTypeRecord.Contains(SetcodeOrcust); + flag |= enemyDeckTypeRecord.Contains(SetcodePhantomKnight); + flag |= enemyDeckTypeRecord.Count() > 0 && enemyDeckTypeRecord.All(c => c == SetcodeTearlaments); + + int enemyDeckTotalCount = Enemy.Hand.Count() + Enemy.Deck.Count() + Enemy.Graveyard.Count() + Enemy.Banished.Count() + Enemy.ExtraDeck.Count(); + if (enemyDeckTotalCount > 65) + { + flag |= !enemyDeckTypeRecord.Contains(SetcodeInfernoid); + } + + return flag; + } + + public bool Number41BagooskatheTerriblyTiredTapirSummonCheck() + { + bool flag = enemyDeckTypeRecord.Contains(SetcodeFloowandereeze); + flag |= enemyDeckTypeRecord.Contains(SetcodeBranded); + flag |= enemyDeckTypeRecord.Contains(SetcodeRyzeal); + flag &= Util.IsTurn1OrMain2(); + + return flag; + } + + public bool TornadoDragonSummonCheck() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + bool flag = enemyDeckTypeRecord.Contains(SetcodeLabrynth); + flag |= Enemy.SpellZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled() && c.IsFloodgate()); + flag |= Enemy.SpellZone.Count(c => c != null && !c.IsShouldNotBeMonsterTarget() && !NotToDestroySpellTrap.Contains(c.Id)) >= 3; + flag |= !Util.IsTurn1OrMain2() && !botSolvedCardIdList.Contains(_CardId.EvilswarmExcitonKnight) && Enemy.GetMonsterCount() == 0 + && Enemy.SpellZone.Count(c => c != null && !c.IsShouldNotBeMonsterTarget() && !NotToDestroySpellTrap.Contains(c.Id)) > 0; + + return flag; + } + + public bool EvilswarmExcitonKnightSpSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || Duel.Turn == 1) return false; + + return DefaultEvilswarmExcitonKnightSummon(); + } + + public bool LessSpSummonExtra() + { + if (!CheckShouldNoMoreSpSummon(CardLocation.Extra)) return false; + + // No.41 + ClientCard no41 = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null) + { + if (Number41BagooskatheTerriblyTiredTapirSummonCheck()) + { + if (Card != no41) return false; + + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + // abyss + ClientCard abyss = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.AbyssDweller)); + if (abyss != null) + { + if (AbyssDwellerSummonCheck()) + { + if (Card != abyss) return false; + + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + // deadnader + ClientCard deadnader = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + if (deadnader != null) + { + List materialList = GetLevel4OnField(c => c.HasSetcode(SetcodeRyzeal)); + if (materialList.Count() >= 2) + { + if (Card != deadnader) return false; + AI.SelectMaterials(materialList); + return true; + } + } + + return false; + } + + public bool FirstRyzealDuodriveSpSummon() + { + if (!RyzealDuodriveSpSummonCheck()) return false; + if (Bot.Graveyard.Count(c => c.HasSetcode(SetcodeRyzeal) && c.IsMonster()) == 0) + { + if (!CheckShouldNoMoreSpSummon(CardLocation.Hand) && Bot.HasInHand(CardId.ExRyzeal) + && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && Duel.MainPhase.SpecialSummonableCards.Any(c => c.IsCode(CardId.ExRyzeal)) + && Bot.ExtraDeck.Count(c => c.IsCode(CardId.RyzealDeadnader, CardId.RyzealDuodrive)) > 2) + { + return false; + } + } + + List materialList = GetLevel4OnField(null); + List materialExceptNode = materialList + .Where(c => !(c.IsCode(CardId.NodeRyzeal) && !c.IsDisabled() && !activatedCardIdList.Contains(CardId.NodeRyzeal))).ToList(); + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() > 2 && !CheckCanContinueSummon()) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && !CheckCanContinueSummon(true)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + + return false; + } + + public bool RyzealDuodriveSpSummonCheck() + { + bool checkFlag = Duel.MainPhase.SpecialSummonableCards.Any(c => c.IsCode(CardId.RyzealDuodrive)); + checkFlag &= !Bot.HasInMonstersZone(CardId.RyzealDuodrive, true, true, true); + checkFlag &= CheckRemainInDeck(CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.NodeRyzeal, CardId.ExRyzeal, CardId.RyzealPlugIn, CardId.RyzealCross) >= 2; + checkFlag &= !DefaultCheckWhetherCardIdIsNegated(CardId.RyzealDuodrive); + checkFlag &= !activatedCardIdList.Contains(CardId.RyzealDuodrive + 1); + checkFlag &= !CheckWhetherNegated(true, true, CardType.Monster); + checkFlag &= !lockBirdSolved; + checkFlag &= !CheckShouldNoMoreSpSummon(CardLocation.Extra); + + return checkFlag; + } + + public bool SecondXyzSummon() + { + if (Card.Location != CardLocation.Extra) return false; + + int level4Count = GetLevel4FinalCountOnField(true, out _); + bool result = SecondXyzSummonInner(); + Logger.DebugWriteLine("Second Xyz Count: " + level4Count.ToString()); + Logger.DebugWriteLine("Second Xyz Summon: " + result.ToString()); + return result; + } + + public bool SecondXyzSummonInner() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) return false; + + // summon after duo driver + if (RyzealDuodriveSpSummonCheck()) { + Logger.DebugWriteLine("Second: summon duodriver first"); + return false; + } + + // check whether have 4 monsters for material. + // if not, skip the second xyz monster. + int level4Count = GetLevel4FinalCountOnField(true, out bool hasNode); + if (level4Count < 4) return false; + + // select which monster to summon + List materialList = GetLevel4OnField(null); + List materialExceptNode = materialList + .Where(c => !(c.IsCode(CardId.NodeRyzeal) && !c.IsDisabled() && !activatedCardIdList.Contains(CardId.NodeRyzeal))).ToList(); + + // abyss + ClientCard abyss = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.AbyssDweller)); + if (abyss != null) + { + if (AbyssDwellerSummonCheck()) + { + if (Card != abyss) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() > 2 && !CheckCanContinueSummon()) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + } + // 41 + ClientCard no41 = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null) + { + bool flag = hasNode; + flag &= Util.IsTurn1OrMain2(); + flag &= Bot.HasInExtra(CardId.TwinsOfTheEclipse) && Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz)); + flag &= (GetNegateEffectCount() >= 2 || lockBirdSolved); + + if (flag) + { + if (Card != no41) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + } + + // photon blast dragon + ClientCard photonDragon = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.StarliegePhotonBlastDragon)); + bool have2MaterialDuo = false; + if (photonDragon != null) + { + int duoDriveOverlayCount = 0; + foreach (ClientCard monster in Bot.MonsterZone) + { + if (monster == null || !monster.IsCode(CardId.RyzealDuodrive)) continue; + duoDriveOverlayCount += monster.Overlays.Count(); + } + + if (Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) duoDriveOverlayCount++; + have2MaterialDuo = duoDriveOverlayCount >= 2; + } + + if (photonDragon != null && have2MaterialDuo && enemyDeckTypeRecord.Contains(SetcodeSkyStriker)) + { + if (Card != photonDragon) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + } + + // 60 + ClientCard no60 = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.Number60DugaresTheTimeless)); + if (no60 != null && !lockBirdSolved) + { + bool flag = Bot.Deck.Count() > 2; + + if (flag) + { + if (Card != no60) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + } + + if (photonDragon != null && have2MaterialDuo) + { + if (Card != photonDragon) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + } + + // tornado dragon + ClientCard deadnader = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + if (deadnader == null) + { + ClientCard tornadoDragon = Duel.MainPhase.SummonableCards.FirstOrDefault(c => c.IsCode(CardId.TornadoDragon)); + if (tornadoDragon != null && TornadoDragonSummonCheck() && Card == tornadoDragon) + { + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + } + + // deadnader + if (deadnader != null && Card == deadnader) + { + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + + // TODO + Logger.DebugWriteLine("Second: no monster to spsummon"); + + + return false; + } + + public bool TwinsOfTheEclipseSpSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) return false; + if (Util.IsTurn1OrMain2()) + { + bool hasNode = Bot.HasInHand(CardId.NodeRyzeal) && !spSummonedCardIdList.Contains(CardId.NodeRyzeal); + hasNode |= Bot.HasInMonstersZone(CardId.NodeRyzeal, true, false, true); + if (Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + hasNode |= Bot.Graveyard.Any(c => c.IsCode(CardId.NodeRyzeal)); + hasNode |= Bot.Banished.Any(c => c.IsFaceup() && c.IsCode(CardId.NodeRyzeal)); + } + hasNode &= !activatedCardIdList.Contains(CardId.NodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.NodeRyzeal); + + List materialList = new List(); + ClientCard duoDriver = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.RyzealDuodrive)); + if (activatedCardIdList.Contains(CardId.RyzealDuodrive + 1) && duoDriver != null) + { + materialList.Add(duoDriver); + hasNode |= !CheckWhetherWillbeRemoved() && duoDriver.Overlays.Any(id => id == CardId.NodeRyzeal); + } + ClientCard no60 = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.Number60DugaresTheTimeless)); + if (no60 != null && (activatedCardIdList.Contains(CardId.Number60DugaresTheTimeless) || no60.IsDisabled())) + { + materialList.Add(no60); + hasNode |= !CheckWhetherWillbeRemoved() && no60.Overlays.Any(id => id == CardId.NodeRyzeal); + } + ClientCard no41 = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null) + { + materialList.Add(no41); + hasNode |= !CheckWhetherWillbeRemoved() && no41.Overlays.Any(id => id == CardId.NodeRyzeal); + } + + if (materialList.Count() >= 2 && hasNode) + { + AI.SelectMaterials(materialList); + return true; + } + } + else + { + if (botSolvedCardIdList.Contains(_CardId.EvilswarmExcitonKnight)) + { + return false; + } + + List materialList = GetLevel4OnField(null); + List xyzMonsterList = Bot.MonsterZone.Where(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz) && c.Rank == 4 && c.Attack < 2500).ToList(); + int level4Count = GetLevel4FinalCountOnField(true, out bool hasNode) + xyzMonsterList.Count(); + + if (level4Count < 4) return false; + + materialList.AddRange(xyzMonsterList); + materialList = materialList.Where(c => c != null && c.Attack < 2500).OrderBy(c => c.GetDefensePower()).Take(2).ToList(); + if (materialList.Count() >= 2) + { + // check whether enemy have monster with 2more less than 2500 + bool checkFlag = Enemy.MonsterZone.Count(c => c != null && c.GetDefensePower() < 2500) >= 2 && !CheckWhetherNegated(true, true, CardType.Monster) + && !DefaultCheckWhetherCardIdIsNegated(CardId.TwinsOfTheEclipse); + if (checkFlag && materialList.Sum(c => c.Attack) < 5000) + { + AI.SelectMaterials(materialList); + return true; + } + else if (materialList.Sum(c => botSolvedCardIdList.Contains(CardId.RyzealPlugIn) && !c.HasType(CardType.Xyz) ? 0 : c.Attack) < 2500 + && !Duel.MainPhase.SpecialSummonableCards.Any(c => c.IsCode(CardId.RyzealDeadnader))) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + + return false; + } + + public bool FinalXyzSummon() + { + if (Card.Location != CardLocation.Extra) return false; + + int level4Count = GetLevel4FinalCountOnField(false, out _); + bool result = FinalXyzSummonInner(); + Logger.DebugWriteLine("Final Xyz Count: " + level4Count.ToString()); + Logger.DebugWriteLine("Final Xyz Summon: " + result.ToString()); + + return result; + } + + public bool FinalXyzSummonInner() + { + // summon after duo driver + if (RyzealDuodriveSpSummonCheck()) + { + Logger.DebugWriteLine("Final: summon duodriver first"); + return false; + } + + int level4Count = GetLevel4FinalCountOnField(false, out _); + if (level4Count >= 4) return false; + + // No.41 + ClientCard no41 = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null) + { + if (Number41BagooskatheTerriblyTiredTapirSummonCheck()) + { + if (Card != no41) return false; + + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + + // abyss + ClientCard abyss = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.AbyssDweller)); + if (abyss != null) + { + if (AbyssDwellerSummonCheck()) + { + if (Card != abyss) return false; + + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + // deadnader + ClientCard deadnader = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + if (deadnader != null) + { + List materialList = GetLevel4OnField(c => c.HasSetcode(SetcodeRyzeal)); + if (materialList.Count() >= 2) + { + if (Card != deadnader) return false; + AI.SelectMaterials(materialList); + return true; + } + } + + // tornado dragon + if (deadnader == null) + { + ClientCard tornadoDragon = Duel.MainPhase.SummonableCards.FirstOrDefault(c => c.IsCode(CardId.TornadoDragon)); + if (tornadoDragon != null && TornadoDragonSummonCheck()) + { + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + + return false; + } + + public bool DonnerDaggerFurHireSpSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) + { + return false; + } + bool haveEnemyTarget = Enemy.MonsterZone.Any(c => c != null && !c.IsShouldNotBeMonsterTarget()) && !CheckWhetherNegated(true, true, CardType.Monster); + + List illegalList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.Level != 4 && card.Rank != 4).OrderBy(c => c.GetDefensePower()).ToList(); + bool necessary = Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal) + && illegalList.Count() > 0; + bool needDestory = !CheckWhetherNegated(true, true, CardType.Monster) + && Enemy.MonsterZone.Any(c => c != null && !c.IsShouldNotBeMonsterTarget() && c.IsFloodgate() && !c.IsDisabled()); + necessary |= needDestory; + + if (necessary) + { + if (illegalList.Count() == 1 && haveEnemyTarget) + { + List otherMaterialList = Bot.GetMonsters().Where(card => card.IsFaceup() && !illegalList.Contains(card) && (card.Owner == 1 || !card.HasType(CardType.Xyz))).ToList(); + otherMaterialList.Sort(CardContainer.CompareCardAttack); + illegalList.AddRange(otherMaterialList); + } + + if (illegalList.Count() > 1) + { + List materialList = illegalList.Take(2).ToList(); + if (Util.GetBotAvailZonesFromExtraDeck(materialList) > 0) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + + if (Duel.Phase == DuelPhase.Main2) + { + List enemyOwnerMonsters = Bot.MonsterZone.Where(c => c != null && c.IsFaceup() && c.Owner == 1).OrderBy(c => c.GetDefensePower()).ToList(); + if (enemyOwnerMonsters.Count() > 0 && haveEnemyTarget) + { + if (enemyOwnerMonsters.Count() == 1) + { + List otherMaterialList = Bot.GetMonsters() + .Where(card => card.IsFaceup() && !enemyOwnerMonsters.Contains(card) && (!card.HasType(CardType.Xyz) || card.Overlays.Count() == 0)) + .OrderBy(c => c.GetDefensePower()).ToList(); + enemyOwnerMonsters.AddRange(otherMaterialList); + } + + if (enemyOwnerMonsters.Count() > 1) + { + List materialList = enemyOwnerMonsters.Take(2).ToList(); + if (Util.GetBotAvailZonesFromExtraDeck(materialList) > 0) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + } + + return false; + } + + // TODO extra effect + + + public bool MereologicAggregatorActivateFirst() + { + List> multiNegateFuncList = new List> { + {c => c.IsCode(44665365, 48546368, 54178659) && c.IsMonster() }, + {c => c.IsCode(4280258) && c.Attack >= 800 }, + {c => c.IsCode(47297616) && c.Attack >= 500 && c.Defense >= 500 }, + {c => c.IsCode(19652159) && c.Attack >= 1000 && c.Defense >= 1000 }, + {c => c.IsCode(79600447) && Enemy.MonsterZone.Any(m => m != null && m.IsFaceup() && m.IsCode(23288411) && m.Attack >= 1000) } + }; + List searchCardList = new List(Enemy.GetMonsters()); + searchCardList.AddRange(Enemy.GetSpells()); + foreach (ClientCard card in searchCardList) + { + if (card == null || card.IsFacedown() || card.IsDisabled()) continue; + foreach (Func func in multiNegateFuncList) + { + if (func(card)) + { + AI.SelectCard(card); + currentNegateCardList.Add(card); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + } + return false; + } + + public bool MereologicAggregatorActivateLater() + { + if (CheckWhetherNegated(true)) return false; + + ClientCard lastChainCard = Util.GetLastChainCard(); + + // for Chain1 ExRyzeal Chain2 Mereo to negate No41 + if (lastChainCard != null && lastChainCard.Controller == 0 && lastChainCard.IsCode(CardId.ExRyzeal)) + { + ClientCard no41 = Enemy.GetMonsters().FirstOrDefault(c => + c.IsFaceup() && !c.IsDisabled() && c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && c.HasPosition(CardPosition.FaceUpDefence) && !currentNegateCardList.Contains(c)); + if (no41 != null) + { + currentNegateCardList.Add(no41); + AI.SelectCard(no41); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + + List targetList = GetNormalEnemyTargetList(true, false, CardType.Monster, true).Where(c => c.IsFaceup() && !c.IsDisabled()).ToList(); + if (targetList.Count() > 0) + { + currentNegateCardList.Add(targetList[0]); + AI.SelectCard(targetList); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + + // protect chain + if (lastChainCard != null && lastChainCard.Controller == 0 && lastChainCard.IsCode(CardId.ExRyzeal)) + { + foreach (ClientCard card in Bot.GetMonsters()) + { + if (card.IsFacedown() || Duel.CurrentChain.Contains(card) || card.IsDisabled() || !card.HasType(CardType.Effect)) continue; + bool flag = card.IsCode(CardId.IceRyzeal, CardId.ThodeRyzeal); + flag |= card.IsCode(CardId.NodeRyzeal) && activatedCardIdList.Contains(CardId.NodeRyzeal); + flag |= card.HasType(CardType.Xyz) && !card.HasXyzMaterial() && !card.IsCode(CardId.RyzealDeadnader, CardId.RyzealDuodrive, CardId.FullArmoredUtopicRayLancer); + if (flag) + { + AI.SelectCard(card); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + } + + return false; + } + + public bool RyzealDeadnaderActivate() + { + if (ActivateDescription == 96) + { + Logger.DebugWriteLine("** deadnader replace destroy"); + if (deadnaderDestroySelf != Card) + { + activatedCardIdList.Add(CardId.RyzealDeadnader + 2); + return true; + } + return false; + } + if (CheckWhetherNegated(true)) return false; + if (ActivateDescription == Util.GetStringId(CardId.RyzealDeadnader, 1)) + { + // destroy self + bool shouldDestroySelf = false; + bool willBeNegated = false; + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.Controller == 1 && lastChainCard.IsCode(targetNegateIdList)) + { + shouldDestroySelf = true; + willBeNegated = true; + } + shouldDestroySelf |= Duel.CurrentChain.Any(c => c != null && c.Controller == 1 && !c.IsDisabled() && !DefaultCheckWhetherCardIdIsNegated(c.Id) + && c.IsCode(_CardId.EvenlyMatched, 35480699)); + shouldDestroySelf |= Card.Overlays.Count() == 1 && !activatedCardIdList.Contains(CardId.RyzealDeadnader) + && GetProblematicEnemyCardList(true, false, CardType.Monster).Count() == 0; + + if (shouldDestroySelf) + { + bool canRebornSelf = Bot.SpellZone.Count(c => c != null && c.IsFacedown() && c.IsCode(CardId.RyzealPlugIn) && !Duel.ChainTargets.Contains(c)) > 0; + bool canActivateTwin = !activatedCardIdList.Contains(CardId.TwinsOfTheEclipse + 1) && !DefaultCheckWhetherCardIdIsNegated(CardId.TwinsOfTheEclipse) + && !CheckWhetherWillbeRemoved(); + canRebornSelf |= canActivateTwin && Card.Overlays.Contains(CardId.TwinsOfTheEclipse); + if (Duel.CurrentChain.Any(c => c != null && c.Controller == 1 && !c.IsDisabled() && !DefaultCheckWhetherCardIdIsNegated(c.Id) + && c.IsCode(_CardId.EvenlyMatched))) + { + canRebornSelf |= Bot.MonsterZone.Any(c => c != null && c.HasType(CardType.Xyz) && c.Overlays.Contains(CardId.TwinsOfTheEclipse)); + } + + if (canRebornSelf) + { + deadnaderDestroySelf = Card; + return true; + } + } + + + // destroy + if (CanDestroyList(willBeNegated).Count() > 0) + { + return true; + } + } + else + { + // attach + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + + } + + public bool RyzealDuodriveActivate() + { + if (CheckWhetherNegated(true)) return false; + + if (ActivateDescription == Util.GetStringId(CardId.RyzealDuodrive, 1)) + { + int overlayCount = 0; + foreach (ClientCard card in Bot.MonsterZone) + { + if (card == null || card.Overlays.Count() == 0) continue; + if (card.IsCode(CardId.Number60DugaresTheTimeless) && !card.IsDisabled() && !activatedCardIdList.Contains(CardId.Number60DugaresTheTimeless)) + { + continue; + } + overlayCount += card.Overlays.Count(); + } + if (overlayCount >= 2) + { + // deattach and search + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } else + { + // attach + activatedCardIdList.Add(Card.Id); + return true; + } + + return false; + } + + public bool TwinsOfTheEclipseActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + // double attack + // dump remove material + if (CheckWhetherNegated(true)) return Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn); + activatedCardIdList.Add(Card.Id); + return true; + + } else if (Card.Location == CardLocation.Grave) + { + // spsummon + if (CheckWhetherNegated(true)) return false; + + activatedCardIdList.Add(Card.Id + 1); + ClientCard rebornTarget = TwinsOfTheEclipseRebornTarget(null); + if (rebornTarget != null) + { + ClientCard mereo = Bot.Graveyard.FirstOrDefault(c => c.IsCode(CardId.MereologicAggregator)); + if (mereo != null) + { + AI.SelectCard(new List { rebornTarget, mereo }); + return true; + } + ClientCard nonLightDark = Bot.Graveyard.FirstOrDefault(c => c.HasType(CardType.Xyz) && !c.HasAttribute((CardAttribute)attrbuteLightDark)); + if (nonLightDark != null) + { + AI.SelectCard(new List { rebornTarget, nonLightDark }); + return true; + } + ClientCard xyzMonster = Bot.Graveyard.FirstOrDefault(c => c.HasType(CardType.Xyz)); + if (xyzMonster != null) + { + AI.SelectCard(new List { rebornTarget, xyzMonster }); + return true; + } + } + + // although cannot find target, still should activate. + Logger.DebugWriteLine("** Twins of The Eclipse: although cannot find target, still should activate."); + return true; + } + + return false; + } + + public ClientCard TwinsOfTheEclipseRebornTarget(List targetList) + { + if (targetList == null) + { + targetList = Bot.Graveyard.Where(c => c.HasType(CardType.Xyz) && c.IsCanRevive()).ToList(); + } + ClientCard duoDriver = targetList.FirstOrDefault(c => c.IsCode(CardId.RyzealDuodrive)); + ClientCard deadnader = targetList.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + ClientCard no41 = targetList.FirstOrDefault(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + ClientCard abyssDweller = targetList.FirstOrDefault(c => c.IsCode(CardId.AbyssDweller)); + + if (no41 != null && !DefaultCheckWhetherCardIdIsNegated(_CardId.Number41BagooskatheTerriblyTiredTapir) + && !(deadnader != null && !activatedCardIdList.Contains(CardId.RyzealDeadnader)) + && !(Duel.Turn == 1 && duoDriver != null)) + { + return no41; + } + + if (abyssDweller != null && !DefaultCheckWhetherCardIdIsNegated(CardId.AbyssDweller) && !botSolvedCardIdList.Contains(CardId.AbyssDweller) + && AbyssDwellerSummonCheck()) + { + return abyssDweller; + } + + if (deadnader != null) + { + return deadnader; + } + if (duoDriver != null && (!activatedCardIdList.Contains(CardId.RyzealDuodrive + 1) || Bot.HasInHandOrInSpellZone(CardId.RyzealCross))) + { + return duoDriver; + } + + // random spsummon + if (targetList.Count() > 0) + { + return ShuffleList(targetList)[0]; + } + return null; + } + + public List CanDestroyList(bool ignoreCurrentDestroy = false) + { + List destroyTargetList = GetNormalEnemyTargetList(true, ignoreCurrentDestroy, CardType.Monster).Except(currentNegateCardList).ToList(); + + List cannotDestroyList = new List(NotToDestroySpellTrap); + destroyTargetList.RemoveAll(c => c.IsCode(cannotDestroyList)); + + List undestoryableCardIdlist = new List { 94977269, 58604027, 8062132, 10817524, 53315891, 10000090, 86221741, 71222868, + 83257450, 97489701, 97165977, 24550676, 55410871, 72664875, 85908279, 13331639, 20654247, 43228023, 99585850, 92770064, 10497636, 77313225 }; + destroyTargetList.RemoveAll(c => !c.IsDisabled() && c.IsCode(undestoryableCardIdlist)); + + destroyTargetList.RemoveAll(c => !c.IsDisabled() && c.HasSetcode(SetcodeMajespecter)); + + if (Enemy.GetSpells().Any(c => c.IsFacedown()) || Enemy.GetMonsters().Any(c => c.IsFacedown())) + { + destroyTargetList.RemoveAll(c => c.IsCode(81497285)); + } + destroyTargetList.RemoveAll(c => !c.IsDisabled() && c.HasSetcode(SetcodeMajespecter)); + + + return destroyTargetList; + } + + public bool TornadoDragonActivate() + { + if (CheckWhetherNegated(true)) return false; + + List spells = Enemy.GetSpells(); + if (spells.Count == 0) + return false; + + // destroy faceup card first + ClientCard selected = Enemy.SpellZone.GetFloodgate(); + if (selected == null && Duel.Player == 1) + { + List targetList = spells.Where(c => c.IsFaceup() && !NotToDestroySpellTrap.Contains(c.Id) && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Continuous | CardType.Equip | CardType.Field | CardType.Pendulum)).ToList(); + if (targetList.Count() > 0) + { + selected = ShuffleList(targetList)[0]; + } + } + + if (selected != null) + { + currentDestroyCardList.Add(selected); + AI.SelectCard(selected); + return true; + } + + // destroy face-down card + if (selected == null) + { + List setThisTurnList = Enemy.SpellZone.Where(c => c != null && c.IsFacedown() && !currentDestroyCardList.Contains(c) + && enemyPlaceThisTurn.Contains(c)).ToList(); + if (setThisTurnList.Count() > 0) + { + selected = ShuffleList(setThisTurnList)[0]; + } + } + if (selected == null) + { + List setThisTurnList = Enemy.SpellZone.Where(c => c != null && c.IsFacedown() && !currentDestroyCardList.Contains(c)).ToList(); + if (setThisTurnList.Count() > 0) + { + selected = ShuffleList(setThisTurnList)[0]; + } + } + + bool flag = Duel.Player == 0; + flag |= Duel.Player == 1 && Duel.Phase == DuelPhase.End; + flag |= DefaultOnBecomeTarget(); + + if (flag) + { + currentDestroyCardList.Add(selected); + AI.SelectCard(selected); + return true; + } + + return false; + } + + public bool EvilswarmExcitonKnightActivate() + { + if (CheckWhetherNegated(true)) return false; + return DefaultEvilswarmExcitonKnightEffect(); + } + + public bool AbyssDwellerActivate() + { + if (botSolvedCardIdList.Contains(CardId.AbyssDweller)) return false; + + if (Duel.Player == 0 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + List checkIdList = new List { CardId.NodeRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal }; + foreach (int checkId in checkIdList) + { + if (Card.Overlays.Contains(checkId) && !Bot.HasInHand(checkId) && !activatedCardIdList.Contains(checkId)) + { + return true; + } + return false; + } + } + if (Duel.Player == 1) + { + if (CheckWhetherNegated(true)) return false; + if (enemyDeckTypeRecord.Contains(SetcodeAtlantean)) return true; + return Enemy.GetMonsterCount() + Enemy.GetSpellCount() > 0; + } + + return false; + } + + public bool Number60DugaresTheTimelessActivate() + { + if (CheckWhetherNegated(true)) return false; + if (Number60DugaresTheTimelessDrawEffect() || Number60DugaresTheTimelessDoubleTarget() != null || Number60DugaresTheTimelessRebornEffect()) + { + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool Number60DugaresTheTimelessDrawEffect() + { + if (lockBirdSolved || Bot.Deck.Count < 2) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + public ClientCard Number60DugaresTheTimelessDoubleTarget() + { + if (Util.IsTurn1OrMain2()) return null; + ClientCard maxAttackMonster = Bot.MonsterZone.Where(c => c != null && (c.HasPosition(CardPosition.FaceUpAttack) || !summonThisTurn.Contains(c))) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + + if (maxAttackMonster != null) + { + int maxBotAttack = maxAttackMonster.Attack; + + // defeat enemy monster + ClientCard bestEnemyMonster = Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && (c.IsDisabled() || !c.IsMonsterInvincible())) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (bestEnemyMonster != null) + { + int maxEnemyPower = bestEnemyMonster.GetDefensePower(); + if (bestEnemyMonster.IsAttack()) maxEnemyPower -= 1; + if (maxBotAttack < maxEnemyPower && maxBotAttack * 2 > maxEnemyPower) + { + return maxAttackMonster; + } + } + + // direct attack + if (!botSolvedCardIdList.Contains(_CardId.EvilswarmExcitonKnight)) + { + int currentAttack = GetBotCurrentTotalAttack(); + if (currentAttack < Enemy.LifePoints && currentAttack + maxBotAttack >= Enemy.LifePoints) + { + return maxAttackMonster; + } + } + } + + return null; + } + + public bool Number60DugaresTheTimelessRebornEffect() + { + // not used + + return false; + } + + public bool DonnerDaggerFurHireActivate() + { + if (CheckAtAdvantage() && !Bot.HasInHand(CardId.ExRyzeal)) + { + return false; + } + + ClientCard targetCard = GetProblematicEnemyMonster(canBeTarget: true, selfType: CardType.Monster); + if (targetCard == null) + { + List enemyMonsters = Enemy.GetMonsters(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + targetCard = enemyMonsters[0]; + } + } + + if (targetCard != null) + { + AI.SelectCard(Card); + AI.SelectNextCard(targetCard); + currentDestroyCardList.Add(targetCard); + return true; + } + + return false; + } + + + + public bool Level4Summon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Extra)) return false; + ClientCard leastAttackLevel4 = Bot.Hand.Where(c => c.Level == 4).OrderBy(c => c.Attack).FirstOrDefault(); + if (leastAttackLevel4 == null || Card != leastAttackLevel4) return false; + + if (GetLevel4CountOnField() == 1) + { + ClientCard target = Duel.MainPhase.SummonableCards.Where(c => c != null && c.Level == 4).OrderBy(c => c.Attack).FirstOrDefault(); + if (Card != target) return false; + summonCount -= 1; + return true; + } + + return false; + } + + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + + // select place + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + // do not set infinite impermanence if don't need to set other cards + if (Card.IsCode(_CardId.InfiniteImpermanence) && Bot.GetMonsterCount() == 0 && Bot.GetSpellCount() == 0 + && !Bot.Hand.Any(c => !c.IsCode(_CardId.InfiniteImpermanence) && (c.IsTrap() || c.HasType(CardType.QuickPlay))) + && Bot.Hand.Count() <= 6) + { + return false; + } + + if (Card.IsCode(CardId.RyzealPlugIn)) + { + bool targetFlag = Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && (c.Level == 4 || c.IsCanRevive())); + targetFlag |= Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && (c.Level == 4 || c.IsCanRevive())); + if (!targetFlag) + { + return false; + } + } + + List avoid_list = new List(); + int setForInfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setForInfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setForInfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + public bool ChangePositionFirst() + { + if (Card.IsFacedown() && Card.Level == 4) + { + return true; + } + + if (Enemy.MonsterZone.Any(c => c != null && c.HasPosition(CardPosition.FaceUpDefence) && !c.IsDisabled() && c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir))) + { + return false; + } + + if (Card.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)) + { + bool haveDangerMonster = Enemy.MonsterZone.Any(c => c != null && c.IsFloodgate() && !c.IsDisabled()); + if (Card.IsDefense()) + { + return !haveDangerMonster && !Util.IsTurn1OrMain2(); + } else + { + return haveDangerMonster || Util.IsTurn1OrMain2(); + } + } + + return false; + } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 8fb2fb8fe..851cbb114 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -99,7 +99,13 @@ protected class _CardId public const int GhostOgreAndSnowRabbit = 59438930; public const int GhostBelle = 73642296; public const int EffectVeiler = 97268402; + public const int GhostMournerMoonlitChill = 52038441; public const int ArtifactLancea = 34267821; + public const int DimensionShifter = 91800273; + public const int NibiruThePrimalBeing = 27204311; + public const int MulcharmyPurulia = 84192580; + public const int MulcharmyFuwalos = 42141493; + public const int MulcharmyNyalus = 87126721; public const int CalledByTheGrave = 24224830; public const int CrossoutDesignator = 65681983; @@ -120,9 +126,19 @@ protected class _CardId public const int ImperialOrder = 61740673; public const int RoyalDecreel = 51452091; + public const int NaturalExterio = 99916754; public const int NaturiaBeast = 33198837; + public const int SwordsmanLV7 = 37267041; public const int AntiSpellFragrance = 58921041; - + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int SkillDrain = 82732705; + + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int MaskedHERODarkLaw = 58481572; + public const int VaylantzWorld_ShinraBansho = 49568943; public const int VaylantzWorld_KonigWissen = 75952542; public const int DivineArsenalAAZEUS_SkyThunder = 90448279; @@ -214,6 +230,7 @@ protected class _Setcode public const int FurHire = 0x114; public const int Altergeist = 0x103; public const int Crusadia = 0x116; + public const int Danger = 0x11e; public const int Endymion = 0x12a; public const int AncientWarriors = 0x137; public const int RescueACE = 0x18b; @@ -780,7 +797,7 @@ protected bool DefaultAshBlossomAndJoyousSpring() }; if (Util.GetLastChainCard().IsCode(ignoreList)) return false; - if (Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect + if (Util.GetLastChainCard().HasSetcode(_Setcode.Danger) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect return false; return Duel.LastChainPlayer == 1; } @@ -1599,6 +1616,12 @@ protected bool DefaultCheckWhetherCardIdIsNegated(int cardId) || (calledbytheGraveIdCountMap.ContainsKey(cardId) && calledbytheGraveIdCountMap[cardId] > 0); } + protected int GetCalledbytheGraveIdCount(int cardId) + { + if (!calledbytheGraveIdCountMap.ContainsKey(cardId)) return 0; + return calledbytheGraveIdCountMap[cardId]; + } + protected virtual bool DefaultSetForDiabellze() { diff --git a/Game/ClientCard.cs b/Game/ClientCard.cs index e3f9f1310..7d6d70a23 100644 --- a/Game/ClientCard.cs +++ b/Game/ClientCard.cs @@ -350,6 +350,11 @@ public bool IsOriginalCode(int id) return Id == id || Alias - Id < 20 && Alias == id; } + public bool IsOnField() + { + return Location == CardLocation.MonsterZone || Location == CardLocation.SpellZone || Location == CardLocation.PendulumZone || Location == CardLocation.FieldZone; + } + public bool HasXyzMaterial() { return Overlays.Count > 0; diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 0770fe088..12991348b 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1017,7 +1017,13 @@ private void InternalOnSelectCard(BinaryReader packet, Func, i packet.ReadByte(); // pos ClientCard card; if (((int)loc & (int)CardLocation.Overlay) != 0) + { card = new ClientCard(id, CardLocation.Overlay, -1); + CardLocation ownerLoc = loc ^ CardLocation.Overlay; + ClientCard ownerCard = _duel.GetCard(player, ownerLoc, seq); + if (ownerCard != null) + card.OwnTargets.Add(ownerCard); + } else { card = _duel.GetCard(player, loc, seq); diff --git a/WindBot.csproj b/WindBot.csproj index accc0589b..d569f70bf 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -60,6 +60,7 @@ + From 9c19a04fef014cf915086068b69d6f669a1b13aa Mon Sep 17 00:00:00 2001 From: Mercury233 Date: Sun, 8 Jun 2025 08:17:24 +0800 Subject: [PATCH 050/110] use dotnet 4.8 & windows 2022 (#212) --- .github/workflows/test-build.yml | 2 +- App.config | 2 +- BotWrapper/BotWrapper.csproj | 122 +++++++++++++------------- BotWrapper/Properties/AssemblyInfo.cs | 2 +- BotWrapper/app.config | 6 +- Properties/AssemblyInfo.cs | 2 +- WindBot.csproj | 12 ++- 7 files changed, 79 insertions(+), 69 deletions(-) diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 6995ab4c1..1351d2ea1 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -8,7 +8,7 @@ on: jobs: build: - runs-on: windows-2019 + runs-on: windows-2022 env: Solution_Name: WindBot.sln diff --git a/App.config b/App.config index 2c307fa31..5ffd8f8ee 100644 --- a/App.config +++ b/App.config @@ -1,6 +1,6 @@ - + diff --git a/BotWrapper/BotWrapper.csproj b/BotWrapper/BotWrapper.csproj index 5ad4402d4..634d25ce8 100644 --- a/BotWrapper/BotWrapper.csproj +++ b/BotWrapper/BotWrapper.csproj @@ -1,67 +1,69 @@ - - - - - Debug - AnyCPU - {0665CA3B-C14F-40EC-ABFB-AD46A695F5A3} - WinExe - Properties - BotWrapper - Bot - v4.0 - 512 - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - BotWrapper.BotWrapper - - - WindBot.ico - - - - - - - - - - - - - - PreserveNewest - - - - - - + + + + + Debug + AnyCPU + {0665CA3B-C14F-40EC-ABFB-AD46A695F5A3} + WinExe + Properties + BotWrapper + Bot + v4.8 + 512 + + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + BotWrapper.BotWrapper + + + WindBot.ico + + + + + + + + + + + + + + PreserveNewest + + + + + + + --> \ No newline at end of file diff --git a/BotWrapper/Properties/AssemblyInfo.cs b/BotWrapper/Properties/AssemblyInfo.cs index 09d05249f..fd3a96306 100644 --- a/BotWrapper/Properties/AssemblyInfo.cs +++ b/BotWrapper/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("IceYGO")] [assembly: AssemblyProduct("WindBot")] -[assembly: AssemblyCopyright("Copyright © IceYGO 2017")] +[assembly: AssemblyCopyright("Copyright © IceYGO 2015-2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/BotWrapper/app.config b/BotWrapper/app.config index fcd0c9373..2c0f5590f 100644 --- a/BotWrapper/app.config +++ b/BotWrapper/app.config @@ -1,3 +1,3 @@ - - - + + + diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index b92b294bb..1c699d4ed 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("IceYGO")] [assembly: AssemblyProduct("WindBot")] -[assembly: AssemblyCopyright("Copyright © IceYGO 2015-2017")] +[assembly: AssemblyCopyright("Copyright © IceYGO 2015-2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/WindBot.csproj b/WindBot.csproj index d569f70bf..5537a8fb2 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -9,7 +9,7 @@ Properties WindBot WindBot - v4.0 + v4.8 512 @@ -21,6 +21,7 @@ x86 prompt MinimumRecommendedRules.ruleset + false bin\Release\ @@ -30,9 +31,10 @@ x86 prompt MinimumRecommendedRules.ruleset + false - + WindBot.Program WindBot.ico @@ -40,6 +42,12 @@ true + + false + + + false + .\Mono.Data.Sqlite.dll From ec7935f76dbcf0f6fa0ccdc073c68d84565eb13b Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Sun, 8 Jun 2025 15:19:12 +0800 Subject: [PATCH 051/110] Add ChainInfo (#210) --- Game/AI/Decks/AlbazExecutor.cs | 16 ++--- Game/AI/Decks/DogmatikaExecutor.cs | 6 +- Game/AI/Decks/ExosisterExecutor.cs | 6 +- Game/AI/Decks/LabrynthExecutor.cs | 6 +- Game/AI/Decks/RyzealExecutor.cs | 61 +++++++++++++------ Game/AI/Decks/SwordsoulExecutor.cs | 6 +- Game/AI/Decks/WitchcraftExecutor.cs | 12 ++-- Game/ChainInfo.cs | 93 +++++++++++++++++++++++++++++ Game/Duel.cs | 8 +++ Game/GameBehavior.cs | 5 ++ WindBot.csproj | 1 + 11 files changed, 176 insertions(+), 44 deletions(-) create mode 100644 Game/ChainInfo.cs diff --git a/Game/AI/Decks/AlbazExecutor.cs b/Game/AI/Decks/AlbazExecutor.cs index 5ad4f57f0..348349755 100644 --- a/Game/AI/Decks/AlbazExecutor.cs +++ b/Game/AI/Decks/AlbazExecutor.cs @@ -2186,7 +2186,7 @@ public override IList OnSelectCard(IList cards, int min, public override int OnSelectOption(IList options) { - ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + ChainInfo currentSolvingChain = Duel.GetCurrentSolvingChainInfo(); if (currentSolvingChain != null) { // 1190=Add to Hand, 1152=Special Summon @@ -2246,8 +2246,8 @@ public override int OnSelectOption(IList options) public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { - ClientCard currentSovingChain = Duel.GetCurrentSolvingChainCard(); - if (currentSovingChain != null && currentSovingChain.Controller == 0 && currentSovingChain.IsCode(CardId.SprindTheIrondashDragon)) + ChainInfo currentSovingChain = Duel.GetCurrentSolvingChainInfo(); + if (currentSovingChain != null && currentSovingChain.ActivatePlayer == 0 && currentSovingChain.IsCode(CardId.SprindTheIrondashDragon)) { return SprindTheIrondashDragonMoveZone(available, null); } @@ -2435,21 +2435,21 @@ public override void OnChaining(int player, ClientCard card) public override void OnChainSolved(int chainIndex) { - ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); if (currentCard != null) { // if activation is negated, it can activate again. - if (currentCard.Controller == 0) + if (currentCard.ActivatePlayer == 0) { List activateCheck = new List { CardId.NadirServant, CardId.FusionDeployment, CardId.BrandedFusion, CardId.BrandedInRed }; if (currentCard.IsCode(activateCheck)) { - activatedCardIdList.Add(currentCard.Id); + activatedCardIdList.Add(currentCard.ActivateId); } } if (!Duel.IsCurrentSolvingChainNegated()) { - if (currentCard.Controller == 1) + if (currentCard.ActivatePlayer == 1) { if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; @@ -2458,7 +2458,7 @@ public override void OnChainSolved(int chainIndex) if (currentCard.IsCode(CardId.DimensionShifter)) dimensionShifterCount = 2; } - if (currentCard.Controller == 0 && currentCard.IsCode(CardId.NadirServant)) + if (currentCard.ActivatePlayer == 0 && currentCard.IsCode(CardId.NadirServant)) { nadirActivated = true; } diff --git a/Game/AI/Decks/DogmatikaExecutor.cs b/Game/AI/Decks/DogmatikaExecutor.cs index e8fc860bf..967c9a17c 100644 --- a/Game/AI/Decks/DogmatikaExecutor.cs +++ b/Game/AI/Decks/DogmatikaExecutor.cs @@ -1153,8 +1153,8 @@ public override void OnChaining(int player, ClientCard card) public override void OnChainSolved(int chainIndex) { - ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); - if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.ActivatePlayer == 1) { if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; @@ -1166,7 +1166,7 @@ public override void OnChainSolved(int chainIndex) { for (int i = 0; i < 5; ++i) { - if (Enemy.SpellZone[i] == currentCard) + if (Enemy.SpellZone[i] == currentCard.RelatedCard) { infiniteImpermanenceList.Add(4 - i); break; diff --git a/Game/AI/Decks/ExosisterExecutor.cs b/Game/AI/Decks/ExosisterExecutor.cs index 41f48bdcb..932d18752 100644 --- a/Game/AI/Decks/ExosisterExecutor.cs +++ b/Game/AI/Decks/ExosisterExecutor.cs @@ -771,8 +771,8 @@ public override void OnSelectChain(IList cards) public override void OnChainSolved(int chainIndex) { - ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); - if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.ActivatePlayer == 1) { if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; @@ -782,7 +782,7 @@ public override void OnChainSolved(int chainIndex) { for (int i = 0; i < 5; ++i) { - if (Enemy.SpellZone[i] == currentCard) + if (Enemy.SpellZone[i] == currentCard.RelatedCard) { infiniteImpermanenceList.Add(4 - i); break; diff --git a/Game/AI/Decks/LabrynthExecutor.cs b/Game/AI/Decks/LabrynthExecutor.cs index 25423a5cd..436bca64c 100644 --- a/Game/AI/Decks/LabrynthExecutor.cs +++ b/Game/AI/Decks/LabrynthExecutor.cs @@ -1646,17 +1646,17 @@ public override void OnChaining(int player, ClientCard card) public override void OnChainSolved(int chainIndex) { - ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); if (currentCard != null && !Duel.IsCurrentSolvingChainNegated()) { - if (currentCard.Controller == 1) + if (currentCard.ActivatePlayer == 1) { if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; if (currentCard.IsCode(CardId.DimensionShifter)) dimensionShifterCount = 2; } - if (currentCard.Controller == 0) + if (currentCard.ActivatePlayer == 0) { if (currentCard.IsCode(CardId.LabrynthCooclock)) cooclockAffected = true; diff --git a/Game/AI/Decks/RyzealExecutor.cs b/Game/AI/Decks/RyzealExecutor.cs index d887f3b5d..8dc0dcf0e 100644 --- a/Game/AI/Decks/RyzealExecutor.cs +++ b/Game/AI/Decks/RyzealExecutor.cs @@ -64,6 +64,7 @@ public RyzealExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, _CardId.GhostOgreAndSnowRabbit, GhostOgreAndSnowRabbitActivate); AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.RyzealCross, RyzealCrossActivateCard); AddExecutor(ExecutorType.Activate, _CardId.EvilswarmExcitonKnight, EvilswarmExcitonKnightActivate); AddExecutor(ExecutorType.Activate, CardId.RyzealDeadnader, RyzealDeadnaderActivate); AddExecutor(ExecutorType.Activate, CardId.RyzealDuodrive, RyzealDuodriveActivate); @@ -82,7 +83,6 @@ public RyzealExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, CardId.Bonfire, BonfireActivate); AddExecutor(ExecutorType.Activate, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireActivate); AddExecutor(ExecutorType.Activate, CardId.Number60DugaresTheTimeless, Number60DugaresTheTimelessActivate); - AddExecutor(ExecutorType.Activate, CardId.RyzealCross, RyzealCrossActivateCard); AddExecutor(ExecutorType.Activate, CardId.TripleTacticsTalent, TripleTacticsTalentActivate); AddExecutor(ExecutorType.Activate, CardId.Bonfire, BonfireActivateToSearchNecessary); AddExecutor(ExecutorType.Activate, CardId.SeventhTachyon, SeventhTachyonActivate); @@ -372,6 +372,26 @@ public bool CheckCardShouldNegate(ClientCard card) return true; } + public bool CheckCardShouldNegate(ChainInfo chainInfo) + { + if (chainInfo == null) return false; + ClientCard card = chainInfo.RelatedCard; + + if (card == null) return false; + if (card.IsMonster() && card.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (NotToNegateIdList.Contains(card.Id)) return false; + if (card.HasSetcode(_Setcode.Danger) && card.Location == CardLocation.Hand) return false; + if (card.IsMonster() && chainInfo.HasLocation(CardLocation.MonsterZone) && chainInfo.HasPosition(CardPosition.Defence)) + { + if (Enemy.MonsterZone.Any(c => CheckNumber41(c)) || Bot.MonsterZone.Any(c => CheckNumber41(c))) return false; + } + if (DefaultCheckWhetherCardIsNegated(card)) return false; + if (Duel.Player == 1 && card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus)) return false; + if (card.IsDisabled()) return false; + + return true; + } + /// /// Check whether bot is at advantage. /// @@ -901,7 +921,7 @@ public override void OnSelectChain(IList cards) public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { - ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + ChainInfo currentSolvingChain = Duel.GetCurrentSolvingChainInfo(); if (currentSolvingChain != null) { if (botSolvingCross) @@ -933,7 +953,7 @@ public override IList OnSelectCard(IList cards, int min, } } - if (currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.EvenlyMatched)) + if (currentSolvingChain.ActivatePlayer == 1 && currentSolvingChain.IsCode(_CardId.EvenlyMatched)) { Logger.DebugWriteLine("=== Evenly Matched activated."); List banishList = new List(); @@ -975,7 +995,7 @@ public override IList OnSelectCard(IList cards, int min, return Util.CheckSelectCount(banishList, cards, min, max); } - if (currentSolvingChain.Controller == 0) + if (currentSolvingChain.ActivatePlayer == 0) { if (hint == HintMsg.AddToHand) { @@ -1681,31 +1701,31 @@ public override void OnChaining(int player, ClientCard card) public override void OnChainSolved(int chainIndex) { botSolvingCross = false; - ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); - if (currentCard != null) + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null && !Duel.IsCurrentSolvingChainNegated()) { if (!Duel.IsCurrentSolvingChainNegated()) { - if (currentCard.IsCode(_CardId.LockBird)) + if (currentChain.IsCode(_CardId.LockBird)) lockBirdSolved = true; - if (currentCard.IsCode(_CardId.DimensionShifter)) + if (currentChain.IsCode(_CardId.DimensionShifter)) dimensionShifterCount = 2; - if (currentCard.Controller == 1) + if (currentChain.ActivatePlayer == 1) { - if (currentCard.IsCode(_CardId.MaxxC)) + if (currentChain.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; - if (currentCard.IsCode(_CardId.MulcharmyPurulia)) + if (currentChain.IsCode(_CardId.MulcharmyPurulia)) enemyActivatePurulia = true; - if (currentCard.IsCode(_CardId.MulcharmyFuwalos)) + if (currentChain.IsCode(_CardId.MulcharmyFuwalos)) enemyActivateFuwalos = true; - if (currentCard.IsCode(_CardId.MulcharmyNyalus)) + if (currentChain.IsCode(_CardId.MulcharmyNyalus)) enemyActivateNyalus = true; } - if (currentCard.Controller == 0) + if (currentChain.ActivatePlayer == 0) { foreach (int checkId in CheckBotSolvedList) { - if (currentCard.IsCode(checkId)) + if (currentChain.IsCode(checkId)) { botSolvedCardIdList.Add(checkId); } @@ -2758,10 +2778,10 @@ public bool RyzealCrossActivateCard() // whether to negate by cross if (ActivateDescription == Util.GetStringId(CardId.RyzealCross, 3)) { - ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); - if (currentSolvingChain != null && !Duel.IsCurrentSolvingChainNegated()) + ChainInfo currentChainInfo = Duel.GetCurrentSolvingChainInfo(); + if (currentChainInfo != null && !Duel.IsCurrentSolvingChainNegated()) { - if (CheckCardShouldNegate(currentSolvingChain)) + if (CheckCardShouldNegate(currentChainInfo)) { Logger.DebugWriteLine("** cross negate"); activatedCardIdList.Add(CardId.RyzealCross + 2); @@ -2780,6 +2800,11 @@ public bool RyzealCrossActivateCard() Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && (c.IsCanRevive() || !c.HasType(CardType.Xyz)))); flag |= Bot.MonsterZone.Count(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && (c.Overlays.Count() > 0 || canSetMaterial)) > 0; + if (Duel.MainPhase.SpecialSummonableCards.Any(c => c.IsCode(CardId.RyzealDuodrive))) + { + flag |= RyzealDuodriveSpSummonCheck(); + } + return flag; } diff --git a/Game/AI/Decks/SwordsoulExecutor.cs b/Game/AI/Decks/SwordsoulExecutor.cs index d8676c858..553d402fd 100644 --- a/Game/AI/Decks/SwordsoulExecutor.cs +++ b/Game/AI/Decks/SwordsoulExecutor.cs @@ -695,8 +695,8 @@ public override void OnNewTurn() public override void OnChainSolved(int chainIndex) { - ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); - if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.ActivatePlayer == 1) { if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; @@ -706,7 +706,7 @@ public override void OnChainSolved(int chainIndex) { for (int i = 0; i < 5; ++i) { - if (Enemy.SpellZone[i] == currentCard) + if (Enemy.SpellZone[i] == currentCard.RelatedCard) { infiniteImpermanenceList.Add(4 - i); break; diff --git a/Game/AI/Decks/WitchcraftExecutor.cs b/Game/AI/Decks/WitchcraftExecutor.cs index bc34df2f6..8c2c8faee 100644 --- a/Game/AI/Decks/WitchcraftExecutor.cs +++ b/Game/AI/Decks/WitchcraftExecutor.cs @@ -201,8 +201,8 @@ public override void OnChainEnd() public override void OnChainSolved(int chainIndex) { - ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); - if (currentCard != null && currentCard.Controller == 1) + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && currentCard.ActivatePlayer == 1) { if (Duel.IsCurrentSolvingChainNegated()) { @@ -212,16 +212,16 @@ public override void OnChainSolved(int chainIndex) if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null && Bot.HasInSpellZone(CardId.MagicianRightHand, true)) { - Logger.DebugWriteLine("MagicianRightHand negate: " + currentCard.Name ?? "???"); + Logger.DebugWriteLine("MagicianRightHand negate: " + currentCard.RelatedCard.Name ?? "???"); MagicianRightHand_used = true; } } - if (!MagiciansLeftHand_used && currentCard.IsTrap() && currentCard.Controller == 1) + if (!MagiciansLeftHand_used && currentCard.IsTrap() && currentCard.ActivatePlayer == 1) { if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null && Bot.HasInSpellZone(CardId.MagiciansLeftHand, true)) { - Logger.DebugWriteLine("MagiciansLeftHand negate: " + currentCard.Name ?? "???"); + Logger.DebugWriteLine("MagiciansLeftHand negate: " + currentCard.RelatedCard.Name ?? "???"); MagiciansLeftHand_used = true; } } @@ -236,7 +236,7 @@ public override void OnChainSolved(int chainIndex) { for (int i = 0; i < 5; ++i) { - if (Enemy.SpellZone[i] == currentCard) + if (Enemy.SpellZone[i] == currentCard.RelatedCard) { Impermanence_list.Add(4 - i); break; diff --git a/Game/ChainInfo.cs b/Game/ChainInfo.cs new file mode 100644 index 000000000..3e0bef0a2 --- /dev/null +++ b/Game/ChainInfo.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; + +namespace WindBot.Game +{ + public class ChainInfo + { + public ClientCard RelatedCard { get; private set; } + public int ActivatePlayer { get; private set; } + public int ActivateId { get; private set; } + public int ActivateController { get; private set; } + public int ActivatePosition { get; private set; } + public int ActivateSequence { get; private set; } + public CardLocation ActivateLocation { get; private set; } + public int ActivateLevel { get; private set; } + public int ActivateRank { get; private set; } + public int ActivateType { get; private set; } + public int ActivateRace { get; private set; } + public int ActivateAttack { get; private set; } + public int ActivateDefense { get; private set; } + public bool IsSpecialSummoned { get; private set; } + public int ActivateDescription { get; private set; } + + public ChainInfo(ClientCard card) + : this(card, card.Controller, 0) + { + } + + public ChainInfo(ClientCard card, int player, int desc) + { + RelatedCard = card; + ActivatePlayer = player; + ActivateId = card.Id; + ActivateController = card.Controller; + ActivatePosition = card.Position; + ActivateSequence = card.Sequence; + ActivateLocation = card.Location; + ActivateLevel = card.Level; + ActivateRank = card.Rank; + ActivateType = card.Type; + ActivateRace = card.Race; + ActivateAttack = card.Attack; + ActivateDefense = card.Defense; + ActivateAttack = card.Attack; + ActivateDefense = card.Defense; + IsSpecialSummoned = card.IsSpecialSummoned; + ActivateDescription = desc; + } + + public bool HasPosition(CardPosition position) + { + return (ActivatePosition & (int)position) != 0; + } + + public bool HasLocation(CardLocation location) + { + return ((int)ActivateLocation & (int)location) != 0; + } + + public bool IsCode(int id) + { + return RelatedCard != null && RelatedCard.IsCode(id); + } + + public bool IsCode(IList ids) + { + return RelatedCard != null && RelatedCard.IsCode(ids); + } + + public bool IsCode(params int[] ids) + { + return RelatedCard != null && RelatedCard.IsCode(ids); + } + + public bool HasType(CardType type) + { + return RelatedCard != null && (RelatedCard.Type & (int)type) != 0; + } + public bool IsSpell() + { + return HasType(CardType.Spell); + } + + public bool IsTrap() + { + return HasType(CardType.Trap); + } + } +} diff --git a/Game/Duel.cs b/Game/Duel.cs index 02d71cdb5..ec1830569 100644 --- a/Game/Duel.cs +++ b/Game/Duel.cs @@ -20,6 +20,7 @@ public class Duel public int LastChainPlayer { get; set; } public CardLocation LastChainLocation { get; set; } public IList CurrentChain { get; set; } + public IList CurrentChainInfo { get; set; } public IList ChainTargets { get; set; } public IList LastChainTargets { get; set; } public IList ChainTargetOnly { get; set; } @@ -37,6 +38,7 @@ public Duel() LastChainPlayer = -1; LastChainLocation = 0; CurrentChain = new List(); + CurrentChainInfo = new List(); ChainTargets = new List(); LastChainTargets = new List(); ChainTargetOnly = new List(); @@ -180,6 +182,12 @@ public ClientCard GetCurrentSolvingChainCard() return CurrentChain[SolvingChainIndex - 1]; } + public ChainInfo GetCurrentSolvingChainInfo() + { + if (SolvingChainIndex == 0 || SolvingChainIndex > CurrentChainInfo.Count) return null; + return CurrentChainInfo[SolvingChainIndex - 1]; + } + public bool IsCurrentSolvingChainNegated() { return SolvingChainIndex > 0 && NegatedChainIndexList.Contains(SolvingChainIndex); diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 12991348b..a0d6fa568 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -386,6 +386,7 @@ private void OnStart(BinaryReader packet) // in case of ending duel in chain's solving _duel.CurrentChain.Clear(); + _duel.CurrentChainInfo.Clear(); _duel.ChainTargets.Clear(); _duel.ChainTargetOnly.Clear(); _duel.SummoningCards.Clear(); @@ -764,6 +765,8 @@ private void OnChaining(BinaryReader packet) if (card.Id == 0) card.SetId(cardId); int cc = GetLocalPlayer(packet.ReadByte()); + packet.ReadInt16(); // trigger location + trigger sequence + int desc = packet.ReadInt32(); if (_debug) if (card != null) Logger.WriteLine("(" + cc.ToString() + " 's " + (card.Name ?? "UnKnowCard") + " activate effect from " + (CardLocation)pcl + ")"); _duel.LastChainLocation = (CardLocation)pcl; @@ -772,6 +775,7 @@ private void OnChaining(BinaryReader packet) _duel.ChainTargetOnly.Clear(); _duel.LastSummonPlayer = -1; _duel.CurrentChain.Add(card); + _duel.CurrentChainInfo.Add(new ChainInfo(card, cc, desc)); _duel.LastChainPlayer = cc; } @@ -806,6 +810,7 @@ private void OnChainEnd(BinaryReader packet) _duel.LastChainPlayer = -1; _duel.LastChainLocation = 0; _duel.CurrentChain.Clear(); + _duel.CurrentChainInfo.Clear(); _duel.ChainTargets.Clear(); _duel.LastChainTargets.Clear(); _duel.ChainTargetOnly.Clear(); diff --git a/WindBot.csproj b/WindBot.csproj index 5537a8fb2..64c37f818 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -144,6 +144,7 @@ + From 813239c56554f7c198afdbd7f029334428b15aa1 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sun, 8 Jun 2025 15:20:28 +0800 Subject: [PATCH 052/110] update readme --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ff0f9531..521e26f0e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # WindBot -A C# bot for YGOPro, compatible with the [YGOSharp](https://github.com/IceYGO/ygosharp) and [SRVPro](https://github.com/moecube/srvpro) server. +A C# bot for [YGOPro](https://github.com/Fluorohydride/ygopro), compatible with the [YGOSharp](https://github.com/IceYGO/ygosharp) and [SRVPro](https://github.com/mycard/srvpro) server. ### How to use: @@ -151,6 +151,11 @@ In this situation, it will be multi-threaded. This can be useful for servers, si The parameters are same as commandlines, but low cased. +Note: Currently the server bind to all interfaces, so it requires elevated privileges to run. You can otherwise use the following command to add a URL ACL for your port (2399 for example), which allows all users to access it: +``` +netsh http add urlacl url=http://+:2399/ user=Everyone +``` + ### Known issues * If one chain includes two activation that use `AI.SelectCard`, the second one won't select correctly. From f4cbb511f20d8eb290d58f2868df6585c4eda3cb Mon Sep 17 00:00:00 2001 From: Mercury233 Date: Thu, 12 Jun 2025 05:39:44 +0800 Subject: [PATCH 053/110] remove Executor.SetMain and SetBattle (#213) * remove Executor.SetMain and SetBattle can use Duel.MainPhase directly * init default MainPhase for duel to fix calling to this before the first Main Phase --- Game/AI/Decks/HorusExecutor.cs | 2 +- Game/AI/Decks/OldSchoolExecutor.cs | 4 ++-- Game/AI/Executor.cs | 13 ------------- Game/Duel.cs | 2 ++ Game/GameAI.cs | 2 -- 5 files changed, 5 insertions(+), 18 deletions(-) diff --git a/Game/AI/Decks/HorusExecutor.cs b/Game/AI/Decks/HorusExecutor.cs index f1525f0ba..bee5d0ea5 100644 --- a/Game/AI/Decks/HorusExecutor.cs +++ b/Game/AI/Decks/HorusExecutor.cs @@ -153,7 +153,7 @@ private bool WhiteNightDragon() { // We should summon Horus the Black Flame Dragon LV6 if he can lvlup. if (Enemy.GetMonsterCount() != 0 && !Util.IsAllEnemyBetterThanValue(2300 - 1, false)) - foreach (ClientCard card in Main.SummonableCards) + foreach (ClientCard card in Duel.MainPhase.SummonableCards) if (card.IsCode(11224103)) return false; diff --git a/Game/AI/Decks/OldSchoolExecutor.cs b/Game/AI/Decks/OldSchoolExecutor.cs index 87aac00a9..32868671c 100644 --- a/Game/AI/Decks/OldSchoolExecutor.cs +++ b/Game/AI/Decks/OldSchoolExecutor.cs @@ -69,10 +69,10 @@ private bool DoubleSummon() if (_lastDoubleSummon == Duel.Turn) return false; - if (Main.SummonableCards.Count == 0) + if (Duel.MainPhase.SummonableCards.Count == 0) return false; - if (Main.SummonableCards.Count == 1 && Main.SummonableCards[0].Level < 5) + if (Duel.MainPhase.SummonableCards.Count == 1 && Duel.MainPhase.SummonableCards[0].Level < 5) { bool canTribute = false; foreach (ClientCard handCard in Bot.Hand) diff --git a/Game/AI/Executor.cs b/Game/AI/Executor.cs index 548f1a49a..c9604a866 100644 --- a/Game/AI/Executor.cs +++ b/Game/AI/Executor.cs @@ -16,9 +16,6 @@ public abstract class Executor public GameAI AI { get; private set; } public AIUtil Util { get; private set; } - protected MainPhase Main { get; private set; } - protected BattlePhase Battle { get; private set; } - protected ExecutorType Type { get; private set; } protected ClientCard Card { get; private set; } protected int ActivateDescription { get; private set; } @@ -247,16 +244,6 @@ public virtual void OnSpSummoned() return; } - public void SetMain(MainPhase main) - { - Main = main; - } - - public void SetBattle(BattlePhase battle) - { - Battle = battle; - } - /// /// Set global variables Type, Card, ActivateDescription for Executor /// diff --git a/Game/Duel.cs b/Game/Duel.cs index ec1830569..336db4c9c 100644 --- a/Game/Duel.cs +++ b/Game/Duel.cs @@ -47,6 +47,8 @@ public Duel() LastSummonedCards = new List(); SolvingChainIndex = 0; NegatedChainIndexList = new List(); + MainPhase = new MainPhase(); + BattlePhase = new BattlePhase(); } public ClientCard GetCard(int player, CardLocation loc, int seq) diff --git a/Game/GameAI.cs b/Game/GameAI.cs index 1848dd17c..bf7569e73 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -202,7 +202,6 @@ public void OnReceivingAnnouce(int player, int data) /// A new BattlePhaseAction containing the action to do. public BattlePhaseAction OnSelectBattleCmd(BattlePhase battle) { - Executor.SetBattle(battle); foreach (CardExecutor exec in Executor.Executors) { if (exec.Type == ExecutorType.GoToMainPhase2 && battle.CanMainPhaseTwo && exec.Func()) // check if should enter main phase 2 directly @@ -449,7 +448,6 @@ public bool OnSelectEffectYn(ClientCard card, int desc) /// A new MainPhaseAction containing the action to do. public MainPhaseAction OnSelectIdleCmd(MainPhase main) { - Executor.SetMain(main); CheckSurrender(); foreach (CardExecutor exec in Executor.Executors) { From 8e4d611a0d3efe33da0d2c7755ac9a6f0cb8ad32 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 21 Jun 2025 14:22:39 +0800 Subject: [PATCH 054/110] fix CtosMessage.JoinGame length --- Game/GameClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game/GameClient.cs b/Game/GameClient.cs index 616cac04b..e0ec56389 100644 --- a/Game/GameClient.cs +++ b/Game/GameClient.cs @@ -73,7 +73,7 @@ private void OnConnected() packet = GamePacketFactory.Create(CtosMessage.JoinGame); packet.Write(_proVersion); packet.Write(junk); - packet.WriteUnicode(_roomInfo, 30); + packet.WriteUnicode(_roomInfo, 20); Connection.Send(packet); } From 674785f15e02d682a669f4228b534db95e7b184d Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 21 Jun 2025 14:27:06 +0800 Subject: [PATCH 055/110] add WriteUnicodeAutoLength, update WriteUnicode --- Game/GameClient.cs | 3 +-- YGOSharp.Network/Utils/BinaryExtensions.cs | 29 ++++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Game/GameClient.cs b/Game/GameClient.cs index e0ec56389..e9f80b6a5 100644 --- a/Game/GameClient.cs +++ b/Game/GameClient.cs @@ -84,9 +84,8 @@ public void Tick() public void Chat(string message) { - byte[] content = Encoding.Unicode.GetBytes(message + "\0"); BinaryWriter chat = GamePacketFactory.Create(CtosMessage.Chat); - chat.Write(content); + chat.WriteUnicodeAutoLength(message, 255); Connection.Send(chat); } diff --git a/YGOSharp.Network/Utils/BinaryExtensions.cs b/YGOSharp.Network/Utils/BinaryExtensions.cs index 85af6c551..3a9b51773 100644 --- a/YGOSharp.Network/Utils/BinaryExtensions.cs +++ b/YGOSharp.Network/Utils/BinaryExtensions.cs @@ -6,15 +6,40 @@ namespace YGOSharp.Network.Utils { public static class BinaryExtensions { + // fixed length strings public static void WriteUnicode(this BinaryWriter writer, string text, int len) { byte[] unicode = Encoding.Unicode.GetBytes(text); byte[] result = new byte[len * 2]; - int max = len * 2 - 2; - Array.Copy(unicode, result, unicode.Length > max ? max : unicode.Length); + int copy = unicode.Length; + if (unicode.Length > len * 2 - 2) + { + copy = len * 2 - 2; +#if DEBUG + throw new ArgumentException("String '" + text + "' is too long for fixed length " + len + "."); +#endif + } + Array.Copy(unicode, result, copy); writer.Write(result); } + // variable length strings + public static void WriteUnicodeAutoLength(this BinaryWriter writer, string text, int maxlen) + { + byte[] result = Encoding.Unicode.GetBytes(text + "\0"); + int len = result.Length / 2; + if (len > maxlen) + { + len = maxlen; + result[len * 2 - 2] = 0; + result[len * 2 - 1] = 0; +#if DEBUG + throw new ArgumentException("String '" + text + "' is too long for max length " + maxlen + "."); +#endif + } + writer.Write(result, 0, len * 2); + } + public static string ReadUnicode(this BinaryReader reader, int len) { byte[] unicode = reader.ReadBytes(len * 2); From b08d0a2d2edcc26c5697a94bb0486ca465c64555 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 21 Jun 2025 14:27:39 +0800 Subject: [PATCH 056/110] add more debug logs --- Game/GameBehavior.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index a0d6fa568..097b94fe1 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -298,6 +298,8 @@ private void OnChat(BinaryReader packet) string otherName = (player == 0) ? _room.Names[1] : _room.Names[0]; if (player < 4) Logger.DebugWriteLine(otherName + " say to " + myName + ": " + message); + else + Logger.DebugWriteLine("System message(" + player + "): " + message); } private void OnErrorMsg(BinaryReader packet) @@ -308,6 +310,7 @@ private void OnErrorMsg(BinaryReader packet) packet.ReadByte(); packet.ReadByte(); int pcode = packet.ReadInt32(); + Logger.DebugWriteLine("Error message received: " + msg + ", code: " + pcode); if (msg == 2) //ERRMSG_DECKERROR { int code = pcode & 0xFFFFFFF; From 57e404ae262e80a23f7aefa35ef5da43e8552d31 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Wed, 25 Jun 2025 15:29:26 +0800 Subject: [PATCH 057/110] add another gen --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 521e26f0e..7f6960827 100644 --- a/README.md +++ b/README.md @@ -136,10 +136,13 @@ WindBot can run as a "server", provide a http interface to create bot. * Nekroz -### AI Template Generator +### Template Generator -A Java program which generate executor code from deck, made by Levyaton. -https://github.com/Levyaton/WindbotTemplateGenerator +A tool which generates a WindBot deck code template from a YGOPro deck file. + +You can use it to create a new deck for WindBot quickly. + +https://mercury233.me/windbot/gen.html ### Server mode From 644d1b8eb0c2b6cda3be3cad4fc465a3e468c66d Mon Sep 17 00:00:00 2001 From: mercury233 Date: Fri, 20 Jun 2025 17:22:08 +0800 Subject: [PATCH 058/110] update OnSelectChain --- Game/GameAI.cs | 15 ++++++++++++--- Game/GameBehavior.cs | 10 +++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Game/GameAI.cs b/Game/GameAI.cs index bf7569e73..df9682aa2 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -360,7 +360,7 @@ public IList OnSelectCard(IList cards, int min, int max, /// You can't return -1 if this param is true. /// Current hint timing /// Index of the activated card or -1. - public int OnSelectChain(IList cards, IList descs, bool forced, int timing = -1) + public int OnSelectChain(IList cards, IList descs, IList forces, int timing = -1) { Executor.OnSelectChain(cards); foreach (CardExecutor exec in Executor.Executors) @@ -375,8 +375,17 @@ public int OnSelectChain(IList cards, IList descs, bool forced, } } } - // If we're forced to chain, we chain the first card. However don't do anything. - return forced ? 0 : -1; + for (int i = 0; i < forces.Count; ++i) + { + if (forces[i]) + { + // If the card is forced, we have to activate it. + _dialogs.SendChaining(cards[i].Name); + return i; + } + } + // Don't do anything. + return -1; } /// diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 097b94fe1..a571b23fc 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1172,16 +1172,19 @@ private void OnSelectChain(BinaryReader packet) packet.ReadByte(); // player int count = packet.ReadByte(); packet.ReadByte(); // specount - bool forced = packet.ReadByte() != 0; int hint1 = packet.ReadInt32(); // hint1 int hint2 = packet.ReadInt32(); // hint2 + // TODO: use ChainInfo? IList cards = new List(); IList descs = new List(); + IList forces = new List(); for (int i = 0; i < count; ++i) { packet.ReadByte(); // flag + bool forced = packet.ReadByte() != 0; + int id = packet.ReadInt32(); int con = GetLocalPlayer(packet.ReadByte()); int loc = packet.ReadByte(); @@ -1200,6 +1203,7 @@ private void OnSelectChain(BinaryReader packet) cards.Add(card); descs.Add(desc); + forces.Add(forced); } if (cards.Count == 0) @@ -1208,13 +1212,13 @@ private void OnSelectChain(BinaryReader packet) return; } - if (cards.Count == 1 && forced) + if (cards.Count == 1 && forces[0]) { Connection.Send(CtosMessage.Response, 0); return; } - Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forced, hint1 | hint2)); + Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forces, hint1 | hint2)); } private void OnSelectCounter(BinaryReader packet) From 5db00fa72cd8d42d4f25e045497fab400265a4e7 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Fri, 20 Jun 2025 17:22:20 +0800 Subject: [PATCH 059/110] update OnSelectSum --- Game/GameBehavior.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index a571b23fc..cd16f4b7a 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1602,6 +1602,11 @@ private void OnSelectSum(BinaryReader packet) int OpParam = packet.ReadInt32(); int OpParam1 = OpParam & 0xffff; int OpParam2 = OpParam >> 16; + if ((OpParam & 0x80000000) > 0) + { + OpParam1 = OpParam & 0x7fffffff; + OpParam2 = 0; + } if (OpParam2 > 0 && OpParam1 > OpParam2) { card.OpParam1 = OpParam2; From 7fd557a343d8bac6c9eb8d434a3221ac683b5c6e Mon Sep 17 00:00:00 2001 From: mercury233 Date: Fri, 20 Jun 2025 17:22:33 +0800 Subject: [PATCH 060/110] update OnConfirmCards --- Game/GameBehavior.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index cd16f4b7a..08e3d0746 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -2001,6 +2001,7 @@ private void OnSpSummoned(BinaryReader packet) private void OnConfirmCards(BinaryReader packet) { /*int playerid = */packet.ReadByte(); + /*int skip_panel = */packet.ReadByte(); int count = packet.ReadByte(); for (int i = 0; i < count; ++ i) { From 5f7814d0b4772da2d01415c68760c6b403b3fe29 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Fri, 20 Jun 2025 17:22:38 +0800 Subject: [PATCH 061/110] version --- WindBotInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WindBotInfo.cs b/WindBotInfo.cs index 1599b9380..6ed7167cb 100644 --- a/WindBotInfo.cs +++ b/WindBotInfo.cs @@ -24,7 +24,7 @@ public WindBotInfo() Host = "127.0.0.1"; Port = 7911; HostInfo = ""; - Version = 0x1361; + Version = 0x1362; Hand = 0; Debug = false; Chat = true; From 7d0a5a85a848b0b3fce45416d2e2174d89ffb9e6 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Sat, 21 Jun 2025 14:28:42 +0800 Subject: [PATCH 062/110] add CtosMessage.ExternalAddress --- Game/GameClient.cs | 11 ++++++++--- YGOSharp.Network/Enums/CtosMessage.cs | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Game/GameClient.cs b/Game/GameClient.cs index e9f80b6a5..8418ac0f8 100644 --- a/Game/GameClient.cs +++ b/Game/GameClient.cs @@ -1,7 +1,7 @@ -using System.IO; +using System; +using System.IO; using System.Linq; using System.Net; -using System.Text; using YGOSharp.Network; using YGOSharp.Network.Enums; using YGOSharp.Network.Utils; @@ -65,7 +65,12 @@ public void Start() private void OnConnected() { - BinaryWriter packet = GamePacketFactory.Create(CtosMessage.PlayerInfo); + BinaryWriter packet = GamePacketFactory.Create(CtosMessage.ExternalAddress); + packet.Write((UInt32)0); // real_ip, is always 0 in normal client + packet.WriteUnicodeAutoLength(_serverHost, 255); + Connection.Send(packet); + + packet = GamePacketFactory.Create(CtosMessage.PlayerInfo); packet.WriteUnicode(Username, 20); Connection.Send(packet); diff --git a/YGOSharp.Network/Enums/CtosMessage.cs b/YGOSharp.Network/Enums/CtosMessage.cs index d798dc7a8..8b41cef3f 100644 --- a/YGOSharp.Network/Enums/CtosMessage.cs +++ b/YGOSharp.Network/Enums/CtosMessage.cs @@ -13,6 +13,7 @@ public enum CtosMessage Surrender = 0x14, TimeConfirm = 0x15, Chat = 0x16, + ExternalAddress = 0x17, HsToDuelist = 0x20, HsToObserver = 0x21, HsReady = 0x22, From a95bd4c6c5cc1fcdde26a0dd2a210528cbea077a Mon Sep 17 00:00:00 2001 From: Reinen <127223416+DaruKani@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:21:21 +0700 Subject: [PATCH 063/110] Add Yubel Deck (#215) --- BotWrapper/bot.conf | 5 + Decks/AI_Yubel.ydk | 58 + Game/AI/Decks/YubelExecutor.cs | 2360 ++++++++++++++++++++++++++++++++ WindBot.csproj | 1 + 4 files changed, 2424 insertions(+) create mode 100644 Decks/AI_Yubel.ydk create mode 100644 Game/AI/Decks/YubelExecutor.cs diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 814a3f27d..2192b9d0a 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -114,6 +114,11 @@ Name=尼亚 Deck=Labrynth Dialog=near.zh-CN 拉比林斯迷宫卡组。 AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +!尼亚-于贝尔 +Name=尼亚 Deck=Yubel Dialog=near.zh-CN +于贝尔卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + !复制梁龙-闪刀姬 Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN 旧式闪刀姬卡组。 diff --git a/Decks/AI_Yubel.ydk b/Decks/AI_Yubel.ydk new file mode 100644 index 000000000..fa7d36ee8 --- /dev/null +++ b/Decks/AI_Yubel.ydk @@ -0,0 +1,58 @@ +#created by MDPro3 +#main +4779091 +90829280 +90829280 +90829280 +78371393 +78371393 +78371393 +41165831 +60764609 +28803166 +14558127 +14558127 +14558127 +23434538 +23434538 +81034083 +81034083 +81034083 +97651498 +27439792 +24215921 +24215921 +62318994 +62318994 +62318994 +73628505 +65261141 +93729896 +93729896 +93729896 +80312545 +80312545 +80312545 +98567237 +24224830 +24224830 +65681983 +99989863 +80801743 +10045474 +#extra +82135803 +80453041 +93860227 +26096328 +56910167 +70636044 +79559912 +24269961 +67680512 +12067160 +29301450 +29479265 +71818935 +2463794 +60303245 \ No newline at end of file diff --git a/Game/AI/Decks/YubelExecutor.cs b/Game/AI/Decks/YubelExecutor.cs new file mode 100644 index 000000000..90517f7d8 --- /dev/null +++ b/Game/AI/Decks/YubelExecutor.cs @@ -0,0 +1,2360 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Claims; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using YGOSharp.Network.Enums; +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Yubel", "AI_Yubel")] + public class YubelExecutor : DefaultExecutor + { + public class CardId + { + // === Core Yubel === + public const int YUBEL = 78371393; + public const int YUBEL_TERROR_INCARNATE = 4779091; + public const int SPIRIT_OF_YUBEL = 90829280; + public const int PHANTOM_OF_YUBEL = 80453041; // (extra) + + // === Starters / Engine === + public const int SAMSARA_D_LOTUS = 62318994; + public const int GRUESOME_GRAVE_SQUIRMER = 24215921; + public const int FABLED_LURRIE = 97651498; + + // === Fiendsmith / Fiend package === + public const int SHARVARA = 41165831; + public const int FIENDSMITH_ENGRAVER = 60764609; + public const int LACRIMA_CT = 28803166; + public const int DARK_BECKONING_BEAST = 81034083; + public const int CHAOS_SUMMONING_BEAST = 27439792; + + // === Spells / Traps === + public const int NIGHTMARE_PAIN = 65261141; + public const int NIGHTMARE_THRONE = 93729896; + public const int SPIRIT_GATES = 80312545; + public const int FIENDSMITH_TRACT = 98567237; + public const int ABOMINABLE_CHAMBER = 80801743; + public const int FIENDSMITHS_PARADISE = 99989863; + public const int TERRAFORMING = 73628505; + + // === Extra Deck / อื่น ๆ === + public const int FIENDSMITHS_DESIRAE = 82135803; + //public const int FIENDSMITHS_LACRIMA = 46640168; + public const int VARUDASN_FINAL_BRINGER = 70636044; + public const int DDD_WAVE_HIGH_KING_CAESAR = 79559912; + public const int UNCHAINED_LORD_OF_YAMA = 24269961; + public const int UNCHAINED_SOUL_OF_RAGE = 67680512; + public const int SP_LITTLE_KNIGHT = 29301450; + public const int MOON_OF_THE_CLOSED_HEAVEN = 71818935; + //public const int FIENDSMITHS_SEQUENCE = 49867899; + //public const int MUCKRAKER_UNDERWORLD = 71607202; + public const int FIENDSMITHS_REQUIEM = 2463794; + public const int SALAMANGREAT_ALMIRAJ = 60303245; + public const int NECROQUIP = 93860227; + //public const int ARIALEATER = 28143384; + public const int GORGONOFZIL = 12067160; + public const int GUSTAVMAX = 56910167; + public const int JUGGERNAUT = 26096328; + public const int UNCHAINDEDABOMINATION = 29479265; + + // === Handtraps / Others (blacklist/targets etc.) === + public const int Fuwalos = 42141493; + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int AccesscodeTalker = 86066372; + public const int GhostMournerMoonlitChill = 52038441; + public const int NibiruThePrimalBeing = 27204311; + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeHorus = 0x19d; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.SPIRIT_OF_YUBEL, CardId.SAMSARA_D_LOTUS,CardId.NIGHTMARE_THRONE, CardId.SPIRIT_GATES, + _CardId.AshBlossom, CardId.DARK_BECKONING_BEAST,_CardId.InfiniteImpermanence } }, + {2, new List { _CardId.MaxxC, _CardId.CalledByTheGrave,CardId.GRUESOME_GRAVE_SQUIRMER}}, + {1, new List { CardId.FIENDSMITH_ENGRAVER, CardId.FIENDSMITHS_PARADISE, + CardId.YUBEL, CardId.YUBEL_TERROR_INCARNATE, CardId.ABOMINABLE_CHAMBER, + _CardId.CrossoutDesignator, CardId.GRUESOME_GRAVE_SQUIRMER, CardId.FABLED_LURRIE, + CardId.NIGHTMARE_PAIN, CardId.TERRAFORMING, CardId.FIENDSMITH_TRACT,CardId.SHARVARA, + CardId.CHAOS_SUMMONING_BEAST, CardId.LACRIMA_CT + } } + }; + + List notToNegateIdList = new List { 58699500, 20343502, 19403423 }; + List notToDestroySpellTrap = new List { 50005218, 6767771 }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + + private static readonly int[] LinkFodderPriority = new[] + { + CardId.SHARVARA, + CardId.YUBEL_TERROR_INCARNATE, + CardId.UNCHAINED_SOUL_OF_RAGE, + CardId.UNCHAINED_LORD_OF_YAMA, + CardId.GRUESOME_GRAVE_SQUIRMER, + CardId.FABLED_LURRIE, + CardId.LACRIMA_CT, + CardId.SALAMANGREAT_ALMIRAJ, + CardId.DARK_BECKONING_BEAST, + CardId.CHAOS_SUMMONING_BEAST, + CardId.SAMSARA_D_LOTUS, + CardId.SPIRIT_OF_YUBEL, + CardId.YUBEL, + CardId.FIENDSMITH_ENGRAVER, + }; + + private static readonly HashSet YUBEL_SET = new HashSet { CardId.YUBEL, CardId.YUBEL_TERROR_INCARNATE, CardId.SPIRIT_OF_YUBEL, CardId.PHANTOM_OF_YUBEL }; + + public YubelExecutor(GameAI ai, Duel duel) : base(ai, duel) + { + + AddExecutor(ExecutorType.Activate, CardId.NIGHTMARE_THRONE, ActNightmareThroneSearch); + // ===== Generic counters ===== + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + + // ===== Yubel-related ===== + AddExecutor(ExecutorType.Activate, CardId.SAMSARA_D_LOTUS, ActSamsaraDLotusGY); + AddExecutor(ExecutorType.Activate, CardId.YUBEL); + AddExecutor(ExecutorType.Activate, CardId.UNCHAINDEDABOMINATION, UnchainedAbominationActivate); + AddExecutor(ExecutorType.Activate, CardId.PHANTOM_OF_YUBEL, DontSelfNG); + + + // ===== Engine pieces ===== + AddExecutor(ExecutorType.Activate, CardId.ABOMINABLE_CHAMBER, ActAbo); + //AddExecutor(ExecutorType.Activate, CardId.SP_LITTLE_KNIGHT, ActLittleKnightSM); + AddExecutor(ExecutorType.Activate, CardId.SP_LITTLE_KNIGHT, ActLittleKnight); + AddExecutor(ExecutorType.Activate, CardId.DDD_WAVE_HIGH_KING_CAESAR, DontSelfNG); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITHS_DESIRAE, ActDesirae); + AddExecutor(ExecutorType.Activate, CardId.VARUDASN_FINAL_BRINGER, ActVarudras); + AddExecutor(ExecutorType.Activate, CardId.UNCHAINED_SOUL_OF_RAGE, ActRageQuickLink); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITHS_PARADISE, ActParadise); + + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITH_ENGRAVER, ActEngraverHand); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITH_TRACT, ActTract); + AddExecutor(ExecutorType.SpSummon, CardId.FABLED_LURRIE); + AddExecutor(ExecutorType.SpSummon, CardId.FIENDSMITHS_REQUIEM, SSRequiem); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITHS_REQUIEM, ActRequiemMZ); + AddExecutor(ExecutorType.Activate, CardId.LACRIMA_CT, ActLacimaCT); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITHS_REQUIEM, ActRequiemEQ); + AddExecutor(ExecutorType.SpSummon, CardId.NECROQUIP, SSNecroquip); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITH_ENGRAVER, ActEngraverGY); + AddExecutor(ExecutorType.SpSummon, CardId.DDD_WAVE_HIGH_KING_CAESAR); + + AddExecutor(ExecutorType.Activate, CardId.LACRIMA_CT, ActLacimaCTGY); + + // Field & search line + AddExecutor(ExecutorType.Activate, S1_ActivateTerraformingForThrone); + AddExecutor(ExecutorType.Activate, CardId.NIGHTMARE_THRONE, S6_ChainThroneFollowUp); + + // Normal Summon engine + AddExecutor(ExecutorType.Summon, CardId.DARK_BECKONING_BEAST, NSDarkBeckoningBeast); + AddExecutor(ExecutorType.Activate, CardId.DARK_BECKONING_BEAST, ActDarkBeckoningBeast); + + // === SPIRIT GATES === + AddExecutor(ExecutorType.Activate, CardId.SPIRIT_GATES, S4_ActivateSpiritGates); // ใช้จากมือเพื่อค้น + AddExecutor(ExecutorType.Activate, CardId.SPIRIT_GATES, Gate_RecycleContinuous); // e3: เก็บ Continuous (มีเลเวล 10) + + + AddExecutor(ExecutorType.Summon, CardId.SAMSARA_D_LOTUS, NSSamsaraDLotus); + AddExecutor(ExecutorType.Activate, CardId.SAMSARA_D_LOTUS, ActSamsaraDLotus); + + // Follow-ups + AddExecutor(ExecutorType.SpSummon, CardId.SPIRIT_OF_YUBEL); + AddExecutor(ExecutorType.Activate, CardId.SPIRIT_OF_YUBEL); + AddExecutor(ExecutorType.Activate, CardId.NIGHTMARE_PAIN, ActNightmarePainHand); + AddExecutor(ExecutorType.Activate, CardId.NIGHTMARE_PAIN, ActNightmarePainEffect); + AddExecutor(ExecutorType.Activate, CardId.GRUESOME_GRAVE_SQUIRMER, SSGGS); + AddExecutor(ExecutorType.Activate, CardId.GRUESOME_GRAVE_SQUIRMER, ActGGSGY); + + AddExecutor(ExecutorType.SpSummon, CardId.MOON_OF_THE_CLOSED_HEAVEN, SSMoon); + AddExecutor(ExecutorType.SpSummon, CardId.UNCHAINED_LORD_OF_YAMA, L2YamaSetup); + AddExecutor(ExecutorType.Activate, CardId.UNCHAINED_LORD_OF_YAMA, ActYamaMZ); + AddExecutor(ExecutorType.Activate, CardId.UNCHAINED_LORD_OF_YAMA, ActYamaGY); + AddExecutor(ExecutorType.SpSummon, CardId.UNCHAINED_SOUL_OF_RAGE, L2RageKeepYama); + AddExecutor(ExecutorType.SpSummon, CardId.UNCHAINDEDABOMINATION, L4ABOSS); + AddExecutor(ExecutorType.Activate, CardId.SHARVARA, ActSharvara); + AddExecutor(ExecutorType.Activate, CardId.SHARVARA, ActSharvaraGY); + //AddExecutor(ExecutorType.SpSummon, CardId.MUCKRAKER_UNDERWORLD, L2NoBrain); + + + + // Panic line + //AddExecutor(ExecutorType.SpSummon, CardId.VARUDASN_FINAL_BRINGER, SSVarudras); + AddExecutor(ExecutorType.SpSummon, CardId.VARUDASN_FINAL_BRINGER); + AddExecutor(ExecutorType.SpSummon, CardId.SALAMANGREAT_ALMIRAJ, AlmirajSummon); + AddExecutor(ExecutorType.Activate, CardId.SPIRIT_GATES, Gate_Revive00Fiend); // e2: ทิ้งมือ ชุบ Fiend 0/0 + AddExecutor(ExecutorType.SpSummon, CardId.PHANTOM_OF_YUBEL, SSPhantom); + AddExecutor(ExecutorType.SpSummon, CardId.GUSTAVMAX); + AddExecutor(ExecutorType.Activate, CardId.GUSTAVMAX); + AddExecutor(ExecutorType.SpSummon, CardId.JUGGERNAUT); + AddExecutor(ExecutorType.Activate, CardId.JUGGERNAUT); + //AddExecutor(ExecutorType.Activate, CardId.MUCKRAKER_UNDERWORLD, NeverUseMuckrakerRevive); + + // other + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + AddExecutor(ExecutorType.Repos, MonsterRepos); + } + //======================Default code + #region Default Code Start Here + private int _totalAttack; + private int _totalBotAttack; + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + int dimensionShifterCount = 0; + bool enemyActivateInfiniteImpermanenceFromHand = false; + List infiniteImpermanenceList = new List(); + List currentNegateCardList = new List(); + List currentDestroyCardList = new List(); + List sendToGYThisTurn = new List(); + List activatedCardIdList = new List(); + List enemyPlaceThisTurn = new List(); + List escapeTargetList = new List(); + List summonThisTurn = new List(); + + private enum ThroneStage { None, Searching, AwaitDestroyPrompt } + private bool _yubelWantsTribute = false; + private ThroneStage _throneStage = ThroneStage.None; + // === Spirit Gates state === + int _gateReviveTargetId = 0; // จะชุบตัวไหน + int _gateDiscardPreferredId = 0; // จะทิ้งใบไหนเป็น cost + bool _gateWantsRecycle = false; // กำลังจะกดโหมดเก็บ Continuous + bool _spQuickMode = false; + bool moonSummoned = false; + bool requiemSummoned = false; + bool thronePending = false; // we're in a Throne activation flow + bool throneSearched = false; // after we chose the monster to search + int throneDesiredPick = 0; // preferred monster id to search + + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public override bool OnSelectHand() { return true; } + + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(n + 1); + ClientCard temp = result[index]; + result[index] = result[n]; + result[n] = temp; + } + return result; + } + + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) + { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + private bool MonsterRepos() + { + bool isYubelFam = + Card.Id == CardId.SPIRIT_OF_YUBEL || + Card.Id == CardId.YUBEL || + Card.Id == CardId.YUBEL_TERROR_INCARNATE || + Card.Id == CardId.PHANTOM_OF_YUBEL; + + if (isYubelFam) + { + if (Card.IsDefense()) + { + AI.SelectPosition(CardPosition.Attack); + return true; + } + return false; + } + if (Card.IsFacedown()) + return true; + if (CheckInDanger() && (_totalAttack > _totalBotAttack)) + return Card.IsDefense(); + return DefaultMonsterRepos(); + } + + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && Bot.GetMonsters().Any(card => card.IsFaceup())) + { + return true; + } + return false; + } + + public bool CheckInDanger() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int totalAtk = 0; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsAttack() && !m.Attacked) totalAtk += m.Attack; + } + if (totalAtk >= Bot.LifePoints) return true; + } + return false; + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone && cardId == CardId.UNCHAINED_SOUL_OF_RAGE) + { + int prefer = (GetMyLinkedMMZMask() & available) & 0x1F; + + int choose = (prefer != 0) ? LowestBit(prefer) + : LowestBit(available & 0x1F); // fallback + + AI.SelectPlace(choose); + return choose; + } + SelectSTPlace(Card, true); + return base.OnSelectPlace(cardId, player, location, available); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + if (positions == null || positions.Count == 0) + return base.OnSelectPosition(cardId, positions); + + bool isYubelFamily = + YUBEL_SET.Contains(cardId) || + (Card != null && YUBEL_SET.Contains(Card.Id)) || + (Card != null && (Card.Name?.Contains("Yubel") ?? false)); + + if(!isYubelFamily) + return base.OnSelectPosition(cardId, positions); + + CardPosition atkPref = + positions.Contains(CardPosition.FaceUpAttack) ? CardPosition.FaceUpAttack : + positions.Contains(CardPosition.Attack) ? CardPosition.Attack : + (CardPosition)0; + + if (isYubelFamily && atkPref != 0) + { + AI.SelectPosition(atkPref); + return atkPref; + } + + var chosen = positions[0]; + AI.SelectPosition(chosen); + return chosen; + } + + public bool AshBlossomActivate() + { + if (BlockIfThrone("AshBlossom")) return false;//added + if (InThroneFlow) return false;//added + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + if (CheckAtAdvantage()) + { + return false; + } + } + return DefaultAshBlossomAndJoyousSpring(); + } + + public bool MaxxCActivate() + { + if (BlockIfThrone("MaxxC")) return false; + if (InThroneFlow) return false;//added + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsMonsterShouldBeDisabledBeforeItUseEffect() && !m.IsDisabled() && Duel.LastChainPlayer != 0) + { + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(m); + return true; + } + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || (Util.IsChainTarget(Card)) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + List enemyMonsters = Enemy.GetMonsters(); + AI.SelectCard(target); + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + if ((LastChainCard == null || LastChainCard.Controller != 1 || LastChainCard.Location != CardLocation.MonsterZone + || LastChainCard.IsDisabled() || LastChainCard.IsShouldNotBeTarget() || LastChainCard.IsShouldNotBeSpellTrapTarget())) + return false; + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (LastChainCard != null) AI.SelectCard(LastChainCard); + else + { + List enemyMonsters = Enemy.GetMonsters(); + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach (ClientCard card in enemyMonsters) + { + if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + { + AI.SelectCard(card); + return true; + } + } + } + return true; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && c.IsCode(code))); + return true; + } + } + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentDestroyCardList.Add(graveTarget); + return true; + } + } + + foreach (ClientCard graveCard in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(graveCard) && graveCard.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = graveCard.Id; + AI.SelectCard(graveCard); + currentDestroyCardList.Add(graveCard); + return true; + } + } + + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentDestroyCardList.Add(enemyMonsters[0]); + return true; + } + } + } + + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count > 0) + { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentDestroyCardList.Add(targets[0]); + return true; + } + + return false; + } + + public bool SpellSetCheck() + { + if (Card.Id == CardId.FIENDSMITHS_PARADISE) return false; + + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + List onlyOneSetList = new List { CardId.ABOMINABLE_CHAMBER }; + if (onlyOneSetList.Contains(Card.Id) && Bot.HasInSpellZone(Card.Id)) + { + return false; + } + + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay)))//added + { + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + return true; + } + + return false; + } + + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom) || card.HasSetcode(SetcodeHorus))).ToList(); + List dangerMonsterIdList = new List { 99937011, 63542003, 9411399, 28954097, 30680659 }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= ((int)type & (int)CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (((int)type & (int)CardType.Spell) != 0) || (((int)type & (int)CardType.Trap) != 0); + bool isCounter = ((int)type & (int)CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck && CheckSpellWillBeNegate(isCounter)) + return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) return true; + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + if (target == null) target = Card; + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + return false; + } + + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (DefaultCheckWhetherCardIsNegated(lastcard)) return false; + if (Duel.Turn == 1 && lastcard.IsCode(_CardId.MaxxC)) return false; + + return true; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 && (card.IsShouldNotBeSpellTrapTarget() && !card.IsDisabled())) return false; + } + return true; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentDestroyCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType)) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !notToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget); + if (card != null) return card; + card = Enemy.MonsterZone.GetHighestAttackMonster(canBeTarget); + if (card != null) return card; + List monsters = Enemy.GetMonsters(); + if (monsters.Count > 0 && !onlyFaceup) return ShuffleCardList(monsters)[0]; + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && (ecard.HasType(CardType.Continuous) || ecard.HasType(CardType.Field) || ecard.HasType(CardType.Pendulum))).ToList(); + if (faceUpList.Count > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) return card; + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) return card; + + if (checkGrave && Enemy.Graveyard.Count > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + #endregion + + public override void OnChainSolved(int chainIndex) + { + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + var solving = Duel.GetCurrentSolvingChainCard(); + bool neg = Duel.IsCurrentSolvingChainNegated(); + Logger.DebugWriteLine($"[CHAIN] Solved idx={chainIndex} negated={neg} solving={CardStr(solving)}"); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; + if (currentCard.IsCode(CardId.Fuwalos)) enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) enemyActivateLockBird = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + } + public override void OnChainEnd() + { + escapeTargetList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || (checkTarget.Location != CardLocation.SpellZone && checkTarget.Location != CardLocation.MonsterZone)) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + if (thronePending && _throneStage == ThroneStage.None) + { thronePending = false; } + ResetThroneFlow(); + Logger.DebugWriteLine("[CHAIN] OnChainEnd"); + base.OnChainEnd(); + } + private void ResetThroneFlow() + { + Logger.DebugWriteLine($"[THRONE] Reset flow (was stage={_throneStage}, pending={thronePending})"); + thronePending = false; + throneSearched = false; + throneDesiredPick = 0; + _throneStage = ThroneStage.None; + } + public override void OnNewTurn() + { + if (Duel.Turn <= 1) { dimensionShifterCount = 0; } + + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + enemyActivateInfiniteImpermanenceFromHand = false; + if (dimensionShifterCount > 0) dimensionShifterCount--; + infiniteImpermanenceList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + sendToGYThisTurn.Clear(); + activatedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + summonThisTurn.Clear(); + + // reset Throne flow + thronePending = false; + throneSearched = false; + throneDesiredPick = 0; + _gateReviveTargetId = 0; + _gateDiscardPreferredId = 0; + _gateWantsRecycle = false; + _spQuickMode = false; + + base.OnNewTurn(); + } + + // ===== Material safety logic (inspired by windbot patterns) ===== + private static readonly HashSet NEVER_SAC = new HashSet + { + CardId.PHANTOM_OF_YUBEL, + CardId.DDD_WAVE_HIGH_KING_CAESAR, + CardId.VARUDASN_FINAL_BRINGER, + CardId.SP_LITTLE_KNIGHT, + CardId.GORGONOFZIL, + CardId.UNCHAINDEDABOMINATION + }; + private bool InThroneFlow => thronePending || _throneStage != ThroneStage.None; + private int PriorityIndex(int id) + { + int idx = Array.IndexOf(LinkFodderPriority, id); + return idx >= 0 ? idx : 999; + } + private bool IsProtectedMaterial(ClientCard c, bool allowUseYubelForLink = false) + { + if (c == null) return true; + + if (NEVER_SAC.Contains(c.Id)) return true; + + if (c.EquipCards != null && c.EquipCards.Count > 0) return true; + if (c.HasType(CardType.Link) && c.LinkCount >= 2) return true; + if (c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz)) return true; + + return false; + } + private ClientCard[] GetSafeMaterials(int need) + { + bool allowYubel = ShouldUseYubelForLink(); + + var list = Bot.GetMonsters() + .Where(m => !IsProtectedMaterial(m, allowYubel)) + .OrderBy(m => PriorityIndex(m.Id)) + .ThenBy(m => m.Attack) + .Take(need) + .ToArray(); + + return list; + } + private bool ShouldUseYubelForLink() + { + if (Duel.Player != 0) return false; // ทำเฉพาะเทิร์นเรา + var mons = Bot.GetMonsters().Where(m => m != null).ToList(); + if (mons.Count == 0) return false; + + bool twoOrLess = mons.Count <= 2; + + // มีลิงก์ที่อัปเกรดบอร์ดได้ + bool canMakeBetter; + + if (HasInExtra(CardId.FIENDSMITHS_REQUIEM)) + { + canMakeBetter = + HasInExtra(CardId.MOON_OF_THE_CLOSED_HEAVEN) || + HasInExtra(CardId.UNCHAINED_SOUL_OF_RAGE) || + HasInExtra(CardId.UNCHAINED_LORD_OF_YAMA) || + + //HasInExtra(CardId.MUCKRAKER_UNDERWORLD) || + //HasInExtra(CardId.FIENDSMITHS_SEQUENCE) || + HasInExtra(CardId.SP_LITTLE_KNIGHT); + //HasInExtra(CardId.GORGONOFZIL) ; + } + else + { + canMakeBetter = + HasInExtra(CardId.UNCHAINED_SOUL_OF_RAGE) || + HasInExtra(CardId.UNCHAINED_LORD_OF_YAMA) || + //HasInExtra(CardId.MUCKRAKER_UNDERWORLD) || + //HasInExtra(CardId.FIENDSMITHS_SEQUENCE) || + HasInExtra(CardId.SP_LITTLE_KNIGHT); + //HasInExtra(CardId.GORGONOFZIL); + } + + // ถ้าบนสนามเหลือแต่ชิ้น Yubel 1-2 ใบ และสามารถอัปเกรดเป็นลิงก์ที่ให้ interrupt/มูฟได้ ⇒ ใช้ไปลิงก์เถอะ + return twoOrLess && canMakeBetter; + } + private static readonly int[] YubelCostPriority = new[] + { + CardId.SAMSARA_D_LOTUS, + CardId.FABLED_LURRIE, + CardId.DARK_BECKONING_BEAST, + CardId.CHAOS_SUMMONING_BEAST, + CardId.GRUESOME_GRAVE_SQUIRMER, + CardId.SALAMANGREAT_ALMIRAJ, + //CardId.FIENDSMITHS_SEQUENCE + }; + private bool HasInExtra(int id) + { + return Bot.ExtraDeck.Any(c => c != null && c.Id == id); + } + // --- State for Nightmare Throne prompt flow --- + + + #region Work Space #1 + private bool DontSelfNG() { return Duel.LastChainPlayer != 0; } + private int LowestBit(int mask) => mask & -mask; + + // เอา mask ของช่องมอนสเตอร์ที่ลิงก์เราชี้ (เฉพาะ Main Monster Zone 0..4) + private int GetMyLinkedMMZMask() + { + int mask = 0; + foreach (var m in Bot.GetMonsters()) + { + if (m == null || !m.IsFaceup() || !m.HasType(CardType.Link)) continue; + mask |= m.GetLinkedZones(); + } + // เอาเฉพาะ 5 โซนหลัก (บิต 0..4) + mask &= 0x1F; + return mask; + } + private bool S1_ActivateTerraformingForThrone() + { + if (Type != ExecutorType.Activate) return false; + if (Card.Id != CardId.TERRAFORMING) return false; + if (Bot.HasInHandOrInSpellZone(CardId.NIGHTMARE_THRONE)) { return false; } + AI.SelectCard(CardId.NIGHTMARE_THRONE); + return true; + } + + private bool ActNightmareThroneSearch() + { + if (Type != ExecutorType.Activate) return false; + if (Card.Location == CardLocation.Hand && Bot.HasInSpellZone(CardId.NIGHTMARE_THRONE)) return false; + + int pick = 0; + if (!Bot.HasInHand(CardId.SAMSARA_D_LOTUS) && CheckRemainInDeck(CardId.SAMSARA_D_LOTUS) > 0) + pick = CardId.SAMSARA_D_LOTUS; + else if (Bot.HasInHand(CardId.SAMSARA_D_LOTUS) && !Bot.HasInHand(CardId.DARK_BECKONING_BEAST) && CheckRemainInDeck(CardId.DARK_BECKONING_BEAST) > 0) + pick = CardId.DARK_BECKONING_BEAST; + else if (Bot.HasInHand(CardId.SAMSARA_D_LOTUS) && Bot.HasInHand(CardId.DARK_BECKONING_BEAST) && !Bot.HasInHand(CardId.CHAOS_SUMMONING_BEAST) && CheckRemainInDeck(CardId.CHAOS_SUMMONING_BEAST) > 0) + pick = CardId.CHAOS_SUMMONING_BEAST; + + thronePending = true; + throneSearched = false; + throneDesiredPick = pick; + + Logger.DebugWriteLine($"[THRONE] Activate search; desiredPick={(pick == 0 ? "(auto)" : pick.ToString())}"); + DumpChain("ThroneActivate"); + + return true; + } + + private bool NSDarkBeckoningBeast() + { + if (Duel.Phase != DuelPhase.Main1) return false; + if (Bot.HasInMonstersZone(CardId.DARK_BECKONING_BEAST)) + { + if (Bot.HasInHand(CardId.SAMSARA_D_LOTUS)) + { + return false; + } + } + return true; + } + + private bool ActDarkBeckoningBeast() + { + if (Duel.Phase != DuelPhase.Main1) return false; + if ((CheckRemainInDeck(CardId.SPIRIT_GATES) > 0) && !Bot.HasInSpellZone(CardId.SPIRIT_GATES)) + { AI.SelectCard(CardId.SPIRIT_GATES); return true; } + else if (CheckRemainInDeck(CardId.CHAOS_SUMMONING_BEAST) > 0) + { AI.SelectCard(CardId.CHAOS_SUMMONING_BEAST); return true; } + else { return false; } + } + + private bool S4_ActivateSpiritGates() + { + // ใช้จาก "มือ" เพื่อค้น DBB/CSB + if (Type != ExecutorType.Activate) return false; + if (Card.Location != CardLocation.Hand) return false; + if (Bot.HasInSpellZone(CardId.SPIRIT_GATES, true, true)) return false; + + // กฎ: ถ้ามี DBB อยู่ "บนสนาม" ให้ค้น CSB + int pick = 0; + bool dbbOnField = Bot.HasInMonstersZone(CardId.DARK_BECKONING_BEAST, false, false, true); + + if (dbbOnField && CheckRemainInDeck(CardId.CHAOS_SUMMONING_BEAST) > 0) + pick = CardId.CHAOS_SUMMONING_BEAST; + else if (CheckRemainInDeck(CardId.DARK_BECKONING_BEAST) > 0) + pick = CardId.DARK_BECKONING_BEAST; + else if (CheckRemainInDeck(CardId.CHAOS_SUMMONING_BEAST) > 0) + pick = CardId.CHAOS_SUMMONING_BEAST; + + if (pick == 0) return false; + + AI.SelectCard(pick); + return true; + } + private bool Gate_RecycleContinuous() + { + // e3: มีเลเวล 10 -> เก็บ Continuous Spell จากสุสาน (เน้นเก็บ NIGHTMARE_PAIN) + if (Card.Location != CardLocation.SpellZone) return false; + if (!HaveFaceupLevel10()) return false; + + if (!Bot.HasInGraveyard(CardId.NIGHTMARE_PAIN)) + return false; + + _gateWantsRecycle = true; + // เลือก Pain ก่อน ถ้าไม่มีค่อยเลือก Paradise ตอน select card + return true; + } + private bool Is00FiendId(int id) + { + // รายชื่อ 0/0 Fiend ที่เราใช้ในเด็คนี้ + return id == CardId.YUBEL + || id == CardId.SPIRIT_OF_YUBEL + || id == CardId.DARK_BECKONING_BEAST + || id == CardId.CHAOS_SUMMONING_BEAST + || id == CardId.SAMSARA_D_LOTUS; + } + + // เลือกเป้าหมายที่จะชุบ ด้วยลำดับความสำคัญตาม 2.2.x + private int PlanSpiritGatesReviveTarget() + { + // Emergency Case + if (Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ)&&Bot.HasInGraveyard(CardId.DARK_BECKONING_BEAST)) + { return CardId.DARK_BECKONING_BEAST; } + + // 2.2.2: ถ้าขาด spirit → SS spirit (จากสุสาน หรือทิ้งจากมือ) + bool spiritOnBoard = Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL, true); + bool spiritInGY = Bot.HasInGraveyard(CardId.SPIRIT_OF_YUBEL); + bool spiritInHand = Bot.HasInHand(CardId.SPIRIT_OF_YUBEL); + if (!spiritOnBoard && (spiritInGY || spiritInHand)) + return CardId.SPIRIT_OF_YUBEL; + + // 2.2.3: ถ้า DBB โดนขัด/ตันเกมแล้วมี Almiraj → ชุบ DBB เพื่อไต่ไป Moon + if (Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ, true) + && Bot.HasInGraveyard(CardId.DARK_BECKONING_BEAST) + && HasInExtra(CardId.MOON_OF_THE_CLOSED_HEAVEN)) + return CardId.DARK_BECKONING_BEAST; + + // 2.2.1: ถ้าขาด lotus → SS lotus + if (!Bot.HasInMonstersZone(CardId.SAMSARA_D_LOTUS, true) && Bot.HasInGraveyard(CardId.SAMSARA_D_LOTUS)) + return CardId.SAMSARA_D_LOTUS; + + // ทางเลือกทั่วไป: DBB > CSB > Yubel + if (Bot.HasInGraveyard(CardId.DARK_BECKONING_BEAST)) return CardId.DARK_BECKONING_BEAST; + if (Bot.HasInGraveyard(CardId.CHAOS_SUMMONING_BEAST)) return CardId.CHAOS_SUMMONING_BEAST; + if (Bot.HasInGraveyard(CardId.YUBEL)) return CardId.YUBEL; + + // ถ้าไม่มีอะไรชุบได้เลย อาจวางแผน discard ให้ Spirit ลงสุสานแล้วค่อยชุบ + if (!spiritOnBoard && spiritInHand) return CardId.SPIRIT_OF_YUBEL; + + return 0; + } + + // เลือกใบจะทิ้ง: CSB > Paradise > Terror > (บางกรณี) Spirit + private int PickSpiritGatesDiscard(int reviveTargetId) + { + // เคสอยากชุบ Spirit แต่ยังอยู่ในมือ → ทิ้ง Spirit เป็น cost แล้วชุบมันเอง + if (reviveTargetId == CardId.SPIRIT_OF_YUBEL && Bot.HasInHand(CardId.SPIRIT_OF_YUBEL)) + return CardId.SPIRIT_OF_YUBEL; + + if (Bot.HasInHand(CardId.FIENDSMITHS_PARADISE)) return CardId.FIENDSMITHS_PARADISE; + if (Bot.HasInHand(CardId.CHAOS_SUMMONING_BEAST)) return CardId.CHAOS_SUMMONING_BEAST; + if (Bot.HasInHand(CardId.YUBEL_TERROR_INCARNATE)) return CardId.YUBEL_TERROR_INCARNATE; + + // fallback: เลือกใบที่ "ทิ้งแล้วเจ็บน้อยสุด" + var hand = Bot.Hand.ToList(); + hand.Sort((a, b) => ScoreOwnCardForCost(a).CompareTo(ScoreOwnCardForCost(b))); + return hand.Count > 0 ? hand[0].Id : 0; + } + + private bool Gate_Revive00Fiend() + { + // e2: ทิ้งมือ 1 → SS Fiend 0/0 จากสุสาน + if (Card.Location != CardLocation.SpellZone) return false; + + if (requiemSummoned) + { + if (!Bot.HasInHandOrInGraveyard(CardId.SPIRIT_OF_YUBEL)) return false; // ต้องมีในหลุม + if (Bot.Hand.Count <= 0) return false; // ต้องมีใบทิ้ง + _gateReviveTargetId = CardId.SPIRIT_OF_YUBEL; + _gateDiscardPreferredId = PickSpiritGatesDiscard(_gateReviveTargetId); + _gateWantsRecycle = false; + return true; + } + + // วางแผนก่อนว่าจะชุบตัวไหน + int target = PlanSpiritGatesReviveTarget(); + if (target == 0) return false; + + // ต้องมีการ์ดให้ทิ้งอย่างน้อย 1 ใบ + if (Bot.Hand.Count <= 0) return false; + + int discard = PickSpiritGatesDiscard(target); + if (discard == 0) return false; + + _gateReviveTargetId = target; + _gateDiscardPreferredId = discard; + _gateWantsRecycle = false; + + // ไม่เลือกอะไรตรงนี้ ปล่อยให้ OnSelectCard จิ้ม cost/เป้าหมายให้ + return true; + } + + private bool HaveFaceupLevel10() + { + return Bot.MonsterZone.Any(m => m != null && m.IsFaceup() && m.Level == 10); + } + private bool ActNightmarePainHand() + { + if (Bot.HasInSpellZone(CardId.NIGHTMARE_PAIN, true, true)) return false; + if (Card.Location == CardLocation.Hand) return true; + return false; + } + + private bool ActNightmarePainEffect() + { + if (Card.Location == CardLocation.SpellZone) + { + if(CheckRemainInDeck(CardId.GRUESOME_GRAVE_SQUIRMER)==0)return false; + + if (Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL) || Bot.HasInHand(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + AI.SelectNextCard(CardId.GRUESOME_GRAVE_SQUIRMER); + return true; + } + } + return false; + } + + private bool S6_ChainThroneFollowUp() + { + if (Type != ExecutorType.Activate) return false; + if (sendToGYThisTurn.Any(c => c != null && YUBEL_SET.Contains(c.Id)) && Bot.HasInHand(CardId.NIGHTMARE_THRONE)) + { + AI.SelectYesNo(true); + return true; + } + return false; + } + + private bool NSSamsaraDLotus() + { + if (Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) return false; + return true; + } + + private bool ActSamsaraDLotus() + { + if (Duel.Player == 0) + { + if (Card.Location == CardLocation.MonsterZone) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + } + if (Duel.Player == 1) + { + if (Bot.HasInMonstersZone(CardId.YUBEL) || Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) + { + return true; + } + } + return false; + } + private bool ActSamsaraDLotusGY() + { + if (Card.Location == CardLocation.Grave) + { + if (Bot.HasInMonstersZone(CardId.YUBEL)) + { + AI.SelectOption(1); + return true; + } + } + return false; + } + + private bool ActTract() + { + if (Card.Location != CardLocation.Hand) return false; + + // ถ้าเข้า Fiendsmith line แล้ว -> ไม่ใช้ Tract + if (requiemSummoned) return false; + AI.SelectCard(CardId.FABLED_LURRIE); + AI.SelectNextCard(CardId.FABLED_LURRIE); + return true; + /*if (Card.Location == CardLocation.Hand) + { + if (CheckRemainInDeck(CardId.FIENDSMITH_ENGRAVER) == 0 && + CheckRemainInDeck(CardId.LACRIMA_CT) == 0) + { + return false; + } + if(CheckRemainInDeck(CardId.FABLED_LURRIE) == 0){ return false; } + AI.SelectCard(CardId.FABLED_LURRIE); + AI.SelectNextCard(CardId.FABLED_LURRIE); + return true; + } + if (Card.LastLocation == CardLocation.Grave) { return false; } + return false;*/ + } + + private bool ActParadise() + { + if (Card.Location != CardLocation.Grave) return false; + if (Bot.HasInMonstersZoneOrInGraveyard(CardId.FIENDSMITHS_DESIRAE) || Bot.HasInBanished(CardId.FIENDSMITHS_DESIRAE)) return false; + AI.SelectCard(CardId.FIENDSMITHS_DESIRAE); + return DontSelfNG(); + } + + private bool ActDesirae() + { + if (Card.Location != CardLocation.Grave) {return false; } + ClientCard target = GetBestEnemyCard(onlyFaceup: true, canBeTarget: true, checkGrave: false); + if (target == null) return false; + if (Bot.HasInGraveyard(CardId.FIENDSMITHS_REQUIEM)) + { + AI.SelectCard(CardId.FIENDSMITHS_REQUIEM); + AI.SelectNextCard(target); + return true; + } + AI.SelectCard(target); + return true; + } + + private bool ActRequiemMZ() + { + if (Card.Location != CardLocation.MonsterZone) { return false; } + if (Bot.HasInHand(CardId.LACRIMA_CT) || CheckRemainInDeck(CardId.LACRIMA_CT) > 0) + { + AI.SelectCard(CardId.LACRIMA_CT); + AI.SelectPosition(CardPosition.FaceUpDefence); + return true; + } + else if (Bot.HasInHand(CardId.FIENDSMITH_ENGRAVER) || CheckRemainInDeck(CardId.FIENDSMITH_ENGRAVER) > 0) + { + AI.SelectCard(CardId.FIENDSMITH_ENGRAVER); + AI.SelectPosition(CardPosition.FaceUpDefence); + return true; + } + return false; + } + + private bool ActRequiemEQ() + { + if (!HasInExtra(CardId.NECROQUIP)) { return false; } + if (Card.Location != CardLocation.Grave) { return false; } + if (Bot.HasInMonstersZone(CardId.LACRIMA_CT)) + { + AI.SelectCard(CardId.LACRIMA_CT); + return true; + } + else if (Bot.HasInMonstersZone(CardId.FIENDSMITH_ENGRAVER)) + { + AI.SelectCard(CardId.FIENDSMITH_ENGRAVER); + return true; + } + return false; + } + + private bool SSNecroquip() + { + if (Bot.HasInSpellZone(CardId.FIENDSMITHS_REQUIEM) && Bot.HasInMonstersZone(CardId.LACRIMA_CT)) + { + AI.SelectCard(CardId.FIENDSMITHS_REQUIEM); + AI.SelectNextCard(CardId.LACRIMA_CT); + return true; + } + else if (Bot.HasInSpellZone(CardId.FIENDSMITHS_REQUIEM) && Bot.HasInMonstersZone(CardId.FIENDSMITH_ENGRAVER)) + { + AI.SelectCard(CardId.FIENDSMITHS_REQUIEM); + AI.SelectNextCard(CardId.FIENDSMITH_ENGRAVER); + return true; + } + return false; + } + + private bool ActLacimaCT() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.FIENDSMITH_ENGRAVER) && !Bot.HasInBanished(CardId.FIENDSMITH_ENGRAVER)) + { AI.SelectCard(CardId.FIENDSMITH_ENGRAVER); return true; } + else if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.FIENDSMITHS_PARADISE) && !Bot.HasInBanished(CardId.FIENDSMITHS_PARADISE)) + { AI.SelectCard(CardId.FIENDSMITHS_PARADISE); return true; } + return false; + } + return false; + } + + private bool ActLacimaCTGY() + { + if (Card.Location == CardLocation.Grave) + { + if (Bot.HasInBanished(CardId.FIENDSMITHS_PARADISE) || Bot.HasInHandOrInGraveyard(CardId.FIENDSMITHS_PARADISE)) + { return false; } + else { return DontSelfNG(); } + } + return false; + } + + /*private bool SSVarudras() + { + if (Bot.HasInMonstersZone(CardId.YUBEL) && Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.YUBEL); + AI.SelectNextCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + return true; + }*/ + + private bool ActEngraverHand() + { + if (Card.Location != CardLocation.Hand) return false; + if (!Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.FIENDSMITH_TRACT) && !Bot.HasInBanished(CardId.FIENDSMITH_TRACT)) + { + AI.SelectCard(CardId.FIENDSMITH_TRACT); + return true; + } + return false; + } + + private bool ActEngraverGY() + { + if (Card.Location != CardLocation.Grave) return false; + if (Bot.HasInGraveyard(CardId.FABLED_LURRIE)) { AI.SelectCard(CardId.FABLED_LURRIE); return true; } + else if (Bot.HasInGraveyard(CardId.MOON_OF_THE_CLOSED_HEAVEN)) { AI.SelectCard(CardId.MOON_OF_THE_CLOSED_HEAVEN); return true; } + return false; + } + + private bool SSMoon() + { + if (moonSummoned){ return false; } + if (requiemSummoned) { return false; } + if (!HasInExtra(CardId.FIENDSMITHS_REQUIEM)) + return false; + var mats = GetSafeMaterials(2); + if (mats.Length < 2) return false; + AI.SelectMaterials(mats); + moonSummoned = true; + return true; + } + + private bool ActAbo() + { + if (Bot.HasInGraveyard(CardId.UNCHAINED_SOUL_OF_RAGE)) + { + AI.SelectCard(CardId.UNCHAINED_SOUL_OF_RAGE); + return true; + } + return false; + } + + private bool AlmirajSummon() + { + if (Bot.GetMonsterCount() > 1) return false; + ClientCard mat = Bot.GetMonsters().First(); + if (mat.IsCode(new[] { CardId.DARK_BECKONING_BEAST })) + { + AI.SelectMaterials(mat); + return true; + } + return false; + } + + private bool SSGGS() + { + if (!DontSelfNG()) { return false; } + if (BlockIfThrone("GGS")) return false; + if (Duel.Player == 1) { return false; } + if (InThroneFlow) { return false; } + if (Card.Location != CardLocation.Hand) { return false; } + if (Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectYesNo(true); + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + AI.SelectYesNo(false); + return true; + } + + private bool ActGGSGY() + { + if (Card.Location != CardLocation.Grave) { return false; } + if (Bot.HasInGraveyard(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + else { return false; } + } + private bool ActLittleKnight() + { + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SP_LITTLE_KNIGHT, 0)) + { + // banish card + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetDangerousCardinEnemyGrave(false)); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + if (problemCardList.Count() > 0) + { + AI.SelectCard(problemCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + } + else if (ActivateDescription == Util.GetStringId(CardId.SP_LITTLE_KNIGHT, 1)) + { + ClientCard selfMonster = null; + foreach (ClientCard target in Bot.GetMonsters()) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target)) + { + selfMonster = target; + break; + } + } + if (selfMonster == null) + { + if (Duel.Player == 1) + { + selfMonster = Bot.GetMonsters().Where(card => card.IsAttack()).OrderBy(card => card.Attack).FirstOrDefault(); + if (!Util.IsOneEnemyBetterThanValue(selfMonster.Attack, true)) selfMonster = null; + } + } + if (selfMonster != null) + { + ClientCard nextMonster = null; + List selfTargetList = Bot.GetMonsters().Where(card => card != selfMonster).ToList(); + if (Enemy.GetMonsterCount() == 0 && selfTargetList.Count() > 0) + { + selfTargetList.Sort(CompareUsableAttack); + nextMonster = selfTargetList[0]; + escapeTargetList.Add(nextMonster); + } + if (Enemy.GetMonsterCount() > 0) + { + nextMonster = GetBestEnemyMonster(true, true); + currentDestroyCardList.Add(nextMonster); + } + if (nextMonster != null) + { + AI.SelectCard(selfMonster); + AI.SelectNextCard(nextMonster); + escapeTargetList.Add(selfMonster); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + return false; + } + public int CompareUsableAttack(ClientCard cardA, ClientCard cardB) + { + if (cardA == null && cardB == null) + return 0; + if (cardA == null) + return -1; + if (cardB == null) + return 1; + int powerA = (cardA.IsDefense() && summonThisTurn.Contains(cardA)) ? 0 : cardA.Attack; + int powerB = (cardB.IsDefense() && summonThisTurn.Contains(cardB)) ? 0 : cardB.Attack; + if (powerA < powerB) + return -1; + if (powerA == powerB) + return CardContainer.CompareCardLevel(cardA, cardB); + return 1; + } + private bool ActRageQuickLink() + { + if (Card.Location != CardLocation.MonsterZone) return false; + // Quick Link เฉพาะเทิร์นศัตรูช่วง Main เพื่อสร้าง 1 interrupt + if (Duel.Player != 1) return false; + if (Duel.Phase < DuelPhase.Main1 || Duel.Phase > DuelPhase.Main2) return false; + if (!HasValidRageLinkCandidate()) return false; + + var target = GetBestEnemyMonster(onlyFaceup: true, canBeTarget: true); + if (target == null) return false; + + // ส่วนใหญ่เอนจินจะถามเลือกการ์ดฝั่งตรงข้ามที่จะใช้เป็นวัสดุ/หรือไล่ + AI.SelectCard(target); + return DontSelfNG(); + } + private bool SSPhantom() + { + var gyMat2Codes = new List { CardId.YUBEL_TERROR_INCARNATE, CardId.YUBEL, CardId.DARK_BECKONING_BEAST, CardId.CHAOS_SUMMONING_BEAST, CardId.SPIRIT_OF_YUBEL }; + if (!Bot.HasInGraveyard(gyMat2Codes)) + { + return false; + } + // select mat 1 + if (Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.YUBEL_TERROR_INCARNATE)) + { + AI.SelectCard(CardId.YUBEL_TERROR_INCARNATE); + } + else if (Bot.HasInMonstersZoneOrInGraveyard(CardId.YUBEL)) + { + AI.SelectCard(CardId.YUBEL); + } + else if (Bot.HasInGraveyard(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + } + else + { + return false; + } + // วัตถุดิบใบที่ 2 จากสุสานตามที่จัดไว้ + AI.SelectNextCard(gyMat2Codes); + return true; + } + + private bool ActSharvara() + { + if (BlockIfThrone("Sharvara")) return false; + if (Duel.Player == 1) { return false; } + if (InThroneFlow) return false; + if (Card.Location != CardLocation.Hand) return false; + if (Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + else if (Bot.HasInMonstersZone(CardId.YUBEL)) + { + AI.SelectCard(CardId.YUBEL); + return true; + } + + return false; + } + private bool ActSharvaraGY() + { + if (Card.Location != CardLocation.Grave) return false; + return true; + } + + /*private bool L2NoBrain() + { + var mats = GetSafeMaterials(2); + if (mats.Length < 2) return false; + + AI.SelectMaterials(mats); + return true; + }*/ + private bool ActVarudras() + { + if (CheckWhetherNegated()) return false; + + // รายการเป้า (ศัตรูก่อน ถ้าไม่มีค่อย fallback) + List targetList = GetNormalEnemyTargetList(true, true); + int desc = ActivateDescription; + int d1 = Util.GetStringId(CardId.VARUDASN_FINAL_BRINGER, 1); // ใช้ทั้ง e1 (Negate) และ e2 (Battle Start destroy) + int d2 = Util.GetStringId(CardId.VARUDASN_FINAL_BRINGER, 2); // e3 (Destroyed -> destroy 1) + + Logger.DebugWriteLine("[Varudras] desc: " + desc + ", timing = " + CurrentTiming); + + + var enemyPick = targetList.FirstOrDefault(c => c != null && c.Controller == 1); + + // e1: Quick effect Negate (ฝั่งคู่ต่อสู้กดเอฟเฟกต์) + if (desc == d1 && Duel.LastChainPlayer == 1 && Duel.CurrentChain.Count > 0) + { + if (!CheckLastChainShouldNegated()) return false; + activatedCardIdList.Add(Card.Id); // แท็กว่าเป็น e1 + return true; // เอนจินจะจัดการ detach เป็น cost ให้เอง + } + + // e2: Battle Start ทำลาย 1 / e3: ถูกทำลายแล้วทำลาย 1 + if (desc == d1 || desc == d2 || desc == -1) + { + if (targetList.Count == 0) return false; + + // พยายามให้เลือกฝั่งศัตรูก่อน + if (enemyPick != null) + targetList.Insert(0, enemyPick); + else + { + // ถ้าไม่มีการ์ดฝั่งศัตรูให้เลือกเลย -> แทรกฝั่งเราที่ "เสียหายน้อยสุด" ไว้หัวลิสต์ + var selfBest = + Bot.GetMonsters().Concat(Bot.GetSpells()) + .Where(c => c != null) + .OrderBy(ScoreOwnCardForCost) + .FirstOrDefault(); + if (selfBest != null) targetList.Insert(0, selfBest); + } + + // log / tag effect ย่อย + if (desc == d1 && Duel.CurrentChain.Count == 0) activatedCardIdList.Add(Card.Id + 1); // e2 + if (desc == d2) activatedCardIdList.Add(Card.Id + 2); // e3 + + AI.SelectCard(targetList); + return true; + } + + return false; + } + + private bool ShouldVarudrasDetachForPop(ClientCard target) + { + if (target == null) return false; + if (target.IsFloodgate() || target.IsMonsterDangerous() || target.IsMonsterInvincible()) return true; + // ใช้สกอร์เดิม ๆ ที่เรามีเพื่อประเมินความ "คุ้ม" ของการถอดวัตถุดิบแลกกับ 1 ทำลาย + return ScoreEnemyCardForRemoval(target) >= 3000; + } + private bool ActYamaGY() + { + if (Card.Location != CardLocation.Grave) return false; + if (Bot.HasInGraveyard(CardId.SPIRIT_OF_YUBEL)) return false; + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + AI.SelectYesNo(false); + return true; + } + private bool ActYamaMZ() + { + if (CheckRemainInDeck(CardId.SHARVARA) == 0 ) return false; + AI.SelectCard(CardId.SHARVARA); + return true; + } + private bool SSRequiem() + { + if (CheckRemainInDeck(CardId.LACRIMA_CT) == 0 && !Bot.HasInHand(CardId.LACRIMA_CT)) { return false; } + requiemSummoned = true; + return true; + } + private bool L4ABOSS() + { + if (!HasInExtra(CardId.UNCHAINDEDABOMINATION)) return false; + + var mons = Bot.GetMonsters(); + var yama = mons.FirstOrDefault(m => m != null && m.Id == CardId.UNCHAINED_LORD_OF_YAMA); + var rage = mons.FirstOrDefault(m => m != null && m.Id == CardId.UNCHAINED_SOUL_OF_RAGE); + var yubel = mons.FirstOrDefault(m => m != null && m.Id == CardId.YUBEL); + var terror = mons.FirstOrDefault(m => m != null && m.Id == CardId.YUBEL_TERROR_INCARNATE); + + if (yama != null && rage != null && IsInEMZ(yama)) + { + AI.SelectMaterials(new[] { yama, rage }); + return true; + } + + if (rage != null && yubel != null && terror != null && IsInEMZ(rage)) + { + AI.SelectMaterials(new[] { rage, yubel, terror }); + return true; + } + + // 3) greedy: เลือกลิงก์ที่มีอยู่ก่อน (prefer Rage > Yama > อื่น ๆ) แล้วเติมการ์ดจนแต้มรวมครบ 4 + ClientCard firstLink = + rage ?? + yama ?? + mons.Where(m => m.HasType(CardType.Link)).OrderByDescending(m => m.LinkCount).FirstOrDefault(); + + if (firstLink != null) + { + // ไม่ใช้ของที่ไม่ควรสังเวย (NEVER_SAC) แต่ยอมใช้ Yubel/Terror ได้ + var pool = mons + .Where(m => m != firstLink && !NEVER_SAC.Contains(m.Id)) + .OrderBy(ScoreOwnCardForCost) // เสียน้อยสุดมาก่อน + .ToList(); + + var pick = new List { firstLink }; + int need = 4 - LinkValue(firstLink); + + foreach (var m in pool) + { + pick.Add(m); + need -= LinkValue(m); + if (need <= 0) break; + } + + if (need <= 0) + { + AI.SelectMaterials(pick.ToArray()); + return true; + } + + } + return false; + } + private int LinkValue(ClientCard c) => (c != null && c.HasType(CardType.Link)) ? Math.Max(1, c.LinkCount) : 1; + + private bool IsInEMZ(ClientCard c) + { + var mz = Bot.MonsterZone; + return (mz.Length > 5 && mz[5] == c) || (mz.Length > 6 && mz[6] == c); + } + public bool UnchainedAbominationActivate() + { + if (CheckWhetherNegated()) return false; + List targetList = GetNormalEnemyTargetList(true, true, CardType.Monster); + if (targetList.Count() == 0) return false; + int logDesc = ActivateDescription; + if (logDesc >= Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 0)) + { + logDesc = Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 0) - 10; + } + Logger.DebugWriteLine("[UnchainedAbomination]desc: " + logDesc + ", timing = " + CurrentTiming); + if (ActivateDescription == Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 0)) activatedCardIdList.Add(Card.Id); + if (ActivateDescription == Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 1) || ActivateDescription == -1) activatedCardIdList.Add(Card.Id + 1); + if (ActivateDescription == Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 2)) activatedCardIdList.Add(Card.Id + 2); + AI.SelectCard(targetList); + + return true; + } + private ClientCard[] GetSafeMaterialsExcluding(HashSet excludeIds, int need) + { + return Bot.GetMonsters() + .Where(m => m != null + && (excludeIds == null || !excludeIds.Contains(m.Id)) + && !IsProtectedMaterial(m) // ไม่ยอมแลกของสำคัญ (Link≥2 / Extra ฯลฯ) + ) + .OrderBy(m => PriorityIndex(m.Id)) + .ThenBy(m => m.Attack) + .Take(need) + .ToArray(); + } + + private bool CanMakeRageWithoutYama() + { + var mats = GetSafeMaterialsExcluding(new HashSet { CardId.UNCHAINED_LORD_OF_YAMA }, 2); + return mats.Length >= 2; + } + private bool L2YamaSetup() + { + var mats = GetSafeMaterials(2); + if (mats.Length < 2) return false; + AI.SelectMaterials(mats); + return true; + } + private bool L2RageKeepYama() + { + // ต้องมี Yama อยู่ก่อน และต้องมีวัตถุดิบอื่น 2 ใบ (ไม่นับ Yama) + if (!Bot.HasInMonstersZone(CardId.UNCHAINED_LORD_OF_YAMA, true)) return false; + if (!CanMakeRageWithoutYama()) return false; + + var mats = GetSafeMaterialsExcluding(new HashSet { CardId.UNCHAINED_LORD_OF_YAMA }, 2); + if (mats.Length < 2) return false; // ยังไม่พอ → รอก่อน อย่าฝืนใช้ Yama + + AI.SelectMaterials(mats); + return true; + } + private bool HasFreeEMZ() + { + // ปกติ MonsterZone มี 7 ช่อง (0..4 = MMZ, 5..6 = EMZ) + var mz = Bot.MonsterZone; + bool slot5Free = mz.Length > 5 && mz[5] == null; + bool slot6Free = mz.Length > 6 && mz[6] == null; + return slot5Free || slot6Free; + } + + private bool HasValidRageLinkCandidate() + { + bool hasSP = HasInExtra(CardId.SP_LITTLE_KNIGHT); + bool hasGorgon = HasInExtra(CardId.GORGONOFZIL); + hasGorgon = HasInExtra(CardId.GORGONOFZIL); + + if (hasSP) return true; + if (hasGorgon && HasFreeEMZ()) return true; + return false; + } + + #endregion + + // ======================= On Select Somethings ==================== + #region Work Space #2 + private bool YesNoFor(int desc, int cardId, int idx) + { + var info = Duel.GetCurrentSolvingChainInfo(); + var card = Duel.GetCurrentSolvingChainCard(); + // ต้องทั้ง: คำอธิบายตรง + การ์ดบน chain ตอนนี้ตรง + return desc == Util.GetStringId(cardId, idx) + && ((info != null && info.IsCode(cardId)) || (card != null && card.IsCode(cardId))); + } + public override bool OnSelectYesNo(int desc) + { + Logger.DebugWriteLine($"[DEBUG] OnSelectYesNo: desc={desc}"); + var info = Duel.GetCurrentSolvingChainInfo(); + var solving = Duel.GetCurrentSolvingChainCard(); + DumpChain("OnSelectYesNo"); + Logger.DebugWriteLine($"[THRONE] OnSelectYesNo desc={desc} stage={_throneStage} solving={CardStr(solving)}"); + if (info != null && info.ActivatePlayer == 1) + { return false; } + // --- Nightmare Throne --- + // idx อาจต่างกันตามสคริปต์ แต่แนวคิดคือ anchor กับ desc+solving เสมอ + if (solving != null && solving.IsCode(CardId.NIGHTMARE_THRONE)) + { + // เปิด map ช่วย debug ให้เห็นว่า desc ตรง index ไหนจริง ๆ + DebugThroneDescMap(desc); + + // ยังไม่ได้เริ่มค้น -> ตอบ YES เพื่อเข้าโหมดค้น + if (_throneStage == ThroneStage.None && !throneSearched) + { + _throneStage = ThroneStage.Searching; + return true; // YES เริ่มค้น + } + + // ค้นเสร็จแล้ว และกำลังถาม "จะทำลายไหม?" -> default = NO + if (_throneStage == ThroneStage.AwaitDestroyPrompt || throneSearched) + { + _throneStage = ThroneStage.None; + return false; // ไม่ทำลาย + } + + // กันเคส engine ถามซ้ำก่อนโชว์เด็ค: ตอบ YES ไป (จะไปเข้า OnSelectCard) + if (_throneStage == ThroneStage.Searching && !throneSearched) + return true; + } + // --- Muckraker --- + /*if (YesNoFor(desc, CardId.MUCKRAKER_UNDERWORLD, 0)) + { + if (Duel.ChainTargets.Contains(Card)) return false; // ตัวเองกำลังโดนเล็งทำลาย -> ไม่ใช้ + bool protectAlly = Duel.ChainTargets.Any(t => t != null && t.Controller == 0 + && t.Location == CardLocation.MonsterZone && !YUBEL_SET.Contains(t.Id)); + return protectAlly; + }*/ + + // --- Varudras: ถามถอดวัตถุดิบอีก 1 เพื่อทำลาย --- + if (YesNoFor(desc, CardId.VARUDASN_FINAL_BRINGER, 1)) + { + var best = GetBestEnemyCard(); + return best != null && ShouldVarudrasDetachForPop(best); + } + if (solving != null + && solving.IsCode(CardId.VARUDASN_FINAL_BRINGER) + && Duel.CurrentChain.Count > 0) // แปลว่าอยู่ใน e1 ไม่ใช่ e2 + { + // มีเป้าศัตรูให้ทำลายไหม? + var t = GetNormalEnemyTargetList(true, true).FirstOrDefault(c => c.Controller == 1); + if (t == null) return false; // ไม่มีเป้า → ไม่ถอด + return ShouldVarudrasDetachForPop(t); // มีเป้า → ใช้เกณฑ์เดิมตัดสิน + } + + // aux.Stringid(78371393,2) -> คำถาม "จะสังเวยไหม?" + if (YesNoFor(desc, CardId.YUBEL, 2)) + { + // มี Lotus "บนสนามเรา" ไหม + bool haveLotusOnField = Bot.GetMonsters().Any(m => m != null && m.Id == CardId.SAMSARA_D_LOTUS); + + // ถ้ามี จะตอบ YES และตั้งธงว่ากำลังจะเลือกตัวสังเวยให้ Yubel + _yubelWantsTribute = haveLotusOnField; + return haveLotusOnField; // YES ถ้ามี Lotus, NO ถ้าไม่มี => Yubel ระเบิดตัวเอง + } + + + return base.OnSelectYesNo(desc); + } + + // Safety net for any selection the specific executors didn't pre-select + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + Logger.DebugWriteLine($"[DEBUG] OnSelectCard: hint={hint} (0x{hint:X}), min={min}, max={max}, cancelable={cancelable}, candidates={cards?.Count ?? 0}"); + + bool isReleasePrompt = + hint == (long)HintMsg.Release || + hint.ToString().ToLower().Contains("release"); // กันเหนียว + var solving = Duel.GetCurrentSolvingChainCard(); + if (cards != null && cards.Count > 0) + { + // === Throne === + if (_throneStage == ThroneStage.Searching && solving != null && solving.IsCode(CardId.NIGHTMARE_THRONE) && !throneSearched && cards != null && cards.Count > 0) + { + throneSearched = true; + _throneStage = ThroneStage.AwaitDestroyPrompt; + + ClientCard chosen = null; + if (throneDesiredPick != 0) + chosen = cards.FirstOrDefault(c => c != null && c.Id == throneDesiredPick); + + // fallback: ถ้าเลือกตามใจไม่ได้ ให้เลือกใบ Yubel ที่มีค่าที่สุด/หรือใบแรก + if (chosen == null) + chosen = cards.FirstOrDefault(c => c != null && YUBEL_SET.Contains(c.Id)) ?? cards[0]; + + Logger.DebugWriteLine($"[THRONE] Search pick => {CardStr(chosen)}"); + return new[] { chosen }; + } + // === SPIRIT GATES selections === + if (Card != null && Card.Id == CardId.SPIRIT_GATES && cards != null && cards.Count > 0) + { + // 2.1: เลือก Continuous Spell จากสุสาน (Recycle) + if (_gateWantsRecycle) + { + var pain = cards.FirstOrDefault(c => c != null && c.Id == CardId.NIGHTMARE_PAIN); + if (pain != null) return new[] { pain }; + + // อะไรต่อมิอะไรที่เป็น Continuous Spell ถ้ามี + var anyCont = cards.FirstOrDefault(c => c != null && c.IsSpell() && c.HasType(CardType.Continuous)); + if (anyCont != null) return new[] { anyCont }; + } + + // เลือกทิ้งมือเป็น cost (ลิสต์ทั้งหมดมาจากมือเรา) + bool selectingDiscard = cards.All(c => c != null && c.Controller == 0 && c.Location == CardLocation.Hand); + if (selectingDiscard && _gateDiscardPreferredId != 0) + { + var want = cards.FirstOrDefault(c => c.Id == _gateDiscardPreferredId); + if (want != null) return new[] { want }; + + // fallback: ใช้สกอร์เดิม + var sorted = cards.OrderBy(ScoreOwnCardForCost).ToList(); + return new[] { sorted[0] }; + } + + // เลือกเป้าหมายชุบจากสุสาน (Fiend 0/0) + bool selectingGYTarget = cards.Any(c => c != null && c.Location == CardLocation.Grave); + + if (selectingGYTarget) + { + if (requiemSummoned) + { + var sp = cards.FirstOrDefault(c => c != null && c.Id == CardId.SPIRIT_OF_YUBEL); + if (sp != null) return new[] { sp }; + } + if (_gateReviveTargetId != 0) + { + var t = cards.FirstOrDefault(c => c != null && c.Id == _gateReviveTargetId); + if (t != null) return new[] { t }; + } + if (moonSummoned) + { + int[] prio = { + CardId.SPIRIT_OF_YUBEL, + CardId.YUBEL + }; + foreach (var id in prio) + { + var pick = cards.FirstOrDefault(c => c != null && c.Id == id); + if (pick != null) return new[] { pick }; + } + } + else + { + int[] prio = { + CardId.SPIRIT_OF_YUBEL, + CardId.SAMSARA_D_LOTUS, + CardId.DARK_BECKONING_BEAST, + CardId.CHAOS_SUMMONING_BEAST, + CardId.YUBEL + }; + foreach (var id in prio) + { + var pick = cards.FirstOrDefault(c => c != null && c.Id == id); + if (pick != null) return new[] { pick }; + } + } + + var any00 = cards.FirstOrDefault(c => c != null && Is00FiendId(c.Id)); + if (any00 != null) return new[] { any00 }; + } + } + // === Throne: เลือกการ์ดที่ค้นเจอ === + if (Card.Id == CardId.NIGHTMARE_THRONE && _throneStage == ThroneStage.Searching && thronePending && !throneSearched) + { + throneSearched = true; + _throneStage = ThroneStage.AwaitDestroyPrompt; + ClientCard chosen = null; + if (throneDesiredPick != 0) chosen = cards.FirstOrDefault(c => c.Id == throneDesiredPick); + if (chosen == null) chosen = cards[0]; + + Logger.DebugWriteLine($"[THRONE] Search pick => {CardStr(chosen)}"); + return new[] { chosen }; + } + // --- Yubel is asking us to choose the tribute target --- + if (_yubelWantsTribute && isReleasePrompt && cards != null && cards.Count > 0) + { + var lotus = cards.FirstOrDefault(c => c != null && c.Id == CardId.SAMSARA_D_LOTUS); + if (lotus != null) + { + _yubelWantsTribute = false; // เคลียร์ธง + return new[] { lotus }; // เลือก Lotus สังเวยตามที่ต้องการ + } + // เผื่อกรณีเอนจินส่งลิสต์มาแต่ดันไม่มี Lotus (ไม่ควรเกิด เพราะเราตอบ YES เมื่อมี Lotus) + _yubelWantsTribute = false; + // ปล่อยให้ base ตัดสินใจ หรือจะ return null ก็ได้ตามฐานของคุณ + } + // --- Varudras: เลือกเป้าหมายทำลาย --- + if (Card.Id == CardId.VARUDASN_FINAL_BRINGER && hint == 502 && cards != null && cards.Count > 0) + { + // พยายามเลือกฝั่งศัตรูก่อน (คัดใบที่อันตราย/ป่วนที่สุด) + var enemyPick = cards + .Where(c => c != null && c.Controller == 1) + .OrderByDescending(c => ScoreEnemyCardForRemoval(c)) + .FirstOrDefault(); + if (enemyPick != null) return new[] { enemyPick }; + + return new[] { cards[0] }; // fallback + } + // --- Abomination: เลือกเป้าหมายทำลาย --- + if (Card.Id == CardId.UNCHAINDEDABOMINATION && hint == 502 && cards != null && cards.Count > 0) + { + // พยายามเลือกฝั่งศัตรูก่อน (คัดใบที่อันตราย/ป่วนที่สุด) + var enemyPick = cards + .Where(c => c != null && c.Controller == 1) + .OrderByDescending(c => ScoreEnemyCardForRemoval(c)) + .FirstOrDefault(); + if (enemyPick != null) return new[] { enemyPick }; + + return new[] { cards[0] }; // fallback + } + // --- Rage Quick Link --- + if (solving != null && solving.IsCode(CardId.UNCHAINED_SOUL_OF_RAGE) && cards.Any(c => c != null && c.Location == CardLocation.Extra)) + { + // 1) เลือก S:P Little Knight ก่อนเสมอ ถ้ามี + var pickSP = cards.FirstOrDefault(c => c != null && c.Id == CardId.SP_LITTLE_KNIGHT); + if (pickSP != null) return new List { pickSP }; + + // 2) เลือก Gorgon เฉพาะเมื่อ EMZ ว่างเท่านั้น + ClientCard pickGorgon = null; + pickGorgon = cards.FirstOrDefault(c => c != null && c.Id == CardId.GORGONOFZIL); + + if (pickGorgon != null) + { + if (HasFreeEMZ()) + return new List { pickGorgon }; + // ถ้า EMZ ไม่ว่าง ห้ามเลือก Gorgon -> ไปหาใบอื่นต่อ + } + + // 3) fallback: ถ้ามีลิงก์ตัวอื่นที่ generic ก็เลือกใบแรกไปก่อน + return new List { cards[0] }; + } + } + + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + // --- Scoring helpers ------------------------------------------------- + private int ScoreOwnCardForCost(ClientCard c) + { + if (c == null) return int.MaxValue; + int score = 5000; // lower is more expendable + if (NEVER_SAC.Contains(c.Id)) return int.MaxValue; + if (YUBEL_SET.Contains(c.Id)) return 9000; + if ((c.HasType(CardType.Link) && c.LinkCount >= 2) || c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz)) score += 2000; + if (c.EquipCards != null && c.EquipCards.Count > 0) score += 1000; + int idx = Array.IndexOf(YubelCostPriority, c.Id); + if (idx >= 0) score = 10 + idx; + score += Math.Max(0, c.Attack / 100); + return score; + } + + private int ScoreEnemyCardForRemoval(ClientCard c) + { + if (c == null) return -1; + int s = 0; + if (c.IsFloodgate()) s += 6000; + if (c.IsMonsterDangerous()) s += 4000; + if (c.IsMonsterInvincible()) s += 3500; + if (c.EquipCards != null && c.EquipCards.Count > 0) s += 800; + if (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz)) s += 700; + if (c.HasType(CardType.Link) && c.LinkCount >= 2) s += 700; + s += Math.Max(0, c.Attack); + return s; + } + + #endregion + + #region DEBUG + + private string CardStr(ClientCard c) + { + if (c == null) return "null"; + string loc = c.Location.ToString(); + string face = c.IsFaceup() ? "FU" : "FD"; + return $"{c.Name}#{c.Id} [{loc}] P{c.Controller} {face}"; + } + private void DumpChain(string tag = "") + { + Logger.DebugWriteLine($"[CHAIN]{(tag == "" ? "" : $" ({tag})")} turn={Duel.Turn} player={Duel.Player} phase={Duel.Phase} chainCount={Duel.CurrentChain.Count}"); + for (int i = 0; i < Duel.CurrentChain.Count; i++) + { + var c = Duel.CurrentChain[i]; + Logger.DebugWriteLine($" [{i}] {CardStr(c)}"); + } + var solving = Duel.GetCurrentSolvingChainCard(); + if (solving != null) + { + Logger.DebugWriteLine($" -> Solving: {CardStr(solving)} ActivateDescription={ActivateDescription}"); + } + if (Duel.ChainTargets != null && Duel.ChainTargets.Count > 0) + { + var tg = Duel.ChainTargets.Where(t => t != null).Select(CardStr); + Logger.DebugWriteLine($" targets: {string.Join(" | ", tg)}"); + } + } + + private void DebugThroneDescMap(int incomingDesc) + { + for (int i = 0; i < 5; i++) + { + int sid = Util.GetStringId(CardId.NIGHTMARE_THRONE, i); + Logger.DebugWriteLine($"[THRONE] desc map i={i} strId={sid} match={(sid == incomingDesc)}"); + } + } + private bool BlockIfThrone(string who) + { + if (InThroneFlow) + { + Logger.DebugWriteLine($"[THRONE] BLOCKED {who} during Throne flow"); + return true; + } + return false; + } + + #endregion + + // ======================= END OF LIFE ==================== + } +} diff --git a/WindBot.csproj b/WindBot.csproj index 64c37f818..af5e94f7c 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -120,6 +120,7 @@ + From f0ff94cf95b7dceb0959690ac5a8120e96e6322d Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Tue, 10 Feb 2026 14:04:30 +0800 Subject: [PATCH 064/110] Update enum (#217) --- Game/AI/CardExtension.cs | 10 ++-- Game/AI/DefaultExecutor.cs | 11 +++- Game/AI/Enums/DangerousMonster.cs | 5 +- Game/AI/Enums/Floodgate.cs | 51 ++++++++++++++++++- Game/AI/Enums/FusionSpell.cs | 21 +++++++- Game/AI/Enums/InvincibleMonster.cs | 21 +++++++- Game/AI/Enums/OneForXyz.cs | 7 ++- .../Enums/PreventActivationEffectInBattle.cs | 3 +- ...houldBeDisabledBeforeItUseEffectMonster.cs | 8 ++- Game/AI/Enums/ShouldNotBeMonsterTarget.cs | 3 +- Game/AI/Enums/ShouldNotBeTarget.cs | 5 +- 11 files changed, 130 insertions(+), 15 deletions(-) diff --git a/Game/AI/CardExtension.cs b/Game/AI/CardExtension.cs index 55ce1f773..6e8ef4c55 100644 --- a/Game/AI/CardExtension.cs +++ b/Game/AI/CardExtension.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using WindBot.Game.AI.Enums; using YGOSharp.OCGWrapper.Enums; @@ -38,7 +39,8 @@ public static bool IsMonsterHasPreventActivationEffectInBattle(this ClientCard c /// public static bool IsShouldNotBeTarget(this ClientCard card) { - return !card.IsDisabled() && !card.HasType(CardType.Normal) && Enum.IsDefined(typeof(ShouldNotBeTarget), card.Id); + return !card.IsDisabled() && !card.HasType(CardType.Normal) + && (Enum.IsDefined(typeof(ShouldNotBeTarget), card.Id) || card.Overlays.Any(code => code == 91025875)); } /// @@ -46,7 +48,8 @@ public static bool IsShouldNotBeTarget(this ClientCard card) /// public static bool IsShouldNotBeMonsterTarget(this ClientCard card) { - return !card.IsDisabled() && Enum.IsDefined(typeof(ShouldNotBeMonsterTarget), card.Id); + return !card.IsDisabled() && Enum.IsDefined(typeof(ShouldNotBeMonsterTarget), card.Id) + || card.EquipCards.Any(c => c.IsCode(89812483) && !c.IsDisabled()); } /// @@ -54,7 +57,8 @@ public static bool IsShouldNotBeMonsterTarget(this ClientCard card) /// public static bool IsShouldNotBeSpellTrapTarget(this ClientCard card) { - return !card.IsDisabled() && Enum.IsDefined(typeof(ShouldNotBeSpellTrapTarget), card.Id); + return !card.IsDisabled() && Enum.IsDefined(typeof(ShouldNotBeSpellTrapTarget), card.Id) + || card.EquipCards.Any(c => c.IsCode(89812483) && !c.IsDisabled()); } /// diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 851cbb114..98a876dec 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -176,6 +176,7 @@ protected class _CardId public const int HeroicChampionClaivesolish = 97453744; public const int GhostrickAlucard = 75367227; public const int DinowrestlerKingTWrextle = 77967790; + public const int NumberF0UtopicFutureZexal = 41522092; public const int PerformapalMissDirector = 92932860; public const int AncientWarriorsMasterfulSunMou = 40140448; @@ -198,6 +199,8 @@ protected class _CardId public const int SeleneQueenOfTheMasterMagicians = 45819647; public const int TheWingedDragonofRaSphereMode = 10000080; public const int SelettriceVaalmonica = 23093373; + public const int PerformageTrapezeWitch = 33206889; + public const int PoseidraTheStormingAtlantean = 99193444; public const int RockOfTheVanquisher = 28168628; public const int SpiralDischarge = 29477860; @@ -226,6 +229,7 @@ protected class _Setcode public const int Ghostrick = 0x8d; public const int OddEyes = 0x99; public const int Performapal = 0x9f; + public const int Performage = 0xc6; public const int BlueEyes = 0xdd; public const int FurHire = 0x114; public const int Altergeist = 0x103; @@ -292,7 +296,8 @@ protected DefaultExecutor(GameAI ai, Duel duel) {_CardId.HeroicChampionClaivesolish, defender => true}, {_CardId.GhostrickAlucard, defender => defender.HasSetcode(_Setcode.Ghostrick) || defender.IsFacedown()}, {_CardId.MekkKnightCrusadiaAstram, defender => true}, - {_CardId.DinowrestlerKingTWrextle, defender => true} + {_CardId.DinowrestlerKingTWrextle, defender => true}, + {_CardId.NumberF0UtopicFutureZexal, defender => true} }; /// @@ -321,7 +326,9 @@ protected DefaultExecutor(GameAI ai, Duel duel) {_CardId.SeleneQueenOfTheMasterMagicians, (defender, list) => list.Any(monster => monster.HasSetcode(_Setcode.Endymion))}, {_CardId.TheWingedDragonofRaSphereMode, (defender, list) => true}, - {_CardId.SelettriceVaalmonica, (defender, list) => list.Any(monster => !monster.IsCode(_CardId.SelettriceVaalmonica))} + {_CardId.SelettriceVaalmonica, (defender, list) => list.Any(monster => !monster.IsCode(_CardId.SelettriceVaalmonica))}, + {_CardId.PerformageTrapezeWitch, (defender, list) => list.Any(monster => !monster.IsCode(_CardId.PerformageTrapezeWitch) && monster.HasSetcode(_Setcode.Performage))}, + {_CardId.PoseidraTheStormingAtlantean, (defender, list) => list.Any(monster => !monster.IsCode(_CardId.PoseidraTheStormingAtlantean))} }; /// diff --git a/Game/AI/Enums/DangerousMonster.cs b/Game/AI/Enums/DangerousMonster.cs index 277aaf017..7ea2bd7f4 100644 --- a/Game/AI/Enums/DangerousMonster.cs +++ b/Game/AI/Enums/DangerousMonster.cs @@ -26,6 +26,9 @@ public enum DangerousMonster DaigustoSphreeze = 29552709, OhimetheManifestedMikanko = 81260679, ArahimetheManifestedMikanko = 75771170, - YubelDasEwigLiebeWachter = 47172959 + YubelDasEwigLiebeWachter = 47172959, + UzuhimeTheManifestedMikanko = 57566760, + MaidenInLove = 8445808, + ArchfiendMatador = 7622360 } } diff --git a/Game/AI/Enums/Floodgate.cs b/Game/AI/Enums/Floodgate.cs index 39648b7ea..8fc912c95 100644 --- a/Game/AI/Enums/Floodgate.cs +++ b/Game/AI/Enums/Floodgate.cs @@ -223,6 +223,55 @@ public enum Floodgate LightAndDarknessDragonLord = 19652159, FiendsmithDiesIrae = 82135803, MementomictlanTecuhtlicaCombinedConqueror = 14529511, - MadolcheQueenTiaraalaFraise = 49689480 + MadolcheQueenTiaraalaFraise = 49689480, + XYZHyperDragonCannon = 75748977, + ClearViciousKnight = 70095046, + Red_EyesBlackFullmetalDragon = 80870883, + MetalzoaX = 27268998, + AzaminaIliaSilvia = 46396218, + HeosvarogTheMechanicalDawn = 8963089, + LegendaryLordSixSamurai_ShiEn = 34235530, + NumberC32SharkDrakeLeVeiss = 7628844, + RyzealDetonator = 34909328, + MalissQHeartsCrypter = 21848500, + Blue_EyesUltimateSpiritDragon = 89604813, + TheiaThePrimalBeing = 85687952, + ArcanaForceEX_TheChaosRuler = 12686296, + SaintAzamina = 85065943, + CrystalClearWingOverSynchroDragon = 84343351, + JurracAstero = 52553102, + NekrozOfMetaltron = 13408726, + ZoroaTheMagistusVerethragna = 37260677, + DiabellstarVengeance = 23151193, + RegenesisWarrior = 96540807, + RegenesisSage = 22938501, + RegenesisDragon = 59323650, + Snake_EyesVengeanceDragon = 79415624, + LegendaryLordSixSamurai_Kizan = 42209438, + JuraishinTheCursedThunderGod = 78693036, + EclipseDragonRulerOfCatastrophes = 30350202, + AlliedCodeTalkerIgnister = 39138610, + EternalSunshine = 28903523, + RegenesisBirth = 27781371, + Ryu_GeEnd = 90664684, + SoulOfGaiaTheFierceKnight = 73129314, + K9_XWerewolf = 90303227, + ArtmageFinmel = 34541940, + LeoWizardTheDarkFiend = 55423549, + LunalightLigerDancer = 54701958, + ArtmageDiactorus = 27184601, + PsychicBlasterMk_II = 88139289, + NumberF0UtopicFutureZexal = 41522092, + VallonTheSuperPsySkyblaster = 40673853, + MasterPeaceTheTrueDracoverlord = 12800564, + MegalithNotrahPlura = 44293356, + AxonKickerOracle = 33171768, + DoomZXIIEnd_Drastrius = 95626382, + DDDSkyKingZeusRagnarok = 30998403, + DarkContractWithTheDifferentDimension = 54936778, + KillerTuneRedSeal = 15665977, + RBGa10Driller = 6043161, + RBGa10Cutter = 33438265, + RBLambdaBlade = 17188206 } } diff --git a/Game/AI/Enums/FusionSpell.cs b/Game/AI/Enums/FusionSpell.cs index 472baf02f..5f9b0618c 100644 --- a/Game/AI/Enums/FusionSpell.cs +++ b/Game/AI/Enums/FusionSpell.cs @@ -88,6 +88,25 @@ public enum FusionSpell HarmonicSynchroFusion = 7473735, SouloftheSupremeCelestialKing = 76840111, MelodiousConcerto = 31458630, - MementotlanFusion = 66518509 + MementotlanFusion = 66518509, + TheHallowedAzamina = 94845588, + AzaminaDebtors = 20934683, + AzaminaDetermination = 42201897, + HeavyPolymerization = 58570206, + DoubleFusion = 10218411, + DarkContact = 77124096, + GemKnightMasterDiamondDispersion = 25342956, + GemKnightDispersion = 24220368, + DracotailFaimena = 1498449, + DracotailMululu = 7375867, + KetuDracotail = 6153210, + RahuDracotail = 32548318, + ArtmagePowerPatron = 23829452, + ArtmageMasterworkSuccession = 37517035, + TeleportFusion = 36494597, + PrimiteFusion = 99161253, + TheGazeOfTimaeus = 22283204, + MutinyInTheSky = 71593652, + HuntingHorn = 55421040 } } diff --git a/Game/AI/Enums/InvincibleMonster.cs b/Game/AI/Enums/InvincibleMonster.cs index 7fb5fe70a..cf21ff343 100644 --- a/Game/AI/Enums/InvincibleMonster.cs +++ b/Game/AI/Enums/InvincibleMonster.cs @@ -29,7 +29,9 @@ public enum InvincibleBotMonster Number2NinjaShadowMosquito = 32453837, OhimetheManifestedMikanko = 81260679, NightmareMagician = 40221691, - ArahimetheManifestedMikanko = 75771170 + ArahimetheManifestedMikanko = 75771170, + UzuhimeTheManifestedMikanko = 57566760, + ArchfiendMatador = 7622360 } /// /// Cards that are invincible to battle. @@ -123,6 +125,21 @@ public enum InvincibleEnemyMonster MillenniumFiendReflection = 63947968, HereticalPhoboscobos = 76078185, TopHatHareTheSilhouetteMagician = 1528054, - Silhouhatte = 24440742 + Silhouhatte = 24440742, + TheDukeofDemise = 45445571, + EvilHERONeosLord = 13708888, + GladiatorBeastDareios = 72246674, + Number69HeraldryCrest_DarkMatterDemolition = 77571454, + FirstOfTheDragonlords = 53466722, + UzuhimeTheManifestedMikanko = 57566760, + HecahandsIbel = 95365081, + HecahandsYadel = 32759190, + HecahandsGoddus = 68144894, + HecahandsGygas = 95132593, + HecahandsBreus = 21637502, + HecahandsJawza = 67021206, + HecahandsXeno = 94410955, + MaidenInLove = 8445808, + ArchfiendMatador = 7622360 } } diff --git a/Game/AI/Enums/OneForXyz.cs b/Game/AI/Enums/OneForXyz.cs index 074fae2ad..3f1a79e3e 100644 --- a/Game/AI/Enums/OneForXyz.cs +++ b/Game/AI/Enums/OneForXyz.cs @@ -18,6 +18,11 @@ public enum OneForXyz GalaxyEyesCipherDragon = 18963306, Number107 = 88177324, CyberDragonNova = 58069384, - Number39 = 84013237 + Number39 = 84013237, + Argostars_GloriousAdra = 91438674, + Argostars_LightningTydeu = 65889305, + Argostars_SwiftCapane = 91284003, + Argostars_SlayerEteo = 38379052, + Argostars_FierceParthe = 21050476 } } diff --git a/Game/AI/Enums/PreventActivationEffectInBattle.cs b/Game/AI/Enums/PreventActivationEffectInBattle.cs index 6809bbcf7..74f5b8617 100644 --- a/Game/AI/Enums/PreventActivationEffectInBattle.cs +++ b/Game/AI/Enums/PreventActivationEffectInBattle.cs @@ -11,6 +11,7 @@ public enum PreventActivationEffectInBattle SamuraiDestroyer = 40509732, ArmadesKeeperOfBoundaries = 88033975, NumberS39UtopiaTheLightning = 56832966, - DualAvatarEmpoweredKonGyo = 33026283 + DualAvatarEmpoweredKonGyo = 33026283, + GoukiTheTyrantOgre = 7782069 } } diff --git a/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs b/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs index e9c2b36c7..617e63aa3 100644 --- a/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs +++ b/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs @@ -67,6 +67,12 @@ public enum ShouldBeDisabledBeforeItUseEffectMonster GGolemRockHammer = 98875863, WishDragon = 64583600, ChaosWitch = 30327674, - FissioningMotherSpider = 34034150 + FissioningMotherSpider = 34034150, + AncientGearStatue = 32762201, + SplittingPlanarian = 44175358, + TestBear = 62076252, + RescueHedgehog = 99742859, + SuperQuantalFairyZetan = 66646087, + LightWaterDragon = 82616239 } } diff --git a/Game/AI/Enums/ShouldNotBeMonsterTarget.cs b/Game/AI/Enums/ShouldNotBeMonsterTarget.cs index aac5a937b..b86dd9e1e 100644 --- a/Game/AI/Enums/ShouldNotBeMonsterTarget.cs +++ b/Game/AI/Enums/ShouldNotBeMonsterTarget.cs @@ -17,6 +17,7 @@ public enum ShouldNotBeMonsterTarget BorrelendDragon = 98630720, DrytronMeteonisDraconids = 69815951, MyutantBeast = 34695290, - VeidosTheDragonOfEndlessDarkness = 8540986 + VeidosTheDragonOfEndlessDarkness = 8540986, + FirstOfTheDragonlords = 53466722 } } diff --git a/Game/AI/Enums/ShouldNotBeTarget.cs b/Game/AI/Enums/ShouldNotBeTarget.cs index 6bb3d1b60..34ec17c58 100644 --- a/Game/AI/Enums/ShouldNotBeTarget.cs +++ b/Game/AI/Enums/ShouldNotBeTarget.cs @@ -51,6 +51,9 @@ public enum ShouldNotBeTarget RedEyesBDragon = 74677422, // sometimes the name of DragunofRedEyes will be changed to RedEyesBDragon TheArrivalCyberseIgnister = 11738489, MajespecterPorcupineYamaarashi = 51073802, - RaidraptorRisingRebellionFalcon = 71222868 + RaidraptorRisingRebellionFalcon = 71222868, + Number97Draglubion = 28400508, + SaintAzamina = 85065943, + LunalightLigerDancer = 54701958 } } From 414d63bc440fc39385298076804faf498c58d91c Mon Sep 17 00:00:00 2001 From: Reinen <127223416+DaruKani@users.noreply.github.com> Date: Tue, 10 Feb 2026 13:40:23 +0700 Subject: [PATCH 065/110] Add Maliss Deck (#216) --- Decks/AI_Maliss.ydk | 58 + Game/AI/Decks/MalissExecutor.cs | 4203 +++++++++++++++++++++++++++++++ WindBot.csproj | 1 + 3 files changed, 4262 insertions(+) create mode 100644 Decks/AI_Maliss.ydk create mode 100644 Game/AI/Decks/MalissExecutor.cs diff --git a/Decks/AI_Maliss.ydk b/Decks/AI_Maliss.ydk new file mode 100644 index 000000000..6c1857225 --- /dev/null +++ b/Decks/AI_Maliss.ydk @@ -0,0 +1,58 @@ +#created by MDPro3 +#main +68337209 +24224830 +20726052 +23434538 +30118811 +30118811 +75500286 +20938824 +10045474 +24224830 +96676583 +14558127 +27204311 +32061192 +20938824 +40366667 +40366667 +10045474 +68337209 +30118811 +94722358 +40366667 +34267821 +96676583 +3723262 +14558127 +23434538 +32061192 +10045474 +93453053 +69272449 +20938824 +69272449 +65681983 +69272449 +14558127 +32061192 +73628505 +68337209 +96676583 +#extra +39138610 +5043010 +86066372 +4280258 +21848500 +46947713 +95454996 +68059897 +29301450 +59859086 +52698008 +98978921 +30342076 +24842059 +60303245 \ No newline at end of file diff --git a/Game/AI/Decks/MalissExecutor.cs b/Game/AI/Decks/MalissExecutor.cs new file mode 100644 index 000000000..c2a469c86 --- /dev/null +++ b/Game/AI/Decks/MalissExecutor.cs @@ -0,0 +1,4203 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using YGOSharp.Network.Enums; +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Maliss", "AI_Maliss")] + public class MalissExecutor : DefaultExecutor + { + public class CardId + { + public const int DominusImpulse = 40366667; + public const int TERRAFORMING = 73628505; + //public const int AllureOfDarkness = 1475311; + public const int GoldSarcophagus = 75500286; + + // Cyberse / utility + public const int BackupIgnister = 30118811; + public const int WizardIgnister = 3723262; + + // Main Maliss pieces + public const int MalissP_Dormouse = 32061192; // Maliss

Dormouse + public const int MalissP_WhiteRabbit = 69272449; // Maliss

White Rabbit + public const int MalissP_ChessyCat = 96676583; // Maliss

Chessy Cat + public const int MalissP_MarchHare = 20938824; // Maliss

March Hare + public const int MalissC_GWC06 = 20726052; // Maliss GWC-06 + //public const int MalissC_TB11 = 57111661; // Maliss TB-11 + public const int MalissC_MTP07 = 94722358; // Maliss MTP-07 + public const int MalissQ_RedRansom = 68059897; // Maliss Red Ransom + public const int MalissQ_WhiteBinder = 95454996; // Maliss White Binder + public const int MalissQ_HeartsCrypter = 21848500; // Maliss Hearts Crypter + public const int MalissInTheMirror = 93453053; // Maliss in the Mirror (Spell) + public const int MalissInUnderground = 68337209; // Maliss in Underground + + + // === Extra Deck === + public const int Linguriboh = 24842059; + public const int LinkDecoder = 30342076; + public const int SP_LITTLE_KNIGHT = 29301450; + public const int SALAMANGREAT_ALMIRAJ = 60303245; + public const int SplashMage = 59859086; // Splash Mage + public const int CyberseWicckid = 52698008; // Cyberse Wicckid + public const int TranscodeTalker = 46947713; // Transcode Talker + public const int AlliedCodeTalkerIgnister = 39138610; // Allied Code Talker @Ignister + public const int FirewallDragon = 5043010; // Firewall Dragon + public const int LinkSpider = 98978921; // Link Spider + public const int HaggardLizardose = 9763474; // Haggard Lizardose + public const int AccesscodeTalker = 86066372; // Accesscode Talker + public const int Apollousa = 4280258; + + // === Handtraps / Others (blacklist/targets etc.) === + public const int Lancea = 34267821; + public const int Fuwalos = 42141493; + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int GhostMournerMoonlitChill = 52038441; + public const int NibiruThePrimalBeing = 27204311; + } + const int SetcodeMaliss = 0x1bf; + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeHorus = 0x19d; + const int SetcodeDarkWorld = 0x6; + const int SetcodeSkyStriker = 0x115; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.MalissP_ChessyCat, CardId.MalissP_MarchHare,CardId.MalissP_WhiteRabbit,CardId.MalissInUnderground, + CardId.BackupIgnister, CardId.MalissP_Dormouse, + _CardId.AshBlossom,_CardId.InfiniteImpermanence,CardId.DominusImpulse } }, + {2, new List { _CardId.MaxxC, _CardId.CalledByTheGrave}}, + {1, new List { CardId.GoldSarcophagus, CardId.TERRAFORMING, + CardId.MalissC_GWC06, CardId.Lancea, CardId.MalissC_MTP07, + _CardId.CrossoutDesignator, CardId.MalissInTheMirror, CardId.WizardIgnister, + CardId.NibiruThePrimalBeing }} + }; + + List notToNegateIdList = new List { 58699500, 20343502, 19403423 }; + List notToDestroySpellTrap = new List { 50005218, 6767771 }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + + public MalissExecutor(GameAI ai, Duel duel) : base(ai, duel) + { + // Must Set First + AddExecutor(ExecutorType.SpellSet, CardId.MalissC_GWC06, SpellSetCheck); + AddExecutor(ExecutorType.SpellSet, CardId.MalissC_MTP07, SpellSetCheck); + + + AddExecutor(ExecutorType.Activate, CardId.AccesscodeTalker, Accesscode_OnSummon_AtkUp); + AddExecutor(ExecutorType.Activate, CardId.AccesscodeTalker, Accesscode_Destroy_Ignition); + + // ===== Generic counters ===== + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.Apollousa, DontSelfNG); + AddExecutor(ExecutorType.Activate, CardId.DominusImpulse, DontSelfNG); + AddExecutor(ExecutorType.Activate, CardId.AlliedCodeTalkerIgnister, Allied_NegateBanish); + AddExecutor(ExecutorType.Activate, CardId.FirewallDragon, FirewallBounce_OnOppSummon); + AddExecutor(ExecutorType.Activate, CardId.MalissC_MTP07, MTP07_OppTurn_RemoveEnemyOnly); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_HeartsCrypter, HC_Quick_ReturnBanished_AndBanishField); + AddExecutor(ExecutorType.Activate, CardId.MalissC_GWC06, GWC06_OppTurn_ReviveWB_HC); + AddExecutor(ExecutorType.Activate, CardId.SP_LITTLE_KNIGHT, ActLittleKnight); + + + AddExecutor(ExecutorType.Activate, CardId.MalissQ_RedRansom, RR_SS_FromBanished); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_HeartsCrypter, HC_OnBanished_SpecialSummon); + AddExecutor(ExecutorType.Activate, CardId.MalissInTheMirror, Mirror_Banish); + + // Plan#1 + // --- Start with Dormouse --- + AddExecutor(ExecutorType.Summon, CardId.MalissP_Dormouse, Step1_Dormouse_NormalSummon); + AddExecutor(ExecutorType.Summon, CardId.MalissP_WhiteRabbit, Step1_WhiteRabbit_NormalSummon); + AddExecutor(ExecutorType.Summon, CardId.MalissP_ChessyCat, TwoCC_NormalSummon); + AddExecutor(ExecutorType.Summon, CardId.MalissP_ChessyCat, Emergency_NormalCat); + AddExecutor(ExecutorType.Summon, CardId.MalissP_MarchHare, NSMH); + AddExecutor(ExecutorType.Summon, CardId.BackupIgnister, NSBackup_L); + AddExecutor(ExecutorType.Summon, CardId.BackupIgnister, NSBackup); + AddExecutor(ExecutorType.Activate, CardId.MalissP_Dormouse, Dormouse_SS_FromBanished); + AddExecutor(ExecutorType.Activate, CardId.MalissP_Dormouse, Dormouse_ForMH); + AddExecutor(ExecutorType.Activate, CardId.MalissP_Dormouse, Dormouse_Banish_Anytime); + AddExecutor(ExecutorType.Activate, CardId.MalissP_WhiteRabbit, Step1_WhiteRabbit_SS_FromBanished); + AddExecutor(ExecutorType.Activate, CardId.MalissP_WhiteRabbit, Step1_WhiteRabbit_SetTrapOnSummon); + AddExecutor(ExecutorType.Activate, CardId.MalissP_MarchHare, Step1_MH_FromHand); + AddExecutor(ExecutorType.Activate, CardId.MalissP_MarchHare, returnFromBanish); + AddExecutor(ExecutorType.SpSummon, CardId.Linguriboh, LinguribohMHLine); + AddExecutor(ExecutorType.SpSummon, CardId.LinkDecoder, Step1_SSLinkDecoder); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_RedRansom, Step2N_LinkSummon_RedRansom); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_RedRansom, Step2_LinkSummon_RedRansom); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_RedRansom, Step2_RedRansom_Search); + AddExecutor(ExecutorType.Activate, CardId.MalissP_ChessyCat, AnyDraw); + AddExecutor(ExecutorType.SpSummon, CardId.Apollousa, Link_Apo); + AddExecutor(ExecutorType.SpSummon, CardId.CyberseWicckid, Step2N_RRtoWicckid); + AddExecutor(ExecutorType.SpSummon, CardId.LinkDecoder, Step_SummonLinkDecoderToWicckid); + AddExecutor(ExecutorType.Activate, CardId.CyberseWicckid, Wicckid_SearchTuner); + AddExecutor(ExecutorType.SpSummon, CardId.SplashMage, Step_SplashToWB); + AddExecutor(ExecutorType.Activate, CardId.SplashMage, Step2N_SplashMage_ReviveP); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, Flow3_BackupIgnister_AfterMakeIt3); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, OneBody_Backup_SearchWizard); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_WhiteBinder, Step2N_LinkSummon_WB); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_WhiteBinder, WB_OnSummon_BanishGY); + AddExecutor(ExecutorType.Activate, CardId.MalissC_GWC06, GWC06_MyTurn_Extend); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_WhiteBinder, WB_SetMalissTrap); + + // === STEP2: 2 bodies -> Splash Mage -> revive P -> Red Ransom -> search === + AddExecutor(ExecutorType.Activate, CardId.WizardIgnister, Step2_Fallback_Wizard_AfterSplashNegated); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, Step2_Fallback_Backup_AfterSplashNegated); + + AddExecutor(ExecutorType.Activate, CardId.WizardIgnister, Flow3_WizardIgnister_AfterMakeIt3); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_WhiteBinder, WB_OnBanished_SelfSS); + AddExecutor(ExecutorType.Activate, CardId.MalissP_MarchHare, ssFromHandMH); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_HeartsCrypter, Step_LinkSummon_HeartsCrypter); + AddExecutor(ExecutorType.SpSummon, CardId.AlliedCodeTalkerIgnister, Flow3_Link_Allied); + AddExecutor(ExecutorType.Activate, CardId.AlliedCodeTalkerIgnister, Allied_OnSummonTrigger); + + // Plan#2 White Rabbit --- + AddExecutor(ExecutorType.Activate, CardId.MalissC_MTP07, MTP07_ForMH); + AddExecutor(ExecutorType.SpSummon, CardId.FirewallDragon, Flow3_Link_Firewall); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_WhiteBinder, Step_WicckidPlusOneToWB); + AddExecutor(ExecutorType.Activate, CardId.MalissP_ChessyCat, ChessyCat_SS_FromBanished); + + + AddExecutor(ExecutorType.SpSummon, CardId.CyberseWicckid, Step_RRtoWicckid); + AddExecutor(ExecutorType.Activate, CardId.MalissInUnderground, Flow3_UnderGround_Available_SSAnyPawn); + AddExecutor(ExecutorType.Activate, CardId.LinkDecoder, LinkDecoder_ReviveFromGY); + + // Fallback Lancea + AddExecutor(ExecutorType.SpSummon, CardId.TranscodeTalker, SummonTranscode); + AddExecutor(ExecutorType.Activate, CardId.TranscodeTalker, Transcode_ReviveLink3OrLower); + + // Emergency Start + AddExecutor(ExecutorType.Activate, CardId.TERRAFORMING, Terra_GrabUnderground); + AddExecutor(ExecutorType.Activate, CardId.GoldSarcophagus, GoldSarc_StartPiece); + AddExecutor(ExecutorType.Activate, CardId.MalissInUnderground, Underground_ActivateStarter); + + AddExecutor(ExecutorType.SpSummon, CardId.SplashMage, Step_SplashToRR); + AddExecutor(ExecutorType.Activate, CardId.SplashMage, Step2_SplashMage_ReviveP); + + // Fallback: Try to Start + AddExecutor(ExecutorType.SpSummon, CardId.LinkSpider); + AddExecutor(ExecutorType.Summon, _CardId.AshBlossom, Emergency_NS); + AddExecutor(ExecutorType.Summon, _CardId.MaxxC, Emergency_NS); + AddExecutor(ExecutorType.SpSummon, CardId.Linguriboh, OneBody_Link1_Linguriboh); + AddExecutor(ExecutorType.SpSummon, CardId.SALAMANGREAT_ALMIRAJ, OneBody_Link1_Almiraj); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, OneBody_Backup_SS); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, OneBody_Backup_SearchWizard); + AddExecutor(ExecutorType.Activate, CardId.WizardIgnister, OneBody_Wizard_SS); + + + //Finisher + AddExecutor(ExecutorType.SpSummon, CardId.AccesscodeTalker, Flow3_Link_Accesscode); + + // Turn3 or More + AddExecutor(ExecutorType.SpSummon, CardId.Linguriboh, T3Allow); + AddExecutor(ExecutorType.SpSummon, CardId.SALAMANGREAT_ALMIRAJ, T3Allow); + AddExecutor(ExecutorType.SpSummon, CardId.TranscodeTalker, EmerTranscode); + AddExecutor(ExecutorType.SpSummon, CardId.AlliedCodeTalkerIgnister, Emer_Allied); + AddExecutor(ExecutorType.SpSummon, CardId.AlliedCodeTalkerIgnister, Emer_Allied2); + + // >>> Fallback: S:P Little Knight + AddExecutor(ExecutorType.SpSummon, CardId.SP_LITTLE_KNIGHT, SummonLittleKnightFast); + AddExecutor(ExecutorType.SpSummon, CardId.SP_LITTLE_KNIGHT, SPEmer); + + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + AddExecutor(ExecutorType.Repos, MonsterRepos); + + } + // Maliss Flags + bool usedNormalSummon = false; + bool ssDormouse = false; + bool ssWhiteRabbit = false; + bool ssChessyCat = false; + bool ssMarchHare = false; + bool ActiveMarchHare = false; + bool ssRRThisTurn = false; + bool ssWBThisTurn = false; + bool ssHCThisTurn = false; + bool enemyActivateLancea = false; + bool enemyActivateFuwalos = false; + bool ActiveUnderground = false; + bool blockWicckid = false; + bool mtp07SetThisTurn = false; + bool gwc06SetThisTurn = false; + bool splashNegatedThisTurn = false; + bool Allied_End = false; + bool fullBoard1 = false; + bool goldstart = false; + bool undergroundstart = false; + bool nsplan = false; + bool nsBackupplan = false; + bool NSDorMouse = false; + bool nsLanceaplan = false; + + int myTurnCount = 0; + bool avoidLinkedZones = false; + bool wantLinkedToWicckid = false; + private int? _wicckidEmzIndex = null; + private int _transcodeZoneMask = 0; + + const int MZ0 = 1 << 0; + const int MZ1 = 1 << 1; + const int MZ2 = 1 << 2; + const int MZ3 = 1 << 3; + const int MZ4 = 1 << 4; + const int EMZ_L = (1 << 5); + const int EMZ_R = (1 << 6); + const int EMZ_ALL = EMZ_L | EMZ_R; + int _wicckidEmzBit = 0; + int _forceTranscodeBit = 0; + + // Step Flag + bool step1Done = false; + bool step2Done = false; + int lastRevivedIdBySplash = 0; + bool coreSetupComplete = false; + bool madeIt3 = false; + bool resultSuccessFlag = false; + private bool _didSplashToRR; + private bool _didRRtoWicckid; + private bool _didSummonToWicckidArrow; + private bool _didWBFromWicckid; + private bool _finishPlanDecided; + private bool _preferWicckidArrows; + private bool _rrSelfSSPlacing = false; + private enum FinishPlan { FW_HC_Allied, HC_Allied, AlliedOnly } + private FinishPlan _finishPlan; + static bool IsEmzSeq(int seq) => seq >= 5; + static int BitOfSeq(int seq) => (1 << seq); + static int LowestBit(int m) => m & -m; + + private bool _oppJustActivatedPersistentSpell; + private bool _oppJustSummoned; + private bool _oppJustSet; + private int _prefWindowTTL; + + private int _enemyMonsterCountSnap; + private int _enemyFacedownSTSnap; + + //==================== Default code ==================== + #region Default Code Start Here + private int _totalAttack; + private int _totalBotAttack; + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + int dimensionShifterCount = 0; + bool enemyActivateInfiniteImpermanenceFromHand = false; + List infiniteImpermanenceList = new List(); + List currentNegateCardList = new List(); + List currentDestroyCardList = new List(); + List sendToGYThisTurn = new List(); + List activatedCardIdList = new List(); + List enemyPlaceThisTurn = new List(); + List escapeTargetList = new List(); + List summonThisTurn = new List(); + + + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public override bool OnSelectHand() { return true; } + + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(n + 1); + ClientCard temp = result[index]; + result[index] = result[n]; + result[n] = temp; + } + return result; + } + + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) + { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + public bool MonsterRepos() + { + int selfAttack = Card.Attack + 1; + + if (selfAttack <= 1) + return !Card.IsDefense(); + + int bestAttack = 0; + foreach (ClientCard card in Bot.GetMonsters()) + { + int attack = card.Attack; + if (attack >= bestAttack) + { + bestAttack = attack; + } + } + + bool enemyBetter = Util.IsAllEnemyBetterThanValue(bestAttack, true); + + if (Card.IsAttack() && enemyBetter) + return true; + if (Card.IsDefense() && !enemyBetter) + return true; + return false; + } + + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && Bot.GetMonsters().Any(card => card.IsFaceup())) + { + return true; + } + return false; + } + + public bool CheckInDanger() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int totalAtk = 0; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsAttack() && !m.Attacked) totalAtk += m.Attack; + } + if (totalAtk >= Bot.LifePoints) return true; + } + return false; + } + private int GetMyLinkedMMZMask() + { + int mask = 0; + foreach (var m in Bot.GetMonsters()) + { + if (m == null || !m.IsFaceup() || !m.HasType(CardType.Link)) continue; + mask |= m.GetLinkedZones(); + } + mask &= 0x1F; + return mask; + } + private bool IsPawnId(int id) + { + return id == CardId.MalissP_Dormouse + || id == CardId.MalissP_WhiteRabbit + || id == CardId.MalissP_ChessyCat + || id == CardId.MalissP_MarchHare; + } + private int GetQueenLinkedMMZMask() + { + int mask = 0; + foreach (var m in Bot.GetMonsters()) + { + if (m == null || !m.IsFaceup()) continue; + + if (m.IsCode(CardId.MalissQ_RedRansom) + || m.IsCode(CardId.MalissQ_WhiteBinder) + || m.IsCode(CardId.MalissQ_HeartsCrypter)) + { + mask |= m.GetLinkedZones(); + } + } + mask &= 0x1F; + return mask; + } + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + int MAIN_MASK = + (int)Zones.z0 | + (int)Zones.z1 | + (int)Zones.z2 | + (int)Zones.z3 | + (int)Zones.z4; + + int emzMask = available & ~MAIN_MASK; + int mainMask = available & MAIN_MASK; + if (IsPawnId(cardId)) + { + int queenMask = GetQueenLinkedMMZMask(); + int queenChoices = queenMask & available & MAIN_MASK; + + if (queenChoices != 0) + { + int pick = FirstBitFromOrder( + queenChoices, + new[] { (int)Zones.z2, (int)Zones.z1, (int)Zones.z3, (int)Zones.z0, (int)Zones.z4 } + ); + AI.SelectPlace(pick); + return pick; + } + } + if (cardId == CardId.AlliedCodeTalkerIgnister) + { + var fw = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.FirewallDragon)); + int emzAvail = available & EMZ_ALL; + + if (fw != null && fw.IsFaceup()) + { + bool firewallCenter = fw.Controller == 0 && fw.Location == CardLocation.MonsterZone && fw.Sequence == 2; + + int linkedAll = fw.GetLinkedZones(); + int linkedChoices = linkedAll & available; + + int linkedEmzChoices = linkedChoices & EMZ_ALL; + int pick; + + if (linkedEmzChoices != 0) + { + if (firewallCenter && (linkedEmzChoices & EMZ_L) != 0 && (linkedEmzChoices & EMZ_R) != 0) + { + int leftFree = 0; + if ((available & (int)Zones.z0) != 0) leftFree++; + if ((available & (int)Zones.z1) != 0) leftFree++; + + int rightFree = 0; + if ((available & (int)Zones.z3) != 0) rightFree++; + if ((available & (int)Zones.z4) != 0) rightFree++; + + if (leftFree > rightFree) + pick = EMZ_L; + else if (rightFree > leftFree) + pick = EMZ_R; + else + pick = FirstBitFromOrder(linkedEmzChoices, new[] { EMZ_L, EMZ_R }); + } + else + { + pick = FirstBitFromOrder(linkedEmzChoices, new[] { EMZ_L, EMZ_R }); + } + AI.SelectPlace(pick); + return pick; + } + if (emzAvail != 0) + { + if (firewallCenter && (emzAvail & EMZ_L) != 0 && (emzAvail & EMZ_R) != 0) + { + int leftFree = 0; + if ((available & (int)Zones.z0) != 0) leftFree++; + if ((available & (int)Zones.z1) != 0) leftFree++; + + int rightFree = 0; + if ((available & (int)Zones.z3) != 0) rightFree++; + if ((available & (int)Zones.z4) != 0) rightFree++; + + if (leftFree > rightFree) + pick = EMZ_L; + else if (rightFree > leftFree) + pick = EMZ_R; + else + pick = FirstBitFromOrder(emzAvail, new[] { EMZ_L, EMZ_R }); + } + else + { + pick = FirstBitFromOrder(emzAvail, new[] { EMZ_L, EMZ_R }); + } + + AI.SelectPlace(pick); + return pick; + } + if (linkedChoices != 0) + { + pick = FirstBitFromOrder( + linkedChoices, + new[] { (int)Zones.z2, (int)Zones.z1, (int)Zones.z3, (int)Zones.z0, (int)Zones.z4 } + ); + AI.SelectPlace(pick); + return pick; + } + } + int emzOnly = available & EMZ_ALL; + if (emzOnly != 0) + { + int pick = FirstBitFromOrder(emzOnly, new[] { EMZ_L, EMZ_R }); + AI.SelectPlace(pick); + return pick; + } + return PreferSafeSummonZones(available); + } + if (cardId == CardId.CyberseWicckid) + { + int picked = ChooseAndRememberWicckidEmz(available); + if (picked != 0) return picked; + return 0; + } + if (cardId == CardId.TranscodeTalker) + { + int wanted = _forceTranscodeBit != 0 ? _forceTranscodeBit : _wicckidEmzBit; + + if (wanted != 0 && (available & wanted) != 0) + return wanted; + + int anyEmz = available & EMZ_ALL; + if (anyEmz != 0) + return (anyEmz & EMZ_L) != 0 ? EMZ_L : EMZ_R; + + return 0; + } + if (cardId == CardId.MalissQ_RedRansom && _rrSelfSSPlacing) + { + int prefer = (int)Zones.z1 | (int)Zones.z3; + int wmask = GetLinkedMaskFor(GetWicckid()); + int choices = (available & prefer) & ~wmask; + if (choices != 0) + { + int pick = FirstBitFromOrder(choices, new[] { (int)Zones.z1, (int)Zones.z3 }); + AI.SelectPlace(pick); + _rrSelfSSPlacing = false; + return pick; + } + } + if (cardId == CardId.LinkDecoder) + { + var trans = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.TranscodeTalker)); + int tmask = GetLinkedMaskFor(trans) & 0x1F; + int safe = (available & 0x1F) & ~tmask; + if (safe != 0) + { + int pick = FirstBitFromOrder(safe, new[] { (int)Zones.z2, (int)Zones.z1, (int)Zones.z3, (int)Zones.z0, (int)Zones.z4 }); + AI.SelectPlace(pick); + return pick; + } + } + if (cardId == CardId.FirewallDragon) + { + var trans = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.TranscodeTalker)); + int underTrans = 0; + if (trans != null) + { + int tmask = GetLinkedMaskFor(trans) & 0x1F; + if ((tmask & (int)Zones.z1) != 0) underTrans |= (int)Zones.z1; + if ((tmask & (int)Zones.z3) != 0) underTrans |= (int)Zones.z3; + } + int choices = (available & underTrans); + if (choices != 0) + { + int pick = FirstBitFromOrder(choices, new[] { (int)Zones.z1, (int)Zones.z3 }); + AI.SelectPlace(pick); + return pick; + } + } + + if (cardId == CardId.TranscodeTalker || + cardId == CardId.AccesscodeTalker || + cardId == CardId.AlliedCodeTalkerIgnister || + cardId == CardId.MalissQ_WhiteBinder || + cardId == CardId.MalissQ_HeartsCrypter) + { + return PreferSafeSummonZones(available); + } + int linked = (GetMyLinkedMMZMask() & available) & 0x1F; + int unlinked = (available & 0x1F) & ~linked; + + int choose; + if (avoidLinkedZones && unlinked != 0) + choose = LowestBit(unlinked); // Not linked zone + else if (linked != 0) + choose = LowestBit(linked); // Default + else + choose = LowestBit(available & 0x1F); + + AI.SelectPlace(choose); + return choose; + } + SelectSTPlace(Card, true); + return base.OnSelectPlace(cardId, player, location, available); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + if (CheckAtAdvantage() && Duel.Turn > 1) + { + return false; + } + } + return DefaultAshBlossomAndJoyousSpring(); + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsMonsterShouldBeDisabledBeforeItUseEffect() && !m.IsDisabled() && Duel.LastChainPlayer != 0) + { + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(m); + return true; + } + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || (Util.IsChainTarget(Card)) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + List enemyMonsters = Enemy.GetMonsters(); + AI.SelectCard(target); + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + if ((LastChainCard == null || LastChainCard.Controller != 1 || LastChainCard.Location != CardLocation.MonsterZone + || LastChainCard.IsDisabled() || LastChainCard.IsShouldNotBeTarget() || LastChainCard.IsShouldNotBeSpellTrapTarget())) + return false; + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (LastChainCard != null) AI.SelectCard(LastChainCard); + else + { + List enemyMonsters = Enemy.GetMonsters(); + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach (ClientCard card in enemyMonsters) + { + if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + { + AI.SelectCard(card); + return true; + } + } + } + return true; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && c.IsCode(code))); + return true; + } + } + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage() && Duel.Turn > 1) + { + return false; + } + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentDestroyCardList.Add(graveTarget); + return true; + } + } + + foreach (ClientCard graveCard in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(graveCard) && graveCard.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = graveCard.Id; + AI.SelectCard(graveCard); + currentDestroyCardList.Add(graveCard); + return true; + } + } + + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentDestroyCardList.Add(enemyMonsters[0]); + return true; + } + } + } + + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count > 0) + { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentDestroyCardList.Add(targets[0]); + return true; + } + + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + List onlyOneSetList = new List { }; + if (onlyOneSetList.Contains(Card.Id) && Bot.HasInSpellZone(Card.Id)) + { + return false; + } + + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + if (Card.IsCode(CardId.MalissC_MTP07)) mtp07SetThisTurn = true; + if (Card.IsCode(CardId.MalissC_GWC06)) gwc06SetThisTurn = true; + return true; + } + + return false; + } + + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom) || card.HasSetcode(SetcodeHorus) || card.HasSetcode(SetcodeDarkWorld) || card.HasSetcode(SetcodeSkyStriker))).ToList(); + List dangerMonsterIdList = new List { 99937011, 63542003, 9411399, 28954097, 30680659, 32731036 }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= ((int)type & (int)CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (((int)type & (int)CardType.Spell) != 0) || (((int)type & (int)CardType.Trap) != 0); + bool isCounter = ((int)type & (int)CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck && CheckSpellWillBeNegate(isCounter)) + return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) return true; + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + if (target == null) target = Card; + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + return false; + } + + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (DefaultCheckWhetherCardIsNegated(lastcard)) return false; + if (Duel.Turn == 1 && lastcard.IsCode(_CardId.MaxxC)) return false; + + return true; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 && (card.IsShouldNotBeSpellTrapTarget() && !card.IsDisabled())) return false; + } + return true; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentDestroyCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType)) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !notToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget); + if (card != null) return card; + card = Enemy.MonsterZone.GetHighestAttackMonster(canBeTarget); + if (card != null) return card; + List monsters = Enemy.GetMonsters(); + if (monsters.Count > 0 && !onlyFaceup) return ShuffleCardList(monsters)[0]; + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && (ecard.HasType(CardType.Continuous) || ecard.HasType(CardType.Field) || ecard.HasType(CardType.Pendulum))).ToList(); + if (faceUpList.Count > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) return card; + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) return card; + + if (checkGrave && Enemy.Graveyard.Count > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + + private int LinkVal(ClientCard c) => (c != null && c.HasType(CardType.Link)) ? Math.Max(1, c.LinkCount) : 1; + private static readonly int EMZ_LEFT = 5; + private static readonly int EMZ_RIGHT = 6; + private bool IsInEMZ(ClientCard c) + { + var mz = Bot.MonsterZone; + return (mz.Length > 5 && mz[5] == c) || (mz.Length > 6 && mz[6] == c); + } + + private bool HasFreeEMZ() + { + var mz = Bot.MonsterZone; + bool slot5Free = mz.Length > 5 && mz[5] == null; + bool slot6Free = mz.Length > 6 && mz[6] == null; + return slot5Free || slot6Free; + } + #endregion + + #region work space #1 + public override void OnChainSolved(int chainIndex) + { + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + var solving = Duel.GetCurrentSolvingChainCard(); + bool neg = Duel.IsCurrentSolvingChainNegated(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + { + if (currentCard.IsCode(CardId.Lancea)) enemyActivateLancea = true; + if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; + if (currentCard.IsCode(CardId.Fuwalos)) enemyActivateFuwalos = true; + if (currentCard.IsCode(_CardId.LockBird)) enemyActivateLockBird = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + var last = Duel.GetCurrentSolvingChainCard(); + if (last != null) + { + if (last.IsSpell() && (last.HasType(CardType.Field) || last.HasType(CardType.Continuous) || last.HasType(CardType.Equip))) + _oppJustActivatedPersistentSpell = true; + _prefWindowTTL = Math.Max(_prefWindowTTL, 2); + } + } + if (currentCard != null && currentCard.Controller == 0 && currentCard.IsCode(CardId.SplashMage)) + { + if (Duel.IsCurrentSolvingChainNegated()) + splashNegatedThisTurn = true; + } + } + public override void OnChainEnd() + { + escapeTargetList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + _oppJustActivatedPersistentSpell = false; + int curMon = Enemy.GetMonsterCount(); + if (curMon > _enemyMonsterCountSnap) _oppJustSummoned = true; + _enemyMonsterCountSnap = curMon; + int curFD = Enemy.SpellZone.Count(c => c != null && c.IsFacedown()); + if (curFD > _enemyFacedownSTSnap) _oppJustSet = true; + _enemyFacedownSTSnap = curFD; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || (checkTarget.Location != CardLocation.SpellZone && checkTarget.Location != CardLocation.MonsterZone)) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + base.OnChainEnd(); + } + public override void OnNewTurn() + { + if (Duel.Player == 0) + { + myTurnCount++; + } + enemyActivateLancea = false; //added for Maliss + enemyActivateFuwalos = false; //added + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + enemyActivateInfiniteImpermanenceFromHand = false; + if (dimensionShifterCount > 0) dimensionShifterCount--; + infiniteImpermanenceList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + sendToGYThisTurn.Clear(); + activatedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + summonThisTurn.Clear(); + + // reset Maliss flags + usedNormalSummon = false; + ssChessyCat = false; + ssDormouse = false; + ssMarchHare = false; + ssWhiteRabbit = false; + ActiveMarchHare = false; + ActiveUnderground = false; + step1Done = false; + step2Done = false; + lastRevivedIdBySplash = 0; + mtp07SetThisTurn = false; + gwc06SetThisTurn = false; + splashNegatedThisTurn = false; + ssRRThisTurn = false; + ssWBThisTurn = false; + ssHCThisTurn = false; + _didSplashToRR = _didRRtoWicckid = _didSummonToWicckidArrow = _didWBFromWicckid = false; + _finishPlanDecided = false; + _preferWicckidArrows = false; + _rrSelfSSPlacing = false; + _forceTranscodeBit = 0; + _oppJustActivatedPersistentSpell = false; + _oppJustSummoned = false; + _oppJustSet = false; + _enemyMonsterCountSnap = Enemy.GetMonsterCount(); + _enemyFacedownSTSnap = Enemy.SpellZone.Count(c => c != null && c.IsFacedown()); + _prefWindowTTL = 0; + fullBoard1 = false; + Allied_End = false; + nsplan = false; + nsBackupplan = false; + NSDorMouse = false; + nsLanceaplan = false; + base.OnNewTurn(); + } + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.MalissQ_WhiteBinder, 0)) + { + bool anyGY = (Bot.Graveyard.Count > 0) || (Enemy.Graveyard.Count > 0); + return anyGY; + } + return base.OnSelectYesNo(desc); + } + private bool DontSelfNG() { return Duel.LastChainPlayer != 0; } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + var solving = Duel.GetCurrentSolvingChainCard(); + if (cards != null && cards.Count > 0 && solving != null) + { + if (solving.IsCode(CardId.MalissQ_RedRansom)) + { + var searchPool = cards + .Where(c => c != null && + (c.IsCode(CardId.MalissInUnderground) || + c.IsCode(CardId.MalissInTheMirror))) + .ToList(); + + if (searchPool.Count > 0) + { + bool shouldUG = ShouldSearchUnderground(); + int chooseId = 0; + if (shouldUG && searchPool.Any(c => c.IsCode(CardId.MalissInUnderground))) + { + chooseId = CardId.MalissInUnderground; + } + else if (searchPool.Any(c => c.IsCode(CardId.MalissInTheMirror))) + { + chooseId = CardId.MalissInTheMirror; + } + if (chooseId != 0) + { + var pick = searchPool.First(c => c.IsCode(chooseId)); + return new List { pick }; + } + } + } + if (hint == HintMsg.Set && solving.IsCode(CardId.MalissQ_WhiteBinder)) + { + ClientCard pick = null; + pick = cards.FirstOrDefault(c => c.Id == CardId.MalissC_GWC06 && c.Location == CardLocation.Deck); + if (pick == null) + { + pick = cards.FirstOrDefault(c => c.Id == CardId.MalissC_GWC06); + } + if (pick == null) + { + pick = cards.FirstOrDefault(c => c.Id == CardId.MalissC_MTP07); + } + if (pick != null) + { + if (pick.Id == CardId.MalissC_GWC06) + gwc06SetThisTurn = true; + else if (pick.Id == CardId.MalissC_MTP07) + mtp07SetThisTurn = true; + + return new List { pick }; + } + + } + } + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + #endregion + + + #region work space #2 + private int GetMMZCount() => Bot.MonsterZone.Take(5).Count(c => c != null); + private bool HasFreeMMZ() => GetMMZCount() < 5; + private bool HaveTwoBodies() => Bot.GetMonsterCount() >= 2; + private bool ShouldFastEndToSPLK() => + enemyActivateMaxxC || enemyActivateFuwalos; + private bool Step1Complete() + { + return Bot.HasInMonstersZone(CardId.MalissP_Dormouse) + && Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit); + } + private bool CanStartStep1() + { + if (enemyActivateLancea || ShouldFastEndToSPLK()) return false; + if (HaveTwoBodies()) return false; + if (!HasFreeMMZ()) return false; + bool haveStarterInHand = + Bot.HasInHand(CardId.MalissP_Dormouse) || + Bot.HasInHand(CardId.MalissP_WhiteRabbit) || + Bot.HasInHand(CardId.GoldSarcophagus) || + Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.MalissInUnderground); + return haveStarterInHand; + } + private bool CanContinueStep1() + { + if (enemyActivateLancea) return false; + return !HaveTwoBodies() && HasFreeMMZ(); + } + private int PickMalissTrapToSet() + { + int pref; + if (Duel.Player == 0 && Bot.HasInMonstersZone(CardId.MalissP_Dormouse) && Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit)) + { + pref = CardId.MalissC_GWC06; + } + else if (Duel.Player == 0 && (Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_RedRansom) || Bot.HasInBanished(CardId.MalissQ_RedRansom))) + { + pref = CardId.MalissC_GWC06; + } + else if (Duel.Player == 0 && Bot.HasInHand(CardId.MalissP_MarchHare) && !ActiveMarchHare && !ssWhiteRabbit) + { + pref = CardId.MalissC_GWC06; + } + else if (Duel.Player == 0 && nsBackupplan) + { + pref = CardId.MalissC_GWC06; + } + else if (Duel.Player == 1) + { + pref = CardId.MalissC_MTP07; + } + else + { + pref = CardId.MalissC_MTP07; + } + if (CheckRemainInDeck(pref) > 0) + { + return pref; + } + + return 0; + } + + private bool ActLittleKnight() + { + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SP_LITTLE_KNIGHT, 0)) + { + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetDangerousCardinEnemyGrave(false)); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + if (problemCardList.Count() > 0) + { + AI.SelectCard(problemCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + } + else if (ActivateDescription == Util.GetStringId(CardId.SP_LITTLE_KNIGHT, 1)) + { + ClientCard selfMonster = null; + foreach (ClientCard target in Bot.GetMonsters()) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target)) + { + selfMonster = target; + break; + } + } + if (selfMonster == null) + { + if (Duel.Player == 1) + { + selfMonster = Bot.GetMonsters().Where(card => card.IsAttack()).OrderBy(card => card.Attack).FirstOrDefault(); + if (!Util.IsOneEnemyBetterThanValue(selfMonster.Attack, true)) selfMonster = null; + } + } + if (selfMonster != null) + { + ClientCard nextMonster = null; + List selfTargetList = Bot.GetMonsters().Where(card => card != selfMonster).ToList(); + if (Enemy.GetMonsterCount() == 0 && selfTargetList.Count() > 0) + { + selfTargetList.Sort(CompareUsableAttack); + nextMonster = selfTargetList[0]; + escapeTargetList.Add(nextMonster); + } + if (Enemy.GetMonsterCount() > 0) + { + nextMonster = GetBestEnemyMonster(true, true); + currentDestroyCardList.Add(nextMonster); + } + if (nextMonster != null) + { + AI.SelectCard(selfMonster); + AI.SelectNextCard(nextMonster); + escapeTargetList.Add(selfMonster); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + return false; + } + public int CompareUsableAttack(ClientCard cardA, ClientCard cardB) + { + if (cardA == null && cardB == null) + return 0; + if (cardA == null) + return -1; + if (cardB == null) + return 1; + int powerA = (cardA.IsDefense() && summonThisTurn.Contains(cardA)) ? 0 : cardA.Attack; + int powerB = (cardB.IsDefense() && summonThisTurn.Contains(cardB)) ? 0 : cardB.Attack; + if (powerA < powerB) + return -1; + if (powerA == powerB) + return CardContainer.CompareCardLevel(cardA, cardB); + return 1; + } + + private bool Step1_Dormouse_NormalSummon() + { + if (!CanStartStep1()) return false; + if (usedNormalSummon) return false; + usedNormalSummon = true; + NSDorMouse = true; + return true; + } + private bool Dormouse_ForMH() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!CanContinueStep1()) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + int pick = 0; + if (goldstart || undergroundstart) + { + pick = (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0) + ? CardId.MalissP_WhiteRabbit + : CardId.MalissP_ChessyCat; + } + else + { + pick = (CheckRemainInDeck(CardId.MalissP_MarchHare) > 0) + ? CardId.MalissP_MarchHare + : (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0) + ? CardId.MalissP_WhiteRabbit + : CardId.MalissP_ChessyCat; + } + if (pick == 0) return false; + AI.SelectCard(pick); + return true; + } + + private bool Step1_WhiteRabbit_SS_FromBanished() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (enemyActivateLancea) return false; + if (Card.Id != CardId.MalissP_WhiteRabbit) return false; + if (Card.Location != CardLocation.Removed) return false; + if (Bot.LifePoints <= 300) + { + return false; + } + ssWhiteRabbit = true; + return true; + } + + private bool Step1_WhiteRabbit_SetTrapOnSummon() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_WhiteRabbit) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + + int trapToSet = PickMalissTrapToSet(); + if (trapToSet == 0) return false; + + if (trapToSet == CardId.MalissC_GWC06) + gwc06SetThisTurn = true; + + if (trapToSet == CardId.MalissC_MTP07) + mtp07SetThisTurn = true; + + AI.SelectCard(trapToSet); + SelectSafeSTZoneAwayFromImperm(); + if (Step1Complete()) step1Done = true; + return true; + } + + private bool Step1_WhiteRabbit_NormalSummon() + { + if (!CanStartStep1()) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse)) return false; + if (usedNormalSummon) return false; + usedNormalSummon = true; + return true; + } + + private bool Dormouse_SS_FromBanished() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_Dormouse) return false; + if (Card.Location != CardLocation.Removed) return false; + if (enemyActivateLancea) return false; + if (Bot.LifePoints <= 300) + { + return false; + } + ssDormouse = true; + return true; + } + private bool ChessyCat_SS_FromBanished() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_ChessyCat) return false; + if (Card.Location != CardLocation.Removed) return false; + if (enemyActivateLancea) return false; + if (Bot.LifePoints <= 300) + { + return false; + } + ssChessyCat = true; + return true; + } + + private bool SummonLittleKnightFast() + { + if (!(Bot.HasInMonstersZone(CardId.LinkSpider)|| Bot.HasInMonstersZone(CardId.Linguriboh))) return false; + if (!HaveTwoBodies()) return false; + + var mats = Bot.GetMonsters() + .Where(c => c != null && c.IsFaceup() && c.HasType(CardType.Effect)) + .OrderBy(c => c.Attack) + .Take(2).ToList(); + + if (mats.Count < 2) return false; + + AI.SelectMaterials(mats); + step1Done = true; + return true; + } + private bool SPEmer() + { + if (Bot.HasInMonstersZone(CardId.FirewallDragon) || + Bot.HasInMonstersZone(CardId.AlliedCodeTalkerIgnister) || + Bot.HasInMonstersZone(CardId.Apollousa) || + Bot.HasInMonstersZone(CardId.AccesscodeTalker)) + { + return false; + } + if (!HaveTwoBodies()) return false; + + var mats = PickLinkMatsMinCount( + targetLink: 2, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.Apollousa, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker } + ); + if (mats.Count != 2) + { + return false; + } + + AI.SelectMaterials(mats); + return true; + } + + private bool GoldSarc_StartPiece() + { + if (CheckSpellWillBeNegate()) return false; + if (enemyActivateLancea) { return false; } + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit)) { return false; } + int pick = 0; + if (!Bot.HasInMonstersZone(CardId.MalissP_Dormouse) && CheckRemainInDeck(CardId.MalissP_Dormouse) > 0 && !ssDormouse) + { pick = CardId.MalissP_Dormouse; } + else if (!Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit) && CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0 && !ssWhiteRabbit) + { pick = CardId.MalissP_WhiteRabbit; } + else if (madeIt3 && !ssChessyCat) + { pick = CardId.MalissP_ChessyCat; } + else { return false; } + if (pick == 0) return false; + + + AI.SelectCard(pick); + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + goldstart = true; + return true; + } + private bool ExistsForUnderground(int id) + { + return CheckRemainInDeck(id) > 0 + || Bot.HasInHand(id) + || Bot.HasInGraveyard(id); + } + private bool Underground_ActivateStarter() + { + if (enemyActivateLancea) return false; + if (Bot.GetMonsterCount() != 0) return false; + if (step1Done) return false; + + int pick = 0; + if (ExistsForUnderground(CardId.MalissP_Dormouse)) + pick = CardId.MalissP_Dormouse; + else if (ExistsForUnderground(CardId.MalissP_WhiteRabbit)) + pick = CardId.MalissP_WhiteRabbit; + else if (ExistsForUnderground(CardId.MalissP_ChessyCat)) + pick = CardId.MalissP_ChessyCat; + + if (pick == 0) return false; + + AI.SelectYesNo(true); + AI.SelectCard(pick); + ActiveUnderground = true; + undergroundstart = true; + return true; + } + + private bool Terra_GrabUnderground() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (CheckSpellWillBeNegate()) return false; + if (ActiveUnderground) return false; + if (Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInSpellZone(CardId.MalissInUnderground)) + return false; + AI.SelectCard(CardId.MalissInUnderground); + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + return true; + } + private bool HaveBackupOrWizardInHand() + { + return Bot.HasInHand(CardId.BackupIgnister) || Bot.HasInHand(CardId.WizardIgnister); + } + private bool HaveMHInHand() + { + return Bot.HasInHand(CardId.MalissP_MarchHare); + } + private bool IsMalissBody(ClientCard c) + { + return c != null && c.IsFaceup() && c.HasSetcode(SetcodeMaliss) + && c.IsCode(CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare); + } + private bool Emergency_NormalCat() + { + if (Bot.GetMonsterCount() != 0) return false; + if (usedNormalSummon) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) || + Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.GoldSarcophagus)) return false; + if (!HaveMHInHand()) + { + return false; + } + + usedNormalSummon = true; + return true; + } + private bool OneBody_Link1_Linguriboh() + { + if (!HaveBackupOrWizardInHand()) return false; + if (Bot.HasInMonstersZone(CardId.Linguriboh)) return false; + if (Bot.GetMonsterCount() != 1) return false; + return true; + } + private bool OneBody_Link1_Almiraj() + { + if (!HaveBackupOrWizardInHand()) return false; + if (Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ)) return false; + if (Bot.GetMonsterCount() != 1) return false; + return true; + } + private bool OneBody_Backup_SS() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + bool haveLinkAnchor = Bot.HasInMonstersZone(CardId.Linguriboh) || Bot.HasInMonstersZone(CardId.SplashMage); + if (!haveLinkAnchor) return false; + if (Card.Location != CardLocation.Hand) return false; + + avoidLinkedZones = true; + return true; + } + private bool OneBody_Backup_SearchWizard() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!Card.IsCode(CardId.BackupIgnister)) return false; + + if (Bot.Hand.Count == 0) return false; + + bool haveWizard = Bot.HasInHand(CardId.WizardIgnister); + + int searchId = 0; + if (haveWizard && CheckRemainInDeck(CardId.MalissP_MarchHare) > 0 && Bot.Hand.Count > 0) + searchId = CardId.MalissP_MarchHare; + else if (CheckRemainInDeck(CardId.MalissP_Dormouse) > 0 && nsplan && Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ)) + searchId = CardId.MalissP_Dormouse; + else if (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0 && nsBackupplan) + searchId = CardId.MalissP_WhiteRabbit; + else if (!haveWizard && CheckRemainInDeck(CardId.WizardIgnister) > 0 && Bot.Hand.Count > 0) + searchId = CardId.WizardIgnister; + else if (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0) + searchId = CardId.MalissP_WhiteRabbit; + else + return false; + + AI.SelectCard(searchId); + + var hand = Bot.Hand.Where(h => h != null).ToList(); + var candidates = hand.Where(h => h.Id != CardId.WizardIgnister).ToList(); + var discards = new List(hand.Count); + if (searchId == CardId.MalissP_Dormouse) + { + discards.AddRange(candidates.Where(c => c.Id == CardId.MalissP_Dormouse)); + } + IEnumerable OthersExcludingTarget() + { + if (searchId == CardId.MalissP_MarchHare) + return candidates.Where(c => c.Id != CardId.MalissP_MarchHare); + return candidates; + } + var othersExcludingTarget = OthersExcludingTarget().ToList(); + var dupGroups = othersExcludingTarget.GroupBy(c => c.Id) + .Where(g => g.Count() >= 2); + + discards.AddRange(dupGroups.SelectMany(g => g)); + + int[] lowValueSinglesOrder = { CardId.NibiruThePrimalBeing, + CardId.Lancea, + CardId.TERRAFORMING, + CardId.GoldSarcophagus + }; + + foreach (var id in lowValueSinglesOrder) + { + discards.AddRange(othersExcludingTarget + .Where(c => c.Id == id && dupGroups.All(g => g.Key != id))); + } + + var already = new HashSet(discards); + discards.AddRange(othersExcludingTarget.Where(c => !already.Contains(c))); + + discards = discards.Where(c => c != null).Distinct().ToList(); + + if (searchId == CardId.MalissP_Dormouse) + { + AI.SelectNextCard(searchId); + } + if (searchId == CardId.MalissP_WhiteRabbit) + { + AI.SelectNextCard(searchId); + } + else if (discards != null) + { + AI.SelectNextCard(discards); + } + else + { + return false; + } + + avoidLinkedZones = true; + if (Bot.HasInMonstersZone(CardId.Linguriboh)) blockWicckid = true; + if (GetMMZCount() >= 5 && Bot.HasInHand(CardId.WizardIgnister)) { fullBoard1 = true; } + return true; + } + private bool OneBody_Wizard_SS() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!Bot.HasInMonstersZone(CardId.Linguriboh) && !Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ)) return false; + if (Card.Location != CardLocation.Hand) return false; + + var revive = PickGYCybersePriority(); + if (revive == null) return false; + + avoidLinkedZones = true; + blockWicckid = true; + + AI.SelectCard(revive); + return true; + } + private ClientCard PickGYCybersePriority() + { + var m = PickGYMalissPriority(); + if (m != null) return m; + + var list = Bot.Graveyard.GetMatchingCards(c => + c != null && c.IsMonster() && c.HasRace(CardRace.Cyberse) && c.Level <= 4).ToList(); + return list.FirstOrDefault(); + } + private ClientCard PickGYMalissPriority() + { + int[] pref = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare + }; + foreach (var id in pref) + { + var c = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(id) && g.IsMonster()); + if (c != null) return c; + } + return null; + } + private bool TwoCC_NormalSummon() + { + if (usedNormalSummon) return false; + if (Bot.GetMonsterCount() != 0) return false; + + bool haveOtherStarter = + Bot.HasInHand(CardId.MalissP_Dormouse) || + Bot.HasInHand(CardId.MalissP_WhiteRabbit) || + Bot.HasInHand(CardId.GoldSarcophagus) || + Bot.HasInHand(CardId.MalissInUnderground); + + if (haveOtherStarter) return false; + + if (Bot.Hand.GetMatchingCards(c => c != null && c.IsCode(CardId.MalissP_ChessyCat)).Count >= 2) + { + usedNormalSummon = true; + return true; + } + return false; + } + private bool IsMalissCost(ClientCard card) + { + if (card == null) return false; + + if (card.IsCode(CardId.MalissP_ChessyCat)) + return true; + if (card.IsCode(CardId.MalissP_WhiteRabbit) && NSDorMouse && !ssWhiteRabbit) + return true; + if (card.IsCode(CardId.MalissP_WhiteRabbit) && ssWhiteRabbit) + return true; + if (card.IsCode(CardId.MalissP_Dormouse) && ssDormouse) + return true; + if (card.IsCode(CardId.MalissP_MarchHare) && ActiveMarchHare) + return true; + + return false; + } + private bool IsMalissCost2(ClientCard card) + { + if (card == null) return false; + + return + card.IsCode(CardId.MalissP_ChessyCat) || + card.IsCode(CardId.MalissP_WhiteRabbit) || + card.IsCode(CardId.MalissP_MarchHare) || + card.IsCode(CardId.MalissInUnderground); + } + private bool AnyDraw() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_ChessyCat) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (CheckWhetherNegated()) return false; + + ClientCard target = null; + + target = Bot.Hand.FirstOrDefault(c => c != null && c.IsCode(CardId.MalissInTheMirror)); + if (target == null) + { + target = Bot.Hand.FirstOrDefault(IsMalissCost); + } + if (target == null) + { + var malissDupGroup = Bot.Hand + .Where(IsMalissCost2) + .GroupBy(c => c.Id) + .FirstOrDefault(g => g.Count() >= 2); + + if (malissDupGroup != null) + { + target = malissDupGroup.First(); + } + } + if (target == null) + { + return false; + } + AI.SelectCard(target); + return true; + } + private int PickTB11CostCandidateId() + { + var field = Bot.GetMonsters() + .Where(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeMaliss)) + .ToList(); + + field = field.Where(c => + !(c.IsCode(CardId.MalissP_WhiteRabbit) && ssWhiteRabbit) && + !(c.IsCode(CardId.MalissP_ChessyCat) && ssChessyCat) && + !(c.IsCode(CardId.MalissP_MarchHare) && ssMarchHare) && + !(c.IsCode(CardId.MalissP_Dormouse) && ssDormouse) && + !(c.IsCode(CardId.MalissQ_RedRansom) && ssRRThisTurn) && + !(c.IsCode(CardId.MalissQ_WhiteBinder) && ssWBThisTurn) && + !(c.IsCode(CardId.MalissQ_HeartsCrypter) && ssHCThisTurn) + ).ToList(); + + int[] pref = { + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare, + CardId.MalissP_Dormouse, + CardId.MalissQ_RedRansom, + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_HeartsCrypter + }; + foreach (var id in pref) + if (field.Any(c => c.IsCode(id))) return id; + + return 0; + } + private int PickPFromGYForSplash() + { + if (enemyActivateLancea) + { + int[] pref2 = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare, + CardId.BackupIgnister, + CardId.WizardIgnister + }; + foreach (var id in pref2) + if (Bot.HasInGraveyard(id)) return id; + } + int[] pref = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare + }; + foreach (var id in pref) + if (Bot.HasInGraveyard(id)) return id; + return 0; + } + private bool HaveUndergroundOnHandOrField() + { + return Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInSpellZone(CardId.MalissInUnderground); + } + private bool ShouldSearchUnderground() + { + if (ActiveUnderground) return false; + if (HaveUndergroundOnHandOrField()) return false; + return CheckRemainInDeck(CardId.MalissInUnderground) > 0; + } + private bool Step2_RedRansom_Search() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + int chooseId = 0; + bool shouldUG = ShouldSearchUnderground(); + if (shouldUG) + { + chooseId = CardId.MalissInUnderground; + } + else if (CheckRemainInDeck(CardId.MalissInTheMirror) > 0) + { + chooseId = CardId.MalissInTheMirror; + } + if (chooseId == 0) return false; + + //AI.SelectCard(chooseId); go to onselectcard + step2Done = true; + avoidLinkedZones = false; + coreSetupComplete = true; + return true; + } + private List PickMaterialsForRedRansom() + { + var splash = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.SplashMage)); + if (splash == null) return new List(); + + ClientCard revived = null; + if (lastRevivedIdBySplash != 0) + revived = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(lastRevivedIdBySplash)); + + if (revived == null) + revived = Bot.MonsterZone.FirstOrDefault(c => + c != null && c.IsFaceup() && c.HasSetcode(0x1bf) && c != splash && !c.HasType(CardType.Link)); + + if (revived == null) return new List(); + return new List { splash, revived }; + } + private bool Step2_SplashMage_ReviveP() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (step2Done) return false; + + if (!Bot.HasInMonstersZone(CardId.SplashMage)) return false; + + int pick = PickPFromGYForSplash(); + if (pick == 0) return false; + + AI.SelectCard(pick); + lastRevivedIdBySplash = pick; + return true; + } + private bool Step2N_SplashMage_ReviveP() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!Bot.HasInMonstersZone(CardId.SplashMage)) return false; + + int pick = PickPFromGYForSplash(); + if (pick == 0) return false; + + AI.SelectCard(pick); + lastRevivedIdBySplash = pick; + return true; + } + private bool Step2_LinkSummon_RedRansom() + { + if (step2Done) return false; + + var mats = PickMaterialsForRedRansom(); + if (mats.Count != 2) return false; + + if (Util.GetBotAvailZonesFromExtraDeck(mats) == 0) return false; + + AI.SelectMaterials(mats); + madeIt3 = true; + return true; + } + private bool Step2N_LinkSummon_WB() + { + var mats = PickMaterialsForRedRansom(); + if (mats.Count != 2) return false; + + if (Util.GetBotAvailZonesFromExtraDeck(mats) == 0) return false; + + AI.SelectMaterials(mats); + return true; + } + private bool Step2N_LinkSummon_RedRansom() + { + if (!Bot.HasInMonstersZone(CardId.MalissP_MarchHare) || Bot.GetMonsterCount() < 3) + { + return false; + } + madeIt3 = true; + return true; + } + private bool Step2_Fallback_Wizard_AfterSplashNegated() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!splashNegatedThisTurn) return false; + if (Card.Location != CardLocation.Hand) return false; + + var revive = PickGYMalissPriority(); + if (revive == null) return false; + + avoidLinkedZones = true; + blockWicckid = true; + AI.SelectCard(revive); + return true; + } + private bool Step2_Fallback_Backup_AfterSplashNegated() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!splashNegatedThisTurn) return false; + if (Card.Location != CardLocation.Hand) return false; + + if (GetMMZCount() >= 5) return false; + + int want = !Bot.HasInHand(CardId.WizardIgnister) && CheckRemainInDeck(CardId.WizardIgnister) > 0 + ? CardId.WizardIgnister + : (CheckRemainInDeck(CardId.MalissP_MarchHare) > 0 ? CardId.MalissP_MarchHare : 0); + if (want == 0) return false; + + AI.SelectCard(want); + + var discard = Bot.Hand.FirstOrDefault(h => h != null && h.Id != CardId.WizardIgnister && h != Card); + if (discard != null) AI.SelectNextCard(discard); + + avoidLinkedZones = true; + blockWicckid = true; + return true; + } + #endregion + + #region FLOW 3: Core → Results (UG / Mirror / TP11 → Make it 3!! → Finishers) + private bool HaveUG() => Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInSpellZone(CardId.MalissInUnderground); + private bool HasSelfSSAvailable(int id) + { + if (id == CardId.MalissP_Dormouse) return !ssDormouse; + if (id == CardId.MalissP_WhiteRabbit) return !ssWhiteRabbit; + if (id == CardId.MalissP_ChessyCat) return !ssChessyCat; + if (id == CardId.MalissP_MarchHare) return !ActiveMarchHare; + return true; + } + private int PickUG_DHG_DormouseFirst() + { + int[] pref = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare + }; + + foreach (var id in pref) + { + if (!HasSelfSSAvailable(id)) continue; + if (ExistsForUnderground(id)) + return id; + } + return 0; + } + + private bool Flow3_UnderGround_Available_SSAnyPawn() + { + if (!step2Done) return false; + if (!HaveUG()) return false; + if (Card.Id != CardId.MalissInUnderground) return false; + if (resultSuccessFlag) return false; + if (GetMMZCount() >= 5) + { + AI.SelectYesNo(false); + return true; + } + if (enemyActivateLancea) + { + AI.SelectYesNo(false); + return true; + } + + int pick = 0; + + if (CheckRemainInDeck(CardId.MalissInTheMirror) > 0 && nsplan) + { + pick = CardId.MalissInTheMirror; + } + else if (CheckRemainInDeck(CardId.MalissInTheMirror) > 0 && NSDorMouse) + { + pick = CardId.MalissInTheMirror; + } + else + { + pick = PickUG_DHG_DormouseFirst(); + } + + if (pick == 0) + { + AI.SelectYesNo(false); + return true; + } + + AI.SelectYesNo(true); + AI.SelectCard(pick); + resultSuccessFlag = true; + return true; + } + private bool Mirror_Banish() + { + if (DescIs(CardId.MalissInTheMirror, 1)) + { + var gy = PickMirrorGYTargetForSearch(); + if (gy == null) return false; + + AI.SelectCard(gy); + + var wants = Mirror_SearchOrderForType(false, gy.IsMonster()); + AI.SelectNextCard(wants); + return true; + } + + if (CheckSpellWillBeNegate()) return false; + if (CheckWhetherNegated()) return false; + var cost = PickMirrorCostCandidate(); + if (cost == null) return false; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsMonsterShouldBeDisabledBeforeItUseEffect() && !m.IsDisabled() && Duel.LastChainPlayer != 0) + { + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(m); + AI.SelectNextCard(cost); + return true; + } + } + ClientCard LastChainCard = Util.GetLastChainCard(); + if ((LastChainCard == null || LastChainCard.Controller != 1 || LastChainCard.Location != CardLocation.MonsterZone + || LastChainCard.IsDisabled() || LastChainCard.IsShouldNotBeTarget() || LastChainCard.IsShouldNotBeSpellTrapTarget())) + return false; + + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (LastChainCard != null) AI.SelectCard(LastChainCard); + else + { + List enemyMonsters = Enemy.GetMonsters(); + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach (ClientCard card in enemyMonsters) + { + if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + { + AI.SelectCard(card); + } + } + } + AI.SelectNextCard(cost); + return true; + } + private bool Flow3_Link_Accesscode() + { + if (Bot.HasInExtra(CardId.AlliedCodeTalkerIgnister)) return false; + if (BlockAccesscodeOnT1()) return false; + + var avoid = new[] { CardId.AlliedCodeTalkerIgnister, CardId.FirewallDragon }; + + var mats = PickLinkMatsMinCount( + targetLink: 4, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 4, + avoidIds: avoid + ); + + if (mats.Count < 2) return false; + AI.SelectMaterials(mats); + return true; + } + private bool Flow3_BackupIgnister_AfterMakeIt3() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!madeIt3) return false; + if (Card.Location != CardLocation.Hand) return false; + + avoidLinkedZones = true; + return true; + } + private bool Flow3_WizardIgnister_AfterMakeIt3() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!madeIt3) return false; + if (Card.Location != CardLocation.Hand) return false; + + var revive = PickGYMalissPriority(); + if (revive == null) return false; + + avoidLinkedZones = true; + AI.SelectCard(revive); + return true; + } + private bool RR_SS_FromBanished() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissQ_RedRansom) return false; + if (Card.Location != CardLocation.Removed) return false; + if (GetMMZCount() >= 5) return false; + if (Bot.LifePoints <= 900) + { + return false; + } + + int pickId = 0; + + int[] pawnOrder = { + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_Dormouse + }; + + foreach (var id in pawnOrder) + { + if (CheckRemainInDeck(id) > 0 && PawnSelfSS_AvailableId(id)) + { + pickId = id; + break; + } + } + + + bool canBanish = (pickId != 0); + AI.SelectYesNo(canBanish); + if (canBanish) + { + AI.SelectCard(pickId); + } + _rrSelfSSPlacing = true; + ssRRThisTurn = true; + return true; + } + private bool Wicckid_SearchTuner() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (CheckRemainInDeck(CardId.BackupIgnister) <= 0) return false; + var cost = PickGYCyberseForWicckidCost_Safe(); + if (cost == null) + { + return false; + } + + AI.SelectCard(cost); + AI.SelectNextCard(CardId.BackupIgnister); + avoidLinkedZones = false; + return true; + } + private bool LinkDecoder_ReviveFromGY() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Grave) { return false; } + if (Allied_End) { return false; } + return true; + } + private bool Transcode_ReviveLink3OrLower() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + + var prefer = Bot.Graveyard.GetFirstMatchingCard(c => c.IsCode(CardId.CyberseWicckid)) + ?? Bot.Graveyard.GetFirstMatchingCard(c => c.IsCode(CardId.SplashMage)) + ?? Bot.Graveyard.GetFirstMatchingCard(c => c.IsCode(CardId.MalissQ_RedRansom)) + ?? Bot.Graveyard.GetFirstMatchingCard(c => c.IsCode(CardId.MalissQ_WhiteBinder)) + ?? Bot.Graveyard + .GetMatchingCards(c => c.IsMonster() && c.HasType(CardType.Link) && c.LinkCount <= 3 && !c.IsCode(CardId.TranscodeTalker)) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + + if (prefer == null) return false; + AI.SelectCard(prefer); + avoidLinkedZones = false; + return true; + } + private bool Allied_NegateBanish() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + var allied = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.AlliedCodeTalkerIgnister)); + if (allied == null || allied.IsDisabled()) return false; + bool haveAnyLink = Bot.GetMonsters().Any(m => m != null && m.HasType(CardType.Link) && !m.IsCode(CardId.AlliedCodeTalkerIgnister)); + if (!haveAnyLink) return false; + + var cheapLinks = new List { + CardId.CyberseWicckid, + CardId.MalissQ_WhiteBinder, + CardId.TranscodeTalker, + CardId.MalissQ_RedRansom + }; + AI.SelectCard(cheapLinks.ToArray()); + return true; + } + private ClientCard GetWicckid() + { + return Bot.MonsterZone.GetFirstMatchingFaceupCard(c => c != null && c.IsCode(CardId.CyberseWicckid)); + } + private int GetLinkedMaskFor(ClientCard link) + { + if (link == null || !link.IsFaceup() || !link.HasType(CardType.Link)) return 0; + return link.GetLinkedZones() & 0x1F; + } + private bool PawnSelfSS_AvailableId(int id) + { + if (id == CardId.MalissP_Dormouse) return !ssDormouse; + if (id == CardId.MalissP_WhiteRabbit) return !ssWhiteRabbit; + if (id == CardId.MalissP_ChessyCat) return !ssChessyCat; + if (id == CardId.MalissP_MarchHare) return !ActiveMarchHare; + return false; + } + private bool QueenSelfSS_AvailableId(int id) + { + if (id == CardId.MalissQ_HeartsCrypter) return !ssHCThisTurn; + if (id == CardId.MalissQ_WhiteBinder) return !ssWBThisTurn; + if (id == CardId.MalissQ_RedRansom) return !ssRRThisTurn; + return false; + } + private bool Dormouse_Banish_Anytime() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_Dormouse) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (enemyActivateLancea) return false; + if (!HasFreeMMZ()) return false; + + int pick = 0; + + if (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0 && PawnSelfSS_AvailableId(CardId.MalissP_WhiteRabbit)) + pick = CardId.MalissP_WhiteRabbit; + else if (CheckRemainInDeck(CardId.MalissP_ChessyCat) > 0 && PawnSelfSS_AvailableId(CardId.MalissP_ChessyCat)) + pick = CardId.MalissP_ChessyCat; + + if (pick == 0) return false; + + AI.SelectCard(pick); + return true; + } + private bool IsCyberse(ClientCard c) => c != null && c.HasType(CardType.Monster) && c.HasRace(CardRace.Cyberse); + private bool RR_HOPT_Spent_ThisTurn() => ssRRThisTurn; + private bool RR_CanStillSS_ThisTurn() + { + if (RR_HOPT_Spent_ThisTurn()) return false; + return true; + } + private int Score_WicckidCost(ClientCard c) + { + if (c == null) return int.MinValue; + if (c.IsCode(CardId.MalissQ_RedRansom) && RR_HOPT_Spent_ThisTurn()) return -999; + if (c.IsCode(CardId.MalissQ_RedRansom) && RR_CanStillSS_ThisTurn()) return 1000; + + if (c.IsCode(CardId.Linguriboh) || c.IsCode(CardId.SALAMANGREAT_ALMIRAJ)) return 120; + + if (c.IsCode(CardId.MalissP_Dormouse) && ssDormouse) return 90; + if (c.IsCode(CardId.MalissP_WhiteRabbit) && ssWhiteRabbit) return 70; + if (c.IsCode(CardId.MalissP_ChessyCat) && ssChessyCat) return 60; + if (c.IsCode(CardId.MalissP_MarchHare) && ssMarchHare) return 60; + + if (c.IsCode(CardId.BackupIgnister)) return 20; + if (c.IsCode(CardId.WizardIgnister)) return 20; + return 30; + } + private ClientCard PickGYCyberseForWicckidCost_Safe() + { + var gy = (Bot.Graveyard ?? new List()) + .Where(IsCyberse) + .ToList(); + if (gy.Count == 0) return null; + + ClientCard best = null; + int bestScore = int.MinValue; + foreach (var c in gy) + { + int sc = Score_WicckidCost(c); + if (sc > bestScore) { best = c; bestScore = sc; } + } + return best; + } + private bool BlockAccesscodeOnT1() + { + bool blocked = (Duel.Player == 0 && Duel.Turn == 1); + return blocked; + } + private bool Allied_OnSummonTrigger() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + var me = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.AlliedCodeTalkerIgnister)); + if (me == null) return false; + + bool has2300 = Bot.Graveyard.Any(c => c != null && c.IsMonster() && c.HasRace(CardRace.Cyberse) && c.Attack == 2300); + if (!has2300) return false; + + var prefer = new List { + CardId.MalissQ_RedRansom, + CardId.MalissQ_WhiteBinder, + CardId.TranscodeTalker + }; + AI.SelectCard(prefer.ToArray()); + return true; + } + private bool ShouldSummonTranscode() + { + bool haveSplashGY = Bot.HasInGraveyard(CardId.SplashMage); + bool haveRR = Bot.HasInMonstersZone(CardId.MalissQ_RedRansom); + bool haveL1 = Bot.HasInMonstersZone(CardId.LinkDecoder) || Bot.HasInGraveyard(CardId.LinkDecoder); + + return haveSplashGY && (haveRR || haveL1); + } + private bool Step_SplashToRR() + { + if (_didSplashToRR) return false; + if (Bot.HasInMonstersZone(CardId.LinkDecoder)) return false; + + if (!Bot.HasInExtra(CardId.MalissQ_RedRansom)) return false; + + var mats = PickLinkMatsMinCount( + targetLink: 2, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.CyberseWicckid } + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + + _didSplashToRR = true; + return true; + } + private bool Step_SplashToWB() + { + if (_didSplashToRR) return false; + + if (!Bot.HasInExtra(CardId.MalissQ_WhiteBinder)) return false; + + var mats = PickLinkMatsMinCount( + targetLink: 2, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.CyberseWicckid } + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + + _didSplashToRR = true; + return true; + } + private bool Step_RRtoWicckid() + { + if(enemyActivateLancea) return false; + if (blockWicckid) return true; + if (!_didSplashToRR || _didRRtoWicckid) return false; + if (!Bot.HasInExtra(CardId.CyberseWicckid)) return false; + + var rr = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.MalissQ_RedRansom)); + if (rr == null) return false; + var emzOccupant = Bot.GetMonsters().FirstOrDefault(m => m != null && m != rr && IsInEMZ(m)); + var buddy = emzOccupant ?? Bot.MonsterZone.FirstOrDefault(m => m != null && m != rr); + if (buddy == null) return false; + bool emzWillBeFree = HasFreeEMZ() || IsInEMZ(rr) || IsInEMZ(buddy); + if (!emzWillBeFree) return false; + AI.SelectCard(CardId.CyberseWicckid); + AI.SelectMaterials(new List { rr, buddy }); + wantLinkedToWicckid = true; + _preferWicckidArrows = true; + _didRRtoWicckid = true; + return true; + } + private bool Step2N_RRtoWicckid() + { + if (enemyActivateLancea) return false; + if (blockWicckid) return false; + var rr = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.MalissQ_RedRansom)); + if (rr == null) return false; + var emzOccupant = Bot.GetMonsters().FirstOrDefault(m => m != null && m != rr && IsInEMZ(m)); + var buddy = emzOccupant ?? Bot.MonsterZone.FirstOrDefault(m => m != null && m != rr); + if (buddy == null) return false; + bool emzWillBeFree = HasFreeEMZ() || IsInEMZ(rr) || IsInEMZ(buddy); + if (!emzWillBeFree) return false; + AI.SelectCard(CardId.CyberseWicckid); + AI.SelectMaterials(new List { rr, buddy }); + wantLinkedToWicckid = true; + _preferWicckidArrows = true; + _didRRtoWicckid = true; + return true; + } + private bool Step_SummonLinkDecoderToWicckid() + { + if (!_didRRtoWicckid || _didSummonToWicckidArrow) return false; + + var wic = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.CyberseWicckid)); + if (wic == null) return false; + + _preferWicckidArrows = true; + avoidLinkedZones = false; + + return true; + } + private bool Step1_SSLinkDecoder() + { + if ((Bot.HasInMonstersZone(CardId.MalissP_Dormouse) || + Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit) || + Bot.HasInMonstersZone(CardId.MalissP_ChessyCat) || + Bot.HasInMonstersZone(CardId.BackupIgnister)) && Bot.GetMonsterCount() == 1 && Bot.HasInHand(CardId.MalissP_MarchHare)) + { + return true; + } + return false; + } + private bool IsMalissMonster(ClientCard c) => c != null && c.IsMonster() && c.HasSetcode(0x1bf); + private bool CanMakeLinkNWithFlexibleTwo(ClientCard a, ClientCard b, int target) + { + int a1 = 1, aL = (a != null && a.HasType(CardType.Link)) ? Math.Max(1, a.LinkCount) : 1; + int b1 = 1, bL = (b != null && b.HasType(CardType.Link)) ? Math.Max(1, b.LinkCount) : 1; + return (a1 + b1 == target) || (a1 + bL == target) || (aL + b1 == target) || (aL + bL == target); + } + private bool Step_WicckidPlusOneToWB() + { + const int WB_LINK = 3; + if (!Bot.HasInExtra(CardId.MalissQ_WhiteBinder)) return false; + + var wic = GetWicckid(); + if (wic != null) + { + var partners = Bot.GetMonsters() + .Where(m => m != null && m.IsFaceup() && m != wic && m.HasType(CardType.Effect)) + .ToList(); + + Func okPair = p => (IsMalissMonster(p) || IsMalissMonster(wic)) && CanMakeLinkNWithFlexibleTwo(wic, p, WB_LINK); + + var p2 = partners.FirstOrDefault(p => !p.IsCode(CardId.MalissQ_RedRansom) && okPair(p)) + ?? partners.FirstOrDefault(p => p.IsCode(CardId.MalissQ_RedRansom) && okPair(p)); + + if (p2 != null) + { + AI.SelectMaterials(new List { wic, p2 }); + _didWBFromWicckid = true; + EnsureFinishPlanAfterWB(); + return true; + } + } + + var mats = PickLinkMatsMinCount( + targetLink: WB_LINK, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 3, + avoidIds: new[] { CardId.Apollousa, CardId.FirewallDragon, CardId.AlliedCodeTalkerIgnister }, + requireMaliss: true + ); + if (mats.Count == 0) return false; + + AI.SelectMaterials(mats); + _didWBFromWicckid = true; + EnsureFinishPlanAfterWB(); + return true; + } + private void EnsureFinishPlanAfterWB() + { + if (_finishPlanDecided) return; + + int free = Bot.MonsterZone.Count(m => m != null && !m.IsCode(CardId.MalissQ_RedRansom)); + bool canFW = Bot.HasInExtra(CardId.FirewallDragon); + bool canHC = Bot.HasInExtra(CardId.MalissQ_HeartsCrypter); + bool canAll = Bot.HasInExtra(CardId.AlliedCodeTalkerIgnister); + bool reachAllied = CanReachAlliedNow(); + + if (canFW && canHC && canAll && free >= 3 && reachAllied) + _finishPlan = FinishPlan.FW_HC_Allied; + else if (canHC && canAll && free >= 2 && reachAllied) + _finishPlan = FinishPlan.HC_Allied; + else + _finishPlan = FinishPlan.AlliedOnly; + + _finishPlanDecided = true; + } + private bool ssFromHandMH() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Hand) return false; + if (GetMMZCount() > 3) return false; + if (enemyActivateLancea) return false; + + if (Duel.Player == 0) + { + var gy = Bot.Graveyard.GetMatchingCards(c => c != null && c.HasSetcode(0x1bf) && c != Card).ToList(); + + Func, ClientCard> pickP1 = (src) => + { + int[] pref = { + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_HeartsCrypter, + CardId.MalissQ_RedRansom + }; + foreach (var id in pref) + { + var c = src.FirstOrDefault(x => x.HasType(CardType.Monster) && x.Id == id && QueenSelfSS_AvailableId(x.Id)); + if (c != null) return c; + } + return src.FirstOrDefault(x => x.HasType(CardType.Monster) && QueenSelfSS_AvailableId(x.Id)); + }; + ClientCard pick = pickP1(gy); + if (pick == null) return false; + AI.SelectCard(pick); + ssMarchHare = true; + return DontSelfNG(); + } + else + { + if (Bot.HasInGraveyard(CardId.MalissQ_WhiteBinder) && !ssWBThisTurn) + { + var Target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissQ_WhiteBinder)); + if (Target == null) return false; + AI.SelectCard(Target); + } + else if (Bot.HasInGraveyard(CardId.MalissQ_HeartsCrypter) && !ssHCThisTurn) + { + var Target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissQ_HeartsCrypter)); + if (Target == null) return false; + AI.SelectCard(Target); + } + else if (Bot.HasInGraveyard(CardId.MalissQ_RedRansom) && !ssRRThisTurn) + { + var Target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissQ_RedRansom)); + if (Target == null) return false; + AI.SelectCard(Target); + } + else + { + return false; + } + + ssMarchHare = true; + return DontSelfNG(); + } + } + private bool Step1_MH_FromHand() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Hand) return false; + if (Bot.GetMonsterCount() > 1) return false; + if (enemyActivateLancea) return false; + + if (Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit) && Bot.HasInGraveyard(CardId.MalissC_MTP07)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissC_MTP07)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + if (Bot.HasInMonstersZone(CardId.LinkDecoder) && Bot.HasInGraveyard(CardId.MalissP_Dormouse)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissP_Dormouse)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + if (Bot.HasInMonstersZone(CardId.LinkDecoder) && Bot.HasInGraveyard(CardId.MalissP_WhiteRabbit)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissP_WhiteRabbit)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + if (Bot.HasInMonstersZone(CardId.LinkDecoder) && Bot.HasInGraveyard(CardId.MalissP_ChessyCat)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissP_ChessyCat)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + if (Bot.HasInMonstersZone(CardId.Linguriboh) && Bot.HasInGraveyard(CardId.MalissP_MarchHare)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissP_MarchHare)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + + return false; + } + private bool returnFromBanish() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Removed) return false; + + var mh = Bot.Banished.GetFirstMatchingCard( + c => c.IsFaceup() && c.IsCode(CardId.MalissP_MarchHare)); + + if (mh == null) return false; + + AI.SelectCard(mh); + ActiveMarchHare = true; + return true; + } + private bool WB_OnSummon_BanishGY() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + + const int MAX_PICKS = 3; + var picks = new List(); + + if (Duel.Player == 0) + { + int freeMMZ = Math.Max(0, 5 - GetMMZCount()); + int myPawnCount = Bot.Graveyard + .GetMatchingCards(g => IsMalissPawn(g)) + .Count; + bool canUseOwnPawn = myPawnCount > 1; + + if (!ActiveMarchHare && canUseOwnPawn) + { + var mh = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_MarchHare)); + if (mh != null) picks.Add(mh); + } + + if (freeMMZ > 0 && !ssRRThisTurn && !Allied_End) + { + var rr = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissQ_RedRansom)); + if (rr != null && !picks.Contains(rr) && !ShouldSkipBanishing(rr)) + { picks.Add(rr); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssHCThisTurn && !Allied_End) + { + var hc = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissQ_HeartsCrypter)); + if (hc != null && !picks.Contains(hc) && !ShouldSkipBanishing(hc)) + { picks.Add(hc); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssWhiteRabbit && !Allied_End && canUseOwnPawn) + { + var wr = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_WhiteRabbit)); + if (wr != null && !picks.Contains(wr) && !ShouldSkipBanishing(wr)) + { picks.Add(wr); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssDormouse && !Allied_End && canUseOwnPawn) + { + var dm = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_Dormouse)); + if (dm != null && !picks.Contains(dm) && !ShouldSkipBanishing(dm)) + { picks.Add(dm); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssChessyCat && !Allied_End && canUseOwnPawn) + { + var cc = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_ChessyCat)); + if (cc != null && !picks.Contains(cc) && !ShouldSkipBanishing(cc)) + { picks.Add(cc); freeMMZ--; } + } + + if (freeMMZ >= 0 && canUseOwnPawn) + { + var target = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_ChessyCat) || g.IsCode(CardId.MalissP_Dormouse)); + picks.Add(target); + } + + picks = picks.Where(c => c != null).Distinct().Take(MAX_PICKS).ToList(); + + var threats = PickEnemyGYThreats(MAX_PICKS - picks.Count); + foreach (var t in threats) + { + if (picks.Count >= MAX_PICKS) break; + if (!picks.Contains(t)) picks.Add(t); + } + } + else + { + int freeMMZ = Math.Max(0, 5 - GetMMZCount()); + + if (!Bot.HasInSpellZone(CardId.MalissC_MTP07) && freeMMZ > 0 && !ssWhiteRabbit) + { + var wr = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_WhiteRabbit)); + if (wr != null) { picks.Add(wr); freeMMZ--; } + } + + if (picks.Count >= 0 && !Bot.HasInHand(CardId.MalissP_MarchHare) && !ActiveMarchHare) + { + var mh = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_MarchHare)); + if (mh != null) picks.Add(mh); + } + + if (freeMMZ > 0 && !ssRRThisTurn) + { + var rr = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissQ_RedRansom)); + if (rr != null && !picks.Contains(rr) && !ShouldSkipBanishing(rr)) + { picks.Add(rr); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssHCThisTurn) + { + var hc = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissQ_HeartsCrypter)); + if (hc != null && !picks.Contains(hc) && !ShouldSkipBanishing(hc)) + { picks.Add(hc); freeMMZ--; } + } + + var threats = PickEnemyGYThreats(MAX_PICKS - picks.Count); + foreach (var t in threats) + { + if (picks.Count >= MAX_PICKS) break; + if (!picks.Contains(t)) picks.Add(t); + } + } + + if (picks.Count == 0) return false; + + if (picks.Count > MAX_PICKS) picks = picks.Take(MAX_PICKS).ToList(); + if (picks.Count < MAX_PICKS) + { + var more = PickEnemyGYThreats(MAX_PICKS - picks.Count); + foreach (var t in more) + if (!picks.Contains(t)) picks.Add(t); + } + AI.SelectCard(picks); + return true; + } + private bool IsMalissPawn(ClientCard c) + { + return c != null && ( + c.IsCode(CardId.MalissP_ChessyCat) || + c.IsCode(CardId.MalissP_WhiteRabbit) || + c.IsCode(CardId.MalissP_Dormouse) || + c.IsCode(CardId.MalissP_MarchHare) + ); + } + private List PickEnemyGYThreats(int need) + { + var result = new List(); + if (need <= 0) return result; + + var danger = GetDangerousCardinEnemyGrave(false); + foreach (var c in danger) + { + if (result.Count >= need) break; + if (!result.Contains(c)) result.Add(c); + } + + if (result.Count < need) + { + for (int i = Enemy.Graveyard.Count - 1; i >= 0 && result.Count < need; i--) + { + var c = Enemy.Graveyard[i]; + if (c == null) continue; + if (!result.Contains(c)) result.Add(c); + } + } + + if (result.Count < need) + { + foreach (var c in Enemy.Graveyard) + { + if (result.Count >= need) break; + if (!result.Contains(c)) result.Add(c); + } + } + + return result; + } + private bool WB_OnBanished_SelfSS() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Removed) return false; + if (GetMMZCount() >= 5) return false; + if (Bot.LifePoints <= 900) + { + return false; + } + AI.SelectYesNo(true); + ssWBThisTurn = true; + return true; + } + private int PickMalissTrapForWB() + { + if (CheckRemainInDeck(CardId.MalissC_GWC06) > 0 || Bot.HasInGraveyard(CardId.MalissC_GWC06)) + return CardId.MalissC_GWC06; + + if (CheckRemainInDeck(CardId.MalissC_MTP07) > 0 || Bot.HasInGraveyard(CardId.MalissC_MTP07)) + return CardId.MalissC_MTP07; + + return 0; + } + private bool WB_SetMalissTrap() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (ActivateDescription != Util.GetStringId(CardId.MalissQ_WhiteBinder, 1)) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + + + SelectSafeSTZoneAwayFromImperm(); + return true; + } + private List PickLinkMatsMinCount(int targetLink, + Func isEligible, + int minCount, + int maxCount, + IEnumerable avoidIds = null, + bool requireMaliss = false) + { + int LinkValOf(ClientCard m) => m.HasType(CardType.Link) ? Math.Max(1, m.LinkCount) : 1; + bool IsOneVal(ClientCard m) => !m.HasType(CardType.Link) || Math.Max(1, m.LinkCount) == 1; + + var all = Bot.GetMonsters() + .Where(m => m != null && m.IsFaceup() && isEligible(m)) + .ToList(); + if (all.Count < minCount) return new List(); + + var avoid = new HashSet(avoidIds ?? Enumerable.Empty()); + + List OrderForFirst(IEnumerable src) => src.OrderByDescending(LinkValOf) + .ThenBy(m => avoid.Contains(m.Id) ? 1 : 0) + .ThenBy(m => m.Attack) + .ToList(); + + List OrderForLater(IEnumerable src) => src.OrderBy(m => IsOneVal(m) ? 0 : 1) + .ThenBy(m => m.HasType(CardType.Link) ? (Math.Max(1, m.LinkCount) == 1 ? 0 : 1) : -1) + .ThenBy(LinkValOf) + .ThenBy(m => avoid.Contains(m.Id) ? 1 : 0) + .ThenBy(m => m.Attack) + .ToList(); + + var poolPreferred = all.Where(m => !avoid.Contains(m.Id)).ToList(); + var poolFallback = all.ToList(); + + int firstMaxAllowed = targetLink - Math.Max(0, minCount - 1); + + List TryPick(List pool) + { + var chosen = new List(); + bool Dfs(List avail, int sum) + { + if (sum > targetLink || chosen.Count > maxCount) return false; + + if (chosen.Count >= minCount && sum == targetLink) + { + if (requireMaliss && !chosen.Any(IsMalissBody)) return false; + if (Util.GetBotAvailZonesFromExtraDeck(chosen) == 0) return false; + return true; + } + + int need = Math.Max(0, minCount - chosen.Count); + if (sum + need > targetLink) return false; + + var ordered = (chosen.Count == 0) + ? OrderForFirst(avail) + : OrderForLater(avail); + + for (int i = 0; i < ordered.Count; i++) + { + var m = ordered[i]; + var nextAvail = ordered.Where((x, idx) => idx != i).ToList(); + int lv = LinkValOf(m); + + int[] values = (chosen.Count == 0) + ? (lv > 1 ? new[] { Math.Min(lv, firstMaxAllowed), 1 } : new[] { 1 }) + : (lv > 1 ? new[] { 1, lv } : new[] { 1 }); + + foreach (var v in values.Distinct()) + { + int newSum = sum + v; + if (newSum > targetLink) continue; + + int remMin = Math.Max(0, minCount - (chosen.Count + 1)); + if (newSum + remMin > targetLink) continue; + + chosen.Add(m); + if (Dfs(nextAvail, newSum)) return true; + chosen.RemoveAt(chosen.Count - 1); + } + } + return false; + } + + if (Dfs(OrderForFirst(pool), 0)) return chosen; + return null; + } + + var pick = TryPick(poolPreferred); + if (pick != null && pick.Count > 0) return pick; + + pick = TryPick(poolFallback); + return pick ?? new List(); + } + private bool Link_Apo() + { + if (!(Bot.HasInMonstersZone(CardId.MalissQ_RedRansom) && + Bot.HasInMonstersZone(CardId.LinkDecoder))) return false; + + + var mats = PickLinkMatsMinCount( + targetLink: 4, + isEligible: m => m.HasType(CardType.Monster), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.TranscodeTalker, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker } + ); + if (mats.Count == 0) return false; + AI.SelectMaterials(mats); + blockWicckid = true; + return true; + } + private bool Flow3_Link_Firewall() + { + if (Bot.HasInMonstersZone(CardId.MalissQ_HeartsCrypter) && Bot.HasInMonstersZone(CardId.LinkDecoder) && Bot.HasInMonstersZone(CardId.CyberseWicckid)) + { + var mats = PickLinkMatsMinCount( + targetLink: 4, + isEligible: m => m.HasType(CardType.Monster), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.CyberseWicckid, CardId.Apollousa, CardId.TranscodeTalker, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker } + ); + if (mats.Count == 0) return false; + AI.SelectMaterials(mats); + return true; + } + return false; + } + private bool Step_LinkSummon_HeartsCrypter() + { + if((Bot.HasInMonstersZone(CardId.MalissQ_WhiteBinder) && Bot.HasInMonstersZone(CardId.MalissQ_RedRansom) && + Bot.HasInMonstersZone(CardId.Apollousa) && Bot.GetMonsterCount() < 5)) return false; + var cand = Bot.GetMonsters() + .Where(c => c != null && c.IsFaceup() && c.HasType(CardType.Effect)) + .ToList(); + if (cand.Count < 3) return false; + + bool IsMaliss(ClientCard m) => m.HasSetcode(0x1bf); + + var avoid = new HashSet { CardId.CyberseWicckid, CardId.Apollousa, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker, CardId.FirewallDragon, CardId.TranscodeTalker }; + + var ordered = cand + .OrderBy(m => avoid.Contains(m.Id) ? 2 : 0) + .ThenBy(m => m.HasType(CardType.Link) ? 1 : 0) + .ThenBy(m => m.Attack) + .ToList(); + + List mats = ordered.Take(3).ToList(); + if (!mats.Any(IsMaliss)) + { + var maliss = ordered.FirstOrDefault(IsMaliss); + if (maliss == null) return false; + mats[2] = maliss; + } + + if (Util.GetBotAvailZonesFromExtraDeck(mats) == 0) return false; + AI.SelectMaterials(mats); + return true; + } + private bool HC_Quick_ReturnBanished_AndBanishField() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (ActivateDescription != Util.GetStringId(CardId.MalissQ_HeartsCrypter, 0)) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (CheckWhetherNegated()) return false; + + RefreshNoChainWindows(); + + var banishedMaliss = GetBanishedMaliss(); + if (banishedMaliss.Count == 0) return false; + bool haveReturn = banishedMaliss.Count > 0; + + bool mustNow = GetProblematicEnemyCardList( + canBeTarget: true, + selfType: CardType.Monster | CardType.Spell | CardType.Trap + ).Count > 0; + + if (Duel.Player == 0) + { + if (!haveReturn && !mustNow) return false; + } + else + { + if (!mustNow && !IsPreferredRemovalTiming()) return false; + } + + if (!haveReturn) return false; + var ret = PickBanishedMalissForHC(banishedMaliss); + if (ret == null) return false; + + var fieldTargets = GetProblematicEnemyCardList(true, selfType: CardType.Monster | CardType.Spell | CardType.Trap); + if (fieldTargets.Count == 0) + { + var any = GetBestEnemyCard(false, true); + if (any != null) fieldTargets.Add(any); + } + if (fieldTargets.Count == 0) return false; + + AI.SelectCard(ret); + AI.SelectNextCard(fieldTargets); + ConsumePreferredWindow(); + return DontSelfNG(); + } + private List GetBanishedMaliss() + { + return Bot.Banished.GetMatchingCards(c => + c != null && c.IsFaceup() && c.HasSetcode(0x1bf)).ToList(); + } + private ClientCard PickBanishedMalissForHC(List cand) + { + cand = cand + .Where(c => !c.IsCode(CardId.MalissQ_WhiteBinder) && !c.IsCode(CardId.MalissQ_RedRansom)) + .ToList(); + if (cand.Count == 0) return null; + + int Score(ClientCard c) + { + if (c.IsCode(CardId.MalissInTheMirror)) return 100; + if (c.IsCode(CardId.MalissC_MTP07)) return 95; + if (c.IsCode(CardId.MalissC_GWC06)) return 90; + if (c.IsCode(CardId.MalissInUnderground)) return 85; + if (c.IsCode(CardId.MalissP_MarchHare)) return 80; + if (c.IsCode(CardId.MalissP_ChessyCat)) return 75; + if (c.IsCode(CardId.MalissP_WhiteRabbit)) return 70; + if (c.IsCode(CardId.MalissP_Dormouse)) return 65; + return 50; + } + return cand.OrderByDescending(Score).First(); + } + private bool HC_OnBanished_SpecialSummon() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Removed) return false; + + if (GetMMZCount() >= 5) + { + return false; + } + + if (Bot.LifePoints <= 900) + { + return false; + } + + AI.SelectYesNo(true); + ssHCThisTurn = true; + return true; + } + private bool HasMalissLinkFaceup() + { + return Bot.GetMonsters().Any(c => c != null && c.IsFaceup() && c.HasSetcode(0x1bf) && c.HasType(CardType.Link)); + } + private bool CanReachAlliedNow() + { + var mats = PickLinkMatsMinCount( + targetLink: 5, + isEligible: m => m.HasType(CardType.Effect), + minCount: 3, + maxCount: 5, + avoidIds: new[] { CardId.Apollousa, CardId.FirewallDragon, CardId.AccesscodeTalker } + ); + return mats.Count > 0; + } + private bool Flow3_Link_Allied() + { + if (!(Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_RedRansom) && Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_WhiteBinder))) return false; + var mats = PickLinkMatsMinCount( + targetLink: 5, + isEligible: m => m.HasType(CardType.Effect), + minCount: 3, + maxCount: 5, + avoidIds: new[] { CardId.Apollousa, CardId.FirewallDragon, CardId.AccesscodeTalker } + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + Allied_End = true; + return true; + } + private bool Emer_Allied() + { + if(!enemyActivateLancea) return false; + if (!(Bot.HasInMonstersZone(CardId.TranscodeTalker) && Bot.HasInMonstersZone(CardId.SplashMage))) return false; + var mats = PickLinkMatsMinCount( + targetLink: 5, + isEligible: m => m.HasType(CardType.Effect), + minCount: 3, + maxCount: 3 + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + Allied_End = true; + return true; + } + private bool Emer_Allied2() + { + var myMonsters = Bot.GetMonsters().Where(m => m != null).ToList(); + if (myMonsters.Count != 3) return false; + + var link3List = myMonsters + .Where(m => m.HasType(CardType.Link) && m.LinkCount == 3) + .ToList(); + + if (link3List.Count != 1) return false; + + bool haveKeyInGY = + Bot.HasInGraveyard(CardId.MalissQ_RedRansom) || + Bot.HasInGraveyard(CardId.MalissQ_WhiteBinder) || + Bot.HasInGraveyard(CardId.TranscodeTalker); + + if (!haveKeyInGY) return false; + + var mats = PickLinkMatsMinCount( + targetLink: 5, + isEligible: m => m.HasType(CardType.Effect), + minCount: 3, + maxCount: 3 + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + Allied_End = true; + return true; + } + private ClientCard FindGWC06TargetByOrder(params int[] ids) + { + foreach (var id in ids) + { + var gy = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(id)); + if (gy != null) return gy; + + var ban = Bot.Banished.GetFirstMatchingCard(c => c != null && c.IsCode(id) && c.IsFaceup()); + if (ban != null) return ban; + } + return null; + } + private int PickGWC06CostCandidateId() + { + if (Bot.HasInMonstersZone(CardId.MalissQ_WhiteBinder) && !ssWBThisTurn) + return CardId.MalissQ_WhiteBinder; + if (Bot.HasInMonstersZone(CardId.MalissQ_RedRansom) && !ssRRThisTurn) + return CardId.MalissQ_RedRansom; + + int card = PickTB11CostCandidateId(); + if (card != 0) return card; + + return 0; + } + private ClientCard PickGWC06TargetExtend() + { + if (Duel.Turn > 2) + { + return FindGWC06TargetByOrder( + CardId.MalissQ_HeartsCrypter, + CardId.MalissQ_RedRansom, + CardId.MalissQ_WhiteBinder + ); + } + else { + return FindGWC06TargetByOrder( + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_RedRansom, + CardId.MalissQ_HeartsCrypter, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_Dormouse, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare + ); + } + } + private bool GWC06_MyTurn_Extend() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Duel.Player == 0 && + GetMMZCount() >= 4 && + Bot.HasInMonstersZone(CardId.FirewallDragon) && + (Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_RedRansom) || + Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_WhiteBinder) || + Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_HeartsCrypter))) return false; + if (Duel.Player != 0) return false; + if (!(Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2)) return false; + if (CheckSpellWillBeNegate()) return false; + if (GetMMZCount() >= 5) return false; + if (!Bot.HasInMonstersZone(CardId.MalissQ_WhiteBinder) && !(Bot.HasInMonstersZone(CardId.MalissQ_RedRansom) && Bot.GetMonsterCount() == 1)) return false; + var target = PickGWC06TargetExtend(); + if (target == null) return false; + if (gwc06SetThisTurn) + { + int costId = PickGWC06CostCandidateId(); + if (costId == 0) return false; + AI.SelectCard(costId); + AI.SelectNextCard(target); + return DontSelfNG(); + } + AI.SelectCard(target); + return DontSelfNG(); + } + private bool GWC06_OppTurn_ReviveWB_HC() + { + if (Duel.Player != 1) return false; + if (!Bot.HasInSpellZone(CardId.MalissC_GWC06)) return false; + if (CheckSpellWillBeNegate()) return false; + if (GetMMZCount() >= 5) return false; + + var target = FindGWC06TargetByOrder( + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_HeartsCrypter + ); + if (target == null) return false; + + if (gwc06SetThisTurn) + { + int costId = PickGWC06CostCandidateId(); + if (costId == 0) return false; + AI.SelectCard(costId); + AI.SelectNextCard(target); + return DontSelfNG(); + } + + AI.SelectCard(target); + return DontSelfNG(); + } + private static int FirstBit(int mask) + { + for (int i = 0; i < 32; i++) + { + int b = 1 << i; + if ((mask & b) != 0) return b; + } + return 0; + } + private static int FirstBitFromOrder(int mask, int[] order) + { + foreach (var b in order) + if ((mask & b) != 0) return b; + return FirstBit(mask); + } + private int PreferSafeSummonZones(int available) + { + int MAIN_MASK = + (int)Zones.z0 | + (int)Zones.z1 | + (int)Zones.z2 | + (int)Zones.z3 | + (int)Zones.z4; + + int emzMask = available & ~MAIN_MASK; + + if (emzMask != 0) + return FirstBit(emzMask); + + int enemyPointed = 0; + try + { + enemyPointed = Enemy.GetLinkedZones(); + } + catch { } + + int safeMain = (available & MAIN_MASK) & ~enemyPointed; + + if (safeMain != 0) + { + return FirstBitFromOrder( + safeMain, + new[] { (int)Zones.z2, (int)Zones.z1, (int)Zones.z3, (int)Zones.z0, (int)Zones.z4 } + ); + } + + return FirstBit(available); + } + private int PickMTP07CostCandidateId() + { + return PickTB11CostCandidateId(); + } + private ClientCard PickMTP07EnemyRemovalTarget() + { + var list = GetProblematicEnemyCardList(canBeTarget: true, ignoreSpells: false, selfType: CardType.Trap); + if (list.Count > 0) return list[0]; + + var m = GetBestEnemyMonster(onlyFaceup: false, canBeTarget: true); + if (m != null) return m; + + var s = GetBestEnemySpell(onlyFaceup: false, canBeTarget: true); + if (s != null) return s; + + return Enemy.GetMonsters().FirstOrDefault(c => c != null) + ?? Enemy.GetSpells().FirstOrDefault(c => c != null); + } + private bool MTP07_ForMH() + { + if (!(Bot.GetMonsterCount() == 1 && Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit))) return false; + if (CheckSpellWillBeNegate()) return false; + if (CheckWhetherNegated()) return false; + + int searchId = PickMTP07SearchId(); + if (searchId == 0) return false; + + if (mtp07SetThisTurn) + { + int costId = PickMTP07CostCandidateId(); + if (costId == 0) return false; + AI.SelectCard(costId); + } + AI.SelectNextCard(searchId); + return DontSelfNG(); + } + private bool MTP07_OppTurn_RemoveEnemyOnly() + { + if (Duel.Player != 1) return false; + if (!HasMalissLinkFaceup()) return false; + if (CheckSpellWillBeNegate()) return false; + if (CheckWhetherNegated()) return false; + var urgent = GetProblematicEnemyCardList(canBeTarget: true, ignoreSpells: false, selfType: CardType.Trap); + if (urgent.Count == 0 && !IsPreferredRemovalTiming()) return false; + bool preBattle = Duel.Phase == DuelPhase.Main1 && Enemy.GetMonsterCount() > 0; + if (urgent.Count == 0 && !(IsPreferredRemovalTiming() || preBattle)) return false; + int searchId = PickMTP07SearchId(); + if (searchId == 0) return false; + ClientCard target = null; + if (urgent.Count > 0) + { + target = urgent[0]; + } + else if (preBattle) + { + target = Enemy.MonsterZone + .Where(c => c != null && c.IsFaceup()) + .OrderByDescending(c => c.Attack) + .FirstOrDefault(); + } + else + { + target = PickMTP07EnemyRemovalTarget(); + } + if (target == null) return false; + if (mtp07SetThisTurn) + { + int costId = PickMTP07CostCandidateId(); + if (costId == 0) return false; + AI.SelectCard(costId); + AI.SelectNextCard(searchId); + AI.SelectNextCard(target); + ConsumePreferredWindow(); + return DontSelfNG(); + } + AI.SelectCard(searchId); + AI.SelectNextCard(target); + ConsumePreferredWindow(); + return DontSelfNG(); + } + private bool Emergency_NS() + { + if (usedNormalSummon) return false; + if (Bot.GetMonsterCount() != 0) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) + || Bot.HasInHand(CardId.MalissP_ChessyCat) + || Bot.HasInHand(CardId.GoldSarcophagus) || Bot.HasInHand(CardId.MalissInUnderground)) return false; + if (!Bot.HasInHand(CardId.BackupIgnister)) return false; + usedNormalSummon = true; + nsplan = true; + return true; + } + private bool IsWicInEMZ(ClientCard wic) + { + return wic != null + && wic.Location == CardLocation.MonsterZone + && (wic.Sequence == EMZ_LEFT || wic.Sequence == EMZ_RIGHT); + } + private IEnumerable GetWicDownSeq(ClientCard wic) + { + if (!IsWicInEMZ(wic)) yield break; + if (wic.Sequence == EMZ_LEFT) { yield return 1; yield return 2; } + if (wic.Sequence == EMZ_RIGHT) { yield return 3; yield return 4; } + } + private bool IsUnderWic(ClientCard wic, ClientCard m) + { + if (wic == null || m == null) return false; + if (m.Controller != wic.Controller) return false; + if (m.Location != CardLocation.MonsterZone) return false; + if (m.Sequence < 0 || m.Sequence > 4) return false; + return GetWicDownSeq(wic).Contains(m.Sequence); + } + private ClientCard PickUnderlingForTranscode(ClientCard wic, System.Collections.Generic.IList pool) + { + if (!IsWicInEMZ(wic)) return null; + var underlings = pool.Where(x => x != null && x != wic && x.IsFaceup() + && x.Location == CardLocation.MonsterZone + && x.Controller == wic.Controller + && x.Sequence >= 0 && x.Sequence <= 4 + && IsUnderWic(wic, x) + && (x.HasType(CardType.Link) || x.HasType(CardType.Effect)) + && !x.HasType(CardType.Token)) + .ToList(); + + if (underlings.Count == 0) return null; + + var preferLD = underlings.FirstOrDefault(x => x.IsCode(CardId.LinkDecoder)); + if (preferLD != null) return preferLD; + return underlings + .OrderByDescending(x => x.HasType(CardType.Link) ? 2 : 1) + .ThenByDescending(x => x.Attack) + .FirstOrDefault(); + } + private static readonly int[] PreferCenterMainSeq = new[] { 2, 1, 3, 0, 4 }; + + private bool SummonTranscode() + { + if (!enemyActivateLancea) return false; + var wic = Bot.GetMonsters().FirstOrDefault( + x => x != null && x.IsFaceup() && x.IsCode(CardId.CyberseWicckid)); + + if (!IsWicInEMZ(wic)) return false; + + var under = PickUnderlingForTranscode(wic, Bot.GetMonsters()); + if (under == null) return false; + + SelectLinkMaterialsPair(wic, under); + + int emz = EmzBitFor(wic); + if (emz != 0) AI.SelectPlace(emz); + + return true; + } + private void SelectLinkMaterialsPair(ClientCard a, ClientCard b) + { + try + { + var mats = new System.Collections.Generic.List { a, b }; + AI.SelectMaterials(mats); + return; + } + catch { } + + AI.SelectCard(a); + AI.SelectNextCard(b); + } + private int EmzBitFor(ClientCard link) + { + if (link == null || link.Location != CardLocation.MonsterZone) return 0; + if (link.Sequence == EMZ_LEFT) return 1 << EMZ_LEFT; // 1<<5 + if (link.Sequence == EMZ_RIGHT) return 1 << EMZ_RIGHT; // 1<<6 + return 0; + } + int ChooseAndRememberWicckidEmz(int available) + { + int emzAvail = available & EMZ_ALL; + if (emzAvail == 0) return 0; + + int best = 0; + int bestScore = int.MinValue; + + foreach (int emz in new[] { EMZ_L, EMZ_R }) + { + if ((emzAvail & emz) == 0) continue; + + int score = 0; + int down = DownBitOfEmz(emz); + + if (down == MZ1 && IsMainFreeSeq(1)) score += 10; + if (down == MZ3 && IsMainFreeSeq(3)) score += 10; + + if (score > bestScore) + { + bestScore = score; + best = emz; + } + } + + if (best == 0) + best = (emzAvail & EMZ_L) != 0 ? EMZ_L : EMZ_R; + + _wicckidEmzBit = best; + return best; + } + bool IsMainFreeSeq(int seq) + { + var ms = Bot.MonsterZone.GetMonsters(); + var occupied = ms.Any(m => m != null && m.Controller == 0 && m.Sequence == seq); + return !occupied; + } + int DownBitOfEmz(int emzBit) + { + if (emzBit == EMZ_L) return MZ1; + if (emzBit == EMZ_R) return MZ3; + return 0; + } + private bool IsPreferredRemovalTiming() + { + if (Duel.Player != 1) return false; + if (_prefWindowTTL > 0) return true; + if (_oppJustActivatedPersistentSpell || _oppJustSummoned || _oppJustSet) return true; + + return false; + } + private void ConsumePreferredWindow() + { + _prefWindowTTL = 0; + _oppJustActivatedPersistentSpell = false; + _oppJustSummoned = false; + _oppJustSet = false; + } + private void RefreshNoChainWindows() + { + bool oppMain = (Duel.Player == 1) && (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2); + + int curMon = Enemy.GetMonsterCount(); + if (curMon > _enemyMonsterCountSnap) + { + _oppJustSummoned = true; + if (oppMain) _prefWindowTTL = Math.Max(_prefWindowTTL, 2); + } + _enemyMonsterCountSnap = curMon; + + int curFD = Enemy.SpellZone.Count(c => c != null && c.IsFacedown()); + if (curFD > _enemyFacedownSTSnap) + { + _oppJustSet = true; + if (oppMain) _prefWindowTTL = Math.Max(_prefWindowTTL, 2); + } + _enemyFacedownSTSnap = curFD; + + if (oppMain) + { + if (_prefWindowTTL > 0) _prefWindowTTL--; + if (_prefWindowTTL == 0) + { + _oppJustActivatedPersistentSpell = false; + _oppJustSummoned = false; + _oppJustSet = false; + } + } + else + { + _prefWindowTTL = 0; + _oppJustActivatedPersistentSpell = false; + _oppJustSummoned = false; + _oppJustSet = false; + } + } + private bool FirewallBounce_OnOppSummon() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (ActivateDescription != Util.GetStringId(CardId.FirewallDragon, 0)) + return false; + + if (Duel.LastSummonPlayer != 1) + return false; + + var picks = new List(); + + var negateList = GetMonsterListForTargetNegate(); + if (negateList != null) + { + foreach (var c in negateList) + { + if (c == null) continue; + if (c.Controller != 1) continue; + if (!c.IsMonster()) continue; + if (!c.IsFaceup()) continue; + if (!picks.Contains(c)) + picks.Add(c); + } + } + foreach (var m in Enemy.GetMonsters().OrderByDescending(x => x.Attack)) + { + if (m == null) continue; + if (!m.IsMonster()) continue; + if (!m.IsFaceup()) continue; + if (!picks.Contains(m)) + picks.Add(m); + } + + if (picks.Count == 0) + return false; + + AI.SelectCard(picks); + return true; + } + private bool Accesscode_OnSummon_AtkUp() + { + var list = new List(); + int[] prefer = { + CardId.MalissQ_HeartsCrypter, + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_RedRansom, + CardId.TranscodeTalker + }; + foreach (var id in prefer) + { + var hit = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(id)); + if (hit != null) list.Add(hit); + } + + AI.SelectCard(list); + return true; + } + + private bool Accesscode_Destroy_Ignition() + { + if (ActivateDescription != Util.GetStringId(CardId.AccesscodeTalker, 1)) + return false; + + if (Enemy.GetFieldCount() == 0) + return false; + + IEnumerable costPool = + (Bot.GetGraveyardMonsters() ?? Enumerable.Empty()) + .Where(c => c.HasType(CardType.Link)) + .Concat((Bot.GetMonsters() ?? Enumerable.Empty()) + .Where(c => c.HasType(CardType.Link) && c != Card)); + + var costList = costPool + .OrderBy(c => c.Location != CardLocation.Grave) + .ThenBy(c => c.LinkCount) + .ThenBy(c => c.Attack) + .ToList(); + + if (costList.Count == 0) + return false; + + var targets = new List(); + + targets.AddRange(Enemy.GetSpells() + .Where(s => s != null && s.IsFacedown())); + targets.AddRange(Enemy.GetSpells() + .Where(s => s != null && !s.IsFacedown())); + targets.AddRange(Enemy.GetMonsters() + .OrderByDescending(m => m.Attack)); + + if (targets.Count == 0) + return false; + + AI.SelectCard(costList); + AI.SelectNextCard(targets); + + return true; + } + private bool AlreadySSFromBanishThisTurn(ClientCard c) + { + if (c == null) return false; + if (c.Controller != 0) return false; + + if (c.IsCode(CardId.MalissP_Dormouse)) return ssDormouse; + if (c.IsCode(CardId.MalissP_WhiteRabbit)) return ssWhiteRabbit; + if (c.IsCode(CardId.MalissP_ChessyCat)) return ssChessyCat; + + if (c.IsCode(CardId.MalissQ_RedRansom)) return ssRRThisTurn; + if (c.IsCode(CardId.MalissQ_HeartsCrypter)) return ssHCThisTurn; + if (c.IsCode(CardId.MalissQ_WhiteBinder)) return ssWBThisTurn; + + return false; + } + private bool ShouldSkipBanishing(ClientCard c) + { + if (c == null) return true; + if (c.Controller != 0) return false; + if (AlreadySSFromBanishThisTurn(c)) return true; + if (c.IsCode(CardId.MalissP_MarchHare) && ActiveMarchHare) return true; + return false; + } + private bool DescIs(int cardId, params int[] idx) + { + if (ActivateDescription == -1) return true; + foreach (var i in idx) + if (ActivateDescription == Util.GetStringId(cardId, i)) return true; + return false; + } + + private ClientCard PickMirrorCostCandidate() + { + int[] handPref = { + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_Dormouse, + CardId.MalissP_MarchHare + }; + foreach (var id in handPref) + { + var h = Bot.Hand.GetFirstMatchingCard(c => c != null && c.IsCode(id)); + if (h != null) return h; + } + + var fieldP = Bot.GetMonsters() + .Where(c => c != null && c.HasSetcode(0x1bf) && !c.HasType(CardType.Link)) + .OrderBy(c => c.Attack).FirstOrDefault(); + if (fieldP != null) return fieldP; + + int[] avoid = { + CardId.MalissQ_HeartsCrypter, CardId.MalissQ_WhiteBinder, CardId.MalissQ_RedRansom + }; + var weakLink = Bot.GetMonsters() + .Where(c => c != null && c.HasSetcode(0x1bf) && c.HasType(CardType.Link) && !avoid.Contains(c.Id)) + .OrderBy(c => c.Attack).FirstOrDefault(); + return weakLink; + } + + private int[] Mirror_SearchOrderForType(bool isTrap, bool isMon) + { + if (isTrap) + return new[] { CardId.MalissC_GWC06, CardId.MalissC_MTP07 }; + if (isMon) + { + if (!Bot.HasInHand(CardId.MalissP_WhiteRabbit) && NSDorMouse) + { + return new[] { CardId.MalissP_WhiteRabbit, CardId.MalissP_MarchHare, CardId.MalissP_Dormouse, CardId.MalissP_ChessyCat }; + } + else + { + return new[] { CardId.MalissP_MarchHare, CardId.MalissP_Dormouse, CardId.MalissP_WhiteRabbit, CardId.MalissP_ChessyCat }; + } + } + return new[] { CardId.MalissP_MarchHare, CardId.MalissP_Dormouse, CardId.MalissP_WhiteRabbit, CardId.MalissP_ChessyCat }; + } + + private ClientCard PickMirrorGYTargetForSearch() + { + if (NSDorMouse && !ssRRThisTurn) + { + var rr = Bot.Graveyard.GetFirstMatchingCard( + c => c != null && c.IsCode(CardId.MalissQ_RedRansom)); + + if (rr != null) + return rr; + } + int[] monPref = { CardId.MalissP_MarchHare, CardId.MalissP_Dormouse, CardId.MalissP_WhiteRabbit, CardId.MalissP_ChessyCat }; + foreach (var id in monPref) + { + var m = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(id)); + if (m != null && CheckRemainInDeck(id) > 0) return m; + } + return null; + } + private int PickMTP07SearchId() + { + if (CheckRemainInDeck(CardId.MalissP_MarchHare) > 0) + return CardId.MalissP_MarchHare; + + int[] pawnPref = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat + }; + foreach (var id in pawnPref) + if (CheckRemainInDeck(id) > 0) return id; + + return 0; + } + private void SelectSafeSTZoneAwayFromImperm() + { + var safeCols = Enumerable.Range(0, 5) + .Where(seq => + { + if (Bot.SpellZone[seq] != null) return false; + if (infiniteImpermanenceList.Contains(seq)) return false; + return true; + }) + .ToList(); + + if (safeCols.Count == 0) + { + safeCols = Enumerable.Range(0, 5) + .Where(seq => Bot.SpellZone[seq] == null) + .ToList(); + } + + int mask = 0; + foreach (int seq in safeCols) mask |= (1 << seq); + AI.SelectPlace(mask); + } + private bool T3Allow() + { + if (Duel.Player != 0) return false; + if (myTurnCount < 2) return false; + if (!HaveBackupOrWizardInHand() || !Bot.HasInHand(CardId.MalissP_MarchHare)) return false; + return true; + } + private bool NSBackup() + { + if (Bot.GetMonsterCount() != 0) return false; + if (usedNormalSummon) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) || Bot.HasInHand(CardId.MalissP_ChessyCat) || + Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.GoldSarcophagus)) return false; + nsBackupplan = true; + return true; + } + private bool NSBackup_L() + { + if (Bot.GetMonsterCount() != 0) return false; + if (usedNormalSummon) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) || Bot.HasInHand(CardId.MalissP_ChessyCat) || + Bot.HasInHand(CardId.MalissP_MarchHare) || Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.GoldSarcophagus)) return false; + nsLanceaplan = true; + return true; + } + + private bool NSMH() + { + int mhCount = Bot.Hand.GetMatchingCards(c => c != null && c.IsCode(CardId.MalissP_MarchHare)).Count; + if (mhCount <2 ) return false; + if (Bot.GetMonsterCount() != 0) return false; + if (usedNormalSummon) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) || Bot.HasInHand(CardId.MalissP_ChessyCat) || + Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.GoldSarcophagus)) return false; + return true; + } + private bool LinguribohMHLine() + { + if (!(Bot.HasInHand(CardId.MalissP_MarchHare) && Bot.HasInMonstersZone(CardId.MalissP_MarchHare))) return false; + if (Bot.GetMonsterCount() != 1) return false; + return true; + } + private bool EmerTranscode() + { + if (!enemyActivateLancea) return false; + if (Bot.GetMonsterCount() < 3) return false; + var mats = PickLinkMatsMinCount( + targetLink: 3, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 2 + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + return true; + } + #endregion + + // ======================= END OF LIFE ==================== + } +} diff --git a/WindBot.csproj b/WindBot.csproj index af5e94f7c..3a304aaa8 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -68,6 +68,7 @@ + From 5a6135f1ede9b4dc49fe0c24d8ee4fce205fcba6 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Tue, 10 Feb 2026 14:42:25 +0800 Subject: [PATCH 066/110] update bot list --- BotWrapper/bot.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 2192b9d0a..4f4e5642a 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -139,6 +139,11 @@ Name=复制梁龙 Deck=Ryzeal Dialog=anothercopy.zh-CN 初代雷火沸动卡组。 AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +!复制梁龙-码丽丝 +Name=复制梁龙 Deck=Maliss Dialog=anothercopy.zh-CN +MD全盛码丽丝卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + !VI-1911-凭依装着 Name=VI-1911 Deck=FamiliarPossessed Dialog=VI-1911.zh-CN 凭依装着卡组。 From 0f214df0637f4a75aaff2d73b5b22919947d03ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=8A=E6=99=9A=E6=9C=89=E5=AE=B5=E5=A4=9C=E5=90=97?= <130654339+jwyxym@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:42:30 +0800 Subject: [PATCH 067/110] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A0=81=E4=B8=BD?= =?UTF-8?q?=E4=B8=9DOCG=20Bot=20(#220)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BotWrapper/bot.conf | 5 + Decks/AI_MalissOCG.ydk | 59 ++ Dialogs/Xiaoye.zh-CN.json | 50 + Game/AI/Decks/MalissOCGExecutor.cs | 1480 ++++++++++++++++++++++++++++ WindBot.csproj | 1 + 5 files changed, 1595 insertions(+) create mode 100644 Decks/AI_MalissOCG.ydk create mode 100644 Dialogs/Xiaoye.zh-CN.json create mode 100644 Game/AI/Decks/MalissOCGExecutor.cs diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 4f4e5642a..4b43e6887 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -268,3 +268,8 @@ AI_LV4 SUPPORT_MASTER_RULE_2020 Name=今晚有宵夜吗 Deck=SuperheavySamurai Dialog=superheavysamurai.zh-CN 超重武者卡组。 AI_LV4 SUPPORT_MASTER_RULE_2020 + +!今晚有宵夜吗-码丽丝 +Name=今晚有宵夜吗 Deck=MalissOCG Dialog=Xiaoye.zh-CN +码丽丝卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 \ No newline at end of file diff --git a/Decks/AI_MalissOCG.ydk b/Decks/AI_MalissOCG.ydk new file mode 100644 index 000000000..a28077bfa --- /dev/null +++ b/Decks/AI_MalissOCG.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +91800273 +91800273 +42141493 +42141493 +42141493 +3723262 +96676583 +96676583 +30118811 +30118811 +69272449 +69272449 +69272449 +32061192 +32061192 +32061192 +20938824 +20938824 +20938824 +14558128 +14558128 +14558128 +23434538 +23434538 +75500286 +24224830 +24224830 +93453053 +68337209 +68337209 +68337209 +10045474 +10045474 +10045474 +20726052 +40366667 +40366667 +40366667 +57111661 +94722358 +#extra +64211118 +39138610 +9940036 +9940036 +92422871 +92422871 +92422871 +21848500 +68059897 +95454996 +46947713 +59859086 +9763474 +52698008 +30342076 +!side diff --git a/Dialogs/Xiaoye.zh-CN.json b/Dialogs/Xiaoye.zh-CN.json new file mode 100644 index 000000000..71a984e89 --- /dev/null +++ b/Dialogs/Xiaoye.zh-CN.json @@ -0,0 +1,50 @@ +{ + "welcome": [ + "嘿,我迷路了,你也是吗?", + "哦,别怕,我只是路过的", + "没事的,我也不擅长这套卡组" + ], + "deckerror": [ + "{0}的数量不对!我不能少了它!。", + "去开个无禁限好吗,我的{0}被禁了" + ], + "duelstart": [ + "诶呀,友好切磋而已啦", + "啊嘞,这就开始了吗" + ], + "newturn": [ + "抽卡!发牌姬快来助我", + "抽卡!哦,我这一定是被发牌姬算计了!" + ], + "endturn": [ + "一人一个回合,很公平吧", + "哦差点忘了,你也要玩游戏王" + ], + "directattack": [ + "{0},直接攻击!", + "欸嘿,就打就打就打" + ], + "attack": [ + "{0},去攻击 {1}" + ], + "ondirectattack": [ + "怎么还打我!太过分了!", + "你不许打我!" + ], + "facedownmonstername": "怪兽", + "activate": [ + " 此刻,我要发动 {0} 的效果", + "欸,我的 {0} 亮了,点一下" + ], + "summon": [ + "这是我引以为傲的怪兽 {0}", + "锵锵!{0} 登场!" + ], + "setmonster": [], + "chaining": [ + "欸,这是什么,点一下" + ], + "custom": [ + "这卡明显是其他卡组送进去的,看我干什么" + ] +} diff --git a/Game/AI/Decks/MalissOCGExecutor.cs b/Game/AI/Decks/MalissOCGExecutor.cs new file mode 100644 index 000000000..6863df58f --- /dev/null +++ b/Game/AI/Decks/MalissOCGExecutor.cs @@ -0,0 +1,1480 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("MalissOCG", "AI_MalissOCG")] + public class MalissOCGExecutor : DefaultExecutor + { + public class SetCode + { + public const int Maliss = 0x1bf; + } + public class CardId + { + public const int Artifact_Lancea = 34267821;//古遗物-圣枪 + public const int Dimension_Shifter = 91800273; //大宇宙人 + public const int MaxxG = 23434538; //增殖的G + public const int Mulcharmy_Fuwalos = 42141493; //欢聚友伴·茸茸长尾山雀 + public const int Infinite_Impermanence = 10045474; //无限泡影 + public const int Dominus_Impulse = 40366667; //灵王的波动 + public const int AshBlossom = 14558127; //灰流丽 + public const int CalledbytheGrave = 24224830; //墓穴的指名 + public const int Gold_Sarcophagus = 75500286; //封印之黄金柜 + public const int Wizard_Ignister = 3723262; //男巫@火灵天星 + public const int Backup_Ignister = 30118811; //备份员@火灵天星 + public const int Maliss_Chessy_Cat = 96676583; //码丽丝<兵卒>柴郡猫 + public const int Maliss_White_Rabbit = 69272449; //码丽丝<兵卒>白兔 + public const int Maliss_Dormouse = 32061192; //码丽丝<兵卒>睡鼠 + public const int Maliss_March_Hare = 20938824; //码丽丝<兵卒>三月兔 + public const int Maliss_in_the_Mirror = 93453053; //码丽丝镜中奇像 + public const int Maliss_in_Underground = 68337209; //码丽丝梦游地下界 + public const int Maliss_GWC_06 = 20726052; //码丽丝<代码>GWC-06 + public const int Maliss_TB_11 = 57111661; //码丽丝<代码>TB-11 + public const int Maliss_MTP_07 = 94722358; //码丽丝<代码>MTP-07 + + public const int Mereologic_Aggregator = 9940036; + public const int Cyberse_Desavewurm = 92422871; + public const int Allied_Code_Talker_Ignister = 39138610; //协心代码语者@火灵天星 + public const int Firewall_Dragon = 64211118; //防火龙·暗流体-新电磁泄密风 + public const int Accesscode_Talker = 86066372; //访问码语者 + public const int Maliss_Hearts_Crypter = 21848500; //码丽丝<王后>红心加密 + public const int Maliss_Red_Ransom = 68059897; //码丽丝<王后>红棋勒索 + public const int Maliss_White_Binder = 95454996; //码丽丝<王后>白棋捆绑 + public const int Transcode_Talker = 46947713; //转码语者 + public const int Splash_Mage = 59859086; //飞溅闪屏法师 + public const int Haggard_Lizardose = 9763474; //盛悴之致命毒蜥 + public const int Cyberse_Wicckid = 52698008; //电子界小男巫 + public const int Link_Decoder = 30342076; //连接解码员 + } + + public CardCount Count = new CardCount(); + public MalissOCGExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.GoToBattlePhase, GoToBattlePhase); + AddExecutor(ExecutorType.Activate, CardId.Dimension_Shifter, Effect_Enemy_Turn); + AddExecutor(ExecutorType.Activate, CardId.Mulcharmy_Fuwalos, Effect_Enemy_Turn); + AddExecutor(ExecutorType.Activate, CardId.MaxxG, Effect_Enemy_Turn); + AddExecutor(ExecutorType.Activate, CardId.Infinite_Impermanence, Effect_Infinite_Impermanence); + AddExecutor(ExecutorType.Activate, CardId.AshBlossom, DefaultAshBlossomAndJoyousSpring); + AddExecutor(ExecutorType.Activate, CardId.Dominus_Impulse, Effect_Enemy_Chain); + AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, DefaultCalledByTheGrave); + AddExecutor(ExecutorType.Activate, CardId.Maliss_White_Rabbit, Effect_White_Rabbit); + AddExecutor(ExecutorType.Activate, CardId.Haggard_Lizardose, Effect_Haggard_Lizardose); + AddExecutor(ExecutorType.Activate, CardId.Splash_Mage); + AddExecutor(ExecutorType.Activate, CardId.Cyberse_Wicckid); + AddExecutor(ExecutorType.Activate, CardId.Cyberse_Desavewurm); + AddExecutor(ExecutorType.Activate, CardId.Transcode_Talker); + AddExecutor(ExecutorType.Activate, CardId.Mereologic_Aggregator, Effect_Mereologic_Aggregator); + AddExecutor(ExecutorType.Activate, CardId.Firewall_Dragon, Effect_Firewall_Dragon); + AddExecutor(ExecutorType.Activate, CardId.Allied_Code_Talker_Ignister, Effect_Allied_Code_Talker_Ignister); + AddExecutor(ExecutorType.Activate, CardId.Maliss_White_Binder, Effect_Maliss_Link); + AddExecutor(ExecutorType.Activate, CardId.Maliss_Red_Ransom, Effect_Maliss_Link); + AddExecutor(ExecutorType.Activate, CardId.Maliss_Hearts_Crypter, Effect_Maliss_Hearts_Crypter); + AddExecutor(ExecutorType.Activate, CardId.Link_Decoder); + + AddExecutor(ExecutorType.Summon, CardId.Maliss_Dormouse, Summon_Maliss_Dormouse); + AddExecutor(ExecutorType.Summon, CardId.Maliss_White_Rabbit, Summon_Maliss_White_Rabbit); + AddExecutor(ExecutorType.Summon, CardId.Maliss_Chessy_Cat, Summon_Maliss_Chessy_Cat); + AddExecutor(ExecutorType.Summon, CardId.Backup_Ignister, Summon_Backup_Ignister); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_Dormouse, Effect_Maliss_Dormouse); + + AddExecutor(ExecutorType.SpSummon, CardId.Maliss_Red_Ransom, SP_Maliss_Link); + AddExecutor(ExecutorType.SpellSet, SpellSet_Maliss); + AddExecutor(ExecutorType.Activate, CardId.Maliss_Chessy_Cat, Effect_Maliss_Chessy_Cat); + + AddExecutor(ExecutorType.SpSummon, CardId.Splash_Mage, SP_Splash_Mage); + AddExecutor(ExecutorType.SpSummon, CardId.Haggard_Lizardose, SP_Haggard_Lizardose); + AddExecutor(ExecutorType.SpSummon, CardId.Link_Decoder, SP_Link_Decoder); + + AddExecutor(ExecutorType.SpSummon, CardId.Cyberse_Wicckid, SP_Cyberse_Wicckid); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_in_Underground, Effect_Remove); + AddExecutor(ExecutorType.Activate, CardId.Gold_Sarcophagus, Effect_Remove); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_TB_11, Effect_Maliss_TB_11); + AddExecutor(ExecutorType.Activate, CardId.Maliss_MTP_07, Effect_Maliss_MTP_07); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_March_Hare, Effect_Maliss_March_Hare); + AddExecutor(ExecutorType.Activate, CardId.Backup_Ignister); + AddExecutor(ExecutorType.Activate, CardId.Wizard_Ignister, Effect_Wizard_Ignister); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_in_the_Mirror, Effect_Maliss_in_the_Mirror); + + AddExecutor(ExecutorType.SpSummon, CardId.Maliss_Hearts_Crypter, SP_Maliss_Hearts_Crypter); + AddExecutor(ExecutorType.SpSummon, CardId.Maliss_White_Binder, SP_Maliss_White_Binder); + AddExecutor(ExecutorType.Activate, CardId.Maliss_GWC_06, Effect_Maliss_GWC_06); + AddExecutor(ExecutorType.SpSummon, CardId.Firewall_Dragon, SP_Firewall_Dragon); + AddExecutor(ExecutorType.SpSummon, CardId.Allied_Code_Talker_Ignister, SP_Allied_Code_Talker_Ignister); + AddExecutor(ExecutorType.SpellSet, CardId.Maliss_in_the_Mirror); + AddExecutor(ExecutorType.SpSummon, CardId.Transcode_Talker, SP_Transcode_Talker); + AddExecutor(ExecutorType.SpellSet, SpellSet); + } + + public class CardCount + { + public int Dimension_Shifter = 0; + public int Summon = 0; + public int Phase = 0; + public List Activate = new List(); + public List ActivateRemoved = new List(); + public List Position = new List(); + public List Set = new List(); + public List Oppo = new List(); + public void Clear() + { + Activate.Clear(); + ActivateRemoved.Clear(); + Position.Clear(); + Set.Clear(); + Oppo.Clear(); + if (Dimension_Shifter > 0) + Dimension_Shifter --; + if (Summon > 0) + Summon --; + } + public void AddActivateOppo(int id) + { + Oppo.Add(id); + } + public bool CheckActivateOppo(int id) + { + return !Oppo.Contains(id); + } + public void AddSummon() + { + Summon = 1; + } + public void AddCard(int id) + { + if (id == CardId.Dimension_Shifter) + Dimension_Shifter = 2; + else + Activate.Add(id); + } + public void AddSet(int id) + { + Set.Add(id); + } + public bool CheckSet(int id) + { + return !Set.Contains(id); + } + public void AddCardRemoved(int id) + { + ActivateRemoved.Add(id); + } + public void AddPosition(int id) + { + Position.Add(id); + } + public void AddPhase() + { + Phase ++; + } + public bool CheckCard(int id) + { + if (id == CardId.Dimension_Shifter) + return Dimension_Shifter == 0; + else + return !Activate.Contains(id); + } + public bool CheckCardRemoved(int id) + { + return !ActivateRemoved.Contains(id); + } + public bool CheckPosition(int id) + { + return !Position.Contains(id); + } + public int CheckPhase() + { + return Phase; + } + public bool CheckSummon() + { + return Summon == 0; + } + } + public override void OnNewTurn() + { + Count.AddPhase(); + Count.Clear(); + base.OnNewTurn(); + } + public override void OnChaining(int player, ClientCard card) + { + if (card.Id == CardId.Dimension_Shifter || card.Id == CardId.Artifact_Lancea) + Count.AddCard(card.Id); + else if (player == 0) + if (card.Location == CardLocation.Removed) + Count.AddCardRemoved(card.Id); + else + Count.AddCard(card.Id); + if (player == 1) + Count.AddActivateOppo(card.Id); + } + public override void OnChainEnd() + { + if (DefaultCheckWhetherCardIdIsNegated(CardId.Dimension_Shifter) && !Count.CheckCard(Card.Id)) + Count.Dimension_Shifter = 0; + Count.Oppo.Clear(); + } + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.Maliss_White_Binder, 3)) + return true; + if (desc == Util.GetStringId(CardId.Maliss_MTP_07, 3)) + return Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && (i.HasType(CardType.Field | CardType.Continuous | CardType.Equip) || i.IsFacedown())) > 0; + return base.OnSelectYesNo(desc); + } + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + if (new List{CardId.Maliss_Red_Ransom, CardId.Splash_Mage}.Contains(cardId)) + AI.SendCustomChat(0); + + if (new List{CardId.Cyberse_Wicckid, CardId.Allied_Code_Talker_Ignister}.Contains(cardId)) + { + if ((Zones.z6 & available) > 0 && (Bot.MonsterZone[3] == null || Bot.MonsterZone[4] == null)) return Zones.z6; + if ((Zones.z5 & available) > 0 && (Bot.MonsterZone[0] == null || Bot.MonsterZone[1] == null)) return Zones.z5; + } + if (Bot.HasInMonstersZone(CardId.Cyberse_Wicckid) && Count.CheckCard(CardId.Cyberse_Wicckid)) + { + int seq = 0; + for (int i = 0; i < 7; ++i) + if (Bot.MonsterZone[i] != null && Bot.MonsterZone[i].IsCode(CardId.Cyberse_Wicckid)) seq = i; + if (seq == 5) + { + if ((Zones.z1 & available) > 0) return Zones.z1; + if ((Zones.z2 & available) > 0) return Zones.z2; + } + else if (seq == 6) + { + if ((Zones.z3 & available) > 0) return Zones.z3; + if ((Zones.z4 & available) > 0) return Zones.z4; + } + } + if (cardId == CardId.Transcode_Talker) + { + if ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] == null) return Zones.z6; + if ((Zones.z5 & available) > 0 && Bot.MonsterZone[1] == null) return Zones.z5; + if ((Zones.z0 & available) > 0 && Bot.MonsterZone[1] == null) return Zones.z0; + if ((Zones.z1 & available) > 0 && Bot.MonsterZone[2] == null) return Zones.z1; + if ((Zones.z2 & available) > 0 && Bot.MonsterZone[3] == null) return Zones.z2; + if ((Zones.z3 & available) > 0 && Bot.MonsterZone[4] == null) return Zones.z3; + } + if (cardId == CardId.Allied_Code_Talker_Ignister) + { + var zones = new Dictionary<(int zone, ClientCard[] chk_zone), int>(); + var updates = new Dictionary<(int zone, ClientCard[] chk_zone), int>(); + zones[(Zones.z0, new ClientCard[] { Bot.MonsterZone[1] })] = 0; + zones[(Zones.z1, new ClientCard[] { Bot.MonsterZone[0], Bot.MonsterZone[2] })] = 0; + zones[(Zones.z2, new ClientCard[] { Bot.MonsterZone[1], Bot.MonsterZone[3] })] = 0; + zones[(Zones.z3, new ClientCard[] { Bot.MonsterZone[2], Bot.MonsterZone[4] })] = 0; + zones[(Zones.z4, new ClientCard[] { Bot.MonsterZone[3] })] = 0; + zones[(Zones.z5, new ClientCard[] { Bot.MonsterZone[0], Bot.MonsterZone[1], Bot.MonsterZone[2] })] = 0; + zones[(Zones.z6, new ClientCard[] { Bot.MonsterZone[2], Bot.MonsterZone[3], Bot.MonsterZone[4] })] = 0; + foreach (var entry in zones) + { + if ((entry.Key.zone & available) == 0) + continue; + + ClientCard[] checkZone = entry.Key.chk_zone; + int nullCount = checkZone.Count(card => card == null); + updates[entry.Key] = nullCount; + } + var maxEntry = updates.OrderByDescending(entry => entry.Value).FirstOrDefault(); + if (maxEntry.Key != default) + { + var (zone, checkZone) = maxEntry.Key; + return zone; + } + } + if ((Zones.z6 & available) > 0) return Zones.z6; + if ((Zones.z5 & available) > 0) return Zones.z5; + } + return base.OnSelectPlace(cardId, player, location, available); + } + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (AI.HaveSelectedCards()) return null; + ClientCard card = Duel.GetCurrentSolvingChainCard(); + if (card == null) + card = Card; + switch (card.Id) + { + case CardId.Maliss_White_Rabbit: + if (cards.Any(i => i.Id == CardId.Maliss_TB_11) && Count.CheckCard(CardId.Maliss_TB_11)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_TB_11).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_GWC_06) && Count.CheckCard(CardId.Maliss_GWC_06)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_GWC_06).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_MTP_07) && Count.CheckCard(CardId.Maliss_MTP_07)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_MTP_07).ToList(), cards, min, max); + break; + case CardId.Maliss_in_Underground: + if (Count.CheckSummon()) + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse && i.Location == CardLocation.Deck) + && !Bot.HasInHand(CardId.Maliss_Dormouse) + && Check_Maliss_Dormouse() + && Count.CheckCardRemoved(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse && i.Location == CardLocation.Deck).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit && i.Location == CardLocation.Deck) + && !Bot.HasInHand(CardId.Maliss_White_Rabbit) + && Check_Maliss_White_Rabbit() + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit && i.Location == CardLocation.Deck).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare && i.Location == CardLocation.Deck) && Check_Maliss_March_Hare(CardLocation.Removed) && Count.CheckCard(CardId.Maliss_March_Hare)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat && i.Location == CardLocation.Deck) + && !Bot.HasInHand(CardId.Maliss_Chessy_Cat) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat && i.Location == CardLocation.Deck).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse && i.Location == CardLocation.Deck) + && Count.CheckCardRemoved(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit && i.Location == CardLocation.Deck) + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare && i.Location == CardLocation.Deck) && Check_Maliss_March_Hare(CardLocation.Removed) && Count.CheckCard(CardId.Maliss_March_Hare)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat && i.Location == CardLocation.Deck) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + + } + return Util.CheckSelectCount(cards.Where(i => i.Location == CardLocation.Deck).ToList(), cards, min, max); + case CardId.Gold_Sarcophagus: + if (Count.CheckSummon()) + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) + && !Bot.HasInHand(CardId.Maliss_Dormouse) + && Check_Maliss_Dormouse() + && Count.CheckCardRemoved(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && !Bot.HasInHand(CardId.Maliss_White_Rabbit) + && Check_Maliss_White_Rabbit() + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && !Bot.HasInHand(CardId.Maliss_Chessy_Cat) + && Check_Maliss_Chessy_Cat() + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) + && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) + && Count.CheckCardRemoved(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat) && Check_Maliss_Chessy_Cat()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + } + break; + case CardId.Maliss_Dormouse: + if (Count.CheckSummon()) + { + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && !Bot.HasInHand(CardId.Maliss_White_Rabbit) + && Check_Maliss_White_Rabbit() + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && !Bot.HasInHand(CardId.Maliss_Chessy_Cat) + && Check_Maliss_Chessy_Cat() + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat) && Check_Maliss_Chessy_Cat()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + } + break; + case CardId.Maliss_TB_11: + if (hint == HintMsg.SpSummon) + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) && Count.CheckCardRemoved(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Count.CheckCardRemoved(CardId.Maliss_March_Hare)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + } + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) && Count.CheckCard(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) && Count.CheckCard(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) && Count.CheckCard(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + } + else if (hint == HintMsg.Remove) + { + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasType(CardType.Link)).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + break; + case CardId.Maliss_MTP_07: + if (hint == HintMsg.AddToHand) + { + if (Duel.Player == 1 && cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Count.CheckCard(CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Hand)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) && Count.CheckCard(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) && Count.CheckCard(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) && Count.CheckCard(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + } + else if (hint == HintMsg.Remove) + { + if (cards.Any(i => i.Controller == 1)) + return Util.CheckSelectCount(cards.Where(i => i.Controller == 1).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasType(CardType.Link)).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + break; + case CardId.Splash_Mage: + case CardId.Haggard_Lizardose: + case CardId.Cyberse_Wicckid: + if (hint == HintMsg.Remove) + { + if (cards.Any(i => Count.CheckCard(i.Id) && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCard(i.Id) && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => i.Location == CardLocation.Grave).ToList(), cards, min, max); + } + else if (hint == HintMsg.SpSummon) + { + if (cards.Any(i => i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Target) + { + if (cards.Any(i => i.IsCode(CardId.Haggard_Lizardose))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Haggard_Lizardose)).ToList(), cards, min, max); + } + break; + case CardId.Maliss_Red_Ransom: + if (hint == HintMsg.AddToHand) + { + List chk_cards = Bot.Graveyard.ToList(); + chk_cards.AddRange(Bot.GetSpells()); + chk_cards.AddRange(Bot.Hand); + if (cards.Any(i => i.IsCode(CardId.Maliss_in_the_Mirror)) + && Check_Maliss_in_the_Mirror(CardLocation.Removed) + && chk_cards.Any(i => i.HasType(CardType.Trap)) + && (((Bot.HasInHand(CardId.Maliss_Chessy_Cat) && Count.CheckSummon()) || Bot.HasInMonstersZone(CardId.Maliss_Chessy_Cat)) && Count.CheckCard(CardId.Maliss_Chessy_Cat) + || Bot.HasInHand(CardId.Maliss_March_Hare) && Count.CheckCard(CardId.Maliss_March_Hare) + ) && Count.CheckCard(CardId.Maliss_in_the_Mirror) + ) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_in_the_Mirror)).ToList(), cards, min, max); + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_in_the_Mirror)).ToList(), cards, min, max); + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_in_Underground)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Remove) + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => !i.IsCode(CardId.Maliss_Chessy_Cat) && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => !i.IsCode(CardId.Maliss_Chessy_Cat) && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + } + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) + && Count.CheckCardRemoved(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat) && Check_Maliss_Chessy_Cat()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + } + break; + case CardId.Maliss_Chessy_Cat: + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (cards.Any(i => i.IsCode(CardId.Maliss_March_Hare)) && !Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss)) && !Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.IsCode(CardId.Maliss_in_the_Mirror)) && Check_Maliss_in_the_Mirror(CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.IsCode(CardId.Maliss_in_the_Mirror)).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + break; + case CardId.Maliss_White_Binder: + if (hint == HintMsg.Remove) + { + List result = new List(); + int ct = 5 - Bot.GetMonstersInMainZone().Count; + if (ct > 0 && Count.CheckCard(CardId.Allied_Code_Talker_Ignister)) + { + result.AddRange(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id) && i.Controller == 0 && i.HasType(CardType.Link))); + if (Duel.Player == 1) + result.AddRange(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id) && i.Controller == 0 && i.IsCode(CardId.Maliss_White_Rabbit))); + result.AddRange(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id) && i.Controller == 0 && i.HasType(CardType.Monster))); + result.AddRange(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id) && i.Controller == 0 && i.HasType(CardType.Spell))); + } + result.AddRange(cards.Where(i => i.Controller == 1)); + result.AddRange(cards.Where(i => TrashCards(i.Id, CardLocation.Grave))); + result.AddRange(cards.Where(i => !i.HasSetcode(SetCode.Maliss) && !i.HasType(CardType.Trap))); + result.AddRange(cards.Where(i => !i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Trap))); + if (result.Count() > max) + result = result.Take(max).ToList(); + if (result.Count() > 0) + return Util.CheckSelectCount(result, cards, result.Count(), result.Count()); + if (cards.Any(i => TrashCards(i.Id, CardLocation.Grave))) + return Util.CheckSelectCount(cards.Where(i => TrashCards(i.Id, CardLocation.Grave)).ToList(), cards, min, min); + + return Util.CheckSelectCount(cards, cards, min, min); + } + else if (hint == HintMsg.Set) + { + if (cards.Any(i => i.IsCode(CardId.Maliss_GWC_06))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_GWC_06)).ToList(), cards, min, max); + } + break; + case CardId.Maliss_March_Hare: + if (hint == HintMsg.AddToHand) + { + if (cards.Any(i => Count.CheckCard(i.Id) && i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCard(i.Id) && i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCard(i.Id) && !i.HasType(CardType.Link))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCard(i.Id) && !i.HasType(CardType.Link)).ToList(), cards, min, max); + if (cards.Any(i => !i.HasType(CardType.Link))) + return Util.CheckSelectCount(cards.Where(i => !i.HasType(CardType.Link)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Remove) + { + if (Duel.Player == 1) + { + if (Bot.GetMonstersInMainZone().Count() > 3) + { + if (cards.Any(i => i.HasType(CardType.Spell) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => i.HasType(CardType.Spell) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => !i.HasType(CardType.Link) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => !i.HasType(CardType.Link) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasType(CardType.Link) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasType(CardType.Link) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + } + } + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && !i.HasType(CardType.Trap) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && !i.HasType(CardType.Trap) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => !i.HasType(CardType.Trap) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => !i.HasType(CardType.Trap) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && !i.HasType(CardType.Trap))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && !i.HasType(CardType.Trap)).ToList(), cards, min, max); + } + break; + case CardId.Maliss_in_the_Mirror: + if (hint == HintMsg.Remove) + { + if (!cards.Any(i => i.Location != CardLocation.Grave)) + { + if (cards.Any(i => i.HasType(CardType.Trap)) && !Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.Maliss_GWC_06) && !Bot.HasInBanished(CardId.Maliss_GWC_06)) + return Util.CheckSelectCount(cards.Where(i => i.HasType(CardType.Trap)).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => i.IsCode(CardId.Maliss_Red_Ransom)) && Count.CheckCardRemoved(CardId.Maliss_Red_Ransom)) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_Red_Ransom)).ToList(), cards, min, max); + if (cards.Any(i => i.HasType(CardType.Link) && i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasType(CardType.Link) && i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + } + else if (hint == HintMsg.AddToHand) + { + if (cards.Any(i => i.IsCode(CardId.Maliss_GWC_06))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_GWC_06)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Disable) + { + if (cards.Contains(Util.GetLastChainCard())) + return Util.CheckSelectCount(new List() { Util.GetLastChainCard() }, cards, min, max); + } + break; + case CardId.Maliss_GWC_06: + if (hint == HintMsg.Remove) + { + if (cards.Any(i => Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + else if (hint == HintMsg.SpSummon) + { + if (cards.Any(i => i.IsCode(CardId.Maliss_White_Binder) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_White_Binder) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => i.HasType(CardType.Link) && !Count.CheckCardRemoved(i.Id) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => i.HasType(CardType.Link) && !Count.CheckCardRemoved(i.Id) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + } + break; + case CardId.Mereologic_Aggregator: + if (cards.Any(i => i.Controller == 1 && Count.CheckActivateOppo(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.Controller == 1 && Count.CheckActivateOppo(i.Id)).ToList(), cards, min, max); + return Util.CheckSelectCount(cards.Where(i => i.Controller == 1).ToList(), cards, min, max); + case CardId.Firewall_Dragon: + if (Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget() && i.IsFaceup()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && i.HasType(CardType.Field | CardType.Continuous | CardType.Equip)) > 0 + && Duel.Player == 1 && cards.Any(i => i.IsCode(CardId.Mereologic_Aggregator)) + ) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Mereologic_Aggregator)).ToList(), cards, min, max); + if (cards.Any(i => i.IsCode(CardId.Cyberse_Desavewurm))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Cyberse_Desavewurm)).ToList(), cards, min, max); + return Util.CheckSelectCount(cards.Where(i => i.Location == CardLocation.Deck).ToList(), cards, min, max); + case CardId.Allied_Code_Talker_Ignister: + if (hint == HintMsg.SpSummon) + { + if (cards.Any(i => !i.IsCode(CardId.Maliss_White_Binder))) + return Util.CheckSelectCount(cards.Where(i => !i.IsCode(CardId.Maliss_White_Binder)).ToList(), cards, max, max); + return base.OnSelectCard(cards, max, max, hint, false); + } + else if (hint == HintMsg.Release) + { + if (cards.Any(i => i.LinkCount < 4)) + return Util.CheckSelectCount(cards.Where(i => i.LinkCount < 4).ToList(), cards, max, max); + } + break; + case CardId.Backup_Ignister: + if (hint == HintMsg.AddToHand) + { + if (card.Id == CardId.Dimension_Shifter || card.Id == CardId.Artifact_Lancea) + { + if (!Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)) + && cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)) + ) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (!Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)) + && cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)) + ) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + } + if (cards.Any(i => i.IsCode(CardId.Wizard_Ignister)) && Bot.Hand.Count() > 0 + && (Bot.Graveyard.Any(i => i.HasRace(CardRace.Cyberse)) + || (Bot.HasInExtra(CardId.Link_Decoder) && Bot.GetMonsters().Any(i => i.Level <= 4 && i.HasRace(CardRace.Cyberse)) && Count.CheckCard(CardId.Dimension_Shifter)) + || (Bot.HasInExtra(CardId.Haggard_Lizardose) + && !Count.CheckCard(CardId.Dimension_Shifter) + && Count.CheckCard(CardId.Artifact_Lancea) + && Bot.GetMonsters() + .Where(i => i.IsFaceup() && (!i.HasType(CardType.Link) || i.LinkCount < 2)).ToList() + .GroupBy(i => i.Id) + .Select(i => i.First()) + .Count() >= 2) + ) + ) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Wizard_Ignister)).ToList(), cards, min, max); + if (Bot.HasInHand(CardId.Maliss_March_Hare)) + { + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + else + if (cards.Any(i => i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Discard) + { + if (card.Id == CardId.Dimension_Shifter || card.Id == CardId.Artifact_Lancea) + { + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + if (Bot.HasInHand(CardId.Maliss_March_Hare) && !Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss))) + { + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Count(i => i.IsCode(CardId.Maliss_March_Hare)) > 1) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + } + if (cards.Any(i => TrashCards(i.Id, CardLocation.Hand))) + return Util.CheckSelectCount(cards.Where(i => TrashCards(i.Id, CardLocation.Hand)).ToList(), cards, min, max); + if (cards.Any(i => !i.HasType(CardType.Monster))) + return Util.CheckSelectCount(cards.Where(i => !i.HasType(CardType.Monster)).ToList(), cards, min, max); + if (cards.Any(i => !i.HasRace(CardRace.Cyberse))) + return Util.CheckSelectCount(cards.Where(i => !i.HasRace(CardRace.Cyberse)).ToList(), cards, min, max); + } + break; + case CardId.Wizard_Ignister: + if (cards.Any(i => i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + break; + case CardId.Maliss_Hearts_Crypter: + if (hint == HintMsg.Remove && cards.Any(i => i.Controller == 1)) + return Util.CheckSelectCount(cards.Where(i => i.Controller == 1).ToList(), cards, min, max); + break; + } + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + private bool TrashCards(int code, CardLocation loc) + { + if (loc == CardLocation.Grave) + { + List list = new List{ + CardId.MaxxG, + CardId.Artifact_Lancea, + CardId.Dimension_Shifter, + CardId.Mulcharmy_Fuwalos, + CardId.Infinite_Impermanence, + CardId.Dominus_Impulse, + CardId.AshBlossom, + CardId.CalledbytheGrave, + CardId.Gold_Sarcophagus, + + }; + return list.Contains(code); + } + else if (loc == CardLocation.Hand) + { + if (Bot.GetFieldCount() > 0 && code == CardId.Mulcharmy_Fuwalos) + return true; + if (Bot.Graveyard.Count > 0 && code == CardId.Dimension_Shifter) + return true; + } + return false; + } + private bool MonsterRepos() + { + if (!Enemy.GetMonsters().Any(i => i.IsDefense()) + && Util.GetTotalAttackingMonsterAttack(0) + Card.Attack >= Enemy.LifePoints + Util.GetTotalAttackingMonsterAttack(1) + && Card.IsDefense() + ) + return true; + return Card.IsFacedown(); + } + private bool SpellSet() + { + return Card.HasType(CardType.Trap | CardType.QuickPlay); + } + private bool SpellSet_Maliss() + { + return Card.HasType(CardType.Trap) && Card.HasSetcode(SetCode.Maliss) && Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss)); + } + private bool Effect_Enemy_Turn() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Id == CardId.Dimension_Shifter) + { + if (Duel.Player == 1 && Count.CheckCard(Card.Id)) + { + Count.AddCard(Card.Id); + return true; + } + } + return Duel.Player == 1; + } + private bool Effect_Enemy_Chain() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + ClientCard LastChainCard = Util.GetLastChainCard(); + return LastChainCard != null && LastChainCard.Controller == 1; + } + private bool Effect_Infinite_Impermanence() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (Count.CheckPosition(this_seq)) return false; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + Count.AddPosition(this_seq); + return true; + } + } + else + { + if (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone) + { + AI.SelectCard(LastChainCard); + return true; + } + } + return false; + } + private bool Effect_Maliss_Removed(int lp = 300) + { + int ct = 5 - Bot.GetMonstersInMainZone().Count; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.HasType(CardType.Monster) && !Card.IsCode(CardId.Maliss_March_Hare) + && ct - Duel.CurrentChain.Count(i => i.HasSetcode(SetCode.Maliss) + && i.Location == CardLocation.Removed + && i.HasType(CardType.Monster) + ) <= 0 + ) return false; + if (Bot.LifePoints > lp && Card.Location == CardLocation.Removed) + { + Count.AddCardRemoved(Card.Id); + return true; + } + return false; + } + private bool Effect_Maliss_Chessy_Cat() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (ActivateDescription == Util.GetStringId(CardId.Maliss_Chessy_Cat, 0)) + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) + && Count.CheckCardRemoved(i.Id) + && !i.HasType(CardType.Trap) + && (!i.IsCode(CardId.Maliss_in_the_Mirror) || Check_Maliss_in_the_Mirror(CardLocation.Removed)) + )) + { + Count.AddCard(Card.Id); + return true; + } + if (Bot.HasInHand(CardId.Maliss_March_Hare) && !Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss))) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + + if (Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) + && Count.CheckCardRemoved(i.Id) + && !i.HasType(CardType.Trap) + )) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + else + return Effect_Maliss_Removed(); + } + private bool Effect_Maliss_March_Hare() + { + if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.Allied_Code_Talker_Ignister)) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.Hand) + { + if (Duel.Player == 1 + && (!Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link)) + || Bot.GetMonstersInMainZone().Count() > 3) + ) + return false; + if (Bot.HasInMonstersZone(CardId.Maliss_Chessy_Cat) && Count.CheckCard(CardId.Maliss_Chessy_Cat)) + return false; + if (Check_Maliss_March_Hare(CardLocation.Hand)) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + else + return Effect_Maliss_Removed(); + } + private bool Effect_Maliss_Dormouse() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + Count.AddCard(Card.Id); + return true; + } + else + return Effect_Maliss_Removed(); + } + private bool Summon_Maliss_Chessy_Cat() + { + if (Check_Maliss_Chessy_Cat()) + { + Count.AddSummon(); + return true; + } + return false; + } + private bool Effect_White_Rabbit() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + Count.AddCard(Card.Id); + return true; + } + else + return Effect_Maliss_Removed(); + } + private bool Summon_Maliss_Dormouse() + { + if (Check_Maliss_Dormouse()) + { + Count.AddSummon(); + return true; + } + return false; + } + private bool Summon_Maliss_White_Rabbit() + { + if (Check_Maliss_White_Rabbit()) + { + Count.AddSummon(); + return true; + } + return false; + } + private bool Check_Maliss_in_the_Mirror(CardLocation loc) + { + if (loc == CardLocation.Removed) + { + if (!Count.CheckCard(CardId.Artifact_Lancea) || !Count.CheckCardRemoved(CardId.Maliss_March_Hare)) + return false; + List cards = Bot.Hand.ToList(); + cards.AddRange(Bot.GetMonsters()); + cards.AddRange(Bot.GetSpells()); + cards.AddRange(Bot.Graveyard); + cards.AddRange(Bot.Banished); + return Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) + && ( + (i.HasType(CardType.Monster) && cards.Count(j => j.HasType(CardType.Monster)) < 10) + || (i.HasType(CardType.Spell) && cards.Count(j => j.HasType(CardType.Spell)) < 4) + || (i.HasType(CardType.Trap) && cards.Count(j => j.HasType(CardType.Trap)) < 3) + ) + ); + } + else + { + List cards = Bot.Hand.GetMonsters(); + cards.AddRange(Bot.GetMonsters()); + return cards.Any(i => Count.CheckCardRemoved(i.Id)); + } + } + private bool Check_Maliss_Chessy_Cat() + { + return Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) + && !i.HasType(CardType.Trap) + && i != Card && Count.CheckCardRemoved(i.Id) + ) && Count.CheckCard(CardId.Maliss_Chessy_Cat); + } + private bool Check_Maliss_White_Rabbit() + { + return Bot.Graveyard.Count(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Trap)) < 3 + && Count.CheckCard(CardId.Maliss_White_Rabbit); + } + private bool Check_Maliss_Dormouse() + { + List cards = Bot.Hand.ToList(); + cards.AddRange(Bot.GetMonsters()); + cards.AddRange(Bot.GetSpells()); + cards.AddRange(Bot.Graveyard); + cards.AddRange(Bot.Banished); + return cards.Count(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster)) < 9 + && Count.CheckCard(CardId.Maliss_Dormouse); + } + private bool Check_Maliss_March_Hare(CardLocation loc) + { + if (loc == CardLocation.Removed) + { + if (!Count.CheckCard(CardId.Artifact_Lancea)) + return false; + return (Bot.Banished.Any(i => i.HasSetcode(SetCode.Maliss) + && i.HasType(CardType.Monster) + ) || Count.CheckCard(CardId.Maliss_March_Hare)) && Count.CheckCardRemoved(CardId.Maliss_March_Hare); + } + else + { + if (!Count.CheckCard(CardId.Artifact_Lancea)) + return false; + return Bot.Graveyard.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss)); + } + } + private bool Effect_Maliss_TB_11() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Bot.GetMonsterCount() > 1 + && (!Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) || !Bot.HasInMonstersZone(CardId.Maliss_White_Binder)) + ) + return false; + if (Bot.GetMonsters().Any(i => Count.CheckCardRemoved(i.Id))) + { + Count.AddCard(Card.Id); + return true; + } + if (Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) && Count.CheckCardRemoved(CardId.Maliss_Red_Ransom)) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + private bool Effect_Maliss_MTP_07() + { + if (Duel.LastChainPlayer == 0) return false; + if (DefaultCheckWhetherCardIsNegated(Card) || Duel.Player == 0 || Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && (i.HasType(CardType.Field | CardType.Continuous | CardType.Equip) || i.IsFacedown())) == 0 || !Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))) return false; + if (Bot.GetMonsterCount() > 1 + && (!Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) || !Bot.HasInMonstersZone(CardId.Maliss_White_Binder)) + ) + return false; + if (Bot.GetMonsters().Any(i => Count.CheckCardRemoved(i.Id)) + && ((Count.CheckCard(CardId.Maliss_March_Hare) && !Bot.HasInHand(CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Hand)) + || (Count.CheckSummon() && ( + (Count.CheckCard(CardId.Maliss_Dormouse) && !Bot.HasInMonstersZone(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + || (Count.CheckCard(CardId.Maliss_White_Rabbit) && !Bot.HasInMonstersZone(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + || (Count.CheckCard(CardId.Maliss_Chessy_Cat) && !Bot.HasInMonstersZone(CardId.Maliss_Chessy_Cat) && Check_Maliss_Chessy_Cat()) + ) + ) + ) + ) + { + Count.AddCard(Card.Id); + return true; + } + if (Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) && Count.CheckCardRemoved(CardId.Maliss_Red_Ransom)) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + private bool Effect_Maliss_GWC_06() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Duel.Player == 0 && Bot.HasInGraveyard(CardId.Maliss_White_Binder)) + return false; + if (Bot.GetMonsters().Any(i => Count.CheckCardRemoved(i.Id)) && Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + private bool Effect_Remove() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + return ( + (!Bot.HasInMonstersZone(CardId.Maliss_Dormouse) && Count.CheckCard(CardId.Maliss_Dormouse) && Count.CheckCardRemoved(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + || (!Bot.HasInMonstersZone(CardId.Maliss_White_Rabbit) && Count.CheckCard(CardId.Maliss_White_Rabbit) && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + || (!Bot.HasInMonstersZone(CardId.Maliss_Chessy_Cat) && Count.CheckCard(CardId.Maliss_Chessy_Cat) && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_Chessy_Cat()) + || (Count.CheckCardRemoved(CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed) && Bot.Banished.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster))) + ); + } + private bool SP_Splash_Mage() + { + if (Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount < 2) < 2 + && !(Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) + && Count.CheckCardRemoved(CardId.Maliss_Red_Ransom) + && Bot.GetMonsters().Count() == 2 + && Count.CheckCard(CardId.Maliss_White_Binder)) + ) + return false; + + bool chk = false; + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + chk = Bot.Graveyard.Any(i => i.HasType(CardType.Monster) && i.HasRace(CardRace.Cyberse) && !i.HasType(CardType.Link)); + else + chk = true; + + if (chk) + { + List materials = Bot.GetMonsters().Where(card => card != null && card.IsFaceup() && !card.HasType(CardType.Link)).ToList(); + AI.SelectMaterials(materials); + } + return chk; + } + private bool SP_Cyberse_Wicckid() + { + if (!Count.CheckCard(CardId.Artifact_Lancea)) + return false; + if (!Count.CheckCard(CardId.Dimension_Shifter) && !Bot.Graveyard.Any(i => i.HasRace(CardRace.Cyberse))) + return false; + if (Bot.HasInHand(CardId.Backup_Ignister) || !Count.CheckCard(CardId.Backup_Ignister)) + return false; + if (Bot.GetMonsters().Any(i => i.IsFaceup() && i.Level <= 4 && i.HasRace(CardRace.Cyberse)) + && Bot.GetMonsterCount() == 3 && Count.CheckCard(CardId.Backup_Ignister) && Bot.Hand.Count > 0 + && Bot.HasInExtra(CardId.Maliss_Hearts_Crypter) && Bot.HasInExtra(CardId.Link_Decoder)) + { + List materials = Bot.GetMonsters().Where(card => card.IsFaceup() && card.Sequence > 4).ToList(); + materials.AddRange(Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Link)).ToList()); + AI.SelectMaterials(materials); + return true; + } + if (Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount < 2) < 2 + || (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].HasType(CardType.Link) && Bot.MonsterZone[5].LinkCount > 3) + || (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].HasType(CardType.Link) && Bot.MonsterZone[6].LinkCount > 3) + ) + return false; + if ((Bot.HasInHand(CardId.Backup_Ignister) && Count.CheckCard(CardId.Backup_Ignister) && Bot.GetMonstersInMainZone().Count() < 5) + || (Bot.HasInHand(CardId.Wizard_Ignister) && Count.CheckCard(CardId.Wizard_Ignister) + && Bot.Graveyard.Any(i => i.HasRace(CardRace.Cyberse) && i.HasAttribute(CardAttribute.Dark)) + && Bot.Graveyard.Count(i => i.HasRace(CardRace.Cyberse)) > 1 + && Bot.GetMonstersInMainZone().Count() < 4) + || (Bot.HasInHand(CardId.Maliss_March_Hare) && Count.CheckCard(CardId.Maliss_March_Hare) + && Check_Maliss_March_Hare(CardLocation.Hand) + && Bot.Graveyard.Count(i => i.HasRace(CardRace.Cyberse)) > 1 + && Bot.GetMonstersInMainZone().Count() < 4) + ) + { + List materials = Bot.GetMonsters().Where(card => card.IsFaceup() && card.Sequence > 4).ToList(); + materials.AddRange(Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Link)).ToList()); + AI.SelectMaterials(materials); + return true; + } + return false; + } + private bool Effect_Haggard_Lizardose() + { + return Bot.Graveyard.Any(i => i.HasType(CardType.Monster) && i.Attack <= 2000); + } + private bool SP_Haggard_Lizardose() + { + List cards = Bot.GetMonsters().Where(i => i.IsFaceup() && (!i.HasType(CardType.Link) || i.LinkCount < 2)).ToList() + .GroupBy(i => i.Id) + .Select(i => i.First()) + .ToList(); + if (cards.Count < 2) + return false; + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea) && cards.Any(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id))) + { + List materials = cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss)).ToList(); + materials.AddRange(cards.Where(i => !Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))); + materials.AddRange(cards.Where(i => ! i.HasSetcode(SetCode.Maliss))); + AI.SelectMaterials(materials); + return true; + } + if (Bot.HasInExtra(CardId.Splash_Mage)) + return false; + bool chk = false; + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + chk = Bot.Graveyard.Any(i => i.HasType(CardType.Monster) && i.BaseAttack <= 2000 && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && i.HasSetcode(SetCode.Maliss)); + else + chk = Bot.GetMonsters().Any(i => i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && i.BaseAttack <= 2000 && i.HasSetcode(SetCode.Maliss)) + || Bot.Graveyard.Any(i => i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && i.BaseAttack <= 2000 && i.HasSetcode(SetCode.Maliss)); + if (chk) + { + List materials = cards.Where(i => i.BaseAttack <= 2000 && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss)).ToList(); + materials.AddRange(cards.Where(i => !materials.Contains(i))); + AI.SelectMaterials(materials); + } + return chk; + } + private bool SP_Maliss_Link() + { + if (Bot.GetMonsters().Any(i => i.HasType(CardType.Link) && i.LinkCount == 2) && Bot.GetMonsters().Any(i => !i.HasType(CardType.Link) && i.HasSetcode(SetCode.Maliss)) + || (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea) + && !(Bot.HasInExtra(new int[] {CardId.Cyberse_Wicckid, CardId.Splash_Mage}) + && Bot.Graveyard.Any(i => i.HasRace(CardRace.Cyberse)) + ) && !(Bot.HasInExtra(CardId.Haggard_Lizardose) + && Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) + && i.HasType(CardType.Monster) + && Count.CheckCardRemoved(i.Id) + ) + ) + ) + ) + { + List materials = Bot.GetMonsters().Where(card => card != null && card.IsFaceup() && card.LinkCount == 2).ToList(); + List cards = Bot.GetMonsters().Where(card => card != null && card.IsFaceup() && card.LinkCount < 2 && card.HasSetcode(SetCode.Maliss)).ToList(); + foreach (var card in cards) + { + if (materials.Count == 2) + break; + if (card.LinkCount > 2) + continue; + materials.Add(card); + } + AI.SelectMaterials(materials); + return true; + } + return false; + } + private bool Effect_Maliss_Link() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + if (Card.IsCode(CardId.Maliss_White_Binder)) + { + if (ActivateDescription == Util.GetStringId(Card.Id, 1)) + { + Count.AddCard(Card.Id); + return true; + } + else if(!Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id)) + && Enemy.Graveyard.Count() < 3) + { + Count.AddCard(Card.Id); + return true; + } + } + Count.AddCard(Card.Id); + return true; + } + else + return Effect_Maliss_Removed(900); + } + private bool SP_Link_Decoder() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss) && i.Level <= 4 && Count.CheckCardRemoved(i.Id))){ + AI.SelectMaterials(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && i.Level <= 4 && Count.CheckCardRemoved(i.Id)).ToList()); + return true; + } + return false; + } + if (Bot.HasInHand(CardId.Maliss_March_Hare) && Count.CheckCard(CardId.Maliss_March_Hare) && Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss) && i.Level <= 4 && Count.CheckCardRemoved(i.Id))) + { + AI.SelectMaterials(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && i.Level <= 4 && Count.CheckCardRemoved(i.Id)).ToList()); + return true; + } + if (Bot.GetMonsters().Any(i => i.LinkCount < 3 && i.HasSetcode(SetCode.Maliss)) && Bot.GetMonsters().Count(i => i.LinkCount < 3) >= 3) + { + AI.SelectMaterials(Bot.GetMonsters().Where(i => i.LinkCount < 3 && i.HasSetcode(SetCode.Maliss)).ToList()); + return true; + } + if (Bot.HasInMonstersZone(CardId.Cyberse_Wicckid)) + { + AI.SelectMaterials(CardId.Cyberse_Wicckid); + return true; + } + if (Bot.HasInMonstersZone(CardId.Backup_Ignister) && Bot.HasInHand(CardId.Wizard_Ignister)) + { + AI.SelectMaterials(CardId.Backup_Ignister); + return true; + } + + return false; + } + private bool Effect_Maliss_in_the_Mirror() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (ActivateDescription == Util.GetStringId(CardId.Maliss_in_the_Mirror, 0)) + { + ClientCard LastChainCard = Util.GetLastChainCard(); + return Duel.Player == 1 && LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone; + } + else + return Effect_Maliss_Removed(0); + } + private bool SP_Maliss_Hearts_Crypter() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (Bot.HasInExtra(CardId.Maliss_Red_Ransom) || Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount < 2) < (Bot.GetMonsters().Any(i => i.HasType(CardType.Link) && i.LinkCount == 2) ? 1 : 3)) + return false; + AI.SelectMaterials(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link) || i.LinkCount < 2).ToList()); + return true; + } + if ((Bot.HasInMonstersZone(CardId.Link_Decoder) && Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount <= 2) > 2) + || Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount <= 2) > 4 + ) + { + AI.SelectMaterials(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link) || i.LinkCount < 2).ToList()); + return true; + } + return false; + } + private bool SP_Maliss_White_Binder() + { + if (Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss) && i.LinkCount == 3 && Count.CheckCardRemoved(i.Id))) + { + AI.SelectMaterials(Bot.GetMonsters().Where(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) || i.LinkCount < 3).ToList()); + return true; + } + return false; + } + private bool Effect_Maliss_Hearts_Crypter() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + if (Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && (i.HasType(CardType.Field | CardType.Continuous | CardType.Equip) || i.IsFacedown())) > 0 && Duel.LastChainPlayer != 0) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + else + return Effect_Maliss_Removed(900); + } + private bool SP_Firewall_Dragon() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + return false; + List materials = Bot.GetMonsters().Where(i => i.IsCode(CardId.Maliss_White_Binder)).ToList(); + materials.AddRange(Bot.GetMonsters().Where(i => i.Sequence > 4 && i.HasType(CardType.Link) && i.LinkCount <= 3)); + materials.AddRange(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && !i.HasType(CardType.Link))); + materials.AddRange(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))); + materials.AddRange(Bot.GetMonsters().Where(i => i.Sequence < 5 && i.HasType(CardType.Link) && i.LinkCount <= 3)); + materials.AddRange(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link))); + if (materials.Count > 3) + materials = materials.Take(3).ToList(); + AI.SelectMaterials(materials); + return true; + } + private bool SP_Allied_Code_Talker_Ignister() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + return false; + if (Bot.GetMonsters().Count(i => i.LinkCount <= 3) < 3) return false; + List materials = Bot.GetMonsters().Where(i => i.IsCode(CardId.Maliss_White_Binder)).ToList(); + materials.AddRange(Bot.GetMonsters().Where(i => i.Sequence > 4 && i.HasType(CardType.Link) && i.LinkCount <= 3)); + materials.AddRange(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && !i.HasType(CardType.Link))); + materials.AddRange(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))); + materials.AddRange(Bot.GetMonsters().Where(i => i.Sequence < 5 && i.HasType(CardType.Link) && i.LinkCount <= 3)); + materials.AddRange(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link))); + if (materials.Count > 3) + materials = materials.Take(3).ToList(); + AI.SelectMaterials(materials); + return true; + } + private bool Effect_Allied_Code_Talker_Ignister() + { + if (ActivateDescription == Util.GetStringId(CardId.Allied_Code_Talker_Ignister, 1) && Duel.LastChainPlayer == 1) + { + if (Card.Sequence > 4) + { + return Bot.GetMonsters().Any(i => i.Sequence < 3 && (!i.HasType(CardType.Link) || (i.LinkCount <= 3 && Count.CheckCard(i.Id)))); + } + else + { + return Bot.GetMonsters().Any(i => i.Sequence < 5 && (i.Sequence - Card.Sequence == 1 || Card.Sequence - i.Sequence == 1) && (!i.HasType(CardType.Link) || (i.LinkCount <= 3 && Count.CheckCard(i.Id)))); + } + } + return true; + } + private bool Effect_Mereologic_Aggregator() + { + if (Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && (i.HasType(CardType.Field | CardType.Continuous | CardType.Equip) || i.IsFacedown())) > 0) + { + ClientCard LastChainCard = Util.GetLastChainCard(); + if (LastChainCard != null && LastChainCard.Controller == 1 && (LastChainCard.Location == CardLocation.MonsterZone || LastChainCard.Location == CardLocation.SpellZone)) + AI.SelectCard(LastChainCard); + Count.AddCard(Card.Id); + return true; + } + return false; + } + private bool Effect_Firewall_Dragon() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + return false; + return Duel.Player == 0 || ( + Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget() && i.IsFaceup()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && i.HasType(CardType.Field | CardType.Continuous | CardType.Equip)) > 0 + && Duel.LastChainPlayer != 0 + ); + } + private bool Summon_Backup_Ignister() + { + if (Bot.GetMonsters().Any(i => i.HasType(CardType.Link))) + return false; + Count.AddSummon(); + return true; + } + private bool SP_Transcode_Talker() + { + if (Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss))) + return false; + if (!Bot.GetMonsters().Any(i => !i.HasType(CardType.Link) || i.LinkCount < 2)) + return false; + if (!Bot.GetMonsters().Any(i => i.HasType(CardType.Link) && i.LinkCount == 2)) + return false; + List materials = Bot.GetMonsters().Where(i => i.HasType(CardType.Link) && i.LinkCount == 2).ToList(); + materials.AddRange(Bot.GetMonsters().Where(i => i.IsCode(CardId.Link_Decoder))); + materials.AddRange(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link) || i.LinkCount < 2 && i.Sequence == (materials[0].Sequence > 4 ? (materials[0].Sequence == 5 ? 1 : 3) : materials[0].Sequence + 1))); + materials.AddRange(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link) || i.LinkCount < 2)); + if (materials.Count > 2) + materials = materials.Take(2).ToList(); + AI.SelectMaterials(materials); + return true; + } + private bool Effect_Wizard_Ignister() + { + return Card.Location == CardLocation.Hand; + } + private bool GoToBattlePhase() + { + if (!Enemy.GetMonsters().Any(i => i.IsDefense())) + { + if (Util.GetTotalAttackingMonsterAttack(0) >= Enemy.LifePoints + Util.GetTotalAttackingMonsterAttack(1)) + { + return true; + } + } + return false; + } + } +} diff --git a/WindBot.csproj b/WindBot.csproj index 3a304aaa8..80071b7a5 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -88,6 +88,7 @@ + From f077da46f06f881b09eb2fd3a8804c02cc82a4aa Mon Sep 17 00:00:00 2001 From: mercury233 Date: Tue, 10 Feb 2026 17:14:11 +0800 Subject: [PATCH 068/110] avoid using tuple (keep on C# 6) --- Game/AI/Decks/MalissOCGExecutor.cs | 49 +++++++++++++++++++----------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/Game/AI/Decks/MalissOCGExecutor.cs b/Game/AI/Decks/MalissOCGExecutor.cs index 6863df58f..af71648ff 100644 --- a/Game/AI/Decks/MalissOCGExecutor.cs +++ b/Game/AI/Decks/MalissOCGExecutor.cs @@ -205,6 +205,13 @@ public bool CheckSummon() return Summon == 0; } } + + private struct ZoneData + { + public int Zone; + public ClientCard[] CheckZone; + } + public override void OnNewTurn() { Count.AddPhase(); @@ -276,29 +283,35 @@ public override int OnSelectPlace(int cardId, int player, CardLocation location, } if (cardId == CardId.Allied_Code_Talker_Ignister) { - var zones = new Dictionary<(int zone, ClientCard[] chk_zone), int>(); - var updates = new Dictionary<(int zone, ClientCard[] chk_zone), int>(); - zones[(Zones.z0, new ClientCard[] { Bot.MonsterZone[1] })] = 0; - zones[(Zones.z1, new ClientCard[] { Bot.MonsterZone[0], Bot.MonsterZone[2] })] = 0; - zones[(Zones.z2, new ClientCard[] { Bot.MonsterZone[1], Bot.MonsterZone[3] })] = 0; - zones[(Zones.z3, new ClientCard[] { Bot.MonsterZone[2], Bot.MonsterZone[4] })] = 0; - zones[(Zones.z4, new ClientCard[] { Bot.MonsterZone[3] })] = 0; - zones[(Zones.z5, new ClientCard[] { Bot.MonsterZone[0], Bot.MonsterZone[1], Bot.MonsterZone[2] })] = 0; - zones[(Zones.z6, new ClientCard[] { Bot.MonsterZone[2], Bot.MonsterZone[3], Bot.MonsterZone[4] })] = 0; - foreach (var entry in zones) + ZoneData[] zoneData = new ZoneData[] { + new ZoneData { Zone = Zones.z0, CheckZone = new ClientCard[] { Bot.MonsterZone[1] } }, + new ZoneData { Zone = Zones.z1, CheckZone = new ClientCard[] { Bot.MonsterZone[0], Bot.MonsterZone[2] } }, + new ZoneData { Zone = Zones.z2, CheckZone = new ClientCard[] { Bot.MonsterZone[1], Bot.MonsterZone[3] } }, + new ZoneData { Zone = Zones.z3, CheckZone = new ClientCard[] { Bot.MonsterZone[2], Bot.MonsterZone[4] } }, + new ZoneData { Zone = Zones.z4, CheckZone = new ClientCard[] { Bot.MonsterZone[3] } }, + new ZoneData { Zone = Zones.z5, CheckZone = new ClientCard[] { Bot.MonsterZone[0], Bot.MonsterZone[1], Bot.MonsterZone[2] } }, + new ZoneData { Zone = Zones.z6, CheckZone = new ClientCard[] { Bot.MonsterZone[2], Bot.MonsterZone[3], Bot.MonsterZone[4] } } + }; + + int maxNullCount = -1; + int selectedZone = 0; + + foreach (ZoneData data in zoneData) { - if ((entry.Key.zone & available) == 0) + if ((data.Zone & available) == 0) continue; - ClientCard[] checkZone = entry.Key.chk_zone; - int nullCount = checkZone.Count(card => card == null); - updates[entry.Key] = nullCount; + int nullCount = data.CheckZone.Count(card => card == null); + if (nullCount > maxNullCount) + { + maxNullCount = nullCount; + selectedZone = data.Zone; + } } - var maxEntry = updates.OrderByDescending(entry => entry.Value).FirstOrDefault(); - if (maxEntry.Key != default) + + if (maxNullCount >= 0) { - var (zone, checkZone) = maxEntry.Key; - return zone; + return selectedZone; } } if ((Zones.z6 & available) > 0) return Zones.z6; From 05789131435c06867bb85f620f00492e2a7b2643 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Tue, 10 Feb 2026 17:26:00 +0800 Subject: [PATCH 069/110] avoid using local methods (keep on C# 6) --- Game/AI/Decks/MalissExecutor.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Game/AI/Decks/MalissExecutor.cs b/Game/AI/Decks/MalissExecutor.cs index c2a469c86..9c327d4a5 100644 --- a/Game/AI/Decks/MalissExecutor.cs +++ b/Game/AI/Decks/MalissExecutor.cs @@ -1909,12 +1909,12 @@ private bool OneBody_Backup_SearchWizard() { discards.AddRange(candidates.Where(c => c.Id == CardId.MalissP_Dormouse)); } - IEnumerable OthersExcludingTarget() + Func> OthersExcludingTarget = () => { if (searchId == CardId.MalissP_MarchHare) return candidates.Where(c => c.Id != CardId.MalissP_MarchHare); return candidates; - } + }; var othersExcludingTarget = OthersExcludingTarget().ToList(); var dupGroups = othersExcludingTarget.GroupBy(c => c.Id) .Where(g => g.Count() >= 2); @@ -3173,12 +3173,12 @@ private List PickLinkMatsMinCount(int targetLink, var avoid = new HashSet(avoidIds ?? Enumerable.Empty()); - List OrderForFirst(IEnumerable src) => src.OrderByDescending(LinkValOf) + Func, List> OrderForFirst = (src) => src.OrderByDescending(LinkValOf) .ThenBy(m => avoid.Contains(m.Id) ? 1 : 0) .ThenBy(m => m.Attack) .ToList(); - List OrderForLater(IEnumerable src) => src.OrderBy(m => IsOneVal(m) ? 0 : 1) + Func, List> OrderForLater = (src) => src.OrderBy(m => IsOneVal(m) ? 0 : 1) .ThenBy(m => m.HasType(CardType.Link) ? (Math.Max(1, m.LinkCount) == 1 ? 0 : 1) : -1) .ThenBy(LinkValOf) .ThenBy(m => avoid.Contains(m.Id) ? 1 : 0) @@ -3190,10 +3190,11 @@ List OrderForLater(IEnumerable src) => src.OrderBy(m => int firstMaxAllowed = targetLink - Math.Max(0, minCount - 1); - List TryPick(List pool) + Func, List> TryPick = (pool) => { var chosen = new List(); - bool Dfs(List avail, int sum) + Func, int, bool> Dfs = null; + Dfs = (avail, sum) => { if (sum > targetLink || chosen.Count > maxCount) return false; @@ -3235,11 +3236,11 @@ bool Dfs(List avail, int sum) } } return false; - } + }; if (Dfs(OrderForFirst(pool), 0)) return chosen; return null; - } + }; var pick = TryPick(poolPreferred); if (pick != null && pick.Count > 0) return pick; From d70c30ec62f51dcd73c8e6f957e004b1837033de Mon Sep 17 00:00:00 2001 From: mercury233 Date: Tue, 10 Feb 2026 17:54:49 +0800 Subject: [PATCH 070/110] avoid using local functions (keep on C# 6) --- Game/AI/Decks/MalissExecutor.cs | 48 ++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/Game/AI/Decks/MalissExecutor.cs b/Game/AI/Decks/MalissExecutor.cs index 9c327d4a5..de28b2e5e 100644 --- a/Game/AI/Decks/MalissExecutor.cs +++ b/Game/AI/Decks/MalissExecutor.cs @@ -443,6 +443,35 @@ private int GetQueenLinkedMMZMask() mask &= 0x1F; return mask; } + + private int LinkValOf(ClientCard c) + { + return c.HasType(CardType.Link) ? Math.Max(1, c.LinkCount) : 1; + } + + private bool IsOneVal(ClientCard c) + { + return !c.HasType(CardType.Link) || Math.Max(1, c.LinkCount) == 1; + } + + private bool IsMaliss(ClientCard c) + { + return c.HasSetcode(0x1bf); + } + + private int ScoreForBanishedMaliss(ClientCard c) + { + if (c.IsCode(CardId.MalissInTheMirror)) return 100; + if (c.IsCode(CardId.MalissC_MTP07)) return 95; + if (c.IsCode(CardId.MalissC_GWC06)) return 90; + if (c.IsCode(CardId.MalissInUnderground)) return 85; + if (c.IsCode(CardId.MalissP_MarchHare)) return 80; + if (c.IsCode(CardId.MalissP_ChessyCat)) return 75; + if (c.IsCode(CardId.MalissP_WhiteRabbit)) return 70; + if (c.IsCode(CardId.MalissP_Dormouse)) return 65; + return 50; + } + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (player == 0 && location == CardLocation.MonsterZone) @@ -3163,9 +3192,6 @@ private List PickLinkMatsMinCount(int targetLink, IEnumerable avoidIds = null, bool requireMaliss = false) { - int LinkValOf(ClientCard m) => m.HasType(CardType.Link) ? Math.Max(1, m.LinkCount) : 1; - bool IsOneVal(ClientCard m) => !m.HasType(CardType.Link) || Math.Max(1, m.LinkCount) == 1; - var all = Bot.GetMonsters() .Where(m => m != null && m.IsFaceup() && isEligible(m)) .ToList(); @@ -3292,8 +3318,6 @@ private bool Step_LinkSummon_HeartsCrypter() .ToList(); if (cand.Count < 3) return false; - bool IsMaliss(ClientCard m) => m.HasSetcode(0x1bf); - var avoid = new HashSet { CardId.CyberseWicckid, CardId.Apollousa, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker, CardId.FirewallDragon, CardId.TranscodeTalker }; var ordered = cand @@ -3370,19 +3394,7 @@ private ClientCard PickBanishedMalissForHC(List cand) .ToList(); if (cand.Count == 0) return null; - int Score(ClientCard c) - { - if (c.IsCode(CardId.MalissInTheMirror)) return 100; - if (c.IsCode(CardId.MalissC_MTP07)) return 95; - if (c.IsCode(CardId.MalissC_GWC06)) return 90; - if (c.IsCode(CardId.MalissInUnderground)) return 85; - if (c.IsCode(CardId.MalissP_MarchHare)) return 80; - if (c.IsCode(CardId.MalissP_ChessyCat)) return 75; - if (c.IsCode(CardId.MalissP_WhiteRabbit)) return 70; - if (c.IsCode(CardId.MalissP_Dormouse)) return 65; - return 50; - } - return cand.OrderByDescending(Score).First(); + return cand.OrderByDescending(ScoreForBanishedMaliss).First(); } private bool HC_OnBanished_SpecialSummon() { From 727c2a44363efdf0413222a452f60b75b43bc1e6 Mon Sep 17 00:00:00 2001 From: Wind2009-Louse Date: Fri, 13 Mar 2026 14:54:43 +0800 Subject: [PATCH 071/110] AI_Apophis (#224) --- .gitignore | 1 + BotWrapper/bot.conf | 5 + Decks/AI_Apophis.ydk | 59 + Game/AI/Decks/ApophisExecutor.cs | 3076 +++++++++++++++++++ Game/AI/DefaultExecutor.cs | 175 +- Game/AI/Executor.cs | 23 +- Game/ChainInfo.cs | 7 + Game/ClientField.cs | 3 + Game/GameAI.cs | 23 +- Game/GameBehavior.cs | 21 +- WindBot.csproj | 4 +- YGOSharp.OCGWrapper.Enums/PlayerHintType.cs | 13 + 12 files changed, 3404 insertions(+), 6 deletions(-) create mode 100644 Decks/AI_Apophis.ydk create mode 100644 Game/AI/Decks/ApophisExecutor.cs create mode 100644 YGOSharp.OCGWrapper.Enums/PlayerHintType.cs diff --git a/.gitignore b/.gitignore index 0c3d6b030..42f026f86 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ *.user *.sln.docstates .vs/ +.vscode/ # Build results diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 4b43e6887..2b97ad0a0 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -272,4 +272,9 @@ AI_LV4 SUPPORT_MASTER_RULE_2020 !今晚有宵夜吗-码丽丝 Name=今晚有宵夜吗 Deck=MalissOCG Dialog=Xiaoye.zh-CN 码丽丝卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!尼亚-王家的神殿 +Name=尼亚 Deck=Apophis Dialog=near.zh-CN +王家的神殿卡组。 AI_LV4 SUPPORT_MASTER_RULE_2020 \ No newline at end of file diff --git a/Decks/AI_Apophis.ydk b/Decks/AI_Apophis.ydk new file mode 100644 index 000000000..f45ad0a8a --- /dev/null +++ b/Decks/AI_Apophis.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +62514770 +60411677 +60411677 +63198739 +63198739 +97522863 +97522863 +97522863 +49238328 +49238328 +73628505 +29095457 +56506740 +56506740 +56506740 +69299029 +69299029 +69299029 +6325660 +6325660 +6325660 +10045474 +10045474 +10045474 +40366667 +40366667 +58053438 +58053438 +58053438 +97045737 +97045737 +97045737 +85888377 +85888377 +95561146 +95561146 +95561146 +59576447 +78114463 +78114463 +#extra +97800311 +97800311 +97800311 +96633955 +96633955 +84815190 +84815190 +26096328 +38354018 +46772449 +29301450 +1528054 +1528054 +98978921 +98978921 +!side diff --git a/Game/AI/Decks/ApophisExecutor.cs b/Game/AI/Decks/ApophisExecutor.cs new file mode 100644 index 000000000..5c4ca8a7c --- /dev/null +++ b/Game/AI/Decks/ApophisExecutor.cs @@ -0,0 +1,3076 @@ +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using System; +using System.Linq; +using System.Diagnostics; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Apophis", "AI_Apophis")] + public class ApophisExecutor : DefaultExecutor + { + public class CardId + { + public const int LabradoriteDragon = 62514770; + public const int AnubisTheLastJudge = 60411677; + public const int PrimiteDragonEtherBeryl = 63198739; + public const int TheManWithTheMark = 97522863; + // PotOfExtravagance = 49238328; + public const int Terraforming = 73628505; + public const int PrimiteDrillbeam = 29095457; + public const int PrimiteLordlyLode = 56506740; + public const int TreasuresOfTheKings = 69299029; + public const int DominusSpark = 6325660; + // InfiniteImpermanence = 10045474; + public const int DominusImpulse = 40366667; + public const int SongsOfTheDominators = 58053438; + public const int DominusPurge = 97045737; + public const int ApophisTheSwampDeity = 85888377; + public const int ApophisTheSerpent = 95561146; + public const int VerdictOfAnubis = 59576447; + public const int SolemnReport = 78114463; + public const int DivineSerpentApophis = 97800311; + public const int SwordsoulSupremeSovereignChengying = 96633955; + public const int BaronneDeFleur = 84815190; + public const int SuperdreadnoughtRailCannonJuggernautLiebe = 26096328; + public const int SuperdreadnoughtRailCannonFlyingLauncher = 38354018; + public const int EvilswarmExcitonKnight = 46772449; + public const int SPLittleKnight = 46772449; + public const int SilhouhatteRabbit = 1528054; + public const int LinkSpider = 98978921; + } + + public ApophisExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // counter + AddExecutor(ExecutorType.Activate, CardId.SolemnReport, SolemnReportBanishActivate); + AddExecutor(ExecutorType.Activate, CardId.ApophisTheSwampDeity, ApophisTheSwampDeityActivate); + AddExecutor(ExecutorType.Activate, CardId.SongsOfTheDominators, SongsOfTheDominatorsActivateFirst); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.SongsOfTheDominators, DominusNegateTrapActivate); + AddExecutor(ExecutorType.Activate, CardId.DominusPurge, DominusNegateTrapActivate); + AddExecutor(ExecutorType.Activate, CardId.DominusImpulse, DominusNegateTrapActivate); + AddExecutor(ExecutorType.Activate, CardId.BaronneDeFleur, BaronneDeFleurNegateEffect); + AddExecutor(ExecutorType.Activate, CardId.PrimiteDrillbeam, PrimiteDrillbeamActivate); + AddExecutor(ExecutorType.Activate, CardId.VerdictOfAnubis, SpellNegateActivate); + AddExecutor(ExecutorType.Activate, CardId.SolemnReport, SpellNegateActivate); + AddExecutor(ExecutorType.Activate, CardId.SPLittleKnight, SPLittleKnightActivate); + AddExecutor(ExecutorType.Activate, CardId.DominusSpark, DominusSparkActivate); + + // first in main phase + AddExecutor(ExecutorType.Activate, _CardId.PotOfExtravagance, PotOfExtravaganceActivate); + AddExecutor(ExecutorType.Repos, MonstetReposForImportantMonsters); + + // startup effect + AddExecutor(ExecutorType.Activate, CardId.BaronneDeFleur, BaronneDeFleurActivate); + AddExecutor(ExecutorType.Activate, CardId.SuperdreadnoughtRailCannonJuggernautLiebe, SuperdreadnoughtRailCannonJuggernautLiebeActivate); + AddExecutor(ExecutorType.Activate, CardId.SuperdreadnoughtRailCannonFlyingLauncher, SuperdreadnoughtRailCannonFlyingLauncherActivate); + AddExecutor(ExecutorType.Activate, CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect); + AddExecutor(ExecutorType.SpellSet, SpellSetFirst); + AddExecutor(ExecutorType.Activate, CardId.SilhouhatteRabbit, SilhouhatteRabbitActivate); + AddExecutor(ExecutorType.Activate, CardId.DivineSerpentApophis, DivineSerpentApophisActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulSupremeSovereignChengying, SwordsoulSupremeSovereignChengyingActivate); + AddExecutor(ExecutorType.Activate, CardId.TheManWithTheMark, TheManWithTheMarkActivate); + + // spsummon + AddExecutor(ExecutorType.SpSummon, CardId.EvilswarmExcitonKnight, EvilswarmExcitonKnightSummon); + AddExecutor(ExecutorType.SpSummon, CardId.AnubisTheLastJudge, AnubisTheLastJudgeSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SuperdreadnoughtRailCannonJuggernautLiebe, SuperdreadnoughtRailCannonJuggernautLiebeSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SuperdreadnoughtRailCannonFlyingLauncher, SuperdreadnoughtRailCannonFlyingLauncherSpSummon); + AddExecutor(ExecutorType.SpSummon, Level10SynchroSummon); + AddExecutor(ExecutorType.SpSummon, CardId.DivineSerpentApophis, DivineSerpentApophisSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.LinkSpider, LinkSpiderSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SPLittleKnight, SPLittleKnightSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SilhouhatteRabbit, SilhouhatteRabbitSummon); + AddExecutor(ExecutorType.Activate, CardId.ApophisTheSerpent, ApophisTheSerpentActivate); + + // search + AddExecutor(ExecutorType.Activate, CardId.Terraforming, TerraformingActivate); + AddExecutor(ExecutorType.Activate, CardId.TreasuresOfTheKings, TreasuresOfTheKingsActivate); + AddExecutor(ExecutorType.Activate, CardId.PrimiteLordlyLode, PrimiteLordlyLodeActivate); + AddExecutor(ExecutorType.Summon, Level4MonsterSummon); + AddExecutor(ExecutorType.Activate, CardId.AnubisTheLastJudge, AnubisTheLastJudgeActivate); + AddExecutor(ExecutorType.Activate, CardId.PrimiteDragonEtherBeryl, PrimiteDragonEtherBerylActivate); + AddExecutor(ExecutorType.Activate, CardId.PrimiteLordlyLode, PrimiteLordlyLodeSpSummon); + AddExecutor(ExecutorType.Activate, CardId.ApophisTheSwampDeity, ApophisTheSwampDeityActivateForAttack); + + // next turn prepare + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.SpellSet, SpellSet); + } + + List NotToNegateIdList = new List + { + 58699500, 20343502, 25451383, 19403423 + }; + List solemnReportBanishIdList = new List { + _CardId.MysticalSpaceTyphoon, 63166095, 9726840, 5380979, 92714517, 6153210, 32548318, 30271097, 45171524, 81560239 + }; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.TheManWithTheMark, CardId.PrimiteLordlyLode, CardId.TreasuresOfTheKings, CardId.DominusSpark, + _CardId.InfiniteImpermanence, CardId.SongsOfTheDominators, CardId.DominusPurge, CardId.ApophisTheSerpent}}, + {2, new List { CardId.AnubisTheLastJudge, CardId.PrimiteDragonEtherBeryl, _CardId.PotOfExtravagance, CardId.DominusImpulse, + CardId.ApophisTheSwampDeity, CardId.SolemnReport}}, + {1, new List { CardId.LabradoriteDragon, CardId.Terraforming, CardId.PrimiteDrillbeam, CardId.VerdictOfAnubis }} + }; + const int hintTimingMainEnd = 0x4; + const int hintToHand = 0x200000; + + int maxSummonCount = 1; + int summonCount = 1; + bool enemyActivateMonsterEffectFromHandGrave = false; + int dimensionShifterCount = 0; + int songsOfTheDominatorsResolvedCount = 0; + bool activatingLodeSpSummonEffect = false; + bool lodeSpSummonEffectResolved = false; + bool songsOfTheDominatorsActivatedFromHand = false; + List currentNegateCardList = new List(); + List activatedCardIdList = new List(); + List enemyPlaceThisTurn = new List(); + List summonThisTurn = new List(); + List placedThisTurn = new List(); + List activatedDivineSerpent1stList = new List(); + List activatedDivineSerpent2ndList = new List(); + + int anubisTheLastJudgeSpSummoningStep = 0; + int SPLittleKnightRemoveStep = 0; + int currentSummoningCount = 0; + + ///

+ /// Shuffle List and return a random-order card list + /// + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 && card.IsShouldNotBeSpellTrapTarget() + && !card.IsDisabled()) return false; + } + return true; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + public int CheckRemainInDeck(params int[] ids) + { + int sum = 0; + foreach (int id in ids) + { + sum += CheckRemainInDeck(id); + } + return sum; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0, bool ignore41 = false) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= (type & CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (type & (CardType.Spell | CardType.Trap)) != 0; + bool isCounter = (type & CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck) + { + if (CheckSpellWillBeNegate(isCounter)) return true; + if (DefaultCheckWhetherSpellActivateWillBeNegated(Card)) return true; + } + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && ((type & CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card, ignore41)) || Bot.MonsterZone.Any(card => CheckNumber41(card, ignore41))) return true; + } + if (Enemy.HasInSpellZone(_CardId.SkillDrain, true, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card, bool ignoreSelf41 = false) + { + return card != null && card.IsFaceup() && card.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled() + && (!ignoreSelf41 || card.Controller == 0); + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(_CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true)) return true; + if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Bot.HasInSpellZone(_CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(_CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(_CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(_CardId.RoyalDecreel, true) || Bot.HasInSpellZone(_CardId.RoyalDecreel, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceNegatedColumns.Contains(selfSeq)) return true; + } + // how to get here? + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + return CheckCardShouldNegate(lastcard); + } + + public bool CheckCardShouldNegate(ClientCard card) + { + if (card == null) return false; + if (card.IsMonster() && card.HasSetcode(_Setcode.TimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (NotToNegateIdList.Contains(card.Id)) return false; + if (card.HasSetcode(_Setcode.Danger) && card.Location == CardLocation.Hand) return false; + if (card.IsMonster() && card.Location == CardLocation.MonsterZone && card.HasPosition(CardPosition.Defence)) + { + if (Enemy.MonsterZone.Any(c => CheckNumber41(c)) || Bot.MonsterZone.Any(c => CheckNumber41(c))) return false; + } + if (DefaultCheckWhetherCardIsNegated(card)) return false; + if (card.Location == CardLocation.SpellZone) + { + int sequence = card.Sequence; + if (card.Controller == 1) sequence = 4 - sequence; + if (infiniteImpermanenceNegatedColumns.Contains(sequence)) return false; + } + if (card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus, _CardId.MaxxC)) return false; + if (card.IsDisabled()) return false; + + return true; + } + + public bool CheckCardShouldNegate(ChainInfo chainInfo) + { + if (chainInfo == null) return false; + ClientCard card = chainInfo.RelatedCard; + + if (card == null) return false; + if (card.IsMonster() && card.HasSetcode(_Setcode.TimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (NotToNegateIdList.Contains(card.Id)) return false; + if (card.HasSetcode(_Setcode.Danger) && card.Location == CardLocation.Hand) return false; + if (card.IsMonster() && chainInfo.HasLocation(CardLocation.MonsterZone) && chainInfo.HasPosition(CardPosition.Defence)) + { + if (Enemy.MonsterZone.Any(c => CheckNumber41(c)) || Bot.MonsterZone.Any(c => CheckNumber41(c))) return false; + } + if (DefaultCheckWhetherCardIsNegated(card)) return false; + if (Duel.Player == 1 && card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus)) return false; + if (card.IsDisabled()) return false; + + return true; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && (Duel.Player == 0 || Bot.GetMonsterCount() > 0)) return true; + return false; + } + + public bool CheckShouldNoMoreSpSummon() + { + if (CheckAtAdvantage() && enemyResolvedEffectIdList.Contains(_CardId.MaxxC) && DefaultCheckWhetherEnemyCanDraw() && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2)) + { + return true; + } + return false; + } + + public bool CheckShouldNoMoreSpSummon(CardLocation loc) + { + if (CheckShouldNoMoreSpSummon()) return true; + if (!DefaultCheckWhetherEnemyCanDraw() || (Duel.Turn > 1 && Duel.Phase < DuelPhase.Main2)) return false; + if (enemyResolvedEffectIdList.Contains(_CardId.MulcharmyPurulia) && (loc & CardLocation.Hand) != 0) return true; + if (enemyResolvedEffectIdList.Contains(_CardId.MulcharmyFuwalos) && (loc & (CardLocation.Deck | CardLocation.Extra)) != 0) return true; + if (enemyResolvedEffectIdList.Contains(_CardId.MulcharmyNyalus) && (loc & (CardLocation.Grave | CardLocation.Removed)) != 0) return true; + + return false; + } + + public bool CheckWhetherCanSummon() + { + return Duel.Player == 0 && Duel.Phase < DuelPhase.End && summonCount > 0; + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { _CardId.BanisheroftheRadiance, _CardId.BanisheroftheLight, _CardId.MacroCosmos, _CardId.DimensionalFissure, + _CardId.KashtiraAriseHeart, _CardId.MaskedHERODarkLaw }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true, false, true) || cf.HasInSpellZone(cardid, true, true)) + { + return true; + } + } + } + return false; + } + + public bool CheckWhetherCanActivateMonsterEffect(CardAttribute attribute) + { + if (Bot.HintDescriptions.Contains(Util.GetStringId(CardId.DominusSpark, 3)) + && (attribute & (CardAttribute.Earth | CardAttribute.Water | CardAttribute.Fire | CardAttribute.Wind)) != 0) + { + return false; + } + if (Bot.HintDescriptions.Contains(Util.GetStringId(CardId.DominusImpulse, 2)) + && (attribute & (CardAttribute.Light | CardAttribute.Earth | CardAttribute.Wind)) != 0) + { + return false; + } + if (Bot.HintDescriptions.Contains(Util.GetStringId(CardId.DominusPurge, 2)) + && (attribute & (CardAttribute.Dark | CardAttribute.Water | CardAttribute.Fire)) != 0) + { + return false; + } + return true; + } + + public int CompareUsableAttack(ClientCard cardA, ClientCard cardB) + { + if (cardA == null && cardB == null) + return 0; + if (cardA == null) + return -1; + if (cardB == null) + return 1; + int powerA = (cardA.IsDefense() && summonThisTurn.Contains(cardA)) ? 0 : cardA.Attack; + int powerB = (cardB.IsDefense() && summonThisTurn.Contains(cardB)) ? 0 : cardB.Attack; + if (powerA < powerB) + return -1; + if (powerA == powerB) + return CardContainer.CompareCardLevel(cardA, cardB); + return 1; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = true, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + ClientCard activatingAlbaz = Enemy.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(68468459) && !c.IsDisabled() + && !currentNegateCardList.Contains(c) && Duel.CurrentChain.Contains(c)); + if (activatingAlbaz != null) return activatingAlbaz; + + if (attack >= 0) + { + if (attack == 0) + attack = GetBotBestPower(); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentNegateCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentNegateCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentNegateCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentNegateCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentNegateCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentNegateCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType) + ) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentNegateCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = true, CardType selfType = 0, bool forNegate = false) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card)) + && (!forNegate || (!card.IsDisabled() && card.HasType(CardType.Effect))) + ).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card) && card.IsFacedown()).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card) && card.IsFacedown()).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() + && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card)) + && (!forNegate || (!card.IsDisabled() && card.HasType(CardType.Effect) && card.IsFaceup())) + ).ToList())); + + return targetList; + } + + public List GetNormalEnemySpellTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = true, CardType selfType = 0, bool forNegate = false) + { + List targetList = GetNormalEnemyTargetList(canBeTarget, ignoreCurrentDestroy, selfType, forNegate); + return targetList.Where(card => card.HasType(CardType.Spell | CardType.Trap) || card.Location == CardLocation.SpellZone).ToList(); + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + if (chainingCard.HasPosition(CardPosition.Defence)) + { + bool have41 = Bot.MonsterZone.Any(c => CheckNumber41(c)) | Enemy.MonsterZone.Any(c => CheckNumber41(c)); + } + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public int GetSpecialSummonDrawCount(CardLocation loc) + { + int res = 0; + if (!DefaultCheckWhetherEnemyCanDraw()) + { + return 0; + } + if (enemyResolvedEffectIdList.Contains(_CardId.MaxxC)) + { + res++; + } + + if ((loc & CardLocation.Hand) != 0) + { + res += enemyResolvedEffectIdList.Count(id => id == _CardId.MulcharmyPurulia); + } + if ((loc & (CardLocation.Deck | CardLocation.Extra)) != 0) + { + res += enemyResolvedEffectIdList.Count(id => id == _CardId.MulcharmyFuwalos); + } + if ((loc & (CardLocation.Grave | CardLocation.Removed)) != 0) + { + res += enemyResolvedEffectIdList.Count(id => id == _CardId.MulcharmyNyalus); + } + + return res; + } + + public int GetBotBestPower(bool onlyATK = false) + { + return Bot.MonsterZone.GetMonsters() + .Where(card => !onlyATK || (!summonThisTurn.Contains(card) && Duel.Player == 0) || card.IsAttack()) + .Max(card => (int?)card.GetDefensePower()) ?? -1; + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain == null) { + if (anubisTheLastJudgeSpSummoningStep > 0) { + List cardIdList = new List { + CardId.VerdictOfAnubis, CardId.ApophisTheSwampDeity, CardId.SongsOfTheDominators, CardId.DominusSpark, CardId.DominusImpulse, + CardId.ApophisTheSerpent, CardId.DominusPurge, _CardId.InfiniteImpermanence, CardId.SolemnReport }; + foreach (int cardId in cardIdList) { + ClientCard card = cards.FirstOrDefault(c => c.IsCode(cardId)); + if (card != null) { + if (anubisTheLastJudgeSpSummoningStep == 1) + { + anubisTheLastJudgeSpSummoningStep = 2; + } else + { + anubisTheLastJudgeSpSummoningStep = 0; + } + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + } + + // for activating target + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.Controller == 0) + { + switch (lastChainCard.Id) + { + case CardId.AnubisTheLastJudge: + { + List targetList = GetNormalEnemyTargetList(canBeTarget: true, ignoreCurrentDestroy: true, selfType: CardType.Monster, forNegate: false); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // destroy set this turn + foreach (ClientCard target in cards) + { + if (enemyPlaceThisTurn.Contains(target)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.PrimiteDrillbeam: + { + // negate cards on chain + foreach (ClientCard card in Duel.CurrentChain) { + if (card.Controller == 1 && card.IsOnField() && card.IsFaceup() && !card.IsDisabled() && !currentNegateCardList.Contains(card) + && CheckCanBeTargeted(card, true, CardType.Spell) && CheckCardShouldNegate(card) && cards.Contains(card)) { + currentNegateCardList.Add(card); + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + // remove problematic enemy cards + List targetList = GetNormalEnemyTargetList(canBeTarget: true, ignoreCurrentDestroy: true, selfType: CardType.Monster, forNegate: false); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // select enemy cards + List enemyCards = ShuffleList(cards.Where(c => c.Controller == 1).ToList()); + foreach (ClientCard target in enemyCards) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.DominusSpark: + { + List targetList = GetNormalEnemyTargetList(ignoreCurrentDestroy: false); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case _CardId.InfiniteImpermanence: + { + int sequence = lastChainCard.Sequence; + List targetList = GetMonsterListForTargetNegate(true, CardType.Trap); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + if (sequence >= 0) + { + ClientCard spell = Enemy.SpellZone[sequence]; + if (spell != null && spell.IsFaceup()) + { + currentNegateCardList.Add(spell); + } + } + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + targetList = GetProblematicEnemyCardList(canBeTarget: true, ignoreSpells: false, selfType: CardType.Trap); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + if (sequence >= 0) + { + ClientCard spell = Enemy.SpellZone[sequence]; + if (spell != null && spell.IsFaceup()) + { + currentNegateCardList.Add(spell); + } + } + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.DivineSerpentApophis: + { + if (hint == HintMsg.Destroy) + { + List targetList = GetNormalEnemyTargetList(); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (hint == HintMsg.Set) + { + int targetId = CardId.ApophisTheSwampDeity; + // if no other continuous trap can be found, then use ApophisTheSerpent + bool hasOtherContinuousTrap = false; + if (Bot.GetSpellCountWithoutField() <= 3 && Bot.HasInGraveyard(CardId.ApophisTheSerpent)) + { + hasOtherContinuousTrap = true; + } + if (Bot.GetSpells().Any(c => c.HasType(CardType.Continuous)) || Bot.GetMonsters().Any(c => c.HasType(CardType.Continuous))) + { + hasOtherContinuousTrap = true; + } + if (!hasOtherContinuousTrap) + { + targetId = CardId.ApophisTheSerpent; + } + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + // select remaining cards + return Util.CheckSelectCount(cards, cards, min, max); + } + break; + } + case CardId.BaronneDeFleur: + { + if (hint == HintMsg.Destroy) + { + List targetList = GetNormalEnemyTargetList(); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + } + case CardId.SuperdreadnoughtRailCannonFlyingLauncher: + { + List targetList = GetNormalEnemySpellTargetList(true, false, CardType.Monster); + if (hint == HintMsg.RemoveXyz) + { + return Util.CheckSelectCount(cards, cards, min, Math.Min(targetList.Count, max)); + } + if (hint == HintMsg.Destroy) + { + List destroyList = new List(); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + destroyList.Add(target); + if (destroyList.Count >= max) + { + currentNegateCardList.AddRange(destroyList); + return Util.CheckSelectCount(destroyList, cards, min, Math.Min(targetList.Count, max)); + } + } + } + } + break; + } + case CardId.SPLittleKnight: + { + if (Duel.CurrentChainInfo.Count > 0) + { + ChainInfo lastChain = Duel.CurrentChainInfo[Duel.CurrentChainInfo.Count - 1]; + if (lastChain.ActivateDescription == -1 || lastChain.ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 0)) + { + // remove enemy cards + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + foreach (ClientCard target in problemCardList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } else if (lastChain.ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 1)) + { + switch (SPLittleKnightRemoveStep) + { + case 1: + // remove target + foreach (ClientCard target in Bot.GetMonsters()) + { + if (target.HasType(CardType.Continuous)) + { + continue; + } + if (Duel.ChainTargets.Contains(target) && cards.Contains(target)) + { + SPLittleKnightRemoveStep = 2; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // remove weak monster + if (Duel.Player == 1) + { + foreach (ClientCard card in Bot.GetMonsters().Where(c => c.IsAttack() && !c.HasType(CardType.Continuous) && !c.IsCode(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity })).OrderBy(c => c.Attack)) + { + if (Util.IsOneEnemyBetterThanValue(card.Attack, true) && cards.Contains(card)) + { + SPLittleKnightRemoveStep = 2; + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + } + break; + case 2: + { + // select problematic enemy monster + if (Enemy.GetMonsterCount() > 0) + { + List problemList = GetProblematicEnemyCardList(true, true, CardType.Monster); + if (problemList.Count() > 0) + { + foreach (ClientCard target in problemList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + SPLittleKnightRemoveStep = 0; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + // remove bot's target + foreach (ClientCard target in Duel.ChainTargets) + { + if (target.IsCode(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity })) + { + continue; + } + if (cards.Contains(target)) + { + SPLittleKnightRemoveStep = 0; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // remove bot's monster + if (Enemy.GetMonsterCount() == 0) + { + List otherOwn = Bot.GetMonsters().Where(c => !c.HasType(CardType.Continuous)).ToList(); + otherOwn.Sort(CompareUsableAttack); + foreach (ClientCard c in otherOwn) + { + if (cards.Contains(c)) + { + SPLittleKnightRemoveStep = 0; + return Util.CheckSelectCount(new List { c }, cards, min, max); + } + } + } + } + break; + default: + SPLittleKnightRemoveStep = 0; + break; + } + } + } + break; + } + case CardId.SilhouhatteRabbit: + { + if (hint == HintMsg.Destroy) + { + List targetList = GetNormalEnemySpellTargetList(true, false, CardType.Monster, false); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + } + default: + break; + } + } + } + + if (currentChain != null) + { + if (currentChain.ActivateController == 0) + { + // for solving chain + switch (currentChain.ActivateId) + { + case CardId.PrimiteDragonEtherBeryl: + if (hint == HintMsg.Set) + { + int targetId = CardId.PrimiteLordlyLode; + if (activatedCardIdList.Contains(CardId.PrimiteLordlyLode) || !DefaultCheckWhetherBotCanSearch() || Bot.HasInSpellZone(CardId.PrimiteLordlyLode)) + { + targetId = CardId.PrimiteDrillbeam; + } + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + case CardId.TheManWithTheMark: + if (hint == HintMsg.OperateCard) + { + int targetId = CardId.TreasuresOfTheKings; + if (activatedCardIdList.Contains(CardId.TreasuresOfTheKings) || Bot.HasInHandOrInSpellZone(CardId.TreasuresOfTheKings)) + { + targetId = CardId.VerdictOfAnubis; + } + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + case CardId.TreasuresOfTheKings: + { + List targetIdList = new List(); + if (hint == HintMsg.Set) + { + targetIdList.AddRange(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }); + } else if (hint == HintMsg.AddToHand) { + if (songsOfTheDominatorsResolvedCount > 0) + { + targetIdList.AddRange(new List { CardId.TheManWithTheMark, CardId.AnubisTheLastJudge }); + } else + { + targetIdList.AddRange(new List { CardId.AnubisTheLastJudge, CardId.TheManWithTheMark }); + } + } + foreach (int targetId in targetIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.PrimiteLordlyLode: + { + if (hint == HintMsg.AddToHand) + { + List targetIdList = new List { CardId.PrimiteDragonEtherBeryl, CardId.PrimiteDrillbeam }; + if (summonCount == 0 || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth)) + { + // whether need to search drillbeam + bool canTriggerPrimiteBeam = Bot.Hand.Any(c => c.IsCode(CardId.PrimiteDragonEtherBeryl, CardId.PrimiteLordlyLode, CardId.LabradoriteDragon)); + canTriggerPrimiteBeam |= Bot.HasInMonstersZone(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity, CardId.LabradoriteDragon }, faceUp: true); + canTriggerPrimiteBeam |= Bot.GetSpells().Any(c => c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) && (c.IsFacedown() || Duel.CurrentChain.Contains(c))); + if (canTriggerPrimiteBeam) + { + targetIdList.Insert(0, CardId.PrimiteDrillbeam); + } + } + foreach (int targetId in targetIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + } + case CardId.SongsOfTheDominators: + { + List checkIdList = new List { CardId.DominusPurge, CardId.DominusImpulse, CardId.DominusSpark }; + // 1. Prefer a card NOT in activatedCardIdList and not in hand / spell&trap of bot + foreach (int checkId in checkIdList) + { + if (!activatedCardIdList.Contains(checkId) && !Bot.HasInHandOrInSpellZone(checkId) && !Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(checkId))) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + // 2. Next, prefer a card not in hand/spell&trap + foreach (int checkId in checkIdList) + { + if (!Bot.HasInHandOrInSpellZone(checkId)) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + // 3. Finally, pick by id order if any exists + foreach (int checkId in checkIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.ApophisTheSwampDeity: + { + List negateCardList = new List(); + // select cards to negate + for (int i = Duel.CurrentChain.Count - 1; i >= 0; i--) + { + ClientCard card = Duel.CurrentChain[i]; + if (card != null && card.IsFaceup() && cards.Contains(card)) + { + negateCardList.Add(card); + } + } + // negate other face-up cards + foreach (ClientCard card in cards) + { + if (card != null && card.IsFaceup() && !negateCardList.Contains(card)) + { + negateCardList.Add(card); + } + } + return Util.CheckSelectCount(negateCardList, cards, min, max); + } + case CardId.SwordsoulSupremeSovereignChengying: + { + List fieldTargetList = GetNormalEnemyTargetList(false); + foreach (ClientCard target in fieldTargetList) + { + if (cards.Contains(target)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // banish fron grave + List graveTargetList = Duel.CurrentChain.Where(c => c != null && c.Controller == 1 && c.Location == CardLocation.Grave).ToList(); + graveTargetList.AddRange(Duel.ChainTargets.Where(c => c != null && c.Controller == 1 && c.Location == CardLocation.Grave).ToList()); + graveTargetList.AddRange(Enemy.Graveyard.Where(c => c.IsMonster()).OrderByDescending(c => c.Attack).ToList()); + return Util.CheckSelectCount(graveTargetList, cards, min, max); + } + case CardId.SilhouhatteRabbit: + { + List targetIdList = new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }; + foreach (int targetId in targetIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + default: + break; + } + } + if (currentChain.ActivateController == 1) + { + switch (currentChain.ActivateId) + { + case _CardId.EvenlyMatched: + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + // monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List dumpMainMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && CheckRemainInDeck(card.Id) > 0).ToList(); + dumpMainMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpMainMonsterList); + // spells + List faceUpSpells = Bot.GetSpells().Where(c => c.IsFaceup()).ToList(); + banishList.AddRange(ShuffleList(faceUpSpells)); + // other monster + List otherMonsters = botMonsters.Where(card => !banishList.Contains(card)).ToList(); + otherMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(otherMonsters); + List faceDownSpells = Bot.GetSpells().Where(c => c.IsFacedown()).ToList(); + banishList.AddRange(ShuffleList(faceDownSpells)); + return Util.CheckSelectCount(banishList, cards, min, max); + } + default: + break; + } + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override bool OnSelectHand() + { + return true; + } + + public override int OnSelectOption(IList options) + { + if (options.Contains(Util.GetStringId(_CardId.PotOfExtravagance, 1))) + { + return options.IndexOf(Util.GetStringId(_CardId.PotOfExtravagance, 1)); + } + if (options.Contains(Util.GetStringId(CardId.SolemnReport, 1)) && options.Contains(Util.GetStringId(CardId.SolemnReport, 2))) + { + int destroyOpt = options.IndexOf(Util.GetStringId(CardId.SolemnReport, 1)); + int banishOpt = options.IndexOf(Util.GetStringId(CardId.SolemnReport, 2)); + bool avoidDestroyFlag = false; + if (Duel.CurrentChain.Count >= 2) + { + ClientCard secondLastChainCard = Duel.CurrentChain[Duel.CurrentChain.Count - 2]; + if (secondLastChainCard != null) + { + // avoid destroy if bot have the same cards that can activate + switch (secondLastChainCard.Id) + { + case CardId.DominusSpark: + { + bool canActivateFlag = !activatedCardIdList.Contains(CardId.DominusSpark) && !Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(CardId.DominusSpark)); + if (canActivateFlag) + { + canActivateFlag &= Bot.HasInHand(CardId.DominusSpark) && enemyActivateMonsterEffectFromHandGrave + || Bot.GetSpells().Any(c => c.IsCode(CardId.DominusSpark) && !placedThisTurn.Contains(c)); + } + avoidDestroyFlag |= canActivateFlag; + break; + } + case CardId.DominusImpulse: + case CardId.DominusPurge: + { + bool canActivateFlag = !activatedCardIdList.Contains(secondLastChainCard.Id) && !Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(secondLastChainCard.Id)); + if (canActivateFlag) + { + canActivateFlag &= Bot.HasInHand(secondLastChainCard.Id) || Bot.GetSpells().Any(c => c.IsCode(secondLastChainCard.Id) && !placedThisTurn.Contains(c)); + } + avoidDestroyFlag |= canActivateFlag; + break; + } + case CardId.SongsOfTheDominators: + { + bool canActivateFlag = !activatedCardIdList.Contains(secondLastChainCard.Id) && !Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(secondLastChainCard.Id)); + if (canActivateFlag) + { + canActivateFlag &= Bot.HasInHand(secondLastChainCard.Id) && Bot.Graveyard.Count(c => c.IsMonster()) == 0 + || Bot.GetSpells().Any(c => c.IsCode(secondLastChainCard.Id) && !placedThisTurn.Contains(c)); + } + avoidDestroyFlag |= canActivateFlag; + break; + } + case _CardId.InfiniteImpermanence: + case CardId.ApophisTheSwampDeity: + avoidDestroyFlag |= Bot.GetSpells().Any(c => c.IsCode(secondLastChainCard.Id) && !placedThisTurn.Contains(c)); + break; + case CardId.ApophisTheSerpent: + avoidDestroyFlag |= Bot.GetSpells().Any(c => c.IsCode(secondLastChainCard.Id) && !placedThisTurn.Contains(c)) && !activatedCardIdList.Contains(secondLastChainCard.Id); + break; + } + + if (avoidDestroyFlag) + { + return banishOpt; + } + if (secondLastChainCard.IsCode(solemnReportBanishIdList)) + { + return banishOpt; + } + } + } + + return destroyOpt; + } + + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null) + { + if (currentChain.ActivateController == 0) + { + switch (currentChain.ActivateId) + { + case CardId.TheManWithTheMark: + if (options.Contains(1190)) + { + return options.IndexOf(1190); + } + break; + default: + break; + } + } + } + + return base.OnSelectOption(options); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + List zoneIdList = ShuffleList(new List { 5, 6 }); + zoneIdList.AddRange(ShuffleList(new List { 0, 2, 4 })); + zoneIdList.AddRange(ShuffleList(new List { 1, 3 })); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + List infiniteImpermanenceList = Bot.GetSpells().Where(c => c.IsCode(_CardId.InfiniteImpermanence)).Select(c => c.Sequence).ToList(); + infiniteImpermanenceList.AddRange(infiniteImpermanenceNegatedColumns); + // trap monster do not summon to infinite permanence negated columns + if ((cardId == CardId.ApophisTheSerpent || cardId == CardId.ApophisTheSwampDeity) + && infiniteImpermanenceList.Contains(zoneId)) + { + continue; + } + if (cardId == CardId.ApophisTheSerpent || cardId == CardId.ApophisTheSwampDeity) + { + Logger.DebugWriteLine("Apophis select zone: " + zoneId); + Logger.DebugWriteLine("infiniteImpermanenceNegatedColumns: " + string.Join(", ", infiniteImpermanenceList)); + } + return zone; + } + } + } + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null && currentChain.ActivateController == 0) + { + switch (currentChain.ActivateId) + { + case CardId.TreasuresOfTheKings: + { + List zoneIdList = ShuffleList(new List { 0, 1, 2, 3, 4 }); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + return zone; + } + } + break; + } + case CardId.ApophisTheSerpent: + { + List zoneIdList = ShuffleList(new List { 0, 1, 2, 3, 4 }); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null && !infiniteImpermanenceNegatedColumns.Contains(zoneId)) + { + return zone; + } + } + break; + } + default: + break; + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.PrimiteDrillbeam, 0)) + { + return false; + } + + return base.OnSelectYesNo(desc); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + if (cardId == CardId.SuperdreadnoughtRailCannonJuggernautLiebe && CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth)) + { + cardAttack += 2000; + } + if (cardId == CardId.SwordsoulSupremeSovereignChengying) + { + int removeCount = Bot.Banished.Count() + Enemy.Banished.Count(); + cardAttack += removeCount * 200; + } + int bestBotAttack = Math.Max(GetBotBestPower(true), cardAttack); + + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + dimensionShifterCount = 0; + songsOfTheDominatorsResolvedCount = 0; + // for doom bot + maxSummonCount = 1; + } + + summonCount = maxSummonCount; + enemyActivateMonsterEffectFromHandGrave = false; + anubisTheLastJudgeSpSummoningStep = 0; + SPLittleKnightRemoveStep = 0; + activatingLodeSpSummonEffect = false; + lodeSpSummonEffectResolved = false; + songsOfTheDominatorsActivatedFromHand = false; + if (dimensionShifterCount > 0) dimensionShifterCount--; + if (songsOfTheDominatorsResolvedCount > 0) songsOfTheDominatorsResolvedCount--; + currentNegateCardList.Clear(); + activatedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + summonThisTurn.Clear(); + placedThisTurn.Clear(); + activatedDivineSerpent1stList.Clear(); + activatedDivineSerpent2ndList.Clear(); + currentSummoningCount = 0; + + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + if (player == 1 && card != null && card.IsMonster() && (card.Location == CardLocation.Hand || card.Location == CardLocation.Grave)) + { + enemyActivateMonsterEffectFromHandGrave = true; + } + + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null) + { + if (currentChain.ActivateController == 0) + { + switch (currentChain.ActivateId) + { + case CardId.DominusSpark: + case CardId.DominusImpulse: + case CardId.DominusPurge: + case CardId.SongsOfTheDominators: + activatedCardIdList.Add(currentChain.ActivateId); + break; + case CardId.TreasuresOfTheKings: + if (currentChain.ActivateDescription != Util.GetStringId(CardId.TreasuresOfTheKings, 0)) + { + activatedCardIdList.Add(currentChain.ActivateId); + } + break; + } + } + if (!Duel.IsCurrentSolvingChainNegated()) + { + if (currentChain.ActivateController == 0) + { + switch (currentChain.ActivateId) + { + case CardId.PrimiteLordlyLode: + { + if (activatingLodeSpSummonEffect) + { + lodeSpSummonEffectResolved = true; + } + break; + } + case CardId.SongsOfTheDominators: + { + if (songsOfTheDominatorsActivatedFromHand) + { + songsOfTheDominatorsResolvedCount = 2; + } + break; + } + default: + break; + } + } + if (currentChain.IsActivateCode(_CardId.DimensionShifter)) + dimensionShifterCount = 2; + } + } + + base.OnChainSolved(chainIndex); + } + + public override void OnChainEnd() + { + currentSummoningCount = 0; + currentNegateCardList.Clear(); + activatingLodeSpSummonEffect = false; + songsOfTheDominatorsActivatedFromHand = false; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || !checkTarget.IsOnField()) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + base.OnChainEnd(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (card != null) + { + if (currentControler == 1 && (currentLocation == (int)CardLocation.MonsterZone || currentLocation == (int)CardLocation.SpellZone)) + { + enemyPlaceThisTurn.Add(card); + } + + if (previousControler == 0 && previousLocation == (int)CardLocation.MonsterZone && currentLocation != (int)CardLocation.MonsterZone) + { + if (summonThisTurn.Contains(card)) + summonThisTurn.Remove(card); + if (activatedDivineSerpent1stList.Contains(card)) + activatedDivineSerpent1stList.Remove(card); + if (activatedDivineSerpent2ndList.Contains(card)) + activatedDivineSerpent2ndList.Remove(card); + } + if (currentControler == 0 && currentLocation == (int)CardLocation.MonsterZone) + { + summonThisTurn.Add(card); + } + if (currentControler == 0 && previousLocation == (int)CardLocation.SpellZone && currentLocation != (int)CardLocation.SpellZone && placedThisTurn.Contains(card)) + { + placedThisTurn.Remove(card); + } + if (currentControler == 0 && currentLocation == (int)CardLocation.SpellZone) + { + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null && currentChain.ActivateController == 0 && currentChain.ActivateId == CardId.ApophisTheSerpent && card.IsCode(CardId.ApophisTheSwampDeity)) + { + placedThisTurn.Remove(card); + } else + { + placedThisTurn.Add(card); + } + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + if (card.Location == CardLocation.SpellZone) + { + return; + } + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceNegatedColumns.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool AnubisTheLastJudgeActivate() + { + if (Card.Location == CardLocation.Hand) + { + if (CheckWhetherNegated()) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + // select target on enemy field + List targetList = GetNormalEnemyTargetList(canBeTarget: true, ignoreCurrentDestroy: false, selfType: CardType.Monster, forNegate: false); + if (targetList.Count > 0) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool AnubisTheLastJudgeSpSummon() { + if (CheckShouldNoMoreSpSummon(CardLocation.Grave)) + { + return false; + } + + if (Duel.MainPhase.ActivableCards.Contains(Card)) + { + // whether should activate + if (!CheckWhetherNegated() || !CheckWhetherWillbeRemoved()) + { + return false; + } + } + + anubisTheLastJudgeSpSummoningStep = 1; + return true; + } + + public bool PrimiteDragonEtherBerylActivate() + { + if (Card.Location == CardLocation.Grave) + { + return !CheckWhetherNegated(); + } + // to grave + if (ActivateDescription == Util.GetStringId(CardId.PrimiteDragonEtherBeryl, 1)) + { + if (!Util.IsTurn1OrMain2()) + { + return false; + } + + // summoning Labradorite instead? + bool notCalledLode = !activatedCardIdList.Contains(CardId.PrimiteLordlyLode + 1); + if (notCalledLode) + { + // can summon? + bool enabledLodeFlag = Bot.GetSpells().Any(c => c.IsCode(CardId.PrimiteLordlyLode) && c.IsFaceup() && !c.IsDisabled()); + bool existsLode = Bot.GetSpells().Any(c => c.IsCode(CardId.PrimiteLordlyLode) && c.IsFacedown()); + existsLode = Bot.HasInHand(CardId.PrimiteLordlyLode) && Bot.GetSpellCount() < 5; + enabledLodeFlag |= existsLode && !activatedCardIdList.Contains(CardId.PrimiteLordlyLode); + + if (enabledLodeFlag) + { + return false; + } + } + + // whether can recycle next turn? + List apophisCardIdList = new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }; + bool recycleFlag = Bot.HasInHand(apophisCardIdList) + || Bot.HasInSpellZone(apophisCardIdList) + || Bot.GetMonsters().Any(c => c.IsFaceup() && apophisCardIdList.Contains(c.Id)); + return !CheckWhetherWillbeRemoved() && (!CheckWhetherNegated() || recycleFlag); + } else + { + // search + return !CheckWhetherNegated(); + } + } + + public bool TheManWithTheMarkActivate() + { + return !CheckWhetherNegated() && DefaultCheckWhetherBotCanSearch(); + } + + public bool Level4MonsterSummon() + { + if (!Card.IsCode(CardId.PrimiteDragonEtherBeryl, CardId.TheManWithTheMark)) + { + return false; + } + + bool canSummonDragon = Bot.HasInHand(CardId.PrimiteDragonEtherBeryl); + if (!activatedCardIdList.Contains(CardId.PrimiteLordlyLode) && DefaultCheckWhetherBotCanSearch()) + { + canSummonDragon |= Bot.HasInHand(CardId.PrimiteLordlyLode) && Bot.GetSpellCountWithoutField() < 5; + canSummonDragon |= Bot.GetSpells().Any(c => c.IsCode(CardId.PrimiteLordlyLode) && c.IsFacedown()); + } + if (canSummonDragon) + { + bool summonFlag = false; + // summon to search? + if (!CheckWhetherNegated(true, true) && CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth)) + { + summonFlag |= !activatedCardIdList.Contains(CardId.PrimiteLordlyLode) && !Bot.HasInHandOrInSpellZone(CardId.PrimiteLordlyLode) && CheckRemainInDeck(CardId.PrimiteLordlyLode) > 0; + summonFlag |= CheckRemainInDeck(CardId.PrimiteDrillbeam) > 0; + } + + // summon to recycle beam + if (!Bot.HasInMonstersZone(CardId.PrimiteDragonEtherBeryl, faceUp: true) && !activatedCardIdList.Contains(CardId.PrimiteDrillbeam + 1) + && Bot.HasInGraveyard(CardId.PrimiteDrillbeam) && Bot.GetSpellCountWithoutField() < 5) + { + summonFlag = true; + } + + if (summonFlag && Card.IsCode(CardId.PrimiteDragonEtherBeryl)) + { + summonCount --; + return true; + } + } + + bool canSummonMan = Bot.HasInHand(CardId.TheManWithTheMark); + canSummonMan |= Bot.HasInHand(CardId.AnubisTheLastJudge) && DefaultCheckWhetherBotCanSearch() && CheckRemainInDeck(CardId.TheManWithTheMark) > 0 && !activatedCardIdList.Contains(CardId.AnubisTheLastJudge); + if (Bot.HasInHandOrInSpellZone(CardId.TreasuresOfTheKings) && !activatedCardIdList.Contains(CardId.TreasuresOfTheKings + 1) && DefaultCheckWhetherBotCanSearch() && CheckRemainInDeck(CardId.TheManWithTheMark) > 0) + { + canSummonMan |= Bot.Graveyard.Any(c => c.IsTrap()); + int facedownCardCount = Bot.GetSpells().Count(c => c.IsFacedown()); + facedownCardCount += Bot.GetMonsters().Count(c => c.IsFacedown()); + facedownCardCount += GetCanSetSpells().Count(); + canSummonMan |= facedownCardCount >= 2; + } + if (canSummonMan && Card.IsCode(CardId.TheManWithTheMark)) + { + summonCount --; + return true; + } + + // summon for synchro level 10 monster + if (Bot.ExtraDeck.Any(c => c.HasType(CardType.Synchro) && c.Level == 10)) + { + // have labradorite dragon + bool haveTunerFlag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(CardId.LabradoriteDragon) && c.IsTuner()); + haveTunerFlag |= !activatedCardIdList.Contains(CardId.PrimiteLordlyLode + 1) && Bot.HasInSpellZone(CardId.PrimiteLordlyLode, true, true); + if (haveTunerFlag) + { + summonCount --; + return true; + } + } + + return false; + } + + public bool PotOfExtravaganceActivate() + { + if (CheckWhetherNegated()) return false; + SelectSTPlace(Card, true); + AI.SelectOption(1); + return true; + } + + public bool TerraformingActivate() + { + if (CheckWhetherNegated()) return false; + SelectSTPlace(Card, true); + return true; + } + + public bool PrimiteDrillbeamActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated()) return false; + + // check whether can active + bool canActivate = Bot.HasInHand(CardId.PrimiteLordlyLode) || Bot.HasInHand(CardId.PrimiteDragonEtherBeryl); + canActivate |= Bot.HasInSpellZone(CardId.ApophisTheSerpent) || Bot.HasInSpellZone(CardId.ApophisTheSwampDeity); + canActivate |= Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity, CardId.LabradoriteDragon)); + canActivate |= Bot.HasInHand(CardId.ApophisTheSwampDeity) && Bot.GetSpellCountWithoutField() <= 3; + + if (canActivate) { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + // cannot activate + return false; + } + + // negate + if (CheckWhetherNegated(true, true, CardType.Spell)) + { + return false; + } + + bool activateFlag = false; + + // negate problematic enemy card + List problematicEnemyCardList = GetProblematicEnemyCardList(true, false, CardType.Spell); + if (problematicEnemyCardList.Count(c => !c.IsDisabled()) > 0) { + problematicEnemyCardList.RemoveAll(c => currentNegateCardList.Contains(c)); + if (problematicEnemyCardList.Count > 0) { + activateFlag = true; + } + } + + // negate cards on chain + foreach (ClientCard card in Duel.CurrentChain) { + if (card.Controller == 1 && card.IsOnField() && card.IsFaceup() && !card.IsDisabled() && !currentNegateCardList.Contains(card) + && CheckCanBeTargeted(card, true, CardType.Spell) && CheckCardShouldNegate(card)) { + activateFlag = true; + } + } + + // can recycle, so activate it + if (Bot.HasInMonstersZone(CardId.PrimiteDragonEtherBeryl, faceUp: true) && !activatedCardIdList.Contains(CardId.PrimiteDrillbeam + 1) + && (CurrentTiming & hintToHand) == 0) + { + List targetList = GetNormalEnemyTargetList(true, true, CardType.Spell, true); + if (targetList.Count > 0) { + activateFlag = true; + } + } + + // become target + if (DefaultOnBecomeTarget()) { + activateFlag |= Enemy.GetSpells().Any(c => c.IsFaceup() && !c.IsDisabled() && CheckCanBeTargeted(c, true, CardType.Spell)); + activateFlag |= Enemy.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && CheckCanBeTargeted(c, true, CardType.Spell)); + } + + if (Duel.Phase == DuelPhase.BattleStep) + { + // remove problematic enemy monster + ClientCard problematicEnemyMonster = GetProblematicEnemyMonster(0, true, true, CardType.Spell); + if (problematicEnemyMonster != null && !problematicEnemyMonster.IsDisabled()) + { + activateFlag = true; + } + } + + if (activateFlag) + { + activatedCardIdList.Add(Card.Id); + SelectSTPlace(Card, true); + return true; + } + + return false; + } + + public bool PrimiteLordlyLodeActivate() + { + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) + { + return false; + } + + // activate + bool activateFlag = PrimiteLordlyLodeActivateCheck(); + Logger.DebugWriteLine("PrimiteLordlyLodeActivate: " + activateFlag); + if (activateFlag) + { + SelectSTPlace(Card, true); + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool PrimiteLordlyLodeActivateCheck() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + bool activateFlag = false; + if (Bot.HasInHandOrHasInMonstersZone(CardId.PrimiteDragonEtherBeryl) && DefaultCheckWhetherBotCanSearch()) + { + // for search drillbeam + activateFlag |= CheckRemainInDeck(CardId.PrimiteDrillbeam) > 0; + activateFlag |= summonCount <= 0 && Card.Location == CardLocation.SpellZone && Card.IsFacedown(); + } + if (summonCount > 0 && !Bot.HasInHand(CardId.PrimiteDragonEtherBeryl) && CheckRemainInDeck(CardId.PrimiteDragonEtherBeryl) > 0 && DefaultCheckWhetherBotCanSearch()) + { + // for search ether beryl + activateFlag |= Bot.HasInGraveyard(CardId.PrimiteDrillbeam); + activateFlag |= CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) && !CheckWhetherNegated(true, true, CardType.Monster); + } + if (!Bot.HasInSpellZone(CardId.PrimiteLordlyLode, true, true)) + { + // for activate it + activateFlag |= DefaultCheckWhetherBotCanSearch(); + + // for special summon + CardLocation loc; + if (Bot.HasInHand(CardId.LabradoriteDragon)) + { + loc = CardLocation.Hand; + } + else if (CheckRemainInDeck(CardId.LabradoriteDragon) > 0) + { + loc = CardLocation.Deck; + } + else if (Bot.HasInGraveyard(CardId.LabradoriteDragon)) + { + loc = CardLocation.Grave; + } else { + return false; + } + int drawCount = GetSpecialSummonDrawCount(loc); + if (drawCount < 2) + { + activateFlag |= Bot.GetMonsters().Any(c => c.IsFaceup() && c.Level == 4 && !c.HasType(CardType.Xyz | CardType.Link)) + && Bot.ExtraDeck.Any(c => c.IsFaceup() && c.Level == 10 && c.HasType(CardType.Synchro)); + } + } + if (Card.Location == CardLocation.SpellZone && Card.IsFacedown()) + { + activateFlag |= DefaultCheckWhetherBotCanSearch(); + } + return activateFlag; + } + + public bool PrimiteLordlyLodeSpSummon() + { + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) + { + // add activating flag + if (CheckWhetherNegated()) return false; + if (!PrimiteLordlyLodeSpSummonCheck()) return false; + activatingLodeSpSummonEffect = true; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool PrimiteLordlyLodeSpSummonCheck() + { + // special summon + CardLocation loc; + if (Bot.HasInHand(CardId.LabradoriteDragon)) + { + loc = CardLocation.Hand; + } + else if (CheckRemainInDeck(CardId.LabradoriteDragon) > 0) + { + loc = CardLocation.Deck; + } + else if (Bot.HasInGraveyard(CardId.LabradoriteDragon)) + { + loc = CardLocation.Grave; + } else { + return false; + } + int drawCount = GetSpecialSummonDrawCount(loc); + return drawCount < 2; + } + + public bool TreasuresOfTheKingsActivate() + { + if (CheckWhetherNegated()) return false; + + // search + if (ActivateDescription == Util.GetStringId(CardId.TreasuresOfTheKings, 0)) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + // activate + bool activateFlag = false; + if (Bot.GetSpellCountWithoutField() == 5) + { + // for search + if (!DefaultCheckWhetherBotCanSearch() || CheckRemainInDeck(CardId.TheManWithTheMark, CardId.AnubisTheLastJudge) == 0) + { + activateFlag = false; + } + else + { + bool hasOtherSpellTrapInHand = + Bot.Hand.Any(c => (c.IsSpell() || c.IsTrap()) && c != Card); + + bool gyHasTrap = + Bot.Graveyard.Any(c => c.IsTrap()); + + int otherFacedownOnField = + Bot.GetMonsters().Count(m => m.IsFacedown()) + + Bot.GetSpells().Count(s => s.IsFacedown() && s != Card); + + activateFlag = gyHasTrap || hasOtherSpellTrapInHand || otherFacedownOnField >= 2; + } + } + else + { + // for set + if (CheckRemainInDeck(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) > 0) + activateFlag = true; + } + + return activateFlag; + } + + public bool DominusSparkActivate() + { + if (CheckWhetherNegated()) return false; + // activate from field first + if (Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.DominusSpark) && c.IsOnField() && c != Card + && !infiniteImpermanenceNegatedColumns.Contains(c.Sequence))) + { + return false; + } + + bool shouldActivate = false; + // check whether there is a dangerous monster + ClientCard dangerousMonster = GetProblematicEnemyMonster(-1, true, false, CardType.Trap); + shouldActivate |= dangerousMonster != null; + + if (Duel.Phase == DuelPhase.BattleStep && Duel.Player == 1) + { + dangerousMonster = GetProblematicEnemyMonster(0, true, false, CardType.Trap); + shouldActivate |= dangerousMonster != null; + } + + // check whether it is the end phase and there is a monster on the enemy field + if (Duel.Phase == DuelPhase.End && Duel.Player == 1 && Duel.Turn == 1) + { + List endPhaseTargets = GetNormalEnemyTargetList(canBeTarget: true, ignoreCurrentDestroy: true, selfType: CardType.Trap); + shouldActivate |= endPhaseTargets.Any(c => c.IsMonster() && c.IsFaceup()); + } + + shouldActivate |= DefaultOnBecomeTarget() && !CheckWhetherNegated(); + + if (shouldActivate) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = Card.Sequence; + int that_seq = -1; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone) that_seq = LastChainCard.Sequence; + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Trap); + if (shouldNegateList.Count > 0) + { + SelectSTPlace(Card, true); + return true; + } + + return false; + } + + public bool DominusNegateTrapActivate() + { + if (CheckWhetherNegated()) return false; + // activate from field first + if (Duel.MainPhase.ActivableCards.Any(c => c.IsCode(Card.Id) && c.IsOnField() && c != Card + && !infiniteImpermanenceNegatedColumns.Contains(c.Sequence))) + { + return false; + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + if (LastChainCard != null && LastChainCard.Controller == 1 && CheckCardShouldNegate(LastChainCard)) + { + currentNegateCardList.Add(LastChainCard); + SelectSTPlace(Card, true); + if (Card.IsCode(CardId.SongsOfTheDominators) && Card.Location == CardLocation.Hand) + { + songsOfTheDominatorsActivatedFromHand = true; + } + return true; + } + + return false; + } + + public bool SongsOfTheDominatorsActivateFirst() + { + return Bot.Graveyard.Any(c => c.HasType(CardType.Trap)) && DominusNegateTrapActivate(); + } + + public bool ApophisTheSwampDeityActivate() + { + return ApophisTheSwampDeityActivateCheck(1); + } + + public bool ApophisTheSwampDeityActivateForAttack() + { + return ApophisTheSwampDeityActivateCheck(2); + } + + public bool ApophisTheSwampDeityActivateCheck(int activatePriority = 0) + { + if (CheckWhetherNegated()) return false; + if (currentSummoningCount + Bot.GetMonsters().Count(c => c.Sequence < 5) >= 5) return false; + + int canNegateCount = Bot.GetSpells().Count(c => c != Card && + (c.IsCode(CardId.ApophisTheSwampDeity) + || (c.IsCode(CardId.ApophisTheSerpent) && + (c.IsFaceup() || !activatedCardIdList.Contains(CardId.ApophisTheSerpent))))); + canNegateCount += Bot.GetMonsters().Count(c => c.IsCode(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }) && c.IsFaceup()); + + bool shouldActivate = false; + // for negate + if (Duel.CurrentChain.Count > 0 && canNegateCount > 0) + { + // exists cards to negate? + foreach (ClientCard chain in Duel.CurrentChain) + { + if (chain.IsFaceup() && chain.IsOnField() && chain.Controller == 1 && !currentNegateCardList.Contains(chain)) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] Negate card on chain: " + chain.Name); + shouldActivate = true; + break; + } + } + } + + // for summon divine serpent + if (DivineSerpentApophisSpSummonCheck()) { + int newApophisCount = Duel.MainPhase.ActivableCards.Count(c => c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)); + int currentApophisCount = Bot.GetMonsters().Count(c => c.IsFaceup() && + (c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) || (c.IsCode(CardId.DivineSerpentApophis) && activatedDivineSerpent1stList.Contains(c)))); + bool checkResult = currentApophisCount < 2 && currentApophisCount + newApophisCount >= 2; + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] DivineSerpentApophisSpSummonCheck: " + checkResult); + } + shouldActivate |= checkResult; + } + + // for little knight + if (Bot.ExtraDeck.Any(c => c.IsCode(CardId.SPLittleKnight)) && !SPLittleKnightSummonCheck() && SPLittleKnightSummonCheck(true) + && Duel.Player == 0 && Bot.ExtraDeck.Any(c => c.IsCode(CardId.LinkSpider))) + { + bool checkResult = Bot.GetMonsters().Count(c => c.IsFaceup() && c.HasType(CardType.Effect)) == 1; + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] SPSmallKnightSummonCheck: " + checkResult); + } + shouldActivate |= checkResult; + } + + // for triggering divine serpent apophis + if (CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) && !CheckWhetherNegated(true, true, CardType.Monster) + && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && c.IsCode(CardId.DivineSerpentApophis) && !activatedDivineSerpent2ndList.Contains(c))) + { + bool checkResult = GetProblematicEnemyCardList(true, false, CardType.Monster).Count() > 0 + && !Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)) + && !Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.ApophisTheSerpent)); + if ((CurrentTiming & hintTimingMainEnd) != 0 && Duel.Player == 1) + { + checkResult |= GetNormalEnemyTargetList(true, true, CardType.Monster).Count() > 0 + && !Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)) + && !Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.ApophisTheSerpent)); + } + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] DivineSerpentApophisActivate: " + checkResult); + } + shouldActivate |= checkResult; + } + + // for triggering silhouette hat rabbit + if (CheckWhetherCanActivateMonsterEffect(CardAttribute.Light) && !CheckWhetherNegated(true, true, CardType.Monster, true) + && !activatedCardIdList.Contains(CardId.SilhouhatteRabbit + 1) + && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && c.IsCode(CardId.SilhouhatteRabbit))) + { + bool checkResult = GetProblematicEnemyCardList(true, false, CardType.Monster).Count(c => c.HasType(CardType.Spell | CardType.Trap)) > 0 + && !Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)) + && !Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.ApophisTheSerpent)); + if ((CurrentTiming & hintTimingMainEnd) != 0 && Duel.Player == 1) + { + checkResult |= GetNormalEnemySpellTargetList(true, true, CardType.Monster).Count() > 0 + && !Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)) + && !Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.ApophisTheSerpent)); + } + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] SilhouhatteRabbitSummonCheck: " + checkResult); + } + shouldActivate |= checkResult; + } + + // for triggering primite drillbeam + if (Bot.HasInHandOrInSpellZone(CardId.PrimiteDrillbeam) && !activatedCardIdList.Contains(CardId.PrimiteDrillbeam)) + { + // whether have other cards to trigger primite beam + bool canTriggerPrimiteBeam = Bot.Hand.Any(c => c.IsCode(CardId.PrimiteDragonEtherBeryl, CardId.PrimiteLordlyLode, CardId.LabradoriteDragon)); + canTriggerPrimiteBeam |= Bot.HasInMonstersZone(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity, CardId.LabradoriteDragon }, faceUp: true); + canTriggerPrimiteBeam |= Bot.GetSpells().Any(c => c != Card && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) && (c.IsFacedown() || Duel.CurrentChain.Contains(c))); + + bool checkResult = !canTriggerPrimiteBeam; + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] PrimiteDrillbeamSummonCheck: " + checkResult); + } + shouldActivate |= !canTriggerPrimiteBeam; + } + + // TODO for other summon + + // for attack + if (Duel.Turn > 1 && Duel.Phase == DuelPhase.Main1 && Enemy.GetMonsterCount() == 0 && Duel.Player == 0 && Duel.CurrentChain.Count == 0 + && activatePriority >= 2) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] Attack: " + true); + shouldActivate |= true; + } + + // for defense + if (Duel.Phase == DuelPhase.Main1 && Bot.GetMonsterCount() == 0 && Enemy.GetMonsters().Sum(c => c.Attack) >= Bot.LifePoints + && (CurrentTiming & hintTimingMainEnd) != 0) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] Defense: " + true); + shouldActivate |= true; + } + + if (shouldActivate) + { + // mark cards to negate + int negateCount = Bot.GetSpells().Count(c => c != Card && c.IsFaceup() && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + negateCount += Bot.GetMonsters().Count(c => c.IsFaceup() && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + // negate cards on chain fist + if (negateCount > 0) + { + foreach (ClientCard chain in Duel.CurrentChain) + { + if (chain.IsFaceup() && chain.IsOnField() && !currentNegateCardList.Contains(chain) && CheckCardShouldNegate(chain)) + { + negateCount--; + currentNegateCardList.Add(chain); + if (negateCount <= 0) break; + } + } + } + + if (negateCount > 0) + { + // Find negatable enemy spell/trap cards on field that are not yet negated + List negatableSpellsTraps = Enemy.GetSpells().Where(c => + c.IsFaceup() && + !c.IsDisabled() && + !currentNegateCardList.Contains(c) + ).ToList(); + + // Mark negatable spell/trap cards as negated, up to the available count + foreach (ClientCard card in negatableSpellsTraps) + { + currentNegateCardList.Add(card); + negateCount--; + if (negateCount <= 0) break; + } + } + + if (negateCount > 0) + { + // Find negatable enemy monsters on field that are not yet negated + List negatableMonsters = Enemy.GetMonsters().Where(c => + c.IsFaceup() && + !c.IsDisabled() && + !currentNegateCardList.Contains(c) + ).ToList(); + + // Mark negatable monsters as negated, up to the remaining count + foreach (ClientCard card in negatableMonsters) + { + currentNegateCardList.Add(card); + negateCount--; + if (negateCount <= 0) break; + } + } + + currentSummoningCount++; + return true; + } + + return false; + } + + public bool ApophisTheSerpentActivate() + { + if (CheckWhetherNegated()) return false; + if (currentSummoningCount + Bot.GetMonsters().Count(c => c.Sequence < 5) >= 5) return false; + if (Bot.GetSpells().Any(c => c.IsFacedown() && c.IsCode(CardId.ApophisTheSwampDeity) && !infiniteImpermanenceNegatedColumns.Contains(c.Sequence))) + { + if (!(Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2)) + { + return false; + } + } + currentSummoningCount++; + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool SpellNegateActivate() + { + if (CheckWhetherNegated() || Duel.LastChainPlayer != 1) return false; + + ClientCard prevChainCard = Util.GetLastChainCard(); + if (prevChainCard != null && !CheckCardShouldNegate(prevChainCard)) + { + return false; + } + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool SolemnReportBanishActivate() + { + if (SpellNegateActivate()) + { + ClientCard prevChainCard = Util.GetLastChainCard(); + if (prevChainCard != null && prevChainCard.IsCode(solemnReportBanishIdList)) + { + return true; + } + } + return false; + } + + public bool DivineSerpentApophisSpSummonCheck() + { + if (Duel.Player != 0) return false; + bool checkFlag = false; + // recycle + if (CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) && !CheckWhetherNegated(true, true, CardType.Monster) + && Bot.GetSpellCountWithoutField() < 5) + { + checkFlag |= Bot.HasInGraveyard(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }); + checkFlag |= !CheckWhetherWillbeRemoved(); + } + + // for attack + checkFlag |= GetBotBestPower(true) <= Util.GetBestPower(Enemy) && Util.GetBestPower(Enemy) < 2800; + + return checkFlag; + } + + public bool DivineSerpentApophisSpSummon() + { + if (!DivineSerpentApophisSpSummonCheck()) return false; + // select material with different name + ClientCard apophisTheSerpent = Bot.GetMonsters().FirstOrDefault(c => c.IsFaceup() && c.IsCode(CardId.ApophisTheSerpent)); + ClientCard apophisTheSwampDeity = Bot.GetMonsters().FirstOrDefault(c => c.IsFaceup() && c.IsCode(CardId.ApophisTheSwampDeity)); + AI.SelectMaterials(new List { apophisTheSerpent, apophisTheSwampDeity }, HintMsg.Release); + return true; + } + + public bool DivineSerpentApophisActivate() + { + if (CheckWhetherNegated()) return false; + if (ActivateDescription == Util.GetStringId(CardId.DivineSerpentApophis, 0)) + { + // set trap + activatedDivineSerpent1stList.Add(Card); + } + else + { + // destroy + List targetList = GetNormalEnemyTargetList(true, false, CardType.Monster); + if (targetList.Count() == 0) + { + return false; + } + activatedDivineSerpent2ndList.Add(Card); + } + return true; + } + + public bool Level10SynchroSummon() + { + if (!Level10SynchroSummonCheck()) return false; + if (!Card.IsCode(new List { CardId.BaronneDeFleur, CardId.SwordsoulSupremeSovereignChengying })) + { + return false; + } + + int decideSummonId = 0; + // select which to summon + if (GetBotBestPower(true) < Util.GetBestPower(Enemy) && Util.GetBestPower(Enemy) > 3000 + && (!CheckWhetherCanActivateMonsterEffect(CardAttribute.Wind) || lodeSpSummonEffectResolved) + && Duel.Phase == DuelPhase.Main1 && Duel.Turn > 1) + { + int banishCount = Bot.Banished.Count() + Enemy.Banished.Count(); + if (3000 + banishCount * 200 >= Util.GetBestPower(Enemy) + && Duel.MainPhase.SummonableCards.Any(c => c.IsCode(CardId.SwordsoulSupremeSovereignChengying)) + && !Card.IsCode(CardId.SwordsoulSupremeSovereignChengying)) + { + return false; + } + decideSummonId = CardId.SwordsoulSupremeSovereignChengying; + } + if (decideSummonId == 0 && CheckWhetherCanActivateMonsterEffect(CardAttribute.Wind) + && Duel.MainPhase.SummonableCards.Any(c => c.IsCode(CardId.BaronneDeFleur)) + && !Card.IsCode(CardId.BaronneDeFleur)) + { + return false; + } + if (decideSummonId == 0 && !CheckWhetherCanActivateMonsterEffect(CardAttribute.Wind) + && Duel.MainPhase.SummonableCards.Any(c => c.IsCode(CardId.SwordsoulSupremeSovereignChengying)) + && !Card.IsCode(CardId.SwordsoulSupremeSovereignChengying)) + { + return false; + } + + ClientCard level4Monster = Bot.GetMonsters().FirstOrDefault(c => c.IsFaceup() && c.Level == 4 && c.IsCode(CardId.PrimiteDragonEtherBeryl)); + + if (level4Monster == null) + { + // find level4 monster with lowest power + level4Monster = Bot.GetMonsters().OrderBy(c => c.GetDefensePower()).FirstOrDefault(c => c.IsFaceup() && c.Level == 4 && !c.HasType(CardType.Xyz | CardType.Link)); + } + if (level4Monster == null) + { + return false; + } + + ClientCard level6Tuner = Bot.GetMonsters().OrderBy(c => c.GetDefensePower()).FirstOrDefault(c => c.IsFaceup() && c.Level == 6 && c.IsTuner()); + if (level6Tuner == null) + { + return false; + } + AI.SelectMaterials(new List { level4Monster, level6Tuner }); + return true; + } + + public bool Level10SynchroSummonCheck() + { + if (CheckShouldNoMoreSpSummon()) return false; + if (GetSpecialSummonDrawCount(CardLocation.Extra) > 1 && CheckAtAdvantage()) return false; + + return true; + } + + public bool SwordsoulSupremeSovereignChengyingActivate() + { + if (CheckWhetherNegated()) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool BaronneDeFleurNegateEffect() + { + if (ActivateDescription != Util.GetStringId(CardId.BaronneDeFleur, 1)) + { + return false; + } + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + ClientCard lastChainCard = Util.GetLastChainCard(); + if (Duel.LastChainPlayer == 1 && lastChainCard != null) + { + if (CheckAtAdvantage() && lastChainCard.IsCode(new List {_CardId.MaxxC, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus, _CardId.MulcharmyPurulia})) + { + return false; + } + if (Duel.LastChainTargets.Contains(Card) && lastChainCard.IsCode(_CardId.EffectVeiler, _CardId.InfiniteImpermanence, _CardId.BreakthroughSkill)) + { + return false; + } + } + currentNegateCardList.Add(lastChainCard); + return true; + } + + public bool BaronneDeFleurActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.BaronneDeFleur, 1)) + { + // negate + return false; + } else if (Duel.Phase == DuelPhase.Standby) + { + // special summon + // TODO waiting for handle OnCardHint + return false; + } else { + // destroy + List targetList = GetNormalEnemyTargetList(); + if (targetList.Count() > 0) + { + return true; + } + } + + return false; + } + + public bool SuperdreadnoughtRailCannonJuggernautLiebeActivate() + { + if (CheckWhetherNegated()) return false; + return true; + } + + public bool SuperdreadnoughtRailCannonJuggernautLiebeSpSummon() + { + if (!SuperdreadnoughtRailCannonJuggernautLiebeSpSummonCheck()) return false; + return true; + } + + public bool SuperdreadnoughtRailCannonJuggernautLiebeSpSummonCheck() + { + int enemyPower = Util.GetBestPower(Enemy); + int botPower = GetBotBestPower(true); + if (botPower < enemyPower) + { + int currentAttack = 4000; + if (!CheckWhetherNegated(true, true, CardType.Monster) && CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) && !lodeSpSummonEffectResolved) + { + currentAttack += 2000; + } + if (currentAttack >= enemyPower) + { + return true; + } + } + return false; + } + + public bool SuperdreadnoughtRailCannonFlyingLauncherActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.SuperdreadnoughtRailCannonFlyingLauncher, 2)) + { + List targetList = GetNormalEnemySpellTargetList(true, false, CardType.Monster); + if (targetList.Count() > 0) + { + return true; + } + } + return false; + } + + public bool SuperdreadnoughtRailCannonFlyingLauncherSpSummon() + { + bool hasLiebeInExtra = Bot.ExtraDeck.Any(c => c.IsCode(CardId.SuperdreadnoughtRailCannonJuggernautLiebe)); + int enemyPower = Util.GetBestPower(Enemy); + int botPower = GetBotBestPower(true); + bool needSummonLiebe = SuperdreadnoughtRailCannonJuggernautLiebeSpSummonCheck(); + + if ((hasLiebeInExtra && needSummonLiebe) + || (!hasLiebeInExtra && botPower < enemyPower && enemyPower <= 3800) + || (CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) + && !CheckWhetherNegated(true, true, CardType.Monster) + && !lodeSpSummonEffectResolved + && GetNormalEnemySpellTargetList(true, false, CardType.Monster).Count() > 0)) + { + return true; + } + return false; + } + + public bool EvilswarmExcitonKnightSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Light)) return false; + int selfCount = Bot.GetMonsterCount() + Bot.GetSpellCount() + Bot.GetHandCount(); + int oppoCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount() + Enemy.GetHandCount(); + return (selfCount - 1 < oppoCount) && DefaultEvilswarmExcitonKnightEffect(); + } + + public bool SPLittleKnightActivate() + { + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 0)) + { + // banish card + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + if (problemCardList.Count() > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } else if (ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 1)) + { + ClientCard selfMonster = null; + foreach (ClientCard target in Bot.GetMonsters()) + { + if (Duel.ChainTargets.Contains(target)) + { + selfMonster = target; + break; + } + } + if (selfMonster == null) + { + if (Duel.Player == 1) + { + selfMonster = Bot.GetMonsters().Where(card => card.IsAttack()).OrderBy(card => card.Attack).FirstOrDefault(); + if (!Util.IsOneEnemyBetterThanValue(selfMonster.Attack, true)) selfMonster = null; + } + } + if (selfMonster != null) + { + ClientCard nextMonster = null; + List selfTargetList = Bot.GetMonsters().Where(card => card != selfMonster).ToList(); + if (Enemy.GetMonsterCount() == 0 && selfTargetList.Count() > 0) + { + selfTargetList.Sort(CompareUsableAttack); + nextMonster = selfTargetList[0]; + } + if (Enemy.GetMonsterCount() > 0) + { + nextMonster = GetProblematicEnemyMonster(0, true, false, CardType.Monster); + } + if (nextMonster != null) + { + SPLittleKnightRemoveStep = 1; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + return false; + } + + public bool SPLittleKnightSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster, true) || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Dark)) return false; + + List effectMonsters = Bot.GetMonsters().Where(c => c.IsFaceup() && c.HasType(CardType.Effect) + && (!c.IsCode(CardId.SilhouhatteRabbit) || !summonThisTurn.Contains(c)) + ).OrderBy(c => c.GetDefensePower()).ToList(); + + // summon to remove problem cards + if (SPLittleKnightSummonCheck() || Util.IsTurn1OrMain2() && (Enemy.GetMonsterCount() + Enemy.GetSpellCount() + Enemy.Graveyard.Count > 0)) + { + ClientCard extraMonster = null; + ClientCard otherMonster = null; + foreach (ClientCard monster in effectMonsters) + { + // skip important monster if needed + if (Util.IsTurn1OrMain2() && monster.IsCode(new List { CardId.BaronneDeFleur, CardId.SwordsoulSupremeSovereignChengying, CardId.DivineSerpentApophis })) + { + continue; + } + + if (monster.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) + { + if (extraMonster != null) + { + otherMonster = monster; + } + else + { + extraMonster = monster; + } + } + else + { + otherMonster = monster; + } + + if (extraMonster != null && otherMonster != null) + { + break; + } + } + + if (extraMonster != null && otherMonster != null) + { + AI.SelectMaterials(new List { extraMonster, otherMonster }); + return true; + } + } + + return false; + } + + public bool SPLittleKnightSummonCheck(bool ignoreMaterialCheck = false) + { + if (CheckWhetherNegated(true, true, CardType.Monster, true) + || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Dark) + || lodeSpSummonEffectResolved) return false; + // banish card + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster, ignoreSpells: !Util.IsTurn1OrMain2()); + bool summonFlag = problemCardList.Count() > 0; + ClientCard problematicEnemyMonster = GetProblematicEnemyMonster(0, true, false, CardType.Monster); + if (problematicEnemyMonster != null) + { + summonFlag = true; + } + if (summonFlag) + { + if (ignoreMaterialCheck) + { + return true; + } + // check material + return Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) + && (!c.IsCode(CardId.SilhouhatteRabbit) || !summonThisTurn.Contains(c))) + && Bot.GetMonsters().Count(c => c.IsFaceup() && c.HasType(CardType.Effect)) >= 2; + } + + return false; + } + + public bool SilhouhatteRabbitActivate() + { + if (CheckWhetherNegated()) return false; + if (ActivateDescription == Util.GetStringId(CardId.SilhouhatteRabbit, 0) || ActivateDescription == -1) + { + // set + // default to true + activatedCardIdList.Add(Card.Id); + return true; + } else + { + // destroy + List targetList = GetNormalEnemySpellTargetList(true, false, CardType.Monster, false); + if (targetList.Count() > 0) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + return false; + } + + public bool SilhouhatteRabbitSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster, true) || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Light)) return false; + if (!SilhouhatteRabbitSummonCheck()) return false; + // select material + ClientCard anubis = Bot.GetMonsters().FirstOrDefault(c => c.IsFaceup() && c.IsCode(CardId.AnubisTheLastJudge)); + List materialList = new List { }; + if (anubis != null) + { + materialList.Add(anubis); + } + // select remain material + List effectMonsters = Bot.GetMonsters().Where(c => c.IsFaceup() && c.HasType(CardType.Effect) + && (!c.IsCode(CardId.SilhouhatteRabbit) || !summonThisTurn.Contains(c)) + ).OrderBy(c => c.GetDefensePower()).ToList(); + if (effectMonsters.Count() > 0) + { + foreach (ClientCard monster in effectMonsters) + { + // skip important monster if needed + if (monster.IsCode(new List { CardId.BaronneDeFleur, CardId.SwordsoulSupremeSovereignChengying, CardId.DivineSerpentApophis, CardId.SPLittleKnight })) + { + continue; + } + materialList.Add(monster); + if (materialList.Count() >= 2) + { + break; + } + } + } + + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + return false; + } + + public bool SilhouhatteRabbitSummonCheck(bool ignoreMaterialCheck = false) + { + if (CheckWhetherNegated(true, true, CardType.Monster, true) + || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Light) + || lodeSpSummonEffectResolved) return false; + + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + if (problemCardList.Count() > 0) + { + return false; + } + int remainApophisCount = CheckRemainInDeck(CardId.ApophisTheSwampDeity); + if (remainApophisCount == 0) + { + return false; + } + if (Bot.Hand.Any(c => c.IsCode(CardId.ApophisTheSwampDeity)) || Bot.GetSpells().Any(c => c.IsCode(CardId.ApophisTheSwampDeity) && c.IsFacedown())) + { + return false; + } + if (activatedCardIdList.Contains(CardId.SilhouhatteRabbit)) + { + return false; + } + if (ignoreMaterialCheck) + { + return true; + } + return Bot.GetMonsters().Count(c => c.IsFaceup() && c.HasType(CardType.Effect) + && (!c.IsCode(CardId.SilhouhatteRabbit) || !summonThisTurn.Contains(c))) >= 2; + } + + public bool LinkSpiderSummon() + { + // check whether monster is enough + int monsterCount = Bot.GetMonsterCount() + Duel.MainPhase.ActivableCards.Count(c => c.IsOnField() && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)); + if (monsterCount < 2) + { + return false; + } + + // summon little knight check + if (Bot.ExtraDeck.Any(c => c.IsCode(CardId.SPLittleKnight))) + { + if (SPLittleKnightSummonCheck()) + { + return false; + } + if (SPLittleKnightSummonCheck(true)) + { + return true; + } + } + // summon silhouhatte rabbit check + if (Bot.ExtraDeck.Any(c => c.IsCode(CardId.SilhouhatteRabbit))) + { + if (SilhouhatteRabbitSummonCheck()) + { + return false; + } + if (SilhouhatteRabbitSummonCheck(true)) + { + return true; + } + } + return false; + } + + public bool MonsterRepos() + { + int selfAttack = Card.Attack + 1; + + if (selfAttack <= 1) + return !Card.IsDefense(); + + int bestAttack = 0; + foreach (ClientCard card in Bot.GetMonsters()) + { + int attack = card.Attack; + if (attack >= bestAttack) + { + bestAttack = attack; + } + } + + bool enemyBetter = Util.IsAllEnemyBetterThanValue(bestAttack, true); + + if (Card.IsAttack() && enemyBetter) + return true; + if (Card.IsDefense() && !enemyBetter) + return true; + return false; + } + + public bool MonstetReposForImportantMonsters() + { + if (!Card.IsFacedown()) + { + return false; + } + return Card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz); + } + + public bool SpellSetFirst() + { + // pretend to have solemn report + int setCount = Bot.GetSpells().Count(c => c.IsFacedown() && c.Sequence < 5); + if (setCount < 2 && Bot.LifePoints > 1500) + { + if (setCount == 1 && !Bot.HasInSpellZone(CardId.SolemnReport) && Bot.HasInHand(CardId.SolemnReport) && Bot.GetSpells().Any(c => c.IsTrap() && c.IsFacedown())) + { + if (!Card.IsCode(CardId.SolemnReport)) + { + return false; + } + SelectSTPlace(Card, true); + return true; + } + // if card should set + List canSetSpells = GetCanSetSpells(); + if (setCount + canSetSpells.Count() > 0 && canSetSpells.Contains(Card) && (!Bot.HasInHand(CardId.SolemnReport) || Card.IsTrap())) + { + bool avoidImpermanence = Card.IsCode(CardId.SolemnReport); + SelectSTPlace(Card, avoidImpermanence); + return true; + } + } + return false; + } + + public List GetCanSetSpells() + { + List canSetSpells = new List(); + foreach (ClientCard card in Bot.Hand) + { + bool setFlag = false; + switch (Card.Id) + { + case CardId.Terraforming: + setFlag |= CheckRemainInDeck(CardId.TreasuresOfTheKings) > 0 && DefaultCheckWhetherBotCanSearch(); + break; + case CardId.PrimiteLordlyLode: + setFlag |= PrimiteLordlyLodeActivateCheck() && !canSetSpells.Any(c => c.IsCode(CardId.PrimiteLordlyLode)); + break; + case CardId.DominusSpark: + setFlag |= !enemyActivateMonsterEffectFromHandGrave; + break; + case _CardId.InfiniteImpermanence: + case CardId.VerdictOfAnubis: + case CardId.SolemnReport: + setFlag = true; + break; + case CardId.DominusPurge: + case CardId.DominusImpulse: + setFlag |= Enemy.GetMonsterCount() + Enemy.GetSpellCount() == 0; + break; + case CardId.SongsOfTheDominators: + setFlag |= !Bot.Graveyard.Any(c => c.IsMonster()); + break; + case CardId.ApophisTheSwampDeity: + setFlag |= Bot.Hand.Any(c => c != card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + setFlag |= Bot.GetSpells().Any(c => c != card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + setFlag |= Bot.GetMonsters().Any(c => c != card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + break; + case CardId.ApophisTheSerpent: + setFlag |= CheckRemainInDeck(CardId.ApophisTheSwampDeity) > 0; + setFlag |= Bot.HasInHandOrInSpellZone(CardId.ApophisTheSwampDeity); + break; + default: + setFlag = false; + break; + } + if (setFlag) + { + canSetSpells.Add(card); + } + } + return canSetSpells; + } + + public bool SpellSet() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + + // select place + if (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) + { + switch (Card.Id) + { + case _CardId.InfiniteImpermanence: + // do not set infinite impermanence if don't need to set other cards + if (Bot.GetMonsterCount() == 0 && Bot.GetSpellCount() == 0 + && !Bot.Hand.Any(c => !c.IsCode(_CardId.InfiniteImpermanence) && (c.IsTrap() || c.HasType(CardType.QuickPlay))) + && Bot.Hand.Count() <= 6) + { + return false; + } + break; + case CardId.SongsOfTheDominators: + // do not set songs of the dominators if don't need to set + if (!Bot.Graveyard.Any(c => c.IsMonster()) && Bot.GetMonsterCount() == 0) + { + return false; + } + if (Bot.GetSpells().Any(c => c.IsCode(CardId.SongsOfTheDominators) && c.IsFacedown())) + { + return false; + } + break; + case CardId.ApophisTheSwampDeity: + // do not set swamp deity if don't need to set + if ( + !Bot.Hand.Any(c => c != Card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)) && + !Bot.GetSpells().Any(c => c != Card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)) && + !Bot.GetMonsters().Any(c => c != Card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)) && + !Bot.HasInHandOrInSpellZone(CardId.PrimiteDrillbeam) && + !(Bot.GetMonsterCount() == 0 + && !Bot.Hand.Any(c => c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) && c != Card) + && !Bot.GetSpells().Any(c => c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) && c != Card && c.IsFacedown()) + ) + ) + { + return false; + } + break; + case CardId.SolemnReport: + { + if (Bot.LifePoints <= 1500) + { + return false; + } + break; + } + case CardId.ApophisTheSerpent: + case CardId.DominusImpulse: + case CardId.DominusPurge: + case CardId.DominusSpark: + if (Bot.GetSpells().Any(c => c.IsCode(Card.Id) && c.IsFacedown())) + { + return false; + } + break; + default: + break; + } + + List avoid_list = new List(); + int setForInfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setForInfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setForInfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + } +} \ No newline at end of file diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs index 98a876dec..7e844dc08 100644 --- a/Game/AI/DefaultExecutor.cs +++ b/Game/AI/DefaultExecutor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using YGOSharp.OCGWrapper.Enums; @@ -143,6 +143,12 @@ protected class _CardId public const int VaylantzWorld_KonigWissen = 75952542; public const int DivineArsenalAAZEUS_SkyThunder = 90448279; public const int LightningStorm = 14532163; + public const int MistakenArrest = 4227096; + public const int ThunderKingRaiOh = 71564252; + public const int ThunderDragonColossus = 15291624; + public const int DeckLockdown = 1149109; + public const int DoomZDestruction = 80320877; + public const int Mistake = 59305593; public const int BelialMarquisOfDarkness = 33655493; public const int ChirubiméPrincessOfAutumnLeaves = 87294988; @@ -224,6 +230,8 @@ protected class _Setcode public const int EarthboundImmortal = 0x1021; public const int Naturia = 0x2a; public const int Nordic = 0x42; + public const int TimeLord = 0x4a; + public const int Harpie = 0x64; public const int Madolche = 0x71; public const int Ghostrick = 0x8d; @@ -255,6 +263,18 @@ protected DefaultExecutor(GameAI ai, Duel duel) protected int lightningStormOption = -1; Dictionary calledbytheGraveIdCountMap = new Dictionary(); List crossoutDesignatorIdList = new List(); + int mistakenArrestAffectedCount = 0; + /// + /// List of effect IDs that have been resolved this turn. + /// + protected List resolvedEffectIdList = new List(); + /// + /// List of effect IDs that have been resolved by enemy this turn. + /// + protected List enemyResolvedEffectIdList = new List(); + + /// Columns 0-4 on Bot's field negated by Infinite Impermanence (enemy's col converted to ours: 4-col). Cleared at turn start. + protected List infiniteImpermanenceNegatedColumns = new List(); /// /// Defined: @@ -578,6 +598,42 @@ public override IList OnSelectCard(IList cards, int min, return null; } + public override void OnPlayerHint(int player, int hintType, int description) + { + base.OnPlayerHint(player, hintType, description); + if (player != 0 && player != 1) + return; + ClientField field = (player == 0) ? Bot : Enemy; + if (hintType == (int)PlayerHintType.DescAdd) + field.HintDescriptions.Add(description); + else if (hintType == (int)PlayerHintType.DescRemove) + field.HintDescriptions.Remove(description); + } + + public override void OnHintZone(int player, int zone) + { + base.OnHintZone(player, zone); + ChainInfo currentChainInfo = Duel.GetCurrentSolvingChainInfo(); + if (currentChainInfo != null) { + if (currentChainInfo.IsCode(_CardId.InfiniteImpermanence)) { + // Zone bit mapping: 0x100=col0, 0x200=col1, 0x400=col2, 0x800=col3, 0x1000=col4. + for (int i = 0; i <= 4; i++) + { + if ((zone & (0x100 << i)) == 0) + continue; + if (currentChainInfo.ActivatePlayer == 0) + { + infiniteImpermanenceNegatedColumns.Add(i); + } + else + { + infiniteImpermanenceNegatedColumns.Add(4 - i); + } + } + } + } + } + public override void OnReceivingAnnouce(int player, int data) { if (player == 1 && data == Util.GetStringId(_CardId.LightningStorm, 0) || data == Util.GetStringId(_CardId.LightningStorm, 1)) @@ -588,6 +644,39 @@ public override void OnReceivingAnnouce(int player, int data) base.OnReceivingAnnouce(player, data); } + public override void OnChainSolved(int chainIndex) + { + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null && !Duel.IsCurrentSolvingChainNegated()) + { + if (currentChain.IsActivateCode(_CardId.LockBird)) + { + resolvedEffectIdList.Add(_CardId.LockBird); + } + if (currentChain.ActivatePlayer == 1) + { + if (currentChain.IsActivateCode(_CardId.MaxxC)) + enemyResolvedEffectIdList.Add(_CardId.MaxxC); + if (currentChain.IsActivateCode(_CardId.MulcharmyPurulia)) + enemyResolvedEffectIdList.Add(_CardId.MulcharmyPurulia); + if (currentChain.IsActivateCode(_CardId.MulcharmyFuwalos)) + enemyResolvedEffectIdList.Add(_CardId.MulcharmyFuwalos); + if (currentChain.IsActivateCode(_CardId.MulcharmyNyalus)) + enemyResolvedEffectIdList.Add(_CardId.MulcharmyNyalus); + if (currentChain.IsActivateCode(_CardId.MistakenArrest)) + { + if (Duel.Player == 1) + { + mistakenArrestAffectedCount = Math.Max(mistakenArrestAffectedCount, 3); + } else + { + mistakenArrestAffectedCount = Math.Max(mistakenArrestAffectedCount, 2); + } + } + } + } + } + public override void OnChainEnd() { lightningStormOption = -1; @@ -599,7 +688,15 @@ public override void OnChainEnd() /// public override void OnNewTurn() { - if (Duel.Turn <= 1) calledbytheGraveIdCountMap.Clear(); + infiniteImpermanenceNegatedColumns.Clear(); + resolvedEffectIdList.Clear(); + enemyResolvedEffectIdList.Clear(); + if (Duel.Turn <= 1) + { + calledbytheGraveIdCountMap.Clear(); + mistakenArrestAffectedCount = 0; + } + mistakenArrestAffectedCount = Math.Max(mistakenArrestAffectedCount - 1, 0); List keyList = calledbytheGraveIdCountMap.Keys.ToList(); foreach (int dic in keyList) { @@ -1653,5 +1750,79 @@ protected virtual bool DefaultSetForDiabellze() } return false; } + + /// + /// Check whether all available spell columns are negated. + /// + /// + protected bool DefaultCheckAllAvailableSpellColumnNegated() + { + for (int i = 0; i < 5; i++) { + // occupied + if (Bot.SpellZone[i] != null) { + continue; + } + // negated + if (infiniteImpermanenceNegatedColumns.Contains(i)) { + continue; + } + // have empty column that's not negated + return false; + } + // all columns are negated + return true; + } + + /// + /// Check whether the spells will be negated. + /// + /// + /// + protected bool DefaultCheckWhetherSpellActivateWillBeNegated(ClientCard card) + { + if (card == null) return false; + if (card.Location == CardLocation.SpellZone) + { + return infiniteImpermanenceNegatedColumns.Contains(card.Sequence); + } + // check whether will be negated by Infinite Impermanence + return DefaultCheckAllAvailableSpellColumnNegated(); + } + + /// + /// Check whether bot can search cards from deck. + /// + /// + protected bool DefaultCheckWhetherBotCanSearch() + { + if (resolvedEffectIdList.Contains(_CardId.LockBird)) + return false; + if (mistakenArrestAffectedCount > 0) + return false; + if (Bot.HasInMonstersZone(_CardId.ThunderKingRaiOh, notDisabled: true, faceUp: true) + || Enemy.HasInMonstersZone(_CardId.ThunderKingRaiOh, notDisabled: true, faceUp: true)) + return false; + if (Enemy.HasInMonstersZone(_CardId.ThunderDragonColossus)) + return false; + if (Bot.HasInSpellZone(_CardId.DeckLockdown, notDisabled: true, faceUp: true) + || Enemy.HasInSpellZone(_CardId.DeckLockdown, notDisabled: true, faceUp: true) + || Bot.HasInSpellZone(_CardId.Mistake, notDisabled: true, faceUp: true) + || Enemy.HasInSpellZone(_CardId.Mistake, notDisabled: true, faceUp: true)) + return false; + if (Enemy.HasInSpellZone(_CardId.DoomZDestruction, notDisabled: true, faceUp: true)) + return false; + return true; + } + + /// + /// Check whether enemy can draw cards. + /// + /// + protected bool DefaultCheckWhetherEnemyCanDraw() + { + if (resolvedEffectIdList.Contains(_CardId.LockBird)) + return false; + return true; + } } } diff --git a/Game/AI/Executor.cs b/Game/AI/Executor.cs index c9604a866..db8341318 100644 --- a/Game/AI/Executor.cs +++ b/Game/AI/Executor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using YGOSharp.OCGWrapper.Enums; @@ -121,6 +121,27 @@ public virtual void OnDraw(int player) // Some AI need do something on draw } + /// + /// Called when a PlayerHint is received (e.g. effect description add/remove; can be used to track "once per turn" usage). + /// + /// Player index + /// Hint type, see PlayerHintType (DescAdd=6, DescRemove=7) + /// Effect description id (peffect->description) + public virtual void OnPlayerHint(int player, int hintType, int description) + { + // For overriding + } + + /// + /// Called when a zone hint is received. + /// + /// Player index. + /// Zone data (hinted zones, bit field). + public virtual void OnHintZone(int player, int zone) + { + // For overriding + } + public virtual void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) { // Some AI need do something on card's moving diff --git a/Game/ChainInfo.cs b/Game/ChainInfo.cs index 3e0bef0a2..5acd0b1fb 100644 --- a/Game/ChainInfo.cs +++ b/Game/ChainInfo.cs @@ -12,6 +12,7 @@ public class ChainInfo public ClientCard RelatedCard { get; private set; } public int ActivatePlayer { get; private set; } public int ActivateId { get; private set; } + public int ActivateAlias { get; private set; } public int ActivateController { get; private set; } public int ActivatePosition { get; private set; } public int ActivateSequence { get; private set; } @@ -35,6 +36,7 @@ public ChainInfo(ClientCard card, int player, int desc) RelatedCard = card; ActivatePlayer = player; ActivateId = card.Id; + ActivateAlias = card.Alias; ActivateController = card.Controller; ActivatePosition = card.Position; ActivateSequence = card.Sequence; @@ -61,6 +63,11 @@ public bool HasLocation(CardLocation location) return ((int)ActivateLocation & (int)location) != 0; } + public bool IsActivateCode(int id) + { + return ActivateId == id || Math.Abs(ActivateAlias - ActivateId) <= 20 && ActivateAlias == id; + } + public bool IsCode(int id) { return RelatedCard != null && RelatedCard.IsCode(id); diff --git a/Game/ClientField.cs b/Game/ClientField.cs index c1f92b070..54aa4a070 100644 --- a/Game/ClientField.cs +++ b/Game/ClientField.cs @@ -19,6 +19,8 @@ public class ClientField public ClientCard BattlingMonster; public bool UnderAttack; + public HashSet HintDescriptions { get; private set; } + public ClientField() { } @@ -32,6 +34,7 @@ public void Init(int deck, int extra) Banished = new List(); Deck = new List(); ExtraDeck = new List(); + HintDescriptions = new HashSet(); for (int i = 0; i < deck; ++i) Deck.Add(new ClientCard(0, CardLocation.Deck, -1)); diff --git a/Game/GameAI.cs b/Game/GameAI.cs index df9682aa2..20691a215 100644 --- a/Game/GameAI.cs +++ b/Game/GameAI.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Collections.Generic; using System.Threading; using WindBot.Game.AI; @@ -185,6 +185,27 @@ public void OnChainEnd() CheckSurrender(); } + /// + /// Called when a PlayerHint message is received (e.g. effect description add/remove hints). + /// + /// Player index + /// Hint type, see PlayerHintType (DescAdd=6, DescRemove=7) + /// Effect description id (peffect->description) + public void OnPlayerHint(int player, int hintType, int description) + { + Executor.OnPlayerHint(player, hintType, description); + } + + /// + /// Called when a zone hint is received. + /// + /// Player index. + /// Zone data (hinted zones, bit field). + public void OnHintZone(int player, int zone) + { + Executor.OnHintZone(player, zone); + } + /// /// Called when receiving annouce /// diff --git a/Game/GameBehavior.cs b/Game/GameBehavior.cs index 08e3d0746..269932e64 100644 --- a/Game/GameBehavior.cs +++ b/Game/GameBehavior.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -151,6 +151,7 @@ private void RegisterPackets() _messages.Add(GameMessage.FlipSummoning, OnSummoning); _messages.Add(GameMessage.FlipSummoned, OnSummoned); _messages.Add(GameMessage.ConfirmCards, OnConfirmCards); + _messages.Add(GameMessage.PlayerHint, OnPlayerHint); } private void OnJoinGame(BinaryReader packet) @@ -363,6 +364,11 @@ private void OnHint(BinaryReader packet) { _ai.OnReceivingAnnouce(player, data); } + if (type == 11) // HINT_ZONE + { + Logger.DebugWriteLine("HINT_ZONE received: player=" + player + ", zone=" + data); + _ai.OnHintZone(player, data); + } } private void OnStart(BinaryReader packet) @@ -2015,5 +2021,18 @@ private void OnConfirmCards(BinaryReader packet) Logger.WriteLine("(Confirm " + player.ToString() + "'s " + (CardLocation)loc + " card: " + (card.Name ?? "UnKnowCard") + ")"); } } + + /// + /// Handles PlayerHint message. Protocol: player(buffer8), hintType(buffer8), description(buffer32). + /// hintType values: PlayerHintType (e.g. PHINT_DESC_ADD=6, PHINT_DESC_REMOVE=7). + /// + private void OnPlayerHint(BinaryReader packet) + { + int player = GetLocalPlayer(packet.ReadByte()); + int hintType = packet.ReadByte(); + int description = packet.ReadInt32(); + Logger.DebugWriteLine("PlayerHint received: player=" + player + ", hintType=" + hintType + " (" + (PlayerHintType)hintType + "), description=" + description); + _ai.OnPlayerHint(player, hintType, description); + } } } diff --git a/WindBot.csproj b/WindBot.csproj index 80071b7a5..12d537f6b 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -1,4 +1,4 @@ - + @@ -70,6 +70,7 @@ + @@ -181,6 +182,7 @@ + diff --git a/YGOSharp.OCGWrapper.Enums/PlayerHintType.cs b/YGOSharp.OCGWrapper.Enums/PlayerHintType.cs new file mode 100644 index 000000000..2a2937660 --- /dev/null +++ b/YGOSharp.OCGWrapper.Enums/PlayerHintType.cs @@ -0,0 +1,13 @@ +namespace YGOSharp.OCGWrapper.Enums +{ + /// + /// Hint type for PlayerHint message (matches PHINT constants in core). + /// + public enum PlayerHintType + { + /// Add effect description hint + DescAdd = 6, + /// Remove effect description hint + DescRemove = 7 + } +} From 40db4637d98de5dcd9e4779860f147a202f9b222 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Mon, 16 Mar 2026 13:49:49 +0800 Subject: [PATCH 072/110] bot list order --- BotWrapper/bot.conf | 558 ++++++++++++++++++++++---------------------- 1 file changed, 279 insertions(+), 279 deletions(-) diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 2b97ad0a0..e1d4ba40f 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -1,280 +1,280 @@ -#bots list -# !name -# command -# description -# flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE, SUPPORT_MASTER_RULE_2020, SELECT_DECKFILE) - -!随机-非常简单 -Random=AI_LV1 -主要是一些沙包。 -SUPPORT_MASTER_RULE_2020 - -!随机-简单 -Random=AI_LV2 -一些比较弱的卡组。 -SUPPORT_MASTER_RULE_2020 - -!随机-一般 -Random=AI_LV3 -一些不是很弱的卡组。 -SUPPORT_MASTER_RULE_2020 - -!随机-普通 -Random=AI_LV4 -一些可以(或者曾经可以)在竞技环境里看到的卡组。 -SUPPORT_MASTER_RULE_2020 - -!随机-狂野 -Random=AI_WILD -普通的人机的卡组会符合其使用的卡池对应的环境的禁限卡表,但狂野模式的人机的卡组一般不符合任何禁限卡表。 -SUPPORT_MASTER_RULE_2020 - -!随机-报社 -Random=AI_ANTI_META -一些报复社会(针对主流卡组的弱点)的卡组。 -SUPPORT_MASTER_RULE_2020 - -!P2-自选卡组 -Name=P2 Deck=Lucky Dialog=gugugu.zh-CN -人机卡组由你选择。随缘出牌。 -SELECT_DECKFILE SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!悠悠 -Name=悠悠 Deck=MokeyMokey Dialog=mokey.zh-CN -沙包。 -AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!悠悠王 -Name=悠悠王 Deck=MokeyMokeyKing Dialog=mokey.zh-CN -大沙包。 -AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!谜之剑士LV4-龙骑星爆 -Name=谜之剑士LV4 Deck=Dragunity Dialog=swordsman.zh-CN -龙骑轴星尘龙爆裂体卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!谜之剑士LV4-L8 -Name=谜之剑士LV4 Deck='Level VIII' Dialog=swordsman.zh-CN -8星同调卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!谜之剑士LV4-R5 -Name=谜之剑士LV4 Deck='Rank V' Dialog=swordsman.zh-CN -5阶超量卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!谜之剑士LV4-异热同心武器 -Name=谜之剑士LV4 Deck='Zexal Weapons' Dialog=swordsman.zh-CN -神装电光皇卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!琪露诺-彩虹 -Name=琪露诺 Deck=Rainbow Dialog=cirno.zh-CN -全属性凡骨卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!琪露诺-饼蛙 -Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN -大师规则三的全盛饼蛙卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!复制植物-青眼 -Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN -青眼卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!复制植物-十二兽 -Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN -大师规则三的十四兽卡组。 -AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!尼亚-妖仙兽 -Name=尼亚 Deck=Yosenju Dialog=near.zh-CN -妖仙兽卡组。 -AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!尼亚-机壳 -Name=尼亚 Deck=Qliphort Dialog=near.zh-CN -机壳卡组。 -AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!尼亚-淘气仙星 -Name=尼亚 Deck=Trickstar Dialog=near.zh-CN -旧式淘气仙星卡组。 -AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!尼亚-幻变骚灵 -Name=尼亚 Deck=Altergeist Dialog=near.zh-CN -幻变骚灵卡组。 -AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!尼亚-拉比林斯迷宫 -Name=尼亚 Deck=Labrynth Dialog=near.zh-CN -拉比林斯迷宫卡组。 -AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!尼亚-于贝尔 -Name=尼亚 Deck=Yubel Dialog=near.zh-CN -于贝尔卡组。 -AI_LV4 SUPPORT_MASTER_RULE_2020 - -!复制梁龙-闪刀姬 -Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN -旧式闪刀姬卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!复制梁龙-自奏圣乐 -Name=复制梁龙 Deck=Orcust Dialog=anothercopy.zh-CN -旧式自奏圣乐卡组。 -AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!复制梁龙-转生炎兽 -Name=复制梁龙 Deck=Salamangreat Dialog=anothercopy.zh-CN -转生炎兽卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!复制梁龙-雷火沸动 -Name=复制梁龙 Deck=Ryzeal Dialog=anothercopy.zh-CN -初代雷火沸动卡组。 -AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!复制梁龙-码丽丝 -Name=复制梁龙 Deck=Maliss Dialog=anothercopy.zh-CN -MD全盛码丽丝卡组。 -AI_LV4 SUPPORT_MASTER_RULE_2020 - -!VI-1911-凭依装着 -Name=VI-1911 Deck=FamiliarPossessed Dialog=VI-1911.zh-CN -凭依装着卡组。 -AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!VI-1911-时劫者 -Name=VI-1911 Deck=TimeThief Dialog=VI-1911.zh-CN -时间潜行者卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!永远之魂-削血 -Name=永远之魂 Deck=Burn Dialog=soul.zh-CN -老式削血卡组。 -SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!永远之魂-青蛙 -Name=永远之魂 Deck=Frog Dialog=soul.zh-CN -老式青蛙卡组。 -AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!永远之魂-荷鲁斯 -Name=永远之魂 Deck=Horus Dialog=soul.zh-CN -老式龙族卡组。 -AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!比特机灵-微风 -Name=比特机灵 Deck=PureWinds Dialog=zh-CN -风属性卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!试作型机器人1732 -Name=试作型机器人1732 Deck=ST1732 Dialog=zh-CN -由三盒ST17和三盒SD32组成的卡组。 -AI_LV1 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!奇異果 -Name=奇異果 Deck=LightswornShaddoldinosour Dialog=kiwi.zh-TW -光道影依恐龙卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!奇魔果 -Name=奇魔果 Deck=DarkMagician Dialog=kiwi.zh-TW -黑魔术师卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!MAX龍果 -Name=MAX龍果 Deck=BlueEyesMaxDragon Dialog=kiwi.zh-TW -青眼混沌极龙卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!幻煌果 -Name=幻煌果 Deck=Phantasm Dialog=kiwi.zh-TW -幻煌龙卡组。 -AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!燃血鬥士 -Name=燃血鬥士 Deck=ChainBurn Dialog=kiwi.zh-TW -连锁烧卡组。 -AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!報社鬥士 -Name=報社鬥士 Deck=GrenMajuThunderBoarder Dialog=kiwi.zh-TW -红莲雷王滑板卡组。 -AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!我太帅了-真红眼龙骑士 -Name=我太帅了 Deck=Dragun Dialog=smart.zh-CN -超魔导真红眼龙骑士卡组。 -AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!我太帅了-水百凤凰勇者 -Name=我太帅了 Deck=Brave Dialog=smart.zh-CN -水机百头龙凤凰人勇者卡组。 -AI_LV4 SUPPORT_MASTER_RULE_2020 - -!玻璃女巫-魔女术 -Name=玻璃女巫 Deck=Witchcraft Dialog=verre.zh-CN -魔女术卡组。 -AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!玻璃女巫-救祓少女 -Name=玻璃女巫 Deck=Exosister Dialog=verre.zh-CN -救祓少女卡组。 -AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!艾克莉西娅-相剑 -Name=艾克莉西娅 Deck=Swordsoul Dialog=ecclesia.zh-CN -相剑卡组。 -AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!艾克莉西娅-教导 -Name=艾克莉西娅 Deck=Dogmatika Dialog=ecclesia.zh-CN -教导卡组。 -AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 - -!艾克莉西娅-阿不思 -Name=艾克莉西娅 Deck=Albaz Dialog=ecclesia.zh-CN -以阿不思的落胤为中心的卡组。 -AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 - -!神数不神-刹帝利 -Name=神数不神 Deck=Kashtira Dialog=Zefra.zh-CN -俱舍怒威族卡组。 -AI_LV4 SUPPORT_MASTER_RULE_2020 - -![狂野]神数不神-雷龙 -Name=神数不神 Deck=ThunderDragon Dialog=Zefra.zh-CN -深渊混沌雷龙卡组。 -AI_WILD SUPPORT_MASTER_RULE_2020 - -!神数不神-珠泪哀歌 -Name=神数不神 Deck=Tearlaments Dialog=Zefra.zh-CN -旧式地天使珠泪哀歌族卡组。 -AI_LV4 AI_WILD SUPPORT_MASTER_RULE_2020 - -!神数不神-神数 -Name=神数不神 Deck=Zefra Dialog=Zefra.zh-CN -神数卡组。 -AI_LV4 SUPPORT_MASTER_RULE_2020 - -!今晚有宵夜吗-超重武者 -Name=今晚有宵夜吗 Deck=SuperheavySamurai Dialog=superheavysamurai.zh-CN -超重武者卡组。 -AI_LV4 SUPPORT_MASTER_RULE_2020 - -!今晚有宵夜吗-码丽丝 -Name=今晚有宵夜吗 Deck=MalissOCG Dialog=Xiaoye.zh-CN -码丽丝卡组。 -AI_LV4 SUPPORT_MASTER_RULE_2020 - -!尼亚-王家的神殿 -Name=尼亚 Deck=Apophis Dialog=near.zh-CN -王家的神殿卡组。 +#bots list +# !name +# command +# description +# flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE, SUPPORT_MASTER_RULE_2020, SELECT_DECKFILE) + +!随机-非常简单 +Random=AI_LV1 +主要是一些沙包。 +SUPPORT_MASTER_RULE_2020 + +!随机-简单 +Random=AI_LV2 +一些比较弱的卡组。 +SUPPORT_MASTER_RULE_2020 + +!随机-一般 +Random=AI_LV3 +一些不是很弱的卡组。 +SUPPORT_MASTER_RULE_2020 + +!随机-普通 +Random=AI_LV4 +一些可以(或者曾经可以)在竞技环境里看到的卡组。 +SUPPORT_MASTER_RULE_2020 + +!随机-狂野 +Random=AI_WILD +普通的人机的卡组会符合其使用的卡池对应的环境的禁限卡表,但狂野模式的人机的卡组一般不符合任何禁限卡表。 +SUPPORT_MASTER_RULE_2020 + +!随机-报社 +Random=AI_ANTI_META +一些报复社会(针对主流卡组的弱点)的卡组。 +SUPPORT_MASTER_RULE_2020 + +!P2-自选卡组 +Name=P2 Deck=Lucky Dialog=gugugu.zh-CN +人机卡组由你选择。随缘出牌。 +SELECT_DECKFILE SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!悠悠 +Name=悠悠 Deck=MokeyMokey Dialog=mokey.zh-CN +沙包。 +AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!悠悠王 +Name=悠悠王 Deck=MokeyMokeyKing Dialog=mokey.zh-CN +大沙包。 +AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!谜之剑士LV4-龙骑星爆 +Name=谜之剑士LV4 Deck=Dragunity Dialog=swordsman.zh-CN +龙骑轴星尘龙爆裂体卡组。 +AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!谜之剑士LV4-L8 +Name=谜之剑士LV4 Deck='Level VIII' Dialog=swordsman.zh-CN +8星同调卡组。 +AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!谜之剑士LV4-R5 +Name=谜之剑士LV4 Deck='Rank V' Dialog=swordsman.zh-CN +5阶超量卡组。 +AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!谜之剑士LV4-异热同心武器 +Name=谜之剑士LV4 Deck='Zexal Weapons' Dialog=swordsman.zh-CN +神装电光皇卡组。 +AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!琪露诺-彩虹 +Name=琪露诺 Deck=Rainbow Dialog=cirno.zh-CN +全属性凡骨卡组。 +AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!琪露诺-饼蛙 +Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN +大师规则三的全盛饼蛙卡组。 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!复制植物-青眼 +Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN +青眼卡组。 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!复制植物-十二兽 +Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN +大师规则三的十四兽卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!尼亚-妖仙兽 +Name=尼亚 Deck=Yosenju Dialog=near.zh-CN +妖仙兽卡组。 +AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!尼亚-机壳 +Name=尼亚 Deck=Qliphort Dialog=near.zh-CN +机壳卡组。 +AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!尼亚-淘气仙星 +Name=尼亚 Deck=Trickstar Dialog=near.zh-CN +旧式淘气仙星卡组。 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!尼亚-幻变骚灵 +Name=尼亚 Deck=Altergeist Dialog=near.zh-CN +幻变骚灵卡组。 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!尼亚-拉比林斯迷宫 +Name=尼亚 Deck=Labrynth Dialog=near.zh-CN +拉比林斯迷宫卡组。 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!尼亚-于贝尔 +Name=尼亚 Deck=Yubel Dialog=near.zh-CN +于贝尔卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!尼亚-王家的神殿 +Name=尼亚 Deck=Apophis Dialog=near.zh-CN +王家的神殿卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!复制梁龙-闪刀姬 +Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN +旧式闪刀姬卡组。 +AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!复制梁龙-自奏圣乐 +Name=复制梁龙 Deck=Orcust Dialog=anothercopy.zh-CN +旧式自奏圣乐卡组。 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!复制梁龙-转生炎兽 +Name=复制梁龙 Deck=Salamangreat Dialog=anothercopy.zh-CN +转生炎兽卡组。 +AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!复制梁龙-雷火沸动 +Name=复制梁龙 Deck=Ryzeal Dialog=anothercopy.zh-CN +初代雷火沸动卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!复制梁龙-码丽丝 +Name=复制梁龙 Deck=Maliss Dialog=anothercopy.zh-CN +MD全盛码丽丝卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!VI-1911-凭依装着 +Name=VI-1911 Deck=FamiliarPossessed Dialog=VI-1911.zh-CN +凭依装着卡组。 +AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!VI-1911-时劫者 +Name=VI-1911 Deck=TimeThief Dialog=VI-1911.zh-CN +时间潜行者卡组。 +AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!永远之魂-削血 +Name=永远之魂 Deck=Burn Dialog=soul.zh-CN +老式削血卡组。 +SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!永远之魂-青蛙 +Name=永远之魂 Deck=Frog Dialog=soul.zh-CN +老式青蛙卡组。 +AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!永远之魂-荷鲁斯 +Name=永远之魂 Deck=Horus Dialog=soul.zh-CN +老式龙族卡组。 +AI_LV1 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!比特机灵-微风 +Name=比特机灵 Deck=PureWinds Dialog=zh-CN +风属性卡组。 +AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!试作型机器人1732 +Name=试作型机器人1732 Deck=ST1732 Dialog=zh-CN +由三盒ST17和三盒SD32组成的卡组。 +AI_LV1 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!奇異果 +Name=奇異果 Deck=LightswornShaddoldinosour Dialog=kiwi.zh-TW +光道影依恐龙卡组。 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!奇魔果 +Name=奇魔果 Deck=DarkMagician Dialog=kiwi.zh-TW +黑魔术师卡组。 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!MAX龍果 +Name=MAX龍果 Deck=BlueEyesMaxDragon Dialog=kiwi.zh-TW +青眼混沌极龙卡组。 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!幻煌果 +Name=幻煌果 Deck=Phantasm Dialog=kiwi.zh-TW +幻煌龙卡组。 +AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!燃血鬥士 +Name=燃血鬥士 Deck=ChainBurn Dialog=kiwi.zh-TW +连锁烧卡组。 +AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!報社鬥士 +Name=報社鬥士 Deck=GrenMajuThunderBoarder Dialog=kiwi.zh-TW +红莲雷王滑板卡组。 +AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!我太帅了-真红眼龙骑士 +Name=我太帅了 Deck=Dragun Dialog=smart.zh-CN +超魔导真红眼龙骑士卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!我太帅了-水百凤凰勇者 +Name=我太帅了 Deck=Brave Dialog=smart.zh-CN +水机百头龙凤凰人勇者卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!玻璃女巫-魔女术 +Name=玻璃女巫 Deck=Witchcraft Dialog=verre.zh-CN +魔女术卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!玻璃女巫-救祓少女 +Name=玻璃女巫 Deck=Exosister Dialog=verre.zh-CN +救祓少女卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!艾克莉西娅-相剑 +Name=艾克莉西娅 Deck=Swordsoul Dialog=ecclesia.zh-CN +相剑卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!艾克莉西娅-教导 +Name=艾克莉西娅 Deck=Dogmatika Dialog=ecclesia.zh-CN +教导卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!艾克莉西娅-阿不思 +Name=艾克莉西娅 Deck=Albaz Dialog=ecclesia.zh-CN +以阿不思的落胤为中心的卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!神数不神-刹帝利 +Name=神数不神 Deck=Kashtira Dialog=Zefra.zh-CN +俱舍怒威族卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +![狂野]神数不神-雷龙 +Name=神数不神 Deck=ThunderDragon Dialog=Zefra.zh-CN +深渊混沌雷龙卡组。 +AI_WILD SUPPORT_MASTER_RULE_2020 + +!神数不神-珠泪哀歌 +Name=神数不神 Deck=Tearlaments Dialog=Zefra.zh-CN +旧式地天使珠泪哀歌族卡组。 +AI_LV4 AI_WILD SUPPORT_MASTER_RULE_2020 + +!神数不神-神数 +Name=神数不神 Deck=Zefra Dialog=Zefra.zh-CN +神数卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!今晚有宵夜吗-超重武者 +Name=今晚有宵夜吗 Deck=SuperheavySamurai Dialog=superheavysamurai.zh-CN +超重武者卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!今晚有宵夜吗-码丽丝 +Name=今晚有宵夜吗 Deck=MalissOCG Dialog=Xiaoye.zh-CN +码丽丝卡组。 AI_LV4 SUPPORT_MASTER_RULE_2020 \ No newline at end of file From 293218b1d4bf1f571305a6ec83c406a56c55f20a Mon Sep 17 00:00:00 2001 From: Anna Sakryd <118321426+ChaosCrimson@users.noreply.github.com> Date: Mon, 23 Mar 2026 16:19:11 -0500 Subject: [PATCH 073/110] Update Enums --- .../Game/AI/Enums/DangerousMonster.cs | 5 + ExecutorBase/Game/AI/Enums/Floodgate.cs | 170 +++++++++++++++++- ExecutorBase/Game/AI/Enums/FusionSpell.cs | 59 +++++- .../Game/AI/Enums/InvincibleMonster.cs | 57 +++++- ExecutorBase/Game/AI/Enums/OneForXyz.cs | 12 +- .../Enums/PreventActivationEffectInBattle.cs | 5 +- ...houldBeDisabledBeforeItUseEffectMonster.cs | 22 ++- .../Game/AI/Enums/ShouldNotBeMonsterTarget.cs | 15 +- .../Game/AI/Enums/ShouldNotBeSpellTarget.cs | 10 +- .../Game/AI/Enums/ShouldNotBeTarget.cs | 13 +- 10 files changed, 340 insertions(+), 28 deletions(-) diff --git a/ExecutorBase/Game/AI/Enums/DangerousMonster.cs b/ExecutorBase/Game/AI/Enums/DangerousMonster.cs index ffd231c83..a99fdd00e 100644 --- a/ExecutorBase/Game/AI/Enums/DangerousMonster.cs +++ b/ExecutorBase/Game/AI/Enums/DangerousMonster.cs @@ -24,6 +24,11 @@ public enum DangerousMonster ZushintheSleepingGiant = 67547370, Heart_eartHDragon = 97403510, DaigustoSphreeze = 29552709, + YubelTheLovingDefenderForever = 47172959, + PhantomOfYubel = 80453041, + UzuhimeTheManifestedMikanko = 57566760, + MaidenInLove = 8445808, + MatadorArchfiend = 7622360 } } diff --git a/ExecutorBase/Game/AI/Enums/Floodgate.cs b/ExecutorBase/Game/AI/Enums/Floodgate.cs index 9141c5034..c7c997d72 100644 --- a/ExecutorBase/Game/AI/Enums/Floodgate.cs +++ b/ExecutorBase/Game/AI/Enums/Floodgate.cs @@ -71,6 +71,7 @@ public enum Floodgate ElShaddollConstruct = 20366274, ElShaddollGrysra = 48424886, ElShaddollWinda = 94977269, + HotRedDragonArchfiendAbyss = 9753964, UltimateConductorTytanno = 18940556, OvertexCoatls = 41782653, FirePrison = 269510, @@ -106,6 +107,171 @@ public enum Floodgate AdamancipatorRisenDragite = 9464441, TeardroptheRikkaQueen = 33779875, CeruleanSkyFire = 54828837, - SacredBeastAwakening = 53701259 + SacredBeastAwakening = 53701259, + GrandSpiritualArtIchirin = 38057522, + DualAvatarFeetArmoredUnGyo = 7631534, + VirtualWorldKyubiShenshen = 92519087, + VirtualWorldGateChuche = 13364097, + DragunityKnightAreadbhair = 88234821, + AiwasstheMagistusSpellSpirit = 35877582, + OneirostheDreamMirrorErlking = 35187185, + PlunderPatrollshipBrann = 94253655, + PlunderPatrollshipMoerk = 20248754, + PlunderPatrollshipLys = 18832779, + HollowGiants = 15462014, + GrozaTyrantofThunder = 45420955, + SpringansCaptainSargas = 29601381, + S_ForceOrrafist = 95974848, + AncientWarriors_RebelliousLuFeng = 82791472, + OneirostheDreamMirrorTormentor = 37678339, + SacredTreeBeastHyperyton = 9349094, + S_ForceJustify = 35334193, + UnderworldGoddessoftheClosedWorld = 98127546, + VampireVoivode = 4918855, + NekrozofAreadbhair = 39468724, + NekrozofUnicore = 89463537, + BenghalancertheResurgent = 73345237, + UrsarcticSeptentrion = 53087962, + TheIrisSwordsoul = 62849088, + AntihumanIntelligenceME_PSY_YA = 58844135, + MagikeyMechmortar_Garesglasser = 45877457, + ShootingMajesticStarDragon = 40939228, + StellarWindWolfrayet = 3322931, + ChronomalyVimana = 2609443, + CyberdarknessDragon = 18967507, + ClearWingSynchroDragon = 82044279, + CrystalClearWingSynchroDragon = 59765225, + BaronnedeFleur = 84815190, + Lyrilusc_EnsemblueRobin = 72971064, + Number4StealthKragen = 67557908, + Floowandereeze_Snowl = 53212882, + Floowandereeze_Empen = 80611581, + MasqueradetheBlazingDragon = 6855503, + DestinyHERO_DestroyerPhoenixEnforcer = 60461804, + SwordsoulGrandmaster_Chixiao = 69248256, + ZoroatheMagistusConflagrantCalamity = 95911373, + MasterflareHyperion = 63101468, + FallenSanctuary = 90312154, + MyutantBeast = 34695290, + MyutantArsenal = 7574904, + MyutantUltimus = 6182103, + Underdog = 5779502, + IcejadeKosmochlor = 3355732, + IllusionofChaos = 12266229, + SwordsoulSinisterSovereign_QixingLongyuan = 47710198, + DDDDeviserKingDeusMachinex = 46593546, + IcejadeErosion = 46593546, + NordicRelicSvalinn = 64797746, + OceanDragonLord_Kairyu_Shin = 23931679, + MarincessAquaArgonaut = 20934852, + MirrorjadetheIcebladeDragon = 44146295, + WitchcrafterVice_Madame = 9603252, + Therion_King_Regulus = 10604644, + StarvingVenomPredapowerFusionDragon = 39915560, + DinomorphiaRexterm = 92798873, + ExosistersMagnifica = 59242457, + IcejadeCurse = 83670388, + MamonakatheVaylantzUnited = 40680521, + LabrynthLabyrinth = 33407125, + RunickFountain = 92107604, + SprightRed = 75922381, + SprightCarrot = 2311090, + RikkaKonkon = 76869711, + PowerToolBraverDragon = 63265554, + MagikeyDeity_Ashtartu = 26988374, + RainbowOverdragon = 37440988, + TheBystialAlbaLos = 69120785, + KashtiraFenrir = 32909498, + MitsutheInsectNinja = 67282505, + VeratheVernusylphGoddess = 55125728, + TearlamentsRulkallos = 84330567, + Black_WingedAssaultDragon = 73218989, + BrandedBeast = 32756828, + GraphaDragonOverlordofDarkWorld = 39552584, + EpurrelyBeauty = 98049934, + ExpurrelyNoir = 83827392, + BeetrooperScaleBomber = 39041550, + EvigishkiNeremanas = 88926295, + ArktosXII_ChronochasmVaylantz = 50687050, + IcejadeGymirAegirine = 86682165, + KashtiraArise_Heart = 48626373, + LaevateinGeneraiderBossofShadows = 74615388, + SynchroZone = 60306277, + BystialDisPater = 27572350, + DespianLuluwalilith = 53971455, + FirewallDragonSingularity = 21637210, + BrandedEtude = 45675980, + EvolzarLars = 35103106, + AltergeistAdminia = 61470213, + EmperorCharlesTheGreat = 97864322, + YouReFinished = 88346805, + VolcanicEmperor = 46412900, + VolcanicInferno = 84138874, + RedZone = 50056656, + TGGlaiveBlaster = 95973569, + StellarNemesisTPHON_DoomsdayStar = 93039339, + SPLittleKnight = 29301450, + AngelRing = 40678060, + SkullGuardianProtectorOfTheVoicelessVoice = 10774240, + FloweringEtoileTheMelodiousMagnificat = 83793721, + EnlightenmentDragon = 46186135, + GoldPrideEradicator = 45464587, + VarudrasTheFinalBringerOfTheEndTimes = 70636044, + RagnaraikaStagSovereign = 42307760, + DrytronMeteonisAlphaDraconids = 56863746, + TheUnstoppableExodiaIncarnate = 83257450, + LightAndDarknessDragonLord = 19652159, + FiendsmithDiesIrae = 82135803, + MementomictlanTecuhtlicaCombinedConqueror = 14529511, + MadolcheQueenTiaraalaFraise = 49689480, + XYZHyperDragonCannon = 75748977, + ClearViciousKnight = 70095046, + Red_EyesBlackFullmetalDragon = 80870883, + MetalzoaX = 27268998, + AzaminaIliaSilvia = 46396218, + HeosvarogTheMechanicalDawn = 8963089, + LegendaryLordSixSamurai_ShiEn = 34235530, + NumberC32SharkDrakeLeVeiss = 7628844, + RyzealDetonator = 34909328, + MalissQHeartsCrypter = 21848500, + Blue_EyesUltimateSpiritDragon = 89604813, + TheiaThePrimalBeing = 85687952, + ArcanaForceEX_TheChaosRuler = 12686296, + SaintAzamina = 85065943, + CrystalClearWingOverSynchroDragon = 84343351, + JurracAstero = 52553102, + NekrozOfMetaltron = 13408726, + ZoroaTheMagistusVerethragna = 37260677, + DiabellstarVengeance = 23151193, + RegenesisWarrior = 96540807, + RegenesisSage = 22938501, + RegenesisDragon = 59323650, + Snake_EyesVengeanceDragon = 79415624, + LegendaryLordSixSamurai_Kizan = 42209438, + JuraishinTheCursedThunderGod = 78693036, + EclipseDragonRulerOfCatastrophes = 30350202, + AlliedCodeTalkerIgnister = 39138610, + EternalSunshine = 28903523, + RegenesisBirth = 27781371, + Ryu_GeEnd = 90664684, + SoulOfGaiaTheFierceKnight = 73129314, + K9_XWerewolf = 90303227, + ArtmageFinmel = 34541940, + LeoWizardTheDarkFiend = 55423549, + LunalightLigerDancer = 54701958, + ArtmageDiactorus = 27184601, + PsychicBlasterMk_II = 88139289, + NumberF0UtopicFutureZexal = 41522092, + VallonTheSuperPsySkyblaster = 40673853, + MasterPeaceTheTrueDracoverlord = 12800564, + MegalithNotrahPlura = 44293356, + AxonKickerOracle = 33171768, + DoomZXIIEnd_Drastrius = 95626382, + DDDSkyKingZeusRagnarok = 30998403, + DarkContractWithTheDifferentDimension = 54936778, + KillerTuneRedSeal = 15665977, + RBGa10Driller = 6043161, + RBGa10Cutter = 33438265, + RBLambdaBlade = 17188206 } -} +} \ No newline at end of file diff --git a/ExecutorBase/Game/AI/Enums/FusionSpell.cs b/ExecutorBase/Game/AI/Enums/FusionSpell.cs index b4859b555..e7f622a37 100644 --- a/ExecutorBase/Game/AI/Enums/FusionSpell.cs +++ b/ExecutorBase/Game/AI/Enums/FusionSpell.cs @@ -1,5 +1,8 @@ namespace WindBot.Game.AI.Enums { + /// + /// Spells and monsters that conduct a fusion summon, or have similar effect to fusion summon. + /// public enum FusionSpell { GemKnightFusion = 1264319, @@ -49,11 +52,63 @@ public enum FusionSpell DarkContractwiththeSwampKing = 73360025, NepheShaddollFusion = 60226558, FusionGate = 33550694, - DFusion = 26841274, + FusionDestiny = 52947044, PyroxeneFusion = 55824220, FragmentFusion = 72029628, NecroFusion = 81223446, PredaplantVerteAnaconda = 70369116, + DreamMirrorofChaos = 98570539, + PlunderPatrollShipshapeShipsShipping = 44227727, + FireFormationIngen = 29143457, + ParametalfoesFusion = 58549532, + ReadyFusion = 63854005, + BrandedinWhite = 34995106, + BrandedinRed = 82738008, + FaceCardFusion = 29062925, + MyutantFusion = 42577802, + MyutantCry = 31855260, + FallenOfAlbaz = 68468459, + GreaterPolymerization = 7614732, + UltimateFusion = 71143015, + BrandedFusion = 44362883, + GhostFusion = 35705817, + WitchcrafterConfusionConfession = 35098357, + BrandedBanishment = 6763530, + DinomorphiaDomain = 26631975, + DinomorphiaFrenzy = 78420796, + SouloftheSupremeKing = 92428405, + InstantContact = 16169772, + ScatterFusion = 40597694, + FavoriteContact = 75047173, + AmazonessSecretArts = 86758746, + DarkWorldAccession = 65956182, + BeetrooperLanding = 13234975, + FusionReproduction = 43331750, + ChimeraFusion = 63136489, + HarmonicSynchroFusion = 7473735, + SouloftheSupremeCelestialKing = 76840111, + MelodiousConcerto = 31458630, + MementotlanFusion = 66518509, + TheHallowedAzamina = 94845588, + AzaminaDebtors = 20934683, + AzaminaDetermination = 42201897, + HeavyPolymerization = 58570206, + DoubleFusion = 10218411, + DarkContact = 77124096, + GemKnightMasterDiamondDispersion = 25342956, + GemKnightDispersion = 24220368, + DracotailFaimena = 1498449, + DracotailMululu = 7375867, + KetuDracotail = 6153210, + RahuDracotail = 32548318, + ArtmagePowerPatron = 23829452, + ArtmageMasterworkSuccession = 37517035, + TeleportFusion = 36494597, + PrimiteFusion = 99161253, + TheGazeOfTimaeus = 22283204, + MutinyInTheSky = 71593652, + HuntingHorn = 55421040, + BlazingCartesia = 95515789 } -} +} \ No newline at end of file diff --git a/ExecutorBase/Game/AI/Enums/InvincibleMonster.cs b/ExecutorBase/Game/AI/Enums/InvincibleMonster.cs index 794096b6f..932295915 100644 --- a/ExecutorBase/Game/AI/Enums/InvincibleMonster.cs +++ b/ExecutorBase/Game/AI/Enums/InvincibleMonster.cs @@ -1,7 +1,7 @@ namespace WindBot.Game.AI.Enums { /// - /// Cards that are invincible to battle and should always attack to use effect. + /// Cards that are invincible in battle and should always attack to use effect. /// public enum InvincibleBotMonster { @@ -25,10 +25,16 @@ public enum InvincibleBotMonster DaigustoSphreez = 29552709, Number92HearteartHDragon = 97403510, NumberC96DarkStorm = 77205367, - Number54LionHeart = 54366836 + Number54LionHeart = 54366836, + Number2NinjaShadowMosquito = 32453837, + OhimetheManifestedMikanko = 81260679, + NightmareMagician = 40221691, + ArahimetheManifestedMikanko = 75771170, + UzuhimeTheManifestedMikanko = 57566760, + ArchfiendMatador = 7622360 } /// - /// Cards that are invincible to battle. + /// Cards that are invincible in battle. /// public enum InvincibleEnemyMonster { @@ -93,6 +99,47 @@ public enum InvincibleEnemyMonster GoukiTheGiantOgre = 47946130, BorrelswordDragon = 85289965, NumberF0UtopicFutureDragon = 26973555, - BorrelendDragon = 98630720 + BorrelendDragon = 98630720, + MimickingMan_EaterBug = 72427512, + ShiningPiecephilia = 49776811, + BrigrandtheGloryDragon = 34848821, + AmazonessQueen = 15951532, + Number2NinjaShadowMosquito = 32453837, + OhimetheManifestedMikanko = 81260679, + CornfieldCoatl = 92565383, + MirrorSwordknight = 28954097, + NightmareMagician = 40221691, + ArahimetheManifestedMikanko = 75771170, + UFOLight = 9275482, + TaotheGreatChanter = 34541543, + SpiritOfYubel = 90829280, + DarkGuardian = 26746975, + EnvoyOfTheWaxState = 87462901, + Fluffyfluff = 85401123, + YubelDasEwigLiebeWachter = 47172959, + TenpaiDragonFadra = 65326118, + GolgoilTheSteelSeismicSmasher = 59369430, + TalonsOfShurilane = 74150658, + NightmareApprentice = 58143852, + MillenniumoonMaiden = 37552929, + MillenniumFiendReflection = 63947968, + HereticalPhoboscobos = 76078185, + TopHatHareTheSilhouetteMagician = 1528054, + Silhouhatte = 24440742, + TheDukeofDemise = 45445571, + EvilHERONeosLord = 13708888, + GladiatorBeastDareios = 72246674, + Number69HeraldryCrest_DarkMatterDemolition = 77571454, + FirstOfTheDragonlords = 53466722, + UzuhimeTheManifestedMikanko = 57566760, + HecahandsIbel = 95365081, + HecahandsYadel = 32759190, + HecahandsGoddus = 68144894, + HecahandsGygas = 95132593, + HecahandsBreus = 21637502, + HecahandsJawza = 67021206, + HecahandsXeno = 94410955, + MaidenInLove = 8445808, + ArchfiendMatador = 7622360 } -} +} \ No newline at end of file diff --git a/ExecutorBase/Game/AI/Enums/OneForXyz.cs b/ExecutorBase/Game/AI/Enums/OneForXyz.cs index 074fae2ad..8205777d3 100644 --- a/ExecutorBase/Game/AI/Enums/OneForXyz.cs +++ b/ExecutorBase/Game/AI/Enums/OneForXyz.cs @@ -1,5 +1,8 @@ namespace WindBot.Game.AI.Enums { + /// + /// Monsters that can be used as the sole material for an XYZ summon + /// public enum OneForXyz { ZoodiacThoroughblade = 77150143, @@ -18,6 +21,11 @@ public enum OneForXyz GalaxyEyesCipherDragon = 18963306, Number107 = 88177324, CyberDragonNova = 58069384, - Number39 = 84013237 + Number39 = 84013237, + Argostars_GloriousAdra = 91438674, + Argostars_LightningTydeu = 65889305, + Argostars_SwiftCapane = 91284003, + Argostars_SlayerEteo = 38379052, + Argostars_FierceParthe = 21050476 } -} +} \ No newline at end of file diff --git a/ExecutorBase/Game/AI/Enums/PreventActivationEffectInBattle.cs b/ExecutorBase/Game/AI/Enums/PreventActivationEffectInBattle.cs index 34f98e6db..059793e9d 100644 --- a/ExecutorBase/Game/AI/Enums/PreventActivationEffectInBattle.cs +++ b/ExecutorBase/Game/AI/Enums/PreventActivationEffectInBattle.cs @@ -11,5 +11,8 @@ public enum PreventActivationEffectInBattle SamuraiDestroyer = 40509732, ArmadesKeeperOfBoundaries = 88033975, NumberS39UtopiaTheLightning = 56832966, + DualAvatarEmpoweredKonGyo = 33026283, + GoukiTheTyrantOgre = 7782069, + SangenpaiTranscendentDragion = 18969888 } -} +} \ No newline at end of file diff --git a/ExecutorBase/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs b/ExecutorBase/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs index 547e0c164..8a6fb7d87 100644 --- a/ExecutorBase/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs +++ b/ExecutorBase/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs @@ -51,11 +51,27 @@ public enum ShouldBeDisabledBeforeItUseEffectMonster RedFamiliar = 8372133, AccesscodeTalker = 86066372, ChaosSummoningBeast = 27439792, - CosmoBrain = 85679527, ShiranuiSolitaire = 94801854, Mixeroid = 71340250, LonefireBlossom = 48686504, - BrotherhoodoftheFireFist_Leopard = 39699564 + BrotherhoodoftheFireFist_Leopard = 39699564, + SpringansPedor = 56818977, + GizmekNaganakitheSunriseSignaler = 96399967, + MyutantMutant = 26561172, + ThreeEyedGhost = 31464658, + UrsarcticPolarStar = 62714453, + BattlinBoxerPromoter = 83315222, + TGRocketSalamander = 77392987, + GGolemRockHammer = 98875863, + WishDragon = 64583600, + ChaosWitch = 30327674, + FissioningMotherSpider = 34034150, + AncientGearStatue = 32762201, + SplittingPlanarian = 44175358, + TestBear = 62076252, + RescueHedgehog = 99742859, + SuperQuantalFairyZetan = 66646087, + LightWaterDragon = 82616239 } -} +} \ No newline at end of file diff --git a/ExecutorBase/Game/AI/Enums/ShouldNotBeMonsterTarget.cs b/ExecutorBase/Game/AI/Enums/ShouldNotBeMonsterTarget.cs index 855824e2a..9730bc256 100644 --- a/ExecutorBase/Game/AI/Enums/ShouldNotBeMonsterTarget.cs +++ b/ExecutorBase/Game/AI/Enums/ShouldNotBeMonsterTarget.cs @@ -1,8 +1,8 @@ -namespace WindBot.Game.AI.Enums +namespace WindBot.Game.AI.Enums { /// - /// Cards that are can't be selected as target of monster's effect, or immuned to monster's effect. - /// So them shouldn't be tried to be selected as target of monster at most times. + /// Cards that are can't be selected as target of monster's effect, or immune to monster's effect. + /// So they shouldn't be selected as target of monster at most times. /// public enum ShouldNotBeMonsterTarget { @@ -13,7 +13,12 @@ public enum ShouldNotBeMonsterTarget CXyzSimontheGreatMoralLeader = 41147577, PaleozoicAnomalocaris = 61307542, PaleozoicOpabinia = 37649320, + PaleozoicCambroraster = 36346532, BorreloadDragon = 31833038, - BorrelendDragon = 98630720 + BorrelendDragon = 98630720, + DrytronMeteonisDraconids = 69815951, + MyutantBeast = 34695290, + VeidosTheDragonOfEndlessDarkness = 8540986, + FirstOfTheDragonlords = 53466722 } -} +} \ No newline at end of file diff --git a/ExecutorBase/Game/AI/Enums/ShouldNotBeSpellTarget.cs b/ExecutorBase/Game/AI/Enums/ShouldNotBeSpellTarget.cs index fa78eaf90..31715bf40 100644 --- a/ExecutorBase/Game/AI/Enums/ShouldNotBeSpellTarget.cs +++ b/ExecutorBase/Game/AI/Enums/ShouldNotBeSpellTarget.cs @@ -1,14 +1,16 @@ namespace WindBot.Game.AI.Enums { /// - /// Cards that are can't be selected as target of spell&trap's effect, or immuned to spell&trap's effect. - /// So them shouldn't be tried to be selected as target of spell&trap at most times. + /// Cards that are can't be selected as target of spell&trap's effect, or immune to spell&trap's effect. + /// So they shouldn't be selected as target of spell&trap at most times. /// public enum ShouldNotBeSpellTrapTarget { ApoqliphortTowers = 27279764, ApoqliphortSkybase = 40061558, TheLegendaryFishermanIII = 44968687, - ChaosAncientGearGiant = 51788412 + ChaosAncientGearGiant = 51788412, + DrytronMeteonisQuadrantids = 95209656, + ElShaddollMeshahrail = 32467459 } -} +} \ No newline at end of file diff --git a/ExecutorBase/Game/AI/Enums/ShouldNotBeTarget.cs b/ExecutorBase/Game/AI/Enums/ShouldNotBeTarget.cs index c3e066d7e..8a0369d2a 100644 --- a/ExecutorBase/Game/AI/Enums/ShouldNotBeTarget.cs +++ b/ExecutorBase/Game/AI/Enums/ShouldNotBeTarget.cs @@ -1,8 +1,8 @@ namespace WindBot.Game.AI.Enums { /// - /// Cards that are can't be selected as target, or immuned to most effect. - /// So them shouldn't be tried to be selected as target at most times. + /// Cards that can't be selected as target, or immune to most effects. + /// So they shouldn't be selected as target most times. /// public enum ShouldNotBeTarget { @@ -49,6 +49,11 @@ public enum ShouldNotBeTarget Blackwing_FullArmoredWing = 54082269, DragunofRedEyes = 37818794, RedEyesBDragon = 74677422, // sometimes the name of DragunofRedEyes will be changed to RedEyesBDragon - TheArrivalCyberseIgnister = 11738489 + TheArrivalCyberseIgnister = 11738489, + MajespecterPorcupineYamaarashi = 51073802, + RaidraptorRisingRebellionFalcon = 71222868, + Number97Draglubion = 28400508, + SaintAzamina = 85065943, + LunalightLigerDancer = 54701958 } -} +} \ No newline at end of file From a7efa204b8d8845cbe2a3c7dc9d0f9968a979de8 Mon Sep 17 00:00:00 2001 From: Anna Sakryd <118321426+ChaosCrimson@users.noreply.github.com> Date: Mon, 23 Mar 2026 16:19:23 -0500 Subject: [PATCH 074/110] Update WindBot.csproj --- WindBot.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/WindBot.csproj b/WindBot.csproj index 5b50096e1..2e9e91b24 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -5,6 +5,7 @@ $(MSBuildProjectDirectory)/out/$(MSBuildProjectName)/obj $(BaseIntermediateOutputPath) + Debug From 483538a4b41169f2de133ba8026450138ba08294 Mon Sep 17 00:00:00 2001 From: Anna Sakryd <118321426+ChaosCrimson@users.noreply.github.com> Date: Mon, 30 Mar 2026 13:33:59 -0500 Subject: [PATCH 075/110] Merge remote-tracking branch 'iceygo/master' and fixed diffs --- BotWrapper/bot.conf | 103 +- Decks/AI_Albaz.ydk | 64 + Decks/AI_Apophis.ydk | 59 + Decks/AI_Dogmatika.ydk | 64 +- Decks/AI_Exosister.ydk | 60 + Decks/AI_Labrynth.ydk | 59 + Decks/AI_Maliss.ydk | 58 + Decks/AI_MalissOCG.ydk | 59 + Decks/AI_Ryzeal.ydk | 74 + Decks/AI_SuperheavySamurai.ydk | 59 + Decks/AI_Swordsoul.ydk | 30 +- Decks/AI_Yubel.ydk | 58 + Decks/AI_Zefra.ydk | 79 + ExecutorBase/ExecutorBase.csproj | 1 + ExecutorBase/Game/AI/AIUtil.cs | 113 +- ExecutorBase/Game/AI/CardContainer.cs | 9 + ExecutorBase/Game/AI/DefaultExecutor.cs | 93 +- ExecutorBase/Game/AI/Executor.cs | 60 +- ExecutorBase/Game/AI/HintMsg.cs | 9 +- ExecutorBase/Game/ChainInfo.cs | 97 + ExecutorBase/Game/ClientCard.cs | 16 + ExecutorBase/Game/ClientField.cs | 3 + ExecutorBase/Game/Dialogs.cs | 18 + ExecutorBase/Game/Duel.cs | 29 + ExecutorBase/Game/GameAI.cs | 5 + .../YGOSharp.OCGWrapper.Enums/CardRace.cs | 2 +- Game/AI/Decks/AlbazExecutor.cs | 5861 +++++++++++++++++ Game/AI/Decks/AltergeistExecutor.cs | 104 +- Game/AI/Decks/ApophisExecutor.cs | 3076 +++++++++ Game/AI/Decks/BlueEyesExecutor.cs | 23 +- Game/AI/Decks/BlueEyesMaxDragonExecutor.cs | 2 + Game/AI/Decks/BraveExecutor.cs | 14 +- Game/AI/Decks/ChainBurnExecutor.cs | 1 + Game/AI/Decks/DarkMagicianExecutor.cs | 5 + Game/AI/Decks/DoEveryThingExecutor.cs | 4 +- Game/AI/Decks/DogmatikaExecutor.cs | 2902 ++++++++ Game/AI/Decks/DragunExecutor.cs | 6 +- Game/AI/Decks/DragunityExecutor.cs | 1 + Game/AI/Decks/ExosisterExecutor.cs | 2990 +++++++++ Game/AI/Decks/FrogExecutor.cs | 1 + .../Decks/GrenMajuThunderBoarderExecutor.cs | 5 +- Game/AI/Decks/HorusExecutor.cs | 8 +- Game/AI/Decks/KashtiraExecutor.cs | 63 +- Game/AI/Decks/LabrynthExecutor.cs | 4356 ++++++++++++ Game/AI/Decks/Level8Executor.cs | 5 +- .../LightswornShaddoldinosourExecutor.cs | 6 + Game/AI/Decks/LuckyExecutor.cs | 22 +- Game/AI/Decks/MalissExecutor.cs | 4216 ++++++++++++ Game/AI/Decks/MalissOCGExecutor.cs | 1493 +++++ Game/AI/Decks/MathMechExecutor.cs | 6 +- Game/AI/Decks/OldSchoolExecutor.cs | 4 +- Game/AI/Decks/OrcustExecutor.cs | 16 +- Game/AI/Decks/PhantasmExecutor.cs | 2 +- Game/AI/Decks/PureWindsExecutor.cs | 1 + Game/AI/Decks/QliphortExecutor.cs | 2 + Game/AI/Decks/RainbowExecutor.cs | 2 + Game/AI/Decks/Rank5Executor.cs | 1 + Game/AI/Decks/RyzealExecutor.cs | 4129 ++++++++++++ Game/AI/Decks/ST1732Executor.cs | 5 +- Game/AI/Decks/SalamangreatExecutor.cs | 7 +- Game/AI/Decks/SkyStrikerExecutor.cs | 5 +- Game/AI/Decks/SuperheavySamuraiExecutor.cs | 1219 ++++ Game/AI/Decks/SwordsoulExecutor.cs | 5007 +++++++------- Game/AI/Decks/TearlamentsExecutor.cs | 36 +- Game/AI/Decks/ThunderDragonExecutor.cs | 20 +- Game/AI/Decks/TimeThiefExecutor.cs | 9 +- Game/AI/Decks/ToadallyAwesomeExecutor.cs | 4 + Game/AI/Decks/TrickstarExecutor.cs | 165 +- Game/AI/Decks/WitchcraftExecutor.cs | 363 +- Game/AI/Decks/YosenjuExecutor.cs | 3 +- Game/AI/Decks/YubelExecutor.cs | 2359 +++++++ Game/AI/Decks/ZefraExecutor.cs | 2214 +++++++ Game/AI/Decks/ZoodiacExecutor.cs | 5 +- WindBot.csproj | 11 +- bots.json | 54 + libWindbot.csproj | 16 +- 76 files changed, 39419 insertions(+), 2691 deletions(-) create mode 100644 Decks/AI_Albaz.ydk create mode 100644 Decks/AI_Apophis.ydk create mode 100644 Decks/AI_Exosister.ydk create mode 100644 Decks/AI_Labrynth.ydk create mode 100644 Decks/AI_Maliss.ydk create mode 100644 Decks/AI_MalissOCG.ydk create mode 100644 Decks/AI_Ryzeal.ydk create mode 100644 Decks/AI_SuperheavySamurai.ydk create mode 100644 Decks/AI_Yubel.ydk create mode 100644 Decks/AI_Zefra.ydk create mode 100644 ExecutorBase/Game/ChainInfo.cs create mode 100644 Game/AI/Decks/AlbazExecutor.cs create mode 100644 Game/AI/Decks/ApophisExecutor.cs create mode 100644 Game/AI/Decks/DogmatikaExecutor.cs create mode 100644 Game/AI/Decks/ExosisterExecutor.cs create mode 100644 Game/AI/Decks/LabrynthExecutor.cs create mode 100644 Game/AI/Decks/MalissExecutor.cs create mode 100644 Game/AI/Decks/MalissOCGExecutor.cs create mode 100644 Game/AI/Decks/RyzealExecutor.cs create mode 100644 Game/AI/Decks/SuperheavySamuraiExecutor.cs create mode 100644 Game/AI/Decks/YubelExecutor.cs create mode 100644 Game/AI/Decks/ZefraExecutor.cs diff --git a/BotWrapper/bot.conf b/BotWrapper/bot.conf index 7c276289d..f04ec2c1c 100644 --- a/BotWrapper/bot.conf +++ b/BotWrapper/bot.conf @@ -14,9 +14,19 @@ Random=AI_LV2 一些比较弱的卡组。 SUPPORT_MASTER_RULE_2020 -!随机-普通 +!随机-一般 Random=AI_LV3 -一些环境里可以看到的卡组。 +一些不是很弱的卡组。 +SUPPORT_MASTER_RULE_2020 + +!随机-普通 +Random=AI_LV4 +一些可以(或者曾经可以)在竞技环境里看到的卡组。 +SUPPORT_MASTER_RULE_2020 + +!随机-狂野 +Random=AI_WILD +普通的人机的卡组会符合其使用的卡池对应的环境的禁限卡表,但狂野模式的人机的卡组一般不符合任何禁限卡表。 SUPPORT_MASTER_RULE_2020 !随机-报社 @@ -67,17 +77,17 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !琪露诺-饼蛙 Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN 大师规则三的全盛饼蛙卡组。 -SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !复制植物-青眼 Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN 青眼卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !复制植物-十二兽 Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN 大师规则三的十四兽卡组。 -SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 !尼亚-妖仙兽 Name=尼亚 Deck=Yosenju Dialog=near.zh-CN @@ -92,12 +102,27 @@ AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2 !尼亚-淘气仙星 Name=尼亚 Deck=Trickstar Dialog=near.zh-CN 旧式淘气仙星卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !尼亚-幻变骚灵 Name=尼亚 Deck=Altergeist Dialog=near.zh-CN 幻变骚灵卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!尼亚-拉比林斯迷宫 +Name=尼亚 Deck=Labrynth Dialog=near.zh-CN +拉比林斯迷宫卡组。 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!尼亚-于贝尔 +Name=尼亚 Deck=Yubel Dialog=near.zh-CN +于贝尔卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!尼亚-王家的神殿 +Name=尼亚 Deck=Apophis Dialog=near.zh-CN +王家的神殿卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 !复制梁龙-闪刀姬 Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN @@ -107,13 +132,23 @@ AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !复制梁龙-自奏圣乐 Name=复制梁龙 Deck=Orcust Dialog=anothercopy.zh-CN 旧式自奏圣乐卡组。 -AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !复制梁龙-转生炎兽 Name=复制梁龙 Deck=Salamangreat Dialog=anothercopy.zh-CN 转生炎兽卡组。 AI_LV3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +!复制梁龙-雷火沸动 +Name=复制梁龙 Deck=Ryzeal Dialog=anothercopy.zh-CN +初代雷火沸动卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!复制梁龙-码丽丝 +Name=复制梁龙 Deck=Maliss Dialog=anothercopy.zh-CN +MD全盛码丽丝卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + !VI-1911-凭依装着 Name=VI-1911 Deck=FamiliarPossessed Dialog=VI-1911.zh-CN 凭依装着卡组。 @@ -147,7 +182,7 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !试作型机器人1732 Name=试作型机器人1732 Deck=ST1732 Dialog=zh-CN 由三盒ST17和三盒SD32组成的卡组。 -AI_LV2 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV1 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !奇異果 Name=奇異果 Deck=LightswornShaddoldinosour Dialog=kiwi.zh-TW @@ -162,7 +197,7 @@ AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !MAX龍果 Name=MAX龍果 Deck=BlueEyesMaxDragon Dialog=kiwi.zh-TW 青眼混沌极龙卡组。 -AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !幻煌果 Name=幻煌果 Deck=Phantasm Dialog=kiwi.zh-TW @@ -182,29 +217,59 @@ AI_ANTI_META SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2 !我太帅了-真红眼龙骑士 Name=我太帅了 Deck=Dragun Dialog=smart.zh-CN 超魔导真红眼龙骑士卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !我太帅了-水百凤凰勇者 Name=我太帅了 Deck=Brave Dialog=smart.zh-CN 水机百头龙凤凰人勇者卡组。 -AI_LV3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_2020 -!玻璃女巫 +!玻璃女巫-魔女术 Name=玻璃女巫 Deck=Witchcraft Dialog=verre.zh-CN 魔女术卡组。 -AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 + +!玻璃女巫-救祓少女 +Name=玻璃女巫 Deck=Exosister Dialog=verre.zh-CN +救祓少女卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!艾克莉西娅-相剑 +Name=艾克莉西娅 Deck=Swordsoul Dialog=ecclesia.zh-CN +相剑卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 + +!艾克莉西娅-教导 +Name=艾克莉西娅 Deck=Dogmatika Dialog=ecclesia.zh-CN +教导卡组。 +AI_LV4 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 !神数不神-刹帝利 Name=神数不神 Deck=Kashtira Dialog=Zefra.zh-CN 俱舍怒威族卡组。 -AI_LV3 SUPPORT_MASTER_RULE_2020 +AI_LV4 SUPPORT_MASTER_RULE_2020 -![狂野模式]神数不神-雷龙 +![狂野]神数不神-雷龙 Name=神数不神 Deck=ThunderDragon Dialog=Zefra.zh-CN -深渊混沌雷龙卡组。(普通模式的人机的卡组会符合其使用的卡池对应的环境的禁限卡表,但在狂野模式中,人机的卡组不符合任何禁限卡表。) -SUPPORT_MASTER_RULE_2020 +深渊混沌雷龙卡组。 +AI_WILD SUPPORT_MASTER_RULE_2020 !神数不神-珠泪哀歌 Name=神数不神 Deck=Tearlaments Dialog=Zefra.zh-CN 旧式地天使珠泪哀歌族卡组。 -AI_LV3 SUPPORT_MASTER_RULE_2020 +AI_LV4 AI_WILD SUPPORT_MASTER_RULE_2020 + +!神数不神-神数 +Name=神数不神 Deck=Zefra Dialog=Zefra.zh-CN +神数卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!今晚有宵夜吗-超重武者 +Name=今晚有宵夜吗 Deck=SuperheavySamurai Dialog=superheavysamurai.zh-CN +超重武者卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 + +!今晚有宵夜吗-码丽丝 +Name=今晚有宵夜吗 Deck=MalissOCG Dialog=Xiaoye.zh-CN +码丽丝卡组。 +AI_LV4 SUPPORT_MASTER_RULE_2020 \ No newline at end of file diff --git a/Decks/AI_Albaz.ydk b/Decks/AI_Albaz.ydk new file mode 100644 index 000000000..19a1b0bff --- /dev/null +++ b/Decks/AI_Albaz.ydk @@ -0,0 +1,64 @@ +#created by ... +#main +32731036 +25451383 +60242223 +62962630 +62962630 +62962630 +68468459 +68468459 +45484331 +45883110 +95515789 +19096726 +14558127 +14558127 +14558127 +23434538 +23434538 +23434538 +36577931 +1984618 +1984618 +6498706 +6498706 +34995106 +44362883 +75500286 +81439173 +24224830 +24224830 +29948294 +36637374 +65681983 +82738008 +18973184 +10045474 +10045474 +10045474 +19271881 +32756828 +17751597 +#extra +11321089 +38811586 +44146295 +44146295 +92892239 +70534340 +3410461 +24915933 +72272462 +1906812 +41373230 +51409648 +87746184 +87746184 +53971455 +!side +56787189 +55273561 +68468460 +72554664 +95515790 \ No newline at end of file diff --git a/Decks/AI_Apophis.ydk b/Decks/AI_Apophis.ydk new file mode 100644 index 000000000..f45ad0a8a --- /dev/null +++ b/Decks/AI_Apophis.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +62514770 +60411677 +60411677 +63198739 +63198739 +97522863 +97522863 +97522863 +49238328 +49238328 +73628505 +29095457 +56506740 +56506740 +56506740 +69299029 +69299029 +69299029 +6325660 +6325660 +6325660 +10045474 +10045474 +10045474 +40366667 +40366667 +58053438 +58053438 +58053438 +97045737 +97045737 +97045737 +85888377 +85888377 +95561146 +95561146 +95561146 +59576447 +78114463 +78114463 +#extra +97800311 +97800311 +97800311 +96633955 +96633955 +84815190 +84815190 +26096328 +38354018 +46772449 +29301450 +1528054 +1528054 +98978921 +98978921 +!side diff --git a/Decks/AI_Dogmatika.ydk b/Decks/AI_Dogmatika.ydk index 91e183121..c66e48b2c 100644 --- a/Decks/AI_Dogmatika.ydk +++ b/Decks/AI_Dogmatika.ydk @@ -1,59 +1,59 @@ -#created by AlphaKretin +#created by ... #main +51522296 +51522296 +62849088 +69680031 69680031 95679145 -3717252 +72270339 60303688 60303688 60303688 -86120751 -86120751 -86120751 14558127 14558127 14558127 +23434538 +23434538 +23434538 +10158145 +10158145 +10158145 1984618 1984618 1984618 -25311006 -25311006 -25311006 -73628505 -74063034 -74063034 -24224830 +31002402 +60921537 +16240772 24224830 24224830 -48130397 -48130397 -48130397 -47679935 -47679935 -47679935 +65681983 +80845034 +80845034 +80845034 +35569555 +35569555 +35569555 10045474 10045474 10045474 82956214 82956214 82956214 -21011044 -41420027 -41420027 -41420027 #extra -75286621 -20366274 -41209827 -69946549 +24915933 41373230 -97300502 -50907446 -94977269 +11765832 +11765832 +80532587 80532587 80532587 -13529466 +53971455 +53971455 74586817 -98506199 +79606837 +93039339 2220237 +24842059 60303245 -!side +!side \ No newline at end of file diff --git a/Decks/AI_Exosister.ydk b/Decks/AI_Exosister.ydk new file mode 100644 index 000000000..1e5c0fac3 --- /dev/null +++ b/Decks/AI_Exosister.ydk @@ -0,0 +1,60 @@ +#created by ... +#main +37343995 +37343995 +37343995 +16889337 +16889337 +16889337 +16474916 +16474916 +16474916 +67972302 +67972302 +67972302 +79858629 +79858629 +43863925 +43863925 +43863925 +5352328 +5352328 +14558127 +14558127 +14558127 +23434538 +23434538 +23434538 +84211599 +84211599 +4408198 +24224830 +24224830 +77913594 +77913594 +77913594 +197042 +197042 +10045474 +10045474 +77891946 +77891946 +77891946 +#extra +90448279 +59242457 +59242457 +9272381 +42741437 +42741437 +42741437 +78135071 +78135071 +41524885 +41524885 +46772449 +5530780 +58858807 +8728498 +!side +74689476 diff --git a/Decks/AI_Labrynth.ydk b/Decks/AI_Labrynth.ydk new file mode 100644 index 000000000..d5bcea379 --- /dev/null +++ b/Decks/AI_Labrynth.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +81497285 +81497285 +2347656 +41165831 +73602965 +73602965 +75730490 +1225009 +1225009 +1225009 +37629703 +37629703 +37629703 +14558127 +14558127 +14558127 +23434538 +23434538 +23434538 +74018812 +74018812 +74018812 +2511 +2511 +2511 +49238328 +49238328 +5380979 +5380979 +6351147 +6351147 +10045474 +10045474 +10045474 +30748475 +53417695 +83326048 +92714517 +92714517 +92714517 +#extra +22850702 +22850702 +93039339 +93039339 +29479265 +93084621 +93084621 +24269961 +24269961 +24269961 +67680512 +67680512 +29301450 +71607202 +94259633 +!side diff --git a/Decks/AI_Maliss.ydk b/Decks/AI_Maliss.ydk new file mode 100644 index 000000000..6c1857225 --- /dev/null +++ b/Decks/AI_Maliss.ydk @@ -0,0 +1,58 @@ +#created by MDPro3 +#main +68337209 +24224830 +20726052 +23434538 +30118811 +30118811 +75500286 +20938824 +10045474 +24224830 +96676583 +14558127 +27204311 +32061192 +20938824 +40366667 +40366667 +10045474 +68337209 +30118811 +94722358 +40366667 +34267821 +96676583 +3723262 +14558127 +23434538 +32061192 +10045474 +93453053 +69272449 +20938824 +69272449 +65681983 +69272449 +14558127 +32061192 +73628505 +68337209 +96676583 +#extra +39138610 +5043010 +86066372 +4280258 +21848500 +46947713 +95454996 +68059897 +29301450 +59859086 +52698008 +98978921 +30342076 +24842059 +60303245 \ No newline at end of file diff --git a/Decks/AI_MalissOCG.ydk b/Decks/AI_MalissOCG.ydk new file mode 100644 index 000000000..a28077bfa --- /dev/null +++ b/Decks/AI_MalissOCG.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +91800273 +91800273 +42141493 +42141493 +42141493 +3723262 +96676583 +96676583 +30118811 +30118811 +69272449 +69272449 +69272449 +32061192 +32061192 +32061192 +20938824 +20938824 +20938824 +14558128 +14558128 +14558128 +23434538 +23434538 +75500286 +24224830 +24224830 +93453053 +68337209 +68337209 +68337209 +10045474 +10045474 +10045474 +20726052 +40366667 +40366667 +40366667 +57111661 +94722358 +#extra +64211118 +39138610 +9940036 +9940036 +92422871 +92422871 +92422871 +21848500 +68059897 +95454996 +46947713 +59859086 +9763474 +52698008 +30342076 +!side diff --git a/Decks/AI_Ryzeal.ydk b/Decks/AI_Ryzeal.ydk new file mode 100644 index 000000000..a7f684165 --- /dev/null +++ b/Decks/AI_Ryzeal.ydk @@ -0,0 +1,74 @@ +#created by ... +#main +8633261 +8633261 +8633261 +35844557 +35844557 +35844557 +72238166 +34022970 +34022970 +34022970 +42141493 +42141493 +84192580 +87126721 +14558127 +14558127 +14558127 +59438930 +59438930 +23434538 +23434538 +94145021 +97268402 +97268402 +97268402 +7477101 +7477101 +7477101 +25311006 +35261759 +35261759 +85106525 +24224830 +24224830 +60394026 +65681983 +6798031 +10045474 +10045474 +10045474 +#extra +9940036 +34909328 +34909328 +2061963 +7511613 +7511613 +45852939 +45852939 +6983839 +90590303 +46772449 +16643334 +21044178 +66011101 +8728498 +!side +20292186 +34267821 +34267821 +34267821 +67173574 +18144507 +19613556 +35269904 +15693423 +83326048 +83326048 +83326048 +41420027 +41420027 +41420027 diff --git a/Decks/AI_SuperheavySamurai.ydk b/Decks/AI_SuperheavySamurai.ydk new file mode 100644 index 000000000..3e9a78415 --- /dev/null +++ b/Decks/AI_SuperheavySamurai.ydk @@ -0,0 +1,59 @@ +#created by ... +#main +83334932 +83334932 +83334932 +82112494 +82112494 +82112494 +19510093 +19510093 +34496660 +34496660 +34496660 +90361010 +90361010 +90361010 +78391364 +78391364 +56727340 +56727340 +14624296 +95500396 +10604644 +23434538 +23434538 +23434538 +14558127 +14558127 +14558127 +49036338 +38814750 +38814750 +97268402 +97268402 +73642296 +73642296 +59438930 +59438930 +59438930 +94145021 +94145021 +94145021 +#extra +64193046 +84815190 +30983281 +44508094 +27548199 +76471944 +74586817 +28912357 +38342335 +27381364 +22423493 +65741786 +33918636 +33918636 +33918636 +!side diff --git a/Decks/AI_Swordsoul.ydk b/Decks/AI_Swordsoul.ydk index d5374fb8b..2adb8e2ae 100644 --- a/Decks/AI_Swordsoul.ydk +++ b/Decks/AI_Swordsoul.ydk @@ -1,9 +1,8 @@ -#created by wobbaone +#created by ... #main +27204311 87052196 87052196 -87052196 -23431858 23431858 93490856 93490856 @@ -20,39 +19,40 @@ 14558127 14558127 14558127 -98159737 +23434538 +23434538 +23434538 +97268402 +97268402 +97268402 98159737 35261759 35261759 -35261759 56465981 56465981 56465981 -65124425 -65124425 -65124425 93850690 -25789292 -25789292 -25789292 +24224830 +24224830 +65681983 10045474 10045474 10045474 14821890 14821890 #extra -40139997 -96633955 +42632209 +60465049 96633955 84815190 -19048328 +47710198 9464441 5041348 69248256 69248256 83755611 43202238 -73580471 +78917791 32519092 32519092 32519092 diff --git a/Decks/AI_Yubel.ydk b/Decks/AI_Yubel.ydk new file mode 100644 index 000000000..fa7d36ee8 --- /dev/null +++ b/Decks/AI_Yubel.ydk @@ -0,0 +1,58 @@ +#created by MDPro3 +#main +4779091 +90829280 +90829280 +90829280 +78371393 +78371393 +78371393 +41165831 +60764609 +28803166 +14558127 +14558127 +14558127 +23434538 +23434538 +81034083 +81034083 +81034083 +97651498 +27439792 +24215921 +24215921 +62318994 +62318994 +62318994 +73628505 +65261141 +93729896 +93729896 +93729896 +80312545 +80312545 +80312545 +98567237 +24224830 +24224830 +65681983 +99989863 +80801743 +10045474 +#extra +82135803 +80453041 +93860227 +26096328 +56910167 +70636044 +79559912 +24269961 +67680512 +12067160 +29301450 +29479265 +71818935 +2463794 +60303245 \ No newline at end of file diff --git a/Decks/AI_Zefra.ydk b/Decks/AI_Zefra.ydk new file mode 100644 index 000000000..a8c7aff67 --- /dev/null +++ b/Decks/AI_Zefra.ydk @@ -0,0 +1,79 @@ +#created by ... +#main +49036338 +29432356 +29432356 +29432356 +3611830 +76794549 +5560911 +96227613 +96227613 +27354732 +58990362 +58990362 +58990362 +20773176 +22617205 +69610326 +14785765 +95401059 +31314549 +96223501 +52159691 +21495657 +21495657 +57777714 +92559258 +92559258 +92559258 +38814750 +38814750 +38814750 +72291078 +23434538 +23434538 +23434538 +94693857 +9742784 +19580308 +11609969 +61488417 +2295440 +23581825 +38943357 +38943357 +38943357 +41620959 +41620959 +41620959 +73628505 +74580251 +74580251 +74580251 +81439173 +24224830 +24224830 +46372010 +32354768 +32354768 +32354768 +35561352 +57831349 +#extra +27548199 +74586817 +80696379 +33158448 +65536818 +79606837 +88581108 +96157835 +73347079 +74997493 +44097050 +24094258 +50588353 +36429703 +41999284 +!side diff --git a/ExecutorBase/ExecutorBase.csproj b/ExecutorBase/ExecutorBase.csproj index 4f4052129..700ebe90e 100644 --- a/ExecutorBase/ExecutorBase.csproj +++ b/ExecutorBase/ExecutorBase.csproj @@ -72,6 +72,7 @@ + diff --git a/ExecutorBase/Game/AI/AIUtil.cs b/ExecutorBase/Game/AI/AIUtil.cs index 3b7943e6a..4315e814f 100644 --- a/ExecutorBase/Game/AI/AIUtil.cs +++ b/ExecutorBase/Game/AI/AIUtil.cs @@ -6,6 +6,26 @@ namespace WindBot.Game.AI { public class AIUtil { + public struct StringId + { + private readonly long _value; + + public StringId(long value) + { + _value = value; + } + + public static implicit operator long(StringId value) + { + return value._value; + } + + public static implicit operator int(StringId value) + { + return unchecked((int)value._value); + } + } + public Duel Duel { get; private set; } public ClientField Bot { get; private set; } public ClientField Enemy { get; private set; } @@ -231,9 +251,9 @@ public ClientCard GetPZone(int player, int id) } } - public long GetStringId(long id, int option) + public StringId GetStringId(long id, int option) { - return (long)(option & 0xfffff) | (id << 20); + return new StringId(((long)(option & 0xfffff)) | (id << 20)); } public bool IsTurn1OrMain2() @@ -442,5 +462,94 @@ public IList CheckSelectCount(IList _selected, IList> GetXyzMaterials(IList param_pre_materials, int level, int material_count, bool material_count_above = false, Func material_func = null) + { + List> result = new List>(); + List pre_materials = param_pre_materials? + .Where(card => card != null && !(card.IsFacedown() && card.Location == CardLocation.MonsterZone) && card.Level == level) + .ToList(); + if (pre_materials == null || pre_materials.Count < material_count) return result; + Func filter = material_func ?? (card => true); + for (int i = 1; i < Math.Pow(2, pre_materials.Count); i++) + { + List temp_materials = new List(); + string binaryString = Convert.ToString(i, 2).PadLeft(pre_materials.Count, '0'); + char[] reversedBinaryChars = binaryString.Reverse().ToArray(); + for (int j = 0; j < pre_materials.Count; j++) + { + if (reversedBinaryChars[j] == '1' && filter(pre_materials[j])) + { + temp_materials.Add(pre_materials[j]); + } + } + if (material_count_above ? temp_materials.Count >= material_count : temp_materials.Count == material_count) + { + result.Add(temp_materials); + } + } + return result; + } + + public List> GetSynchroMaterials(IList param_pre_materials, int level, int tuner_count, int n_tuner_count, bool tuner_count_above = false, bool n_tuner_count_above = true, Func tuner_func = null, Func n_tuner_func = null) + { + List> allByLevel = new List>(); + List pre_materials = param_pre_materials? + .Where(card => card != null && !(card.IsFacedown() && card.Location == CardLocation.MonsterZone) && card.Level > 0) + .ToList(); + if (pre_materials == null || pre_materials.Count < tuner_count + n_tuner_count) return allByLevel; + + Func tunerFilter = tuner_func ?? (card => true); + Func nonTunerFilter = n_tuner_func ?? (card => true); + + pre_materials.Sort(CardContainer.CompareCardLevel); + Stack materials_stack = new Stack(); + for (int i = 0; i < pre_materials.Count; i++) + { + if (pre_materials[i].Level > level) break; + materials_stack.Push(new object[] { i, pre_materials[i].Level, new List { pre_materials[i] } }); + } + + while (materials_stack.Count > 0) + { + object[] data = materials_stack.Pop(); + int index = (int)data[0]; + int sum = (int)data[1]; + List temp_materials = (List)data[2]; + + if (sum == level) + { + allByLevel.Add(temp_materials); + continue; + } + if (sum > level) continue; + + for (int i = index + 1; i < pre_materials.Count; i++) + { + int nextLevel = pre_materials[i].Level; + if (sum + nextLevel > level) break; + var next = new List(temp_materials) { pre_materials[i] }; + materials_stack.Push(new object[] { i, sum + nextLevel, next }); + } + } + + List> result = new List>(); + foreach (List materials in allByLevel) + { + List tunerMaterials = new List(); + List nonTunerMaterials = new List(); + foreach (ClientCard material in materials) + { + if (material.HasType(CardType.Tuner) && tunerFilter(material)) tunerMaterials.Add(material); + else if (!material.HasType(CardType.Tuner) && nonTunerFilter(material)) nonTunerMaterials.Add(material); + } + if ((tuner_count_above ? tunerMaterials.Count >= tuner_count : tunerMaterials.Count == tuner_count) + && (n_tuner_count_above ? nonTunerMaterials.Count >= n_tuner_count : nonTunerMaterials.Count == n_tuner_count)) + { + result.Add(materials); + } + } + return result; + } } } diff --git a/ExecutorBase/Game/AI/CardContainer.cs b/ExecutorBase/Game/AI/CardContainer.cs index 0a09a506a..5dd03a617 100644 --- a/ExecutorBase/Game/AI/CardContainer.cs +++ b/ExecutorBase/Game/AI/CardContainer.cs @@ -25,6 +25,15 @@ public static int CompareCardLevel(ClientCard cardA, ClientCard cardB) return 1; } + public static int CompareCardLink(ClientCard cardA, ClientCard cardB) + { + if (cardA.LinkCount < cardB.LinkCount) + return -1; + if (cardA.LinkCount == cardB.LinkCount) + return 0; + return 1; + } + public static int CompareDefensePower(ClientCard cardA, ClientCard cardB) { if (cardA == null && cardB == null) diff --git a/ExecutorBase/Game/AI/DefaultExecutor.cs b/ExecutorBase/Game/AI/DefaultExecutor.cs index 01a545da2..a20a5aaf2 100644 --- a/ExecutorBase/Game/AI/DefaultExecutor.cs +++ b/ExecutorBase/Game/AI/DefaultExecutor.cs @@ -7,6 +7,10 @@ namespace WindBot.Game.AI { public abstract class DefaultExecutor : Executor { + // Compatibility state used by newer IceYGO executors. + protected readonly List enemyResolvedEffectIdList = new List(); + protected readonly List infiniteImpermanenceNegatedColumns = new List(); + protected class _CardId { public const int JizukirutheStarDestroyingKaiju = 63941210; @@ -94,16 +98,26 @@ protected class _CardId public const int MaxxC = 23434538; public const int LockBird = 94145021; public const int GhostOgreAndSnowRabbit = 59438930; + public const int GhostMournerMoonlitChill = 52038441; public const int GhostBelle = 73642296; public const int EffectVeiler = 97268402; public const int ArtifactLancea = 34267821; + public const int DimensionShifter = 91800273; + public const int MulcharmyFuwalos = 42141493; + public const int MulcharmyNyalus = 87126721; + public const int MulcharmyPurulia = 84192580; public const int CalledByTheGrave = 24224830; + public const int CrossoutDesignator = 65681983; public const int InfiniteImpermanence = 10045474; public const int GalaxySoldier = 46659709; public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; public const int UpstartGoblin = 70368879; public const int CyberEmergency = 60600126; + public const int PotOfExtravagance = 84211599; public const int EaterOfMillions = 63845230; @@ -116,7 +130,21 @@ protected class _CardId public const int ImperialOrder = 61740673; public const int RoyalDecreel = 51452091; public const int NaturiaBeast = 33198837; + public const int NaturalExterio = 99916754; public const int AntiSpellFragrance = 58921041; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int SwordsmanLV7 = 37267041; + public const int SkillDrain = 82732705; + public const int KashtiraAriseHeart = 48626373; + public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int MaskedHERODarkLaw = 58481572; + public const int LightningStorm = 14532163; + } + + protected class _Setcode + { + public const int TimeLord = 0x4a; + public const int Danger = 0x11e; } protected DefaultExecutor(GameAI ai, Duel duel) @@ -475,6 +503,26 @@ protected bool DefaultAshBlossomAndJoyousSpring() return false; return Duel.LastChainPlayer == 1; } + + protected bool DefaultCheckWhetherSpellActivateWillBeNegated(ClientCard target) + { + if (target == null) + return false; + if (!(target.IsSpell() || target.IsTrap())) + return false; + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) + return false; + + if (target.IsSpell()) + return DefaultSpellWillBeNegated(); + return DefaultTrapWillBeNegated(); + } + + protected bool DefaultCheckWhetherEnemyCanDraw() + { + // Keep this intentionally simple as a compatibility shim. + return true; + } /// /// Always activate unless the activating card is disabled /// @@ -599,7 +647,7 @@ protected bool DefaultDisableMonster() ///
protected bool DefaultSolemnJudgment() { - return !Util.IsChainTargetOnly(Card) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && DefaultTrap(); + return !Util.IsChainTargetOnly(Card) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && !DefaultOnlyHorusSpSummoning() && DefaultTrap(); } /// @@ -607,7 +655,7 @@ protected bool DefaultSolemnJudgment() /// protected bool DefaultSolemnWarning() { - return (Bot.LifePoints > 2000) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && DefaultTrap(); + return (Bot.LifePoints > 2000) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && !DefaultOnlyHorusSpSummoning() && DefaultTrap(); } /// @@ -615,7 +663,7 @@ protected bool DefaultSolemnWarning() /// protected bool DefaultSolemnStrike() { - return (Bot.LifePoints > 1500) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && DefaultTrap(); + return (Bot.LifePoints > 1500) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && !DefaultOnlyHorusSpSummoning() && DefaultTrap(); } /// @@ -690,6 +738,11 @@ protected bool DefaultSpellSet() return (Card.IsTrap() || Card.HasType(CardType.QuickPlay) || DefaultSpellMustSetFirst()) && Bot.GetSpellCountWithoutField() < 4; } + protected virtual bool DefaultSetForDiabellze() + { + return DefaultSpellSet(); + } + /// /// Summon with no tribute, or with tributes ATK lower. /// @@ -757,7 +810,8 @@ protected bool DefaultMonsterRepos() /// protected bool DefaultSpellWillBeNegated() { - return (Bot.HasInSpellZone(_CardId.ImperialOrder, true, true) || Enemy.HasInSpellZone(_CardId.ImperialOrder, true)) && !Util.ChainContainsCard(_CardId.ImperialOrder); + return (Bot.HasInSpellZone(_CardId.ImperialOrder, true, true) || Enemy.HasInSpellZone(_CardId.ImperialOrder, true)) && !Util.ChainContainsCard(_CardId.ImperialOrder) + || DefaultCheckWhetherCardIsNegated(Card); } /// @@ -765,7 +819,8 @@ protected bool DefaultSpellWillBeNegated() /// protected bool DefaultTrapWillBeNegated() { - return (Bot.HasInSpellZone(_CardId.RoyalDecreel, true, true) || Enemy.HasInSpellZone(_CardId.RoyalDecreel, true)) && !Util.ChainContainsCard(_CardId.RoyalDecreel); + return (Bot.HasInSpellZone(_CardId.RoyalDecreel, true, true) || Enemy.HasInSpellZone(_CardId.RoyalDecreel, true)) && !Util.ChainContainsCard(_CardId.RoyalDecreel) + || DefaultCheckWhetherCardIsNegated(Card); } /// @@ -806,6 +861,7 @@ protected bool DefaultOnBecomeTarget() /// protected bool DefaultTrap() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return (Duel.LastChainPlayer == -1 && Duel.LastSummonPlayer != 0) || Duel.LastChainPlayer == 1; } @@ -1170,6 +1226,7 @@ protected bool DefaultHonestEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Bot.BattlingMonster.IsAttack() && (((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Attack) || Bot.BattlingMonster.Attack >= Enemy.LifePoints) || ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Defense) && (Bot.BattlingMonster.Attack + Enemy.BattlingMonster.Attack > Enemy.BattlingMonster.Defense))); @@ -1177,5 +1234,31 @@ protected bool DefaultHonestEffect() return Util.IsTurn1OrMain2(); } + + protected bool DefaultCheckWhetherCardIsNegated(ClientCard card) + { + if (card == null) return true; + return card.IsDisabled() && card.IsOnField(); + } + + protected bool DefaultCheckWhetherCardIdIsNegated(int cardId) + { + return false; + } + + protected int GetCalledbytheGraveIdCount(int cardId) + { + return 0; + } + + protected bool DefaultOnlyHorusSpSummoning() + { + return false; + } + + protected bool DefaultCheckWhetherBotCanSearch() + { + return true; + } } } diff --git a/ExecutorBase/Game/AI/Executor.cs b/ExecutorBase/Game/AI/Executor.cs index 7b8b36f87..7cea84005 100644 --- a/ExecutorBase/Game/AI/Executor.cs +++ b/ExecutorBase/Game/AI/Executor.cs @@ -22,6 +22,7 @@ public abstract class Executor protected ExecutorType Type { get; private set; } protected ClientCard Card { get; private set; } protected long ActivateDescription { get; private set; } + protected int CurrentTiming { get; private set; } protected ClientField Bot { get; private set; } protected ClientField Enemy { get; private set; } @@ -97,10 +98,41 @@ public virtual void OnChaining(int player, ClientCard card) // For overriding } + public virtual void OnChainSolved(int chainIndex) + { + // For overriding + } + public virtual void OnChainEnd() { // For overriding } + + public virtual void OnReceivingAnnouce(int player, int data) + { + // For overriding + } + + public virtual void OnPlayerHint(int player, int hintType, int description) + { + // For overriding + } + + public virtual void OnHintZone(int player, int zone) + { + // For overriding + } + + public virtual void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + // For overriding + } + + public virtual void OnSpSummoned() + { + // For overriding + } + public virtual void OnNewPhase() { // Some AI need do something on new phase @@ -116,12 +148,22 @@ public virtual void OnDraw(int player) } public virtual IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + { + return OnSelectCard(cards, min, max, (int)hint, cancelable); + } + + public virtual IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { // For overriding return null; } public virtual IList OnSelectSum(IList cards, int sum, int min, int max, long hint, bool mode) + { + return OnSelectSum(cards, sum, min, max, (int)hint, mode); + } + + public virtual IList OnSelectSum(IList cards, int sum, int min, int max, int hint, bool mode) { // For overriding return null; @@ -175,16 +217,31 @@ public virtual void OnSelectChain(IList cards) } public virtual bool OnSelectYesNo(long desc) + { + return OnSelectYesNo((int)desc); + } + + public virtual bool OnSelectYesNo(int desc) { return true; } public virtual int OnSelectOption(IList options) + { + return OnSelectOption(options.Select(value => (int)value).ToList()); + } + + public virtual int OnSelectOption(IList options) { return -1; } public virtual int OnSelectPlace(long cardId, int player, CardLocation location, int available) + { + return OnSelectPlace((int)cardId, player, location, available); + } + + public virtual int OnSelectPlace(int cardId, int player, CardLocation location, int available) { // For overriding return 0; @@ -236,11 +293,12 @@ public void SetBattle(BattlePhase battle) /// /// Set global variables Type, Card, ActivateDescription for Executor /// - public void SetCard(ExecutorType type, ClientCard card, long description) + public void SetCard(ExecutorType type, ClientCard card, long description, int timing = -1) { Type = type; Card = card; ActivateDescription = description; + CurrentTiming = timing; } /// diff --git a/ExecutorBase/Game/AI/HintMsg.cs b/ExecutorBase/Game/AI/HintMsg.cs index 98e723a4a..a781df421 100644 --- a/ExecutorBase/Game/AI/HintMsg.cs +++ b/ExecutorBase/Game/AI/HintMsg.cs @@ -56,6 +56,13 @@ public static class HintMsg DisableZone = 570, ToZone = 571, Counter = 572, - Negate = 575; + Disable = 573, + OperateCard = 574, + Negate = 575, + RITUAL = 1057, + FUSION = 1056, + SYNCHRO = 1063, + XYZ = 1073, + PENDULUM = 1074; } } diff --git a/ExecutorBase/Game/ChainInfo.cs b/ExecutorBase/Game/ChainInfo.cs new file mode 100644 index 000000000..5fd701522 --- /dev/null +++ b/ExecutorBase/Game/ChainInfo.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using YGOSharp.OCGWrapper.Enums; + +namespace WindBot.Game +{ + public class ChainInfo + { + public ClientCard RelatedCard { get; private set; } + public int ActivatePlayer { get; private set; } + public int ActivateId { get; private set; } + public int ActivateAlias { get; private set; } + public int ActivateController { get; private set; } + public int ActivatePosition { get; private set; } + public int ActivateSequence { get; private set; } + public CardLocation ActivateLocation { get; private set; } + public int ActivateLevel { get; private set; } + public int ActivateRank { get; private set; } + public ulong ActivateType { get; private set; } + public ulong ActivateRace { get; private set; } + public ulong ActivateAttack { get; private set; } + public ulong ActivateDefense { get; private set; } + public bool IsSpecialSummoned { get; private set; } + public int ActivateDescription { get; private set; } + + public ChainInfo(ClientCard card) + : this(card, card.Controller, 0) + { + } + + public ChainInfo(ClientCard card, int player, int desc) + { + RelatedCard = card; + ActivatePlayer = player; + ActivateId = card.Id; + ActivateAlias = card.Alias; + ActivateController = card.Controller; + ActivatePosition = card.Position; + ActivateSequence = card.Sequence; + ActivateLocation = card.Location; + ActivateLevel = card.Level; + ActivateRank = card.Rank; + ActivateType = (ulong)card.Type; + ActivateRace = card.Race; + ActivateAttack = (ulong)card.Attack; + + ActivateDefense = (ulong)card.Defense; + IsSpecialSummoned = card.IsSpecialSummoned; + ActivateDescription = desc; + } + + public bool HasPosition(CardPosition position) + { + return (ActivatePosition & (int)position) != 0; + } + + public bool HasLocation(CardLocation location) + { + return ((int)ActivateLocation & (int)location) != 0; + } + + public bool IsActivateCode(int id) + { + return ActivateId == id || Math.Abs(ActivateAlias - ActivateId) <= 20 && ActivateAlias == id; + } + + public bool IsCode(int id) + { + return RelatedCard != null && RelatedCard.IsCode(id); + } + + public bool IsCode(IList ids) + { + return RelatedCard != null && RelatedCard.IsCode(ids); + } + + public bool IsCode(params int[] ids) + { + return RelatedCard != null && RelatedCard.IsCode(ids); + } + + public bool HasType(CardType type) + { + return RelatedCard != null && (RelatedCard.Type & (int)type) != 0; + } + + public bool IsSpell() + { + return HasType(CardType.Spell); + } + + public bool IsTrap() + { + return HasType(CardType.Trap); + } + } +} diff --git a/ExecutorBase/Game/ClientCard.cs b/ExecutorBase/Game/ClientCard.cs index 2dc0b23a3..b6562353e 100644 --- a/ExecutorBase/Game/ClientCard.cs +++ b/ExecutorBase/Game/ClientCard.cs @@ -390,6 +390,11 @@ public bool IsOriginalCode(int id) return Id == id || Alias - Id < 10 && Alias == id; } + public bool IsOnField() + { + return Location == CardLocation.MonsterZone || Location == CardLocation.SpellZone || Location == CardLocation.PendulumZone || Location == CardLocation.FieldZone; + } + public bool HasXyzMaterial() { return Overlays.Count > 0; @@ -410,6 +415,17 @@ public int GetDefensePower() return IsAttack() ? Attack : Defense; } + public int GetOriginCode() + { + int code = Id; + if (Data != null) + { + if (Data.Alias > 0) code = Data.Alias; + else code = Data.Id; + } + return code; + } + public bool Equals(ClientCard card) { return ReferenceEquals(this, card); diff --git a/ExecutorBase/Game/ClientField.cs b/ExecutorBase/Game/ClientField.cs index aa596f897..4ce93f48a 100644 --- a/ExecutorBase/Game/ClientField.cs +++ b/ExecutorBase/Game/ClientField.cs @@ -18,6 +18,7 @@ public class ClientField public int LifePoints; public ClientCard BattlingMonster; public bool UnderAttack; + public HashSet HintDescriptions { get; private set; } public ClientField() { @@ -32,6 +33,7 @@ public void Init(int deck, int extra) Banished = new List(); Deck = new List(); ExtraDeck = new List(); + HintDescriptions = new HashSet(); for (int i = 0; i < deck; ++i) Deck.Add(new ClientCard(0, CardLocation.Deck, -1, 0)); @@ -46,6 +48,7 @@ public void Clear() Hand.Clear(); Banished.Clear(); Graveyard.Clear(); + HintDescriptions.Clear(); MonsterZone = new ClientCard[7]; SpellZone = new ClientCard[8]; } diff --git a/ExecutorBase/Game/Dialogs.cs b/ExecutorBase/Game/Dialogs.cs index 7bd9360f2..05ee06b53 100644 --- a/ExecutorBase/Game/Dialogs.cs +++ b/ExecutorBase/Game/Dialogs.cs @@ -35,6 +35,8 @@ public class DialogsData public string[] setmonster { get; set; } [DataMember] public string[] chaining { get; set; } + [DataMember] + public string[] custom { get; set; } } public class Dialogs { @@ -52,6 +54,7 @@ public class Dialogs private string[] _summon; private string[] _setmonster; private string[] _chaining; + private string[] _custom; private Action Chat; @@ -77,6 +80,7 @@ public Dialogs(string dialogfilename, Action chat, string path) _summon = data.summon; _setmonster = data.setmonster; _chaining = data.chaining; + _custom = data.custom; } } @@ -160,6 +164,20 @@ public void SendChaining(string card) InternalSendMessage(_chaining, card); } + public void SendCustomChat(int index, params object[] opts) + { + if (_custom == null || index < 0 || index >= _custom.Length) + return; + + string pattern = _custom[index]; + if (string.IsNullOrEmpty(pattern)) + return; + + string message = string.Format(pattern, opts); + if (message != "") + Chat(message, false); + } + private void InternalSendMessage(IList array, params object[] opts) { string message = string.Format(array[Rand.Next(array.Count)], opts); diff --git a/ExecutorBase/Game/Duel.cs b/ExecutorBase/Game/Duel.cs index 8a4ccaeb2..fa1b2a88c 100644 --- a/ExecutorBase/Game/Duel.cs +++ b/ExecutorBase/Game/Duel.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using YGOSharp.OCGWrapper.Enums; namespace WindBot.Game @@ -19,8 +20,12 @@ public class Duel public int LastChainPlayer { get; set; } public IList CurrentChain { get; set; } + public IList CurrentChainInfo { get; set; } public IList ChainTargets { get; set; } + public IList LastChainTargets { get; set; } public IList ChainTargetOnly { get; set; } + public CardLocation LastChainLocation { get; set; } + public List NegatedChainIndexList { get; set; } public int LastSummonPlayer { get; set; } public IList SummoningCards { get; set; } public IList LastSummonedCards { get; set; } @@ -34,8 +39,12 @@ public Duel() LastChainPlayer = -1; MainPhaseEnd = false; CurrentChain = new List(); + CurrentChainInfo = new List(); ChainTargets = new List(); + LastChainTargets = new List(); ChainTargetOnly = new List(); + LastChainLocation = 0; + NegatedChainIndexList = new List(); LastSummonPlayer = -1; SummoningCards = new List(); LastSummonedCards = new List(); @@ -48,8 +57,12 @@ public void Clear() LastChainPlayer = -1; MainPhaseEnd = false; CurrentChain.Clear(); + CurrentChainInfo.Clear(); ChainTargets.Clear(); + LastChainTargets.Clear(); ChainTargetOnly.Clear(); + LastChainLocation = 0; + NegatedChainIndexList.Clear(); LastSummonPlayer = -1; SummoningCards.Clear(); LastSummonedCards.Clear(); @@ -203,5 +216,21 @@ public int GetLocalPlayer(int player) { return IsFirst ? player : 1 - player; } + + public ChainInfo GetCurrentSolvingChainInfo() + { + return CurrentChainInfo.LastOrDefault(); + } + + public ClientCard GetCurrentSolvingChainCard() + { + return GetCurrentSolvingChainInfo()?.RelatedCard; + } + + public bool IsCurrentSolvingChainNegated() + { + int index = CurrentChainInfo.Count - 1; + return index >= 0 && NegatedChainIndexList.Contains(index); + } } } diff --git a/ExecutorBase/Game/GameAI.cs b/ExecutorBase/Game/GameAI.cs index 267d8def8..9e35940e1 100644 --- a/ExecutorBase/Game/GameAI.cs +++ b/ExecutorBase/Game/GameAI.cs @@ -64,6 +64,11 @@ public void OnStart() _dialogs.SendDuelStart(); } + public void SendCustomChat(int index, params object[] opts) + { + _dialogs.SendCustomChat(index, opts); + } + /// /// Called when the AI do the rock-paper-scissors. /// diff --git a/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardRace.cs b/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardRace.cs index 0a8bef5b0..cf46ecb58 100644 --- a/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardRace.cs +++ b/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardRace.cs @@ -17,7 +17,7 @@ public enum CardRace : ulong Thunder = 0x1000, Dragon = 0x2000, Beast = 0x4000, - BestWarrior = 0x8000, + BeastWarrior = 0x8000, Dinosaur = 0x10000, Fish = 0x20000, SeaSerpent = 0x40000, diff --git a/Game/AI/Decks/AlbazExecutor.cs b/Game/AI/Decks/AlbazExecutor.cs new file mode 100644 index 000000000..7081a17df --- /dev/null +++ b/Game/AI/Decks/AlbazExecutor.cs @@ -0,0 +1,5861 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Albaz", "AI_Albaz")] + public class AlbazExecutor : DefaultExecutor + { + public class CardId + { + public const int TheBystialLubellion = 32731036; + public const int AlbionTheShroudedDragon = 25451383; + public const int BystialSaronir = 60242223; + public const int AluberTheJesterOfDespia = 62962630; + public const int FallenOfAlbaz = 68468459; + public const int SpringansKitt = 45484331; + public const int GuidingQuemTheVirtuous = 45883110; + public const int BlazingCartesiaTheVirtuous = 95515789; + public const int TriBrigadeMercourier = 19096726; + // _CardId.AshBlossom = 14558127; + // _CardId.MaxxC = 23434538; + public const int DespianTragedy = 36577931; + + public const int NadirServant = 1984618; + public const int FusionDeployment = 6498706; + public const int BrandedInWhite = 34995106; + public const int BrandedFusion = 44362883; + public const int GoldSarcophagus = 75500286; + public const int FoolishBurial = 81439173; + // _CardId.CalledByTheGrave = 24224830; + public const int BrandedInHighSpirits = 29948294; + public const int BrandedOpening = 36637374; + // _CardId.CrossoutDesignator = 65681983; + public const int BrandedInRed = 82738008; + public const int BrandedLost = 18973184; + + // _CardId.InfiniteImpermanence = 10045474; + public const int BrightestBlazingBrandedKing = 19271881; + public const int BrandedBeast = 32756828; + public const int BrandedRetribution = 17751597; + + public const int GuardianChimera = 11321089; + public const int AlbionTheSanctifireDragon = 38811586; + public const int MirrorjadeTheIcebladeDragon = 44146295; + public const int BorreloadFuriousDragon = 92892239; + public const int LubellionTheSearingDragon = 70534340; + public const int AlbaLenatusTheAbyssDragon = 3410461; + public const int GranguignolTheDuskDragon = 24915933; + public const int DespianQuaeritis = 72272462; + public const int SprindTheIrondashDragon = 1906812; + public const int TitanikladTheAshDragon = 41373230; + public const int RindbrummTheStrikingDragon = 51409648; + public const int AlbionTheBrandedDragon = 87746184; + public const int DespianLuluwalilith = 53971455; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int AccesscodeTalker = 86066372; + public const int GhostMournerMoonlitChill = 52038441; + public const int NibiruThePrimalBeing = 27204311; + } + + public AlbazExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + + // + AddExecutor(ExecutorType.Summon, AdvanceSummon); + AddExecutor(ExecutorType.SpSummon, CardId.AlbaLenatusTheAbyssDragon, AlbaLenatusTheAbyssDragonSpSummon); + AddExecutor(ExecutorType.MonsterSet, CardId.FallenOfAlbaz, FallenOfAlbazSet); + AddExecutor(ExecutorType.Activate, CardId.BlazingCartesiaTheVirtuous, BlazingCartesiaTheVirtuousActivateInGrave); + + // quick effect + AddExecutor(ExecutorType.Activate, CardId.BrandedRetribution, BrandedRetributionActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedBeast, BrandedBeastActivate); + AddExecutor(ExecutorType.Activate, CardId.BrightestBlazingBrandedKing, BrightestBlazingBrandedKingActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedOpening, BrandedOpeningActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedInHighSpirits, BrandedInHighSpiritsActivate); + AddExecutor(ExecutorType.Activate, CardId.RindbrummTheStrikingDragon, RindbrummTheStrikingDragonActivate); + + // remove + AddExecutor(ExecutorType.Activate, CardId.GuardianChimera, GuardianChimeraActivate); + AddExecutor(ExecutorType.Activate, CardId.BorreloadFuriousDragon, BorreloadFuriousDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.TriBrigadeMercourier, TriBrigadeMercourierActivate); + AddExecutor(ExecutorType.Activate, CardId.DespianQuaeritis, DespianQuaeritisActivate); + AddExecutor(ExecutorType.Activate, CardId.MirrorjadeTheIcebladeDragon, MirrorjadeTheIcebladeDragonActivate); + + // search + AddExecutor(ExecutorType.Activate, CardId.TheBystialLubellion, TheBystialLubellionActivate); + AddExecutor(ExecutorType.SpSummon, CardId.TheBystialLubellion, TheBystialLubellionSpSummon); + AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialActivate); + AddExecutor(ExecutorType.Activate, CardId.GoldSarcophagus, GoldSarcophagusActivate); + AddExecutor(ExecutorType.Activate, CardId.AluberTheJesterOfDespia, AluberTheJesterOfDespiaActivate); + + AddExecutor(ExecutorType.Activate, CardId.AlbionTheSanctifireDragon, AlbionTheSanctifireDragonActivate); + + // blazing + AddExecutor(ExecutorType.Activate, CardId.FusionDeployment, FusionDeploymentActivate); + + AddExecutor(ExecutorType.Activate, CardId.AlbionTheShroudedDragon, AlbionTheShroudedDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.BystialSaronir, BystialSaronirActivate); + + // summon for search + AddExecutor(ExecutorType.Summon, CardId.AluberTheJesterOfDespia, AluberTheJesterOfDespiaSummon); + AddExecutor(ExecutorType.Summon, CardId.GuidingQuemTheVirtuous, GuidingQuemTheVirtuousSummonForSearch); + AddExecutor(ExecutorType.Activate, CardId.SpringansKitt, SpringansKittActivate); + AddExecutor(ExecutorType.Summon, CardId.SpringansKitt, SpringansKittSummon); + + // fusion & lost + AddExecutor(ExecutorType.Activate, CardId.BrandedLost, BrandedLostCardActivate); + AddExecutor(ExecutorType.Activate, CardId.GranguignolTheDuskDragon, GranguignolTheDuskDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.AlbaLenatusTheAbyssDragon, AlbaLenatusTheAbyssDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.SprindTheIrondashDragon, SprindTheIrondashDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.TitanikladTheAshDragon, TitanikladTheAshDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.AlbionTheBrandedDragon, AlbionTheBrandedDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.LubellionTheSearingDragon, LubellionTheSearingDragonActivate); + AddExecutor(ExecutorType.Summon, CardId.BlazingCartesiaTheVirtuous, BlazingCartesiaTheVirtuousSummon); + AddExecutor(ExecutorType.Activate, CardId.FallenOfAlbaz, FallenOfAlbazActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedFusion, BrandedFusionActivate); + AddExecutor(ExecutorType.Activate, CardId.BlazingCartesiaTheVirtuous, BlazingCartesiaTheVirtuousActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedInWhite, BrandedInWhiteActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedInRed, BrandedInRedActivate); + AddExecutor(ExecutorType.Activate, CardId.BrandedLost, BrandedLostActivate); + + // albaz summon + AddExecutor(ExecutorType.Summon, CardId.FallenOfAlbaz, FallenOfAlbazSummon); + AddExecutor(ExecutorType.Summon, CardId.GuidingQuemTheVirtuous, GuidingQuemTheVirtuousSummon); + + // delay + AddExecutor(ExecutorType.Activate, CardId.DespianTragedy, DespianTragedyActivate); + AddExecutor(ExecutorType.Activate, CardId.TriBrigadeMercourier, TriBrigadeMercourierActivateForSearch); + AddExecutor(ExecutorType.Activate, CardId.NadirServant, NadirServantActivate); + + AddExecutor(ExecutorType.MonsterSet, SetForChimera); + AddExecutor(ExecutorType.MonsterSet, CardId.DespianTragedy, DespianTragedySet); + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + AddExecutor(ExecutorType.Activate, CardId.GuidingQuemTheVirtuous, GuidingQuemTheVirtuousActivate); + AddExecutor(ExecutorType.Activate, CardId.DespianLuluwalilith, DespianLuluwalilithActivate); + + AddExecutor(ExecutorType.Activate, FloogateActivate); + + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeBranded = 0x15d; + const int SetcodeDespain = 0x164; + const int SetcodeBystial = 0x188; + const int SetcodeHorus = 0x19d; + const int hintTimingMainEnd = 0x4; + const int hintBattleStart = 0x8; + List notToNegateIdList = new List{ + 58699500, 20343502, CardId.AlbionTheShroudedDragon, 19403423 + }; + List cannotBeFusionMaterialIdList = new List + { + CardId.AlbaLenatusTheAbyssDragon, CardId.AlbionTheSanctifireDragon, 79229522, 65029288, 30864377, 33964637, 87116928, 13735899, 28226490, 80453041, + _CardId.EaterOfMillions, 2992467, 16366810, 40217358, 47346782, 50893987, 71459017, 84433295, 85101097 + }; + List albazFusionMonster = new List + { + CardId.TitanikladTheAshDragon, CardId.SprindTheIrondashDragon, CardId.AlbionTheBrandedDragon, CardId.LubellionTheSearingDragon, CardId.AlbaLenatusTheAbyssDragon, + CardId.MirrorjadeTheIcebladeDragon, CardId.RindbrummTheStrikingDragon, CardId.AlbionTheSanctifireDragon + }; + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.AluberTheJesterOfDespia, _CardId.AshBlossom, _CardId.MaxxC, _CardId.InfiniteImpermanence }}, + {2, new List { CardId.FallenOfAlbaz, CardId.NadirServant, CardId.FusionDeployment, _CardId.CalledByTheGrave }}, + {1, new List { CardId.TheBystialLubellion, CardId.AlbionTheShroudedDragon, CardId.BystialSaronir, CardId.SpringansKitt, CardId.GuidingQuemTheVirtuous, + CardId.BlazingCartesiaTheVirtuous, CardId.TriBrigadeMercourier, CardId.DespianTragedy, CardId.BrandedInWhite, + CardId.BrandedFusion, CardId.GoldSarcophagus, CardId.FoolishBurial, CardId.BrandedInHighSpirits, CardId.BrandedOpening, + _CardId.CrossoutDesignator, CardId.BrandedInRed, CardId.BrandedLost, CardId.BrightestBlazingBrandedKing, + CardId.BrandedBeast, CardId.BrandedRetribution }} + }; + List dangerousDragonIdList = new List { 27548199, 92892239, 98630720, 9753964, 99585850, 24361622, 27572350, 69120785, 96402918, 74294676, 42752141, 18511599, 35103106, 26268488 }; + List notToDestroySpellTrap = new List { 50005218, 6767771 }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + + bool summoned = false; + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + int dimensionShifterCount = 0; + bool enemyActivateInfiniteImpermanenceFromHand = false; + bool theBystialLubellionSelecting = false; + bool albionTheShroudedDragonSelecting = false; + bool nadirActivated = false; + bool fusionToGYFlag = false; + bool spSummoningAlbaz = false; + int cartesiaSummonGoal = 0; + int sanctifireSelectPositionCount = 0; + int quemSummonFlag = 0; + List cartesiaMaterialList = new List(); + List brandedInRedMaterialList = new List(); + List infiniteImpermanenceList = new List(); + List currentNegateCardList = new List(); + List currentDestroyCardList = new List(); + List sendToGYThisTurn = new List(); + List activatedCardIdList = new List(); + ClientCard fusionTarget = null; + List selectedFusionMaterial = new List(); + List enemyPlaceThisTurn = new List(); + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 + && (card.IsShouldNotBeSpellTrapTarget() && !card.IsDisabled())) return false; + } + return true; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + public int CheckRemainInDeck(params int[] ids) + { + int sum = 0; + foreach (int id in ids) + { + sum += CheckRemainInDeck(id); + } + return sum; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= ((int)type & (int)CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (((int)type & (int)CardType.Spell) != 0) || (((int)type & (int)CardType.Trap) != 0); + bool isCounter = ((int)type & (int)CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck && CheckSpellWillBeNegate(isCounter)) + return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) return true; + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + // how to get here? + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (DefaultCheckWhetherCardIsNegated(lastcard)) return false; + if (Duel.Turn == 1 && lastcard.IsCode(_CardId.MaxxC)) return false; + + return true; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && (Duel.Player == 0 || Bot.GetMonsterCount() > 0)) return true; + return false; + } + + public bool CheckShouldNoMoreSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && !enemyActivateLockBird && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2)) + { + return true; + } + return false; + } + + public bool CheckWhetherCanSummon() + { + return Duel.Player == 0 && Duel.Phase < DuelPhase.End && !summoned; + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { CardId.BanisheroftheRadiance, CardId.BanisheroftheLight, CardId.MacroCosmos, CardId.DimensionalFissure, + CardId.KashtiraAriseHeart, 58481572 }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true, false, true) || cf.HasInSpellZone(cardid, true, true)) + { + return true; + } + } + } + return false; + } + + /// + /// Check whether it should be kept in grave to activate effect. + /// If should, return true. + /// + /// + /// + public bool CheckWhetherShouldKeepInGrave(ClientCard c) + { + if (c.IsCode(CardId.GranguignolTheDuskDragon) && c.Location == CardLocation.Grave) return true; + if (!c.IsCode(new int[] { CardId.AlbaLenatusTheAbyssDragon, CardId.AlbionTheBrandedDragon, CardId.TitanikladTheAshDragon, CardId.DespianLuluwalilith, + CardId.SprindTheIrondashDragon})) + { + return false; + } + return sendToGYThisTurn.Contains(c) && c.Location == CardLocation.Grave; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + ClientCard activatingAlbaz = Enemy.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz) && !c.IsDisabled() + && !currentDestroyCardList.Contains(c) && !currentNegateCardList.Contains(c) && Duel.CurrentChain.Contains(c)); + if (activatingAlbaz != null) return activatingAlbaz; + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentDestroyCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + /// + /// check enemy's dangerous card in grave + /// + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom) || card.HasSetcode(SetcodeHorus))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, 9411399, 28954097, 30680659 + }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType) + ) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !notToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public override BattlePhaseAction OnBattle(IList attackers, IList defenders) + { + if (attackers.Count() > 0 && defenders.Count() > 0) + { + List sortedAttacker = attackers.OrderBy(card => card.Attack).ToList(); + ClientCard abyssDragon = attackers.FirstOrDefault(c => c.IsCode(CardId.AlbaLenatusTheAbyssDragon) && !c.IsDisabled()); + if (abyssDragon != null) + { + sortedAttacker.Remove(abyssDragon); + sortedAttacker.Insert(0, abyssDragon); + } + for (int k = 0; k < sortedAttacker.Count; ++k) + { + ClientCard attacker = sortedAttacker[k]; + attacker.IsLastAttacker = k == sortedAttacker.Count - 1; + BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders); + if (result != null) + return result; + } + } + + return base.OnBattle(attackers, defenders); + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + if (currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.EvenlyMatched)) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List dumpMainMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && CheckRemainInDeck(card.Id) > 0).ToList(); + dumpMainMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpMainMonsterList); + + // spells + List faceUpSpells = Bot.GetSpells().Where(c => c.IsFaceup()).ToList(); + banishList.AddRange(ShuffleList(faceUpSpells)); + List faceDownSpells = Bot.GetSpells().Where(c => c.IsFacedown()).ToList(); + banishList.AddRange(ShuffleList(faceDownSpells)); + + List uniqueMainMonster = botMonsters.Where(card => !banishList.Contains(card) + && !card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && CheckRemainInDeck(card.Id) == 0).ToList(); + uniqueMainMonster.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(uniqueMainMonster); + + List dumpExtraMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && Bot.HasInExtra(card.Id)).ToList(); + dumpExtraMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpExtraMonsterList); + + List uniqueExtraMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && !Bot.HasInExtra(card.Id)).ToList(); + uniqueExtraMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(uniqueExtraMonsterList); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + + // search operation + if (hint == HintMsg.AddToHand) + { + Dictionary> checkDict = new Dictionary>(); + + switch (currentSolvingChain.Id) + { + case CardId.AluberTheJesterOfDespia: + case CardId.AluberTheJesterOfDespia + 1: + case CardId.SpringansKitt: + checkDict = new Dictionary> { + {CardId.BrandedFusion, () => BrandedFusionActivateCheck()}, + {CardId.BrandedLost, () => { + if (Duel.Player == 0 && Duel.Phase >= DuelPhase.End) return false; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) && BrandedFusionActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null) return true; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion()) return true; + if ((Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) || (!summoned && Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous)))) return true; + return false; + } + }, + {CardId.BrandedInHighSpirits, BrandedInHighSpiritsActivateCheck}, + {CardId.BrandedInRed, () => (Duel.Phase == DuelPhase.End && nadirActivated) || BrandedInRedActivateCheck() != null }, + {CardId.BrandedInWhite, BrandedInWhiteActivateCheck }, + {CardId.BrandedRetribution, () => cards.Any(c => c.IsCode(CardId.BrandedRetribution) && c.Location == CardLocation.Removed) }, + {CardId.BrightestBlazingBrandedKing, () => Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedOpening, () => Bot.Hand.Count > 2 } + }; + break; + case CardId.NadirServant: + if (!summoned) + { + ClientCard quem = cards.FirstOrDefault(c => c.IsCode(CardId.GuidingQuemTheVirtuous)); + if (quem != null) + { + return Util.CheckSelectCount(new List { quem }, cards, min, max); + } + } + List locList = new List { CardLocation.Grave, CardLocation.Deck }; + if (Bot.HasInGraveyard(CardId.RindbrummTheStrikingDragon) && cards.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz) && c.Location == CardLocation.Grave).Count() == 1) + { + locList = new List { CardLocation.Deck, CardLocation.Grave }; + } + foreach (int checkId in new[] { CardId.FallenOfAlbaz, CardId.GuidingQuemTheVirtuous }) + { + foreach (CardLocation loc in locList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(checkId) && c.Location == loc); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + case CardId.BrandedLost: + case CardId.TriBrigadeMercourier: + case CardId.BrandedInHighSpirits: + checkDict = new Dictionary>{ + {CardId.TriBrigadeMercourier, () => Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) + || (Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) && Bot.HasInHandOrHasInMonstersZone(CardId.FallenOfAlbaz))}, + {CardId.SpringansKitt, () => CheckWhetherCanSummon() && !activatedCardIdList.Contains(CardId.SpringansKitt + 1) }, + {CardId.FallenOfAlbaz, () => (CheckWhetherCanSummon() && CheckAlbazFusion()) || Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) }, + {CardId.GuidingQuemTheVirtuous, () => CheckWhetherCanSummon() }, + {CardId.BlazingCartesiaTheVirtuous, () => CheckWhetherCanSummon() || (!CheckShouldNoMoreSpSummon() && Bot.HasInMonstersZoneOrInGraveyard(CardId.FallenOfAlbaz))}, + {CardId.AlbionTheShroudedDragon, () => !CheckWhetherWillbeRemoved() && !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon) }, + }; + break; + case CardId.AlbaLenatusTheAbyssDragon: + checkDict = new Dictionary>{ + {CardId.BrandedFusion, () => BrandedFusionActivateCheck(false)}, + {CardId.FusionDeployment, () => true} + }; + break; + default: + break; + } + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + switch (currentSolvingChain.Id) + { + // for lubellion + case CardId.TheBystialLubellion: + { + Dictionary> lubellionCheckDict = new Dictionary>(); + if (hint == HintMsg.ToField) + { + lubellionCheckDict.Add(CardId.BrandedLost, () => { + bool fusionFlag = Bot.HasInHandOrHasInMonstersZone(CardId.BlazingCartesiaTheVirtuous); + if (!activatedCardIdList.Contains(CardId.BrandedFusion)) + { + if (Bot.HasInHand(CardId.BrandedFusion) || (!summoned && CheckRemainInDeck(CardId.BrandedFusion) > 0 && Bot.HasInHand(new int[] { + CardId.AluberTheJesterOfDespia, CardId.SpringansKitt + }))) + { + fusionFlag = true; + } + } + fusionFlag |= !summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion(); + fusionFlag |= Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck(); + fusionFlag |= Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null; + + return fusionFlag; + }); + lubellionCheckDict.Add(CardId.BrandedBeast, () => true); + } + else if (hint == HintMsg.AddToHand) + { + lubellionCheckDict.Add(CardId.BystialSaronir, () => true); + } + + foreach (KeyValuePair> pair in lubellionCheckDict) + { + ClientCard target = cards.FirstOrDefault(c => c.Id == pair.Key); + if (target != null && pair.Value()) + { + SelectSTPlace(target, false); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for albaz + case CardId.FallenOfAlbaz: + case CardId.FallenOfAlbaz + 1: + if (hint == HintMsg.SpSummon) + { + List fusionTargetIdList = new List { + CardId.MirrorjadeTheIcebladeDragon, CardId.AlbaLenatusTheAbyssDragon, CardId.AlbionTheBrandedDragon, CardId.AlbionTheSanctifireDragon, + CardId.LubellionTheSearingDragon, CardId.BorreloadFuriousDragon, CardId.TitanikladTheAshDragon, CardId.RindbrummTheStrikingDragon + }; + foreach (int targetId in fusionTargetIdList) + { + if (targetId == CardId.LubellionTheSearingDragon && Bot.Hand.Count == 0) continue; + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (hint == HintMsg.FusionMaterial) + { + if (cards.Count == 1) + { + selectedFusionMaterial.AddRange(cards); + return Util.CheckSelectCount(cards, cards, min, max); + } + // select best enemy monster + List sortedResult = cards.OrderByDescending(card => card.GetDefensePower()).ToList(); + selectedFusionMaterial.Add(sortedResult[0]); + return Util.CheckSelectCount(sortedResult, cards, min, max); + } + break; + + // for quem + case CardId.GuidingQuemTheVirtuous: + { + Dictionary> quemCheckDict = new Dictionary> + { + {CardId.BlazingCartesiaTheVirtuous, () => sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) && CheckRemainInDeck(CardId.BrandedInHighSpirits) > 0 }, + {CardId.BrandedFusion, () => Bot.HasInGraveyard(CardId.BrandedRetribution) }, + {CardId.FallenOfAlbaz, () => !Bot.HasInGraveyard(CardId.FallenOfAlbaz) }, + {CardId.TriBrigadeMercourier, () => Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) }, + {CardId.BrandedRetribution, () => true }, + {CardId.BrightestBlazingBrandedKing, () => !Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster) && fusionToGYFlag) }, + {CardId.BrandedInHighSpirits, () => fusionToGYFlag }, + {CardId.AlbionTheShroudedDragon, () => true }, + }; + + foreach (KeyValuePair> pair in quemCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for cartesia + case CardId.BlazingCartesiaTheVirtuous: + case CardId.BlazingCartesiaTheVirtuous + 1: + if (hint == HintMsg.SpSummon) + { + // fix material list + cartesiaMaterialList = cartesiaMaterialList.Where(c => c != null && (c.Location == CardLocation.MonsterZone || c.Location == CardLocation.Hand)).ToList(); + + // filter normal material + List materialList = Bot.MonsterZone.Where(c => c != null && c.GetDefensePower() <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + if (cartesiaSummonGoal > 0) + { + BlazingCartesiaTheVirtuousFusionCheck(cards, cartesiaSummonGoal, materialList, cartesiaMaterialList, out ClientCard _fusionTarget1, out _); + if (_fusionTarget1 != null) + { + fusionTarget = _fusionTarget1; + return Util.CheckSelectCount(new List { fusionTarget }, cards, min, max); + } + } + BlazingCartesiaTheVirtuousFusionCheck(cards, 0, materialList, cartesiaMaterialList, out ClientCard _fusionTarget2, out _); + if (_fusionTarget2 != null) + { + fusionTarget = _fusionTarget2; + return Util.CheckSelectCount(new List { fusionTarget }, cards, min, max); + } + + } + if (hint == HintMsg.FusionMaterial) + { + List mustSelectMaterialList = cartesiaMaterialList.Intersect(cards).ToList(); + if (mustSelectMaterialList != null && mustSelectMaterialList.Count > 0) + { + selectedFusionMaterial.Add(mustSelectMaterialList[0]); + return Util.CheckSelectCount(mustSelectMaterialList, cards, min, max); + } + + ClientCard lubellion = cards.FirstOrDefault(c => c != null && c.IsCode(CardId.TheBystialLubellion) && c.Location == CardLocation.MonsterZone); + if (lubellion != null && !Bot.HasInHandOrInSpellZone(CardId.BrandedBeast)) + { + if (activatedCardIdList.Contains(CardId.TheBystialLubellion + 1) || CheckRemainInDeck(CardId.BrandedLost, CardId.BrandedBeast) == 0) + { + if (Util.IsTurn1OrMain2() || Enemy.MonsterZone.Count(c => c != null && c.GetDefensePower() < 2500) > 0) + { + return Util.CheckSelectCount(new List { lubellion }, cards, min, max); + } + } + } + + ClientCard selectTarget = cards + .Where(c => c.Attack <= 2500 && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + .OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (selectTarget != null) + { + selectedFusionMaterial.Add(selectTarget); + return Util.CheckSelectCount(new List { selectTarget }, cards, min, max); + } + selectTarget = cards.OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (selectTarget != null) + { + selectedFusionMaterial.Add(selectTarget); + return Util.CheckSelectCount(new List { selectTarget }, cards, min, max); + } + } + break; + + // for nadir + case CardId.NadirServant: + if (hint == HintMsg.ToGrave) + { + if (summoned) + { + if (CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous) > 0) + { + ClientCard lulu = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.DespianLuluwalilith)); + if (lulu != null) + { + return Util.CheckSelectCount(new List { lulu }, cards, min, max); + } + } + if (!Bot.MonsterZone.Any(c => c != null && c.HasType(CardType.Fusion)) && CheckRemainInDeck(CardId.SpringansKitt) > 0) + { + ClientCard ironDragon = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.SprindTheIrondashDragon)); + if (ironDragon != null) + { + return Util.CheckSelectCount(new List { ironDragon }, cards, min, max); + } + } + } + NadirServantActivateCheck(cards, true, out ClientCard target); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + + // for deployment + case CardId.FusionDeployment: + { + int summonId = FusionDeploymentSpSummonTarget(); + if (summonId > 0) + { + if (hint == HintMsg.Confirm) + { + if (summonId == CardId.BlazingCartesiaTheVirtuous) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(CardId.GranguignolTheDuskDragon)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + else if (summonId == CardId.FallenOfAlbaz) + { + List shuffleList = ShuffleList(new List(cards)); + foreach (ClientCard target in shuffleList) + { + if (target.IsCode(albazFusionMonster)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + if (hint == HintMsg.SpSummon) + { + foreach (ClientCard target in cards) + { + if (target.IsCode(summonId)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + } + break; + + // for branded in white + case CardId.BrandedInWhite: + if (hint == HintMsg.SpSummon) + { + BrandedInWhiteFusionTarget(cards, out ClientCard target); + if (target != null) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (hint == HintMsg.FusionMaterial && fusionTarget != null) + { + if (fusionTarget.IsCode(CardId.BorreloadFuriousDragon)) + { + // select 2 dark dragon monster + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc).OrderBy(c => c.GetDefensePower()).ToList(); + int banishedAlbazCount = Bot.Banished.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz)).Count(); + banishedAlbazCount += selectedFusionMaterial.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz)).Count(); + foreach (ClientCard target in cardsInLoc) + { + // keep albaz + if (target.IsOriginalCode(CardId.FallenOfAlbaz) && banishedAlbazCount > 0) + { + continue; + } + selectedFusionMaterial.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (fusionTarget.IsCode(CardId.DespianQuaeritis)) + { + // select despain + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc && c.HasSetcode(SetcodeDespain) && (loc != CardLocation.Grave || !CheckWhetherShouldKeepInGrave(c))) + .OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsInLoc.Count > 0) + { + selectedFusionMaterial.Add(cardsInLoc[0]); + return Util.CheckSelectCount(cardsInLoc, cards, min, max); + } + } + } + // select light/dark + else + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) && (loc != CardLocation.Grave || !CheckWhetherShouldKeepInGrave(c))) + .OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsInLoc.Count > 0) + { + if (!activatedCardIdList.Contains(CardId.TriBrigadeMercourier + 1)) + { + ClientCard mercourier = cardsInLoc.FirstOrDefault(c => c.IsCode(CardId.TriBrigadeMercourier)); + if (mercourier != null) + { + selectedFusionMaterial.Add(mercourier); + return Util.CheckSelectCount(new List { mercourier }, cards, min, max); + } + } + if (!activatedCardIdList.Contains(CardId.DespianTragedy) && CheckRemainInDeck(CardId.AluberTheJesterOfDespia, CardId.GuidingQuemTheVirtuous) > 0) + { + ClientCard tragedy = cardsInLoc.FirstOrDefault(c => c.IsCode(CardId.DespianTragedy)); + if (tragedy != null) + { + selectedFusionMaterial.Add(tragedy); + return Util.CheckSelectCount(new List { tragedy }, cards, min, max); + } + } + + selectedFusionMaterial.Add(cardsInLoc[0]); + return Util.CheckSelectCount(cardsInLoc, cards, min, max); + } + } + } + } + if (fusionTarget.IsCode(CardId.GuardianChimera)) + { + List goalMaterialList = ChimeraFusionMaterialList().Intersect(cards).ToList(); + if (goalMaterialList.Count > 0) + { + return Util.CheckSelectCount(goalMaterialList, cards, min, max); + } + } + if (fusionTarget.IsCode(albazFusionMonster)) + { + // selecting albaz + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.MonsterZone, CardLocation.Hand }) + { + ClientCard albaz = cards.Where(c => c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (albaz != null) + { + selectedFusionMaterial.Add(albaz); + return Util.CheckSelectCount(new List { albaz }, cards, min, max); + } + } + } + else + { + if (fusionTarget.IsOriginalCode(CardId.AlbaLenatusTheAbyssDragon) && cancelable) + { + return null; + } + if (Util.IsTurn1OrMain2() && !CheckWhetherWillbeRemoved()) + { + ClientCard duskDragon = cards.FirstOrDefault(c => c.IsCode(CardId.GranguignolTheDuskDragon) && c.Location == CardLocation.MonsterZone); + if (duskDragon != null) + { + selectedFusionMaterial.Add(duskDragon); + return Util.CheckSelectCount(new List { duskDragon }, cards, min, max); + } + } + List> funcList = new List> + { + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.Location == CardLocation.MonsterZone && c.GetDefensePower() <= 2000, + (c) => c.Location == CardLocation.Hand, + (c) => c.Location == CardLocation.Grave, + (c) => c.Location == CardLocation.MonsterZone + }; + foreach (Func func in funcList) + { + List targetList = cards.Where(c => func(c)).OrderBy(c => c.GetDefensePower()).ToList(); + if (targetList.Count > 0) + { + selectedFusionMaterial.Add(targetList[0]); + return Util.CheckSelectCount(new List { targetList[0] }, cards, min, max); + } + } + } + } + } + break; + + // for branded fusion + case CardId.BrandedFusion: + if (hint == HintMsg.SpSummon) + { + Dictionary> brandedFusionCheckDict = new Dictionary> + { + {CardId.TitanikladTheAshDragon, () => Enemy.HasInMonstersZone(CardId.KashtiraAriseHeart) }, + {CardId.RindbrummTheStrikingDragon, () => CheckWhetherWillbeRemoved() && CheckRemainInDeck(CardId.TriBrigadeMercourier) > 0}, + {CardId.AlbionTheSanctifireDragon, () => CheckShouldNoMoreSpSummon()}, + {CardId.AlbionTheBrandedDragon, () => { + bool checkFlag = Bot.Graveyard.Any(c => c != null && c.IsMonster() && c.HasAttribute(CardAttribute.Dark) && !c.IsCode(cannotBeFusionMaterialIdList)); + checkFlag |= Bot.HasInHandOrHasInMonstersZone(CardId.TriBrigadeMercourier); + checkFlag |= Bot.GetMonsters().Any(c => c.GetDefensePower() <= 1800 && c.HasAttribute(CardAttribute.Dark) && !c.IsCode(cannotBeFusionMaterialIdList)); + return checkFlag; + } }, + {CardId.LubellionTheSearingDragon, () => !CheckWhetherNegated(true, true, CardType.Monster) && Bot.Hand.Count > 0 }, + {CardId.MirrorjadeTheIcebladeDragon, () => Bot.HasInMonstersZone(new List{ + CardId.GranguignolTheDuskDragon, CardId.AlbionTheBrandedDragon, CardId.LubellionTheSearingDragon}) } + }; + + foreach (KeyValuePair> pair in brandedFusionCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (hint == HintMsg.FusionMaterial) + { + // selecting albaz + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Deck, CardLocation.Hand, CardLocation.MonsterZone }) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.FallenOfAlbaz) && c.Location == loc); + if (target != null) + { + selectedFusionMaterial.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + // selecting another material + if (fusionTarget != null) + { + Dictionary> materialDict = new Dictionary> + { + { CardId.AlbionTheSanctifireDragon, new List{CardId.BlazingCartesiaTheVirtuous, _CardId.EffectVeiler, CardId.GuidingQuemTheVirtuous} }, + { CardId.MirrorjadeTheIcebladeDragon, new List{CardId.GranguignolTheDuskDragon, CardId.AlbionTheBrandedDragon, CardId.DespianLuluwalilith } }, + { CardId.LubellionTheSearingDragon, new List{ + CardId.DespianTragedy, CardId.BystialSaronir, CardId.AlbionTheShroudedDragon, CardId.AluberTheJesterOfDespia, CardId.TriBrigadeMercourier } }, + { CardId.TitanikladTheAshDragon, new List{CardId.TheBystialLubellion, CardId.AlbionTheShroudedDragon, CardId.BystialSaronir} }, + { CardId.RindbrummTheStrikingDragon, new List{CardId.TriBrigadeMercourier, CardId.SpringansKitt } }, + { CardId.AlbionTheBrandedDragon, new List{CardId.TheBystialLubellion, CardId.BlazingCartesiaTheVirtuous, CardId.GuidingQuemTheVirtuous } } + }; + materialDict.TryGetValue(fusionTarget.GetOriginCode(), out List checkIdList); + if (checkIdList != null && checkIdList.Count > 0) + { + foreach (CardLocation location in new List { CardLocation.Deck, CardLocation.Hand, CardLocation.MonsterZone }) + { + foreach (int checkId in checkIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.Location == location && c.IsCode(checkId)); + if (target != null) + { + selectedFusionMaterial.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + } + } + break; + + // for Sarcophagus + case CardId.GoldSarcophagus: + { + GoldSarcophagusTarget(cards, out ClientCard sarcophagusTarget); + if (sarcophagusTarget != null) + { + return Util.CheckSelectCount(new List { sarcophagusTarget }, cards, min, max); + } + } + break; + + // for burial + case CardId.FoolishBurial: + case CardId.FoolishBurial + 1: + { + FoolishBurialTarget(cards, out ClientCard burialTarget); + if (burialTarget != null) + { + return Util.CheckSelectCount(new List { burialTarget }, cards, min, max); + } + } + break; + + // for high spirit + case CardId.BrandedInHighSpirits: + // confirm + if (hint == HintMsg.Confirm) + { + if (Duel.Phase == DuelPhase.End && Bot.HasInMonstersZone(CardId.GuidingQuemTheVirtuous)) + { + ClientCard cartesia = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.BlazingCartesiaTheVirtuous)); + if (cartesia != null) + { + fusionTarget = cartesia; + return Util.CheckSelectCount(new List { cartesia }, cards, min, max); + } + } + bool activatingShroudedFlag = Duel.CurrentChain.Any(c => c.IsOriginalCode(CardId.AlbionTheShroudedDragon) && c.Location == CardLocation.Hand); + if (activatingShroudedFlag) + { + ClientCard shrouded = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.AlbionTheShroudedDragon)); + if (shrouded != null) + { + fusionTarget = shrouded; + return Util.CheckSelectCount(new List { shrouded }, cards, min, max); + } + } + List discardIdList = new List { + CardId.BystialSaronir, CardId.AlbionTheShroudedDragon, CardId.TheBystialLubellion, CardId.BlazingCartesiaTheVirtuous, + CardId.FallenOfAlbaz, CardId.TriBrigadeMercourier + }; + foreach (int discardId in discardIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(discardId)); + if (target != null) + { + // lubellion check + if (discardId == CardId.TheBystialLubellion && Duel.Player == 0 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) + && CheckRemainInDeck(CardId.BystialSaronir) > 0 && !activatedCardIdList.Contains(CardId.TheBystialLubellion)) + { + continue; + } + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + // discard + if (hint == HintMsg.ToGrave) + { + List discardIdList = new List { + CardId.AlbionTheBrandedDragon, CardId.TitanikladTheAshDragon, CardId.RindbrummTheStrikingDragon, CardId.AlbaLenatusTheAbyssDragon, + CardId.GranguignolTheDuskDragon + }; + foreach (int discardId in discardIdList) + { + if (sendToGYThisTurn.Any(c => c.IsOriginalCode(discardId))) continue; + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(discardId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for opening + case CardId.BrandedOpening: + if (hint == HintMsg.OperateCard) + { + Dictionary> openingCheckDict = new Dictionary>{ + {CardId.AluberTheJesterOfDespia, () => !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && !DefaultCheckWhetherCardIdIsNegated(CardId.AluberTheJesterOfDespia) + && !(CheckWhetherCanSummon() && Bot.HasInHand(CardId.AluberTheJesterOfDespia))}, + {CardId.GuidingQuemTheVirtuous, () => true }, + {CardId.DespianTragedy, () => true } + }; + foreach (KeyValuePair> pair in openingCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for branded in red + case CardId.BrandedInRed: + if (hint == HintMsg.SpSummon) + { + // filter normal material + List materialList = Bot.MonsterZone.Where(c => c != null && c.GetDefensePower() <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + BrandedInRedFusionCheck(cards, 0, materialList, brandedInRedMaterialList, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + fusionTarget = _fusionTarget; + return Util.CheckSelectCount(new List { fusionTarget }, cards, min, max); + } + + } + if (hint == HintMsg.FusionMaterial) + { + List mustSelectMaterialList = brandedInRedMaterialList.Intersect(cards).ToList(); + if (mustSelectMaterialList != null && mustSelectMaterialList.Count > 0) + { + selectedFusionMaterial.Add(mustSelectMaterialList[0]); + return Util.CheckSelectCount(mustSelectMaterialList, cards, min, max); + } + + ClientCard selectTarget = cards + .Where(c => c.Attack <= 2500 && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + .OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (selectTarget != null) + { + selectedFusionMaterial.Add(selectTarget); + return Util.CheckSelectCount(new List { selectTarget }, cards, min, max); + } + selectTarget = cards.OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (selectTarget != null) + { + selectedFusionMaterial.Add(selectTarget); + return Util.CheckSelectCount(new List { selectTarget }, cards, min, max); + } + } + break; + + // for branded king + case CardId.BrightestBlazingBrandedKing: + if (hint == HintMsg.Faceup) + { + List targetIdList = new List + { + CardId.MirrorjadeTheIcebladeDragon, CardId.AlbionTheSanctifireDragon, CardId.RindbrummTheStrikingDragon + }; + List> funcList = new List> + { + (c) => Duel.CurrentChain.Contains(c), + (c) => true + }; + foreach (Func func in funcList) + { + List chainedList = cards.Where(c => func(c)).ToList(); + if (chainedList.Count > 0) + { + foreach (int checkId in targetIdList) + { + ClientCard target = chainedList.FirstOrDefault(c => c.IsOriginalCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + ClientCard otherChainTarget = chainedList.FirstOrDefault(c => Duel.CurrentChain.Contains(c)); + if (otherChainTarget != null) + { + return Util.CheckSelectCount(new List { otherChainTarget }, cards, min, max); + } + } + } + } + break; + + // for retribution + case CardId.BrandedRetribution: + { + ClientCard searing = cards.FirstOrDefault(c => c.IsCode(CardId.LubellionTheSearingDragon)); + if (searing != null) + { + selectedFusionMaterial.Add(searing); + return Util.CheckSelectCount(new List { searing }, cards, min, max); + } + List checkIdList = new List { CardId.AlbionTheBrandedDragon, CardId.MirrorjadeTheIcebladeDragon, CardId.TitanikladTheAshDragon, CardId.AlbaLenatusTheAbyssDragon, + CardId.AlbionTheSanctifireDragon, CardId.SprindTheIrondashDragon}; + foreach (int checkId in checkIdList) + { + List gravePriorityList = cards.Where(c => c != null && c.IsCode(checkId) && c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c)).ToList(); + if (gravePriorityList.Count > 0) + { + selectedFusionMaterial.Add(gravePriorityList[0]); + return Util.CheckSelectCount(new List { gravePriorityList[0] }, cards, min, max); + } + } + List graveList = cards.Where(c => c != null && c.Location == CardLocation.Grave).ToList(); + if (graveList.Count > 0) + { + selectedFusionMaterial.Add(graveList[0]); + return Util.CheckSelectCount(new List { graveList[0] }, cards, min, max); + } + ClientCard monsterOnField = cards.Where(c => c != null && c.Location == CardLocation.MonsterZone).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (monsterOnField != null) + { + selectedFusionMaterial.Add(monsterOnField); + return Util.CheckSelectCount(new List { monsterOnField }, cards, min, max); + } + } + break; + + // for chimera + case CardId.GuardianChimera: + { + List targetList = new List(); + + targetList.AddRange(GetProblematicEnemyCardList(false, false, CardType.Monster)); + int bestBotPower = Util.GetBestPower(Bot); + targetList.AddRange(Enemy.MonsterZone.Where(c => c != null && !targetList.Contains(c) && c.GetDefensePower() >= bestBotPower).OrderByDescending(c => c.GetDefensePower())); + targetList.AddRange(ShuffleList(enemyPlaceThisTurn)); + + return Util.CheckSelectCount(targetList, cards, min, max); + } + break; + + // for sanctifire + case CardId.AlbionTheSanctifireDragon: + if (hint == Util.GetStringId(CardId.AlbionTheSanctifireDragon, 1)) + { + ClientCard albaz = cards.FirstOrDefault(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (albaz != null && CheckAlbazFusion()) + { + return Util.CheckSelectCount(new List { albaz }, cards, min, max); + } + + ClientCard floogate = cards.Where(c => c.IsFloodgate()).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (floogate != null) + { + return Util.CheckSelectCount(new List { floogate }, cards, min, max); + } + + return Util.CheckSelectCount(cards.OrderByDescending(c => c.GetDefensePower()).ToList(), cards, min, max); + } + break; + + // for mirrorjade + case CardId.MirrorjadeTheIcebladeDragon: + { + List floodgateList = ShuffleList(cards.Where(c => c.Controller == 1 && c.IsFloodgate()).ToList()); + if (floodgateList.Count > 0) + { + return Util.CheckSelectCount(floodgateList, cards, min, max); + } + + List extraMonsterList = cards.Where(c => c.Controller == 1 && ( + c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (c.HasType(CardType.Link) && c.LinkCount >= 2))).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (extraMonsterList.Count > 0) + { + return Util.CheckSelectCount(extraMonsterList, cards, min, max); + } + + ClientCard worstBotMonster = Util.GetWorstBotMonster(); + int worstBotPower = worstBotMonster == null ? 0 : worstBotMonster.GetDefensePower(); + List betterMonsterList = cards.Where(c => c.Controller == 1 && c.GetDefensePower() >= worstBotPower).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (betterMonsterList.Count > 0) + { + return Util.CheckSelectCount(betterMonsterList, cards, min, max); + } + + List dangerMonsterList = cards.Where(c => c.Controller == 1 && (c.IsMonsterDangerous() || c.IsMonsterInvincible())) + .OrderByDescending(c => c.GetDefensePower()).ToList(); + if (dangerMonsterList.Count > 0) + { + return Util.CheckSelectCount(dangerMonsterList, cards, min, max); + } + + List allEnemyMonsterList = cards.Where(c => c.Controller == 1).OrderByDescending(c => c.IsFacedown() ? 0 : c.GetDefensePower()).ToList(); + if (allEnemyMonsterList.Count > 0) + { + return Util.CheckSelectCount(allEnemyMonsterList, cards, min, max); + } + + ClientCard botMonsterWithEffect = cards.FirstOrDefault(c => c.Controller == 0 && c.IsCode(new[] { CardId.DespianTragedy, CardId.TriBrigadeMercourier })); + if (botMonsterWithEffect != null) + { + return Util.CheckSelectCount(new List { botMonsterWithEffect }, cards, min, max); + } + ClientCard botLubellion = cards.FirstOrDefault(c => c.Controller == 0 && c.IsCode(CardId.TheBystialLubellion)); + if (botLubellion != null) + { + return Util.CheckSelectCount(new List { botLubellion }, cards, min, max); + } + + + List allBotMonster = cards.Where(c => c.Controller == 0).OrderBy(c => c.IsFacedown() ? 0 : c.GetDefensePower()).ToList(); + if (allBotMonster.Count > 0) + { + return Util.CheckSelectCount(allBotMonster, cards, min, max); + } + } + break; + + // for searing dragon + case CardId.LubellionTheSearingDragon: + if (hint == HintMsg.SpSummon) + { + LubellionTheSearingDragonFusionTarget(cards, out ClientCard target); + if (target != null) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (hint == HintMsg.FusionMaterial && fusionTarget != null) + { + if (fusionTarget.IsCode(CardId.BorreloadFuriousDragon)) + { + // select 2 dark dragon monster + List> furiousFuncList = new List> + { + (c) => c.IsFaceup() && c.Location == CardLocation.Removed && c.IsCode(CardId.AlbionTheBrandedDragon), + (c) => c.IsFaceup() && c.Location == CardLocation.Removed && c.IsCode(CardId.FallenOfAlbaz), + (c) => c.Location == CardLocation.Grave && c.IsCode(CardId.AlbionTheBrandedDragon) && !CheckWhetherShouldKeepInGrave(c), + (c) => c.IsFaceup() && c.Location == CardLocation.Removed && c.IsCode(CardId.TitanikladTheAshDragon), + (c) => c.IsFaceup() && c.Location == CardLocation.Removed, + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.Location == CardLocation.Grave, + (c) => c.Location == CardLocation.Hand || c.Location == CardLocation.MonsterZone + }; + + foreach (Func func in furiousFuncList) + { + List cardWithFunc = cards.Where(c => func(c)).OrderBy(c => c.GetDefensePower()).ToList(); + if (cardWithFunc.Count > 0) + { + selectedFusionMaterial.Add(cardWithFunc[0]); + return Util.CheckSelectCount(new List { cardWithFunc[0] }, cards, min, max); + } + } + } + List> funcList = new List> + { + (c) => c.IsFaceup() && c.Location == CardLocation.Removed, + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.IsCode(CardId.LubellionTheSearingDragon), + (c) => c.Location == CardLocation.Grave, + (c) => c.Location == CardLocation.MonsterZone, + (c) => c.Location == CardLocation.Hand, + }; + if (selectedFusionMaterial.Count == 0) + { + if (fusionTarget.IsOriginalCode(CardId.DespianQuaeritis)) + { + foreach (Func func in funcList) + { + List cardsWithFunc = cards.Where(c => func(c) && c.HasSetcode(SetcodeDespain)).OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsWithFunc.Count > 0) + { + selectedFusionMaterial.Add(cardsWithFunc[0]); + return Util.CheckSelectCount(cardsWithFunc, cards, min, max); + } + } + } + if (fusionTarget.IsCode(albazFusionMonster)) + { + foreach (Func func in funcList) + { + List cardsWithFunc = cards.Where(c => func(c) && c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsWithFunc.Count > 0) + { + selectedFusionMaterial.Add(cardsWithFunc[0]); + return Util.CheckSelectCount(cardsWithFunc, cards, min, max); + } + } + } + } + if (fusionTarget.IsCode(CardId.AlbaLenatusTheAbyssDragon)) + { + // select non-albaz + if (selectedFusionMaterial.Count > 0) + { + funcList = new List> + { + (c) => c.IsFaceup() && c.Location == CardLocation.Removed, + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.IsCode(CardId.LubellionTheSearingDragon), + }; + } + } + foreach (Func func in funcList) + { + List cardsWithFunc = cards.Where(c => func(c)).OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsWithFunc.Count > 0) + { + selectedFusionMaterial.Add(cardsWithFunc[0]); + return Util.CheckSelectCount(cardsWithFunc, cards, min, max); + } + } + if (fusionTarget.IsOriginalCode(CardId.AlbaLenatusTheAbyssDragon) && cancelable) + { + return null; + } + } + break; + + // for granguignol + case CardId.GranguignolTheDuskDragon: + if (hint == HintMsg.ToGrave) + { + GranguignolTheDuskDragonSendToGYTarget(cards, out ClientCard target); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (hint == HintMsg.SpSummon) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.DespianQuaeritis, () => Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.Attack >= Util.GetBestPower(Bot) && !(c.HasType(CardType.Fusion) && c.Level >= 8)) }, + {CardId.GuidingQuemTheVirtuous, () => Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon) || Util.GetOneEnemyBetterThanValue(1500) == null }, + {CardId.DespianLuluwalilith, () => !(Duel.Player == 0 && Bot.HasInHandOrInSpellZone(CardId.BrandedFusion)) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for Quaeritis + case CardId.DespianQuaeritis: + { + Dictionary> checkDict = new Dictionary> + { + {CardId.FallenOfAlbaz, () => CheckAlbazFusion() }, + {CardId.GuidingQuemTheVirtuous, () => !DefaultCheckWhetherCardIdIsNegated(CardId.GuidingQuemTheVirtuous) }, + {CardId.AluberTheJesterOfDespia, () => !DefaultCheckWhetherCardIdIsNegated(CardId.AluberTheJesterOfDespia) }, + {CardId.DespianTragedy, () => true } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for irondash dragon + case CardId.SprindTheIrondashDragon: + { + Dictionary> checkDict = new Dictionary> + { + {CardId.FallenOfAlbaz, () => CheckAlbazFusion() }, + {CardId.SpringansKitt, () => !DefaultCheckWhetherCardIdIsNegated(CardId.SpringansKitt) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for ash dragon + case CardId.TitanikladTheAshDragon: + { + Dictionary> checkDict = new Dictionary> + { + {CardId.FallenOfAlbaz, () => CheckAlbazFusion() }, + {CardId.GuidingQuemTheVirtuous, () => !DefaultCheckWhetherCardIdIsNegated(CardId.GuidingQuemTheVirtuous) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for rindrumm + case CardId.RindbrummTheStrikingDragon: + if (hint == HintMsg.SpSummon) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.FallenOfAlbaz, () => CheckAlbazFusion() }, + {CardId.RindbrummTheStrikingDragon, () => true }, + {CardId.AlbionTheShroudedDragon, () => true } + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (hint == HintMsg.ReturnToHand) + { + List problemList = GetProblematicEnemyCardList(false, true, CardType.Monster).Intersect(cards).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (problemList.Count > 0) + { + return Util.CheckSelectCount(problemList, cards, min, max); + } + ClientCard worstBotMonster = Util.GetWorstBotMonster(); + int worstBotPower = worstBotMonster == null ? 0 : worstBotMonster.GetDefensePower(); + List dangerList = cards.Where(c => c.IsFaceup() && c.Controller == 1 && c.GetDefensePower() > worstBotPower).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (dangerList.Count > 0) + { + return Util.CheckSelectCount(dangerList, cards, min, max); + } + List checkIdList = new List { CardId.AluberTheJesterOfDespia, CardId.SpringansKitt }; + foreach (int checkId in checkIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.Controller == 0 && c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + List enemyMonsterList = cards.Where(c => c.Controller == 1).OrderByDescending(c => c.GetDefensePower()).ToList(); + if (enemyMonsterList.Count > 0) + { + return Util.CheckSelectCount(enemyMonsterList, cards, min, max); + } + return Util.CheckSelectCount(cards.Where(c => c.Controller == 0).OrderByDescending(c => c.GetDefensePower()).ToList(), cards, min, max); + } + break; + + // for branded dragon + case CardId.AlbionTheBrandedDragon: + if (hint == HintMsg.SpSummon) + { + AlbionTheBrandedDragonFusionTarget(cards, out ClientCard target); + if (target != null) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (hint == HintMsg.FusionMaterial && fusionTarget != null) + { + if (fusionTarget.IsCode(CardId.BorreloadFuriousDragon)) + { + // select 2 dark dragon monster + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc).OrderBy(c => c.GetDefensePower()).ToList(); + int banishedAlbazCount = Bot.Banished.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz)).Count(); + banishedAlbazCount += selectedFusionMaterial.Where(c => c.IsOriginalCode(CardId.FallenOfAlbaz)).Count(); + foreach (ClientCard target in cardsInLoc) + { + // keep albaz + if (target.IsOriginalCode(CardId.FallenOfAlbaz) && banishedAlbazCount > 0) + { + continue; + } + selectedFusionMaterial.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (fusionTarget.IsCode(CardId.DespianQuaeritis)) + { + // select despain + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc && c.HasSetcode(SetcodeDespain) && (loc != CardLocation.Grave || !CheckWhetherShouldKeepInGrave(c))) + .OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsInLoc.Count > 0) + { + selectedFusionMaterial.Add(cardsInLoc[0]); + return Util.CheckSelectCount(cardsInLoc, cards, min, max); + } + } + } + // select light/dark + else + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.Hand, CardLocation.MonsterZone }) + { + List cardsInLoc = cards.Where(c => c.Location == loc && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) && (loc != CardLocation.Grave || !CheckWhetherShouldKeepInGrave(c))) + .OrderBy(c => c.GetDefensePower()).ToList(); + if (cardsInLoc.Count > 0) + { + if (!activatedCardIdList.Contains(CardId.TriBrigadeMercourier + 1)) + { + ClientCard mercourier = cardsInLoc.FirstOrDefault(c => c.IsCode(CardId.TriBrigadeMercourier)); + if (mercourier != null) + { + selectedFusionMaterial.Add(mercourier); + return Util.CheckSelectCount(new List { mercourier }, cards, min, max); + } + } + if (!activatedCardIdList.Contains(CardId.DespianTragedy) && CheckRemainInDeck(CardId.AluberTheJesterOfDespia, CardId.GuidingQuemTheVirtuous) > 0) + { + ClientCard tragedy = cardsInLoc.FirstOrDefault(c => c.IsCode(CardId.DespianTragedy)); + if (tragedy != null) + { + selectedFusionMaterial.Add(tragedy); + return Util.CheckSelectCount(new List { tragedy }, cards, min, max); + } + } + + selectedFusionMaterial.Add(cardsInLoc[0]); + return Util.CheckSelectCount(cardsInLoc, cards, min, max); + } + } + } + } + if (fusionTarget.IsCode(albazFusionMonster)) + { + // selecting albaz + if (selectedFusionMaterial.Count == 0) + { + foreach (CardLocation loc in new[] { CardLocation.Grave, CardLocation.MonsterZone, CardLocation.Hand }) + { + ClientCard albaz = cards.Where(c => c.IsCode(CardId.FallenOfAlbaz) && c.Location == loc).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (albaz != null) + { + selectedFusionMaterial.Add(albaz); + return Util.CheckSelectCount(new List { albaz }, cards, min, max); + } + } + } + else + { + if (fusionTarget.IsOriginalCode(CardId.AlbaLenatusTheAbyssDragon) && cancelable) + { + return null; + } + List> funcList = new List> + { + (c) => c.Location == CardLocation.Grave && !CheckWhetherShouldKeepInGrave(c), + (c) => c.Location == CardLocation.MonsterZone && c.GetDefensePower() <= 2000, + (c) => c.Location == CardLocation.Grave, + (c) => c.Location == CardLocation.Hand, + (c) => c.Location == CardLocation.MonsterZone + }; + foreach (Func func in funcList) + { + List targetList = cards.Where(c => func(c)).OrderBy(c => c.GetDefensePower()).ToList(); + if (targetList.Count > 0) + { + selectedFusionMaterial.Add(targetList[0]); + return Util.CheckSelectCount(new List { targetList[0] }, cards, min, max); + } + } + } + } + } + if (hint == HintMsg.OperateCard) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.BrandedInHighSpirits, () => Bot.HasInMonstersZone(CardId.GuidingQuemTheVirtuous) && BrandedInHighSpiritsActivateCheck() }, + {CardId.BrightestBlazingBrandedKing, () => Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedInRed, () => Bot.Graveyard.Any(c => c != null && (c.HasSetcode(SetcodeDespain) || c.IsCode(CardId.FallenOfAlbaz))) }, + {CardId.BrandedRetribution, () => Bot.Graveyard.Where(c => c != null && c.IsCode(albazFusionMonster)).Count() > 1 }, + {CardId.BrandedFusion, () => CheckRemainInDeck(CardId.FallenOfAlbaz) > 0 }, + {CardId.BrandedBeast, () => Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeBystial)) }, + {CardId.BrandedLost, () => true }, + {CardId.BrandedInWhite, () => true } + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (target != null && pair.Value()) + { + fusionTarget = target; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + + // for luluwa + case CardId.DespianLuluwalilith: + if (hint == HintMsg.Disable) + { + List enemyCardList = cards.Where(c => c.IsFaceup() && c.Controller == 1).ToList(); + List problemCardList = GetProblematicEnemyCardList(false, false, 0).Intersect(enemyCardList).ToList(); + if (problemCardList.Count > 0) + { + return Util.CheckSelectCount(ShuffleList(problemCardList), cards, min, max); + } + List monsterList = GetMonsterListForTargetNegate(false, 0).Intersect(enemyCardList).ToList(); + if (monsterList.Count > 0) + { + return Util.CheckSelectCount(ShuffleList(monsterList), cards, min, max); + } + if (enemyCardList.Count > 0) + { + return Util.CheckSelectCount(ShuffleList(enemyCardList), cards, min, max); + } + } + if (hint == HintMsg.SpSummon) + { + foreach (CardLocation loc in new[] { CardLocation.Deck, CardLocation.Hand }) + { + foreach (int checkId in new List { CardId.BlazingCartesiaTheVirtuous, CardId.GuidingQuemTheVirtuous }) + { + ClientCard target = cards.FirstOrDefault(c => c.Location == loc && c.IsOriginalCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + break; + + default: + break; + } + } + + // drop 1 hand + bool discardHand = hint == HintMsg.Discard; + bool handToDeck = hint == HintMsg.ToDeck && cards.All(c => c.Location == CardLocation.Hand); + if (min == 1 && max == 1 && (discardHand || handToDeck)) + { + if (currentSolvingChain != null && currentSolvingChain.IsCode(CardId.BrandedOpening)) + { + ClientCard tragedy = cards.FirstOrDefault(card => card.IsCode(CardId.DespianTragedy)); + if (tragedy != null) + { + return Util.CheckSelectCount(new List { tragedy }, cards, min, max); + } + } + if (discardHand) + { + // discard activating shrouded + foreach (ClientCard target in cards) + { + if (target.IsCode(CardId.AlbionTheShroudedDragon) && Duel.CurrentChain.Contains(target)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + + List discardList = new List { + CardId.BrandedRetribution, CardId.AlbionTheShroudedDragon, CardId.BystialSaronir, CardId.BrightestBlazingBrandedKing, + CardId.BrandedInHighSpirits, CardId.BlazingCartesiaTheVirtuous, CardId.DespianTragedy }; + foreach (int id in discardList) + { + ClientCard card = cards.FirstOrDefault(c => c.IsCode(id)); + if (card != null) + { + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + } + // return dump card + foreach (ClientCard card in cards) + { + if (cards.Where(c => c.IsCode(card.Id)).Count() > 1) + { + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + List improperCardIdList = new List + { + CardId.BrandedRetribution, CardId.BrandedInHighSpirits, CardId.DespianTragedy, CardId.FusionDeployment, CardId.BrandedBeast, + CardId.AlbionTheShroudedDragon, CardId.BrandedOpening, CardId.GoldSarcophagus, CardId.FoolishBurial, CardId.FallenOfAlbaz, + CardId.BrandedInRed, _CardId.InfiniteImpermanence, CardId.TheBystialLubellion, CardId.BrandedLost, CardId.SpringansKitt, + CardId.GuidingQuemTheVirtuous, _CardId.CrossoutDesignator, _CardId.CalledByTheGrave, CardId.TriBrigadeMercourier, _CardId.AshBlossom, _CardId.MaxxC + }; + foreach (int id in improperCardIdList) + { + if (id == CardId.BrandedLost && Bot.HasInHand(CardId.BrandedFusion) && BrandedFusionActivateCheck()) continue; + ClientCard target = cards.FirstOrDefault(c => c.IsCode(id)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + else if (discardHand && min > 0 && min == max) + { + List discardList = new List(); + List graveEffectIdList = new List { CardId.AlbionTheShroudedDragon, CardId.BrandedRetribution, CardId.BrandedInHighSpirits, + CardId.BrightestBlazingBrandedKing, CardId.DespianTragedy }; + discardList.AddRange(ShuffleList(cards.Where(c => c.IsCode(graveEffectIdList)).ToList())); + List remainHandList = cards.Except(discardList).ToList(); + + HashSet seenIds = new HashSet(); + for (int idx = remainHandList.Count - 1; idx >= 0; idx --) + { + ClientCard currentCard = remainHandList[idx]; + if (!seenIds.Add(currentCard.Id)) + { + discardList.Add(currentCard); + remainHandList.Remove(currentCard); + } + } + + List improperCardIdList = new List + { + CardId.FusionDeployment, CardId.BrandedBeast, CardId.AlbionTheShroudedDragon, CardId.BrandedOpening, CardId.GoldSarcophagus, + CardId.FoolishBurial, CardId.FallenOfAlbaz, CardId.BrandedInRed, _CardId.InfiniteImpermanence, CardId.TheBystialLubellion, + CardId.BrandedLost, CardId.SpringansKitt, CardId.GuidingQuemTheVirtuous, _CardId.CrossoutDesignator, _CardId.CalledByTheGrave, + CardId.TriBrigadeMercourier, _CardId.AshBlossom, _CardId.MaxxC + }; + foreach (int id in improperCardIdList) + { + ClientCard target = remainHandList.FirstOrDefault(c => c.IsCode(id)); + if (target != null) + { + discardList.Add(target); + } + } + if (discardList.Count > min) + { + discardList = discardList.Take(min).ToList(); + } + + return Util.CheckSelectCount(discardList, cards, min, max); + } + + // for The Bystial Lubellion + if (theBystialLubellionSelecting) + { + theBystialLubellionSelecting = false; + ClientCard target = TheBystialLubellionSpSummonCost(cards); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } else + { + List targetList = new List(cards); + targetList.Sort(CardContainer.CompareCardAttack); + return Util.CheckSelectCount(targetList, cards, min, max); + } + } + + // for shrouded/saronir + if (albionTheShroudedDragonSelecting || (currentSolvingChain != null && currentSolvingChain.IsCode(CardId.BystialSaronir))) + { + // send retribution first + ClientCard retribution = cards.FirstOrDefault(c => c.IsCode(CardId.BrandedRetribution)); + if (retribution != null) + { + if (retribution.Location == CardLocation.Deck || Bot.GetGraveyardMonsters().Where(c => c.IsCode(albazFusionMonster)).Count() < 2) + { + return Util.CheckSelectCount(new List { retribution }, cards, min, max); + } + } + // send spells to recycle + if (Bot.HasInGraveyard(CardId.BrandedRetribution) || (Bot.HasInGraveyard(CardId.DespianTragedy) && !activatedCardIdList.Contains(CardId.DespianTragedy))) + { + Dictionary> deckCheckDict = new Dictionary>{ + {CardId.BrandedFusion, () => BrandedFusionActivateCheck()}, + {CardId.BrandedLost, () => { + if (Duel.Player == 0 && Duel.Phase >= DuelPhase.End) return false; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) && BrandedFusionActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null) return true; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion()) return true; + if ((Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) || (!summoned && Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous)))) return true; + return false; + } }, + {CardId.BrandedInHighSpirits, BrandedInHighSpiritsActivateCheck}, + {CardId.BrandedInRed, () => BrandedInRedActivateCheck() != null }, + {CardId.BrandedInWhite, BrandedInWhiteActivateCheck }, + {CardId.BrandedRetribution, () => cards.Any(c => c.IsCode(CardId.BrandedRetribution) && c.Location == CardLocation.Removed) }, + {CardId.BrightestBlazingBrandedKing, () => Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedOpening, () => Bot.Hand.Count > 2 } + }; + foreach (KeyValuePair> pair in deckCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.Location == CardLocation.Deck && card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + // for abyss dragon + if (albionTheShroudedDragonSelecting && + FallenOfAlbazSetCheck() && (summoned || !Bot.HasInHand(new List { CardId.FallenOfAlbaz, CardId.BrandedInHighSpirits }))) + { + List checkIdList = new List { + CardId.BrandedRetribution, CardId.BrandedInHighSpirits, CardId.BrightestBlazingBrandedKing, CardId.BrandedInWhite, CardId.BrandedOpening, + CardId.BrandedInRed, CardId.BrandedBeast, CardId.BrandedLost + }; + if (!BrandedFusionActivateCheck()) + { + checkIdList.Add(CardId.BrandedFusion); + } + foreach (int checkId in checkIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.Id == checkId); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + // send from deck + List checkList = new List { CardId.BrandedInHighSpirits, CardId.BrandedOpening, CardId.BrightestBlazingBrandedKing, CardId.BrandedBeast, CardId.BrandedLost }; + foreach (int checkId in checkList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId) && c.Location == CardLocation.Deck); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + return Util.CheckSelectCount(ShuffleList(new List(cards)), cards, min, max); + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override int OnSelectOption(IList options) + { + ChainInfo currentSolvingChain = Duel.GetCurrentSolvingChainInfo(); + if (currentSolvingChain != null) + { + // 1190=Add to Hand, 1152=Special Summon + if (options.Count == 2 && options.Contains(1190) && options.Contains(1152)) + { + if (currentSolvingChain.IsCode(CardId.BrandedOpening)) + { + return (CheckShouldNoMoreSpSummon() && !summoned && Duel.Player == 0) ? options.IndexOf(1190) : options.IndexOf(1152); + } + + if (fusionTarget != null && ( + currentSolvingChain.IsCode(CardId.DespianQuaeritis) + || currentSolvingChain.IsCode(CardId.TitanikladTheAshDragon) + || currentSolvingChain.IsCode(CardId.SprindTheIrondashDragon) + )) + { + if (fusionTarget.IsCode(CardId.FallenOfAlbaz)) + { + return CheckAlbazFusion() ? options.IndexOf(1152) : options.IndexOf(1190); + } + if (fusionTarget.IsCode(CardId.GuidingQuemTheVirtuous, CardId.SpringansKitt)) + { + return CheckShouldNoMoreSpSummon() ? options.IndexOf(1190) : options.IndexOf(1152); + } + if (fusionTarget.IsCode(CardId.AluberTheJesterOfDespia)) + { + return activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) ? options.IndexOf(1190) : options.IndexOf(1152); + } + return (CheckShouldNoMoreSpSummon() && !summoned) ? options.IndexOf(1190) : options.IndexOf(1152); + } + } + + // 1190=Add to Hand, 1153=Set + if (currentSolvingChain.IsCode(CardId.AlbionTheBrandedDragon) && fusionTarget != null) + { + if (fusionTarget.IsOriginalCode(CardId.BrandedInHighSpirits) && Duel.Player == 0) + { + return BrandedInHighSpiritsActivateCheck() ? options.IndexOf(1190) : options.IndexOf(1153); + } + if (fusionTarget.IsOriginalCode(CardId.BrandedInRed) && Duel.Player == 0) + { + if (nadirActivated) return options.IndexOf(1153); + return BrandedInRedActivateCheck() != null ? options.IndexOf(1190) : options.IndexOf(1153); + } + if (fusionTarget.Data != null) + { + bool setFlag = fusionTarget.Data.HasType(CardType.Trap); + setFlag |= fusionTarget.Data.HasType(CardType.QuickPlay) && Duel.Player == 0; + setFlag |= Bot.Hand.Count >= 6 && Duel.Player == 0; + return setFlag ? options.IndexOf(1153) : options.IndexOf(1190); + } + } + } + + return base.OnSelectOption(options); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + ChainInfo currentSovingChain = Duel.GetCurrentSolvingChainInfo(); + if (currentSovingChain != null && currentSovingChain.ActivatePlayer == 0 && currentSovingChain.IsCode(CardId.SprindTheIrondashDragon)) + { + return SprindTheIrondashDragonMoveZone(available, null); + } + + if (player == 0 && location == CardLocation.MonsterZone) + { + List zoneIdList = ShuffleList(new List { 5, 6 }); + zoneIdList.AddRange(ShuffleList(new List { 0, 2, 4 })); + zoneIdList.AddRange(ShuffleList(new List { 1, 3 })); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + return zone; + } + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.BrandedInHighSpirits, 2)) + { + if (CheckWhetherWillbeRemoved()) return false; + if (fusionTarget != null && fusionTarget.IsOriginalCode(CardId.TriBrigadeMercourier)) + { + return !Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster)); + } + } + + if (desc == Util.GetStringId(CardId.RindbrummTheStrikingDragon, 2)) + { + bool checkFlag = Enemy.MonsterZone.Any(c => c != null); + checkFlag |= Bot.MonsterZone.Any(c => c != null && (c.IsOriginalCode(CardId.AluberTheJesterOfDespia) || c.IsOriginalCode(CardId.SpringansKitt))); + return checkFlag; + } + + if (desc == Util.GetStringId(CardId.DespianLuluwalilith, 2)) + { + bool checkFlag = Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled()); + checkFlag |= Enemy.SpellZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled()); + return checkFlag; + } + + if (desc == Util.GetStringId(CardId.BrandedInRed, 0)) + { + // fix material list + brandedInRedMaterialList = brandedInRedMaterialList.Where(c => c != null && (c.Location == CardLocation.MonsterZone || c.Location == CardLocation.Hand)).ToList(); + + List materialList = Bot.MonsterZone.Where(c => c != null && c.Attack <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + BrandedInRedFusionCheck(Bot.ExtraDeck, 0, + materialList, brandedInRedMaterialList, + out ClientCard _fusionTarget, out _); + + return _fusionTarget != null; + } + + if (desc == Util.GetStringId(CardId.SprindTheIrondashDragon, 2)) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + int value = SprindTheIrondashDragonDestroyValue(currentSolvingChain.Sequence); + return value > 0; + } + } + + return base.OnSelectYesNo(desc); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null && currentSolvingChain.IsCode(CardId.AlbionTheSanctifireDragon)) + { + sanctifireSelectPositionCount++; + if (sanctifireSelectPositionCount >= 2) + { + if (Duel.Phase <= DuelPhase.Main2) + { + return CardPosition.FaceUpDefence; + } + } + } + + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + dimensionShifterCount = 0; + } + + summoned = false; + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + enemyActivateInfiniteImpermanenceFromHand = false; + nadirActivated = false; + fusionToGYFlag = false; + spSummoningAlbaz = false; + cartesiaSummonGoal = 0; + sanctifireSelectPositionCount = 0; + quemSummonFlag = 0; + if (dimensionShifterCount > 0) dimensionShifterCount--; + cartesiaMaterialList.Clear(); + brandedInRedMaterialList.Clear(); + infiniteImpermanenceList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + sendToGYThisTurn.Clear(); + activatedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + Duel.LastChainTargets.Clear(); + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + if (enemyActivateInfiniteImpermanenceFromHand) + { + enemyActivateInfiniteImpermanenceFromHand = false; + } + else + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + } + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null) + { + // if activation is negated, it can activate again. + if (currentCard.ActivatePlayer == 0) + { + List activateCheck = new List { CardId.NadirServant, CardId.FusionDeployment, CardId.BrandedFusion, CardId.BrandedInRed }; + if (currentCard.IsCode(activateCheck)) + { + activatedCardIdList.Add(currentCard.ActivateId); + } + } + if (!Duel.IsCurrentSolvingChainNegated()) + { + if (currentCard.ActivatePlayer == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) + enemyActivateLockBird = true; + if (currentCard.IsCode(CardId.DimensionShifter)) + dimensionShifterCount = 2; + } + if (currentCard.ActivatePlayer == 0 && currentCard.IsCode(CardId.NadirServant)) + { + nadirActivated = true; + } + } + } + fusionTarget = null; + selectedFusionMaterial.Clear(); + sanctifireSelectPositionCount = 0; + + base.OnChainSolved(chainIndex); + } + + public override void OnChainEnd() + { + cartesiaSummonGoal = 0; + cartesiaMaterialList.Clear(); + brandedInRedMaterialList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + theBystialLubellionSelecting = false; + albionTheShroudedDragonSelecting = false; + spSummoningAlbaz = false; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || (checkTarget.Location != CardLocation.SpellZone && checkTarget.Location != CardLocation.MonsterZone)) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + if (quemSummonFlag > 0) quemSummonFlag--; + base.OnChainEnd(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (previousControler == 1) + { + if (card != null) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && previousLocation == (int)CardLocation.Hand && currentLocation == (int)CardLocation.SpellZone) + enemyActivateInfiniteImpermanenceFromHand = true; + } + } + if (card != null) + { + if (currentControler == 1 && (currentLocation == (int)CardLocation.MonsterZone || currentLocation == (int)CardLocation.SpellZone)) + { + enemyPlaceThisTurn.Add(card); + } + if (currentControler == 0) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (previousLocation == (int)CardLocation.Grave && currentLocation != (int)CardLocation.Grave) + { + sendToGYThisTurn.Remove(card); + } + if (currentLocation == (int)CardLocation.Grave) + { + if (card.HasType(CardType.Fusion)) fusionToGYFlag = true; + sendToGYThisTurn.Add(card); + } + if (currentLocation == (int)CardLocation.MonsterZone && card != null && card.IsCode(CardId.GuidingQuemTheVirtuous)) + { + quemSummonFlag = 2; + } + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool TheBystialLubellionSpSummon() + { + if (Card.Location == CardLocation.Hand) + { + return false; + } + ClientCard costTarget = TheBystialLubellionSpSummonCost(Bot.GetMonsters()); + if (costTarget != null) + { + theBystialLubellionSelecting = true; + activatedCardIdList.Add(Card.Id - 1); + return true; + } + return false; + } + + public ClientCard TheBystialLubellionSpSummonCost(IList costList) + { + Dictionary> checkDict = new Dictionary>{ + {CardId.AlbionTheBrandedDragon, (card) => sendToGYThisTurn.All(c => !c.IsCode(CardId.AlbionTheBrandedDragon))}, + {CardId.BystialSaronir, (card) => !activatedCardIdList.Contains(CardId.BystialSaronir + 1) && !CheckWhetherWillbeRemoved() }, + {CardId.TitanikladTheAshDragon, (card) => Util.IsTurn1OrMain2() || card.GetDefensePower() < 2500 }, + {CardId.AlbaLenatusTheAbyssDragon, (card) => Util.IsTurn1OrMain2() || card.IsDisabled() || card.GetDefensePower() < 2500 }, + {CardId.AlbionTheShroudedDragon, (card) => Util.IsTurn1OrMain2() || card.GetDefensePower() < 2500 }, + {CardId.BorreloadFuriousDragon, (card) => card.IsDisabled() && CheckRemainInDeck(CardId.BrandedBeast, CardId.BrandedLost) > 0 }, + }; + + foreach (KeyValuePair> pair in checkDict) + { + List targetList = costList.Where(card => card.IsCode(pair.Key)).ToList(); + foreach (ClientCard target in targetList) + { + if (target != null && pair.Value(target)) + { + return target; + } + } + } + return null; + } + + public bool TheBystialLubellionActivate() + { + if (CheckWhetherNegated(true, Card.Location == CardLocation.MonsterZone, CardType.Monster)) return false; + if (Card.Location == CardLocation.Hand) + { + activatedCardIdList.Add(Card.Id); + } else + { + activatedCardIdList.Add(Card.Id + 1); + } + return true; + } + + public bool AlbionTheShroudedDragonActivate() + { + if (CheckWhetherNegated(true, false, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + bool checkFlag = CheckRemainInDeck(CardId.BrandedRetribution, CardId.BrandedOpening, CardId.BrightestBlazingBrandedKing, CardId.BrandedInHighSpirits) > 0; + if (Bot.HasInGraveyard(CardId.BrandedRetribution)) + { + checkFlag |= CheckRemainInDeck(CardId.BrandedFusion, CardId.BrandedBeast, CardId.BrandedInRed, CardId.BrandedInWhite, CardId.BrandedLost) > 0; + } + if (Bot.HasInSpellZone(CardId.BrandedBeast)) + { + checkFlag |= CheckRemainInDeck(CardId.BrandedLost) > 0; + } + if (Card.Location == CardLocation.Grave) + { + checkFlag |= CheckRemainInDeck(CardId.BrandedInWhite) > 0; + } + // for abyss dragon + if (FallenOfAlbazSetCheck() && (summoned || !Bot.HasInHand(new List { CardId.FallenOfAlbaz, CardId.BrandedInHighSpirits }))) + { + checkFlag |= Bot.HasInHand(new List { CardId.BrandedBeast, CardId.BrandedInHighSpirits, CardId.BrandedInWhite, CardId.BrandedInRed, CardId.BrandedLost, CardId.BrandedOpening, CardId.BrandedRetribution, CardId.BrightestBlazingBrandedKing }); + } + + if (checkFlag) + { + activatedCardIdList.Add(Card.Id); + albionTheShroudedDragonSelecting = true; + return true; + } + return false; + } + + public bool BystialSaronirActivate() + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + // banish & spsummon + if (Card.Location == CardLocation.Hand) + { + // banish enemy target + if (Util.GetLastChainCard() != null && Duel.LastChainPlayer == 1) + { + List chainTargetList = Duel.LastChainTargets.Where(c => CheckBystialCanBanish(c)).ToList(); + if (chainTargetList.Count > 0) + { + AI.SelectCard(chainTargetList); + currentDestroyCardList.Add(chainTargetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + List enemyChainList = Duel.CurrentChain.Where(c => c != null && c.Controller == 1 && CheckBystialCanBanish(c) && !currentDestroyCardList.Contains(c)) + .OrderByDescending(c => c.GetDefensePower()).ToList(); + if (enemyChainList.Count > 0) + { + AI.SelectCard(enemyChainList); + currentDestroyCardList.Add(enemyChainList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + + // banish cards with effect + if (!CheckShouldNoMoreSpSummon()) + { + ClientCard mercourier = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.TriBrigadeMercourier)); + if (mercourier != null && !activatedCardIdList.Contains(CardId.TriBrigadeMercourier + 1)) + { + AI.SelectCard(mercourier); + currentDestroyCardList.Add(mercourier); + activatedCardIdList.Add(Card.Id); + return true; + } + ClientCard tragedy = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.DespianTragedy)); + if (tragedy != null && !activatedCardIdList.Contains(CardId.DespianTragedy)) + { + AI.SelectCard(tragedy); + currentDestroyCardList.Add(tragedy); + activatedCardIdList.Add(Card.Id); + return true; + } + if (Bot.HasInGraveyard(CardId.TheBystialLubellion) && !activatedCardIdList.Contains(CardId.TheBystialLubellion) + && Duel.Player == 0 && CheckRemainInDeck(CardId.BrandedLost, CardId.BrandedBeast) > 0 + && CurrentTiming == -1) + { + List targetList = Enemy.Graveyard.Where(c => c != null && CheckBystialCanBanish(c)).OrderByDescending(card => card.Attack).ToList(); + targetList.AddRange(Bot.Graveyard + .Where(c => c != null && CheckBystialCanBanish(c) && !c.IsCode(CardId.TheBystialLubellion) && !CheckWhetherShouldKeepInGrave(c)) + .OrderBy(card => card.Attack).ToList() + ); + if (targetList.Count > 0) + { + AI.SelectCard(targetList); + currentDestroyCardList.Add(targetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + // defense + if (Bot.UnderAttack && Bot.BattlingMonster == null) + { + List targetList = Enemy.Graveyard.Where(c => CheckBystialCanBanish(c)).OrderByDescending(c => c.GetDefensePower()).ToList(); + targetList.AddRange(Bot.Graveyard.Where(c => CheckBystialCanBanish(c)).OrderBy(c => c.GetDefensePower())); + if (targetList.Count > 0) + { + AI.SelectCard(targetList); + currentDestroyCardList.Add(targetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // trigger beast + if (Duel.Player == 1 && (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) + && !activatedCardIdList.Contains(CardId.BrandedBeast) && Bot.SpellZone.Any(c => c != null && c.IsCode(CardId.BrandedBeast) && (c.IsFacedown() || !c.IsDisabled())) + && !Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeBystial))) + { + List dangerList = GetProblematicEnemyCardList(true, false, CardType.Trap); + if (dangerList.Count > 0) + { + List targetList = Enemy.Graveyard.Where(c => CheckBystialCanBanish(c)).OrderByDescending(c => c.GetDefensePower()).ToList(); + targetList.AddRange(Bot.Graveyard.Where(c => CheckBystialCanBanish(c)).OrderBy(c => c.GetDefensePower())); + if (targetList.Count > 0) + { + AI.SelectCard(targetList); + currentDestroyCardList.Add(targetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + } + // send to GY + if (Card.Location == CardLocation.Grave && !CheckWhetherWillbeRemoved()) + { + if (Bot.HasInGraveyard(CardId.BrandedRetribution)) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } else if (CheckRemainInDeck(CardId.TheBystialLubellion, CardId.BrandedRetribution, CardId.BrandedInHighSpirits, CardId.BrightestBlazingBrandedKing, CardId.BrandedOpening) > 0) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + return false; + } + + public bool CheckBystialCanBanish(ClientCard c) + { + return c != null && c.Location == CardLocation.Grave && c.IsMonster() && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark); + } + + public bool AluberTheJesterOfDespiaSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || enemyActivateLockBird || activatedCardIdList.Contains(Card.Id)) return false; + summoned = true; + return true; + } + + public bool AluberTheJesterOfDespiaActivate() + { + // search + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + // spsummon + else + { + List targetCardList = GetMonsterListForTargetNegate(true, CardType.Monster); + ClientCard lastChainCard = Util.GetLastChainCard(); + // chain to protect + if (lastChainCard != null && lastChainCard.Controller == 0) + { + AI.SelectCard(targetCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + AI.SelectCard(targetCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + public bool FallenOfAlbazSummon() + { + if (CheckAlbazFusion(Card)) + { + summoned = true; + return true; + } + return false; + } + + public bool FallenOfAlbazSet() + { + if (FallenOfAlbazSetCheck()) + { + summoned = true; + return true; + } + return false; + } + + public bool FallenOfAlbazSetCheck() + { + if (!Bot.HasInExtra(CardId.AlbaLenatusTheAbyssDragon) || nadirActivated) return false; + // check dangerous dragon + if (!Bot.HasInSpellZone(CardId.BrandedLost, true, true) || Bot.GetHandCount() < 2) + { + foreach (int dangerId in dangerousDragonIdList) + { + if (Enemy.HasInMonstersZone(dangerId, true, false, true)) + { + return true; + } + } + } + // check dragon count + int dragonCount = Enemy.GetMonsters().Where(c => c != null && c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Dragon)).Count(); + if (dragonCount > 1) + { + return true; + } + return false; + } + + /// + /// Check whether should call albaz. + /// + /// + /// + public bool CheckAlbazFusion(ClientCard exceptCost = null) { + return CheckAlbazFusion(exceptCost, out _); + } + + public bool CheckAlbazFusion(ClientCard exceptCost, out List enemyMonsterList) + { + enemyMonsterList = null; + int costHandCount = Bot.Hand.Where(c => c != exceptCost).Count(); + if (costHandCount <= 0 || Enemy.GetMonsterCount() == 0) return false; + if (CheckWhetherNegated(true, true, CardType.Monster) || activatedCardIdList.Contains(CardId.FallenOfAlbaz) || nadirActivated) return false; + if (!Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon) + && Bot.HasInExtra(CardId.MirrorjadeTheIcebladeDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.AlbaLenatusTheAbyssDragon)) + { + List targetList = Enemy.GetMonsters().Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Dragon)) + .OrderByDescending(c => c.GetDefensePower()).ToList(); + if (targetList.Count > 0) + { + enemyMonsterList = targetList; + return true; + } + } + if (Bot.HasInExtra(CardId.AlbionTheBrandedDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.AlbionTheSanctifireDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light) && c.HasRace(CardRace.SpellCaster)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.LubellionTheSearingDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (costHandCount >= 2 && target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.BorreloadFuriousDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.TitanikladTheAshDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.Attack >= 2500) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.RindbrummTheStrikingDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Beast | CardRace.BeastWarrior | CardRace.WindBeast)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + if (Bot.HasInExtra(CardId.SprindTheIrondashDragon)) + { + ClientCard target = Enemy.GetMonsters() + .Where(c => c != null && c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && enemyPlaceThisTurn.Contains(c) && c.IsSpecialSummoned + && c.GetDefensePower() >= Util.GetBestPower(Bot)) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (target != null) + { + enemyMonsterList = new List { target }; + return true; + } + } + + return false; + } + + public bool FallenOfAlbazActivate() + { + if (Bot.HasInExtra(CardId.AlbaLenatusTheAbyssDragon) && Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(dangerousDragonIdList))) return false; + if (CheckAlbazFusion()) + { + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool SpringansKittSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || enemyActivateLockBird || activatedCardIdList.Contains(Card.Id + 1)) return false; + summoned = true; + return true; + } + + public bool SpringansKittActivate() + { + // spsummon + if (Card.Location == CardLocation.Hand) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + if (CheckShouldNoMoreSpSummon()) + { + bool skipFlag = !summoned; + skipFlag |= activatedCardIdList.Contains(CardId.BrandedFusion); + skipFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + if (skipFlag) + { + return false; + } + } + activatedCardIdList.Add(Card.Id); + return true; + } + // search + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool GuidingQuemTheVirtuousSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + if (activatedCardIdList.Contains(Card.Id)) return false; + summoned = true; + return true; + } + + public bool GuidingQuemTheVirtuousSummonForSearch() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + if (activatedCardIdList.Contains(Card.Id)) return false; + if (Bot.HasInGraveyard(CardId.BrandedRetribution) && CheckRemainInDeck(CardId.BrandedFusion, CardId.BrandedLost, CardId.BrandedInWhite, CardId.BrandedInRed) > 0) + { + summoned = true; + return true; + } + if (Bot.HasInGraveyard(new[] { CardId.BrandedFusion, CardId.BrandedLost, CardId.BrandedBeast }) && CheckRemainInDeck(CardId.BrandedRetribution) > 0) + { + summoned = true; + return true; + } + return false; + } + + public bool GuidingQuemTheVirtuousActivate() + { + long desc = -1; + if (ActivateDescription >= Util.GetStringId(CardId.GuidingQuemTheVirtuous, 0)) + { + desc = ActivateDescription - Util.GetStringId(CardId.GuidingQuemTheVirtuous, 0); + } + Logger.DebugWriteLine("Guiding desc: " + desc.ToString()); + Logger.DebugWriteLine("Guiding timing: " + CurrentTiming.ToString()); + Logger.DebugWriteLine("Guiding flag: " + quemSummonFlag.ToString()); + + // spsummon + if ((ActivateDescription == -1 && quemSummonFlag == 0) || ActivateDescription == Util.GetStringId(CardId.GuidingQuemTheVirtuous, 1)) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + List>> checkList = new List>> + { + new KeyValuePair>(CardId.AlbionTheSanctifireDragon, (c) => c.IsCanRevive() && !activatedCardIdList.Contains(CardId.AlbionTheSanctifireDragon) ), + new KeyValuePair>(CardId.MirrorjadeTheIcebladeDragon, (c) => c.IsCanRevive() ), + new KeyValuePair>(CardId.FallenOfAlbaz, (c) => + { + bool albazCanFusionFlag = CheckAlbazFusion(null, out List materialList); + if (albazCanFusionFlag && !Util.ChainContainsCard(new[] {CardId.AlbionTheBrandedDragon, CardId.LubellionTheSearingDragon}) && !spSummoningAlbaz) + { + bool albazFlag = materialList.Count > 1; + if (materialList.Count > 0) + { + ClientCard material = materialList[0]; + albazFlag |= material.HasType(CardType.Ritual | CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + albazFlag |= material.IsFloodgate() || material.IsOneForXyz() || Util.GetWorstBotMonster().GetDefensePower() < material.Attack; + } + return albazFlag; + } + return false; + } ), + new KeyValuePair>(CardId.AlbionTheBrandedDragon, (c) => c.IsCanRevive() && Bot.HasInSpellZone(CardId.BrandedBeast) + && Bot.MonsterZone.Any(oc => oc != null && oc.IsFaceup() && oc.HasSetcode(SetcodeBystial)) ), + new KeyValuePair>(CardId.BlazingCartesiaTheVirtuous, (c) => Duel.Player == 0 || !activatedCardIdList.Contains(CardId.BlazingCartesiaTheVirtuous + 1) ), + new KeyValuePair>(CardId.TriBrigadeMercourier, (c) => Bot.MonsterZone.Any(oc => oc != null && oc.IsFaceup() && oc.IsCode(albazFusionMonster)) ), + new KeyValuePair>(CardId.AlbionTheSanctifireDragon, (c) => c.IsCanRevive() ), + new KeyValuePair>(CardId.SpringansKitt, (c) => true ) + }; + foreach (KeyValuePair> pair in checkList) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsOriginalCode(pair.Key) && pair.Value(c)); + if (target != null) + { + if (target.IsOriginalCode(CardId.FallenOfAlbaz)) + { + spSummoningAlbaz = true; + } + AI.SelectCard(target); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + // send to GY + if ((ActivateDescription == -1 && quemSummonFlag > 0) || ActivateDescription == Util.GetStringId(CardId.GuidingQuemTheVirtuous, 0)) + { + if (CheckWhetherNegated(true, true, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + quemSummonFlag = 0; + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool BlazingCartesiaTheVirtuousSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + bool checkFlag = Bot.HasInHandOrInSpellZone(CardId.BrandedOpening) && !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && CheckRemainInDeck(CardId.AluberTheJesterOfDespia) > 0; + checkFlag |= Bot.HasInHand(CardId.AlbionTheShroudedDragon) && !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon); + checkFlag |= Bot.HasInHandOrHasInMonstersZone(CardId.BystialSaronir) && !activatedCardIdList.Contains(CardId.BystialSaronir + 1); + if (Bot.HasInExtra(CardId.GranguignolTheDuskDragon)) + { + bool hasMaterial = Bot.Hand.Any(c => c != Card && c.Attack < 2000 && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark)); + hasMaterial |= Bot.MonsterZone.Any(c => c != null && !c.IsCode(cannotBeFusionMaterialIdList) && c.Attack < 2000 && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark)); + checkFlag |= hasMaterial; + } + + if (checkFlag) + { + summoned = true; + return true; + } + + return false; + } + + public bool BlazingCartesiaTheVirtuousActivate() + { + // sp summon + if (Card.Location == CardLocation.Hand) + { + if (CheckShouldNoMoreSpSummon() || CheckWhetherNegated(true, true, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + // fusion + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + if (Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(CardId.BrandedInRed))) return false; + List materialList = Bot.MonsterZone.Where(c => c != null && c.Attack <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + // escape target + ClientCard lastCahinCard = Util.GetLastChainCard(); + if (lastCahinCard != null && Duel.LastChainPlayer == 1) + { + List chainTargetList = Duel.LastChainTargets.Where(c => c.Controller == 0 && c.Location == CardLocation.MonsterZone + && (!c.IsCode(cannotBeFusionMaterialIdList) || c.Attack <= 2500)).ToList(); + if (chainTargetList.Count > 0) + { + if (lastCahinCard.IsCode(targetNegateIdList)) + { + chainTargetList = chainTargetList.Where(c => c.Attack <= 2500).ToList(); + } + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, 0, materialList, chainTargetList, + out ClientCard _fusionTarget, out List usedMaterialList); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion1: " + _fusionTarget.Name); + cartesiaMaterialList.AddRange(usedMaterialList.Intersect(chainTargetList)); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + // fusion shrouded + bool skipShroudedFlag = CheckWhetherCanSummon() && !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && Bot.HasInHand(CardId.AluberTheJesterOfDespia); + skipShroudedFlag |= CheckWhetherCanSummon() && !activatedCardIdList.Contains(CardId.SpringansKitt) && Bot.HasInHand(CardId.SpringansKitt); + if (!skipShroudedFlag) + { + ClientCard shrouded = Duel.CurrentChain.FirstOrDefault(c => c.Controller == 0 && c.Location == CardLocation.Hand && c.IsOriginalCode(CardId.AlbionTheShroudedDragon)); + if (shrouded != null) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, 0, materialList, new List { shrouded }, + out ClientCard _fusionTarget, out List usedMaterialList); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion2: " + _fusionTarget.Name); + cartesiaMaterialList.AddRange(usedMaterialList.Intersect(new List { shrouded })); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + bool shouldActivateFlag = Duel.Player == 0 && !CheckShouldNoMoreSpSummon() || Duel.Player == 1; + + // summon mirrorjade + bool checkMirrorJadeFlag = !(Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) || Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true)) + && shouldActivateFlag; + if (checkMirrorJadeFlag) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, CardId.MirrorjadeTheIcebladeDragon, materialList, null, + out ClientCard _fusionTarget, out _); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion3: " + _fusionTarget.Name); + cartesiaSummonGoal = CardId.MirrorjadeTheIcebladeDragon; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + + // summon dusk dragon + if (shouldActivateFlag && Duel.Player == 0) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.BystialSaronir, () => !activatedCardIdList.Contains(CardId.BystialSaronir + 1) && !DefaultCheckWhetherCardIdIsNegated(CardId.BystialSaronir) }, + {CardId.DespianTragedy, () => !activatedCardIdList.Contains(CardId.DespianTragedy) && !DefaultCheckWhetherCardIdIsNegated(CardId.DespianTragedy) } + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard targetMaterial = materialList.FirstOrDefault(c => c.IsCode(pair.Key)); + if (targetMaterial != null && pair.Value()) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, CardId.GranguignolTheDuskDragon, materialList, new List { targetMaterial }, + out ClientCard _fusionTarget, out List usedMaterialList); + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion4: " + _fusionTarget.Name); + cartesiaSummonGoal = CardId.GranguignolTheDuskDragon; + cartesiaMaterialList.Add(targetMaterial); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + } + + // summon sanctifire + if (shouldActivateFlag) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, CardId.AlbionTheSanctifireDragon, materialList, new List { Card}, + out ClientCard _fusionTarget, out List usedMaterialList); + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion5: " + _fusionTarget.Name); + cartesiaSummonGoal = CardId.AlbionTheSanctifireDragon; + cartesiaMaterialList.Add(Card); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + + if (shouldActivateFlag && GetProblematicEnemyMonster(0, true, true, CardType.Monster) != null) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, CardId.BorreloadFuriousDragon, materialList, null, + out ClientCard _fusionTarget, out _); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion6: " + _fusionTarget.Name); + cartesiaSummonGoal = CardId.BorreloadFuriousDragon; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + + if (shouldActivateFlag) + { + bool checkFlag = Duel.Player == 0 && CurrentTiming == -1; + checkFlag |= Duel.Player == 1 && (CurrentTiming & hintTimingMainEnd) != 0; + if (checkFlag) + { + BlazingCartesiaTheVirtuousFusionCheck(Bot.ExtraDeck, 0, materialList, null, + out ClientCard _fusionTarget, out _); + + if (_fusionTarget != null) + { + Logger.DebugWriteLine("cartesia prepare fusion7: " + _fusionTarget.Name); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + } + return false; + } + + public bool BlazingCartesiaTheVirtuousActivateInGrave() + { + // recycle + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 2); + return true; + } + return false; + } + + public void BlazingCartesiaTheVirtuousFusionCheck( + IList canSummonList, int mustSummonId, + List materialList, List mustMaterialList, + out ClientCard fusionTarget, out List selectedFusionMaterialList) + { + fusionTarget = null; + selectedFusionMaterialList = new List(); + + Dictionary>> checkDict = new Dictionary>> + { + {CardId.GranguignolTheDuskDragon, new List>{ + (c) => c.IsCode(CardId.BlazingCartesiaTheVirtuous), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) + } }, + {CardId.AlbionTheSanctifireDragon, new List>{ + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light) && c.HasRace(CardRace.SpellCaster) + } }, + {CardId.MirrorjadeTheIcebladeDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) + } }, + {CardId.AlbionTheBrandedDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light) + } }, + {CardId.LubellionTheSearingDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) + } }, + {CardId.DespianQuaeritis, new List> + { + (c) => c.HasSetcode(SetcodeDespain), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) + } }, + {CardId.BorreloadFuriousDragon, new List> + { + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon) + } } + }; + Dictionary> extraCheckDict = new Dictionary> + { + {CardId.AlbionTheSanctifireDragon, (c1, c2) => + { + int reviveCount = Bot.Graveyard.Count(c => c != null && c.IsMonster() && c.IsCanRevive()); + reviveCount += Enemy.Graveyard.Count(c => c != null && c.IsMonster() && c.IsCanRevive()); + if (!CheckWhetherWillbeRemoved() || + (CurrentTiming & hintTimingMainEnd) > 0 && Util.GetOneEnemyBetterThanValue(Card.GetDefensePower()) != null + && Util.GetOneEnemyBetterThanValue(3000) == null) + { + reviveCount += 2; + } + return reviveCount >= 2; + } }, + {CardId.LubellionTheSearingDragon, (c1, c2) => Bot.Hand.Count(c => c != c1 && c != c2) > 0 }, + {CardId.MirrorjadeTheIcebladeDragon, (c1, c2) => !CheckWhetherWillbeRemoved() && + !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) } + }; + + foreach (KeyValuePair>> pair in checkDict) + { + if (mustSummonId > 0 && mustSummonId != pair.Key) continue; + ClientCard currentFusionTarget = canSummonList.FirstOrDefault(c => c != null && c.IsCode(pair.Key)); + if (currentFusionTarget == null) continue; + Func fusionFunc1 = pair.Value[0]; + Func fusionFunc2 = pair.Value[1]; + + if (mustMaterialList != null && mustMaterialList.Count > 0) + { + foreach (ClientCard mustMaterial in mustMaterialList) + { + if (!fusionFunc1(mustMaterial) && !fusionFunc2(mustMaterial)) continue; + foreach (ClientCard anotherMaterial in materialList) + { + if (anotherMaterial == mustMaterial) continue; + bool checkFlag = fusionFunc1(mustMaterial) && fusionFunc2(anotherMaterial); + checkFlag |= fusionFunc2(mustMaterial) && fusionFunc1(anotherMaterial); + extraCheckDict.TryGetValue(pair.Key, out Func extraCheckFunc); + checkFlag &= (extraCheckFunc == null || extraCheckFunc(mustMaterial, anotherMaterial)); + if (checkFlag) + { + fusionTarget = currentFusionTarget; + selectedFusionMaterialList.Add(mustMaterial); + selectedFusionMaterialList.Add(anotherMaterial); + return; + } + } + } + } + else + { + for (int index1 = 0; index1 < materialList.Count - 1; ++index1) + { + ClientCard material1 = materialList[index1]; + if (!fusionFunc1(material1) && !fusionFunc2(material1)) continue; + for (int index2 = index1 + 1; index2 < materialList.Count; ++index2) + { + ClientCard material2 = materialList[index2]; + bool checkFlag = fusionFunc1(material1) && fusionFunc2(material2); + checkFlag |= fusionFunc2(material1) && fusionFunc1(material2); + extraCheckDict.TryGetValue(pair.Key, out Func extraCheckFunc); + checkFlag &= (extraCheckFunc == null || extraCheckFunc(material1, material2)); + if (checkFlag) + { + fusionTarget = currentFusionTarget; + selectedFusionMaterial.Add(material1); + selectedFusionMaterial.Add(material2); + return; + } + } + } + } + } + } + + public bool TriBrigadeMercourierActivate() + { + // negate + if (Card.Location == CardLocation.Hand || Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, false, CardType.Monster) || !CheckLastChainShouldNegated()) return false; + if (Util.GetLastChainCard().Location == CardLocation.MonsterZone) currentNegateCardList.Add(Util.GetLastChainCard()); + activatedCardIdList.Add(Card.Id); + return true; + } + // search + if (Card.Location == CardLocation.Removed) + { + return false; + } + return false; + } + + public bool TriBrigadeMercourierActivateForSearch() + { + // negate + if (Card.Location == CardLocation.Hand || Card.Location == CardLocation.MonsterZone) + { + return false; + } + // search + if (Card.Location == CardLocation.Removed) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + return false; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC)) return false; + if (DefaultAshBlossomAndJoyousSpring()) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard.Location == CardLocation.MonsterZone || lastChainCard.Location == CardLocation.SpellZone) currentNegateCardList.Add(Util.GetLastChainCard()); + return true; + } + return false; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool DespianTragedyActivate() + { + // search + if (ActivateDescription != Util.GetStringId(Card.Id, 1)) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + // set + else { + if (CheckWhetherNegated(true, false, CardType.Trap)) return false; + Dictionary> checkDict = new Dictionary>{ + {CardId.BrandedFusion, () => BrandedFusionActivateCheck()}, + {CardId.BrandedLost, () => { + if (Duel.Player == 0 && Duel.Phase >= DuelPhase.End) return false; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) && BrandedFusionActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null) return true; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion()) return true; + if ((Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) || (!summoned && Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous)))) return true; + return false; + } }, + {CardId.BrandedInHighSpirits, BrandedInHighSpiritsActivateCheck}, + {CardId.BrandedInRed, () => BrandedInRedActivateCheck() != null }, + {CardId.BrandedInWhite, BrandedInWhiteActivateCheck }, + {CardId.BrightestBlazingBrandedKing, () => Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedOpening, () => Bot.Hand.Count > 2 && !activatedCardIdList.Contains(CardId.BrandedOpening) } + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + activatedCardIdList.Add(Card.Id); + AI.SelectCard(target); + SelectSTPlace(target, true); + return true; + } + } + } + return false; + } + + public bool DespianTragedySet() + { + if (Bot.Graveyard.Any(c => c != null && c.HasType(CardType.Spell | CardType.Trap) && c.HasSetcode(SetcodeBranded))) + { + summoned = true; + return true; + } + + return false; + } + + public bool NadirServantActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell) || CheckWhetherWillbeRemoved()) return false; + bool checkResult = NadirServantActivateCheck(null, false, out _); + if (checkResult) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool NadirServantActivateCheck(IList cards, bool force, out ClientCard target) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.AlbionTheBrandedDragon, () => !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) }, + {CardId.DespianLuluwalilith, () => CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous, CardId.GuidingQuemTheVirtuous) > 0 }, + {CardId.TitanikladTheAshDragon, () => CheckRemainInDeck(CardId.GuidingQuemTheVirtuous) > 0 }, + {CardId.SprindTheIrondashDragon, () => CheckRemainInDeck(CardId.SpringansKitt) > 0 }, + {CardId.RindbrummTheStrikingDragon, () => Bot.Graveyard.Any(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)) }, + {CardId.AlbaLenatusTheAbyssDragon, () => force && CheckRemainInDeck(CardId.FusionDeployment, CardId.BrandedFusion) > 0 }, + {CardId.GranguignolTheDuskDragon, () => force}, + }; + + foreach (KeyValuePair> pair in checkDict) + { + if (cards == null) + { + if (Bot.HasInExtra(pair.Key) && pair.Value()) + { + target = null; + return true; + } + } else + { + ClientCard tg = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (tg != null && pair.Value()) + { + target = tg; + return true; + } + } + } + + target = null; + return false; + } + + public bool FusionDeploymentActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + if (FusionDeploymentSpSummonTarget() > 0 && !Bot.HasInHand(CardId.BrandedLost)) + { + SelectSTPlace(Card, true); + return true; + } + + return false; + } + + public int FusionDeploymentSpSummonTarget() + { + if (CheckRemainInDeck(CardId.FallenOfAlbaz) > 0 && CheckAlbazFusion(Card) && GetProblematicEnemyMonster(0, false, false, CardType.Monster) != null) + { + return CardId.FallenOfAlbaz; + } + if (CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous) > 0 && Bot.HasInExtra(CardId.GranguignolTheDuskDragon)) + { + if (Bot.Hand.Any(c => c.IsMonster() && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark)) + || Bot.GetMonsters().Any(c => c.IsMonster() && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) && !c.IsCode(cannotBeFusionMaterialIdList))) + { + return CardId.BlazingCartesiaTheVirtuous; + } + } + if (CheckRemainInDeck(CardId.FallenOfAlbaz) > 0 && CheckAlbazFusion(Card)) + { + return CardId.FallenOfAlbaz; + } + return 0; + } + + public bool BrandedInWhiteActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Spell)) return false; + activatedCardIdList.Add(Card.Id + 1); + SelectSTPlace(Card); + return true; + } else + { + if (_BrandedInWhiteActivateCheck(true)) + { + activatedCardIdList.Add(Card.Id); + SelectSTPlace(Card, true); + return true; + } + } + return false; + } + + public bool BrandedInWhiteActivateCheck() + { + return _BrandedInWhiteActivateCheck(false); + } + + public bool _BrandedInWhiteActivateCheck(bool activate = false) + { + if (CheckWhetherNegated(true, true, CardType.Spell) || activatedCardIdList.Contains(CardId.BrandedInWhite) || nadirActivated) return false; + if (CheckShouldNoMoreSpSummon() && Bot.MonsterZone.Any(c => c != null && c.GetDefensePower() >= 2000)) return false; + if (BrandedInWhiteFusionTarget(Bot.ExtraDeck, out ClientCard _fusionTarget) > 0) + { + if (activate) Logger.DebugWriteLine("White prepare fusion: " + _fusionTarget?.Name); + return true; + } + + return false; + } + + public int BrandedInWhiteFusionTarget(IList cards, out ClientCard target) + { + target = null; + Dictionary> checkDict = new Dictionary> + { + {CardId.MirrorjadeTheIcebladeDragon, () => { + if (Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) || Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true)) return false; + bool albazFlag = Bot.Graveyard.Any(c => c.IsCode(CardId.FallenOfAlbaz)); + albazFlag |= Bot.MonsterZone.Any(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)); + albazFlag |= Bot.Hand.Any(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (!albazFlag) return false; + + bool checkFlag = Bot.Graveyard.Any(c => c != null && !sendToGYThisTurn.Contains(c) && !c.IsCode(cannotBeFusionMaterialIdList) + && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + checkFlag |= Bot.MonsterZone.Any(c => c != null && !c.IsCode(cannotBeFusionMaterialIdList) + && (c.IsCode(albazFusionMonster) || c.IsCode(CardId.GranguignolTheDuskDragon))); + return checkFlag; + } }, + {CardId.BorreloadFuriousDragon, () => { + if (Enemy.GetMonsterCount() + Enemy.GetSpellCount() > 0) + { + List darkDragonList = Bot.Hand.Where(c => c != null && c.IsMonster() && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon)).ToList(); + darkDragonList.AddRange(Bot.MonsterZone.Where(c => c != null && c.IsMonster() && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon) && !c.IsCode(cannotBeFusionMaterialIdList)).ToList()); + List graveDarkDragonList = Bot.Graveyard.Where(c => c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) + && !c.IsCode(cannotBeFusionMaterialIdList) && !CheckWhetherShouldKeepInGrave(c) ).ToList(); + + bool hasAlbaz = darkDragonList.Any(c => c.IsCode(CardId.FallenOfAlbaz)) || graveDarkDragonList.Any(c => c.IsCode(CardId.FallenOfAlbaz)); + int darkDragonCount = darkDragonList.Count; + if (hasAlbaz) + { + darkDragonCount += graveDarkDragonList.Count; + } + return darkDragonCount >= 2; + } + return false; + } }, + {CardId.GuardianChimera, () => + { + if (CheckWhetherNegated(true, true, CardType.Monster) || DefaultCheckWhetherCardIdIsNegated(CardId.GuardianChimera)) return false; + int enemyCardCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (enemyCardCount == 0) return false; + + return ChimeraFusionMaterialList().Count > 0; + } }, + {CardId.LubellionTheSearingDragon, () => + { + if (activatedCardIdList.Contains(CardId.LubellionTheSearingDragon) + || DefaultCheckWhetherCardIdIsNegated(CardId.LubellionTheSearingDragon) + || CheckWhetherNegated(true, true, CardType.Monster)) + { + return false; + } + List checkMaterialList = new List(Bot.Graveyard.Where(c => c != null && c.IsMonster()).OrderBy(c => c.GetDefensePower())).ToList(); + checkMaterialList.AddRange(Bot.GetMonsters().OrderBy(c => c.GetDefensePower())); + checkMaterialList.AddRange(Bot.Hand); + ClientCard albaz = checkMaterialList.Where(c => c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + ClientCard darkMonster = checkMaterialList.Where(c => c != albaz && c.HasAttribute(CardAttribute.Dark)).FirstOrDefault(); + if (albaz == null || darkMonster == null) return false; + if (Bot.Hand.Count(c => c != albaz && c != darkMonster && !c.IsCode(CardId.BrandedInWhite)) == 0) return false; + + return true; + } }, + {CardId.AlbionTheSanctifireDragon, () => + { + List checkMaterialList = new List(Bot.Graveyard.Where(c => c != null && c.IsMonster()).OrderBy(c => c.GetDefensePower())).ToList(); + checkMaterialList.AddRange(Bot.GetMonsters().OrderBy(c => c.GetDefensePower())); + checkMaterialList.AddRange(Bot.Hand); + ClientCard albaz = checkMaterialList.FirstOrDefault(c => c.IsCode(CardId.FallenOfAlbaz)); + ClientCard lightSpellcaster = checkMaterialList.FirstOrDefault(c => c.HasRace(CardRace.SpellCaster) && c.HasAttribute(CardAttribute.Light)); + if (albaz == null || lightSpellcaster == null) return false; + + int remainMonsterCount = Enemy.GetGraveyardMonsters().Count; + remainMonsterCount += Bot.Graveyard.Where(c => c.IsMonster() && c != albaz && c != lightSpellcaster).Count(); + remainMonsterCount += Bot.HasInHand(_CardId.MaxxC) ? 1 : 0; + return remainMonsterCount >= 2; + } }, + {CardId.RindbrummTheStrikingDragon, () => { + if (!Bot.HasInGraveyard(CardId.TriBrigadeMercourier)) return false; + bool albazCheck = Bot.HasInHandOrHasInMonstersZone(CardId.FallenOfAlbaz); + albazCheck |= Bot.HasInGraveyard(CardId.FallenOfAlbaz); + return albazCheck; + } }, + {CardId.DespianQuaeritis, () => + { + bool checkFlag = Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.Attack >= 2500 && !(c.HasType(CardType.Fusion) && c.Level >= 8)); + if (checkFlag) + { + ClientCard despianInGrave = Bot.Graveyard.Where(c => c != null && c.HasSetcode(SetcodeDespain) && !CheckWhetherShouldKeepInGrave(c)) + .OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (despianInGrave != null) + { + bool albazCheck = Bot.HasInHandOrHasInMonstersZone(CardId.FallenOfAlbaz); + albazCheck |= Bot.HasInGraveyard(CardId.FallenOfAlbaz); + return albazCheck; + } + List fusionMaterialList = Bot.Hand.Where(c => c.IsMonster()).OrderBy(c => c.GetDefensePower()).ToList(); + fusionMaterialList.AddRange(Bot.MonsterZone.Where(c => c != null && !c.IsCode(cannotBeFusionMaterialIdList)).OrderBy(c => c.GetDefensePower()).ToList()); + ClientCard despian = fusionMaterialList.FirstOrDefault(c => c.HasSetcode(SetcodeDespain)); + if (despian != null) + { + checkFlag = fusionMaterialList.Any(c => c != despian && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark)); + checkFlag |= Bot.HasInGraveyard(CardId.FallenOfAlbaz); + return checkFlag; + } + } + + return false; + } }, + {CardId.TitanikladTheAshDragon, () => + { + List checkMaterialList = new List(Bot.Graveyard.Where(c => c != null && c.IsMonster()).OrderBy(c => c.GetDefensePower())).ToList(); + checkMaterialList.AddRange(Bot.GetMonsters().OrderBy(c => c.GetDefensePower())); + checkMaterialList.AddRange(Bot.Hand); + ClientCard albaz = checkMaterialList.Where(c => c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + + foreach (ClientCard material in checkMaterialList) + { + if (material != albaz && material.IsMonster() && material.Attack >= 2500 && !material.IsCode(cannotBeFusionMaterialIdList) && !Util.IsTurn1OrMain2()) + { + bool checkFlag = Enemy.GetMonsterCount() == 0 && !CheckWhetherShouldKeepInGrave(material) && (material.IsFacedown() || material.Location != CardLocation.MonsterZone); + + int expectedAttack = 2900 + material.Level * 100; + int botBestPower = Util.GetBestPower(Bot); + int beforeBetterCount = Enemy.MonsterZone.Count(c => c != null && c.GetDefensePower() >= botBestPower); + int afterBetterCount = Enemy.MonsterZone.Count(c => c != null && c.GetDefensePower() >= expectedAttack); + checkFlag |= afterBetterCount < beforeBetterCount; + + return checkFlag; + } + } + return false; + } }, + {CardId.AlbaLenatusTheAbyssDragon, () => + { + if (Util.GetOneEnemyBetterThanMyBest() == null && Duel.MainPhase.CanBattlePhase) + { + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (albaz == null) + { + albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz)); + } + if (albaz == null) return false; + foreach (ClientCard material in Bot.Graveyard) + { + if (material != null && material != albaz && material.IsMonster() && material.HasRace(CardRace.Dragon) && !material.IsCode(cannotBeFusionMaterialIdList)) + { + return true; + } + } + } + return false; + } } + }; + + foreach (KeyValuePair> pair in checkDict) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return pair.Key; + } + } + + target = null; + return 0; + } + + public List ChimeraFusionMaterialList(bool dragonCheck = true) + { + int enemyCardCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + + List fieldMonsterList = Bot.MonsterZone.Where(c => c != null && c.GetDefensePower() <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)) + .OrderBy(c => c.GetDefensePower()).ToList(); + List handMonsterList = Bot.Hand.Where(c => c.IsMonster()) + .OrderBy(c => c.GetDefensePower()).ToList(); + // 2 monsters on field + 1 monster in hand + if (enemyCardCount >= 2 && fieldMonsterList.Count >= 2) + { + if (fieldMonsterList.Count < 2 || handMonsterList.Count < 1) return new List() ; + foreach (ClientCard handMonster in handMonsterList) + { + for (int fieldIndex1 = 0; fieldIndex1 < fieldMonsterList.Count - 1; ++fieldIndex1) + { + ClientCard fieldMonster1 = fieldMonsterList[fieldIndex1]; + if (fieldMonster1.IsCode(handMonster.Id) || handMonster.IsCode(fieldMonster1.Id)) continue; + for (int fieldIndex2 = fieldIndex1 + 1; fieldIndex2 < fieldMonsterList.Count; ++fieldIndex2) + { + ClientCard fieldMonster2 = fieldMonsterList[fieldIndex2]; + if (fieldMonster2.IsCode(handMonster.Id) || handMonster.IsCode(fieldMonster2.Id)) continue; + if (fieldMonster2.IsCode(fieldMonster1.Id) || fieldMonster1.IsCode(fieldMonster2.Id)) continue; + + List materialList = new List { handMonster, fieldMonster1, fieldMonster2 }; + bool checkFlag = dragonCheck && materialList.Any(c => c.HasRace(CardRace.Dragon)); + if (checkFlag) + { + return materialList; + } + } + } + } + } + // 1 monster on field + 2 monsters in hand + if (enemyCardCount == 1 || fieldMonsterList.Count == 1) + { + if (fieldMonsterList.Count < 1 || handMonsterList.Count < 2) return new List(); + foreach (ClientCard fieldMonster in fieldMonsterList) + { + for (int handIndex1 = 0; handIndex1 < handMonsterList.Count - 1; ++handIndex1) + { + ClientCard handMonster1 = handMonsterList[handIndex1]; + if (handMonster1.IsCode(fieldMonster.Id) || fieldMonster.IsCode(handMonster1.Id)) continue; + for (int handIndex2 = handIndex1 + 1; handIndex2 < handMonsterList.Count; ++handIndex2) + { + ClientCard handMonster2 = handMonsterList[handIndex2]; + if (handMonster2.IsCode(fieldMonster.Id) || fieldMonster.IsCode(handMonster2.Id)) continue; + if (handMonster2.IsCode(handMonster1.Id) || handMonster1.IsCode(handMonster2.Id)) continue; + + List materialList = new List { fieldMonster, handMonster1, handMonster2 }; + bool checkFlag = dragonCheck && materialList.Any(c => c.HasRace(CardRace.Dragon)); + if (checkFlag) + { + return materialList; + } + } + } + } + } + + return new List(); + } + + public bool BrandedFusionActivate() + { + if (BrandedFusionActivateCheck()) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool BrandedFusionActivateCheck(bool endPhaseCheck = true) + { + if (CheckWhetherNegated(true, true, CardType.Spell) || activatedCardIdList.Contains(CardId.BrandedFusion)) return false; + if (!Bot.HasInHandOrHasInMonstersZone(CardId.FallenOfAlbaz) && CheckRemainInDeck(CardId.FallenOfAlbaz) == 0) return false; + if (endPhaseCheck && Duel.Phase >= DuelPhase.End) return false; + return true; + } + + public bool GoldSarcophagusActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + if (GoldSarcophagusTarget(null, out _) > 0) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public int GoldSarcophagusTarget(IList cards, out ClientCard target) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.DespianTragedy, () => !activatedCardIdList.Contains(CardId.DespianTragedy) && !DefaultCheckWhetherCardIdIsNegated(CardId.DespianTragedy) }, + {CardId.TriBrigadeMercourier, () => !activatedCardIdList.Contains(CardId.TriBrigadeMercourier + 1) && !DefaultCheckWhetherCardIdIsNegated(CardId.TriBrigadeMercourier) } + }; + foreach (KeyValuePair> pair in checkDict) + { + int cardId = pair.Key; + if (pair.Value()) + { + if (cards != null) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return cardId; + } + } + else if (CheckRemainInDeck(cardId) > 0) + { + target = null; + return cardId; + } + } + } + + target = null; + return 0; + } + + public bool FoolishBurialActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell) || CheckWhetherWillbeRemoved()) return false; + if (FoolishBurialTarget(null, out _) > 0) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public int FoolishBurialTarget(IList cards, out ClientCard target) + { + // tragedy + if (!activatedCardIdList.Contains(CardId.DespianTragedy) && !DefaultCheckWhetherCardIdIsNegated(CardId.DespianTragedy)) + { + if (cards != null) + { + target = cards.FirstOrDefault(c => c.IsCode(CardId.DespianTragedy)); + if (target != null) + { + return CardId.DespianTragedy; + } + } else + { + if (CheckRemainInDeck(CardId.DespianTragedy) > 0) + { + target = null; + return CardId.DespianTragedy; + } + } + } + + // send to GY check + bool sendToGYFlag = CheckRemainInDeck(CardId.BrandedRetribution) > 0; + sendToGYFlag |= Bot.HasInGraveyard(CardId.BrandedRetribution) && CheckRemainInDeck(CardId.BrandedFusion) > 0; + if (sendToGYFlag) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.BystialSaronir, () => !activatedCardIdList.Contains(CardId.BystialSaronir + 1) && !DefaultCheckWhetherCardIdIsNegated(CardId.BystialSaronir) }, + {CardId.AlbionTheShroudedDragon, () => !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon) && !DefaultCheckWhetherCardIdIsNegated(CardId.AlbionTheShroudedDragon) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + int cardId = pair.Key; + if (pair.Value()) + { + if (cards != null) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return cardId; + } + } else if (CheckRemainInDeck(cardId) > 0) + { + target = null; + return cardId; + } + } + } + } + + // albaz + if (!Bot.HasInGraveyard(CardId.FallenOfAlbaz)) + { + bool albazCheckFlag = Bot.HasInHand(new List { CardId.BrandedInRed, CardId.BrandedInWhite }); + albazCheckFlag |= Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous) && Bot.MonsterZone.Count(c => c != null && c.Sequence < 5) < 5; + if (albazCheckFlag) + { + int albazCountCheck = Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) ? 2 : 1; + if (cards != null) + { + List albazList = cards.Where(c => c.IsCode(CardId.FallenOfAlbaz)).ToList(); + if (albazList.Count >= albazCountCheck) + { + target = albazList.First(); + return CardId.FallenOfAlbaz; + } + } else + { + if (CheckRemainInDeck(CardId.FallenOfAlbaz) >= albazCountCheck) + { + target = null; + return CardId.FallenOfAlbaz; + } + } + } + } + + target = null; + return 0; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + // negate + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentDestroyCardList.Add(graveTarget); + return true; + } + } + + // banish target + foreach (ClientCard graveCard in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(graveCard) && graveCard.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = graveCard.Id; + AI.SelectCard(graveCard); + currentDestroyCardList.Add(graveCard); + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentDestroyCardList.Add(enemyMonsters[0]); + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count > 0) + { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentDestroyCardList.Add(targets[0]); + return true; + } + + return false; + } + + public bool BrandedInHighSpiritsActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Spell)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } else + { + if (BrandedInHighSpiritsActivateCheck()) + { + activatedCardIdList.Add(Card.Id); + SelectSTPlace(Card, true); + return true; + } + } + return false; + } + + public bool BrandedInHighSpiritsActivateCheck() + { + bool lubellionCheck = Bot.HasInHand(CardId.TheBystialLubellion) && CheckRemainInDeck(CardId.BystialSaronir) > 0 && !activatedCardIdList.Contains(CardId.TheBystialLubellion) + && Duel.Player == 0 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && !CheckWhetherWillbeRemoved(); + + if (CheckWhetherNegated(true, true, CardType.Spell) || activatedCardIdList.Contains(CardId.BrandedInHighSpirits) || CheckWhetherWillbeRemoved()) return false; + Dictionary> checkDict = new Dictionary> + { + {CardId.AlbionTheBrandedDragon, () => !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) && !lubellionCheck + && Bot.Hand.Any(c => BrandedInHighSpiritDiscardDragonCheck(c) ) }, + {CardId.TitanikladTheAshDragon, () => !sendToGYThisTurn.Any(c => c.IsCode(CardId.TitanikladTheAshDragon)) && !lubellionCheck + && Bot.Hand.Any(c => BrandedInHighSpiritDiscardDragonCheck(c) ) + && CheckRemainInDeck(CardId.GuidingQuemTheVirtuous, CardId.FallenOfAlbaz) > 0}, + {CardId.GranguignolTheDuskDragon, () => Bot.Hand.Any(c => c.HasRace(CardRace.SpellCaster) && !(CheckWhetherCanSummon() && c.IsOriginalCode(CardId.GuidingQuemTheVirtuous))) }, + {CardId.RindbrummTheStrikingDragon, () => Bot.Hand.Any(c => c.HasRace(CardRace.WindBeast) + && (!c.IsCode(CardId.TriBrigadeMercourier) || !Bot.MonsterZone.Any(c2 => c2 != null && c2.IsFaceup() && c2.IsCode(albazFusionMonster)))) } + }; + + foreach (KeyValuePair> pair in checkDict) + { + if (Bot.HasInExtra(pair.Key) && pair.Value()) + { + return true; + } + } + return false; + } + + public bool BrandedInHighSpiritDiscardDragonCheck(ClientCard card) + { + if (!card.HasRace(CardRace.Dragon)) return false; + if (Duel.Player == 0 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2)) + { + if (card.IsOriginalCode(CardId.AlbionTheShroudedDragon) && !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon)) return false; + if (card.IsOriginalCode(CardId.TheBystialLubellion) && !activatedCardIdList.Contains(CardId.TheBystialLubellion) && CheckRemainInDeck(CardId.BystialSaronir) > 0) return false; + } + + return true; + } + + public bool BrandedOpeningActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + if (Duel.Player == 0) + { + if (Bot.HasInHand(CardId.AlbionTheShroudedDragon) && !CheckWhetherWillbeRemoved() && !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon)) return false; + bool canCallCartesia = Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous) && !summoned; + canCallCartesia |= !activatedCardIdList.Contains(CardId.FusionDeployment) && Bot.HasInHandOrInSpellZone(CardId.FusionDeployment) + && !CheckShouldNoMoreSpSummon() && Bot.HasInExtra(CardId.GranguignolTheDuskDragon) && CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous) > 0; + if (canCallCartesia) return false; + } + bool goal = CheckRemainInDeck(CardId.AluberTheJesterOfDespia) > 0 && !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && !enemyActivateLockBird; + goal |= CheckRemainInDeck(CardId.GuidingQuemTheVirtuous) > 0; + if (goal) + { + SelectSTPlace(Card, true); + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + // negate + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + return true; + } + } + return false; + } + + public bool BrandedInRedActivate() + { + ClientCard targetCard = BrandedInRedActivateCheck(true); + if (targetCard != null) + { + AI.SelectCard(targetCard); + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public ClientCard BrandedInRedActivateCheck(bool updateMaterialList = false) + { + if (CheckWhetherNegated(true, true, CardType.Spell) || activatedCardIdList.Contains(CardId.BrandedInRed)) return null; + if (Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(CardId.BlazingCartesiaTheVirtuous))) return null; + if (Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(CardId.AlbionTheBrandedDragon)) + && !Util.ChainContainPlayer(1)) return null; + if (nadirActivated) return null; + + List materialList = Bot.MonsterZone.Where(c => c != null && c.Attack <= 2500 && !c.IsCode(cannotBeFusionMaterialIdList)).ToList(); + materialList.AddRange(Bot.Hand.Where(c => c.IsMonster() + && !(CheckWhetherCanSummon() && + ((!activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) && c.IsCode(CardId.AluberTheJesterOfDespia)) + || (!activatedCardIdList.Contains(CardId.SpringansKitt) && c.IsCode(CardId.SpringansKitt))) + ) + ) + ); + + List graveTargetList = Bot.Graveyard.Where(c => c != null && c.IsMonster() && !c.HasType(CardType.Fusion | CardType.Synchro) + && (c.IsCode(CardId.FallenOfAlbaz) || c.HasSetcode(SetcodeDespain))).ToList(); + + // select targeted monster + if (Duel.LastChainPlayer == 1) + { + // escape grave monster + List targetedList = Duel.LastChainTargets.Where(c => c != null && c.Location == CardLocation.Grave && c.Controller == 0 + && !c.HasType(CardType.Fusion | CardType.Synchro) && (c.IsCode(CardId.FallenOfAlbaz) || c.HasSetcode(SetcodeDespain))).ToList(); + + if (targetedList.Count > 0) + { + foreach (ClientCard target in targetedList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, 0, newMaterialList, new List { target }, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + if (updateMaterialList) Logger.DebugWriteLine("Red prepare fusion 1: " + _fusionTarget.Name); + return target; + } + } + } + + // escape target + ClientCard lastCahinCard = Util.GetLastChainCard(); + if (lastCahinCard != null) + { + List chainTargetList = Duel.LastChainTargets.Where(c => c.Controller == 0 && c.Location == CardLocation.MonsterZone + && (!c.IsCode(cannotBeFusionMaterialIdList) || c.Attack <= 2500)).ToList(); + if (chainTargetList.Count > 0) + { + if (lastCahinCard.IsCode(targetNegateIdList)) + { + chainTargetList = chainTargetList.Where(c => c.Attack <= 2500 && !c.IsCode(CardId.AlbionTheBrandedDragon)).ToList(); + } + + foreach (ClientCard target in graveTargetList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, 0, newMaterialList, chainTargetList, + out ClientCard _fusionTarget, out List usedMaterialList); + + if (_fusionTarget != null) + { + if (updateMaterialList) + { + Logger.DebugWriteLine("Red prepare fusion 2: " + _fusionTarget.Name); + brandedInRedMaterialList.AddRange(usedMaterialList.Intersect(chainTargetList)); + } + return target; + } + } + } + } + } + + bool shouldSummonFirst = Duel.Player == 0 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && !summoned + && (Bot.HasInHand(new int[] { CardId.AluberTheJesterOfDespia, CardId.GuidingQuemTheVirtuous, CardId.SpringansKitt }) + || Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion(Card)); + bool idleFlag = Duel.Player == 1 || CurrentTiming == -1; + + if (shouldSummonFirst || !idleFlag) return null; + + // for fusion searing dragon + if (!Bot.MonsterZone.Any(c => c != null && c.HasType(CardType.Fusion)) && Duel.LastChainPlayer != 0 + && !CheckWhetherNegated(true, true, CardType.Monster) && !activatedCardIdList.Contains(CardId.LubellionTheSearingDragon)) + { + foreach (ClientCard target in graveTargetList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, CardId.LubellionTheSearingDragon, newMaterialList, new List { target }, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + return target; + } + } + } + + // remove cards + List problemCardList = GetProblematicEnemyCardList(false, false, CardType.Monster); + if (problemCardList.Count > 0 || (Duel.Phase == DuelPhase.End && Duel.Player == 1)) + { + if (!enemyActivateLockBird) + { + foreach (ClientCard target in graveTargetList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, CardId.GuardianChimera, newMaterialList, new List { target }, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + if (updateMaterialList) Logger.DebugWriteLine("Red prepare fusion 3: " + _fusionTarget.Name); + return target; + } + } + } + + foreach (ClientCard target in graveTargetList) + { + List newMaterialList = new List(materialList) { target }; + BrandedInRedFusionCheck(Bot.ExtraDeck, CardId.BorreloadFuriousDragon, newMaterialList, new List { target }, out ClientCard _fusionTarget, out _); + if (_fusionTarget != null) + { + if (updateMaterialList) Logger.DebugWriteLine("Red prepare fusion 4: " + _fusionTarget.Name); + return target; + } + } + } + + return null; + } + + public void BrandedInRedFusionCheck( + IList canSummonList, int mustSummonId, + List materialList, List mustMaterialList, + out ClientCard fusionTarget, out List selectedFusionMaterialList) + { + fusionTarget = null; + selectedFusionMaterialList = new List(); + + // fusion id + // material condition + // extra check function + // search material function + List>, + Func, bool>, + Func, List, List>, Func, bool>, List> + >> checkTupleList = new List>, Func, bool>, + Func, List, List>, Func, bool>, List> + >> + { + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.MirrorjadeTheIcebladeDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) + }, + (l) => !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true), + BrandedInRedUsing2SubFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.LubellionTheSearingDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) + }, + (l) => !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) + && Bot.Hand.Count(c => !l.Contains(c)) > 0 && !activatedCardIdList.Contains(CardId.LubellionTheSearingDragon), + BrandedInRedUsing2SubFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.GuardianChimera, + null, + null, + BrandedInRedForChimeraFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.DespianQuaeritis, new List> + { + (c) => c.HasSetcode(SetcodeDespain), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) + }, + null, + BrandedInRedUsing2SubFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.BorreloadFuriousDragon, new List> + { + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Dark) && c.HasRace(CardRace.Dragon) + }, + null, + BrandedInRedUsing2SubFunc + ), + new Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>>( + CardId.AlbionTheSanctifireDragon, new List> + { + (c) => c.IsCode(CardId.FallenOfAlbaz), + (c) => !c.IsCode(cannotBeFusionMaterialIdList) && c.HasAttribute(CardAttribute.Light) && c.HasRace(CardRace.SpellCaster) + }, + (l) => Enemy.Graveyard.Count(c => c != null && c.IsMonster() && c.IsCanRevive()) + + Bot.Graveyard.Count(c => c != null && !l.Contains(c)) >= 2, + BrandedInRedUsing2SubFunc + ), + }; + + foreach (Tuple>, Func, bool>, + Func, List, List>, Func, bool>, List>> tuple in checkTupleList) + { + if (mustSummonId > 0 && mustSummonId != tuple.Item1) continue; + ClientCard currentFusionTarget = canSummonList.FirstOrDefault(c => c != null && c.IsCode(tuple.Item1)); + if (currentFusionTarget == null) continue; + Func, List, List>, Func, bool>, List> materialFunc = tuple.Item4; + + List currentMaterialList = materialFunc(materialList, mustMaterialList, tuple.Item2, tuple.Item3); + if (currentMaterialList.Count > 0) + { + fusionTarget = currentFusionTarget; + selectedFusionMaterialList = currentMaterialList; + return; + } + } + } + + public List BrandedInRedUsing2SubFunc(List materialList, List mustMaterialList, + List> checkFuncList, Func, bool> extraCheckFunc) + { + List selectedFusionMaterialList = new List(); + + Func fusionFunc1 = checkFuncList[0]; + Func fusionFunc2 = checkFuncList[1]; + + if (mustMaterialList != null && mustMaterialList.Count > 0) + { + foreach (ClientCard mustMaterial in mustMaterialList) + { + if (!fusionFunc1(mustMaterial) && !fusionFunc2(mustMaterial)) continue; + foreach (ClientCard anotherMaterial in materialList) + { + if (anotherMaterial == mustMaterial) continue; + bool checkFlag = fusionFunc1(mustMaterial) && fusionFunc2(anotherMaterial); + checkFlag |= fusionFunc2(mustMaterial) && fusionFunc1(anotherMaterial); + checkFlag &= (extraCheckFunc == null || extraCheckFunc(new List { mustMaterial, anotherMaterial })); + if (checkFlag) + { + selectedFusionMaterialList.Add(mustMaterial); + selectedFusionMaterialList.Add(anotherMaterial); + return selectedFusionMaterialList; + } + } + } + } + else + { + for (int index1 = 0; index1 < materialList.Count - 1; ++index1) + { + ClientCard material1 = materialList[index1]; + if (!fusionFunc1(material1) && !fusionFunc2(material1)) continue; + for (int index2 = index1 + 1; index2 < materialList.Count; ++index2) + { + ClientCard material2 = materialList[index2]; + bool checkFlag = fusionFunc1(material1) && fusionFunc2(material2); + checkFlag |= fusionFunc2(material1) && fusionFunc1(material2); + checkFlag &= (extraCheckFunc == null || extraCheckFunc(new List { material1, material2 })); + if (checkFlag) + { + selectedFusionMaterial.Add(material1); + selectedFusionMaterial.Add(material2); + return selectedFusionMaterialList; + } + } + } + } + + return selectedFusionMaterial; + } + + public List BrandedInRedForChimeraFunc(List materialList, List mustMaterialList, + List> checkFuncList, Func, bool> extraCheckFunc) + { + List selectedFusionMaterialList = new List(); + + int enemyCardCount = Enemy.MonsterZone.Count(c => c != null); + enemyCardCount += Enemy.SpellZone.Count(c => c != null && c.Type != (int)CardType.Spell && c.Type != (int)CardType.Trap); + if (enemyCardCount == 0 || CheckWhetherNegated(true, true, CardType.Monster)) + { + return selectedFusionMaterialList; + } + + List fieldMaterialList = materialList.Where(c => c.Location == CardLocation.MonsterZone).OrderBy(c => c.Attack).ToList(); + List handMaterialList = materialList.Where(c => c.Location == CardLocation.Hand || c.Location == CardLocation.Grave).OrderBy(c => c.Attack).ToList(); + + // 2 field monster + 1 hand monster + if (enemyCardCount >= 2) + { + foreach (ClientCard handMonster in handMaterialList) + { + for (int fieldIndex1 = 0; fieldIndex1 < fieldMaterialList.Count - 1; ++fieldIndex1) + { + ClientCard fieldMonster1 = fieldMaterialList[fieldIndex1]; + if (fieldMonster1.IsCode(handMonster.Id) || handMonster.IsCode(fieldMonster1.Id)) continue; + for (int fieldIndex2 = fieldIndex1 + 1; fieldIndex2 < fieldMaterialList.Count; ++fieldIndex2) + { + ClientCard fieldMonster2 = fieldMaterialList[fieldIndex2]; + if (fieldMonster2.IsCode(fieldMonster1.Id) || fieldMonster1.IsCode(fieldMonster2.Id)) continue; + if (fieldMonster2.IsCode(handMonster.Id) || handMonster.IsCode(fieldMonster2.Id)) continue; + + return new List { handMonster, fieldMonster1, fieldMonster2 }; + } + } + } + } + + // 1 field monster + 2 hand monster + foreach (ClientCard fieldMonster in fieldMaterialList) + { + for (int handIndex1 = 0; handIndex1 < handMaterialList.Count - 1; ++ handIndex1) + { + ClientCard handMonster1 = handMaterialList[handIndex1]; + if (handMonster1.IsCode(fieldMonster.Id) || fieldMonster.IsCode(handMonster1.Id)) continue; + for (int handIndex2 = handIndex1 + 1; handIndex2 < handMaterialList.Count; ++handIndex2) + { + ClientCard handMonster2 = handMaterialList[handIndex2]; + if (handMonster2.IsCode(handMonster1.Id) || handMonster1.IsCode(handMonster2.Id)) continue; + if (handMonster2.IsCode(fieldMonster.Id) || fieldMonster.IsCode(handMonster2.Id)) continue; + + return new List { fieldMonster, handMonster1, handMonster2 }; + } + } + } + + return selectedFusionMaterialList; + } + + public bool BrandedLostActivate() + { + // search + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) + { + return true; + } + + return false; + } + + public bool BrandedLostCardActivate() + { + // search + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) return false; + + // activate + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion() && Bot.Hand.Count < 3) return false; + SelectSTPlace(Card, true); + return true; + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectCard(target); + } + else + { + AI.SelectCard(Enemy.GetMonsters()); + } + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Trap); + if (shouldNegateList.Count > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateCardList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + public bool BrightestBlazingBrandedKingActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Trap)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + if (Card.Location == CardLocation.SpellZone) + { + if (Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsFaceup() && (c.Location == CardLocation.MonsterZone || c.Location == CardLocation.SpellZone) + && !c.IsCode(albazFusionMonster))) + { + return false; + } + if (Duel.CurrentChain.Any(c => c.Controller == 1 && c.IsFaceup() && !currentNegateCardList.Contains(c) && !currentDestroyCardList.Contains(c) + && (c.Location == CardLocation.MonsterZone || c.Location == CardLocation.SpellZone))) + { + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup())); + currentNegateCardList.AddRange(Enemy.SpellZone.Where(c => c != null && c.IsFaceup())); + activatedCardIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public bool BrandedBeastActivate() + { + if (CheckWhetherNegated(true, true, CardType.Trap)) return false; + + long desc = -1; + if (ActivateDescription >= Util.GetStringId(CardId.BrandedBeast, 0)) + { + desc = ActivateDescription - Util.GetStringId(CardId.BrandedBeast, 0); + } + Logger.DebugWriteLine("Beast: " + desc.ToString()); + + // destroy + if (ActivateDescription == Util.GetStringId(Card.Id, 0)) + { + ClientCard destroyTarget = null; + ClientCard releaseMonster = null; + List dangerCardList = GetProblematicEnemyCardList(true, false, CardType.Trap); + if (dangerCardList.Count > 0) + { + destroyTarget = dangerCardList[0]; + } + if (destroyTarget == null) + { + if (Duel.Player == 1) + { + if ((CurrentTiming & hintTimingMainEnd) > 0) + { + List targetList = GetNormalEnemyTargetList(true, true, CardType.Trap); + if (targetList.Count > 0) + { + destroyTarget = targetList[0]; + } + } + } + else + { + destroyTarget = Util.GetOneEnemyBetterThanMyBest(true, true); + } + } + + bool forceActivateFlag = DefaultOnBecomeTarget(); + int bystialCount = Bot.MonsterZone.Count(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeBystial)); + forceActivateFlag |= bystialCount > 0 && Duel.ChainTargets.Count(c => c.Controller == 0 && c.Location == CardLocation.MonsterZone && c.IsFaceup() && c.HasSetcode(SetcodeBystial)) == bystialCount; + forceActivateFlag |= Duel.CurrentChain.Any(c => c.Controller == 1 && c.Location == CardLocation.SpellZone && c.IsCode(_CardId.Raigeki)); + if (destroyTarget == null && forceActivateFlag) + { + releaseMonster = Duel.ChainTargets.FirstOrDefault(c => c.Controller == 0 && c.Location == CardLocation.MonsterZone && c.IsFaceup() && c.HasSetcode(SetcodeBystial)); + if (releaseMonster == null) + { + if (!activatedCardIdList.Contains(CardId.AlbionTheBrandedDragon + 1) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon))) + { + List brandedDragonList = Bot.MonsterZone.Where(c => c != null && c.IsCode(CardId.AlbionTheBrandedDragon)).OrderBy(c => c.GetDefensePower()).ToList(); + if (brandedDragonList.Count > 0) + { + releaseMonster = brandedDragonList[0]; + } + } + if (releaseMonster == null) + { + releaseMonster = Bot.MonsterZone.Where(c => c != null && c.HasRace(CardRace.Dragon) + && !(c.IsOriginalCode(CardId.FallenOfAlbaz) && Util.ChainContainsCard(CardId.FallenOfAlbaz))).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + } + } + + List targetList = GetNormalEnemyTargetList(true, true, CardType.Trap); + if (targetList.Count > 0) + { + destroyTarget = targetList[0]; + } + } + + if (destroyTarget != null) + { + if (!activatedCardIdList.Contains(CardId.AlbionTheBrandedDragon + 1) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon))) + { + List brandedDragonList = Bot.MonsterZone.Where(c => c != null && c.IsCode(CardId.AlbionTheBrandedDragon)).OrderBy(c => c.GetDefensePower()).ToList(); + if (brandedDragonList.Count > 0) + { + releaseMonster = brandedDragonList[0]; + } + } + if (releaseMonster == null) + { + releaseMonster = Bot.MonsterZone.Where(c => c != null && c.HasRace(CardRace.Dragon) + && !(c.IsOriginalCode(CardId.FallenOfAlbaz) && Util.ChainContainsCard(CardId.FallenOfAlbaz))).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + } + } + + if (releaseMonster != null && destroyTarget != null) + { + activatedCardIdList.Add(Card.Id); + AI.SelectCard(releaseMonster); + AI.SelectNextCard(destroyTarget); + currentDestroyCardList.Add(destroyTarget); + return true; + } + } + + // place + if (Duel.Phase == DuelPhase.End && Bot.HasInGraveyard(CardId.BrandedLost)) + { + activatedCardIdList.Add(Card.Id + 1); + AI.SelectCard(CardId.BrandedLost); + return true; + } + + return false; + } + + public bool BrandedRetributionActivate() + { + if (Card.Location == CardLocation.SpellZone && Duel.LastChainPlayer == 1) + { + if (CheckWhetherNegated(true, true, CardType.Trap)) return false; + bool checkFlag = Bot.Graveyard.Where(c => c != null && c.IsCode(albazFusionMonster)).Count() > 1; + checkFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(new[] { CardId.LubellionTheSearingDragon, CardId.SprindTheIrondashDragon, CardId.AlbaLenatusTheAbyssDragon })); + if (checkFlag) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Trap)) return false; + Dictionary> checkDict = new Dictionary>{ + {CardId.BrandedFusion, () => BrandedFusionActivateCheck()}, + {CardId.BrandedLost, () => { + if (Duel.Player == 0 && Duel.Phase >= DuelPhase.End) return false; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedFusion) && BrandedFusionActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) && BrandedInWhiteActivateCheck()) return true; + if (Bot.HasInHandOrInSpellZone(CardId.BrandedInRed) && BrandedInRedActivateCheck() != null) return true; + if (!summoned && Bot.HasInHand(CardId.FallenOfAlbaz) && CheckAlbazFusion()) return true; + if ((Bot.HasInMonstersZone(CardId.BlazingCartesiaTheVirtuous) || (!summoned && Bot.HasInHand(CardId.BlazingCartesiaTheVirtuous)))) return true; + return false; + } }, + {CardId.BrandedInHighSpirits, () => !(Duel.Player == 1 && (fusionToGYFlag || Duel.Phase != DuelPhase.End)) && BrandedInHighSpiritsActivateCheck()}, + {CardId.BrandedInRed, () => BrandedInRedActivateCheck() != null }, + {CardId.BrandedInWhite, BrandedInWhiteActivateCheck }, + {CardId.BrightestBlazingBrandedKing, () => !(Duel.Player == 1 && (fusionToGYFlag || Duel.Phase != DuelPhase.End)) && Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(albazFusionMonster)) }, + {CardId.BrandedOpening, () => Bot.Hand.Count > 2 && !activatedCardIdList.Contains(CardId.BrandedOpening) } + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + activatedCardIdList.Add(Card.Id); + AI.SelectCard(target); + return true; + } + } + } + return false; + } + + public bool GuardianChimeraActivate() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + return true; + } + + public bool AlbionTheSanctifireDragonActivate() + { + // spsummon from grave + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + List allTargetList = Enemy.Graveyard.Where(c => c != null && c.IsMonster() && c.IsCanRevive()).ToList(); + allTargetList.AddRange(Bot.Graveyard.Where(c => c != null && c.IsMonster() && c.IsCanRevive()).ToList()); + + List targetList = new List(); + + // spsummon albaz + if (CheckAlbazFusion(null, out List materialList) && !spSummoningAlbaz) + { + bool albazFlag = materialList.Count > 1; + if (materialList.Count > 0) + { + ClientCard material = materialList[0]; + albazFlag |= material.HasType(CardType.Ritual | CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + albazFlag |= material.IsFloodgate() || material.IsOneForXyz() || Util.GetWorstBotMonster().GetDefensePower() < material.Attack; + albazFlag |= Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer == -1; + } + + if (albazFlag) + { + ClientCard albaz = allTargetList.FirstOrDefault(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + ClientCard worstMonster = allTargetList.Where(c => c != albaz && !currentDestroyCardList.Contains(c)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (albaz != null && worstMonster != null + && (GetProblematicEnemyMonster(0, false, false, CardType.Monster) != null || Math.Max(worstMonster.Attack, worstMonster.Defense) <= albaz.Defense)) + { + Logger.DebugWriteLine("Sanctifire 1"); + targetList.AddRange(new[] { albaz, worstMonster }); + spSummoningAlbaz = true; + } + } + } + + // spsummon floogate + if (targetList.Count == 0) + { + ClientCard floogateCard = allTargetList.Where(c => c.IsFloodgate()).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (floogateCard != null) + { + // select worst monster + ClientCard worstMonster = allTargetList.Where(c => c != floogateCard).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (worstMonster != null) + { + Logger.DebugWriteLine("Sanctifire 2"); + targetList.AddRange(new[] { floogateCard, worstMonster }); + } + } + } + + // spsummon target + if (targetList.Count == 0 && Duel.LastChainPlayer == 1) + { + List targetedList = Duel.LastChainTargets.Intersect(allTargetList).ToList(); + if (targetedList.Count > 0) + { + ClientCard target = ShuffleList(targetedList)[0]; + ClientCard anotherTarget = null; + if (target.GetDefensePower() >= 2000) + { + // select worst + anotherTarget = allTargetList.Where(c => c != target).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + } else + { + // select best + anotherTarget = allTargetList.Where(c => c != target).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + } + if (anotherTarget != null) + { + Logger.DebugWriteLine("Sanctifire 3"); + targetList.AddRange(new[] { target, anotherTarget }); + } + } + } + + // spsummon useful monster + if (targetList.Count == 0 && Duel.Player == 1 && Duel.Phase == DuelPhase.End) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.BorreloadFuriousDragon, () => Enemy.GetSpellCount() > 0 }, + {CardId.MirrorjadeTheIcebladeDragon, () => !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) }, + {CardId.AluberTheJesterOfDespia, () => !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) }, + {CardId.SpringansKitt, () => !activatedCardIdList.Contains(CardId.SpringansKitt + 1) }, + }; + + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = allTargetList.FirstOrDefault(c => c.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + // select worst + ClientCard anotherTarget = allTargetList.Where(c => c != target).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + targetList.Add(target); + targetList.Add(anotherTarget); + Logger.DebugWriteLine("Sanctifire 4"); + break; + } + } + } + + // avoid evenly match + if (targetList.Count == 0 && Duel.Player == 1 && Enemy.Hand.Count > 0 && Enemy.GetMonsterCount() + Enemy.GetSpellCount() == 0 && (CurrentTiming & hintBattleStart) > 0) + { + ClientCard summonTarget = allTargetList.OrderByDescending(c => c.Attack).FirstOrDefault(); + Dictionary> checkDict = new Dictionary> + { + {CardId.MirrorjadeTheIcebladeDragon, () => !Bot.HasInMonstersZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) && !Bot.HasInSpellZone(CardId.MirrorjadeTheIcebladeDragon, faceUp: true) }, + {CardId.AluberTheJesterOfDespia, () => !activatedCardIdList.Contains(CardId.AluberTheJesterOfDespia) }, + }; + foreach (KeyValuePair> pair in checkDict) + { + ClientCard target = allTargetList.FirstOrDefault(c => c.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + summonTarget = target; + break; + } + } + if (summonTarget != null) + { + // select worst + ClientCard anotherTarget = allTargetList.Where(c => c != summonTarget).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + targetList.Add(summonTarget); + targetList.Add(anotherTarget); + Logger.DebugWriteLine("Sanctifire 5"); + } + } + + if (targetList.Count > 0) + { + AI.SelectMaterials(targetList, HintMsg.SpSummon); + currentDestroyCardList.AddRange(targetList); + activatedCardIdList.Add(Card.Id); + return true; + } + } + // spsummon itself + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + List botCards = new List { Bot.MonsterZone[2], Bot.MonsterZone[5], Bot.MonsterZone[6] }; + List enemyCards = new List { Enemy.MonsterZone[2], Enemy.MonsterZone[5], Enemy.MonsterZone[6] }; + if (enemyCards.Any(c => c != null && (c.IsFloodgate() || c.IsMonsterDangerous()))) return true; + return botCards.Select(c => c == null ? 0 : c.GetDefensePower()).Sum() < enemyCards.Select(c => c == null ? 0 : c.GetDefensePower()).Sum(); + } + return false; + } + + public bool MirrorjadeTheIcebladeDragonActivate() + { + if (Card.Location != CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + return true; + } + if (Card.Location == CardLocation.MonsterZone) + { + bool checkFlag = GetProblematicEnemyMonster(0, false, false, CardType.Monster) != null; + if (Enemy.GetMonsterCount() > 0) + { + checkFlag |= Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0; + int enemyBattlePower = Enemy.BattlingMonster == null ? 0 : Enemy.BattlingMonster.GetDefensePower(); + int botBattlePower = Bot.BattlingMonster == null ? 0 : Bot.BattlingMonster.GetDefensePower(); + checkFlag |= enemyBattlePower > 0 && enemyBattlePower > botBattlePower && Duel.LastChainPlayer != 0 && !currentDestroyCardList.Contains(Enemy.BattlingMonster); + checkFlag |= DefaultOnBecomeTarget() && Duel.LastChainPlayer != 0; + } + if (Duel.CurrentChain.Any(c => c.IsCode(CardId.NibiruThePrimalBeing) && !DefaultCheckWhetherCardIdIsNegated(CardId.NibiruThePrimalBeing))) + { + checkFlag |= Enemy.GetMonsterCount() > 0; + checkFlag |= Bot.HasInMonstersZone(new[] { CardId.TheBystialLubellion, CardId.DespianTragedy, CardId.TriBrigadeMercourier }); + } + + if (checkFlag) + { + Dictionary> checkDict = new Dictionary> + { + {CardId.AlbionTheBrandedDragon, + () =>!sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) && !DefaultCheckWhetherCardIdIsNegated(CardId.AlbionTheBrandedDragon) + && !(Duel.Player == 0 && Bot.HasInMonstersZone(CardId.AlbionTheBrandedDragon) && Bot.HasInGraveyard(CardId.TheBystialLubellion))}, + {CardId.RindbrummTheStrikingDragon, + () => Duel.Player == 1 && Bot.Graveyard.Any(c => c.IsOriginalCode(CardId.FallenOfAlbaz)) && Bot.Hand.Count > 0 + && !activatedCardIdList.Contains(CardId.FallenOfAlbaz) && !DefaultCheckWhetherCardIdIsNegated(CardId.FallenOfAlbaz)}, + {CardId.TitanikladTheAshDragon, () => CheckRemainInDeck(CardId.GuidingQuemTheVirtuous) > 0}, + {CardId.SprindTheIrondashDragon, () => CheckRemainInDeck(CardId.SpringansKitt) > 0}, + {CardId.AlbaLenatusTheAbyssDragon, () => CheckRemainInDeck(CardId.FusionDeployment, CardId.BrandedFusion) > 0 }, + {CardId.LubellionTheSearingDragon, () => true }, + {CardId.AlbionTheSanctifireDragon, () => true } + }; + + foreach (KeyValuePair> pair in checkDict) + { + if (Bot.HasInExtra(pair.Key) && pair.Value()) + { + AI.SelectCard(pair.Key); + return true; + } + } + } + } + return false; + } + + public bool BorreloadFuriousDragonActivate() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + + // destroy dangerous card + List dangerList = GetProblematicEnemyCardList(true, false, CardType.Monster); + if (dangerList.Count > 0) + { + ClientCard botTarget = Bot.GetMonsters().OrderBy(c => c.GetDefensePower() + (c.IsCode(albazFusionMonster) ? 1 : 0)).FirstOrDefault(); + if (botTarget != null) + { + AI.SelectCard(botTarget); + AI.SelectNextCard(dangerList); + currentDestroyCardList.Add(botTarget); + currentDestroyCardList.Add(dangerList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + List enemyTargetList = GetNormalEnemyTargetList(true, true, CardType.Monster); + + // become target + if (Duel.LastChainPlayer == 1) + { + List targetedBotMonsterList = Duel.LastChainTargets.Where(c => c.Location == CardLocation.MonsterZone && c.Controller == 0).ToList(); + ClientCard lastChainCard = Util.GetLastChainCard(); + // if it's a negate effect, only destroy not important monster + if (lastChainCard != null && lastChainCard.IsCode(targetNegateIdList)) + { + targetedBotMonsterList = targetedBotMonsterList.Where(c => !c.IsCode(CardId.BlazingCartesiaTheVirtuous) || c.Attack < 2500).OrderBy(c => c.Attack).ToList(); + } + if (targetedBotMonsterList.Count > 0) + { + AI.SelectCard(targetedBotMonsterList); + AI.SelectNextCard(enemyTargetList); + currentDestroyCardList.Add(targetedBotMonsterList[0]); + currentDestroyCardList.Add(enemyTargetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // end phase + if (Duel.Player == 1 && Duel.Phase == DuelPhase.End) + { + List botTargetList = Bot.MonsterZone.Where(c => c != null && c.GetDefensePower() <= 2500).OrderBy(c => c.GetDefensePower()).ToList(); + if (botTargetList.Count > 0) + { + AI.SelectCard(botTargetList); + AI.SelectNextCard(enemyTargetList); + currentDestroyCardList.Add(botTargetList[0]); + currentDestroyCardList.Add(enemyTargetList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + return false; + } + + public bool LubellionTheSearingDragonActivate() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + int fusionTarget = LubellionTheSearingDragonFusionTarget(Bot.ExtraDeck, out _); + if (fusionTarget > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public int LubellionTheSearingDragonFusionTarget(IList cards, out ClientCard target) + { + target = null; + bool hasAlbaz = Bot.Banished.Any(c => c != null && c.IsFaceup() && c.IsOriginalCode(CardId.FallenOfAlbaz)); + hasAlbaz |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.IsOriginalCode(CardId.FallenOfAlbaz)); + Dictionary> checkDict = new Dictionary> + { + {CardId.MirrorjadeTheIcebladeDragon, () => hasAlbaz && !DefaultCheckWhetherCardIdIsNegated(CardId.MirrorjadeTheIcebladeDragon) }, + {CardId.GranguignolTheDuskDragon, () => Bot.HasInBanished(CardId.BlazingCartesiaTheVirtuous) }, + {CardId.BorreloadFuriousDragon, () => + { + int darkDragonCount = Bot.Banished.Where(c => c.IsFaceup() && c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) + && !c.IsCode(cannotBeFusionMaterialIdList) ).Count(); + darkDragonCount += Bot.Graveyard.Where(c => c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) + && !c.IsCode(cannotBeFusionMaterialIdList) + && (Duel.Player == 1 || !CheckWhetherShouldKeepInGrave(c)) ).Count(); + return darkDragonCount >= 2; + } }, + {CardId.RindbrummTheStrikingDragon, () => hasAlbaz && Bot.HasInBanished(CardId.TriBrigadeMercourier) }, + {CardId.TitanikladTheAshDragon, () => + { + if (!hasAlbaz) return false; + ClientCard enemyMonster = Util.GetBestEnemyMonster(true); + ClientCard botMonster = Util.GetBestBotMonster(true); + int enemyPower = enemyMonster == null ? 0 : enemyMonster.GetDefensePower(); + int botPower = botMonster == null ? 0 : botMonster.Attack; + if (enemyPower > 0 && enemyPower >= botPower) + { + List materialList = new List(Bot.Banished); + materialList.AddRange(Bot.Graveyard); + foreach (ClientCard material in materialList) + { + if (material != null && material.IsFaceup() && material.Attack >= 2500 && (2900 + material.Level >= enemyPower)) + { + return true; + } + } + } + return false; + } }, + {CardId.DespianQuaeritis, () => { + if (!Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.Attack > 2500 && !(c.HasType(CardType.Fusion) && c.Level >= 8))) return false; + bool checkFlag = Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeDespain)); + checkFlag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeDespain)); + + return checkFlag; + } }, + {CardId.AlbaLenatusTheAbyssDragon, () => hasAlbaz && !Bot.HasInExtra(CardId.AlbionTheBrandedDragon) }, + {CardId.AlbionTheBrandedDragon, () => { + if (activatedCardIdList.Contains(CardId.AlbionTheBrandedDragon) || DefaultCheckWhetherCardIdIsNegated(CardId.AlbionTheBrandedDragon)) return false; + bool checkFlag = Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasAttribute(CardAttribute.Light)); + checkFlag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasAttribute(CardAttribute.Light)); + + return checkFlag; + }} + }; + + foreach (KeyValuePair> pair in checkDict) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return pair.Key; + } + } + + target = null; + return 0; + } + + public bool AlbaLenatusTheAbyssDragonSpSummon() + { + // use albaz + enemy's dragon monster + List enemyDragon = Enemy.GetMonsters().Where(c => c != null && c.IsFaceup() && !c.IsCode(cannotBeFusionMaterialIdList) && c.HasRace(CardRace.Dragon)).ToList(); + if (enemyDragon.Count > 0) + { + bool successFlag = enemyDragon.Count > 1; + int bestBotPower = Util.GetBestAttack(Bot); + successFlag |= enemyDragon.Any(c => c.GetDefensePower() >= bestBotPower); + if (successFlag) + { + if (!enemyDragon.Any(c => c.IsCode(CardId.FallenOfAlbaz))) + { + ClientCard botAlbaz = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz)); + if (botAlbaz != null) + { + enemyDragon.Add(botAlbaz); + } + } + AI.SelectMaterials(enemyDragon); + return true; + } + } + + return false; + } + + public bool AlbaLenatusTheAbyssDragonActivate() + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool GranguignolTheDuskDragonActivate() + { + long desc = -1; + if (ActivateDescription >= Util.GetStringId(CardId.GranguignolTheDuskDragon, 0)) + { + desc = ActivateDescription - Util.GetStringId(CardId.GranguignolTheDuskDragon, 0); + } + Logger.DebugWriteLine("granguignol: " + desc.ToString()); + + // send to GY + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.GranguignolTheDuskDragon, 0)) + { + if (CheckWhetherNegated(true, true, CardType.Monster) || CheckWhetherWillbeRemoved()) return false; + int checkId = GranguignolTheDuskDragonSendToGYTarget(null, out _); + if (checkId > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + // spsummon + if (ActivateDescription == Util.GetStringId(CardId.GranguignolTheDuskDragon, 1)) + { + if (CheckWhetherNegated(true, Card.Location == CardLocation.MonsterZone, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public int GranguignolTheDuskDragonSendToGYTarget(IList cards, out ClientCard target) + { + bool needSendBranded = Bot.HasInGraveyard(CardId.BrandedRetribution) && CheckRemainInDeck(CardId.BrandedFusion) > 0; + if (CheckRemainInDeck(CardId.BrandedRetribution) > 0) + { + needSendBranded |= Bot.Graveyard.Any(c => c != null && c.HasType(CardType.Spell | CardType.Trap) && c.HasSetcode(SetcodeBranded) + && !(fusionToGYFlag && c.IsCode(CardId.BrightestBlazingBrandedKing, CardId.BrandedInHighSpirits))); + needSendBranded |= !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon) && !CheckWhetherWillbeRemoved() && Bot.HasInHandOrInGraveyard(CardId.AlbionTheShroudedDragon); + needSendBranded |= Duel.CurrentChain.Any(c => c.Controller == 0 && c.Location == CardLocation.Grave && c.IsCode(CardId.BystialSaronir)); + } + List>> checkList = new List>> + { + new KeyValuePair>(CardId.BystialSaronir, () => !activatedCardIdList.Contains(CardId.BystialSaronir) && needSendBranded), + new KeyValuePair>(CardId.AlbionTheShroudedDragon, () => !activatedCardIdList.Contains(CardId.AlbionTheShroudedDragon) && needSendBranded ), + new KeyValuePair>(CardId.AlbionTheBrandedDragon, () => !activatedCardIdList.Contains(CardId.AlbionTheBrandedDragon + 1) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.AlbionTheBrandedDragon)) ), + new KeyValuePair>(CardId.TitanikladTheAshDragon, () => !activatedCardIdList.Contains(CardId.TitanikladTheAshDragon) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.TitanikladTheAshDragon)) + && CheckRemainInDeck(CardId.GuidingQuemTheVirtuous, CardId.FallenOfAlbaz) > 0), + new KeyValuePair>(CardId.TheBystialLubellion, () => Bot.HasInMonstersZone(new[] {CardId.AlbionTheBrandedDragon, CardId.TitanikladTheAshDragon}) + && CheckRemainInDeck(CardId.BrandedLost, CardId.BrandedBeast) > 0 ), + new KeyValuePair>(CardId.SprindTheIrondashDragon, () => !activatedCardIdList.Contains(CardId.SprindTheIrondashDragon) && !sendToGYThisTurn.Any(c => c.IsCode(CardId.SprindTheIrondashDragon)) + && CheckRemainInDeck(CardId.SpringansKitt) > 0), + new KeyValuePair>(CardId.DespianLuluwalilith, () => CheckRemainInDeck(CardId.BlazingCartesiaTheVirtuous, CardId.GuidingQuemTheVirtuous) > 0 ), + new KeyValuePair>(CardId.AlbionTheShroudedDragon, () => true ), + }; + + foreach (KeyValuePair> pair in checkList) + { + if (cards == null) + { + if ((CheckRemainInDeck(pair.Key) > 0 || Bot.HasInExtra(pair.Key)) && pair.Value()) + { + target = null; + return pair.Key; + } + } else + { + ClientCard tg = cards.FirstOrDefault(c => c.IsOriginalCode(pair.Key)); + if (tg != null && pair.Value()) + { + target = tg; + return pair.Key; + } + } + } + + target = null; + return 0; + } + + public bool DespianQuaeritisActivate() + { + if (Card.Location == CardLocation.MonsterZone && Duel.Phase == DuelPhase.Main1 && !CheckWhetherNegated(true, true, CardType.Monster)) + { + if ((CurrentTiming & hintTimingMainEnd) != 0 && Duel.Player == 1) + { + int bestBotPower = Util.GetBestPower(Bot, false); + if (Enemy.GetMonsters().Any(c => c.GetDefensePower() >= bestBotPower && c.IsAttack() && !(c.HasType(CardType.Fusion) && c.Level >= 8))) { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Duel.Player == 0 && Enemy.GetMonsters().Any(c => c.IsAttack() && !(c.HasType(CardType.Fusion) && c.Level >= 8))) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Card.Location != CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return true; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + return false; + } + + public bool SprindTheIrondashDragonActivate() + { + // search + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + // destroy + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + int moveDest = SprindTheIrondashDragonMoveZone(0, Card); + if (moveDest > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public int SprindTheIrondashDragonMoveZone(int available = 0, ClientCard selfCard = null) + { + int maxZone = -1; + int maxValue = 0; + for (int zoneId = 0; zoneId < 5; ++zoneId) + { + // check whether can move + if (Bot.MonsterZone[zoneId] != null) continue; + int zone = (int)System.Math.Pow(2, zoneId); + if (available > 0 && (available & zone) == 0) continue; + + int currentValue = SprindTheIrondashDragonDestroyValue(zoneId, selfCard); + if (currentValue > maxValue) + { + maxZone = zone; + maxValue = currentValue; + } + } + return maxZone; + } + + public int SprindTheIrondashDragonDestroyValue(int zoneId, ClientCard selfCard = null) + { + int value = 0; + if (zoneId == 1 || zoneId == 3) + { + ClientCard botMonsterInExtraZone = Bot.MonsterZone[(zoneId + 9) / 2]; + if (botMonsterInExtraZone != null && botMonsterInExtraZone != selfCard && botMonsterInExtraZone.IsFaceup()) value -= 5; + + ClientCard enemyMonserInExtraZone = Enemy.MonsterZone[(11 - zoneId) / 2]; + if (enemyMonserInExtraZone != null && enemyMonserInExtraZone.IsFaceup()) value += 2; + } + ClientCard botSpell = Bot.SpellZone[zoneId]; + if (botSpell != null && botSpell.IsFaceup()) value--; + ClientCard enemyMonster = Enemy.MonsterZone[5 - zoneId]; + if (enemyMonster != null && enemyMonster.IsFaceup()) + { + value++; + if (enemyMonster.IsFloodgate() || enemyMonster.IsMonsterDangerous()) value += 5; + } + ClientCard enemySpell = Enemy.SpellZone[5 - zoneId]; + if (enemySpell != null && enemySpell.IsFaceup()) + { + value++; + if (enemySpell.IsFloodgate()) value += 5; + } + + return value; + } + + public bool TitanikladTheAshDragonActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool RindbrummTheStrikingDragonActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + bool checkFlag = false; + + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null) + { + checkFlag = Duel.LastChainPlayer == 1; + checkFlag |= Duel.LastChainPlayer == 0 && lastChainCard.IsCode(CardId.MirrorjadeTheIcebladeDragon) && lastChainCard.Location == CardLocation.MonsterZone && Enemy.GetMonsterCount() == 0; + } + + if (checkFlag) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, true, CardType.Monster) || Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.GuidingQuemTheVirtuous))) return false; + + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + bool checkFlag = Card.IsCanRevive() && Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + bool albazFlag = CheckAlbazFusion(null, out List materialList) && albaz != null && !spSummoningAlbaz; + if (albazFlag) + { + checkFlag |= materialList.Count > 1; + if (materialList.Count > 0) + { + ClientCard material = materialList[0]; + checkFlag |= material.HasType(CardType.Ritual | CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + checkFlag |= material.IsFloodgate() || material.IsOneForXyz() || Util.GetWorstBotMonster()?.GetDefensePower() < material.Attack; + checkFlag |= Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer == -1; + } + } + + if (checkFlag) + { + albaz = Bot.Graveyard.Where(c => c.IsCode(CardId.FallenOfAlbaz)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + + if (checkFlag && albaz != null) + { + spSummoningAlbaz = true; + activatedCardIdList.Add(Card.Id + 1); + AI.SelectCard(albaz); + return true; + } + } + } + return false; + } + + public bool AlbionTheBrandedDragonActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + int fusionTarget = AlbionTheBrandedDragonFusionTarget(Bot.ExtraDeck, out _); + if (fusionTarget > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + return false; + } + + public int AlbionTheBrandedDragonFusionTarget(IList cards, out ClientCard target) + { + target = null; + Dictionary> checkDict = new Dictionary> + { + {CardId.MirrorjadeTheIcebladeDragon, () => { + bool checkFlag = !CheckWhetherNegated() && CheckShouldNoMoreSpSummon(); + checkFlag |= Bot.Graveyard.Any(c => c != null && !sendToGYThisTurn.Contains(c) && !c.IsCode(cannotBeFusionMaterialIdList) + && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + return checkFlag; + } }, + {CardId.LubellionTheSearingDragon, () => + { + if (!activatedCardIdList.Contains(CardId.LubellionTheSearingDragon)) + { + List checkMaterialList = new List(Bot.GetMonsters()); + checkMaterialList.AddRange(Bot.Graveyard); + bool albazChecked = false; + bool hasOriginalAlbaz = checkMaterialList.Any(c => c.IsOriginalCode(CardId.FallenOfAlbaz)); + foreach (ClientCard checkCard in checkMaterialList) + { + if (!albazChecked && checkCard.IsCode(CardId.FallenOfAlbaz) && (!hasOriginalAlbaz || !checkCard.IsOriginalCode(CardId.AlbionTheShroudedDragon))) + { + albazChecked = true; + continue; + } + if (checkCard.HasAttribute(CardAttribute.Dark)) return true; + } + if (Bot.HasInHand(CardId.TriBrigadeMercourier) && Bot.Hand.Count >= 2) return true; + } + return false; + } }, + {CardId.BorreloadFuriousDragon, () => { + if (Enemy.GetMonsterCount() + Enemy.GetSpellCount() > 0) + { + int darkDragonCount = Bot.Graveyard.Where(c => c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) + && !c.IsCode(cannotBeFusionMaterialIdList) + && (Duel.Player == 1 || !CheckWhetherShouldKeepInGrave(c)) ).Count(); + if (Duel.Player == 1 && Bot.GetMonsters().Any(c => c.HasRace(CardRace.Dragon) && c.HasAttribute(CardAttribute.Dark) && !c.IsCode(cannotBeFusionMaterialIdList))) { + darkDragonCount ++; + } + return darkDragonCount >= 2; + } + return false; + } }, + {CardId.AlbionTheSanctifireDragon, () => + { + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c.IsCode(CardId.FallenOfAlbaz)); + ClientCard lightSpellcaster = Bot.Graveyard.FirstOrDefault(c => c.HasRace(CardRace.SpellCaster) && c.HasAttribute(CardAttribute.Light)); + int remainMonsterCount = Enemy.GetGraveyardMonsters().Count; + remainMonsterCount += Bot.Graveyard.Where(c => c.IsMonster() && c != albaz && c != lightSpellcaster).Count(); + remainMonsterCount += Bot.HasInHand(_CardId.MaxxC) ? 1 : 0; + return remainMonsterCount >= 2; + } }, + {CardId.RindbrummTheStrikingDragon, () => Bot.HasInGraveyard(CardId.TriBrigadeMercourier) }, + {CardId.DespianQuaeritis, () => + { + bool checkFlag = Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && c.Attack >= 2500 && !(c.HasType(CardType.Fusion) && c.Level >= 8)); + if (checkFlag) + { + ClientCard despian = Bot.Graveyard.Where(c => c != null && c.HasSetcode(SetcodeDespain) && !CheckWhetherShouldKeepInGrave(c)) + .OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (despian == null) + { + despian = Bot.MonsterZone.Where(c => c != null && c.HasSetcode(SetcodeDespain)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + } + if (despian != null) + { + return Bot.Graveyard.Any(c => c.HasAttribute(CardAttribute.Light | CardAttribute.Dark) && !CheckWhetherShouldKeepInGrave(c) && c != despian); + } + } + + return false; + } }, + {CardId.TitanikladTheAshDragon, () => + { + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (albaz == null) + { + albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz)); + } + foreach (ClientCard material in Bot.Graveyard) + { + if (material != null && material != albaz && material.IsMonster() && material.Attack >= 2500 && !material.IsCode(cannotBeFusionMaterialIdList)) + { + bool checkFlag = !Util.IsTurn1OrMain2() && Enemy.GetMonsterCount() == 0; + checkFlag |= !CheckWhetherShouldKeepInGrave(material); + return checkFlag; + } + } + return false; + } }, + {CardId.AlbaLenatusTheAbyssDragon, () => + { + if (Util.GetOneEnemyBetterThanMyBest() == null) + { + ClientCard albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsOriginalCode(CardId.FallenOfAlbaz)); + if (albaz == null) + { + albaz = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsCode(CardId.FallenOfAlbaz)); + } + foreach (ClientCard material in Bot.Graveyard) + { + if (material != null && material != albaz && material.IsMonster() && material.HasRace(CardRace.Dragon) && !material.IsCode(cannotBeFusionMaterialIdList)) + { + return true; + } + } + } + return false; + } }, + {CardId.GranguignolTheDuskDragon, () => + { + if (cards == null) return false; + return true; + } } + }; + + foreach (KeyValuePair> pair in checkDict) + { + target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + return pair.Key; + } + } + + target = null; + return 0; + } + + public bool DespianLuluwalilithActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated(true, false, CardType.Monster)) return false; + if (CheckRemainInDeck(CardId.GuidingQuemTheVirtuous, CardId.BlazingCartesiaTheVirtuous) > 0) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + return false; + } + + public bool SetForChimera() + { + if (Card.Level <= 4) return false; + if (Bot.GetMonsterCount() > 0 || !Bot.HasInHandOrInSpellZone(CardId.BrandedInWhite) || !Bot.HasInExtra(CardId.GuardianChimera)) return false; + if (DefaultCheckWhetherCardIdIsNegated(CardId.GuardianChimera) || CheckWhetherNegated(true, true, CardType.Monster)) return false; + if (Enemy.MonsterZone.All(c => c == null) && Enemy.SpellZone.All(c => c == null)) return false; + + for (int handIndex1 = 0; handIndex1 < Bot.Hand.Count - 1; ++ handIndex1) + { + ClientCard hand1 = Bot.Hand[handIndex1]; + if (!hand1.IsMonster() || hand1.IsCode(Card.Id) || Card.IsCode(hand1.Id)) continue; + for (int handIndex2 = handIndex1 + 1; handIndex2 < Bot.Hand.Count; ++ handIndex2) + { + ClientCard hand2 = Bot.Hand[handIndex2]; + if (!hand2.IsMonster()) continue; + if (hand2.IsCode(Card.Id) || Card.IsCode(hand2.Id) || hand2.IsCode(hand1.Id) || hand1.IsCode(hand2.Id)) continue; + bool checkFlag = Card.HasRace(CardRace.Dragon) || hand1.HasRace(CardRace.Dragon) || hand2.HasRace(CardRace.Dragon); + if (checkFlag) + { + summoned = true; + return true; + } + } + } + + return false; + } + + public bool AdvanceSummon() + { + if (Card.Level < 5) return false; + + List releaseGoal = Bot.MonsterZone.Where(c => c != null && c.IsFaceup() && !c.IsDisabled() && c.IsCode(10158145)).ToList(); + if (releaseGoal.Count > 0) + { + if (Card.Level <= 6) + { + AI.SelectMaterials(releaseGoal); + summoned = true; + return true; + } + + if (Card.Level >= 7) + { + if (releaseGoal.Count < 2) + { + ClientCard anotherMaterial = Bot.MonsterZone.Where(c => c != null && !releaseGoal.Contains(c)).OrderBy(c => c.GetDefensePower()).FirstOrDefault(); + if (anotherMaterial.GetDefensePower() > Card.Attack) return false; + releaseGoal.Add(anotherMaterial); + } + if (releaseGoal.Count >= 2) + { + AI.SelectMaterials(releaseGoal); + summoned = true; + return true; + } + } + } + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + switch (Card.Id) + { + case CardId.BrandedInHighSpirits: + { + bool checkFlag = (Bot.HasInMonstersZone(CardId.GuidingQuemTheVirtuous) + || (CheckRemainInDeck(CardId.GuidingQuemTheVirtuous) > 0 && sendToGYThisTurn.Any(c => c.IsCode(CardId.TitanikladTheAshDragon)))); + if (!checkFlag) return false; + } + break; + case CardId.BrandedOpening: + { + bool checkFlag = CheckRemainInDeck(CardId.AluberTheJesterOfDespia, CardId.GuidingQuemTheVirtuous) > 0; + if (!checkFlag) return false; + } + break; + case CardId.BrightestBlazingBrandedKing: + { + bool checkFlag = Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster)); + if (!checkFlag) return false; + } + break; + case CardId.BrandedBeast: + { + bool checkFlag = Bot.HasInGraveyard(CardId.BrandedLost) || Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeBystial)); + checkFlag |= Bot.HasInHand(CardId.BystialSaronir) && (Enemy.Graveyard.Any(c => CheckBystialCanBanish(c)) || Bot.Graveyard.Any(c => CheckBystialCanBanish(c))); + if (!checkFlag) return false; + } + break; + case CardId.BrandedRetribution: + { + bool checkFlag = Bot.Graveyard.Where(c => c.IsCode(albazFusionMonster)).Count() > 1; + checkFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(albazFusionMonster)); + if (!checkFlag) return false; + } + break; + default: + break; + } + + // select place + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + List avoid_list = new List(); + int setForInfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setForInfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setForInfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + // for Sanctifire Dragon spsummoned monster + public bool FloogateActivate() + { + if (Card.Owner != 1 && !Card.IsFloodgate()) return false; + if (CheckWhetherNegated()) return false; + if (Executors.Any(e => e != null && e.Type == ExecutorType.Activate && e.CardId == Card.Id)) return false; + if (Duel.LastChainPlayer == 1) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.IsFaceup() && CheckCanBeTargeted(lastChainCard, true, CardType.Monster) + && (lastChainCard.Location == CardLocation.MonsterZone || lastChainCard.Location == CardLocation.SpellZone)) + { + AI.SelectCard(lastChainCard); + } + } + + return Duel.LastChainPlayer == 1; + } + } +} \ No newline at end of file diff --git a/Game/AI/Decks/AltergeistExecutor.cs b/Game/AI/Decks/AltergeistExecutor.cs index aa06a5257..bd320cfc0 100644 --- a/Game/AI/Decks/AltergeistExecutor.cs +++ b/Game/AI/Decks/AltergeistExecutor.cs @@ -1,8 +1,9 @@ -using YGOSharp.OCGWrapper.Enums; +using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using WindBot; using WindBot.Game; using WindBot.Game.AI; +using System.Linq; namespace WindBot.Game.AI.Decks { @@ -211,7 +212,7 @@ public bool EvenlyMatched_Repos() return false; } - public bool isAltergeist(long id) + public bool isAltergeist(int id) { return (id == CardId.Marionetter || id == CardId.Hexstia || id == CardId.Protocol || id == CardId.Multifaker || id == CardId.Meluseek || id == CardId.Kunquery @@ -220,8 +221,7 @@ public bool isAltergeist(long id) public bool isAltergeist(ClientCard card) { - return card.IsCode(CardId.Marionetter, CardId.Hexstia, CardId.Protocol, CardId.Multifaker, CardId.Meluseek, - CardId.Kunquery, CardId.Manifestation, CardId.Silquitous); + return card != null && card.HasSetcode(0x103); } public int GetSequence(ClientCard card) @@ -324,23 +324,37 @@ public int GetTotalATK(IList list) public int SelectSTPlace(ClientCard card=null, bool avoid_Impermanence = false) { - List list = new List { 0, 1, 2, 3, 4 }; + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; + list.Add(seq); + } + } int n = list.Count; while (n-- > 1) { - int index = Program.Rand.Next(n + 1); - int temp = list[index]; - list[index] = list[n]; - list[n] = temp; + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; } - foreach (int seq in list) + if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) { - int zone = (int)System.Math.Pow(2, seq); - if (Bot.SpellZone[seq] == null) + foreach (int seq in list) { - if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; - return zone; - }; + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + return (int)System.Math.Pow(2, seq); + } + } + foreach (int seq in list) + { + return (int)System.Math.Pow(2, seq); } return 0; } @@ -376,6 +390,7 @@ public int SelectSetPlace(List avoid_list=null) public bool spell_trap_activate(bool isCounter = false, ClientCard target = null) { if (target == null) target = Card; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return true; if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !Bot.HasInHandOrHasInMonstersZone(CardId.GO_SR) && !isCounter && !Bot.HasInSpellZone(CardId.SolemnStrike)) return false; if (target.IsSpell()) @@ -649,7 +664,7 @@ public bool SecretVillage_activate() public bool G_activate() { - return (Duel.Player == 1); + return (Duel.Player == 1) && !DefaultCheckWhetherCardIsNegated(Card); } public bool NaturalExterio_eff() @@ -806,6 +821,7 @@ public bool Impermanence_activate() public bool Hand_act_eff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.IsCode(CardId.AB_JS) && Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect return false; if (Card.IsCode(CardId.GO_SR) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GO_SR)) return false; @@ -886,6 +902,7 @@ public bool WakingtheDragon_eff() public bool GR_WC_activate() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int warrior_count = 0; int pendulum_count = 0; int link_count = 0; @@ -1248,7 +1265,7 @@ public bool Hexstia_eff() if (linked_card != null && linked_card.IsCode(CardId.Hexstia)) { int next_seq = get_Hexstia_linkzone(this_seq); - if (next_seq != -1 && Bot.MonsterZone[next_seq] != null && isAltergeist(Bot.MonsterZone[next_seq].Id)) return false; + if (next_seq != -1 && Bot.MonsterZone[next_seq] != null && isAltergeist(Bot.MonsterZone[next_seq])) return false; } } return true; @@ -1675,7 +1692,7 @@ public bool Protocol_negate() if (target.IsCode(CardId.Hexstia)) { int next_index = get_Hexstia_linkzone(i); - if (next_index != -1 && Bot.MonsterZone[next_index] != null && Bot.MonsterZone[next_index].IsFaceup() && isAltergeist(Bot.MonsterZone[next_index].Id)) continue; + if (next_index != -1 && Bot.MonsterZone[next_index] != null && Bot.MonsterZone[next_index].IsFaceup() && isAltergeist(Bot.MonsterZone[next_index])) continue; } if (!get_linked_by_Hexstia(i)) { @@ -2654,6 +2671,28 @@ public override void OnNewTurn() ss_other_monster = false; Impermanence_list.Clear(); attacked_Meluseek.Clear(); + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + Impermanence_list.Add(4-i); + break; + } + } + } + } + base.OnChaining(player, card); } public bool MonsterRepos() @@ -2740,7 +2779,7 @@ public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, ILis return null; } - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { if (max == 1 && cards[0].Location == CardLocation.Deck && Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(23002292) && Bot.GetRemainingCount(CardId.WakingtheDragon,1) > 0) @@ -2797,7 +2836,8 @@ public override IList OnSelectCard(IList cards, int min, // throw all?? return null; } - return null; + + return base.OnSelectCard(cards, min, max, hint, cancelable); } public override CardPosition OnSelectPosition(int cardId, IList positions) @@ -2810,7 +2850,7 @@ public override CardPosition OnSelectPosition(int cardId, IList po return 0; } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (player == 0) { @@ -2853,16 +2893,16 @@ public override int OnSelectPlace(long cardId, int player, CardLocation location if (cardId == CardId.Hexstia) { // ex zone - if ((Zones.z5 & available) > 0 && Bot.MonsterZone[1] != null && isAltergeist(Bot.MonsterZone[1].Id)) return Zones.z5; - if ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] != null && isAltergeist(Bot.MonsterZone[3].Id)) return Zones.z6; - if ( ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] != null && !isAltergeist(Bot.MonsterZone[3].Id)) + if ((Zones.z5 & available) > 0 && Bot.MonsterZone[1] != null && isAltergeist(Bot.MonsterZone[1])) return Zones.z5; + if ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] != null && isAltergeist(Bot.MonsterZone[3])) return Zones.z6; + if ( ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] != null && !isAltergeist(Bot.MonsterZone[3])) || ((Zones.z5 & available) > 0 && Bot.MonsterZone[1] == null) ) return Zones.z5; - if (((Zones.z5 & available) > 0 && Bot.MonsterZone[1] != null && !isAltergeist(Bot.MonsterZone[1].Id)) + if (((Zones.z5 & available) > 0 && Bot.MonsterZone[1] != null && !isAltergeist(Bot.MonsterZone[1])) || ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] == null)) return Zones.z6; // main zone for (int i = 1; i < 5; ++i) { - if (Bot.MonsterZone[i] != null && isAltergeist(Bot.MonsterZone[i].Id)) + if (Bot.MonsterZone[i] != null && isAltergeist(Bot.MonsterZone[i])) { if ((available & (int)System.Math.Pow(2, i - 1)) > 0) return (int)System.Math.Pow(2, i - 1); } @@ -2876,5 +2916,15 @@ public override int OnSelectPlace(long cardId, int player, CardLocation location } return base.OnSelectPlace(cardId, player, location, available); } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + AI.SelectPlace(SelectSTPlace(Card, true)); + return true; + } + return false; + } } -} +} \ No newline at end of file diff --git a/Game/AI/Decks/ApophisExecutor.cs b/Game/AI/Decks/ApophisExecutor.cs new file mode 100644 index 000000000..5c4ca8a7c --- /dev/null +++ b/Game/AI/Decks/ApophisExecutor.cs @@ -0,0 +1,3076 @@ +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using System; +using System.Linq; +using System.Diagnostics; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Apophis", "AI_Apophis")] + public class ApophisExecutor : DefaultExecutor + { + public class CardId + { + public const int LabradoriteDragon = 62514770; + public const int AnubisTheLastJudge = 60411677; + public const int PrimiteDragonEtherBeryl = 63198739; + public const int TheManWithTheMark = 97522863; + // PotOfExtravagance = 49238328; + public const int Terraforming = 73628505; + public const int PrimiteDrillbeam = 29095457; + public const int PrimiteLordlyLode = 56506740; + public const int TreasuresOfTheKings = 69299029; + public const int DominusSpark = 6325660; + // InfiniteImpermanence = 10045474; + public const int DominusImpulse = 40366667; + public const int SongsOfTheDominators = 58053438; + public const int DominusPurge = 97045737; + public const int ApophisTheSwampDeity = 85888377; + public const int ApophisTheSerpent = 95561146; + public const int VerdictOfAnubis = 59576447; + public const int SolemnReport = 78114463; + public const int DivineSerpentApophis = 97800311; + public const int SwordsoulSupremeSovereignChengying = 96633955; + public const int BaronneDeFleur = 84815190; + public const int SuperdreadnoughtRailCannonJuggernautLiebe = 26096328; + public const int SuperdreadnoughtRailCannonFlyingLauncher = 38354018; + public const int EvilswarmExcitonKnight = 46772449; + public const int SPLittleKnight = 46772449; + public const int SilhouhatteRabbit = 1528054; + public const int LinkSpider = 98978921; + } + + public ApophisExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // counter + AddExecutor(ExecutorType.Activate, CardId.SolemnReport, SolemnReportBanishActivate); + AddExecutor(ExecutorType.Activate, CardId.ApophisTheSwampDeity, ApophisTheSwampDeityActivate); + AddExecutor(ExecutorType.Activate, CardId.SongsOfTheDominators, SongsOfTheDominatorsActivateFirst); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.SongsOfTheDominators, DominusNegateTrapActivate); + AddExecutor(ExecutorType.Activate, CardId.DominusPurge, DominusNegateTrapActivate); + AddExecutor(ExecutorType.Activate, CardId.DominusImpulse, DominusNegateTrapActivate); + AddExecutor(ExecutorType.Activate, CardId.BaronneDeFleur, BaronneDeFleurNegateEffect); + AddExecutor(ExecutorType.Activate, CardId.PrimiteDrillbeam, PrimiteDrillbeamActivate); + AddExecutor(ExecutorType.Activate, CardId.VerdictOfAnubis, SpellNegateActivate); + AddExecutor(ExecutorType.Activate, CardId.SolemnReport, SpellNegateActivate); + AddExecutor(ExecutorType.Activate, CardId.SPLittleKnight, SPLittleKnightActivate); + AddExecutor(ExecutorType.Activate, CardId.DominusSpark, DominusSparkActivate); + + // first in main phase + AddExecutor(ExecutorType.Activate, _CardId.PotOfExtravagance, PotOfExtravaganceActivate); + AddExecutor(ExecutorType.Repos, MonstetReposForImportantMonsters); + + // startup effect + AddExecutor(ExecutorType.Activate, CardId.BaronneDeFleur, BaronneDeFleurActivate); + AddExecutor(ExecutorType.Activate, CardId.SuperdreadnoughtRailCannonJuggernautLiebe, SuperdreadnoughtRailCannonJuggernautLiebeActivate); + AddExecutor(ExecutorType.Activate, CardId.SuperdreadnoughtRailCannonFlyingLauncher, SuperdreadnoughtRailCannonFlyingLauncherActivate); + AddExecutor(ExecutorType.Activate, CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect); + AddExecutor(ExecutorType.SpellSet, SpellSetFirst); + AddExecutor(ExecutorType.Activate, CardId.SilhouhatteRabbit, SilhouhatteRabbitActivate); + AddExecutor(ExecutorType.Activate, CardId.DivineSerpentApophis, DivineSerpentApophisActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulSupremeSovereignChengying, SwordsoulSupremeSovereignChengyingActivate); + AddExecutor(ExecutorType.Activate, CardId.TheManWithTheMark, TheManWithTheMarkActivate); + + // spsummon + AddExecutor(ExecutorType.SpSummon, CardId.EvilswarmExcitonKnight, EvilswarmExcitonKnightSummon); + AddExecutor(ExecutorType.SpSummon, CardId.AnubisTheLastJudge, AnubisTheLastJudgeSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SuperdreadnoughtRailCannonJuggernautLiebe, SuperdreadnoughtRailCannonJuggernautLiebeSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SuperdreadnoughtRailCannonFlyingLauncher, SuperdreadnoughtRailCannonFlyingLauncherSpSummon); + AddExecutor(ExecutorType.SpSummon, Level10SynchroSummon); + AddExecutor(ExecutorType.SpSummon, CardId.DivineSerpentApophis, DivineSerpentApophisSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.LinkSpider, LinkSpiderSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SPLittleKnight, SPLittleKnightSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SilhouhatteRabbit, SilhouhatteRabbitSummon); + AddExecutor(ExecutorType.Activate, CardId.ApophisTheSerpent, ApophisTheSerpentActivate); + + // search + AddExecutor(ExecutorType.Activate, CardId.Terraforming, TerraformingActivate); + AddExecutor(ExecutorType.Activate, CardId.TreasuresOfTheKings, TreasuresOfTheKingsActivate); + AddExecutor(ExecutorType.Activate, CardId.PrimiteLordlyLode, PrimiteLordlyLodeActivate); + AddExecutor(ExecutorType.Summon, Level4MonsterSummon); + AddExecutor(ExecutorType.Activate, CardId.AnubisTheLastJudge, AnubisTheLastJudgeActivate); + AddExecutor(ExecutorType.Activate, CardId.PrimiteDragonEtherBeryl, PrimiteDragonEtherBerylActivate); + AddExecutor(ExecutorType.Activate, CardId.PrimiteLordlyLode, PrimiteLordlyLodeSpSummon); + AddExecutor(ExecutorType.Activate, CardId.ApophisTheSwampDeity, ApophisTheSwampDeityActivateForAttack); + + // next turn prepare + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.SpellSet, SpellSet); + } + + List NotToNegateIdList = new List + { + 58699500, 20343502, 25451383, 19403423 + }; + List solemnReportBanishIdList = new List { + _CardId.MysticalSpaceTyphoon, 63166095, 9726840, 5380979, 92714517, 6153210, 32548318, 30271097, 45171524, 81560239 + }; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.TheManWithTheMark, CardId.PrimiteLordlyLode, CardId.TreasuresOfTheKings, CardId.DominusSpark, + _CardId.InfiniteImpermanence, CardId.SongsOfTheDominators, CardId.DominusPurge, CardId.ApophisTheSerpent}}, + {2, new List { CardId.AnubisTheLastJudge, CardId.PrimiteDragonEtherBeryl, _CardId.PotOfExtravagance, CardId.DominusImpulse, + CardId.ApophisTheSwampDeity, CardId.SolemnReport}}, + {1, new List { CardId.LabradoriteDragon, CardId.Terraforming, CardId.PrimiteDrillbeam, CardId.VerdictOfAnubis }} + }; + const int hintTimingMainEnd = 0x4; + const int hintToHand = 0x200000; + + int maxSummonCount = 1; + int summonCount = 1; + bool enemyActivateMonsterEffectFromHandGrave = false; + int dimensionShifterCount = 0; + int songsOfTheDominatorsResolvedCount = 0; + bool activatingLodeSpSummonEffect = false; + bool lodeSpSummonEffectResolved = false; + bool songsOfTheDominatorsActivatedFromHand = false; + List currentNegateCardList = new List(); + List activatedCardIdList = new List(); + List enemyPlaceThisTurn = new List(); + List summonThisTurn = new List(); + List placedThisTurn = new List(); + List activatedDivineSerpent1stList = new List(); + List activatedDivineSerpent2ndList = new List(); + + int anubisTheLastJudgeSpSummoningStep = 0; + int SPLittleKnightRemoveStep = 0; + int currentSummoningCount = 0; + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 && card.IsShouldNotBeSpellTrapTarget() + && !card.IsDisabled()) return false; + } + return true; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + public int CheckRemainInDeck(params int[] ids) + { + int sum = 0; + foreach (int id in ids) + { + sum += CheckRemainInDeck(id); + } + return sum; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0, bool ignore41 = false) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= (type & CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (type & (CardType.Spell | CardType.Trap)) != 0; + bool isCounter = (type & CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck) + { + if (CheckSpellWillBeNegate(isCounter)) return true; + if (DefaultCheckWhetherSpellActivateWillBeNegated(Card)) return true; + } + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && ((type & CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card, ignore41)) || Bot.MonsterZone.Any(card => CheckNumber41(card, ignore41))) return true; + } + if (Enemy.HasInSpellZone(_CardId.SkillDrain, true, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card, bool ignoreSelf41 = false) + { + return card != null && card.IsFaceup() && card.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled() + && (!ignoreSelf41 || card.Controller == 0); + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(_CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true)) return true; + if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Bot.HasInSpellZone(_CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(_CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(_CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(_CardId.RoyalDecreel, true) || Bot.HasInSpellZone(_CardId.RoyalDecreel, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceNegatedColumns.Contains(selfSeq)) return true; + } + // how to get here? + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + return CheckCardShouldNegate(lastcard); + } + + public bool CheckCardShouldNegate(ClientCard card) + { + if (card == null) return false; + if (card.IsMonster() && card.HasSetcode(_Setcode.TimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (NotToNegateIdList.Contains(card.Id)) return false; + if (card.HasSetcode(_Setcode.Danger) && card.Location == CardLocation.Hand) return false; + if (card.IsMonster() && card.Location == CardLocation.MonsterZone && card.HasPosition(CardPosition.Defence)) + { + if (Enemy.MonsterZone.Any(c => CheckNumber41(c)) || Bot.MonsterZone.Any(c => CheckNumber41(c))) return false; + } + if (DefaultCheckWhetherCardIsNegated(card)) return false; + if (card.Location == CardLocation.SpellZone) + { + int sequence = card.Sequence; + if (card.Controller == 1) sequence = 4 - sequence; + if (infiniteImpermanenceNegatedColumns.Contains(sequence)) return false; + } + if (card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus, _CardId.MaxxC)) return false; + if (card.IsDisabled()) return false; + + return true; + } + + public bool CheckCardShouldNegate(ChainInfo chainInfo) + { + if (chainInfo == null) return false; + ClientCard card = chainInfo.RelatedCard; + + if (card == null) return false; + if (card.IsMonster() && card.HasSetcode(_Setcode.TimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (NotToNegateIdList.Contains(card.Id)) return false; + if (card.HasSetcode(_Setcode.Danger) && card.Location == CardLocation.Hand) return false; + if (card.IsMonster() && chainInfo.HasLocation(CardLocation.MonsterZone) && chainInfo.HasPosition(CardPosition.Defence)) + { + if (Enemy.MonsterZone.Any(c => CheckNumber41(c)) || Bot.MonsterZone.Any(c => CheckNumber41(c))) return false; + } + if (DefaultCheckWhetherCardIsNegated(card)) return false; + if (Duel.Player == 1 && card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus)) return false; + if (card.IsDisabled()) return false; + + return true; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && (Duel.Player == 0 || Bot.GetMonsterCount() > 0)) return true; + return false; + } + + public bool CheckShouldNoMoreSpSummon() + { + if (CheckAtAdvantage() && enemyResolvedEffectIdList.Contains(_CardId.MaxxC) && DefaultCheckWhetherEnemyCanDraw() && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2)) + { + return true; + } + return false; + } + + public bool CheckShouldNoMoreSpSummon(CardLocation loc) + { + if (CheckShouldNoMoreSpSummon()) return true; + if (!DefaultCheckWhetherEnemyCanDraw() || (Duel.Turn > 1 && Duel.Phase < DuelPhase.Main2)) return false; + if (enemyResolvedEffectIdList.Contains(_CardId.MulcharmyPurulia) && (loc & CardLocation.Hand) != 0) return true; + if (enemyResolvedEffectIdList.Contains(_CardId.MulcharmyFuwalos) && (loc & (CardLocation.Deck | CardLocation.Extra)) != 0) return true; + if (enemyResolvedEffectIdList.Contains(_CardId.MulcharmyNyalus) && (loc & (CardLocation.Grave | CardLocation.Removed)) != 0) return true; + + return false; + } + + public bool CheckWhetherCanSummon() + { + return Duel.Player == 0 && Duel.Phase < DuelPhase.End && summonCount > 0; + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { _CardId.BanisheroftheRadiance, _CardId.BanisheroftheLight, _CardId.MacroCosmos, _CardId.DimensionalFissure, + _CardId.KashtiraAriseHeart, _CardId.MaskedHERODarkLaw }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true, false, true) || cf.HasInSpellZone(cardid, true, true)) + { + return true; + } + } + } + return false; + } + + public bool CheckWhetherCanActivateMonsterEffect(CardAttribute attribute) + { + if (Bot.HintDescriptions.Contains(Util.GetStringId(CardId.DominusSpark, 3)) + && (attribute & (CardAttribute.Earth | CardAttribute.Water | CardAttribute.Fire | CardAttribute.Wind)) != 0) + { + return false; + } + if (Bot.HintDescriptions.Contains(Util.GetStringId(CardId.DominusImpulse, 2)) + && (attribute & (CardAttribute.Light | CardAttribute.Earth | CardAttribute.Wind)) != 0) + { + return false; + } + if (Bot.HintDescriptions.Contains(Util.GetStringId(CardId.DominusPurge, 2)) + && (attribute & (CardAttribute.Dark | CardAttribute.Water | CardAttribute.Fire)) != 0) + { + return false; + } + return true; + } + + public int CompareUsableAttack(ClientCard cardA, ClientCard cardB) + { + if (cardA == null && cardB == null) + return 0; + if (cardA == null) + return -1; + if (cardB == null) + return 1; + int powerA = (cardA.IsDefense() && summonThisTurn.Contains(cardA)) ? 0 : cardA.Attack; + int powerB = (cardB.IsDefense() && summonThisTurn.Contains(cardB)) ? 0 : cardB.Attack; + if (powerA < powerB) + return -1; + if (powerA == powerB) + return CardContainer.CompareCardLevel(cardA, cardB); + return 1; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = true, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + ClientCard activatingAlbaz = Enemy.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(68468459) && !c.IsDisabled() + && !currentNegateCardList.Contains(c) && Duel.CurrentChain.Contains(c)); + if (activatingAlbaz != null) return activatingAlbaz; + + if (attack >= 0) + { + if (attack == 0) + attack = GetBotBestPower(); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentNegateCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentNegateCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentNegateCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentNegateCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentNegateCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentNegateCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType) + ) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentNegateCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = true, CardType selfType = 0, bool forNegate = false) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card)) + && (!forNegate || (!card.IsDisabled() && card.HasType(CardType.Effect))) + ).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card) && card.IsFacedown()).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card) && card.IsFacedown()).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() + && (!ignoreCurrentDestroy || !currentNegateCardList.Contains(card)) + && (!forNegate || (!card.IsDisabled() && card.HasType(CardType.Effect) && card.IsFaceup())) + ).ToList())); + + return targetList; + } + + public List GetNormalEnemySpellTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = true, CardType selfType = 0, bool forNegate = false) + { + List targetList = GetNormalEnemyTargetList(canBeTarget, ignoreCurrentDestroy, selfType, forNegate); + return targetList.Where(card => card.HasType(CardType.Spell | CardType.Trap) || card.Location == CardLocation.SpellZone).ToList(); + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + if (chainingCard.HasPosition(CardPosition.Defence)) + { + bool have41 = Bot.MonsterZone.Any(c => CheckNumber41(c)) | Enemy.MonsterZone.Any(c => CheckNumber41(c)); + } + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public int GetSpecialSummonDrawCount(CardLocation loc) + { + int res = 0; + if (!DefaultCheckWhetherEnemyCanDraw()) + { + return 0; + } + if (enemyResolvedEffectIdList.Contains(_CardId.MaxxC)) + { + res++; + } + + if ((loc & CardLocation.Hand) != 0) + { + res += enemyResolvedEffectIdList.Count(id => id == _CardId.MulcharmyPurulia); + } + if ((loc & (CardLocation.Deck | CardLocation.Extra)) != 0) + { + res += enemyResolvedEffectIdList.Count(id => id == _CardId.MulcharmyFuwalos); + } + if ((loc & (CardLocation.Grave | CardLocation.Removed)) != 0) + { + res += enemyResolvedEffectIdList.Count(id => id == _CardId.MulcharmyNyalus); + } + + return res; + } + + public int GetBotBestPower(bool onlyATK = false) + { + return Bot.MonsterZone.GetMonsters() + .Where(card => !onlyATK || (!summonThisTurn.Contains(card) && Duel.Player == 0) || card.IsAttack()) + .Max(card => (int?)card.GetDefensePower()) ?? -1; + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain == null) { + if (anubisTheLastJudgeSpSummoningStep > 0) { + List cardIdList = new List { + CardId.VerdictOfAnubis, CardId.ApophisTheSwampDeity, CardId.SongsOfTheDominators, CardId.DominusSpark, CardId.DominusImpulse, + CardId.ApophisTheSerpent, CardId.DominusPurge, _CardId.InfiniteImpermanence, CardId.SolemnReport }; + foreach (int cardId in cardIdList) { + ClientCard card = cards.FirstOrDefault(c => c.IsCode(cardId)); + if (card != null) { + if (anubisTheLastJudgeSpSummoningStep == 1) + { + anubisTheLastJudgeSpSummoningStep = 2; + } else + { + anubisTheLastJudgeSpSummoningStep = 0; + } + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + } + + // for activating target + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.Controller == 0) + { + switch (lastChainCard.Id) + { + case CardId.AnubisTheLastJudge: + { + List targetList = GetNormalEnemyTargetList(canBeTarget: true, ignoreCurrentDestroy: true, selfType: CardType.Monster, forNegate: false); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // destroy set this turn + foreach (ClientCard target in cards) + { + if (enemyPlaceThisTurn.Contains(target)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.PrimiteDrillbeam: + { + // negate cards on chain + foreach (ClientCard card in Duel.CurrentChain) { + if (card.Controller == 1 && card.IsOnField() && card.IsFaceup() && !card.IsDisabled() && !currentNegateCardList.Contains(card) + && CheckCanBeTargeted(card, true, CardType.Spell) && CheckCardShouldNegate(card) && cards.Contains(card)) { + currentNegateCardList.Add(card); + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + // remove problematic enemy cards + List targetList = GetNormalEnemyTargetList(canBeTarget: true, ignoreCurrentDestroy: true, selfType: CardType.Monster, forNegate: false); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // select enemy cards + List enemyCards = ShuffleList(cards.Where(c => c.Controller == 1).ToList()); + foreach (ClientCard target in enemyCards) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.DominusSpark: + { + List targetList = GetNormalEnemyTargetList(ignoreCurrentDestroy: false); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case _CardId.InfiniteImpermanence: + { + int sequence = lastChainCard.Sequence; + List targetList = GetMonsterListForTargetNegate(true, CardType.Trap); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + if (sequence >= 0) + { + ClientCard spell = Enemy.SpellZone[sequence]; + if (spell != null && spell.IsFaceup()) + { + currentNegateCardList.Add(spell); + } + } + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + targetList = GetProblematicEnemyCardList(canBeTarget: true, ignoreSpells: false, selfType: CardType.Trap); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + if (sequence >= 0) + { + ClientCard spell = Enemy.SpellZone[sequence]; + if (spell != null && spell.IsFaceup()) + { + currentNegateCardList.Add(spell); + } + } + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.DivineSerpentApophis: + { + if (hint == HintMsg.Destroy) + { + List targetList = GetNormalEnemyTargetList(); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + if (hint == HintMsg.Set) + { + int targetId = CardId.ApophisTheSwampDeity; + // if no other continuous trap can be found, then use ApophisTheSerpent + bool hasOtherContinuousTrap = false; + if (Bot.GetSpellCountWithoutField() <= 3 && Bot.HasInGraveyard(CardId.ApophisTheSerpent)) + { + hasOtherContinuousTrap = true; + } + if (Bot.GetSpells().Any(c => c.HasType(CardType.Continuous)) || Bot.GetMonsters().Any(c => c.HasType(CardType.Continuous))) + { + hasOtherContinuousTrap = true; + } + if (!hasOtherContinuousTrap) + { + targetId = CardId.ApophisTheSerpent; + } + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + // select remaining cards + return Util.CheckSelectCount(cards, cards, min, max); + } + break; + } + case CardId.BaronneDeFleur: + { + if (hint == HintMsg.Destroy) + { + List targetList = GetNormalEnemyTargetList(); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + } + case CardId.SuperdreadnoughtRailCannonFlyingLauncher: + { + List targetList = GetNormalEnemySpellTargetList(true, false, CardType.Monster); + if (hint == HintMsg.RemoveXyz) + { + return Util.CheckSelectCount(cards, cards, min, Math.Min(targetList.Count, max)); + } + if (hint == HintMsg.Destroy) + { + List destroyList = new List(); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + destroyList.Add(target); + if (destroyList.Count >= max) + { + currentNegateCardList.AddRange(destroyList); + return Util.CheckSelectCount(destroyList, cards, min, Math.Min(targetList.Count, max)); + } + } + } + } + break; + } + case CardId.SPLittleKnight: + { + if (Duel.CurrentChainInfo.Count > 0) + { + ChainInfo lastChain = Duel.CurrentChainInfo[Duel.CurrentChainInfo.Count - 1]; + if (lastChain.ActivateDescription == -1 || lastChain.ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 0)) + { + // remove enemy cards + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + foreach (ClientCard target in problemCardList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } else if (lastChain.ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 1)) + { + switch (SPLittleKnightRemoveStep) + { + case 1: + // remove target + foreach (ClientCard target in Bot.GetMonsters()) + { + if (target.HasType(CardType.Continuous)) + { + continue; + } + if (Duel.ChainTargets.Contains(target) && cards.Contains(target)) + { + SPLittleKnightRemoveStep = 2; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // remove weak monster + if (Duel.Player == 1) + { + foreach (ClientCard card in Bot.GetMonsters().Where(c => c.IsAttack() && !c.HasType(CardType.Continuous) && !c.IsCode(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity })).OrderBy(c => c.Attack)) + { + if (Util.IsOneEnemyBetterThanValue(card.Attack, true) && cards.Contains(card)) + { + SPLittleKnightRemoveStep = 2; + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + } + break; + case 2: + { + // select problematic enemy monster + if (Enemy.GetMonsterCount() > 0) + { + List problemList = GetProblematicEnemyCardList(true, true, CardType.Monster); + if (problemList.Count() > 0) + { + foreach (ClientCard target in problemList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + SPLittleKnightRemoveStep = 0; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + // remove bot's target + foreach (ClientCard target in Duel.ChainTargets) + { + if (target.IsCode(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity })) + { + continue; + } + if (cards.Contains(target)) + { + SPLittleKnightRemoveStep = 0; + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // remove bot's monster + if (Enemy.GetMonsterCount() == 0) + { + List otherOwn = Bot.GetMonsters().Where(c => !c.HasType(CardType.Continuous)).ToList(); + otherOwn.Sort(CompareUsableAttack); + foreach (ClientCard c in otherOwn) + { + if (cards.Contains(c)) + { + SPLittleKnightRemoveStep = 0; + return Util.CheckSelectCount(new List { c }, cards, min, max); + } + } + } + } + break; + default: + SPLittleKnightRemoveStep = 0; + break; + } + } + } + break; + } + case CardId.SilhouhatteRabbit: + { + if (hint == HintMsg.Destroy) + { + List targetList = GetNormalEnemySpellTargetList(true, false, CardType.Monster, false); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentNegateCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + } + default: + break; + } + } + } + + if (currentChain != null) + { + if (currentChain.ActivateController == 0) + { + // for solving chain + switch (currentChain.ActivateId) + { + case CardId.PrimiteDragonEtherBeryl: + if (hint == HintMsg.Set) + { + int targetId = CardId.PrimiteLordlyLode; + if (activatedCardIdList.Contains(CardId.PrimiteLordlyLode) || !DefaultCheckWhetherBotCanSearch() || Bot.HasInSpellZone(CardId.PrimiteLordlyLode)) + { + targetId = CardId.PrimiteDrillbeam; + } + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + case CardId.TheManWithTheMark: + if (hint == HintMsg.OperateCard) + { + int targetId = CardId.TreasuresOfTheKings; + if (activatedCardIdList.Contains(CardId.TreasuresOfTheKings) || Bot.HasInHandOrInSpellZone(CardId.TreasuresOfTheKings)) + { + targetId = CardId.VerdictOfAnubis; + } + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + case CardId.TreasuresOfTheKings: + { + List targetIdList = new List(); + if (hint == HintMsg.Set) + { + targetIdList.AddRange(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }); + } else if (hint == HintMsg.AddToHand) { + if (songsOfTheDominatorsResolvedCount > 0) + { + targetIdList.AddRange(new List { CardId.TheManWithTheMark, CardId.AnubisTheLastJudge }); + } else + { + targetIdList.AddRange(new List { CardId.AnubisTheLastJudge, CardId.TheManWithTheMark }); + } + } + foreach (int targetId in targetIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.PrimiteLordlyLode: + { + if (hint == HintMsg.AddToHand) + { + List targetIdList = new List { CardId.PrimiteDragonEtherBeryl, CardId.PrimiteDrillbeam }; + if (summonCount == 0 || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth)) + { + // whether need to search drillbeam + bool canTriggerPrimiteBeam = Bot.Hand.Any(c => c.IsCode(CardId.PrimiteDragonEtherBeryl, CardId.PrimiteLordlyLode, CardId.LabradoriteDragon)); + canTriggerPrimiteBeam |= Bot.HasInMonstersZone(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity, CardId.LabradoriteDragon }, faceUp: true); + canTriggerPrimiteBeam |= Bot.GetSpells().Any(c => c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) && (c.IsFacedown() || Duel.CurrentChain.Contains(c))); + if (canTriggerPrimiteBeam) + { + targetIdList.Insert(0, CardId.PrimiteDrillbeam); + } + } + foreach (int targetId in targetIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + break; + } + case CardId.SongsOfTheDominators: + { + List checkIdList = new List { CardId.DominusPurge, CardId.DominusImpulse, CardId.DominusSpark }; + // 1. Prefer a card NOT in activatedCardIdList and not in hand / spell&trap of bot + foreach (int checkId in checkIdList) + { + if (!activatedCardIdList.Contains(checkId) && !Bot.HasInHandOrInSpellZone(checkId) && !Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(checkId))) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + // 2. Next, prefer a card not in hand/spell&trap + foreach (int checkId in checkIdList) + { + if (!Bot.HasInHandOrInSpellZone(checkId)) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + // 3. Finally, pick by id order if any exists + foreach (int checkId in checkIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + case CardId.ApophisTheSwampDeity: + { + List negateCardList = new List(); + // select cards to negate + for (int i = Duel.CurrentChain.Count - 1; i >= 0; i--) + { + ClientCard card = Duel.CurrentChain[i]; + if (card != null && card.IsFaceup() && cards.Contains(card)) + { + negateCardList.Add(card); + } + } + // negate other face-up cards + foreach (ClientCard card in cards) + { + if (card != null && card.IsFaceup() && !negateCardList.Contains(card)) + { + negateCardList.Add(card); + } + } + return Util.CheckSelectCount(negateCardList, cards, min, max); + } + case CardId.SwordsoulSupremeSovereignChengying: + { + List fieldTargetList = GetNormalEnemyTargetList(false); + foreach (ClientCard target in fieldTargetList) + { + if (cards.Contains(target)) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + // banish fron grave + List graveTargetList = Duel.CurrentChain.Where(c => c != null && c.Controller == 1 && c.Location == CardLocation.Grave).ToList(); + graveTargetList.AddRange(Duel.ChainTargets.Where(c => c != null && c.Controller == 1 && c.Location == CardLocation.Grave).ToList()); + graveTargetList.AddRange(Enemy.Graveyard.Where(c => c.IsMonster()).OrderByDescending(c => c.Attack).ToList()); + return Util.CheckSelectCount(graveTargetList, cards, min, max); + } + case CardId.SilhouhatteRabbit: + { + List targetIdList = new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }; + foreach (int targetId in targetIdList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + break; + } + default: + break; + } + } + if (currentChain.ActivateController == 1) + { + switch (currentChain.ActivateId) + { + case _CardId.EvenlyMatched: + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + // monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List dumpMainMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && CheckRemainInDeck(card.Id) > 0).ToList(); + dumpMainMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpMainMonsterList); + // spells + List faceUpSpells = Bot.GetSpells().Where(c => c.IsFaceup()).ToList(); + banishList.AddRange(ShuffleList(faceUpSpells)); + // other monster + List otherMonsters = botMonsters.Where(card => !banishList.Contains(card)).ToList(); + otherMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(otherMonsters); + List faceDownSpells = Bot.GetSpells().Where(c => c.IsFacedown()).ToList(); + banishList.AddRange(ShuffleList(faceDownSpells)); + return Util.CheckSelectCount(banishList, cards, min, max); + } + default: + break; + } + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override bool OnSelectHand() + { + return true; + } + + public override int OnSelectOption(IList options) + { + if (options.Contains(Util.GetStringId(_CardId.PotOfExtravagance, 1))) + { + return options.IndexOf(Util.GetStringId(_CardId.PotOfExtravagance, 1)); + } + if (options.Contains(Util.GetStringId(CardId.SolemnReport, 1)) && options.Contains(Util.GetStringId(CardId.SolemnReport, 2))) + { + int destroyOpt = options.IndexOf(Util.GetStringId(CardId.SolemnReport, 1)); + int banishOpt = options.IndexOf(Util.GetStringId(CardId.SolemnReport, 2)); + bool avoidDestroyFlag = false; + if (Duel.CurrentChain.Count >= 2) + { + ClientCard secondLastChainCard = Duel.CurrentChain[Duel.CurrentChain.Count - 2]; + if (secondLastChainCard != null) + { + // avoid destroy if bot have the same cards that can activate + switch (secondLastChainCard.Id) + { + case CardId.DominusSpark: + { + bool canActivateFlag = !activatedCardIdList.Contains(CardId.DominusSpark) && !Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(CardId.DominusSpark)); + if (canActivateFlag) + { + canActivateFlag &= Bot.HasInHand(CardId.DominusSpark) && enemyActivateMonsterEffectFromHandGrave + || Bot.GetSpells().Any(c => c.IsCode(CardId.DominusSpark) && !placedThisTurn.Contains(c)); + } + avoidDestroyFlag |= canActivateFlag; + break; + } + case CardId.DominusImpulse: + case CardId.DominusPurge: + { + bool canActivateFlag = !activatedCardIdList.Contains(secondLastChainCard.Id) && !Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(secondLastChainCard.Id)); + if (canActivateFlag) + { + canActivateFlag &= Bot.HasInHand(secondLastChainCard.Id) || Bot.GetSpells().Any(c => c.IsCode(secondLastChainCard.Id) && !placedThisTurn.Contains(c)); + } + avoidDestroyFlag |= canActivateFlag; + break; + } + case CardId.SongsOfTheDominators: + { + bool canActivateFlag = !activatedCardIdList.Contains(secondLastChainCard.Id) && !Duel.CurrentChain.Any(c => c != null && c.Controller == 0 && c.IsCode(secondLastChainCard.Id)); + if (canActivateFlag) + { + canActivateFlag &= Bot.HasInHand(secondLastChainCard.Id) && Bot.Graveyard.Count(c => c.IsMonster()) == 0 + || Bot.GetSpells().Any(c => c.IsCode(secondLastChainCard.Id) && !placedThisTurn.Contains(c)); + } + avoidDestroyFlag |= canActivateFlag; + break; + } + case _CardId.InfiniteImpermanence: + case CardId.ApophisTheSwampDeity: + avoidDestroyFlag |= Bot.GetSpells().Any(c => c.IsCode(secondLastChainCard.Id) && !placedThisTurn.Contains(c)); + break; + case CardId.ApophisTheSerpent: + avoidDestroyFlag |= Bot.GetSpells().Any(c => c.IsCode(secondLastChainCard.Id) && !placedThisTurn.Contains(c)) && !activatedCardIdList.Contains(secondLastChainCard.Id); + break; + } + + if (avoidDestroyFlag) + { + return banishOpt; + } + if (secondLastChainCard.IsCode(solemnReportBanishIdList)) + { + return banishOpt; + } + } + } + + return destroyOpt; + } + + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null) + { + if (currentChain.ActivateController == 0) + { + switch (currentChain.ActivateId) + { + case CardId.TheManWithTheMark: + if (options.Contains(1190)) + { + return options.IndexOf(1190); + } + break; + default: + break; + } + } + } + + return base.OnSelectOption(options); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + List zoneIdList = ShuffleList(new List { 5, 6 }); + zoneIdList.AddRange(ShuffleList(new List { 0, 2, 4 })); + zoneIdList.AddRange(ShuffleList(new List { 1, 3 })); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + List infiniteImpermanenceList = Bot.GetSpells().Where(c => c.IsCode(_CardId.InfiniteImpermanence)).Select(c => c.Sequence).ToList(); + infiniteImpermanenceList.AddRange(infiniteImpermanenceNegatedColumns); + // trap monster do not summon to infinite permanence negated columns + if ((cardId == CardId.ApophisTheSerpent || cardId == CardId.ApophisTheSwampDeity) + && infiniteImpermanenceList.Contains(zoneId)) + { + continue; + } + if (cardId == CardId.ApophisTheSerpent || cardId == CardId.ApophisTheSwampDeity) + { + Logger.DebugWriteLine("Apophis select zone: " + zoneId); + Logger.DebugWriteLine("infiniteImpermanenceNegatedColumns: " + string.Join(", ", infiniteImpermanenceList)); + } + return zone; + } + } + } + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null && currentChain.ActivateController == 0) + { + switch (currentChain.ActivateId) + { + case CardId.TreasuresOfTheKings: + { + List zoneIdList = ShuffleList(new List { 0, 1, 2, 3, 4 }); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + return zone; + } + } + break; + } + case CardId.ApophisTheSerpent: + { + List zoneIdList = ShuffleList(new List { 0, 1, 2, 3, 4 }); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null && !infiniteImpermanenceNegatedColumns.Contains(zoneId)) + { + return zone; + } + } + break; + } + default: + break; + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.PrimiteDrillbeam, 0)) + { + return false; + } + + return base.OnSelectYesNo(desc); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + if (cardId == CardId.SuperdreadnoughtRailCannonJuggernautLiebe && CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth)) + { + cardAttack += 2000; + } + if (cardId == CardId.SwordsoulSupremeSovereignChengying) + { + int removeCount = Bot.Banished.Count() + Enemy.Banished.Count(); + cardAttack += removeCount * 200; + } + int bestBotAttack = Math.Max(GetBotBestPower(true), cardAttack); + + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + dimensionShifterCount = 0; + songsOfTheDominatorsResolvedCount = 0; + // for doom bot + maxSummonCount = 1; + } + + summonCount = maxSummonCount; + enemyActivateMonsterEffectFromHandGrave = false; + anubisTheLastJudgeSpSummoningStep = 0; + SPLittleKnightRemoveStep = 0; + activatingLodeSpSummonEffect = false; + lodeSpSummonEffectResolved = false; + songsOfTheDominatorsActivatedFromHand = false; + if (dimensionShifterCount > 0) dimensionShifterCount--; + if (songsOfTheDominatorsResolvedCount > 0) songsOfTheDominatorsResolvedCount--; + currentNegateCardList.Clear(); + activatedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + summonThisTurn.Clear(); + placedThisTurn.Clear(); + activatedDivineSerpent1stList.Clear(); + activatedDivineSerpent2ndList.Clear(); + currentSummoningCount = 0; + + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + if (player == 1 && card != null && card.IsMonster() && (card.Location == CardLocation.Hand || card.Location == CardLocation.Grave)) + { + enemyActivateMonsterEffectFromHandGrave = true; + } + + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null) + { + if (currentChain.ActivateController == 0) + { + switch (currentChain.ActivateId) + { + case CardId.DominusSpark: + case CardId.DominusImpulse: + case CardId.DominusPurge: + case CardId.SongsOfTheDominators: + activatedCardIdList.Add(currentChain.ActivateId); + break; + case CardId.TreasuresOfTheKings: + if (currentChain.ActivateDescription != Util.GetStringId(CardId.TreasuresOfTheKings, 0)) + { + activatedCardIdList.Add(currentChain.ActivateId); + } + break; + } + } + if (!Duel.IsCurrentSolvingChainNegated()) + { + if (currentChain.ActivateController == 0) + { + switch (currentChain.ActivateId) + { + case CardId.PrimiteLordlyLode: + { + if (activatingLodeSpSummonEffect) + { + lodeSpSummonEffectResolved = true; + } + break; + } + case CardId.SongsOfTheDominators: + { + if (songsOfTheDominatorsActivatedFromHand) + { + songsOfTheDominatorsResolvedCount = 2; + } + break; + } + default: + break; + } + } + if (currentChain.IsActivateCode(_CardId.DimensionShifter)) + dimensionShifterCount = 2; + } + } + + base.OnChainSolved(chainIndex); + } + + public override void OnChainEnd() + { + currentSummoningCount = 0; + currentNegateCardList.Clear(); + activatingLodeSpSummonEffect = false; + songsOfTheDominatorsActivatedFromHand = false; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || !checkTarget.IsOnField()) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + base.OnChainEnd(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (card != null) + { + if (currentControler == 1 && (currentLocation == (int)CardLocation.MonsterZone || currentLocation == (int)CardLocation.SpellZone)) + { + enemyPlaceThisTurn.Add(card); + } + + if (previousControler == 0 && previousLocation == (int)CardLocation.MonsterZone && currentLocation != (int)CardLocation.MonsterZone) + { + if (summonThisTurn.Contains(card)) + summonThisTurn.Remove(card); + if (activatedDivineSerpent1stList.Contains(card)) + activatedDivineSerpent1stList.Remove(card); + if (activatedDivineSerpent2ndList.Contains(card)) + activatedDivineSerpent2ndList.Remove(card); + } + if (currentControler == 0 && currentLocation == (int)CardLocation.MonsterZone) + { + summonThisTurn.Add(card); + } + if (currentControler == 0 && previousLocation == (int)CardLocation.SpellZone && currentLocation != (int)CardLocation.SpellZone && placedThisTurn.Contains(card)) + { + placedThisTurn.Remove(card); + } + if (currentControler == 0 && currentLocation == (int)CardLocation.SpellZone) + { + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null && currentChain.ActivateController == 0 && currentChain.ActivateId == CardId.ApophisTheSerpent && card.IsCode(CardId.ApophisTheSwampDeity)) + { + placedThisTurn.Remove(card); + } else + { + placedThisTurn.Add(card); + } + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + if (card.Location == CardLocation.SpellZone) + { + return; + } + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceNegatedColumns.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool AnubisTheLastJudgeActivate() + { + if (Card.Location == CardLocation.Hand) + { + if (CheckWhetherNegated()) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + // select target on enemy field + List targetList = GetNormalEnemyTargetList(canBeTarget: true, ignoreCurrentDestroy: false, selfType: CardType.Monster, forNegate: false); + if (targetList.Count > 0) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool AnubisTheLastJudgeSpSummon() { + if (CheckShouldNoMoreSpSummon(CardLocation.Grave)) + { + return false; + } + + if (Duel.MainPhase.ActivableCards.Contains(Card)) + { + // whether should activate + if (!CheckWhetherNegated() || !CheckWhetherWillbeRemoved()) + { + return false; + } + } + + anubisTheLastJudgeSpSummoningStep = 1; + return true; + } + + public bool PrimiteDragonEtherBerylActivate() + { + if (Card.Location == CardLocation.Grave) + { + return !CheckWhetherNegated(); + } + // to grave + if (ActivateDescription == Util.GetStringId(CardId.PrimiteDragonEtherBeryl, 1)) + { + if (!Util.IsTurn1OrMain2()) + { + return false; + } + + // summoning Labradorite instead? + bool notCalledLode = !activatedCardIdList.Contains(CardId.PrimiteLordlyLode + 1); + if (notCalledLode) + { + // can summon? + bool enabledLodeFlag = Bot.GetSpells().Any(c => c.IsCode(CardId.PrimiteLordlyLode) && c.IsFaceup() && !c.IsDisabled()); + bool existsLode = Bot.GetSpells().Any(c => c.IsCode(CardId.PrimiteLordlyLode) && c.IsFacedown()); + existsLode = Bot.HasInHand(CardId.PrimiteLordlyLode) && Bot.GetSpellCount() < 5; + enabledLodeFlag |= existsLode && !activatedCardIdList.Contains(CardId.PrimiteLordlyLode); + + if (enabledLodeFlag) + { + return false; + } + } + + // whether can recycle next turn? + List apophisCardIdList = new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }; + bool recycleFlag = Bot.HasInHand(apophisCardIdList) + || Bot.HasInSpellZone(apophisCardIdList) + || Bot.GetMonsters().Any(c => c.IsFaceup() && apophisCardIdList.Contains(c.Id)); + return !CheckWhetherWillbeRemoved() && (!CheckWhetherNegated() || recycleFlag); + } else + { + // search + return !CheckWhetherNegated(); + } + } + + public bool TheManWithTheMarkActivate() + { + return !CheckWhetherNegated() && DefaultCheckWhetherBotCanSearch(); + } + + public bool Level4MonsterSummon() + { + if (!Card.IsCode(CardId.PrimiteDragonEtherBeryl, CardId.TheManWithTheMark)) + { + return false; + } + + bool canSummonDragon = Bot.HasInHand(CardId.PrimiteDragonEtherBeryl); + if (!activatedCardIdList.Contains(CardId.PrimiteLordlyLode) && DefaultCheckWhetherBotCanSearch()) + { + canSummonDragon |= Bot.HasInHand(CardId.PrimiteLordlyLode) && Bot.GetSpellCountWithoutField() < 5; + canSummonDragon |= Bot.GetSpells().Any(c => c.IsCode(CardId.PrimiteLordlyLode) && c.IsFacedown()); + } + if (canSummonDragon) + { + bool summonFlag = false; + // summon to search? + if (!CheckWhetherNegated(true, true) && CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth)) + { + summonFlag |= !activatedCardIdList.Contains(CardId.PrimiteLordlyLode) && !Bot.HasInHandOrInSpellZone(CardId.PrimiteLordlyLode) && CheckRemainInDeck(CardId.PrimiteLordlyLode) > 0; + summonFlag |= CheckRemainInDeck(CardId.PrimiteDrillbeam) > 0; + } + + // summon to recycle beam + if (!Bot.HasInMonstersZone(CardId.PrimiteDragonEtherBeryl, faceUp: true) && !activatedCardIdList.Contains(CardId.PrimiteDrillbeam + 1) + && Bot.HasInGraveyard(CardId.PrimiteDrillbeam) && Bot.GetSpellCountWithoutField() < 5) + { + summonFlag = true; + } + + if (summonFlag && Card.IsCode(CardId.PrimiteDragonEtherBeryl)) + { + summonCount --; + return true; + } + } + + bool canSummonMan = Bot.HasInHand(CardId.TheManWithTheMark); + canSummonMan |= Bot.HasInHand(CardId.AnubisTheLastJudge) && DefaultCheckWhetherBotCanSearch() && CheckRemainInDeck(CardId.TheManWithTheMark) > 0 && !activatedCardIdList.Contains(CardId.AnubisTheLastJudge); + if (Bot.HasInHandOrInSpellZone(CardId.TreasuresOfTheKings) && !activatedCardIdList.Contains(CardId.TreasuresOfTheKings + 1) && DefaultCheckWhetherBotCanSearch() && CheckRemainInDeck(CardId.TheManWithTheMark) > 0) + { + canSummonMan |= Bot.Graveyard.Any(c => c.IsTrap()); + int facedownCardCount = Bot.GetSpells().Count(c => c.IsFacedown()); + facedownCardCount += Bot.GetMonsters().Count(c => c.IsFacedown()); + facedownCardCount += GetCanSetSpells().Count(); + canSummonMan |= facedownCardCount >= 2; + } + if (canSummonMan && Card.IsCode(CardId.TheManWithTheMark)) + { + summonCount --; + return true; + } + + // summon for synchro level 10 monster + if (Bot.ExtraDeck.Any(c => c.HasType(CardType.Synchro) && c.Level == 10)) + { + // have labradorite dragon + bool haveTunerFlag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(CardId.LabradoriteDragon) && c.IsTuner()); + haveTunerFlag |= !activatedCardIdList.Contains(CardId.PrimiteLordlyLode + 1) && Bot.HasInSpellZone(CardId.PrimiteLordlyLode, true, true); + if (haveTunerFlag) + { + summonCount --; + return true; + } + } + + return false; + } + + public bool PotOfExtravaganceActivate() + { + if (CheckWhetherNegated()) return false; + SelectSTPlace(Card, true); + AI.SelectOption(1); + return true; + } + + public bool TerraformingActivate() + { + if (CheckWhetherNegated()) return false; + SelectSTPlace(Card, true); + return true; + } + + public bool PrimiteDrillbeamActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (CheckWhetherNegated()) return false; + + // check whether can active + bool canActivate = Bot.HasInHand(CardId.PrimiteLordlyLode) || Bot.HasInHand(CardId.PrimiteDragonEtherBeryl); + canActivate |= Bot.HasInSpellZone(CardId.ApophisTheSerpent) || Bot.HasInSpellZone(CardId.ApophisTheSwampDeity); + canActivate |= Bot.GetMonsters().Any(c => c.IsFaceup() && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity, CardId.LabradoriteDragon)); + canActivate |= Bot.HasInHand(CardId.ApophisTheSwampDeity) && Bot.GetSpellCountWithoutField() <= 3; + + if (canActivate) { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + // cannot activate + return false; + } + + // negate + if (CheckWhetherNegated(true, true, CardType.Spell)) + { + return false; + } + + bool activateFlag = false; + + // negate problematic enemy card + List problematicEnemyCardList = GetProblematicEnemyCardList(true, false, CardType.Spell); + if (problematicEnemyCardList.Count(c => !c.IsDisabled()) > 0) { + problematicEnemyCardList.RemoveAll(c => currentNegateCardList.Contains(c)); + if (problematicEnemyCardList.Count > 0) { + activateFlag = true; + } + } + + // negate cards on chain + foreach (ClientCard card in Duel.CurrentChain) { + if (card.Controller == 1 && card.IsOnField() && card.IsFaceup() && !card.IsDisabled() && !currentNegateCardList.Contains(card) + && CheckCanBeTargeted(card, true, CardType.Spell) && CheckCardShouldNegate(card)) { + activateFlag = true; + } + } + + // can recycle, so activate it + if (Bot.HasInMonstersZone(CardId.PrimiteDragonEtherBeryl, faceUp: true) && !activatedCardIdList.Contains(CardId.PrimiteDrillbeam + 1) + && (CurrentTiming & hintToHand) == 0) + { + List targetList = GetNormalEnemyTargetList(true, true, CardType.Spell, true); + if (targetList.Count > 0) { + activateFlag = true; + } + } + + // become target + if (DefaultOnBecomeTarget()) { + activateFlag |= Enemy.GetSpells().Any(c => c.IsFaceup() && !c.IsDisabled() && CheckCanBeTargeted(c, true, CardType.Spell)); + activateFlag |= Enemy.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && CheckCanBeTargeted(c, true, CardType.Spell)); + } + + if (Duel.Phase == DuelPhase.BattleStep) + { + // remove problematic enemy monster + ClientCard problematicEnemyMonster = GetProblematicEnemyMonster(0, true, true, CardType.Spell); + if (problematicEnemyMonster != null && !problematicEnemyMonster.IsDisabled()) + { + activateFlag = true; + } + } + + if (activateFlag) + { + activatedCardIdList.Add(Card.Id); + SelectSTPlace(Card, true); + return true; + } + + return false; + } + + public bool PrimiteLordlyLodeActivate() + { + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) + { + return false; + } + + // activate + bool activateFlag = PrimiteLordlyLodeActivateCheck(); + Logger.DebugWriteLine("PrimiteLordlyLodeActivate: " + activateFlag); + if (activateFlag) + { + SelectSTPlace(Card, true); + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool PrimiteLordlyLodeActivateCheck() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + bool activateFlag = false; + if (Bot.HasInHandOrHasInMonstersZone(CardId.PrimiteDragonEtherBeryl) && DefaultCheckWhetherBotCanSearch()) + { + // for search drillbeam + activateFlag |= CheckRemainInDeck(CardId.PrimiteDrillbeam) > 0; + activateFlag |= summonCount <= 0 && Card.Location == CardLocation.SpellZone && Card.IsFacedown(); + } + if (summonCount > 0 && !Bot.HasInHand(CardId.PrimiteDragonEtherBeryl) && CheckRemainInDeck(CardId.PrimiteDragonEtherBeryl) > 0 && DefaultCheckWhetherBotCanSearch()) + { + // for search ether beryl + activateFlag |= Bot.HasInGraveyard(CardId.PrimiteDrillbeam); + activateFlag |= CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) && !CheckWhetherNegated(true, true, CardType.Monster); + } + if (!Bot.HasInSpellZone(CardId.PrimiteLordlyLode, true, true)) + { + // for activate it + activateFlag |= DefaultCheckWhetherBotCanSearch(); + + // for special summon + CardLocation loc; + if (Bot.HasInHand(CardId.LabradoriteDragon)) + { + loc = CardLocation.Hand; + } + else if (CheckRemainInDeck(CardId.LabradoriteDragon) > 0) + { + loc = CardLocation.Deck; + } + else if (Bot.HasInGraveyard(CardId.LabradoriteDragon)) + { + loc = CardLocation.Grave; + } else { + return false; + } + int drawCount = GetSpecialSummonDrawCount(loc); + if (drawCount < 2) + { + activateFlag |= Bot.GetMonsters().Any(c => c.IsFaceup() && c.Level == 4 && !c.HasType(CardType.Xyz | CardType.Link)) + && Bot.ExtraDeck.Any(c => c.IsFaceup() && c.Level == 10 && c.HasType(CardType.Synchro)); + } + } + if (Card.Location == CardLocation.SpellZone && Card.IsFacedown()) + { + activateFlag |= DefaultCheckWhetherBotCanSearch(); + } + return activateFlag; + } + + public bool PrimiteLordlyLodeSpSummon() + { + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) + { + // add activating flag + if (CheckWhetherNegated()) return false; + if (!PrimiteLordlyLodeSpSummonCheck()) return false; + activatingLodeSpSummonEffect = true; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool PrimiteLordlyLodeSpSummonCheck() + { + // special summon + CardLocation loc; + if (Bot.HasInHand(CardId.LabradoriteDragon)) + { + loc = CardLocation.Hand; + } + else if (CheckRemainInDeck(CardId.LabradoriteDragon) > 0) + { + loc = CardLocation.Deck; + } + else if (Bot.HasInGraveyard(CardId.LabradoriteDragon)) + { + loc = CardLocation.Grave; + } else { + return false; + } + int drawCount = GetSpecialSummonDrawCount(loc); + return drawCount < 2; + } + + public bool TreasuresOfTheKingsActivate() + { + if (CheckWhetherNegated()) return false; + + // search + if (ActivateDescription == Util.GetStringId(CardId.TreasuresOfTheKings, 0)) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + // activate + bool activateFlag = false; + if (Bot.GetSpellCountWithoutField() == 5) + { + // for search + if (!DefaultCheckWhetherBotCanSearch() || CheckRemainInDeck(CardId.TheManWithTheMark, CardId.AnubisTheLastJudge) == 0) + { + activateFlag = false; + } + else + { + bool hasOtherSpellTrapInHand = + Bot.Hand.Any(c => (c.IsSpell() || c.IsTrap()) && c != Card); + + bool gyHasTrap = + Bot.Graveyard.Any(c => c.IsTrap()); + + int otherFacedownOnField = + Bot.GetMonsters().Count(m => m.IsFacedown()) + + Bot.GetSpells().Count(s => s.IsFacedown() && s != Card); + + activateFlag = gyHasTrap || hasOtherSpellTrapInHand || otherFacedownOnField >= 2; + } + } + else + { + // for set + if (CheckRemainInDeck(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) > 0) + activateFlag = true; + } + + return activateFlag; + } + + public bool DominusSparkActivate() + { + if (CheckWhetherNegated()) return false; + // activate from field first + if (Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.DominusSpark) && c.IsOnField() && c != Card + && !infiniteImpermanenceNegatedColumns.Contains(c.Sequence))) + { + return false; + } + + bool shouldActivate = false; + // check whether there is a dangerous monster + ClientCard dangerousMonster = GetProblematicEnemyMonster(-1, true, false, CardType.Trap); + shouldActivate |= dangerousMonster != null; + + if (Duel.Phase == DuelPhase.BattleStep && Duel.Player == 1) + { + dangerousMonster = GetProblematicEnemyMonster(0, true, false, CardType.Trap); + shouldActivate |= dangerousMonster != null; + } + + // check whether it is the end phase and there is a monster on the enemy field + if (Duel.Phase == DuelPhase.End && Duel.Player == 1 && Duel.Turn == 1) + { + List endPhaseTargets = GetNormalEnemyTargetList(canBeTarget: true, ignoreCurrentDestroy: true, selfType: CardType.Trap); + shouldActivate |= endPhaseTargets.Any(c => c.IsMonster() && c.IsFaceup()); + } + + shouldActivate |= DefaultOnBecomeTarget() && !CheckWhetherNegated(); + + if (shouldActivate) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = Card.Sequence; + int that_seq = -1; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone) that_seq = LastChainCard.Sequence; + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Trap); + if (shouldNegateList.Count > 0) + { + SelectSTPlace(Card, true); + return true; + } + + return false; + } + + public bool DominusNegateTrapActivate() + { + if (CheckWhetherNegated()) return false; + // activate from field first + if (Duel.MainPhase.ActivableCards.Any(c => c.IsCode(Card.Id) && c.IsOnField() && c != Card + && !infiniteImpermanenceNegatedColumns.Contains(c.Sequence))) + { + return false; + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + if (LastChainCard != null && LastChainCard.Controller == 1 && CheckCardShouldNegate(LastChainCard)) + { + currentNegateCardList.Add(LastChainCard); + SelectSTPlace(Card, true); + if (Card.IsCode(CardId.SongsOfTheDominators) && Card.Location == CardLocation.Hand) + { + songsOfTheDominatorsActivatedFromHand = true; + } + return true; + } + + return false; + } + + public bool SongsOfTheDominatorsActivateFirst() + { + return Bot.Graveyard.Any(c => c.HasType(CardType.Trap)) && DominusNegateTrapActivate(); + } + + public bool ApophisTheSwampDeityActivate() + { + return ApophisTheSwampDeityActivateCheck(1); + } + + public bool ApophisTheSwampDeityActivateForAttack() + { + return ApophisTheSwampDeityActivateCheck(2); + } + + public bool ApophisTheSwampDeityActivateCheck(int activatePriority = 0) + { + if (CheckWhetherNegated()) return false; + if (currentSummoningCount + Bot.GetMonsters().Count(c => c.Sequence < 5) >= 5) return false; + + int canNegateCount = Bot.GetSpells().Count(c => c != Card && + (c.IsCode(CardId.ApophisTheSwampDeity) + || (c.IsCode(CardId.ApophisTheSerpent) && + (c.IsFaceup() || !activatedCardIdList.Contains(CardId.ApophisTheSerpent))))); + canNegateCount += Bot.GetMonsters().Count(c => c.IsCode(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }) && c.IsFaceup()); + + bool shouldActivate = false; + // for negate + if (Duel.CurrentChain.Count > 0 && canNegateCount > 0) + { + // exists cards to negate? + foreach (ClientCard chain in Duel.CurrentChain) + { + if (chain.IsFaceup() && chain.IsOnField() && chain.Controller == 1 && !currentNegateCardList.Contains(chain)) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] Negate card on chain: " + chain.Name); + shouldActivate = true; + break; + } + } + } + + // for summon divine serpent + if (DivineSerpentApophisSpSummonCheck()) { + int newApophisCount = Duel.MainPhase.ActivableCards.Count(c => c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)); + int currentApophisCount = Bot.GetMonsters().Count(c => c.IsFaceup() && + (c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) || (c.IsCode(CardId.DivineSerpentApophis) && activatedDivineSerpent1stList.Contains(c)))); + bool checkResult = currentApophisCount < 2 && currentApophisCount + newApophisCount >= 2; + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] DivineSerpentApophisSpSummonCheck: " + checkResult); + } + shouldActivate |= checkResult; + } + + // for little knight + if (Bot.ExtraDeck.Any(c => c.IsCode(CardId.SPLittleKnight)) && !SPLittleKnightSummonCheck() && SPLittleKnightSummonCheck(true) + && Duel.Player == 0 && Bot.ExtraDeck.Any(c => c.IsCode(CardId.LinkSpider))) + { + bool checkResult = Bot.GetMonsters().Count(c => c.IsFaceup() && c.HasType(CardType.Effect)) == 1; + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] SPSmallKnightSummonCheck: " + checkResult); + } + shouldActivate |= checkResult; + } + + // for triggering divine serpent apophis + if (CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) && !CheckWhetherNegated(true, true, CardType.Monster) + && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && c.IsCode(CardId.DivineSerpentApophis) && !activatedDivineSerpent2ndList.Contains(c))) + { + bool checkResult = GetProblematicEnemyCardList(true, false, CardType.Monster).Count() > 0 + && !Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)) + && !Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.ApophisTheSerpent)); + if ((CurrentTiming & hintTimingMainEnd) != 0 && Duel.Player == 1) + { + checkResult |= GetNormalEnemyTargetList(true, true, CardType.Monster).Count() > 0 + && !Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)) + && !Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.ApophisTheSerpent)); + } + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] DivineSerpentApophisActivate: " + checkResult); + } + shouldActivate |= checkResult; + } + + // for triggering silhouette hat rabbit + if (CheckWhetherCanActivateMonsterEffect(CardAttribute.Light) && !CheckWhetherNegated(true, true, CardType.Monster, true) + && !activatedCardIdList.Contains(CardId.SilhouhatteRabbit + 1) + && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && c.IsCode(CardId.SilhouhatteRabbit))) + { + bool checkResult = GetProblematicEnemyCardList(true, false, CardType.Monster).Count(c => c.HasType(CardType.Spell | CardType.Trap)) > 0 + && !Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)) + && !Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.ApophisTheSerpent)); + if ((CurrentTiming & hintTimingMainEnd) != 0 && Duel.Player == 1) + { + checkResult |= GetNormalEnemySpellTargetList(true, true, CardType.Monster).Count() > 0 + && !Duel.CurrentChain.Any(c => c.Controller == 0 && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)) + && !Duel.MainPhase.ActivableCards.Any(c => c.IsCode(CardId.ApophisTheSerpent)); + } + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] SilhouhatteRabbitSummonCheck: " + checkResult); + } + shouldActivate |= checkResult; + } + + // for triggering primite drillbeam + if (Bot.HasInHandOrInSpellZone(CardId.PrimiteDrillbeam) && !activatedCardIdList.Contains(CardId.PrimiteDrillbeam)) + { + // whether have other cards to trigger primite beam + bool canTriggerPrimiteBeam = Bot.Hand.Any(c => c.IsCode(CardId.PrimiteDragonEtherBeryl, CardId.PrimiteLordlyLode, CardId.LabradoriteDragon)); + canTriggerPrimiteBeam |= Bot.HasInMonstersZone(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity, CardId.LabradoriteDragon }, faceUp: true); + canTriggerPrimiteBeam |= Bot.GetSpells().Any(c => c != Card && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) && (c.IsFacedown() || Duel.CurrentChain.Contains(c))); + + bool checkResult = !canTriggerPrimiteBeam; + if (checkResult) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] PrimiteDrillbeamSummonCheck: " + checkResult); + } + shouldActivate |= !canTriggerPrimiteBeam; + } + + // TODO for other summon + + // for attack + if (Duel.Turn > 1 && Duel.Phase == DuelPhase.Main1 && Enemy.GetMonsterCount() == 0 && Duel.Player == 0 && Duel.CurrentChain.Count == 0 + && activatePriority >= 2) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] Attack: " + true); + shouldActivate |= true; + } + + // for defense + if (Duel.Phase == DuelPhase.Main1 && Bot.GetMonsterCount() == 0 && Enemy.GetMonsters().Sum(c => c.Attack) >= Bot.LifePoints + && (CurrentTiming & hintTimingMainEnd) != 0) + { + Logger.DebugWriteLine("[ApophisTheSwampDeity] Defense: " + true); + shouldActivate |= true; + } + + if (shouldActivate) + { + // mark cards to negate + int negateCount = Bot.GetSpells().Count(c => c != Card && c.IsFaceup() && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + negateCount += Bot.GetMonsters().Count(c => c.IsFaceup() && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + // negate cards on chain fist + if (negateCount > 0) + { + foreach (ClientCard chain in Duel.CurrentChain) + { + if (chain.IsFaceup() && chain.IsOnField() && !currentNegateCardList.Contains(chain) && CheckCardShouldNegate(chain)) + { + negateCount--; + currentNegateCardList.Add(chain); + if (negateCount <= 0) break; + } + } + } + + if (negateCount > 0) + { + // Find negatable enemy spell/trap cards on field that are not yet negated + List negatableSpellsTraps = Enemy.GetSpells().Where(c => + c.IsFaceup() && + !c.IsDisabled() && + !currentNegateCardList.Contains(c) + ).ToList(); + + // Mark negatable spell/trap cards as negated, up to the available count + foreach (ClientCard card in negatableSpellsTraps) + { + currentNegateCardList.Add(card); + negateCount--; + if (negateCount <= 0) break; + } + } + + if (negateCount > 0) + { + // Find negatable enemy monsters on field that are not yet negated + List negatableMonsters = Enemy.GetMonsters().Where(c => + c.IsFaceup() && + !c.IsDisabled() && + !currentNegateCardList.Contains(c) + ).ToList(); + + // Mark negatable monsters as negated, up to the remaining count + foreach (ClientCard card in negatableMonsters) + { + currentNegateCardList.Add(card); + negateCount--; + if (negateCount <= 0) break; + } + } + + currentSummoningCount++; + return true; + } + + return false; + } + + public bool ApophisTheSerpentActivate() + { + if (CheckWhetherNegated()) return false; + if (currentSummoningCount + Bot.GetMonsters().Count(c => c.Sequence < 5) >= 5) return false; + if (Bot.GetSpells().Any(c => c.IsFacedown() && c.IsCode(CardId.ApophisTheSwampDeity) && !infiniteImpermanenceNegatedColumns.Contains(c.Sequence))) + { + if (!(Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2)) + { + return false; + } + } + currentSummoningCount++; + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool SpellNegateActivate() + { + if (CheckWhetherNegated() || Duel.LastChainPlayer != 1) return false; + + ClientCard prevChainCard = Util.GetLastChainCard(); + if (prevChainCard != null && !CheckCardShouldNegate(prevChainCard)) + { + return false; + } + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool SolemnReportBanishActivate() + { + if (SpellNegateActivate()) + { + ClientCard prevChainCard = Util.GetLastChainCard(); + if (prevChainCard != null && prevChainCard.IsCode(solemnReportBanishIdList)) + { + return true; + } + } + return false; + } + + public bool DivineSerpentApophisSpSummonCheck() + { + if (Duel.Player != 0) return false; + bool checkFlag = false; + // recycle + if (CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) && !CheckWhetherNegated(true, true, CardType.Monster) + && Bot.GetSpellCountWithoutField() < 5) + { + checkFlag |= Bot.HasInGraveyard(new List { CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity }); + checkFlag |= !CheckWhetherWillbeRemoved(); + } + + // for attack + checkFlag |= GetBotBestPower(true) <= Util.GetBestPower(Enemy) && Util.GetBestPower(Enemy) < 2800; + + return checkFlag; + } + + public bool DivineSerpentApophisSpSummon() + { + if (!DivineSerpentApophisSpSummonCheck()) return false; + // select material with different name + ClientCard apophisTheSerpent = Bot.GetMonsters().FirstOrDefault(c => c.IsFaceup() && c.IsCode(CardId.ApophisTheSerpent)); + ClientCard apophisTheSwampDeity = Bot.GetMonsters().FirstOrDefault(c => c.IsFaceup() && c.IsCode(CardId.ApophisTheSwampDeity)); + AI.SelectMaterials(new List { apophisTheSerpent, apophisTheSwampDeity }, HintMsg.Release); + return true; + } + + public bool DivineSerpentApophisActivate() + { + if (CheckWhetherNegated()) return false; + if (ActivateDescription == Util.GetStringId(CardId.DivineSerpentApophis, 0)) + { + // set trap + activatedDivineSerpent1stList.Add(Card); + } + else + { + // destroy + List targetList = GetNormalEnemyTargetList(true, false, CardType.Monster); + if (targetList.Count() == 0) + { + return false; + } + activatedDivineSerpent2ndList.Add(Card); + } + return true; + } + + public bool Level10SynchroSummon() + { + if (!Level10SynchroSummonCheck()) return false; + if (!Card.IsCode(new List { CardId.BaronneDeFleur, CardId.SwordsoulSupremeSovereignChengying })) + { + return false; + } + + int decideSummonId = 0; + // select which to summon + if (GetBotBestPower(true) < Util.GetBestPower(Enemy) && Util.GetBestPower(Enemy) > 3000 + && (!CheckWhetherCanActivateMonsterEffect(CardAttribute.Wind) || lodeSpSummonEffectResolved) + && Duel.Phase == DuelPhase.Main1 && Duel.Turn > 1) + { + int banishCount = Bot.Banished.Count() + Enemy.Banished.Count(); + if (3000 + banishCount * 200 >= Util.GetBestPower(Enemy) + && Duel.MainPhase.SummonableCards.Any(c => c.IsCode(CardId.SwordsoulSupremeSovereignChengying)) + && !Card.IsCode(CardId.SwordsoulSupremeSovereignChengying)) + { + return false; + } + decideSummonId = CardId.SwordsoulSupremeSovereignChengying; + } + if (decideSummonId == 0 && CheckWhetherCanActivateMonsterEffect(CardAttribute.Wind) + && Duel.MainPhase.SummonableCards.Any(c => c.IsCode(CardId.BaronneDeFleur)) + && !Card.IsCode(CardId.BaronneDeFleur)) + { + return false; + } + if (decideSummonId == 0 && !CheckWhetherCanActivateMonsterEffect(CardAttribute.Wind) + && Duel.MainPhase.SummonableCards.Any(c => c.IsCode(CardId.SwordsoulSupremeSovereignChengying)) + && !Card.IsCode(CardId.SwordsoulSupremeSovereignChengying)) + { + return false; + } + + ClientCard level4Monster = Bot.GetMonsters().FirstOrDefault(c => c.IsFaceup() && c.Level == 4 && c.IsCode(CardId.PrimiteDragonEtherBeryl)); + + if (level4Monster == null) + { + // find level4 monster with lowest power + level4Monster = Bot.GetMonsters().OrderBy(c => c.GetDefensePower()).FirstOrDefault(c => c.IsFaceup() && c.Level == 4 && !c.HasType(CardType.Xyz | CardType.Link)); + } + if (level4Monster == null) + { + return false; + } + + ClientCard level6Tuner = Bot.GetMonsters().OrderBy(c => c.GetDefensePower()).FirstOrDefault(c => c.IsFaceup() && c.Level == 6 && c.IsTuner()); + if (level6Tuner == null) + { + return false; + } + AI.SelectMaterials(new List { level4Monster, level6Tuner }); + return true; + } + + public bool Level10SynchroSummonCheck() + { + if (CheckShouldNoMoreSpSummon()) return false; + if (GetSpecialSummonDrawCount(CardLocation.Extra) > 1 && CheckAtAdvantage()) return false; + + return true; + } + + public bool SwordsoulSupremeSovereignChengyingActivate() + { + if (CheckWhetherNegated()) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool BaronneDeFleurNegateEffect() + { + if (ActivateDescription != Util.GetStringId(CardId.BaronneDeFleur, 1)) + { + return false; + } + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + ClientCard lastChainCard = Util.GetLastChainCard(); + if (Duel.LastChainPlayer == 1 && lastChainCard != null) + { + if (CheckAtAdvantage() && lastChainCard.IsCode(new List {_CardId.MaxxC, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus, _CardId.MulcharmyPurulia})) + { + return false; + } + if (Duel.LastChainTargets.Contains(Card) && lastChainCard.IsCode(_CardId.EffectVeiler, _CardId.InfiniteImpermanence, _CardId.BreakthroughSkill)) + { + return false; + } + } + currentNegateCardList.Add(lastChainCard); + return true; + } + + public bool BaronneDeFleurActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.BaronneDeFleur, 1)) + { + // negate + return false; + } else if (Duel.Phase == DuelPhase.Standby) + { + // special summon + // TODO waiting for handle OnCardHint + return false; + } else { + // destroy + List targetList = GetNormalEnemyTargetList(); + if (targetList.Count() > 0) + { + return true; + } + } + + return false; + } + + public bool SuperdreadnoughtRailCannonJuggernautLiebeActivate() + { + if (CheckWhetherNegated()) return false; + return true; + } + + public bool SuperdreadnoughtRailCannonJuggernautLiebeSpSummon() + { + if (!SuperdreadnoughtRailCannonJuggernautLiebeSpSummonCheck()) return false; + return true; + } + + public bool SuperdreadnoughtRailCannonJuggernautLiebeSpSummonCheck() + { + int enemyPower = Util.GetBestPower(Enemy); + int botPower = GetBotBestPower(true); + if (botPower < enemyPower) + { + int currentAttack = 4000; + if (!CheckWhetherNegated(true, true, CardType.Monster) && CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) && !lodeSpSummonEffectResolved) + { + currentAttack += 2000; + } + if (currentAttack >= enemyPower) + { + return true; + } + } + return false; + } + + public bool SuperdreadnoughtRailCannonFlyingLauncherActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.SuperdreadnoughtRailCannonFlyingLauncher, 2)) + { + List targetList = GetNormalEnemySpellTargetList(true, false, CardType.Monster); + if (targetList.Count() > 0) + { + return true; + } + } + return false; + } + + public bool SuperdreadnoughtRailCannonFlyingLauncherSpSummon() + { + bool hasLiebeInExtra = Bot.ExtraDeck.Any(c => c.IsCode(CardId.SuperdreadnoughtRailCannonJuggernautLiebe)); + int enemyPower = Util.GetBestPower(Enemy); + int botPower = GetBotBestPower(true); + bool needSummonLiebe = SuperdreadnoughtRailCannonJuggernautLiebeSpSummonCheck(); + + if ((hasLiebeInExtra && needSummonLiebe) + || (!hasLiebeInExtra && botPower < enemyPower && enemyPower <= 3800) + || (CheckWhetherCanActivateMonsterEffect(CardAttribute.Earth) + && !CheckWhetherNegated(true, true, CardType.Monster) + && !lodeSpSummonEffectResolved + && GetNormalEnemySpellTargetList(true, false, CardType.Monster).Count() > 0)) + { + return true; + } + return false; + } + + public bool EvilswarmExcitonKnightSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Light)) return false; + int selfCount = Bot.GetMonsterCount() + Bot.GetSpellCount() + Bot.GetHandCount(); + int oppoCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount() + Enemy.GetHandCount(); + return (selfCount - 1 < oppoCount) && DefaultEvilswarmExcitonKnightEffect(); + } + + public bool SPLittleKnightActivate() + { + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 0)) + { + // banish card + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + if (problemCardList.Count() > 0) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } else if (ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 1)) + { + ClientCard selfMonster = null; + foreach (ClientCard target in Bot.GetMonsters()) + { + if (Duel.ChainTargets.Contains(target)) + { + selfMonster = target; + break; + } + } + if (selfMonster == null) + { + if (Duel.Player == 1) + { + selfMonster = Bot.GetMonsters().Where(card => card.IsAttack()).OrderBy(card => card.Attack).FirstOrDefault(); + if (!Util.IsOneEnemyBetterThanValue(selfMonster.Attack, true)) selfMonster = null; + } + } + if (selfMonster != null) + { + ClientCard nextMonster = null; + List selfTargetList = Bot.GetMonsters().Where(card => card != selfMonster).ToList(); + if (Enemy.GetMonsterCount() == 0 && selfTargetList.Count() > 0) + { + selfTargetList.Sort(CompareUsableAttack); + nextMonster = selfTargetList[0]; + } + if (Enemy.GetMonsterCount() > 0) + { + nextMonster = GetProblematicEnemyMonster(0, true, false, CardType.Monster); + } + if (nextMonster != null) + { + SPLittleKnightRemoveStep = 1; + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + return false; + } + + public bool SPLittleKnightSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster, true) || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Dark)) return false; + + List effectMonsters = Bot.GetMonsters().Where(c => c.IsFaceup() && c.HasType(CardType.Effect) + && (!c.IsCode(CardId.SilhouhatteRabbit) || !summonThisTurn.Contains(c)) + ).OrderBy(c => c.GetDefensePower()).ToList(); + + // summon to remove problem cards + if (SPLittleKnightSummonCheck() || Util.IsTurn1OrMain2() && (Enemy.GetMonsterCount() + Enemy.GetSpellCount() + Enemy.Graveyard.Count > 0)) + { + ClientCard extraMonster = null; + ClientCard otherMonster = null; + foreach (ClientCard monster in effectMonsters) + { + // skip important monster if needed + if (Util.IsTurn1OrMain2() && monster.IsCode(new List { CardId.BaronneDeFleur, CardId.SwordsoulSupremeSovereignChengying, CardId.DivineSerpentApophis })) + { + continue; + } + + if (monster.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) + { + if (extraMonster != null) + { + otherMonster = monster; + } + else + { + extraMonster = monster; + } + } + else + { + otherMonster = monster; + } + + if (extraMonster != null && otherMonster != null) + { + break; + } + } + + if (extraMonster != null && otherMonster != null) + { + AI.SelectMaterials(new List { extraMonster, otherMonster }); + return true; + } + } + + return false; + } + + public bool SPLittleKnightSummonCheck(bool ignoreMaterialCheck = false) + { + if (CheckWhetherNegated(true, true, CardType.Monster, true) + || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Dark) + || lodeSpSummonEffectResolved) return false; + // banish card + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster, ignoreSpells: !Util.IsTurn1OrMain2()); + bool summonFlag = problemCardList.Count() > 0; + ClientCard problematicEnemyMonster = GetProblematicEnemyMonster(0, true, false, CardType.Monster); + if (problematicEnemyMonster != null) + { + summonFlag = true; + } + if (summonFlag) + { + if (ignoreMaterialCheck) + { + return true; + } + // check material + return Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) + && (!c.IsCode(CardId.SilhouhatteRabbit) || !summonThisTurn.Contains(c))) + && Bot.GetMonsters().Count(c => c.IsFaceup() && c.HasType(CardType.Effect)) >= 2; + } + + return false; + } + + public bool SilhouhatteRabbitActivate() + { + if (CheckWhetherNegated()) return false; + if (ActivateDescription == Util.GetStringId(CardId.SilhouhatteRabbit, 0) || ActivateDescription == -1) + { + // set + // default to true + activatedCardIdList.Add(Card.Id); + return true; + } else + { + // destroy + List targetList = GetNormalEnemySpellTargetList(true, false, CardType.Monster, false); + if (targetList.Count() > 0) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + return false; + } + + public bool SilhouhatteRabbitSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster, true) || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Light)) return false; + if (!SilhouhatteRabbitSummonCheck()) return false; + // select material + ClientCard anubis = Bot.GetMonsters().FirstOrDefault(c => c.IsFaceup() && c.IsCode(CardId.AnubisTheLastJudge)); + List materialList = new List { }; + if (anubis != null) + { + materialList.Add(anubis); + } + // select remain material + List effectMonsters = Bot.GetMonsters().Where(c => c.IsFaceup() && c.HasType(CardType.Effect) + && (!c.IsCode(CardId.SilhouhatteRabbit) || !summonThisTurn.Contains(c)) + ).OrderBy(c => c.GetDefensePower()).ToList(); + if (effectMonsters.Count() > 0) + { + foreach (ClientCard monster in effectMonsters) + { + // skip important monster if needed + if (monster.IsCode(new List { CardId.BaronneDeFleur, CardId.SwordsoulSupremeSovereignChengying, CardId.DivineSerpentApophis, CardId.SPLittleKnight })) + { + continue; + } + materialList.Add(monster); + if (materialList.Count() >= 2) + { + break; + } + } + } + + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + return false; + } + + public bool SilhouhatteRabbitSummonCheck(bool ignoreMaterialCheck = false) + { + if (CheckWhetherNegated(true, true, CardType.Monster, true) + || !CheckWhetherCanActivateMonsterEffect(CardAttribute.Light) + || lodeSpSummonEffectResolved) return false; + + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + if (problemCardList.Count() > 0) + { + return false; + } + int remainApophisCount = CheckRemainInDeck(CardId.ApophisTheSwampDeity); + if (remainApophisCount == 0) + { + return false; + } + if (Bot.Hand.Any(c => c.IsCode(CardId.ApophisTheSwampDeity)) || Bot.GetSpells().Any(c => c.IsCode(CardId.ApophisTheSwampDeity) && c.IsFacedown())) + { + return false; + } + if (activatedCardIdList.Contains(CardId.SilhouhatteRabbit)) + { + return false; + } + if (ignoreMaterialCheck) + { + return true; + } + return Bot.GetMonsters().Count(c => c.IsFaceup() && c.HasType(CardType.Effect) + && (!c.IsCode(CardId.SilhouhatteRabbit) || !summonThisTurn.Contains(c))) >= 2; + } + + public bool LinkSpiderSummon() + { + // check whether monster is enough + int monsterCount = Bot.GetMonsterCount() + Duel.MainPhase.ActivableCards.Count(c => c.IsOnField() && c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity)); + if (monsterCount < 2) + { + return false; + } + + // summon little knight check + if (Bot.ExtraDeck.Any(c => c.IsCode(CardId.SPLittleKnight))) + { + if (SPLittleKnightSummonCheck()) + { + return false; + } + if (SPLittleKnightSummonCheck(true)) + { + return true; + } + } + // summon silhouhatte rabbit check + if (Bot.ExtraDeck.Any(c => c.IsCode(CardId.SilhouhatteRabbit))) + { + if (SilhouhatteRabbitSummonCheck()) + { + return false; + } + if (SilhouhatteRabbitSummonCheck(true)) + { + return true; + } + } + return false; + } + + public bool MonsterRepos() + { + int selfAttack = Card.Attack + 1; + + if (selfAttack <= 1) + return !Card.IsDefense(); + + int bestAttack = 0; + foreach (ClientCard card in Bot.GetMonsters()) + { + int attack = card.Attack; + if (attack >= bestAttack) + { + bestAttack = attack; + } + } + + bool enemyBetter = Util.IsAllEnemyBetterThanValue(bestAttack, true); + + if (Card.IsAttack() && enemyBetter) + return true; + if (Card.IsDefense() && !enemyBetter) + return true; + return false; + } + + public bool MonstetReposForImportantMonsters() + { + if (!Card.IsFacedown()) + { + return false; + } + return Card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz); + } + + public bool SpellSetFirst() + { + // pretend to have solemn report + int setCount = Bot.GetSpells().Count(c => c.IsFacedown() && c.Sequence < 5); + if (setCount < 2 && Bot.LifePoints > 1500) + { + if (setCount == 1 && !Bot.HasInSpellZone(CardId.SolemnReport) && Bot.HasInHand(CardId.SolemnReport) && Bot.GetSpells().Any(c => c.IsTrap() && c.IsFacedown())) + { + if (!Card.IsCode(CardId.SolemnReport)) + { + return false; + } + SelectSTPlace(Card, true); + return true; + } + // if card should set + List canSetSpells = GetCanSetSpells(); + if (setCount + canSetSpells.Count() > 0 && canSetSpells.Contains(Card) && (!Bot.HasInHand(CardId.SolemnReport) || Card.IsTrap())) + { + bool avoidImpermanence = Card.IsCode(CardId.SolemnReport); + SelectSTPlace(Card, avoidImpermanence); + return true; + } + } + return false; + } + + public List GetCanSetSpells() + { + List canSetSpells = new List(); + foreach (ClientCard card in Bot.Hand) + { + bool setFlag = false; + switch (Card.Id) + { + case CardId.Terraforming: + setFlag |= CheckRemainInDeck(CardId.TreasuresOfTheKings) > 0 && DefaultCheckWhetherBotCanSearch(); + break; + case CardId.PrimiteLordlyLode: + setFlag |= PrimiteLordlyLodeActivateCheck() && !canSetSpells.Any(c => c.IsCode(CardId.PrimiteLordlyLode)); + break; + case CardId.DominusSpark: + setFlag |= !enemyActivateMonsterEffectFromHandGrave; + break; + case _CardId.InfiniteImpermanence: + case CardId.VerdictOfAnubis: + case CardId.SolemnReport: + setFlag = true; + break; + case CardId.DominusPurge: + case CardId.DominusImpulse: + setFlag |= Enemy.GetMonsterCount() + Enemy.GetSpellCount() == 0; + break; + case CardId.SongsOfTheDominators: + setFlag |= !Bot.Graveyard.Any(c => c.IsMonster()); + break; + case CardId.ApophisTheSwampDeity: + setFlag |= Bot.Hand.Any(c => c != card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + setFlag |= Bot.GetSpells().Any(c => c != card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + setFlag |= Bot.GetMonsters().Any(c => c != card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)); + break; + case CardId.ApophisTheSerpent: + setFlag |= CheckRemainInDeck(CardId.ApophisTheSwampDeity) > 0; + setFlag |= Bot.HasInHandOrInSpellZone(CardId.ApophisTheSwampDeity); + break; + default: + setFlag = false; + break; + } + if (setFlag) + { + canSetSpells.Add(card); + } + } + return canSetSpells; + } + + public bool SpellSet() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + + // select place + if (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) + { + switch (Card.Id) + { + case _CardId.InfiniteImpermanence: + // do not set infinite impermanence if don't need to set other cards + if (Bot.GetMonsterCount() == 0 && Bot.GetSpellCount() == 0 + && !Bot.Hand.Any(c => !c.IsCode(_CardId.InfiniteImpermanence) && (c.IsTrap() || c.HasType(CardType.QuickPlay))) + && Bot.Hand.Count() <= 6) + { + return false; + } + break; + case CardId.SongsOfTheDominators: + // do not set songs of the dominators if don't need to set + if (!Bot.Graveyard.Any(c => c.IsMonster()) && Bot.GetMonsterCount() == 0) + { + return false; + } + if (Bot.GetSpells().Any(c => c.IsCode(CardId.SongsOfTheDominators) && c.IsFacedown())) + { + return false; + } + break; + case CardId.ApophisTheSwampDeity: + // do not set swamp deity if don't need to set + if ( + !Bot.Hand.Any(c => c != Card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)) && + !Bot.GetSpells().Any(c => c != Card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)) && + !Bot.GetMonsters().Any(c => c != Card && c.HasType(CardType.Continuous) && c.HasType(CardType.Trap)) && + !Bot.HasInHandOrInSpellZone(CardId.PrimiteDrillbeam) && + !(Bot.GetMonsterCount() == 0 + && !Bot.Hand.Any(c => c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) && c != Card) + && !Bot.GetSpells().Any(c => c.IsCode(CardId.ApophisTheSerpent, CardId.ApophisTheSwampDeity) && c != Card && c.IsFacedown()) + ) + ) + { + return false; + } + break; + case CardId.SolemnReport: + { + if (Bot.LifePoints <= 1500) + { + return false; + } + break; + } + case CardId.ApophisTheSerpent: + case CardId.DominusImpulse: + case CardId.DominusPurge: + case CardId.DominusSpark: + if (Bot.GetSpells().Any(c => c.IsCode(Card.Id) && c.IsFacedown())) + { + return false; + } + break; + default: + break; + } + + List avoid_list = new List(); + int setForInfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setForInfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setForInfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + } +} \ No newline at end of file diff --git a/Game/AI/Decks/BlueEyesExecutor.cs b/Game/AI/Decks/BlueEyesExecutor.cs index 6cfa60b27..1abf3b4bb 100644 --- a/Game/AI/Decks/BlueEyesExecutor.cs +++ b/Game/AI/Decks/BlueEyesExecutor.cs @@ -131,9 +131,10 @@ public override void OnNewTurn() UsedGalaxyEyesCipherDragon = null; AlternativeWhiteDragonSummoned = false; SoulChargeUsed = false; + base.OnNewTurn(); } - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { Logger.DebugWriteLine("OnSelectCard " + cards.Count + " " + min + " " + max); if (max == 2 && cards[0].Location == CardLocation.Deck) @@ -146,7 +147,8 @@ public override IList OnSelectCard(IList cards, int min, return Util.CheckSelectCount(result, cards, min, max); } Logger.DebugWriteLine("Use default."); - return null; + + return base.OnSelectCard(cards, min, max, hint, cancelable); } public override IList OnSelectXyzMaterial(IList cards, int min, int max) @@ -175,6 +177,22 @@ public override IList OnSelectSynchroMaterial(IList card return null; } + public override void OnSpSummoned() + { + // not special summoned by chain + if (Duel.GetCurrentSolvingChainCard() == null) + { + foreach (ClientCard card in Duel.LastSummonedCards) + { + if (card.Controller == 0 && card.IsCode(CardId.AlternativeWhiteDragon)) + { + AlternativeWhiteDragonSummoned = true; + } + } + } + base.OnSpSummoned(); + } + private bool DragonShrineEffect() { AI.SelectCard( @@ -499,7 +517,6 @@ private bool WhiteStoneOfAncientsEffect() private bool AlternativeWhiteDragonSummon() { - AlternativeWhiteDragonSummoned = true; return true; } diff --git a/Game/AI/Decks/BlueEyesMaxDragonExecutor.cs b/Game/AI/Decks/BlueEyesMaxDragonExecutor.cs index 5aa4ad0b3..6b26c1aa7 100644 --- a/Game/AI/Decks/BlueEyesMaxDragonExecutor.cs +++ b/Game/AI/Decks/BlueEyesMaxDragonExecutor.cs @@ -121,6 +121,7 @@ private void Count_check() private bool MaxxCeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } @@ -464,6 +465,7 @@ private bool Linkuribohsp() private bool Linkuriboheff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false; return true; } diff --git a/Game/AI/Decks/BraveExecutor.cs b/Game/AI/Decks/BraveExecutor.cs index 718ed7512..8a04acc65 100644 --- a/Game/AI/Decks/BraveExecutor.cs +++ b/Game/AI/Decks/BraveExecutor.cs @@ -1,4 +1,4 @@ -using System; +using System; using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using WindBot; @@ -180,6 +180,7 @@ public override void OnNewTurn() FusionDestinyUsed = false; PhoenixTarget = null; PhoenixSelectingTarget = 0; + base.OnNewTurn(); } public override CardPosition OnSelectPosition(int cardId, IList positions) @@ -195,7 +196,7 @@ public override CardPosition OnSelectPosition(int cardId, IList po return 0; } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (location == CardLocation.MonsterZone) { @@ -212,7 +213,7 @@ public override int OnSelectPlace(long cardId, int player, CardLocation location return 0; } - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { if (hint != HintMsg.Destroy) PhoenixSelectingTarget = 0; @@ -264,7 +265,7 @@ public override IList OnSelectCard(IList cards, int min, return base.OnSelectCard(cards, min, max, hint, cancelable); } - public override int OnSelectOption(IList options) + public override int OnSelectOption(IList options) { if (options.Count == 2 && options[0] == Util.GetStringId(CardId.CupidPitch, 1)) return 0; @@ -479,6 +480,7 @@ private bool JourneyOfDestinyEffect() private bool AquamancerOfTheSanctuarySearchEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.Location == CardLocation.Grave) { AI.SelectCard(CardLocation.Deck); @@ -626,6 +628,7 @@ private bool TGHyperLibrarianSummon() private bool JetSynchronEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int[] materials = new[] { CardId.MechaPhantomBeastToken }; @@ -786,6 +789,7 @@ private bool PredaplantVerteAnacondaSummon() private bool PredaplantVerteAnacondaEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (ActivateDescription == Util.GetStringId(CardId.PredaplantVerteAnaconda, 0)) return false; FusionDestinyUsed = true; @@ -858,6 +862,7 @@ private bool DestinyHeroDasherEffect() private bool DestinyHeroCelestialEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (!Bot.HasInGraveyard(CardId.DestinyHeroDasher)) return false; AI.SelectCard(CardId.DestinyHeroDasher); @@ -971,6 +976,7 @@ private bool VirtualWorldKyubiShenshenSummon() private bool VirtualWorldKyubiShenshenEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.Location == CardLocation.MonsterZone && Bot.HasInBanished(CardId.AquamancerOfTheSanctuary)) { AI.SelectCard(CardId.AquamancerOfTheSanctuary); diff --git a/Game/AI/Decks/ChainBurnExecutor.cs b/Game/AI/Decks/ChainBurnExecutor.cs index 0708acd47..3d1062687 100644 --- a/Game/AI/Decks/ChainBurnExecutor.cs +++ b/Game/AI/Decks/ChainBurnExecutor.cs @@ -265,6 +265,7 @@ public override void OnNewTurn() prevent_used = false; Linkuribohused = true; Timelord_check = false; + base.OnNewTurn(); } public override void OnNewPhase() { diff --git a/Game/AI/Decks/DarkMagicianExecutor.cs b/Game/AI/Decks/DarkMagicianExecutor.cs index 024b31539..0e988e4f2 100644 --- a/Game/AI/Decks/DarkMagicianExecutor.cs +++ b/Game/AI/Decks/DarkMagicianExecutor.cs @@ -316,6 +316,7 @@ public override void OnNewTurn() big_attack = false; big_attack_used = false; soul_used = false; + base.OnNewTurn(); } public int GetTotalATK(IList list) { @@ -496,11 +497,13 @@ private bool SolemnStrikeeff() { if (Bot.LifePoints > 1500 && Duel.LastChainPlayer == 1) return true; + if (DefaultOnlyHorusSpSummoning()) return false; return false; } private bool ChainEnemy() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.UpstartGoblin)) return false; @@ -519,6 +522,7 @@ private bool CrystalWingSynchroDragoneff() private bool MaxxCeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } /* @@ -1417,6 +1421,7 @@ private bool MagiciansRodeff() } else { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInMonstersZone(CardId.VentriloauistsClaraAndLucika)) { AI.SelectCard(CardId.VentriloauistsClaraAndLucika); diff --git a/Game/AI/Decks/DoEveryThingExecutor.cs b/Game/AI/Decks/DoEveryThingExecutor.cs index 8d89f55ea..86998077b 100644 --- a/Game/AI/Decks/DoEveryThingExecutor.cs +++ b/Game/AI/Decks/DoEveryThingExecutor.cs @@ -25,7 +25,7 @@ public DoEverythingExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.SpellSet); } - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { if (Duel.Phase == DuelPhase.BattleStart) return null; @@ -39,7 +39,7 @@ public override IList OnSelectCard(IList cards, int min, return selected; } - public override int OnSelectOption(IList options) + public override int OnSelectOption(IList options) { return Program.Rand.Next(options.Count); } diff --git a/Game/AI/Decks/DogmatikaExecutor.cs b/Game/AI/Decks/DogmatikaExecutor.cs new file mode 100644 index 000000000..967c9a17c --- /dev/null +++ b/Game/AI/Decks/DogmatikaExecutor.cs @@ -0,0 +1,2902 @@ +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Dogmatika", "AI_Dogmatika")] + + public class DogmatikaExecutor : DefaultExecutor + { + public class CardId + { + public const int DogmatikaAlbaZoa = 51522296; + public const int ThesIrisSwordsoul = 62849088; + public const int DogmatikaFleurdelis = 69680031; + public const int DogmatikaMaximus = 95679145; + public const int DiabellstarTheBlackWitch = 72270339; + public const int DogmatikaEcclesia = 60303688; + // _CardId.AshBlossom = 14558127; + // _CardId.MaxxC = 23434538; + public const int KnightmareCorruptorIblee = 10158145; + + public const int NadirServant = 1984618; + public const int DogmatikaLamity = 31002402; + public const int DogmatikaMacabre = 60921537; + public const int SinfulSpoilsOfDoom_Rciela = 16240772; + // _CardId.CalledByTheGrave = 24224830; + // _CardId.CrossoutDesignator = 65681983; + public const int WANTED_SeekerOfSinfulSpoils = 80845034; + public const int DogmatikaMatrix = 35569555; + + // _CardId.InfiniteImpermanence = 10045474; + public const int DogmatikaPunishment = 82956214; + + public const int GranguignolTheDuskDragon = 24915933; + public const int TitanikladTheAshDragon = 41373230; + public const int GaruraWingsOfResonantLife = 11765832; + public const int ElderEntityNtss = 80532587; + public const int DespianLuluwalilith = 53971455; + public const int PSYFramelordOmega = 74586817; + public const int HeraldOfTheArcLight = 79606837; + public const int SuperStarslayerTYPHON = 93039339; + public const int SPLittleKnight = 29301450; + public const int SecureGardna = 2220237; + public const int Linguriboh = 24842059; + public const int SalamangreatAlmiraj = 60303245; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int GhostMournerMoonlitChill = 52038441; + } + + public DogmatikaExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // startup effect + AddExecutor(ExecutorType.Activate, CardId.WANTED_SeekerOfSinfulSpoils, WANTED_SeekerOfSinfulSpoilsActivate); + AddExecutor(ExecutorType.Activate, CardId.SalamangreatAlmiraj, SalamangreatAlmirajActivate); + + AddExecutor(ExecutorType.Activate, CardId.PSYFramelordOmega, PSYFramelordOmegaActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaAlbaZoa, DogmatikaAlbaZoaActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaMaximus, DogmatikaMaximusActivate); + AddExecutor(ExecutorType.Activate, CardId.DiabellstarTheBlackWitch, DiabellstarTheBlackWitchActivate); + + // quick effect + AddExecutor(ExecutorType.Activate, CardId.ThesIrisSwordsoul, ThesIrisSwordsoulActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.Linguriboh, LinguribohActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaPunishment, DogmatikaPunishmentActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaFleurdelis, DogmatikaFleurdelisActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.SinfulSpoilsOfDoom_Rciela, SinfulSpoilsOfDoom_RcielaActivate); + AddExecutor(ExecutorType.Activate, ClearIrisFlag); + + AddExecutor(ExecutorType.Activate, CardId.HeraldOfTheArcLight, HeraldOfTheArcLightActivate); + AddExecutor(ExecutorType.Activate, CardId.ElderEntityNtss, ElderEntityNtssActivate); + AddExecutor(ExecutorType.Activate, CardId.GranguignolTheDuskDragon, GranguignolTheDuskDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.GaruraWingsOfResonantLife, GaruraWingsOfResonantLifeActivate); + AddExecutor(ExecutorType.Activate, CardId.KnightmareCorruptorIblee, KnightmareCorruptorIbleeActivate); + AddExecutor(ExecutorType.Activate, CardId.TitanikladTheAshDragon, TitanikladTheAshDragonActivate); + AddExecutor(ExecutorType.Activate, CardId.DespianLuluwalilith, DespianLuluwalilithActivate); + + // free chain + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, CardId.SuperStarslayerTYPHON, SuperStarslayerTYPHONActivate); + + // spsummon + AddExecutor(ExecutorType.SpSummon, CardId.Linguriboh, LinguribohSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SalamangreatAlmiraj, SalamangreatAlmirajSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SecureGardna, SecureGardnaSpSummon); + + // startup effect + AddExecutor(ExecutorType.Summon, CardId.KnightmareCorruptorIblee, KnightmareCorruptorIbleeSummon); + AddExecutor(ExecutorType.Activate, CardId.NadirServant, NadirServantActivate); + + // summon + AddExecutor(ExecutorType.Summon, CardId.DogmatikaEcclesia, DogmatikaEcclesiaSummon); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaEcclesia, DogmatikaEcclesiaActivate); + + // ritual + AddExecutor(ExecutorType.Activate, CardId.DogmatikaMatrix, DogmatikaMatrixActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaLamity, DogmatikaLamityActivate); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaMacabre, DogmatikaMacabreActivate); + + // other + AddExecutor(ExecutorType.Activate, CardId.DogmatikaFleurdelis, DogmatikaFleurdelisDelayActivate); + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.Summon, SummonForTYPHONCheck); + AddExecutor(ExecutorType.SpSummon, CardId.DiabellstarTheBlackWitch, DiabellstarTheBlackWitchSpSummon); + AddExecutor(ExecutorType.Activate, CardId.DogmatikaLamity, DogmatikaLamityDelayActivate); + AddExecutor(ExecutorType.SpSummon, CardId.SuperStarslayerTYPHON, SuperStarslayerTYPHONSpSummon); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeDogmatika = 0x145; + const int hintTimingMainEnd = 0x4; + const int hintDamageStep = 0x2000; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.DogmatikaEcclesia, _CardId.AshBlossom, _CardId.MaxxC, CardId.KnightmareCorruptorIblee, CardId.NadirServant, + CardId.WANTED_SeekerOfSinfulSpoils, CardId.DogmatikaMatrix, _CardId.InfiniteImpermanence, CardId.DogmatikaPunishment }}, + {2, new List { CardId.DogmatikaAlbaZoa, CardId.DogmatikaFleurdelis, _CardId.CalledByTheGrave }}, + {1, new List { CardId.ThesIrisSwordsoul, CardId.DogmatikaMaximus, CardId.DiabellstarTheBlackWitch, CardId.DogmatikaLamity, CardId.DogmatikaMacabre, + CardId.SinfulSpoilsOfDoom_Rciela, _CardId.CrossoutDesignator }}, + }; + List notToNegateIdList = new List{ + 58699500, 20343502 + }; + List discardEnemyExtraIdList = new List{ + _CardId.DivineArsenalAAZEUS_SkyThunder, CardId.SPLittleKnight, CardId.Number41BagooskatheTerriblyTiredTapir, + 70534340, 60465049, 24094258, 86066372 + }; + + List currentNegatingIdList = new List(); + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + List infiniteImpermanenceList = new List(); + bool summoned = false; + List activatedCardIdList = new List(); + List currentNegateMonsterList = new List(); + List currentDestroyCardList = new List(); + List discardExtraThisTurn = new List(); + int banSpSummonFromExTurn = 0; + List activatedMatrixList = new List(); + List maximusDiscardExtraIdList = new List(); + bool checkedEnemyExtra = false; + bool matrixActivating = false; + bool avoid2Monster = true; + bool confirmLink2 = false; + int omegaActivateCount = 0; + int dimensionShifterCount = 0; + + int enemySpSummonFromExLastTurn = 0; + int enemySpSummonFromExThisTurn = 0; + bool enemySpSummonFromDeck = false; + bool enemySpSummonFromExtra = false; + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + ClientCard tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public void UpdateBanSpSummonFromExTurn(int newTurn) + { + if (Duel.Player == 1) newTurn -= 1; + banSpSummonFromExTurn = Math.Max(banSpSummonFromExTurn, newTurn); + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false) + { + List floodagateList = Enemy.GetMonsters().Where(c => c?.Data != null && + c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget()) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).ToList(); + if (floodagateList.Count() > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + return floodagateList[0]; + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget()) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).ToList(); + if (dangerList.Count() > 0) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + return dangerList[0]; + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget()) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).ToList(); + if (invincibleList.Count() > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + return invincibleList[0]; + } + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + List betterList = Enemy.MonsterZone.GetMonsters() + .Where(card => card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && (!canBeTarget || !card.IsShouldNotBeTarget()) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + if (betterList.Count() > 0) + { + betterList.Sort(CardContainer.CompareCardAttack); + betterList.Reverse(); + return betterList[0]; + } + } + return null; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreNormalSpell = false) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count() > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + resultList.AddRange(floodagateList); + } + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count() > 0) + { + resultList.AddRange(ShuffleCardList(problemEnemySpellList)); + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count() > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + resultList.AddRange(dangerList); + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count() > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + resultList.AddRange(invincibleList); + } + + List enemyMonsters = Enemy.GetMonsters().ToList(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach(ClientCard target in enemyMonsters) + { + if (target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2) ) + { + if (!canBeTarget || !(target.IsShouldNotBeTarget() || target.IsShouldNotBeMonsterTarget())) + { + if (!resultList.Contains(target)) + { + resultList.Add(target); + } + } + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous)).ToList(); + if (spells.Count() > 0 && !ignoreNormalSpell) + { + resultList.AddRange(ShuffleCardList(spells)); + } + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false, bool ignoreCurrentDestroy = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget, ignoreCurrentDestroy); + if (card != null) + return card; + + card = Enemy.MonsterZone.Where(c => c?.Data != null && c.HasType(CardType.Monster) && c.IsFaceup() + && !(canBeTarget && c.IsShouldNotBeTarget()) && (!ignoreCurrentDestroy || currentDestroyCardList.Contains(c))) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + if (card != null) + return card; + + List monsters = Enemy.GetMonsters().Where(c => !ignoreCurrentDestroy || currentDestroyCardList.Contains(c)).ToList(); + + // after GetHighestAttackMonster, the left monsters must be face-down. + if (monsters.Count() > 0 && !onlyFaceup) + return ShuffleCardList(monsters)[0]; + + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count() > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && + ecard.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous)).ToList(); + if (faceUpList.Count() > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count() > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + if (checkGrave && Enemy.Graveyard.Count() > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count() > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + + /// + /// check enemy's dangerous card in grave + /// + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, 9411399, 28954097, 30680659, CardId.PSYFramelordOmega + }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool targetKnightmare = true, bool ignoreCurrentDestroy = false) + { + List targetList = GetProblematicEnemyCardList(canBeTarget); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && !card.IsCode(CardId.KnightmareCorruptorIblee) && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleCardList(Enemy.GetSpells().Where(card => !ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)).ToList())); + targetList.AddRange(ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + if (targetKnightmare) + { + List enemyKnightmare = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) && card.IsCode(CardId.KnightmareCorruptorIblee) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + targetList.AddRange(enemyKnightmare); + } + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeMonsterTarget = false, bool canBeTrapTarget = false) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && (!canBeMonsterTarget || !card.IsShouldNotBeMonsterTarget()) && (!canBeTrapTarget || !card.IsShouldNotBeSpellTrapTarget()) + && !currentNegateMonsterList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && (!canBeMonsterTarget || !chainingCard.IsShouldNotBeMonsterTarget()) && (!canBeTrapTarget || !chainingCard.IsShouldNotBeSpellTrapTarget()) + && !chainingCard.IsShouldNotBeTarget() && !currentNegateMonsterList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + /// + /// Get ritual monster/spell's ids that need to search, in order to perform ritual summon. + /// + public List GetNeedSearchRitualCardIdList() + { + List result = new List(); + + bool canSearchAlbaZoa = !Bot.HasInHand(CardId.DogmatikaAlbaZoa) && CheckRemainInDeck(CardId.DogmatikaAlbaZoa) > 0; + int totalLevelInGY = Bot.Graveyard.Where(card => card != null && card.HasType(CardType.Fusion | CardType.Synchro)).Sum(c => (int?)c.Level ?? 0); + + bool needSearchAlbaZoa = Bot.HasInHandOrInSpellZone(CardId.DogmatikaLamity) && Bot.HasInExtra(CardId.DespianLuluwalilith) && canSearchAlbaZoa; + if (Bot.HasInHandOrInGraveyard(CardId.DogmatikaMacabre)) + { + needSearchAlbaZoa |= totalLevelInGY >= 12 && canSearchAlbaZoa; + } + if (needSearchAlbaZoa) + { + result.Add(CardId.DogmatikaAlbaZoa); + } + + if (Bot.HasInHand(CardId.DogmatikaAlbaZoa) && Bot.HasInExtra(CardId.DespianLuluwalilith) && !Bot.HasInHandOrInSpellZone(CardId.DogmatikaLamity) + && CheckRemainInDeck(CardId.DogmatikaLamity) > 0) + { + result.Add(CardId.DogmatikaLamity); + } + + if (Bot.HasInHand(CardId.DogmatikaAlbaZoa) && !Bot.HasInHandOrInSpellZone(CardId.DogmatikaMacabre) && CheckRemainInDeck(CardId.DogmatikaMacabre) > 0 + && totalLevelInGY >= 12) + { + result.Add(CardId.DogmatikaMacabre); + } + + return result; + } + + public ClientCard GetExtraToDiscard(int baseAtk = 0, ClientCard avoidDestroyEnemyCard = null) + { + ClientCard selectResult = null; + // Ntss + if (baseAtk <= 2500 && Bot.HasInExtra(CardId.ElderEntityNtss) && CheckCalledbytheGrave(CardId.ElderEntityNtss) == 0) + { + List destroyList = GetNormalEnemyTargetList(true, false); + if (destroyList.Count() > 0) + { + if (!(destroyList.Count() == 1 && destroyList[0] == avoidDestroyEnemyCard)) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ElderEntityNtss)); + if (selectResult != null) + { + return selectResult; + } + } + } + } + + // Garura + if (baseAtk <= 1500 && Bot.HasInExtra(CardId.GaruraWingsOfResonantLife) && CheckCalledbytheGrave(CardId.GaruraWingsOfResonantLife) == 0 + && !activatedCardIdList.Contains(CardId.GaruraWingsOfResonantLife) && !enemyActivateLockBird) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.GaruraWingsOfResonantLife)); + if (selectResult != null) + { + return selectResult; + } + } + + // Ash Dragon + if (baseAtk <= 2500 && Bot.HasInExtra(CardId.TitanikladTheAshDragon) && CheckCalledbytheGrave(CardId.TitanikladTheAshDragon) == 0 + && !discardExtraThisTurn.Contains(CardId.TitanikladTheAshDragon) && !enemyActivateLockBird) + { + bool successFlag = !activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0; + successFlag |= Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)) && !Bot.HasInHand(CardId.DogmatikaFleurdelis) && CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0; + if (successFlag) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.TitanikladTheAshDragon)); + if (selectResult != null) + { + return selectResult; + } + } + } + + // dusk dragon + if (baseAtk <= 2500 && Bot.HasInExtra(CardId.GranguignolTheDuskDragon)) + { + bool successFlag = Bot.HasInExtra(CardId.DespianLuluwalilith); + successFlag |= CheckRemainInDeck(CardId.DogmatikaEcclesia, CardId.DogmatikaFleurdelis, CardId.DogmatikaMaximus) > 0; + if (successFlag) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.GranguignolTheDuskDragon)); + if (selectResult != null) + { + return selectResult; + } + } + } + + if (baseAtk <= 600 && Bot.HasInExtra(CardId.HeraldOfTheArcLight) && !enemyActivateLockBird) + { + if (GetNeedSearchRitualCardIdList().Count() > 0) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.HeraldOfTheArcLight)); + if (selectResult != null) + { + return selectResult; + } + } + } + + if (baseAtk <= 2800 && Bot.HasInExtra(CardId.PSYFramelordOmega)) + { + selectResult = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.PSYFramelordOmega)); + if (selectResult != null) + { + return selectResult; + } + } + + List discardableList = Bot.ExtraDeck.Where(card => card != null && card.Attack >= baseAtk).ToList(); + if (discardableList.Count() > 0) + { + discardableList.Sort(CardContainer.CompareCardAttack); + return discardableList[0]; + } + + return selectResult; + } + + /// + /// Check whether negate opposite's effect and clear flag + /// + public void CheckDeactiveFlag() + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && Duel.LastChainPlayer == 1) + { + if (lastChainCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = false; + if (lastChainCard.IsCode(_CardId.LockBird)) enemyActivateLockBird = false; + if (lastChainCard.IsCode(CardId.DimensionShifter)) dimensionShifterCount = 0; + if (lastChainCard.Controller == 1 && lastChainCard.Location == CardLocation.MonsterZone) + { + currentNegateMonsterList.Add(lastChainCard); + } + } + } + + /// + /// Check negated turn count of id + /// + public int CheckCalledbytheGrave(int id) + { + if (currentNegatingIdList.Contains(id)) return 1; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + public int CheckRemainInDeck(params int[] ids) + { + int sumResult = 0; + foreach (int id in ids) + { + sumResult += CheckRemainInDeck(id); + } + + return sumResult; + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap()) + { + if (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true)) return true; + } + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) { + return true; + } + } + // how to get here? + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool toFieldCheck = false) + { + if ((Card.IsSpell() || Card.IsTrap()) && CheckSpellWillBeNegate()){ + return true; + } + if (DefaultCheckWhetherCardIsNegated(Card)) + { + return true; + } + if (Card.IsMonster() && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if (toFieldCheck || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) + { + return true; + } + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true, true)) + { + return true; + } + } + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { CardId.BanisheroftheRadiance, CardId.BanisheroftheLight, CardId.MacroCosmos, CardId.DimensionalFissure }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true) || cf.HasInSpellZone(cardid, true)) + { + return true; + } + } + } + return false; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && + (!Bot.GetMonsters().Any(card => card.IsFaceup() && !card.IsCode(CardId.KnightmareCorruptorIblee)) || (Duel.Player == 0 && Duel.Turn == 1))) + { + return true; + } + return false; + } + + public bool CheckShouldNoMoreSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + bool successFlag = false; + successFlag |= Bot.HasInHandOrInSpellZone(CardId.DogmatikaPunishment); + successFlag |= Bot.GetMonsters().Any(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster)); + successFlag |= Bot.HasInHand(CardId.DogmatikaFleurdelis) + && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)); + return successFlag; + } + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (lastcard.IsCode(_CardId.LockBird)) + { + bool needToSearch = false; + List searchEffectIdList = new List{ CardId.DogmatikaEcclesia, CardId.NadirServant }; + foreach (int checkId in searchEffectIdList) + { + if (Bot.HasInHandOrInSpellZone(checkId) && !activatedCardIdList.Contains(checkId)) needToSearch = true; + } + if (discardExtraThisTurn.Contains(CardId.TitanikladTheAshDragon)) needToSearch = true; + + if (!needToSearch) return false; + } + + return true; + } + + public bool CheckHasExtraOnField(ClientCard exceptCard = null) + { + List fieldMonsterList = Bot.GetMonsters(); + fieldMonsterList.AddRange(Enemy.GetMonsters()); + bool hasExtraOnField = fieldMonsterList.Any(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && card != exceptCard); + return hasExtraOnField; + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + public override int OnSelectOption(IList options) + { + // override for iris + List checkOptionList = new List{Util.GetStringId(CardId.ThesIrisSwordsoul, 4), Util.GetStringId(CardId.ThesIrisSwordsoul, 2)}; + foreach (int checkOption in checkOptionList) + { + for (int i = 0; i < options.Count(); ++ i) + { + if (options[i] == checkOption) return i; + } + } + return base.OnSelectOption(options); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (!cardData.HasType(CardType.Ritual) || cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } else if (cardData.HasType(CardType.Ritual)) + { + return CardPosition.FaceUpAttack; + } + int cardAttack = cardData.Attack; + if (cardId == CardId.DogmatikaFleurdelis && !activatedCardIdList.Contains(cardId + 1) && Duel.Player == 0) cardAttack += 500; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (Util.ChainContainPlayer(1) && hint == HintMsg.Remove && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int botCount = Bot.GetMonsterCount() + Bot.GetSpellCount(); + int oppositeCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (botCount - oppositeCount == min && min == max) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // non-ritual monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List nonSynchroMonsters = botMonsters.Where(card => !card.HasType(CardType.Ritual) && !banishList.Contains(card)).ToList(); + nonSynchroMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(nonSynchroMonsters); + + // spells + List spells = Bot.GetSpells(); + banishList.AddRange(ShuffleCardList(spells)); + + // ritual monster + List synchroMonsters = botMonsters.Where(card => card.HasType(CardType.Ritual) && !banishList.Contains(card)).ToList(); + synchroMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(synchroMonsters); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + } + if (maximusDiscardExtraIdList.Count() > 0 && min == 1 && max == 1 && hint == HintMsg.ToGrave) + { + List discardList = new List(); + foreach (int checkId in maximusDiscardExtraIdList) + { + ClientCard discardTarget = cards.FirstOrDefault(card => card.IsCode(checkId)); + if (discardTarget != null) discardList.Add(discardTarget); + } + if (discardList.Count() >= max) + { + if (discardList.Count() > 0) discardExtraThisTurn.Add(discardList[0]?.Id ?? 0); + return Util.CheckSelectCount(discardList, cards, min, max); + } + } + if (matrixActivating && hint == HintMsg.ToGrave && min == 1 && max == 1) + { + bool extraFlag = true; + // 0=not yet, 1=only bot, 2=only enemy, 3=mixed & skip + int enemyFlag = 0; + foreach (ClientCard card in cards) + { + extraFlag &= card.Location == CardLocation.Extra; + if (enemyFlag == 0) enemyFlag = card.Controller + 1; + else if (enemyFlag < 3 && enemyFlag != card.Controller + 1) enemyFlag = 3; + } + Logger.DebugWriteLine("===Matrix: extraFlag = " + extraFlag.ToString() + ", enemyFlag = " + enemyFlag.ToString()); + if (extraFlag && enemyFlag < 3) + { + List discardList = new List(); + // discard bot's extra + if (enemyFlag == 1) + { + ClientCard elder = null; + ClientCard ashDragon = null; + ClientCard garura = null; + ClientCard arcLight = null; + ClientCard psy = null; + ClientCard duskDragon = null; + ClientCard lilith = null; + foreach (ClientCard card in cards) + { + if (card.Id == CardId.ElderEntityNtss) elder = card; + if (card.Id == CardId.TitanikladTheAshDragon) ashDragon = card; + if (card.Id == CardId.GaruraWingsOfResonantLife) garura = card; + if (card.Id == CardId.HeraldOfTheArcLight) arcLight = card; + if (card.Id == CardId.PSYFramelordOmega) psy = card; + if (card.Id == CardId.GranguignolTheDuskDragon) duskDragon = card; + if (card.Id == CardId.DespianLuluwalilith) lilith = card; + } + + List destroyList = GetNormalEnemyTargetList(true, true, true); + if (elder != null && destroyList.Count() > 0) discardList.Add(elder); + if (ashDragon != null && !activatedCardIdList.Contains(CardId.TitanikladTheAshDragon) && !discardEnemyExtraIdList.Contains(CardId.TitanikladTheAshDragon)) + { + bool checkFlag = !activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0 + && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0; + checkFlag |= CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0 && !Bot.HasInHand(CardId.DogmatikaFleurdelis) && !enemyActivateLockBird; + if (checkFlag) discardList.Add(ashDragon); + } + if (garura != null && !activatedCardIdList.Contains(CardId.GaruraWingsOfResonantLife) && !enemyActivateLockBird) discardList.Add(garura); + if (arcLight != null && GetNeedSearchRitualCardIdList().Count() > 0) discardList.Add(arcLight); + if (psy != null) discardList.Add(psy); + if (duskDragon != null) discardList.Add(duskDragon); + if (lilith != null && !activatedCardIdList.Contains(CardId.DespianLuluwalilith) && !discardEnemyExtraIdList.Contains(CardId.DespianLuluwalilith)) + { + discardList.Add(lilith); + } + + if (discardList.Count() > 0) discardExtraThisTurn.Add(discardList[0]?.Id ?? 0); + } + // discard enemy's extra + if (enemyFlag == 2) + { + checkedEnemyExtra = true; + avoid2Monster = false; + confirmLink2 = false; + List discardIfKnightmare = new List{ 96380700, 48068378, 14812471, 32995276, 30342076, CardId.Linguriboh, 3679218 }; + foreach (ClientCard card in cards) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(card.Id); + if (cardData != null) + { + confirmLink2 |= cardData.HasType(CardType.Link) && cardData.Level <= 2; + avoid2Monster |= (cardData.HasType(CardType.Link) && cardData.Level <= 2) || cardData.HasType(CardType.Synchro | CardType.Xyz); + if (Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee)) + { + if (discardIfKnightmare.Contains(card.Id)) discardList.Add(card); + } + } + } + discardList = ShuffleCardList(discardList); + + // avoid link summon + foreach (ClientCard card in cards) + { + if (discardList.Contains(card)) continue; + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(card.Id); + if (cardData != null && Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee) + && cardData.HasType(CardType.Link) && cardData.Level <= Enemy.GetMonsterCount()) + { + discardList.Add(card); + } + } + + // discard important card + foreach (ClientCard card in cards) + { + if (discardList.Contains(card)) continue; + if (discardEnemyExtraIdList.Contains(card.Id)) discardList.Add(card); + } + + // discard single card first + List singleCardList = new List(); + List multiCardList = new List(); + foreach (ClientCard card in cards) + { + if (discardList.Contains(card)) continue; + if (cards.Any(oc => card != oc && card.IsCode(oc.Id))) multiCardList.Add(card); + else singleCardList.Add(card); + } + + discardList.AddRange(singleCardList.OrderByDescending(c => { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(c.Id); + return cardData?.Attack ?? 0; + })); + discardList.AddRange(multiCardList.OrderByDescending(c => { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(c.Id); + return cardData?.Attack ?? 0; + })); + } + + if (discardList.Count() > 0) return Util.CheckSelectCount(discardList, cards, min, max); + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + banSpSummonFromExTurn = 0; + checkedEnemyExtra = false; + avoid2Monster = true; + dimensionShifterCount = 0; + + enemySpSummonFromExLastTurn = 0; + enemySpSummonFromExThisTurn = 0; + } + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + omegaActivateCount = 0; + enemySpSummonFromExLastTurn = enemySpSummonFromExThisTurn; + enemySpSummonFromExThisTurn = 0; + currentNegatingIdList.Clear(); + + if (dimensionShifterCount > 0) dimensionShifterCount--; + infiniteImpermanenceList.Clear(); + + summoned = false; + activatedCardIdList.Clear(); + discardExtraThisTurn.Clear(); + activatedMatrixList.Clear(); + if (Duel.Player == 1 && banSpSummonFromExTurn > 0) + { + banSpSummonFromExTurn -= 1; + } + base.OnNewTurn(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (previousControler == 1 && currentLocation == (int)CardLocation.MonsterZone) + { + if (previousLocation == (int)CardLocation.Deck) enemySpSummonFromDeck = true; + if (previousLocation == (int)CardLocation.Extra) + { + enemySpSummonFromExtra = true; + enemySpSummonFromExThisTurn ++; + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + public override BattlePhaseAction OnBattle(IList attackers, IList defenders) + { + if (attackers.Count() == 1 && defenders.Count() == 1) + { + if (defenders[0].IsCode(CardId.KnightmareCorruptorIblee) && !confirmLink2) return new BattlePhaseAction(BattlePhaseAction.BattleAction.ToMainPhaseTwo); + } + if (attackers.Count() > 0 && defenders.Count() > 0) + { + List sortedAttacker = attackers.OrderBy(card => card.Attack).ToList(); + for (int k = 0; k < sortedAttacker.Count; ++k) + { + ClientCard attacker = sortedAttacker[k]; + attacker.IsLastAttacker = k == sortedAttacker.Count - 1; + BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders); + if (result != null) + return result; + } + } + + return base.OnBattle(attackers, defenders); + } + + public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList defenders) + { + foreach (ClientCard defender in defenders) + { + attacker.RealPower = attacker.Attack; + defender.RealPower = defender.GetDefensePower(); + if (!OnPreBattleBetween(attacker, defender)) + continue; + + if (attacker.RealPower > defender.RealPower) + return AI.Attack(attacker, defender); + + if (attacker.RealPower == defender.RealPower && defender.IsAttack() && Bot.GetMonsterCount() >= Enemy.GetMonsterCount()) + return AI.Attack(attacker, defender); + } + + if (attacker.CanDirectAttack) + return AI.Attack(attacker, null); + + return null; + } + + public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) + { + if (!defender.IsMonsterHasPreventActivationEffectInBattle()) + { + if (!activatedCardIdList.Contains(CardId.DogmatikaFleurdelis + 1) && Bot.HasInMonstersZone(CardId.DogmatikaFleurdelis, true, false, true) + && attacker.HasSetcode(SetcodeDogmatika)) + { + attacker.RealPower += 500; + } + } + return base.OnPreBattleBetween(attacker, defender); + } + + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && !DefaultCheckWhetherCardIdIsNegated(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4-i); + break; + } + } + } + } + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.ActivatePlayer == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) + enemyActivateLockBird = true; + if (currentCard.IsCode(CardId.DimensionShifter)) + dimensionShifterCount = 2; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard.RelatedCard) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + } + + public override void OnChainEnd() + { + currentNegateMonsterList.Clear(); + currentDestroyCardList.Clear(); + maximusDiscardExtraIdList.Clear(); + matrixActivating = false; + base.OnChainEnd(); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool DogmatikaAlbaZoaActivate() + { + if (CheckWhetherNegated()) return false; + if (Enemy.GetMonsters().Any(card => card != null && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) + && Duel.Phase == DuelPhase.Main1 && Enemy.ExtraDeck.Count() > 1) + { + return false; + } + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool ThesIrisSwordsoulActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.Hand) + { + if (CheckShouldNoMoreSpSummon()) + { + return false; + } + return true; + } + if (enemySpSummonFromDeck || enemySpSummonFromExtra) return true; + + return false; + } + + public bool ClearIrisFlag() + { + enemySpSummonFromDeck = false; + enemySpSummonFromExtra = false; + + return false; + } + + public bool DogmatikaFleurdelisActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.Hand) + { + bool canNegate = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)) && Enemy.GetMonsters().Any(card => card.IsFaceup()); + if (canNegate) + { + // for negate effect + List shouldNegateList = GetMonsterListForTargetNegate(true); + if (shouldNegateList.Count() > 0) + { + ClientCard target = shouldNegateList[0]; + currentNegateMonsterList.Add(target); + AI.SelectYesNo(true); + AI.SelectCard(target); + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + return true; + } + // for iris + if (Bot.HasInHand(CardId.ThesIrisSwordsoul)) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectYesNo(true); + AI.SelectCard(target); + } else { + List enemyTargetList = ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsDisabled()).ToList()); + if (enemyTargetList.Count() > 0) + { + AI.SelectYesNo(true); + AI.SelectCard(enemyTargetList); + } else AI.SelectYesNo(false); + } + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + return true; + } + } + // for total attack + if (Duel.Player == 0 && Enemy.GetMonsterCount() == 0) { + int totalAttack = Util.GetTotalAttackingMonsterAttack(0); + if (totalAttack < Enemy.LifePoints) + { + totalAttack += Bot.GetMonsters().Where(card => card.HasSetcode(SetcodeDogmatika)).Count() * 500 + 3000; + if (totalAttack >= Enemy.LifePoints) + { + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + AI.SelectYesNo(false); + return true; + } + } + } + // for avoid lose + if (Duel.Player == 1 && Bot.GetMonsterCount() == 0 && Util.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints + && Duel.Phase == DuelPhase.Main1 && (CurrentTiming & hintTimingMainEnd) != 0 && Duel.Turn > 1) + { + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + List enemyTargetList = ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsDisabled()).ToList()); + if (enemyTargetList.Count() > 0) + { + AI.SelectYesNo(true); + AI.SelectCard(enemyTargetList); + } + else + { + AI.SelectYesNo(false); + } + return true; + } + } + if (Card.Location == CardLocation.MonsterZone) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool DogmatikaFleurdelisDelayActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.Hand) + { + bool checkFlag = false; + bool notQuickTiming = Duel.LastChainPlayer == -1 && CurrentTiming <= 0; + if (Duel.Player == 0 && Duel.Phase == DuelPhase.Main1 && notQuickTiming && Duel.Turn > 1) + { + Logger.DebugWriteLine("=== timing: " + CurrentTiming.ToString()); + int attack = Util.GetBestAttack(Bot); + List currentBetterList = Enemy.MonsterZone.GetMonsters().Where(card => card.GetDefensePower() >= attack).ToList(); + List newBetterList = Enemy.MonsterZone.GetMonsters().Where(card => card.GetDefensePower() >= 3000).ToList(); + if (currentBetterList.Count() > newBetterList.Count()) checkFlag = true; + } + if ((Bot.HasInHandOrInSpellZone(CardId.SinfulSpoilsOfDoom_Rciela) && Duel.Player == 0 && notQuickTiming) + || Bot.GetSpells().Any(card => card.IsCode(CardId.SinfulSpoilsOfDoom_Rciela) && card.IsFacedown())) + { + if (!Bot.GetMonsters().Any(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster))) checkFlag = true; + } + if (checkFlag) + { + List enemyTargetList = ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsDisabled()).ToList()); + if (enemyTargetList.Count() > 0) + { + AI.SelectYesNo(true); + AI.SelectCard(enemyTargetList); + } + else AI.SelectYesNo(false); + activatedCardIdList.Add(CardId.DogmatikaFleurdelis); + return true; + } + } + return false; + } + + public bool DogmatikaMaximusActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.Hand) + { + if (CheckShouldNoMoreSpSummon()) return false; + // banish dump extra + List dumpIdCheck = new List{ CardId.ElderEntityNtss, CardId.GaruraWingsOfResonantLife, CardId.DespianLuluwalilith }; + foreach (int dumpId in dumpIdCheck) + { + IEnumerable checkList = Bot.GetGraveyardMonsters().Where(card => card.IsCode(dumpId)); + if (checkList.Count() > 1) + { + IEnumerable notSummonList = checkList.Where(card => card.ProcCompleted == 0); + if (notSummonList.Count() > 0) + { + AI.SelectCard(notSummonList.ToList()); + return true; + } + AI.SelectCard(checkList.ToList()); + return true; + } + } + + // find not summoned card + List notSummonedList = ShuffleCardList(Bot.Graveyard.Where(card => card != null && card.IsMonster() && card.ProcCompleted == 0 + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).ToList()); + if (notSummonedList.Count() > 0) + { + AI.SelectCard(notSummonedList); + return true; + } + + // sort by attack + List graveTargetList = Bot.Graveyard.Where(card => card != null && card.IsMonster() + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).OrderBy(card => card.Attack).ToList(); + if (graveTargetList.Count() > 0) + { + AI.SelectCard(graveTargetList); + return true; + } + } + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherWillbeRemoved()) return false; + List decidedToDiscard = new List(); + List checkDiscardIdList = new List{ CardId.ElderEntityNtss, CardId.HeraldOfTheArcLight, CardId.GaruraWingsOfResonantLife, + CardId.TitanikladTheAshDragon, CardId.GranguignolTheDuskDragon, CardId.PSYFramelordOmega, CardId.DespianLuluwalilith }; + foreach (int checkId in checkDiscardIdList) + { + if (Bot.HasInExtra(checkId) && !activatedCardIdList.Contains(checkId)) + { + if (checkId == CardId.ElderEntityNtss) + { + List destroyList = GetNormalEnemyTargetList(true, false); + if (destroyList.Count() == 0) continue; + } + if (enemyActivateLockBird && (checkId == CardId.HeraldOfTheArcLight || checkId == CardId.GaruraWingsOfResonantLife)) + { + continue; + } + if (checkId == CardId.HeraldOfTheArcLight) + { + if (Bot.HasInMonstersZone(CardId.DogmatikaAlbaZoa)) continue; + if (GetNeedSearchRitualCardIdList().Count() == 0) continue; + } + if (checkId == CardId.GaruraWingsOfResonantLife && activatedCardIdList.Contains(CardId.GaruraWingsOfResonantLife)) + { + continue; + } + if (discardExtraThisTurn.Contains(checkId) && (checkId == CardId.TitanikladTheAshDragon || checkId == CardId.DespianLuluwalilith)) + { + continue; + } + decidedToDiscard.Add(checkId); + } + } + + maximusDiscardExtraIdList.AddRange(decidedToDiscard); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + + return false; + } + + public bool DiabellstarTheBlackWitchSpSummon() + { + bool hasEmptyMonsterZone = false; + for (int i = 0; i < 5; ++ i) + { + if (Bot.MonsterZone[i] == null) + { + hasEmptyMonsterZone = true; + break; + } + } + if (hasEmptyMonsterZone) + { + if (Bot.HasInHandOrInSpellZone(CardId.WANTED_SeekerOfSinfulSpoils)) + { + AI.SelectCard(CardId.WANTED_SeekerOfSinfulSpoils); + return true; + } + if (activatedMatrixList.Count() > 0) + { + AI.SelectCard(activatedMatrixList); + return true; + } + if (Bot.GetSpells().Where(card => card.IsCode(CardId.DogmatikaMatrix)).Count() > 1) + { + AI.SelectCard(CardId.DogmatikaMatrix); + return true; + } + } + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) || Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)).Count() > 1) + { + List checkIdList = new List{ CardId.DogmatikaEcclesia, CardId.DogmatikaMaximus}; + foreach (int checkId in checkIdList) + { + ClientCard costMonster = null; + if (activatedCardIdList.Contains(checkId)) costMonster = Bot.GetMonsters().FirstOrDefault(card => card.IsCode(checkId)); + if (costMonster == null) costMonster = Bot.GetMonsters().FirstOrDefault(card => card.IsCode(checkId) && card.IsDisabled()); + if (costMonster != null) + { + AI.SelectCard(costMonster); + return true; + } + } + } + if (hasEmptyMonsterZone) + { + List checkIdList = new List { CardId.KnightmareCorruptorIblee, CardId.ThesIrisSwordsoul }; + foreach (int checkId in checkIdList) + { + if (Bot.HasInHand(checkId)) + { + AI.SelectCard(checkId); + return true; + } + } + } + List faceDownMonsters = Bot.GetMonsters().Where(card => card.IsFacedown()).OrderBy(card => { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(card.Id); + if (cardData != null) + { + return cardData.Attack; + } + return card.Attack; + }).ToList(); + if (faceDownMonsters.Count() > 0) + { + AI.SelectCard(faceDownMonsters); + return true; + } + if (hasEmptyMonsterZone) + { + if (Bot.HasInHand(CardId.DogmatikaFleurdelis) && Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)).Count() == 0) + { + AI.SelectCard(CardId.DogmatikaFleurdelis); + return true; + } + if (CheckRemainInDeck(CardId.DogmatikaMacabre) > 0) + { + ClientCard albaZoaInHand = Bot.Hand.FirstOrDefault(card => card.IsCode(CardId.DogmatikaAlbaZoa)); + if (albaZoaInHand != null) + { + AI.SelectCard(albaZoaInHand); + return true; + } + } + List dumpIdList = new List{ CardId.DogmatikaPunishment, _CardId.InfiniteImpermanence, _CardId.CalledByTheGrave, _CardId.AshBlossom, _CardId.MaxxC }; + foreach (int dumpId in dumpIdList) + { + int checkCount = Bot.Hand.Where(card => card.IsCode(dumpId)).Count(); + checkCount += Bot.SpellZone.Where(card => card != null && card.IsCode(dumpId)).Count(); + if (checkCount > 1) + { + AI.SelectCard(dumpId); + return true; + } + } + List extraCheckList = Bot.GetMonsters().Where(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Link)) + .OrderBy(card => card.Attack).ToList(); + foreach (ClientCard checkCard in extraCheckList) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) || CheckHasExtraOnField(checkCard)) + { + AI.SelectCard(checkCard); + return true; + } + } + } + if (Bot.GetMonsterCount() == 0 || CheckRemainInDeck(CardId.SinfulSpoilsOfDoom_Rciela) > 0) + { + List spellIdList = new List{ _CardId.CrossoutDesignator, _CardId.InfiniteImpermanence, _CardId.CalledByTheGrave, + CardId.DogmatikaPunishment, CardId.DogmatikaMacabre, CardId.DogmatikaLamity }; + foreach (int spellId in spellIdList) + { + if (Bot.HasInHandOrInSpellZone(spellId)) + { + AI.SelectCard(spellId); + return true; + } + } + } + + return false; + } + + public bool DiabellstarTheBlackWitchActivate() + { + if (CheckWhetherNegated()) return false; + if (Card.Location == CardLocation.MonsterZone) + { + AI.SelectCard(CardId.SinfulSpoilsOfDoom_Rciela, CardId.WANTED_SeekerOfSinfulSpoils); + SelectSTPlace(); + activatedCardIdList.Add(Card.Id); + return true; + } + + return false; + } + + public bool DogmatikaEcclesiaSummon() + { + if (enemyActivateLockBird) return false; + if (CheckWhetherNegated()) return false; + if (activatedCardIdList.Contains(Card.Id)) return false; + + summoned = true; + return true; + } + + public bool DogmatikaEcclesiaActivate() + { + if (CheckWhetherNegated()) return false; + // sp summon + if (Card.Location == CardLocation.Hand) + { + if (activatedCardIdList.Contains(Card.Id)) return false; + if (CheckShouldNoMoreSpSummon()) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) || Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + return false; + } + } + if (enemyActivateLockBird) + { + if (Bot.HasInHand(CardId.DogmatikaFleurdelis) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + return true; + } + return false; + } + return true; + } + // search + if (Card.Location == CardLocation.MonsterZone) + { + if ((Duel.Player == 0 && Duel.Phase == DuelPhase.End) || (Duel.Player == 1 && Duel.Phase < DuelPhase.End)) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) && CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0) + { + AI.SelectCard(CardId.DogmatikaFleurdelis); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + } + + // for maxxc + if (CheckAtAdvantage() && enemyActivateMaxxC) + { + List checkIdListFirstPart = new List{ CardId.DogmatikaPunishment, CardId.DogmatikaFleurdelis }; + if (DogmatikaMatrixCanActivate()) + { + checkIdListFirstPart.Add(CardId.DogmatikaMatrix); + } + checkIdListFirstPart.AddRange(new List{ CardId.DogmatikaMaximus, CardId.DogmatikaAlbaZoa, CardId.DogmatikaMacabre, CardId.DogmatikaLamity }); + checkIdListFirstPart.Add(CardId.DogmatikaMatrix); + foreach (int checkId in checkIdListFirstPart) + { + if (!Bot.HasInHandOrInSpellZone(checkId) && CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + } + } + + // search matrix + bool canSearchMatrix = DogmatikaMatrixCanActivate() && !activatedCardIdList.Contains(CardId.DogmatikaMatrix) + && CheckRemainInDeck(CardId.DogmatikaMatrix) > 0 && !Bot.HasInHand(CardId.DogmatikaMatrix); + if (canSearchMatrix && Enemy.GetMonsterCount() > 0) + { + AI.SelectCard(CardId.DogmatikaMatrix); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + + // search for ritual + List needSearchRitualIdList = GetNeedSearchRitualCardIdList(); + bool canSearchMaximus = CheckRemainInDeck(CardId.DogmatikaMaximus) > 0 && !activatedCardIdList.Contains(CardId.DogmatikaMaximus) + && Bot.Graveyard.Where(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).Count() > 0; + if (needSearchRitualIdList.Count() > 0) + { + // matrix + if (canSearchMatrix) + { + AI.SelectCard(CardId.DogmatikaMatrix); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + // maximus + if (canSearchMaximus && Bot.HasInExtra(CardId.HeraldOfTheArcLight)) + { + AI.SelectCard(CardId.DogmatikaMaximus); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + + } + + // search maximus + if (canSearchMaximus) + { + AI.SelectCard(CardId.DogmatikaMaximus); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + + List checkIdListSecondPart = new List{ CardId.DogmatikaPunishment, CardId.DogmatikaFleurdelis }; + if (DogmatikaMatrixCanActivate()) + { + checkIdListSecondPart.Add(CardId.DogmatikaMatrix); + } + checkIdListSecondPart.AddRange(new List{ CardId.DogmatikaMaximus, CardId.DogmatikaAlbaZoa, CardId.DogmatikaMacabre, CardId.DogmatikaLamity }); + checkIdListSecondPart.Add(CardId.DogmatikaMatrix); + foreach (int checkId in checkIdListSecondPart) + { + if (!Bot.HasInHandOrInSpellZone(checkId) && CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + return true; + } + } + } + + return false; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (DefaultAshBlossomAndJoyousSpring()) + { + CheckDeactiveFlag(); + return true; + } + return false; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated() || Duel.LastChainPlayer == 0) return false; + if (Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee, true, false, true) && !confirmLink2) return false; + return DefaultMaxxC(); + } + + public bool KnightmareCorruptorIbleeSummon() + { + if (banSpSummonFromExTurn > 0) return false; + if (CheckWhetherWillbeRemoved()) return false; + if (activatedCardIdList.Contains(CardId.KnightmareCorruptorIblee)) return false; + if (Bot.HasInExtra(CardId.SalamangreatAlmiraj) || Bot.HasInExtra(CardId.Linguriboh)) + { + summoned = true; + return true; + } + + if (Bot.HasInExtra(CardId.SPLittleKnight)) + { + // TODO + } + + return false; + } + + public bool KnightmareCorruptorIbleeActivate() + { + if (Util.IsTurn1OrMain2()) return true; + if (Duel.Turn > 1) + { + if (Bot.HasInHand(CardId.DogmatikaMatrix) && DogmatikaMatrixCanActivate()) + { + return true; + } + if (Enemy.GetMonsterCount() > 0) + { + return true; + } + } + return false; + } + + public bool NadirServantActivate() + { + if (CheckWhetherNegated() || CheckWhetherWillbeRemoved()) return false; + ClientCard discardExtra = null; + int searchId = 0; + + // search ecclesia + if (!activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0 && !Bot.HasInHand(CardId.DogmatikaEcclesia)) + { + if (CheckHasExtraOnField() || !summoned) + { + if (Bot.HasInGraveyard(CardId.DogmatikaEcclesia) || CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0) + { + searchId = CardId.DogmatikaEcclesia; + discardExtra = GetExtraToDiscard(1500, null); + } + } + } + + // search maximus + if (searchId == 0 || discardExtra == null) + { + if (!activatedCardIdList.Contains(CardId.DogmatikaMaximus) && CheckCalledbytheGrave(CardId.DogmatikaMaximus) == 0 + && Bot.HasInGraveyard(CardId.DogmatikaMaximus) || CheckRemainInDeck(CardId.DogmatikaMaximus) > 0) + { + searchId = CardId.DogmatikaMaximus; + discardExtra = GetExtraToDiscard(1500, null); + } + } + + // search Fleurdelis + if (searchId == 0 || discardExtra == null) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika)) + && Bot.HasInGraveyard(CardId.DogmatikaFleurdelis) || CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0) + { + searchId = CardId.DogmatikaFleurdelis; + discardExtra = GetExtraToDiscard(2500, null); + } + } + + // search ecclesia for next turn + if (searchId == 0 || discardExtra == null) + { + if (Bot.HasInGraveyard(CardId.DogmatikaEcclesia) || CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0) + { + searchId = CardId.DogmatikaEcclesia; + discardExtra = GetExtraToDiscard(1500, null); + } + } + + if (discardExtra != null && searchId > 0) + { + discardExtraThisTurn.Add(discardExtra?.Id ?? 0); + AI.SelectCard(discardExtra); + ClientCard targetInGY = Bot.Graveyard.FirstOrDefault(card => card != null && card.IsCode(searchId)); + if (targetInGY != null) + { + AI.SelectNextCard(targetInGY); + } else { + AI.SelectNextCard(searchId); + } + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool DogmatikaLamityActivate() + { + if (CheckWhetherNegated()) return false; + // use lilith + if (Bot.HasInExtra(CardId.DespianLuluwalilith)) + { + AI.SelectYesNo(true); + AI.SelectCard(CardId.DogmatikaAlbaZoa); + AI.SelectNextCard(CardId.DespianLuluwalilith); + discardExtraThisTurn.Add(CardId.DespianLuluwalilith); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool DogmatikaLamityDelayActivate() + { + if (CheckWhetherNegated() || Bot.HasInExtra(CardId.DespianLuluwalilith)) return false; + if (Bot.HasInMonstersZone(CardId.DogmatikaAlbaZoa, false, false, true)) return false; + List materialList = new List(); + int totalLevel = 0; + List faceDownMonsterList = Bot.GetMonsters().Where(card => !card.HasType(CardType.Xyz) && card.IsFacedown()).OrderByDescending(card => card.Level).ToList(); + foreach (ClientCard faceDownMonster in faceDownMonsterList) + { + materialList.Add(faceDownMonster); + totalLevel += faceDownMonster.Level; + if (totalLevel >= 12) break; + } + + ClientCard handSummonTarget = Bot.Hand.FirstOrDefault(card => card.IsCode(CardId.DogmatikaAlbaZoa)); + if (handSummonTarget == null) return false; + int extraUseCount = 0; + List extraMonsterList = Bot.GetMonsters().Where(card => !card.HasType(CardType.Xyz | CardType.Link) && card.IsFaceup()) + .OrderByDescending(card => card.Level).ToList(); + extraMonsterList.AddRange(Bot.Hand.Where(card => card.IsMonster() && card != handSummonTarget).OrderByDescending(card => card.Level).ToList()); + foreach (ClientCard faceUpMonster in extraMonsterList) + { + if (totalLevel >= 12 || extraUseCount >= 1) break; + materialList.Add(faceUpMonster); + totalLevel += faceUpMonster.Level; + extraUseCount ++; + } + + if (totalLevel >= 12) + { + AI.SelectYesNo(false); + AI.SelectCard(CardId.DogmatikaAlbaZoa); + AI.SelectNextCard(materialList); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(1); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool DogmatikaMacabreActivate() + { + if (Bot.HasInMonstersZone(CardId.DogmatikaAlbaZoa)) return false; + if (CheckWhetherNegated()) return false; + List gyMaterialList = Bot.Graveyard.Where(card => card != null && card.HasType(CardType.Fusion | CardType.Synchro)) + .OrderByDescending(card => card.Level).ToList(); + List selectMaterialList = new List(); + int totalLevel = 0; + List checkDiscardThisTurnIdList = new List { CardId.DespianLuluwalilith, CardId.TitanikladTheAshDragon }; + foreach (ClientCard material in gyMaterialList) + { + if (material.IsCode(CardId.PSYFramelordOmega)) continue; + if (CheckAtAdvantage()) + { + foreach (int checkId in checkDiscardThisTurnIdList) + { + if (material.IsCode(checkId) && discardExtraThisTurn.Contains(checkId)) continue; + } + } + totalLevel += material.Level; + selectMaterialList.Add(material); + if (totalLevel >= 12) break; + } + if (totalLevel >= 12) + { + ClientCard graveAlbaZoa = Bot.Graveyard.FirstOrDefault(card => card.IsCode(CardId.DogmatikaAlbaZoa)); + if (graveAlbaZoa != null) + { + AI.SelectCard(graveAlbaZoa); + } else { + AI.SelectCard(CardId.DogmatikaAlbaZoa); + } + AI.SelectMaterials(selectMaterialList, HintMsg.Release); + SelectSTPlace(null, true); + return true; + } + + return false; + } + + public bool SinfulSpoilsOfDoom_RcielaActivate() + { + // select self target + ClientCard selfTarget = null; + bool activateFlag = false; + List selfCasterList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster)) + .OrderByDescending(card => card.Attack).ThenByDescending(card => card.Level).ToList(); + bool onlyAlbaZoa = selfCasterList.Count() == 1 && selfCasterList[0].IsCode(CardId.DogmatikaAlbaZoa); + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.Controller == 1 && lastChainCard.IsMonster()) + { + bool negateFlag = lastChainCard.IsCode(_CardId.EffectVeiler, CardId.GhostMournerMoonlitChill); + if (Duel.Turn > 1 || !negateFlag) + { + foreach (ClientCard chainTarget in Duel.LastChainTargets) + { + if (selfCasterList.Contains(chainTarget) && (!negateFlag || !chainTarget.IsCode(CardId.DiabellstarTheBlackWitch))) + { + selfTarget = chainTarget; + activateFlag = true; + break; + } + } + } + } + if (selfTarget == null && !onlyAlbaZoa) + { + selfTarget = selfCasterList.FirstOrDefault(card => !card.IsCode(CardId.DogmatikaAlbaZoa)); + } + if (DefaultOnBecomeTarget() && !onlyAlbaZoa) + { + activateFlag = true; + } + + if (selfTarget != null) + { + int targetAttack = selfTarget.Attack; + // destroy danger monster + ClientCard dangerCard = GetProblematicEnemyMonster(-1, true, true); + if (dangerCard != null) + { + activateFlag = true; + } + + // destroy multi monster + if (!onlyAlbaZoa) + { + List toDestroyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup() + && card.Attack > 0 && card.Attack <= targetAttack && !currentDestroyCardList.Contains(card) + && (Duel.Player == 1 || card != Enemy.BattlingMonster)).ToList(); + if (toDestroyMonsterList.Count() > 1) + { + activateFlag = true; + currentDestroyCardList.AddRange(toDestroyMonsterList); + } + } + + // decrease attack + int botWorstPower = Util.GetWorstBotMonster()?.GetDefensePower() ?? 0; + bool decreaseFlag = Duel.Player == 1 && Enemy.GetMonsters().Any(card => card.Attack >= botWorstPower + && card.IsMonsterHasPreventActivationEffectInBattle()) && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2; + decreaseFlag |= (!onlyAlbaZoa || (Bot.BattlingMonster?.IsCode(CardId.DogmatikaAlbaZoa) ?? false)) + && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) + && Duel.LastChainPlayer != 0 && (CurrentTiming & hintDamageStep) != 0 && CurrentTiming > 0; + if (decreaseFlag) + { + activateFlag = true; + } + } + + if (activateFlag) + { + SelectSTPlace(null, true); + AI.SelectCard(selfTarget); + return true; + } + + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + // negate + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (CheckCalledbytheGrave(code) > 0) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + if (Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)) != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentNegatingIdList.Add(code); + CheckDeactiveFlag(); + return true; + } + } + + // banish target + foreach (ClientCard cards in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(cards) && cards.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = cards.GetOriginCode(); + AI.SelectCard(cards); + currentNegatingIdList.Add(code); + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(enemyMonsters); + currentNegatingIdList.Add(code); + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count() > 0) { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(targets); + currentNegatingIdList.Add(code); + return true; + } + + return false; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + // negate + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + // do not negate black witch + if (code == CardId.DiabellstarTheBlackWitch) return false; + if (CheckCalledbytheGrave(code) > 0) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + currentNegatingIdList.Add(code); + CheckDeactiveFlag(); + return true; + } + } + return false; + } + + public bool WANTED_SeekerOfSinfulSpoilsActivate() + { + if (Card.Location == CardLocation.Hand || (Card.Location == CardLocation.SpellZone && Card.HasPosition(CardPosition.FaceDown))) + { + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + + return true; + } + + public bool DogmatikaMatrixCanActivate() + { + return CheckRemainInDeck(CardId.DogmatikaAlbaZoa, CardId.DogmatikaLamity, CardId.DogmatikaMacabre) > 0; + } + + public bool DogmatikaMatrixActivate() + { + if (CheckWhetherNegated()) return false; + + // activate for search + if (Card.Location == CardLocation.Hand || (Card.Location == CardLocation.SpellZone && Card.HasPosition(CardPosition.FaceDown))) + { + List neededRitualCardIdList = GetNeedSearchRitualCardIdList(); + // can only search ritual + if (Enemy.GetMonsterCount() == 0) + { + if (!Bot.MonsterZone.Any(card => card != null && card.IsFaceup() && card.HasType(CardType.Ritual) && card.HasSetcode(SetcodeDogmatika)) + && neededRitualCardIdList.Count() <= 0) + { + return false; + } + SelectSTPlace(null, true); + AI.SelectCard(neededRitualCardIdList); + // in case enemy summon monster after activated + AI.SelectYesNo(true); + activatedCardIdList.Add(Card.Id); + return true; + } + // can search both + else + { + if (neededRitualCardIdList.Count() <= 0) + { + SelectSTPlace(null, true); + AI.SelectYesNo(true); + // search both monster and spell + if (CheckRemainInDeck(CardId.DogmatikaAlbaZoa) > 0 && CheckRemainInDeck(CardId.DogmatikaLamity, CardId.DogmatikaMacabre) > 0) + { + AI.SelectCard(CardId.DogmatikaAlbaZoa); + AI.SelectNextCard(CardId.DogmatikaLamity, CardId.DogmatikaMacabre); + } + else + { + AI.SelectCard(CardId.DogmatikaAlbaZoa, CardId.DogmatikaLamity, CardId.DogmatikaMacabre); + DogmatikaMatrixNextSearch(); + } + activatedCardIdList.Add(Card.Id); + return true; + } + else + { + SelectSTPlace(null, true); + AI.SelectCard(neededRitualCardIdList); + AI.SelectYesNo(true); + DogmatikaMatrixNextSearch(); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + // discard extra + else + { + int option = 0; + if (CheckWhetherWillbeRemoved()) option = 1; + if (!checkedEnemyExtra && Enemy.ExtraDeck.Count() > 0) option = 1; + if (Enemy.HasInMonstersZone(CardId.KnightmareCorruptorIblee) && avoid2Monster) option = 1; + if (!Bot.HasInExtra(CardId.ElderEntityNtss) || GetNormalEnemyTargetList(true, false, false).Count() <= 0) + { + List checkActivatedIdList = new List{ CardId.GaruraWingsOfResonantLife, CardId.DespianLuluwalilith, + CardId.TitanikladTheAshDragon, CardId.GranguignolTheDuskDragon, CardId.PSYFramelordOmega }; + bool checkFlag = false; + foreach (int checkId in checkActivatedIdList) + { + checkFlag |= !discardExtraThisTurn.Contains(checkId) && !activatedCardIdList.Contains(checkId) && Bot.HasInExtra(checkId); + } + if (!checkFlag) + { + option = 1; + } + } + + Logger.DebugWriteLine("===Matrix option: " + option.ToString()); + matrixActivating = true; + AI.SelectOption(option); + activatedMatrixList.Add(Card); + return true; + } + } + + public void DogmatikaMatrixNextSearch() + { + List fieldMonsterList = Bot.GetMonsters(); + fieldMonsterList.AddRange(Enemy.GetMonsters()); + bool hasExtraOnField = fieldMonsterList.Any(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)); + + // search ecclesia + if (!activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0) + { + if (hasExtraOnField || !summoned) + { + if (CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0) + { + AI.SelectNextCard(CardId.DogmatikaEcclesia); + return; + } + } + } + + // seach Maximus + if (CheckRemainInDeck(CardId.DogmatikaMaximus) > 0 && !activatedCardIdList.Contains(CardId.DogmatikaMaximus) + && Bot.Graveyard.Where(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).Count() > 0) + { + AI.SelectNextCard(CardId.DogmatikaMaximus); + return; + } + + // search Fleurdelis + if (CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0 && !Bot.HasInHand(CardId.DogmatikaFleurdelis) && hasExtraOnField + && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + AI.SelectNextCard(CardId.DogmatikaFleurdelis); + return; + } + + List searchIdList = new List{ CardId.DogmatikaPunishment, CardId.DogmatikaEcclesia, CardId.DogmatikaMatrix, + CardId.DogmatikaMaximus, CardId.DogmatikaFleurdelis, CardId.DogmatikaAlbaZoa, CardId.DogmatikaLamity, CardId.DogmatikaMacabre }; + foreach (int searchId in searchIdList) + { + if (CheckRemainInDeck(searchId) > 0) + { + AI.SelectNextCard(searchId); + return; + } + } + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ( (this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + CheckDeactiveFlag(); + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectCard(target); + } else { + AI.SelectCard(Enemy.GetMonsters()); + } + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(false, true); + if (shouldNegateList.Count() > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateMonsterList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++ i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + public bool DogmatikaPunishmentActivate() + { + if (CheckWhetherNegated() || CheckWhetherWillbeRemoved()) return false; + + ClientCard targetCard = null; + ClientCard extraToDiscard = null; + + // destroy problem card by ntss + List targetList = GetProblematicEnemyCardList(true, true); + if (targetList.Count() > 0 && Duel.LastChainPlayer != 0 && Bot.HasInExtra(CardId.ElderEntityNtss)) + { + foreach (ClientCard target in targetList) + { + if (target.IsFaceup() && target.IsMonster() && target.Attack <= 2500) + { + targetCard = target; + extraToDiscard = GetExtraToDiscard(2500, target); + if (extraToDiscard != null) + { + break; + } + } + } + if (targetCard == null || extraToDiscard == null) + { + List enemyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup() + && !card.IsShouldNotBeTarget() && card.IsShouldNotBeSpellTrapTarget()).ToList(); + enemyMonsterList.Sort(CardContainer.CompareCardAttack); + foreach (ClientCard target in enemyMonsterList) + { + if (target.IsFaceup() && target.IsMonster() && target.Attack <= 2500) + { + targetCard = target; + extraToDiscard = GetExtraToDiscard(2500, target); + if (extraToDiscard != null) + { + break; + } + } + } + } + } + + if (targetCard == null || extraToDiscard == null) + { + targetCard = GetProblematicEnemyMonster(0, true, true); + if (targetCard != null) + { + extraToDiscard = GetExtraToDiscard(targetCard.Attack, targetCard); + } + } + + if (targetCard == null || extraToDiscard == null) + { + bool check1 = DefaultOnBecomeTarget(); + bool check2 = Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && Duel.LastChainPlayer != 0;; + bool check3 = Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0; + bool check4 = Duel.Player == 1 && avoid2Monster && Enemy.GetMonsterCount() >= 2 && Duel.LastChainPlayer != 0; + Logger.DebugWriteLine("===punishment check flag: " + check1 + " " + check2 + " " + check3 + " " + check4); + if (check1 || check2 || check3 || check4) + { + List checkList = Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsShouldNotBeTarget() && !currentDestroyCardList.Contains(card)) + .OrderByDescending(c => c.Attack).ToList(); + foreach (ClientCard checkTarget in checkList) + { + extraToDiscard = GetExtraToDiscard(checkTarget.Attack, checkTarget); + if (extraToDiscard != null) + { + targetCard = checkTarget; + break; + } + } + } + } + + if (targetCard != null && extraToDiscard != null) + { + AI.SelectCard(targetCard); + AI.SelectNextCard(extraToDiscard); + currentDestroyCardList.Add(targetCard); + discardExtraThisTurn.Add(extraToDiscard?.Id ?? 0); + activatedCardIdList.Add(Card.Id); + UpdateBanSpSummonFromExTurn(2); + return true; + } + + return false; + } + + + public bool GranguignolTheDuskDragonActivate() + { + if (Card.Location == CardLocation.Grave) + { + AI.SelectCard(CardId.DespianLuluwalilith, CardId.DogmatikaEcclesia, CardId.DogmatikaMaximus, CardId.DogmatikaFleurdelis); + return true; + } + return false; + } + + public bool TitanikladTheAshDragonActivate() + { + if (!activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0 && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0) + { + AI.SelectOption(1); + AI.SelectCard(CardId.DogmatikaEcclesia); + return true; + } + if (CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) && !enemyActivateLockBird) + { + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + AI.SelectOption(0); + AI.SelectCard(CardId.DogmatikaFleurdelis); + return true; + } + } + if (Duel.Player == 1 && Enemy.GetMonsterCount() == 0) + { + AI.SelectOption(1); + AI.SelectCard(CardId.DogmatikaFleurdelis); + return true; + } + } + if (CheckRemainInDeck(CardId.DogmatikaMaximus) > 0) + { + AI.SelectOption(1); + AI.SelectCard(CardId.DogmatikaMaximus); + return true; + } + + return false; + } + + public bool GaruraWingsOfResonantLifeActivate() + { + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool ElderEntityNtssActivate() + { + if (Card.Location == CardLocation.Grave) + { + List destroyList = GetNormalEnemyTargetList(true, true, true); + if (destroyList.Count() > 0) + { + currentDestroyCardList.Add(destroyList[0]); + AI.SelectCard(destroyList); + return true; + } + } + + return false; + } + + public bool DespianLuluwalilithActivate() + { + // spsummon + if (Card.Location == CardLocation.Grave) + { + if (!activatedCardIdList.Contains(CardId.DogmatikaEcclesia) && CheckRemainInDeck(CardId.DogmatikaEcclesia) > 0 + && CheckCalledbytheGrave(CardId.DogmatikaEcclesia) == 0 && !enemyActivateLockBird) + { + AI.SelectCard(CardId.DogmatikaEcclesia); + return true; + } + if (CheckRemainInDeck(CardId.ThesIrisSwordsoul) > 0) + { + AI.SelectCard(CardId.ThesIrisSwordsoul); + return true; + } + if (Duel.Turn > 1 && Enemy.GetMonsterCount() == 0 && CheckRemainInDeck(CardId.DogmatikaFleurdelis) > 0) + { + AI.SelectCard(CardId.DogmatikaFleurdelis); + return true; + } + if (Bot.HasInHand(CardId.DogmatikaFleurdelis) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeDogmatika))) + { + List checkIdList = new List{ CardId.DogmatikaMaximus, CardId.DogmatikaEcclesia, CardId.DogmatikaFleurdelis }; + foreach (int checkId in checkIdList) + { + if (CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + return true; + } + } + } + } + // increase atk & negate + if (Card.Location == CardLocation.MonsterZone) + { + List currentChainEnemyCard = Duel.CurrentChain.Where(card => card.Controller == 1 && !currentNegateMonsterList.Contains(card) + && (card.Location == CardLocation.MonsterZone || card.Location == CardLocation.SpellZone)).ToList(); + currentChainEnemyCard.AddRange(GetProblematicEnemyCardList(false, false)); + currentChainEnemyCard.AddRange(ShuffleCardList(Enemy.GetSpells().Where(card => card.IsFaceup()).ToList())); + currentChainEnemyCard.AddRange(ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFaceup()).ToList())); + if (currentChainEnemyCard.Count() > 0) + { + currentNegateMonsterList.Add(currentChainEnemyCard[0]); + AI.SelectYesNo(true); + AI.SelectCard(currentChainEnemyCard); + } + else AI.SelectYesNo(false); + return true; + } + return false; + } + + public bool PSYFramelordOmegaActivate() + { + if (Card.Location == CardLocation.Grave && omegaActivateCount <= 5) + { + if (CheckWhetherNegated()) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count() > 0) { + AI.SelectCard(targets); + omegaActivateCount ++; + return true; + } + + List recycleExtraIdList = new List{ CardId.GaruraWingsOfResonantLife, CardId.ElderEntityNtss }; + foreach (int checkId in recycleExtraIdList) + { + if (!Bot.HasInExtra(checkId) && Bot.HasInGraveyard(checkId)) + { + AI.SelectCard(checkId); + omegaActivateCount ++; + return true; + } + } + + List recycleMainIdList = new List{ CardId.DogmatikaMacabre, CardId.DogmatikaLamity, CardId.DogmatikaAlbaZoa, CardId.DogmatikaPunishment, + CardId.DogmatikaEcclesia, CardId.DogmatikaFleurdelis, CardId.DogmatikaMatrix }; + foreach (int checkId in recycleMainIdList) + { + if (CheckRemainInDeck(checkId) <= 0 && Bot.HasInGraveyard(checkId)) + { + AI.SelectCard(checkId); + omegaActivateCount ++; + return true; + } + } + + recycleExtraIdList.AddRange(new List { + CardId.SuperStarslayerTYPHON, CardId.TitanikladTheAshDragon, CardId.HeraldOfTheArcLight, CardId.DespianLuluwalilith, CardId.Linguriboh, + CardId.SalamangreatAlmiraj, CardId.SecureGardna + }); + foreach (int checkId in recycleExtraIdList) + { + if (!Bot.HasInExtra(checkId) && Bot.HasInGraveyard(checkId)) + { + AI.SelectCard(checkId); + omegaActivateCount ++; + return true; + } + } + } + + return false; + } + + public bool HeraldOfTheArcLightActivate() + { + AI.SelectCard(GetNeedSearchRitualCardIdList()); + return true; + } + + public bool SuperStarslayerTYPHONSpSummon() + { + ClientCard material = Bot.GetMonsters().Where(card => card.IsFaceup()).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (material == null || material.Attack >= 3000) return false; + + bool checkFlag = GetProblematicEnemyMonster(material.Attack) != null; + checkFlag |= material.HasType(CardType.Link); + checkFlag |= material.Level <= 4; + if (checkFlag) + { + AI.SelectMaterials(material); + return true; + } + + return false; + } + + public bool SuperStarslayerTYPHONActivate() + { + if (CheckWhetherNegated()) return false; + List targetList = new List(); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsFloodgate() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsMonsterDangerous() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsMonsterInvincible() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.GetDefensePower() >= Util.GetBestAttack(Bot) && c.IsAttack()).OrderByDescending(card => card.Attack)); + if (Duel.Phase >= DuelPhase.Main2) + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link | CardType.SpSummon)).OrderByDescending(card => card.Attack)); + + if (targetList.Count() > 0) + { + targetList.AddRange(Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).OrderByDescending(card => card.Attack)); + targetList.AddRange(ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFacedown() && !targetList.Contains(card)).ToList())); + targetList.AddRange(ShuffleCardList(Bot.GetMonsters().Where(card => card.IsFacedown() && !targetList.Contains(card)).ToList())); + targetList.AddRange(Bot.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).OrderBy(card => card.Attack)); + AI.SelectCard(Card.Overlays); + AI.SelectNextCard(targetList); + return true; + } + + return false; + } + + public bool SPLittleKnightActivate() + { + // TODO + return false; + } + + public bool SecureGardnaSpSummon() + { + if (Bot.HasInHand(CardId.DogmatikaMaximus)) + { + if (!Bot.Graveyard.Any(card => card.IsMonster() && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link))) + { + return true; + } + } + return false; + } + + public bool LinguribohSpSummon() + { + if (Enemy.GetSpells().Any(card => card.IsFacedown())) return true; + if (!Bot.HasInExtra(CardId.SalamangreatAlmiraj)) return true; + return false; + } + + public bool LinguribohActivate() + { + if (CheckLastChainShouldNegated()) return true; + return false; + } + + public bool SalamangreatAlmirajSpSummon() + { + if (Bot.HasInMonstersZone(CardId.KnightmareCorruptorIblee, faceUp: true)) + { + AI.SelectMaterials(CardId.KnightmareCorruptorIblee); + return true; + } + if (Bot.HasInHand(new List{ CardId.DogmatikaEcclesia, CardId.DogmatikaMaximus, CardId.NadirServant })) + { + List materialList = Bot.MonsterZone.Where(card => card != null && card.IsFaceup() && card.Attack <= 1000 + && !card.HasType(CardType.Ritual | CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)).ToList(); + if (materialList.Count() > 0) + { + materialList.Sort(CardContainer.CompareCardAttack); + AI.SelectMaterials(materialList); + return true; + } + } + + return false; + } + + public bool SalamangreatAlmirajActivate() + { + if (Card.Location == CardLocation.Grave) return true; + bool checkFlag = Duel.Player == 1 && (!Bot.HasInHand(CardId.DogmatikaFleurdelis) || activatedCardIdList.Contains(CardId.DogmatikaFleurdelis)); + checkFlag |= DefaultOnBecomeTarget(); + checkFlag |= Bot.UnderAttack && Bot.BattlingMonster == Card; + if (checkFlag) + { + AI.SelectCard(Util.GetBestBotMonster()); + return true; + } + if (!Util.ChainContainsCard(CardId.SinfulSpoilsOfDoom_Rciela)) + { + List checkList = Bot.GetMonsters().Where(card => card.IsFaceup() && card != Card).OrderByDescending(card => card.Attack).ToList(); + checkList.AddRange(Bot.GetMonsters().GetMatchingCards(card => card.IsFacedown())); + foreach (ClientCard card in checkList) + { + if (Util.IsChainTarget(card)) + { + AI.SelectCard(card); + return true; + } + } + } + + return false; + } + + + public bool SummonForTYPHONCheck() + { + if (!Bot.HasInExtra(CardId.SuperStarslayerTYPHON) || Bot.GetMonsters().Any(card => card.IsFaceup()) || banSpSummonFromExTurn > 0) return false; + if (enemySpSummonFromExLastTurn < 2 && enemySpSummonFromExThisTurn < 2) return false; + if (Card.IsCode(CardId.KnightmareCorruptorIblee) && !CheckWhetherNegated()) return false; + if (Card.Level > 4) return false; + + int currentAttack = 0; + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(Card.Id); + if (cardData != null) currentAttack = cardData.Attack; + List summonList = Bot.Hand.Where(card => card.IsMonster() && card.Level <= 4).ToList(); + foreach (ClientCard checkCard in summonList) + { + cardData = YGOSharp.OCGWrapper.NamedCard.Get(checkCard.Id); + if (cardData != null && cardData.Attack < currentAttack) return false; + } + + return true; + } + + public bool MonsterRepos() + { + int selfAttack = Card.Attack + 1; + int extraAttackForDogmatika = 0; + if (!activatedCardIdList.Contains(CardId.DogmatikaFleurdelis + 1) && Bot.HasInMonstersZone(CardId.DogmatikaFleurdelis, true, false, true)) extraAttackForDogmatika += 500; + if (Card.HasSetcode(SetcodeDogmatika)) + { + selfAttack += extraAttackForDogmatika; + } + + if (Card.IsFaceup() && Card.IsDefense() && selfAttack <= 1) + return false; + + int bestAttack = 0; + foreach (ClientCard card in Bot.GetMonsters()) + { + int attack = card.Attack; + if (card.HasSetcode(SetcodeDogmatika)) + { + attack += extraAttackForDogmatika; + } + if (attack >= bestAttack) + { + bestAttack = attack; + } + } + + bool enemyBetter = Util.IsAllEnemyBetterThanValue(bestAttack, true); + + if (Card.IsAttack() && enemyBetter) + return true; + if (Card.IsDefense() && !enemyBetter) + return true; + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + if (Card.IsCode(CardId.DogmatikaPunishment) && Bot.HasInSpellZone(Card.Id)) return false; + if (Card.IsCode(CardId.SinfulSpoilsOfDoom_Rciela)) + { + if (!Bot.HasInHand(CardId.DogmatikaFleurdelis) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.Level >= 7 && card.HasRace(CardRace.SpellCaster))) + { + return false; + } + } + + // select place + if (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) + { + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(null, true); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Game/AI/Decks/DragunExecutor.cs b/Game/AI/Decks/DragunExecutor.cs index e9d2cc77e..1cfbbc62d 100644 --- a/Game/AI/Decks/DragunExecutor.cs +++ b/Game/AI/Decks/DragunExecutor.cs @@ -123,6 +123,7 @@ public override void OnNewTurn() { BeastOLionUsed = false; RedEyesFusionUsed = false; + base.OnNewTurn(); } public override CardPosition OnSelectPosition(int cardId, IList positions) @@ -136,7 +137,7 @@ public override CardPosition OnSelectPosition(int cardId, IList po return 0; } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (location == CardLocation.MonsterZone) { @@ -198,6 +199,7 @@ private bool RedEyesFusionEffect() private bool TourGuideFromTheUnderworldSummon() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.GetRemainingCount(CardId.TourGuideFromTheUnderworld, 2) == 0 && Bot.GetRemainingCount(CardId.Sangan, 2) == 0) return false; return true; @@ -307,6 +309,7 @@ private bool SummonForMaterial() private bool MagiciansSoulsEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.Location == CardLocation.Hand) { if (RedEyesFusionUsed) @@ -375,6 +378,7 @@ private bool MagicalizedFusionEffect() private bool PredaplantVerteAnacondaEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (ActivateDescription == Util.GetStringId(CardId.PredaplantVerteAnaconda, 0)) return false; AI.SelectCard(CardId.RedEyesFusion); diff --git a/Game/AI/Decks/DragunityExecutor.cs b/Game/AI/Decks/DragunityExecutor.cs index 6029400e6..0c65e32fd 100644 --- a/Game/AI/Decks/DragunityExecutor.cs +++ b/Game/AI/Decks/DragunityExecutor.cs @@ -456,6 +456,7 @@ private bool DragunityPhalanxSet() private bool AssaultBeast() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (!Bot.HasInSpellZone(CardId.AssaultModeActivate)) return true; return false; diff --git a/Game/AI/Decks/ExosisterExecutor.cs b/Game/AI/Decks/ExosisterExecutor.cs new file mode 100644 index 000000000..b31bae74e --- /dev/null +++ b/Game/AI/Decks/ExosisterExecutor.cs @@ -0,0 +1,2990 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using System.Linq; +using System; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Exosister", "AI_Exosister")] + + class ExosisterExecutor : DefaultExecutor + { + public class CardId + { + public const int ExosisterElis = 16474916; + public const int ExosisterStella = 43863925; + public const int ExosisterIrene = 79858629; + public const int ExosisterSophia = 5352328; + public const int ExosisterMartha = 37343995; + public const int Aratama = 16889337; + public const int Sakitama = 67972302; + // _CardId.MaxxC = 23434538; + // _CardId.AshBlossom = 14558127; + + public const int ExosisterPax = 77913594; + public const int ExosisterArment = 4408198; + public const int PotofExtravagance = 84211599; + // _CardId.CalledByTheGrave = 24224830; + + public const int ExosisterVadis = 77891946; + public const int ExosisterReturnia = 197042; + // _CardId.InfiniteImpermanence = 10045474; + + public const int ExosisterMikailis = 42741437; + public const int ExosisterKaspitell = 78135071; + public const int ExosisterGibrine = 5530780; + public const int ExosisterAsophiel = 41524885; + public const int ExosistersMagnifica = 59242457; + public const int TellarknightConstellarCaduceus = 58858807; + public const int StellarknightConstellarDiamond = 9272381; + public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int DonnerDaggerFurHire = 8728498; + // _CardId.EvilswarmExcitonKnight = 46772449; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int DimensionShifter = 91800273; + } + + public ExosisterExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // trigger + AddExecutor(ExecutorType.Activate, CardId.ExosistersMagnifica, ExosistersMagnificaActivateTrigger); + + // quick effect + AddExecutor(ExecutorType.Activate, CardId.ExosisterMikailis, ExosisterMikailisActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosistersMagnifica, ExosistersMagnificaActivateBanish); + AddExecutor(ExecutorType.Activate, CardId.ExosisterReturnia, ExosisterReturniaActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterVadis, ExosisterVadisActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.StellarknightConstellarDiamond); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, DefaultExosisterTransform); + AddExecutor(ExecutorType.Activate, CardId.ExosisterArment, ExosisterArmentActivate); + + // free chain + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + + // search + AddExecutor(ExecutorType.Activate, CardId.PotofExtravagance, PotofExtravaganceActivate); + + // field effect + AddExecutor(ExecutorType.Activate, CardId.Aratama); + AddExecutor(ExecutorType.Activate, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterKaspitell, ExosisterKaspitellActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterGibrine, ExosisterGibrineActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterAsophiel, ExosisterAsophielActivate); + + AddExecutor(ExecutorType.Activate, CardId.ExosisterSophia, ExosisterSophiaActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterIrene, ExosisterIreneActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterStella, ExosisterStellaActivate); + + // addition monster summmon + AddExecutor(ExecutorType.Activate, CardId.ExosisterElis, ExosisterElisActivate); + AddExecutor(ExecutorType.Activate, CardId.Sakitama, SakitamaActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterPax, ExosisterPaxActivate); + AddExecutor(ExecutorType.Activate, CardId.ExosisterStella, ExosisterStellaSecondActivate); + + // xyz summon + AddExecutor(ExecutorType.SpSummon, CardId.StellarknightConstellarDiamond); + AddExecutor(ExecutorType.SpSummon, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireSpSummonCheck); + AddExecutor(ExecutorType.SpSummon, CardId.ExosisterMikailis, ExosisterMikailisAdvancedSpSummonCheck); + AddExecutor(ExecutorType.SpSummon, CardId.ExosisterKaspitell, ExosisterKaspitellAdvancedSpSummonCheck); + + AddExecutor(ExecutorType.SpSummon, CardId.ExosisterKaspitell, ExosisterKaspitellSpSummonCheck); + AddExecutor(ExecutorType.SpSummon, CardId.ExosisterMikailis, ExosisterMikailisSpSummonCheck); + AddExecutor(ExecutorType.SpSummon, CardId.TellarknightConstellarCaduceus, TellarknightConstellarCaduceusSpSummonCheck); + + AddExecutor(ExecutorType.SpSummon, CardId.ExosistersMagnifica, ExosistersMagnificaSpSummonCheck); + + AddExecutor(ExecutorType.SpSummon, _CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightSummon); + AddExecutor(ExecutorType.Activate, _CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect); + + // normal summon for xyz(avoiding MaxxC) + AddExecutor(ExecutorType.Summon, CardId.ExosisterStella, ExosisterAvoidMaxxCSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.ExosisterSophia, ExosisterAvoidMaxxCSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.ExosisterIrene, ExosisterAvoidMaxxCSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.ExosisterElis, ExosisterAvoidMaxxCSummonCheck); + + // activate martha + AddExecutor(ExecutorType.Activate, CardId.ExosisterMartha, ExosisterMarthaActivate); + + // normal summon for xyz + AddExecutor(ExecutorType.Summon, CardId.ExosisterStella, ExosisterStellaSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.Aratama, AratamaSummonCheck); + AddExecutor(ExecutorType.Summon, ExosisterForElisSummonCheck); + AddExecutor(ExecutorType.Summon, ForSakitamaSummonCheck); + AddExecutor(ExecutorType.Summon, CardId.ExosisterIrene, ExosisterIreneSummonCheck); + AddExecutor(ExecutorType.Summon, Level4SummonCheck); + AddExecutor(ExecutorType.Summon, ExosisterForArmentSummonCheck); + AddExecutor(ExecutorType.Summon, ForDonnerSummonCheck); + + AddExecutor(ExecutorType.Activate, CardId.ExosisterPax, ExosisterPaxActivateForEndSearch); + + // other + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodeShadoll = 0x9d; + const int SetcodeInferoid = 0xbb; + const int SetcodeOrcust = 0x11b; + const int SetcodeExosister = 0x172; + const int SetcodeTearlaments = 0x181; + List SetcodeForDiamond = new List{SetcodeShadoll, SetcodeInferoid, SetcodeTearlaments}; + + List affectGraveCardIdList = new List{ + 71344451, 40975243, 87746184, 70534340, 45906428, 71490127, 3659803, 12071500, 6077601, 11827244, 95238394, 81223446, 40003819, + 72490637, 21011044, 59419719, 14735698, 45410988 + }; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.ExosisterElis, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.Aratama, CardId.Sakitama, + _CardId.MaxxC, _CardId.AshBlossom, CardId.ExosisterPax, CardId.ExosisterVadis }}, + {2, new List { CardId.ExosisterIrene, CardId.ExosisterSophia, CardId.PotofExtravagance, _CardId.CalledByTheGrave, + CardId.ExosisterReturnia, _CardId.InfiniteImpermanence }}, + {1, new List { CardId.ExosisterArment }}, + }; + Dictionary ExosisterMentionTable = new Dictionary{ + {CardId.ExosisterElis, CardId.ExosisterStella}, {CardId.ExosisterStella, CardId.ExosisterElis}, + {CardId.ExosisterIrene, CardId.ExosisterSophia}, {CardId.ExosisterSophia, CardId.ExosisterIrene}, + {CardId.ExosisterMartha, CardId.ExosisterElis} + }; + List ExosisterSpellTrapList = new List{CardId.ExosisterPax, CardId.ExosisterArment, CardId.ExosisterVadis, CardId.ExosisterReturnia}; + + List currentNegatingIdList = new List(); + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + bool enemyMoveGrave = false; + bool paxCallToField = false; + List infiniteImpermanenceList = new List(); + + bool summoned = false; + bool elisEffect1Activated = false; + bool stellaEffect1Activated = false; + bool irenaEffect1Activated = false; + bool sophiaEffect1Activated = false; + bool marthaEffect1Activated = false; + bool mikailisEffect1Activated = false; + bool mikailisEffect3Activated = false; + bool kaspitellEffect1Activated = false; + bool kaspitellEffect3Activated = false; + bool gibrineEffect1Activated = false; + bool gibrineEffect3Activated = false; + bool asophielEffect1Activated = false; + bool asophielEffect3Activated = false; + bool sakitamaEffect1Activated = false; + List exosisterTransformEffectList = new List(); + List oncePerTurnEffectActivatedList = new List(); + List activatedMagnificaList = new List(); + List targetedMagnificaList = new List(); + List transformDestList = new List(); + List spSummonThisTurn = new List(); + bool potActivate = false; + List removeChosenList = new List(); + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(n + 1); + ClientCard temp = result[index]; + result[index] = result[n]; + result[n] = temp; + } + return result; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false) + { + List floodagateList = Enemy.GetMonsters().Where(c => c?.Data != null && + c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + return floodagateList[0]; + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count > 0) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + return dangerList[0]; + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + return invincibleList[0]; + } + + if (attack == 0) + attack = Util.GetBestAttack(Bot); + List betterList = Enemy.MonsterZone.GetMonsters() + .Where(card => card.GetDefensePower() >= attack && card.IsAttack() && (!canBeTarget || !card.IsShouldNotBeTarget())).ToList(); + if (betterList.Count > 0) + { + betterList.Sort(CardContainer.CompareCardAttack); + betterList.Reverse(); + return betterList[0]; + } + return null; + } + + public ClientCard GetProblematicEnemyCard(bool canBeTarget = false) + { + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !removeChosenList.Contains(c) && + c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + return floodagateList[0]; + } + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !removeChosenList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !removeChosenList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + return dangerList[0]; + } + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !removeChosenList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + return invincibleList[0]; + } + + List enemyMonsters = Enemy.GetMonsters().Where(c => !removeChosenList.Contains(c)).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach(ClientCard target in enemyMonsters) + { + if (target.HasType(CardType.Fusion) || target.HasType(CardType.Ritual) || target.HasType(CardType.Synchro) || target.HasType(CardType.Xyz) || (target.HasType(CardType.Link) && target.LinkCount >= 2) ) + { + if (!canBeTarget || !(target.IsShouldNotBeTarget() || target.IsShouldNotBeMonsterTarget())) return target; + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !removeChosenList.Contains(c) + && (c.HasType(CardType.Equip) || c.HasType(CardType.Pendulum) || c.HasType(CardType.Field) || c.HasType(CardType.Continuous))) + .ToList(); + if (spells.Count > 0) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget); + if (card != null) + return card; + + card = Enemy.MonsterZone.GetHighestAttackMonster(canBeTarget); + if (card != null) + return card; + + List monsters = Enemy.GetMonsters(); + + // after GetHighestAttackMonster, the left monsters must be face-down. + if (monsters.Count > 0 && !onlyFaceup) + return ShuffleCardList(monsters)[0]; + + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && + (ecard.HasType(CardType.Continuous) || ecard.HasType(CardType.Field) || ecard.HasType(CardType.Pendulum))).ToList(); + if (faceUpList.Count > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + if (checkGrave && Enemy.Graveyard.Count > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + /// + /// Check negated turn count of id + /// + public int CheckCalledbytheGrave(int id) + { + if (currentNegatingIdList.Contains(id)) return 1; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; + } + + public void CheckEnemyMoveGrave() + { + if (Duel.LastChainPlayer == 1) + { + ClientCard card = Util.GetLastChainCard(); + if (Duel.LastChainLocation == CardLocation.Grave && card.Location == CardLocation.Grave) + { + Logger.DebugWriteLine("===Exosister: enemy activate effect from GY."); + enemyMoveGrave = true; + } + else if (affectGraveCardIdList.Contains(card.Id)) + { + Logger.DebugWriteLine("===Exosister: enemy activate effect that affect GY."); + enemyMoveGrave = true; + } + else + { + foreach (ClientCard targetCard in Duel.LastChainTargets) + { + if (targetCard.Location == CardLocation.Grave) + { + Logger.DebugWriteLine("===Exosister: enemy target cards of GY."); + enemyMoveGrave = true; + break; + } + } + } + } + } + + /// + /// Check exosister's relative card. 0 for error. + /// + public int CheckExosisterMentionCard(int id) + { + if (!ExosisterMentionTable.ContainsKey(id)) + { + return 0; + } + return ExosisterMentionTable[id]; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + return true; + } + + /// + /// Check whether opposite use Maxx-C, and thus make less operation. + /// + public bool CheckLessOperation() + { + if (!enemyActivateMaxxC) + { + return false; + } + return CheckAtAdvantage(); + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && Bot.GetMonsters().Any(card => card.IsFaceup())) + { + return true; + } + return false; + } + + /// + /// Check whether bot is in danger and need to summon monster to defense. + /// + public bool CheckInDanger() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int totalAtk = 0; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsAttack() && !m.Attacked) totalAtk += m.Attack; + } + if (totalAtk >= Bot.LifePoints) return true; + } + return false; + } + + /// + /// Check whether can be used for xyz summon. + /// + public bool CheckAbleForXyz(ClientCard card) + { + return card.IsFaceup() && !card.HasType(CardType.Xyz) && !card.HasType(CardType.Link) && !card.HasType(CardType.Token) && card.Level == 4; + } + + /// + /// Check whether bot can activate martha. + /// + public bool CheckMarthaActivatable() + { + return !marthaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterMartha) == 0 && CheckRemainInDeck(CardId.ExosisterElis) > 0 + && !Bot.GetMonsters().Any(card => card.IsFacedown() || !card.HasType(CardType.Xyz)); + } + + /// + /// check enemy's dangerous card in grave + /// + public List CheckDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && card.HasSetcode(SetcodeOrcust)).ToList(); + return result; + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool SpellNegatable(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap()) + { + if (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true)) return true; + } + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) { + return true; + } + } + // how to get here? + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true){ + if (Card.IsSpell() || Card.IsTrap()){ + if (SpellNegatable()) return true; + } + if (CheckCalledbytheGrave(Card.Id) > 0){ + return true; + } + if (Card.IsMonster() && Card.Location == CardLocation.MonsterZone && Card.IsDefense()) + { + if (Enemy.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled()) != null + || Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled()) != null) + { + return true; + } + } + if (disablecheck){ + return Card.IsDisabled(); + } + return false; + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public void SelectXyzMaterial(int num = 2, bool needExosister = false) + { + List materialList = Bot.GetMonsters().Where(card => CheckAbleForXyz(card)).ToList(); + if (materialList?.Count() < num) + { + return; + } + if (needExosister && !materialList.Any(card => card.HasSetcode(SetcodeExosister))) + { + return; + } + List selectedList = new List(); + + // if needed, select exosister with less atk first + if (needExosister) + { + List exosisterList = materialList.Where(card => card.HasSetcode(SetcodeExosister)).ToList(); + exosisterList.Sort(CardContainer.CompareCardAttack); + ClientCard firstSelect = exosisterList[0]; + selectedList.Add(firstSelect); + materialList.Remove(firstSelect); + } + + // select non-exosister or effecte used's exosister first + // never use martha first + List sortMaterialList = materialList.Where(card => + (card?.Data != null && !card.HasSetcode(SetcodeExosister)) || (exosisterTransformEffectList.Contains(card.Id) && card.Id != CardId.ExosisterMartha)).ToList(); + sortMaterialList.Sort(CardContainer.CompareCardAttack); + foreach (ClientCard card in sortMaterialList) + { + selectedList.Add(card); + if (selectedList.Count() >= num) + { + AI.SelectMaterials(selectedList); + return; + } + } + + List valuableMaterialList = materialList.Where(card => card.Id == CardId.ExosisterMartha || !exosisterTransformEffectList.Contains(card.Id)).ToList(); + valuableMaterialList.Sort(CardContainer.CompareCardAttack); + foreach (ClientCard card in valuableMaterialList) + { + selectedList.Add(card); + if (selectedList.Count() >= num) + { + AI.SelectMaterials(selectedList); + return; + } + } + } + + public void SelectDetachMaterial(ClientCard activateCard) + { + // TODO + AI.SelectCard(0); + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + /// + /// check whether enemy activate important card + /// + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.MaxxC) && CheckCalledbytheGrave(_CardId.MaxxC) == 0) + { + enemyActivateMaxxC = true; + } + if (card.IsCode(_CardId.LockBird) && CheckCalledbytheGrave(_CardId.LockBird) == 0) + { + enemyActivateLockBird = true; + } + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4-i); + break; + } + } + } + if (Duel.LastChainLocation == CardLocation.Grave && card.Location == CardLocation.Grave) + { + Logger.DebugWriteLine("===Exosister: enemy activate effect from GY."); + enemyMoveGrave = true; + } + } + base.OnChaining(player, card); + } + + public override void OnSelectChain(IList cards) + { + int player = Duel.LastChainPlayer; + ClientCard card = Util.GetLastChainCard(); + if (player == 1) + { + foreach (ClientCard targetCard in Duel.LastChainTargets) { + if (targetCard.Location == CardLocation.Grave) + { + Logger.DebugWriteLine("===Exosister: enemy target cards of GY."); + enemyMoveGrave = true; + break; + } + } + } + base.OnSelectChain(cards); + } + + public override void OnChainSolved(int chainIndex) + { + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.ActivatePlayer == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) + enemyActivateLockBird = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard.RelatedCard) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + } + + + /// + /// clear chain information + /// + public override void OnChainEnd() + { + enemyMoveGrave = false; + paxCallToField = false; + potActivate = false; + transformDestList.Clear(); + targetedMagnificaList.Clear(); + if (activatedMagnificaList.Count() > 0) + { + for (int idx = activatedMagnificaList.Count() - 1; idx >= 0; -- idx) + { + ClientCard checkTarget = activatedMagnificaList[idx]; + if (checkTarget == null || checkTarget.IsFacedown() || checkTarget.Location != CardLocation.MonsterZone) + { + activatedMagnificaList.RemoveAt(idx); + } + } + } + if (spSummonThisTurn.Count() > 0) + { + for (int idx = spSummonThisTurn.Count() - 1; idx >= 0; -- idx) + { + ClientCard checkTarget = spSummonThisTurn[idx]; + if (checkTarget == null || checkTarget.IsFacedown() || checkTarget.Location != CardLocation.MonsterZone) + { + spSummonThisTurn.RemoveAt(idx); + } + } + } + base.OnChainEnd(); + } + + public override void OnNewTurn() + { + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + infiniteImpermanenceList.Clear(); + currentNegatingIdList.Clear(); + + summoned = false; + elisEffect1Activated = false; + stellaEffect1Activated = false; + irenaEffect1Activated = false; + sophiaEffect1Activated = false; + marthaEffect1Activated = false; + mikailisEffect1Activated = false; + mikailisEffect3Activated = false; + kaspitellEffect1Activated = false; + kaspitellEffect3Activated = false; + gibrineEffect1Activated = false; + gibrineEffect3Activated = false; + asophielEffect1Activated = false; + asophielEffect3Activated = false; + sakitamaEffect1Activated = false; + exosisterTransformEffectList.Clear(); + oncePerTurnEffectActivatedList.Clear(); + activatedMagnificaList.Clear(); + spSummonThisTurn.Clear(); + } + + /// + /// override for exosister's transform + /// + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + bool beginTransformCheck = false; + // transform for main monster + if (hint == HintMsg.SpSummon && min == 1 && max == 1 && transformDestList.Count() > 0) + { + // check whether for transform + if (cards.All(card => card.Location == CardLocation.Extra && card.Rank == 4 && card.HasSetcode(SetcodeExosister))) + { + beginTransformCheck = true; + } + } + // transform for magnifica + if (hint == HintMsg.ToDeck && min == 1 && max == 1 && transformDestList.Count() > 0) + { + if (cards.All(card => card.Location == CardLocation.Overlay)) + { + beginTransformCheck = true; + } + } + if (beginTransformCheck) + { + for (int idx = 0; idx < transformDestList.Count(); ++ idx) + { + int targetId = transformDestList[idx]; + ClientCard targetCard = cards.FirstOrDefault(card => card.IsCode(targetId)); + if (targetCard != null) + { + List result = new List(); + result.Add(targetCard); + transformDestList.RemoveAt(idx); + spSummonThisTurn.AddRange(result); + return Util.CheckSelectCount(result, cards, min, max); + } + } + } + + if (Util.ChainContainsCard(_CardId.EvenlyMatched) && Util.ChainContainPlayer(1) && hint == HintMsg.Remove) + { + int botCount = Bot.GetMonsterCount() + Bot.GetSpellCount(); + int oppositeCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (botCount - oppositeCount == min && min == max) + { + Logger.DebugWriteLine("===Exosister: Evenly Matched activated."); + List allBotCards = new List(); + allBotCards.AddRange(Bot.GetMonsters()); + allBotCards.AddRange(Bot.GetSpells()); + List importantList = new List(); + + List magnificaList = allBotCards.Where(card => card.IsCode(CardId.ExosistersMagnifica)).ToList(); + if (magnificaList.Count > 0) + { + allBotCards.RemoveAll(c => magnificaList.Contains(c)); + importantList.AddRange(magnificaList); + } + if (!mikailisEffect1Activated) + { + List mikailisList = allBotCards.Where(card => spSummonThisTurn.Contains(card) + && card.IsCode(CardId.ExosisterMikailis) && card.IsFaceup()).ToList(); + if (mikailisList.Count > 0) + { + allBotCards.RemoveAll(c => mikailisList.Contains(c)); + importantList.AddRange(mikailisList); + } + } + if (!gibrineEffect1Activated) + { + List gibrineList = allBotCards.Where(card => spSummonThisTurn.Contains(card) + && card.IsCode(CardId.ExosisterGibrine) && card.IsFaceup()).ToList(); + if (gibrineList.Count > 0) + { + allBotCards.RemoveAll(c => gibrineList.Contains(c)); + importantList.AddRange(gibrineList); + } + } + if (!oncePerTurnEffectActivatedList.Contains(CardId.ExosisterVadis)) + { + List vadisList = allBotCards.Where(card => card.IsCode(CardId.ExosisterVadis) && card.IsFacedown()).ToList(); + if (vadisList.Count > 0) + { + allBotCards.RemoveAll(c => vadisList.Contains(c)); + importantList.AddRange(vadisList); + } + } + List xyzList = allBotCards.Where(card => card.IsMonster() && card.HasType(CardType.Xyz)).ToList(); + if (xyzList.Count > 0) + { + xyzList.Sort(CardContainer.CompareCardAttack); + xyzList.Reverse(); + allBotCards.RemoveAll(c => xyzList.Contains(c)); + importantList.AddRange(xyzList); + } + List monsterList = allBotCards.Where(card => card.IsMonster()).ToList(); + if (monsterList.Count > 0) + { + monsterList.Sort(CardContainer.CompareCardAttack); + monsterList.Reverse(); + allBotCards.RemoveAll(c => monsterList.Contains(c)); + importantList.AddRange(monsterList); + } + List faceDownList = allBotCards.Where(card => card.IsFacedown()).ToList(); + if (faceDownList.Count > 0) + { + allBotCards.RemoveAll(c => faceDownList.Contains(c)); + importantList.AddRange(ShuffleCardList(faceDownList)); + } + + importantList.Reverse(); + return Util.CheckSelectCount(importantList, cards, min, max); + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Util.IsTurn1OrMain2()) + { + bool turnDefense = false; + if (cardId == CardId.DivineArsenalAAZEUS_SkyThunder || cardId == CardId.ExosistersMagnifica) + { + turnDefense = true; + } + if (!cardData.HasType(CardType.Xyz)) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (!cardData.HasType(CardType.Xyz) || cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardData.Attack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + /// + /// override for magnifica's spsummon + /// + public override bool OnSelectYesNo(int desc) + { + // magnifica spsummon + if (desc == Util.GetStringId(CardId.ExosistersMagnifica, 2)) + { + return true; + } + // pax spsummon + if (desc == Util.GetStringId(CardId.ExosisterPax, 1)) + { + return paxCallToField; + } + + return base.OnSelectYesNo(desc); + } + + /// + /// override for returnia's option + /// + public override int OnSelectOption(IList options) + { + // check retunia + int spSummonOption = -1; + int banishOption = -1; + int doNothingOption = -1; + for (int idx = 0; idx < options.Count(); ++ idx) + { + int option = options[idx]; + if (option == Util.GetStringId(CardId.ExosisterReturnia, 0)) + { + spSummonOption = idx; + } else if (option == Util.GetStringId(CardId.ExosisterReturnia, 1)) + { + banishOption = idx; + } else if (option == Util.GetStringId(CardId.ExosisterReturnia, 2)) + { + doNothingOption = idx; + } + } + + if (spSummonOption >= 0 || banishOption >= 0 || doNothingOption >= 0) + { + if (spSummonOption < 0 && banishOption < 0) + { + return doNothingOption; + } + if (banishOption >= 0) + { + // banish problem card + ClientCard target = GetProblematicEnemyCard(true); + if (target != null) + { + AI.SelectCard(target); + return banishOption; + } + + // dump banish + target = GetBestEnemyCard(false, false); + if (target != null) + { + AI.SelectCard(target); + return banishOption; + } + } + if (spSummonOption >= 0) + { + // TODO + } + } + + // check pot + int potBanish6Option = -1; + int potBanish3Option = -1; + for (int idx = 0; idx < options.Count(); ++idx) + { + int option = options[idx]; + if (option == Util.GetStringId(CardId.PotofExtravagance, 0)) + { + potBanish3Option = idx; + } + else if (option == Util.GetStringId(CardId.PotofExtravagance, 1)) + { + potBanish6Option = idx; + } + } + if (potBanish3Option >= 0 || potBanish6Option >= 0) + { + if (Bot.ExtraDeck.Count() > 9 && potBanish6Option >= 0) + { + return potBanish6Option; + } + return potBanish3Option; + } + + return base.OnSelectOption(options); + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + if (CheckAtAdvantage()) + { + return false; + } + } + return DefaultAshBlossomAndJoyousSpring(); + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + // negate before effect used + foreach(ClientCard m in Enemy.GetMonsters()) + { + if (m.IsMonsterShouldBeDisabledBeforeItUseEffect() && !m.IsDisabled() && Duel.LastChainPlayer != 0) + { + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++ i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(m); + return true; + } + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ( (this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || (Util.IsChainTarget(Card)) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + List enemyMonsters = Enemy.GetMonsters(); + AI.SelectCard(target); + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + if ( (LastChainCard == null || LastChainCard.Controller != 1 || LastChainCard.Location != CardLocation.MonsterZone + || LastChainCard.IsDisabled() || LastChainCard.IsShouldNotBeTarget() || LastChainCard.IsShouldNotBeSpellTrapTarget()) ) + return false; + // negate monsters + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (LastChainCard != null) AI.SelectCard(LastChainCard); + else + { + List enemyMonsters = Enemy.GetMonsters(); + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach (ClientCard card in enemyMonsters) + { + if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + { + AI.SelectCard(card); + return true; + } + } + } + return true; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated(true)) return false; + if (Duel.LastChainPlayer == 1) + { + // negate + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (CheckCalledbytheGrave(code) > 0) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + if (code == CardId.DimensionShifter) + { + return false; + } + ClientCard targetCard = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)); + if (targetCard != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(targetCard); + currentNegatingIdList.Add(code); + return true; + } + } + + // banish target + foreach (ClientCard cards in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(cards)) + { + int code = cards.Id; + AI.SelectCard(cards); + currentNegatingIdList.Add(code); + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentNegatingIdList.Add(code); + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = CheckDangerousCardinEnemyGrave(true); + if (targets.Count() > 0) { + int code = targets[0].GetOriginCode(); + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(targets); + currentNegatingIdList.Add(code); + return true; + } + + return false; + } + + public List GetPotofExtravaganceBanish() + { + List banishList = new List(); + ClientCard aaZeus = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.DivineArsenalAAZEUS_SkyThunder)); + if (aaZeus != null) + { + banishList.Add(aaZeus); + } + + ClientCard diamond = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.StellarknightConstellarDiamond)); + if (diamond != null) + { + banishList.Add(diamond); + } + + ClientCard caduceus = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.TellarknightConstellarCaduceus)); + if (caduceus != null) + { + banishList.Add(caduceus); + } + + ClientCard evilswarm = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(_CardId.EvilswarmExcitonKnight)); + if (evilswarm != null) + { + banishList.Add(evilswarm); + } + + // second asophiel + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosisterAsophiel)) > 1) + { + ClientCard asophiel2 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterAsophiel)); + banishList.Add(asophiel2); + } + + ClientCard gibrine = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterGibrine)); + if (gibrine != null) + { + banishList.Add(gibrine); + } + + // 6 done + + // third mikailis + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosisterMikailis)) > 2) + { + ClientCard mikailis3 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterMikailis)); + banishList.Add(mikailis3); + } + + // first asophiel + ClientCard asophiel1 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterAsophiel) && !banishList.Contains(card)); + if (asophiel1 != null) + { + banishList.Add(asophiel1); + } + + ClientCard donner = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.DonnerDaggerFurHire)); + if (donner != null) + { + banishList.Add(donner); + } + + // 9 done + + // second kaspitell + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosisterKaspitell)) > 1) + { + ClientCard kaspitell = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterKaspitell)); + banishList.Add(kaspitell); + } + + // second magnifica + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosistersMagnifica)) > 1) + { + ClientCard magnifica2 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosistersMagnifica)); + banishList.Add(magnifica2); + } + + // second mikailis + if (Bot.ExtraDeck.Count(card => card.IsCode(CardId.ExosisterMikailis)) > 1) + { + ClientCard mikailis2 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterMikailis) && !banishList.Contains(card)); + banishList.Add(mikailis2); + } + + // first magnifica + ClientCard magnifica1 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosistersMagnifica) && !banishList.Contains(card)); + if (magnifica1 != null) + { + banishList.Add(magnifica1); + } + + // first kaspitell + ClientCard kaspitell1 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterKaspitell) && !banishList.Contains(card)); + if (kaspitell1 != null) + { + banishList.Add(kaspitell1); + } + + // first mikailis1 + ClientCard mikailis1 = Bot.ExtraDeck.FirstOrDefault(card => card.IsCode(CardId.ExosisterMikailis) && !banishList.Contains(card)); + if (mikailis1 != null) + { + banishList.Add(mikailis1); + } + + return banishList; + } + + public bool PotofExtravaganceActivate() + { + if (CheckWhetherNegated()) + { + return false; + } + List banishList = GetPotofExtravaganceBanish(); + + List addToHandOrderList = new List(); + + bool marthaActivatable = CheckMarthaActivatable(); + if (marthaActivatable) + { + if (!Bot.HasInHand(CardId.ExosisterMartha)) + { + addToHandOrderList.Add(CardId.ExosisterMartha); + } + if (Bot.HasInHand(CardId.ExosisterMartha) && !Bot.HasInHandOrInSpellZone(_CardId.CalledByTheGrave)) + { + addToHandOrderList.Add(_CardId.CalledByTheGrave); + } + } + int exosisterCount = Bot.Hand.Count(card => card?.Data != null && card.HasSetcode(SetcodeExosister)); + if (!stellaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterStella) == 0) + { + if (!Bot.HasInHand(CardId.ExosisterStella) && exosisterCount > 0) + { + addToHandOrderList.Add(CardId.ExosisterStella); + } + if (Bot.HasInHand(CardId.ExosisterStella) && exosisterCount == 0) + { + addToHandOrderList.AddRange(new List{ + CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.ExosisterElis}); + } + } + if (exosisterCount >= 0 && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + addToHandOrderList.Add(CardId.ExosisterReturnia); + } + List remainOrderList = new List{ + CardId.Aratama, CardId.Sakitama, _CardId.MaxxC, _CardId.AshBlossom, _CardId.InfiniteImpermanence, + _CardId.CalledByTheGrave, CardId.ExosisterVadis, CardId.ExosisterReturnia, CardId.ExosisterPax + }; + addToHandOrderList.AddRange(remainOrderList); + + AI.SelectCard(banishList); + AI.SelectNextCard(addToHandOrderList); + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + + potActivate = true; + return true; + } + + public bool SakitamaActivate() + { + // summon + if (Card.Location == CardLocation.Hand) + { + // summon for xyz + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1) + { + AI.SelectCard(CardId.Aratama, CardId.Sakitama); + sakitamaEffect1Activated = true; + return true; + } + + // summon for summon donner + if (!CheckLessOperation() && Bot.HasInExtra(CardId.DonnerDaggerFurHire) && + !Bot.HasInHand(CardId.ExosisterMartha) || Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + List illegalList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz) && card.Level != 4 + && (card.Data == null || !card.HasSetcode(SetcodeExosister))).ToList(); + if (illegalList.Count() > 0) + { + if (illegalList.Count() == 1) + { + List otherMaterialList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz)).ToList(); + otherMaterialList.Sort(CardContainer.CompareCardAttack); + illegalList.AddRange(otherMaterialList); + } + if (illegalList.Count() == 1) + { + Logger.DebugWriteLine("===Exosister: activate sakitama for donner"); + AI.SelectCard(CardId.Aratama, CardId.Sakitama); + sakitamaEffect1Activated = true; + return true; + } + } + } + return false; + } + // add to hand + if (Card.Location == CardLocation.Grave) + { + AI.SelectCard(CardId.Sakitama, CardId.Aratama); + return true; + } + return true; + } + + public bool DonnerDaggerFurHireActivate() + { + if (CheckAtAdvantage() && !Bot.HasInHand(CardId.ExosisterMartha) && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + return false; + } + + ClientCard targetCard = Util.GetProblematicEnemyMonster(canBeTarget: true); + if (targetCard == null) + { + List enemyMonsters = Enemy.GetMonsters(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + targetCard = enemyMonsters[0]; + } + } + + if (targetCard != null) + { + AI.SelectCard(Card); + AI.SelectNextCard(targetCard); + return true; + } + + return false; + } + + public bool ExosisterElisActivate() + { + if (ActivateDescription != Util.GetStringId(CardId.ExosisterElis, 0)) + { + return false; + } + + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1) + { + elisEffect1Activated = true; + return true; + } + + return false; + } + + public bool ExosisterStellaActivate() + { + return ExosisterStellaActivateInner(true); + } + + public bool ExosisterStellaSecondActivate() + { + return ExosisterStellaActivateInner(false); + } + + public bool ExosisterStellaActivateInner(bool checkMartha = false) + { + if (ActivateDescription != Util.GetStringId(CardId.ExosisterStella, 0) || CheckWhetherNegated(true)) + { + return false; + } + + bool ableToXyz = Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) >= 2; + + if (CheckLessOperation() && ableToXyz) + { + return false; + } + if (checkMartha && Bot.HasInHand(CardId.ExosisterMartha) && ableToXyz + && Bot.Hand.Count(card => card.IsMonster() && card.HasSetcode(CardId.ExosisterMartha)) == 1) + { + return false; + } + + AI.SelectCard(CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterElis); + stellaEffect1Activated = true; + return true; + } + + public bool ExosisterIreneActivate() + { + if (ActivateDescription != Util.GetStringId(CardId.ExosisterIrene, 0) || CheckWhetherNegated(true)) + { + return false; + } + + List shuffleList = new List(); + foreach (int cardId in new List{CardId.ExosisterIrene, CardId.ExosisterSophia, CardId.ExosisterArment}) + { + if (Bot.HasInHand(cardId)) + { + shuffleList.Add(cardId); + } + } + if (elisEffect1Activated || Bot.Hand.Count(card => card.IsCode(CardId.ExosisterElis)) > 1) + { + shuffleList.Add(CardId.ExosisterElis); + } + foreach (int cardId in new List{CardId.ExosisterPax, CardId.ExosisterReturnia, CardId.ExosisterVadis}) + { + if ((oncePerTurnEffectActivatedList.Contains(cardId) && Bot.HasInHand(cardId)) || Bot.Hand.Count(card => card.IsCode(cardId)) > 1) + { + shuffleList.Add(cardId); + } + } + + if (shuffleList.Count() > 0) + { + Logger.DebugWriteLine("===Exosister: irene return " + shuffleList[0]); + AI.SelectCard(shuffleList); + return true; + } + return false; + } + + public bool ExosisterSophiaActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.ExosisterSophia, 0) && !CheckWhetherNegated(true)) + { + sophiaEffect1Activated = true; + return true; + } + return false; + } + + public bool ExosisterMarthaActivate() + { + if (ActivateDescription != Util.GetStringId(CardId.ExosisterMartha, 0)) { + return false; + } + if (CheckLessOperation() && Bot.GetMonsterCount() > 0) + { + return false; + } + + marthaEffect1Activated = true; + return true; + } + + public bool DefaultExosisterTransform() + { + List canTransformList = new List + { + CardId.ExosisterElis, CardId.ExosisterStella, CardId.ExosisterIrene, CardId.ExosisterSophia, CardId.ExosisterMartha + }; + if (Card.IsDisabled() || !canTransformList.Contains(Card.Id)) + { + return false; + } + List checkTransformCode = new List{ + Util.GetStringId(CardId.ExosisterElis, 1), + Util.GetStringId(CardId.ExosisterStella, 1), + Util.GetStringId(CardId.ExosisterIrene, 1), + Util.GetStringId(CardId.ExosisterSophia, 1), + Util.GetStringId(CardId.ExosisterMartha, 1) + }; + if (!checkTransformCode.Contains((int)ActivateDescription) && ActivateDescription != -1) + { + return false; + } + + // mikailis + if (!Bot.HasInMonstersZone(CardId.ExosisterMikailis) && !mikailisEffect1Activated && (Duel.Player == 1 || !mikailisEffect3Activated) + && !transformDestList.Contains(CardId.ExosisterMikailis) && Bot.HasInExtra(CardId.ExosisterMikailis)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterMikailis); + return true; + } + + // kaspitell on bot's turn + if (!Bot.HasInMonstersZone(CardId.ExosisterKaspitell) && !kaspitellEffect3Activated && Duel.Player == 0 + && !transformDestList.Contains(CardId.ExosisterKaspitell) && Bot.HasInExtra(CardId.ExosisterKaspitell)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterKaspitell); + return true; + } + + // gibrine + if (!Bot.HasInMonstersZone(CardId.ExosisterGibrine) && !gibrineEffect1Activated + && !transformDestList.Contains(CardId.ExosisterGibrine) && Bot.HasInExtra(CardId.ExosisterGibrine)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterGibrine); + return true; + } + + // asophiel + if (!Bot.HasInMonstersZone(CardId.ExosisterAsophiel) && !asophielEffect1Activated + && !transformDestList.Contains(CardId.ExosisterAsophiel) && Bot.HasInExtra(CardId.ExosisterAsophiel)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterAsophiel); + return true; + } + + // kaspitell on bot's turn + if (!Bot.HasInMonstersZone(CardId.ExosisterKaspitell) && !kaspitellEffect1Activated + && !transformDestList.Contains(CardId.ExosisterKaspitell) && Bot.HasInExtra(CardId.ExosisterKaspitell)) + { + exosisterTransformEffectList.Add(Card.Id); + transformDestList.Add(CardId.ExosisterKaspitell); + return true; + } + + return false; + } + + public bool ExosisterMikailisActivate() + { + // banish + if (ActivateDescription == Util.GetStringId(CardId.ExosisterMikailis, 0)) + { + // activate after search + if (Duel.Player == 0 && !mikailisEffect3Activated && Duel.Phase < DuelPhase.End && !DefaultOnBecomeTarget()) + { + return false; + } + + // banish problem card + ClientCard target = GetProblematicEnemyCard(true); + if (target != null && Duel.LastChainPlayer != 0) + { + removeChosenList.Add(target); + mikailisEffect1Activated = true; + AI.SelectCard(target); + return true; + } + + // banish target + if (Duel.LastChainPlayer == 1) + { + List targetList = Duel.LastChainTargets.Where(card => card.Controller == 1 && + (card.Location == CardLocation.Grave || card.Location == CardLocation.MonsterZone || card.Location == CardLocation.SpellZone || card.Location == CardLocation.FieldZone)).ToList(); + if (targetList.Count() > 0) + { + mikailisEffect1Activated = true; + AI.SelectCard(ShuffleCardList(targetList)); + return true; + } + } + + // dump banish + target = GetBestEnemyCard(false, true, true); + if ((DefaultOnBecomeTarget() && !Util.ChainContainsCard(_CardId.EvenlyMatched)) || Bot.UnderAttack || (Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0) + || (Duel.Player == 0 && Bot.GetMonsters().Count(card => card.HasType(CardType.Xyz) && card.Rank == 4 && card.HasSetcode(SetcodeExosister)) == 2 && Duel.LastChainPlayer != 0) + || (Duel.Player == 1 && Enemy.GetMonsterCount() >= 2)) + { + mikailisEffect1Activated = true; + AI.SelectCard(target); + return true; + } + return false; + } + + // search + if (CheckWhetherNegated(true)) + { + return false; + } + + List searchTarget = new List{ + CardId.ExosisterReturnia, + CardId.ExosisterVadis, + CardId.ExosisterPax, + CardId.ExosisterArment + }; + List firstSearchList = new List(); + List lastSearchList = new List(); + foreach (int cardId in searchTarget) + { + if (Bot.HasInHandOrInSpellZone(cardId) || CheckRemainInDeck(cardId) == 0) + { + lastSearchList.Add(cardId); + continue; + } + if (cardId == CardId.ExosisterReturnia && Bot.GetMonsters().Any(card => card.IsFacedown() || !card.HasSetcode(SetcodeExosister))) + { + lastSearchList.Add(cardId); + continue; + } + firstSearchList.Add(cardId); + } + firstSearchList.AddRange(lastSearchList); + + mikailisEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(firstSearchList); + return true; + } + + public bool ExosisterKaspitellActivate() + { + // block spsummon from GY + if (ActivateDescription == Util.GetStringId(CardId.ExosisterKaspitell, 0) || ActivateDescription == -1) + { + if (Enemy.HasInMonstersZone(CardId.InspectorBoarder, true)) + { + return false; + } + kaspitellEffect1Activated = true; + return true; + } + + // search + if (CheckWhetherNegated(true)) + { + return false; + } + + // search martha for activate + if (CheckMarthaActivatable() && CheckRemainInDeck(CardId.ExosisterMartha) > 0 && !Bot.HasInHand(CardId.ExosisterMartha)) + { + kaspitellEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(CardId.ExosisterMartha); + return true; + } + // search sophia for draw + if (!summoned && !sophiaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterSophia) == 0 && !Bot.HasInHand(CardId.ExosisterSophia) + && (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1 || (Bot.HasInHand(CardId.ExosisterElis) && !elisEffect1Activated))) + { + kaspitellEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(CardId.ExosisterSophia); + return true; + } + // search stella for next xyz + if (!summoned && !Bot.HasInHand(CardId.ExosisterStella) && !stellaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterStella) == 0 + && CheckRemainInDeck(CardId.ExosisterStella) > 0 && Bot.Hand.Any(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister))) + { + kaspitellEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(CardId.ExosisterStella); + return true; + } + kaspitellEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(CardId.ExosisterMartha, CardId.ExosisterStella, CardId.ExosisterElis, CardId.ExosisterSophia, CardId.ExosisterIrene); + return true; + } + + public bool ExosisterGibrineActivate() + { + // negate + if (ActivateDescription == Util.GetStringId(CardId.ExosisterGibrine, 0)) + { + if (Duel.Player == 1) + { + ClientCard target = Enemy.MonsterZone.GetShouldBeDisabledBeforeItUseEffectMonster(); + if (target != null) + { + gibrineEffect1Activated = true; + AI.SelectCard(target); + return true; + } + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + if (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone && + !LastChainCard.IsDisabled() && !LastChainCard.IsShouldNotBeTarget() && !LastChainCard.IsShouldNotBeMonsterTarget()) + { + gibrineEffect1Activated = true; + AI.SelectCard(LastChainCard); + return true; + } + + return false; + } + + // gain atk + if (CheckWhetherNegated(true)) + { + return false; + } + gibrineEffect3Activated = true; + SelectDetachMaterial(Card); + return true; + } + + public bool ExosisterAsophielActivate() + { + // block activate from GY + if (ActivateDescription == Util.GetStringId(CardId.ExosisterAsophiel, 0) || ActivateDescription == -1) + { + if (Enemy.HasInMonstersZone(CardId.InspectorBoarder, true)) + { + return false; + } + asophielEffect1Activated = true; + return true; + } + + // return hand + if (CheckWhetherNegated(true)) + { + return false; + } + ClientCard targetCard = Util.GetProblematicEnemyMonster(0, true); + if (targetCard != null) + { + asophielEffect3Activated = true; + SelectDetachMaterial(Card); + AI.SelectNextCard(targetCard); + return true; + } + + return false; + } + + public bool ExosistersMagnificaActivateTrigger() + { + // sp summon + if (ActivateDescription == Util.GetStringId(CardId.ExosistersMagnifica, 1)) + { + // return after effect used + if (activatedMagnificaList.Contains(Card)) + { + // return to Mikailis for danger card + if (Card.Overlays.Contains(CardId.ExosisterMikailis) && !mikailisEffect1Activated) + { + ClientCard target = GetProblematicEnemyCard(true); + if (target != null && !Duel.CurrentChain.Any(card => card == Card)) + { + transformDestList.Add(CardId.ExosisterMikailis); + return true; + } + } + + // negate important card + if (Card.Overlays.Contains(CardId.ExosisterGibrine) && !gibrineEffect1Activated) + { + ClientCard target = Enemy.MonsterZone.GetShouldBeDisabledBeforeItUseEffectMonster(); + if (target != null) + { + transformDestList.Add(CardId.ExosisterGibrine); + return true; + } + } + } + + // become target + if ((DefaultOnBecomeTarget() && !Util.ChainContainsCard(_CardId.EvenlyMatched)) || (Duel.CurrentChain.Any(c => c == Card) && Duel.LastChainPlayer != 0)) + { + targetedMagnificaList.Add(Card); + transformDestList.AddRange(new List{CardId.ExosistersMagnifica, CardId.ExosisterMikailis, CardId.ExosisterGibrine, CardId.ExosisterKaspitell, CardId.ExosisterAsophiel}); + return true; + } + } + return false; + } + public bool ExosistersMagnificaActivateBanish() + { + // banish + if (ActivateDescription == Util.GetStringId(CardId.ExosistersMagnifica, 0)) + { + if (CheckWhetherNegated()) + { + return false; + } + // banish problem card + ClientCard target = GetProblematicEnemyCard(); + bool isProblemCard = false; + if (target != null) + { + isProblemCard = true; + Logger.DebugWriteLine("===Exosister: magnifica target 1: " + target?.Name); + } + + // banish target + if (Duel.LastChainPlayer == 1 && target == null) + { + List currentTargetList = Duel.LastChainTargets.Where(card => card.Controller == 1 && + (card.Location == CardLocation.MonsterZone || card.Location == CardLocation.SpellZone || card.Location == CardLocation.FieldZone)).ToList(); + if (currentTargetList.Count() > 0) + { + target = ShuffleCardList(currentTargetList)[0]; + Logger.DebugWriteLine("===Exosister: magnifica target 2: " + target?.Name); + } + } + + // dump banish + if (target == null) + { + target = GetBestEnemyCard(false, false); + bool check1 = !DefaultOnBecomeTarget() || Util.ChainContainsCard(_CardId.EvenlyMatched); + bool check2 = !targetedMagnificaList.Contains(Card); + bool check3 = !Bot.UnderAttack; + bool check4 = Duel.Phase != DuelPhase.End; + bool check5 = Duel.Player == 0 || Enemy.GetMonsterCount() < 2; + Logger.DebugWriteLine("===Exosister: magnifica check flag: " + check1 + " " + check2 + " " + check3 + " " + check4 + " " + check5); + if (check1 && check2 && check3 && check4 && check5) + { + target = null; + } + } + + if (target != null && (Duel.LastChainPlayer != 0 || Util.GetLastChainCard() == Card)) + { + if (isProblemCard) + { + removeChosenList.Add(target); + } + Logger.DebugWriteLine("===Exosister: magnifica target final: " + target?.Name); + activatedMagnificaList.Add(Card); + AI.SelectCard(CardId.ExosisterGibrine, CardId.ExosisterAsophiel, CardId.ExosisterKaspitell, CardId.ExosisterMikailis); + AI.SelectNextCard(target); + return true; + } + + return false; + } + return false; + } + + public bool ExosisterPaxActivate() + { + if (potActivate || Bot.LifePoints <= 800) + { + return false; + } + + List checkListForSpSummon = new List{ + CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.ExosisterElis + }; + List checkListForSearch = new List{ + CardId.ExosisterMartha, CardId.ExosisterStella, CardId.ExosisterVadis, CardId.ExosisterReturnia, CardId.ExosisterSophia, + CardId.ExosisterIrene, CardId.ExosisterArment, CardId.ExosisterElis + }; + if (Duel.Player == 0 && Duel.LastChainPlayer != 0) + { + // search returnia for banish + if (CheckAtAdvantage() && GetProblematicEnemyCard(true) != null && CheckRemainInDeck(CardId.ExosisterReturnia) > 0 && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + if (Bot.GetMonsterCount() > 0 && Bot.GetMonsters().All(card => card.IsFaceup() && card.HasSetcode(SetcodeExosister))) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterReturnia); + paxCallToField = false; + return true; + } + } + + // search martha for activate + if (CheckMarthaActivatable() && CheckRemainInDeck(CardId.ExosisterMartha) > 0 && !Bot.HasInHand(CardId.ExosisterMartha)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterMartha); + paxCallToField = false; + return true; + } + + // stella relative + if (!stellaEffect1Activated && CheckCalledbytheGrave(CardId.ExosisterStella) == 0) + { + // try to search stella + if (Bot.Hand.Count(card => card.IsCode(CardId.ExosisterStella)) == 0 && CheckRemainInDeck(CardId.ExosisterStella) > 0) + { + bool shouldSpSummon = !CheckLessOperation() && summoned && Bot.HasInMonstersZoneOrInGraveyard(CardId.ExosisterElis); + if (Bot.Hand.Any(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister))) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterStella); + paxCallToField = shouldSpSummon; + return true; + } + } + + // search monster for stella to summon + bool searchExosisterMonster = false; + if (Bot.HasInHand(CardId.ExosisterStella) && Bot.Hand.Count(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister)) == 1) + { + searchExosisterMonster = true; + } + if (Bot.HasInMonstersZone(CardId.ExosisterStella) && Bot.Hand.Count(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister)) == 0) + { + searchExosisterMonster = true; + } + if (searchExosisterMonster) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterMartha, CardId.ExosisterStella, CardId.ExosisterElis); + paxCallToField = false; + return true; + } + } + + // addition summon + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1 && summoned && !CheckLessOperation()) + { + if ( (sakitamaEffect1Activated || !Bot.HasInHand(CardId.Sakitama)) + && (stellaEffect1Activated || !Bot.HasInMonstersZone(CardId.ExosisterStella)) + && (elisEffect1Activated || !Bot.HasInHand(CardId.ExosisterElis)) + ) + { + foreach (int checkId in checkListForSpSummon) + { + int checkTarget = CheckExosisterMentionCard(checkId); + if (checkTarget > 0 && Bot.HasInMonstersZoneOrInGraveyard(checkId) && CheckRemainInDeck(checkTarget) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(checkId); + paxCallToField = true; + return true; + } + } + } + } + } + + // in danger + bool inDanger = CheckInDanger(); + + // trigger transform + CheckEnemyMoveGrave(); + + bool forReturnia = false; + if (!oncePerTurnEffectActivatedList.Contains(CardId.ExosisterReturnia) && Bot.HasInSpellZone(CardId.ExosisterReturnia) && Bot.GetMonsters().Count() == 0) + { + forReturnia = true; + } + + // become target + if (enemyMoveGrave || DefaultOnBecomeTarget() || inDanger || forReturnia) + { + List checkList = checkListForSpSummon; + bool shouldSpSummon = enemyMoveGrave || inDanger || forReturnia; + if (!shouldSpSummon && !Bot.HasInMonstersZone(new List{ + CardId.ExosisterElis, CardId.ExosisterStella, CardId.ExosisterIrene, CardId.ExosisterSophia, CardId.ExosisterMartha})) + { + shouldSpSummon = true; + } + if (CheckAtAdvantage() && !enemyMoveGrave) + { + shouldSpSummon = false; + checkList = checkListForSearch; + } + foreach (int checkId in checkList) + { + bool checkSuccessFlag = false; + + if (shouldSpSummon) + { + int checkTarget = CheckExosisterMentionCard(checkId); + checkSuccessFlag = checkTarget > 0 && Bot.HasInMonstersZoneOrInGraveyard(checkTarget) && CheckRemainInDeck(checkId) > 0 + && !exosisterTransformEffectList.Contains(checkId) && !Bot.HasInMonstersZone(checkId); + } else + { + checkSuccessFlag = !Bot.HasInHandOrHasInMonstersZone(checkId) && !Bot.HasInSpellZone(checkId) && CheckRemainInDeck(checkId) > 0; + } + + if (checkSuccessFlag) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(checkId); + paxCallToField = shouldSpSummon; + return true; + } + } + } + + return false; + } + + public bool ExosisterPaxActivateForEndSearch() + { + if (potActivate || Bot.LifePoints <= 800) + { + return false; + } + + if (Duel.Player == 0 || Duel.Phase >= DuelPhase.End) + { + // search spell/trap + List checkSpellTrapListForSearch = new List{ + CardId.ExosisterVadis, CardId.ExosisterMartha, CardId.ExosisterReturnia, CardId.ExosisterStella, CardId.ExosisterSophia, + CardId.ExosisterIrene, CardId.ExosisterArment, CardId.ExosisterElis + }; + foreach (int checkId in checkSpellTrapListForSearch) + { + if (!Bot.HasInHandOrHasInMonstersZone(checkId) && !Bot.HasInSpellZone(checkId) && CheckRemainInDeck(checkId) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterMartha, CardId.ExosisterStella, CardId.ExosisterElis); + paxCallToField = false; + return true; + } + } + } + return false; + } + + public bool ExosisterArmentActivate() + { + if (Bot.LifePoints <= 800) + { + return false; + } + ClientCard activateTarget = null; + + if (Duel.Player == 0) + { + bool decided = false; + + // addition summon + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1 && summoned && !CheckLessOperation()) + { + if ( (sakitamaEffect1Activated || !Bot.HasInHand(CardId.Sakitama)) + && (stellaEffect1Activated || !Bot.HasInMonstersZone(CardId.ExosisterStella)) + && (elisEffect1Activated || !Bot.HasInHand(CardId.ExosisterElis)) + ) + { + decided = true; + } + } + + if (Duel.LastChainPlayer == 1) + { + foreach (ClientCard target in Duel.LastChainTargets) + { + if (target.Controller == 0 && target.Location == CardLocation.MonsterZone && target.IsFaceup() && target.HasSetcode(SetcodeExosister)) + { + activateTarget = target; + decided = true; + break; + } + } + } + + if (!decided) + { + return false; + } + } + + if (activateTarget == null && Duel.LastChainPlayer == 1) + { + { + foreach (ClientCard target in Duel.LastChainTargets) + { + if (target.Controller == 0 && target.Location == CardLocation.MonsterZone && target.IsFaceup() && target.HasSetcode(SetcodeExosister)) + { + activateTarget = target; + break; + } + } + } + } + + if (activateTarget == null) + { + List targetList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeExosister) && !card.HasType(CardType.Xyz)).ToList(); + if (targetList.Count() > 0) + { + targetList.Sort(CardContainer.CompareCardAttack); + activateTarget = targetList[0]; + } + } + + if (activateTarget == null) + { + return false; + } + + // mikailis + if (!Bot.HasInMonstersZone(CardId.ExosisterMikailis) && !mikailisEffect1Activated && (Duel.Player == 1 || !mikailisEffect3Activated) + && !transformDestList.Contains(CardId.ExosisterMikailis) && Bot.HasInExtra(CardId.ExosisterMikailis)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterMikailis); + return true; + } + + // kaspitell on bot's turn + if (!Bot.HasInMonstersZone(CardId.ExosisterKaspitell) && !kaspitellEffect3Activated && Duel.Player == 0 + && !transformDestList.Contains(CardId.ExosisterKaspitell) && Bot.HasInExtra(CardId.ExosisterKaspitell)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterKaspitell); + return true; + } + + // gibrine + if (!Bot.HasInMonstersZone(CardId.ExosisterGibrine) && !gibrineEffect1Activated + && !transformDestList.Contains(CardId.ExosisterGibrine) && Bot.HasInExtra(CardId.ExosisterGibrine)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterGibrine); + return true; + } + + // asophiel + if (!Bot.HasInMonstersZone(CardId.ExosisterAsophiel) && !asophielEffect1Activated + && !transformDestList.Contains(CardId.ExosisterAsophiel) && Bot.HasInExtra(CardId.ExosisterAsophiel)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterAsophiel); + return true; + } + + // kaspitell on bot's turn + if (!Bot.HasInMonstersZone(CardId.ExosisterKaspitell) && !kaspitellEffect1Activated + && !transformDestList.Contains(CardId.ExosisterKaspitell) && Bot.HasInExtra(CardId.ExosisterKaspitell)) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(activateTarget); + transformDestList.Add(CardId.ExosisterKaspitell); + return true; + } + + return false; + } + + public bool ExosisterVadisActivate() + { + if (Bot.LifePoints <= 800) + { + return false; + } + + List checkListForSpSummon = new List{ + CardId.ExosisterSophia, CardId.ExosisterIrene, CardId.ExosisterStella, CardId.ExosisterMartha, CardId.ExosisterElis + }; + + bool decideToActivate = false; + bool checkTransform = false; + + // special summon for xyz + if (Duel.Player == 0 && Duel.Phase > DuelPhase.Draw && !CheckLessOperation()) + { + decideToActivate = true; + } + + // move grave + CheckEnemyMoveGrave(); + if (enemyMoveGrave) + { + decideToActivate = true; + checkTransform = true; + } + + // for returia + if (!oncePerTurnEffectActivatedList.Contains(CardId.ExosisterReturnia) && Bot.HasInSpellZone(CardId.ExosisterReturnia) && Bot.GetMonsters().Count() == 0) + { + decideToActivate = true; + } + + if (CheckInDanger() || (DefaultOnBecomeTarget() && !Util.ChainContainsCard(_CardId.EvenlyMatched))) + { + decideToActivate = true; + } + + if (decideToActivate) + { + foreach (int checkId in checkListForSpSummon) + { + int checkTarget = CheckExosisterMentionCard(checkId); + if (checkTarget > 0 && CheckRemainInDeck(checkId) > 0 && CheckRemainInDeck(checkTarget) > 0) + { + if (checkTransform) + { + int canTransformCount = 0; + foreach (int transformCheckId in new List{checkId, checkTarget}) + { + if (!Bot.HasInMonstersZone(checkId) && !exosisterTransformEffectList.Contains(checkId)) + { + canTransformCount ++; + } + } + + if (canTransformCount == 0) + { + continue; + } + } + oncePerTurnEffectActivatedList.Add(Card.Id); + Logger.DebugWriteLine("Exosiseter Vadis decide: " + checkId); + AI.SelectCard(checkId); + AI.SelectNextCard(checkTarget); + return true; + } + } + } + + return false; + } + + public bool ExosisterReturniaActivate() + { + if (Bot.LifePoints <= 800) + { + return false; + } + + // banish problem card + ClientCard target = GetProblematicEnemyCard(true); + if (target != null && Duel.LastChainPlayer != 0) + { + Logger.DebugWriteLine("===Exosister: returnia target 1: " + target?.Name); + removeChosenList.Add(target); + oncePerTurnEffectActivatedList.Add(Card.Id); + AI.SelectCard(target); + return true; + } + + // banish target + if (Duel.LastChainPlayer == 1) + { + List targetList = Duel.LastChainTargets.Where(card => card.Controller == 1 && + (card.Location == CardLocation.Grave || card.Location == CardLocation.MonsterZone || card.Location == CardLocation.SpellZone || card.Location == CardLocation.FieldZone)).ToList(); + if (targetList.Count() > 0) + { + oncePerTurnEffectActivatedList.Add(Card.Id); + List shuffleTargetList = ShuffleCardList(targetList); + Logger.DebugWriteLine("===Exosister: returnia target 2: " + shuffleTargetList[0]?.Name); + AI.SelectCard(shuffleTargetList); + return true; + } + } + + // dump banish + target = GetBestEnemyCard(false, true, true); + bool check1 = DefaultOnBecomeTarget() && target != null && (target.Location != CardLocation.Onfield || target.Id != _CardId.EvenlyMatched); + bool check2 = Bot.UnderAttack; + bool check3 = (Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0 && target != null && target.Location != CardLocation.Grave); + bool check4 = (Duel.Player == 1 && Enemy.GetMonsterCount() >= 2 && Duel.LastChainPlayer != 0); + Logger.DebugWriteLine("===Exosister: returnia check flag: " + check1 + " " + check2 + " " + check3 + " " + check4); + if (check1 || check2 || check3 || check4) + { + oncePerTurnEffectActivatedList.Add(Card.Id); + Logger.DebugWriteLine("===Exosister: returnia target 3: " + target?.Name); + AI.SelectCard(target); + return true; + } + + return false; + } + + /// + /// Check hand like exosister + elis + martha + /// + public bool ExosisterAvoidMaxxCSummonCheck() + { + if (!Bot.HasInHand(CardId.ExosisterMartha) || !Bot.HasInHand(CardId.ExosisterElis) || elisEffect1Activated || marthaEffect1Activated) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + // normal summon non-elis exosister + if (Card.Id != CardId.ExosisterElis && Card.Id != CardId.ExosisterMartha) + { + summoned = true; + return true; + } + // normal summon elis + if (Card.IsCode(CardId.ExosisterElis)) + { + int otherExosisterCount = Bot.Hand.Count(card => card?.Data != null && !card.IsCode(CardId.ExosisterElis) && !card.IsCode(CardId.ExosisterMartha) + && card.IsMonster() && card.HasSetcode(SetcodeExosister)); + if (otherExosisterCount > 0) + { + return false; + } + if (Bot.Hand.Count(card => card?.Data != null && card.IsCode(CardId.ExosisterElis)) > 1) + { + summoned = true; + return true; + } + } + + return false; + } + + /// + /// Check hand like exosister + stella + /// + public bool ExosisterStellaSummonCheck() + { + if (stellaEffect1Activated || Bot.HasInMonstersZone(CardId.ExosisterStella, true) || CheckWhetherNegated(true) || CheckLessOperation()) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + + int summonableCount = Bot.Hand.Count(card => card != Card && card?.Data != null && card.IsMonster() + && card.HasSetcode(SetcodeExosister)); + + if (summonableCount > 0) + { + summoned = true; + return true; + } + return false; + } + + /// + /// Check whether need Irene's redraw effect to search elis for xyz + /// + public bool ExosisterIreneSummonCheck() + { + if (irenaEffect1Activated || CheckLessOperation() + || CheckWhetherNegated(true) || CheckCalledbytheGrave(CardId.ExosisterElis) > 0 || CheckCalledbytheGrave(CardId.ExosisterIrene) > 0) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + + if (CheckRemainInDeck(CardId.ExosisterElis) > 0) + { + summoned = true; + return true; + } + return false; + } + + /// + /// Check hand like exosister + elis + /// + public bool ExosisterForElisSummonCheck() + { + if (elisEffect1Activated || CheckCalledbytheGrave(CardId.ExosisterElis) > 0 || CheckLessOperation()) + { + return false; + } + if (Card?.Data == null) + { + return false; + } + if (!Card.HasSetcode(SetcodeExosister) || (Card.IsCode(CardId.ExosisterMartha) && CheckRemainInDeck(CardId.ExosisterElis) > 0)) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + + if (Bot.Hand.Count(card => card != Card && card?.Data != null && card.IsCode(CardId.ExosisterElis)) > 0) + { + summoned = true; + return true; + } + + return false; + } + + public bool AratamaSummonCheck() + { + if (sakitamaEffect1Activated || CheckCalledbytheGrave(CardId.Aratama) > 0 || CheckCalledbytheGrave(CardId.Sakitama) > 0) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + if (CheckRemainInDeck(CardId.Sakitama) > 0) + { + summoned = true; + return true; + } + return false; + } + + public bool ForSakitamaSummonCheck() + { + if (sakitamaEffect1Activated || CheckCalledbytheGrave(CardId.Sakitama) > 0 || CheckLessOperation()) + { + return false; + } + if (Bot.Hand.Count(card => card?.Data != null && Card != card && card.IsCode(CardId.Sakitama)) == 0) + { + return false; + } + if (enemyActivateLockBird && CheckAtAdvantage()) + { + return false; + } + if (Card?.Data != null && !Card.IsCode(CardId.ExosisterMartha) && Card.Level == 4) + { + summoned = true; + return true; + } + + return false; + } + + public bool Level4SummonCheck() + { + if (Card.Id == CardId.ExosisterMartha) + { + return false; + } + if (Bot.GetMonsters().Count(card => CheckAbleForXyz(card)) == 1) + { + summoned = true; + return true; + } + return false; + } + + public bool ForDonnerSummonCheck() + { + if (!Bot.HasInExtra(CardId.DonnerDaggerFurHire) || (!Bot.HasInHand(CardId.ExosisterMartha) && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia))) + { + return false; + } + if (CheckLessOperation()) + { + return false; + } + + List illegalList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz) && card.Level != 4 + && (card.Data == null || !card.HasSetcode(SetcodeExosister))).ToList(); + if (illegalList.Count() == 0) + { + return false; + } + + if (illegalList.Count() == 1) + { + List otherMaterialList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz)).ToList(); + otherMaterialList.Sort(CardContainer.CompareCardAttack); + illegalList.AddRange(otherMaterialList); + } + if (illegalList.Count() == 1) + { + List hands = Bot.Hand.Where(card => card?.Data != null && card.IsMonster()).ToList(); + if (hands.Count() > 0) + { + hands.Sort(CardContainer.CompareCardAttack); + if (Card != hands[0]) + { + return false; + } + } + Logger.DebugWriteLine("===Exosister: summon for donner"); + summoned = true; + return true; + } + + return false; + } + + public bool ExosisterForArmentSummonCheck() + { + if (!Bot.HasInHandOrInSpellZone(CardId.ExosisterArment)) + { + return false; + } + if (Card?.Data == null) + { + return false; + } + if (!Card.HasSetcode(SetcodeExosister)) + { + return false; + } + + if (!Bot.GetMonsters().Any(card => card?.Data != null && card.IsFaceup() && card.HasSetcode(SetcodeExosister))) + { + summoned = true; + return true; + } + + return false; + } + + public bool ExosisterMikailisSpSummonCheck() + { + return ExosisterMikailisSpSummonCheckInner(true); + } + + public bool ExosisterMikailisAdvancedSpSummonCheck() + { + if (!CheckLessOperation() || enemyActivateLockBird) + { + return false; + } + + return ExosisterMikailisSpSummonCheckInner(false); + } + + public bool ExosisterMikailisSpSummonCheckInner(bool shouldCheckLessOperation = true) + { + if (Bot.HasInMonstersZone(CardId.ExosisterMikailis) || mikailisEffect3Activated || (CheckLessOperation() && shouldCheckLessOperation)) + { + return false; + } + + // check searched spell/trap + if (!enemyActivateLockBird) + { + foreach (int cardId in ExosisterSpellTrapList) + { + if (!Bot.HasInHandOrInSpellZone(cardId)) + { + SelectXyzMaterial(2); + return true; + } + } + } + + // clear enemy card + if (!mikailisEffect1Activated && !Bot.HasInMonstersZone(CardId.ExosisterMikailis)) + { + ClientCard target = GetProblematicEnemyCard(true); + if (target != null) + { + List exosisterMaterialList = Bot.GetMonsters().Where(card => CheckAbleForXyz(card) && card.HasSetcode(SetcodeExosister)).ToList(); + if (exosisterMaterialList?.Count() > 0) + { + SelectXyzMaterial(2, true); + return true; + } + } + } + + return false; + } + + public bool ExosisterKaspitellSpSummonCheck() + { + return ExosisterKaspitellSpSummonCheckInner(true); + } + + public bool ExosisterKaspitellAdvancedSpSummonCheck() + { + if (!CheckLessOperation() || enemyActivateLockBird) + { + return false; + } + return ExosisterKaspitellSpSummonCheckInner(false); + } + + public bool ExosisterKaspitellSpSummonCheckInner(bool shouldCheckLessOperation = true) + { + if (Bot.HasInMonstersZone(CardId.ExosisterKaspitell) || kaspitellEffect3Activated || (shouldCheckLessOperation && CheckLessOperation())) + { + return false; + } + + bool searchMartha = true; + bool searchStella = true; + bool forMagnifica = false; + if (marthaEffect1Activated || CheckCalledbytheGrave(CardId.ExosisterMartha) > 0 + || CheckRemainInDeck(CardId.ExosisterMartha) == 0 || CheckRemainInDeck(CardId.ExosisterElis) == 0) + { + searchMartha = false; + } + if (Bot.GetMonsters().Any(card => card.HasType(CardType.Link) || card.HasType(CardType.Token))) + { + searchMartha = false; + } + if (stellaEffect1Activated || CheckCalledbytheGrave(CardId.ExosisterStella) > 0 || CheckRemainInDeck(CardId.ExosisterStella) == 0 + || !Bot.Hand.Any(card => card?.Data != null && card.IsMonster() && card.HasSetcode(SetcodeExosister))) + { + searchStella = false; + } + if (Bot.GetMonsters().Count(card => card?.Data != null + && card.HasType(CardType.Xyz) && card.HasType(CardType.Xyz) && !card.IsCode(CardId.ExosistersMagnifica)) == 1) + { + forMagnifica = true; + } + if (enemyActivateLockBird) + { + searchMartha = false; + searchStella = false; + } + + if (!searchMartha && !searchStella && !forMagnifica) + { + return false; + } + + List materialCheckList = Bot.GetMonsters().Where(card => + !card.HasType(CardType.Xyz) && !card.HasType(CardType.Token) && !card.HasType(CardType.Link)).ToList(); + if (materialCheckList.Count() == 2 && materialCheckList.All(card => card.Level == 4)) + { + SelectXyzMaterial(2); + return true; + } + + return false; + } + + public bool ExosistersMagnificaSpSummonCheck() + { + if (CheckLessOperation()) + { + return false; + } + + List materialList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasType(CardType.Xyz) + && card.Rank == 4 && card.HasSetcode(SetcodeExosister)).ToList(); + materialList.Sort(CardContainer.CompareCardAttack); + + AI.SelectMaterials(materialList); + return true; + } + + public bool CheckCaduceusInner(ClientCard card) + { + if (card?.Data == null) + { + return false; + } + foreach (int setcode in SetcodeForDiamond) + { + if (card.HasSetcode(setcode)) + { + return true; + } + } + return false; + } + + public bool TellarknightConstellarCaduceusSpSummonCheck() + { + if (Duel.Turn == 1 || !Bot.HasInExtra(CardId.StellarknightConstellarDiamond)) + { + return false; + } + + // check whether need to call Diamond + if (Enemy.Graveyard.Any(card => CheckCaduceusInner(card))) + { + SelectXyzMaterial(2); + return true; + } + + return false; + } + + public bool DonnerDaggerFurHireSpSummonCheck() + { + if (!Bot.HasInHand(CardId.ExosisterMartha) && !Bot.HasInHandOrInSpellZone(CardId.ExosisterReturnia)) + { + return false; + } + + if (CheckLessOperation()) + { + return false; + } + + List illegalList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz) && card.Level != 4 + && (card.Data == null || !card.HasSetcode(SetcodeExosister))).ToList(); + + if (illegalList.Count() == 1) + { + + List otherMaterialList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz)).ToList(); + otherMaterialList.Sort(CardContainer.CompareCardAttack); + illegalList.AddRange(otherMaterialList); + } + if (illegalList.Count() > 1) + { + AI.SelectMaterials(illegalList); + return true; + } + + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + List onlyOneSetList = new List{ + CardId.ExosisterPax, CardId.ExosisterArment, CardId.ExosisterVadis, CardId.ExosisterReturnia + }; + if (onlyOneSetList.Contains(Card.Id) && Bot.HasInSpellZone(Card.Id)) + { + return false; + } + + // select place + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } else + { + SelectSTPlace(); + } + return true; + } + + return false; + } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(null, true); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Game/AI/Decks/FrogExecutor.cs b/Game/AI/Decks/FrogExecutor.cs index 84be2717f..49667fa65 100644 --- a/Game/AI/Decks/FrogExecutor.cs +++ b/Game/AI/Decks/FrogExecutor.cs @@ -135,6 +135,7 @@ private bool FlipFlopFrog() private bool Ronintoadin() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; List monsters = Bot.GetGraveyardMonsters(); if (monsters.Count > 2) { diff --git a/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs b/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs index b256a6957..c3be27557 100644 --- a/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs +++ b/Game/AI/Decks/GrenMajuThunderBoarderExecutor.cs @@ -1,4 +1,4 @@ -using YGOSharp.OCGWrapper.Enums; +using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using WindBot; using WindBot.Game; @@ -128,6 +128,7 @@ public override void OnNewTurn() { eater_eff = false; CardOfDemiseeff_used = false; + base.OnNewTurn(); } public override void OnNewPhase() @@ -437,6 +438,7 @@ private bool ThunderKingRaiOhsummon() private bool ThunderKingRaiOheff() { + if (DefaultOnlyHorusSpSummoning()) return false; if(Duel.SummoningCards.Count > 0) { foreach(ClientCard m in Duel.SummoningCards) @@ -570,6 +572,7 @@ private bool WakingTheDragoneff() private bool MetalSnakesp() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (ActivateDescription == Util.GetStringId(CardId.MetalSnake, 0) && !Bot.HasInMonstersZone(CardId.MetalSnake)) { if(Duel.Player == 1 && Duel.Phase >= DuelPhase.BattleStart ) diff --git a/Game/AI/Decks/HorusExecutor.cs b/Game/AI/Decks/HorusExecutor.cs index bc8b995f1..1a6644b73 100644 --- a/Game/AI/Decks/HorusExecutor.cs +++ b/Game/AI/Decks/HorusExecutor.cs @@ -28,7 +28,7 @@ public class CardId public const int FoolishBurial = 81439173; public const int MonsterReborn = 83764718; public const int MysticalSpaceTyphoon = 5318639; - public const int SilversCry = 87025064; + public const int BellowOfTheSilverDragon = 80600103; public const int Mountain = 50913601; public const int DragonsRebirth = 20638610; public const int MirrorForce = 44095762; @@ -52,7 +52,7 @@ public HorusExecutor(GameAI ai, Duel duel) : base(ai, duel) AddExecutor(ExecutorType.Activate, CardId.HammerShot, DefaultHammerShot); AddExecutor(ExecutorType.Activate, CardId.Fissure); - AddExecutor(ExecutorType.Activate, CardId.SilversCry, SilversCry); + AddExecutor(ExecutorType.Activate, CardId.BellowOfTheSilverDragon, BellowOfTheSilverDragon); AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, MonsterReborn); AddExecutor(ExecutorType.Summon, CardId.WhiteNightDragon, WhiteNightDragon); @@ -89,7 +89,7 @@ private bool FoolishBurial() return false; } - private bool SilversCry() + private bool BellowOfTheSilverDragon() { if (Duel.Player == 0 && (Duel.Phase == DuelPhase.Draw || Duel.Phase == DuelPhase.Standby)) return false; @@ -153,7 +153,7 @@ private bool WhiteNightDragon() { // We should summon Horus the Black Flame Dragon LV6 if he can lvlup. if (Enemy.GetMonsterCount() != 0 && !Util.IsAllEnemyBetterThanValue(2300 - 1, false)) - foreach (ClientCard card in Main.SummonableCards) + foreach (ClientCard card in Duel.MainPhase.SummonableCards) if (card.IsCode(11224103)) return false; diff --git a/Game/AI/Decks/KashtiraExecutor.cs b/Game/AI/Decks/KashtiraExecutor.cs index 35f478f46..32db52116 100644 --- a/Game/AI/Decks/KashtiraExecutor.cs +++ b/Game/AI/Decks/KashtiraExecutor.cs @@ -1,7 +1,9 @@ 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("Kashtira", "AI_Kashtira")] @@ -26,7 +28,7 @@ public class CardId public const int CalledbytheGrave = 24224830; public const int CrossoutDesignator = 65681983; public const int KashtiraBirth = 69540484; - public const int PressuredPlanetWraitsoth = 71832012; + public const int PrimePlanetParaisos = 71832012; public const int KashtiraBigBang = 33925864; public const int InfiniteImpermanence = 10045474; @@ -52,13 +54,13 @@ public class CardId bool activate_KashtiraFenrir_1 = false; bool activate_KashtiraRiseheart_1 = false; bool activate_KashtiraRiseheart_2 = false; - bool activate_PressuredPlanetWraitsoth = false; + bool activate_PrimePlanetParaisos = false; bool activate_KashtiraScareclaw_1 = false; bool activate_KashtiraShangriIra = false; bool activate_KashtiraTearlaments_1 = false; bool activate_DimensionShifter = false; - bool activate_pre_PressuredPlanetWraitsoth = false; - bool activate_pre_PressuredPlanetWraitsoth_2 = false; + bool activate_pre_PrimePlanetParaisos = false; + bool activate_pre_PrimePlanetParaisos_2 = false; bool active_KashtiraPapiyas_1 = false; bool active_KashtiraPapiyas_2 = false; bool active_KashtiraBirth = false; @@ -96,7 +98,7 @@ public KashtiraExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, CardId.PotofProsperity, PotofProsperityEffect); AddExecutor(ExecutorType.Activate, CardId.KashtiraUnicorn, KashtiraUnicornEffect); AddExecutor(ExecutorType.Activate, CardId.KashtiraFenrir, KashtiraFenrirEffect); - AddExecutor(ExecutorType.Activate, CardId.PressuredPlanetWraitsoth, PressuredPlanetWraitsothEffect); + AddExecutor(ExecutorType.Activate, CardId.PrimePlanetParaisos, PrimePlanetParaisosEffect); AddExecutor(ExecutorType.Activate, CardId.KashtiraBirth, KashtiraBirthEffect); AddExecutor(ExecutorType.Activate, CardId.DiablosistheMindHacker, DiablosistheMindHackerEffect); AddExecutor(ExecutorType.SpSummon, CardId.KashtiraFenrir, KashtiraFenrirSummon); @@ -156,11 +158,11 @@ public override void OnNewTurn() activate_KashtiraFenrir_1 = false; activate_KashtiraRiseheart_1 = false; activate_KashtiraRiseheart_2 = false; - activate_PressuredPlanetWraitsoth = false; + activate_PrimePlanetParaisos = false; activate_KashtiraScareclaw_1 = false; activate_KashtiraTearlaments_1 = false; activate_KashtiraShangriIra = false; - activate_pre_PressuredPlanetWraitsoth_2 = false; + activate_pre_PrimePlanetParaisos_2 = false; active_KashtiraPapiyas_1 = false; active_KashtiraPapiyas_2 = false; active_KashtiraBirth = false; @@ -173,12 +175,13 @@ public override void OnNewTurn() opt_2 = false; if (flag >= 0) ++flag; if (flag >= 2) { flag = -1; activate_DimensionShifter = false; } + base.OnNewTurn(); } - public override bool OnSelectYesNo(long desc) + public override bool OnSelectYesNo(int desc) { - if (desc == Util.GetStringId(CardId.PressuredPlanetWraitsoth, 0)) + if (desc == 1149312192) { - activate_pre_PressuredPlanetWraitsoth = true; + activate_pre_PrimePlanetParaisos = true; } return base.OnSelectYesNo(desc); } @@ -190,23 +193,23 @@ public override CardPosition OnSelectPosition(int cardId, IList po } return base.OnSelectPosition(cardId, positions); } - public override int OnSelectOption(IList options) + public override int OnSelectOption(IList options) { if (options.Count == 2 && options[1] == Util.GetStringId(CardId.KashtiraBirth, 0)) return 1; - if (options.Count == 2 && options.Contains(Util.GetStringId(CardId.KashtiraTearlaments, 3))) + if (options.Count == 2 && options.Contains(Util.GetStringId(CardId.KashtiraTearlaments, 1))) { return (isEffectByRemove() || Enemy.Deck.Count <= 3) ? 1 : 0; } - if (options.Contains(Util.GetStringId(CardId.MechaPhantomBeastAuroradon, 4))) + if (options.Contains(Util.GetStringId(CardId.MechaPhantomBeastAuroradon, 3))) { - if (opt_1) return options.IndexOf(Util.GetStringId(CardId.MechaPhantomBeastAuroradon, 4)); + if (opt_1) return options.IndexOf(Util.GetStringId(CardId.MechaPhantomBeastAuroradon, 3)); else if (opt_0) return 0; - return options.Count - 1; + return options[options.Count - 1]; } return base.OnSelectOption(options); } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (cardId == 0 && player == 1) { @@ -224,7 +227,7 @@ public override int OnSelectPlace(long cardId, int player, CardLocation location } return base.OnSelectPlace(cardId, player, location, available); } - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { if (cards.Any(card => card != null && card.Location == CardLocation.Extra && hint == HintMsg.Remove && min == 1 && max == 1)) @@ -378,9 +381,9 @@ public override IList OnSelectCard(IList cards, int min, res.Reverse(); return Util.CheckSelectCount(res, cards, min, max); } - if (activate_pre_PressuredPlanetWraitsoth) + if (activate_pre_PrimePlanetParaisos) { - activate_pre_PressuredPlanetWraitsoth = false; + activate_pre_PrimePlanetParaisos = false; IList cardsId = new List(); if (!Bot.HasInHand(CardId.KashtiraUnicorn) && !activate_KashtiraUnicorn_1 && CheckRemainInDeck(CardId.KashtiraUnicorn) > 0) cardsId.Add(CardId.KashtiraUnicorn); if (!Bot.HasInHand(CardId.KashtiraFenrir) && !activate_KashtiraFenrir_1 && CheckRemainInDeck(CardId.KashtiraFenrir) > 0) cardsId.Add(CardId.KashtiraFenrir); @@ -433,8 +436,8 @@ private int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.CrossoutDesignator, 1); case CardId.KashtiraBirth: return Bot.GetRemainingCount(CardId.KashtiraBirth, 3); - case CardId.PressuredPlanetWraitsoth: - return Bot.GetRemainingCount(CardId.PressuredPlanetWraitsoth, 3); + case CardId.PrimePlanetParaisos: + return Bot.GetRemainingCount(CardId.PrimePlanetParaisos, 3); case CardId.KashtiraBigBang: return Bot.GetRemainingCount(CardId.KashtiraBigBang, 1); case CardId.InfiniteImpermanence: @@ -880,10 +883,10 @@ private bool SpellActivate() { return Card.Location == CardLocation.Hand || (Card.IsFacedown() && (Card.Location == CardLocation.SpellZone || Card.Location == CardLocation.FieldZone)); } - private bool PressuredPlanetWraitsothEffect() + private bool PrimePlanetParaisosEffect() { - if (SpellActivate()) { activate_pre_PressuredPlanetWraitsoth_2 = true; return true; } - if (activate_pre_PressuredPlanetWraitsoth_2 || activate_pre_PressuredPlanetWraitsoth) return false; + if (SpellActivate()) { activate_pre_PrimePlanetParaisos_2 = true; return true; } + if (activate_pre_PrimePlanetParaisos_2 || activate_pre_PrimePlanetParaisos) return false; List cards = GetEnemyOnFields().Where(card => card != null && !card.IsShouldNotBeTarget()).ToList(); if (cards == null || cards.Count <= 0) return false; return true; @@ -964,7 +967,7 @@ private bool ActivateLimit(int cardId) if (Bot.MonsterZone.Count() <= 0 && ((Bot.HasInHand(CardId.KashtiraFenrir) && !activate_KashtiraFenrir_1) || (Bot.HasInHand(CardId.KashtiraUnicorn) && !activate_KashtiraUnicorn_1))) return false; - if (Bot.HasInHand(CardId.PressuredPlanetWraitsoth) && !activate_pre_PressuredPlanetWraitsoth_2) return false; + if (Bot.HasInHand(CardId.PrimePlanetParaisos) && !activate_pre_PrimePlanetParaisos_2) return false; List cards = new List(); List hand_cards = Bot.Hand.GetMatchingCards(card=>card!=null && card.HasSetcode(0x189)).ToList(); List grave_cards = Bot.Graveyard.GetMatchingCards(card => card != null && card.HasSetcode(0x189)).ToList(); @@ -1206,7 +1209,7 @@ private bool KashtiraFenrirEffect() else { if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard() != null && - Util.GetLastChainCard().Id == CardId.PressuredPlanetWraitsoth) return false; + Util.GetLastChainCard().Id == CardId.PrimePlanetParaisos) return false; List cards = GetEnemyOnFields().Where(card => card != null && card.IsFaceup()).ToList(); if (cards.Count > 0) { @@ -1231,9 +1234,9 @@ private bool PotofProsperityEffect() { if (Bot.ExtraDeck.Count <= 3) return false; List cardsId = new List(); - if (!Bot.HasInHandOrInSpellZone(CardId.PressuredPlanetWraitsoth) && !activate_PressuredPlanetWraitsoth) - cardsId.Add(CardId.PressuredPlanetWraitsoth); - if (!Bot.HasInHandOrInSpellZone(CardId.PressuredPlanetWraitsoth) && !activate_PressuredPlanetWraitsoth && CheckRemainInDeck(CardId.PressuredPlanetWraitsoth) > 0) + if (!Bot.HasInHandOrInSpellZone(CardId.PrimePlanetParaisos) && !activate_PrimePlanetParaisos) + cardsId.Add(CardId.PrimePlanetParaisos); + if (!Bot.HasInHandOrInSpellZone(CardId.PrimePlanetParaisos) && !activate_PrimePlanetParaisos && CheckRemainInDeck(CardId.PrimePlanetParaisos) > 0) cardsId.Add(CardId.Terraforming); if (!Bot.HasInHand(CardId.KashtiraUnicorn) && !activate_KashtiraUnicorn_1) cardsId.Add(CardId.KashtiraUnicorn); diff --git a/Game/AI/Decks/LabrynthExecutor.cs b/Game/AI/Decks/LabrynthExecutor.cs new file mode 100644 index 000000000..b5fc22034 --- /dev/null +++ b/Game/AI/Decks/LabrynthExecutor.cs @@ -0,0 +1,4356 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Labrynth", "AI_Labrynth")] + public class LabrynthExecutor : DefaultExecutor + { + public class CardId + { + public const int LadyLabrynthOfTheSilverCastle = 81497285; + public const int LovelyLabrynthOfTheSilverCastle = 2347656; + public const int UnchainedSoulOfSharvara = 41165831; + public const int AriasTheLabrynthButler = 73602965; + public const int ArianeTheLabrynthServant = 75730490; + public const int AriannaTheLabrynthServant = 1225009; + public const int LabrynthChandraglier = 37629703; + // _CardId.AshBlossom = 14558127; + // _CardId.MaxxC = 23434538; + public const int LabrynthStovieTorbie = 74018812; + public const int LabrynthCooclock = 2511; + + public const int PotOfExtravagance = 49238328; + + public const int WelcomeLabrynth = 5380979; + public const int TransactionRollback = 6351147; + // _CardId.InfiniteImpermanence = 10045474; + public const int DestructiveDarumaKarmaCannon = 30748475; + public const int EscapeOfTheUnchained = 53417695; + // _CardId.DimensionalBarrier = 83326048; + public const int BigWelcomeLabrynth = 92714517; + + public const int ChaosAngel = 22850702; + public const int SuperStarslayerTYPHON = 93039339; + public const int UnchainedAbomination = 29479265; + public const int UnchainedSoulOfAnguish = 93084621; + public const int UnchainedSoulLordOfYama = 24269961; + public const int UnchainedSoulOfRage = 67680512; + public const int SPLittleKnight = 29301450; + public const int MuckrakerFromTheUnderworld = 71607202; + public const int RelinquishedAnima = 94259633; + + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int AccesscodeTalker = 86066372; + public const int GhostMournerMoonlitChill = 52038441; + } + + public LabrynthExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // startup effect/triggered chain + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, CardId.PotOfExtravagance, PotOfExtravaganceActivate); + AddExecutor(ExecutorType.Repos, CardId.LovelyLabrynthOfTheSilverCastle, ReposForLabrynth); + AddExecutor(ExecutorType.Activate, CardId.ChaosAngel, ChaosAngelActivate); + AddExecutor(ExecutorType.Activate, CardId.LovelyLabrynthOfTheSilverCastle, LovelyLabrynthOfTheSilverCastleActivate); + AddExecutor(ExecutorType.Activate, CardId.RelinquishedAnima, RelinquishedAnimaActivate); + AddExecutor(ExecutorType.Activate, CardId.AriannaTheLabrynthServant, AriannaTheLabrynthServantActivate); + AddExecutor(ExecutorType.Activate, CardId.ArianeTheLabrynthServant, ArianeTheLabrynthServantActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthChandraglier, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthStovieTorbie, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthCooclock, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.UnchainedSoulLordOfYama, UnchainedSoulLordOfYamaActivate); + AddExecutor(ExecutorType.Activate, CardId.WelcomeLabrynth, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.SuperStarslayerTYPHON, SuperStarslayerTYPHONActivate); + AddExecutor(ExecutorType.Activate, CardId.UnchainedAbomination, UnchainedAbominationActivate); + + // repos + AddExecutor(ExecutorType.Repos, CardId.ArianeTheLabrynthServant, ReposForLabrynth); + AddExecutor(ExecutorType.Repos, CardId.AriannaTheLabrynthServant, ReposForLabrynth); + + // negate/chain + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.LadyLabrynthOfTheSilverCastle, LadyLabrynthOfTheSilverCastleFieldActivate); + AddExecutor(ExecutorType.Activate, CardId.AriasTheLabrynthButler, RecycleActivate); + AddExecutor(ExecutorType.Activate, CardId.SPLittleKnight, SPLittleKnightActivate); + AddExecutor(ExecutorType.Activate, _CardId.DimensionalBarrier, DimensionalBarrierActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + + AddExecutor(ExecutorType.Activate, CardId.MuckrakerFromTheUnderworld, MuckrakerFromTheUnderworldActivate); + AddExecutor(ExecutorType.Activate, CardId.UnchainedSoulOfRage, UnchainedSoulOfRageActivate); + AddExecutor(ExecutorType.Activate, CardId.TransactionRollback, TransactionRollbackActivate); + AddExecutor(ExecutorType.Activate, CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonActivate); + AddExecutor(ExecutorType.Activate, CardId.EscapeOfTheUnchained, EscapeOfTheUnchainedActivate); + + // sp summon + AddExecutor(ExecutorType.Activate, CardId.LadyLabrynthOfTheSilverCastle, LadyLabrynthOfTheSilverCastleHandActivate); + AddExecutor(ExecutorType.Activate, CardId.BigWelcomeLabrynth, BigWelcomeLabrynthBecomeTargetActivate); + AddExecutor(ExecutorType.Activate, CardId.WelcomeLabrynth, WelcomeLabrynthActivate); + AddExecutor(ExecutorType.Activate, CardId.BigWelcomeLabrynth, BigWelcomeLabrynthActivate); + + // clock + AddExecutor(ExecutorType.Activate, CardId.AriasTheLabrynthButler, AriasTheLabrynthButlerActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthCooclock, LabrynthCooclockActivate); + AddExecutor(ExecutorType.Activate, CardId.BigWelcomeLabrynth, BigWelcomeLabrynthGraveActivate); + AddExecutor(ExecutorType.Activate, CardId.UnchainedSoulOfAnguish, UnchainedSoulOfAnguishActivate); + + // summon step + AddExecutor(ExecutorType.SpellSet, SpellSetForCooClockCheck); + AddExecutor(ExecutorType.Summon, CardId.ArianeTheLabrynthServant, ArianeTheLabrynthServantForRollbackSummon); + AddExecutor(ExecutorType.Summon, CardId.AriannaTheLabrynthServant, AriannaTheLabrynthServantSummon); + AddExecutor(ExecutorType.Summon, CardId.ArianeTheLabrynthServant, ArianeTheLabrynthServantSummon); + AddExecutor(ExecutorType.Summon, LabrynthForCooClockSummon); + AddExecutor(ExecutorType.Summon, ForLinkSummon); + AddExecutor(ExecutorType.Summon, ForSynchroSummon); + AddExecutor(ExecutorType.Summon, CardId.LabrynthCooclock, ForAnimaSummon); + + // furniture set + AddExecutor(ExecutorType.Activate, CardId.LabrynthChandraglier, FurnitureSetWelcomeActivate); + AddExecutor(ExecutorType.Activate, CardId.LabrynthStovieTorbie, FurnitureSetWelcomeActivate); + + // sp summon from extra + AddExecutor(ExecutorType.SpSummon, CardId.ChaosAngel, ChaosAngelSpSummonWith2Monster); + AddExecutor(ExecutorType.SpSummon, CardId.RelinquishedAnima, RelinquishedAnimaSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.UnchainedSoulLordOfYama, UnchainedSoulLordOfYamaSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.UnchainedSoulOfAnguish, UnchainedSoulOfAnguishSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.UnchainedSoulOfRage, UnchainedSoulOfRageSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.UnchainedAbomination, UnchainedAbominationSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SPLittleKnight, SPLittleKnightSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ChaosAngel, ChaosAngelSpSummonWith3Monster); + AddExecutor(ExecutorType.SpSummon, CardId.MuckrakerFromTheUnderworld, MuckrakerFromTheUnderworldSpSummon); + + // hand eff + AddExecutor(ExecutorType.Activate, CardId.UnchainedSoulOfSharvara, UnchainedSoulOfSharvaraActivate); + + AddExecutor(ExecutorType.SpSummon, CardId.SuperStarslayerTYPHON, SuperStarslayerTYPHONSpSummon); + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.Summon, SummonForTYPHONCheck); + AddExecutor(ExecutorType.SummonOrSet, ForBigWelcomeSummon); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeUnchained = 0x130; + const int SetcodeLabrynth = 0x17e; + const int SetcodeHorus = 0x19d; + const int hintTimingMainEnd = 0x4; + const int hintBattleStart = 0x8; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.AriannaTheLabrynthServant, CardId.LabrynthChandraglier, _CardId.AshBlossom, _CardId.MaxxC, + CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, _CardId.InfiniteImpermanence, CardId.BigWelcomeLabrynth }}, + {2, new List { CardId.LadyLabrynthOfTheSilverCastle, CardId.AriasTheLabrynthButler, CardId.PotOfExtravagance, CardId.WelcomeLabrynth, + CardId.TransactionRollback }}, + {1, new List { CardId.LovelyLabrynthOfTheSilverCastle, CardId.UnchainedSoulOfSharvara, CardId.ArianeTheLabrynthServant, + CardId.DestructiveDarumaKarmaCannon, CardId.EscapeOfTheUnchained, _CardId.DimensionalBarrier }} + }; + List notToNegateIdList = new List{ + 58699500, 20343502 + }; + List notToBeTrapTargetList = new List{ + 72144675, 86188410, 41589166, 11443677, 72566043, 1688285, 59071624, 6511113, 48183890, 952523, 22423493, 73639099 + }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + List notToDestroySpellTrap = new List { 50005218, 6767771 }; + + bool enemyActivateMaxxC = false; + List infiniteImpermanenceList = new List(); + bool summoned = false; + List activatedCardIdList = new List(); + List currentNegateMonsterList = new List(); + List currentDestroyCardList = new List(); + List setTrapThisTurn = new List(); + List summonThisTurn = new List(); + List enemySetThisTurn = new List(); + List escapeTargetList = new List(); + List summonInChainList = new List(); + bool cooclockAffected = false; + bool cooclockActivating = false; + bool furnitureActivating = false; + bool dimensionBarrierAnnouncing = false; + int banSpSummonExceptFiendCount = 0; + int dimensionShifterCount = 0; + int enemySpSummonFromExLastTurn = 0; + int enemySpSummonFromExThisTurn = 0; + bool enemyActivateInfiniteImpermanenceFromHand = false; + int rollbackCopyCardId = 0; + List dimensionalBarrierAnnouced = new List(); + List chainSummoningIdList = new List(3); + ClientCard bigwelcomeEscaseTarget = null; + + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List floodagateList = Enemy.GetMonsters().Where(c => c?.Data != null && + c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count() > 0) return floodagateList[0]; + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count() > 0) return dangerList[0]; + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count() > 0) return invincibleList[0]; + + List equippedList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.EquipCards.Count() > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(c))).OrderByDescending(card => card.Attack).ToList(); + if (equippedList.Count() > 0) return equippedList[0]; + + List enemyMonsters = Enemy.GetMonsters().OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count() > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && CheckCanBeTargeted(target, canBeTarget, selfType) && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(target)) + ) return target; + } + } + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + List betterList = Enemy.MonsterZone.GetMonsters() + .Where(card => card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).ToList(); + if (betterList.Count() > 0) return betterList[0]; + } + return null; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count() > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count() > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count() > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count() > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count() > 0) + { + foreach(ClientCard target in enemyMonsters) + { + if ( (target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType) + ) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !notToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count() > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget, ignoreCurrentDestroy, selfType); + if (card != null) + return card; + + card = Enemy.MonsterZone.Where(c => c?.Data != null && c.HasType(CardType.Monster) && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) && (!ignoreCurrentDestroy || currentDestroyCardList.Contains(c))) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + if (card != null) + return card; + + List monsters = Enemy.GetMonsters().Where(c => !ignoreCurrentDestroy || currentDestroyCardList.Contains(c)).ToList(); + + // after GetHighestAttackMonster, the left monsters must be face-down. + if (monsters.Count() > 0 && !onlyFaceup) + return ShuffleList(monsters)[0]; + + return null; + } + + /// + /// check enemy's dangerous card in grave + /// + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom) || card.HasSetcode(SetcodeHorus))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, 9411399, 28954097, 30680659 + }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public int GetEmptyMainMonsterZoneCount() + { + int remainCount = 0; + for (int idx = 0; idx < 5; ++idx) + { + if (Bot.MonsterZone[idx] == null) remainCount++; + } + return remainCount; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemySetThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemySetThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateMonsterList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateMonsterList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public int GetMaterialAttack(List materials) + { + if (Util.IsTurn1OrMain2()) return 0; + int result = 0; + foreach (ClientCard material in materials) + { + if (material.IsAttack() || !summonThisTurn.Contains(material)) result += material.Attack; + } + return result; + } + + public int GetBotCurrentTotalAttack(List exceptList = null) + { + if (Util.IsTurn1OrMain2()) return 0; + int result = 0; + foreach (ClientCard monster in Bot.GetMonsters()) + { + if (exceptList != null && exceptList.Contains(monster)) continue; + if (monster.IsAttack() || !summonThisTurn.Contains(monster)) result += monster.Attack; + } + return result; + } + + public List GetCanBeUsedForLinkMaterial(bool useAdvancedMonster = false, Func exceptRule = null) + { + List materialList = Bot.GetMonsters().Where(card => { + if (card.IsFacedown() || (exceptRule != null && exceptRule(card))) return false; + if (card.IsCode(CardId.MuckrakerFromTheUnderworld) && summonThisTurn.Contains(card)) return false; + if (card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle) && !card.IsDisabled() && Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth)) return false; + if ((card.IsCode(CardId.ChaosAngel) || card.IsCode(CardId.LadyLabrynthOfTheSilverCastle)) + && !useAdvancedMonster && (card.IsAttack() || !summonThisTurn.Contains(card))) return false; + + return true; + }).ToList(); + materialList.Sort(CompareUsableAttack); + return materialList; + } + + public bool CheckCanDirectAttack() + { + return Enemy.GetMonsterCount() == 0 && !activatedCardIdList.Contains(CardId.SPLittleKnight) && Duel.Turn > 1 && Duel.Player == 0 && Duel.Phase < DuelPhase.Main2; + } + + /// + /// Check negated turn count of id + /// + public int CheckCalledbytheGrave(int id) + { + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 + && (card.IsShouldNotBeSpellTrapTarget() || (!card.IsDisabled() && notToBeTrapTargetList.Contains(card.Id)))) return false; + } + return true; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + public int CheckRemainInDeck(params int[] ids) + { + int sumResult = 0; + foreach (int id in ids) + { + sumResult += CheckRemainInDeck(id); + } + + return sumResult; + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + // how to get here? + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0) + { + if ((Card.IsSpell() || Card.IsTrap() || (((int)type & (int)CardType.Spell) == 0) || (((int)type & (int)CardType.Trap) == 0)) && CheckSpellWillBeNegate()) + return true; + if (CheckCalledbytheGrave(Card.Id) > 0) return true; + if ((Card.IsMonster() || (((int)type & (int)CardType.Monster) == 0)) && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) == 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) return true; + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true, true)) return true; + } + if (disablecheck) return Card.IsDisabled(); + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { CardId.BanisheroftheRadiance, CardId.BanisheroftheLight, CardId.MacroCosmos, CardId.DimensionalFissure, + CardId.KashtiraAriseHeart, 58481572 }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true, false, true) || cf.HasInSpellZone(cardid, true, true)) + { + return true; + } + } + } + return false; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && (Duel.Player == 0 || Bot.GetMonsterCount() > 0)) return true; + return false; + } + + public bool CheckShouldNoMoreSpSummon(bool isLabrynth = true) + { + if (CheckAtAdvantage() && enemyActivateMaxxC && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2)) + { + if (!isLabrynth) return true; + if (cooclockAffected) + { + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth))) return true; + if (Duel.Player == 0 && !summoned) return true; + if (setTrapThisTurn.Count() == 0) return true; + return false; + } + return true; + } + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + + return true; + } + + public bool CheckChainContainEnemyMaxxC() + { + foreach (ClientCard card in Duel.CurrentChain) + { + if (card.Controller == 1 && card.IsCode(_CardId.MaxxC)) return true; + } + + return false; + } + + public bool CheckBigWelcomeCanSpSummon(int cardId) + { + return Bot.HasInHandOrInGraveyard(cardId) || CheckRemainInDeck(cardId) > 0; + } + + public int CompareUsableAttack(ClientCard cardA, ClientCard cardB) + { + if (cardA == null && cardB == null) + return 0; + if (cardA == null) + return -1; + if (cardB == null) + return 1; + int powerA = (cardA.IsDefense() && summonThisTurn.Contains(cardA)) ? 0 : cardA.Attack; + int powerB = (cardB.IsDefense() && summonThisTurn.Contains(cardB)) ? 0 : cardB.Attack; + if (powerA < powerB) + return -1; + if (powerA == powerB) + return CardContainer.CompareCardLevel(cardA, cardB); + return 1; + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + if (currentSolvingChain.Controller == 1 && currentSolvingChain.IsCode(_CardId.EvenlyMatched)) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List notImportantMonster = botMonsters.Where(card => !banishList.Contains(card) + && ((card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && Bot.HasInExtra(card.Id)) + || CheckRemainInDeck(card.Id) > 0)).ToList(); + notImportantMonster.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(notImportantMonster); + + // spells + List faceUpSpells = Bot.GetSpells().Where(c => c.IsFaceup()).ToList(); + banishList.AddRange(ShuffleList(faceUpSpells)); + List faceDownSpells = Bot.GetSpells().Where(c => c.IsFacedown()).ToList(); + banishList.AddRange(ShuffleList(faceDownSpells)); + + List importantMonster = botMonsters.Where(card => !banishList.Contains(card) && !card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle) + && ((card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && !Bot.HasInExtra(card.Id)) + || CheckRemainInDeck(card.Id) == 0)).ToList(); + importantMonster.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(importantMonster); + + // lovely + List lovelyList = botMonsters.Where(card => !banishList.Contains(card) && card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)).ToList(); + lovelyList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(lovelyList); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + + if (currentSolvingChain.IsCode(CardId.LadyLabrynthOfTheSilverCastle) && min == 1 && max == 1 && hint == HintMsg.Set) + { + SortedDictionary> trapCheckDict = new SortedDictionary>{ + {_CardId.DimensionalBarrier, DimensionalBarrierActivate}, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonSetCheck}, + {_CardId.InfiniteImpermanence, InfiniteImpermanenceSetCheck} + }; + foreach (KeyValuePair> pair in trapCheckDict) + { + ClientCard target = cards.FirstOrDefault(card => card.IsCode(pair.Key)); + if (target != null && pair.Value()) + { + SelectSTPlace(null, true); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + + ClientCard rollback = cards.FirstOrDefault(card => card.IsCode(CardId.TransactionRollback)); + if (rollback != null) + { + bool haveUnchainSoul = false; + if (!activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara)) + { + haveUnchainSoul |= Bot.HasInHand(CardId.UnchainedSoulOfSharvara); + haveUnchainSoul |= Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 + && Bot.HasInExtra(CardId.UnchainedSoulLordOfYama) && !activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama) + && (CheckRemainInDeck(CardId.UnchainedSoulOfSharvara) > 0 || Bot.HasInGraveyard(CardId.UnchainedSoulOfSharvara)) + && Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasRace(CardRace.Fiend) && card.Level <= 4).Count() >= 2; + } + bool haveAriane = false; + if (!activatedCardIdList.Contains(CardId.ArianeTheLabrynthServant) && Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2) + { + haveAriane |= Bot.HasInMonstersZone(CardId.ArianeTheLabrynthServant); + haveAriane |= Bot.HasInHand(CardId.ArianeTheLabrynthServant) && !summoned; + haveAriane |= Bot.GetSpells().Any(card => card.IsFacedown() && + ( + (card.IsCode(CardId.WelcomeLabrynth) && !activatedCardIdList.Contains(CardId.WelcomeLabrynth) && (cooclockAffected || !setTrapThisTurn.Contains(card))) + || + (card.IsCode(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && (cooclockAffected || !setTrapThisTurn.Contains(card))) + ) + ); + } + + if (haveUnchainSoul || haveAriane) + { + return Util.CheckSelectCount(new List { rollback }, cards, min, max); + } + } + + // welcome check + SortedDictionary welcomeCheck = new SortedDictionary { + {CardId.BigWelcomeLabrynth, cards.FirstOrDefault(card => card.IsCode(CardId.BigWelcomeLabrynth))}, + {CardId.WelcomeLabrynth, cards.FirstOrDefault(card => card.IsCode(CardId.WelcomeLabrynth))} + }; + List welcomeCheckIdList = new List { CardId.BigWelcomeLabrynth, CardId.WelcomeLabrynth }; + foreach (KeyValuePair checkPair in welcomeCheck) + { + if (checkPair.Value != null && !Bot.HasInHand(checkPair.Key) && !Bot.HasInGraveyard(checkPair.Key) + && !Bot.GetSpells().Any(card => card.IsCode(checkPair.Key) && card.IsFacedown())) + { + SelectSTPlace(null, true); + return Util.CheckSelectCount(new List { checkPair.Value }, cards, min, max); + } + } + if (welcomeCheck[CardId.BigWelcomeLabrynth] != null && + !Bot.HasInHand(CardId.BigWelcomeLabrynth) && !Bot.GetSpells().Any(card => card.IsCode(CardId.BigWelcomeLabrynth) && card.IsFacedown())) + { + SelectSTPlace(null, true); + return Util.CheckSelectCount(new List { welcomeCheck[CardId.BigWelcomeLabrynth] }, cards, min, max); + } + + // normal set + List checkIdList = new List{_CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon, + CardId.BigWelcomeLabrynth, CardId.TransactionRollback, CardId.WelcomeLabrynth}; + foreach (int checkId in checkIdList) + { + ClientCard checkCard = cards.FirstOrDefault(card => card.IsCode(checkId)); + if (checkCard != null) + { + SelectSTPlace(null, true); + return Util.CheckSelectCount(new List { checkCard }, cards, min, max); + } + } + } + + if (currentSolvingChain.IsCode(CardId.WelcomeLabrynth)) + { + banSpSummonExceptFiendCount = 2; + } + + if (currentSolvingChain.IsCode(CardId.WelcomeLabrynth) || (currentSolvingChain.IsCode(CardId.TransactionRollback) && rollbackCopyCardId == CardId.WelcomeLabrynth)) + { + Logger.DebugWriteLine("rewrite welcome's select."); + List selection = new List(); + + ClientCard ariane = GetWelcomeOrBigWelcomeTarget(cards, CardId.ArianeTheLabrynthServant); + if (ariane != null && !summonInChainList.Any(card => card.IsCode(CardId.ArianeTheLabrynthServant))) + { + if ((Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 || Duel.Player == 1 && Duel.Phase >= DuelPhase.Main2) + && Bot.HasInHandOrInSpellZone(CardId.TransactionRollback)) + { + selection.Add(ariane); + } + } + + ClientCard arianna = GetWelcomeOrBigWelcomeTarget(cards, CardId.AriannaTheLabrynthServant); + if (arianna != null && !summonInChainList.Any(card => card.IsCode(CardId.AriannaTheLabrynthServant))) + { + bool canActivateCheck = !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !CheckWhetherNegated(true, true, CardType.Monster); + if (canActivateCheck) + { + bool checkFlag = !(!activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && + (Bot.HasInGraveyard(CardId.BigWelcomeLabrynth) || Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth)))); + checkFlag |= !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && (CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle) || Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true)) + && Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth) + && (!setTrapThisTurn.Contains(card) || cooclockAffected)); + checkFlag |= !(Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) + || CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle)); + if (checkFlag) + { + selection.Add(arianna); + } + } + } + + ClientCard arias = GetWelcomeOrBigWelcomeTarget(cards, CardId.AriasTheLabrynthButler); + if (arias != null && !summonInChainList.Any(card => card.IsCode(CardId.AriasTheLabrynthButler)) && !Bot.HasInHandOrHasInMonstersZone(CardId.AriasTheLabrynthButler)) + { + bool canActivateCheck = !activatedCardIdList.Contains(CardId.AriasTheLabrynthButler) && !CheckWhetherNegated(true, true, CardType.Monster); + if (canActivateCheck && Bot.HasInHand(CardId.LovelyLabrynthOfTheSilverCastle)) + { + selection.Add(arias); + } + } + + ClientCard lovely = GetWelcomeOrBigWelcomeTarget(cards, CardId.LovelyLabrynthOfTheSilverCastle); + if (lovely != null && !summonInChainList.Any(card => card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle))) + { + if (Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)) + { + selection.Add(lovely); + } + } + + ClientCard lady = GetWelcomeOrBigWelcomeTarget(cards, CardId.LadyLabrynthOfTheSilverCastle); + if (lady != null) + { + if (Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasRace(CardRace.Fiend) && card.Level >= 8 && !card.HasType(CardType.Xyz | CardType.Link))) + { + selection.Add(lady); + } + } + + bool attackFlag = CheckCanDirectAttack(); + bool defenseFlag = Bot.UnderAttack && Bot.GetMonsterCount() == 0; + if (attackFlag || defenseFlag) + { + ClientCard bestPowerMonster = null; + int bestPower = -1; + foreach (ClientCard target in cards) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(target.Id); + if (cardData != null) + { + int power = attackFlag ? cardData.Attack : Math.Max(cardData.Attack, cardData.Defense); + if (bestPowerMonster == null || power > bestPower) + { + bestPowerMonster = target; + bestPower = power; + } + } + } + if (defenseFlag || GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack() + bestPower >= Enemy.LifePoints) + { + ClientCard realTarget = GetWelcomeOrBigWelcomeTarget(cards, bestPowerMonster.Id); + if (realTarget != null) selection.Add(realTarget); + } + } + + List checkIdList = new List{CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock, CardId.AriasTheLabrynthButler}; + foreach (int checkId in checkIdList) + { + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId)) + { + ClientCard target = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (target != null) selection.Add(target); + } + } + + List fullCheckIdList = new List{ + CardId.LadyLabrynthOfTheSilverCastle, CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock, + CardId.AriasTheLabrynthButler, CardId.ArianeTheLabrynthServant, CardId.AriannaTheLabrynthServant + }; + foreach (int checkId in fullCheckIdList) + { + ClientCard target = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (target != null && !selection.Contains(target)) selection.Add(target); + } + + if (selection.Count() > 0) return Util.CheckSelectCount(selection, cards, min, max); + } + + bool searchFlag = currentSolvingChain.IsCode(CardId.AriannaTheLabrynthServant) && hint == HintMsg.AddToHand; + bool bigwelcomeSoving = currentSolvingChain.IsCode(CardId.BigWelcomeLabrynth) || (currentSolvingChain.IsCode(CardId.TransactionRollback) && rollbackCopyCardId == CardId.BigWelcomeLabrynth); + searchFlag |= bigwelcomeSoving && hint == HintMsg.SpSummon && Bot.GetMonsterCount() == 0; + if (searchFlag) + { + Logger.DebugWriteLine("rewrite search."); + List selection = new List(); + + List furnitureCheckIdList = new List { CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.LabrynthChandraglier }; + ClientCard bigWelcome = GetWelcomeOrBigWelcomeTarget(cards, CardId.BigWelcomeLabrynth); + ClientCard welcome = GetWelcomeOrBigWelcomeTarget(cards, CardId.WelcomeLabrynth); + ClientCard arianna = GetWelcomeOrBigWelcomeTarget(cards, CardId.AriannaTheLabrynthServant); + + // search big welcome to activate this turn + if (Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2) + { + if (!summoned && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !CheckWhetherNegated(true, true, CardType.Monster) + && CheckCalledbytheGrave(CardId.AriannaTheLabrynthServant) == 0 && arianna != null && !Bot.HasInHand(CardId.AriannaTheLabrynthServant)) + { + return Util.CheckSelectCount(new List { arianna }, cards, min, max); + } + if (!CheckShouldNoMoreSpSummon()) + { + if (bigWelcome != null && !activatedCardIdList.Contains(CardId.AriasTheLabrynthButler) + && Bot.HasInHandOrHasInMonstersZone(CardId.AriasTheLabrynthButler)) + { + return Util.CheckSelectCount(new List { bigWelcome }, cards, min, max); + } + + bool canActivateSetTrap = (cooclockAffected || Bot.HasInHand(CardId.LabrynthCooclock)) + && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)); + if (canActivateSetTrap && !Bot.HasInHandOrInSpellZone(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, CardId.BigWelcomeLabrynth) }, cards, min, max); + } + } + } + + // search cooclock/bulter to activate trap + ClientCard arias = null; + ClientCard cooclock = null; + if (!activatedCardIdList.Contains(CardId.AriasTheLabrynthButler) && CheckRemainInDeck(CardId.AriasTheLabrynthButler) > 0 + && !Bot.HasInHand(CardId.AriasTheLabrynthButler)) + { + arias = GetWelcomeOrBigWelcomeTarget(cards, CardId.AriasTheLabrynthButler); + } + if (!activatedCardIdList.Contains(CardId.LabrynthCooclock) && CheckRemainInDeck(CardId.LabrynthCooclock) > 0 + && !Bot.HasInHand(CardId.LabrynthCooclock)) + { + cooclock = GetWelcomeOrBigWelcomeTarget(cards, CardId.LabrynthCooclock); + } + if (arias != null || cooclock != null) + { + SortedDictionary> trapCheckDict = new SortedDictionary> { + {CardId.BigWelcomeLabrynth, BigWelcomeLabrynthSetCheck}, + {_CardId.DimensionalBarrier, DimensionalBarrierActivate}, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonSetCheck}, + {CardId.WelcomeLabrynth, WelcomeLabrynthSetCheck} + }; + foreach (KeyValuePair> checkPair in trapCheckDict) + { + if (Bot.GetSpells().Any(card => card.IsFacedown() && !setTrapThisTurn.Contains(card) && card.IsCode(checkPair.Key))) continue; + if (!activatedCardIdList.Contains(checkPair.Key)) + { + if (Bot.GetSpells().Any(card => card.IsFacedown() && setTrapThisTurn.Contains(card) && card.IsCode(checkPair.Key)) + && cooclock != null) + { + return Util.CheckSelectCount(new List { cooclock }, cards, min, max); + } + else if (Bot.HasInHand(checkPair.Key)) + { + if (checkPair.Value()) + { + if (arias != null) + { + return Util.CheckSelectCount(new List { arias }, cards, min, max); + } + if (Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 && cooclock != null) + { + return Util.CheckSelectCount(new List { cooclock }, cards, min, max); + } + } + } + } + } + } + + bool lackUnimportantCost = !Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)); + if (lackUnimportantCost) + { + List handCost = Bot.Hand.Where(card => card != Card).ToList(); + lackUnimportantCost &= handCost.Count() <= 2 && !handCost.Any(card => !card.IsCode(_CardId.MaxxC, _CardId.AshBlossom, CardId.LabrynthCooclock)); + } + if (!lackUnimportantCost && cooclock != null && bigWelcome != null) + { + foreach (int furnitureId in furnitureCheckIdList) + { + if (furnitureId == CardId.LabrynthCooclock) continue; + if (CheckCalledbytheGrave(furnitureId) == 0 && !activatedCardIdList.Contains(furnitureId) && Bot.HasInHand(furnitureId)) + { + return Util.CheckSelectCount(new List { cooclock }, cards, min, max); + } + } + } + + if (Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2) + { + // search not exist furniture + if (!lackUnimportantCost) + { + foreach (int checkId in furnitureCheckIdList) + { + ClientCard furniture = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && furniture != null) + { + if (checkId == CardId.LabrynthCooclock) + { + if (Enemy.GetMonsterCount() > 0 && !Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.LabrynthChandraglier)) continue; + } + return Util.CheckSelectCount(new List { furniture }, cards, min, max); + } + } + } + + // search big welcome + if (bigWelcome != null) + { + bool needSpSummonLovely = !Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) + && !Bot.HasInHandOrInSpellZone(CardId.BigWelcomeLabrynth) && cards.Any(c => c.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)); + needSpSummonLovely |= Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) && !Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth); + if (needSpSummonLovely) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, CardId.BigWelcomeLabrynth) }, cards, min, max); + } + } + // search welcome + if (welcome != null && Bot.HasInHandOrInSpellZone(CardId.BigWelcomeLabrynth) && !Bot.HasInHandOrInSpellZone(CardId.WelcomeLabrynth)) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, CardId.WelcomeLabrynth) }, cards, min, max); + } + } + + // search big welcome/arias + if (Duel.Player == 1 && (Duel.Phase <= DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) + && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.AriasTheLabrynthButler) + && !Bot.HasInSpellZone(CardId.BigWelcomeLabrynth)) + { + if (Bot.HasInHand(CardId.BigWelcomeLabrynth) && !Bot.HasInHandOrHasInMonstersZone(CardId.AriasTheLabrynthButler) && arias != null) + { + return Util.CheckSelectCount(new List { arias }, cards, min, max); + } + if (Bot.HasInHand(CardId.AriasTheLabrynthButler) && !Bot.HasInHandOrHasInMonstersZone(CardId.BigWelcomeLabrynth) && bigWelcome != null) + { + return Util.CheckSelectCount(new List { bigWelcome }, cards, min, max); + } + } + + // search lady + ClientCard lady = GetWelcomeOrBigWelcomeTarget(cards, CardId.LadyLabrynthOfTheSilverCastle); + bool haveTrap = Duel.Player == 0 && Bot.Hand.Any(card => card.Type == (int)CardType.Trap) && Duel.Phase <= DuelPhase.Main2; + haveTrap |= Bot.GetSpells().Any(card => card.IsFacedown() && card.Type == (int)CardType.Trap); + if (!Bot.HasInHandOrHasInMonstersZone(CardId.LadyLabrynthOfTheSilverCastle) && !activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle) + && haveTrap && lady != null) + { + return Util.CheckSelectCount(new List { lady }, cards, min, max); + } + + if (!activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !CheckWhetherNegated(true, true, CardType.Monster) + && CheckCalledbytheGrave(CardId.AriannaTheLabrynthServant) == 0 && arianna != null && !Bot.HasInHand(CardId.AriannaTheLabrynthServant)) + { + return Util.CheckSelectCount(new List { arianna }, cards, min, max); + } + + // search not exist furniture + if (!lackUnimportantCost) + { + foreach (int checkId in furnitureCheckIdList) + { + ClientCard furniture = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && furniture != null) + { + if (checkId == CardId.LabrynthCooclock) + { + if (Enemy.GetMonsterCount() > 0 && !Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.LabrynthChandraglier)) continue; + } + return Util.CheckSelectCount(new List { furniture }, cards, min, max); + } + } + } + + // search not exist card + List uniqueCheckIdList = new List{ + CardId.BigWelcomeLabrynth, CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.LabrynthChandraglier, + CardId.LadyLabrynthOfTheSilverCastle, CardId.AriasTheLabrynthButler, CardId.ArianeTheLabrynthServant, CardId.WelcomeLabrynth}; + foreach (int checkId in uniqueCheckIdList) + { + ClientCard targetCard = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (!Bot.HasInMonstersZone(checkId) && !Bot.HasInHandOrInSpellZone(checkId) && targetCard != null) + { + if (checkId == CardId.BigWelcomeLabrynth || checkId == CardId.WelcomeLabrynth) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, checkId) }, cards, min, max); + } + else + { + return Util.CheckSelectCount(new List { targetCard }, cards, min, max); + } + } + } + + foreach (int checkId in uniqueCheckIdList) + { + ClientCard targetCard = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (CheckRemainInDeck(checkId) > 0) + { + if (checkId == CardId.BigWelcomeLabrynth || checkId == CardId.WelcomeLabrynth) + { + return Util.CheckSelectCount(new List { AriannaSearchWelcomeTrap(cards, checkId) }, cards, min, max); + } + else + { + return Util.CheckSelectCount(new List { targetCard }, cards, min, max); + } + } + } + } + + // solved when have more than 1 monster + if (bigwelcomeSoving && hint == HintMsg.SpSummon) + { + bool activateTimingFlag = Duel.Phase > DuelPhase.Main2 || (Card.IsCode(CardId.AriasTheLabrynthButler) && (CurrentTiming & hintTimingMainEnd) > 0); + + bool needDestroyFlag = GetProblematicEnemyCardList(false).Count() > 0; + needDestroyFlag |= activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && activateTimingFlag; + needDestroyFlag |= Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && Duel.LastChainPlayer != 0; + needDestroyFlag |= Duel.Turn == 1 && Duel.Player == 0 && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + needDestroyFlag |= Duel.Turn == 1 && Enemy.GetMonsterCount() == 0 && Enemy.GetSpellCount() == 0 && Enemy.Hand.Count > 0 + && (CurrentTiming & hintTimingMainEnd) > 0; + + if (needDestroyFlag && cards.Any(c => c.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) + && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.LovelyLabrynthOfTheSilverCastle) }, cards, min, max); + } + if (cards.Any(c => c.IsCode(CardId.AriannaTheLabrynthServant)) + && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !Bot.HasInMonstersZone(CardId.AriannaTheLabrynthServant)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.AriannaTheLabrynthServant) }, cards, min, max); + } + if (cards.Any(c => c.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) + && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.LovelyLabrynthOfTheSilverCastle) }, cards, min, max); + } + if (cards.Any(c => c.IsCode(CardId.AriannaTheLabrynthServant)) + && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.AriannaTheLabrynthServant) }, cards, min, max); + } + if (cards.Any(c => c.IsCode(CardId.LadyLabrynthOfTheSilverCastle)) + && Duel.Turn > 1 && Duel.Phase < DuelPhase.Main2 && Duel.Player == 0 && Enemy.GetMonsterCount() == 0) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, CardId.LadyLabrynthOfTheSilverCastle) }, cards, min, max); + } + List furnitureCheckIdList = new List { CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.LabrynthChandraglier, CardId.AriasTheLabrynthButler }; + foreach (int furniture in furnitureCheckIdList) + { + if (cards.Any(c => c.IsCode(furniture)) && !Bot.HasInHandOrInMonstersZoneOrInGraveyard(furniture)) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, furniture) }, cards, min, max); + } + } + List checkIdList = new List{CardId.ArianeTheLabrynthServant, CardId.LadyLabrynthOfTheSilverCastle, CardId.AriannaTheLabrynthServant, + CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.LabrynthChandraglier, CardId.AriasTheLabrynthButler}; + foreach (int checkId in checkIdList) + { + if (cards.Any(c => c.IsCode(checkId))) + { + return Util.CheckSelectCount(new List { GetWelcomeOrBigWelcomeTarget(cards, checkId) }, cards, min, max); + } + } + // should not get here + Logger.DebugWriteLine("[warning] call BigWelcomeSpSummon with no select."); + } + + if (bigwelcomeSoving && hint == HintMsg.ReturnToHand) + { + if (bigwelcomeEscaseTarget != null && cards.Contains(bigwelcomeEscaseTarget)) + { + return Util.CheckSelectCount(new List { bigwelcomeEscaseTarget }, cards, min, max); + } + + ClientCard cooclock = cards.FirstOrDefault(c => c.IsCode(CardId.LabrynthCooclock)); + bool canSearchWelcome = CheckRemainInDeck(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth) > 0 + && (Bot.HasInHandOrHasInMonstersZone(new List { CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie }) + || summonInChainList.Any(c => c.IsCode(CardId.AriannaTheLabrynthServant)) + || (Duel.Player == 0 && !summoned && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && Bot.HasInHand(CardId.AriannaTheLabrynthServant))); + if (cooclock != null) + { + if (setTrapThisTurn.Count() > 0 + || (Duel.Turn == 1 && ( + (!activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle) && Bot.HasInHandOrHasInMonstersZone(CardId.LadyLabrynthOfTheSilverCastle)) + || canSearchWelcome + ) + ) + || Duel.Turn == 0 && canSearchWelcome + ) + return Util.CheckSelectCount(new List { cooclock }, cards, min, max); + } + + ClientCard defenseLady = cards.FirstOrDefault(c => c.IsDefense() && c.IsCode(CardId.LadyLabrynthOfTheSilverCastle)); + ClientCard attackLady = cards.FirstOrDefault(c => c.IsAttack() && c.IsCode(CardId.LadyLabrynthOfTheSilverCastle)); + if (Bot.GetMonsters().Any(card => (Duel.Player == 1 || card.IsDefense()) && card.IsCode(CardId.LadyLabrynthOfTheSilverCastle)) + && (!activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle) || activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle + 1))) + { + if (defenseLady != null) return Util.CheckSelectCount(new List { defenseLady }, cards, min, max); + if (attackLady != null) return Util.CheckSelectCount(new List { attackLady }, cards, min, max); + } + if (summonInChainList.Any(c => c.IsCode(CardId.LovelyLabrynthOfTheSilverCastle))) + { + List returnCheckIdList = new List{ + _CardId.MaxxC, CardId.AriannaTheLabrynthServant, _CardId.AshBlossom, CardId.LabrynthCooclock, CardId.LadyLabrynthOfTheSilverCastle, + CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, CardId.AriasTheLabrynthButler, CardId.UnchainedSoulOfSharvara, CardId.ArianeTheLabrynthServant + }; + foreach (int checkId in returnCheckIdList) + { + ClientCard returnTarget = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (returnTarget != null) return Util.CheckSelectCount(new List { returnTarget }, cards, min, max); + } + return Util.CheckSelectCount(cards.OrderBy(card => card.Attack).ToList(), cards, min, max); + } + if (cards.Count() == 1) return Util.CheckSelectCount(cards.OrderBy(card => card.Attack).ToList(), cards, min, max); + ClientCard ariannaNotSummon = cards.FirstOrDefault(c => c.IsCode(CardId.AriannaTheLabrynthServant) && !summonInChainList.Contains(c)); + if (ariannaNotSummon != null) return Util.CheckSelectCount(new List { ariannaNotSummon }, cards, min, max); + else + { + // compare which have lower attack + ClientCard fieldTarget = Bot.GetMonsters().Where(card => !card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) + .OrderBy(card => card.Attack).FirstOrDefault(); + if (fieldTarget != null) return Util.CheckSelectCount(new List { fieldTarget }, cards, min, max); + } + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + public ClientCard GetWelcomeOrBigWelcomeTarget(IList cards, int cardId) + { + ClientCard graveTarget = cards.FirstOrDefault(card => card.IsCode(cardId) && card.Location == CardLocation.Grave); + if (graveTarget != null) return graveTarget; + ClientCard deckTarget = cards.FirstOrDefault(card => card.IsCode(cardId) && card.Location == CardLocation.Deck); + if (deckTarget != null) return deckTarget; + ClientCard handTarget = cards.FirstOrDefault(card => card.IsCode(cardId) && card.Location == CardLocation.Hand); + if (handTarget != null) return handTarget; + return null; + } + + public ClientCard AriannaSearchWelcomeTrap(IList cards, int welcomeId) + { + bool haveCostToSolve = Bot.HasInHand(new List { CardId.LovelyLabrynthOfTheSilverCastle, CardId.TransactionRollback, CardId.AriasTheLabrynthButler }); + if (haveCostToSolve) + { + List checkIdList = new List { CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier }; + foreach (int checkId in checkIdList) + { + ClientCard targetCard = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (targetCard != null && !Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && CheckCalledbytheGrave(checkId) == 0 && !activatedCardIdList.Contains(checkId)) + { + return targetCard; + } + } + foreach (int checkId in checkIdList) + { + ClientCard targetCard = GetWelcomeOrBigWelcomeTarget(cards, checkId); + if (targetCard != null && CheckCalledbytheGrave(checkId) == 0 && !activatedCardIdList.Contains(checkId)) + { + return targetCard; + } + } + } + + return GetWelcomeOrBigWelcomeTarget(cards, welcomeId); + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } + + public override bool OnSelectMonsterSummonOrSet(ClientCard card) + { + if (card.Attack > 0 && CheckCanDirectAttack()) return false; + if (card.Attack <= 1000) return true; + + return base.OnSelectMonsterSummonOrSet(card); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + // selected in summon process + if (cardId == CardId.RelinquishedAnima) + { + return base.OnSelectPlace(cardId, player, location, available); + } + if (cardId == CardId.UnchainedSoulLordOfYama || cardId == CardId.UnchainedSoulOfAnguish) + { + if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null && (Zones.z6 & available) != 0) return Zones.z6; + if (Bot.MonsterZone[2] != null && Bot.MonsterZone[4] != null && (Zones.z5 & available) != 0) return Zones.z5; + } + if (cardId == CardId.MuckrakerFromTheUnderworld || cardId == CardId.UnchainedSoulOfRage) + { + if (Bot.MonsterZone[1] != null && (Zones.z6 & available) != 0) return Zones.z6; + if (Bot.MonsterZone[3] != null && (Zones.z5 & available) != 0) return Zones.z5; + } + + List zoneIdList = ShuffleList(new List { 0, 2, 4 }); + zoneIdList.AddRange(ShuffleList(new List { 1, 3 })); + zoneIdList.AddRange(ShuffleList(new List { 5, 6 })); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + return zone; + } + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override int OnSelectOption(IList options) + { + // override for cooclock + if (options.Count() == 2 && options.Contains(1190) && options.Contains(1152)) + { + // 1190=Add to Hand, 1152=Special Summon + // return to hand to activate trap set this turn + bool canLink = Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2; + if (!canLink && !Bot.HasInHand(CardId.LabrynthCooclock) && Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)) + && !activatedCardIdList.Contains(CardId.LabrynthCooclock) && !CheckWhetherWillbeRemoved() + && (activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) || Bot.GetSpells().All(card => setTrapThisTurn.Contains(card) || !card.IsCode(CardId.BigWelcomeLabrynth))) + && setTrapThisTurn.Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth, _CardId.DimensionalBarrier, _CardId.InfiniteImpermanence, CardId.DestructiveDarumaKarmaCannon))) + { + return options.IndexOf(1190); + } + if (!enemyActivateMaxxC) return options.IndexOf(1152); + if (activatedCardIdList.Contains(CardId.LabrynthCooclock)) + { + if (!CheckShouldNoMoreSpSummon()) return options.IndexOf(1152); + } + return options.IndexOf(1190); + } + + // overrride for lovely + if (options.Contains(Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 3)) && options.Contains(Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 4))) + { + int botWorstAttack = 0; + ClientCard botWorstMonster = Util.GetWorstBotMonster(true); + if (botWorstMonster != null) + { + botWorstAttack = botWorstMonster.Attack; + } + List targetList = GetProblematicEnemyCardList(false); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && card.GetDefensePower() >= botWorstAttack && !currentDestroyCardList.Contains(card)).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => !currentDestroyCardList.Contains(card) && card.IsFacedown()).ToList())); + if (targetList.Count() > 0) + { + currentDestroyCardList.Add(targetList[0]); + AI.SelectCard(targetList); + return options.IndexOf(Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 4)); + } + else + { + return options.IndexOf(Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 3)); + } + } + + // override for dimensional barrier + if (options.IndexOf(HintMsg.RITUAL) >= 0 || options.IndexOf(HintMsg.FUSION) >= 0 || options.IndexOf(HintMsg.SYNCHRO) >= 0 + || options.IndexOf(HintMsg.XYZ) >= 0 || options.IndexOf(HintMsg.PENDULUM) >= 0) + { + Dictionary> barrierCheckDict = new Dictionary> + { + {HintMsg.RITUAL, DimensionalBarrierForRitual}, + {HintMsg.FUSION, DimensionalBarrierForFusion}, + {HintMsg.SYNCHRO, DimensionalBarrierForSynchro}, + {HintMsg.XYZ, DimensionalBarrierForXyz}, + {HintMsg.PENDULUM, DimensionalBarrierForPendulum}, + }; + dimensionBarrierAnnouncing = true; + foreach (KeyValuePair> checkPair in barrierCheckDict) + { + if (options.Contains(checkPair.Key) && checkPair.Value()) + { + dimensionBarrierAnnouncing = false; + dimensionalBarrierAnnouced.Add(checkPair.Key); + return options.IndexOf(checkPair.Key); + } + } + dimensionBarrierAnnouncing = false; + List enemyMonsterList = new List(Enemy.GetMonsters()); + enemyMonsterList.AddRange(Enemy.GetGraveyardMonsters()); + Dictionary barrierCheckSecondark = new Dictionary + { + {HintMsg.RITUAL, enemyMonsterList.Any(card => card.HasType(CardType.Ritual))}, + {HintMsg.FUSION, enemyMonsterList.Any(card => card.HasType(CardType.Fusion))}, + {HintMsg.SYNCHRO, enemyMonsterList.Any(card => card.HasType(CardType.Synchro))}, + {HintMsg.XYZ, enemyMonsterList.Any(card => card.HasType(CardType.Xyz))}, + {HintMsg.PENDULUM, enemyMonsterList.Any(card => card.HasType(CardType.Pendulum))}, + }; + foreach (KeyValuePair checkPair in barrierCheckSecondark) + { + if (options.Contains(checkPair.Key) && checkPair.Value) + { + dimensionBarrierAnnouncing = false; + dimensionalBarrierAnnouced.Add(checkPair.Key); + return options.IndexOf(checkPair.Key); + } + } + List annouceList = new List { HintMsg.XYZ, HintMsg.SYNCHRO, HintMsg.FUSION, HintMsg.PENDULUM, HintMsg.RITUAL }; + foreach (int annouce in annouceList) + { + if (options.Contains(annouce)) + { + return options.IndexOf(annouce); + } + } + } + + // override for servant + // sp summon + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 2)) || options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 2))) + { + if (GetEmptyMainMonsterZoneCount() > chainSummoningIdList.Count()) + { + bool checkFlag = false; + if (!activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && Bot.HasInHand(CardId.AriannaTheLabrynthServant) + && !CheckWhetherNegated(true, true, CardType.Monster) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + checkFlag = true; + AI.SelectCard(CardId.AriannaTheLabrynthServant); + } + if (!checkFlag) + { + List checkIdList = new List { CardId.LovelyLabrynthOfTheSilverCastle, CardId.LadyLabrynthOfTheSilverCastle }; + foreach (int checkId in checkIdList) + { + if (Bot.HasInHand(checkId)) + { + checkFlag = true; + AI.SelectCard(checkId); + break; + } + } + } + if (!checkFlag && Duel.Player == 0 && Duel.Phase < DuelPhase.End) + { + List linkMaterialList = GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)); + if (linkMaterialList.Count() + chainSummoningIdList.Count() == 2) + { + // summon less atk for link + ClientCard selected = null; + int attack = 0; + foreach (ClientCard hand in Bot.Hand) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(hand.Id); + if (cardData == null || cardData.Race != (int)CardRace.Fiend) continue; + if (selected == null || attack > hand.Attack) + { + selected = hand; + attack = hand.Attack; + } + } + if (selected != null) + { + checkFlag = true; + AI.SelectCard(selected); + } + } + } + if (!checkFlag && CheckCanDirectAttack()) + { + // summon best attack for attack + ClientCard selected = null; + int attack = 0; + foreach (ClientCard hand in Bot.Hand) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(hand.Id); + if (cardData == null || cardData.Race != (int)CardRace.Fiend) continue; + if (selected == null || attack < hand.Attack) + { + selected = hand; + attack = hand.Attack; + } + } + if (selected != null) + { + checkFlag = true; + AI.SelectCard(selected); + } + } + + if (checkFlag) + { + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 2))) return options.IndexOf(Util.GetStringId(CardId.AriannaTheLabrynthServant, 2)); + if (options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 2))) return options.IndexOf(Util.GetStringId(CardId.ArianeTheLabrynthServant, 2)); + } + } + } + + // set + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 3)) || options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 3))) + { + if (!Util.ChainContainsCard(CardId.WelcomeLabrynth) || Bot.GetSpellCountWithoutField() < 4) + { + List checkIdList = new List { CardId.BigWelcomeLabrynth, CardId.WelcomeLabrynth, _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon }; + foreach (int checkId in checkIdList) + { + if (Bot.HasInHand(checkId) && (checkId == _CardId.InfiniteImpermanence || !Bot.HasInSpellZone(checkId, faceUp:false))) + { + AI.SelectCard(checkId); + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 3))) return options.IndexOf(Util.GetStringId(CardId.AriannaTheLabrynthServant, 3)); + if (options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 3))) return options.IndexOf(Util.GetStringId(CardId.ArianeTheLabrynthServant, 3)); + } + } + } + } + + // do nothing + if (options.Contains(Util.GetStringId(CardId.AriannaTheLabrynthServant, 4))) return options.IndexOf(Util.GetStringId(CardId.AriannaTheLabrynthServant, 4)); + if (options.Contains(Util.GetStringId(CardId.ArianeTheLabrynthServant, 4))) return options.IndexOf(Util.GetStringId(CardId.ArianeTheLabrynthServant, 4)); + + return base.OnSelectOption(options); + } + + public override bool OnSelectYesNo(int desc) + { + if (desc == 96) + { + Logger.DebugWriteLine("*** muckraker replace."); + AI.SelectCard(Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasRace(CardRace.Fiend)).OrderBy(card => card.Attack).ToList()); + return true; + } + return base.OnSelectYesNo(desc); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + dimensionShifterCount = 0; + + enemySpSummonFromExLastTurn = 0; + enemySpSummonFromExThisTurn = 0; + banSpSummonExceptFiendCount = 0; + } + enemyActivateMaxxC = false; + enemySpSummonFromExLastTurn = enemySpSummonFromExThisTurn; + enemySpSummonFromExThisTurn = 0; + rollbackCopyCardId = 0; + + if (dimensionShifterCount > 0) dimensionShifterCount--; + if (banSpSummonExceptFiendCount > 0) banSpSummonExceptFiendCount--; + infiniteImpermanenceList.Clear(); + + summoned = false; + cooclockAffected = false; + activatedCardIdList.Clear(); + setTrapThisTurn.Clear(); + summonThisTurn.Clear(); + enemySetThisTurn.Clear(); + dimensionalBarrierAnnouced.Clear(); + summonInChainList.Clear(); + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + if (chainSummoningIdList.Count() > 0) + Logger.DebugWriteLine("[Welcome] Summoning: " + string.Join(",", chainSummoningIdList) + "\n"); + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + if (enemyActivateInfiniteImpermanenceFromHand) + { + enemyActivateInfiniteImpermanenceFromHand = false; + } + else { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4-i); + break; + } + } + } + } + } + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated()) + { + if (currentCard.ActivatePlayer == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(CardId.DimensionShifter)) + dimensionShifterCount = 2; + } + if (currentCard.ActivatePlayer == 0) + { + if (currentCard.IsCode(CardId.LabrynthCooclock)) + cooclockAffected = true; + } + } + + base.OnChainSolved(chainIndex); + } + + public override void OnChainEnd() + { + rollbackCopyCardId = 0; + currentNegateMonsterList.Clear(); + currentDestroyCardList.Clear(); + escapeTargetList.Clear(); + chainSummoningIdList.Clear(); + summonInChainList.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + for (int idx = enemySetThisTurn.Count() - 1; idx >= 0; idx --) + { + ClientCard checkTarget = enemySetThisTurn[idx]; + if (checkTarget == null || checkTarget.Location != CardLocation.SpellZone || checkTarget.HasPosition(CardPosition.FaceUp)) + { + enemySetThisTurn.RemoveAt(idx); + } + } + if (cooclockActivating) + cooclockActivating = false; + furnitureActivating = false; + dimensionBarrierAnnouncing = false; + bigwelcomeEscaseTarget = null; + base.OnChainEnd(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (previousControler == 1) + { + if (previousLocation == (int)CardLocation.Extra && currentLocation == (int)CardLocation.MonsterZone) enemySpSummonFromExThisTurn ++; + if (card != null) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && previousLocation == (int)CardLocation.Hand && currentLocation == (int)CardLocation.SpellZone) + enemyActivateInfiniteImpermanenceFromHand = true; + if (card.Location == CardLocation.SpellZone && card.HasPosition(CardPosition.FaceDown)) + enemySetThisTurn.Add(card); + } + } + if (card != null) + { + if (previousControler == 0) + { + if (previousLocation == (int)CardLocation.MonsterZone && currentLocation != (int)CardLocation.MonsterZone) + { + if (summonThisTurn.Contains(card)) summonThisTurn.Remove(card); + if (summonInChainList.Contains(card)) summonInChainList.Remove(card); + } + if (previousLocation == (int)CardLocation.SpellZone && currentLocation != (int)CardLocation.SpellZone) + { + if (setTrapThisTurn.Contains(card)) setTrapThisTurn.Remove(card); + } + } + if (currentControler == 0) + { + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentLocation == (int)CardLocation.SpellZone && (currentSolvingChain == null || !currentSolvingChain.IsCode(CardId.AriasTheLabrynthButler)) + && (card.HasType(CardType.Trap) || card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)) + ) + { + Logger.DebugWriteLine("[setTrapThisTurn]set " + card.Name ?? "UnknowCard"); + setTrapThisTurn.Add(card); + } + if (currentLocation == (int)CardLocation.MonsterZone) + { + summonThisTurn.Add(card); + if (currentSolvingChain != null) summonInChainList.Add(card); + } + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + public override BattlePhaseAction OnBattle(IList attackers, IList defenders) + { + if (attackers.Count() > 0 && defenders.Count() > 0) + { + List sortedAttacker = attackers.OrderBy(card => card.Attack).ToList(); + for (int k = 0; k < sortedAttacker.Count; ++k) + { + ClientCard attacker = sortedAttacker[k]; + attacker.IsLastAttacker = k == sortedAttacker.Count - 1; + BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders); + if (result != null) + return result; + } + } + + return base.OnBattle(attackers, defenders); + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public void ResetCooclockEffect(bool onlyCheck) + { + if (!onlyCheck && cooclockAffected && setTrapThisTurn.Contains(Card)) + { + cooclockAffected = false; + setTrapThisTurn.Remove(Card); + } + } + + + + + + public bool LadyLabrynthOfTheSilverCastleFieldActivate() + { + if (Card.Location == CardLocation.MonsterZone && (Util.GetLastChainCard() == null || !Util.GetLastChainCard().IsCode(_CardId.EvenlyMatched)) + && (!CheckWhetherNegated() || Enemy.HasInMonstersZone(CardId.LadyLabrynthOfTheSilverCastle))) + { + activatedCardIdList.Add(Card.Id + 1); + return true; + } + return false; + } + + public bool LadyLabrynthOfTheSilverCastleHandActivate() + { + if (Card.Location == CardLocation.Hand) + { + // sp summon from hand + if (CheckShouldNoMoreSpSummon(true) || Util.ChainContainsCard(_CardId.EvenlyMatched)) return false; + bool activateFlag = false; + activateFlag |= CheckChainContainEnemyMaxxC(); + if (!activateFlag && GetEmptyMainMonsterZoneCount() + chainSummoningIdList.Count() <= 0) + { + return false; + } + activateFlag |= cooclockAffected && setTrapThisTurn.Count() > 0 && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)); + activateFlag |= Bot.GetSpells().Any(card => card.IsFacedown() && card.HasType(CardType.Trap) && !setTrapThisTurn.Contains(card)) + && !Bot.HasInMonstersZone(Card.Id, true, faceUp: true); + activateFlag |= Duel.Player == 1 && Duel.Phase >= DuelPhase.End; + activateFlag |= setTrapThisTurn.Count() > 0 && Duel.Phase >= DuelPhase.End; + activateFlag |= Bot.UnderAttack && Bot.GetMonsterCount() == 0 && !Util.ChainContainsCard(CardId.DestructiveDarumaKarmaCannon); + // for link + if (Bot.HasInExtra(CardId.UnchainedSoulLordOfYama) && Duel.Player == 0 && Duel.Phase < DuelPhase.End) + { + // check whether need summon for material count + List materialList = GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)); + int materialCount = materialList.Count(); + if (!activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara) && Bot.GetSpells().Any(card => card.IsFacedown()) + && (!activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama) || Bot.HasInHand(CardId.UnchainedSoulOfSharvara))) materialCount++; + if ( (materialCount == 2 || materialCount == 1 && materialList.Any(card => card.IsCode(CardId.UnchainedSoulLordOfYama))) + && Bot.HasInExtra(CardId.UnchainedSoulLordOfYama) || materialList.Any(card => card.HasSetcode(SetcodeUnchained))) + { + activateFlag |= Enemy.GetMonsterCount() > 0 && Bot.HasInExtra(CardId.UnchainedSoulOfAnguish); + activateFlag |= Bot.HasInExtra(CardId.UnchainedSoulOfRage); + } + } + + if (activateFlag) + { + activatedCardIdList.Add(Card.Id); + chainSummoningIdList.Add(Card.Id); + return true; + } + } + return false; + } + + public bool LovelyLabrynthOfTheSilverCastleActivate() + { + if (CheckWhetherNegated()) return false; + if (ActivateDescription == Util.GetStringId(CardId.LovelyLabrynthOfTheSilverCastle, 0)) + { + // set from GY + List checkIdList = new List{CardId.BigWelcomeLabrynth, _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, + CardId.DestructiveDarumaKarmaCannon, CardId.WelcomeLabrynth}; + foreach (int checkId in checkIdList) + { + if (Bot.HasInGraveyard(checkId) && !Bot.HasInHandOrInSpellZone(checkId)) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + return true; + } + } + foreach (int checkId in checkIdList) + { + if (Bot.HasInGraveyard(checkId)) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + if (GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)).Count() == 2 + && !activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama) + && (Bot.HasInGraveyard(CardId.UnchainedSoulOfSharvara) || CheckRemainInDeck(CardId.UnchainedSoulOfSharvara) > 0)) + { + activatedCardIdList.Add(Card.Id); + return true; + } + } + else + { + // destroy + if (Enemy.GetHandCount() == 0) + { + int botWorstAttack = 0; + ClientCard botWorstMonster = Util.GetWorstBotMonster(true); + if (botWorstMonster != null) + { + botWorstAttack = botWorstMonster.Attack; + } + List targetList = GetProblematicEnemyCardList(false); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && card.GetDefensePower() >= botWorstAttack && !currentDestroyCardList.Contains(card)).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => !currentDestroyCardList.Contains(card)).ToList())); + + if (targetList.Count() > 0) + { + currentDestroyCardList.Add(targetList[0]); + AI.SelectCard(targetList); + AI.SelectOption(1); + } + else + { + AI.SelectOption(0); + } + } + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool UnchainedSoulOfSharvaraActivate() + { + // search + if (Card.Location == CardLocation.Grave) + { + activatedCardIdList.Add(Card.Id + 1); + SelectSTPlace(null, false); + return true; + } + + // sp summon + if (Bot.HasInSpellZone(CardId.TransactionRollback) && GetEmptyMainMonsterZoneCount() > chainSummoningIdList.Count() + && !CheckWhetherWillbeRemoved() && !CheckShouldNoMoreSpSummon(false)) + { + AI.SelectCard(CardId.TransactionRollback); + activatedCardIdList.Add(Card.Id); + return true; + } + + // escape target + if (Duel.LastChainPlayer == 1) + { + ClientCard chainCard = Util.GetLastChainCard(); + if (chainCard != null && chainCard.IsCode(targetNegateIdList)) + { + if (Duel.LastChainTargets.Any(card => card.Controller == 0 && card.IsFaceup() && card.HasRace(CardRace.Fiend) + && Duel.CurrentChain.Any(chain => chain == card) && !card.IsCode(CardId.UnchainedSoulOfRage, CardId.UnchainedSoulOfAnguish))) + { + escapeTargetList.AddRange(Duel.LastChainTargets); + AI.SelectCard(Duel.LastChainTargets); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + // for link + bool destroySpells = Duel.Player == 0 && GetEmptyMainMonsterZoneCount() > chainSummoningIdList.Count() && Bot.GetMonsterCount() > 0 && CurrentTiming <= 0; + if (destroySpells) + { + List materialList = GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)); + destroySpells = CheckAtAdvantage() && !Bot.HasInMonstersZone(CardId.UnchainedSoulOfRage) + && Bot.HasInExtra(CardId.UnchainedSoulOfRage) && materialList.Count() == 1; + if (Bot.HasInExtra(CardId.UnchainedSoulOfAnguish) && !Bot.HasInMonstersZone(CardId.UnchainedSoulOfAnguish) + && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish) && Enemy.GetMonsters().Where(card => card.IsFaceup()).Count() > 0) + { + destroySpells |= materialList.Count() == 2; + destroySpells |= materialList.Count() == 1 && materialList.Any(card => card.HasType(CardType.Link) && card.LinkCount == 2); + } + } + // for attack + destroySpells |= CheckCanDirectAttack() && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack() + 2000 >= Enemy.LifePoints + && GetEmptyMainMonsterZoneCount() > chainSummoningIdList.Count(); + // for avoid lose + destroySpells |= Duel.Player == 1 && Duel.Phase == DuelPhase.Main1 && Bot.GetMonsterCount() == 0 && (CurrentTiming & hintTimingMainEnd) != 0 + && Util.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints; + if (destroySpells) + { + List destroyIdList = new List{_CardId.InfiniteImpermanence, CardId.TransactionRollback, CardId.WelcomeLabrynth, + _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon, CardId.BigWelcomeLabrynth}; + foreach (int checkId in destroyIdList) + { + ClientCard target = Bot.GetSpells().FirstOrDefault(card => card.IsFacedown() && card.IsCode(checkId)); + if (target != null) + { + AI.SelectCard(target); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + return false; + } + + public bool AriasTheLabrynthButlerActivate() + { + if (Card.Location != CardLocation.Grave) + { + if (Util.ChainContainsCard(new int[] { _CardId.DivineArsenalAAZEUS_SkyThunder, _CardId.EvenlyMatched, _CardId.EvilswarmExcitonKnight })) return false; + if (Duel.CurrentChain.Any(card => card.Controller == 0 && card.IsCode(CardId.AriannaTheLabrynthServant))) return false; + + // set trap to activate + SortedList> checkList = new SortedList> { + {CardId.BigWelcomeLabrynth, BigWelcomeLabrynthSetCheck}, + {CardId.WelcomeLabrynth, WelcomeLabrynthSetCheck}, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonSetCheck}, + {_CardId.DimensionalBarrier, DimensionalBarrierActivate} + }; + foreach (KeyValuePair> pair in checkList) + { + ClientCard setTarget = Bot.Hand.FirstOrDefault(card => card.IsCode(pair.Key)); + if (setTarget != null && !activatedCardIdList.Contains(pair.Key) && pair.Value()) + { + AI.SelectOption(1); + AI.SelectCard(pair.Key); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(setTarget, true); + return true; + } + } + + // special summon monster + if (Bot.HasInHand(CardId.LovelyLabrynthOfTheSilverCastle)) + { + // before main end + if (Duel.Player == 0 || (CurrentTiming & hintTimingMainEnd) != 0) + { + AI.SelectOption(0); + AI.SelectCard(CardId.LovelyLabrynthOfTheSilverCastle); + chainSummoningIdList.Add(CardId.LovelyLabrynthOfTheSilverCastle); + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (Bot.HasInHand(CardId.AriannaTheLabrynthServant) && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) + && !CheckWhetherNegated(true, true) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + bool searchFlag = false; + if (Duel.Player == 1) + { + searchFlag |= (CurrentTiming & hintTimingMainEnd) != 0; + searchFlag |= GetProblematicEnemyCardList(false).Count() > 0 + && (Bot.HasInMonstersZoneOrInGraveyard(CardId.LovelyLabrynthOfTheSilverCastle) || CheckRemainInDeck(CardId.LovelyLabrynthOfTheSilverCastle) > 0) + && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + } + if (Duel.Player == 0) searchFlag |= summoned && !CheckShouldNoMoreSpSummon(); + if (searchFlag) + { + AI.SelectOption(0); + AI.SelectCard(CardId.AriannaTheLabrynthServant); + chainSummoningIdList.Add(CardId.AriannaTheLabrynthServant); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + return false; + } + + public bool ArianeTheLabrynthServantSummon() + { + // for attack + if (Duel.Turn > 1 && Enemy.GetMonsterCount() == 0) + { + summoned = true; + return true; + } + // for activate effect + if (!activatedCardIdList.Contains(Card.Id) && !CheckWhetherNegated(true, true) && !CheckWhetherWillbeRemoved()) + { + bool haveCost = Bot.Hand.Any(card => card.Type == (int)CardType.Trap) || Bot.GetSpells().Any(card => card.IsFacedown() && card.Type == (int)CardType.Trap); + if (haveCost && !CheckShouldNoMoreSpSummon(true)) + { + summoned = true; + return true; + } + } + + return false; + } + public bool ArianeTheLabrynthServantForRollbackSummon() + { + if (activatedCardIdList.Contains(Card.Id)) return false; + if (Bot.HasInHandOrInSpellZone(CardId.TransactionRollback) && !CheckWhetherWillbeRemoved()) + { + summoned = true; + return true; + } + + return false; + } + public bool ArianeTheLabrynthServantActivate() + { + // special summon + if (ActivateDescription == Util.GetStringId(Card.Id, 0)) + { + bool haveRollback = Bot.HasInHandOrInSpellZone(CardId.TransactionRollback); + if (CheckWhetherNegated() && !haveRollback) return false; + if (CheckShouldNoMoreSpSummon() && !(haveRollback && Bot.Graveyard.Any(card => card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)))) return false; + int specialSummonId = 0; + // arianna + if (!activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && CheckRemainInDeck(CardId.AriannaTheLabrynthServant) > 0) + { + specialSummonId = CardId.AriannaTheLabrynthServant; + } + // sp summon not used furniture + if (specialSummonId == 0) + { + List checkIdList = new List{CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock}; + foreach (int checkId in checkIdList) + { + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && CheckRemainInDeck(checkId) > 0) + { + specialSummonId = checkId; + break; + } + } + } + // for attack/link + if (specialSummonId == 0) + { + List checkIdList = new List(); + if (Enemy.GetMonsterCount() == 0) checkIdList.AddRange(new List{ + CardId.AriannaTheLabrynthServant, CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock + }); + else checkIdList.AddRange(new List{ + CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, CardId.LabrynthCooclock, CardId.AriannaTheLabrynthServant + }); + foreach (int checkId in checkIdList) + { + if (CheckRemainInDeck(checkId) > 0) + { + specialSummonId = checkId; + break; + } + } + } + + if (specialSummonId > 0) + { + bool costSelected = false; + if (haveRollback) + { + AI.SelectCard(CardId.TransactionRollback); + costSelected = true; + } + if (!costSelected) { + ClientCard welcome = Bot.GetSpells().FirstOrDefault(card => card.IsCode(CardId.WelcomeLabrynth)); + if (welcome != null) + { + AI.SelectCard(welcome); + costSelected = true; + } + } + List costCheckList = Bot.Hand.Where(card => card.IsFacedown() && card.Type == (int)CardType.Trap).ToList(); + costCheckList.AddRange(Bot.GetSpells().Where(card => card.IsFacedown() && card.Type == (int)CardType.Trap).ToList()); + if (!costSelected) + { + List checkIdList = new List{_CardId.InfiniteImpermanence, CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth}; + foreach (int checkId in checkIdList) + { + ClientCard dumpCard = costCheckList.FirstOrDefault(card => card.IsCode(checkId)); + if (costCheckList.Count(card => card.IsCode(checkId)) > 1 && dumpCard != null) + { + AI.SelectCard(dumpCard); + costSelected = true; + break; + } + } + } + if (!costSelected) + { + List checkIdList = new List{_CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon, + CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth}; + foreach (int checkId in checkIdList) + { + ClientCard checkCard = costCheckList.FirstOrDefault(card => card.IsCode(checkId)); + if (checkCard != null) + { + AI.SelectCard(checkCard); + costSelected = true; + break; + } + } + } + } + } else { + // draw + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool AriannaTheLabrynthServantSummon() + { + // summon for search + if (!CheckWhetherNegated(true, true) && !activatedCardIdList.Contains(Card.Id)) + { + summoned = true; + return true; + } + + // summon for attack + if (Duel.Turn > 1 && Duel.Player == 0 && Duel.Phase < DuelPhase.Main2 && Enemy.GetMonsterCount() == 0 && !Bot.HasInHand(CardId.ArianeTheLabrynthServant)) + { + summoned = true; + return true; + } + + return false; + } + public bool AriannaTheLabrynthServantActivate() + { + if (CheckWhetherNegated()) return false; + // search or draw + // search target is overrided in OnSelectCard() + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC)) return false; + if (DefaultAshBlossomAndJoyousSpring()) + { + if (Util.GetLastChainCard().Location == CardLocation.MonsterZone) currentNegateMonsterList.Add(Util.GetLastChainCard()); + return true; + } + return false; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool FurnitureSetWelcomeActivate() + { + if (furnitureActivating && (Card.Location == CardLocation.Hand || !DefaultOnBecomeTarget())) return false; + if (Util.ChainContainsCard(new int[]{ _CardId.DivineArsenalAAZEUS_SkyThunder, _CardId.EvenlyMatched, _CardId.EvilswarmExcitonKnight })) return false; + + if (CheckWhetherNegated()) return false; + if (Card.Location != CardLocation.Grave) + { + bool becomeTarget = Card.Location == CardLocation.MonsterZone && DefaultOnBecomeTarget() && !escapeTargetList.Contains(Card); + bool lackUnimportantCost = Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth)); + if (lackUnimportantCost) + { + List handCost = Bot.Hand.Where(card => card != Card).ToList(); + lackUnimportantCost &= handCost.Count() <= 2 && handCost.All(card => card.IsCode(_CardId.MaxxC, _CardId.AshBlossom)); + } + bool activateFlag = becomeTarget; + // set big welcome for lovely + bool canActivateSetBigWelcomeThisTurn = CheckRemainInDeck(CardId.BigWelcomeLabrynth) > 0 && cooclockAffected && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && (Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle)) + && (!Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth) && !setTrapThisTurn.Contains(card))) + && ( + Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)) + || (Bot.HasInGraveyard(CardId.LabrynthCooclock) && !activatedCardIdList.Contains(CardId.LabrynthCooclock + 1)) + || (Bot.HasInHand(CardId.LadyLabrynthOfTheSilverCastle) && !activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle)) + ); + if (canActivateSetBigWelcomeThisTurn && ShouldSetBigWelcome()) + { + bool force = becomeTarget | GetProblematicEnemyCardList(false).Count() > 0; + ClientCard cost = FurnitureGetCost(force); + if (cost != null) + { + AI.SelectCard(cost); + AI.SelectNextCard(CardId.BigWelcomeLabrynth); + activatedCardIdList.Add(Card.Id); + furnitureActivating = true; + SelectSTPlace(null, true); + return true; + } + } + bool keepOnField = (cooclockActivating || cooclockAffected) && activatedCardIdList.Contains(CardId.LabrynthCooclock + 1) + && Card.Location == CardLocation.MonsterZone && !Bot.GetMonsters().Any(card => card.IsFaceup() && card != Card && card.HasSetcode(SetcodeLabrynth)) + && setTrapThisTurn.Count() > 0; + // normal set + activateFlag |= Duel.Phase > DuelPhase.Main2 && !lackUnimportantCost && !keepOnField; + activateFlag |= Bot.HasInGraveyard(new List { CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth }) + && Bot.HasInHand(CardId.TransactionRollback) && !activatedCardIdList.Contains(CardId.TransactionRollback); + if (Duel.CurrentChain.Any(card => card != null && card.Controller == 0 && card.IsCode(CardId.BigWelcomeLabrynth) && card.Location == CardLocation.SpellZone) + && !(Bot.GetMonsterCount() == 1 && Card.Location == CardLocation.MonsterZone)) + { + activateFlag |= !lackUnimportantCost && Bot.GetMonsters().Any(card => card != Card) && !Bot.HasInGraveyard(Card.Id) && !activatedCardIdList.Contains(Card.Id + 1); + } + // trigger cooclock to defense + activateFlag |= !Util.ChainContainPlayer(0) && Duel.Player == 1 && Bot.UnderAttack && Bot.GetMonsterCount() == 0 + && Bot.HasInGraveyard(CardId.LabrynthCooclock) && !activatedCardIdList.Contains(CardId.LabrynthCooclock + 1) + && !(Bot.HasInHand(CardId.LadyLabrynthOfTheSilverCastle) && !activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle)); + + if (activateFlag) + { + ClientCard cost = FurnitureGetCost(becomeTarget); + if (cost != null) + { + AI.SelectCard(cost); + activatedCardIdList.Add(Card.Id); + furnitureActivating = true; + bool setWelcome = Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth)); + setWelcome |= Bot.GetMonsterCount() == 0 && !Bot.HasInHandOrInSpellZone(CardId.WelcomeLabrynth) + && (!Bot.HasInGraveyard(CardId.LabrynthCooclock) || activatedCardIdList.Contains(CardId.LabrynthCooclock + 1)) + && ((Duel.Player == 0 && Duel.Phase > DuelPhase.Main2) || !Bot.Hand.Any(card => card != Card && card.Level <= 4)); + if (setWelcome) + { + AI.SelectNextCard(CardId.WelcomeLabrynth); + } else { + AI.SelectNextCard(CardId.BigWelcomeLabrynth); + } + SelectSTPlace(null, true); + return true; + } + } + } + + return false; + } + + public ClientCard FurnitureGetCost(bool force = false, List ignoreList = null) + { + if (ignoreList == null) ignoreList = new List(); + // advance cost + List advancedCostIdList = new List{ + CardId.TransactionRollback, CardId.LovelyLabrynthOfTheSilverCastle, CardId.AriasTheLabrynthButler, CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, + CardId.WelcomeLabrynth + }; + foreach (int checkId in advancedCostIdList) + { + ClientCard cost = Bot.Hand.FirstOrDefault(card => !ignoreList.Contains(card) && card.IsCode(checkId) && card != Card); + if (cost != null) return cost; + } + // dump cost + List canCostHand = Bot.Hand.Where(card => !ignoreList.Contains(card)).ToList(); + List appearedCode = new List(canCostHand.Count()); + foreach (ClientCard hand in canCostHand) + { + if (Duel.CurrentChain.Contains(hand)) continue; + if (appearedCode.Contains(hand.Id)) return hand; + appearedCode.Add(hand.Id); + } + List costIdList = new List{ + _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.UnchainedSoulOfSharvara, CardId.EscapeOfTheUnchained, CardId.DestructiveDarumaKarmaCannon, + CardId.LabrynthCooclock, CardId.ArianeTheLabrynthServant, CardId.WelcomeLabrynth, CardId.PotOfExtravagance, CardId.LadyLabrynthOfTheSilverCastle + }; + if (force) costIdList.AddRange(new List{CardId.AriannaTheLabrynthServant, _CardId.AshBlossom, CardId.BigWelcomeLabrynth, _CardId.MaxxC}); + foreach (int checkId in costIdList) + { + ClientCard target = canCostHand.FirstOrDefault(card => !Duel.CurrentChain.Contains(card) && card.IsCode(checkId) && !Duel.CurrentChain.Contains(card)); + if (target != null) return target; + } + foreach (int checkId in costIdList) + { + ClientCard target = canCostHand.FirstOrDefault(card => card.IsCode(checkId) && !Duel.CurrentChain.Contains(card)); + if (target != null) return target; + } + + return null; + } + + public bool ShouldSetBigWelcome(bool checkArianna = true) + { + if (CheckWhetherWillbeRemoved()) return false; + bool shouldTriggerBigWelcomeFlag = GetProblematicEnemyCardList(false).Count() > 0; + shouldTriggerBigWelcomeFlag |= Duel.Player == 1 && Duel.Phase > DuelPhase.Main2; + shouldTriggerBigWelcomeFlag |= Duel.Player == 1 && GetProblematicEnemyCardList(false).Count() == 0 && GetProblematicEnemyMonster(selfType: CardType.Monster) == null + && Enemy.Hand.Count() == 1; + if (checkArianna) shouldTriggerBigWelcomeFlag |= Duel.Player == 0 && !summoned && Bot.HasInHandOrHasInMonstersZone(CardId.AriannaTheLabrynthServant) + && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant); + shouldTriggerBigWelcomeFlag |= Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2; + return shouldTriggerBigWelcomeFlag; + } + + public bool LabrynthCooclockActivate() + { + if (Card.Location == CardLocation.Hand) + { + bool shouldTriggerBigWelcomeFlag = false; + if (Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle)) { + shouldTriggerBigWelcomeFlag |= ShouldSetBigWelcome(); + } + shouldTriggerBigWelcomeFlag &= !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth); + if (shouldTriggerBigWelcomeFlag && !Bot.GetSpells().Any(card => card.IsFacedown() && !setTrapThisTurn.Contains(card) && card.IsCode(CardId.BigWelcomeLabrynth))) + { + // whether have labrynth to trigger cooclock + bool haveBigWelcome = Duel.Player == 0 && Bot.HasInHand(CardId.BigWelcomeLabrynth) + && (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)) || (!summoned && Bot.Hand.Any(card => card != Card && card.HasType(CardType.Monster) && card.Level <= 4 && card.HasSetcode(SetcodeLabrynth)))); + if (CheckRemainInDeck(CardId.BigWelcomeLabrynth) > 0) + { + foreach (int checkId in new List { CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie }) + { + if (activatedCardIdList.Contains(checkId) || CheckCalledbytheGrave(checkId) > 0) continue; + if (Bot.HasInHand(checkId) && Bot.Hand.Count > 2 || Bot.GetMonsters().Any(card => card.IsFaceup() && !card.IsDisabled() && card.IsCode(checkId)) && Bot.Hand.Count > 1) + { + haveBigWelcome = true; + break; + } + } + } + if (haveBigWelcome) + { + activatedCardIdList.Add(Card.Id); + cooclockActivating = true; + return true; + } + } + + bool haveLabrynth = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)); + bool triggerFlag = Duel.Player == 1 && Duel.Phase <= DuelPhase.Main2 && setTrapThisTurn.Any(card => !activatedCardIdList.Contains(card.Id)) && haveLabrynth; + triggerFlag |= Duel.Player == 1 && activatedCardIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle + 1) + && (Bot.GetSpells().Any(card => card.IsFacedown() && card.Type == (int)CardType.Trap) || Util.ChainContainsCard(CardId.LadyLabrynthOfTheSilverCastle)); + triggerFlag |= setTrapThisTurn.Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)) && haveLabrynth; + triggerFlag |= setTrapThisTurn.Any(card => card.IsFacedown() && card.IsCode(CardId.WelcomeLabrynth) && !activatedCardIdList.Contains(CardId.WelcomeLabrynth)) && haveLabrynth; + + if (triggerFlag) + { + activatedCardIdList.Add(Card.Id); + cooclockActivating = true; + return true; + } + } + + return false; + } + + public bool RecycleActivate() + { + if (Card.Location == CardLocation.Grave) + { + if (Card.IsCode(CardId.LabrynthStovieTorbie, CardId.AriasTheLabrynthButler)) + { + if (CheckShouldNoMoreSpSummon() || GetEmptyMainMonsterZoneCount() + chainSummoningIdList.Count() <= 0) return false; + chainSummoningIdList.Add(Card.Id); + } + if (Card.IsCode(CardId.WelcomeLabrynth)) SelectSTPlace(Card, false); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool ForLinkSummon() + { + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained))) return false; + if (Card.Level > 4) return false; + if (CheckShouldNoMoreSpSummon()) return false; + if (!Bot.HasInExtra(CardId.UnchainedSoulLordOfYama)) return false; + + // check whether need summon for material count + List materialList = GetCanBeUsedForLinkMaterial(true, card => !card.HasRace(CardRace.Fiend)); + int materialCount = materialList.Count(); + if (!activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara) && Bot.GetSpells().Any(card => card.IsFacedown()) + && (!activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama) || Bot.HasInHand(CardId.UnchainedSoulOfSharvara))) materialCount++; + if (materialCount != 2) + { + if (materialCount != 1 || !materialList.Any(card => card.IsCode(CardId.UnchainedSoulLordOfYama))) return false; + } + + if (!Bot.HasInExtra(CardId.UnchainedSoulLordOfYama) && !materialList.Any(card => card.HasSetcode(SetcodeUnchained))) return false; + bool needSummon = false; + needSummon |= Enemy.GetMonsterCount() > 0 && Bot.HasInExtra(CardId.UnchainedSoulOfAnguish); + needSummon |= Bot.HasInExtra(CardId.UnchainedSoulOfRage); + if (needSummon) + { + // use monster with least attack + YGOSharp.OCGWrapper.NamedCard thisCardData = YGOSharp.OCGWrapper.NamedCard.Get(Card.Id); + if (thisCardData == null) return false; + if (thisCardData.Race != (int)CardRace.Fiend) return false; + foreach (ClientCard hand in Bot.Hand) + { + YGOSharp.OCGWrapper.NamedCard compareCardData = YGOSharp.OCGWrapper.NamedCard.Get(hand.Id); + if (compareCardData == null) continue; + if (!compareCardData.HasType(CardType.Monster) || compareCardData.Level > 4) continue; + if (compareCardData.Attack < thisCardData.Attack) return false; + } + summoned = true; + return true; + } + + return false; + } + public bool ForSynchroSummon() + { + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained))) return false; + if (!Card.IsCode(new List { CardId.LabrynthStovieTorbie, CardId.ArianeTheLabrynthServant, CardId.AriannaTheLabrynthServant })) return false; + if (CheckShouldNoMoreSpSummon()) return false; + if (!Bot.HasInExtra(CardId.ChaosAngel) || dimensionalBarrierAnnouced.Contains(HintMsg.SYNCHRO)) return false; + + bool checkFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); + if (Card.IsCode(CardId.LabrynthStovieTorbie)) + { + if (!Bot.GetMonsters().Any(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link) + && card.Level == 8 && card.HasAttribute(CardAttribute.Light | CardAttribute.Dark))) return false; + summoned = true; + return true; + } + else + { + if (!Bot.GetMonsters().Any(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link) + && card.Level == 6 && card.HasAttribute(CardAttribute.Light | CardAttribute.Dark))) return false; + summoned = true; + return true; + } + } + public bool ForAnimaSummon() + { + if (banSpSummonExceptFiendCount > 0 || !Bot.HasInExtra(CardId.RelinquishedAnima)) return false; + if (CheckWhetherNegated() || Duel.Turn == 1) return false; + + bool checkFlag = Bot.MonsterZone[1] == null && Enemy.MonsterZone[6] != null && Enemy.MonsterZone[6].HasType(CardType.Link) && Enemy.MonsterZone[6].HasLinkMarker(CardLinkMarker.Top); + checkFlag |= Bot.MonsterZone[3] == null && Enemy.MonsterZone[5] != null && Enemy.MonsterZone[5].HasType(CardType.Link) && Enemy.MonsterZone[5].HasLinkMarker(CardLinkMarker.Top); + if (Bot.GetMonstersExtraZoneCount() == 0) checkFlag |= Enemy.MonsterZone[1] != null || Enemy.MonsterZone[3] != null; + + return checkFlag; + } + + public bool LabrynthForCooClockSummon() + { + if (!cooclockAffected) return false; + if (Card.Level > 4 || !Card.HasSetcode(SetcodeLabrynth)) return false; + bool welcomeFlag = Bot.Hand.Any(card => (card.IsCode(CardId.WelcomeLabrynth) && !activatedCardIdList.Contains(CardId.WelcomeLabrynth)) + || (card.IsCode(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth))); + welcomeFlag |= Bot.GetSpells().Any(card => card.IsFacedown() && setTrapThisTurn.Contains(card) && ( + (card.IsCode(CardId.WelcomeLabrynth) && !activatedCardIdList.Contains(CardId.WelcomeLabrynth)) + || (card.IsCode(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)))); + if (welcomeFlag && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth))) + { + // summon highest attack + int currentAttack = 0; + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(Card.Id); + if (cardData != null) currentAttack = cardData.Attack; + List summonList = Bot.Hand.Where(card => card.IsMonster() && card.Level <= 4 && card.HasSetcode(SetcodeLabrynth)).ToList(); + foreach (ClientCard checkCard in summonList) + { + cardData = YGOSharp.OCGWrapper.NamedCard.Get(checkCard.Id); + if (cardData != null && cardData.Attack < currentAttack) return false; + } + + return true; + } + return false; + } + + public bool ForBigWelcomeSummon() + { + if (Bot.HasInSpellZone(CardId.BigWelcomeLabrynth) && Bot.GetMonsterCount() == 0 && Card.Level <= 4) + { + summoned = true; + return true; + } + return false; + } + + public bool PotOfExtravaganceActivate() + { + if (CheckWhetherNegated()) return false; + SelectSTPlace(Card, true); + activatedCardIdList.Add(Card.Id); + AI.SelectOption(1); + return true; + } + + public bool WelcomeLabrynthActivate() + { + return WelcomeLabrynthActivateCheck(false); + } + public bool WelcomeLabrynthActivateCopy() + { + return WelcomeLabrynthActivateCheck(true); + } + public bool WelcomeLabrynthSetCheck() + { + return !CheckShouldNoMoreSpSummon() && WelcomeLabrynthActivateCheck(true, true); + } + public bool WelcomeLabrynthActivateCheck(bool onlyCheck = false, bool noSelect = false) + { + if (Card.Location == CardLocation.SpellZone || onlyCheck) + { + if (GetEmptyMainMonsterZoneCount() == 0) return false; + if (CheckShouldNoMoreSpSummon()) return false; + bool activateTimingFlag = Duel.Phase > DuelPhase.Main2 || (Card.IsCode(CardId.AriasTheLabrynthButler) && (CurrentTiming & hintTimingMainEnd) > 0); + + bool becomeTarget = Card.Location == CardLocation.SpellZone && DefaultOnBecomeTarget(); + if ((Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 || Duel.Player == 1 && activateTimingFlag) + && CheckRemainInDeck(CardId.ArianeTheLabrynthServant) > 0 && Bot.HasInHandOrInSpellZone(CardId.TransactionRollback) + && !chainSummoningIdList.Contains(CardId.ArianeTheLabrynthServant)) + { + if (!noSelect) + { + chainSummoningIdList.Add(CardId.ArianeTheLabrynthServant); + activatedCardIdList.Add(Card.Id); + } + return true; + } + bool ariannaCheck = !Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) + || !(Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle)); + ariannaCheck |= Duel.Player == 1 && activateTimingFlag; + ariannaCheck |= Duel.Player == 0; + if (ariannaCheck) + { + if (CheckRemainInDeck(CardId.AriannaTheLabrynthServant) > 0 && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) + && !CheckWhetherNegated(true, true, CardType.Monster) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + if (!noSelect) + { + chainSummoningIdList.Add(CardId.AriannaTheLabrynthServant); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + if (Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth)) + { + if (Bot.HasInHand(CardId.LovelyLabrynthOfTheSilverCastle) && CheckRemainInDeck(CardId.AriasTheLabrynthButler) > 0 + && !chainSummoningIdList.Contains(CardId.AriasTheLabrynthButler) && !Bot.HasInMonstersZone(CardId.AriasTheLabrynthButler, true, false, true)) + { + if (!noSelect) + { + chainSummoningIdList.Add(CardId.AriasTheLabrynthButler); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + + bool activateFlag = becomeTarget; + activateFlag |= Bot.UnderAttack && Bot.GetMonsterCount() == 0; + activateFlag |= ShouldSetBigWelcome(false); + if (activateFlag) + { + if (!noSelect) + { + if (Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && CheckRemainInDeck(CardId.LovelyLabrynthOfTheSilverCastle) > 0 && !chainSummoningIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle)) + { + chainSummoningIdList.Add(CardId.LovelyLabrynthOfTheSilverCastle); + } + else if (!activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && CheckRemainInDeck(CardId.AriannaTheLabrynthServant) > 0 + && !CheckWhetherNegated(true, true, CardType.Monster) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + chainSummoningIdList.Add(CardId.AriannaTheLabrynthServant); + } + else if (Bot.HasInGraveyard(CardId.BigWelcomeLabrynth) && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) + && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasRace(CardRace.Fiend) && card.Level >= 8) + && CheckRemainInDeck(CardId.LadyLabrynthOfTheSilverCastle) > 0 && !chainSummoningIdList.Contains(CardId.LadyLabrynthOfTheSilverCastle)) + { + chainSummoningIdList.Add(CardId.LadyLabrynthOfTheSilverCastle); + } + else { + int selectId = 0; + List checkIdList = new List{CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock}; + foreach (int checkId in checkIdList) + { + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(checkId) && CheckRemainInDeck(checkId) > 0 + && !chainSummoningIdList.Contains(checkId)) + { + selectId = checkId; + break; + } + } + List fullCheckIdList = new List{ + CardId.LadyLabrynthOfTheSilverCastle, CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock, + CardId.AriasTheLabrynthButler, CardId.ArianeTheLabrynthServant, CardId.AriannaTheLabrynthServant + }; + if (selectId == 0) + { + foreach (int checkId in fullCheckIdList) + { + if (CheckRemainInDeck(checkId) > 0 && !chainSummoningIdList.Contains(checkId)) + { + selectId = checkId; + break; + } + } + } + if (selectId > 0) { + chainSummoningIdList.Add(selectId); + } + } + ResetCooclockEffect(onlyCheck); + + activatedCardIdList.Add(Card.Id); + } + return true; + } + + } + + return false; + } + + public bool TransactionRollbackActivate() + { + if (Card.Location == CardLocation.Grave) + { + SortedList> checkList = new SortedList> { + {CardId.BigWelcomeLabrynth, BigWelcomeLabrynthActivateCopy}, + {_CardId.DimensionalBarrier, DimensionalBarrierActivate}, + {CardId.EscapeOfTheUnchained, EscapeOfTheUnchainedActivateCopy}, + {_CardId.InfiniteImpermanence, InfiniteImpermanenceActivateCopy}, + {CardId.WelcomeLabrynth, WelcomeLabrynthActivateCopy}, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonActivate} + }; + foreach (KeyValuePair> pair in checkList) + { + if (Bot.HasInGraveyard(pair.Key) && pair.Value()) + { + rollbackCopyCardId = pair.Key; + AI.SelectCard(pair.Key); + return true; + } + } + } + if (Card.Location == CardLocation.SpellZone) + { + if (CheckWhetherNegated()) return false; + SortedList> checkList = new SortedList> { + {CardId.WelcomeLabrynth, WelcomeLabrynthActivateCopy}, + {_CardId.CompulsoryEvacuationDevice, DefaultCompulsoryEvacuationDevice }, + {CardId.DestructiveDarumaKarmaCannon, DestructiveDarumaKarmaCannonActivate}, + {_CardId.DimensionalBarrier, DimensionalBarrierActivate}, + {CardId.EscapeOfTheUnchained, EscapeOfTheUnchainedActivateCopy}, + {_CardId.InfiniteImpermanence, InfiniteImpermanenceActivateCopy}, + {_CardId.BreakthroughSkill, DefaultBreakthroughSkill}, + {CardId.BigWelcomeLabrynth, BigWelcomeLabrynthActivateCopy} + }; + foreach (KeyValuePair> pair in checkList) + { + if (Enemy.HasInGraveyard(pair.Key) && pair.Value()) + { + rollbackCopyCardId = pair.Key; + AI.SelectCard(pair.Key); + ResetCooclockEffect(false); + return true; + } + } + } + return false; + } + + public bool InfiniteImpermanenceActivate() + { + return InfiniteImpermanenceActivateCheck(false); + } + public bool InfiniteImpermanenceActivateCopy() + { + return InfiniteImpermanenceActivateCheck(true); + } + public bool InfiniteImpermanenceSetCheck() + { + return InfiniteImpermanenceActivateCheck(true, true); + } + public bool InfiniteImpermanenceActivateCheck(bool onlyCheck = false, bool noSelect = false) + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int thisSeq = -1; + int thatSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) thisSeq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) thatSeq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) thatSeq = i; + } + if ( (thisSeq * thatSeq >= 0 && thisSeq + thatSeq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true, selfType: CardType.Trap); + if (!noSelect) + { + if (target != null) + { + AI.SelectCard(target); + } else { + AI.SelectCard(Enemy.GetMonsters()); + } + } + if (!onlyCheck) + { + infiniteImpermanenceList.Add(thatSeq); + if (cooclockAffected && setTrapThisTurn.Contains(Card)) + { + cooclockAffected = false; + setTrapThisTurn.Remove(Card); + } + } + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Trap); + if (shouldNegateList.Count() > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateMonsterList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone && !onlyCheck) + { + for (int i = 0; i < 5; ++ i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (!noSelect) AI.SelectCard(negateTarget); + currentDestroyCardList.Add(negateTarget); + ResetCooclockEffect(onlyCheck); + return true; + } + + return false; + } + + public bool DestructiveDarumaKarmaCannonActivate() + { + return DestructiveDarumaKarmaCannonActivateCheck(false); + } + public bool DestructiveDarumaKarmaCannonSetCheck() + { + return DestructiveDarumaKarmaCannonActivateCheck(true); + } + public bool DestructiveDarumaKarmaCannonActivateCheck(bool noSelect = false) + { + bool becomeTarget = Card.Location == CardLocation.SpellZone && DefaultOnBecomeTarget(); + bool activateFlag = becomeTarget && Util.IsOneEnemyBetter(true); + bool canTriggerLovely = + (!activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && Bot.GetSpells().Any(card => card.IsFacedown() && card.IsCode(CardId.BigWelcomeLabrynth) && (!cooclockAffected || !setTrapThisTurn.Contains(card))) + || Util.ChainContainsCard(CardId.BigWelcomeLabrynth)) + && (Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || (CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle) && Bot.GetMonsterCount() > 0)) + && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + + activateFlag |= Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && !Util.ChainContainPlayer(0) && !canTriggerLovely; + activateFlag |= Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2 && Bot.GetMonsterCount() == 0 && Enemy.GetMonsterCount() > 0; + activateFlag |= Enemy.HasInMonstersZone(CardId.AccesscodeTalker, true) && !Util.ChainContainPlayer(0); + int linkCount = 0; + foreach (ClientCard monster in Enemy.GetMonsters()) + { + if (monster.IsFacedown()) continue; + if (!monster.HasType(CardType.Link)) linkCount++; + else linkCount += monster.LinkCount; + } + activateFlag |= linkCount >= 6 && Util.IsOneEnemyBetter(true); + if (activateFlag) + { + if (!noSelect) + { + currentDestroyCardList.AddRange(Enemy.GetMonsters()); + escapeTargetList.AddRange(Bot.GetMonsters()); + } + return true; + } + + return false; + } + + public bool EscapeOfTheUnchainedActivate() + { + return EscapeOfTheUnchainedActivateCheck(false); + } + public bool EscapeOfTheUnchainedActivateCopy() + { + return EscapeOfTheUnchainedActivateCheck(true); + } + public bool EscapeOfTheUnchainedActivateCheck(bool onlyCheck = false, bool noSelect = false) + { + if (Card.Location == CardLocation.SpellZone || onlyCheck) + { + // select targeted unchained + ClientCard selfTarget = Bot.GetMonsters().FirstOrDefault(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained) + && Duel.ChainTargets.Contains(card) && !escapeTargetList.Contains(card)); + if (selfTarget == null) + { + selfTarget = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained)) + .OrderBy(card => card.Attack).FirstOrDefault(); + } + if (selfTarget == null) return false; + // destroy danger card + List dangerList = GetProblematicEnemyCardList(true, selfType: CardType.Trap); + if (dangerList.Count() > 0 && Duel.LastChainPlayer != 0) + { + if (!noSelect) + { + AI.SelectCard(selfTarget); + AI.SelectNextCard(dangerList); + escapeTargetList.Add(selfTarget); + currentDestroyCardList.Add(dangerList[0]); + activatedCardIdList.Add(Card.Id); + } + return true; + } + + // best monster + int botBestPower = Util.GetBestPower(Bot); + if (Duel.Player == 1 && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + List dangerMonsters = Enemy.GetMonsters().Where(card => card.IsFaceup() && card.Attack >= botBestPower + && !currentDestroyCardList.Contains(card) && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + .OrderByDescending(card => card.Attack).ToList(); + if (dangerMonsters.Count() > 0) + { + if (!noSelect) + { + AI.SelectCard(selfTarget); + AI.SelectNextCard(dangerMonsters); + escapeTargetList.Add(selfTarget); + currentDestroyCardList.Add(dangerMonsters[0]); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + + // end phase + bool activateFlag = Duel.Player == 1 && Duel.Phase > DuelPhase.Main2 + && ((Bot.HasInGraveyard(CardId.UnchainedSoulLordOfYama) && !activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama + 1)) + || (Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1))); + activateFlag |= DefaultOnBecomeTarget() && Card.Location == CardLocation.SpellZone && !Util.ChainContainsCard(_CardId.EvenlyMatched); + if (activateFlag) + { + List destroyTarget = GetNormalEnemyTargetList(true, true, CardType.Trap); + if (destroyTarget.Count() > 0) + { + if (!noSelect) + { + AI.SelectCard(selfTarget); + AI.SelectNextCard(destroyTarget); + escapeTargetList.Add(selfTarget); + currentDestroyCardList.Add(destroyTarget[0]); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + + } else { + if (!noSelect) + { + AI.SelectCard(CardId.UnchainedSoulOfSharvara); + activatedCardIdList.Add(Card.Id + 1); + } + return true; + } + + return false; + } + + public bool DimensionalBarrierActivate() + { + if (Duel.Player == 0 && Duel.Turn == 1) return false; + if (CheckWhetherNegated()) return false; + Dictionary> checkDict = new Dictionary> + { + {HintMsg.RITUAL, DimensionalBarrierForRitual}, + {HintMsg.FUSION, DimensionalBarrierForFusion}, + {HintMsg.SYNCHRO, DimensionalBarrierForSynchro}, + {HintMsg.XYZ, DimensionalBarrierForXyz}, + {HintMsg.PENDULUM, DimensionalBarrierForPendulum}, + }; + foreach (KeyValuePair> checkType in checkDict) + { + if (dimensionalBarrierAnnouced.Contains(checkType.Key)) continue; + if (checkType.Value()) { + ResetCooclockEffect(false); + return true; + } + } + + return DefaultOnBecomeTarget(); + } + public bool DimensionalBarrierForRitual() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() && chainCard.HasType(CardType.Ritual) + && (chainCard.HasType(CardType.Spell) || (chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)))) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + + return false; + } + public bool DimensionalBarrierForFusion() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() && (chainCard.IsFusionSpell() + || (chainCard.HasType(CardType.Fusion) && chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)))) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + + return false; + } + public bool DimensionalBarrierForSynchro() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() + && chainCard.HasType(CardType.Synchro) && chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + if (Duel.Player == 1 && !Util.ChainContainsCard(CardId.DestructiveDarumaKarmaCannon) && Enemy.ExtraDeck.Count() > 0) + { + bool tunerCheck = false; + bool nontunerCheck = false; + foreach (ClientCard monster in Enemy.GetMonsters()) + { + if (monster.IsFacedown() || monster.HasType(CardType.Xyz | CardType.Link)) continue; + if (monster.HasType(CardType.Tuner)) tunerCheck = true; + else nontunerCheck = true; + } + if (tunerCheck && nontunerCheck) return true; + } + + return false; + } + public bool DimensionalBarrierForXyz() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() + && chainCard.HasType(CardType.Xyz) && chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + if (Duel.Player == 1 && !Util.ChainContainsCard(CardId.DestructiveDarumaKarmaCannon) && Enemy.ExtraDeck.Count() > 0) + { + List existsLevel = new List(6); + foreach (ClientCard monster in Enemy.GetMonsters()) + { + if (monster.IsFacedown()) continue; + if (monster.IsOneForXyz()) return true; + if (monster.HasType(CardType.Xyz | CardType.Token)) continue; + int level = monster.Level; + if (level != 2 && monster.HasType(CardType.Link)) continue; + if (existsLevel.Contains(level)) return true; + existsLevel.Add(level); + } + } + + return false; + } + public bool DimensionalBarrierForPendulum() + { + foreach (ClientCard chainCard in Duel.CurrentChain) + { + if (chainCard != null && chainCard.Controller == 1 && !chainCard.IsDisabled() + && chainCard.HasType(CardType.Pendulum) && chainCard.Location == CardLocation.MonsterZone && !currentNegateMonsterList.Contains(chainCard)) + { + if (dimensionBarrierAnnouncing) currentNegateMonsterList.Add(chainCard); + return true; + } + } + + ClientCard l = Enemy.SpellZone[6]; + ClientCard r = Enemy.SpellZone[7]; + if (l != null && r != null && l.LScale != r.RScale) return true; + + return false; + } + + public bool BigWelcomeLabrynthActivate() + { + return BigWelcomeLabrynthActivateCheck(false); + } + public bool BigWelcomeLabrynthBecomeTargetActivate() + { + if (DefaultOnBecomeTarget()) return BigWelcomeLabrynthActivateCheck(false); + return false; + } + public bool BigWelcomeLabrynthActivateCopy() + { + return BigWelcomeLabrynthActivateCheck(true); + } + public bool BigWelcomeLabrynthSetCheck() + { + return !CheckShouldNoMoreSpSummon() && BigWelcomeLabrynthActivateCheck(true, true); + } + public bool BigWelcomeLabrynthActivateCheck(bool onlyCheck = false, bool noSelect = false) + { + if (CheckWhetherNegated()) return false; + if (Card.Location != CardLocation.SpellZone && !onlyCheck) return false; + if (GetEmptyMainMonsterZoneCount() == 0) return false; + bool activateTimingFlag = Duel.Phase > DuelPhase.Main2 || (Card.IsCode(CardId.AriasTheLabrynthButler) && (CurrentTiming & hintTimingMainEnd) > 0); + + bool needDestroyFlag = GetProblematicEnemyCardList(false).Count() > 0; + needDestroyFlag |= activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && activateTimingFlag; + needDestroyFlag |= Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && Duel.LastChainPlayer != 0; + needDestroyFlag |= Duel.Turn == 1 && Duel.Player == 0 && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + needDestroyFlag |= Duel.Turn == 1 && Enemy.GetMonsterCount() == 0 && Enemy.GetSpellCount() == 0 && Enemy.Hand.Count > 0 + && (CurrentTiming & hintTimingMainEnd) > 0; + + // do not activate when welcome is activating + bool haveEnemyChain = false; + bool haveWelcome = false; + foreach (ClientCard chain in Duel.CurrentChain) + { + if (chain != null) + { + if (chain.Controller == 1) + { + haveEnemyChain = true; + break; + } + if (chain.IsCode(CardId.WelcomeLabrynth, CardId.TransactionRollback, CardId.LadyLabrynthOfTheSilverCastle)) haveWelcome = true; + } + } + if (haveWelcome && !haveEnemyChain) return false; + + // escape target + List targetList = Bot.GetMonsters(); + foreach (ClientCard target in targetList) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target) + && !(target.IsCode(CardId.UnchainedSoulOfRage, CardId.UnchainedSoulOfAnguish) && Duel.CurrentChain.Contains(target))) + { + Logger.DebugWriteLine("[BigWelcome]escape target"); + if (!noSelect) + { + bigwelcomeEscaseTarget = target; + escapeTargetList.Add(target); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + + if (Bot.GetMonsterCount() > 0) + { + bool flag1 = needDestroyFlag && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1) && (Util.ChainContainPlayer(1) || Duel.LastChainPlayer != 0); + bool flag2 = DefaultOnBecomeTarget(); + bool flag3 = Duel.Player == 1 && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && activateTimingFlag; + bool flag4 = Duel.Player == 0 && Duel.LastChainPlayer != 0 && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth); + Logger.DebugWriteLine("[BigWelcome count>0]flag: "+ flag1 + " " + flag2 + " " + flag3 + " " + flag4); + needDestroyFlag |= flag3; + if (flag1 || flag2 || flag3 || flag4) + { + bool spSummonLovely = CheckBigWelcomeCanSpSummon(CardId.LovelyLabrynthOfTheSilverCastle) && !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1); + bool haveLovely = Bot.GetMonsters().Any(card => card.IsFaceup() && card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)); + if (!noSelect) + { + activatedCardIdList.Add(Card.Id); + } + ResetCooclockEffect(onlyCheck); + return true; + } + } + else { + bool activateFlag = DefaultOnBecomeTarget(); + activateFlag |= Duel.Player == 1 && !activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && activateTimingFlag; + activateFlag |= Duel.Player == 0 && !summoned && !Bot.HasInHand(CardId.AriannaTheLabrynthServant) && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) + && !(Duel.Phase < DuelPhase.Main1 && Bot.HasInHand(CardId.PotOfExtravagance) && Bot.ExtraDeck.Count() >= 3) + && !(Duel.CurrentChain.Any(card => card.IsCode(CardId.PotOfExtravagance) && card.Controller == 0)); + if (activateFlag && !noSelect) + { + activatedCardIdList.Add(Card.Id); + ResetCooclockEffect(onlyCheck); + return true; + } + } + + return false; + } + + public bool BigWelcomeLabrynthGraveActivate() + { + if (Card.Location == CardLocation.Grave) + { + // bounce enemy + if (Bot.GetMonsters().Any(card => card.Level >= 8 && card.IsFaceup() && card.HasRace(CardRace.Fiend) && !card.HasType(CardType.Xyz | CardType.Link))) + { + // danger monster + ClientCard problemCard = GetProblematicEnemyMonster(-1, true, true, CardType.Trap); + if (problemCard != null) + { + AI.SelectCard(problemCard); + currentDestroyCardList.Add(problemCard); + activatedCardIdList.Add(Card.Id); + return true; + } + // problem spell + if (!Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) || + activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle) && activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle + 1)) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && c.IsFaceup() + && c.IsFloodgate() + && !c.IsShouldNotBeTarget() && (c.HasType(CardType.Trap) || Duel.Player == 0)).ToList(); + + problemEnemySpellList.AddRange(Enemy.SpellZone.Where(c => c?.Data != null && c.IsFaceup() && !problemEnemySpellList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) + && !c.IsShouldNotBeTarget() && (c.HasType(CardType.Trap) || Duel.Player == 0)).ToList()); + + if (problemEnemySpellList.Count() > 0) + { + AI.SelectCard(problemEnemySpellList); + currentDestroyCardList.Add(problemEnemySpellList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + // best monster + int botBestPower = Util.GetBestPower(Bot); + if (Duel.Player == 1 && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + List dangerMonsters = Enemy.GetMonsters().Where(card => card.IsFaceup() && card.Attack >= botBestPower + && !currentDestroyCardList.Contains(card) && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + .OrderByDescending(card => card.Attack).ToList(); + if (dangerMonsters.Count() > 0) + { + AI.SelectCard(dangerMonsters); + currentDestroyCardList.Add(dangerMonsters[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + // end phase + if (Duel.Phase > DuelPhase.Main2) + { + List returnList = GetNormalEnemyTargetList(true, true, CardType.Trap); + if (returnList.Count() > 0) + { + AI.SelectCard(returnList); + currentDestroyCardList.Add(returnList[0]); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + // escape target + List targetList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasRace(CardRace.Fiend)).ToList(); + foreach (ClientCard target in targetList) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target) + && !(target.IsCode(CardId.UnchainedSoulOfRage, CardId.UnchainedSoulOfAnguish) && Duel.CurrentChain.Contains(target))) + { + AI.SelectCard(target); + escapeTargetList.Add(target); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // bounce arianna + if (Duel.Player == 0 && Duel.Phase <= DuelPhase.Main2 && !summoned && !Bot.HasInHand(CardId.AriannaTheLabrynthServant) + && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant) && !chainSummoningIdList.Contains(CardId.AriannaTheLabrynthServant)) + { + ClientCard target = targetList.FirstOrDefault(card => card.IsCode(CardId.AriannaTheLabrynthServant)); + if (target != null) + { + AI.SelectCard(target); + escapeTargetList.Add(target); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + // trigger furniture/welcome + List checkFurnitureList = new List(Bot.Hand); + checkFurnitureList.AddRange(Bot.GetMonsters()); + if ((CheckRemainInDeck(CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth) == 0 + || !checkFurnitureList.Any(card => card.IsCode(CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie))) + && Duel.LastChainPlayer < 0 && Duel.Player == 0 && !Bot.HasInMonstersZone(CardId.LovelyLabrynthOfTheSilverCastle, true, false, true) + && !(cooclockAffected && Bot.HasInHandOrInSpellZone(CardId.BigWelcomeLabrynth))) + { + int checkCount = 0; + List checkIdList = new List { CardId.LabrynthChandraglier, CardId.LabrynthStovieTorbie, CardId.WelcomeLabrynth }; + foreach (int checkId in checkIdList) + { + if (Bot.HasInGraveyard(checkId) && !activatedCardIdList.Contains(checkId + 1)) checkCount++; + } + if (checkCount > 0) + { + ClientCard target = targetList.FirstOrDefault(card => card.IsFaceup() && card.HasRace(CardRace.Fiend) && + ((card.Level <= 4 && !card.HasType(CardType.Link | CardType.Xyz | CardType.Synchro)) || card.IsCode(CardId.LadyLabrynthOfTheSilverCastle))); + if (target != null) + { + AI.SelectCard(target); + escapeTargetList.Add(target); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + } + + return false; + } + + public bool ChaosAngelSpSummonWith2Monster() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + + List level2MonsterList = new List(); + List level4MonsterList = new List(); + List level6MonsterList = new List(); + List level8MonsterList = new List(); + foreach (ClientCard monster in Bot.GetMonsters()) + { + if (monster.IsFaceup() && !monster.HasType(CardType.Xyz | CardType.Link) && monster.HasAttribute(CardAttribute.Light | CardAttribute.Dark)) + { + if (monster.Level == 2) level2MonsterList.Add(monster); + if (monster.Level == 4) level4MonsterList.Add(monster); + if (monster.Level == 6) level6MonsterList.Add(monster); + if (monster.Level == 8) level8MonsterList.Add(monster); + } + } + level2MonsterList.Sort(CompareUsableAttack); + level4MonsterList.Sort(CompareUsableAttack); + level6MonsterList.Sort(CompareUsableAttack); + level8MonsterList.Sort(CompareUsableAttack); + bool checkFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); + ClientCard BestEnemyMonster = Util.GetBestEnemyMonster(); + if (BestEnemyMonster != null && Util.GetBestPower(Bot, true) <= Util.GetBestPower(Enemy)) + { + checkFlag |= Util.GetBestPower(Enemy) <= 3500; + checkFlag |= !BestEnemyMonster.IsShouldNotBeTarget() && !BestEnemyMonster.IsShouldNotBeMonsterTarget(); + } + // 4+6 + if (level4MonsterList.Count() > 0 && level6MonsterList.Count() > 0) + { + List materials = new List{level4MonsterList[0], level6MonsterList[0]}; + bool summonFlag = checkFlag; + if (Enemy.GetMonsterCount() == 0 && Duel.Phase < DuelPhase.Main2) + summonFlag |= GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(materials) + 3500 >= Enemy.LifePoints; + if (summonFlag) + { + AI.SelectMaterials(materials); + return true; + } + } + // 2+8 + if (level2MonsterList.Count() > 0 && level8MonsterList.Count() > 0) + { + foreach (ClientCard level2 in level2MonsterList) + { + foreach (ClientCard level8 in level8MonsterList) + { + List materials = new List{level2, level8}; + if (checkFlag && !(level8.IsCode(CardId.LovelyLabrynthOfTheSilverCastle) && !level8.IsDisabled() && Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth))) + { + AI.SelectMaterials(materials); + return true; + } + if (Enemy.GetMonsterCount() == 0 && GetMaterialAttack(materials) < 3500 && Duel.Phase < DuelPhase.Main2) + { + if (GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(materials) + 3500 >= Enemy.LifePoints) + { + AI.SelectMaterials(materials); + return true; + } + } + } + } + } + return false; + } + public bool ChaosAngelSpSummonWith3Monster() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + + List level2MonsterList = new List(); + List level4MonsterList = new List(); + foreach (ClientCard monster in Bot.GetMonsters()) + { + if (monster.IsFaceup() && !monster.HasType(CardType.Xyz | CardType.Link) && monster.HasAttribute(CardAttribute.Light | CardAttribute.Dark)) + { + if (monster.Level == 2) level2MonsterList.Add(monster); + if (monster.Level == 4) level4MonsterList.Add(monster); + } + } + level2MonsterList.Sort(CompareUsableAttack); + level4MonsterList.Sort(CompareUsableAttack); + bool checkFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); + ClientCard BestEnemyMonster = Util.GetBestEnemyMonster(); + if (BestEnemyMonster != null && Util.GetBestPower(Bot, true) <= Util.GetBestPower(Enemy)) + { + checkFlag |= Util.GetBestPower(Enemy) <= 3500; + checkFlag |= !BestEnemyMonster.IsShouldNotBeTarget() && !BestEnemyMonster.IsShouldNotBeMonsterTarget(); + } + // 2+4+4 + if (level2MonsterList.Count() >= 1 && level4MonsterList.Count() >= 2) + { + foreach (ClientCard level2 in level2MonsterList) + { + for (int level4Index1 = 0; level4Index1 < level4MonsterList.Count() - 1; ++level4Index1) + { + ClientCard level41 = level4MonsterList[level4Index1]; + for (int level4Index2 = level4Index1 + 1; level4Index2 < level4MonsterList.Count(); ++level4Index2) + { + ClientCard level42 = level4MonsterList[level4Index2]; + List materials = new List { level2, level41, level42 }; + bool summonFlag = checkFlag; + if (Enemy.GetMonsterCount() == 0 && Duel.Phase < DuelPhase.Main2) + summonFlag |= GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(materials) + 3500 >= Enemy.LifePoints; + if (summonFlag) + { + AI.SelectMaterials(materials); + return true; + } + } + } + } + } + return false; + } + public bool ChaosAngelActivate() + { + List targetList = GetNormalEnemyTargetList(true, true, CardType.Monster); + if (targetList.Count() > 0) + { + AI.SelectCard(targetList); + currentDestroyCardList.Add(targetList[0]); + return true; + } + + return false; + } + + public bool SummonForTYPHONCheck() + { + if (!Bot.HasInExtra(CardId.SuperStarslayerTYPHON) || Bot.GetMonsters().Any(card => card.IsFaceup())) return false; + if (enemySpSummonFromExLastTurn < 2 && enemySpSummonFromExThisTurn < 2) return false; + if (Card.Level > 4) return false; + + int currentAttack = 0; + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(Card.Id); + if (cardData != null) currentAttack = cardData.Attack; + List summonList = Bot.Hand.Where(card => card.IsMonster() && card.Level <= 4).ToList(); + foreach (ClientCard checkCard in summonList) + { + cardData = YGOSharp.OCGWrapper.NamedCard.Get(checkCard.Id); + if (cardData != null && cardData.Attack < currentAttack) return false; + } + + return true; + } + public bool SuperStarslayerTYPHONSpSummon() + { + ClientCard material = Bot.GetMonsters().Where(card => card.IsFaceup()).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (material == null || (material.Attack >= 2900 && material.Owner == 0)) return false; + + bool checkFlag = GetProblematicEnemyMonster(material.Attack) != null; + checkFlag |= material.Level <= 4; + checkFlag &= !(material.HasType(CardType.Link) && Duel.Phase >= DuelPhase.Main2); + if (checkFlag) + { + Logger.DebugWriteLine("*** TYPHON select: " + material.Name ?? "UnkonwCard"); + AI.SelectMaterials(material); + return true; + } + + return false; + } + public bool SuperStarslayerTYPHONActivate() + { + if (CheckWhetherNegated()) return false; + List targetList = new List(); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsFloodgate() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsMonsterDangerous() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.IsMonsterInvincible() && c.IsFaceup()).OrderByDescending(card => card.Attack)); + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.GetDefensePower() >= Util.GetBestAttack(Bot) && c.IsAttack()).OrderByDescending(card => card.Attack)); + if (Duel.Phase >= DuelPhase.Main2) + targetList.AddRange(Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c) && + c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link | CardType.SpSummon)).OrderByDescending(card => card.Attack)); + + if (targetList.Count() > 0) + { + targetList.AddRange(Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).OrderByDescending(card => card.Attack)); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && !targetList.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Bot.GetMonsters().Where(card => card.IsFacedown() && !targetList.Contains(card)).ToList())); + targetList.AddRange(Bot.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).OrderBy(card => card.Attack)); + AI.SelectCard(Card.Overlays); + Logger.DebugWriteLine("TYPHON first target: " + targetList[0]?.Name ?? "UNKNOWN"); + AI.SelectNextCard(targetList); + return true; + } + + return false; + } + + public bool UnchainedAbominationSpSummon() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + if (Enemy.GetMonsterCount() > 0 && Bot.HasInMonstersZone(CardId.UnchainedSoulOfAnguish) && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish)) return false; + List> usableMaterialMultiList = new List>(); + // anguish + 1 + ClientCard anguish = Bot.GetMonsters().FirstOrDefault(card => card.IsCode(CardId.UnchainedSoulOfAnguish)); + if (anguish != null) + { + List materials = GetCanBeUsedForLinkMaterial(true, card => card == anguish); + if (materials.Count() > 0) + { + usableMaterialMultiList.Add(new List { anguish, materials[0] }); + } + } + // link2 + 1 + 1 or link2 + link2 + List link2List = Bot.GetMonsters().Where(card => card.HasType(CardType.Link) && card.LinkCount == 2 + && !(card.IsCode(CardId.MuckrakerFromTheUnderworld) && summonThisTurn.Contains(card))).OrderBy(card => card.Attack).ToList(); + if (link2List.Count() > 0) + { + ClientCard link2Material = null; + ClientCard littleKnight = link2List.FirstOrDefault(card => card.Sequence >= 5 && card.IsCode(CardId.SPLittleKnight)); + if (littleKnight != null) link2Material = littleKnight; + else link2Material = link2List[0]; + if (link2List.Count() >= 2) + { + usableMaterialMultiList.Add(new List { link2Material, link2List.FirstOrDefault(card => card != link2Material) }); + } + List remainList = GetCanBeUsedForLinkMaterial(false, card => card != link2Material && !(card.HasType(CardType.Link) && card.LinkMarker > 2)); + if (remainList.Count() >= 2) + { + usableMaterialMultiList.Add(new List { link2Material, remainList[0], remainList[1] }); + } + } + + // check material list + foreach (List currMaterials in usableMaterialMultiList) + { + bool summonFlag = CheckCanDirectAttack() && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(currMaterials) + 3000 >= Enemy.LifePoints; + summonFlag |= GetProblematicEnemyMonster(0) != null && GetProblematicEnemyMonster(3000) == null; + + if (summonFlag) + { + AI.SelectMaterials(currMaterials); + return true; + } + } + + return false; + } + public bool UnchainedAbominationActivate() + { + if (CheckWhetherNegated()) return false; + List targetList = GetNormalEnemyTargetList(true, true, CardType.Monster); + if (targetList.Count() == 0) return false; + int logDesc = (int)ActivateDescription; + if (logDesc >= Util.GetStringId(CardId.UnchainedAbomination, 0)) + { + logDesc = Util.GetStringId(CardId.UnchainedAbomination, 0) - 10; + } + Logger.DebugWriteLine("[UnchainedAbomination]desc: " + logDesc + ", timing = " + CurrentTiming); + if (ActivateDescription == Util.GetStringId(CardId.UnchainedAbomination, 0)) activatedCardIdList.Add(Card.Id); + if (ActivateDescription == Util.GetStringId(CardId.UnchainedAbomination, 1) || ActivateDescription == -1) activatedCardIdList.Add(Card.Id + 1); + if (ActivateDescription == Util.GetStringId(CardId.UnchainedAbomination, 2)) activatedCardIdList.Add(Card.Id + 2); + AI.SelectCard(targetList); + + return true; + } + + public bool UnchainedSoulOfAnguishSpSummon() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + + ClientCard unchainedNonLink = Bot.GetMonsters().FirstOrDefault(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained) && !card.HasType(CardType.Link)); + ClientCard unchainedLink2 = Bot.GetMonsters().FirstOrDefault(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained) && card.HasType(CardType.Link) && card.LinkCount == 2); + Logger.DebugWriteLine("[Anguish summon] unchainedNonLink = " + unchainedNonLink?.Name + ", unchainedLink2 = " + unchainedLink2?.Name); + if (unchainedNonLink == null && unchainedLink2 == null) return false; + int needMonsterCount = 2; + if (unchainedLink2 != null) needMonsterCount = 1; + if (needMonsterCount == 2 && Bot.HasInExtra(CardId.UnchainedSoulLordOfYama)) return false; + bool needAnguish = !Bot.HasInMonstersZone(CardId.UnchainedSoulOfAnguish) && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish) + && Enemy.GetMonsters().Any(card => card.IsFaceup()); + if (needAnguish) + { + needAnguish = Bot.HasInExtra(CardId.UnchainedSoulOfRage); + needAnguish |= Bot.HasInExtra(CardId.UnchainedAbomination); + needAnguish |= Bot.HasInExtra(CardId.SPLittleKnight) && banSpSummonExceptFiendCount == 0; + } + Logger.DebugWriteLine("[Anguish summon] needAnguish = " + needAnguish.ToString()); + + // check material + if (needMonsterCount == 1) + { + List materialList = GetCanBeUsedForLinkMaterial(needAnguish, card => card == unchainedLink2); + Logger.DebugWriteLine("[Anguish summon 1] material count = " + materialList.Count().ToString()); + if (materialList.Count() == 0) return false; + List selectMaterials = new List{ unchainedLink2, materialList[0]}; + bool summonFlag = needAnguish; + summonFlag |= CheckCanDirectAttack() && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(selectMaterials) + 2400 >= Enemy.LifePoints; + Logger.DebugWriteLine("[Anguish summon 1] summon flag " + summonFlag.ToString()); + if (summonFlag) + { + AI.SelectMaterials(selectMaterials); + return true; + } + } + if (needMonsterCount == 2) + { + List materialList = GetCanBeUsedForLinkMaterial(needAnguish, card => card == unchainedNonLink); + Logger.DebugWriteLine("[Anguish summon 2] material count = " + materialList.Count().ToString()); + if (materialList.Count() >= 2) + { + List selectMaterials = new List { unchainedNonLink, materialList[0], materialList[1] }; + if (needAnguish || GetMaterialAttack(selectMaterials) < 2400) + { + AI.SelectMaterials(selectMaterials); + return true; + } + } + } + + return false; + } + public bool UnchainedSoulOfAnguishActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated()) return false; + List targetList = Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeMonsterTarget()).OrderByDescending(card => card.Attack).ToList(); + if (targetList.Count() > 0) + { + currentDestroyCardList.Add(targetList[0]); + int summonId = 0; + if (Bot.HasInExtra(CardId.UnchainedAbomination) && GetProblematicEnemyMonster(3000, ignoreCurrentDestroy:true) == null) + summonId = CardId.UnchainedAbomination; + else if (banSpSummonExceptFiendCount == 0 && Bot.HasInExtra(CardId.SPLittleKnight) && GetProblematicEnemyCardList(true, false, CardType.Monster).Count() > 0) + summonId = CardId.SPLittleKnight; + else if (Bot.HasInExtra(CardId.UnchainedSoulOfRage)) summonId = CardId.UnchainedSoulOfRage; + if (summonId > 0) + { + List materialList = new List(targetList){Card}; + Logger.DebugWriteLine("*** Anguish select: " + summonId.ToString()); + + AI.SelectCard(targetList); + AI.SelectNextCard(summonId); + AI.SelectMaterials(materialList); + activatedCardIdList.Add(Card.Id); + } + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + return UnchainRecycleActivate(); + } + + return false; + } + + public bool UnchainedSoulLordOfYamaSpSummon() + { + if (CheckShouldNoMoreSpSummon(false)) return false; + if (Bot.HasInMonstersZone(CardId.UnchainedSoulLordOfYama) || activatedCardIdList.Contains(CardId.UnchainedSoulLordOfYama)) return false; + + bool need3Monster = Bot.HasInExtra(CardId.UnchainedSoulOfAnguish) && !Bot.HasInMonstersZone(CardId.UnchainedSoulOfAnguish) + && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish) && GetProblematicEnemyMonster(canBeTarget:true, selfType: CardType.Monster) != null; + need3Monster |= CheckAtAdvantage() && Duel.Phase == DuelPhase.Main2 + && Bot.HasInExtra(CardId.UnchainedSoulOfRage) && !Bot.HasInMonstersZone(CardId.UnchainedSoulOfRage); + bool haveUnchainSoul = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained)); + if (need3Monster) + { + need3Monster = Bot.HasInExtra(CardId.UnchainedSoulOfRage); + need3Monster |= Bot.HasInExtra(CardId.UnchainedAbomination); + need3Monster |= Bot.HasInExtra(CardId.SPLittleKnight) && banSpSummonExceptFiendCount == 0; + } + // check material + List materialList = GetCanBeUsedForLinkMaterial(need3Monster, + card => !card.HasRace(CardRace.Fiend) || (card.HasType(CardType.Link) && card.HasSetcode(SetcodeUnchained))); + Logger.DebugWriteLine("[Yama Summon]need3Monster = " + need3Monster.ToString() + ", material count = " + materialList.Count()); + for (int index1 = 0; index1 < materialList.Count() - 1; ++ index1) + { + ClientCard material1 = materialList[index1]; + for (int index2 = index1 + 1; index2 < materialList.Count(); ++ index2) + { + ClientCard material2 = materialList[index2]; + List selectMaterials = new List{material1, material2}; + if (need3Monster && materialList.Count() == 2 && (activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara) || Bot.GetSpells().Count() == 0)) + { + // only for attack + if (GetProblematicEnemyMonster() != null || !CheckCanDirectAttack() || GetMaterialAttack(selectMaterials) >= 2000) return false; + } + bool summonFlag = need3Monster; + summonFlag |= Enemy.GetMonsterCount() == 0 && GetMaterialAttack(selectMaterials) < 2000; + summonFlag |= CheckAtAdvantage() && !haveUnchainSoul; + if (summonFlag) + { + AI.SelectMaterials(selectMaterials); + return true; + } + } + } + + return false; + } + public bool UnchainedSoulLordOfYamaActivate() + { + if (Card.Location == CardLocation.MonsterZone && (ActivateDescription == Util.GetStringId(CardId.UnchainedSoulLordOfYama, 0) || ActivateDescription == -1)) + { + // search + if (CheckWhetherNegated()) return false; + AI.SelectCard(CardId.UnchainedSoulOfSharvara, CardId.UnchainedAbomination, CardId.UnchainedSoulOfAnguish, CardId.UnchainedSoulOfRage); + activatedCardIdList.Add(Card.Id); + return true; + } + else if (Card.Location == CardLocation.Grave) + { + // spsummon & destroy + ClientCard chaosAngel = null; + ClientCard abomination = null; + ClientCard lady = null; + ClientCard lovely = null; + ClientCard arianna = null; + ClientCard bestAttack = null; + ClientCard rage = null; + foreach (ClientCard grave in Bot.Graveyard) + { + if (grave.IsCode(CardId.ChaosAngel) && grave.ProcCompleted != 0 && !dimensionalBarrierAnnouced.Contains(HintMsg.SYNCHRO)) chaosAngel = grave; + if (grave.IsCode(CardId.UnchainedSoulOfRage) && grave.ProcCompleted != 0) rage = grave; + if (grave.IsCode(CardId.UnchainedAbomination) && grave.ProcCompleted != 0) abomination = grave; + if (grave.IsCode(CardId.LadyLabrynthOfTheSilverCastle)) lady = grave; + if (grave.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) lovely = grave; + if (grave.IsCode(CardId.AriannaTheLabrynthServant)) arianna = grave; + if (Card != grave && grave.IsMonster() && grave.HasRace(CardRace.Fiend)) + { + if (!grave.IsCanRevive()) continue; + if (bestAttack == null || grave.Attack > bestAttack.Attack) bestAttack = grave; + } + } + + ClientCard select = null; + bool destroyWelcome = false; + if (chaosAngel != null && (GetProblematicEnemyCardList(selfType: CardType.Monster).Count() > 0 || + (Bot.GetMonsterCount() == 0 && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + select = chaosAngel; + } + if (select == null && abomination != null && (GetProblematicEnemyCardList(selfType: CardType.Monster).Count() > 0 || + (Bot.GetMonsterCount() == 0 && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + select = abomination; + Logger.DebugWriteLine("[Yama] timing: " + CurrentTiming.ToString()); + if (Bot.HasInSpellZone(CardId.WelcomeLabrynth) && !(Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + && !activatedCardIdList.Contains(CardId.UnchainedAbomination)) + { + destroyWelcome = true; + } + } + if (select == null && rage != null && (Duel.Player == 0 || (!activatedCardIdList.Contains(CardId.UnchainedSoulOfRage) && (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2))) + && Bot.HasInExtra(new List { CardId.UnchainedSoulOfAnguish, CardId.SPLittleKnight })) select = rage; + if (select == null && arianna != null && Duel.Player == 0 && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant)) select = arianna; + if (select == null && lovely != null && Duel.Player == 1 && Util.GetBestAttack(Enemy) < 2900) select = lovely; + if (select == null && lady != null && Duel.Player == 1 && Util.GetBestAttack(Enemy) < 3000) select = lady; + if (select == null && arianna != null && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant)) select = arianna; + if (select == null && bestAttack != null) select = bestAttack; + + if (select != null) + { + activatedCardIdList.Add(Card.Id + 1); + AI.SelectCard(select); + if (destroyWelcome) + { + AI.SelectYesNo(true); + AI.SelectNextCard(CardId.WelcomeLabrynth); + } else { + AI.SelectYesNo(false); + } + return true; + } + } + + return false; + } + + public bool UnchainedSoulOfRageSpSummon() + { + if (CheckShouldNoMoreSpSummon(false) || CheckWhetherNegated(true, true, CardType.Monster | CardType.Link)) return false; + if (Bot.HasInMonstersZone(CardId.UnchainedSoulOfRage)) return false; + + ClientCard unchained = Bot.GetMonsters().FirstOrDefault(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained) + && !card.IsCode(CardId.UnchainedSoulOfAnguish, CardId.UnchainedAbomination)); + if (unchained == null) return false; + + bool summonFlag = CheckAtAdvantage() && Util.IsTurn1OrMain2(); + summonFlag |= !(Bot.HasInExtra(CardId.UnchainedSoulOfAnguish) && !activatedCardIdList.Contains(CardId.UnchainedSoulOfAnguish)) && Util.IsTurn1OrMain2(); + if (summonFlag) + { + summonFlag = Bot.HasInExtra(CardId.UnchainedSoulOfAnguish); + summonFlag |= Bot.HasInExtra(CardId.SPLittleKnight) && banSpSummonExceptFiendCount == 0; + } + + List materialList = GetCanBeUsedForLinkMaterial(Util.IsTurn1OrMain2(), + card => !card.HasRace(CardRace.Fiend) || card == unchained); + if (materialList.Count() > 0) + { + List selectMaterials = new List{unchained, materialList[0]}; + summonFlag |= Enemy.GetMonsterCount() == 0 && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(selectMaterials) + 1800 >= Enemy.LifePoints; + if (summonFlag) + { + AI.SelectMaterials(selectMaterials); + return true; + } + } + + return false; + } + public bool UnchainedSoulOfRageActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (CheckWhetherNegated()) return false; + bool activateFlag = DefaultOnBecomeTarget() && !Util.ChainContainsCard(CardId.EscapeOfTheUnchained); + ClientCard problemMonster = GetProblematicEnemyMonster(-1, true, true, CardType.Monster); + List targetList = Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeTarget()).OrderBy(card => card.Attack).ToList(); + if (problemMonster != null) targetList.Insert(0, problemMonster); + + activateFlag |= (CurrentTiming & hintTimingMainEnd) > 0 && Util.IsOneEnemyBetterThanValue(Card.Attack, true); + activateFlag |= problemMonster != null; + + if (activateFlag && targetList.Count() > 0) + { + ClientCard target = targetList[0]; + int summonId = 0; + if (Bot.HasInExtra(CardId.UnchainedAbomination) && GetProblematicEnemyMonster(3000) == null + && target.HasType(CardType.Link) && target.LinkCount == 2) summonId = CardId.UnchainedSoulOfAnguish; + else if (banSpSummonExceptFiendCount == 0 && Bot.HasInExtra(CardId.SPLittleKnight)) summonId = CardId.SPLittleKnight; + else if (Bot.HasInExtra(CardId.UnchainedSoulOfAnguish) && GetProblematicEnemyMonster(2400) == null) summonId = CardId.UnchainedSoulOfAnguish; + List materialList = new List(targetList){Card}; + + AI.SelectCard(targetList); + AI.SelectNextCard(summonId); + AI.SelectMaterials(materialList); + activatedCardIdList.Add(Card.Id); + escapeTargetList.Add(Card); + currentDestroyCardList.Add(target); + return true; + } + } + if (Card.Location == CardLocation.Grave) + { + return UnchainRecycleActivate(); + } + + return false; + } + + public bool UnchainRecycleActivate() + { + AI.SelectCard(CardId.UnchainedSoulOfSharvara, CardId.LovelyLabrynthOfTheSilverCastle, CardId.AriannaTheLabrynthServant, + CardId.UnchainedAbomination, CardId.LabrynthStovieTorbie, CardId.LabrynthChandraglier, CardId.LabrynthCooclock, + CardId.AriasTheLabrynthButler, CardId.ArianeTheLabrynthServant); + activatedCardIdList.Add(Card.Id + 1); + + return true; + } + + public bool SPLittleKnightSpSummon() + { + if (CheckCanDirectAttack()) + { + // for attack + List materialList = SPLittleKnightSelectMaterial(); + if (materialList.Count() >= 2 && GetMaterialAttack(materialList) < 1600) + { + AI.SelectMaterials(materialList); + return true; + } + } else if (!CheckWhetherNegated(true, true, CardType.Monster | CardType.Link) && GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0) + { + // for remove + List materialList = SPLittleKnightSelectMaterial(true); + if (materialList.Count() >= 2 && materialList.Any(card => card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link))) + { + AI.SelectMaterials(materialList); + return true; + } + } + return false; + } + public List SPLittleKnightSelectMaterial(bool needToUseEffect = false) + { + List usedMaterialList = new List(); + if (Bot.GetMonstersExtraZoneCount() > 0) + { + ClientCard botMonsterExtraZome = Bot.GetMonstersInExtraZone()[0]; + if (botMonsterExtraZome.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Pendulum) || botMonsterExtraZome.IsCode(CardId.RelinquishedAnima)) + { + usedMaterialList.Add(botMonsterExtraZome); + if (botMonsterExtraZome.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) needToUseEffect = false; + } + List materialList = GetCanBeUsedForLinkMaterial(true, card => card == botMonsterExtraZome); + if (materialList.Count() > 0) + { + foreach (ClientCard card in materialList) + { + if (!needToUseEffect || card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz) || (card.HasType(CardType.Link) && card.LinkCount <= 2)) + { + usedMaterialList.Add(card); + if (card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link)) needToUseEffect = false; + } + if (usedMaterialList.Count() >= 2) break; + } + } + if (usedMaterialList.Count() < 2) usedMaterialList.Clear(); + } else { + List materialList = GetCanBeUsedForLinkMaterial(true, card => !needToUseEffect + || card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz) || (card.HasType(CardType.Link) && card.LinkCount <= 2)); + if (materialList.Count() >= 2) + { + for (int idx1 = 0; idx1 < materialList.Count() - 1; ++ idx1) + { + ClientCard material1 = materialList[idx1]; + if (material1.HasType(CardType.Link) && material1.LinkCount >= 3) continue; + bool flag1 = !needToUseEffect || material1.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + for (int idx2 = 0; idx2 < materialList.Count(); ++ idx2) + { + ClientCard material2 = materialList[idx2]; + if (material2.HasType(CardType.Link) && material2.LinkCount >= 3) continue; + bool flag2 = !needToUseEffect || material2.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link); + if (flag1 || flag2) + { + return new List{material1, material2}; + } + } + } + } + } + + return usedMaterialList; + } + + public bool SPLittleKnightActivate() + { + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 0)) + { + // banish card + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetDangerousCardinEnemyGrave(false)); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + if (problemCardList.Count() > 0) + { + AI.SelectCard(problemCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + } else if (ActivateDescription == Util.GetStringId(CardId.SPLittleKnight, 1)) + { + ClientCard selfMonster = null; + foreach (ClientCard target in Bot.GetMonsters()) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target)) + { + selfMonster = target; + break; + } + } + if (selfMonster == null) + { + if (Duel.Player == 1) + { + selfMonster = Bot.GetMonsters().Where(card => card.IsAttack()).OrderBy(card => card.Attack).FirstOrDefault(); + if (!Util.IsOneEnemyBetterThanValue(selfMonster.Attack, true)) selfMonster = null; + } + } + if (selfMonster != null) + { + ClientCard nextMonster = null; + List selfTargetList = Bot.GetMonsters().Where(card => card != selfMonster).ToList(); + if (Enemy.GetMonsterCount() == 0 && selfTargetList.Count() > 0) + { + selfTargetList.Sort(CompareUsableAttack); + nextMonster = selfTargetList[0]; + escapeTargetList.Add(nextMonster); + } + if (Enemy.GetMonsterCount() > 0) + { + nextMonster = GetBestEnemyMonster(false, true, true); + currentDestroyCardList.Add(nextMonster); + } + if (nextMonster != null) + { + AI.SelectCard(selfMonster); + AI.SelectNextCard(nextMonster); + escapeTargetList.Add(selfMonster); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + return false; + } + + public bool MuckrakerFromTheUnderworldSpSummon() + { + List materialList = GetCanBeUsedForLinkMaterial(true, card => card.HasType(CardType.Link)); + if (materialList.Count() < 2) return false; + bool willBeNegated = CheckWhetherNegated(true, true, CardType.Monster | CardType.Link) && Bot.Hand.Count() > 0; + bool canRebornAngel = Bot.Graveyard.Any(card => card.IsCanRevive() && card.IsCode(CardId.ChaosAngel)) && !willBeNegated; + bool canRebornLovely = Bot.Graveyard.Any(card => card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) && !willBeNegated; + int bestAttackGrave = 0; + bool chaosAngelFlag = GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0 && !CheckWhetherNegated(true, true, CardType.Monster); + foreach (ClientCard grave in Bot.Graveyard) + { + if (grave.IsMonster() && grave.HasRace(CardRace.Fiend)) + { + if (!grave.IsCanRevive()) continue; + if (grave.Attack > bestAttackGrave) bestAttackGrave = grave.Attack; + } + } + for (int idx1 = 0; idx1 < materialList.Count() - 1; ++ idx1) + { + ClientCard material1 = materialList[idx1]; + for (int idx2 = idx1 + 1; idx2 < materialList.Count(); ++ idx2) + { + ClientCard material2 = materialList[idx1]; + List currentList = new List { material1, material2 }; + bool summonFlag = chaosAngelFlag && (canRebornAngel || (currentList.Any(card => card.IsCode(CardId.ChaosAngel)) && !willBeNegated)); + summonFlag |= Enemy.GetMonsterCount() == 0 && canRebornLovely; + summonFlag |= !activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle) && Bot.Graveyard.Any(card => card.Type == (int)CardType.Trap) + && currentList.Any(card => card.IsDisabled() && card.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)); + if (CheckCanDirectAttack()) + { + summonFlag |= GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack(currentList) + bestAttackGrave >= Enemy.LifePoints; + summonFlag |= GetMaterialAttack(currentList) < 1000; + } + if (summonFlag) + { + AI.SelectMaterials(currentList); + return true; + } + } + } + return false; + } + public bool MuckrakerFromTheUnderworldActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.MuckrakerFromTheUnderworld, 0)) + { + if (CheckWhetherNegated()) return false; + ClientCard chaosAngel = null; + ClientCard lovely = null; + ClientCard arianna = null; + ClientCard bestAttack = null; + foreach (ClientCard grave in Bot.Graveyard) + { + if (grave.IsCode(CardId.ChaosAngel) && grave.ProcCompleted != 0 && !dimensionalBarrierAnnouced.Contains(HintMsg.SYNCHRO)) chaosAngel = grave; + if (grave.IsCode(CardId.LovelyLabrynthOfTheSilverCastle)) lovely = grave; + if (grave.IsCode(CardId.AriannaTheLabrynthServant)) arianna = grave; + if (Card != grave && grave.IsMonster() && grave.HasRace(CardRace.Fiend)) + { + if (!grave.IsCanRevive()) continue; + if (bestAttack == null || grave.Attack > bestAttack.Attack) bestAttack = grave; + } + } + + ClientCard rebornTarget = null; + if (chaosAngel != null && (GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0)) rebornTarget = chaosAngel; + if (rebornTarget == null && lovely != null && Util.GetBestAttack(Enemy) < 2900 && + (!activatedCardIdList.Contains(CardId.LovelyLabrynthOfTheSilverCastle) || Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth))) rebornTarget = lovely; + if (rebornTarget == null && bestAttack != null && CheckCanDirectAttack() + && GetBotCurrentTotalAttack() < Enemy.LifePoints && GetBotCurrentTotalAttack() + bestAttack.Attack >= Enemy.LifePoints) rebornTarget = bestAttack; + if (rebornTarget == null && arianna != null && Duel.Player == 0 && !activatedCardIdList.Contains(CardId.AriannaTheLabrynthServant)) rebornTarget = arianna; + if (rebornTarget == null && bestAttack != null) rebornTarget = bestAttack; + if (rebornTarget != null) + { + AI.SelectCard(rebornTarget); + AI.SelectNextCard(FurnitureGetCost()); + activatedCardIdList.Contains(Card.Id); + banSpSummonExceptFiendCount = Math.Max(1, banSpSummonExceptFiendCount); + return true; + } + } + + return false; + } + + public bool RelinquishedAnimaSpSummon() + { + if (CheckWhetherNegated()) return false; + // summon to use effect + ClientCard enemyLeftEx = Enemy.MonsterZone[6]; + if (enemyLeftEx != null && enemyLeftEx.HasLinkMarker((int)CardLinkMarker.Top) && !enemyLeftEx.IsShouldNotBeTarget() && !enemyLeftEx.IsShouldNotBeMonsterTarget()) + { + ClientCard selfMonsterZone1 = Bot.MonsterZone[1]; + if (selfMonsterZone1 == null) + { + AI.SelectMaterials(CardId.LabrynthCooclock); + AI.SelectPlace(Zones.z1); + return true; + } + else if (!selfMonsterZone1.HasType(CardType.Xyz | CardType.Link | CardType.Token) && selfMonsterZone1.Level == 1) + { + AI.SelectMaterials(selfMonsterZone1); + AI.SelectPlace(Zones.z1); + return true; + } + } + ClientCard enemyRightEx = Enemy.MonsterZone[5]; + if (enemyRightEx != null && enemyRightEx.HasLinkMarker((int)CardLinkMarker.Top) && !enemyRightEx.IsShouldNotBeTarget() && !enemyRightEx.IsShouldNotBeMonsterTarget()) + { + ClientCard selfMonsterZone3 = Bot.MonsterZone[3]; + if (selfMonsterZone3 == null) + { + AI.SelectMaterials(CardId.LabrynthCooclock); + AI.SelectPlace(Zones.z3); + return true; + } + else if (!selfMonsterZone3.HasType(CardType.Xyz | CardType.Link | CardType.Token) && selfMonsterZone3.Level == 1) + { + AI.SelectMaterials(selfMonsterZone3); + AI.SelectPlace(Zones.z3); + return true; + } + } + + if (Bot.MonsterZone[5] != null || Bot.MonsterZone[6] != null) return false; + ClientCard enemyMonsterLeft = Enemy.MonsterZone[3]; + ClientCard enemyMonsterRight = Enemy.MonsterZone[1]; + if (Enemy.MonsterZone[6] != null) enemyMonsterLeft = null; + if (enemyMonsterLeft != null && enemyMonsterLeft.IsFacedown()) enemyMonsterLeft = null; + if (enemyMonsterLeft != null && (enemyMonsterLeft.IsShouldNotBeMonsterTarget() || enemyMonsterLeft.IsShouldNotBeTarget())) enemyMonsterLeft = null; + + if (Enemy.MonsterZone[5] != null) enemyMonsterRight = null; + if (enemyMonsterRight != null && (enemyMonsterRight.IsShouldNotBeMonsterTarget() || enemyMonsterRight.IsShouldNotBeTarget())) enemyMonsterRight = null; + if (enemyMonsterRight != null && enemyMonsterRight.IsFacedown()) enemyMonsterRight = null; + + int place = -1; + if (enemyMonsterLeft != null && enemyMonsterRight == null) place = Zones.z5; + if (enemyMonsterLeft == null && enemyMonsterRight != null) place = Zones.z6; + if (enemyMonsterLeft != null && enemyMonsterRight != null) + { + if (enemyMonsterLeft.IsFloodgate() && !enemyMonsterRight.IsFloodgate()) place = Zones.z5; + else if (!enemyMonsterLeft.IsFloodgate() && enemyMonsterRight.IsFloodgate()) place = Zones.z6; + else + { + if (enemyMonsterLeft.GetDefensePower() >= enemyMonsterRight.GetDefensePower()) place = Zones.z5; + else place = Zones.z6; + } + } + if (place >= 0) + { + AI.SelectMaterials(Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link | CardType.Token) && card.Level == 1) + .OrderBy(card => card.Attack).ToList()); + AI.SelectPlace(place); + return true; + } + + // summon for little knight + if (Bot.HasInExtra(CardId.SPLittleKnight) && Bot.GetMonsters().Count(card => card.IsFaceup()) >= 2 + && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link))) + { + if (GetProblematicEnemyCardList(true, selfType: CardType.Monster).Count() > 0) + { + AI.SelectMaterials(Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link | CardType.Token) && card.Level == 1) + .OrderBy(card => card.Attack).ToList()); + return true; + } + } + return false; + } + public bool RelinquishedAnimaActivate() + { + if (CheckWhetherNegated()) return false; + activatedCardIdList.Add(Card.Id); + Dictionary placeList = new Dictionary{ {1, 6}, {3, 5}, {5, 3}, {6, 1} }; + foreach (KeyValuePair placePair in placeList) + { + if (Bot.MonsterZone[placePair.Key] == Card && Enemy.MonsterZone[placePair.Value] != null) + { + currentDestroyCardList.Add(Enemy.MonsterZone[placePair.Value]); + break; + } + } + return true; + } + + public bool MonsterRepos() + { + int selfAttack = Card.Attack + 1; + + if (selfAttack <= 1) + return !Card.IsDefense(); + + int bestAttack = 0; + foreach (ClientCard card in Bot.GetMonsters()) + { + int attack = card.Attack; + if (attack >= bestAttack) + { + bestAttack = attack; + } + } + + bool enemyBetter = Util.IsAllEnemyBetterThanValue(bestAttack, true); + + if (Card.IsAttack() && enemyBetter) + return true; + if (Card.IsDefense() && !enemyBetter) + return true; + return false; + } + + public bool ReposForLabrynth() + { + if (!activatedCardIdList.Contains(CardId.BigWelcomeLabrynth) && Bot.HasInSpellZoneOrInGraveyard(CardId.BigWelcomeLabrynth)) + return Card.IsFacedown(); + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + if (Card.IsCode(CardId.BigWelcomeLabrynth) && Bot.HasInSpellZone(Card.Id)) return false; + if (Card.IsCode(CardId.TransactionRollback) && !Bot.HasInSpellZone(CardId.TransactionRollback)) + { + // check enemy grave trap + bool haveCopyTrap = false; + if (Enemy.Graveyard.Any(card => card.IsCode( + CardId.WelcomeLabrynth, CardId.BigWelcomeLabrynth, _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier, CardId.DestructiveDarumaKarmaCannon, + _CardId.CompulsoryEvacuationDevice, _CardId.BreakthroughSkill + ))) + { + haveCopyTrap = true; + } + + if (!haveCopyTrap && !Bot.HasInHand(CardId.UnchainedSoulOfSharvara)) return false; + } + if (Card.IsCode(CardId.EscapeOfTheUnchained) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeUnchained))) return false; + + // select place + if (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) + { + List avoidList = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoidList.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } else + { + SelectSTPlace(Card, false, avoidList); + return true; + } + } else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + public bool SpellSetForCooClockCheck() + { + // set to destroy for Sharvara + if (Card.IsCode(CardId.PotOfExtravagance, CardId.TransactionRollback, CardId.WelcomeLabrynth) && Bot.HasInHand(CardId.UnchainedSoulOfSharvara) + && !activatedCardIdList.Contains(CardId.UnchainedSoulOfSharvara)) + { + SelectSTPlace(Card, false); + return true; + } + // set to activate by cooclock + bool haveLabrynth = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasSetcode(SetcodeLabrynth)); + if (!cooclockAffected || (haveLabrynth && Bot.HasInHand(CardId.LabrynthCooclock) && !activatedCardIdList.Contains(CardId.LabrynthCooclock))) return false; + if (!Card.IsCode(CardId.BigWelcomeLabrynth, CardId.WelcomeLabrynth, _CardId.InfiniteImpermanence, _CardId.DimensionalBarrier)) return false; + if (haveLabrynth) + { + SelectSTPlace(Card, true); + return true; + } + if (!Card.IsCode(CardId.BigWelcomeLabrynth, CardId.WelcomeLabrynth)) return false; + if (!summoned && Bot.Hand.Any(card => card.IsMonster() && card.Level <= 4 && card.HasSetcode(SetcodeLabrynth))) + { + SelectSTPlace(Card, true); + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/Game/AI/Decks/Level8Executor.cs b/Game/AI/Decks/Level8Executor.cs index 130a70b94..be5d60b84 100644 --- a/Game/AI/Decks/Level8Executor.cs +++ b/Game/AI/Decks/Level8Executor.cs @@ -217,11 +217,12 @@ public override void OnNewTurn() JetSynchronUsed = false; ScrapWyvernUsed = false; MaskedChameleonUsed = false; + base.OnNewTurn(); } public override void OnChainEnd() { - + base.OnChainEnd(); } public override CardPosition OnSelectPosition(int cardId, IList positions) @@ -235,7 +236,7 @@ public override CardPosition OnSelectPosition(int cardId, IList po return 0; } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (location == CardLocation.SpellZone) { diff --git a/Game/AI/Decks/LightswornShaddoldinosourExecutor.cs b/Game/AI/Decks/LightswornShaddoldinosourExecutor.cs index d486d9f01..9b91d735b 100644 --- a/Game/AI/Decks/LightswornShaddoldinosourExecutor.cs +++ b/Game/AI/Decks/LightswornShaddoldinosourExecutor.cs @@ -274,6 +274,7 @@ public override void OnNewTurn() ShaddollSquamata_used = false; ShaddollDragon_used = false; ShaddollHedgehog_used = false; + base.OnNewTurn(); } private bool Luminasummon() @@ -290,6 +291,7 @@ private bool Luminasummon() } private bool Luminaeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInGraveyard(CardId.Raiden)) { AI.SelectCard(Useless_List()); @@ -555,6 +557,7 @@ private bool SouleatingOviraptoreff() private bool GlowUpBulbeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; IList check = Bot.GetMonstersInExtraZone(); foreach (ClientCard monster in check) if (monster.HasType(CardType.Fusion)) return false; @@ -627,6 +630,7 @@ private bool PotofAvariceeff() private bool MaxxC() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } @@ -977,6 +981,7 @@ private bool FoolishBurialEffect() public bool Hand_act_eff() { //if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.IsCode(CardId.GhostOgre) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GhostOgre)) return false; return (Duel.LastChainPlayer == 1); } @@ -998,6 +1003,7 @@ private bool Michaeleff() if (Card.Location == CardLocation.Grave) return true; if (Bot.LifePoints <= 1000) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; ClientCard select = Util.GetBestEnemyCard(); if (select == null) return false; if(select!=null) diff --git a/Game/AI/Decks/LuckyExecutor.cs b/Game/AI/Decks/LuckyExecutor.cs index 516ca26c5..d46745420 100644 --- a/Game/AI/Decks/LuckyExecutor.cs +++ b/Game/AI/Decks/LuckyExecutor.cs @@ -1,4 +1,4 @@ -using YGOSharp.OCGWrapper.Enums; +using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using System.Linq; using WindBot; @@ -83,33 +83,33 @@ public LuckyExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Summon, _CardId.ExodiaTheForbiddenOne, JustDontIt); } - private List HintMsgForEnemy = new List + private List HintMsgForEnemy = new List { HintMsg.Release, HintMsg.Destroy, HintMsg.Remove, HintMsg.ToGrave, HintMsg.ReturnToHand, HintMsg.ToDeck, - HintMsg.FusionMaterial, HintMsg.SynchroMaterial, HintMsg.XyzMaterial, HintMsg.LinkMaterial + HintMsg.FusionMaterial, HintMsg.SynchroMaterial, HintMsg.XyzMaterial, HintMsg.LinkMaterial, HintMsg.Disable }; - private List HintMsgForDeck = new List + private List HintMsgForDeck = new List { HintMsg.SpSummon, HintMsg.ToGrave, HintMsg.Remove, HintMsg.AddToHand, HintMsg.FusionMaterial }; - private List HintMsgForSelf = new List + private List HintMsgForSelf = new List { HintMsg.Equip }; - private List HintMsgForMaterial = new List + private List HintMsgForMaterial = new List { HintMsg.FusionMaterial, HintMsg.SynchroMaterial, HintMsg.XyzMaterial, HintMsg.LinkMaterial, HintMsg.Release }; - private List HintMsgForMaxSelect = new List + private List HintMsgForMaxSelect = new List { HintMsg.SpSummon, HintMsg.ToGrave, HintMsg.AddToHand, HintMsg.FusionMaterial, HintMsg.Destroy }; - public override IList OnSelectCard(IList _cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList _cards, int min, int max, int hint, bool cancelable) { if (Duel.Phase == DuelPhase.BattleStart) return null; @@ -199,7 +199,7 @@ public override IList OnSelectCard(IList _cards, int min return selected; } - public override int OnSelectOption(IList options) + public override int OnSelectOption(IList options) { return Program.Rand.Next(options.Count); } @@ -219,11 +219,13 @@ public override CardPosition OnSelectPosition(int cardId, IList po private bool ImFeelingLucky() { + if (Type == ExecutorType.Activate && DefaultCheckWhetherCardIsNegated(Card)) return false; return Program.Rand.Next(10) >= 5 && DefaultDontChainMyself(); } private bool ImFeelingUnlucky() { + if (Type == ExecutorType.Activate && DefaultCheckWhetherCardIsNegated(Card)) return false; return DefaultDontChainMyself(); } @@ -239,4 +241,4 @@ private bool JustDontIt() return false; } } -} +} \ No newline at end of file diff --git a/Game/AI/Decks/MalissExecutor.cs b/Game/AI/Decks/MalissExecutor.cs new file mode 100644 index 000000000..de28b2e5e --- /dev/null +++ b/Game/AI/Decks/MalissExecutor.cs @@ -0,0 +1,4216 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using YGOSharp.Network.Enums; +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Maliss", "AI_Maliss")] + public class MalissExecutor : DefaultExecutor + { + public class CardId + { + public const int DominusImpulse = 40366667; + public const int TERRAFORMING = 73628505; + //public const int AllureOfDarkness = 1475311; + public const int GoldSarcophagus = 75500286; + + // Cyberse / utility + public const int BackupIgnister = 30118811; + public const int WizardIgnister = 3723262; + + // Main Maliss pieces + public const int MalissP_Dormouse = 32061192; // Maliss

Dormouse + public const int MalissP_WhiteRabbit = 69272449; // Maliss

White Rabbit + public const int MalissP_ChessyCat = 96676583; // Maliss

Chessy Cat + public const int MalissP_MarchHare = 20938824; // Maliss

March Hare + public const int MalissC_GWC06 = 20726052; // Maliss GWC-06 + //public const int MalissC_TB11 = 57111661; // Maliss TB-11 + public const int MalissC_MTP07 = 94722358; // Maliss MTP-07 + public const int MalissQ_RedRansom = 68059897; // Maliss Red Ransom + public const int MalissQ_WhiteBinder = 95454996; // Maliss White Binder + public const int MalissQ_HeartsCrypter = 21848500; // Maliss Hearts Crypter + public const int MalissInTheMirror = 93453053; // Maliss in the Mirror (Spell) + public const int MalissInUnderground = 68337209; // Maliss in Underground + + + // === Extra Deck === + public const int Linguriboh = 24842059; + public const int LinkDecoder = 30342076; + public const int SP_LITTLE_KNIGHT = 29301450; + public const int SALAMANGREAT_ALMIRAJ = 60303245; + public const int SplashMage = 59859086; // Splash Mage + public const int CyberseWicckid = 52698008; // Cyberse Wicckid + public const int TranscodeTalker = 46947713; // Transcode Talker + public const int AlliedCodeTalkerIgnister = 39138610; // Allied Code Talker @Ignister + public const int FirewallDragon = 5043010; // Firewall Dragon + public const int LinkSpider = 98978921; // Link Spider + public const int HaggardLizardose = 9763474; // Haggard Lizardose + public const int AccesscodeTalker = 86066372; // Accesscode Talker + public const int Apollousa = 4280258; + + // === Handtraps / Others (blacklist/targets etc.) === + public const int Lancea = 34267821; + public const int Fuwalos = 42141493; + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int GhostMournerMoonlitChill = 52038441; + public const int NibiruThePrimalBeing = 27204311; + } + const int SetcodeMaliss = 0x1bf; + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeHorus = 0x19d; + const int SetcodeDarkWorld = 0x6; + const int SetcodeSkyStriker = 0x115; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.MalissP_ChessyCat, CardId.MalissP_MarchHare,CardId.MalissP_WhiteRabbit,CardId.MalissInUnderground, + CardId.BackupIgnister, CardId.MalissP_Dormouse, + _CardId.AshBlossom,_CardId.InfiniteImpermanence,CardId.DominusImpulse } }, + {2, new List { _CardId.MaxxC, _CardId.CalledByTheGrave}}, + {1, new List { CardId.GoldSarcophagus, CardId.TERRAFORMING, + CardId.MalissC_GWC06, CardId.Lancea, CardId.MalissC_MTP07, + _CardId.CrossoutDesignator, CardId.MalissInTheMirror, CardId.WizardIgnister, + CardId.NibiruThePrimalBeing }} + }; + + List notToNegateIdList = new List { 58699500, 20343502, 19403423 }; + List notToDestroySpellTrap = new List { 50005218, 6767771 }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + + public MalissExecutor(GameAI ai, Duel duel) : base(ai, duel) + { + // Must Set First + AddExecutor(ExecutorType.SpellSet, CardId.MalissC_GWC06, SpellSetCheck); + AddExecutor(ExecutorType.SpellSet, CardId.MalissC_MTP07, SpellSetCheck); + + + AddExecutor(ExecutorType.Activate, CardId.AccesscodeTalker, Accesscode_OnSummon_AtkUp); + AddExecutor(ExecutorType.Activate, CardId.AccesscodeTalker, Accesscode_Destroy_Ignition); + + // ===== Generic counters ===== + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.Apollousa, DontSelfNG); + AddExecutor(ExecutorType.Activate, CardId.DominusImpulse, DontSelfNG); + AddExecutor(ExecutorType.Activate, CardId.AlliedCodeTalkerIgnister, Allied_NegateBanish); + AddExecutor(ExecutorType.Activate, CardId.FirewallDragon, FirewallBounce_OnOppSummon); + AddExecutor(ExecutorType.Activate, CardId.MalissC_MTP07, MTP07_OppTurn_RemoveEnemyOnly); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_HeartsCrypter, HC_Quick_ReturnBanished_AndBanishField); + AddExecutor(ExecutorType.Activate, CardId.MalissC_GWC06, GWC06_OppTurn_ReviveWB_HC); + AddExecutor(ExecutorType.Activate, CardId.SP_LITTLE_KNIGHT, ActLittleKnight); + + + AddExecutor(ExecutorType.Activate, CardId.MalissQ_RedRansom, RR_SS_FromBanished); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_HeartsCrypter, HC_OnBanished_SpecialSummon); + AddExecutor(ExecutorType.Activate, CardId.MalissInTheMirror, Mirror_Banish); + + // Plan#1 + // --- Start with Dormouse --- + AddExecutor(ExecutorType.Summon, CardId.MalissP_Dormouse, Step1_Dormouse_NormalSummon); + AddExecutor(ExecutorType.Summon, CardId.MalissP_WhiteRabbit, Step1_WhiteRabbit_NormalSummon); + AddExecutor(ExecutorType.Summon, CardId.MalissP_ChessyCat, TwoCC_NormalSummon); + AddExecutor(ExecutorType.Summon, CardId.MalissP_ChessyCat, Emergency_NormalCat); + AddExecutor(ExecutorType.Summon, CardId.MalissP_MarchHare, NSMH); + AddExecutor(ExecutorType.Summon, CardId.BackupIgnister, NSBackup_L); + AddExecutor(ExecutorType.Summon, CardId.BackupIgnister, NSBackup); + AddExecutor(ExecutorType.Activate, CardId.MalissP_Dormouse, Dormouse_SS_FromBanished); + AddExecutor(ExecutorType.Activate, CardId.MalissP_Dormouse, Dormouse_ForMH); + AddExecutor(ExecutorType.Activate, CardId.MalissP_Dormouse, Dormouse_Banish_Anytime); + AddExecutor(ExecutorType.Activate, CardId.MalissP_WhiteRabbit, Step1_WhiteRabbit_SS_FromBanished); + AddExecutor(ExecutorType.Activate, CardId.MalissP_WhiteRabbit, Step1_WhiteRabbit_SetTrapOnSummon); + AddExecutor(ExecutorType.Activate, CardId.MalissP_MarchHare, Step1_MH_FromHand); + AddExecutor(ExecutorType.Activate, CardId.MalissP_MarchHare, returnFromBanish); + AddExecutor(ExecutorType.SpSummon, CardId.Linguriboh, LinguribohMHLine); + AddExecutor(ExecutorType.SpSummon, CardId.LinkDecoder, Step1_SSLinkDecoder); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_RedRansom, Step2N_LinkSummon_RedRansom); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_RedRansom, Step2_LinkSummon_RedRansom); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_RedRansom, Step2_RedRansom_Search); + AddExecutor(ExecutorType.Activate, CardId.MalissP_ChessyCat, AnyDraw); + AddExecutor(ExecutorType.SpSummon, CardId.Apollousa, Link_Apo); + AddExecutor(ExecutorType.SpSummon, CardId.CyberseWicckid, Step2N_RRtoWicckid); + AddExecutor(ExecutorType.SpSummon, CardId.LinkDecoder, Step_SummonLinkDecoderToWicckid); + AddExecutor(ExecutorType.Activate, CardId.CyberseWicckid, Wicckid_SearchTuner); + AddExecutor(ExecutorType.SpSummon, CardId.SplashMage, Step_SplashToWB); + AddExecutor(ExecutorType.Activate, CardId.SplashMage, Step2N_SplashMage_ReviveP); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, Flow3_BackupIgnister_AfterMakeIt3); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, OneBody_Backup_SearchWizard); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_WhiteBinder, Step2N_LinkSummon_WB); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_WhiteBinder, WB_OnSummon_BanishGY); + AddExecutor(ExecutorType.Activate, CardId.MalissC_GWC06, GWC06_MyTurn_Extend); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_WhiteBinder, WB_SetMalissTrap); + + // === STEP2: 2 bodies -> Splash Mage -> revive P -> Red Ransom -> search === + AddExecutor(ExecutorType.Activate, CardId.WizardIgnister, Step2_Fallback_Wizard_AfterSplashNegated); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, Step2_Fallback_Backup_AfterSplashNegated); + + AddExecutor(ExecutorType.Activate, CardId.WizardIgnister, Flow3_WizardIgnister_AfterMakeIt3); + AddExecutor(ExecutorType.Activate, CardId.MalissQ_WhiteBinder, WB_OnBanished_SelfSS); + AddExecutor(ExecutorType.Activate, CardId.MalissP_MarchHare, ssFromHandMH); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_HeartsCrypter, Step_LinkSummon_HeartsCrypter); + AddExecutor(ExecutorType.SpSummon, CardId.AlliedCodeTalkerIgnister, Flow3_Link_Allied); + AddExecutor(ExecutorType.Activate, CardId.AlliedCodeTalkerIgnister, Allied_OnSummonTrigger); + + // Plan#2 White Rabbit --- + AddExecutor(ExecutorType.Activate, CardId.MalissC_MTP07, MTP07_ForMH); + AddExecutor(ExecutorType.SpSummon, CardId.FirewallDragon, Flow3_Link_Firewall); + AddExecutor(ExecutorType.SpSummon, CardId.MalissQ_WhiteBinder, Step_WicckidPlusOneToWB); + AddExecutor(ExecutorType.Activate, CardId.MalissP_ChessyCat, ChessyCat_SS_FromBanished); + + + AddExecutor(ExecutorType.SpSummon, CardId.CyberseWicckid, Step_RRtoWicckid); + AddExecutor(ExecutorType.Activate, CardId.MalissInUnderground, Flow3_UnderGround_Available_SSAnyPawn); + AddExecutor(ExecutorType.Activate, CardId.LinkDecoder, LinkDecoder_ReviveFromGY); + + // Fallback Lancea + AddExecutor(ExecutorType.SpSummon, CardId.TranscodeTalker, SummonTranscode); + AddExecutor(ExecutorType.Activate, CardId.TranscodeTalker, Transcode_ReviveLink3OrLower); + + // Emergency Start + AddExecutor(ExecutorType.Activate, CardId.TERRAFORMING, Terra_GrabUnderground); + AddExecutor(ExecutorType.Activate, CardId.GoldSarcophagus, GoldSarc_StartPiece); + AddExecutor(ExecutorType.Activate, CardId.MalissInUnderground, Underground_ActivateStarter); + + AddExecutor(ExecutorType.SpSummon, CardId.SplashMage, Step_SplashToRR); + AddExecutor(ExecutorType.Activate, CardId.SplashMage, Step2_SplashMage_ReviveP); + + // Fallback: Try to Start + AddExecutor(ExecutorType.SpSummon, CardId.LinkSpider); + AddExecutor(ExecutorType.Summon, _CardId.AshBlossom, Emergency_NS); + AddExecutor(ExecutorType.Summon, _CardId.MaxxC, Emergency_NS); + AddExecutor(ExecutorType.SpSummon, CardId.Linguriboh, OneBody_Link1_Linguriboh); + AddExecutor(ExecutorType.SpSummon, CardId.SALAMANGREAT_ALMIRAJ, OneBody_Link1_Almiraj); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, OneBody_Backup_SS); + AddExecutor(ExecutorType.Activate, CardId.BackupIgnister, OneBody_Backup_SearchWizard); + AddExecutor(ExecutorType.Activate, CardId.WizardIgnister, OneBody_Wizard_SS); + + + //Finisher + AddExecutor(ExecutorType.SpSummon, CardId.AccesscodeTalker, Flow3_Link_Accesscode); + + // Turn3 or More + AddExecutor(ExecutorType.SpSummon, CardId.Linguriboh, T3Allow); + AddExecutor(ExecutorType.SpSummon, CardId.SALAMANGREAT_ALMIRAJ, T3Allow); + AddExecutor(ExecutorType.SpSummon, CardId.TranscodeTalker, EmerTranscode); + AddExecutor(ExecutorType.SpSummon, CardId.AlliedCodeTalkerIgnister, Emer_Allied); + AddExecutor(ExecutorType.SpSummon, CardId.AlliedCodeTalkerIgnister, Emer_Allied2); + + // >>> Fallback: S:P Little Knight + AddExecutor(ExecutorType.SpSummon, CardId.SP_LITTLE_KNIGHT, SummonLittleKnightFast); + AddExecutor(ExecutorType.SpSummon, CardId.SP_LITTLE_KNIGHT, SPEmer); + + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + AddExecutor(ExecutorType.Repos, MonsterRepos); + + } + // Maliss Flags + bool usedNormalSummon = false; + bool ssDormouse = false; + bool ssWhiteRabbit = false; + bool ssChessyCat = false; + bool ssMarchHare = false; + bool ActiveMarchHare = false; + bool ssRRThisTurn = false; + bool ssWBThisTurn = false; + bool ssHCThisTurn = false; + bool enemyActivateLancea = false; + bool enemyActivateFuwalos = false; + bool ActiveUnderground = false; + bool blockWicckid = false; + bool mtp07SetThisTurn = false; + bool gwc06SetThisTurn = false; + bool splashNegatedThisTurn = false; + bool Allied_End = false; + bool fullBoard1 = false; + bool goldstart = false; + bool undergroundstart = false; + bool nsplan = false; + bool nsBackupplan = false; + bool NSDorMouse = false; + bool nsLanceaplan = false; + + int myTurnCount = 0; + bool avoidLinkedZones = false; + bool wantLinkedToWicckid = false; + private int? _wicckidEmzIndex = null; + private int _transcodeZoneMask = 0; + + const int MZ0 = 1 << 0; + const int MZ1 = 1 << 1; + const int MZ2 = 1 << 2; + const int MZ3 = 1 << 3; + const int MZ4 = 1 << 4; + const int EMZ_L = (1 << 5); + const int EMZ_R = (1 << 6); + const int EMZ_ALL = EMZ_L | EMZ_R; + int _wicckidEmzBit = 0; + int _forceTranscodeBit = 0; + + // Step Flag + bool step1Done = false; + bool step2Done = false; + int lastRevivedIdBySplash = 0; + bool coreSetupComplete = false; + bool madeIt3 = false; + bool resultSuccessFlag = false; + private bool _didSplashToRR; + private bool _didRRtoWicckid; + private bool _didSummonToWicckidArrow; + private bool _didWBFromWicckid; + private bool _finishPlanDecided; + private bool _preferWicckidArrows; + private bool _rrSelfSSPlacing = false; + private enum FinishPlan { FW_HC_Allied, HC_Allied, AlliedOnly } + private FinishPlan _finishPlan; + static bool IsEmzSeq(int seq) => seq >= 5; + static int BitOfSeq(int seq) => (1 << seq); + static int LowestBit(int m) => m & -m; + + private bool _oppJustActivatedPersistentSpell; + private bool _oppJustSummoned; + private bool _oppJustSet; + private int _prefWindowTTL; + + private int _enemyMonsterCountSnap; + private int _enemyFacedownSTSnap; + + //==================== Default code ==================== + #region Default Code Start Here + private int _totalAttack; + private int _totalBotAttack; + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + int dimensionShifterCount = 0; + bool enemyActivateInfiniteImpermanenceFromHand = false; + List infiniteImpermanenceList = new List(); + List currentNegateCardList = new List(); + List currentDestroyCardList = new List(); + List sendToGYThisTurn = new List(); + List activatedCardIdList = new List(); + List enemyPlaceThisTurn = new List(); + List escapeTargetList = new List(); + List summonThisTurn = new List(); + + + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public override bool OnSelectHand() { return true; } + + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(n + 1); + ClientCard temp = result[index]; + result[index] = result[n]; + result[n] = temp; + } + return result; + } + + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) + { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + public bool MonsterRepos() + { + int selfAttack = Card.Attack + 1; + + if (selfAttack <= 1) + return !Card.IsDefense(); + + int bestAttack = 0; + foreach (ClientCard card in Bot.GetMonsters()) + { + int attack = card.Attack; + if (attack >= bestAttack) + { + bestAttack = attack; + } + } + + bool enemyBetter = Util.IsAllEnemyBetterThanValue(bestAttack, true); + + if (Card.IsAttack() && enemyBetter) + return true; + if (Card.IsDefense() && !enemyBetter) + return true; + return false; + } + + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && Bot.GetMonsters().Any(card => card.IsFaceup())) + { + return true; + } + return false; + } + + public bool CheckInDanger() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int totalAtk = 0; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsAttack() && !m.Attacked) totalAtk += m.Attack; + } + if (totalAtk >= Bot.LifePoints) return true; + } + return false; + } + private int GetMyLinkedMMZMask() + { + int mask = 0; + foreach (var m in Bot.GetMonsters()) + { + if (m == null || !m.IsFaceup() || !m.HasType(CardType.Link)) continue; + mask |= m.GetLinkedZones(); + } + mask &= 0x1F; + return mask; + } + private bool IsPawnId(int id) + { + return id == CardId.MalissP_Dormouse + || id == CardId.MalissP_WhiteRabbit + || id == CardId.MalissP_ChessyCat + || id == CardId.MalissP_MarchHare; + } + private int GetQueenLinkedMMZMask() + { + int mask = 0; + foreach (var m in Bot.GetMonsters()) + { + if (m == null || !m.IsFaceup()) continue; + + if (m.IsCode(CardId.MalissQ_RedRansom) + || m.IsCode(CardId.MalissQ_WhiteBinder) + || m.IsCode(CardId.MalissQ_HeartsCrypter)) + { + mask |= m.GetLinkedZones(); + } + } + mask &= 0x1F; + return mask; + } + + private int LinkValOf(ClientCard c) + { + return c.HasType(CardType.Link) ? Math.Max(1, c.LinkCount) : 1; + } + + private bool IsOneVal(ClientCard c) + { + return !c.HasType(CardType.Link) || Math.Max(1, c.LinkCount) == 1; + } + + private bool IsMaliss(ClientCard c) + { + return c.HasSetcode(0x1bf); + } + + private int ScoreForBanishedMaliss(ClientCard c) + { + if (c.IsCode(CardId.MalissInTheMirror)) return 100; + if (c.IsCode(CardId.MalissC_MTP07)) return 95; + if (c.IsCode(CardId.MalissC_GWC06)) return 90; + if (c.IsCode(CardId.MalissInUnderground)) return 85; + if (c.IsCode(CardId.MalissP_MarchHare)) return 80; + if (c.IsCode(CardId.MalissP_ChessyCat)) return 75; + if (c.IsCode(CardId.MalissP_WhiteRabbit)) return 70; + if (c.IsCode(CardId.MalissP_Dormouse)) return 65; + return 50; + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + int MAIN_MASK = + (int)Zones.z0 | + (int)Zones.z1 | + (int)Zones.z2 | + (int)Zones.z3 | + (int)Zones.z4; + + int emzMask = available & ~MAIN_MASK; + int mainMask = available & MAIN_MASK; + if (IsPawnId(cardId)) + { + int queenMask = GetQueenLinkedMMZMask(); + int queenChoices = queenMask & available & MAIN_MASK; + + if (queenChoices != 0) + { + int pick = FirstBitFromOrder( + queenChoices, + new[] { (int)Zones.z2, (int)Zones.z1, (int)Zones.z3, (int)Zones.z0, (int)Zones.z4 } + ); + AI.SelectPlace(pick); + return pick; + } + } + if (cardId == CardId.AlliedCodeTalkerIgnister) + { + var fw = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.FirewallDragon)); + int emzAvail = available & EMZ_ALL; + + if (fw != null && fw.IsFaceup()) + { + bool firewallCenter = fw.Controller == 0 && fw.Location == CardLocation.MonsterZone && fw.Sequence == 2; + + int linkedAll = fw.GetLinkedZones(); + int linkedChoices = linkedAll & available; + + int linkedEmzChoices = linkedChoices & EMZ_ALL; + int pick; + + if (linkedEmzChoices != 0) + { + if (firewallCenter && (linkedEmzChoices & EMZ_L) != 0 && (linkedEmzChoices & EMZ_R) != 0) + { + int leftFree = 0; + if ((available & (int)Zones.z0) != 0) leftFree++; + if ((available & (int)Zones.z1) != 0) leftFree++; + + int rightFree = 0; + if ((available & (int)Zones.z3) != 0) rightFree++; + if ((available & (int)Zones.z4) != 0) rightFree++; + + if (leftFree > rightFree) + pick = EMZ_L; + else if (rightFree > leftFree) + pick = EMZ_R; + else + pick = FirstBitFromOrder(linkedEmzChoices, new[] { EMZ_L, EMZ_R }); + } + else + { + pick = FirstBitFromOrder(linkedEmzChoices, new[] { EMZ_L, EMZ_R }); + } + AI.SelectPlace(pick); + return pick; + } + if (emzAvail != 0) + { + if (firewallCenter && (emzAvail & EMZ_L) != 0 && (emzAvail & EMZ_R) != 0) + { + int leftFree = 0; + if ((available & (int)Zones.z0) != 0) leftFree++; + if ((available & (int)Zones.z1) != 0) leftFree++; + + int rightFree = 0; + if ((available & (int)Zones.z3) != 0) rightFree++; + if ((available & (int)Zones.z4) != 0) rightFree++; + + if (leftFree > rightFree) + pick = EMZ_L; + else if (rightFree > leftFree) + pick = EMZ_R; + else + pick = FirstBitFromOrder(emzAvail, new[] { EMZ_L, EMZ_R }); + } + else + { + pick = FirstBitFromOrder(emzAvail, new[] { EMZ_L, EMZ_R }); + } + + AI.SelectPlace(pick); + return pick; + } + if (linkedChoices != 0) + { + pick = FirstBitFromOrder( + linkedChoices, + new[] { (int)Zones.z2, (int)Zones.z1, (int)Zones.z3, (int)Zones.z0, (int)Zones.z4 } + ); + AI.SelectPlace(pick); + return pick; + } + } + int emzOnly = available & EMZ_ALL; + if (emzOnly != 0) + { + int pick = FirstBitFromOrder(emzOnly, new[] { EMZ_L, EMZ_R }); + AI.SelectPlace(pick); + return pick; + } + return PreferSafeSummonZones(available); + } + if (cardId == CardId.CyberseWicckid) + { + int picked = ChooseAndRememberWicckidEmz(available); + if (picked != 0) return picked; + return 0; + } + if (cardId == CardId.TranscodeTalker) + { + int wanted = _forceTranscodeBit != 0 ? _forceTranscodeBit : _wicckidEmzBit; + + if (wanted != 0 && (available & wanted) != 0) + return wanted; + + int anyEmz = available & EMZ_ALL; + if (anyEmz != 0) + return (anyEmz & EMZ_L) != 0 ? EMZ_L : EMZ_R; + + return 0; + } + if (cardId == CardId.MalissQ_RedRansom && _rrSelfSSPlacing) + { + int prefer = (int)Zones.z1 | (int)Zones.z3; + int wmask = GetLinkedMaskFor(GetWicckid()); + int choices = (available & prefer) & ~wmask; + if (choices != 0) + { + int pick = FirstBitFromOrder(choices, new[] { (int)Zones.z1, (int)Zones.z3 }); + AI.SelectPlace(pick); + _rrSelfSSPlacing = false; + return pick; + } + } + if (cardId == CardId.LinkDecoder) + { + var trans = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.TranscodeTalker)); + int tmask = GetLinkedMaskFor(trans) & 0x1F; + int safe = (available & 0x1F) & ~tmask; + if (safe != 0) + { + int pick = FirstBitFromOrder(safe, new[] { (int)Zones.z2, (int)Zones.z1, (int)Zones.z3, (int)Zones.z0, (int)Zones.z4 }); + AI.SelectPlace(pick); + return pick; + } + } + if (cardId == CardId.FirewallDragon) + { + var trans = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.TranscodeTalker)); + int underTrans = 0; + if (trans != null) + { + int tmask = GetLinkedMaskFor(trans) & 0x1F; + if ((tmask & (int)Zones.z1) != 0) underTrans |= (int)Zones.z1; + if ((tmask & (int)Zones.z3) != 0) underTrans |= (int)Zones.z3; + } + int choices = (available & underTrans); + if (choices != 0) + { + int pick = FirstBitFromOrder(choices, new[] { (int)Zones.z1, (int)Zones.z3 }); + AI.SelectPlace(pick); + return pick; + } + } + + if (cardId == CardId.TranscodeTalker || + cardId == CardId.AccesscodeTalker || + cardId == CardId.AlliedCodeTalkerIgnister || + cardId == CardId.MalissQ_WhiteBinder || + cardId == CardId.MalissQ_HeartsCrypter) + { + return PreferSafeSummonZones(available); + } + int linked = (GetMyLinkedMMZMask() & available) & 0x1F; + int unlinked = (available & 0x1F) & ~linked; + + int choose; + if (avoidLinkedZones && unlinked != 0) + choose = LowestBit(unlinked); // Not linked zone + else if (linked != 0) + choose = LowestBit(linked); // Default + else + choose = LowestBit(available & 0x1F); + + AI.SelectPlace(choose); + return choose; + } + SelectSTPlace(Card, true); + return base.OnSelectPlace(cardId, player, location, available); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + if (CheckAtAdvantage() && Duel.Turn > 1) + { + return false; + } + } + return DefaultAshBlossomAndJoyousSpring(); + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsMonsterShouldBeDisabledBeforeItUseEffect() && !m.IsDisabled() && Duel.LastChainPlayer != 0) + { + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(m); + return true; + } + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || (Util.IsChainTarget(Card)) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + List enemyMonsters = Enemy.GetMonsters(); + AI.SelectCard(target); + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + if ((LastChainCard == null || LastChainCard.Controller != 1 || LastChainCard.Location != CardLocation.MonsterZone + || LastChainCard.IsDisabled() || LastChainCard.IsShouldNotBeTarget() || LastChainCard.IsShouldNotBeSpellTrapTarget())) + return false; + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (LastChainCard != null) AI.SelectCard(LastChainCard); + else + { + List enemyMonsters = Enemy.GetMonsters(); + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach (ClientCard card in enemyMonsters) + { + if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + { + AI.SelectCard(card); + return true; + } + } + } + return true; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && c.IsCode(code))); + return true; + } + } + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage() && Duel.Turn > 1) + { + return false; + } + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentDestroyCardList.Add(graveTarget); + return true; + } + } + + foreach (ClientCard graveCard in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(graveCard) && graveCard.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = graveCard.Id; + AI.SelectCard(graveCard); + currentDestroyCardList.Add(graveCard); + return true; + } + } + + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentDestroyCardList.Add(enemyMonsters[0]); + return true; + } + } + } + + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count > 0) + { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentDestroyCardList.Add(targets[0]); + return true; + } + + return false; + } + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + List onlyOneSetList = new List { }; + if (onlyOneSetList.Contains(Card.Id) && Bot.HasInSpellZone(Card.Id)) + { + return false; + } + + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + if (Card.IsCode(CardId.MalissC_MTP07)) mtp07SetThisTurn = true; + if (Card.IsCode(CardId.MalissC_GWC06)) gwc06SetThisTurn = true; + return true; + } + + return false; + } + + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom) || card.HasSetcode(SetcodeHorus) || card.HasSetcode(SetcodeDarkWorld) || card.HasSetcode(SetcodeSkyStriker))).ToList(); + List dangerMonsterIdList = new List { 99937011, 63542003, 9411399, 28954097, 30680659, 32731036 }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= ((int)type & (int)CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (((int)type & (int)CardType.Spell) != 0) || (((int)type & (int)CardType.Trap) != 0); + bool isCounter = ((int)type & (int)CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck && CheckSpellWillBeNegate(isCounter)) + return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) return true; + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + if (target == null) target = Card; + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + return false; + } + + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (DefaultCheckWhetherCardIsNegated(lastcard)) return false; + if (Duel.Turn == 1 && lastcard.IsCode(_CardId.MaxxC)) return false; + + return true; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 && (card.IsShouldNotBeSpellTrapTarget() && !card.IsDisabled())) return false; + } + return true; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentDestroyCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType)) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !notToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget); + if (card != null) return card; + card = Enemy.MonsterZone.GetHighestAttackMonster(canBeTarget); + if (card != null) return card; + List monsters = Enemy.GetMonsters(); + if (monsters.Count > 0 && !onlyFaceup) return ShuffleCardList(monsters)[0]; + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && (ecard.HasType(CardType.Continuous) || ecard.HasType(CardType.Field) || ecard.HasType(CardType.Pendulum))).ToList(); + if (faceUpList.Count > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) return card; + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) return card; + + if (checkGrave && Enemy.Graveyard.Count > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + + private int LinkVal(ClientCard c) => (c != null && c.HasType(CardType.Link)) ? Math.Max(1, c.LinkCount) : 1; + private static readonly int EMZ_LEFT = 5; + private static readonly int EMZ_RIGHT = 6; + private bool IsInEMZ(ClientCard c) + { + var mz = Bot.MonsterZone; + return (mz.Length > 5 && mz[5] == c) || (mz.Length > 6 && mz[6] == c); + } + + private bool HasFreeEMZ() + { + var mz = Bot.MonsterZone; + bool slot5Free = mz.Length > 5 && mz[5] == null; + bool slot6Free = mz.Length > 6 && mz[6] == null; + return slot5Free || slot6Free; + } + #endregion + + #region work space #1 + public override void OnChainSolved(int chainIndex) + { + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + var solving = Duel.GetCurrentSolvingChainCard(); + bool neg = Duel.IsCurrentSolvingChainNegated(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + { + if (currentCard.IsCode(CardId.Lancea)) enemyActivateLancea = true; + if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; + if (currentCard.IsCode(CardId.Fuwalos)) enemyActivateFuwalos = true; + if (currentCard.IsCode(_CardId.LockBird)) enemyActivateLockBird = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + var last = Duel.GetCurrentSolvingChainCard(); + if (last != null) + { + if (last.IsSpell() && (last.HasType(CardType.Field) || last.HasType(CardType.Continuous) || last.HasType(CardType.Equip))) + _oppJustActivatedPersistentSpell = true; + _prefWindowTTL = Math.Max(_prefWindowTTL, 2); + } + } + if (currentCard != null && currentCard.Controller == 0 && currentCard.IsCode(CardId.SplashMage)) + { + if (Duel.IsCurrentSolvingChainNegated()) + splashNegatedThisTurn = true; + } + } + public override void OnChainEnd() + { + escapeTargetList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + _oppJustActivatedPersistentSpell = false; + int curMon = Enemy.GetMonsterCount(); + if (curMon > _enemyMonsterCountSnap) _oppJustSummoned = true; + _enemyMonsterCountSnap = curMon; + int curFD = Enemy.SpellZone.Count(c => c != null && c.IsFacedown()); + if (curFD > _enemyFacedownSTSnap) _oppJustSet = true; + _enemyFacedownSTSnap = curFD; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || (checkTarget.Location != CardLocation.SpellZone && checkTarget.Location != CardLocation.MonsterZone)) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + base.OnChainEnd(); + } + public override void OnNewTurn() + { + if (Duel.Player == 0) + { + myTurnCount++; + } + enemyActivateLancea = false; //added for Maliss + enemyActivateFuwalos = false; //added + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + enemyActivateInfiniteImpermanenceFromHand = false; + if (dimensionShifterCount > 0) dimensionShifterCount--; + infiniteImpermanenceList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + sendToGYThisTurn.Clear(); + activatedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + summonThisTurn.Clear(); + + // reset Maliss flags + usedNormalSummon = false; + ssChessyCat = false; + ssDormouse = false; + ssMarchHare = false; + ssWhiteRabbit = false; + ActiveMarchHare = false; + ActiveUnderground = false; + step1Done = false; + step2Done = false; + lastRevivedIdBySplash = 0; + mtp07SetThisTurn = false; + gwc06SetThisTurn = false; + splashNegatedThisTurn = false; + ssRRThisTurn = false; + ssWBThisTurn = false; + ssHCThisTurn = false; + _didSplashToRR = _didRRtoWicckid = _didSummonToWicckidArrow = _didWBFromWicckid = false; + _finishPlanDecided = false; + _preferWicckidArrows = false; + _rrSelfSSPlacing = false; + _forceTranscodeBit = 0; + _oppJustActivatedPersistentSpell = false; + _oppJustSummoned = false; + _oppJustSet = false; + _enemyMonsterCountSnap = Enemy.GetMonsterCount(); + _enemyFacedownSTSnap = Enemy.SpellZone.Count(c => c != null && c.IsFacedown()); + _prefWindowTTL = 0; + fullBoard1 = false; + Allied_End = false; + nsplan = false; + nsBackupplan = false; + NSDorMouse = false; + nsLanceaplan = false; + base.OnNewTurn(); + } + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.MalissQ_WhiteBinder, 0)) + { + bool anyGY = (Bot.Graveyard.Count > 0) || (Enemy.Graveyard.Count > 0); + return anyGY; + } + return base.OnSelectYesNo(desc); + } + private bool DontSelfNG() { return Duel.LastChainPlayer != 0; } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + var solving = Duel.GetCurrentSolvingChainCard(); + if (cards != null && cards.Count > 0 && solving != null) + { + if (solving.IsCode(CardId.MalissQ_RedRansom)) + { + var searchPool = cards + .Where(c => c != null && + (c.IsCode(CardId.MalissInUnderground) || + c.IsCode(CardId.MalissInTheMirror))) + .ToList(); + + if (searchPool.Count > 0) + { + bool shouldUG = ShouldSearchUnderground(); + int chooseId = 0; + if (shouldUG && searchPool.Any(c => c.IsCode(CardId.MalissInUnderground))) + { + chooseId = CardId.MalissInUnderground; + } + else if (searchPool.Any(c => c.IsCode(CardId.MalissInTheMirror))) + { + chooseId = CardId.MalissInTheMirror; + } + if (chooseId != 0) + { + var pick = searchPool.First(c => c.IsCode(chooseId)); + return new List { pick }; + } + } + } + if (hint == HintMsg.Set && solving.IsCode(CardId.MalissQ_WhiteBinder)) + { + ClientCard pick = null; + pick = cards.FirstOrDefault(c => c.Id == CardId.MalissC_GWC06 && c.Location == CardLocation.Deck); + if (pick == null) + { + pick = cards.FirstOrDefault(c => c.Id == CardId.MalissC_GWC06); + } + if (pick == null) + { + pick = cards.FirstOrDefault(c => c.Id == CardId.MalissC_MTP07); + } + if (pick != null) + { + if (pick.Id == CardId.MalissC_GWC06) + gwc06SetThisTurn = true; + else if (pick.Id == CardId.MalissC_MTP07) + mtp07SetThisTurn = true; + + return new List { pick }; + } + + } + } + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + #endregion + + + #region work space #2 + private int GetMMZCount() => Bot.MonsterZone.Take(5).Count(c => c != null); + private bool HasFreeMMZ() => GetMMZCount() < 5; + private bool HaveTwoBodies() => Bot.GetMonsterCount() >= 2; + private bool ShouldFastEndToSPLK() => + enemyActivateMaxxC || enemyActivateFuwalos; + private bool Step1Complete() + { + return Bot.HasInMonstersZone(CardId.MalissP_Dormouse) + && Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit); + } + private bool CanStartStep1() + { + if (enemyActivateLancea || ShouldFastEndToSPLK()) return false; + if (HaveTwoBodies()) return false; + if (!HasFreeMMZ()) return false; + bool haveStarterInHand = + Bot.HasInHand(CardId.MalissP_Dormouse) || + Bot.HasInHand(CardId.MalissP_WhiteRabbit) || + Bot.HasInHand(CardId.GoldSarcophagus) || + Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.MalissInUnderground); + return haveStarterInHand; + } + private bool CanContinueStep1() + { + if (enemyActivateLancea) return false; + return !HaveTwoBodies() && HasFreeMMZ(); + } + private int PickMalissTrapToSet() + { + int pref; + if (Duel.Player == 0 && Bot.HasInMonstersZone(CardId.MalissP_Dormouse) && Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit)) + { + pref = CardId.MalissC_GWC06; + } + else if (Duel.Player == 0 && (Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_RedRansom) || Bot.HasInBanished(CardId.MalissQ_RedRansom))) + { + pref = CardId.MalissC_GWC06; + } + else if (Duel.Player == 0 && Bot.HasInHand(CardId.MalissP_MarchHare) && !ActiveMarchHare && !ssWhiteRabbit) + { + pref = CardId.MalissC_GWC06; + } + else if (Duel.Player == 0 && nsBackupplan) + { + pref = CardId.MalissC_GWC06; + } + else if (Duel.Player == 1) + { + pref = CardId.MalissC_MTP07; + } + else + { + pref = CardId.MalissC_MTP07; + } + if (CheckRemainInDeck(pref) > 0) + { + return pref; + } + + return 0; + } + + private bool ActLittleKnight() + { + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SP_LITTLE_KNIGHT, 0)) + { + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetDangerousCardinEnemyGrave(false)); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + if (problemCardList.Count() > 0) + { + AI.SelectCard(problemCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + } + else if (ActivateDescription == Util.GetStringId(CardId.SP_LITTLE_KNIGHT, 1)) + { + ClientCard selfMonster = null; + foreach (ClientCard target in Bot.GetMonsters()) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target)) + { + selfMonster = target; + break; + } + } + if (selfMonster == null) + { + if (Duel.Player == 1) + { + selfMonster = Bot.GetMonsters().Where(card => card.IsAttack()).OrderBy(card => card.Attack).FirstOrDefault(); + if (!Util.IsOneEnemyBetterThanValue(selfMonster.Attack, true)) selfMonster = null; + } + } + if (selfMonster != null) + { + ClientCard nextMonster = null; + List selfTargetList = Bot.GetMonsters().Where(card => card != selfMonster).ToList(); + if (Enemy.GetMonsterCount() == 0 && selfTargetList.Count() > 0) + { + selfTargetList.Sort(CompareUsableAttack); + nextMonster = selfTargetList[0]; + escapeTargetList.Add(nextMonster); + } + if (Enemy.GetMonsterCount() > 0) + { + nextMonster = GetBestEnemyMonster(true, true); + currentDestroyCardList.Add(nextMonster); + } + if (nextMonster != null) + { + AI.SelectCard(selfMonster); + AI.SelectNextCard(nextMonster); + escapeTargetList.Add(selfMonster); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + return false; + } + public int CompareUsableAttack(ClientCard cardA, ClientCard cardB) + { + if (cardA == null && cardB == null) + return 0; + if (cardA == null) + return -1; + if (cardB == null) + return 1; + int powerA = (cardA.IsDefense() && summonThisTurn.Contains(cardA)) ? 0 : cardA.Attack; + int powerB = (cardB.IsDefense() && summonThisTurn.Contains(cardB)) ? 0 : cardB.Attack; + if (powerA < powerB) + return -1; + if (powerA == powerB) + return CardContainer.CompareCardLevel(cardA, cardB); + return 1; + } + + private bool Step1_Dormouse_NormalSummon() + { + if (!CanStartStep1()) return false; + if (usedNormalSummon) return false; + usedNormalSummon = true; + NSDorMouse = true; + return true; + } + private bool Dormouse_ForMH() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!CanContinueStep1()) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + int pick = 0; + if (goldstart || undergroundstart) + { + pick = (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0) + ? CardId.MalissP_WhiteRabbit + : CardId.MalissP_ChessyCat; + } + else + { + pick = (CheckRemainInDeck(CardId.MalissP_MarchHare) > 0) + ? CardId.MalissP_MarchHare + : (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0) + ? CardId.MalissP_WhiteRabbit + : CardId.MalissP_ChessyCat; + } + if (pick == 0) return false; + AI.SelectCard(pick); + return true; + } + + private bool Step1_WhiteRabbit_SS_FromBanished() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (enemyActivateLancea) return false; + if (Card.Id != CardId.MalissP_WhiteRabbit) return false; + if (Card.Location != CardLocation.Removed) return false; + if (Bot.LifePoints <= 300) + { + return false; + } + ssWhiteRabbit = true; + return true; + } + + private bool Step1_WhiteRabbit_SetTrapOnSummon() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_WhiteRabbit) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + + int trapToSet = PickMalissTrapToSet(); + if (trapToSet == 0) return false; + + if (trapToSet == CardId.MalissC_GWC06) + gwc06SetThisTurn = true; + + if (trapToSet == CardId.MalissC_MTP07) + mtp07SetThisTurn = true; + + AI.SelectCard(trapToSet); + SelectSafeSTZoneAwayFromImperm(); + if (Step1Complete()) step1Done = true; + return true; + } + + private bool Step1_WhiteRabbit_NormalSummon() + { + if (!CanStartStep1()) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse)) return false; + if (usedNormalSummon) return false; + usedNormalSummon = true; + return true; + } + + private bool Dormouse_SS_FromBanished() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_Dormouse) return false; + if (Card.Location != CardLocation.Removed) return false; + if (enemyActivateLancea) return false; + if (Bot.LifePoints <= 300) + { + return false; + } + ssDormouse = true; + return true; + } + private bool ChessyCat_SS_FromBanished() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_ChessyCat) return false; + if (Card.Location != CardLocation.Removed) return false; + if (enemyActivateLancea) return false; + if (Bot.LifePoints <= 300) + { + return false; + } + ssChessyCat = true; + return true; + } + + private bool SummonLittleKnightFast() + { + if (!(Bot.HasInMonstersZone(CardId.LinkSpider)|| Bot.HasInMonstersZone(CardId.Linguriboh))) return false; + if (!HaveTwoBodies()) return false; + + var mats = Bot.GetMonsters() + .Where(c => c != null && c.IsFaceup() && c.HasType(CardType.Effect)) + .OrderBy(c => c.Attack) + .Take(2).ToList(); + + if (mats.Count < 2) return false; + + AI.SelectMaterials(mats); + step1Done = true; + return true; + } + private bool SPEmer() + { + if (Bot.HasInMonstersZone(CardId.FirewallDragon) || + Bot.HasInMonstersZone(CardId.AlliedCodeTalkerIgnister) || + Bot.HasInMonstersZone(CardId.Apollousa) || + Bot.HasInMonstersZone(CardId.AccesscodeTalker)) + { + return false; + } + if (!HaveTwoBodies()) return false; + + var mats = PickLinkMatsMinCount( + targetLink: 2, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.Apollousa, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker } + ); + if (mats.Count != 2) + { + return false; + } + + AI.SelectMaterials(mats); + return true; + } + + private bool GoldSarc_StartPiece() + { + if (CheckSpellWillBeNegate()) return false; + if (enemyActivateLancea) { return false; } + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit)) { return false; } + int pick = 0; + if (!Bot.HasInMonstersZone(CardId.MalissP_Dormouse) && CheckRemainInDeck(CardId.MalissP_Dormouse) > 0 && !ssDormouse) + { pick = CardId.MalissP_Dormouse; } + else if (!Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit) && CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0 && !ssWhiteRabbit) + { pick = CardId.MalissP_WhiteRabbit; } + else if (madeIt3 && !ssChessyCat) + { pick = CardId.MalissP_ChessyCat; } + else { return false; } + if (pick == 0) return false; + + + AI.SelectCard(pick); + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + goldstart = true; + return true; + } + private bool ExistsForUnderground(int id) + { + return CheckRemainInDeck(id) > 0 + || Bot.HasInHand(id) + || Bot.HasInGraveyard(id); + } + private bool Underground_ActivateStarter() + { + if (enemyActivateLancea) return false; + if (Bot.GetMonsterCount() != 0) return false; + if (step1Done) return false; + + int pick = 0; + if (ExistsForUnderground(CardId.MalissP_Dormouse)) + pick = CardId.MalissP_Dormouse; + else if (ExistsForUnderground(CardId.MalissP_WhiteRabbit)) + pick = CardId.MalissP_WhiteRabbit; + else if (ExistsForUnderground(CardId.MalissP_ChessyCat)) + pick = CardId.MalissP_ChessyCat; + + if (pick == 0) return false; + + AI.SelectYesNo(true); + AI.SelectCard(pick); + ActiveUnderground = true; + undergroundstart = true; + return true; + } + + private bool Terra_GrabUnderground() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (CheckSpellWillBeNegate()) return false; + if (ActiveUnderground) return false; + if (Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInSpellZone(CardId.MalissInUnderground)) + return false; + AI.SelectCard(CardId.MalissInUnderground); + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + return true; + } + private bool HaveBackupOrWizardInHand() + { + return Bot.HasInHand(CardId.BackupIgnister) || Bot.HasInHand(CardId.WizardIgnister); + } + private bool HaveMHInHand() + { + return Bot.HasInHand(CardId.MalissP_MarchHare); + } + private bool IsMalissBody(ClientCard c) + { + return c != null && c.IsFaceup() && c.HasSetcode(SetcodeMaliss) + && c.IsCode(CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare); + } + private bool Emergency_NormalCat() + { + if (Bot.GetMonsterCount() != 0) return false; + if (usedNormalSummon) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) || + Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.GoldSarcophagus)) return false; + if (!HaveMHInHand()) + { + return false; + } + + usedNormalSummon = true; + return true; + } + private bool OneBody_Link1_Linguriboh() + { + if (!HaveBackupOrWizardInHand()) return false; + if (Bot.HasInMonstersZone(CardId.Linguriboh)) return false; + if (Bot.GetMonsterCount() != 1) return false; + return true; + } + private bool OneBody_Link1_Almiraj() + { + if (!HaveBackupOrWizardInHand()) return false; + if (Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ)) return false; + if (Bot.GetMonsterCount() != 1) return false; + return true; + } + private bool OneBody_Backup_SS() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + bool haveLinkAnchor = Bot.HasInMonstersZone(CardId.Linguriboh) || Bot.HasInMonstersZone(CardId.SplashMage); + if (!haveLinkAnchor) return false; + if (Card.Location != CardLocation.Hand) return false; + + avoidLinkedZones = true; + return true; + } + private bool OneBody_Backup_SearchWizard() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!Card.IsCode(CardId.BackupIgnister)) return false; + + if (Bot.Hand.Count == 0) return false; + + bool haveWizard = Bot.HasInHand(CardId.WizardIgnister); + + int searchId = 0; + if (haveWizard && CheckRemainInDeck(CardId.MalissP_MarchHare) > 0 && Bot.Hand.Count > 0) + searchId = CardId.MalissP_MarchHare; + else if (CheckRemainInDeck(CardId.MalissP_Dormouse) > 0 && nsplan && Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ)) + searchId = CardId.MalissP_Dormouse; + else if (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0 && nsBackupplan) + searchId = CardId.MalissP_WhiteRabbit; + else if (!haveWizard && CheckRemainInDeck(CardId.WizardIgnister) > 0 && Bot.Hand.Count > 0) + searchId = CardId.WizardIgnister; + else if (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0) + searchId = CardId.MalissP_WhiteRabbit; + else + return false; + + AI.SelectCard(searchId); + + var hand = Bot.Hand.Where(h => h != null).ToList(); + var candidates = hand.Where(h => h.Id != CardId.WizardIgnister).ToList(); + var discards = new List(hand.Count); + if (searchId == CardId.MalissP_Dormouse) + { + discards.AddRange(candidates.Where(c => c.Id == CardId.MalissP_Dormouse)); + } + Func> OthersExcludingTarget = () => + { + if (searchId == CardId.MalissP_MarchHare) + return candidates.Where(c => c.Id != CardId.MalissP_MarchHare); + return candidates; + }; + var othersExcludingTarget = OthersExcludingTarget().ToList(); + var dupGroups = othersExcludingTarget.GroupBy(c => c.Id) + .Where(g => g.Count() >= 2); + + discards.AddRange(dupGroups.SelectMany(g => g)); + + int[] lowValueSinglesOrder = { CardId.NibiruThePrimalBeing, + CardId.Lancea, + CardId.TERRAFORMING, + CardId.GoldSarcophagus + }; + + foreach (var id in lowValueSinglesOrder) + { + discards.AddRange(othersExcludingTarget + .Where(c => c.Id == id && dupGroups.All(g => g.Key != id))); + } + + var already = new HashSet(discards); + discards.AddRange(othersExcludingTarget.Where(c => !already.Contains(c))); + + discards = discards.Where(c => c != null).Distinct().ToList(); + + if (searchId == CardId.MalissP_Dormouse) + { + AI.SelectNextCard(searchId); + } + if (searchId == CardId.MalissP_WhiteRabbit) + { + AI.SelectNextCard(searchId); + } + else if (discards != null) + { + AI.SelectNextCard(discards); + } + else + { + return false; + } + + avoidLinkedZones = true; + if (Bot.HasInMonstersZone(CardId.Linguriboh)) blockWicckid = true; + if (GetMMZCount() >= 5 && Bot.HasInHand(CardId.WizardIgnister)) { fullBoard1 = true; } + return true; + } + private bool OneBody_Wizard_SS() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!Bot.HasInMonstersZone(CardId.Linguriboh) && !Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ)) return false; + if (Card.Location != CardLocation.Hand) return false; + + var revive = PickGYCybersePriority(); + if (revive == null) return false; + + avoidLinkedZones = true; + blockWicckid = true; + + AI.SelectCard(revive); + return true; + } + private ClientCard PickGYCybersePriority() + { + var m = PickGYMalissPriority(); + if (m != null) return m; + + var list = Bot.Graveyard.GetMatchingCards(c => + c != null && c.IsMonster() && c.HasRace(CardRace.Cyberse) && c.Level <= 4).ToList(); + return list.FirstOrDefault(); + } + private ClientCard PickGYMalissPriority() + { + int[] pref = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare + }; + foreach (var id in pref) + { + var c = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(id) && g.IsMonster()); + if (c != null) return c; + } + return null; + } + private bool TwoCC_NormalSummon() + { + if (usedNormalSummon) return false; + if (Bot.GetMonsterCount() != 0) return false; + + bool haveOtherStarter = + Bot.HasInHand(CardId.MalissP_Dormouse) || + Bot.HasInHand(CardId.MalissP_WhiteRabbit) || + Bot.HasInHand(CardId.GoldSarcophagus) || + Bot.HasInHand(CardId.MalissInUnderground); + + if (haveOtherStarter) return false; + + if (Bot.Hand.GetMatchingCards(c => c != null && c.IsCode(CardId.MalissP_ChessyCat)).Count >= 2) + { + usedNormalSummon = true; + return true; + } + return false; + } + private bool IsMalissCost(ClientCard card) + { + if (card == null) return false; + + if (card.IsCode(CardId.MalissP_ChessyCat)) + return true; + if (card.IsCode(CardId.MalissP_WhiteRabbit) && NSDorMouse && !ssWhiteRabbit) + return true; + if (card.IsCode(CardId.MalissP_WhiteRabbit) && ssWhiteRabbit) + return true; + if (card.IsCode(CardId.MalissP_Dormouse) && ssDormouse) + return true; + if (card.IsCode(CardId.MalissP_MarchHare) && ActiveMarchHare) + return true; + + return false; + } + private bool IsMalissCost2(ClientCard card) + { + if (card == null) return false; + + return + card.IsCode(CardId.MalissP_ChessyCat) || + card.IsCode(CardId.MalissP_WhiteRabbit) || + card.IsCode(CardId.MalissP_MarchHare) || + card.IsCode(CardId.MalissInUnderground); + } + private bool AnyDraw() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_ChessyCat) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (CheckWhetherNegated()) return false; + + ClientCard target = null; + + target = Bot.Hand.FirstOrDefault(c => c != null && c.IsCode(CardId.MalissInTheMirror)); + if (target == null) + { + target = Bot.Hand.FirstOrDefault(IsMalissCost); + } + if (target == null) + { + var malissDupGroup = Bot.Hand + .Where(IsMalissCost2) + .GroupBy(c => c.Id) + .FirstOrDefault(g => g.Count() >= 2); + + if (malissDupGroup != null) + { + target = malissDupGroup.First(); + } + } + if (target == null) + { + return false; + } + AI.SelectCard(target); + return true; + } + private int PickTB11CostCandidateId() + { + var field = Bot.GetMonsters() + .Where(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeMaliss)) + .ToList(); + + field = field.Where(c => + !(c.IsCode(CardId.MalissP_WhiteRabbit) && ssWhiteRabbit) && + !(c.IsCode(CardId.MalissP_ChessyCat) && ssChessyCat) && + !(c.IsCode(CardId.MalissP_MarchHare) && ssMarchHare) && + !(c.IsCode(CardId.MalissP_Dormouse) && ssDormouse) && + !(c.IsCode(CardId.MalissQ_RedRansom) && ssRRThisTurn) && + !(c.IsCode(CardId.MalissQ_WhiteBinder) && ssWBThisTurn) && + !(c.IsCode(CardId.MalissQ_HeartsCrypter) && ssHCThisTurn) + ).ToList(); + + int[] pref = { + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare, + CardId.MalissP_Dormouse, + CardId.MalissQ_RedRansom, + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_HeartsCrypter + }; + foreach (var id in pref) + if (field.Any(c => c.IsCode(id))) return id; + + return 0; + } + private int PickPFromGYForSplash() + { + if (enemyActivateLancea) + { + int[] pref2 = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare, + CardId.BackupIgnister, + CardId.WizardIgnister + }; + foreach (var id in pref2) + if (Bot.HasInGraveyard(id)) return id; + } + int[] pref = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare + }; + foreach (var id in pref) + if (Bot.HasInGraveyard(id)) return id; + return 0; + } + private bool HaveUndergroundOnHandOrField() + { + return Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInSpellZone(CardId.MalissInUnderground); + } + private bool ShouldSearchUnderground() + { + if (ActiveUnderground) return false; + if (HaveUndergroundOnHandOrField()) return false; + return CheckRemainInDeck(CardId.MalissInUnderground) > 0; + } + private bool Step2_RedRansom_Search() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + int chooseId = 0; + bool shouldUG = ShouldSearchUnderground(); + if (shouldUG) + { + chooseId = CardId.MalissInUnderground; + } + else if (CheckRemainInDeck(CardId.MalissInTheMirror) > 0) + { + chooseId = CardId.MalissInTheMirror; + } + if (chooseId == 0) return false; + + //AI.SelectCard(chooseId); go to onselectcard + step2Done = true; + avoidLinkedZones = false; + coreSetupComplete = true; + return true; + } + private List PickMaterialsForRedRansom() + { + var splash = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.SplashMage)); + if (splash == null) return new List(); + + ClientCard revived = null; + if (lastRevivedIdBySplash != 0) + revived = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(lastRevivedIdBySplash)); + + if (revived == null) + revived = Bot.MonsterZone.FirstOrDefault(c => + c != null && c.IsFaceup() && c.HasSetcode(0x1bf) && c != splash && !c.HasType(CardType.Link)); + + if (revived == null) return new List(); + return new List { splash, revived }; + } + private bool Step2_SplashMage_ReviveP() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (step2Done) return false; + + if (!Bot.HasInMonstersZone(CardId.SplashMage)) return false; + + int pick = PickPFromGYForSplash(); + if (pick == 0) return false; + + AI.SelectCard(pick); + lastRevivedIdBySplash = pick; + return true; + } + private bool Step2N_SplashMage_ReviveP() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!Bot.HasInMonstersZone(CardId.SplashMage)) return false; + + int pick = PickPFromGYForSplash(); + if (pick == 0) return false; + + AI.SelectCard(pick); + lastRevivedIdBySplash = pick; + return true; + } + private bool Step2_LinkSummon_RedRansom() + { + if (step2Done) return false; + + var mats = PickMaterialsForRedRansom(); + if (mats.Count != 2) return false; + + if (Util.GetBotAvailZonesFromExtraDeck(mats) == 0) return false; + + AI.SelectMaterials(mats); + madeIt3 = true; + return true; + } + private bool Step2N_LinkSummon_WB() + { + var mats = PickMaterialsForRedRansom(); + if (mats.Count != 2) return false; + + if (Util.GetBotAvailZonesFromExtraDeck(mats) == 0) return false; + + AI.SelectMaterials(mats); + return true; + } + private bool Step2N_LinkSummon_RedRansom() + { + if (!Bot.HasInMonstersZone(CardId.MalissP_MarchHare) || Bot.GetMonsterCount() < 3) + { + return false; + } + madeIt3 = true; + return true; + } + private bool Step2_Fallback_Wizard_AfterSplashNegated() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!splashNegatedThisTurn) return false; + if (Card.Location != CardLocation.Hand) return false; + + var revive = PickGYMalissPriority(); + if (revive == null) return false; + + avoidLinkedZones = true; + blockWicckid = true; + AI.SelectCard(revive); + return true; + } + private bool Step2_Fallback_Backup_AfterSplashNegated() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!splashNegatedThisTurn) return false; + if (Card.Location != CardLocation.Hand) return false; + + if (GetMMZCount() >= 5) return false; + + int want = !Bot.HasInHand(CardId.WizardIgnister) && CheckRemainInDeck(CardId.WizardIgnister) > 0 + ? CardId.WizardIgnister + : (CheckRemainInDeck(CardId.MalissP_MarchHare) > 0 ? CardId.MalissP_MarchHare : 0); + if (want == 0) return false; + + AI.SelectCard(want); + + var discard = Bot.Hand.FirstOrDefault(h => h != null && h.Id != CardId.WizardIgnister && h != Card); + if (discard != null) AI.SelectNextCard(discard); + + avoidLinkedZones = true; + blockWicckid = true; + return true; + } + #endregion + + #region FLOW 3: Core → Results (UG / Mirror / TP11 → Make it 3!! → Finishers) + private bool HaveUG() => Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInSpellZone(CardId.MalissInUnderground); + private bool HasSelfSSAvailable(int id) + { + if (id == CardId.MalissP_Dormouse) return !ssDormouse; + if (id == CardId.MalissP_WhiteRabbit) return !ssWhiteRabbit; + if (id == CardId.MalissP_ChessyCat) return !ssChessyCat; + if (id == CardId.MalissP_MarchHare) return !ActiveMarchHare; + return true; + } + private int PickUG_DHG_DormouseFirst() + { + int[] pref = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare + }; + + foreach (var id in pref) + { + if (!HasSelfSSAvailable(id)) continue; + if (ExistsForUnderground(id)) + return id; + } + return 0; + } + + private bool Flow3_UnderGround_Available_SSAnyPawn() + { + if (!step2Done) return false; + if (!HaveUG()) return false; + if (Card.Id != CardId.MalissInUnderground) return false; + if (resultSuccessFlag) return false; + if (GetMMZCount() >= 5) + { + AI.SelectYesNo(false); + return true; + } + if (enemyActivateLancea) + { + AI.SelectYesNo(false); + return true; + } + + int pick = 0; + + if (CheckRemainInDeck(CardId.MalissInTheMirror) > 0 && nsplan) + { + pick = CardId.MalissInTheMirror; + } + else if (CheckRemainInDeck(CardId.MalissInTheMirror) > 0 && NSDorMouse) + { + pick = CardId.MalissInTheMirror; + } + else + { + pick = PickUG_DHG_DormouseFirst(); + } + + if (pick == 0) + { + AI.SelectYesNo(false); + return true; + } + + AI.SelectYesNo(true); + AI.SelectCard(pick); + resultSuccessFlag = true; + return true; + } + private bool Mirror_Banish() + { + if (DescIs(CardId.MalissInTheMirror, 1)) + { + var gy = PickMirrorGYTargetForSearch(); + if (gy == null) return false; + + AI.SelectCard(gy); + + var wants = Mirror_SearchOrderForType(false, gy.IsMonster()); + AI.SelectNextCard(wants); + return true; + } + + if (CheckSpellWillBeNegate()) return false; + if (CheckWhetherNegated()) return false; + var cost = PickMirrorCostCandidate(); + if (cost == null) return false; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsMonsterShouldBeDisabledBeforeItUseEffect() && !m.IsDisabled() && Duel.LastChainPlayer != 0) + { + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(m); + AI.SelectNextCard(cost); + return true; + } + } + ClientCard LastChainCard = Util.GetLastChainCard(); + if ((LastChainCard == null || LastChainCard.Controller != 1 || LastChainCard.Location != CardLocation.MonsterZone + || LastChainCard.IsDisabled() || LastChainCard.IsShouldNotBeTarget() || LastChainCard.IsShouldNotBeSpellTrapTarget())) + return false; + + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (LastChainCard != null) AI.SelectCard(LastChainCard); + else + { + List enemyMonsters = Enemy.GetMonsters(); + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach (ClientCard card in enemyMonsters) + { + if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + { + AI.SelectCard(card); + } + } + } + AI.SelectNextCard(cost); + return true; + } + private bool Flow3_Link_Accesscode() + { + if (Bot.HasInExtra(CardId.AlliedCodeTalkerIgnister)) return false; + if (BlockAccesscodeOnT1()) return false; + + var avoid = new[] { CardId.AlliedCodeTalkerIgnister, CardId.FirewallDragon }; + + var mats = PickLinkMatsMinCount( + targetLink: 4, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 4, + avoidIds: avoid + ); + + if (mats.Count < 2) return false; + AI.SelectMaterials(mats); + return true; + } + private bool Flow3_BackupIgnister_AfterMakeIt3() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!madeIt3) return false; + if (Card.Location != CardLocation.Hand) return false; + + avoidLinkedZones = true; + return true; + } + private bool Flow3_WizardIgnister_AfterMakeIt3() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (!madeIt3) return false; + if (Card.Location != CardLocation.Hand) return false; + + var revive = PickGYMalissPriority(); + if (revive == null) return false; + + avoidLinkedZones = true; + AI.SelectCard(revive); + return true; + } + private bool RR_SS_FromBanished() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissQ_RedRansom) return false; + if (Card.Location != CardLocation.Removed) return false; + if (GetMMZCount() >= 5) return false; + if (Bot.LifePoints <= 900) + { + return false; + } + + int pickId = 0; + + int[] pawnOrder = { + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_Dormouse + }; + + foreach (var id in pawnOrder) + { + if (CheckRemainInDeck(id) > 0 && PawnSelfSS_AvailableId(id)) + { + pickId = id; + break; + } + } + + + bool canBanish = (pickId != 0); + AI.SelectYesNo(canBanish); + if (canBanish) + { + AI.SelectCard(pickId); + } + _rrSelfSSPlacing = true; + ssRRThisTurn = true; + return true; + } + private bool Wicckid_SearchTuner() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (CheckRemainInDeck(CardId.BackupIgnister) <= 0) return false; + var cost = PickGYCyberseForWicckidCost_Safe(); + if (cost == null) + { + return false; + } + + AI.SelectCard(cost); + AI.SelectNextCard(CardId.BackupIgnister); + avoidLinkedZones = false; + return true; + } + private bool LinkDecoder_ReviveFromGY() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Grave) { return false; } + if (Allied_End) { return false; } + return true; + } + private bool Transcode_ReviveLink3OrLower() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + + var prefer = Bot.Graveyard.GetFirstMatchingCard(c => c.IsCode(CardId.CyberseWicckid)) + ?? Bot.Graveyard.GetFirstMatchingCard(c => c.IsCode(CardId.SplashMage)) + ?? Bot.Graveyard.GetFirstMatchingCard(c => c.IsCode(CardId.MalissQ_RedRansom)) + ?? Bot.Graveyard.GetFirstMatchingCard(c => c.IsCode(CardId.MalissQ_WhiteBinder)) + ?? Bot.Graveyard + .GetMatchingCards(c => c.IsMonster() && c.HasType(CardType.Link) && c.LinkCount <= 3 && !c.IsCode(CardId.TranscodeTalker)) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + + if (prefer == null) return false; + AI.SelectCard(prefer); + avoidLinkedZones = false; + return true; + } + private bool Allied_NegateBanish() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + var allied = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.AlliedCodeTalkerIgnister)); + if (allied == null || allied.IsDisabled()) return false; + bool haveAnyLink = Bot.GetMonsters().Any(m => m != null && m.HasType(CardType.Link) && !m.IsCode(CardId.AlliedCodeTalkerIgnister)); + if (!haveAnyLink) return false; + + var cheapLinks = new List { + CardId.CyberseWicckid, + CardId.MalissQ_WhiteBinder, + CardId.TranscodeTalker, + CardId.MalissQ_RedRansom + }; + AI.SelectCard(cheapLinks.ToArray()); + return true; + } + private ClientCard GetWicckid() + { + return Bot.MonsterZone.GetFirstMatchingFaceupCard(c => c != null && c.IsCode(CardId.CyberseWicckid)); + } + private int GetLinkedMaskFor(ClientCard link) + { + if (link == null || !link.IsFaceup() || !link.HasType(CardType.Link)) return 0; + return link.GetLinkedZones() & 0x1F; + } + private bool PawnSelfSS_AvailableId(int id) + { + if (id == CardId.MalissP_Dormouse) return !ssDormouse; + if (id == CardId.MalissP_WhiteRabbit) return !ssWhiteRabbit; + if (id == CardId.MalissP_ChessyCat) return !ssChessyCat; + if (id == CardId.MalissP_MarchHare) return !ActiveMarchHare; + return false; + } + private bool QueenSelfSS_AvailableId(int id) + { + if (id == CardId.MalissQ_HeartsCrypter) return !ssHCThisTurn; + if (id == CardId.MalissQ_WhiteBinder) return !ssWBThisTurn; + if (id == CardId.MalissQ_RedRansom) return !ssRRThisTurn; + return false; + } + private bool Dormouse_Banish_Anytime() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Id != CardId.MalissP_Dormouse) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (enemyActivateLancea) return false; + if (!HasFreeMMZ()) return false; + + int pick = 0; + + if (CheckRemainInDeck(CardId.MalissP_WhiteRabbit) > 0 && PawnSelfSS_AvailableId(CardId.MalissP_WhiteRabbit)) + pick = CardId.MalissP_WhiteRabbit; + else if (CheckRemainInDeck(CardId.MalissP_ChessyCat) > 0 && PawnSelfSS_AvailableId(CardId.MalissP_ChessyCat)) + pick = CardId.MalissP_ChessyCat; + + if (pick == 0) return false; + + AI.SelectCard(pick); + return true; + } + private bool IsCyberse(ClientCard c) => c != null && c.HasType(CardType.Monster) && c.HasRace(CardRace.Cyberse); + private bool RR_HOPT_Spent_ThisTurn() => ssRRThisTurn; + private bool RR_CanStillSS_ThisTurn() + { + if (RR_HOPT_Spent_ThisTurn()) return false; + return true; + } + private int Score_WicckidCost(ClientCard c) + { + if (c == null) return int.MinValue; + if (c.IsCode(CardId.MalissQ_RedRansom) && RR_HOPT_Spent_ThisTurn()) return -999; + if (c.IsCode(CardId.MalissQ_RedRansom) && RR_CanStillSS_ThisTurn()) return 1000; + + if (c.IsCode(CardId.Linguriboh) || c.IsCode(CardId.SALAMANGREAT_ALMIRAJ)) return 120; + + if (c.IsCode(CardId.MalissP_Dormouse) && ssDormouse) return 90; + if (c.IsCode(CardId.MalissP_WhiteRabbit) && ssWhiteRabbit) return 70; + if (c.IsCode(CardId.MalissP_ChessyCat) && ssChessyCat) return 60; + if (c.IsCode(CardId.MalissP_MarchHare) && ssMarchHare) return 60; + + if (c.IsCode(CardId.BackupIgnister)) return 20; + if (c.IsCode(CardId.WizardIgnister)) return 20; + return 30; + } + private ClientCard PickGYCyberseForWicckidCost_Safe() + { + var gy = (Bot.Graveyard ?? new List()) + .Where(IsCyberse) + .ToList(); + if (gy.Count == 0) return null; + + ClientCard best = null; + int bestScore = int.MinValue; + foreach (var c in gy) + { + int sc = Score_WicckidCost(c); + if (sc > bestScore) { best = c; bestScore = sc; } + } + return best; + } + private bool BlockAccesscodeOnT1() + { + bool blocked = (Duel.Player == 0 && Duel.Turn == 1); + return blocked; + } + private bool Allied_OnSummonTrigger() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + var me = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.AlliedCodeTalkerIgnister)); + if (me == null) return false; + + bool has2300 = Bot.Graveyard.Any(c => c != null && c.IsMonster() && c.HasRace(CardRace.Cyberse) && c.Attack == 2300); + if (!has2300) return false; + + var prefer = new List { + CardId.MalissQ_RedRansom, + CardId.MalissQ_WhiteBinder, + CardId.TranscodeTalker + }; + AI.SelectCard(prefer.ToArray()); + return true; + } + private bool ShouldSummonTranscode() + { + bool haveSplashGY = Bot.HasInGraveyard(CardId.SplashMage); + bool haveRR = Bot.HasInMonstersZone(CardId.MalissQ_RedRansom); + bool haveL1 = Bot.HasInMonstersZone(CardId.LinkDecoder) || Bot.HasInGraveyard(CardId.LinkDecoder); + + return haveSplashGY && (haveRR || haveL1); + } + private bool Step_SplashToRR() + { + if (_didSplashToRR) return false; + if (Bot.HasInMonstersZone(CardId.LinkDecoder)) return false; + + if (!Bot.HasInExtra(CardId.MalissQ_RedRansom)) return false; + + var mats = PickLinkMatsMinCount( + targetLink: 2, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.CyberseWicckid } + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + + _didSplashToRR = true; + return true; + } + private bool Step_SplashToWB() + { + if (_didSplashToRR) return false; + + if (!Bot.HasInExtra(CardId.MalissQ_WhiteBinder)) return false; + + var mats = PickLinkMatsMinCount( + targetLink: 2, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.CyberseWicckid } + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + + _didSplashToRR = true; + return true; + } + private bool Step_RRtoWicckid() + { + if(enemyActivateLancea) return false; + if (blockWicckid) return true; + if (!_didSplashToRR || _didRRtoWicckid) return false; + if (!Bot.HasInExtra(CardId.CyberseWicckid)) return false; + + var rr = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.MalissQ_RedRansom)); + if (rr == null) return false; + var emzOccupant = Bot.GetMonsters().FirstOrDefault(m => m != null && m != rr && IsInEMZ(m)); + var buddy = emzOccupant ?? Bot.MonsterZone.FirstOrDefault(m => m != null && m != rr); + if (buddy == null) return false; + bool emzWillBeFree = HasFreeEMZ() || IsInEMZ(rr) || IsInEMZ(buddy); + if (!emzWillBeFree) return false; + AI.SelectCard(CardId.CyberseWicckid); + AI.SelectMaterials(new List { rr, buddy }); + wantLinkedToWicckid = true; + _preferWicckidArrows = true; + _didRRtoWicckid = true; + return true; + } + private bool Step2N_RRtoWicckid() + { + if (enemyActivateLancea) return false; + if (blockWicckid) return false; + var rr = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.MalissQ_RedRansom)); + if (rr == null) return false; + var emzOccupant = Bot.GetMonsters().FirstOrDefault(m => m != null && m != rr && IsInEMZ(m)); + var buddy = emzOccupant ?? Bot.MonsterZone.FirstOrDefault(m => m != null && m != rr); + if (buddy == null) return false; + bool emzWillBeFree = HasFreeEMZ() || IsInEMZ(rr) || IsInEMZ(buddy); + if (!emzWillBeFree) return false; + AI.SelectCard(CardId.CyberseWicckid); + AI.SelectMaterials(new List { rr, buddy }); + wantLinkedToWicckid = true; + _preferWicckidArrows = true; + _didRRtoWicckid = true; + return true; + } + private bool Step_SummonLinkDecoderToWicckid() + { + if (!_didRRtoWicckid || _didSummonToWicckidArrow) return false; + + var wic = Bot.MonsterZone.GetFirstMatchingCard(m => m != null && m.IsCode(CardId.CyberseWicckid)); + if (wic == null) return false; + + _preferWicckidArrows = true; + avoidLinkedZones = false; + + return true; + } + private bool Step1_SSLinkDecoder() + { + if ((Bot.HasInMonstersZone(CardId.MalissP_Dormouse) || + Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit) || + Bot.HasInMonstersZone(CardId.MalissP_ChessyCat) || + Bot.HasInMonstersZone(CardId.BackupIgnister)) && Bot.GetMonsterCount() == 1 && Bot.HasInHand(CardId.MalissP_MarchHare)) + { + return true; + } + return false; + } + private bool IsMalissMonster(ClientCard c) => c != null && c.IsMonster() && c.HasSetcode(0x1bf); + private bool CanMakeLinkNWithFlexibleTwo(ClientCard a, ClientCard b, int target) + { + int a1 = 1, aL = (a != null && a.HasType(CardType.Link)) ? Math.Max(1, a.LinkCount) : 1; + int b1 = 1, bL = (b != null && b.HasType(CardType.Link)) ? Math.Max(1, b.LinkCount) : 1; + return (a1 + b1 == target) || (a1 + bL == target) || (aL + b1 == target) || (aL + bL == target); + } + private bool Step_WicckidPlusOneToWB() + { + const int WB_LINK = 3; + if (!Bot.HasInExtra(CardId.MalissQ_WhiteBinder)) return false; + + var wic = GetWicckid(); + if (wic != null) + { + var partners = Bot.GetMonsters() + .Where(m => m != null && m.IsFaceup() && m != wic && m.HasType(CardType.Effect)) + .ToList(); + + Func okPair = p => (IsMalissMonster(p) || IsMalissMonster(wic)) && CanMakeLinkNWithFlexibleTwo(wic, p, WB_LINK); + + var p2 = partners.FirstOrDefault(p => !p.IsCode(CardId.MalissQ_RedRansom) && okPair(p)) + ?? partners.FirstOrDefault(p => p.IsCode(CardId.MalissQ_RedRansom) && okPair(p)); + + if (p2 != null) + { + AI.SelectMaterials(new List { wic, p2 }); + _didWBFromWicckid = true; + EnsureFinishPlanAfterWB(); + return true; + } + } + + var mats = PickLinkMatsMinCount( + targetLink: WB_LINK, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 3, + avoidIds: new[] { CardId.Apollousa, CardId.FirewallDragon, CardId.AlliedCodeTalkerIgnister }, + requireMaliss: true + ); + if (mats.Count == 0) return false; + + AI.SelectMaterials(mats); + _didWBFromWicckid = true; + EnsureFinishPlanAfterWB(); + return true; + } + private void EnsureFinishPlanAfterWB() + { + if (_finishPlanDecided) return; + + int free = Bot.MonsterZone.Count(m => m != null && !m.IsCode(CardId.MalissQ_RedRansom)); + bool canFW = Bot.HasInExtra(CardId.FirewallDragon); + bool canHC = Bot.HasInExtra(CardId.MalissQ_HeartsCrypter); + bool canAll = Bot.HasInExtra(CardId.AlliedCodeTalkerIgnister); + bool reachAllied = CanReachAlliedNow(); + + if (canFW && canHC && canAll && free >= 3 && reachAllied) + _finishPlan = FinishPlan.FW_HC_Allied; + else if (canHC && canAll && free >= 2 && reachAllied) + _finishPlan = FinishPlan.HC_Allied; + else + _finishPlan = FinishPlan.AlliedOnly; + + _finishPlanDecided = true; + } + private bool ssFromHandMH() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Hand) return false; + if (GetMMZCount() > 3) return false; + if (enemyActivateLancea) return false; + + if (Duel.Player == 0) + { + var gy = Bot.Graveyard.GetMatchingCards(c => c != null && c.HasSetcode(0x1bf) && c != Card).ToList(); + + Func, ClientCard> pickP1 = (src) => + { + int[] pref = { + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_HeartsCrypter, + CardId.MalissQ_RedRansom + }; + foreach (var id in pref) + { + var c = src.FirstOrDefault(x => x.HasType(CardType.Monster) && x.Id == id && QueenSelfSS_AvailableId(x.Id)); + if (c != null) return c; + } + return src.FirstOrDefault(x => x.HasType(CardType.Monster) && QueenSelfSS_AvailableId(x.Id)); + }; + ClientCard pick = pickP1(gy); + if (pick == null) return false; + AI.SelectCard(pick); + ssMarchHare = true; + return DontSelfNG(); + } + else + { + if (Bot.HasInGraveyard(CardId.MalissQ_WhiteBinder) && !ssWBThisTurn) + { + var Target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissQ_WhiteBinder)); + if (Target == null) return false; + AI.SelectCard(Target); + } + else if (Bot.HasInGraveyard(CardId.MalissQ_HeartsCrypter) && !ssHCThisTurn) + { + var Target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissQ_HeartsCrypter)); + if (Target == null) return false; + AI.SelectCard(Target); + } + else if (Bot.HasInGraveyard(CardId.MalissQ_RedRansom) && !ssRRThisTurn) + { + var Target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissQ_RedRansom)); + if (Target == null) return false; + AI.SelectCard(Target); + } + else + { + return false; + } + + ssMarchHare = true; + return DontSelfNG(); + } + } + private bool Step1_MH_FromHand() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Hand) return false; + if (Bot.GetMonsterCount() > 1) return false; + if (enemyActivateLancea) return false; + + if (Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit) && Bot.HasInGraveyard(CardId.MalissC_MTP07)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissC_MTP07)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + if (Bot.HasInMonstersZone(CardId.LinkDecoder) && Bot.HasInGraveyard(CardId.MalissP_Dormouse)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissP_Dormouse)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + if (Bot.HasInMonstersZone(CardId.LinkDecoder) && Bot.HasInGraveyard(CardId.MalissP_WhiteRabbit)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissP_WhiteRabbit)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + if (Bot.HasInMonstersZone(CardId.LinkDecoder) && Bot.HasInGraveyard(CardId.MalissP_ChessyCat)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissP_ChessyCat)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + if (Bot.HasInMonstersZone(CardId.Linguriboh) && Bot.HasInGraveyard(CardId.MalissP_MarchHare)) + { + var target = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(CardId.MalissP_MarchHare)); + if (target == null) return false; + AI.SelectCard(target); + ssMarchHare = true; + return DontSelfNG(); + } + + return false; + } + private bool returnFromBanish() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Removed) return false; + + var mh = Bot.Banished.GetFirstMatchingCard( + c => c.IsFaceup() && c.IsCode(CardId.MalissP_MarchHare)); + + if (mh == null) return false; + + AI.SelectCard(mh); + ActiveMarchHare = true; + return true; + } + private bool WB_OnSummon_BanishGY() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + + const int MAX_PICKS = 3; + var picks = new List(); + + if (Duel.Player == 0) + { + int freeMMZ = Math.Max(0, 5 - GetMMZCount()); + int myPawnCount = Bot.Graveyard + .GetMatchingCards(g => IsMalissPawn(g)) + .Count; + bool canUseOwnPawn = myPawnCount > 1; + + if (!ActiveMarchHare && canUseOwnPawn) + { + var mh = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_MarchHare)); + if (mh != null) picks.Add(mh); + } + + if (freeMMZ > 0 && !ssRRThisTurn && !Allied_End) + { + var rr = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissQ_RedRansom)); + if (rr != null && !picks.Contains(rr) && !ShouldSkipBanishing(rr)) + { picks.Add(rr); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssHCThisTurn && !Allied_End) + { + var hc = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissQ_HeartsCrypter)); + if (hc != null && !picks.Contains(hc) && !ShouldSkipBanishing(hc)) + { picks.Add(hc); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssWhiteRabbit && !Allied_End && canUseOwnPawn) + { + var wr = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_WhiteRabbit)); + if (wr != null && !picks.Contains(wr) && !ShouldSkipBanishing(wr)) + { picks.Add(wr); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssDormouse && !Allied_End && canUseOwnPawn) + { + var dm = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_Dormouse)); + if (dm != null && !picks.Contains(dm) && !ShouldSkipBanishing(dm)) + { picks.Add(dm); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssChessyCat && !Allied_End && canUseOwnPawn) + { + var cc = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_ChessyCat)); + if (cc != null && !picks.Contains(cc) && !ShouldSkipBanishing(cc)) + { picks.Add(cc); freeMMZ--; } + } + + if (freeMMZ >= 0 && canUseOwnPawn) + { + var target = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_ChessyCat) || g.IsCode(CardId.MalissP_Dormouse)); + picks.Add(target); + } + + picks = picks.Where(c => c != null).Distinct().Take(MAX_PICKS).ToList(); + + var threats = PickEnemyGYThreats(MAX_PICKS - picks.Count); + foreach (var t in threats) + { + if (picks.Count >= MAX_PICKS) break; + if (!picks.Contains(t)) picks.Add(t); + } + } + else + { + int freeMMZ = Math.Max(0, 5 - GetMMZCount()); + + if (!Bot.HasInSpellZone(CardId.MalissC_MTP07) && freeMMZ > 0 && !ssWhiteRabbit) + { + var wr = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_WhiteRabbit)); + if (wr != null) { picks.Add(wr); freeMMZ--; } + } + + if (picks.Count >= 0 && !Bot.HasInHand(CardId.MalissP_MarchHare) && !ActiveMarchHare) + { + var mh = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissP_MarchHare)); + if (mh != null) picks.Add(mh); + } + + if (freeMMZ > 0 && !ssRRThisTurn) + { + var rr = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissQ_RedRansom)); + if (rr != null && !picks.Contains(rr) && !ShouldSkipBanishing(rr)) + { picks.Add(rr); freeMMZ--; } + } + + if (freeMMZ > 0 && !ssHCThisTurn) + { + var hc = Bot.Graveyard.GetFirstMatchingCard(g => g.IsCode(CardId.MalissQ_HeartsCrypter)); + if (hc != null && !picks.Contains(hc) && !ShouldSkipBanishing(hc)) + { picks.Add(hc); freeMMZ--; } + } + + var threats = PickEnemyGYThreats(MAX_PICKS - picks.Count); + foreach (var t in threats) + { + if (picks.Count >= MAX_PICKS) break; + if (!picks.Contains(t)) picks.Add(t); + } + } + + if (picks.Count == 0) return false; + + if (picks.Count > MAX_PICKS) picks = picks.Take(MAX_PICKS).ToList(); + if (picks.Count < MAX_PICKS) + { + var more = PickEnemyGYThreats(MAX_PICKS - picks.Count); + foreach (var t in more) + if (!picks.Contains(t)) picks.Add(t); + } + AI.SelectCard(picks); + return true; + } + private bool IsMalissPawn(ClientCard c) + { + return c != null && ( + c.IsCode(CardId.MalissP_ChessyCat) || + c.IsCode(CardId.MalissP_WhiteRabbit) || + c.IsCode(CardId.MalissP_Dormouse) || + c.IsCode(CardId.MalissP_MarchHare) + ); + } + private List PickEnemyGYThreats(int need) + { + var result = new List(); + if (need <= 0) return result; + + var danger = GetDangerousCardinEnemyGrave(false); + foreach (var c in danger) + { + if (result.Count >= need) break; + if (!result.Contains(c)) result.Add(c); + } + + if (result.Count < need) + { + for (int i = Enemy.Graveyard.Count - 1; i >= 0 && result.Count < need; i--) + { + var c = Enemy.Graveyard[i]; + if (c == null) continue; + if (!result.Contains(c)) result.Add(c); + } + } + + if (result.Count < need) + { + foreach (var c in Enemy.Graveyard) + { + if (result.Count >= need) break; + if (!result.Contains(c)) result.Add(c); + } + } + + return result; + } + private bool WB_OnBanished_SelfSS() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Removed) return false; + if (GetMMZCount() >= 5) return false; + if (Bot.LifePoints <= 900) + { + return false; + } + AI.SelectYesNo(true); + ssWBThisTurn = true; + return true; + } + private int PickMalissTrapForWB() + { + if (CheckRemainInDeck(CardId.MalissC_GWC06) > 0 || Bot.HasInGraveyard(CardId.MalissC_GWC06)) + return CardId.MalissC_GWC06; + + if (CheckRemainInDeck(CardId.MalissC_MTP07) > 0 || Bot.HasInGraveyard(CardId.MalissC_MTP07)) + return CardId.MalissC_MTP07; + + return 0; + } + private bool WB_SetMalissTrap() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (ActivateDescription != Util.GetStringId(CardId.MalissQ_WhiteBinder, 1)) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + + + SelectSafeSTZoneAwayFromImperm(); + return true; + } + private List PickLinkMatsMinCount(int targetLink, + Func isEligible, + int minCount, + int maxCount, + IEnumerable avoidIds = null, + bool requireMaliss = false) + { + var all = Bot.GetMonsters() + .Where(m => m != null && m.IsFaceup() && isEligible(m)) + .ToList(); + if (all.Count < minCount) return new List(); + + var avoid = new HashSet(avoidIds ?? Enumerable.Empty()); + + Func, List> OrderForFirst = (src) => src.OrderByDescending(LinkValOf) + .ThenBy(m => avoid.Contains(m.Id) ? 1 : 0) + .ThenBy(m => m.Attack) + .ToList(); + + Func, List> OrderForLater = (src) => src.OrderBy(m => IsOneVal(m) ? 0 : 1) + .ThenBy(m => m.HasType(CardType.Link) ? (Math.Max(1, m.LinkCount) == 1 ? 0 : 1) : -1) + .ThenBy(LinkValOf) + .ThenBy(m => avoid.Contains(m.Id) ? 1 : 0) + .ThenBy(m => m.Attack) + .ToList(); + + var poolPreferred = all.Where(m => !avoid.Contains(m.Id)).ToList(); + var poolFallback = all.ToList(); + + int firstMaxAllowed = targetLink - Math.Max(0, minCount - 1); + + Func, List> TryPick = (pool) => + { + var chosen = new List(); + Func, int, bool> Dfs = null; + Dfs = (avail, sum) => + { + if (sum > targetLink || chosen.Count > maxCount) return false; + + if (chosen.Count >= minCount && sum == targetLink) + { + if (requireMaliss && !chosen.Any(IsMalissBody)) return false; + if (Util.GetBotAvailZonesFromExtraDeck(chosen) == 0) return false; + return true; + } + + int need = Math.Max(0, minCount - chosen.Count); + if (sum + need > targetLink) return false; + + var ordered = (chosen.Count == 0) + ? OrderForFirst(avail) + : OrderForLater(avail); + + for (int i = 0; i < ordered.Count; i++) + { + var m = ordered[i]; + var nextAvail = ordered.Where((x, idx) => idx != i).ToList(); + int lv = LinkValOf(m); + + int[] values = (chosen.Count == 0) + ? (lv > 1 ? new[] { Math.Min(lv, firstMaxAllowed), 1 } : new[] { 1 }) + : (lv > 1 ? new[] { 1, lv } : new[] { 1 }); + + foreach (var v in values.Distinct()) + { + int newSum = sum + v; + if (newSum > targetLink) continue; + + int remMin = Math.Max(0, minCount - (chosen.Count + 1)); + if (newSum + remMin > targetLink) continue; + + chosen.Add(m); + if (Dfs(nextAvail, newSum)) return true; + chosen.RemoveAt(chosen.Count - 1); + } + } + return false; + }; + + if (Dfs(OrderForFirst(pool), 0)) return chosen; + return null; + }; + + var pick = TryPick(poolPreferred); + if (pick != null && pick.Count > 0) return pick; + + pick = TryPick(poolFallback); + return pick ?? new List(); + } + private bool Link_Apo() + { + if (!(Bot.HasInMonstersZone(CardId.MalissQ_RedRansom) && + Bot.HasInMonstersZone(CardId.LinkDecoder))) return false; + + + var mats = PickLinkMatsMinCount( + targetLink: 4, + isEligible: m => m.HasType(CardType.Monster), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.TranscodeTalker, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker } + ); + if (mats.Count == 0) return false; + AI.SelectMaterials(mats); + blockWicckid = true; + return true; + } + private bool Flow3_Link_Firewall() + { + if (Bot.HasInMonstersZone(CardId.MalissQ_HeartsCrypter) && Bot.HasInMonstersZone(CardId.LinkDecoder) && Bot.HasInMonstersZone(CardId.CyberseWicckid)) + { + var mats = PickLinkMatsMinCount( + targetLink: 4, + isEligible: m => m.HasType(CardType.Monster), + minCount: 2, + maxCount: 2, + avoidIds: new[] { CardId.CyberseWicckid, CardId.Apollousa, CardId.TranscodeTalker, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker } + ); + if (mats.Count == 0) return false; + AI.SelectMaterials(mats); + return true; + } + return false; + } + private bool Step_LinkSummon_HeartsCrypter() + { + if((Bot.HasInMonstersZone(CardId.MalissQ_WhiteBinder) && Bot.HasInMonstersZone(CardId.MalissQ_RedRansom) && + Bot.HasInMonstersZone(CardId.Apollousa) && Bot.GetMonsterCount() < 5)) return false; + var cand = Bot.GetMonsters() + .Where(c => c != null && c.IsFaceup() && c.HasType(CardType.Effect)) + .ToList(); + if (cand.Count < 3) return false; + + var avoid = new HashSet { CardId.CyberseWicckid, CardId.Apollousa, CardId.AlliedCodeTalkerIgnister, CardId.AccesscodeTalker, CardId.FirewallDragon, CardId.TranscodeTalker }; + + var ordered = cand + .OrderBy(m => avoid.Contains(m.Id) ? 2 : 0) + .ThenBy(m => m.HasType(CardType.Link) ? 1 : 0) + .ThenBy(m => m.Attack) + .ToList(); + + List mats = ordered.Take(3).ToList(); + if (!mats.Any(IsMaliss)) + { + var maliss = ordered.FirstOrDefault(IsMaliss); + if (maliss == null) return false; + mats[2] = maliss; + } + + if (Util.GetBotAvailZonesFromExtraDeck(mats) == 0) return false; + AI.SelectMaterials(mats); + return true; + } + private bool HC_Quick_ReturnBanished_AndBanishField() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (ActivateDescription != Util.GetStringId(CardId.MalissQ_HeartsCrypter, 0)) return false; + if (Card.Location != CardLocation.MonsterZone) return false; + if (CheckWhetherNegated()) return false; + + RefreshNoChainWindows(); + + var banishedMaliss = GetBanishedMaliss(); + if (banishedMaliss.Count == 0) return false; + bool haveReturn = banishedMaliss.Count > 0; + + bool mustNow = GetProblematicEnemyCardList( + canBeTarget: true, + selfType: CardType.Monster | CardType.Spell | CardType.Trap + ).Count > 0; + + if (Duel.Player == 0) + { + if (!haveReturn && !mustNow) return false; + } + else + { + if (!mustNow && !IsPreferredRemovalTiming()) return false; + } + + if (!haveReturn) return false; + var ret = PickBanishedMalissForHC(banishedMaliss); + if (ret == null) return false; + + var fieldTargets = GetProblematicEnemyCardList(true, selfType: CardType.Monster | CardType.Spell | CardType.Trap); + if (fieldTargets.Count == 0) + { + var any = GetBestEnemyCard(false, true); + if (any != null) fieldTargets.Add(any); + } + if (fieldTargets.Count == 0) return false; + + AI.SelectCard(ret); + AI.SelectNextCard(fieldTargets); + ConsumePreferredWindow(); + return DontSelfNG(); + } + private List GetBanishedMaliss() + { + return Bot.Banished.GetMatchingCards(c => + c != null && c.IsFaceup() && c.HasSetcode(0x1bf)).ToList(); + } + private ClientCard PickBanishedMalissForHC(List cand) + { + cand = cand + .Where(c => !c.IsCode(CardId.MalissQ_WhiteBinder) && !c.IsCode(CardId.MalissQ_RedRansom)) + .ToList(); + if (cand.Count == 0) return null; + + return cand.OrderByDescending(ScoreForBanishedMaliss).First(); + } + private bool HC_OnBanished_SpecialSummon() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Card.Location != CardLocation.Removed) return false; + + if (GetMMZCount() >= 5) + { + return false; + } + + if (Bot.LifePoints <= 900) + { + return false; + } + + AI.SelectYesNo(true); + ssHCThisTurn = true; + return true; + } + private bool HasMalissLinkFaceup() + { + return Bot.GetMonsters().Any(c => c != null && c.IsFaceup() && c.HasSetcode(0x1bf) && c.HasType(CardType.Link)); + } + private bool CanReachAlliedNow() + { + var mats = PickLinkMatsMinCount( + targetLink: 5, + isEligible: m => m.HasType(CardType.Effect), + minCount: 3, + maxCount: 5, + avoidIds: new[] { CardId.Apollousa, CardId.FirewallDragon, CardId.AccesscodeTalker } + ); + return mats.Count > 0; + } + private bool Flow3_Link_Allied() + { + if (!(Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_RedRansom) && Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_WhiteBinder))) return false; + var mats = PickLinkMatsMinCount( + targetLink: 5, + isEligible: m => m.HasType(CardType.Effect), + minCount: 3, + maxCount: 5, + avoidIds: new[] { CardId.Apollousa, CardId.FirewallDragon, CardId.AccesscodeTalker } + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + Allied_End = true; + return true; + } + private bool Emer_Allied() + { + if(!enemyActivateLancea) return false; + if (!(Bot.HasInMonstersZone(CardId.TranscodeTalker) && Bot.HasInMonstersZone(CardId.SplashMage))) return false; + var mats = PickLinkMatsMinCount( + targetLink: 5, + isEligible: m => m.HasType(CardType.Effect), + minCount: 3, + maxCount: 3 + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + Allied_End = true; + return true; + } + private bool Emer_Allied2() + { + var myMonsters = Bot.GetMonsters().Where(m => m != null).ToList(); + if (myMonsters.Count != 3) return false; + + var link3List = myMonsters + .Where(m => m.HasType(CardType.Link) && m.LinkCount == 3) + .ToList(); + + if (link3List.Count != 1) return false; + + bool haveKeyInGY = + Bot.HasInGraveyard(CardId.MalissQ_RedRansom) || + Bot.HasInGraveyard(CardId.MalissQ_WhiteBinder) || + Bot.HasInGraveyard(CardId.TranscodeTalker); + + if (!haveKeyInGY) return false; + + var mats = PickLinkMatsMinCount( + targetLink: 5, + isEligible: m => m.HasType(CardType.Effect), + minCount: 3, + maxCount: 3 + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + Allied_End = true; + return true; + } + private ClientCard FindGWC06TargetByOrder(params int[] ids) + { + foreach (var id in ids) + { + var gy = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(id)); + if (gy != null) return gy; + + var ban = Bot.Banished.GetFirstMatchingCard(c => c != null && c.IsCode(id) && c.IsFaceup()); + if (ban != null) return ban; + } + return null; + } + private int PickGWC06CostCandidateId() + { + if (Bot.HasInMonstersZone(CardId.MalissQ_WhiteBinder) && !ssWBThisTurn) + return CardId.MalissQ_WhiteBinder; + if (Bot.HasInMonstersZone(CardId.MalissQ_RedRansom) && !ssRRThisTurn) + return CardId.MalissQ_RedRansom; + + int card = PickTB11CostCandidateId(); + if (card != 0) return card; + + return 0; + } + private ClientCard PickGWC06TargetExtend() + { + if (Duel.Turn > 2) + { + return FindGWC06TargetByOrder( + CardId.MalissQ_HeartsCrypter, + CardId.MalissQ_RedRansom, + CardId.MalissQ_WhiteBinder + ); + } + else { + return FindGWC06TargetByOrder( + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_RedRansom, + CardId.MalissQ_HeartsCrypter, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_Dormouse, + CardId.MalissP_ChessyCat, + CardId.MalissP_MarchHare + ); + } + } + private bool GWC06_MyTurn_Extend() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (Duel.Player == 0 && + GetMMZCount() >= 4 && + Bot.HasInMonstersZone(CardId.FirewallDragon) && + (Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_RedRansom) || + Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_WhiteBinder) || + Bot.HasInMonstersZoneOrInGraveyard(CardId.MalissQ_HeartsCrypter))) return false; + if (Duel.Player != 0) return false; + if (!(Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2)) return false; + if (CheckSpellWillBeNegate()) return false; + if (GetMMZCount() >= 5) return false; + if (!Bot.HasInMonstersZone(CardId.MalissQ_WhiteBinder) && !(Bot.HasInMonstersZone(CardId.MalissQ_RedRansom) && Bot.GetMonsterCount() == 1)) return false; + var target = PickGWC06TargetExtend(); + if (target == null) return false; + if (gwc06SetThisTurn) + { + int costId = PickGWC06CostCandidateId(); + if (costId == 0) return false; + AI.SelectCard(costId); + AI.SelectNextCard(target); + return DontSelfNG(); + } + AI.SelectCard(target); + return DontSelfNG(); + } + private bool GWC06_OppTurn_ReviveWB_HC() + { + if (Duel.Player != 1) return false; + if (!Bot.HasInSpellZone(CardId.MalissC_GWC06)) return false; + if (CheckSpellWillBeNegate()) return false; + if (GetMMZCount() >= 5) return false; + + var target = FindGWC06TargetByOrder( + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_HeartsCrypter + ); + if (target == null) return false; + + if (gwc06SetThisTurn) + { + int costId = PickGWC06CostCandidateId(); + if (costId == 0) return false; + AI.SelectCard(costId); + AI.SelectNextCard(target); + return DontSelfNG(); + } + + AI.SelectCard(target); + return DontSelfNG(); + } + private static int FirstBit(int mask) + { + for (int i = 0; i < 32; i++) + { + int b = 1 << i; + if ((mask & b) != 0) return b; + } + return 0; + } + private static int FirstBitFromOrder(int mask, int[] order) + { + foreach (var b in order) + if ((mask & b) != 0) return b; + return FirstBit(mask); + } + private int PreferSafeSummonZones(int available) + { + int MAIN_MASK = + (int)Zones.z0 | + (int)Zones.z1 | + (int)Zones.z2 | + (int)Zones.z3 | + (int)Zones.z4; + + int emzMask = available & ~MAIN_MASK; + + if (emzMask != 0) + return FirstBit(emzMask); + + int enemyPointed = 0; + try + { + enemyPointed = Enemy.GetLinkedZones(); + } + catch { } + + int safeMain = (available & MAIN_MASK) & ~enemyPointed; + + if (safeMain != 0) + { + return FirstBitFromOrder( + safeMain, + new[] { (int)Zones.z2, (int)Zones.z1, (int)Zones.z3, (int)Zones.z0, (int)Zones.z4 } + ); + } + + return FirstBit(available); + } + private int PickMTP07CostCandidateId() + { + return PickTB11CostCandidateId(); + } + private ClientCard PickMTP07EnemyRemovalTarget() + { + var list = GetProblematicEnemyCardList(canBeTarget: true, ignoreSpells: false, selfType: CardType.Trap); + if (list.Count > 0) return list[0]; + + var m = GetBestEnemyMonster(onlyFaceup: false, canBeTarget: true); + if (m != null) return m; + + var s = GetBestEnemySpell(onlyFaceup: false, canBeTarget: true); + if (s != null) return s; + + return Enemy.GetMonsters().FirstOrDefault(c => c != null) + ?? Enemy.GetSpells().FirstOrDefault(c => c != null); + } + private bool MTP07_ForMH() + { + if (!(Bot.GetMonsterCount() == 1 && Bot.HasInMonstersZone(CardId.MalissP_WhiteRabbit))) return false; + if (CheckSpellWillBeNegate()) return false; + if (CheckWhetherNegated()) return false; + + int searchId = PickMTP07SearchId(); + if (searchId == 0) return false; + + if (mtp07SetThisTurn) + { + int costId = PickMTP07CostCandidateId(); + if (costId == 0) return false; + AI.SelectCard(costId); + } + AI.SelectNextCard(searchId); + return DontSelfNG(); + } + private bool MTP07_OppTurn_RemoveEnemyOnly() + { + if (Duel.Player != 1) return false; + if (!HasMalissLinkFaceup()) return false; + if (CheckSpellWillBeNegate()) return false; + if (CheckWhetherNegated()) return false; + var urgent = GetProblematicEnemyCardList(canBeTarget: true, ignoreSpells: false, selfType: CardType.Trap); + if (urgent.Count == 0 && !IsPreferredRemovalTiming()) return false; + bool preBattle = Duel.Phase == DuelPhase.Main1 && Enemy.GetMonsterCount() > 0; + if (urgent.Count == 0 && !(IsPreferredRemovalTiming() || preBattle)) return false; + int searchId = PickMTP07SearchId(); + if (searchId == 0) return false; + ClientCard target = null; + if (urgent.Count > 0) + { + target = urgent[0]; + } + else if (preBattle) + { + target = Enemy.MonsterZone + .Where(c => c != null && c.IsFaceup()) + .OrderByDescending(c => c.Attack) + .FirstOrDefault(); + } + else + { + target = PickMTP07EnemyRemovalTarget(); + } + if (target == null) return false; + if (mtp07SetThisTurn) + { + int costId = PickMTP07CostCandidateId(); + if (costId == 0) return false; + AI.SelectCard(costId); + AI.SelectNextCard(searchId); + AI.SelectNextCard(target); + ConsumePreferredWindow(); + return DontSelfNG(); + } + AI.SelectCard(searchId); + AI.SelectNextCard(target); + ConsumePreferredWindow(); + return DontSelfNG(); + } + private bool Emergency_NS() + { + if (usedNormalSummon) return false; + if (Bot.GetMonsterCount() != 0) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) + || Bot.HasInHand(CardId.MalissP_ChessyCat) + || Bot.HasInHand(CardId.GoldSarcophagus) || Bot.HasInHand(CardId.MalissInUnderground)) return false; + if (!Bot.HasInHand(CardId.BackupIgnister)) return false; + usedNormalSummon = true; + nsplan = true; + return true; + } + private bool IsWicInEMZ(ClientCard wic) + { + return wic != null + && wic.Location == CardLocation.MonsterZone + && (wic.Sequence == EMZ_LEFT || wic.Sequence == EMZ_RIGHT); + } + private IEnumerable GetWicDownSeq(ClientCard wic) + { + if (!IsWicInEMZ(wic)) yield break; + if (wic.Sequence == EMZ_LEFT) { yield return 1; yield return 2; } + if (wic.Sequence == EMZ_RIGHT) { yield return 3; yield return 4; } + } + private bool IsUnderWic(ClientCard wic, ClientCard m) + { + if (wic == null || m == null) return false; + if (m.Controller != wic.Controller) return false; + if (m.Location != CardLocation.MonsterZone) return false; + if (m.Sequence < 0 || m.Sequence > 4) return false; + return GetWicDownSeq(wic).Contains(m.Sequence); + } + private ClientCard PickUnderlingForTranscode(ClientCard wic, System.Collections.Generic.IList pool) + { + if (!IsWicInEMZ(wic)) return null; + var underlings = pool.Where(x => x != null && x != wic && x.IsFaceup() + && x.Location == CardLocation.MonsterZone + && x.Controller == wic.Controller + && x.Sequence >= 0 && x.Sequence <= 4 + && IsUnderWic(wic, x) + && (x.HasType(CardType.Link) || x.HasType(CardType.Effect)) + && !x.HasType(CardType.Token)) + .ToList(); + + if (underlings.Count == 0) return null; + + var preferLD = underlings.FirstOrDefault(x => x.IsCode(CardId.LinkDecoder)); + if (preferLD != null) return preferLD; + return underlings + .OrderByDescending(x => x.HasType(CardType.Link) ? 2 : 1) + .ThenByDescending(x => x.Attack) + .FirstOrDefault(); + } + private static readonly int[] PreferCenterMainSeq = new[] { 2, 1, 3, 0, 4 }; + + private bool SummonTranscode() + { + if (!enemyActivateLancea) return false; + var wic = Bot.GetMonsters().FirstOrDefault( + x => x != null && x.IsFaceup() && x.IsCode(CardId.CyberseWicckid)); + + if (!IsWicInEMZ(wic)) return false; + + var under = PickUnderlingForTranscode(wic, Bot.GetMonsters()); + if (under == null) return false; + + SelectLinkMaterialsPair(wic, under); + + int emz = EmzBitFor(wic); + if (emz != 0) AI.SelectPlace(emz); + + return true; + } + private void SelectLinkMaterialsPair(ClientCard a, ClientCard b) + { + try + { + var mats = new System.Collections.Generic.List { a, b }; + AI.SelectMaterials(mats); + return; + } + catch { } + + AI.SelectCard(a); + AI.SelectNextCard(b); + } + private int EmzBitFor(ClientCard link) + { + if (link == null || link.Location != CardLocation.MonsterZone) return 0; + if (link.Sequence == EMZ_LEFT) return 1 << EMZ_LEFT; // 1<<5 + if (link.Sequence == EMZ_RIGHT) return 1 << EMZ_RIGHT; // 1<<6 + return 0; + } + int ChooseAndRememberWicckidEmz(int available) + { + int emzAvail = available & EMZ_ALL; + if (emzAvail == 0) return 0; + + int best = 0; + int bestScore = int.MinValue; + + foreach (int emz in new[] { EMZ_L, EMZ_R }) + { + if ((emzAvail & emz) == 0) continue; + + int score = 0; + int down = DownBitOfEmz(emz); + + if (down == MZ1 && IsMainFreeSeq(1)) score += 10; + if (down == MZ3 && IsMainFreeSeq(3)) score += 10; + + if (score > bestScore) + { + bestScore = score; + best = emz; + } + } + + if (best == 0) + best = (emzAvail & EMZ_L) != 0 ? EMZ_L : EMZ_R; + + _wicckidEmzBit = best; + return best; + } + bool IsMainFreeSeq(int seq) + { + var ms = Bot.MonsterZone.GetMonsters(); + var occupied = ms.Any(m => m != null && m.Controller == 0 && m.Sequence == seq); + return !occupied; + } + int DownBitOfEmz(int emzBit) + { + if (emzBit == EMZ_L) return MZ1; + if (emzBit == EMZ_R) return MZ3; + return 0; + } + private bool IsPreferredRemovalTiming() + { + if (Duel.Player != 1) return false; + if (_prefWindowTTL > 0) return true; + if (_oppJustActivatedPersistentSpell || _oppJustSummoned || _oppJustSet) return true; + + return false; + } + private void ConsumePreferredWindow() + { + _prefWindowTTL = 0; + _oppJustActivatedPersistentSpell = false; + _oppJustSummoned = false; + _oppJustSet = false; + } + private void RefreshNoChainWindows() + { + bool oppMain = (Duel.Player == 1) && (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2); + + int curMon = Enemy.GetMonsterCount(); + if (curMon > _enemyMonsterCountSnap) + { + _oppJustSummoned = true; + if (oppMain) _prefWindowTTL = Math.Max(_prefWindowTTL, 2); + } + _enemyMonsterCountSnap = curMon; + + int curFD = Enemy.SpellZone.Count(c => c != null && c.IsFacedown()); + if (curFD > _enemyFacedownSTSnap) + { + _oppJustSet = true; + if (oppMain) _prefWindowTTL = Math.Max(_prefWindowTTL, 2); + } + _enemyFacedownSTSnap = curFD; + + if (oppMain) + { + if (_prefWindowTTL > 0) _prefWindowTTL--; + if (_prefWindowTTL == 0) + { + _oppJustActivatedPersistentSpell = false; + _oppJustSummoned = false; + _oppJustSet = false; + } + } + else + { + _prefWindowTTL = 0; + _oppJustActivatedPersistentSpell = false; + _oppJustSummoned = false; + _oppJustSet = false; + } + } + private bool FirewallBounce_OnOppSummon() + { + if (DefaultCheckWhetherCardIdIsNegated(Card.Id)) return false; + if (ActivateDescription != Util.GetStringId(CardId.FirewallDragon, 0)) + return false; + + if (Duel.LastSummonPlayer != 1) + return false; + + var picks = new List(); + + var negateList = GetMonsterListForTargetNegate(); + if (negateList != null) + { + foreach (var c in negateList) + { + if (c == null) continue; + if (c.Controller != 1) continue; + if (!c.IsMonster()) continue; + if (!c.IsFaceup()) continue; + if (!picks.Contains(c)) + picks.Add(c); + } + } + foreach (var m in Enemy.GetMonsters().OrderByDescending(x => x.Attack)) + { + if (m == null) continue; + if (!m.IsMonster()) continue; + if (!m.IsFaceup()) continue; + if (!picks.Contains(m)) + picks.Add(m); + } + + if (picks.Count == 0) + return false; + + AI.SelectCard(picks); + return true; + } + private bool Accesscode_OnSummon_AtkUp() + { + var list = new List(); + int[] prefer = { + CardId.MalissQ_HeartsCrypter, + CardId.MalissQ_WhiteBinder, + CardId.MalissQ_RedRansom, + CardId.TranscodeTalker + }; + foreach (var id in prefer) + { + var hit = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(id)); + if (hit != null) list.Add(hit); + } + + AI.SelectCard(list); + return true; + } + + private bool Accesscode_Destroy_Ignition() + { + if (ActivateDescription != Util.GetStringId(CardId.AccesscodeTalker, 1)) + return false; + + if (Enemy.GetFieldCount() == 0) + return false; + + IEnumerable costPool = + (Bot.GetGraveyardMonsters() ?? Enumerable.Empty()) + .Where(c => c.HasType(CardType.Link)) + .Concat((Bot.GetMonsters() ?? Enumerable.Empty()) + .Where(c => c.HasType(CardType.Link) && c != Card)); + + var costList = costPool + .OrderBy(c => c.Location != CardLocation.Grave) + .ThenBy(c => c.LinkCount) + .ThenBy(c => c.Attack) + .ToList(); + + if (costList.Count == 0) + return false; + + var targets = new List(); + + targets.AddRange(Enemy.GetSpells() + .Where(s => s != null && s.IsFacedown())); + targets.AddRange(Enemy.GetSpells() + .Where(s => s != null && !s.IsFacedown())); + targets.AddRange(Enemy.GetMonsters() + .OrderByDescending(m => m.Attack)); + + if (targets.Count == 0) + return false; + + AI.SelectCard(costList); + AI.SelectNextCard(targets); + + return true; + } + private bool AlreadySSFromBanishThisTurn(ClientCard c) + { + if (c == null) return false; + if (c.Controller != 0) return false; + + if (c.IsCode(CardId.MalissP_Dormouse)) return ssDormouse; + if (c.IsCode(CardId.MalissP_WhiteRabbit)) return ssWhiteRabbit; + if (c.IsCode(CardId.MalissP_ChessyCat)) return ssChessyCat; + + if (c.IsCode(CardId.MalissQ_RedRansom)) return ssRRThisTurn; + if (c.IsCode(CardId.MalissQ_HeartsCrypter)) return ssHCThisTurn; + if (c.IsCode(CardId.MalissQ_WhiteBinder)) return ssWBThisTurn; + + return false; + } + private bool ShouldSkipBanishing(ClientCard c) + { + if (c == null) return true; + if (c.Controller != 0) return false; + if (AlreadySSFromBanishThisTurn(c)) return true; + if (c.IsCode(CardId.MalissP_MarchHare) && ActiveMarchHare) return true; + return false; + } + private bool DescIs(int cardId, params int[] idx) + { + if (ActivateDescription == -1) return true; + foreach (var i in idx) + if (ActivateDescription == Util.GetStringId(cardId, i)) return true; + return false; + } + + private ClientCard PickMirrorCostCandidate() + { + int[] handPref = { + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat, + CardId.MalissP_Dormouse, + CardId.MalissP_MarchHare + }; + foreach (var id in handPref) + { + var h = Bot.Hand.GetFirstMatchingCard(c => c != null && c.IsCode(id)); + if (h != null) return h; + } + + var fieldP = Bot.GetMonsters() + .Where(c => c != null && c.HasSetcode(0x1bf) && !c.HasType(CardType.Link)) + .OrderBy(c => c.Attack).FirstOrDefault(); + if (fieldP != null) return fieldP; + + int[] avoid = { + CardId.MalissQ_HeartsCrypter, CardId.MalissQ_WhiteBinder, CardId.MalissQ_RedRansom + }; + var weakLink = Bot.GetMonsters() + .Where(c => c != null && c.HasSetcode(0x1bf) && c.HasType(CardType.Link) && !avoid.Contains(c.Id)) + .OrderBy(c => c.Attack).FirstOrDefault(); + return weakLink; + } + + private int[] Mirror_SearchOrderForType(bool isTrap, bool isMon) + { + if (isTrap) + return new[] { CardId.MalissC_GWC06, CardId.MalissC_MTP07 }; + if (isMon) + { + if (!Bot.HasInHand(CardId.MalissP_WhiteRabbit) && NSDorMouse) + { + return new[] { CardId.MalissP_WhiteRabbit, CardId.MalissP_MarchHare, CardId.MalissP_Dormouse, CardId.MalissP_ChessyCat }; + } + else + { + return new[] { CardId.MalissP_MarchHare, CardId.MalissP_Dormouse, CardId.MalissP_WhiteRabbit, CardId.MalissP_ChessyCat }; + } + } + return new[] { CardId.MalissP_MarchHare, CardId.MalissP_Dormouse, CardId.MalissP_WhiteRabbit, CardId.MalissP_ChessyCat }; + } + + private ClientCard PickMirrorGYTargetForSearch() + { + if (NSDorMouse && !ssRRThisTurn) + { + var rr = Bot.Graveyard.GetFirstMatchingCard( + c => c != null && c.IsCode(CardId.MalissQ_RedRansom)); + + if (rr != null) + return rr; + } + int[] monPref = { CardId.MalissP_MarchHare, CardId.MalissP_Dormouse, CardId.MalissP_WhiteRabbit, CardId.MalissP_ChessyCat }; + foreach (var id in monPref) + { + var m = Bot.Graveyard.GetFirstMatchingCard(c => c != null && c.IsCode(id)); + if (m != null && CheckRemainInDeck(id) > 0) return m; + } + return null; + } + private int PickMTP07SearchId() + { + if (CheckRemainInDeck(CardId.MalissP_MarchHare) > 0) + return CardId.MalissP_MarchHare; + + int[] pawnPref = { + CardId.MalissP_Dormouse, + CardId.MalissP_WhiteRabbit, + CardId.MalissP_ChessyCat + }; + foreach (var id in pawnPref) + if (CheckRemainInDeck(id) > 0) return id; + + return 0; + } + private void SelectSafeSTZoneAwayFromImperm() + { + var safeCols = Enumerable.Range(0, 5) + .Where(seq => + { + if (Bot.SpellZone[seq] != null) return false; + if (infiniteImpermanenceList.Contains(seq)) return false; + return true; + }) + .ToList(); + + if (safeCols.Count == 0) + { + safeCols = Enumerable.Range(0, 5) + .Where(seq => Bot.SpellZone[seq] == null) + .ToList(); + } + + int mask = 0; + foreach (int seq in safeCols) mask |= (1 << seq); + AI.SelectPlace(mask); + } + private bool T3Allow() + { + if (Duel.Player != 0) return false; + if (myTurnCount < 2) return false; + if (!HaveBackupOrWizardInHand() || !Bot.HasInHand(CardId.MalissP_MarchHare)) return false; + return true; + } + private bool NSBackup() + { + if (Bot.GetMonsterCount() != 0) return false; + if (usedNormalSummon) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) || Bot.HasInHand(CardId.MalissP_ChessyCat) || + Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.GoldSarcophagus)) return false; + nsBackupplan = true; + return true; + } + private bool NSBackup_L() + { + if (Bot.GetMonsterCount() != 0) return false; + if (usedNormalSummon) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) || Bot.HasInHand(CardId.MalissP_ChessyCat) || + Bot.HasInHand(CardId.MalissP_MarchHare) || Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.GoldSarcophagus)) return false; + nsLanceaplan = true; + return true; + } + + private bool NSMH() + { + int mhCount = Bot.Hand.GetMatchingCards(c => c != null && c.IsCode(CardId.MalissP_MarchHare)).Count; + if (mhCount <2 ) return false; + if (Bot.GetMonsterCount() != 0) return false; + if (usedNormalSummon) return false; + if (Bot.HasInHand(CardId.MalissP_Dormouse) || Bot.HasInHand(CardId.MalissP_WhiteRabbit) || Bot.HasInHand(CardId.MalissP_ChessyCat) || + Bot.HasInHand(CardId.MalissInUnderground) || Bot.HasInHand(CardId.TERRAFORMING) || + Bot.HasInHand(CardId.GoldSarcophagus)) return false; + return true; + } + private bool LinguribohMHLine() + { + if (!(Bot.HasInHand(CardId.MalissP_MarchHare) && Bot.HasInMonstersZone(CardId.MalissP_MarchHare))) return false; + if (Bot.GetMonsterCount() != 1) return false; + return true; + } + private bool EmerTranscode() + { + if (!enemyActivateLancea) return false; + if (Bot.GetMonsterCount() < 3) return false; + var mats = PickLinkMatsMinCount( + targetLink: 3, + isEligible: m => m.HasType(CardType.Effect), + minCount: 2, + maxCount: 2 + ); + if (mats.Count == 0) + { + return false; + } + + AI.SelectMaterials(mats); + return true; + } + #endregion + + // ======================= END OF LIFE ==================== + } +} diff --git a/Game/AI/Decks/MalissOCGExecutor.cs b/Game/AI/Decks/MalissOCGExecutor.cs new file mode 100644 index 000000000..af71648ff --- /dev/null +++ b/Game/AI/Decks/MalissOCGExecutor.cs @@ -0,0 +1,1493 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("MalissOCG", "AI_MalissOCG")] + public class MalissOCGExecutor : DefaultExecutor + { + public class SetCode + { + public const int Maliss = 0x1bf; + } + public class CardId + { + public const int Artifact_Lancea = 34267821;//古遗物-圣枪 + public const int Dimension_Shifter = 91800273; //大宇宙人 + public const int MaxxG = 23434538; //增殖的G + public const int Mulcharmy_Fuwalos = 42141493; //欢聚友伴·茸茸长尾山雀 + public const int Infinite_Impermanence = 10045474; //无限泡影 + public const int Dominus_Impulse = 40366667; //灵王的波动 + public const int AshBlossom = 14558127; //灰流丽 + public const int CalledbytheGrave = 24224830; //墓穴的指名 + public const int Gold_Sarcophagus = 75500286; //封印之黄金柜 + public const int Wizard_Ignister = 3723262; //男巫@火灵天星 + public const int Backup_Ignister = 30118811; //备份员@火灵天星 + public const int Maliss_Chessy_Cat = 96676583; //码丽丝<兵卒>柴郡猫 + public const int Maliss_White_Rabbit = 69272449; //码丽丝<兵卒>白兔 + public const int Maliss_Dormouse = 32061192; //码丽丝<兵卒>睡鼠 + public const int Maliss_March_Hare = 20938824; //码丽丝<兵卒>三月兔 + public const int Maliss_in_the_Mirror = 93453053; //码丽丝镜中奇像 + public const int Maliss_in_Underground = 68337209; //码丽丝梦游地下界 + public const int Maliss_GWC_06 = 20726052; //码丽丝<代码>GWC-06 + public const int Maliss_TB_11 = 57111661; //码丽丝<代码>TB-11 + public const int Maliss_MTP_07 = 94722358; //码丽丝<代码>MTP-07 + + public const int Mereologic_Aggregator = 9940036; + public const int Cyberse_Desavewurm = 92422871; + public const int Allied_Code_Talker_Ignister = 39138610; //协心代码语者@火灵天星 + public const int Firewall_Dragon = 64211118; //防火龙·暗流体-新电磁泄密风 + public const int Accesscode_Talker = 86066372; //访问码语者 + public const int Maliss_Hearts_Crypter = 21848500; //码丽丝<王后>红心加密 + public const int Maliss_Red_Ransom = 68059897; //码丽丝<王后>红棋勒索 + public const int Maliss_White_Binder = 95454996; //码丽丝<王后>白棋捆绑 + public const int Transcode_Talker = 46947713; //转码语者 + public const int Splash_Mage = 59859086; //飞溅闪屏法师 + public const int Haggard_Lizardose = 9763474; //盛悴之致命毒蜥 + public const int Cyberse_Wicckid = 52698008; //电子界小男巫 + public const int Link_Decoder = 30342076; //连接解码员 + } + + public CardCount Count = new CardCount(); + public MalissOCGExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.GoToBattlePhase, GoToBattlePhase); + AddExecutor(ExecutorType.Activate, CardId.Dimension_Shifter, Effect_Enemy_Turn); + AddExecutor(ExecutorType.Activate, CardId.Mulcharmy_Fuwalos, Effect_Enemy_Turn); + AddExecutor(ExecutorType.Activate, CardId.MaxxG, Effect_Enemy_Turn); + AddExecutor(ExecutorType.Activate, CardId.Infinite_Impermanence, Effect_Infinite_Impermanence); + AddExecutor(ExecutorType.Activate, CardId.AshBlossom, DefaultAshBlossomAndJoyousSpring); + AddExecutor(ExecutorType.Activate, CardId.Dominus_Impulse, Effect_Enemy_Chain); + AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, DefaultCalledByTheGrave); + AddExecutor(ExecutorType.Activate, CardId.Maliss_White_Rabbit, Effect_White_Rabbit); + AddExecutor(ExecutorType.Activate, CardId.Haggard_Lizardose, Effect_Haggard_Lizardose); + AddExecutor(ExecutorType.Activate, CardId.Splash_Mage); + AddExecutor(ExecutorType.Activate, CardId.Cyberse_Wicckid); + AddExecutor(ExecutorType.Activate, CardId.Cyberse_Desavewurm); + AddExecutor(ExecutorType.Activate, CardId.Transcode_Talker); + AddExecutor(ExecutorType.Activate, CardId.Mereologic_Aggregator, Effect_Mereologic_Aggregator); + AddExecutor(ExecutorType.Activate, CardId.Firewall_Dragon, Effect_Firewall_Dragon); + AddExecutor(ExecutorType.Activate, CardId.Allied_Code_Talker_Ignister, Effect_Allied_Code_Talker_Ignister); + AddExecutor(ExecutorType.Activate, CardId.Maliss_White_Binder, Effect_Maliss_Link); + AddExecutor(ExecutorType.Activate, CardId.Maliss_Red_Ransom, Effect_Maliss_Link); + AddExecutor(ExecutorType.Activate, CardId.Maliss_Hearts_Crypter, Effect_Maliss_Hearts_Crypter); + AddExecutor(ExecutorType.Activate, CardId.Link_Decoder); + + AddExecutor(ExecutorType.Summon, CardId.Maliss_Dormouse, Summon_Maliss_Dormouse); + AddExecutor(ExecutorType.Summon, CardId.Maliss_White_Rabbit, Summon_Maliss_White_Rabbit); + AddExecutor(ExecutorType.Summon, CardId.Maliss_Chessy_Cat, Summon_Maliss_Chessy_Cat); + AddExecutor(ExecutorType.Summon, CardId.Backup_Ignister, Summon_Backup_Ignister); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_Dormouse, Effect_Maliss_Dormouse); + + AddExecutor(ExecutorType.SpSummon, CardId.Maliss_Red_Ransom, SP_Maliss_Link); + AddExecutor(ExecutorType.SpellSet, SpellSet_Maliss); + AddExecutor(ExecutorType.Activate, CardId.Maliss_Chessy_Cat, Effect_Maliss_Chessy_Cat); + + AddExecutor(ExecutorType.SpSummon, CardId.Splash_Mage, SP_Splash_Mage); + AddExecutor(ExecutorType.SpSummon, CardId.Haggard_Lizardose, SP_Haggard_Lizardose); + AddExecutor(ExecutorType.SpSummon, CardId.Link_Decoder, SP_Link_Decoder); + + AddExecutor(ExecutorType.SpSummon, CardId.Cyberse_Wicckid, SP_Cyberse_Wicckid); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_in_Underground, Effect_Remove); + AddExecutor(ExecutorType.Activate, CardId.Gold_Sarcophagus, Effect_Remove); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_TB_11, Effect_Maliss_TB_11); + AddExecutor(ExecutorType.Activate, CardId.Maliss_MTP_07, Effect_Maliss_MTP_07); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_March_Hare, Effect_Maliss_March_Hare); + AddExecutor(ExecutorType.Activate, CardId.Backup_Ignister); + AddExecutor(ExecutorType.Activate, CardId.Wizard_Ignister, Effect_Wizard_Ignister); + + AddExecutor(ExecutorType.Activate, CardId.Maliss_in_the_Mirror, Effect_Maliss_in_the_Mirror); + + AddExecutor(ExecutorType.SpSummon, CardId.Maliss_Hearts_Crypter, SP_Maliss_Hearts_Crypter); + AddExecutor(ExecutorType.SpSummon, CardId.Maliss_White_Binder, SP_Maliss_White_Binder); + AddExecutor(ExecutorType.Activate, CardId.Maliss_GWC_06, Effect_Maliss_GWC_06); + AddExecutor(ExecutorType.SpSummon, CardId.Firewall_Dragon, SP_Firewall_Dragon); + AddExecutor(ExecutorType.SpSummon, CardId.Allied_Code_Talker_Ignister, SP_Allied_Code_Talker_Ignister); + AddExecutor(ExecutorType.SpellSet, CardId.Maliss_in_the_Mirror); + AddExecutor(ExecutorType.SpSummon, CardId.Transcode_Talker, SP_Transcode_Talker); + AddExecutor(ExecutorType.SpellSet, SpellSet); + } + + public class CardCount + { + public int Dimension_Shifter = 0; + public int Summon = 0; + public int Phase = 0; + public List Activate = new List(); + public List ActivateRemoved = new List(); + public List Position = new List(); + public List Set = new List(); + public List Oppo = new List(); + public void Clear() + { + Activate.Clear(); + ActivateRemoved.Clear(); + Position.Clear(); + Set.Clear(); + Oppo.Clear(); + if (Dimension_Shifter > 0) + Dimension_Shifter --; + if (Summon > 0) + Summon --; + } + public void AddActivateOppo(int id) + { + Oppo.Add(id); + } + public bool CheckActivateOppo(int id) + { + return !Oppo.Contains(id); + } + public void AddSummon() + { + Summon = 1; + } + public void AddCard(int id) + { + if (id == CardId.Dimension_Shifter) + Dimension_Shifter = 2; + else + Activate.Add(id); + } + public void AddSet(int id) + { + Set.Add(id); + } + public bool CheckSet(int id) + { + return !Set.Contains(id); + } + public void AddCardRemoved(int id) + { + ActivateRemoved.Add(id); + } + public void AddPosition(int id) + { + Position.Add(id); + } + public void AddPhase() + { + Phase ++; + } + public bool CheckCard(int id) + { + if (id == CardId.Dimension_Shifter) + return Dimension_Shifter == 0; + else + return !Activate.Contains(id); + } + public bool CheckCardRemoved(int id) + { + return !ActivateRemoved.Contains(id); + } + public bool CheckPosition(int id) + { + return !Position.Contains(id); + } + public int CheckPhase() + { + return Phase; + } + public bool CheckSummon() + { + return Summon == 0; + } + } + + private struct ZoneData + { + public int Zone; + public ClientCard[] CheckZone; + } + + public override void OnNewTurn() + { + Count.AddPhase(); + Count.Clear(); + base.OnNewTurn(); + } + public override void OnChaining(int player, ClientCard card) + { + if (card.Id == CardId.Dimension_Shifter || card.Id == CardId.Artifact_Lancea) + Count.AddCard(card.Id); + else if (player == 0) + if (card.Location == CardLocation.Removed) + Count.AddCardRemoved(card.Id); + else + Count.AddCard(card.Id); + if (player == 1) + Count.AddActivateOppo(card.Id); + } + public override void OnChainEnd() + { + if (DefaultCheckWhetherCardIdIsNegated(CardId.Dimension_Shifter) && !Count.CheckCard(Card.Id)) + Count.Dimension_Shifter = 0; + Count.Oppo.Clear(); + } + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.Maliss_White_Binder, 3)) + return true; + if (desc == Util.GetStringId(CardId.Maliss_MTP_07, 3)) + return Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && (i.HasType(CardType.Field | CardType.Continuous | CardType.Equip) || i.IsFacedown())) > 0; + return base.OnSelectYesNo(desc); + } + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + if (new List{CardId.Maliss_Red_Ransom, CardId.Splash_Mage}.Contains(cardId)) + AI.SendCustomChat(0); + + if (new List{CardId.Cyberse_Wicckid, CardId.Allied_Code_Talker_Ignister}.Contains(cardId)) + { + if ((Zones.z6 & available) > 0 && (Bot.MonsterZone[3] == null || Bot.MonsterZone[4] == null)) return Zones.z6; + if ((Zones.z5 & available) > 0 && (Bot.MonsterZone[0] == null || Bot.MonsterZone[1] == null)) return Zones.z5; + } + if (Bot.HasInMonstersZone(CardId.Cyberse_Wicckid) && Count.CheckCard(CardId.Cyberse_Wicckid)) + { + int seq = 0; + for (int i = 0; i < 7; ++i) + if (Bot.MonsterZone[i] != null && Bot.MonsterZone[i].IsCode(CardId.Cyberse_Wicckid)) seq = i; + if (seq == 5) + { + if ((Zones.z1 & available) > 0) return Zones.z1; + if ((Zones.z2 & available) > 0) return Zones.z2; + } + else if (seq == 6) + { + if ((Zones.z3 & available) > 0) return Zones.z3; + if ((Zones.z4 & available) > 0) return Zones.z4; + } + } + if (cardId == CardId.Transcode_Talker) + { + if ((Zones.z6 & available) > 0 && Bot.MonsterZone[3] == null) return Zones.z6; + if ((Zones.z5 & available) > 0 && Bot.MonsterZone[1] == null) return Zones.z5; + if ((Zones.z0 & available) > 0 && Bot.MonsterZone[1] == null) return Zones.z0; + if ((Zones.z1 & available) > 0 && Bot.MonsterZone[2] == null) return Zones.z1; + if ((Zones.z2 & available) > 0 && Bot.MonsterZone[3] == null) return Zones.z2; + if ((Zones.z3 & available) > 0 && Bot.MonsterZone[4] == null) return Zones.z3; + } + if (cardId == CardId.Allied_Code_Talker_Ignister) + { + ZoneData[] zoneData = new ZoneData[] { + new ZoneData { Zone = Zones.z0, CheckZone = new ClientCard[] { Bot.MonsterZone[1] } }, + new ZoneData { Zone = Zones.z1, CheckZone = new ClientCard[] { Bot.MonsterZone[0], Bot.MonsterZone[2] } }, + new ZoneData { Zone = Zones.z2, CheckZone = new ClientCard[] { Bot.MonsterZone[1], Bot.MonsterZone[3] } }, + new ZoneData { Zone = Zones.z3, CheckZone = new ClientCard[] { Bot.MonsterZone[2], Bot.MonsterZone[4] } }, + new ZoneData { Zone = Zones.z4, CheckZone = new ClientCard[] { Bot.MonsterZone[3] } }, + new ZoneData { Zone = Zones.z5, CheckZone = new ClientCard[] { Bot.MonsterZone[0], Bot.MonsterZone[1], Bot.MonsterZone[2] } }, + new ZoneData { Zone = Zones.z6, CheckZone = new ClientCard[] { Bot.MonsterZone[2], Bot.MonsterZone[3], Bot.MonsterZone[4] } } + }; + + int maxNullCount = -1; + int selectedZone = 0; + + foreach (ZoneData data in zoneData) + { + if ((data.Zone & available) == 0) + continue; + + int nullCount = data.CheckZone.Count(card => card == null); + if (nullCount > maxNullCount) + { + maxNullCount = nullCount; + selectedZone = data.Zone; + } + } + + if (maxNullCount >= 0) + { + return selectedZone; + } + } + if ((Zones.z6 & available) > 0) return Zones.z6; + if ((Zones.z5 & available) > 0) return Zones.z5; + } + return base.OnSelectPlace(cardId, player, location, available); + } + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (AI.HaveSelectedCards()) return null; + ClientCard card = Duel.GetCurrentSolvingChainCard(); + if (card == null) + card = Card; + switch (card.Id) + { + case CardId.Maliss_White_Rabbit: + if (cards.Any(i => i.Id == CardId.Maliss_TB_11) && Count.CheckCard(CardId.Maliss_TB_11)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_TB_11).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_GWC_06) && Count.CheckCard(CardId.Maliss_GWC_06)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_GWC_06).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_MTP_07) && Count.CheckCard(CardId.Maliss_MTP_07)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_MTP_07).ToList(), cards, min, max); + break; + case CardId.Maliss_in_Underground: + if (Count.CheckSummon()) + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse && i.Location == CardLocation.Deck) + && !Bot.HasInHand(CardId.Maliss_Dormouse) + && Check_Maliss_Dormouse() + && Count.CheckCardRemoved(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse && i.Location == CardLocation.Deck).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit && i.Location == CardLocation.Deck) + && !Bot.HasInHand(CardId.Maliss_White_Rabbit) + && Check_Maliss_White_Rabbit() + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit && i.Location == CardLocation.Deck).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare && i.Location == CardLocation.Deck) && Check_Maliss_March_Hare(CardLocation.Removed) && Count.CheckCard(CardId.Maliss_March_Hare)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat && i.Location == CardLocation.Deck) + && !Bot.HasInHand(CardId.Maliss_Chessy_Cat) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat && i.Location == CardLocation.Deck).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse && i.Location == CardLocation.Deck) + && Count.CheckCardRemoved(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit && i.Location == CardLocation.Deck) + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare && i.Location == CardLocation.Deck) && Check_Maliss_March_Hare(CardLocation.Removed) && Count.CheckCard(CardId.Maliss_March_Hare)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat && i.Location == CardLocation.Deck) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + + } + return Util.CheckSelectCount(cards.Where(i => i.Location == CardLocation.Deck).ToList(), cards, min, max); + case CardId.Gold_Sarcophagus: + if (Count.CheckSummon()) + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) + && !Bot.HasInHand(CardId.Maliss_Dormouse) + && Check_Maliss_Dormouse() + && Count.CheckCardRemoved(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && !Bot.HasInHand(CardId.Maliss_White_Rabbit) + && Check_Maliss_White_Rabbit() + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && !Bot.HasInHand(CardId.Maliss_Chessy_Cat) + && Check_Maliss_Chessy_Cat() + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) + && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) + && Count.CheckCardRemoved(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat) && Check_Maliss_Chessy_Cat()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + } + break; + case CardId.Maliss_Dormouse: + if (Count.CheckSummon()) + { + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && !Bot.HasInHand(CardId.Maliss_White_Rabbit) + && Check_Maliss_White_Rabbit() + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && !Bot.HasInHand(CardId.Maliss_Chessy_Cat) + && Check_Maliss_Chessy_Cat() + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat) && Check_Maliss_Chessy_Cat()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + } + break; + case CardId.Maliss_TB_11: + if (hint == HintMsg.SpSummon) + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) && Count.CheckCardRemoved(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Count.CheckCardRemoved(CardId.Maliss_March_Hare)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + } + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) && Count.CheckCard(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) && Count.CheckCard(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) && Count.CheckCard(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + } + else if (hint == HintMsg.Remove) + { + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasType(CardType.Link)).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + break; + case CardId.Maliss_MTP_07: + if (hint == HintMsg.AddToHand) + { + if (Duel.Player == 1 && cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Count.CheckCard(CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Hand)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) && Count.CheckCard(CardId.Maliss_Dormouse)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) && Count.CheckCard(CardId.Maliss_White_Rabbit)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) && Count.CheckCard(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + } + else if (hint == HintMsg.Remove) + { + if (cards.Any(i => i.Controller == 1)) + return Util.CheckSelectCount(cards.Where(i => i.Controller == 1).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasType(CardType.Link)).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + break; + case CardId.Splash_Mage: + case CardId.Haggard_Lizardose: + case CardId.Cyberse_Wicckid: + if (hint == HintMsg.Remove) + { + if (cards.Any(i => Count.CheckCard(i.Id) && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCard(i.Id) && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => i.Location == CardLocation.Grave).ToList(), cards, min, max); + } + else if (hint == HintMsg.SpSummon) + { + if (cards.Any(i => i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Target) + { + if (cards.Any(i => i.IsCode(CardId.Haggard_Lizardose))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Haggard_Lizardose)).ToList(), cards, min, max); + } + break; + case CardId.Maliss_Red_Ransom: + if (hint == HintMsg.AddToHand) + { + List chk_cards = Bot.Graveyard.ToList(); + chk_cards.AddRange(Bot.GetSpells()); + chk_cards.AddRange(Bot.Hand); + if (cards.Any(i => i.IsCode(CardId.Maliss_in_the_Mirror)) + && Check_Maliss_in_the_Mirror(CardLocation.Removed) + && chk_cards.Any(i => i.HasType(CardType.Trap)) + && (((Bot.HasInHand(CardId.Maliss_Chessy_Cat) && Count.CheckSummon()) || Bot.HasInMonstersZone(CardId.Maliss_Chessy_Cat)) && Count.CheckCard(CardId.Maliss_Chessy_Cat) + || Bot.HasInHand(CardId.Maliss_March_Hare) && Count.CheckCard(CardId.Maliss_March_Hare) + ) && Count.CheckCard(CardId.Maliss_in_the_Mirror) + ) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_in_the_Mirror)).ToList(), cards, min, max); + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_in_the_Mirror)).ToList(), cards, min, max); + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_in_Underground)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Remove) + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + if (cards.Any(i => !i.IsCode(CardId.Maliss_Chessy_Cat) && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => !i.IsCode(CardId.Maliss_Chessy_Cat) && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + } + if (cards.Any(i => i.Id == CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed)) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_March_Hare).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Dormouse) + && Count.CheckCardRemoved(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Dormouse).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_White_Rabbit) + && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_White_Rabbit).ToList(), cards, min, max); + if (cards.Any(i => i.Id == CardId.Maliss_Chessy_Cat) + && Count.CheckCardRemoved(CardId.Maliss_Chessy_Cat) && Check_Maliss_Chessy_Cat()) + return Util.CheckSelectCount(cards.Where(i => i.Id == CardId.Maliss_Chessy_Cat).ToList(), cards, min, max); + } + break; + case CardId.Maliss_Chessy_Cat: + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (cards.Any(i => i.IsCode(CardId.Maliss_March_Hare)) && !Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss)) && !Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.IsCode(CardId.Maliss_in_the_Mirror)) && Check_Maliss_in_the_Mirror(CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.IsCode(CardId.Maliss_in_the_Mirror)).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + break; + case CardId.Maliss_White_Binder: + if (hint == HintMsg.Remove) + { + List result = new List(); + int ct = 5 - Bot.GetMonstersInMainZone().Count; + if (ct > 0 && Count.CheckCard(CardId.Allied_Code_Talker_Ignister)) + { + result.AddRange(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id) && i.Controller == 0 && i.HasType(CardType.Link))); + if (Duel.Player == 1) + result.AddRange(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id) && i.Controller == 0 && i.IsCode(CardId.Maliss_White_Rabbit))); + result.AddRange(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id) && i.Controller == 0 && i.HasType(CardType.Monster))); + result.AddRange(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id) && i.Controller == 0 && i.HasType(CardType.Spell))); + } + result.AddRange(cards.Where(i => i.Controller == 1)); + result.AddRange(cards.Where(i => TrashCards(i.Id, CardLocation.Grave))); + result.AddRange(cards.Where(i => !i.HasSetcode(SetCode.Maliss) && !i.HasType(CardType.Trap))); + result.AddRange(cards.Where(i => !i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Trap))); + if (result.Count() > max) + result = result.Take(max).ToList(); + if (result.Count() > 0) + return Util.CheckSelectCount(result, cards, result.Count(), result.Count()); + if (cards.Any(i => TrashCards(i.Id, CardLocation.Grave))) + return Util.CheckSelectCount(cards.Where(i => TrashCards(i.Id, CardLocation.Grave)).ToList(), cards, min, min); + + return Util.CheckSelectCount(cards, cards, min, min); + } + else if (hint == HintMsg.Set) + { + if (cards.Any(i => i.IsCode(CardId.Maliss_GWC_06))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_GWC_06)).ToList(), cards, min, max); + } + break; + case CardId.Maliss_March_Hare: + if (hint == HintMsg.AddToHand) + { + if (cards.Any(i => Count.CheckCard(i.Id) && i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCard(i.Id) && i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCard(i.Id) && !i.HasType(CardType.Link))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCard(i.Id) && !i.HasType(CardType.Link)).ToList(), cards, min, max); + if (cards.Any(i => !i.HasType(CardType.Link))) + return Util.CheckSelectCount(cards.Where(i => !i.HasType(CardType.Link)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Remove) + { + if (Duel.Player == 1) + { + if (Bot.GetMonstersInMainZone().Count() > 3) + { + if (cards.Any(i => i.HasType(CardType.Spell) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => i.HasType(CardType.Spell) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => !i.HasType(CardType.Link) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => !i.HasType(CardType.Link) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && i.HasType(CardType.Link) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasType(CardType.Link) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + } + } + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && !i.HasType(CardType.Trap) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && !i.HasType(CardType.Trap) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => !i.HasType(CardType.Trap) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => !i.HasType(CardType.Trap) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => Count.CheckCardRemoved(i.Id) && !i.HasType(CardType.Trap))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id) && !i.HasType(CardType.Trap)).ToList(), cards, min, max); + } + break; + case CardId.Maliss_in_the_Mirror: + if (hint == HintMsg.Remove) + { + if (!cards.Any(i => i.Location != CardLocation.Grave)) + { + if (cards.Any(i => i.HasType(CardType.Trap)) && !Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.Maliss_GWC_06) && !Bot.HasInBanished(CardId.Maliss_GWC_06)) + return Util.CheckSelectCount(cards.Where(i => i.HasType(CardType.Trap)).ToList(), cards, min, max); + } + else + { + if (cards.Any(i => i.IsCode(CardId.Maliss_Red_Ransom)) && Count.CheckCardRemoved(CardId.Maliss_Red_Ransom)) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_Red_Ransom)).ToList(), cards, min, max); + if (cards.Any(i => i.HasType(CardType.Link) && i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasType(CardType.Link) && i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + } + else if (hint == HintMsg.AddToHand) + { + if (cards.Any(i => i.IsCode(CardId.Maliss_GWC_06))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_GWC_06)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Disable) + { + if (cards.Contains(Util.GetLastChainCard())) + return Util.CheckSelectCount(new List() { Util.GetLastChainCard() }, cards, min, max); + } + break; + case CardId.Maliss_GWC_06: + if (hint == HintMsg.Remove) + { + if (cards.Any(i => Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + else if (hint == HintMsg.SpSummon) + { + if (cards.Any(i => i.IsCode(CardId.Maliss_White_Binder) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_White_Binder) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + if (cards.Any(i => i.HasType(CardType.Link) && !Count.CheckCardRemoved(i.Id) && i.Location == CardLocation.Grave)) + return Util.CheckSelectCount(cards.Where(i => i.HasType(CardType.Link) && !Count.CheckCardRemoved(i.Id) && i.Location == CardLocation.Grave).ToList(), cards, min, max); + } + break; + case CardId.Mereologic_Aggregator: + if (cards.Any(i => i.Controller == 1 && Count.CheckActivateOppo(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.Controller == 1 && Count.CheckActivateOppo(i.Id)).ToList(), cards, min, max); + return Util.CheckSelectCount(cards.Where(i => i.Controller == 1).ToList(), cards, min, max); + case CardId.Firewall_Dragon: + if (Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget() && i.IsFaceup()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && i.HasType(CardType.Field | CardType.Continuous | CardType.Equip)) > 0 + && Duel.Player == 1 && cards.Any(i => i.IsCode(CardId.Mereologic_Aggregator)) + ) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Mereologic_Aggregator)).ToList(), cards, min, max); + if (cards.Any(i => i.IsCode(CardId.Cyberse_Desavewurm))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Cyberse_Desavewurm)).ToList(), cards, min, max); + return Util.CheckSelectCount(cards.Where(i => i.Location == CardLocation.Deck).ToList(), cards, min, max); + case CardId.Allied_Code_Talker_Ignister: + if (hint == HintMsg.SpSummon) + { + if (cards.Any(i => !i.IsCode(CardId.Maliss_White_Binder))) + return Util.CheckSelectCount(cards.Where(i => !i.IsCode(CardId.Maliss_White_Binder)).ToList(), cards, max, max); + return base.OnSelectCard(cards, max, max, hint, false); + } + else if (hint == HintMsg.Release) + { + if (cards.Any(i => i.LinkCount < 4)) + return Util.CheckSelectCount(cards.Where(i => i.LinkCount < 4).ToList(), cards, max, max); + } + break; + case CardId.Backup_Ignister: + if (hint == HintMsg.AddToHand) + { + if (card.Id == CardId.Dimension_Shifter || card.Id == CardId.Artifact_Lancea) + { + if (!Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)) + && cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)) + ) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (!Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)) + && cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)) + ) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + } + if (cards.Any(i => i.IsCode(CardId.Wizard_Ignister)) && Bot.Hand.Count() > 0 + && (Bot.Graveyard.Any(i => i.HasRace(CardRace.Cyberse)) + || (Bot.HasInExtra(CardId.Link_Decoder) && Bot.GetMonsters().Any(i => i.Level <= 4 && i.HasRace(CardRace.Cyberse)) && Count.CheckCard(CardId.Dimension_Shifter)) + || (Bot.HasInExtra(CardId.Haggard_Lizardose) + && !Count.CheckCard(CardId.Dimension_Shifter) + && Count.CheckCard(CardId.Artifact_Lancea) + && Bot.GetMonsters() + .Where(i => i.IsFaceup() && (!i.HasType(CardType.Link) || i.LinkCount < 2)).ToList() + .GroupBy(i => i.Id) + .Select(i => i.First()) + .Count() >= 2) + ) + ) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Wizard_Ignister)).ToList(), cards, min, max); + if (Bot.HasInHand(CardId.Maliss_March_Hare)) + { + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + else + if (cards.Any(i => i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + } + else if (hint == HintMsg.Discard) + { + if (card.Id == CardId.Dimension_Shifter || card.Id == CardId.Artifact_Lancea) + { + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + } + if (Bot.HasInHand(CardId.Maliss_March_Hare) && !Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss))) + { + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare) && Count.CheckCardRemoved(i.Id)).ToList(), cards, min, max); + if (cards.Any(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss) && !i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + if (cards.Count(i => i.IsCode(CardId.Maliss_March_Hare)) > 1) + return Util.CheckSelectCount(cards.Where(i => i.IsCode(CardId.Maliss_March_Hare)).ToList(), cards, min, max); + } + if (cards.Any(i => TrashCards(i.Id, CardLocation.Hand))) + return Util.CheckSelectCount(cards.Where(i => TrashCards(i.Id, CardLocation.Hand)).ToList(), cards, min, max); + if (cards.Any(i => !i.HasType(CardType.Monster))) + return Util.CheckSelectCount(cards.Where(i => !i.HasType(CardType.Monster)).ToList(), cards, min, max); + if (cards.Any(i => !i.HasRace(CardRace.Cyberse))) + return Util.CheckSelectCount(cards.Where(i => !i.HasRace(CardRace.Cyberse)).ToList(), cards, min, max); + } + break; + case CardId.Wizard_Ignister: + if (cards.Any(i => i.HasSetcode(SetCode.Maliss))) + return Util.CheckSelectCount(cards.Where(i => i.HasSetcode(SetCode.Maliss)).ToList(), cards, min, max); + break; + case CardId.Maliss_Hearts_Crypter: + if (hint == HintMsg.Remove && cards.Any(i => i.Controller == 1)) + return Util.CheckSelectCount(cards.Where(i => i.Controller == 1).ToList(), cards, min, max); + break; + } + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + private bool TrashCards(int code, CardLocation loc) + { + if (loc == CardLocation.Grave) + { + List list = new List{ + CardId.MaxxG, + CardId.Artifact_Lancea, + CardId.Dimension_Shifter, + CardId.Mulcharmy_Fuwalos, + CardId.Infinite_Impermanence, + CardId.Dominus_Impulse, + CardId.AshBlossom, + CardId.CalledbytheGrave, + CardId.Gold_Sarcophagus, + + }; + return list.Contains(code); + } + else if (loc == CardLocation.Hand) + { + if (Bot.GetFieldCount() > 0 && code == CardId.Mulcharmy_Fuwalos) + return true; + if (Bot.Graveyard.Count > 0 && code == CardId.Dimension_Shifter) + return true; + } + return false; + } + private bool MonsterRepos() + { + if (!Enemy.GetMonsters().Any(i => i.IsDefense()) + && Util.GetTotalAttackingMonsterAttack(0) + Card.Attack >= Enemy.LifePoints + Util.GetTotalAttackingMonsterAttack(1) + && Card.IsDefense() + ) + return true; + return Card.IsFacedown(); + } + private bool SpellSet() + { + return Card.HasType(CardType.Trap | CardType.QuickPlay); + } + private bool SpellSet_Maliss() + { + return Card.HasType(CardType.Trap) && Card.HasSetcode(SetCode.Maliss) && Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss)); + } + private bool Effect_Enemy_Turn() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Id == CardId.Dimension_Shifter) + { + if (Duel.Player == 1 && Count.CheckCard(Card.Id)) + { + Count.AddCard(Card.Id); + return true; + } + } + return Duel.Player == 1; + } + private bool Effect_Enemy_Chain() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + ClientCard LastChainCard = Util.GetLastChainCard(); + return LastChainCard != null && LastChainCard.Controller == 1; + } + private bool Effect_Infinite_Impermanence() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (Count.CheckPosition(this_seq)) return false; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + Count.AddPosition(this_seq); + return true; + } + } + else + { + if (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone) + { + AI.SelectCard(LastChainCard); + return true; + } + } + return false; + } + private bool Effect_Maliss_Removed(int lp = 300) + { + int ct = 5 - Bot.GetMonstersInMainZone().Count; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.HasType(CardType.Monster) && !Card.IsCode(CardId.Maliss_March_Hare) + && ct - Duel.CurrentChain.Count(i => i.HasSetcode(SetCode.Maliss) + && i.Location == CardLocation.Removed + && i.HasType(CardType.Monster) + ) <= 0 + ) return false; + if (Bot.LifePoints > lp && Card.Location == CardLocation.Removed) + { + Count.AddCardRemoved(Card.Id); + return true; + } + return false; + } + private bool Effect_Maliss_Chessy_Cat() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (ActivateDescription == Util.GetStringId(CardId.Maliss_Chessy_Cat, 0)) + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) + && Count.CheckCardRemoved(i.Id) + && !i.HasType(CardType.Trap) + && (!i.IsCode(CardId.Maliss_in_the_Mirror) || Check_Maliss_in_the_Mirror(CardLocation.Removed)) + )) + { + Count.AddCard(Card.Id); + return true; + } + if (Bot.HasInHand(CardId.Maliss_March_Hare) && !Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss))) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + + if (Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) + && Count.CheckCardRemoved(i.Id) + && !i.HasType(CardType.Trap) + )) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + else + return Effect_Maliss_Removed(); + } + private bool Effect_Maliss_March_Hare() + { + if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.Allied_Code_Talker_Ignister)) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.Hand) + { + if (Duel.Player == 1 + && (!Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link)) + || Bot.GetMonstersInMainZone().Count() > 3) + ) + return false; + if (Bot.HasInMonstersZone(CardId.Maliss_Chessy_Cat) && Count.CheckCard(CardId.Maliss_Chessy_Cat)) + return false; + if (Check_Maliss_March_Hare(CardLocation.Hand)) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + else + return Effect_Maliss_Removed(); + } + private bool Effect_Maliss_Dormouse() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + Count.AddCard(Card.Id); + return true; + } + else + return Effect_Maliss_Removed(); + } + private bool Summon_Maliss_Chessy_Cat() + { + if (Check_Maliss_Chessy_Cat()) + { + Count.AddSummon(); + return true; + } + return false; + } + private bool Effect_White_Rabbit() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + Count.AddCard(Card.Id); + return true; + } + else + return Effect_Maliss_Removed(); + } + private bool Summon_Maliss_Dormouse() + { + if (Check_Maliss_Dormouse()) + { + Count.AddSummon(); + return true; + } + return false; + } + private bool Summon_Maliss_White_Rabbit() + { + if (Check_Maliss_White_Rabbit()) + { + Count.AddSummon(); + return true; + } + return false; + } + private bool Check_Maliss_in_the_Mirror(CardLocation loc) + { + if (loc == CardLocation.Removed) + { + if (!Count.CheckCard(CardId.Artifact_Lancea) || !Count.CheckCardRemoved(CardId.Maliss_March_Hare)) + return false; + List cards = Bot.Hand.ToList(); + cards.AddRange(Bot.GetMonsters()); + cards.AddRange(Bot.GetSpells()); + cards.AddRange(Bot.Graveyard); + cards.AddRange(Bot.Banished); + return Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) + && ( + (i.HasType(CardType.Monster) && cards.Count(j => j.HasType(CardType.Monster)) < 10) + || (i.HasType(CardType.Spell) && cards.Count(j => j.HasType(CardType.Spell)) < 4) + || (i.HasType(CardType.Trap) && cards.Count(j => j.HasType(CardType.Trap)) < 3) + ) + ); + } + else + { + List cards = Bot.Hand.GetMonsters(); + cards.AddRange(Bot.GetMonsters()); + return cards.Any(i => Count.CheckCardRemoved(i.Id)); + } + } + private bool Check_Maliss_Chessy_Cat() + { + return Bot.Hand.Any(i => i.HasSetcode(SetCode.Maliss) + && !i.HasType(CardType.Trap) + && i != Card && Count.CheckCardRemoved(i.Id) + ) && Count.CheckCard(CardId.Maliss_Chessy_Cat); + } + private bool Check_Maliss_White_Rabbit() + { + return Bot.Graveyard.Count(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Trap)) < 3 + && Count.CheckCard(CardId.Maliss_White_Rabbit); + } + private bool Check_Maliss_Dormouse() + { + List cards = Bot.Hand.ToList(); + cards.AddRange(Bot.GetMonsters()); + cards.AddRange(Bot.GetSpells()); + cards.AddRange(Bot.Graveyard); + cards.AddRange(Bot.Banished); + return cards.Count(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster)) < 9 + && Count.CheckCard(CardId.Maliss_Dormouse); + } + private bool Check_Maliss_March_Hare(CardLocation loc) + { + if (loc == CardLocation.Removed) + { + if (!Count.CheckCard(CardId.Artifact_Lancea)) + return false; + return (Bot.Banished.Any(i => i.HasSetcode(SetCode.Maliss) + && i.HasType(CardType.Monster) + ) || Count.CheckCard(CardId.Maliss_March_Hare)) && Count.CheckCardRemoved(CardId.Maliss_March_Hare); + } + else + { + if (!Count.CheckCard(CardId.Artifact_Lancea)) + return false; + return Bot.Graveyard.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss)); + } + } + private bool Effect_Maliss_TB_11() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Bot.GetMonsterCount() > 1 + && (!Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) || !Bot.HasInMonstersZone(CardId.Maliss_White_Binder)) + ) + return false; + if (Bot.GetMonsters().Any(i => Count.CheckCardRemoved(i.Id))) + { + Count.AddCard(Card.Id); + return true; + } + if (Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) && Count.CheckCardRemoved(CardId.Maliss_Red_Ransom)) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + private bool Effect_Maliss_MTP_07() + { + if (Duel.LastChainPlayer == 0) return false; + if (DefaultCheckWhetherCardIsNegated(Card) || Duel.Player == 0 || Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && (i.HasType(CardType.Field | CardType.Continuous | CardType.Equip) || i.IsFacedown())) == 0 || !Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))) return false; + if (Bot.GetMonsterCount() > 1 + && (!Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) || !Bot.HasInMonstersZone(CardId.Maliss_White_Binder)) + ) + return false; + if (Bot.GetMonsters().Any(i => Count.CheckCardRemoved(i.Id)) + && ((Count.CheckCard(CardId.Maliss_March_Hare) && !Bot.HasInHand(CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Hand)) + || (Count.CheckSummon() && ( + (Count.CheckCard(CardId.Maliss_Dormouse) && !Bot.HasInMonstersZone(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + || (Count.CheckCard(CardId.Maliss_White_Rabbit) && !Bot.HasInMonstersZone(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + || (Count.CheckCard(CardId.Maliss_Chessy_Cat) && !Bot.HasInMonstersZone(CardId.Maliss_Chessy_Cat) && Check_Maliss_Chessy_Cat()) + ) + ) + ) + ) + { + Count.AddCard(Card.Id); + return true; + } + if (Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) && Count.CheckCardRemoved(CardId.Maliss_Red_Ransom)) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + private bool Effect_Maliss_GWC_06() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Duel.Player == 0 && Bot.HasInGraveyard(CardId.Maliss_White_Binder)) + return false; + if (Bot.GetMonsters().Any(i => Count.CheckCardRemoved(i.Id)) && Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + private bool Effect_Remove() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + return ( + (!Bot.HasInMonstersZone(CardId.Maliss_Dormouse) && Count.CheckCard(CardId.Maliss_Dormouse) && Count.CheckCardRemoved(CardId.Maliss_Dormouse) && Check_Maliss_Dormouse()) + || (!Bot.HasInMonstersZone(CardId.Maliss_White_Rabbit) && Count.CheckCard(CardId.Maliss_White_Rabbit) && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_White_Rabbit()) + || (!Bot.HasInMonstersZone(CardId.Maliss_Chessy_Cat) && Count.CheckCard(CardId.Maliss_Chessy_Cat) && Count.CheckCardRemoved(CardId.Maliss_White_Rabbit) && Check_Maliss_Chessy_Cat()) + || (Count.CheckCardRemoved(CardId.Maliss_March_Hare) && Check_Maliss_March_Hare(CardLocation.Removed) && Bot.Banished.Any(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Monster))) + ); + } + private bool SP_Splash_Mage() + { + if (Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount < 2) < 2 + && !(Bot.HasInMonstersZone(CardId.Maliss_Red_Ransom) + && Count.CheckCardRemoved(CardId.Maliss_Red_Ransom) + && Bot.GetMonsters().Count() == 2 + && Count.CheckCard(CardId.Maliss_White_Binder)) + ) + return false; + + bool chk = false; + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + chk = Bot.Graveyard.Any(i => i.HasType(CardType.Monster) && i.HasRace(CardRace.Cyberse) && !i.HasType(CardType.Link)); + else + chk = true; + + if (chk) + { + List materials = Bot.GetMonsters().Where(card => card != null && card.IsFaceup() && !card.HasType(CardType.Link)).ToList(); + AI.SelectMaterials(materials); + } + return chk; + } + private bool SP_Cyberse_Wicckid() + { + if (!Count.CheckCard(CardId.Artifact_Lancea)) + return false; + if (!Count.CheckCard(CardId.Dimension_Shifter) && !Bot.Graveyard.Any(i => i.HasRace(CardRace.Cyberse))) + return false; + if (Bot.HasInHand(CardId.Backup_Ignister) || !Count.CheckCard(CardId.Backup_Ignister)) + return false; + if (Bot.GetMonsters().Any(i => i.IsFaceup() && i.Level <= 4 && i.HasRace(CardRace.Cyberse)) + && Bot.GetMonsterCount() == 3 && Count.CheckCard(CardId.Backup_Ignister) && Bot.Hand.Count > 0 + && Bot.HasInExtra(CardId.Maliss_Hearts_Crypter) && Bot.HasInExtra(CardId.Link_Decoder)) + { + List materials = Bot.GetMonsters().Where(card => card.IsFaceup() && card.Sequence > 4).ToList(); + materials.AddRange(Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Link)).ToList()); + AI.SelectMaterials(materials); + return true; + } + if (Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount < 2) < 2 + || (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].HasType(CardType.Link) && Bot.MonsterZone[5].LinkCount > 3) + || (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].HasType(CardType.Link) && Bot.MonsterZone[6].LinkCount > 3) + ) + return false; + if ((Bot.HasInHand(CardId.Backup_Ignister) && Count.CheckCard(CardId.Backup_Ignister) && Bot.GetMonstersInMainZone().Count() < 5) + || (Bot.HasInHand(CardId.Wizard_Ignister) && Count.CheckCard(CardId.Wizard_Ignister) + && Bot.Graveyard.Any(i => i.HasRace(CardRace.Cyberse) && i.HasAttribute(CardAttribute.Dark)) + && Bot.Graveyard.Count(i => i.HasRace(CardRace.Cyberse)) > 1 + && Bot.GetMonstersInMainZone().Count() < 4) + || (Bot.HasInHand(CardId.Maliss_March_Hare) && Count.CheckCard(CardId.Maliss_March_Hare) + && Check_Maliss_March_Hare(CardLocation.Hand) + && Bot.Graveyard.Count(i => i.HasRace(CardRace.Cyberse)) > 1 + && Bot.GetMonstersInMainZone().Count() < 4) + ) + { + List materials = Bot.GetMonsters().Where(card => card.IsFaceup() && card.Sequence > 4).ToList(); + materials.AddRange(Bot.GetMonsters().Where(card => card.IsFaceup() && !card.HasType(CardType.Link)).ToList()); + AI.SelectMaterials(materials); + return true; + } + return false; + } + private bool Effect_Haggard_Lizardose() + { + return Bot.Graveyard.Any(i => i.HasType(CardType.Monster) && i.Attack <= 2000); + } + private bool SP_Haggard_Lizardose() + { + List cards = Bot.GetMonsters().Where(i => i.IsFaceup() && (!i.HasType(CardType.Link) || i.LinkCount < 2)).ToList() + .GroupBy(i => i.Id) + .Select(i => i.First()) + .ToList(); + if (cards.Count < 2) + return false; + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea) && cards.Any(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id))) + { + List materials = cards.Where(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss)).ToList(); + materials.AddRange(cards.Where(i => !Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss))); + materials.AddRange(cards.Where(i => ! i.HasSetcode(SetCode.Maliss))); + AI.SelectMaterials(materials); + return true; + } + if (Bot.HasInExtra(CardId.Splash_Mage)) + return false; + bool chk = false; + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + chk = Bot.Graveyard.Any(i => i.HasType(CardType.Monster) && i.BaseAttack <= 2000 && Count.CheckCardRemoved(i.Id) && Count.CheckCard(i.Id) && i.HasSetcode(SetCode.Maliss)); + else + chk = Bot.GetMonsters().Any(i => i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && i.BaseAttack <= 2000 && i.HasSetcode(SetCode.Maliss)) + || Bot.Graveyard.Any(i => i.HasType(CardType.Monster) && Count.CheckCardRemoved(i.Id) && i.BaseAttack <= 2000 && i.HasSetcode(SetCode.Maliss)); + if (chk) + { + List materials = cards.Where(i => i.BaseAttack <= 2000 && Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss)).ToList(); + materials.AddRange(cards.Where(i => !materials.Contains(i))); + AI.SelectMaterials(materials); + } + return chk; + } + private bool SP_Maliss_Link() + { + if (Bot.GetMonsters().Any(i => i.HasType(CardType.Link) && i.LinkCount == 2) && Bot.GetMonsters().Any(i => !i.HasType(CardType.Link) && i.HasSetcode(SetCode.Maliss)) + || (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea) + && !(Bot.HasInExtra(new int[] {CardId.Cyberse_Wicckid, CardId.Splash_Mage}) + && Bot.Graveyard.Any(i => i.HasRace(CardRace.Cyberse)) + ) && !(Bot.HasInExtra(CardId.Haggard_Lizardose) + && Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) + && i.HasType(CardType.Monster) + && Count.CheckCardRemoved(i.Id) + ) + ) + ) + ) + { + List materials = Bot.GetMonsters().Where(card => card != null && card.IsFaceup() && card.LinkCount == 2).ToList(); + List cards = Bot.GetMonsters().Where(card => card != null && card.IsFaceup() && card.LinkCount < 2 && card.HasSetcode(SetCode.Maliss)).ToList(); + foreach (var card in cards) + { + if (materials.Count == 2) + break; + if (card.LinkCount > 2) + continue; + materials.Add(card); + } + AI.SelectMaterials(materials); + return true; + } + return false; + } + private bool Effect_Maliss_Link() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + if (Card.IsCode(CardId.Maliss_White_Binder)) + { + if (ActivateDescription == Util.GetStringId(Card.Id, 1)) + { + Count.AddCard(Card.Id); + return true; + } + else if(!Bot.Graveyard.Any(i => i.HasSetcode(SetCode.Maliss) && Count.CheckCardRemoved(i.Id)) + && Enemy.Graveyard.Count() < 3) + { + Count.AddCard(Card.Id); + return true; + } + } + Count.AddCard(Card.Id); + return true; + } + else + return Effect_Maliss_Removed(900); + } + private bool SP_Link_Decoder() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss) && i.Level <= 4 && Count.CheckCardRemoved(i.Id))){ + AI.SelectMaterials(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && i.Level <= 4 && Count.CheckCardRemoved(i.Id)).ToList()); + return true; + } + return false; + } + if (Bot.HasInHand(CardId.Maliss_March_Hare) && Count.CheckCard(CardId.Maliss_March_Hare) && Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss) && i.Level <= 4 && Count.CheckCardRemoved(i.Id))) + { + AI.SelectMaterials(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && i.Level <= 4 && Count.CheckCardRemoved(i.Id)).ToList()); + return true; + } + if (Bot.GetMonsters().Any(i => i.LinkCount < 3 && i.HasSetcode(SetCode.Maliss)) && Bot.GetMonsters().Count(i => i.LinkCount < 3) >= 3) + { + AI.SelectMaterials(Bot.GetMonsters().Where(i => i.LinkCount < 3 && i.HasSetcode(SetCode.Maliss)).ToList()); + return true; + } + if (Bot.HasInMonstersZone(CardId.Cyberse_Wicckid)) + { + AI.SelectMaterials(CardId.Cyberse_Wicckid); + return true; + } + if (Bot.HasInMonstersZone(CardId.Backup_Ignister) && Bot.HasInHand(CardId.Wizard_Ignister)) + { + AI.SelectMaterials(CardId.Backup_Ignister); + return true; + } + + return false; + } + private bool Effect_Maliss_in_the_Mirror() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (ActivateDescription == Util.GetStringId(CardId.Maliss_in_the_Mirror, 0)) + { + ClientCard LastChainCard = Util.GetLastChainCard(); + return Duel.Player == 1 && LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone; + } + else + return Effect_Maliss_Removed(0); + } + private bool SP_Maliss_Hearts_Crypter() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + { + if (Bot.HasInExtra(CardId.Maliss_Red_Ransom) || Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount < 2) < (Bot.GetMonsters().Any(i => i.HasType(CardType.Link) && i.LinkCount == 2) ? 1 : 3)) + return false; + AI.SelectMaterials(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link) || i.LinkCount < 2).ToList()); + return true; + } + if ((Bot.HasInMonstersZone(CardId.Link_Decoder) && Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount <= 2) > 2) + || Bot.GetMonsters().Count(i => !i.HasType(CardType.Link) || i.LinkCount <= 2) > 4 + ) + { + AI.SelectMaterials(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link) || i.LinkCount < 2).ToList()); + return true; + } + return false; + } + private bool SP_Maliss_White_Binder() + { + if (Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss) && i.LinkCount == 3 && Count.CheckCardRemoved(i.Id))) + { + AI.SelectMaterials(Bot.GetMonsters().Where(i => Count.CheckCardRemoved(i.Id) && i.HasSetcode(SetCode.Maliss) || i.LinkCount < 3).ToList()); + return true; + } + return false; + } + private bool Effect_Maliss_Hearts_Crypter() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + if (Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && (i.HasType(CardType.Field | CardType.Continuous | CardType.Equip) || i.IsFacedown())) > 0 && Duel.LastChainPlayer != 0) + { + Count.AddCard(Card.Id); + return true; + } + return false; + } + else + return Effect_Maliss_Removed(900); + } + private bool SP_Firewall_Dragon() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + return false; + List materials = Bot.GetMonsters().Where(i => i.IsCode(CardId.Maliss_White_Binder)).ToList(); + materials.AddRange(Bot.GetMonsters().Where(i => i.Sequence > 4 && i.HasType(CardType.Link) && i.LinkCount <= 3)); + materials.AddRange(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && !i.HasType(CardType.Link))); + materials.AddRange(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))); + materials.AddRange(Bot.GetMonsters().Where(i => i.Sequence < 5 && i.HasType(CardType.Link) && i.LinkCount <= 3)); + materials.AddRange(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link))); + if (materials.Count > 3) + materials = materials.Take(3).ToList(); + AI.SelectMaterials(materials); + return true; + } + private bool SP_Allied_Code_Talker_Ignister() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + return false; + if (Bot.GetMonsters().Count(i => i.LinkCount <= 3) < 3) return false; + List materials = Bot.GetMonsters().Where(i => i.IsCode(CardId.Maliss_White_Binder)).ToList(); + materials.AddRange(Bot.GetMonsters().Where(i => i.Sequence > 4 && i.HasType(CardType.Link) && i.LinkCount <= 3)); + materials.AddRange(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && !i.HasType(CardType.Link))); + materials.AddRange(Bot.GetMonsters().Where(i => i.HasSetcode(SetCode.Maliss) && i.HasType(CardType.Link))); + materials.AddRange(Bot.GetMonsters().Where(i => i.Sequence < 5 && i.HasType(CardType.Link) && i.LinkCount <= 3)); + materials.AddRange(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link))); + if (materials.Count > 3) + materials = materials.Take(3).ToList(); + AI.SelectMaterials(materials); + return true; + } + private bool Effect_Allied_Code_Talker_Ignister() + { + if (ActivateDescription == Util.GetStringId(CardId.Allied_Code_Talker_Ignister, 1) && Duel.LastChainPlayer == 1) + { + if (Card.Sequence > 4) + { + return Bot.GetMonsters().Any(i => i.Sequence < 3 && (!i.HasType(CardType.Link) || (i.LinkCount <= 3 && Count.CheckCard(i.Id)))); + } + else + { + return Bot.GetMonsters().Any(i => i.Sequence < 5 && (i.Sequence - Card.Sequence == 1 || Card.Sequence - i.Sequence == 1) && (!i.HasType(CardType.Link) || (i.LinkCount <= 3 && Count.CheckCard(i.Id)))); + } + } + return true; + } + private bool Effect_Mereologic_Aggregator() + { + if (Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && (i.HasType(CardType.Field | CardType.Continuous | CardType.Equip) || i.IsFacedown())) > 0) + { + ClientCard LastChainCard = Util.GetLastChainCard(); + if (LastChainCard != null && LastChainCard.Controller == 1 && (LastChainCard.Location == CardLocation.MonsterZone || LastChainCard.Location == CardLocation.SpellZone)) + AI.SelectCard(LastChainCard); + Count.AddCard(Card.Id); + return true; + } + return false; + } + private bool Effect_Firewall_Dragon() + { + if (!Count.CheckCard(CardId.Dimension_Shifter) && Count.CheckCard(CardId.Artifact_Lancea)) + return false; + return Duel.Player == 0 || ( + Enemy.GetMonsters().Count(i => !i.IsShouldNotBeTarget() && i.IsFaceup()) + Enemy.GetSpells().Count(i => !i.IsShouldNotBeTarget() && i.HasType(CardType.Field | CardType.Continuous | CardType.Equip)) > 0 + && Duel.LastChainPlayer != 0 + ); + } + private bool Summon_Backup_Ignister() + { + if (Bot.GetMonsters().Any(i => i.HasType(CardType.Link))) + return false; + Count.AddSummon(); + return true; + } + private bool SP_Transcode_Talker() + { + if (Bot.GetMonsters().Any(i => i.HasSetcode(SetCode.Maliss))) + return false; + if (!Bot.GetMonsters().Any(i => !i.HasType(CardType.Link) || i.LinkCount < 2)) + return false; + if (!Bot.GetMonsters().Any(i => i.HasType(CardType.Link) && i.LinkCount == 2)) + return false; + List materials = Bot.GetMonsters().Where(i => i.HasType(CardType.Link) && i.LinkCount == 2).ToList(); + materials.AddRange(Bot.GetMonsters().Where(i => i.IsCode(CardId.Link_Decoder))); + materials.AddRange(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link) || i.LinkCount < 2 && i.Sequence == (materials[0].Sequence > 4 ? (materials[0].Sequence == 5 ? 1 : 3) : materials[0].Sequence + 1))); + materials.AddRange(Bot.GetMonsters().Where(i => !i.HasType(CardType.Link) || i.LinkCount < 2)); + if (materials.Count > 2) + materials = materials.Take(2).ToList(); + AI.SelectMaterials(materials); + return true; + } + private bool Effect_Wizard_Ignister() + { + return Card.Location == CardLocation.Hand; + } + private bool GoToBattlePhase() + { + if (!Enemy.GetMonsters().Any(i => i.IsDefense())) + { + if (Util.GetTotalAttackingMonsterAttack(0) >= Enemy.LifePoints + Util.GetTotalAttackingMonsterAttack(1)) + { + return true; + } + } + return false; + } + } +} diff --git a/Game/AI/Decks/MathMechExecutor.cs b/Game/AI/Decks/MathMechExecutor.cs index 00a97a320..c797a0c83 100644 --- a/Game/AI/Decks/MathMechExecutor.cs +++ b/Game/AI/Decks/MathMechExecutor.cs @@ -1,4 +1,4 @@ -using System; +using System; using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using System.Diagnostics; @@ -364,7 +364,7 @@ private bool MagmaSummon() } } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (cardId == CardId.MathmechFinalSigma) { @@ -376,4 +376,4 @@ public override int OnSelectPlace(long cardId, int player, CardLocation location } -} +} \ No newline at end of file diff --git a/Game/AI/Decks/OldSchoolExecutor.cs b/Game/AI/Decks/OldSchoolExecutor.cs index 04d9d6161..bc62aa375 100644 --- a/Game/AI/Decks/OldSchoolExecutor.cs +++ b/Game/AI/Decks/OldSchoolExecutor.cs @@ -69,10 +69,10 @@ private bool DoubleSummon() if (_lastDoubleSummon == Duel.Turn) return false; - if (Main.SummonableCards.Count == 0) + if (Duel.MainPhase.SummonableCards.Count == 0) return false; - if (Main.SummonableCards.Count == 1 && Main.SummonableCards[0].Level < 5) + if (Duel.MainPhase.SummonableCards.Count == 1 && Duel.MainPhase.SummonableCards[0].Level < 5) { bool canTribute = false; foreach (ClientCard handCard in Bot.Hand) diff --git a/Game/AI/Decks/OrcustExecutor.cs b/Game/AI/Decks/OrcustExecutor.cs index 1dccb0622..e202dd8a9 100644 --- a/Game/AI/Decks/OrcustExecutor.cs +++ b/Game/AI/Decks/OrcustExecutor.cs @@ -214,11 +214,13 @@ public override void OnNewTurn() CymbalSkeletonUsed = false; BorrelswordDragonUsed = false; RustyBardicheTarget = null; + base.OnNewTurn(); } public override void OnChainEnd() { RustyBardicheTarget = null; + base.OnChainEnd(); } public override CardPosition OnSelectPosition(int cardId, IList positions) @@ -232,7 +234,7 @@ public override CardPosition OnSelectPosition(int cardId, IList po return 0; } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (location == CardLocation.SpellZone) { @@ -465,6 +467,7 @@ private bool JetSynchronSummon() private bool JetSynchronEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(HandCosts); return true; } @@ -488,6 +491,7 @@ private bool AlmirajSummon() private bool DestrudoSummon() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Bot.GetMonsterCount() < 3 && Bot.HasInExtra(new[] { CardId.CrystronNeedlefiber, CardId.KnightmarePhoenix }); } @@ -659,6 +663,7 @@ private bool KnightmarePhoenixSummon() private bool KnightmarePhoenixEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int costcount = Bot.Hand.GetMatchingCardsCount(card => card.IsCode(HandCosts)); ClientCard target = Enemy.SpellZone.GetFloodgate(); ClientCard anytarget = Enemy.SpellZone.GetFirstMatchingCard(card => !card.OwnTargets.Any(cont => cont.IsCode(CardId.TrickstarLightStage))); @@ -685,6 +690,7 @@ private bool KnightmareMermaidSummon() private bool KnightmareMermaidEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(HandCosts); return true; } @@ -703,6 +709,7 @@ private bool GalateaSummonFirst() private bool OrcustKnightmareEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (!Bot.HasInGraveyard(CardId.OrcustHarpHorror)) { AI.SelectCard(Util.GetBestBotMonster()); @@ -726,6 +733,7 @@ private bool OrcustKnightmareEffect() private bool HarpHorrorEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; HarpHorrorUsed = true; AI.SelectCard(CardId.OrcustCymbalSkeleton); return true; @@ -733,6 +741,7 @@ private bool HarpHorrorEffect() private bool WorldWandEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(CardId.OrcustCymbalSkeleton); return true; } @@ -783,6 +792,7 @@ private ClientCard GetFogBladeTarget() private bool CymbalSkeletonEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int[] botTurnTargets = new[] { CardId.GalateaTheOrcustAutomaton, CardId.SheorcustDingirsu }; int[] emenyTurnTargets = new[] { CardId.SheorcustDingirsu, CardId.GalateaTheOrcustAutomaton }; if (Duel.Player == 0 && Bot.HasInGraveyard(CardId.GalateaTheOrcustAutomaton) && !Bot.HasInMonstersZone(CardId.GalateaTheOrcustAutomaton) && Bot.HasInExtra(CardId.SheorcustDingirsu) && !SheorcustDingirsuSummoned) @@ -867,6 +877,7 @@ private bool SheorcustDingirsuEffect() private bool AncientCloakEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInMonstersZone(CardId.SalamangreatAlmiraj) && Bot.HasInExtra(CardId.KnightmarePhoenix)) AI.SelectCard(CardId.ThePhantomKnightsofShadeBrigandine); else @@ -881,6 +892,7 @@ private bool SilentBootsSummon() private bool SilentBootsEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInMonstersZone(CardId.SalamangreatAlmiraj) && Bot.HasInExtra(CardId.KnightmarePhoenix)) AI.SelectCard(CardId.ThePhantomKnightsofShadeBrigandine); else @@ -1033,6 +1045,7 @@ private bool BabelEffect() { if (Card.Location == CardLocation.Grave) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; IList costCards = Bot.Hand.GetMatchingCards(card => card.IsCode(HandCosts)); if (costCards.Count > 0) { @@ -1113,6 +1126,7 @@ private bool FogBladeEffect() } else if (Bot.HasInGraveyard(CardId.ThePhantomKnightsofRustyBardiche) || Bot.GetMonsterCount() < 2) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(CardId.ThePhantomKnightsofRustyBardiche); return true; } diff --git a/Game/AI/Decks/PhantasmExecutor.cs b/Game/AI/Decks/PhantasmExecutor.cs index c83e76b94..8d0ada70f 100644 --- a/Game/AI/Decks/PhantasmExecutor.cs +++ b/Game/AI/Decks/PhantasmExecutor.cs @@ -1,4 +1,4 @@ -using YGOSharp.OCGWrapper.Enums; +using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using WindBot; using WindBot.Game; diff --git a/Game/AI/Decks/PureWindsExecutor.cs b/Game/AI/Decks/PureWindsExecutor.cs index a7714dfcb..63776671a 100644 --- a/Game/AI/Decks/PureWindsExecutor.cs +++ b/Game/AI/Decks/PureWindsExecutor.cs @@ -555,6 +555,7 @@ private bool DaigustoGulldoseff() } private bool SpeedroidTaketomborgeff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if ((Bot.GetRemainingCount(CardId.SpeedroidRedEyedDice, 1) >= 1) && Bot.HasInMonstersZone(CardId.SpeedroidTerrortop)) { diff --git a/Game/AI/Decks/QliphortExecutor.cs b/Game/AI/Decks/QliphortExecutor.cs index 5b12750fe..483d2dc1a 100644 --- a/Game/AI/Decks/QliphortExecutor.cs +++ b/Game/AI/Decks/QliphortExecutor.cs @@ -130,6 +130,7 @@ public override bool OnSelectHand() public override void OnNewTurn() { CardOfDemiseUsed = false; + base.OnNewTurn(); } public override IList OnSelectPendulumSummon(IList cards, int max) @@ -281,6 +282,7 @@ private bool ScoutEffect() { if (Card.Location == CardLocation.Hand) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; int count = 0; int handcount = 0; int fieldcount = 0; diff --git a/Game/AI/Decks/RainbowExecutor.cs b/Game/AI/Decks/RainbowExecutor.cs index c98c71df4..03de70b47 100644 --- a/Game/AI/Decks/RainbowExecutor.cs +++ b/Game/AI/Decks/RainbowExecutor.cs @@ -142,6 +142,7 @@ public RainbowExecutor(GameAI ai, Duel duel) public override void OnNewTurn() { NormalSummoned = false; + base.OnNewTurn(); } public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) @@ -210,6 +211,7 @@ private bool UnexpectedDaiEffect() private bool RescueRabbitSummon() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Util.GetBotAvailZonesFromExtraDeck() > 0 || !Enemy.MonsterZone.IsExistingMatchingCard(card => card.GetDefensePower() >= 1900) || Enemy.MonsterZone.GetMatchingCardsCount(card => card.GetDefensePower() < 1900) > Bot.MonsterZone.GetMatchingCardsCount(card => card.Attack >= 1900); diff --git a/Game/AI/Decks/Rank5Executor.cs b/Game/AI/Decks/Rank5Executor.cs index 2a3ab12bd..f3c721701 100644 --- a/Game/AI/Decks/Rank5Executor.cs +++ b/Game/AI/Decks/Rank5Executor.cs @@ -116,6 +116,7 @@ public override void OnNewTurn() DoubleSummonUsed = false; CyberDragonInfinitySummoned = false; Number61VolcasaurusUsed = false; + base.OnNewTurn(); } public override IList OnSelectXyzMaterial(IList cards, int min, int max) diff --git a/Game/AI/Decks/RyzealExecutor.cs b/Game/AI/Decks/RyzealExecutor.cs new file mode 100644 index 000000000..8dc0dcf0e --- /dev/null +++ b/Game/AI/Decks/RyzealExecutor.cs @@ -0,0 +1,4129 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Ryzeal", "AI_Ryzeal")] + public class RyzealExecutor : DefaultExecutor + { + public class CardId + { + public const int IceRyzeal = 8633261; + public const int ThodeRyzeal = 35844557; + public const int NodeRyzeal = 72238166; + public const int ExRyzeal = 34022970; + // _CardId.MulcharmyFuwalos; + // _CardId.MulcharmyPurulia; + // _CardId.MulcharmyNyalus; + // _CardId.AshBlossom; + // _CardId.GhostOgreAndSnowRabbit; + // _CardId.MaxxC; + // _CardId.LockBird; + // _CardId.EffectVeiler; + + public const int SeventhTachyon = 7477101; + public const int TripleTacticsTalent = 25311006; + // _CardId.PotOfDesires; + public const int Bonfire = 85106525; + // _CardId.CalledByTheGrave; + public const int RyzealPlugIn = 60394026; + // _CardId.CrossoutDesignator; + public const int RyzealCross = 6798031; + + // _CardId.InfiniteImpermanence = 10045474; + + public const int MereologicAggregator = 9940036; + public const int RyzealDeadnader = 34909328; + public const int Number104Masquerade = 2061963; + public const int RyzealDuodrive = 7511613; + public const int TwinsOfTheEclipse = 45852939; + public const int FullArmoredUtopicRayLancer = 1269512; + public const int TornadoDragon = 6983839; + // _CardId.Number41BagooskatheTerriblyTiredTapir + // _CardId.EvilswarmExcitonKnight + public const int StarliegePhotonBlastDragon = 16643334; + public const int AbyssDweller = 21044178; + public const int Number60DugaresTheTimeless = 66011101; + public const int DonnerDaggerFurHire = 8728498; + } + + public RyzealExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // counter + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, _CardId.EffectVeiler, EffectVeilerActivate); + AddExecutor(ExecutorType.Activate, _CardId.GhostOgreAndSnowRabbit, GhostOgreAndSnowRabbitActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + + AddExecutor(ExecutorType.Activate, CardId.RyzealCross, RyzealCrossActivateCard); + AddExecutor(ExecutorType.Activate, _CardId.EvilswarmExcitonKnight, EvilswarmExcitonKnightActivate); + AddExecutor(ExecutorType.Activate, CardId.RyzealDeadnader, RyzealDeadnaderActivate); + AddExecutor(ExecutorType.Activate, CardId.RyzealDuodrive, RyzealDuodriveActivate); + AddExecutor(ExecutorType.Activate, CardId.TwinsOfTheEclipse, TwinsOfTheEclipseActivate); + AddExecutor(ExecutorType.Activate, CardId.AbyssDweller, AbyssDwellerActivate); + AddExecutor(ExecutorType.Activate, CardId.TornadoDragon, TornadoDragonActivate); + + // hand effect + AddExecutor(ExecutorType.Activate, _CardId.LockBird, LockBirdActivate); + AddExecutor(ExecutorType.Activate, _CardId.MulcharmyPurulia, MulcharmyPuruliaActivate); + AddExecutor(ExecutorType.Activate, _CardId.MulcharmyNyalus, MulcharmyNyalusActivate); + AddExecutor(ExecutorType.Activate, _CardId.MulcharmyFuwalos, MulcharmyFuwalosActivate); + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + + // pre-action activate + AddExecutor(ExecutorType.Activate, CardId.Bonfire, BonfireActivate); + AddExecutor(ExecutorType.Activate, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireActivate); + AddExecutor(ExecutorType.Activate, CardId.Number60DugaresTheTimeless, Number60DugaresTheTimelessActivate); + AddExecutor(ExecutorType.Activate, CardId.TripleTacticsTalent, TripleTacticsTalentActivate); + AddExecutor(ExecutorType.Activate, CardId.Bonfire, BonfireActivateToSearchNecessary); + AddExecutor(ExecutorType.Activate, CardId.SeventhTachyon, SeventhTachyonActivate); + + AddExecutor(ExecutorType.Repos, ChangePositionFirst); + + // xyz summon + AddExecutor(ExecutorType.SpSummon, _CardId.EvilswarmExcitonKnight, EvilswarmExcitonKnightSpSummon); + AddExecutor(ExecutorType.SpSummon, LessSpSummonExtra); + AddExecutor(ExecutorType.SpSummon, CardId.RyzealDuodrive, FirstRyzealDuodriveSpSummon); + AddExecutor(ExecutorType.SpSummon, SecondXyzSummon); + AddExecutor(ExecutorType.SpSummon, CardId.TwinsOfTheEclipse, TwinsOfTheEclipseSpSummon); + AddExecutor(ExecutorType.SpSummon, FinalXyzSummon); + AddExecutor(ExecutorType.SpSummon, CardId.DonnerDaggerFurHire, DonnerDaggerFurHireSpSummon); + + AddExecutor(ExecutorType.Activate, _CardId.PotOfDesires, PotOfDesireActivateForContinue); + + AddExecutor(ExecutorType.Activate, CardId.RyzealPlugIn, RyzealPlugInActivateFirst); + AddExecutor(ExecutorType.Activate, CardId.NodeRyzeal, NodeRyzealActivateFirst); + AddExecutor(ExecutorType.Activate, CardId.RyzealCross, RyzealCrossActivateRecycleFirst); + + // summon/spsummon + AddExecutor(ExecutorType.SpSummon, CardId.IceRyzeal, IceRyzealSpSummonFirst); + AddExecutor(ExecutorType.SpSummon, CardId.NodeRyzeal, NodeRyzealSpSummonFirst); + + AddExecutor(ExecutorType.Summon, CardId.ExRyzeal, ExRyzealSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ExRyzeal, ExRyzealSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ThodeRyzeal, ThodeRyzealSpSummon); + AddExecutor(ExecutorType.Summon, CardId.IceRyzeal, IceRyzealSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ExRyzeal, ExRyzealSpSummonLater); + AddExecutor(ExecutorType.Summon, CardId.ThodeRyzeal, ThodeRyzealSummon); + AddExecutor(ExecutorType.SpSummon, CardId.NodeRyzeal, NodeRyzealSpSummon); + AddExecutor(ExecutorType.Summon, Level4Summon); + + AddExecutor(ExecutorType.Activate, CardId.NodeRyzeal, NodeRyzealActivate); + AddExecutor(ExecutorType.Activate, CardId.RyzealPlugIn, RyzealPlugInActivate); + AddExecutor(ExecutorType.SpSummon, CardId.IceRyzeal, IceRyzealSpSummon); + + // activate + AddExecutor(ExecutorType.Activate, CardId.MereologicAggregator, MereologicAggregatorActivateFirst); + AddExecutor(ExecutorType.Activate, CardId.IceRyzeal, IceRyzealActivate); + AddExecutor(ExecutorType.Activate, CardId.ThodeRyzeal, ThodeRyzealActivate); + AddExecutor(ExecutorType.Activate, CardId.ExRyzeal, ExRyzealActivate); + AddExecutor(ExecutorType.Activate, CardId.MereologicAggregator, MereologicAggregatorActivateLater); + + // after summon + AddExecutor(ExecutorType.Activate, CardId.RyzealCross, RyzealCrossActivateRecycleLater); + AddExecutor(ExecutorType.Activate, _CardId.PotOfDesires, PotOfDesiresActivate); + + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + + } + + const int attrbuteLightDark = (int)CardAttribute.Light | (int)CardAttribute.Dark; + const int SetcodeTimeLord = 0x4a; + const int SetcodeAtlantean = 0x77; + const int SetcodeInfernoid = 0xbb; + const int SetcodeMajespecter = 0xd0; + const int SetcodePhantomKnight = 0x10db; + const int SetcodeSkyStriker = 0x115; + const int SetcodeOrcust = 0x11b; + const int SetcodeSangen = 0x1a9; + const int SetcodeTenpaiDragon = 0x1aa; + const int SetcodeBranded = 0x15d; + const int SetcodeFloowandereeze = 0x16d; + const int SetcodeLabrynth = 0x17e; + const int SetcodeTearlaments = 0x181; + const int SetcodeHorus = 0x19d; + const int SetcodeRyzeal = 0x1be; + const int hintTimingMainEnd = 0x4; + List NotToNegateIdList = new List + { + 58699500, 20343502, 25451383, 19403423 + }; + List AlbazFusionList = new List + { + 1906812, 38811586, 41373230, 44146295, 51409648, 51409648, 87746184 + }; + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal, _CardId.AshBlossom, _CardId.EffectVeiler, CardId.SeventhTachyon, + _CardId.InfiniteImpermanence}}, + {2, new List { _CardId.MulcharmyFuwalos, _CardId.GhostOgreAndSnowRabbit, _CardId.MaxxC, _CardId.PotOfDesires, _CardId.CalledByTheGrave }}, + {1, new List { CardId.NodeRyzeal, _CardId.MulcharmyPurulia, _CardId.MulcharmyNyalus, _CardId.LockBird, CardId.TripleTacticsTalent, + CardId.Bonfire, CardId.RyzealPlugIn, _CardId.CrossoutDesignator, CardId.RyzealCross}} + }; + List NotToDestroySpellTrap = new List { 50005218, 6767771 }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, _CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, CardId.MereologicAggregator, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + List NeedIceToSolveIdList = new List { 80978111, 87170768 }; + List currentCanActivateEffect = new List(); + + int maxSummonCount = 1; + int summonCount = 1; + bool enemyActivateMaxxC = false; + bool enemyActivatePurulia = false; + bool enemyActivateFuwalos = false; + bool enemyActivateNyalus = false; + bool lockBirdSolved = false; + int dimensionShifterCount = 0; + bool botActivateMulcharmy = false; + bool botSolvingCross = false; + List CheckSetcodeList = new List { SetcodePhantomKnight, SetcodeOrcust, SetcodeAtlantean, SetcodeRyzeal, SetcodeTenpaiDragon, SetcodeSangen, + SetcodeInfernoid, SetcodeSkyStriker, SetcodeLabrynth, SetcodeTearlaments }; + List CheckBotSolvedList = new List { _CardId.MaxxC, _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus, + CardId.AbyssDweller, _CardId.EvilswarmExcitonKnight, CardId.RyzealPlugIn }; + + bool enemyActivateInfiniteImpermanenceFromHand = false; + ClientCard deadnaderDestroySelf = null; + + List infiniteImpermanenceList = new List(); + List currentNegateCardList = new List(); + List currentDestroyCardList = new List(); + List activatedCardIdList = new List(); + List spSummonedCardIdList = new List(); + List botSolvedCardIdList = new List(); + List enemyPlaceThisTurn = new List(); + List summonThisTurn = new List(); + + List hardToDestroyCardList = new List(); + List cannotDestroyCardList = new List(); + HashSet enemyDeckTypeRecord = new HashSet(); + + ///

+ /// Shuffle List and return a random-order card list + /// + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 + && (card.IsShouldNotBeSpellTrapTarget() && !card.IsDisabled())) return false; + } + return true; + } + + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + public int CheckRemainInDeck(params int[] ids) + { + int sum = 0; + foreach (int id in ids) + { + sum += CheckRemainInDeck(id); + } + return sum; + } + + public bool CheckWhetherHaveFinalMonster() + { + foreach (ClientCard monster in Bot.MonsterZone) + { + if (monster == null) continue; + if (monster.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && monster.IsDefense()) return true; + if (monster.IsCode(CardId.AbyssDweller) && monster.Overlays.Count() > 0) return true; + if (monster.IsCode(CardId.RyzealDeadnader) && monster.Overlays.Count() > 0) return true; + } + + return false; + } + + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0, bool ignore41 = false) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= ((int)type & (int)CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (((int)type & (int)CardType.Spell) != 0) || (((int)type & (int)CardType.Trap) != 0); + bool isCounter = ((int)type & (int)CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck && CheckSpellWillBeNegate(isCounter)) + return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card, ignore41)) || Bot.MonsterZone.Any(card => CheckNumber41(card, ignore41))) return true; + } + if (Enemy.HasInSpellZone(_CardId.SkillDrain, true, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card, bool ignoreSelf41 = false) + { + return card != null && card.IsFaceup() && card.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled() + && (!ignoreSelf41 || card.Controller == 0); + } + + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(_CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true)) return true; + if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Bot.HasInSpellZone(_CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(_CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(_CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(_CardId.RoyalDecreel, true) || Bot.HasInSpellZone(_CardId.RoyalDecreel, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + // how to get here? + return false; + } + + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + return CheckCardShouldNegate(lastcard); + } + + public bool CheckCardShouldNegate(ClientCard card) + { + if (card == null) return false; + if (card.IsMonster() && card.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (NotToNegateIdList.Contains(card.Id)) return false; + if (card.HasSetcode(_Setcode.Danger) && card.Location == CardLocation.Hand) return false; + if (card.IsMonster() && card.Location == CardLocation.MonsterZone && card.HasPosition(CardPosition.Defence)) + { + if (Enemy.MonsterZone.Any(c => CheckNumber41(c)) || Bot.MonsterZone.Any(c => CheckNumber41(c))) return false; + } + if (DefaultCheckWhetherCardIsNegated(card)) return false; + if (Duel.Player == 1 && card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus)) return false; + if (card.IsDisabled()) return false; + + return true; + } + + public bool CheckCardShouldNegate(ChainInfo chainInfo) + { + if (chainInfo == null) return false; + ClientCard card = chainInfo.RelatedCard; + + if (card == null) return false; + if (card.IsMonster() && card.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (NotToNegateIdList.Contains(card.Id)) return false; + if (card.HasSetcode(_Setcode.Danger) && card.Location == CardLocation.Hand) return false; + if (card.IsMonster() && chainInfo.HasLocation(CardLocation.MonsterZone) && chainInfo.HasPosition(CardPosition.Defence)) + { + if (Enemy.MonsterZone.Any(c => CheckNumber41(c)) || Bot.MonsterZone.Any(c => CheckNumber41(c))) return false; + } + if (DefaultCheckWhetherCardIsNegated(card)) return false; + if (Duel.Player == 1 && card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus)) return false; + if (card.IsDisabled()) return false; + + return true; + } + + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && (Duel.Player == 0 || Bot.GetMonsterCount() > 0)) return true; + return false; + } + + public bool CheckShouldNoMoreSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && !lockBirdSolved && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2)) + { + return true; + } + return false; + } + + public bool CheckShouldNoMoreSpSummon(CardLocation loc) + { + if (CheckShouldNoMoreSpSummon()) return true; + if (lockBirdSolved || (Duel.Turn > 1 && Duel.Phase < DuelPhase.Main2)) return false; + if (enemyActivatePurulia && (loc & CardLocation.Hand) != 0) return true; + if (enemyActivateFuwalos && (loc & (CardLocation.Deck | CardLocation.Extra)) != 0) return true; + if (enemyActivateNyalus && (loc & (CardLocation.Grave | CardLocation.Removed)) != 0) return true; + + return false; + } + + public bool CheckWhetherCanSummon() + { + return Duel.Player == 0 && Duel.Phase < DuelPhase.End && summonCount > 0; + } + + /// + /// Check whether cards will be removed. If so, do not send cards to grave. + /// + public bool CheckWhetherWillbeRemoved() + { + if (dimensionShifterCount > 0) return true; + List checkIdList = new List { _CardId.BanisheroftheRadiance, _CardId.BanisheroftheLight, _CardId.MacroCosmos, _CardId.DimensionalFissure, + _CardId.KashtiraAriseHeart, _CardId.MaskedHERODarkLaw }; + foreach (int cardid in checkIdList) + { + List fields = new List { Bot, Enemy }; + foreach (ClientField cf in fields) + { + if (cf.HasInMonstersZone(cardid, true, false, true) || cf.HasInSpellZone(cardid, true, true)) + { + return true; + } + } + } + return false; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + ClientCard activatingAlbaz = Enemy.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(68468459) && !c.IsDisabled() + && !currentDestroyCardList.Contains(c) && !currentNegateCardList.Contains(c) && Duel.CurrentChain.Contains(c)); + if (activatingAlbaz != null) return activatingAlbaz; + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentDestroyCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + public bool CheckCanContinueSummon(bool skipDuodriver = false) + { + bool checkFlag = summonCount > 0 && !activatedCardIdList.Contains(CardId.IceRyzeal) && Bot.HasInHand(CardId.IceRyzeal) + && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal); + if (Bot.HasInHand(CardId.ThodeRyzeal) && !spSummonedCardIdList.Contains(CardId.ThodeRyzeal) + && !activatedCardIdList.Contains(CardId.ThodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ThodeRyzeal)) + { + checkFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal)); + checkFlag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal)); + } + checkFlag |= !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal) + && Bot.HasInHand(CardId.ExRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal) && !CheckWhetherWillbeRemoved(); + + checkFlag |= !activatedCardIdList.Contains(CardId.RyzealDuodrive + 1) && Bot.HasInExtra(CardId.RyzealDuodrive) + && !DefaultCheckWhetherCardIdIsNegated(CardId.RyzealDuodrive) && !CheckWhetherNegated(true, true, CardType.Monster) + && summonCount > 0 && Bot.Hand.Count(c => c.Level == 4) > 0 && GetLevel4CountOnField() == 1 && !lockBirdSolved + && !skipDuodriver; + + return checkFlag; + } + + /// + /// check enemy's dangerous card in grave + /// + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantomKnight) || card.HasSetcode(SetcodeHorus))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, 9411399, 28954097, 30680659 + }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType) + ) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !NotToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0, bool forNegate = false) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) + && (!forNegate || (!card.IsDisabled() && card.HasType(CardType.Effect))) + ).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card) && card.IsFacedown()).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => + (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card) && card.IsFacedown()).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) + && (!forNegate || (!card.IsDisabled() && card.HasType(CardType.Effect))) + ).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + if (chainingCard.HasPosition(CardPosition.Defence)) + { + bool have41 = Bot.MonsterZone.Any(c => CheckNumber41(c)) | Enemy.MonsterZone.Any(c => CheckNumber41(c)); + } + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public List GetLevel4OnField(Func filter) + { + return Bot.GetMonsters().Where(c => (filter == null || filter(c)) + && c.IsFaceup() && !c.HasType(CardType.Xyz | CardType.Link) && c.Level == 4).OrderBy(c => c.GetDefensePower()).ToList(); + } + + public int GetLevel4CountOnField() + { + return Bot.GetMonsters().Count(c => c.IsFaceup() && !c.HasType(CardType.Xyz | CardType.Link) && c.Level == 4); + } + + public int GetLevel4FinalCountOnField(bool checkSupport, out bool hasNode) + { + // check whether have 4 monsters for material. + // if not, skip the second xyz monster. + int level4Count = GetLevel4CountOnField(); + if (Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !CheckWhetherWillbeRemoved()) + { + if (checkSupport || + (!activatedCardIdList.Contains(CardId.ExRyzeal) && Bot.MonsterZone.All(c => c != null && (c.IsFacedown() || !c.HasType(CardType.Link) && c.Level == 4)))) + { + level4Count++; + } + } + if (Bot.HasInHand(CardId.ThodeRyzeal) && !spSummonedCardIdList.Contains(CardId.ThodeRyzeal)) + { + bool flag = Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal)); + flag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal)); + if (flag) + { + if (checkSupport || !activatedCardIdList.Contains(CardId.ThodeRyzeal)) + { + level4Count++; + } + } + } + hasNode = Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.IsCode(CardId.NodeRyzeal) && !c.IsDisabled()); + if (Bot.HasInHand(CardId.NodeRyzeal) && !spSummonedCardIdList.Contains(CardId.NodeRyzeal)) + { + bool flag = Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz)); + if (flag) + { + hasNode = true; + level4Count++; + } + } + if (Bot.HasInHand(CardId.RyzealPlugIn) && !CheckWhetherNegated(true, true, CardType.Spell) && checkSupport) + { + bool flag = false; + List graveTargetList = Bot.Graveyard.Where( + c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && !c.HasType(CardType.Xyz) && c.Level == 4).ToList(); + flag |= graveTargetList.Count() > 0; + hasNode |= graveTargetList.Any(c => c.IsCode(CardId.NodeRyzeal)); + + List banishedTargetList = Bot.Banished.Where( + c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && !c.HasType(CardType.Xyz) && c.Level == 4).ToList(); + flag |= banishedTargetList.Count() > 0; + hasNode |= banishedTargetList.Any(c => c.IsCode(CardId.NodeRyzeal)); + + if (flag) level4Count++; + } + hasNode &= !CheckWhetherWillbeRemoved() && !activatedCardIdList.Contains(CardId.NodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.NodeRyzeal); + hasNode &= Bot.Graveyard.Any(c => c != null && c.IsMonster() && c.HasSetcode(SetcodeRyzeal) && !c.IsCode(CardId.NodeRyzeal) && c.Level == 4); + if (hasNode) + { + bool flag = Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && !c.HasType(CardType.Xyz) && c.Level == 4 && !c.IsCode(CardId.NodeRyzeal)); + if (flag) + { + if (checkSupport || GetCostFromHandAndField(null, false).Count() > 0) level4Count++; + } + } + if (checkSupport) + { + int checkHandCount = 2; + if (summonCount > 0 && Bot.Hand.Any(c => c.Level == 4 && !c.IsCode(CardId.ExRyzeal, CardId.ThodeRyzeal, CardId.NodeRyzeal))) + { + level4Count++; + checkHandCount++; + } + if (Bot.Hand.Count() >= checkHandCount && Bot.HasInHand(CardId.IceRyzeal) && !spSummonedCardIdList.Contains(CardId.IceRyzeal) && !CheckWhetherWillbeRemoved()) + { + level4Count++; + } + } + + return level4Count; + } + + public List GetCostFromHandAndFieldFirst(ClientCard exceptCard) + { + return Bot.MonsterZone.Where(c => c != null && !c.IsDisabled() && c.IsCode(NeedIceToSolveIdList) && c != exceptCard && !c.HasType(CardType.Token)).ToList(); + } + + public List GetCostFromHandAndField(ClientCard exceptCard, bool sendNotNecessary) + { + List resultList = GetCostFromHandAndFieldFirst(exceptCard); + if (!activatedCardIdList.Contains(CardId.TwinsOfTheEclipse + 1)) + { + List xyzList = Bot.Graveyard.Where(c => c.HasType(CardType.Xyz)).ToList(); + // sending twins + ClientCard twins = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.TwinsOfTheEclipse) && !resultList.Contains(c)); + if (twins == null) + { + twins = Bot.SpellZone.FirstOrDefault(c => c != null && c.IsCode(CardId.TwinsOfTheEclipse) && !resultList.Contains(c)); + } + if (twins != null) + { + int twinsXyzCount = 0; + foreach (int cardId in twins.Overlays) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null && cardData.HasType(CardType.Xyz)) twinsXyzCount++; + } + bool flag = twinsXyzCount >= 2; + flag |= twinsXyzCount > 0 && xyzList.Count() > 0; + flag |= xyzList.Count() > 1 && xyzList.Count(c => c.IsCanRevive()) > 0; + if (flag) + { + resultList.Add(twins); + } + } + } + + if (Bot.HasInSpellZone(CardId.RyzealCross, true, true)) + { + // sending duodrive because not enough material on field + if (Bot.HasInExtra(CardId.RyzealDuodrive) && !activatedCardIdList.Contains(CardId.RyzealDuodrive + 1) && !lockBirdSolved) + { + bool checkOverlay = true; + ClientCard duoDrive = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.RyzealDuodrive) && !resultList.Contains(c)); + if (duoDrive == null) + { + checkOverlay = false; + duoDrive = Bot.SpellZone.FirstOrDefault(c => c != null && c.IsCode(CardId.RyzealDuodrive) && !resultList.Contains(c)); + } + if (duoDrive != null) + { + int overlayCount = Bot.MonsterZone.Sum(c => c != null ? c.Overlays.Count() : 0); + if (!checkOverlay || overlayCount < 2) + { + resultList.Add(duoDrive); + } + } + } + // send deadnader with no overlay + if (Bot.HasInExtra(CardId.RyzealDeadnader)) + { + ClientCard deadnader = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsCode(CardId.RyzealDeadnader) && c.Overlays.Count() == 0 && !resultList.Contains(c)); + if (deadnader != null) + { + resultList.Add(deadnader); + } + } + } + + // sending monsters in spell zone + List monstersInSpellZone = Bot.SpellZone.Where(c => c != null && c.Data != null + && c.Data.HasType(CardType.Monster) && !c.Data.HasType(CardType.Pendulum | CardType.Token) && !resultList.Contains(c)).ToList(); + resultList.AddRange(monstersInSpellZone); + + // send enemy monsters + List enemyMonsters = Bot.MonsterZone.Where(c => c != null && !resultList.Contains(c) && c.Owner == 1).ToList(); + resultList.AddRange(enemyMonsters); + + if (sendNotNecessary) + { + // send xyz monster with no material + List xyzMonsterWithNoMaterial = Bot.MonsterZone.Where( + c => c != null && c.HasType(CardType.Xyz) && c.GetDefensePower() < 2500 && c.Overlays.Count() == 0 && !resultList.Contains(c)) + .OrderBy(c => c.GetDefensePower()).ToList(); + resultList.AddRange(xyzMonsterWithNoMaterial); + + // sending unimportant card in hand + List unimportantList = new List { _CardId.MulcharmyNyalus, _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, CardId.SeventhTachyon }; + resultList.AddRange(Bot.Hand.Where(c => c != null && c.IsCode(unimportantList) && !resultList.Contains(c))); + + // sending activated ryzeal monster + List checkRyzealIdList = new List { CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal }; + foreach (int checkId in checkRyzealIdList) + { + if (summonCount == 0 && spSummonedCardIdList.Contains(checkId)) + { + List ryzealList = Bot.Hand.Where(c => c != null && c != exceptCard && !resultList.Contains(c) && c.IsCode(checkId)).ToList(); + resultList.AddRange(ryzealList); + } + } + + // sending dump cards + foreach (ClientCard card in Bot.Hand) + { + if (Bot.Hand.Count(c => c != null && !resultList.Contains(c) && c.IsCode(card.Id)) > 1) + { + resultList.Add(card); + } + } + + if (resultList.Count() == 0) + { + // sending other cards + List checkIdList = new List { _CardId.CrossoutDesignator, _CardId.CalledByTheGrave, _CardId.InfiniteImpermanence, + _CardId.GhostOgreAndSnowRabbit, _CardId.LockBird, _CardId.AshBlossom, _CardId.MaxxC }; + foreach (int checkId in checkIdList) + { + List costList = Bot.Hand.Where(c => c != null && c != exceptCard && !resultList.Contains(c) && c.IsCode(checkId)).ToList(); + resultList.AddRange(costList); + } + } + } + + return resultList; + } + + public int GetBotCurrentTotalAttack(List exceptList = null) + { + if (Util.IsTurn1OrMain2() || botSolvedCardIdList.Contains(_CardId.EvilswarmExcitonKnight)) return 0; + int result = 0; + foreach (ClientCard monster in Bot.GetMonsters()) + { + if (exceptList != null && exceptList.Contains(monster)) continue; + if (monster.IsAttack() || !summonThisTurn.Contains(monster)) result += monster.Attack; + } + return result; + } + + public int GetNegateEffectCount() + { + int count = 0; + count += GetCalledbytheGraveIdCount(_CardId.MaxxC) < 2 && Bot.HasInHand(_CardId.MaxxC) ? 1 : 0; + count += GetCalledbytheGraveIdCount(_CardId.AshBlossom) < 2 && Bot.HasInHand(_CardId.AshBlossom) ? 1 : 0; + count += GetCalledbytheGraveIdCount(_CardId.EffectVeiler) < 2 && Bot.HasInHand(_CardId.EffectVeiler) ? 1 : 0; + count += GetCalledbytheGraveIdCount(_CardId.GhostOgreAndSnowRabbit) < 2 && Bot.HasInHand(_CardId.GhostOgreAndSnowRabbit) ? 1 : 0; + count += GetCalledbytheGraveIdCount(_CardId.LockBird) < 2 && Bot.HasInHand(_CardId.LockBird) ? 1 : 0; + count += Bot.SpellZone.Count(c => c != null && c.IsFacedown() && c.IsCode(_CardId.InfiniteImpermanence)); + count += Math.Min(4 - Bot.GetSpellCountWithoutField(), Bot.Hand.Count(c => c.IsCode(_CardId.InfiniteImpermanence))); + + return count; + } + + public override BattlePhaseAction OnBattle(IList attackers, IList defenders) + { + if (attackers.Count() > 0 && defenders.Count() > 0) + { + List sortedAttacker = attackers.OrderBy(card => card.Attack).ToList(); + ClientCard rayLancer = attackers.FirstOrDefault(c => c.IsCode(CardId.FullArmoredUtopicRayLancer) && !c.IsDisabled()); + if (rayLancer != null) + { + sortedAttacker.Remove(rayLancer); + sortedAttacker.Insert(0, rayLancer); + } + for (int k = 0; k < sortedAttacker.Count; ++k) + { + ClientCard attacker = sortedAttacker[k]; + attacker.IsLastAttacker = k == sortedAttacker.Count - 1; + BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders); + if (result != null) + return result; + } + } + + return base.OnBattle(attackers, defenders); + } + + public override ClientCard OnSelectAttacker(IList attackers, IList defenders) + { + ClientCard twin = attackers.FirstOrDefault(c => c.IsCode(CardId.TwinsOfTheEclipse) && !c.IsDisabled()); + if (twin != null) + { + if (Enemy.MonsterZone.Any(c => c != null && c.GetDefensePower() <= 2500)) + { + return twin; + } + } + return null; + } + + public override void OnSelectChain(IList cards) + { + if (cards != null && cards.Count() > 0) + { + currentCanActivateEffect.Clear(); + currentCanActivateEffect.AddRange(cards); + } + base.OnSelectChain(cards); + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + ChainInfo currentSolvingChain = Duel.GetCurrentSolvingChainInfo(); + if (currentSolvingChain != null) + { + if (botSolvingCross) + { + if (hint == HintMsg.DeattachFrom) + { + List> funcList = new List> + { + (c) => c.IsDisabled() && c.IsCode(CardId.RyzealDuodrive), + (c) => c.IsCode(CardId.RyzealDuodrive), + (c) => c.IsDisabled() && c.IsCode(CardId.RyzealDeadnader), + (c) => c.IsCode(CardId.RyzealDeadnader) + }; + foreach (Func func in funcList) + { + ClientCard target = cards.FirstOrDefault(c => c != null && func(c)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + if (hint == HintMsg.RemoveXyz) + { + List targets = cards.OrderBy(c => c.Attack).ToList(); + botSolvingCross = false; + return Util.CheckSelectCount(targets, cards, min, max); + } + } + + if (currentSolvingChain.ActivatePlayer == 1 && currentSolvingChain.IsCode(_CardId.EvenlyMatched)) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List dumpMainMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && CheckRemainInDeck(card.Id) > 0).ToList(); + dumpMainMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpMainMonsterList); + + // spells + bool canUsePluginToSpSummonDeadnader = Bot.Graveyard.Any(c => c != null && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + canUsePluginToSpSummonDeadnader |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + + List faceUpSpells = Bot.GetSpells().Where(c => c.IsFaceup()).ToList(); + banishList.AddRange(ShuffleList(faceUpSpells)); + List faceDownSpells = Bot.GetSpells().Where(c => c.IsFacedown() + && !(canUsePluginToSpSummonDeadnader && c.IsCode(CardId.RyzealPlugIn))).ToList(); + banishList.AddRange(ShuffleList(faceDownSpells)); + + List uniqueMainMonster = botMonsters.Where(card => !banishList.Contains(card) + && !card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && CheckRemainInDeck(card.Id) == 0).ToList(); + uniqueMainMonster.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(uniqueMainMonster); + + List dumpExtraMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && Bot.HasInExtra(card.Id)).ToList(); + dumpExtraMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(dumpExtraMonsterList); + + List uniqueExtraMonsterList = botMonsters.Where(card => !banishList.Contains(card) + && card.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz | CardType.Link) && !Bot.HasInExtra(card.Id)).ToList(); + uniqueExtraMonsterList.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(uniqueExtraMonsterList); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + + if (currentSolvingChain.ActivatePlayer == 0) + { + if (hint == HintMsg.AddToHand) + { + if (currentSolvingChain.IsCode(CardId.ThodeRyzeal)) + { + ClientCard ice = cards.FirstOrDefault(c => c.IsCode(CardId.IceRyzeal)); + ClientCard ex = cards.FirstOrDefault(c => c.IsCode(CardId.ExRyzeal)); + if (ice != null) + { + bool canSummonAndActivateIce = Duel.Player == 0 && summonCount > 0 && Duel.Phase < DuelPhase.End; + bool flag = canSummonAndActivateIce && !Bot.HasInHand(CardId.IceRyzeal) + && !activatedCardIdList.Contains(CardId.IceRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal); + flag |= ex == null; + flag |= Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && c.IsCode(NeedIceToSolveIdList)) + && !spSummonedCardIdList.Contains(CardId.IceRyzeal) && !CheckWhetherWillbeRemoved(); + if (!canSummonAndActivateIce) + { + flag |= DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal); + flag |= spSummonedCardIdList.Contains(CardId.ExRyzeal) || activatedCardIdList.Contains(CardId.ExRyzeal); + } + if (flag) + { + return Util.CheckSelectCount(new List { ice }, cards, min, max); + } + } + if (ex != null) + { + bool flag = !Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal); + flag |= Bot.HasInHand(CardId.IceRyzeal); + flag |= ice == null; + if (flag) + { + return Util.CheckSelectCount(new List { ex }, cards, min, max); + } + } + } + + if (currentSolvingChain.IsCode(CardId.ExRyzeal)) + { + ClientCard thode = cards.FirstOrDefault(c => c.IsCode(CardId.ThodeRyzeal)); + ClientCard node = cards.FirstOrDefault(c => c.IsCode(CardId.NodeRyzeal)); + if (thode != null) + { + bool flag = node == null; + flag |= !Bot.HasInHand(CardId.ThodeRyzeal) && !spSummonedCardIdList.Contains(CardId.ThodeRyzeal) && !activatedCardIdList.Contains(CardId.ThodeRyzeal); + + if (flag) + { + return Util.CheckSelectCount(new List { thode }, cards, min, max); + } + } + if (node != null) + { + bool flag = thode == null; + flag |= spSummonedCardIdList.Contains(CardId.ThodeRyzeal) && activatedCardIdList.Contains(CardId.ThodeRyzeal) + && !DefaultCheckWhetherCardIdIsNegated(CardId.ThodeRyzeal); + flag |= CheckShouldNoMoreSpSummon(CardLocation.Hand) && !CheckShouldNoMoreSpSummon(CardLocation.Grave) + && !spSummonedCardIdList.Contains(CardId.NodeRyzeal); + + if (flag) + { + return Util.CheckSelectCount(new List { node }, cards, min, max); + } + } + } + + if (currentSolvingChain.IsCode(CardId.Bonfire) || currentSolvingChain.IsCode(CardId.SeventhTachyon)) + { + if (!Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !CheckWhetherWillbeRemoved()) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(CardId.ExRyzeal)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + if (!Bot.HasInHand(CardId.IceRyzeal)) + { + bool flag = summonCount > 0 && !activatedCardIdList.Contains(CardId.IceRyzeal); + flag |= !spSummonedCardIdList.Contains(CardId.IceRyzeal) && Bot.Hand.Count > 0; + if (flag) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(CardId.IceRyzeal)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + List searchTargetList = new List { CardId.ExRyzeal, CardId.IceRyzeal }; + foreach (int targetId in searchTargetList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(targetId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + if (currentSolvingChain.IsCode(CardId.RyzealDuodrive)) + { + // search spells + if (!CheckWhetherNegated(true, true, CardType.Spell)) + { + ClientCard cross = cards.FirstOrDefault(c => c.IsCode(CardId.RyzealCross)); + if (cross != null) + { + return Util.CheckSelectCount(new List { cross }, cards, min, max); + } + + ClientCard plugin = cards.FirstOrDefault(c => c.IsCode(CardId.RyzealPlugIn)); + if (plugin != null) + { + return Util.CheckSelectCount(new List { plugin }, cards, min, max); + } + } + + // search for spsummon + List>> checkList = new List>> + { + new KeyValuePair>(CardId.IceRyzeal, + () => Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && c.IsCode(NeedIceToSolveIdList)) + && !spSummonedCardIdList.Contains(CardId.IceRyzeal) && !CheckWhetherWillbeRemoved() ), + new KeyValuePair>(CardId.ExRyzeal, + () => !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal) + && !DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal) && !CheckWhetherWillbeRemoved() ), + new KeyValuePair>(CardId.IceRyzeal, + () => summonCount > 0 && !activatedCardIdList.Contains(CardId.IceRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal) ), + new KeyValuePair>(CardId.ThodeRyzeal, + () => !spSummonedCardIdList.Contains(CardId.ThodeRyzeal) && !activatedCardIdList.Contains(CardId.ThodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ThodeRyzeal) ), + new KeyValuePair>(CardId.NodeRyzeal, + () => !spSummonedCardIdList.Contains(CardId.NodeRyzeal) ) + }; + foreach (KeyValuePair> pair in checkList) + { + if (!Bot.HasInHand(pair.Key) && pair.Value()) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(pair.Key)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + // search not exists + List searchList = new List { CardId.ExRyzeal, CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.NodeRyzeal }; + foreach (int id in searchList) + { + if (!Bot.HasInHand(id)) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(id)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + + // random search + return Util.CheckSelectCount(ShuffleList(cards.ToList()), cards, min, max); + } + } + + if (hint == HintMsg.SpSummon) + { + if (currentSolvingChain.IsCode(CardId.IceRyzeal)) + { + ClientCard thode = cards.FirstOrDefault(c => c.IsCode(CardId.ThodeRyzeal)); + ClientCard ex = cards.FirstOrDefault(c => c.IsCode(CardId.ExRyzeal)); + ClientCard node = cards.FirstOrDefault(c => c.IsCode(CardId.NodeRyzeal)); + if (thode != null) + { + bool flag = !activatedCardIdList.Contains(CardId.ThodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ThodeRyzeal); + flag |= Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal); + flag |= ex == null && node == null; + if (flag) + { + return Util.CheckSelectCount(new List { thode }, cards, min, max); + } + } + if (ex != null) + { + bool flag = !activatedCardIdList.Contains(CardId.ExRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal); + flag |= Bot.HasInHand(CardId.ThodeRyzeal) && !spSummonedCardIdList.Contains(CardId.ThodeRyzeal); + flag |= thode == null && node == null; + if (flag) + { + return Util.CheckSelectCount(new List { ex }, cards, min, max); + } + } + if (node != null) + { + return Util.CheckSelectCount(new List { node }, cards, min, max); + } + } + + if (currentSolvingChain.IsCode(CardId.TwinsOfTheEclipse)) + { + ClientCard target = TwinsOfTheEclipseRebornTarget(new List(cards)); + + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + + if (hint == HintMsg.ToDeck) + { + if (currentSolvingChain.IsCode(CardId.TripleTacticsTalent)) + { + foreach (ClientCard hand in cards) + { + foreach (int setcode in CheckSetcodeList) + { + if (hand.HasSetcode(setcode)) + { + enemyDeckTypeRecord.Add(setcode); + } + } + } + return Util.CheckSelectCount(ShuffleList(cards.ToList()), cards, min, max); + } + } + + if (hint == HintMsg.XyzMaterial) + { + if (currentSolvingChain.IsCode(CardId.RyzealDeadnader, CardId.RyzealDuodrive, CardId.RyzealPlugIn)) + { + // material that have effect + ClientCard effectTarget = cards.FirstOrDefault(c => c.IsCode(CardId.TwinsOfTheEclipse, CardId.MereologicAggregator)); + if (effectTarget != null) + { + return Util.CheckSelectCount(new List { effectTarget }, cards, min, max); + } + // cards in hand + foreach (ClientCard card in cards) + { + if (Bot.Hand.Count(c => c.IsCode(card.Id)) > 0) + { + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + // dump card + foreach (ClientCard card in cards) + { + if (cards.Count(c => c.IsCode(card.Id)) > 1) { + return Util.CheckSelectCount(new List { card }, cards, min, max); + } + } + } + } + + if (hint == HintMsg.RemoveXyz) + { + if (currentSolvingChain.IsCode(CardId.RyzealDuodrive)) + { + List resultList = new List(); + + List detachOwnerIdList = new List { CardId.StarliegePhotonBlastDragon, CardId.RyzealDuodrive, CardId.TwinsOfTheEclipse, + CardId.FullArmoredUtopicRayLancer, _CardId.EvilswarmExcitonKnight, CardId.Number60DugaresTheTimeless, CardId.RyzealDeadnader }; + foreach (int ownerId in detachOwnerIdList) + { + // detach from DuoDrive first + List detachMaterialList = cards.Where(c => c.OwnTargets.Any(oc => oc.IsCode(ownerId))).ToList(); + if (detachMaterialList.Count() > 0) + { + // deadnader + ClientCard deadnader = detachMaterialList.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + if (deadnader != null) + { + resultList.Add(deadnader); + } + List> filterList = new List> + { + (c) => !resultList.Contains(c) + && !c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse) + && Bot.HasInSpellZone(CardId.RyzealCross) && c.HasSetcode(SetcodeRyzeal) + && (c.Data == null || ((c.Data.Attribute & attrbuteLightDark) != 0)), + (c) => !resultList.Contains(c) + && !c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse) + && Bot.HasInSpellZone(CardId.RyzealCross) && c.HasSetcode(SetcodeRyzeal), + (c) => !resultList.Contains(c) + && !c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse) + && (c.Data == null || ((c.Data.Attribute & attrbuteLightDark) != 0)), + (c) => !resultList.Contains(c) + && !c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse), + (c) => !resultList.Contains(c) + }; + foreach (Func filter in filterList) + { + foreach (ClientCard material in detachMaterialList) + { + if (filter(material)) + { + resultList.Add(material); + } + } + } + } + } + return Util.CheckSelectCount(resultList, cards, min, max); + } + } + + // gain material by plugin + if (currentSolvingChain.IsCode(CardId.RyzealPlugIn) && cards.All(c => c.Location == CardLocation.MonsterZone)) + { + ClientCard abyssDweller = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.AbyssDweller) && c.Overlays.Count() < 2); + if (abyssDweller != null && AbyssDwellerSummonCheck()) + { + return Util.CheckSelectCount(new List { abyssDweller }, cards, min, max); + } + + ClientCard duoDriver = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.RyzealDuodrive) && c.Overlays.Count() == 1); + if (duoDriver != null && Bot.HasInMonstersZone(CardId.StarliegePhotonBlastDragon, true, false, true)) + { + return Util.CheckSelectCount(new List { duoDriver }, cards, min, max); + } + + ClientCard deadnader = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.RyzealDeadnader)); + if (deadnader != null) + { + return Util.CheckSelectCount(new List { deadnader }, cards, min, max); + } + + if (Bot.HasInSpellZone(CardId.RyzealCross, true, true)) + { + ClientCard ryzealXyz = cards.FirstOrDefault(c => c != null && c.HasSetcode(SetcodeRyzeal)); + if (ryzealXyz != null) + { + return Util.CheckSelectCount(new List { ryzealXyz }, cards, min, max); + } + } + + ClientCard tornadoDragon = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.TornadoDragon) && c.Overlays.Count() == 1); + if (tornadoDragon != null && TornadoDragonSummonCheck()) + { + return Util.CheckSelectCount(new List { tornadoDragon }, cards, min, max); + } + + ClientCard no41 = cards.FirstOrDefault(c => c != null && c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null && Number41BagooskatheTerriblyTiredTapirSummonCheck()) + { + return Util.CheckSelectCount(new List { no41 }, cards, min, max); + } + + duoDriver = cards.FirstOrDefault(c => c != null && !c.IsDisabled() && c.IsCode(CardId.RyzealDuodrive)); + if (duoDriver != null) + { + return Util.CheckSelectCount(new List { duoDriver }, cards, min, max); + } + } + + // double attack + if (currentSolvingChain.IsCode(CardId.Number60DugaresTheTimeless) && cards.All(c => c.Location == CardLocation.MonsterZone)) + { + ClientCard maxAttackMonster = cards.Where(c => c != null && (c.HasPosition(CardPosition.FaceUpAttack) || !summonThisTurn.Contains(c))) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + if (maxAttackMonster != null) + { + return Util.CheckSelectCount(new List { maxAttackMonster }, cards, min, max); + } + } + } + + // hand solve + if (hint == HintMsg.ToDeck || hint == HintMsg.ToGrave || hint == HintMsg.Discard) + { + bool allBotHand = cards.All(c => c.Controller == 0 && c.Location == CardLocation.Hand); + if (allBotHand) + { + List resultList = new List(); + List returnList = new List { _CardId.MulcharmyNyalus, _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, + CardId.SeventhTachyon + }; + foreach (int code in returnList) + { + List targetList = cards.Where(c => c.IsCode(code) && !resultList.Contains(c)).ToList(); + if (targetList.Count() > 0) + { + resultList.AddRange(targetList); + } + } + // return dump card + foreach (ClientCard card in cards) + { + if (!resultList.Contains(card) && cards.Where(c => c.IsCode(card.Id) && !resultList.Contains(c)).Count() > 1) + { + resultList.Add(card); + } + } + List unproperCardList = new List { _CardId.EffectVeiler, _CardId.InfiniteImpermanence, _CardId.GhostOgreAndSnowRabbit, CardId.TripleTacticsTalent, + CardId.NodeRyzeal, _CardId.LockBird, CardId.RyzealPlugIn, _CardId.CrossoutDesignator, _CardId.CalledByTheGrave, CardId.RyzealCross, + CardId.ThodeRyzeal, CardId.ExRyzeal, CardId.IceRyzeal + }; + foreach (int code in unproperCardList) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(code) && !resultList.Contains(c)); + if (target != null) + { + resultList.Add(target); + } + } + return Util.CheckSelectCount(resultList, cards, min, max); + } + } + } + + if (currentSolvingChain == null) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null) + { + // handle for RyzealDeadnader + if (lastChainCard.Controller == 0 && lastChainCard.IsCode(CardId.RyzealDeadnader)) + { + if (hint == HintMsg.RemoveXyz) + { + if (deadnaderDestroySelf != null) + { + ClientCard detachTarget = cards.FirstOrDefault(c => c.IsCode(CardId.MereologicAggregator, CardId.TwinsOfTheEclipse)); + if (detachTarget != null) + { + return Util.CheckSelectCount(new List { detachTarget }, cards, min, max); + } + } + List targets = cards.OrderBy(c => c.Attack).ToList(); + return Util.CheckSelectCount(targets, cards, min, max); + } else if (hint == HintMsg.Destroy) + { + if (deadnaderDestroySelf != null && cards.Contains(deadnaderDestroySelf)) + { + return Util.CheckSelectCount(new List { deadnaderDestroySelf }, cards, min, max); + } + List targetList = CanDestroyList(); + foreach (ClientCard target in targetList) + { + if (cards.Contains(target)) + { + currentDestroyCardList.Add(target); + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + + if (hint == HintMsg.RemoveXyz && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + List checkRyzealIdList = new List { CardId.NodeRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal }; + foreach (int checkId in checkRyzealIdList) + { + if (!activatedCardIdList.Contains(checkId)) + { + ClientCard target = cards.FirstOrDefault(c => c.IsCode(checkId)); + if (target != null) + { + return Util.CheckSelectCount(new List { target }, cards, min, max); + } + } + } + } + } + } + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + /// + /// go first + /// + public override bool OnSelectHand() + { + HashSet tenpaiList = new HashSet { SetcodeTenpaiDragon, SetcodeSangen }; + bool maybeTenpai = enemyDeckTypeRecord.Count() > 0 && enemyDeckTypeRecord.All(c => tenpaiList.Contains(c)); + return !maybeTenpai; + } + + public override int OnSelectOption(IList options) + { + bool tripleCheck = false; + for (int opt = 0; opt < 3; ++ opt) + { + if (options.Contains(Util.GetStringId(CardId.TripleTacticsTalent, opt))) + { + tripleCheck = true; + break; + } + } + if (tripleCheck) + { + return TripleTacticsTalentDecision(options); + } + + bool no60Check = false; + for (int opt = 0; opt < 3; ++ opt) + { + if (options.Contains(Util.GetStringId(CardId.Number60DugaresTheTimeless, opt))) + { + no60Check = true; + break; + } + } + if (no60Check) + { + // double attack + if (options.Contains(Util.GetStringId(CardId.Number60DugaresTheTimeless, 2))) + { + if (Number60DugaresTheTimelessDoubleTarget() != null) + { + int res = options.IndexOf(Util.GetStringId(CardId.Number60DugaresTheTimeless, 2)); + if (res >= 0) + { + return res; + } + } + } + // draw effect + if (options.Contains(Util.GetStringId(CardId.Number60DugaresTheTimeless, 0))) + { + if (Number60DugaresTheTimelessDrawEffect()) + { + int res = options.IndexOf(Util.GetStringId(CardId.Number60DugaresTheTimeless, 0)); + if (res >= 0) + { + return res; + } + } + } + // reborn + if (options.Contains(Util.GetStringId(CardId.Number60DugaresTheTimeless, 1))) + { + if (Number60DugaresTheTimelessRebornEffect()) + { + int res = options.IndexOf(Util.GetStringId(CardId.Number60DugaresTheTimeless, 1)); + if (res >= 0) + { + return res; + } + } + } + } + + ClientCard currentSolvingChain = Duel.GetCurrentSolvingChainCard(); + if (currentSolvingChain != null) + { + // TODO + } + + return base.OnSelectOption(options); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + List zoneIdList = ShuffleList(new List { 5, 6 }); + zoneIdList.AddRange(ShuffleList(new List { 0, 2, 4 })); + zoneIdList.AddRange(ShuffleList(new List { 1, 3 })); + foreach (int zoneId in zoneIdList) + { + int zone = (int)System.Math.Pow(2, zoneId); + if ((available & zone) != 0 && Bot.MonsterZone[zoneId] == null) + { + return zone; + } + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + + public override bool OnSelectYesNo(int desc) + { + if (desc == Util.GetStringId(CardId.RyzealPlugIn, 1)) + { + Logger.DebugWriteLine("** plugin set material"); + return true; + } + + return base.OnSelectYesNo(desc); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + if (cardId == _CardId.Number41BagooskatheTerriblyTiredTapir && (Util.IsTurn1OrMain2() || Duel.Player == 1)) + { + return CardPosition.FaceUpDefence; + } + + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2) + { + bool turnDefense = false; + if (cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } + int cardAttack = cardData.Attack; + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardAttack); + + if (Bot.HasInExtra(CardId.Number60DugaresTheTimeless) && GetLevel4FinalCountOnField(true, out _) >= 2) + { + bestBotAttack *= 2; + } + + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } + + public override void OnNewTurn() + { + if (Duel.Turn <= 1) + { + dimensionShifterCount = 0; + // for doom bot + maxSummonCount = 1; + hardToDestroyCardList.Clear(); + cannotDestroyCardList.Clear(); + } + + summonCount = maxSummonCount; + enemyActivateMaxxC = false; + enemyActivatePurulia = false; + enemyActivateFuwalos = false; + enemyActivateNyalus = false; + lockBirdSolved = false; + if (dimensionShifterCount > 0) dimensionShifterCount--; + enemyActivateInfiniteImpermanenceFromHand = false; + botActivateMulcharmy = false; + deadnaderDestroySelf = null; + botSolvingCross = false; + infiniteImpermanenceList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + activatedCardIdList.Clear(); + spSummonedCardIdList.Clear(); + botSolvedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + summonThisTurn.Clear(); + currentCanActivateEffect.Clear(); + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + Duel.LastChainTargets.Clear(); + if (card == null) return; + + if (player == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence)) + { + if (enemyActivateInfiniteImpermanenceFromHand) + { + enemyActivateInfiniteImpermanenceFromHand = false; + } + else + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + + if (card.HasSetcode(SetcodeFloowandereeze)) + { + enemyDeckTypeRecord.Add(SetcodeFloowandereeze); + } + } + + if (player == 0) + { + if (card.IsCode(_CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus)) + { + botActivateMulcharmy = true; + } + } + base.OnChaining(player, card); + } + + public override void OnChainSolved(int chainIndex) + { + botSolvingCross = false; + ChainInfo currentChain = Duel.GetCurrentSolvingChainInfo(); + if (currentChain != null && !Duel.IsCurrentSolvingChainNegated()) + { + if (!Duel.IsCurrentSolvingChainNegated()) + { + if (currentChain.IsCode(_CardId.LockBird)) + lockBirdSolved = true; + if (currentChain.IsCode(_CardId.DimensionShifter)) + dimensionShifterCount = 2; + if (currentChain.ActivatePlayer == 1) + { + if (currentChain.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentChain.IsCode(_CardId.MulcharmyPurulia)) + enemyActivatePurulia = true; + if (currentChain.IsCode(_CardId.MulcharmyFuwalos)) + enemyActivateFuwalos = true; + if (currentChain.IsCode(_CardId.MulcharmyNyalus)) + enemyActivateNyalus = true; + } + if (currentChain.ActivatePlayer == 0) + { + foreach (int checkId in CheckBotSolvedList) + { + if (currentChain.IsCode(checkId)) + { + botSolvedCardIdList.Add(checkId); + } + } + } + } + } + + base.OnChainSolved(chainIndex); + } + + public override void OnChainEnd() + { + for (int idx = cannotDestroyCardList.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = cannotDestroyCardList[idx]; + if (checkTarget == null || !checkTarget.IsOnField()) + { + cannotDestroyCardList.RemoveAt(idx); + } + } + for (int idx = hardToDestroyCardList.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = hardToDestroyCardList[idx]; + if (checkTarget == null || !checkTarget.IsOnField()) + { + hardToDestroyCardList.RemoveAt(idx); + } + } + foreach (ClientCard card in currentDestroyCardList) + { + if (card != null && card.IsOnField()) + { + if (hardToDestroyCardList.Contains(card)) + { + cannotDestroyCardList.Add(card); + } else + { + hardToDestroyCardList.Add(card); + } + } + } + + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + currentCanActivateEffect.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + botSolvingCross = false; + deadnaderDestroySelf = null; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || !checkTarget.IsOnField()) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + base.OnChainEnd(); + } + + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (card != null) + { + if (previousControler == 1) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && previousLocation == (int)CardLocation.Hand && currentLocation == (int)CardLocation.SpellZone) + enemyActivateInfiniteImpermanenceFromHand = true; + } + if (card.Owner == 1) + { + foreach (int setcode in CheckSetcodeList) + { + if (card.HasSetcode(setcode)) + { + enemyDeckTypeRecord.Add(setcode); + } + } + if (card.IsCode(AlbazFusionList)) + { + enemyDeckTypeRecord.Add(SetcodeBranded); + } + } + if (currentControler == 1 && (currentLocation == (int)CardLocation.MonsterZone || currentLocation == (int)CardLocation.SpellZone)) + { + enemyPlaceThisTurn.Add(card); + } + + if (previousControler == 0 && previousLocation == (int)CardLocation.MonsterZone && currentLocation != (int)CardLocation.MonsterZone && summonThisTurn.Contains(card)) + { + summonThisTurn.Remove(card); + } + if (currentControler == 0 && currentLocation == (int)CardLocation.MonsterZone) + { + summonThisTurn.Add(card); + } + } + + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } + + public override void OnSpSummoned() + { + // not special summoned by chain + if (Duel.GetCurrentSolvingChainCard() == null) + { + foreach (ClientCard card in Duel.LastSummonedCards) + { + if (card.Controller == 0 && card.IsCode(CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.NodeRyzeal, CardId.ExRyzeal)) + { + spSummonedCardIdList.Add(card.GetOriginCode()); + } + } + } + } + + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool IceRyzealSpSummonFirst() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= GetLevel4CountOnField() >= 2; + if (flag) return false; + } + List costList = GetCostFromHandAndFieldFirst(Card); + if (costList.Count() > 0) + { + AI.SelectCard(costList); + return true; + } + + return false; + } + + public bool IceRyzealSpSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= GetLevel4CountOnField() >= 2; + if (flag) return false; + } + if (Card.Level != 4) return false; + if (summonCount <= 0 && GetLevel4CountOnField() == 1) + { + List firstCostList = GetCostFromHandAndField(Card, false); + if (firstCostList.Count() > 0) + { + AI.SelectCard(firstCostList); + return true; + } + if (Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled() && c.IsFloodgate()) || !CheckWhetherHaveFinalMonster()) + { + List costList = GetCostFromHandAndField(Card, true); + if (costList.Count() > 0) + { + AI.SelectCard(costList); + return true; + } + } + } + + return false; + } + + public bool IceRyzealSummon() + { + if (CheckWhetherNegated(true, true)) return false; + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= GetLevel4CountOnField() >= 2; + if (flag) return false; + } + summonCount -= 1; + return true; + } + + public bool IceRyzealActivate() + { + if (CheckWhetherNegated(true)) return false; + if (CheckShouldNoMoreSpSummon(CardLocation.Deck) && GetLevel4CountOnField() >= 2) + { + return false; + } + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool ThodeRyzealSpSummon() + { + int lv4Count = GetLevel4CountOnField(); + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= lv4Count >= 2; + flag |= lv4Count == 1 && summonCount > 0; + if (flag) return false; + } + bool spsummonFlag = lv4Count == 1; + spsummonFlag |= !CheckWhetherNegated(true, true, CardType.Monster) && CheckRemainInDeck(CardId.IceRyzeal, CardId.ExRyzeal) > 0 + && !activatedCardIdList.Contains(CardId.ThodeRyzeal) && !lockBirdSolved; + if (GetLevel4CountOnField() == 0) + { + spsummonFlag |= GetLevel4FinalCountOnField(true, out _) >= 2 && !CheckWhetherHaveFinalMonster(); + } + + return spsummonFlag; + } + + public bool ThodeRyzealSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) + { + int lv4Count = GetLevel4CountOnField(); + if (lv4Count == 1) + { + bool flag = !activatedCardIdList.Contains(CardId.ThodeRyzeal); + flag &= !(Bot.HasInHand(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal)); + if (flag) + { + summonCount -= 1; + return true; + } + } + bool skipFlag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + skipFlag |= lv4Count >= 2; + if (skipFlag) return false; + } + if (CheckWhetherNegated(true)) return false; + + summonCount -= 1; + return true; + } + + public bool ThodeRyzealActivate() + { + if (CheckWhetherNegated(true)) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool NodeRyzealSpSummon() + { + int lv4Count = GetLevel4CountOnField(); + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= lv4Count >= 2; + flag |= lv4Count == 1 && summonCount > 0; + if (flag) return false; + } + bool spsummonFlag = lv4Count == 1; + spsummonFlag |= !CheckWhetherNegated(true, true, CardType.Monster) && Bot.Graveyard.Any(c => !c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && c.Level == 4); + return spsummonFlag; + } + + public bool NodeRyzealSpSummonFirst() + { + int lv4Count = GetLevel4CountOnField(); + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Deck | CardLocation.Extra)) + { + bool flag = Bot.GetMonsters().Any(c => c.IsFaceup() && c.HasType(CardType.Xyz)); + flag |= lv4Count >= 2; + flag |= lv4Count == 1 && summonCount > 0; + if (flag) return false; + } + if (!activatedCardIdList.Contains(Card.Id) && GetCostFromHandAndField(Card, false).Count() > 0) + { + return true; + } + return false; + } + + public bool NodeRyzealActivate() + { + if (NodeRyzealActivateInner(true)) + { + return true; + } + + return false; + } + + public bool NodeRyzealActivateFirst() + { + if (NodeRyzealActivateInner(false)) + { + return true; + } + + return false; + } + + public bool NodeRyzealActivateInner(bool sendNotNessary) + { + if (CheckWhetherNegated(true)) return false; + if (CheckShouldNoMoreSpSummon(CardLocation.Grave | CardLocation.Extra)) + { + if (Bot.GetMonsters().Count(c => c.HasType(CardType.Xyz) && c.IsFaceup()) > 0) return false; + } + + ClientCard nonLightDarkTarget = Bot.Graveyard.Where(c => c != null && !c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && c.Level == 4 + && !c.HasAttribute((CardAttribute)attrbuteLightDark)).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + ClientCard normalTarget = Bot.Graveyard.Where(c => c != null && !c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && c.Level == 4 + && c != nonLightDarkTarget).OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (nonLightDarkTarget == null || normalTarget == null) return false; + List rebornTarget = new List { nonLightDarkTarget, normalTarget }; + + List firstCostList = GetCostFromHandAndField(Card, false); + if (firstCostList.Count() > 0) + { + AI.SelectCard(firstCostList); + AI.SelectNextCard(rebornTarget); + activatedCardIdList.Add(Card.Id); + return true; + } + if (GetLevel4CountOnField() == 1 && sendNotNessary) + { + List nextCostList = GetCostFromHandAndField(Card, true); + if (nextCostList.Count() > 0) + { + AI.SelectCard(nextCostList); + AI.SelectNextCard(rebornTarget); + activatedCardIdList.Add(Card.Id); + return true; + } + } + + return false; + } + + public bool ExRyzealSpSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Extra)) + { + bool checkFlag = !CheckWhetherHaveFinalMonster() && GetLevel4CountOnField() == 1; + if (checkFlag && ExRyzealDiscardExtra()) + { + return true; + } + return false; + } + if (Duel.Turn == 1) + { + bool checkFlag = !activatedCardIdList.Contains(CardId.ExRyzeal) && !lockBirdSolved && !DefaultCheckWhetherCardIdIsNegated(CardId.ExRyzeal) && !Bot.HasInMonstersZone(_CardId.Number41BagooskatheTerriblyTiredTapir); + checkFlag |= !Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz)) && GetLevel4CountOnField() == 1; + if (checkFlag) + { + // discard ryzeal + AI.SelectCard(CardId.RyzealDeadnader, CardId.RyzealDuodrive); + return true; + } + } + if (ExRyzealDiscardExtra()) + { + return true; + } + + return false; + } + + public bool ExRyzealDiscardExtra() + { + List discardIdCheckList = new List { CardId.MereologicAggregator, CardId.TwinsOfTheEclipse, CardId.Number104Masquerade, CardId.StarliegePhotonBlastDragon, + CardId.TornadoDragon, CardId.AbyssDweller, _CardId.EvilswarmExcitonKnight, CardId.FullArmoredUtopicRayLancer, CardId.Number60DugaresTheTimeless, + CardId.RyzealDuodrive, CardId.RyzealDeadnader}; + + // delay id + List discardIdList = new List(); + foreach (int discardId in discardIdCheckList) + { + if (discardId == CardId.MereologicAggregator) + { + if (!Enemy.MonsterZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled() && !c.IsShouldNotBeMonsterTarget()) + && Enemy.SpellZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled() && !c.IsShouldNotBeMonsterTarget())) + { + continue; + } + } + if (discardId == CardId.TwinsOfTheEclipse) + { + if (Bot.Graveyard.Count(c => c.HasType(CardType.Xyz)) < 2 || !Bot.Graveyard.Any(c => c.HasType(CardType.Xyz) && c.IsCanRevive())) + { + continue; + } + } + if (discardId == CardId.Number104Masquerade) + { + if (CheckRemainInDeck(CardId.SeventhTachyon) > 0 || Bot.HasInHandOrInSpellZone(CardId.Number104Masquerade)) + { + continue; + } + } + if (discardId == CardId.TornadoDragon) + { + if (Enemy.GetSpellCount() > 0) + { + continue; + } + } + discardIdList.Add(discardId); + } + discardIdList.AddRange(discardIdCheckList); + + foreach (int id in discardIdList) + { + if (Bot.HasInExtra(id)) + { + AI.SelectCard(id); + return true; + } + } + + return false; + } + + public bool ExRyzealSpSummonLater() + { + // TODO + return false; + } + + public bool ExRyzealSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) + { + if (GetLevel4CountOnField() == 1) + { + bool flag = !activatedCardIdList.Contains(CardId.ExRyzeal); + flag &= !(Bot.HasInHand(CardId.ThodeRyzeal) && !activatedCardIdList.Contains(CardId.ThodeRyzeal)); + if (flag) + { + summonCount -= 1; + return true; + } + } + } + return false; + } + + public bool ExRyzealActivate() + { + if (CheckWhetherNegated(true)) + { + // use mero to negate No.41? + int count41 = Enemy.GetMonsters().Count(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && c.IsFaceup() + && !c.IsDisabled() && c.HasPosition(CardPosition.FaceUpDefence)); + bool canNegate41 = count41 == 1 && currentCanActivateEffect.Any(c => c != null && c.IsCode(CardId.MereologicAggregator)); + + if (canNegate41) + { + activatedCardIdList.Add(Card.Id); + return true; + } else + { + return false; + } + } + activatedCardIdList.Add(Card.Id); + return true; + } + + public bool MulcharmyFuwalosActivate() + { + if (CheckWhetherNegated(true) || Duel.Player == 0) return false; + if (lockBirdSolved || Duel.CurrentChain.Any(c => c.IsCode(_CardId.LockBird))) return false; + if (Duel.Phase > DuelPhase.Main1) return false; + + botActivateMulcharmy = true; + return true; + } + + public bool MulcharmyPuruliaActivate() + { + if (CheckWhetherNegated(true) || Duel.Player == 0) return false; + if (lockBirdSolved || Duel.CurrentChain.Any(c => c.IsCode(_CardId.LockBird))) return false; + if (Duel.Phase > DuelPhase.Main1) return false; + if (botActivateMulcharmy) return false; + + botActivateMulcharmy = true; + return true; + } + + public bool MulcharmyNyalusActivate() + { + if (CheckWhetherNegated(true) || Duel.Player == 0) return false; + if (lockBirdSolved || Duel.CurrentChain.Any(c => c.IsCode(_CardId.LockBird))) return false; + if (Duel.Phase > DuelPhase.Main1) return false; + if (botActivateMulcharmy) return false; + + botActivateMulcharmy = true; + return true; + } + + public bool AshBlossomActivate() + { + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (DefaultAshBlossomAndJoyousSpring()) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard.Location == CardLocation.MonsterZone || lastChainCard.Location == CardLocation.SpellZone) currentNegateCardList.Add(Util.GetLastChainCard()); + return true; + } + return false; + } + + public bool GhostOgreAndSnowRabbitActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard == null || lastChainCard.IsDisabled()) return false; + if (lastChainCard.IsMonster() && !lastChainCard.HasType(CardType.Link | CardType.Fusion | CardType.Synchro | CardType.Xyz)) return false; + return true; + } + + public bool MaxxCActivate() + { + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0 || lockBirdSolved) return false; + return DefaultMaxxC(); + } + + public bool LockBirdActivate() + { + if (CheckWhetherNegated(true)) return false; + if (Duel.Player == 0) return false; + List mulcharmyCheckIdList = new List { _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos }; + if (mulcharmyCheckIdList.Intersect(botSolvedCardIdList).Any()) + { + int enemyFieldCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (enemyFieldCount + 6 < Bot.Hand.Count()) return false; + } + if (botSolvedCardIdList.Contains(_CardId.MaxxC)) + { + if (!activatedCardIdList.Contains(_CardId.AshBlossom) || !activatedCardIdList.Contains(_CardId.EffectVeiler)) return false; + } + return true; + } + + public bool EffectVeilerActivate() + { + if (CheckWhetherNegated(true)) return false; + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Monster); + if (shouldNegateList.Count > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateCardList.Add(negateTarget); + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + public bool SeventhTachyonActivate() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + bool flag = !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !Bot.HasInHand(CardId.ExRyzeal); + flag &= !(!activatedCardIdList.Contains(CardId.IceRyzeal) && summonCount > 0 && Bot.HasInHand(CardId.IceRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal)); + if (flag) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool TripleTacticsTalentActivate() + { + if (CheckWhetherNegated(true)) return false; + if (TripleTacticsTalentDecision(null) == -1) return false; + SelectSTPlace(Card, true); + return true; + } + + public int TripleTacticsTalentDecision(IList options) + { + // gain control? + bool dangerFlag = Enemy.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled() && (c.IsFloodgate() + || c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && c.HasPosition(CardPosition.FaceUpDefence))); + if (dangerFlag) + { + if (options == null) return 1; + int res = options.IndexOf(Util.GetStringId(CardId.TripleTacticsTalent, 1)); + if (res >= 0) return res; + } + // draw? + if (!lockBirdSolved) + { + bool checkFlag = CheckCanContinueSummon(); + if (!checkFlag) + { + if (options == null) return 1; + int res = options.IndexOf(Util.GetStringId(CardId.TripleTacticsTalent, 0)); + if (res >= 0) return res; + } + } + // shuffle hand + if (Enemy.Hand.Count() > 0) + { + if (options == null) return 1; + int res = options.IndexOf(Util.GetStringId(CardId.TripleTacticsTalent, 2)); + if (res >= 0) return res; + } + return -1; + } + + public bool PotOfDesiresActivate() + { + if (CheckWhetherNegated(true)) return false; + if (Bot.Deck.Count >= 15) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool PotOfDesireActivateForContinue() + { + if (CheckWhetherNegated(true)) return false; + if (Bot.Deck.Count >= 15 && !CheckCanContinueSummon() && CheckRemainInDeck(CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal) > 0) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool BonfireActivateToSearchNecessary() + { + if (CheckWhetherNegated(true, true, CardType.Spell)) return false; + bool flag = !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !Bot.HasInHand(CardId.ExRyzeal); + flag |= !activatedCardIdList.Contains(CardId.IceRyzeal) && summonCount > 0 && !Bot.HasInHand(CardId.IceRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.IceRyzeal); + if (flag) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + + public bool BonfireActivate() + { + if (CheckWhetherNegated(true)) return false; + // activate before no60 + if (!activatedCardIdList.Contains(CardId.Number60DugaresTheTimeless)) + { + ClientCard no60 = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.Number60DugaresTheTimeless) && !c.IsDisabled()); + if (no60 != null && no60.Overlays.Count() >= 2) + { + SelectSTPlace(Card, true); + return true; + } + } + + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + ClientCard lastChainCard = Util.GetLastChainCard(); + if (Duel.LastChainPlayer == 1) + { + // negate + if (lastChainCard != null && lastChainCard.IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + + // not to negate same card in hand + List mulcharmyIdList = new List { _CardId.MulcharmyPurulia, _CardId.MulcharmyFuwalos, _CardId.MulcharmyNyalus }; + if (Duel.Player == 0 && Bot.HasInHand(code) && !mulcharmyIdList.Contains(code)) return false; + + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentDestroyCardList.Add(graveTarget); + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && c.IsCode(code))); + return true; + } + } + + // banish target + foreach (ClientCard graveCard in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(graveCard) && graveCard.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = graveCard.Id; + AI.SelectCard(graveCard); + currentDestroyCardList.Add(graveCard); + return true; + } + } + + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentDestroyCardList.Add(enemyMonsters[0]); + return true; + } + } + } + + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count > 0) + { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentDestroyCardList.Add(targets[0]); + return true; + } + + return false; + } + + public bool RyzealPlugInActivate() + { + if (CheckWhetherNegated(true)) return false; + + // spsummon lv4 + if (Duel.Player == 0 && CurrentTiming == -1) + { + bool summonFlag = GetLevel4CountOnField() == 1; + if (GetLevel4CountOnField() == 0) + { + summonFlag |= GetLevel4FinalCountOnField(true, out _) >= 2 && !CheckWhetherHaveFinalMonster(); + } + + // summon extra level4 monster to xyz summon + if (summonFlag) + { + List checkIdList = new List { CardId.NodeRyzeal, CardId.ExRyzeal, CardId.ThodeRyzeal, CardId.IceRyzeal }; + foreach (int id in checkIdList) + { + if (activatedCardIdList.Contains(id)) continue; + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + + foreach (int id in checkIdList) + { + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + } + } + + // spsummon deadnader + if (!Bot.HasInMonstersZone(CardId.RyzealDeadnader, true, true, true) && !Duel.CurrentChain.Any(c => c.IsCode(CardId.TwinsOfTheEclipse)) + && !DefaultCheckWhetherCardIdIsNegated(CardId.RyzealDeadnader) && !Util.ChainContainPlayer(0)) + { + ClientCard deadnader = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.RyzealDeadnader) && c.IsCanRevive()); + if (deadnader == null) + { + deadnader = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.RyzealDeadnader) && c.IsCanRevive()); + } + if (deadnader != null) + { + AI.SelectCard(deadnader); + SelectSTPlace(Card, true); + return true; + } + } + + // chain to negate monster effect + if (Bot.HasInSpellZone(CardId.RyzealCross, true, true) && !activatedCardIdList.Contains(CardId.RyzealCross + 2) + && CheckRemainInDeck(CardId.ExRyzeal, CardId.IceRyzeal, CardId.NodeRyzeal, CardId.ThodeRyzeal) > 0) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.IsMonster() && lastChainCard.Controller == 1 && CheckCardShouldNegate(lastChainCard)) + { + bool activateFlag = false; + bool shouldRebornXyz = false; + bool duodriverActivating = Duel.CurrentChain.Any(c => c.IsCode(CardId.RyzealDuodrive) && c.Controller == 0) && activatedCardIdList.Contains(CardId.RyzealDuodrive + 1); + if (duodriverActivating) + { + // check whether have 3+ material + activateFlag = Bot.MonsterZone.Where(c => c != null && c.HasType(CardType.Xyz)).Sum(c => c.Overlays.Count()) >= 3; + } else + { + if (!Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && c.Overlays.Count() > 0)) + { + activateFlag |= Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal)); + if (!activateFlag) + { + bool hasXyzTarget = Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && c.IsCanRevive() && c.HasType(CardType.Xyz)); + hasXyzTarget |= Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && c.IsCanRevive() && c.HasType(CardType.Xyz)); + if (hasXyzTarget) + { + activateFlag = true; + shouldRebornXyz = true; + } + } + } + } + + if (activateFlag) + { + ClientCard deadnader = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + if (deadnader == null) + { + deadnader = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + } + if (deadnader != null) + { + AI.SelectCard(deadnader); + SelectSTPlace(Card, true); + return true; + } + + if (shouldRebornXyz) + { + ClientCard duoDriver = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDuodrive)); + if (duoDriver == null) + { + duoDriver = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDuodrive)); + } + if (duoDriver != null) + { + AI.SelectCard(duoDriver); + SelectSTPlace(Card, true); + return true; + } + } else + { + List checkIdList = new List { CardId.NodeRyzeal, CardId.ExRyzeal, CardId.ThodeRyzeal, CardId.IceRyzeal }; + foreach (int id in checkIdList) + { + if (activatedCardIdList.Contains(id)) continue; + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + foreach (int id in checkIdList) + { + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + } + } + } + } + + bool becomeTargetFlag = DefaultOnBecomeTarget() && Card.Location == CardLocation.SpellZone; + bool endPhaseFlag = Duel.Player == 1 && Duel.Phase == DuelPhase.End; + if (becomeTargetFlag || endPhaseFlag) + { + if (!(Duel.CurrentChain.Any(c => c != null && c.Controller == 1 && c.IsCode(_CardId.EvenlyMatched)) && deadnaderDestroySelf != null)) + { + ClientCard deadnader = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + if (deadnader == null) + { + deadnader = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDeadnader)); + } + if (deadnader != null) + { + AI.SelectCard(deadnader); + SelectSTPlace(Card, true); + return true; + } + + ClientCard duoDriver = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDuodrive)); + if (duoDriver == null) + { + duoDriver = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCanRevive() && c.IsCode(CardId.RyzealDuodrive)); + } + if (duoDriver != null) + { + AI.SelectCard(duoDriver); + SelectSTPlace(Card, true); + return true; + } + + List checkIdList = new List { CardId.NodeRyzeal, CardId.ExRyzeal, CardId.ThodeRyzeal, CardId.IceRyzeal }; + foreach (int id in checkIdList) + { + if (activatedCardIdList.Contains(id)) continue; + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + + if (!endPhaseFlag) + { + foreach (int id in checkIdList) + { + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(id)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + } + } + } + + return false; + } + + public bool RyzealPlugInActivateFirst() + { + if (CheckWhetherNegated(true)) return false; + if (Duel.Player == 0 && CurrentTiming == -1 && !activatedCardIdList.Contains(CardId.NodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.NodeRyzeal)) + { + List nodeCostList = GetCostFromHandAndField(Card, false); + if (nodeCostList.Count() > 0) + { + ClientCard target = Bot.Banished.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.NodeRyzeal)); + if (target == null) + { + target = Bot.Graveyard.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.NodeRyzeal)); + } + if (target != null) + { + AI.SelectCard(target); + SelectSTPlace(Card, true); + return true; + } + } + } + + return false; + } + + public bool RyzealCrossActivateCard() + { + // whether to negate by cross + if (ActivateDescription == Util.GetStringId(CardId.RyzealCross, 3)) + { + ChainInfo currentChainInfo = Duel.GetCurrentSolvingChainInfo(); + if (currentChainInfo != null && !Duel.IsCurrentSolvingChainNegated()) + { + if (CheckCardShouldNegate(currentChainInfo)) + { + Logger.DebugWriteLine("** cross negate"); + activatedCardIdList.Add(CardId.RyzealCross + 2); + botSolvingCross = true; + return true; + } + } + return false; + } + + if (CheckWhetherNegated(true)) return false; + if (Card.Location == CardLocation.SpellZone && Card.IsFaceup()) return false; + bool flag = RyzealCrossActivateRecycleFirst(); + bool canSetMaterial = Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn) && CheckRemainInDeck(CardId.IceRyzeal, CardId.ExRyzeal, CardId.NodeRyzeal, CardId.ThodeRyzeal) > 0 + && (Bot.Graveyard.Any(c => c != null && c.HasSetcode(SetcodeRyzeal) && (c.IsCanRevive() || !c.HasType(CardType.Xyz))) || + Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && (c.IsCanRevive() || !c.HasType(CardType.Xyz)))); + flag |= Bot.MonsterZone.Count(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz) && c.HasSetcode(SetcodeRyzeal) && (c.Overlays.Count() > 0 || canSetMaterial)) > 0; + + if (Duel.MainPhase.SpecialSummonableCards.Any(c => c.IsCode(CardId.RyzealDuodrive))) + { + flag |= RyzealDuodriveSpSummonCheck(); + } + + return flag; + } + + public bool RyzealCrossActivateRecycleFirst() + { + if (CheckWhetherNegated(true) || !(Card.Location == CardLocation.SpellZone && Card.IsFaceup())) return false; + if (ActivateDescription == Util.GetStringId(CardId.RyzealCross, 3)) + { + return false; + } + List checkIdList = new List { CardId.RyzealPlugIn, CardId.RyzealDuodrive, CardId.RyzealDeadnader, CardId.NodeRyzeal, CardId.ExRyzeal, CardId.IceRyzeal, CardId.ThodeRyzeal }; + List targetList = new List(); + foreach (int id in checkIdList) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(c => c.IsCode(id)); + if (target != null && (CheckRemainInDeck(id) + Bot.ExtraDeck.Count(c => c.IsCode(id)) + Bot.Hand.Count(c => c.IsCode(id))) == 0) + { + if (target.HasType(CardType.Xyz) && GetLevel4CountOnField() == 1) continue; + targetList.Add(target); + } + + if (targetList.Count() >= 2) + { + AI.SelectCard(targetList); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + + return false; + } + + public bool RyzealCrossActivateRecycleLater() + { + if (CheckWhetherNegated(true) || !(Card.Location == CardLocation.SpellZone && Card.IsFaceup())) return false; + if (ActivateDescription == Util.GetStringId(CardId.RyzealCross, 3)) + { + return false; + } + SortedDictionary> countDict = new SortedDictionary>(); + List checkIdList = new List { CardId.RyzealPlugIn, CardId.RyzealDuodrive, CardId.RyzealDeadnader, CardId.NodeRyzeal, CardId.ExRyzeal, CardId.IceRyzeal, CardId.ThodeRyzeal }; + foreach (int id in checkIdList) + { + int remainCount = CheckRemainInDeck(id) + Bot.ExtraDeck.Count(c => c.IsCode(id)); + if (!countDict.ContainsKey(remainCount)) + { + countDict.Add(remainCount, new List()); + } + countDict[remainCount].Add(id); + } + + List targetList = new List(); + foreach (KeyValuePair> pair in countDict) + { + foreach (int id in pair.Value) + { + ClientCard target = Bot.Graveyard.FirstOrDefault(c => c.IsCode(id)); + if (target != null) targetList.Add(target); + } + } + + if (targetList.Count() >= 2) + { + AI.SelectCard(targetList); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + + return false; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + // negate + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && c.IsCode(code))); + return true; + } + } + return false; + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + + ClientCard LastChainCard = Util.GetLastChainCard(); + + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectCard(target); + } + else + { + AI.SelectCard(Enemy.GetMonsters()); + } + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(true, CardType.Trap); + if (shouldNegateList.Count > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateCardList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(negateTarget); + return true; + } + + return false; + } + + // TODO extra summon + + public bool AbyssDwellerSummonCheck() + { + bool flag = enemyDeckTypeRecord.Contains(SetcodeAtlantean); + flag |= enemyDeckTypeRecord.Contains(SetcodeOrcust); + flag |= enemyDeckTypeRecord.Contains(SetcodePhantomKnight); + flag |= enemyDeckTypeRecord.Count() > 0 && enemyDeckTypeRecord.All(c => c == SetcodeTearlaments); + + int enemyDeckTotalCount = Enemy.Hand.Count() + Enemy.Deck.Count() + Enemy.Graveyard.Count() + Enemy.Banished.Count() + Enemy.ExtraDeck.Count(); + if (enemyDeckTotalCount > 65) + { + flag |= !enemyDeckTypeRecord.Contains(SetcodeInfernoid); + } + + return flag; + } + + public bool Number41BagooskatheTerriblyTiredTapirSummonCheck() + { + bool flag = enemyDeckTypeRecord.Contains(SetcodeFloowandereeze); + flag |= enemyDeckTypeRecord.Contains(SetcodeBranded); + flag |= enemyDeckTypeRecord.Contains(SetcodeRyzeal); + flag &= Util.IsTurn1OrMain2(); + + return flag; + } + + public bool TornadoDragonSummonCheck() + { + if (CheckWhetherNegated(true, true, CardType.Monster)) return false; + bool flag = enemyDeckTypeRecord.Contains(SetcodeLabrynth); + flag |= Enemy.SpellZone.Any(c => c != null && c.IsFaceup() && !c.IsDisabled() && c.IsFloodgate()); + flag |= Enemy.SpellZone.Count(c => c != null && !c.IsShouldNotBeMonsterTarget() && !NotToDestroySpellTrap.Contains(c.Id)) >= 3; + flag |= !Util.IsTurn1OrMain2() && !botSolvedCardIdList.Contains(_CardId.EvilswarmExcitonKnight) && Enemy.GetMonsterCount() == 0 + && Enemy.SpellZone.Count(c => c != null && !c.IsShouldNotBeMonsterTarget() && !NotToDestroySpellTrap.Contains(c.Id)) > 0; + + return flag; + } + + public bool EvilswarmExcitonKnightSpSummon() + { + if (CheckWhetherNegated(true, true, CardType.Monster) || Duel.Turn == 1) return false; + + return DefaultEvilswarmExcitonKnightSummon(); + } + + public bool LessSpSummonExtra() + { + if (!CheckShouldNoMoreSpSummon(CardLocation.Extra)) return false; + + // No.41 + ClientCard no41 = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null) + { + if (Number41BagooskatheTerriblyTiredTapirSummonCheck()) + { + if (Card != no41) return false; + + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + // abyss + ClientCard abyss = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.AbyssDweller)); + if (abyss != null) + { + if (AbyssDwellerSummonCheck()) + { + if (Card != abyss) return false; + + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + // deadnader + ClientCard deadnader = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + if (deadnader != null) + { + List materialList = GetLevel4OnField(c => c.HasSetcode(SetcodeRyzeal)); + if (materialList.Count() >= 2) + { + if (Card != deadnader) return false; + AI.SelectMaterials(materialList); + return true; + } + } + + return false; + } + + public bool FirstRyzealDuodriveSpSummon() + { + if (!RyzealDuodriveSpSummonCheck()) return false; + if (Bot.Graveyard.Count(c => c.HasSetcode(SetcodeRyzeal) && c.IsMonster()) == 0) + { + if (!CheckShouldNoMoreSpSummon(CardLocation.Hand) && Bot.HasInHand(CardId.ExRyzeal) + && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && Duel.MainPhase.SpecialSummonableCards.Any(c => c.IsCode(CardId.ExRyzeal)) + && Bot.ExtraDeck.Count(c => c.IsCode(CardId.RyzealDeadnader, CardId.RyzealDuodrive)) > 2) + { + return false; + } + } + + List materialList = GetLevel4OnField(null); + List materialExceptNode = materialList + .Where(c => !(c.IsCode(CardId.NodeRyzeal) && !c.IsDisabled() && !activatedCardIdList.Contains(CardId.NodeRyzeal))).ToList(); + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() > 2 && !CheckCanContinueSummon()) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && !CheckCanContinueSummon(true)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + + return false; + } + + public bool RyzealDuodriveSpSummonCheck() + { + bool checkFlag = Duel.MainPhase.SpecialSummonableCards.Any(c => c.IsCode(CardId.RyzealDuodrive)); + checkFlag &= !Bot.HasInMonstersZone(CardId.RyzealDuodrive, true, true, true); + checkFlag &= CheckRemainInDeck(CardId.IceRyzeal, CardId.ThodeRyzeal, CardId.NodeRyzeal, CardId.ExRyzeal, CardId.RyzealPlugIn, CardId.RyzealCross) >= 2; + checkFlag &= !DefaultCheckWhetherCardIdIsNegated(CardId.RyzealDuodrive); + checkFlag &= !activatedCardIdList.Contains(CardId.RyzealDuodrive + 1); + checkFlag &= !CheckWhetherNegated(true, true, CardType.Monster); + checkFlag &= !lockBirdSolved; + checkFlag &= !CheckShouldNoMoreSpSummon(CardLocation.Extra); + + return checkFlag; + } + + public bool SecondXyzSummon() + { + if (Card.Location != CardLocation.Extra) return false; + + int level4Count = GetLevel4FinalCountOnField(true, out _); + bool result = SecondXyzSummonInner(); + Logger.DebugWriteLine("Second Xyz Count: " + level4Count.ToString()); + Logger.DebugWriteLine("Second Xyz Summon: " + result.ToString()); + return result; + } + + public bool SecondXyzSummonInner() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) return false; + + // summon after duo driver + if (RyzealDuodriveSpSummonCheck()) { + Logger.DebugWriteLine("Second: summon duodriver first"); + return false; + } + + // check whether have 4 monsters for material. + // if not, skip the second xyz monster. + int level4Count = GetLevel4FinalCountOnField(true, out bool hasNode); + if (level4Count < 4) return false; + + // select which monster to summon + List materialList = GetLevel4OnField(null); + List materialExceptNode = materialList + .Where(c => !(c.IsCode(CardId.NodeRyzeal) && !c.IsDisabled() && !activatedCardIdList.Contains(CardId.NodeRyzeal))).ToList(); + + // abyss + ClientCard abyss = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.AbyssDweller)); + if (abyss != null) + { + if (AbyssDwellerSummonCheck()) + { + if (Card != abyss) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() > 2 && !CheckCanContinueSummon()) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + } + // 41 + ClientCard no41 = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null) + { + bool flag = hasNode; + flag &= Util.IsTurn1OrMain2(); + flag &= Bot.HasInExtra(CardId.TwinsOfTheEclipse) && Bot.MonsterZone.Any(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz)); + flag &= (GetNegateEffectCount() >= 2 || lockBirdSolved); + + if (flag) + { + if (Card != no41) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + } + + // photon blast dragon + ClientCard photonDragon = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.StarliegePhotonBlastDragon)); + bool have2MaterialDuo = false; + if (photonDragon != null) + { + int duoDriveOverlayCount = 0; + foreach (ClientCard monster in Bot.MonsterZone) + { + if (monster == null || !monster.IsCode(CardId.RyzealDuodrive)) continue; + duoDriveOverlayCount += monster.Overlays.Count(); + } + + if (Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) duoDriveOverlayCount++; + have2MaterialDuo = duoDriveOverlayCount >= 2; + } + + if (photonDragon != null && have2MaterialDuo && enemyDeckTypeRecord.Contains(SetcodeSkyStriker)) + { + if (Card != photonDragon) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + } + + // 60 + ClientCard no60 = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.Number60DugaresTheTimeless)); + if (no60 != null && !lockBirdSolved) + { + bool flag = Bot.Deck.Count() > 2; + + if (flag) + { + if (Card != no60) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + } + + if (photonDragon != null && have2MaterialDuo) + { + if (Card != photonDragon) return false; + + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + } + + // tornado dragon + ClientCard deadnader = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + if (deadnader == null) + { + ClientCard tornadoDragon = Duel.MainPhase.SummonableCards.FirstOrDefault(c => c.IsCode(CardId.TornadoDragon)); + if (tornadoDragon != null && TornadoDragonSummonCheck() && Card == tornadoDragon) + { + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + } + + // deadnader + if (deadnader != null && Card == deadnader) + { + if (materialExceptNode.Count() >= 2) + { + AI.SelectMaterials(materialExceptNode.Take(2).ToList()); + return true; + } + if (materialList.Count() >= 2 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + AI.SelectMaterials(materialList.Take(2).ToList()); + return true; + } + } + + // TODO + Logger.DebugWriteLine("Second: no monster to spsummon"); + + + return false; + } + + public bool TwinsOfTheEclipseSpSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) return false; + if (Util.IsTurn1OrMain2()) + { + bool hasNode = Bot.HasInHand(CardId.NodeRyzeal) && !spSummonedCardIdList.Contains(CardId.NodeRyzeal); + hasNode |= Bot.HasInMonstersZone(CardId.NodeRyzeal, true, false, true); + if (Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + hasNode |= Bot.Graveyard.Any(c => c.IsCode(CardId.NodeRyzeal)); + hasNode |= Bot.Banished.Any(c => c.IsFaceup() && c.IsCode(CardId.NodeRyzeal)); + } + hasNode &= !activatedCardIdList.Contains(CardId.NodeRyzeal) && !DefaultCheckWhetherCardIdIsNegated(CardId.NodeRyzeal); + + List materialList = new List(); + ClientCard duoDriver = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.RyzealDuodrive)); + if (activatedCardIdList.Contains(CardId.RyzealDuodrive + 1) && duoDriver != null) + { + materialList.Add(duoDriver); + hasNode |= !CheckWhetherWillbeRemoved() && duoDriver.Overlays.Any(id => id == CardId.NodeRyzeal); + } + ClientCard no60 = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(CardId.Number60DugaresTheTimeless)); + if (no60 != null && (activatedCardIdList.Contains(CardId.Number60DugaresTheTimeless) || no60.IsDisabled())) + { + materialList.Add(no60); + hasNode |= !CheckWhetherWillbeRemoved() && no60.Overlays.Any(id => id == CardId.NodeRyzeal); + } + ClientCard no41 = Bot.MonsterZone.FirstOrDefault(c => c != null && c.IsFaceup() && c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null) + { + materialList.Add(no41); + hasNode |= !CheckWhetherWillbeRemoved() && no41.Overlays.Any(id => id == CardId.NodeRyzeal); + } + + if (materialList.Count() >= 2 && hasNode) + { + AI.SelectMaterials(materialList); + return true; + } + } + else + { + if (botSolvedCardIdList.Contains(_CardId.EvilswarmExcitonKnight)) + { + return false; + } + + List materialList = GetLevel4OnField(null); + List xyzMonsterList = Bot.MonsterZone.Where(c => c != null && c.IsFaceup() && c.HasType(CardType.Xyz) && c.Rank == 4 && c.Attack < 2500).ToList(); + int level4Count = GetLevel4FinalCountOnField(true, out bool hasNode) + xyzMonsterList.Count(); + + if (level4Count < 4) return false; + + materialList.AddRange(xyzMonsterList); + materialList = materialList.Where(c => c != null && c.Attack < 2500).OrderBy(c => c.GetDefensePower()).Take(2).ToList(); + if (materialList.Count() >= 2) + { + // check whether enemy have monster with 2more less than 2500 + bool checkFlag = Enemy.MonsterZone.Count(c => c != null && c.GetDefensePower() < 2500) >= 2 && !CheckWhetherNegated(true, true, CardType.Monster) + && !DefaultCheckWhetherCardIdIsNegated(CardId.TwinsOfTheEclipse); + if (checkFlag && materialList.Sum(c => c.Attack) < 5000) + { + AI.SelectMaterials(materialList); + return true; + } + else if (materialList.Sum(c => botSolvedCardIdList.Contains(CardId.RyzealPlugIn) && !c.HasType(CardType.Xyz) ? 0 : c.Attack) < 2500 + && !Duel.MainPhase.SpecialSummonableCards.Any(c => c.IsCode(CardId.RyzealDeadnader))) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + + return false; + } + + public bool FinalXyzSummon() + { + if (Card.Location != CardLocation.Extra) return false; + + int level4Count = GetLevel4FinalCountOnField(false, out _); + bool result = FinalXyzSummonInner(); + Logger.DebugWriteLine("Final Xyz Count: " + level4Count.ToString()); + Logger.DebugWriteLine("Final Xyz Summon: " + result.ToString()); + + return result; + } + + public bool FinalXyzSummonInner() + { + // summon after duo driver + if (RyzealDuodriveSpSummonCheck()) + { + Logger.DebugWriteLine("Final: summon duodriver first"); + return false; + } + + int level4Count = GetLevel4FinalCountOnField(false, out _); + if (level4Count >= 4) return false; + + // No.41 + ClientCard no41 = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + if (no41 != null) + { + if (Number41BagooskatheTerriblyTiredTapirSummonCheck()) + { + if (Card != no41) return false; + + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + + // abyss + ClientCard abyss = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.AbyssDweller)); + if (abyss != null) + { + if (AbyssDwellerSummonCheck()) + { + if (Card != abyss) return false; + + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + // deadnader + ClientCard deadnader = Duel.MainPhase.SpecialSummonableCards.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + if (deadnader != null) + { + List materialList = GetLevel4OnField(c => c.HasSetcode(SetcodeRyzeal)); + if (materialList.Count() >= 2) + { + if (Card != deadnader) return false; + AI.SelectMaterials(materialList); + return true; + } + } + + // tornado dragon + if (deadnader == null) + { + ClientCard tornadoDragon = Duel.MainPhase.SummonableCards.FirstOrDefault(c => c.IsCode(CardId.TornadoDragon)); + if (tornadoDragon != null && TornadoDragonSummonCheck()) + { + // Select 2 monster with lowest defense + List materialList = GetLevel4OnField(null); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + + return false; + } + + public bool DonnerDaggerFurHireSpSummon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Extra)) + { + return false; + } + bool haveEnemyTarget = Enemy.MonsterZone.Any(c => c != null && !c.IsShouldNotBeMonsterTarget()) && !CheckWhetherNegated(true, true, CardType.Monster); + + List illegalList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.Level != 4 && card.Rank != 4).OrderBy(c => c.GetDefensePower()).ToList(); + bool necessary = Bot.HasInHand(CardId.ExRyzeal) && !spSummonedCardIdList.Contains(CardId.ExRyzeal) && !activatedCardIdList.Contains(CardId.ExRyzeal) + && illegalList.Count() > 0; + bool needDestory = !CheckWhetherNegated(true, true, CardType.Monster) + && Enemy.MonsterZone.Any(c => c != null && !c.IsShouldNotBeMonsterTarget() && c.IsFloodgate() && !c.IsDisabled()); + necessary |= needDestory; + + if (necessary) + { + if (illegalList.Count() == 1 && haveEnemyTarget) + { + List otherMaterialList = Bot.GetMonsters().Where(card => card.IsFaceup() && !illegalList.Contains(card) && (card.Owner == 1 || !card.HasType(CardType.Xyz))).ToList(); + otherMaterialList.Sort(CardContainer.CompareCardAttack); + illegalList.AddRange(otherMaterialList); + } + + if (illegalList.Count() > 1) + { + List materialList = illegalList.Take(2).ToList(); + if (Util.GetBotAvailZonesFromExtraDeck(materialList) > 0) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + + if (Duel.Phase == DuelPhase.Main2) + { + List enemyOwnerMonsters = Bot.MonsterZone.Where(c => c != null && c.IsFaceup() && c.Owner == 1).OrderBy(c => c.GetDefensePower()).ToList(); + if (enemyOwnerMonsters.Count() > 0 && haveEnemyTarget) + { + if (enemyOwnerMonsters.Count() == 1) + { + List otherMaterialList = Bot.GetMonsters() + .Where(card => card.IsFaceup() && !enemyOwnerMonsters.Contains(card) && (!card.HasType(CardType.Xyz) || card.Overlays.Count() == 0)) + .OrderBy(c => c.GetDefensePower()).ToList(); + enemyOwnerMonsters.AddRange(otherMaterialList); + } + + if (enemyOwnerMonsters.Count() > 1) + { + List materialList = enemyOwnerMonsters.Take(2).ToList(); + if (Util.GetBotAvailZonesFromExtraDeck(materialList) > 0) + { + AI.SelectMaterials(materialList); + return true; + } + } + } + } + + return false; + } + + // TODO extra effect + + + public bool MereologicAggregatorActivateFirst() + { + List> multiNegateFuncList = new List> { + {c => c.IsCode(44665365, 48546368, 54178659) && c.IsMonster() }, + {c => c.IsCode(4280258) && c.Attack >= 800 }, + {c => c.IsCode(47297616) && c.Attack >= 500 && c.Defense >= 500 }, + {c => c.IsCode(19652159) && c.Attack >= 1000 && c.Defense >= 1000 }, + {c => c.IsCode(79600447) && Enemy.MonsterZone.Any(m => m != null && m.IsFaceup() && m.IsCode(23288411) && m.Attack >= 1000) } + }; + List searchCardList = new List(Enemy.GetMonsters()); + searchCardList.AddRange(Enemy.GetSpells()); + foreach (ClientCard card in searchCardList) + { + if (card == null || card.IsFacedown() || card.IsDisabled()) continue; + foreach (Func func in multiNegateFuncList) + { + if (func(card)) + { + AI.SelectCard(card); + currentNegateCardList.Add(card); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + } + return false; + } + + public bool MereologicAggregatorActivateLater() + { + if (CheckWhetherNegated(true)) return false; + + ClientCard lastChainCard = Util.GetLastChainCard(); + + // for Chain1 ExRyzeal Chain2 Mereo to negate No41 + if (lastChainCard != null && lastChainCard.Controller == 0 && lastChainCard.IsCode(CardId.ExRyzeal)) + { + ClientCard no41 = Enemy.GetMonsters().FirstOrDefault(c => + c.IsFaceup() && !c.IsDisabled() && c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir) && c.HasPosition(CardPosition.FaceUpDefence) && !currentNegateCardList.Contains(c)); + if (no41 != null) + { + currentNegateCardList.Add(no41); + AI.SelectCard(no41); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + + List targetList = GetNormalEnemyTargetList(true, false, CardType.Monster, true).Where(c => c.IsFaceup() && !c.IsDisabled()).ToList(); + if (targetList.Count() > 0) + { + currentNegateCardList.Add(targetList[0]); + AI.SelectCard(targetList); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + + // protect chain + if (lastChainCard != null && lastChainCard.Controller == 0 && lastChainCard.IsCode(CardId.ExRyzeal)) + { + foreach (ClientCard card in Bot.GetMonsters()) + { + if (card.IsFacedown() || Duel.CurrentChain.Contains(card) || card.IsDisabled() || !card.HasType(CardType.Effect)) continue; + bool flag = card.IsCode(CardId.IceRyzeal, CardId.ThodeRyzeal); + flag |= card.IsCode(CardId.NodeRyzeal) && activatedCardIdList.Contains(CardId.NodeRyzeal); + flag |= card.HasType(CardType.Xyz) && !card.HasXyzMaterial() && !card.IsCode(CardId.RyzealDeadnader, CardId.RyzealDuodrive, CardId.FullArmoredUtopicRayLancer); + if (flag) + { + AI.SelectCard(card); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + } + + return false; + } + + public bool RyzealDeadnaderActivate() + { + if (ActivateDescription == 96) + { + Logger.DebugWriteLine("** deadnader replace destroy"); + if (deadnaderDestroySelf != Card) + { + activatedCardIdList.Add(CardId.RyzealDeadnader + 2); + return true; + } + return false; + } + if (CheckWhetherNegated(true)) return false; + if (ActivateDescription == Util.GetStringId(CardId.RyzealDeadnader, 1)) + { + // destroy self + bool shouldDestroySelf = false; + bool willBeNegated = false; + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.Controller == 1 && lastChainCard.IsCode(targetNegateIdList)) + { + shouldDestroySelf = true; + willBeNegated = true; + } + shouldDestroySelf |= Duel.CurrentChain.Any(c => c != null && c.Controller == 1 && !c.IsDisabled() && !DefaultCheckWhetherCardIdIsNegated(c.Id) + && c.IsCode(_CardId.EvenlyMatched, 35480699)); + shouldDestroySelf |= Card.Overlays.Count() == 1 && !activatedCardIdList.Contains(CardId.RyzealDeadnader) + && GetProblematicEnemyCardList(true, false, CardType.Monster).Count() == 0; + + if (shouldDestroySelf) + { + bool canRebornSelf = Bot.SpellZone.Count(c => c != null && c.IsFacedown() && c.IsCode(CardId.RyzealPlugIn) && !Duel.ChainTargets.Contains(c)) > 0; + bool canActivateTwin = !activatedCardIdList.Contains(CardId.TwinsOfTheEclipse + 1) && !DefaultCheckWhetherCardIdIsNegated(CardId.TwinsOfTheEclipse) + && !CheckWhetherWillbeRemoved(); + canRebornSelf |= canActivateTwin && Card.Overlays.Contains(CardId.TwinsOfTheEclipse); + if (Duel.CurrentChain.Any(c => c != null && c.Controller == 1 && !c.IsDisabled() && !DefaultCheckWhetherCardIdIsNegated(c.Id) + && c.IsCode(_CardId.EvenlyMatched))) + { + canRebornSelf |= Bot.MonsterZone.Any(c => c != null && c.HasType(CardType.Xyz) && c.Overlays.Contains(CardId.TwinsOfTheEclipse)); + } + + if (canRebornSelf) + { + deadnaderDestroySelf = Card; + return true; + } + } + + + // destroy + if (CanDestroyList(willBeNegated).Count() > 0) + { + return true; + } + } + else + { + // attach + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + + } + + public bool RyzealDuodriveActivate() + { + if (CheckWhetherNegated(true)) return false; + + if (ActivateDescription == Util.GetStringId(CardId.RyzealDuodrive, 1)) + { + int overlayCount = 0; + foreach (ClientCard card in Bot.MonsterZone) + { + if (card == null || card.Overlays.Count() == 0) continue; + if (card.IsCode(CardId.Number60DugaresTheTimeless) && !card.IsDisabled() && !activatedCardIdList.Contains(CardId.Number60DugaresTheTimeless)) + { + continue; + } + overlayCount += card.Overlays.Count(); + } + if (overlayCount >= 2) + { + // deattach and search + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } else + { + // attach + activatedCardIdList.Add(Card.Id); + return true; + } + + return false; + } + + public bool TwinsOfTheEclipseActivate() + { + if (Card.Location == CardLocation.MonsterZone) + { + // double attack + // dump remove material + if (CheckWhetherNegated(true)) return Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn); + activatedCardIdList.Add(Card.Id); + return true; + + } else if (Card.Location == CardLocation.Grave) + { + // spsummon + if (CheckWhetherNegated(true)) return false; + + activatedCardIdList.Add(Card.Id + 1); + ClientCard rebornTarget = TwinsOfTheEclipseRebornTarget(null); + if (rebornTarget != null) + { + ClientCard mereo = Bot.Graveyard.FirstOrDefault(c => c.IsCode(CardId.MereologicAggregator)); + if (mereo != null) + { + AI.SelectCard(new List { rebornTarget, mereo }); + return true; + } + ClientCard nonLightDark = Bot.Graveyard.FirstOrDefault(c => c.HasType(CardType.Xyz) && !c.HasAttribute((CardAttribute)attrbuteLightDark)); + if (nonLightDark != null) + { + AI.SelectCard(new List { rebornTarget, nonLightDark }); + return true; + } + ClientCard xyzMonster = Bot.Graveyard.FirstOrDefault(c => c.HasType(CardType.Xyz)); + if (xyzMonster != null) + { + AI.SelectCard(new List { rebornTarget, xyzMonster }); + return true; + } + } + + // although cannot find target, still should activate. + Logger.DebugWriteLine("** Twins of The Eclipse: although cannot find target, still should activate."); + return true; + } + + return false; + } + + public ClientCard TwinsOfTheEclipseRebornTarget(List targetList) + { + if (targetList == null) + { + targetList = Bot.Graveyard.Where(c => c.HasType(CardType.Xyz) && c.IsCanRevive()).ToList(); + } + ClientCard duoDriver = targetList.FirstOrDefault(c => c.IsCode(CardId.RyzealDuodrive)); + ClientCard deadnader = targetList.FirstOrDefault(c => c.IsCode(CardId.RyzealDeadnader)); + ClientCard no41 = targetList.FirstOrDefault(c => c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)); + ClientCard abyssDweller = targetList.FirstOrDefault(c => c.IsCode(CardId.AbyssDweller)); + + if (no41 != null && !DefaultCheckWhetherCardIdIsNegated(_CardId.Number41BagooskatheTerriblyTiredTapir) + && !(deadnader != null && !activatedCardIdList.Contains(CardId.RyzealDeadnader)) + && !(Duel.Turn == 1 && duoDriver != null)) + { + return no41; + } + + if (abyssDweller != null && !DefaultCheckWhetherCardIdIsNegated(CardId.AbyssDweller) && !botSolvedCardIdList.Contains(CardId.AbyssDweller) + && AbyssDwellerSummonCheck()) + { + return abyssDweller; + } + + if (deadnader != null) + { + return deadnader; + } + if (duoDriver != null && (!activatedCardIdList.Contains(CardId.RyzealDuodrive + 1) || Bot.HasInHandOrInSpellZone(CardId.RyzealCross))) + { + return duoDriver; + } + + // random spsummon + if (targetList.Count() > 0) + { + return ShuffleList(targetList)[0]; + } + return null; + } + + public List CanDestroyList(bool ignoreCurrentDestroy = false) + { + List destroyTargetList = GetNormalEnemyTargetList(true, ignoreCurrentDestroy, CardType.Monster).Except(currentNegateCardList).ToList(); + + List cannotDestroyList = new List(NotToDestroySpellTrap); + destroyTargetList.RemoveAll(c => c.IsCode(cannotDestroyList)); + + List undestoryableCardIdlist = new List { 94977269, 58604027, 8062132, 10817524, 53315891, 10000090, 86221741, 71222868, + 83257450, 97489701, 97165977, 24550676, 55410871, 72664875, 85908279, 13331639, 20654247, 43228023, 99585850, 92770064, 10497636, 77313225 }; + destroyTargetList.RemoveAll(c => !c.IsDisabled() && c.IsCode(undestoryableCardIdlist)); + + destroyTargetList.RemoveAll(c => !c.IsDisabled() && c.HasSetcode(SetcodeMajespecter)); + + if (Enemy.GetSpells().Any(c => c.IsFacedown()) || Enemy.GetMonsters().Any(c => c.IsFacedown())) + { + destroyTargetList.RemoveAll(c => c.IsCode(81497285)); + } + destroyTargetList.RemoveAll(c => !c.IsDisabled() && c.HasSetcode(SetcodeMajespecter)); + + + return destroyTargetList; + } + + public bool TornadoDragonActivate() + { + if (CheckWhetherNegated(true)) return false; + + List spells = Enemy.GetSpells(); + if (spells.Count == 0) + return false; + + // destroy faceup card first + ClientCard selected = Enemy.SpellZone.GetFloodgate(); + if (selected == null && Duel.Player == 1) + { + List targetList = spells.Where(c => c.IsFaceup() && !NotToDestroySpellTrap.Contains(c.Id) && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Continuous | CardType.Equip | CardType.Field | CardType.Pendulum)).ToList(); + if (targetList.Count() > 0) + { + selected = ShuffleList(targetList)[0]; + } + } + + if (selected != null) + { + currentDestroyCardList.Add(selected); + AI.SelectCard(selected); + return true; + } + + // destroy face-down card + if (selected == null) + { + List setThisTurnList = Enemy.SpellZone.Where(c => c != null && c.IsFacedown() && !currentDestroyCardList.Contains(c) + && enemyPlaceThisTurn.Contains(c)).ToList(); + if (setThisTurnList.Count() > 0) + { + selected = ShuffleList(setThisTurnList)[0]; + } + } + if (selected == null) + { + List setThisTurnList = Enemy.SpellZone.Where(c => c != null && c.IsFacedown() && !currentDestroyCardList.Contains(c)).ToList(); + if (setThisTurnList.Count() > 0) + { + selected = ShuffleList(setThisTurnList)[0]; + } + } + + bool flag = Duel.Player == 0; + flag |= Duel.Player == 1 && Duel.Phase == DuelPhase.End; + flag |= DefaultOnBecomeTarget(); + + if (flag) + { + currentDestroyCardList.Add(selected); + AI.SelectCard(selected); + return true; + } + + return false; + } + + public bool EvilswarmExcitonKnightActivate() + { + if (CheckWhetherNegated(true)) return false; + return DefaultEvilswarmExcitonKnightEffect(); + } + + public bool AbyssDwellerActivate() + { + if (botSolvedCardIdList.Contains(CardId.AbyssDweller)) return false; + + if (Duel.Player == 0 && Bot.HasInHandOrInSpellZone(CardId.RyzealPlugIn)) + { + List checkIdList = new List { CardId.NodeRyzeal, CardId.ThodeRyzeal, CardId.ExRyzeal }; + foreach (int checkId in checkIdList) + { + if (Card.Overlays.Contains(checkId) && !Bot.HasInHand(checkId) && !activatedCardIdList.Contains(checkId)) + { + return true; + } + return false; + } + } + if (Duel.Player == 1) + { + if (CheckWhetherNegated(true)) return false; + if (enemyDeckTypeRecord.Contains(SetcodeAtlantean)) return true; + return Enemy.GetMonsterCount() + Enemy.GetSpellCount() > 0; + } + + return false; + } + + public bool Number60DugaresTheTimelessActivate() + { + if (CheckWhetherNegated(true)) return false; + if (Number60DugaresTheTimelessDrawEffect() || Number60DugaresTheTimelessDoubleTarget() != null || Number60DugaresTheTimelessRebornEffect()) + { + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } + + public bool Number60DugaresTheTimelessDrawEffect() + { + if (lockBirdSolved || Bot.Deck.Count < 2) return false; + activatedCardIdList.Add(Card.Id); + return true; + } + + public ClientCard Number60DugaresTheTimelessDoubleTarget() + { + if (Util.IsTurn1OrMain2()) return null; + ClientCard maxAttackMonster = Bot.MonsterZone.Where(c => c != null && (c.HasPosition(CardPosition.FaceUpAttack) || !summonThisTurn.Contains(c))) + .OrderByDescending(c => c.Attack).FirstOrDefault(); + + if (maxAttackMonster != null) + { + int maxBotAttack = maxAttackMonster.Attack; + + // defeat enemy monster + ClientCard bestEnemyMonster = Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && (c.IsDisabled() || !c.IsMonsterInvincible())) + .OrderByDescending(c => c.GetDefensePower()).FirstOrDefault(); + if (bestEnemyMonster != null) + { + int maxEnemyPower = bestEnemyMonster.GetDefensePower(); + if (bestEnemyMonster.IsAttack()) maxEnemyPower -= 1; + if (maxBotAttack < maxEnemyPower && maxBotAttack * 2 > maxEnemyPower) + { + return maxAttackMonster; + } + } + + // direct attack + if (!botSolvedCardIdList.Contains(_CardId.EvilswarmExcitonKnight)) + { + int currentAttack = GetBotCurrentTotalAttack(); + if (currentAttack < Enemy.LifePoints && currentAttack + maxBotAttack >= Enemy.LifePoints) + { + return maxAttackMonster; + } + } + } + + return null; + } + + public bool Number60DugaresTheTimelessRebornEffect() + { + // not used + + return false; + } + + public bool DonnerDaggerFurHireActivate() + { + if (CheckAtAdvantage() && !Bot.HasInHand(CardId.ExRyzeal)) + { + return false; + } + + ClientCard targetCard = GetProblematicEnemyMonster(canBeTarget: true, selfType: CardType.Monster); + if (targetCard == null) + { + List enemyMonsters = Enemy.GetMonsters(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + targetCard = enemyMonsters[0]; + } + } + + if (targetCard != null) + { + AI.SelectCard(Card); + AI.SelectNextCard(targetCard); + currentDestroyCardList.Add(targetCard); + return true; + } + + return false; + } + + + + public bool Level4Summon() + { + if (CheckShouldNoMoreSpSummon(CardLocation.Hand | CardLocation.Extra)) return false; + ClientCard leastAttackLevel4 = Bot.Hand.Where(c => c.Level == 4).OrderBy(c => c.Attack).FirstOrDefault(); + if (leastAttackLevel4 == null || Card != leastAttackLevel4) return false; + + if (GetLevel4CountOnField() == 1) + { + ClientCard target = Duel.MainPhase.SummonableCards.Where(c => c != null && c.Level == 4).OrderBy(c => c.Attack).FirstOrDefault(); + if (Card != target) return false; + summonCount -= 1; + return true; + } + + return false; + } + + + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + + // select place + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + // do not set infinite impermanence if don't need to set other cards + if (Card.IsCode(_CardId.InfiniteImpermanence) && Bot.GetMonsterCount() == 0 && Bot.GetSpellCount() == 0 + && !Bot.Hand.Any(c => !c.IsCode(_CardId.InfiniteImpermanence) && (c.IsTrap() || c.HasType(CardType.QuickPlay))) + && Bot.Hand.Count() <= 6) + { + return false; + } + + if (Card.IsCode(CardId.RyzealPlugIn)) + { + bool targetFlag = Bot.Graveyard.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && (c.Level == 4 || c.IsCanRevive())); + targetFlag |= Bot.Banished.Any(c => c != null && c.IsFaceup() && c.HasSetcode(SetcodeRyzeal) && (c.Level == 4 || c.IsCanRevive())); + if (!targetFlag) + { + return false; + } + } + + List avoid_list = new List(); + int setForInfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setForInfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setForInfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + return true; + } + + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) + { + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } + } + + return false; + } + + public bool ChangePositionFirst() + { + if (Card.IsFacedown() && Card.Level == 4) + { + return true; + } + + if (Enemy.MonsterZone.Any(c => c != null && c.HasPosition(CardPosition.FaceUpDefence) && !c.IsDisabled() && c.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir))) + { + return false; + } + + if (Card.IsCode(_CardId.Number41BagooskatheTerriblyTiredTapir)) + { + bool haveDangerMonster = Enemy.MonsterZone.Any(c => c != null && c.IsFloodgate() && !c.IsDisabled()); + if (Card.IsDefense()) + { + return !haveDangerMonster && !Util.IsTurn1OrMain2(); + } else + { + return haveDangerMonster || Util.IsTurn1OrMain2(); + } + } + + return false; + } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(Card, true); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Game/AI/Decks/ST1732Executor.cs b/Game/AI/Decks/ST1732Executor.cs index a169ea390..92e052d2e 100644 --- a/Game/AI/Decks/ST1732Executor.cs +++ b/Game/AI/Decks/ST1732Executor.cs @@ -153,15 +153,16 @@ public override void OnNewTurn() { // reset BalancerLordUsed = false; + base.OnNewTurn(); } - public override int OnSelectOption(IList options) + public override int OnSelectOption(IList options) { // put Moon Mirror Shield to the bottom of deck return options.Count == 2 ? 1 : 0; } - public override bool OnSelectYesNo(long desc) + public override bool OnSelectYesNo(int desc) { if (desc == 210) // Continue selecting? (Link Summoning) return false; diff --git a/Game/AI/Decks/SalamangreatExecutor.cs b/Game/AI/Decks/SalamangreatExecutor.cs index daec71cc9..995b463ac 100644 --- a/Game/AI/Decks/SalamangreatExecutor.cs +++ b/Game/AI/Decks/SalamangreatExecutor.cs @@ -594,6 +594,7 @@ private bool Foxy_activate() } else { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInHand(CardId.Spinny) || FalcoToGY(false)) { if (Bot.HasInHand(CardId.Spinny) && !Bot.HasInGraveyard(CardId.Spinny)) @@ -779,10 +780,12 @@ private bool Rage_activate() public bool G_activate() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return (Duel.Player == 1); } public bool Hand_act_eff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return (Duel.LastChainPlayer == 1); } @@ -969,7 +972,7 @@ public int SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false return 0; } - public override bool OnSelectYesNo(long desc) + public override bool OnSelectYesNo(int desc) { if (desc == Util.GetStringId(CardId.Sanctuary, 0)) { @@ -1167,7 +1170,7 @@ public override void OnChainEnd() base.OnChainEnd(); } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (player == 0) { diff --git a/Game/AI/Decks/SkyStrikerExecutor.cs b/Game/AI/Decks/SkyStrikerExecutor.cs index d7eb11680..41a916a30 100644 --- a/Game/AI/Decks/SkyStrikerExecutor.cs +++ b/Game/AI/Decks/SkyStrikerExecutor.cs @@ -146,6 +146,7 @@ public override void OnNewTurn() ShizukuSummoned = false; HayateSummoned = false; WidowAnchorTarget = null; + base.OnNewTurn(); } public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) @@ -158,7 +159,7 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender return base.OnPreBattleBetween(attacker, defender); } - public override bool OnSelectYesNo(long desc) + public override bool OnSelectYesNo(int desc) { if (desc == Util.GetStringId(CardId.SummonSorceress, 2)) // summon to the field of opponent? return false; @@ -194,6 +195,7 @@ public override bool OnSelectYesNo(long desc) private bool MaxxCEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player == 1; } @@ -667,6 +669,7 @@ private bool SummonSorceressEffect() private bool JetSynchronEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInMonstersZone(CardId.Raye) || Bot.HasInMonstersZone(CardId.CrystronNeedlefiber)) { AI.SelectCard(GetDiscardHand()); diff --git a/Game/AI/Decks/SuperheavySamuraiExecutor.cs b/Game/AI/Decks/SuperheavySamuraiExecutor.cs new file mode 100644 index 000000000..b0911a0b2 --- /dev/null +++ b/Game/AI/Decks/SuperheavySamuraiExecutor.cs @@ -0,0 +1,1219 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +namespace WindBot.Game.AI.Decks +{ + [Deck("SuperheavySamurai", "AI_SuperheavySamurai")] + public class SuperheavySamuraiExecutor : DefaultExecutor + { + public class CardId + { + public const int Benkei = 19510093;//弁庆 + public const int Wagon = 34496660;//大八 + public const int Soulpiercer = 90361010;//岩融 + public const int Wakaushi = 82112494;//牛若 + public const int Scales = 78391364;//天秤 + public const int Booster = 56727340;//地铠 + public const int Motorbike = 83334932;//摩托 + public const int Soulhorns = 14624296;//双角 + public const int Soulpeacemaker = 95500396;//仲裁 + + public const int Regulus = 10604644;//轩辕十四 + + public const int MaxxG = 23434538;//增殖的G + public const int JoyousSpring = 14558127;//灰流丽 + public const int PsyFrameDriver = 49036338;//PSY骨架驱动者 + public const int PsyFramegearGamma = 38814750;//PSY骨架装备·γ + public const int EffectVeiler = 97268402;//效果遮蒙者 + public const int HauntedMansion = 73642296;//屋敷童 + public const int SnowRabbit = 59438930;//幽鬼兔 + public const int LockBird = 94145021;//小丑与锁鸟 + + //extra + public const int Masurawo = 64193046;//益荒男 + public const int Fleur = 84815190;//鲜花女男爵 + public const int ASStardustDragon = 30983281;//加速同调星尘龙 + public const int StardustDragon = 30983281;//星尘龙 + public const int SavageDragon = 27548199;//狞猛龙 + public const int Sarutobi = 76471944;//猿飞 + public const int PSYFramelordOmega = 74586817;//PSY骨架王·Ω + public const int GearGigant = 28912357;//齿轮齿巨人 + public const int Unicorn = 38342335;//独角兽 + public const int Elf = 27381364;//卫星闪灵·淘气精灵 + public const int Genius = 22423493;//路径灵 + public const int IP = 65741786;//I:P伪装舞会莱娜 + public const int Scarecrow = 33918636;//案山子 + + } + + private bool normal_summon = false; + private bool p_summoned = false; + private bool p_summoning = false; + private bool activate_Motorbike = false;//摩托 + private bool activate_Wakaushi = false;//神童 + private bool activate_Scales = false;//天秤 + private bool activate_Wagon = false;//大巴 + private bool activate_Booster = false;//地铠 + private bool activate_Soulpeacemaker = false;//仲裁 + private bool activate_Benkei = false;//弁庆 + private bool need_Gear = false;//齿轮齿巨人 + //案山子 + private bool activate_Scarecrow=false; + private bool summon_Scarecrow=false; + private bool summon_Scarecrow2=true; + private bool activate_Sarutobi = false;//猿飞 + private bool activate_Genius = false;//路径灵 + //淘气精灵 + private bool activate_Elf = false; + private bool summon_Elf = false; + //手坑 + private bool activate_MaxxG = false;//增殖的G + private bool activate_PSY = false;//PSY + private bool activate_LockBird = false;//小丑与锁鸟 + private bool to_deck = false; + + public SuperheavySamuraiExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + AddExecutor(ExecutorType.Repos, MonsterRepos); + AddExecutor(ExecutorType.Activate, CardId.PSYFramelordOmega,PSYFunction); + AddExecutor(ExecutorType.Activate, CardId.IP,IPFunction); + AddExecutor(ExecutorType.Activate, CardId.Sarutobi,SarutobiFunction); + AddExecutor(ExecutorType.Activate, CardId.Unicorn,UnicornFunction); + AddExecutor(ExecutorType.Activate, CardId.MaxxG,MaxxCFunction); + AddExecutor(ExecutorType.Activate, CardId.JoyousSpring,DefaultAshBlossomAndJoyousSpring); + AddExecutor(ExecutorType.Activate, CardId.SnowRabbit,DefaultGhostOgreAndSnowRabbit); + AddExecutor(ExecutorType.Activate, CardId.EffectVeiler,DefaultBreakthroughSkill); + AddExecutor(ExecutorType.Activate, CardId.LockBird,LockBirdFunction); + AddExecutor(ExecutorType.Activate, CardId.PsyFramegearGamma,FunctionInHand); + AddExecutor(ExecutorType.Activate, CardId.HauntedMansion,FunctionInHand); + AddExecutor(ExecutorType.Activate, CardId.Masurawo,MasurawoFunction); + AddExecutor(ExecutorType.Activate, CardId.Genius,GeniusFunction); + + //Motorbike's Effect + AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); + + //Scales's Effect + AddExecutor(ExecutorType.SpSummon, CardId.Scales); + AddExecutor(ExecutorType.Activate, CardId.Scales,ScalesFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.PSYFramelordOmega,PSYFramelordOmegaSynchronFunction); + + //Pendulum + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiFunction); + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiEffectFunction); + AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiFunction); + AddExecutor(ExecutorType.Activate, CardId.Benkei,BenkeiEffectFunction); + + //Normal Summon & Effect + AddExecutor(ExecutorType.Summon, CardId.Soulpiercer,NormalSummonFunction); + AddExecutor(ExecutorType.Activate, CardId.Soulpiercer,SoulpiercerFunction); + + AddExecutor(ExecutorType.Summon, CardId.Wagon,NormalSummonFunction); + AddExecutor(ExecutorType.Activate, CardId.Wagon,WagonFunction); + AddExecutor(ExecutorType.Activate, CardId.Wagon,WagonFunction); + + AddExecutor(ExecutorType.Summon, CardId.Booster,BoosterNormalSummonFunction); + AddExecutor(ExecutorType.Summon, CardId.Scales,ScalesNormalSummonFunction); + + //boost & Gear + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + AddExecutor(ExecutorType.SpSummon, CardId.GearGigant,GearGigantXyzFunction); + AddExecutor(ExecutorType.Activate, CardId.GearGigant,GearGigantFunction); + + //equip Soulpiercer + AddExecutor(ExecutorType.Activate, CardId.Soulpiercer,SoulpiercerEquipFunction); + + //Link Scarecrow + AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction); + AddExecutor(ExecutorType.Activate, CardId.Scarecrow,ScarecrowFunction); + AddExecutor(ExecutorType.SpSummon, CardId.Scarecrow,ScarecrowLinkFunction2); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.ASStardustDragon,ASStardustDragonSynchronFunction); + + //Effect After Synchron + AddExecutor(ExecutorType.Activate, CardId.SavageDragon,SavageDragonFunction); + AddExecutor(ExecutorType.Activate, CardId.ASStardustDragon,ASStardustDragonFunction); + + //Wakaushi's Effect After Synchron + AddExecutor(ExecutorType.Activate, CardId.Wakaushi,WakaushiReturnPFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.Fleur,FleurSynchronFunction); + AddExecutor(ExecutorType.Activate, CardId.Fleur,FleurFunction); + + //equip Soulpeacemaker + AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker,SoulpeacemakerEquipFunction); + AddExecutor(ExecutorType.Activate, CardId.Soulpeacemaker,SoulpeacemakerFunction); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.Genius,GeniusLinkFunction); + + AddExecutor(ExecutorType.SpSummon, Psummon); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.Elf,ElfLinkFunction); + AddExecutor(ExecutorType.Activate, CardId.Elf,ElfFunction); + + AddExecutor(ExecutorType.Activate, CardId.Motorbike,MotorbikeFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.SavageDragon,SavageDragonSynchronFunction); + + //Link + AddExecutor(ExecutorType.SpSummon, CardId.IP,IPLinkFunction); + + //Regulus's Effect + AddExecutor(ExecutorType.Activate, CardId.Regulus,RegulusFunction); + + //booster + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction2); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterEquipFunction3); + AddExecutor(ExecutorType.Activate, CardId.Booster,BoosterFunction); + + //Synchron + AddExecutor(ExecutorType.SpSummon, CardId.Masurawo,MasurawoSynchronFunction); + AddExecutor(ExecutorType.SpSummon, CardId.Sarutobi,DeSynchronFunction); + + //equip Soulhorns + AddExecutor(ExecutorType.Activate, CardId.Soulhorns,SoulhornsEquipFunction); + + } + public override void OnNewTurn() + { + normal_summon = false; + p_summoned = false; + p_summoning = false; + activate_Motorbike = false; + activate_Wakaushi = false; + activate_Scales = false; + activate_Wagon = false; + activate_Booster = false; + activate_Soulpeacemaker = false; + activate_Benkei = false; + need_Gear = false; + activate_Scarecrow=false; + summon_Scarecrow=false; + summon_Scarecrow2=true; + activate_Elf = false; + summon_Elf = false; + activate_MaxxG = false; + activate_PSY = false; + activate_LockBird = false; + activate_Genius = false; + activate_Sarutobi = false; + to_deck = false; + base.OnNewTurn(); + } + public override bool OnSelectHand() + { + return true; + } + private bool MonsterRepos() + { + if (Card.IsFacedown()) + return true; + if (Card.IsFaceup() && Card.IsAttack() && (Card.Id == CardId.Masurawo || Card.Id == CardId.Sarutobi)) + return true; + return false; + } + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (cardId == CardId.Masurawo || cardId == CardId.Sarutobi) + return CardPosition.FaceUpDefence; + } + return 0; + } + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone) + { + if (cardId == CardId.Scarecrow) + { + int a=(Zones.z6 & available); + int b=(Zones.z5 & available); + if (Bot.MonsterZone[2] != null && Bot.MonsterZone[2].Controller == 0 && !FinalCards(Bot.MonsterZone[2].Id)) + a = 0; + else if (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id)) + b = 0; + if (b > 0) return Zones.z5; + if (a > 0) return Zones.z6; + } + else if (cardId == CardId.Unicorn || cardId == CardId.Elf || cardId == CardId.IP) + { + if ((Zones.z6 & available) > 0) return Zones.z6; + if ((Zones.z5 & available) > 0) return Zones.z5; + } + else if (cardId == CardId.Genius) + { + int a=(Zones.z6 & available); + int b=(Zones.z5 & available); + if (Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) + a = 0; + else if (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id)) + b = 0; + if (a > 0) return Zones.z6; + if (b > 0) return Zones.z5; + } + else if (cardId == CardId.Regulus || cardId == CardId.GearGigant) + { + if ((Zones.z3 & available) > 0) return Zones.z3; + } + else + { + if ((Zones.z1 & available) > 0) return Zones.z1; + if ((Zones.z4 & available) > 0) return Zones.z4; + if ((Zones.z2 & available) > 0) return Zones.z2; + if ((Zones.z3 & available) > 0) return Zones.z3; + if ((Zones.z0 & available) > 0) return Zones.z0; + } + } + return base.OnSelectPlace(cardId, player, location, available); + } + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (AI.HaveSelectedCards()) return null; + if (p_summoning || ((Card == Bot.SpellZone[0] || Card == Bot.SpellZone[4]) && hint == HintMsg.SpSummon && + Card.HasType(CardType.Pendulum))) + { + List result = new List(); + List scards = cards.Where(card => card != null && card.HasSetcode(0x9a) && card.Level == 4).ToList(); + if (scards.Count <2) scards = cards.Where(card => card != null && card.HasSetcode(0x9a)).ToList(); + p_summoning = false; + if (scards.Count > 0) return Util.CheckSelectCount(result, scards, 1, 1); + else if (min == 0) return result; // empty + } + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + private List GetZoneCards(CardLocation loc, ClientField player) + { + List res = new List(); + List temp = new List(); + if ((loc & CardLocation.Hand) > 0) { temp = player.Hand.Where(card => card != null).ToList(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.MonsterZone) > 0) { temp = player.GetMonsters(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.SpellZone) > 0) { temp = player.GetSpells(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.Grave) > 0) { temp = player.Graveyard.Where(card => card != null).ToList(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.Removed) > 0) { temp = player.Banished.Where(card => card != null).ToList(); if (temp.Count() > 0) res.AddRange(temp); } + if ((loc & CardLocation.Extra) > 0) { temp = player.ExtraDeck.Where(card => card != null).ToList(); if (temp.Count() > 0) res.AddRange(temp); } + return res; + } + private bool FinalCards(int cname) + { + int[] cardsname = new[] {CardId.Masurawo,CardId.Fleur,CardId.SavageDragon,CardId.Sarutobi,CardId.Regulus,CardId.IP}; + foreach(var cardname in cardsname) + { + if (cname == cardname) return true; + } + return false; + } + private bool TurnerCards(int cname) + { + int[] cardsname =new[] {CardId.PsyFramegearGamma,CardId.Wakaushi,CardId.Motorbike}; + foreach(var cardname in cardsname) + { + if (cname == cardname) return true; + } + return false; + } + private bool Psummon() + { + List cards = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.HasSetcode(0x9a) && card.Level > 1 && card.Level < 8).ToList(); + if (cards.Count > 0 && Card.Location == CardLocation.SpellZone) + { + p_summoning = true; + p_summoned = true; + return true; + } + return false; + } + private bool MaxxCFunction() + { + activate_MaxxG = true; + return DefaultMaxxC() && !activate_LockBird; + } + private bool FunctionInHand() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + return Duel.LastChainPlayer == 1; + } + private bool LockBirdFunction() + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + if (Duel.Player == 0 || activate_LockBird) + { + return false; + } + activate_LockBird = true; + return !activate_MaxxG; + } + private bool MotorbikeFunction() + { + if (Card.Location == CardLocation.Hand) + { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; + int targetid = -1; + List cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.IsFaceup()).ToList(); + if (!(Bot.HasInHand(CardId.Wakaushi) || Bot.HasInMonstersZone(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) + { + targetid = CardId.Wakaushi; + } + else if (cards.Count() == 0 && !normal_summon) + { + targetid = CardId.Soulpiercer; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker) && !activate_Soulpeacemaker && (normal_summon || Bot.HasInMonstersZone(CardId.Scarecrow))) + { + targetid = CardId.Soulpeacemaker; + } + else + { + targetid = CardId.Soulpiercer; + } + if (targetid > 0) AI.SelectCard(targetid); + activate_Motorbike = true; + return true; + } + else if (Card.Location == CardLocation.MonsterZone && activate_Elf) + { + AI.SelectCard(Card); + activate_Elf = false; + return true; + } + return false; + } + private bool BoosterNormalSummonFunction() + { + List cards = Bot.Hand.GetMonsters().Where(card => card != null && card.Id == CardId.Booster).ToList(); + return (NormalSummonFunction() && !activate_Booster && cards.Count >= 2); + } + private bool ScalesNormalSummonFunction() + { + return (NormalSummonFunction() && (Bot.HasInGraveyard(new[] { + CardId.Soulpiercer, + CardId.Motorbike, + CardId.Wakaushi, + CardId.Wagon, + CardId.Booster, + }) || (Bot.HasInHand(CardId.Booster) && !activate_Booster))); + } + private bool NormalSummonFunction() + { + normal_summon = true; + return DefaultMonsterSummon(); + } + private bool ScalesFunction() + { + AI.SelectCard(new[] { + CardId.Soulpiercer, + CardId.Motorbike, + CardId.Wakaushi, + CardId.Wagon, + CardId.Booster, + }); + activate_Scales = true; + return true; + } + private bool WagonFunction() + { + if (ActivateDescription == Util.GetStringId(CardId.Wagon, 0)) + return Card.IsAttack(); + if (ActivateDescription == Util.GetStringId(CardId.Wagon, 1)) + { + int targetid = -1; + if (!(Bot.HasInHand(CardId.Soulpiercer)||Bot.HasInMonstersZone(CardId.Soulpiercer))) + { + targetid = CardId.Soulpiercer; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker) + { + targetid = CardId.Soulpeacemaker; + } + else if (!Bot.HasInHand(CardId.Booster) && !activate_Booster) + { + targetid = CardId.Booster; + } + if (targetid > 0) AI.SelectCard(targetid); + activate_Wagon = true; + return true; + } + else + { + return true; + } + } + private bool SoulpiercerFunction() + { + if (Card.Location == CardLocation.Grave) + { + int CardCount = GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.HasSetcode(0x9a) && card.Level >= 2 && card.Level <= 7); + int targetid = -1; + if (!Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) + { + targetid = CardId.Motorbike; + } + else if (!(Bot.HasInHand(CardId.Wakaushi) || Bot.HasInMonstersZone(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) + { + targetid = CardId.Wakaushi; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker) + { + targetid = CardId.Soulpeacemaker; + } + else if (!Bot.HasInHand(CardId.Scales) && !activate_Scales && (!normal_summon || !p_summoned) && (activate_Soulpeacemaker || (!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker)))) + { + targetid = CardId.Scales; + } + else if (!Bot.HasInHand(CardId.Wagon) && !activate_Wagon) + { + targetid = CardId.Wagon; + } + else if (CardCount < 2 && !p_summoned) + { + targetid = CardId.Wakaushi; + } + else if (!Bot.HasInHand(CardId.Booster) && !activate_Booster) + { + targetid = CardId.Booster; + } + else if (!Bot.HasInHand(CardId.Soulhorns) && !Bot.HasInSpellZone(CardId.Soulhorns) && (Bot.HasInMonstersZone(CardId.Sarutobi) || Bot.HasInMonstersZone(CardId.Masurawo))) + { + targetid = CardId.Soulhorns; + } + else {targetid = CardId.Wakaushi;} + if (targetid > 0) AI.SelectCard(targetid); + return true; + } + return false; + } + private bool WakaushiFunction() + { + if (Card.Location != CardLocation.Hand||Bot.HasInMonstersZone(CardId.Wakaushi)) + return false; + ClientCard l = Util.GetPZone(0, 0); + ClientCard r = Util.GetPZone(0, 1); + if (l == null && r == null) + return true; + if (l == null && r.RScale != Card.LScale) + return true; + if (r == null && l.LScale != Card.RScale) + return true; + return false; + } + private bool WakaushiEffectFunction() + { + if (Card.Location == CardLocation.SpellZone) + { + AI.SelectCard(CardId.Benkei); + activate_Wakaushi = true; + return true; + } + return false; + } + private bool BenkeiFunction() + { + if (Card.Location != CardLocation.Hand || Bot.HasInSpellZone(CardId.Benkei)) return false; + List cards1 = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.Id == CardId.Benkei).ToList(); + List cards2 = GetZoneCards(CardLocation.Removed, Bot).Where(card => card != null && card.Id == CardId.Benkei).ToList(); + if (cards1.Count() >= 2 || Bot.HasInGraveyard(CardId.Benkei) || Bot.HasInExtra(CardId.Benkei) || cards2.Count() > 0) + return true; + return false; + } + private bool BenkeiEffectFunction() + { + if (Card.Location == CardLocation.SpellZone) + { + int targetid = -1; + if (!(Bot.HasInHand(CardId.Soulpiercer) || Bot.HasInMonstersZone(CardId.Soulpiercer) || Bot.HasInSpellZone(CardId.Soulpiercer)) && !(Bot.HasInMonstersZone(CardId.Scarecrow) && !activate_Soulpeacemaker)) + { + targetid = CardId.Soulpiercer; + } + else if (!Bot.HasInHand(CardId.Soulpeacemaker) && !activate_Soulpeacemaker) + { + targetid = CardId.Soulpeacemaker; + } + else if (!Bot.HasInHand(CardId.Booster) && !activate_Booster) + { + targetid = CardId.Booster; + } + if (targetid > 0) AI.SelectCard(targetid); + activate_Benkei = true; + return true; + } + return false; + } + private bool WakaushiReturnPFunction() + { + if (Card.Location == CardLocation.Extra||Card.Location == CardLocation.Removed) + { + ClientCard l = Util.GetPZone(0, 0); + ClientCard r = Util.GetPZone(0, 1); + if (l == null && r == null) + return true; + if (l == null && r.RScale != Card.LScale) + return true; + if (r == null && l.LScale != Card.RScale) + return true; + } + return false; + } + private bool MasurawoFunction() + { + if (ActivateDescription == 96) + { + List cards = GetZoneCards(CardLocation.SpellZone, Bot).Where(card => card != null && card.HasSetcode(0x9a)).ToList(); + if (cards.Count > 0) + { + AI.SelectCard(cards); + return true; + } + else + { + cards = GetZoneCards(CardLocation.MonsterZone, Bot).Where(card => card != null && card.HasSetcode(0x9a) && !FinalCards(card.Id)).ToList(); + if (cards.Count > 0) + { + AI.SelectCard(cards); + return true; + } + } + } + return true; + + } + private bool MasurawoSynchronFunction() + { + bool chk = true; + if (Bot.HasInMonstersZone(CardId.ASStardustDragon) || Bot.HasInMonstersZone(CardId.Benkei)) + chk = false; + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,12,1,1,false,chk,null, + card => { return !FinalCards(card.Id); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + AI.SelectPosition(CardPosition.FaceUpDefence); + return true; + } + private bool FleurSynchronFunction() + { + bool chk = true; + if (Bot.HasInMonstersZone(CardId.Motorbike) && (Bot.HasInMonstersZone(CardId.ASStardustDragon) || Bot.HasInMonstersZone(CardId.Benkei))) + chk = false; + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone,10,1,1,false,chk,null, + card => { return !FinalCards(card.Id); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + return true; + } + private bool DeSynchronFunction() + { + AI.SelectPosition(CardPosition.FaceUpDefence); + return true; + } + private bool SavageDragonSynchronFunction() + { + if (Bot.HasInGraveyard(new[] { + CardId.Scarecrow, + CardId.IP, + CardId.Genius, + CardId.Unicorn, + CardId.Elf, + })) + { + return true; + } + return false; + } + private bool ASStardustDragonSynchronFunction() + { + if (Bot.HasInGraveyard(CardId.Motorbike) || Bot.HasInGraveyard(CardId.PsyFramegearGamma)) + { + return (Bot.HasInExtra(CardId.Fleur) || Bot.HasInExtra(CardId.Masurawo)); + } + else if (Bot.HasInMonstersZone(CardId.Motorbike)) + { + AI.SelectMaterials(CardId.Motorbike); + return true; + } + else if (Bot.HasInMonstersZone(CardId.PsyFramegearGamma)) + { + AI.SelectMaterials(CardId.PsyFramegearGamma); + return true; + } + return false; + } + private bool PSYFramelordOmegaSynchronFunction() + { + if (Bot.HasInMonstersZone(CardId.Motorbike)) + AI.SelectMaterials(CardId.Motorbike); + else if (Bot.HasInMonstersZone(CardId.PsyFramegearGamma)) + AI.SelectMaterials(CardId.PsyFramegearGamma); + return activate_PSY || activate_Scales; + } + private bool SavageDragonFunction() + { + if (Duel.LastChainPlayer == 1) + return true; + AI.SelectCard(new[] + { + CardId.Unicorn, + CardId.Genius, + CardId.Elf, + CardId.IP, + CardId.Scarecrow + }); + return true; + } + private bool ASStardustDragonFunction() + { + if (Duel.LastChainPlayer == 1 && ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 1)) + { + return true; + } + else if (ActivateDescription == Util.GetStringId(CardId.ASStardustDragon, 0)) + { + + int targetid = -1; + if (Bot.HasInGraveyard(CardId.Motorbike)) + { + targetid = CardId.Motorbike; + } + else if (Bot.HasInGraveyard(CardId.PsyFramegearGamma)) + { + targetid = CardId.PsyFramegearGamma; + } + if (targetid > 0) AI.SelectCard(targetid); + if (targetid == CardId.Motorbike && !Bot.HasInExtra(CardId.Fleur) && Bot.HasInExtra(CardId.Masurawo)) + activate_Elf = true; + return true; + } + return false; + } + private bool ScarecrowLinkFunction() + { + List material = new List(); + List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); + if ((cards.Count() > 0 && !summon_Scarecrow) || summon_Scarecrow || activate_Scarecrow) return false; + int targetid = -1; + if (Bot.MonsterZone[0] != null && Bot.MonsterZone[2] != null) { + if (Bot.MonsterZone[0].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[0]); + else if (Bot.MonsterZone[2].Id == CardId.Soulpiercer) material.Add(Bot.MonsterZone[2]); + else if (!FinalCards(Bot.MonsterZone[0].Id) && Bot.MonsterZone[0].HasSetcode(0x9a)) material.Add(Bot.MonsterZone[0]); + else if (!FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[2].HasSetcode(0x9a)) material.Add(Bot.MonsterZone[2]); + } + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + { + targetid = CardId.Soulpiercer; + } + else if (Bot.HasInMonstersZone(CardId.Wagon)) + { + targetid = CardId.Wagon; + } + if (material.Count > 0) AI.SelectMaterials(material); + else if (targetid > 0) AI.SelectMaterials(targetid); + summon_Scarecrow=true; + return (Bot.HasInGraveyard(new[] { + CardId.Soulpiercer, + CardId.Wakaushi, + CardId.Benkei, + CardId.Wagon, + })||Bot.HasInMonstersZone(new[] { + CardId.Soulpiercer, + CardId.Wagon, + CardId.Wakaushi, + })); + } + private bool DragonRavineField() + { + if (Card.Location == CardLocation.Hand) + return DefaultField(); + return false; + } + + private bool ScarecrowFunction() + { + int tributeId = -1; + if (Bot.HasInHand(CardId.PsyFrameDriver)) + {tributeId = CardId.PsyFrameDriver;} + else if (Bot.HasInHand(CardId.PsyFramegearGamma)) + {tributeId = CardId.PsyFramegearGamma;} + else if (Bot.HasInHand(CardId.Benkei)) + {tributeId = CardId.Benkei;} + else if (Bot.HasInHand(CardId.HauntedMansion)) + {tributeId = CardId.HauntedMansion;} + else if (Bot.HasInHand(CardId.EffectVeiler)) + {tributeId = CardId.EffectVeiler;} + else if (Bot.HasInHand(CardId.SnowRabbit)) + {tributeId = CardId.SnowRabbit;} + else if (Bot.HasInHand(CardId.JoyousSpring)) + {tributeId = CardId.JoyousSpring;} + else if (Bot.HasInHand(CardId.Booster)) + {tributeId = CardId.Booster;} + else if (Bot.HasInHand(CardId.Wagon)) + {tributeId = CardId.Wagon;} + else if (Bot.HasInHand(CardId.Scales)) + {tributeId = CardId.Scales;} + else if (Bot.HasInHand(CardId.LockBird)) + {tributeId = CardId.LockBird;} + else if (Bot.HasInHand(CardId.MaxxG)) + {tributeId = CardId.MaxxG;} + int needId = -1; + if (Bot.HasInGraveyard(CardId.Soulpiercer)) + { + if (Bot.HasInGraveyard(CardId.Scales) && !activate_Scales) + {needId = CardId.Scales;} + else + {needId = CardId.Soulpiercer;} + } + else if (Bot.HasInGraveyard(CardId.Masurawo)) + {needId = CardId.Masurawo;} + else if (Bot.HasInGraveyard(CardId.Sarutobi)) + {needId = CardId.Sarutobi;} + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + { + if (Bot.HasInGraveyard(CardId.Wakaushi)) + {needId = CardId.Wakaushi;} + if (Bot.HasInGraveyard(CardId.Motorbike)) + {needId = CardId.Motorbike;} + } + if (GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Grave, Bot).Count(card => card != null && card.Id == CardId.Scales) + GetZoneCards(CardLocation.Onfield, Bot).Count(card => card != null && card.Id == CardId.Scales) == 2 && GetZoneCards(CardLocation.Hand, Bot).Count(card => card != null && card.Id == CardId.Scales)>=1 && !activate_Scales) + { + tributeId = CardId.Scales; + needId = CardId.Scales; + } + AI.SelectCard(tributeId); + AI.SelectNextCard(needId); + if (((!Bot.HasInHand(CardId.Wakaushi) && !Bot.HasInSpellZone(CardId.Wakaushi)) || activate_Wakaushi) + && (!Bot.HasInHand(CardId.Motorbike) || activate_Motorbike) + && ((!Bot.HasInHand(CardId.Soulpeacemaker) && !Bot.HasInSpellZone(CardId.Soulpeacemaker)) || activate_Soulpeacemaker) + && (!Bot.HasInSpellZone(CardId.Benkei) || activate_Benkei) + && (needId == CardId.Soulpiercer) + && (!activate_Wakaushi || !activate_Motorbike || !activate_Soulpeacemaker || !activate_Benkei) + ) + { + summon_Scarecrow2 = false; + } + activate_Scarecrow = true; + return true; + } + private bool ScarecrowLinkFunction2() + { + if (!summon_Scarecrow2) + { + summon_Scarecrow2 = true; + return true; + } + return false; + } + private bool UnicornFunction() + { + List Enemycards = GetZoneCards(CardLocation.Onfield,Enemy); + if (Bot.Hand.Count == 0 || Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0) + { + if (to_deck) to_deck = false; + return false; + } + int tributeId = -1; + if (Bot.HasInHand(CardId.PsyFrameDriver)) + {tributeId = CardId.PsyFrameDriver;} + else if (Bot.HasInHand(CardId.PsyFramegearGamma)) + {tributeId = CardId.PsyFramegearGamma;} + else if (Bot.HasInHand(CardId.Benkei)) + {tributeId = CardId.Benkei;} + else if (Bot.HasInHand(CardId.HauntedMansion)) + {tributeId = CardId.HauntedMansion;} + else if (Bot.HasInHand(CardId.EffectVeiler)) + {tributeId = CardId.EffectVeiler;} + else if (Bot.HasInHand(CardId.SnowRabbit)) + {tributeId = CardId.SnowRabbit;} + else if (Bot.HasInHand(CardId.JoyousSpring)) + {tributeId = CardId.JoyousSpring;} + else if (Bot.HasInHand(CardId.Booster)) + {tributeId = CardId.Booster;} + else if (Bot.HasInHand(CardId.Wagon)) + {tributeId = CardId.Wagon;} + else if (Bot.HasInHand(CardId.Scales)) + {tributeId = CardId.Scales;} + else if (Bot.HasInHand(CardId.LockBird)) + {tributeId = CardId.LockBird;} + else if (Bot.HasInHand(CardId.MaxxG)) + {tributeId = CardId.MaxxG;} + if (to_deck) to_deck = false; + AI.SelectCard(tributeId); + return true; + } + private bool BoosterEquipFunction() + { + if (Card.Location != CardLocation.Hand || activate_Booster) + return false; + List ChkCardsHand = Bot.Hand.GetMonsters().ToList(); + foreach (var card in ChkCardsHand) + { + if (card.Id == CardId.Motorbike && !activate_Motorbike) return false; + else if (card.Id == CardId.Soulpiercer) return false; + else if (card.Id == CardId.Soulpeacemaker && !activate_Soulpeacemaker) return false; + else if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; + else if (card.Id == CardId.Wagon && (!activate_Wagon || !normal_summon)) return false; + else if (card.Id == CardId.Benkei && !activate_Benkei) return false; + } + List ChkCardsSpell = GetZoneCards(CardLocation.SpellZone,Bot).Where(card => card != null && card.IsFaceup()).ToList(); + foreach (var card in ChkCardsSpell) + { + if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; + else if (card.Id == CardId.Soulpiercer) return false; + else if (card.Id == CardId.Soulpeacemaker && !activate_Soulpeacemaker) return false; + else if (card.Id == CardId.Wakaushi && !activate_Wakaushi) return false; + else if (card.Id == CardId.Benkei && !activate_Benkei) return false; + } + List ChkCardsMonster = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Level == 4).ToList(); + if (ChkCardsMonster.Count == 0) return false; + foreach (var card in ChkCardsMonster) + { + if (card.Id == CardId.Soulpiercer) return false; + } + List ChkCardsGrave = GetZoneCards(CardLocation.Grave,Bot).ToList(); + foreach (var card in ChkCardsGrave) + { + if (card.Id == CardId.Soulpiercer && (Bot.HasInMonstersZone(CardId.Scarecrow) || Bot.HasInExtra(CardId.Scarecrow))) return false; + else if (card.Level == 4 && card.HasRace(CardRace.Machine) && Bot.HasInHand(CardId.Scales) && !normal_summon) return false; + } + if (Bot.HasInExtra(CardId.IP) && p_summoned) return true; + need_Gear = true; + return true; + } + private bool BoosterEquipFunction2() + { + if (Bot.HasInExtra(CardId.IP) && p_summoned && !activate_Booster) return true; + return false; + } + private bool BoosterEquipFunction3() + { + List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.Scarecrow).ToList(); + if (Bot.HasInMonstersZone(CardId.IP) && p_summoned && !activate_Booster && cards.Count() == 0) return true; + return false; + } + private bool BoosterFunction() + { + if (Card.Location == CardLocation.SpellZone) + { + activate_Booster = true; + return true; + } + return false; + } + private bool GearGigantXyzFunction() + { + if (need_Gear) + { + need_Gear = false; + return true; + } + return false; + } + private bool GearGigantFunction() + { + if (Card.Location == CardLocation.MonsterZone) + { + List ChkCards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.HasSetcode(0x9a)).ToList(); + int targetid = -1; + if (!Bot.HasInHand(CardId.Motorbike) && !activate_Motorbike) + { + targetid = CardId.Motorbike; + } + else if (!(Bot.HasInHand(CardId.Wakaushi) || Bot.HasInSpellZone(CardId.Wakaushi)) && !activate_Wakaushi) + { + targetid = CardId.Wakaushi; + } + else if (!Bot.HasInHand(CardId.Soulpiercer) && (!normal_summon || (ChkCards.Count >= 1))) + { + targetid = CardId.Soulpiercer; + } + if (targetid > 0) AI.SelectCard(targetid); + return true; + } + return false; + } + private bool SoulpiercerEquipFunction() + { + if (Card.Location != CardLocation.Hand) + return false; + int tributeId = -1; + if (Bot.HasInMonstersZone(CardId.Wagon)) + {tributeId = CardId.Wagon;} + else if (Bot.HasInMonstersZone(CardId.Wakaushi)) + {tributeId = CardId.Wakaushi;} + AI.SelectCard(tributeId); + return Bot.HasInMonstersZone(new[] { + CardId.Wakaushi, + CardId.Wagon, + }); + } + private bool SoulpeacemakerEquipFunction() + { + if (Card.Location != CardLocation.Hand) + return false; + int tributeId = -1; + List cards = Bot.GetMonstersInExtraZone().Where(card => card != null && card.Id == CardId.Scarecrow).ToList(); + if (cards.Count() > 0) + AI.SelectCard(cards); + else + { + if (Bot.HasInMonstersZone(CardId.Scarecrow)) + {tributeId = CardId.Scarecrow;} + else if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + {tributeId = CardId.Soulpiercer;} + AI.SelectCard(tributeId); + } + return Bot.HasInMonstersZone(new[] { + CardId.Scarecrow, + CardId.Soulpiercer, + }); + } + private bool SoulhornsEquipFunction() + { + if (Card.Location != CardLocation.Hand) + return false; + int tributeId = -1; + if (Bot.HasInMonstersZone(CardId.Masurawo)) + {tributeId = CardId.Masurawo;} + else if (Bot.HasInMonstersZone(CardId.Sarutobi)) + {tributeId = CardId.Sarutobi;} + AI.SelectCard(tributeId); + return Bot.HasInMonstersZone(new[] { + CardId.Masurawo, + CardId.Sarutobi, + }); + } + private bool SoulpeacemakerFunction() + { + if (Card.Location == CardLocation.SpellZone) + { + int tributeId = -1; + if (Bot.HasInMonstersZone(CardId.Soulpiercer)) + {tributeId = CardId.Wakaushi;} + else if (Bot.HasInGraveyard(CardId.Soulpiercer)||!activate_Scales) + {tributeId = CardId.Scales;} + else if (!Bot.HasInGraveyard(CardId.Soulpiercer)||activate_Scales) + {tributeId = CardId.Soulpiercer;} + AI.SelectCard(tributeId); + activate_Soulpeacemaker = true; + return true; + } + return false; + } + private bool GeniusLinkFunction() + { + if ((Bot.MonsterZone[4] != null && Bot.MonsterZone[4].Controller == 0 && !FinalCards(Bot.MonsterZone[4].Id)) && (Bot.MonsterZone[0] != null && Bot.MonsterZone[0].Controller == 0 && !FinalCards(Bot.MonsterZone[0].Id))) + return false; + List Pcards = GetZoneCards(CardLocation.Hand, Bot).Where(card => card != null && card.HasSetcode(0x9a) && card.Level > 1 && card.Level < 8).ToList(); + if (Pcards.Count() < 2 && !Bot.HasInMonstersZone(CardId.Soulpiercer)) return false; + List Rcards = GetZoneCards(CardLocation.Removed, Bot).Where(card => card != null && card.Id == CardId.Regulus).ToList(); + if (Bot.HasInHand(CardId.Regulus) || Bot.HasInGraveyard(CardId.Regulus) || Bot.HasInSpellZone(CardId.Regulus) || Bot.HasInMonstersZone(CardId.Regulus) || Rcards.Count() > 0) return false; + bool linkchk = false; + List materials = new List(); + if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[6].Id)) + { + materials.Add(Bot.MonsterZone[6]); + linkchk = true; + } + else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && Bot.MonsterZone[5].Id != CardId.Scarecrow && !FinalCards(Bot.MonsterZone[5].Id)) + { + materials.Add(Bot.MonsterZone[5]); + linkchk = true; + } + List cards = Bot.GetMonstersInMainZone().Where(card => card != null && card.IsFaceup() && card.HasRace(CardRace.Machine)).ToList(); + foreach (var card in cards) + { + if (card == null || FinalCards(card.Id)) continue; + else materials.Add(card); + } + if (materials.Count <=1) return false; + AI.SelectMaterials(materials); + return ((Bot.GetMonstersInExtraZone().Count == 0 || linkchk) && !p_summoned && !activate_Genius); + } + private bool GeniusFunction() + { + if (ActivateDescription == Util.GetStringId(CardId.Genius,1)) + { + AI.SelectCard(CardId.Regulus); + activate_Genius = true; + return true; + } + return false; + } + private bool ElfLinkFunction() + { + if (!Bot.HasInGraveyard(CardId.Motorbike)) return false; + List materials = new List(); + if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && !FinalCards(Bot.MonsterZone[6].Id)) + { + materials.Add(Bot.MonsterZone[6]); + } + else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && !FinalCards(Bot.MonsterZone[5].Id)) + { + materials.Add(Bot.MonsterZone[5]); + } + List TunrerCards = Bot.GetMonstersInMainZone().Where(card => card != null && card.IsFaceup() && TurnerCards(card.Id) && !FinalCards(card.Id)).ToList(); + List UnTunrercards = Bot.GetMonstersInMainZone().Where(card => card != null && card.IsFaceup() && !TurnerCards(card.Id) && !FinalCards(card.Id)).ToList(); + if (UnTunrercards.Count == 0) return false; + else if (TunrerCards.Count >= UnTunrercards.Count && UnTunrercards.Count > 0) + { + foreach (var card in TunrerCards) + { + if (card == null) continue; + else if (materials.Count(ccard =>ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); + } + } + else + { + foreach (var card in UnTunrercards) + { + if (card == null) continue; + else if (materials.Count(ccard =>ccard != null && ccard.Id == card.Id) <= 0) materials.Add(card); + } + } + if (materials.Count <=1) return false; + AI.SelectMaterials(materials); + summon_Elf = true; + return true; + } + private bool ElfFunction() + { + if (Duel.Player == 0) + { + activate_Elf = true; + AI.SelectCard(CardId.Motorbike); + return Bot.HasInGraveyard(CardId.Motorbike); + } + List cards1 = GetZoneCards(CardLocation.MonsterZone, Enemy); + List cards2 = GetZoneCards(CardLocation.SpellZone, Enemy); + if (cards1.Count() > 0 || cards2.Count() >= 3) + { + if (Bot.HasInExtra(CardId.Unicorn) && Bot.HasInGraveyard(CardId.IP)) + AI.SelectCard(CardId.IP); + else + { + AI.SelectCard(CardId.Motorbike); + AI.SelectPosition(CardPosition.FaceUpDefence); + } + activate_Elf = true; + return Bot.HasInGraveyard(CardId.Motorbike) || Bot.HasInGraveyard(CardId.IP); + } + return false; + } + private bool RegulusFunction() + { + if (Card.Location == CardLocation.Hand) + { + int tributeId = -1; + if (Bot.HasInGraveyard(CardId.Soulpiercer)) + {tributeId = CardId.Soulpiercer;} + else if (Bot.HasInGraveyard(CardId.Motorbike)) + {tributeId = CardId.Motorbike;} + AI.SelectCard(tributeId); + activate_Genius = true; + return true; + } + else if (Duel.LastChainPlayer == 1) + { + return true; + } + return false; + } + private bool FleurFunction() + { + if (ActivateDescription == Util.GetStringId(CardId.Fleur, 0)) + { + ClientCard card = Util.GetProblematicEnemyMonster(0, true); + if (card != null) + { + AI.SelectCard(card); + return true; + } + card = Util.GetBestEnemySpell(true); + if (card != null) + { + AI.SelectCard(card); + return true; + } + List cards = GetZoneCards(CardLocation.Onfield, Enemy); + cards = cards.Where(tcard => tcard != null && !tcard.IsShouldNotBeTarget()).ToList(); + if (cards.Count <= 0) return false; + AI.SelectCard(cards); + return true; + } + else if (ActivateDescription == Util.GetStringId(CardId.Fleur, 1)) + { + return Duel.LastChainPlayer == 1; + } + return false; + } + private bool IPLinkFunction() + { + List materials = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card.IsFaceup() && card.Id != CardId.Scarecrow && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf)) && !FinalCards(card.Id)).ToList(); + if (materials.Count <=1) return false; + if (Bot.MonsterZone[6] != null && Bot.MonsterZone[6].Controller == 0 && Bot.MonsterZone[6].HasType(CardType.Link)) + { + if (Bot.MonsterZone[2] != null && FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[4] != null && FinalCards(Bot.MonsterZone[4].Id)) + return false; + } + else if (Bot.MonsterZone[5] != null && Bot.MonsterZone[5].Controller == 0 && Bot.MonsterZone[5].HasType(CardType.Link)) + { + if (Bot.MonsterZone[2] != null && FinalCards(Bot.MonsterZone[2].Id) && Bot.MonsterZone[0] != null && FinalCards(Bot.MonsterZone[0].Id)) + return false; + } + AI.SelectMaterials(materials); + return true; + } + private bool PSYFunction() + { + activate_PSY = true; + return true; + } + private bool IPFunction() + { + if (Duel.LastChainPlayer == 0) return false; + if (Bot.HasInExtra(CardId.Unicorn)) + { + List material = new List(); + List cards = GetZoneCards(CardLocation.MonsterZone,Bot).Where(card => card != null && card != Card && card.IsFaceup() && !FinalCards(card.Id) && card.Id != CardId.IP && card.Id != CardId.Scarecrow).ToList(); + List Enemycards = GetZoneCards(CardLocation.MonsterZone,Enemy); + if (activate_Sarutobi) Enemycards = GetZoneCards(CardLocation.Onfield,Enemy); + if (Bot.Hand.Count == 0 || Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0 || cards.Count == 0) return false; + bool linkchk = false; + foreach (var card in cards) + { + if (card != null && (card.Id != CardId.Elf || (card.Id == CardId.Elf && !summon_Elf))) + { + material.Add(card); + linkchk = true; + break; + } + } + AI.SelectCard(CardId.Unicorn); + material.Insert(0,Card); + AI.SelectMaterials(material); + if (!to_deck) to_deck = true; + return linkchk; + } + return false; + } + private bool SarutobiFunction() + { + List Enemycards = GetZoneCards(CardLocation.SpellZone,Enemy); + if (Enemycards.Count(card => card != null && !card.IsShouldNotBeTarget()) == 0 || to_deck) return false; + AI.SelectCard(Enemycards); + activate_Sarutobi = true; + return true; + } + } +} diff --git a/Game/AI/Decks/SwordsoulExecutor.cs b/Game/AI/Decks/SwordsoulExecutor.cs index 64f75335c..e96da2ab9 100644 --- a/Game/AI/Decks/SwordsoulExecutor.cs +++ b/Game/AI/Decks/SwordsoulExecutor.cs @@ -1,2617 +1,3118 @@ -using System; +using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using System.Linq; -using YGOSharp.OCGWrapper.Enums; +using System; +using YGOSharp.OCGWrapper; -namespace WindBot.Game.AI.Decks { +namespace WindBot.Game.AI.Decks +{ [Deck("Swordsoul", "AI_Swordsoul")] - class SwordsoulExecutor : DefaultExecutor { - - #region Card IDs - - public class CardId { - // tenyi core - public const int TenyiAshuna = 87052196; - public const int TenyiVishuda = 23431858; - public const int TenyiAdhara = 98159737; - - // swordsoul core - public const int SwordsoulLongYuan = 93490856; - public const int SwordsoulTaia = 56495147; - public const int SwordsoulMoYe = 20001443; - - // handtraps + effect negates - public const int AshBlossomAndJoyousSpring = 14558127; - public const int InfiniteImpermanence = 10045474; - public const int ForbiddenChalice = 25789292; - //swordsoul support + public class SwordsoulExecutor : DefaultExecutor + { + public class CardId + { + public const int NibiruThePrimalBeing = 27204311; + public const int TenyiSpirit_Ashuna = 87052196; + public const int TenyiSpirit_Vishuda = 23431858; + public const int SwordsoulStrategistLongyuan = 93490856; + public const int SwordsoulOfTaia = 56495147; + public const int SwordsoulOfMoYe = 20001443; + public const int IncredibleEcclesiaTheVirtuous = 55273560; + // _CardId.AshBlossom = 14558127; + // _CardId.MaxxC = 23434538; + // _CardId.EffectVeiler = 97268402; + public const int TenyiSpirit_Adhara = 98159737; + + // _CardId.PotOfDesires = 35261759; public const int SwordsoulEmergence = 56465981; - public const int SwordsoulSummit = 93850690; - public const int SwordsoulBlackout = 14821890; - - public const int IncredibleEcclesia = 55273560; - public const int PotOfDesires = 35261759; - - // tenyi support - public const int VesselForDragonCycle = 65124425; + public const int SwordsoulSacredSummit = 93850690; + // _CardId.CalledByTheGrave = 24224830; + public const int CrossoutDesignator = 65681983; - // extra deck - public const int SwordsoulChengying = 96633955; - public const int SwordsoulChixiao = 69248256; + // _CardId.InfiniteImpermanence = 10045474; + public const int SwordsoulBlackout = 14821890; - public const int YangZingChaofeng = 19048328; - public const int YangZingBaxia = 83755611; - public const int YangZingYazi = 43202238; + public const int GeomathmechFinalSigma = 42632209; + public const int PsychicEndPunisher = 60465049; + public const int SwordsoulSupremeSovereign_Chengying = 96633955; + public const int BaronneDeFleur = 84815190; + public const int SwordsoulSinisterSovereign_QixingLongyuan = 47710198; + public const int AdamancipatorRisen_Dragite = 9464441; + public const int DracoBerserkerOfTheTenyi = 5041348; + public const int SwordsoulGrandmaster_Chixiao = 69248256; + public const int BaxiaBrightnessOfTheYangZing = 83755611; + public const int YaziEvilOfTheYangZing = 43202238; + public const int ShamanOfTheTenyi = 78917791; + public const int MonkOfTheTenyi = 32519092; - public const int BlackRoseDragon = 73580471; + public const int SwordsoulToken = 20001444; - public const int TenyiMonk = 32519092; - public const int TenyiDracoBeserker = 05041348; + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + } - public const int RuddyRoseDragon = 40139997; - public const int BaronneDeFluer = 84815190; - public const int AdamancipatorDragnite = 09464441; + public SwordsoulExecutor(GameAI ai, Duel duel) + : base(ai, duel) + { + // startup effect + AddExecutor(ExecutorType.Activate, CardId.BaxiaBrightnessOfTheYangZing, BaxiaBrightnessOfTheYangZingActivate); + AddExecutor(ExecutorType.Activate, CardId.YaziEvilOfTheYangZing, YaziEvilOfTheYangZingActivate); + AddExecutor(ExecutorType.Activate, CardId.IncredibleEcclesiaTheVirtuous, IncredibleEcclesiaTheVirtuousActivate); + + // quick effect + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulGrandmaster_Chixiao, SwordsoulGrandmaster_ChixiaoActivate); + AddExecutor(ExecutorType.Activate, _CardId.EffectVeiler, EffectVeilerActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulSinisterSovereign_QixingLongyuan, SwordsoulSinisterSovereign_QixingLongyuanActivate); + AddExecutor(ExecutorType.Activate, CardId.DracoBerserkerOfTheTenyi, DracoBerserkerOfTheTenyiActivate); + AddExecutor(ExecutorType.Activate, CardId.AdamancipatorRisen_Dragite, AdamancipatorRisen_DragiteActivate); + AddExecutor(ExecutorType.Activate, CardId.BaronneDeFleur, BaronneDeFleurActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulSupremeSovereign_Chengying, SwordsoulSupremeSovereign_ChengyingActivate); + + // free chain + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, CardId.NibiruThePrimalBeing, NibiruThePrimalBeingActivate); + + // startup effect + AddExecutor(ExecutorType.Activate, CardId.SwordsoulEmergence, SwordsoulEmergenceActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulBlackout, SwordsoulBlackoutActivate); + + // synchro + AddExecutor(ExecutorType.SpSummon, CardId.YaziEvilOfTheYangZing, YaziEvilOfTheYangZingSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.BaxiaBrightnessOfTheYangZing, BaxiaBrightnessOfTheYangZingSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.SwordsoulGrandmaster_Chixiao, SwordsoulGrandmaster_ChixiaoSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.AdamancipatorRisen_Dragite, AdamancipatorRisen_DragiteSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.DracoBerserkerOfTheTenyi, DracoBerserkerOfTheTenyiSpSummon); + + AddExecutor(ExecutorType.SpSummon, Level10SpSummonCheckInit); + AddExecutor(ExecutorType.SpSummon, Level10SpSummonCheckCount); + AddExecutor(ExecutorType.SpSummon, Level10SpSummonCheckDecide); + AddExecutor(ExecutorType.SpSummon, Level10SpSummonCheckFinal); + + // startup effect + AddExecutor(ExecutorType.Activate, CardId.SwordsoulOfMoYe, SwordsoulOfMoYeActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulOfTaia, SwordsoulOfTaiaActivate); + + // summon + AddExecutor(ExecutorType.Activate, TenyiForShamanSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.IncredibleEcclesiaTheVirtuous, IncredibleEcclesiaTheVirtuousSpSummon); + AddExecutor(ExecutorType.Summon, CardId.SwordsoulOfMoYe, SwordsoulOfMoYeSummon); + AddExecutor(ExecutorType.Summon, CardId.IncredibleEcclesiaTheVirtuous, IncredibleEcclesiaTheVirtuousSummon); + AddExecutor(ExecutorType.Summon, CardId.SwordsoulOfTaia, SwordsoulOfTaiaSummon); + + // activate + AddExecutor(ExecutorType.Activate, CardId.SwordsoulStrategistLongyuan, SwordsoulStrategistLongyuanActivate); + AddExecutor(ExecutorType.Activate, _CardId.PotOfDesires, PotOfDesiresActivate); + AddExecutor(ExecutorType.Activate, CardId.ShamanOfTheTenyi, ShamanOfTheTenyiActivate); + AddExecutor(ExecutorType.Activate, CardId.SwordsoulSacredSummit, SwordsoulSacredSummitActivate); + AddExecutor(ExecutorType.Activate, CardId.TenyiSpirit_Vishuda, TenyiSpirit_VishudaActivate); + AddExecutor(ExecutorType.Activate, CardId.TenyiSpirit_Ashuna, TenyiSpirit_AshunaActivate); + AddExecutor(ExecutorType.Activate, CardId.TenyiSpirit_Adhara, TenyiSpirit_AdharaActivate); + AddExecutor(ExecutorType.Activate, TenyiForBlackoutSpSummon); + + // other + AddExecutor(ExecutorType.SpSummon, CardId.GeomathmechFinalSigma, GeomathmechFinalSigmaSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.PsychicEndPunisher, PsychicEndPunisherSpSummon); + AddExecutor(ExecutorType.Summon, TunerForSynchroSummon); + AddExecutor(ExecutorType.Summon, WyrmForBlackoutSummon); + AddExecutor(ExecutorType.SpSummon, CardId.ShamanOfTheTenyi, ShamanOfTheTenyiSpSummon); + AddExecutor(ExecutorType.SpSummon, CardId.MonkOfTheTenyi, MonkOfTheTenyiSpSummon); + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); - // token - public const int SwordsoulToken = 20001444; + AddExecutor(ExecutorType.Activate, CardId.PsychicEndPunisher, PsychicEndPunisherActivate); + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); } - private readonly int[] Wyrms = - { - CardId.TenyiAshuna, - CardId.TenyiVishuda, - CardId.TenyiAdhara, - CardId.SwordsoulLongYuan, - CardId.SwordsoulTaia, - CardId.SwordsoulMoYe, - CardId.SwordsoulChengying, - CardId.SwordsoulChixiao, - CardId.YangZingChaofeng, - CardId.YangZingBaxia, - CardId.YangZingYazi, - CardId.TenyiMonk, - CardId.SwordsoulToken + const int SetcodeTimeLord = 0x4a; + const int SetcodeYangZing = 0x9e; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeTenyi = 0x12c; + const int SetcodeSwordsoul = 0x16b; + const int SetcodeFloowandereeze = 0x16d; + List normalCounterList = new List + { + _CardId.AshBlossom, CardId.BaronneDeFleur, 27548199, 4280258, 53262004 }; - - private readonly int[] SwordSouls = - { - CardId.SwordsoulLongYuan, - CardId.SwordsoulTaia, - CardId.SwordsoulMoYe, - CardId.SwordsoulChengying, - CardId.SwordsoulChixiao, - CardId.SwordsoulEmergence, - CardId.SwordsoulSummit, - CardId.SwordsoulBlackout, - CardId.SwordsoulToken + List notToNegateIdList = new List{ + 58699500 }; - - private readonly int[] Tenyis = - { - CardId.TenyiAshuna, - CardId.TenyiVishuda, - CardId.TenyiAdhara, - CardId.TenyiMonk + const int hintTimingMainEnd = 0x4; + const int hintReplaceDestroy = 96; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.IncredibleEcclesiaTheVirtuous, + _CardId.AshBlossom, _CardId.MaxxC, _CardId.EffectVeiler, CardId.SwordsoulEmergence, _CardId.InfiniteImpermanence }}, + {2, new List { CardId.TenyiSpirit_Ashuna, _CardId.PotOfDesires, _CardId.CalledByTheGrave, CardId.SwordsoulBlackout }}, + {1, new List { CardId.NibiruThePrimalBeing, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Adhara, CardId.SwordsoulSacredSummit, + CardId.CrossoutDesignator }}, }; - #endregion Card IDs - - #region Activate Effect Flags + List currentNegatingIdList = new List(); + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + bool enemyActivateInfiniteImpermanenceFromHand = false; + List infiniteImpermanenceList = new List(); - private enum ActivatedEffect { - None = 0x0, - First = 0x1, - Second = 0x2, - Third = 0x4 - } + bool summoned = false; + bool onlyWyrmSpSummon = false; + List activatedCardIdList = new List(); + List canSpSummonLevel10IdList = new List(); - private bool NormalSummonUsed = false; + List effectUsedBaronneDeFleurList = new List(); + List currentNegateMonsterList = new List(); - private ActivatedEffect MoYeActivated = ActivatedEffect.None; - private ActivatedEffect LongYuanActivated = ActivatedEffect.None; - private ActivatedEffect TaiaActivated = ActivatedEffect.None; - private ActivatedEffect ChixiaoActivated = ActivatedEffect.None; - private ActivatedEffect ChengyingActivated = ActivatedEffect.None; + /// + /// Shuffle List and return a random-order card list + /// + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + ClientCard tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } - private ActivatedEffect EcclesiaActivated = ActivatedEffect.None; + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false) + { + List floodagateList = Enemy.GetMonsters().Where(c => c?.Data != null && + c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count() > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + return floodagateList[0]; + } - private ActivatedEffect AshunaActivated = ActivatedEffect.None; - private ActivatedEffect VishudaActivated = ActivatedEffect.None; - private ActivatedEffect AdharaActivated = ActivatedEffect.None; - private ActivatedEffect BaxiaActivated = ActivatedEffect.None; + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count() > 0) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + return dangerList[0]; + } - private ActivatedEffect EmergenceActivated = ActivatedEffect.None; - private ActivatedEffect SummitActivated = ActivatedEffect.None; + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && + c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count() > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + return invincibleList[0]; + } - private ActivatedEffect VesselActivated = ActivatedEffect.None; + if (attack == 0) + attack = Util.GetBestAttack(Bot); + List betterList = Enemy.MonsterZone.GetMonsters() + .Where(card => card.GetDefensePower() >= attack && card.IsAttack() && (!canBeTarget || !card.IsShouldNotBeTarget())).ToList(); + if (betterList.Count() > 0) + { + betterList.Sort(CardContainer.CompareCardAttack); + betterList.Reverse(); + return betterList[0]; + } + return null; + } - private ActivatedEffect BaronneActivated = ActivatedEffect.None; + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreNormalSpell = false) + { + List resultList = new List(); - private LinkedList EffectChain = new LinkedList(); + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (floodagateList.Count() > 0) + { + floodagateList.Sort(CardContainer.CompareCardAttack); + floodagateList.Reverse(); + resultList.AddRange(floodagateList); + } + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count() > 0) + { + resultList.AddRange(ShuffleCardList(problemEnemySpellList)); + } - public override void OnNewTurn() { - NormalSummonUsed = false; + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (dangerList.Count() > 0 + && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) + { + dangerList.Sort(CardContainer.CompareCardAttack); + dangerList.Reverse(); + resultList.AddRange(dangerList); + } - MoYeActivated = ActivatedEffect.None; - LongYuanActivated = ActivatedEffect.None; - TaiaActivated = ActivatedEffect.None; + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (invincibleList.Count() > 0) + { + invincibleList.Sort(CardContainer.CompareCardAttack); + invincibleList.Reverse(); + resultList.AddRange(invincibleList); + } - ChixiaoActivated = ActivatedEffect.None; - ChengyingActivated = ActivatedEffect.None; + List enemyMonsters = Enemy.GetMonsters().ToList(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach(ClientCard target in enemyMonsters) + { + if (target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2) ) + { + if (!canBeTarget || !(target.IsShouldNotBeTarget() || target.IsShouldNotBeMonsterTarget())) + { + if (!resultList.Contains(target)) + { + resultList.Add(target); + } + } + } + } + } - EcclesiaActivated = ActivatedEffect.None; + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous)).ToList(); + if (spells.Count() > 0 && !ignoreNormalSpell) + { + resultList.AddRange(ShuffleCardList(spells)); + } - EmergenceActivated = ActivatedEffect.None; - SummitActivated = ActivatedEffect.None; + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget); + if (card != null) + return card; - VesselActivated = ActivatedEffect.None; + card = Enemy.MonsterZone.GetHighestAttackMonster(canBeTarget); + if (card != null) + return card; - AshunaActivated = ActivatedEffect.None; - VishudaActivated = ActivatedEffect.None; - AdharaActivated = ActivatedEffect.None; + List monsters = Enemy.GetMonsters(); - BaxiaActivated = ActivatedEffect.None; + // after GetHighestAttackMonster, the left monsters must be face-down. + if (monsters.Count() > 0 && !onlyFaceup) + return ShuffleCardList(monsters)[0]; - BaronneActivated &= ActivatedEffect.Second; + return null; + } - EffectChain.Clear(); + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count() > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } - // activation counts do not get reset between sessions so we can only activate the same card 9 times before the game prevents the AI from selecting the card - ResetActivatedCount(); - } + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); - #endregion Activate Effect Flags + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && + ecard.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous)).ToList(); + if (faceUpList.Count() > 0) + { + return ShuffleCardList(faceUpList)[0]; + } - public SwordsoulExecutor(GameAI ai, Duel duel) - : base(ai, duel) { - - // negates - AddExecutor(ExecutorType.Activate, CardId.SwordsoulChixiao, ActivateChixiaoNegate); - AddExecutor(ExecutorType.Activate, CardId.RuddyRoseDragon, ActivateRuddyRoseNegate); - AddExecutor(ExecutorType.Activate, CardId.TenyiDracoBeserker, DefaultDisableMonster); - AddExecutor(ExecutorType.Activate, CardId.AdamancipatorDragnite, ActivateDragniteNegate); - AddExecutor(ExecutorType.Activate, CardId.AshBlossomAndJoyousSpring, DefaultAshBlossomAndJoyousSpring); - AddExecutor(ExecutorType.Activate, CardId.InfiniteImpermanence, DefaultInfiniteImpermanence); - AddExecutor(ExecutorType.Activate, CardId.ForbiddenChalice, DefaultDisableMonster); - AddExecutor(ExecutorType.Activate, CardId.BaronneDeFluer, ActivateBaronneNegate); - - // triggers - AddExecutor(ExecutorType.Activate, CardId.SwordsoulChengying, ActivateChengyingEffects); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulChixiao, ActivateChixiaoSearch); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulEmergence, ActivateEmergencLevelDown); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulSummit, ActivateSummitLevelDown); - AddExecutor(ExecutorType.Activate, CardId.VesselForDragonCycle, ActivateVesselSearch); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulTaia, ActivateTaiaMill); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulLongYuan, ActivateLongyuanDamage); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulMoYe, ActivateMoYeDraw); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulBlackout, BlackoutActivateSummon); - AddExecutor(ExecutorType.Activate, CardId.YangZingYazi, ActivateYaziSearch); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulMoYe, ActivateMoYeSummon); - AddExecutor(ExecutorType.Activate, CardId.BaronneDeFluer, ActivateBaronneRevive); - AddExecutor(ExecutorType.Activate, CardId.YangZingChaofeng, ActivateChaofengSearchEffects); - - // removal activations - AddExecutor(ExecutorType.Activate, CardId.YangZingYazi, ActivateYaziDestruction); - AddExecutor(ExecutorType.Activate, CardId.RuddyRoseDragon, ActivateRuddyRoseBanish); - AddExecutor(ExecutorType.Activate, CardId.BlackRoseDragon, ActivateBlackroseDestroy); - AddExecutor(ExecutorType.Activate, CardId.BaronneDeFluer, ActivateBaronneDestroy); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulBlackout, BlackoutActivateDestroy); - AddExecutor(ExecutorType.Activate, CardId.TenyiVishuda, ActivateVishudaInGrave); - - // other activations - AddExecutor(ExecutorType.Activate, CardId.TenyiAshuna, SpecialSummonAshuna); - AddExecutor(ExecutorType.Activate, CardId.TenyiVishuda, SpecialSummonVishuda); - AddExecutor(ExecutorType.Activate, CardId.TenyiAdhara, SpecialSummonAdhara); - AddExecutor(ExecutorType.Activate, CardId.TenyiAdhara, ActivateGraveAdhara); - AddExecutor(ExecutorType.Activate, CardId.TenyiAshuna, ActivateAshunaInGrave); - AddExecutor(ExecutorType.Activate, CardId.IncredibleEcclesia, ActivateEcclesiaSearch); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulTaia, ActivateTaiaSummon); - AddExecutor(ExecutorType.Activate, CardId.YangZingBaxia, BaxiaActivatedRevive); - AddExecutor(ExecutorType.Activate, CardId.YangZingBaxia, BaxiaActivatedShuffle); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulLongYuan, ActivateLongYuanSummon); - - // special summons - AddExecutor(ExecutorType.SpSummon, CardId.IncredibleEcclesia, SpecialSummonEcclesia); - AddExecutor(ExecutorType.SpSummon, CardId.TenyiMonk, SpecialSummonMonk); - AddExecutor(ExecutorType.SpSummon, CardId.YangZingBaxia, SummonBaxia); - AddExecutor(ExecutorType.SpSummon, CardId.YangZingChaofeng, SummonChaofeng); - AddExecutor(ExecutorType.SpSummon, CardId.SwordsoulChixiao, SummonChixiao); - AddExecutor(ExecutorType.SpSummon, CardId.AdamancipatorDragnite, SummonDragnite); - AddExecutor(ExecutorType.SpSummon, CardId.SwordsoulChengying, SummonChengying); - AddExecutor(ExecutorType.SpSummon, CardId.BaronneDeFluer, SummonBaronne); - AddExecutor(ExecutorType.SpSummon, CardId.RuddyRoseDragon, SummonRuddyRose); - AddExecutor(ExecutorType.SpSummon, CardId.BlackRoseDragon, SummonBlackRose); - AddExecutor(ExecutorType.SpSummon, CardId.BlackRoseDragon, ShouldSummonBlackRose); - AddExecutor(ExecutorType.SpSummon, CardId.YangZingYazi, SummonYazi); - AddExecutor(ExecutorType.SpSummon, CardId.TenyiDracoBeserker, SummonDraco); - - // summons - AddExecutor(ExecutorType.Summon, CardId.IncredibleEcclesia, SummonEcclesia); - AddExecutor(ExecutorType.Summon, CardId.SwordsoulTaia, SummonTaia); - AddExecutor(ExecutorType.Summon, CardId.SwordsoulMoYe, SummonMoYe); - AddExecutor(ExecutorType.Summon, CardId.TenyiAdhara, SummonAdhara); - - // spell activations - AddExecutor(ExecutorType.Activate, CardId.SwordsoulEmergence, ActivateEmergenceSearch); - AddExecutor(ExecutorType.Activate, CardId.SwordsoulSummit, ActivateSummit); - AddExecutor(ExecutorType.Activate, CardId.PotOfDesires, ActivatePotOfDesires); - - // set traps - AddExecutor(ExecutorType.SpellSet, CardId.SwordsoulBlackout, SetBlackout); - AddExecutor(ExecutorType.SpellSet, CardId.InfiniteImpermanence, DefaultSpellSet); - AddExecutor(ExecutorType.SpellSet, CardId.ForbiddenChalice, DefaultSpellSet); - - // util stuff - AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); - } + if (spells.Count() > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } - public override bool OnSelectHand() { - return true; + return null; } - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) { - ClientCard currentCard = GetCurrentSearchCardFromChain(); - if(currentCard == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); - - if(currentCard.IsCode(CardId.SwordsoulChixiao) && ChixiaoActivated.HasFlag(ActivatedEffect.First)) { - ClientCard selected = ChixiaoSearchSelection(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); - - return new List() { selected }; + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) + { + return card; } - if(currentCard.IsCode(CardId.SwordsoulTaia) && TaiaActivated.HasFlag(ActivatedEffect.Second)) { - ClientCard selected = TaiaMillSelection(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); - - return new List() { selected }; + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) + { + return card; + } + + if (checkGrave && Enemy.Graveyard.Count() > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count() > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; } - if(currentCard.IsCode(CardId.IncredibleEcclesia) && EcclesiaActivated.HasFlag(ActivatedEffect.Second)) { - ClientCard selected = EcclesiaSearchSelection(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); + return null; + } - return new List() { selected }; - } + public List GetNormalEnemyTargetList(bool canBeTarget = true) + { + List targetList = GetProblematicEnemyCardList(canBeTarget); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card)).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleCardList(Enemy.GetSpells())); + targetList.AddRange(ShuffleCardList(Enemy.GetMonsters().Where(card => card.IsFacedown()).ToList())); - if(currentCard.IsCode(CardId.TenyiAshuna) && AshunaActivated.HasFlag(ActivatedEffect.Second)) { - ClientCard selected = AshunaSearchSelection(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); + return targetList; + } - return new List() { selected }; + public List GetMonsterListForTargetNegate(bool canBeMonsterTarget = false, bool canBeTrapTarget = false) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; } - if(currentCard.IsCode(CardId.VesselForDragonCycle) && VesselActivated.HasFlag(ActivatedEffect.First)) { - ClientCard selected = VesselMillSelection(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); + // negate before used + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && (!canBeMonsterTarget || !card.IsShouldNotBeMonsterTarget()) && (!canBeTrapTarget || !card.IsShouldNotBeSpellTrapTarget()) + && !currentNegateMonsterList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } - return new List() { selected }; + // negate monster effect on the field + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && (!canBeMonsterTarget || !chainingCard.IsShouldNotBeMonsterTarget()) && (!canBeTrapTarget || !chainingCard.IsShouldNotBeSpellTrapTarget()) + && !chainingCard.IsShouldNotBeTarget() && !currentNegateMonsterList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } } - if(currentCard.IsCode(CardId.VesselForDragonCycle) && VesselActivated.HasFlag(ActivatedEffect.Second)) { - ClientCard selected = VesselSearchSelection(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); + return resultList; + } - return new List() { selected }; + /// + /// Check whether negate opposite's effect and clear flag + /// + public void CheckDeactiveFlag() + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && Duel.LastChainPlayer == 1) + { + if (lastChainCard.Controller == 1 && lastChainCard.Location == CardLocation.MonsterZone) + { + currentNegateMonsterList.Add(lastChainCard); + } } + } - if(currentCard.IsCode(CardId.SwordsoulChengying)) { - List selected = SelectChengyingTargets(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); + /// + /// Check negated turn count of id + /// + public int CheckCalledbytheGrave(int id) + { + if (currentNegatingIdList.Contains(id)) return 1; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; + } - return selected; + /// + /// Check remain cards in deck + /// + /// Card's ID + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) { + return Bot.GetRemainingCount(id, count); + } } + return 0; + } - if(currentCard.IsCode(CardId.YangZingYazi)) { - ClientCard selected = YaziSearchSelection(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); + /// + /// Whether spell or trap will be negate. If so, return true. + /// + /// is counter trap + /// check target + /// + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + // target default set + if (target == null) target = Card; + // won't negate if not on field + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + // negate judge + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap()) + { + if (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true)) return true; + } + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) { + return true; + } + } + // how to get here? + return false; + } - return new List() { selected }; + /// + /// Check whether'll be negated + /// + /// check whether card itself is disabled. + public bool CheckWhetherNegated() + { + if ((Card.IsSpell() || Card.IsTrap()) && CheckSpellWillBeNegate()){ + return true; } + if (DefaultCheckWhetherCardIsNegated(Card)) { + return true; + } + if (Card.IsMonster() && Card.Location == CardLocation.MonsterZone && Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) + { + return true; + } + } + return false; + } - if(currentCard.IsCode(CardId.YangZingChaofeng)) { - ClientCard selected = SelectChaofengTarget(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } - return new List() { selected }; + /// + /// Check whether bot is at advantage. + /// + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && + (Bot.GetMonsters().Any(card => card.IsFaceup()) || (Duel.Player == 0 && Duel.Turn == 1))) + { + return true; } + return false; + } - if(currentCard.IsCode(CardId.BaronneDeFluer)) { - ClientCard selected = BaronneDestroyTarget(cards); - if(selected == null) - return base.OnSelectCard(cards, min, max, hint, cancelable); - - return new List() { selected }; + /// + /// Check whether last chain card should be disabled. + /// + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (DefaultCheckWhetherCardIsNegated(lastcard)) return false; + if (Duel.CurrentChain.Count >= 2) + { + ClientCard lastlastChainCard = Duel.CurrentChain[Duel.CurrentChain.Count - 2]; + ClientCard lastChainCard = Duel.CurrentChain[Duel.CurrentChain.Count - 1]; + if (lastlastChainCard?.Controller == 0 && lastChainCard?.Controller == 1 && lastChainCard.IsCode(normalCounterList)) + { + bool notImportantFlag = lastlastChainCard.Location == CardLocation.Grave + && (lastlastChainCard.IsCode(CardId.SwordsoulOfTaia) || lastlastChainCard.IsCode(CardId.SwordsoulOfMoYe) || lastlastChainCard.IsCode(CardId.SwordsoulStrategistLongyuan)); + notImportantFlag |= lastlastChainCard.IsCode(CardId.PsychicEndPunisher) && Bot.LifePoints < Enemy.LifePoints; + if (notImportantFlag) + { + return false; + } + } } - return base.OnSelectCard(cards, min, max, hint, cancelable); + return true; } + /// + /// check enemy's dangerous card in grave + /// + public List CheckDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom))).ToList(); + List dangerMonsterIdList = new List{ + 99937011, 63542003, CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Vishuda, + 9411399, 28954097, 30680659 + }; + return result; + } - private bool ActivatePotOfDesires() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; + /// + /// go first + /// + public override bool OnSelectHand() + { + return true; + } - if(Card.IsDisabled()) - return false; + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + // Geomathmech Final Sigma always place on extra monster zone + if (cardId == CardId.GeomathmechFinalSigma && location == CardLocation.MonsterZone) + { + if ((Zones.z5 & available) > 0) return Zones.z5; + if ((Zones.z6 & available) > 0) return Zones.z6; + } + return base.OnSelectPlace(cardId, player, location, available); + } - // on turn one we want to avoid breaking deck combos if we have plays - if(Duel.Turn == 1) { - if(ShouldActivateGraveAshuna()) - return false; + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId); + if (cardData != null) + { + if (cardData.Id == CardId.PsychicEndPunisher) + { + return CardPosition.FaceUpAttack; + } + if (Util.IsTurn1OrMain2()) + { + bool turnDefense = false; + if (!cardData.HasType(CardType.Synchro) || cardData.Attack <= cardData.Defense) + { + turnDefense = true; + } + if (turnDefense) + { + return CardPosition.FaceUpDefence; + } + } + if (Duel.Player == 1) + { + if (!cardData.HasType(CardType.Synchro) || cardData.Defense >= cardData.Attack || Util.IsOneEnemyBetterThanValue(cardData.Attack, true)) + { + return CardPosition.FaceUpDefence; + } + } else if (cardData.HasType(CardType.Synchro)) + { + return CardPosition.FaceUpAttack; + } + int bestBotAttack = Math.Max(Util.GetBestAttack(Bot), cardData.Attack); + if (Util.IsAllEnemyBetterThanValue(bestBotAttack, true)) + { + return CardPosition.FaceUpDefence; + } + } + return base.OnSelectPosition(cardId, positions); + } - if(ShouldSpecialSummonEcclesia()) - return false; + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (Util.ChainContainPlayer(1) && hint == HintMsg.Remove && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int botCount = Bot.GetMonsterCount() + Bot.GetSpellCount(); + int oppositeCount = Enemy.GetMonsterCount() + Enemy.GetSpellCount(); + if (botCount - oppositeCount == min && min == max) + { + Logger.DebugWriteLine("=== Evenly Matched activated."); + List banishList = new List(); + List botMonsters = Bot.GetMonsters().Where(card => !card.HasType(CardType.Token)).ToList(); + + // non-synchro monster + List faceDownMonsters = botMonsters.Where(card => card.IsFacedown()).ToList(); + banishList.AddRange(faceDownMonsters); + List nonSynchroMonsters = botMonsters.Where(card => !card.HasType(CardType.Synchro) && !banishList.Contains(card)).ToList(); + nonSynchroMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(nonSynchroMonsters); + + // spells + List spells = Bot.GetSpells(); + banishList.AddRange(ShuffleCardList(spells)); + + // synchro monster + List synchroMonsters = botMonsters.Where(card => card.HasType(CardType.Synchro) && !banishList.Contains(card)).ToList(); + synchroMonsters.Sort(CardContainer.CompareCardAttack); + banishList.AddRange(synchroMonsters); + + return Util.CheckSelectCount(banishList, cards, min, max); + } + } - if(CanActivateTaiaFromField()) - return false; + return base.OnSelectCard(cards, min, max, hint, cancelable); + } - if(ShouldSummonChixiao()) - return false; + public override void OnNewTurn() + { + enemyActivateMaxxC = false; + enemyActivateLockBird = false; - if(ShouldSummonYazi()) - return false; + infiniteImpermanenceList.Clear(); - if(ShouldSummonBaronne()) - return false; + summoned = false; + onlyWyrmSpSummon = false; + enemyActivateInfiniteImpermanenceFromHand = false; + activatedCardIdList.Clear(); + currentNegateMonsterList.Clear(); + currentNegatingIdList.Clear(); + base.OnNewTurn(); + } - if(ShouldSummonBlackRose()) - return false; + public override void OnChainSolved(int chainIndex) + { + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.ActivatePlayer == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) + enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) + enemyActivateLockBird = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence) && !enemyActivateInfiniteImpermanenceFromHand) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard.RelatedCard) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + } - if(ShouldSummonDragnite()) - return false; + public override void OnChainEnd() + { + currentNegateMonsterList.Clear(); + currentNegatingIdList.Clear(); + for (int idx = effectUsedBaronneDeFleurList.Count() - 1; idx >= 0; -- idx) + { + ClientCard checkTarget = effectUsedBaronneDeFleurList[idx]; + if (checkTarget == null || checkTarget.IsFacedown() || checkTarget.Location != CardLocation.MonsterZone) + { + effectUsedBaronneDeFleurList.RemoveAt(idx); + } + } + enemyActivateInfiniteImpermanenceFromHand = false; + base.OnChainEnd(); + } - if(CanActivateYaziDestruction()) - return false; + public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation) + { + if (previousControler == 1) + { + if (card != null) + { + if (card.IsCode(_CardId.InfiniteImpermanence) && previousLocation == (int)CardLocation.Hand && currentLocation == (int)CardLocation.SpellZone) + enemyActivateInfiniteImpermanenceFromHand = true; + } } - bool hasTenyiExtendersInHand = Bot.HasInHand(CardId.TenyiAdhara) || Bot.HasInHand(CardId.TenyiVishuda); - bool hasAnyTenyiInHand = Bot.HasInHand(CardId.TenyiAshuna) || hasTenyiExtendersInHand; + base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation); + } - if(Bot.HasInHand(CardId.TenyiAshuna) && hasTenyiExtendersInHand) - return false; + /// + /// Select spell/trap's place randomly to avoid InfiniteImpermanence and so on. + /// + /// Card to set(default current card) + /// Whether need to avoid InfiniteImpermanence + /// Whether need to avoid set in this place + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } - if(Bot.HasInHand(CardId.VesselForDragonCycle) && hasAnyTenyiInHand) + public bool NibiruThePrimalBeingActivate() + { + if (CheckWhetherNegated()) return false; + if (Duel.Player == 0 || Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasType(CardType.Synchro))) + { return false; + } + + if (Util.GetBestAttack(Enemy) > Util.GetBestAttack(Bot)) + { + // end main phase + if ((CurrentTiming & hintTimingMainEnd) != 0) + { + SelectNibiruPosition(); + return true; + } + + // avoid Baronne de Fleur + List tunerList = Enemy.GetMonsters().Where(card => card.IsFaceup() && card.IsTuner() && !card.HasType(CardType.Xyz | CardType.Link)).ToList(); + List nonTunerList = Enemy.GetMonsters().Where(card => card.IsFaceup() && !card.IsTuner() && !card.HasType(CardType.Xyz | CardType.Link)).ToList(); + foreach (ClientCard tuner in tunerList) + { + foreach (ClientCard nonTuner in nonTunerList) + { + if (tuner.Level + nonTuner.Level == 10) + { + SelectNibiruPosition(); + return true; + } + } + } + } - return DefaultPotOfDesires(); + return false; } - #region Vessel Code - - private bool ActivateVesselSearch() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(Bot.GetMonsters().Count == 0) - return false; + public void SelectNibiruPosition() + { + int totalAttack = Bot.GetMonsters().Where(card => card.IsFaceup()).Sum(m => (int?)m.Attack) ?? 0; + totalAttack += Enemy.GetMonsters().Where(card => card.IsFaceup()).Sum(m => (int?)m.Attack) ?? 0; + Logger.DebugWriteLine("Nibiru token attack: " + totalAttack.ToString()); + if (totalAttack >= 3000) + { + AI.SelectPosition(CardPosition.FaceUpDefence); + AI.SelectPosition(CardPosition.FaceUpDefence); + } else { + AI.SelectPosition(CardPosition.FaceUpAttack); + AI.SelectPosition(CardPosition.FaceUpAttack); + } + } - if(Bot.MonsterZone.GetMatchingCardsCount(card => !card.HasType(CardType.Effect)) == 0) - return false; + public bool TenyiSpirit_AshunaActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Ashuna, 0)) + { + // special summon + if (TenyiSpSummonForTaiaCheck() || Level7TenyiSpSummonCheck()) + { + return true; + } - if(ShouldSpecialSummonEcclesia()) - return false; + } else if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Ashuna, 1) && Card.Location == CardLocation.Grave && CheckCalledbytheGrave(Card.Id) == 0) + { + // deck summon + + // trigger blackout + if (Bot.HasInHandOrInSpellZone(CardId.SwordsoulBlackout)) + { + List blackoutTarget = Bot.GetMonsters().Where(card => card.IsFaceup() + && !card.HasType(CardType.Synchro) && card.HasRace(CardRace.Wyrm)).ToList(); + if (blackoutTarget.Count() == 0) + { + AI.SelectCard(CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Vishuda); + onlyWyrmSpSummon = true; + activatedCardIdList.Add(Card.Id); + return true; + } + } - if(CanActivateTaiaFromField()) - return false; + // for level8/10 synchro + List tunerIdList = new List{_CardId.AshBlossom, _CardId.EffectVeiler, CardId.TenyiSpirit_Adhara}; + bool hasTuner = Bot.GetMonsters().Any(card => card.IsFaceup() && card.IsCode(tunerIdList)); + hasTuner |= !summoned && Bot.HasInHand(tunerIdList); + if (hasTuner && CheckRemainInDeck(CardId.TenyiSpirit_Vishuda) > 0) + { + AI.SelectCard(CardId.TenyiSpirit_Ashuna); + onlyWyrmSpSummon = true; + activatedCardIdList.Add(Card.Id); + return true; + } + if (Bot.HasInMonstersZone(CardId.TenyiSpirit_Ashuna, false, false, true) && CheckRemainInDeck(CardId.TenyiSpirit_Adhara) > 0) + { + AI.SelectCard(CardId.TenyiSpirit_Adhara); + onlyWyrmSpSummon = true; + activatedCardIdList.Add(Card.Id); + return true; + } + } + return false; + } - if(ShouldSummonChixiao()) - return false; + public bool TenyiSpirit_VishudaActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Vishuda, 0)) + { + // special summon + if (TenyiSpSummonForTaiaCheck() || Level7TenyiSpSummonCheck()) + { + return true; + } - if(ShouldSummonYazi()) - return false; + } else if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Vishuda, 1) && Card.Location == CardLocation.Grave && CheckCalledbytheGrave(Card.Id) == 0) + { + // bounce + List dangerList = GetProblematicEnemyCardList(true, true); + if (dangerList.Count() > 0) + { + AI.SelectCard(dangerList); + return true; + } + } + return false; + } - if(ShouldSummonBaronne()) - return false; - - if(CanActivateYaziDestruction()) - return false; + public bool Level7TenyiSpSummonCheck() + { + List advanceSummonCheckList = new List{CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia, CardId.IncredibleEcclesiaTheVirtuous}; + List tunerList = new List{CardId.TenyiSpirit_Adhara, _CardId.EffectVeiler, _CardId.AshBlossom}; + if (!summoned && !Bot.HasInHand(advanceSummonCheckList) && Bot.HasInHand(tunerList)) + { + return true; + } + if (Bot.HasInExtra(CardId.PsychicEndPunisher) && Bot.HasInMonstersZone(CardId.SwordsoulToken) && !onlyWyrmSpSummon) + { + return true; + } - VesselActivated |= ActivatedEffect.First; - return true; + return false; } - private ClientCard VesselMillSelection(IList cards) { - VesselActivated |= ActivatedEffect.Second; - - bool shouldSearch = true; - - // Make sure there are materials for ashuna in the deck while we are searching for mill - if(Bot.Hand.ContainsCardWithId(CardId.TenyiVishuda) && cards.GetMatchingCardsCount(card => card.IsCode(CardId.TenyiAdhara)) == 1) - shouldSearch = false; - - if(Bot.Hand.ContainsCardWithId(CardId.TenyiAdhara) && cards.GetMatchingCardsCount(card => card.IsCode(CardId.TenyiVishuda)) == 1) - shouldSearch = false; - - AI.SelectYesNo(shouldSearch); - - if(!Bot.HasInGraveyard(CardId.TenyiAshuna) && cards.ContainsCardWithId(CardId.TenyiAshuna)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAshuna)); - - if(cards.GetMatchingCardsCount(card => card.IsCode(CardId.TenyiVishuda)) > 1) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiVishuda)); - - if(cards.GetMatchingCardsCount(card => card.IsCode(CardId.TenyiAdhara)) > 1) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAdhara)); - - if(cards.ContainsCardWithId(CardId.SwordsoulLongYuan)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulLongYuan)); - - if(cards.ContainsCardWithId(CardId.SwordsoulMoYe)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulMoYe)); - - if(cards.ContainsCardWithId(CardId.SwordsoulTaia)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulTaia)); + public bool SwordsoulStrategistLongyuanActivate() + { + // damage effect + if (Card.Location != CardLocation.Hand) + { + return true; + } - return null; - } + // special summon token + if (CheckWhetherNegated() || (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2())) + { + return false; + } + List discardIdList = new List(); - private ClientCard VesselSearchSelection(IList cards) { - if(!VishudaActivated.HasFlag(ActivatedEffect.First) && cards.GetMatchingCardsCount(card => card.IsCode(CardId.TenyiVishuda)) > 1) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiVishuda)); + // discard Taia to SS + if (CheckAtAdvantage()) + { + if (Bot.HasInHand(CardId.SwordsoulSacredSummit) && Bot.HasInHand(CardId.SwordsoulOfTaia) + && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && !activatedCardIdList.Contains(CardId.SwordsoulSacredSummit)) + { + discardIdList.Add(CardId.SwordsoulOfTaia); + } + } - if(!AdharaActivated.HasFlag(ActivatedEffect.First) && cards.GetMatchingCardsCount(card => card.IsCode(CardId.TenyiAdhara)) > 1) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAdhara)); + // discard tenyi + if (discardIdList.Count() == 0) + { + List tenyiList = new List{CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Adhara}; + foreach (int tenyiId in tenyiList) + { + if (Bot.HasInHand(tenyiId)) + { + discardIdList.Add(tenyiId); + } + } + } - if(cards.ContainsCardWithId(CardId.TenyiVishuda)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiVishuda)); + // discard dump card + if (discardIdList.Count() == 0) + { + List checkIdList = new List{ + CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.SwordsoulBlackout, CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulEmergence + }; + foreach (int checkId in checkIdList) + { + if (Bot.Hand.Count(card => card != Card && card.IsCode(checkIdList)) > 1) + { + discardIdList.Add(checkId); + } + } + } - if(cards.ContainsCardWithId(CardId.TenyiAdhara)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAdhara)); + // discard card + if (discardIdList.Count() == 0) + { + List checkIdList = new List{ + CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.SwordsoulBlackout, CardId.SwordsoulStrategistLongyuan, + CardId.SwordsoulSacredSummit, CardId.SwordsoulEmergence + }; + foreach (int checkId in checkIdList) + { + if (Bot.Hand.Count(card => card != Card && card.IsCode(checkIdList)) >= 1) + { + discardIdList.Add(checkId); + } + } + } - if(cards.ContainsCardWithId(CardId.TenyiAshuna)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAshuna)); + if (discardIdList.Count() > 0) + { + AI.SelectCard(discardIdList); + AI.SelectPosition(CardPosition.FaceUpAttack); + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } - return null; + return false; } - #endregion Vessel Code + public bool SwordsoulOfTaiaActivate() + { + // send to GY effect + if (Card.Location != CardLocation.MonsterZone) + { + List sendToGYTarget = new List(); + + // send Mo Ye to SS + if (!Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0) + { + bool sendMoYe = false; + // baxia + if (Bot.HasInMonstersZone(CardId.BaxiaBrightnessOfTheYangZing, true, false, true + && !activatedCardIdList.Contains(CardId.BaxiaBrightnessOfTheYangZing))) + { + sendMoYe = true; + + } + if (Bot.HasInHand(CardId.SwordsoulSacredSummit) && !activatedCardIdList.Contains(CardId.SwordsoulSacredSummit)) { + if (Bot.Hand.Any(card => card.Id != CardId.SwordsoulSacredSummit && (card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm)))) + { + sendMoYe = true; + } + } - #region Ashuna Code + if (sendMoYe) + { + sendToGYTarget.Add(CardId.SwordsoulOfMoYe); + } + } + + // send Tenyi + List checkTenyiList = new List {CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna}; + foreach (int id in checkTenyiList) + { + if (CheckRemainInDeck(id) > 0) + { + sendToGYTarget.Add(id); + } + } - private bool SpecialSummonAshuna() { - if(!Card.Location.HasFlag(CardLocation.Hand)) + if (sendToGYTarget.Count() > 0) + { + AI.SelectCard(sendToGYTarget); + return true; + } return false; + } + + // special summon token + // ignore negate check if blackout in GY + if (Bot.HasInGraveyard(CardId.SwordsoulBlackout) && !activatedCardIdList.Contains(CardId.SwordsoulBlackout)) + { + AI.SelectCard(CardId.SwordsoulBlackout); + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } - if(HasEffectMonster()) + if (CheckWhetherNegated()) + { return false; + } + List banishIdList = new List(); - if(AshunaActivated.HasFlag(ActivatedEffect.First)) - return false; + List checkIdList = new List{ + CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulEmergence, CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.MonkOfTheTenyi, + CardId.ShamanOfTheTenyi, CardId.SwordsoulSacredSummit, CardId.SwordsoulGrandmaster_Chixiao, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Vishuda, + CardId.SwordsoulSinisterSovereign_QixingLongyuan, CardId.SwordsoulSupremeSovereign_Chengying, CardId.DracoBerserkerOfTheTenyi, + CardId.TenyiSpirit_Adhara + }; - // Do the combo no matter what if we have two tenyi - bool usableVishuna = Bot.Hand.ContainsCardWithId(CardId.TenyiVishuda); + // dump check + foreach (int checkId in checkIdList) + { + if (Bot.Graveyard.Count(card => card.IsCode(checkId)) > 1) + { + banishIdList.Add(checkId); + } + } - bool usableAdhara = Bot.Hand.ContainsCardWithId(CardId.TenyiAdhara) || Bot.Hand.ContainsCardWithId(CardId.VesselForDragonCycle); - if(usableVishuna || usableAdhara) { - AshunaActivated |= ActivatedEffect.First; - return true; + // priority check + if (banishIdList.Count() == 0) + { + foreach (int checkId in checkIdList) + { + if (Bot.HasInGraveyard(checkId)) + { + banishIdList.Add(checkId); + } + } } - // Moye combo is better - if(Bot.Hand.ContainsCardWithId(CardId.SwordsoulMoYe) && SoulswordMaterialCountInHand() <= 2) - return false; + if (banishIdList.Count() > 0) + { + AI.SelectCard(banishIdList); + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } - // Longyuan combo is better - if(Bot.Hand.ContainsCardWithId(CardId.SwordsoulLongYuan) && SoulswordMaterialCountInHand() <= 2) + return false; + } + + public bool SwordsoulOfTaiaSummon() + { + if (Bot.HasInGraveyard(CardId.SwordsoulBlackout)) + { + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && !activatedCardIdList.Contains(CardId.SwordsoulBlackout)) + { + summoned = true; + return true; + } + } + if (SummonLevel4ForSynchro()) + { + summoned = true; + return true; + } + if (CheckWhetherNegated()) + { return false; + } + if (SwordsoulOfTaiaEffectCheck() && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia)) + { + summoned = true; + return true; + } - // Ecclesia combo is better - if(Bot.Hand.ContainsCardWithId(CardId.IncredibleEcclesia)) - return false; + return false; + } - AshunaActivated |= ActivatedEffect.First; - return true; + public bool SwordsoulOfTaiaEffectCheck(ClientCard exceptTarget = null) + { + if (exceptTarget == null) + { + exceptTarget = Card; + } + return Bot.Graveyard.Count(card => card != exceptTarget && (card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm))) > 0; } - private bool ShouldActivateGraveAshuna() { - if(!Bot.Graveyard.ContainsCardWithId(CardId.TenyiAshuna)) - return false; + public bool SwordsoulOfMoYeActivate() + { + // draw effect + if (Card.Location != CardLocation.MonsterZone) + { + return true; + } - if(!HasNonEffectMonster()) + // special summon token + if (CheckWhetherNegated()) + { return false; + } + List revealList = Bot.Hand.Where(card => card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm)).ToList(); + if (revealList.Count() > 0) + { + revealList = ShuffleCardList(revealList); + AI.SelectCard(revealList); + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } + return false; + } - if(Bot.HasInMonstersZone(CardId.TenyiAshuna)) + public bool SwordsoulOfMoYeSummon() + { + if (SummonLevel4ForSynchro()) + { + summoned = true; + return true; + } + if (CheckWhetherNegated()) + { return false; + } + if (SwordsoulOfMoYeEffectCheck() && !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe)) + { + summoned = true; + return true; + } - if(AshunaActivated.HasFlag(ActivatedEffect.Second)) - return false; + return false; + } - if(CanActivateTaiaFromField()) - return false; + public bool SwordsoulOfMoYeEffectCheck(List exceptList = null) + { + if (exceptList == null) + { + exceptList = new List{Card}; + } + return Bot.Hand.Count(card => !exceptList.Contains(card) && (card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm))) > 0; + } - if(ShouldSummonYazi()) + public bool SummonLevel4ForSynchro() + { + bool hasNonTuner = Bot.GetMonsters().Any(card => card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link) && !card.IsTuner()); + if (hasNonTuner) + { return false; + } + List tunerList = Bot.GetMonsters().Where(card => + card.IsFaceup() && !card.HasType(CardType.Xyz | CardType.Link) && card.IsTuner()).ToList(); + if (tunerList.Count() > 0) + { + foreach (ClientCard tuner in tunerList) + { + int checkLevel = tuner.Level + 4; + if (Bot.ExtraDeck.Any(card => card.HasType(CardType.Synchro) && card.Level == checkLevel)) + { + return true; + } + } + } - if(ShouldSummonChixiao()) - return false; + return false; + } - if(CanActivateYaziDestruction()) - return false; + public bool IncredibleEcclesiaTheVirtuousActivate() + { + if (Card.Location == CardLocation.Grave) + { + return true; + } + if (Duel.Player == 0 && !CheckWhetherNegated()) + { + bool canActivateMoye = !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck(); + bool canActivateTaia = !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 && SwordsoulOfTaiaEffectCheck(); + if (canActivateMoye && !summoned && !Bot.HasInHand(CardId.SwordsoulOfMoYe)) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + return true; + } + if (canActivateTaia && !summoned && !Bot.HasInHand(CardId.SwordsoulOfTaia)) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + return true; + } + if (canActivateMoye) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + return true; + } + if (canActivateTaia) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + return true; + } + } - if(ShouldSummonDragnite()) - return false; + return false; + } - if(ShouldSummonBlackRose()) + public bool IncredibleEcclesiaTheVirtuousSummon() + { + if (CheckWhetherNegated()) + { return false; - - // if we have a tenyi summoned then trigger for the other one - bool shouldTriggerAdhara = Bot.HasInMonstersZone(CardId.TenyiVishuda); - bool shouldTriggerVishuda = Bot.HasInMonstersZone(CardId.TenyiAdhara); - - if(shouldTriggerAdhara || shouldTriggerVishuda) + } + if (SwordsoulOfMoYeSummon() && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0) + { + summoned = true; + return true; + } + if (SwordsoulOfTaiaSummon() && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0) + { + summoned = true; return true; - - if(Bot.HasInMonstersZone(CardId.SwordsoulToken)) { - bool hasMaterial = Bot.HasInMonstersZone(CardId.SwordsoulTaia) || Bot.HasInMonstersZone(CardId.SwordsoulMoYe); - if(!hasMaterial) - return false; } - return true; + return false; } - private bool ActivateAshunaInGrave() { - if(!Card.Location.HasFlag(CardLocation.Grave)) + public bool IncredibleEcclesiaTheVirtuousSpSummon() + { + if (CheckWhetherNegated()) + { return false; - - if(!ShouldActivateGraveAshuna()) + } + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { return false; + } - AshunaActivated |= ActivatedEffect.Second; return true; } - private ClientCard AshunaSearchSelection(IList cards) { - if(Bot.HasInMonstersZone(CardId.TenyiAdhara) && cards.ContainsCardWithId(CardId.TenyiVishuda)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiVishuda)); - - if(Bot.HasInMonstersZone(CardId.TenyiVishuda) && cards.ContainsCardWithId(CardId.TenyiAdhara)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAdhara)); - - if(cards.Count > 0) - return cards[Rand.Next(cards.Count)]; + public bool AshBlossomActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (DefaultAshBlossomAndJoyousSpring()) + { + CheckDeactiveFlag(); + return true; + } + return false; + } - return null; + public bool MaxxCActivate() + { + if (CheckWhetherNegated() || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); } - #endregion Ashuna Code + public bool EffectVeilerActivate() + { + if (CheckWhetherNegated()) return false; - #region Vishuda Code + List shouldNegateList = GetMonsterListForTargetNegate(true); + if (shouldNegateList.Count() > 0) + { + ClientCard target = shouldNegateList[0]; + currentNegateMonsterList.Add(target); + AI.SelectCard(target); + return true; + } - private bool SpecialSummonVishuda() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; + return false; + } - if(HasEffectMonster()) + public bool TunerForSynchroSummon() + { + if (!Card.IsCode(_CardId.AshBlossom) && !Card.IsCode(CardId.TenyiSpirit_Adhara) && !Card.IsCode(_CardId.EffectVeiler)) + { return false; - - if(VishudaActivated.HasFlag(ActivatedEffect.First)) + } + // taia check + if (Bot.HasInExtra(CardId.MonkOfTheTenyi) && Bot.HasInHand(CardId.SwordsoulOfTaia) + && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { return false; + } - if(ActivateDescription == Util.GetStringId(CardId.TenyiVishuda, 1)) + // already has tuner, skip (maybe affected by Dimensional Barrier) + if (Bot.GetMonsters().Any(card => card.IsFaceup() && card.IsTuner())) + { return false; + } - bool ashunaReady = !AshunaActivated.HasFlag(ActivatedEffect.Second) && Bot.HasInGraveyard(CardId.TenyiAshuna); - bool vesselReady = !VesselActivated.HasFlag(ActivatedEffect.First) && Bot.HasInHand(CardId.VesselForDragonCycle); + // level10 check + List checkOnField = new List{CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna}; + bool hasLevel7NonTuner = Bot.GetMonsters().Any(card => card.IsFaceup() && checkOnField.Contains(card.Id) && !card.IsTuner()); + if (hasLevel7NonTuner) + { + int totalLevel = Card.Level + 7; + if (Bot.ExtraDeck.Any(card => card.HasType(CardType.Synchro) && card.Level == totalLevel && (!onlyWyrmSpSummon || card.HasRace(CardRace.Wyrm)))) + { + summoned = true; + return true; + } + } - // Always activate if able if there is a Ashuna in grave or Vessel in hand - if(ashunaReady || vesselReady) { - AI.SelectYesNo(true); - VishudaActivated |= ActivatedEffect.First; - return true; + List checkNonTuner = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.IsTuner()).ToList(); + checkNonTuner.Sort(CardContainer.CompareCardAttack); + // level7 check + if (Bot.HasInExtra(CardId.YaziEvilOfTheYangZing) && GetProblematicEnemyCardList(true, true).Count() > 0) + { + foreach (ClientCard checkCard in checkNonTuner) + { + if (Card.Level + checkCard.Level == 7) + { + summoned = true; + return true; + } + } + } + // level 11 check + if (Bot.HasInExtra(CardId.PsychicEndPunisher)) + { + foreach (ClientCard checkCard in checkNonTuner) + { + if ((checkCard.IsDisabled() || !checkCard.HasType(CardType.Synchro)) && (Card.Level + checkCard.Level == 11)) + { + summoned = true; + return true; + } + } } - if(!AshunaActivated.HasFlag(ActivatedEffect.First) && Bot.HasInHand(CardId.TenyiAshuna)) - return false; + return false; + } - // Moye combo is better - if(Bot.Hand.ContainsCardWithId(CardId.SwordsoulMoYe) && SoulswordMaterialCountInHand() <= 2) + public bool WyrmForBlackoutSummon() + { + if (Card.Level > 4 || !Card.HasRace(CardRace.Wyrm)) + { return false; + } + if (Bot.HasInHandOrInSpellZone(CardId.SwordsoulBlackout) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasRace(CardRace.Wyrm))) + { + summoned = true; + return true; + } + return false; + } - // Longyuan combo is better - if(Bot.Hand.ContainsCardWithId(CardId.SwordsoulLongYuan) && SoulswordMaterialCountInHand() <= 2) - return false; + public bool TenyiSpirit_AdharaActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Adhara, 0)) + { + // special summon + if (TenyiSpSummonForTaiaCheck()) + { + return true; + } - // Ecclesia combo is better - if(Bot.Hand.ContainsCardWithId(CardId.IncredibleEcclesia)) - return false; + } + else if (ActivateDescription == Util.GetStringId(CardId.TenyiSpirit_Adhara, 1) && Card.Location == CardLocation.Grave && CheckCalledbytheGrave(Card.Id) == 0) + { + // recycle + if (!activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) && SwordsoulOfMoYeEffectCheck() + && Bot.HasInBanished(CardId.SwordsoulStrategistLongyuan)) + { + AI.SelectCard(CardId.SwordsoulStrategistLongyuan); + return true; + } + if (!summoned) + { + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && SwordsoulOfMoYeEffectCheck() + && Bot.HasInBanished(CardId.SwordsoulOfMoYe)) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + return true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && SwordsoulOfTaiaEffectCheck() + && Bot.HasInBanished(CardId.SwordsoulOfTaia)) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + return true; + } + } + List recycleList = new List{CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna}; + foreach (int recycle in recycleList) + { + if (Bot.HasInBanished(recycle)) + { + AI.SelectCard(recycle); + return true; + } + } + } - AI.SelectPosition(CardPosition.Defence); - AI.SelectYesNo(true); - VishudaActivated |= ActivatedEffect.First; - return true; + return false; } - private bool ActivateVishudaInGrave() { - if(!Card.Location.HasFlag(CardLocation.Grave)) - return false; - - if(Card.IsDisabled()) - return false; + public bool TenyiSpSummonForTaiaCheck() + { + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + bool hasTaia = (!summoned && Bot.HasInHand(CardId.SwordsoulOfTaia)) || Bot.HasInMonstersZone(CardId.SwordsoulOfTaia); + bool noTargetInGrave = !Bot.Graveyard.Any(card => card.HasRace(CardRace.Wyrm) || card.HasSetcode(SetcodeSwordsoul)); + bool hasInExtra = Bot.HasInExtra(CardId.MonkOfTheTenyi); + bool notLongyuan = activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) || !Bot.HasInHand(CardId.SwordsoulStrategistLongyuan); - if(!HasNonEffectMonster()) - return false; - - if(ShouldSummonYazi()) - return false; - - if(ShouldSummonBaronne()) - return false; - - if(CanSummonChenying()) - return false; - - if(CanActivateYaziDestruction()) - return false; - - if(Enemy.GetMonsters().Count == 0) - return false; - - ClientCard target = SelectAnEnemyCardForRemoval(); - if(target == null) - return false; - - AI.SelectCard(target); - - VishudaActivated |= ActivatedEffect.Second; - return true; - } - - #endregion Vishuda Code - - #region Adhara Code - - private bool SummonAdhara() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(ShouldActivateGraveAshuna()) - return false; - - if(NormalSummonUsed) - return false; - - if(!Bot.HasInMonstersZone(CardId.TenyiVishuda)) - return false; - - NormalSummonUsed = true; - return true; - } - - private bool SpecialSummonAdhara() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(HasEffectMonster()) - return false; - - if(AdharaActivated.HasFlag(ActivatedEffect.First)) - return false; - - bool ashunaReady = !AshunaActivated.HasFlag(ActivatedEffect.Second) && Bot.HasInGraveyard(CardId.TenyiAshuna); - bool vesselReady = !VesselActivated.HasFlag(ActivatedEffect.First) && Bot.HasInHand(CardId.VesselForDragonCycle); - - // Always activate if able if there is a Ashuna in grave or Vessel in hand - if(ashunaReady || vesselReady) { - AdharaActivated |= ActivatedEffect.First; - return true; - } - - if(!AshunaActivated.HasFlag(ActivatedEffect.First) && Bot.HasInHand(CardId.TenyiAshuna)) - return false; - - // Moye combo is better - if(Bot.Hand.ContainsCardWithId(CardId.SwordsoulMoYe) && SoulswordMaterialCountInHand() == 2) - return false; - - // Longyuan combo is better - if(Bot.Hand.ContainsCardWithId(CardId.SwordsoulLongYuan) && SoulswordMaterialCountInHand() == 2) - return false; - - // Ecclesia combo is better - if(Bot.Hand.ContainsCardWithId(CardId.IncredibleEcclesia)) - return false; - - AdharaActivated |= ActivatedEffect.First; - return true; - } - - private bool ActivateGraveAdhara() { - if(!Card.Location.HasFlag(CardLocation.Grave)) - return false; - - if(!HasNonEffectMonster()) - return false; - - if(AdharaActivated.HasFlag(ActivatedEffect.Second)) - return false; - - ClientCard moye = Bot.Banished.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulMoYe)); - if(!NormalSummonUsed && moye != null && MoYeActivated.HasFlag(ActivatedEffect.First)) { - AdharaActivated |= ActivatedEffect.Second; - AI.SelectCard(moye); - return true; - } - - ClientCard taia = Bot.Banished.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulTaia)); - if(!NormalSummonUsed && taia != null && TaiaActivated.HasFlag(ActivatedEffect.First)) { - AdharaActivated |= ActivatedEffect.Second; - AI.SelectCard(taia); - return true; - } - - ClientCard longyuan = Bot.Banished.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulLongYuan)); - if(longyuan != null && LongYuanActivated.HasFlag(ActivatedEffect.First)) { - AdharaActivated |= ActivatedEffect.Second; - AI.SelectCard(longyuan); - return true; - } - - return false; - } - - #endregion Adhara Code - - #region Monk Code - - private bool SpecialSummonMonk() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; - - if(!ShouldSpecialSummonMonk()) - return false; - - return true; - } - - private bool ShouldSpecialSummonMonk() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.TenyiMonk)) - return false; - - int[] monkMaterial = new int[] { - CardId.TenyiAshuna, - CardId.TenyiVishuda, - CardId.TenyiAdhara - }; - - if(!Bot.MonsterZone.IsExistingMatchingCard(card => monkMaterial.Contains(card.Id))) - return false; - - if(Bot.HasInMonstersZone(CardId.TenyiMonk)) - return false; - - if(Bot.HasInMonstersZone(CardId.YangZingBaxia)) - return false; - - return true; - } - - #endregion Monk Code - - #region Draco Beserker Code - - private bool SummonDraco() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; - - if(!ShouldSpecialSummonDraco()) - return false; - - return true; - } - - private bool ShouldSpecialSummonDraco() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.TenyiDracoBeserker)) - return false; - - if(ShouldSpecialSummonMonk()) - return false; - - if(ShouldSummonDragnite()) - return false; - - if(ShouldSummonChixiao()) - return false; - - if(GetSynchroMaterials(TargetSynchroLevel.Level_8_Swordsoul) == null) - return false; - - return true; - } - - #endregion Monk Code - - #region Ecclesia Code - - private bool SpecialSummonEcclesia() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(!ShouldSpecialSummonEcclesia()) - return false; - - EcclesiaActivated |= ActivatedEffect.First; - return true; - } - - private bool SummonEcclesia() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(ShouldActivateGraveAshuna() && !HasEffectMonster()) - return false; - - if(ShouldSummonBaronne()) - return false; - - if(ShouldSummonRuddyRose()) - return false; - - if(NormalSummonUsed) - return false; - - if(CanActivateYaziDestruction()) - return false; - - if(ShouldSummonYazi()) - return false; - - if(ShouldSummonBlackRose()) - return false; - - if(Bot.HasInHand(CardId.SwordsoulMoYe) && CanActivateMoYeFromHand()) - return false; - - if(!EcclesiaActivated.HasFlag(ActivatedEffect.First) && Enemy.GetMonsterCount() > Bot.GetMonsterCount()) - return false; - - if(EcclesiaActivated.HasFlag(ActivatedEffect.Second)) - return false; - - NormalSummonUsed = true; - return true; - } - - private bool ShouldSpecialSummonEcclesia() { - if(Enemy.GetMonsterCount() <= Bot.GetMonsterCount()) - return false; - - if(ShouldActivateGraveAshuna()) - return false; - - if(ShouldSummonBaronne()) - return false; - - if(ShouldSummonRuddyRose()) - return false; - - if(CanActivateYaziDestruction()) - return false; - - if(ShouldSummonYazi()) - return false; - - if(ShouldSummonBlackRose()) - return false; - - if(EcclesiaActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(EcclesiaActivated.HasFlag(ActivatedEffect.Second)) - return false; - - if(!Bot.Hand.ContainsCardWithId(CardId.IncredibleEcclesia)) - return false; - - return true; - } - - private bool ActivateEcclesiaSearch() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(Bot.Deck.Count == 0) - return false; - - if(EcclesiaActivated.HasFlag(ActivatedEffect.Second)) - return false; - - EcclesiaActivated |= ActivatedEffect.Second; - return true; - } - - private ClientCard EcclesiaSearchSelection(IList cards) { - if(cards.ContainsCardWithId(CardId.SwordsoulTaia) && CanActivateTaiaFromHand()) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulTaia)); - - if(cards.ContainsCardWithId(CardId.SwordsoulMoYe) && HasSoulswordMaterialInHand()) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulMoYe)); - - if(cards.ContainsCardWithId(CardId.SwordsoulTaia)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulTaia)); - - if(cards.ContainsCardWithId(CardId.SwordsoulLongYuan)) { - AI.SelectPosition(CardPosition.Defence); - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulLongYuan)); - } - - if(cards.Count > 0) - return cards[Rand.Next(cards.Count)]; - - return null; - } - - #endregion - - #region Chengying Code - - private bool SummonChengying() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; - - if(!CanSummonChenying()) - return false; - - AI.SelectMaterials(GetSynchroMaterials(TargetSynchroLevel.Level_10)); - return true; - } - - private bool CanSummonChenying() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.SwordsoulChengying)) - return false; - - if(ShouldSummonBaronne()) - return false; - - if(ShouldSummonRuddyRose()) - return false; - - if(GetSynchroMaterials(TargetSynchroLevel.Level_10) == null) - return false; - - return true; - } - - private bool ActivateChengyingEffects() { - if(Card.IsDisabled()) - return false; - - // always activate either of Chegnying effects - return Card.Location.HasFlag(CardLocation.MonsterZone); - } - - private List SelectChengyingTargets(IList cards) { - if(cards.Count == 0) - return null; - - if(cards[0].Location.HasFlag(CardLocation.Grave) && cards[0].Owner == 0) - return SelectChengyingAvoid(cards); - - return SelectChengyingBanish(cards); - } - - private List SelectChengyingAvoid(IList cards) { - if(cards.Count == 0) - return null; - - // blackout is just good to remove - if(cards.ContainsCardWithId(CardId.SwordsoulBlackout)) - return new List() { cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulBlackout)) }; - - // these don't do much so we can remove - int[] preferRemoving = new int[] { - CardId.PotOfDesires, - CardId.ForbiddenChalice, - CardId.InfiniteImpermanence, - CardId.VesselForDragonCycle, - CardId.SwordsoulEmergence, - CardId.SwordsoulSummit - }; - - ClientCard preferredRemove = cards.GetFirstMatchingCard(card => preferRemoving.Contains(card.Id)); - if(preferredRemove != null) - return new List() { preferredRemove }; - - // we don't have great options, just avoid these cards - int[] avoidRemoving = new int[] { - CardId.TenyiAdhara, - CardId.TenyiAshuna, - CardId.TenyiVishuda, - CardId.SwordsoulMoYe, - CardId.SwordsoulTaia, - CardId.SwordsoulChengying, - CardId.SwordsoulChixiao - }; - - preferredRemove = cards.GetFirstMatchingCard(card => !avoidRemoving.Contains(card.Id)); - if(preferredRemove != null) - return new List() { preferredRemove }; - - ChengyingActivated |= ActivatedEffect.First; - - return null; - } - - private List SelectChengyingBanish(IList cards) { - if(cards.Count == 0) - return null; - - ClientCard card = SelectAnEnemyCardForRemoval(); - if(card == null) - return null; - - ChengyingActivated |= ActivatedEffect.Second; - return new List() { card }; - } - - #endregion Chengying - - #region Chixiao Code - - private bool SummonChixiao() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; - - if(!ShouldSummonChixiao()) - return false; - - List targets = GetSynchroMaterials(TargetSynchroLevel.Level_8_Swordsoul); - if(targets != null) { - AI.SelectMaterials(targets); - return true; - } - - targets = GetSynchroMaterials(TargetSynchroLevel.Level_8_Tenki); - if(targets != null) { - AI.SelectMaterials(targets); - return true; - } - - return false; - } - - private bool ShouldSummonChixiao() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.SwordsoulChixiao)) - return false; - - if(ChixiaoActivated.HasFlag(ActivatedEffect.First)) - return false; - - bool hasSwordsoulMats = GetSynchroMaterials(TargetSynchroLevel.Level_8_Swordsoul) != null; - bool hasTenkiMats = GetSynchroMaterials(TargetSynchroLevel.Level_8_Tenki) != null && !Bot.ExtraDeck.ContainsCardWithId(CardId.YangZingBaxia); - if(!hasSwordsoulMats && !hasTenkiMats) - return false; - - return true; - } - - private bool ActivateChixiaoSearch() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(!InPostSummonEffect(CardId.SwordsoulChixiao)) - return false; - - if(Bot.Deck.Count == 0) - return false; - - if(ChixiaoActivated.HasFlag(ActivatedEffect.First)) - return false; - - ChixiaoActivated |= ActivatedEffect.First; - return true; - } - - private bool ActivateChixiaoNegate() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(InPostSummonEffect(CardId.SwordsoulChixiao)) - return false; - - if(Enemy.GetMonsters().Count == 0) - return false; - - if(ChixiaoActivated.HasFlag(ActivatedEffect.Second)) - return false; - - ClientCard cost = null; - - if(Bot.HasInGraveyard(CardId.SwordsoulBlackout)) - cost = Bot.Graveyard.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulBlackout)); - - if(cost == null && Bot.HasInGraveyard(CardId.SwordsoulEmergence)) - cost = Bot.Graveyard.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulEmergence)); - - if(cost == null && Bot.HasInGraveyard(CardId.SwordsoulTaia)) - cost = Bot.Graveyard.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulTaia)); - - if(cost == null) { - IList possibleCost = Bot.Graveyard.GetMatchingCards(card => Wyrms.Contains(card.Id)); - if(possibleCost.Count > 0) - cost = possibleCost[Rand.Next(possibleCost.Count)]; - } - - if(cost == null) { - IList possibleCost = Bot.Hand.GetMatchingCards(card => Wyrms.Contains(card.Id)); - if(possibleCost.Count > 0) - cost = possibleCost[Rand.Next(possibleCost.Count)]; - } - - if(cost == null) - return false; - - AI.SelectCard(cost); - - if(!MonsterNegateNext()) - return false; - - ChixiaoActivated |= ActivatedEffect.Second; - return true; - } - - private ClientCard ChixiaoSearchSelection(IList cards) { - AI.SelectOption(0); - - if(NormalSummonUsed && Bot.HasInMonstersZone(CardId.TenyiMonk) && !Bot.HasInHand(CardId.SwordsoulBlackout)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulBlackout)); - - if(NormalSummonUsed && Bot.HasInMonstersZone(CardId.SwordsoulChengying) && !Bot.HasInHand(CardId.SwordsoulBlackout)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulBlackout)); - - // extenders - bool hasActivateableLongyuan = !LongYuanActivated.HasFlag(ActivatedEffect.First) && Bot.HasInHand(CardId.SwordsoulLongYuan) && HasSoulswordMaterialInHand(CardId.SwordsoulLongYuan); - bool isDeckLonyaunActivatable = !LongYuanActivated.HasFlag(ActivatedEffect.First) && cards.ContainsCardWithId(CardId.SwordsoulLongYuan) && HasSoulswordMaterialInHand(); - if(isDeckLonyaunActivatable && !hasActivateableLongyuan) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulLongYuan)); - - if(!Bot.HasInHand(CardId.SwordsoulSummit) && cards.ContainsCardWithId(CardId.SwordsoulSummit) && GetBestSummitTargetInGrave().ShouldSearch) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulSummit)); - - if(!Bot.HasInHand(CardId.SwordsoulMoYe) && cards.ContainsCardWithId(CardId.SwordsoulMoYe) && CanActivateMoYeFromDeck() && !NormalSummonUsed) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulMoYe)); - - if(!Bot.HasInHand(CardId.SwordsoulTaia) && cards.ContainsCardWithId(CardId.SwordsoulTaia) && CanActivateTaiaFromHand() && !NormalSummonUsed) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulTaia)); - - // any other target - if(cards.ContainsCardWithId(CardId.SwordsoulBlackout)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulBlackout)); - - if(cards.ContainsCardWithId(CardId.SwordsoulSummit)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulBlackout)); - - if(cards.ContainsCardWithId(CardId.SwordsoulLongYuan)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulLongYuan)); - - if(cards.ContainsCardWithId(CardId.SwordsoulMoYe)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulMoYe)); - - if(cards.ContainsCardWithId(CardId.SwordsoulTaia)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulTaia)); - - if(cards.ContainsCardWithId(CardId.SwordsoulSummit)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulSummit)); - - if(cards.Count > 0) - return cards[Rand.Next(cards.Count)]; - - return null; - } - - #endregion Chixiao - - #region Longyaun Code - - private bool ActivateLongYuanSummon() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(Card.IsDisabled()) - return false; - - if(LongYuanActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(Bot.HasInMonstersZone(CardId.SwordsoulLongYuan)) - return false; - - if(!HasSoulswordMaterialInHand(CardId.SwordsoulLongYuan)) - return false; - - if(EmptyMainMonsterZones() < 2) - return false; - - if(ShouldSpecialSummonEcclesia()) - return false; - - if(CanActivateTaiaFromField()) - return false; - - if(ShouldSummonYazi()) - return false; - - if(ShouldSummonChixiao()) - return false; - - if(CanActivateYaziDestruction()) - return false; - - if(ShouldSummonBlackRose()) - return false; - - if(ShouldSpecialSummonMonk()) - return false; - - if(CanSummonChaoFeng()) - return false; - - if(ShouldSummonBaxia()) - return false; - - List priorityOfDiscards = new List(); - priorityOfDiscards.Add(CardId.SwordsoulLongYuan); - - if(NormalSummonUsed || MoYeActivated.HasFlag(ActivatedEffect.First)) - priorityOfDiscards.Add(CardId.SwordsoulMoYe); - - if(NormalSummonUsed || TaiaActivated.HasFlag(ActivatedEffect.First)) - priorityOfDiscards.Add(CardId.SwordsoulTaia); - - priorityOfDiscards.AddRange(Tenyis); - priorityOfDiscards.AddRange(SwordSouls); - priorityOfDiscards.AddRange(Wyrms); - - AI.SelectPosition(CardPosition.Defence); - AI.SelectCard(priorityOfDiscards); - AI.SelectYesNo(true); - - LongYuanActivated |= ActivatedEffect.First; - return true; - } - - private bool ActivateLongyuanDamage() { - if(!Card.Location.HasFlag(CardLocation.Grave)) - return false; - - if(Card.IsDisabled()) - return false; - - if(LongYuanActivated.HasFlag(ActivatedEffect.Second)) - return false; - - LongYuanActivated |= ActivatedEffect.Second; - return true; - } - - #endregion - - #region Taia Code - - private bool ActivateTaiaSummon() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(!CanActivateTaiaFromField()) - return false; - - if(Bot.HasInGraveyard(CardId.SwordsoulEmergence)) { - AI.SelectCard(CardId.SwordsoulEmergence); - TaiaActivated |= ActivatedEffect.First; - return true; - } - - if(Bot.HasInGraveyard(CardId.SwordsoulSummit)) { - AI.SelectCard(CardId.SwordsoulEmergence); - TaiaActivated |= ActivatedEffect.First; - return true; - } - - if(Bot.HasInGraveyard(CardId.SwordsoulBlackout)) { - AI.SelectCard(CardId.SwordsoulBlackout); - TaiaActivated |= ActivatedEffect.First; - return true; - } - - if(Bot.HasInGraveyard(CardId.SwordsoulTaia)) { - AI.SelectCard(CardId.SwordsoulTaia); - TaiaActivated |= ActivatedEffect.First; - return true; - } - - if(!Bot.HasInGraveyard(Wyrms)) - return false; - - int[] goodTenyis = new int[] { - CardId.TenyiAdhara, - CardId.TenyiAshuna, - CardId.TenyiVishuda - }; - - IOrderedEnumerable possibilities = Bot.Graveyard.GetMatchingCards(card => card.HasRace(CardRace.Wyrm) && !goodTenyis.Contains(card.Id)).OrderBy(card => card.Attack); - if(possibilities.Count() > 0) - AI.SelectCard(possibilities.First()); - - TaiaActivated |= ActivatedEffect.First; - return true; - } - - private bool ActivateTaiaMill() { - if(!Card.Location.HasFlag(CardLocation.Grave)) - return false; - - if(Card.IsDisabled()) - return false; - - TaiaActivated |= ActivatedEffect.Second; - return true; - } - - private ClientCard TaiaMillSelection(IList cards) { - if(cards.Count == 0) - return null; - - if(cards.ContainsCardWithId(CardId.SwordsoulMoYe)) { - if(ShouldSummonDragnite() || Bot.HasInMonstersZone(CardId.AdamancipatorDragnite)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulMoYe)); - - if(!Bot.HasInGraveyard(CardId.SwordsoulMoYe)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulMoYe)); - } - - bool canSeedVishuda = !Bot.HasInGraveyard(CardId.TenyiVishuda) && cards.ContainsCardWithId(CardId.TenyiVishuda); - bool canActivateVishuda = VishudaActivated.HasFlag(ActivatedEffect.Second) && Enemy.GetMonsters().Count > 0; - if(canSeedVishuda && canActivateVishuda) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiVishuda)); - - bool canSeedAshuna = !Bot.HasInGraveyard(CardId.TenyiAshuna) && cards.ContainsCardWithId(CardId.TenyiAshuna); - bool canActivateAshuna = AshunaActivated.HasFlag(ActivatedEffect.Second); - if(canSeedAshuna && canActivateAshuna) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAshuna)); - - bool canSeedAdhara = !Bot.HasInGraveyard(CardId.TenyiAdhara) && cards.ContainsCardWithId(CardId.TenyiAdhara); - bool canActivateAdhara = AdharaActivated.HasFlag(ActivatedEffect.Second); - if(canSeedAdhara && canActivateAdhara) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAdhara)); - - if(cards.ContainsCardWithId(CardId.SwordsoulMoYe)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulMoYe)); - - return cards[Rand.Next(cards.Count)]; - } - - private bool CanActivateTaiaFromHand() { - if(TaiaActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(!Bot.HasInGraveyard(SwordSouls) && !Bot.HasInGraveyard(Wyrms)) - return false; - - if(EmptyMainMonsterZones() < 2) - return false; - - return true; - } - - private bool CanActivateTaiaFromGrave() { - if(TaiaActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(!Bot.Graveyard.IsExistingMatchingCard(card => SwordSouls.Contains(card.Id) || Wyrms.Contains(card.Id), 2)) - return false; - - if(EmptyMainMonsterZones() < 2) - return false; - - return true; - } - - private bool SummonTaia() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(ShouldSpecialSummonEcclesia()) - return false; - - if(ShouldActivateGraveAshuna()) - return false; - - if(ShouldSummonBaronne()) - return false; - - if(ShouldSummonRuddyRose()) - return false; - - if(NormalSummonUsed) - return false; - - if(!CanActivateTaiaFromHand()) - return false; - - if(CanActivateYaziDestruction()) - return false; - - if(ShouldSummonYazi()) - return false; - - if(ShouldSummonBlackRose()) - return false; - - NormalSummonUsed = true; - return true; - } - - private bool CanActivateTaiaFromField() { - if(!Bot.HasInMonstersZone(CardId.SwordsoulTaia)) - return false; - - if(TaiaActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(!Bot.HasInGraveyard(SwordSouls) && !Bot.HasInGraveyard(Wyrms)) - return false; - - if(EmptyMainMonsterZones() == 0) - return false; - - return true; - } - - #endregion Taia - - #region Moye Code - - private bool SummonMoYe() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(ShouldActivateGraveAshuna()) - return false; - - if(ShouldSummonBaronne()) - return false; - - if(ShouldSummonRuddyRose()) - return false; - - if(ShouldSpecialSummonEcclesia()) - return false; - - if(NormalSummonUsed) - return false; - - if(!CanActivateMoYeFromHand()) - return false; - - if(CanActivateYaziDestruction()) - return false; - - if(ShouldSummonBlackRose()) - return false; - - if(ShouldSummonYazi()) - return false; - - NormalSummonUsed = true; - return true; - } - - private bool ActivateMoYeSummon() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(!CanActivateMoYeFromHand()) - return false; - - AI.SelectCard(CardLocation.Hand); - - MoYeActivated |= ActivatedEffect.First; - return true; - } - - private bool ActivateMoYeDraw() { - if(!Card.Location.HasFlag(CardLocation.Grave)) - return false; - - if(Card.IsDisabled()) - return false; - - if(MoYeActivated.HasFlag(ActivatedEffect.Second)) - return false; - - if(Bot.Deck.Count == 0) - return false; - - MoYeActivated |= ActivatedEffect.Second; - return true; - } - - private bool CanActivateMoYeFromHand() { - if(MoYeActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(!HasSoulswordMaterialInHand(CardId.SwordsoulMoYe)) - return false; - - if(EmptyMainMonsterZones() < 2) - return false; - - return true; - } - - private bool CanActivateMoYeFromDeck() { - if(MoYeActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(!HasSoulswordMaterialInHand()) - return false; - - if(EmptyMainMonsterZones() < 2) - return false; - - return true; - } - - private bool CanActivateMoYeFromSummit() { - if(MoYeActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(!HasSoulswordMaterialInHand(CardId.SwordsoulSummit)) - return false; - - if(EmptyMainMonsterZones() < 2) - return false; - - return true; - } - - #endregion Moye - - #region Emergence Code - - private bool ActivateEmergenceSearch() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(Card.IsDisabled()) - return false; - - if(EmergenceActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(!Bot.HasInHand(CardId.SwordsoulTaia) && !TaiaActivated.HasFlag(ActivatedEffect.First) && !NormalSummonUsed) { - AI.SelectCard(CardId.SwordsoulTaia); - EmergenceActivated |= ActivatedEffect.First; - return true; - } - - if(!Bot.HasInHand(CardId.SwordsoulMoYe) && !MoYeActivated.HasFlag(ActivatedEffect.First) && !NormalSummonUsed) { - AI.SelectCard(CardId.SwordsoulMoYe); - EmergenceActivated |= ActivatedEffect.First; - return true; - } - - if(!Bot.HasInHand(CardId.SwordsoulLongYuan) && !LongYuanActivated.HasFlag(ActivatedEffect.First)) { - AI.SelectCard(CardId.SwordsoulLongYuan); - EmergenceActivated |= ActivatedEffect.First; - return true; + if (hasTaia && noTargetInGrave && hasInExtra && notLongyuan) + { + return true; + } } - return false; } - private bool ActivateEmergencLevelDown() { - if(!Card.Location.HasFlag(CardLocation.Removed)) - return false; - - if(Card.IsDisabled()) - return false; - - if(EmergenceActivated.HasFlag(ActivatedEffect.Second)) - return false; - - if(Enemy.GetFieldCount() == 0) - return false; - - if(!TriggeLevelDownForYazi()) - return false; - - EmergenceActivated |= ActivatedEffect.Second; - return true; - } - - #endregion - - #region Blackout Code - - private bool SetBlackout() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(Bot.GetMonsters().GetMatchingCardsCount(card => card.HasRace(CardRace.Wyrm)) == 0) - return false; - - return DefaultSpellSet(); - } - - private bool BlackoutActivateDestroy() { - if(!Card.Location.HasFlag(CardLocation.SpellZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(Enemy.GetFieldCount() < 2) - return false; - - if(CanSummonChenying()) - return false; - - if(ShouldSummonBaronne()) - return false; - - if(ShouldSummonChixiao()) - return false; - - int[] disallowedTargets = new int[] { - CardId.SwordsoulChixiao, - CardId.TenyiDracoBeserker, - CardId.YangZingChaofeng - }; - - List targets = new List(); - - IList myCard = Bot.MonsterZone.GetMatchingCards(card => Wyrms.Contains(card.Id) && !disallowedTargets.Contains(card.Id)); - if(myCard.Count == 0) - return false; - - if(Bot.HasInMonstersZone(CardId.TenyiAdhara)) - targets.Add(myCard.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAdhara))); - else if(Bot.HasInMonstersZone(CardId.SwordsoulChengying) && !ChengyingActivated.HasFlag(ActivatedEffect.First)) - targets.Add(myCard.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulChengying))); - else - targets.Add(myCard.OrderBy(card => card.Attack).First()); - - ClientCard enemy1 = SelectAnEnemyCardForRemoval(); - if(enemy1 == null) - return false; - - ClientCard enemy2 = SelectAnEnemyCardForRemoval(new List() { enemy1 }); - if(enemy2 == null) - return false; - - targets.Add(enemy1); - targets.Add(enemy2); - - if(targets.Count < 3) - return false; - - AI.SelectCard(targets); - return true; - } - - private bool BlackoutActivateSummon() { - if(Card.IsDisabled()) - return false; - - return Card.Location.HasFlag(CardLocation.Removed); - } - - #endregion - - #region Summit Code - - private bool ActivateSummit() { - if(!Card.Location.HasFlag(CardLocation.Hand)) - return false; - - if(Card.IsDisabled()) - return false; - - if(SummitActivated.HasFlag(ActivatedEffect.First)) - return false; - - SummitTargetResult result = GetBestSummitTargetInGrave(); - if(!result.HasTarget) - return false; - - if(!result.IsPowerful) - return false; - - SummitActivated |= ActivatedEffect.First; - AI.SelectCard(result.Card); - return true; - } - - private bool ActivateSummitLevelDown() { - if(!Card.Location.HasFlag(CardLocation.Removed)) - return false; - - if(Card.IsDisabled()) - return false; - - if(SummitActivated.HasFlag(ActivatedEffect.Second)) - return false; - - if(Enemy.GetFieldCount() == 0) - return false; - - if(!TriggeLevelDownForYazi()) - return false; - - SummitActivated |= ActivatedEffect.Second; - return true; - } - - private SummitTargetResult GetBestSummitTargetInGrave() { - //check powerful cards - if(Bot.HasInGraveyard(CardId.SwordsoulChengying)) - return SummitTargetResult.PowerfulTarget(CardId.SwordsoulChengying); - - if(Bot.HasInGraveyard(CardId.SwordsoulChixiao)) - return SummitTargetResult.PowerfulTarget(CardId.SwordsoulChixiao); - - if(Bot.HasInGraveyard(CardId.SwordsoulTaia) && CanActivateTaiaFromGrave()) - return SummitTargetResult.PowerfulTarget(CardId.SwordsoulTaia); - - if(Bot.HasInGraveyard(CardId.SwordsoulMoYe) && CanActivateMoYeFromSummit()) - return SummitTargetResult.PowerfulTarget(CardId.SwordsoulMoYe); - - bool hasSynchro = Bot.MonsterZone.IsExistingMatchingCard(card => card.HasType(CardType.Synchro) && card.IsFaceup()); - IList possibleCards = Bot.Graveyard.GetMatchingCards(card => { - if(hasSynchro && card.HasRace(CardRace.Wyrm)) - return true; - - if(SwordSouls.Contains(card.Id) && card.IsMonster()) - return true; - - return false; - }); - - if(possibleCards.Count == 0) - return new SummitTargetResult { HasTarget = false }; - - // Get highest attack card - int cardId = possibleCards.OrderByDescending(card => { return card.Attack; }).First().Id; - return new SummitTargetResult { - Card = cardId, - HasTarget = true, - IsPowerful = false + public bool TenyiForShamanSpSummon() + { + List checkEffectDesc = new List{ + Util.GetStringId(CardId.TenyiSpirit_Adhara, 0), Util.GetStringId(CardId.TenyiSpirit_Vishuda, 0), + Util.GetStringId(CardId.TenyiSpirit_Ashuna, 0) }; - } - - private class SummitTargetResult { - public bool HasTarget { get; set; } - public int Card { get; set; } - public bool IsPowerful { get; set; } - - public bool ShouldSearch => HasTarget && IsPowerful; - - public static SummitTargetResult PowerfulTarget(int cardId) { - return new SummitTargetResult { - Card = cardId, - HasTarget = true, - IsPowerful = true - }; - } - } - - #endregion Summit Code - - #region Baxia Code - - private bool SummonBaxia() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; - - if(!ShouldSummonBaxia()) - return false; - - List materials = GetSynchroMaterials(TargetSynchroLevel.Level_8_Tenki); - if(materials == null) - return false; - - AI.SelectMaterials(materials); - return true; - } - - private bool ShouldSummonBaxia() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.YangZingBaxia)) - return false; - - if(GetSynchroMaterials(TargetSynchroLevel.Level_8_Tenki) == null) - return false; - - return true; - } - - private bool BaxiaActivatedShuffle() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(BaxiaActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(!InPostSummonEffect(CardId.YangZingBaxia)) - return false; - - List targets = new List(); - ClientCard target1 = SelectAnEnemyCardForRemoval(); - if(target1 != null) - targets.Add(target1); - - ClientCard target2 = SelectAnEnemyCardForRemoval(new List() { target1 }); - if(target2 != null) - targets.Add(target2); - - BaxiaActivated |= ActivatedEffect.First; - - if(targets.Count == 0) { - AI.SelectCard(new int[0]); + if (!checkEffectDesc.Contains((int)ActivateDescription) || summoned || !Bot.HasInExtra(CardId.ShamanOfTheTenyi) + || (CheckAtAdvantage() && enemyActivateMaxxC)) + { return false; } - - AI.SelectCard(targets); - AI.SelectYesNo(true); - return true; - } - - private bool BaxiaActivatedRevive() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(!BaxiaActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(BaxiaActivated.HasFlag(ActivatedEffect.Second)) - return false; - - if(!Bot.HasInMonstersZone(CardId.TenyiMonk)) - return false; - - if(!Bot.HasInGraveyard(CardId.TenyiAdhara)) - return false; - - ClientCard monk = Bot.MonsterZone.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiMonk)); - ClientCard adhara = Bot.Graveyard.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAdhara)); - AI.SelectCard(monk); - AI.SelectNextCard(adhara); - - BaxiaActivated |= ActivatedEffect.Second; - return true; - } - - #endregion Baxia Code - - #region Ruddy Rose Code - - private bool SummonRuddyRose() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; - - if(!ShouldSummonRuddyRose()) - return false; - - AI.SelectMaterials(GetSynchroMaterials(TargetSynchroLevel.Level_10)); - return true; - } - - private bool ShouldSummonRuddyRose() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.RuddyRoseDragon)) - return false; - - if(Enemy.Graveyard.Count < 10) - return false; - - if(AshunaActivated.HasFlag(ActivatedEffect.First)) - return false; - - if(GetSynchroMaterials(TargetSynchroLevel.Level_10) == null) - return false; - - return true; - } - - private bool ActivateRuddyRoseBanish() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(!InPostSummonEffect(CardId.RuddyRoseDragon)) - return false; - - return true; - } - - private bool ActivateRuddyRoseNegate() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(Util.GetLastChainCard() == null) - return false; - - AI.SelectYesNo(true); - return DefaultTrap(); - } - - #endregion Ruddy Rose Code - - #region Baronne Code - - private bool SummonBaronne() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; - - if(ShouldSummonRuddyRose()) - return false; - - if(!ShouldSummonBaronne()) - return false; - - AI.SelectMaterials(GetSynchroMaterials(TargetSynchroLevel.Level_10)); - return true; - } - - private bool ShouldSummonBaronne() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.BaronneDeFluer)) - return false; - - if(Enemy.GetFieldCount() == 0 && !Bot.HasInMonstersZone(CardId.SwordsoulChengying)) - return false; - - if(AshunaActivated.HasFlag(ActivatedEffect.Second)) - return false; - - if(GetSynchroMaterials(TargetSynchroLevel.Level_10) == null) - return false; - - return true; - } - - private bool ActivateBaronneDestroy() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - bool inMain = Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2; - if(!inMain) - return false; - - if(Util.GetLastChainCard() != null) - return false; - - if(Enemy.GetFieldCount() == 0) + ClientCard toSummonMoye = Bot.Hand.FirstOrDefault(card => card.IsCode(CardId.SwordsoulOfMoYe)); + if (toSummonMoye == null) + { return false; - - if(BaronneActivated.HasFlag(ActivatedEffect.First)) + } + List notRevealCheckList = new List{Card, toSummonMoye}; + if (!SwordsoulOfMoYeEffectCheck(notRevealCheckList) || activatedCardIdList.Contains(CardId.SwordsoulOfMoYe)) + { return false; - - ClientCard target = SelectAnEnemyCardForRemoval(); - if(target == null) + } + if (activatedCardIdList.Contains(CardId.SwordsoulOfTaia) || !Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia)) + { return false; - - BaronneActivated |= ActivatedEffect.First; - AI.SelectCard(target); - return true; - } - - private ClientCard BaronneDestroyTarget(IList cards) { - List targetAttempts = new List(); - for(int i = 0; i < Enemy.GetFieldCount(); i++) { - ClientCard target = SelectAnEnemyCardForRemoval(targetAttempts); - if(target != null && cards.Contains(target)) - return target; - - targetAttempts.Add(target); } - return null; + return true; } - private bool ActivateBaronneNegate() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; - - if(Card.IsDisabled()) - return false; - - if(Util.GetLastChainCard() == null) + public bool TenyiForBlackoutSpSummon() + { + List checkEffectDesc = new List{ + Util.GetStringId(CardId.TenyiSpirit_Adhara, 0), Util.GetStringId(CardId.TenyiSpirit_Vishuda, 0), + Util.GetStringId(CardId.TenyiSpirit_Ashuna, 0) + }; + if (!checkEffectDesc.Contains((int)ActivateDescription)) + { return false; - - if(BaronneActivated.HasFlag(ActivatedEffect.Second)) + } + if (CheckAtAdvantage() && enemyActivateMaxxC) + { return false; - - if(DefaultTrap()) { - BaronneActivated |= ActivatedEffect.Second; + } + if (Bot.HasInHandOrInSpellZone(CardId.SwordsoulBlackout) && !Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasRace(CardRace.Wyrm))) + { return true; } - return false; } - private bool ActivateBaronneRevive() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) + public bool PotOfDesiresActivate() + { + if (CheckWhetherNegated()) + { return false; + } + if (CheckAtAdvantage()) + { + bool result = Bot.Deck.Count() >= 15; + if (result) + { + SelectSTPlace(null, true); + } + return result; + } + SelectSTPlace(null, true); + return true; + } - if(Card.IsDisabled()) - return false; + public bool SwordsoulEmergenceActivate() + { + if (Card.Location == CardLocation.Removed) + { + return SwordsoulSpellBanishedEffect(); + } - if(!BaronneActivated.HasFlag(ActivatedEffect.Second)) - return false; + // Mo Ye + if (!Bot.HasInHand(CardId.SwordsoulOfMoYe) && !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) + && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } - if(Duel.Phase != DuelPhase.Standby) - return false; + // Taia + if (!Bot.HasInHand(CardId.SwordsoulOfTaia) && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) + && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0 && SwordsoulOfTaiaEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } - ClientCard target = Bot.Graveyard.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiDracoBeserker)); - if(target != null) { - AI.SelectCard(target); - BaronneActivated &= ~ActivatedEffect.Second; - BaronneActivated |= ActivatedEffect.Third; + // Longyuan + if (!Bot.HasInHand(CardId.SwordsoulStrategistLongyuan) && !activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) + && CheckRemainInDeck(CardId.SwordsoulStrategistLongyuan) > 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulStrategistLongyuan); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); return true; } - target = Bot.Graveyard.GetFirstMatchingCard(card => card.IsCode(CardId.AdamancipatorDragnite)); - if(target != null) { - AI.SelectCard(target); - BaronneActivated &= ~ActivatedEffect.Second; - BaronneActivated |= ActivatedEffect.Third; + // dump check + if (!Bot.HasInHand(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); return true; } + List checkIdList = new List{CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.SwordsoulStrategistLongyuan}; + foreach (int checkId in checkIdList) + { + if (CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + } return false; } - #endregion Baronne Code - - #region Yazi Code + public bool SwordsoulSacredSummitActivate() + { + if (Card.Location == CardLocation.Removed) + { + return SwordsoulSpellBanishedEffect(); + } + if (CheckAtAdvantage()) + { + if (enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + return false; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + ClientCard taia = Bot.Graveyard.FirstOrDefault(card => card.IsCode(CardId.SwordsoulOfTaia)); + if (taia != null && SwordsoulOfTaiaEffectCheck(taia)) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } + } + } + bool controlSynchro = Bot.GetMonsters().Any(card => card.IsFaceup() && card.HasType(CardType.Synchro)); - private bool SummonYazi() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; + List rebornTargetList = Bot.Graveyard.Where(card => + card.IsMonster() && (card.HasSetcode(SetcodeSwordsoul) || (controlSynchro && card.HasRace(CardRace.Wyrm)))).ToList(); + rebornTargetList.Sort(CardContainer.CompareCardAttack); + rebornTargetList.Reverse(); - if(!ShouldSummonYazi()) - return false; + if (rebornTargetList.Count() > 0) + { + ClientCard rebornTarget = rebornTargetList[0]; + if (rebornTarget.IsCode(CardId.SwordsoulOfMoYe) && (activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) || !SwordsoulOfMoYeEffectCheck())) + { + return false; + } + if (rebornTarget.IsCode(CardId.SwordsoulOfTaia) && activatedCardIdList.Contains(CardId.SwordsoulOfTaia)) + { + return false; + } + AI.SelectCard(rebornTargetList); + activatedCardIdList.Add(Card.Id); + SelectSTPlace(null, true); + return true; + } - AI.SelectMaterials(GetSynchroMaterials(TargetSynchroLevel.Level_7)); - return true; + return false; } - private bool ShouldSummonYazi() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.YangZingYazi)) - return false; + public bool SwordsoulSpellBanishedEffect() + { + // TODO + return false; + } - if(ShouldSummonBlackRose()) + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { return false; + } + if (Duel.LastChainPlayer == 1) + { + // negate + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (CheckCalledbytheGrave(code) > 0) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentNegatingIdList.Add(code); + CheckDeactiveFlag(); + return true; + } + } + + // banish target + foreach (ClientCard cards in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(cards) && cards.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = cards.Id; + AI.SelectCard(cards); + currentNegatingIdList.Add(code); + return true; + } + } - if(GetSynchroMaterials(TargetSynchroLevel.Level_7) == null) - return false; + // become targets + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count() > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentNegatingIdList.Add(code); + return true; + } + } + } - if(Enemy.GetFieldCount() == 0) - return false; + // avoid danger monster in grave + if (Duel.LastChainPlayer == 1) return false; + List targets = CheckDangerousCardinEnemyGrave(true); + if (targets.Count() > 0) { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentNegatingIdList.Add(code); + return true; + } - return true; + return false; } - private bool ActivateYaziDestruction() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) - return false; + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + // negate + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + currentNegatingIdList.Add(code); + CheckDeactiveFlag(); + return true; + } + } + return false; + } - if(Card.IsDisabled()) - return false; + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; - if(!CanActivateYaziDestruction()) - return false; + ClientCard LastChainCard = Util.GetLastChainCard(); - ClientCard target = SelectAnEnemyCardForRemoval(); - if(target == null) - return false; + // negate spells + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ( (this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || Util.IsChainTarget(Card) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + CheckDeactiveFlag(); + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + if (target != null) + { + AI.SelectCard(target); + } else { + AI.SelectCard(Enemy.GetMonsters()); + } + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + + // negate monster + List shouldNegateList = GetMonsterListForTargetNegate(false, true); + if (shouldNegateList.Count() > 0) + { + ClientCard negateTarget = shouldNegateList[0]; + currentNegateMonsterList.Add(negateTarget); + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++ i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(negateTarget); + return true; + } - AI.SelectCard(Card); - AI.SelectNextCard(target); - return true; + return false; } - private bool CanActivateYaziDestruction() { - if(!Bot.HasInMonstersZone(CardId.YangZingYazi)) - return false; - - if(Enemy.GetFieldCount() == 0) - return false; + public bool SwordsoulBlackoutActivate() + { + // sp summon token + if (Card.Location == CardLocation.Removed) + { + AI.SelectPosition(CardPosition.FaceUpDefence); + activatedCardIdList.Add(Card.Id); + return true; + } - return true; - } + // self destroy targer + List selfDestroyList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasRace(CardRace.Wyrm)).ToList(); + selfDestroyList.Sort(CardContainer.CompareCardAttack); + ClientCard selfDestroyTarget = selfDestroyList[0]; + bool selfTargetIsImportant = selfDestroyTarget.HasType(CardType.Synchro); - private bool ActivateYaziSearch() { - if(Card.IsDisabled()) - return false; + // choose Chengying + List chengyingList = Bot.GetMonsters().Where(card => + card.IsCode(CardId.SwordsoulSupremeSovereign_Chengying) && card.IsFaceup() && !card.IsDisabled()).ToList(); + if (chengyingList.Count() > 0 && Bot.Graveyard.Count() > 0) + { + selfDestroyTarget = chengyingList[0]; + selfTargetIsImportant = false; + } + foreach (ClientCard selfCard in selfDestroyList) + { + if (Duel.LastChainTargets.Contains(selfCard)) + { + selfDestroyTarget = selfCard; + selfTargetIsImportant = false; + } + } - return Card.Location.HasFlag(CardLocation.Grave); - } + // destroy problem card + List problemCardList = GetProblematicEnemyCardList(true); + if (problemCardList.Count() >= 2 && Duel.Player == 1) + { + AI.SelectCard(selfDestroyTarget); + AI.SelectNextCard(problemCardList); + return true; + } + + List faceUpEnemyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup()).ToList(); + faceUpEnemyMonsterList.Sort(CardContainer.CompareCardAttack); + faceUpEnemyMonsterList.Reverse(); + if (!selfTargetIsImportant && Duel.Player == 1) + { + // destroy multi monster + if (faceUpEnemyMonsterList.Count() >= 2) + { + AI.SelectCard(selfDestroyTarget); + AI.SelectNextCard(GetNormalEnemyTargetList()); + return true; + } - private ClientCard YaziSearchSelection(IList cards) { - if(cards.Count == 0) - return null; + // destroy card in EP + if (Duel.Phase == DuelPhase.End) + { + AI.SelectCard(selfDestroyTarget); + AI.SelectNextCard(GetNormalEnemyTargetList()); + return true; + } + } - if(!cards[0].Location.HasFlag(CardLocation.Deck)) - return null; + // destroy attack monster + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2 && faceUpEnemyMonsterList.Count() > 0) + { + int botBestAttack = Util.GetBestAttack(Bot); + int enemyBestAttack = faceUpEnemyMonsterList[0].GetDefensePower(); + if (enemyBestAttack >= botBestAttack) + { + AI.SelectCard(selfDestroyTarget); + AI.SelectNextCard(GetNormalEnemyTargetList()); + return true; + } + } - if(CanActivateMoYeFromDeck() && cards.ContainsCardWithId(CardId.SwordsoulMoYe)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulMoYe)); + return false; + } - if(CanActivateTaiaFromHand() && cards.ContainsCardWithId(CardId.SwordsoulTaia)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulTaia)); - if(LongYuanActivated.HasFlag(ActivatedEffect.First) && cards.ContainsCardWithId(CardId.SwordsoulLongYuan)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulLongYuan)); + public bool GeomathmechFinalSigmaSpSummon() + { + if (Bot.GetMonstersExtraZoneCount() > 0) return false; + bool hasFloowandereeze = Enemy.GetMonsters().Any(card => card.HasSetcode(SetcodeFloowandereeze)); + hasFloowandereeze |= Enemy.GetSpells().Any(card => card.HasSetcode(SetcodeFloowandereeze)); + hasFloowandereeze |= Enemy.Graveyard.Any(card => card.HasSetcode(SetcodeFloowandereeze)); + hasFloowandereeze |= Enemy.Banished.Any(card => card.HasSetcode(SetcodeFloowandereeze)); + if (hasFloowandereeze) + { + AI.SelectMaterials(GetSynchroMaterial(12)); + AI.SelectPosition(CardPosition.FaceUpAttack); + return true; + } - return null; + return false; } - private bool TriggeLevelDownForYazi() { - ClientCard selected = Bot.GetMonsters().GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulTaia)); - if(selected == null) - selected = Bot.GetMonsters().GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulMoYe)); - - if(selected == null) - return false; - - // blackrose condition, so we don't care about activations - if(Enemy.GetFieldCount() - Bot.GetFieldCount() >= 2) { - AI.SelectCard(selected); - AI.SelectOption(1); + public bool PsychicEndPunisherSpSummon() + { + List materialList = GetSynchroMaterial(11); + if (materialList.Count() > 1) + { + AI.SelectMaterials(materialList); + AI.SelectPosition(CardPosition.FaceUpAttack); return true; } - bool hasSynchroMaterial = Bot.HasInMonstersZone(CardId.SwordsoulToken) || (Util.GetLastChainCard() != null && Util.GetLastChainCard().Id == CardId.SwordsoulTaia); - if(!hasSynchroMaterial) - return false; + return false; + } - if(selected.Id == CardId.SwordsoulTaia && !CanActivateMoYeFromDeck()) - return false; + /// + /// remove level10 summon filter + /// + public bool Level10SpSummonCheckInit() + { + canSpSummonLevel10IdList.Clear(); + return false; + } + + /// + /// check which level10 monster can be summoned + /// + public bool Level10SpSummonCheckCount() + { + List checkIdList = new List{ + CardId.SwordsoulSupremeSovereign_Chengying, CardId.SwordsoulSinisterSovereign_QixingLongyuan, CardId.BaronneDeFleur + }; + foreach (int checkId in checkIdList) + { + if (Card.IsCode(checkId)) + { + canSpSummonLevel10IdList.Add(checkId); + } + } + return false; + } - if(selected.Id == CardId.SwordsoulMoYe && !CanActivateTaiaFromHand()) + /// + /// decide which level10 monster to summon + /// + public bool Level10SpSummonCheckDecide() + { + if (canSpSummonLevel10IdList.Count <= 1) + { return false; + } + List decideIdList = new List(); - AI.SelectCard(selected); - AI.SelectOption(1); + // BaronneDeFleur + if (canSpSummonLevel10IdList.Contains(CardId.BaronneDeFleur)) + { + // protect maxxc + if (Bot.HasInHand(_CardId.MaxxC)) + { + canSpSummonLevel10IdList.Clear(); + canSpSummonLevel10IdList.Add(CardId.BaronneDeFleur); + return false; + } - return true; - } + // continue to use taia for synchro + ClientCard taia = Bot.Graveyard.FirstOrDefault(card => card.IsCode(CardId.SwordsoulOfTaia)); + if (taia != null && SwordsoulOfTaiaEffectCheck(taia) && Bot.HasInHand(CardId.SwordsoulSacredSummit)) + { + canSpSummonLevel10IdList.Clear(); + canSpSummonLevel10IdList.Add(CardId.BaronneDeFleur); + return false; + } - #endregion Yazi Code + decideIdList.Add(CardId.BaronneDeFleur); + } - #region Chaofeng Code + // QixingLongyuan + if (canSpSummonLevel10IdList.Contains(CardId.SwordsoulSinisterSovereign_QixingLongyuan)) + { + if (CheckAtAdvantage()) + { + decideIdList.Add(CardId.SwordsoulSinisterSovereign_QixingLongyuan); + } + } - private bool SummonChaofeng() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; + // Chengying + if (canSpSummonLevel10IdList.Contains(CardId.SwordsoulSupremeSovereign_Chengying)) + { + int banishCount = Bot.Banished.Count() + Enemy.Banished.Count(); + // use blackout or chixiao to trigger + bool decideFlag = Bot.HasInHandOrInSpellZone(CardId.SwordsoulBlackout) + || Bot.HasInMonstersZone(CardId.SwordsoulGrandmaster_Chixiao, true, false, true); + if (CheckAtAdvantage()) + { + // overkill + if (3000 + banishCount * 100 >= Enemy.LifePoints) + { + decideFlag = true; + } + } else { + ClientCard enemyMonster = GetBestEnemyMonster(true); + if (enemyMonster != null && decideIdList.Count() == 0) + { + // for high-power monster + if (3000 + banishCount * 200 >= enemyMonster.GetDefensePower()) + { + decideFlag = true; + } + } + } - if(!CanSummonChaoFeng()) - return false; + if (decideFlag) + { + decideIdList.Add(CardId.SwordsoulSupremeSovereign_Chengying); + } + } - AI.SelectMaterials(GetSynchroMaterials(TargetSynchroLevel.Level_9)); - return true; + if (decideIdList.Count() > 0) + { + // if multi selections, select randomly + canSpSummonLevel10IdList.Clear(); + int index = Program.Rand.Next(decideIdList.Count()); + int lastDecide = decideIdList[index]; + canSpSummonLevel10IdList.Add(lastDecide); + } + return false; } - private bool ActivateChaofengSearchEffects() { - if(Card.IsDisabled()) - return false; + /// + /// perform level10 monster's synchro summon + /// + public bool Level10SpSummonCheckFinal() + { + if (canSpSummonLevel10IdList.Count() == 1) + { + int finalDecideId = canSpSummonLevel10IdList[0]; + if (Card.IsCode(finalDecideId)) + { + List materialList = GetSynchroMaterial(10, Card.IsCode(CardId.SwordsoulSinisterSovereign_QixingLongyuan)); + if (materialList.Count() > 1) + { + AI.SelectMaterials(materialList); + return true; + } + return true; + } + } - AI.SelectYesNo(true); - return true; + return false; } - private bool CanSummonChaoFeng() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.YangZingChaofeng)) + public bool AdamancipatorRisen_DragiteSpSummon() + { + if (!Bot.HasInMonstersZone(CardId.SwordsoulGrandmaster_Chixiao, true)) + { return false; - - if(GetSynchroMaterials(TargetSynchroLevel.Level_9) == null) + } + bool containWaterMonsterInGY = Bot.Graveyard.Any(card => card.IsMonster() && card.HasAttribute(CardAttribute.Water)); + bool canContainWaterInGY = containWaterMonsterInGY; + canContainWaterInGY |= Bot.GetMonsters().Any(card => card.HasAttribute(CardAttribute.Water) && card.IsFaceup()); + if (!canContainWaterInGY) + { return false; + } + SelectLevel8SynchroMaterial(false, !containWaterMonsterInGY); return true; } - private ClientCard SelectChaofengTarget(IList cards) { - if(cards.Count == 0) - return null; - - if(Card.Location.HasFlag(CardLocation.Grave)) - return SelectChaofengEffectForHand(cards); + public bool DracoBerserkerOfTheTenyiSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + return false; + } - return SelectChaofengEffectForField(cards); + SelectLevel8SynchroMaterial(true); + return true; } - private ClientCard SelectChaofengEffectForHand(IList cards) { - bool canSummonEcclesia = !NormalSummonUsed || !EcclesiaActivated.HasFlag(ActivatedEffect.First); - bool canActivateEcclesia = canSummonEcclesia && !EcclesiaActivated.HasFlag(ActivatedEffect.Second); - bool doesWantEcclesia = Duel.Player == 1 || canActivateEcclesia; - if(cards.ContainsCardWithId(CardId.IncredibleEcclesia) && doesWantEcclesia) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.IncredibleEcclesia)); + public bool SwordsoulGrandmaster_ChixiaoSpSummon() + { + if (CheckAtAdvantage() && enemyActivateLockBird) + { + return false; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulGrandmaster_Chixiao)) + { + SelectLevel8SynchroMaterial(true); + return true; + } - if(cards.ContainsCardWithId(CardId.AshBlossomAndJoyousSpring)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.AshBlossomAndJoyousSpring)); + return false; + } - if(cards.ContainsCardWithId(CardId.TenyiAdhara)) - return cards.GetFirstMatchingCard(card => card.IsCode(CardId.TenyiAdhara)); + public bool BaxiaBrightnessOfTheYangZingSpSummon() + { + if (CheckAtAdvantage()) + { + return false; + } - return null; - } + List problemList = GetProblematicEnemyCardList(true); + if (problemList.Count() > 1 && !activatedCardIdList.Contains(CardId.BaxiaBrightnessOfTheYangZing + 1)) + { + SelectLevel8SynchroMaterial(true); + return true; + } + if (problemList.Count() == 1 && Bot.GetSpellCount() > 0 && !activatedCardIdList.Contains(CardId.BaxiaBrightnessOfTheYangZing + 2)) + { + bool checkFlag = false; + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && SwordsoulOfMoYeEffectCheck() && Bot.HasInGraveyard(CardId.SwordsoulOfMoYe)) + { + checkFlag = true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && Bot.HasInGraveyard(CardId.SwordsoulOfTaia)) + { + checkFlag = true; + } + if (checkFlag) + { + SelectLevel8SynchroMaterial(true); + return true; + } + } - private ClientCard SelectChaofengEffectForField(IList cards) { - // there is no decision to be made here, we have a single valid card of each attribute - return cards[0]; + return false; } - #endregion Chaofeng Code - - #region Dragnite Code - - private bool SummonDragnite() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; + public void SelectLevel8SynchroMaterial(bool needWyrmNonTuner = false, bool needWaterNonTuner = false) + { + List tunerList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.IsTuner() && card.Level < 8).ToList(); + List nonTunerList = Bot.GetMonsters().Where(card => card.IsFaceup() && !card.IsTuner() && card.Level < 8 + && (!needWyrmNonTuner || card.HasRace(CardRace.Wyrm) && (!needWaterNonTuner || card.HasAttribute(CardAttribute.Water)))).ToList(); + tunerList.Sort(CardContainer.CompareCardAttack); + nonTunerList.Sort(CardContainer.CompareCardAttack); + + List materialList = new List(); + foreach (ClientCard tuner in tunerList) + { + materialList.Clear(); + materialList.Add(tuner); + if (tuner.Level == 4) + { + // use moye first + if (activatedCardIdList.Contains(CardId.SwordsoulOfMoYe)) + { + ClientCard moye = nonTunerList.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulOfMoYe)); + if (moye != null) + { + materialList.Add(moye); + AI.SelectMaterials(materialList); + return; + } + } - if(!ShouldSummonDragnite()) - return false; + // use taia + if (activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && !needWaterNonTuner) + { + ClientCard taia = nonTunerList.GetFirstMatchingCard(card => card.IsCode(CardId.SwordsoulOfTaia)); + if (taia != null) + { + materialList.Add(taia); + AI.SelectMaterials(materialList); + return; + } + } + } - AI.SelectMaterials(GetSynchroMaterials(TargetSynchroLevel.Level_8_Swordsoul)); - return true; + foreach (ClientCard nonTuner in nonTunerList) + { + if (tuner.Level + nonTuner.Level == 8) + { + materialList.Add(nonTuner); + AI.SelectMaterials(materialList); + return; + } + } + } } - private bool ShouldSummonDragnite() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.AdamancipatorDragnite)) - return false; - - if(!Bot.HasInMonstersZone(CardId.SwordsoulChixiao)) - return false; - - bool canActivateDragnite = Bot.HasInMonstersZone(CardId.SwordsoulMoYe) || Bot.Graveyard.IsExistingMatchingCard(card => card.HasAttribute(CardAttribute.Water)); - if(!canActivateDragnite) - return false; - - if(AshunaActivated.HasFlag(ActivatedEffect.Second)) + public bool YaziEvilOfTheYangZingSpSummon() + { + if (Enemy.GetMonsterCount() + Enemy.GetSpellCount() == 0) + { return false; + } + bool shouldSummon = GetProblematicEnemyCardList(true, true).Count() > 0; + shouldSummon |= !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 + && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 && SwordsoulOfMoYeEffectCheck(); + shouldSummon |= !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 + && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0; + + if (shouldSummon) + { + List materialList = GetSynchroMaterial(7); + if (materialList.Count() > 1) + { + AI.SelectMaterials(materialList); + return true; + } + } - if(GetSynchroMaterials(TargetSynchroLevel.Level_8_Swordsoul) == null) - return false; + return false; + } - return true; + public List GetSynchroMaterial(int level, bool needWyrmNonTuner = false) + { + List tunerList = Bot.GetMonsters().Where(card => + card.IsFaceup() && card.IsTuner() && !card.HasType(CardType.Xyz | CardType.Link)).ToList(); + List nonTunerList = Bot.GetMonsters().Where(card => + card.IsFaceup() && !card.IsTuner() && !card.HasType(CardType.Xyz | CardType.Link) && (!needWyrmNonTuner || card.HasRace(CardRace.Wyrm))).ToList(); + tunerList.Sort(CardContainer.CompareCardAttack); + nonTunerList.Sort(CardContainer.CompareCardAttack); + List selectList = new List(); + foreach (ClientCard tuner in tunerList) + { + selectList.Clear(); + selectList.Add(tuner); + foreach (ClientCard nonTuner in nonTunerList) + { + if (tuner.Level + nonTuner.Level == level && (nonTuner.IsDisabled() || !nonTuner.HasType(CardType.Synchro))) + { + selectList.Add(nonTuner); + return selectList; + } + } + } + selectList.Clear(); + return selectList; } - private bool ActivateDragniteNegate() { - if(!Card.Location.HasFlag(CardLocation.MonsterZone)) + public bool ShamanOfTheTenyiSpSummon() + { + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + Logger.DebugWriteLine("[Shaman] advantage & maxxc, skip"); return false; - - if(Card.IsDisabled()) + } + // check extra summon + List extraZoneMonsters = Bot.GetMonstersInExtraZone(); + if (extraZoneMonsters.Count() > 0 && extraZoneMonsters.Any(card => card.IsFacedown() || !card.HasType(CardType.Link) || !card.HasRace(CardRace.Wyrm))) + { + Logger.DebugWriteLine("[Shaman] extra zone occupied, skip"); return false; - - if(Util.GetLastChainCard() == null) + } + // check spsummon target + bool hasSpSummonTaret = !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 + && Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia); + hasSpSummonTaret |= !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 + && Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) && SwordsoulOfMoYeEffectCheck(); + hasSpSummonTaret |= Bot.GetGraveyardMonsters().Any(card => card.HasType(CardType.Synchro) && card.IsCanRevive() && card.HasRace(CardRace.Wyrm)); + if (!hasSpSummonTaret) + { + Logger.DebugWriteLine("[Shaman] no target, skip"); return false; + } - return DefaultTrap(); + // select material + List materialList = new List(extraZoneMonsters); + List mainMonsterZoneMonsters = Bot.GetMonstersInMainZone().Where(card => + card.IsFaceup() && !card.HasType(CardType.Synchro) && card.HasRace(CardRace.Wyrm)).ToList(); + mainMonsterZoneMonsters.Sort(CardContainer.CompareCardAttack); + materialList.AddRange(mainMonsterZoneMonsters); + if (materialList.Count() >= 2) + { + AI.SelectMaterials(materialList.GetRange(0, 2)); + return true; + } + + return false; } - #endregion Dragnite Code - - #region Black Rose Code - - private bool SummonBlackRose() { - if(!Card.Location.HasFlag(CardLocation.Extra)) - return false; - - if(!ShouldSummonBlackRose()) - return false; - - AI.SelectMaterials(GetSynchroMaterials(TargetSynchroLevel.Level_7)); - return true; + public bool MonkOfTheTenyiSpSummon() + { + List materialList = Bot.GetMonsters().Where(card => + card.IsFaceup() && !card.HasType(CardType.Synchro | CardType.Link) && card.HasSetcode(SetcodeTenyi)).ToList(); + if (materialList.Count() > 0) + { + materialList.Sort(CardContainer.CompareCardAttack); + AI.SelectMaterials(materialList); + return true; + } + return false; } - private bool ShouldSummonBlackRose() { - if(!Bot.ExtraDeck.ContainsCardWithId(CardId.BlackRoseDragon)) - return false; - if(Enemy.GetFieldCount() - Bot.GetFieldCount() < 2) + public bool PsychicEndPunisherActivate() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + return true; + } + if (Bot.LifePoints <= 1500 || CheckWhetherNegated()) + { return false; - - if(GetSynchroMaterials(TargetSynchroLevel.Level_7) == null) + } + List selfBanishTarget = Bot.GetMonsters().Where(card => card != Card && (card.IsFacedown() || card.GetDefensePower() <= 1000)).ToList(); + if (selfBanishTarget.Count() == 0) + { return false; - + } + selfBanishTarget.Sort(CardContainer.CompareCardAttack); + AI.SelectCard(selfBanishTarget); + AI.SelectNextCard(GetNormalEnemyTargetList(true)); return true; } - private bool ActivateBlackroseDestroy() { - if(!Bot.HasInMonstersZone(CardId.BlackRoseDragon)) - return false; - - if(Card.IsDisabled()) - return false; + public bool SwordsoulSupremeSovereign_ChengyingActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.SwordsoulSupremeSovereign_Chengying, 0) || ActivateDescription == -1) + { + activatedCardIdList.Add(Card.Id); + List banishTargetList = Duel.CurrentChain.Where(card => card.Controller == 1 && card.Location == CardLocation.Grave).ToList(); + banishTargetList.AddRange(CheckDangerousCardinEnemyGrave(false)); + if (banishTargetList.Count() > 0) + { + ClientCard graveTarget = banishTargetList[0]; + Logger.DebugWriteLine("Chengying banish grave: " + graveTarget?.Name); + } + List fieldTargetList = GetNormalEnemyTargetList(); + if (fieldTargetList.Count() > 0) + { + ClientCard fieldTarget = fieldTargetList[0]; + Logger.DebugWriteLine("Chengying banish field: " + fieldTarget?.Name); + } + banishTargetList.AddRange(fieldTargetList); + AI.SelectCard(banishTargetList); - if(Enemy.GetFieldCount() - Bot.GetFieldCount() < 3) - return false; + } else if (ActivateDescription == hintReplaceDestroy) + { + List removeCardIdList = new List{ + _CardId.CalledByTheGrave, CardId.CrossoutDesignator, _CardId.InfiniteImpermanence, _CardId.AshBlossom, + _CardId.MaxxC, _CardId.EffectVeiler, CardId.MonkOfTheTenyi, CardId.ShamanOfTheTenyi, CardId.SwordsoulGrandmaster_Chixiao, + CardId.SwordsoulOfTaia, CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfMoYe + }; + AI.SelectCard(removeCardIdList); + } else + { + Logger.DebugWriteLine("Chengying desc: " + ActivateDescription.ToString()); + } return true; } - #endregion Black Rose Code - - #region Utils - - private bool InPostSummonEffect(int cardId) { - IList summons = Util.Duel.LastSummonedCards; - if(summons.Count == 0) - return false; + public bool BaronneDeFleurActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.BaronneDeFleur, 1)) + { + // negate + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1) + { + ClientCard lastChainCard = Util.GetLastChainCard(); + if (CheckAtAdvantage() && lastChainCard.IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainTargets.Contains(Card) && lastChainCard.IsCode(_CardId.EffectVeiler, _CardId.InfiniteImpermanence, _CardId.BreakthroughSkill)) + { + return false; + } + } + CheckDeactiveFlag(); + effectUsedBaronneDeFleurList.Add(Card); + return true; + } else if (Duel.Phase == DuelPhase.Standby) + { + // special summon after effect used + if (effectUsedBaronneDeFleurList.Contains(Card) && !CheckWhetherNegated()) + { + if (Duel.Player == 1) + { + if (!Bot.HasInMonstersZone(CardId.SwordsoulGrandmaster_Chixiao) && Bot.HasInGraveyard(CardId.SwordsoulGrandmaster_Chixiao)) + { + AI.SelectCard(CardId.SwordsoulGrandmaster_Chixiao); + return true; + } + } else if (GetProblematicEnemyCardList(true, true).Count() > 0) + { + return false; + } else if (CheckAtAdvantage()) { + if (Bot.ExtraDeck.Any(card => card.IsFacedown() && card.HasType(CardType.Synchro) && card.Level == 8)) + { + if (Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) && SwordsoulOfMoYeEffectCheck() && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + return true; + } + if (CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + ClientCard taia = Bot.Graveyard.FirstOrDefault(card => card.IsCode(CardId.SwordsoulOfTaia)); + if (taia != null && SwordsoulOfTaiaEffectCheck(taia)) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + return true; + } + } + } + } + } + } else { + // destroy + List targetList = GetNormalEnemyTargetList(); + if (targetList.Count() > 0) + { + AI.SelectCard(targetList); + return true; + } + } - ClientCard card = summons.Last(); - return card.IsCode(cardId) && card.Owner == 0; + return false; } - private bool HasSoulswordMaterialInHand(int activedSoulsword) { - // If there is more than one then we can activate just fine - if(Bot.Hand.IsExistingMatchingCard(card => card.IsCode(activedSoulsword), 2)) + public bool SwordsoulSinisterSovereign_QixingLongyuanActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.SwordsoulSinisterSovereign_QixingLongyuan, 0)) + { + // draw return true; - - if(Bot.Hand.IsExistingMatchingCard(card => !card.IsCode(activedSoulsword) && card.IsCode(Wyrms))) + } else if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SwordsoulSinisterSovereign_QixingLongyuan, 1)) + { + // remove monster return true; + } else if (ActivateDescription == Util.GetStringId(CardId.SwordsoulSinisterSovereign_QixingLongyuan, 2)) + { + // remove spell/trap + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.Controller == 1) + { + bool activateFlag = DefaultOnBecomeTarget(); + activateFlag |= Enemy.LifePoints <= 1200; + activateFlag |= lastChainCard.HasType(CardType.Continuous | CardType.Equip | CardType.Field | CardType.Pendulum); + if (activateFlag) + { + return true; + } + } + } else + { + Logger.DebugWriteLine("qixinglongyuan desc: " + ActivateDescription); + } - return Bot.Hand.IsExistingMatchingCard(card => !card.IsCode(activedSoulsword) && card.IsCode(SwordSouls)); - } - - private bool HasSoulswordMaterialInHand() { - return SoulswordMaterialCountInHand() > 0; + return false; } - private int SoulswordMaterialCountInHand() { - return Bot.Hand.GetMatchingCardsCount(card => SwordSouls.Contains(card.Id) || card.HasRace(CardRace.Wyrm)); - } + public bool AdamancipatorRisen_DragiteActivate() + { + // bounce + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.AdamancipatorRisen_Dragite, 0)) + { + if (CheckWhetherNegated()) + { + return false; + } + if (CheckRemainInDeck(CardId.NibiruThePrimalBeing) > 0 && (Enemy.GetMonsterCount() + Enemy.GetSpellCount() > 0)) + { + AI.SelectCard(GetNormalEnemyTargetList(false)); + return true; + } + return false; + } + + // negate + if (CheckWhetherNegated()) + { + return false; + } - private int EmptyMainMonsterZones() { - return 5 - Bot.GetMonstersInMainZone().Count; + return true; } - private ClientCard SelectAnEnemyCardForRemoval() { - return SelectAnEnemyCardForRemoval(new List()); + public bool DracoBerserkerOfTheTenyiActivate() + { + // do not banish Nibiru + ClientCard lastChainCard = Util.GetLastChainCard(); + if (lastChainCard != null && lastChainCard.IsCode(CardId.NibiruThePrimalBeing) && lastChainCard.Controller == 1) + { + return false; + } + return true; } - private ClientCard SelectEnemyMonsterForRemoval(List exclude) { - ClientCard bestTarget = Util.GetProblematicEnemyCard(canBeTarget: true); - if(bestTarget != null && bestTarget.IsMonster() && !exclude.Contains(bestTarget)) - return bestTarget; + public bool SwordsoulGrandmaster_ChixiaoActivate() + { + if (ActivateDescription == Util.GetStringId(CardId.SwordsoulGrandmaster_Chixiao, 1)) + { + // negate + if (CheckWhetherNegated()) return false; - IList monsters = Enemy.GetMonsters().GetMatchingCards(card => !card.IsFacedown() && !exclude.Contains(card)); - if(monsters.Count > 0) - return monsters.OrderByDescending(card => card.Attack).First(); + List negateTargetList = new List(); - // facedowns can't be filtered normally, so try again for facedowns - monsters = Enemy.GetMonsters().Where(card => card.IsFacedown() && !exclude.Contains(card)).ToList(); - if(monsters.Count > 0) - return monsters[Rand.Next(monsters.Count)]; + List shouldNegateList = GetMonsterListForTargetNegate(true); + if (shouldNegateList.Count() > 0) + { + ClientCard target = shouldNegateList[0]; + currentNegateMonsterList.Add(target); + negateTargetList.AddRange(shouldNegateList); + } - return null; - } + // negate unbreakable monster + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + bool botCanAttack = Bot.GetMonsters().Any(card => card.IsAttack()); + if (Duel.Player == 0 && botCanAttack) + { + negateTargetList.AddRange(Enemy.GetMonsters().Where(card => card.IsFaceup() && card.IsMonsterDangerous()).ToList()); + } + if (Duel.Player == 1) + { + ClientCard enemyMonster = Enemy.BattlingMonster; + if (enemyMonster != null && enemyMonster.IsMonsterInvincible()) + { + negateTargetList.Add(enemyMonster); + } + } + } - private ClientCard SelectAnEnemyCardForRemoval(List exclude) { - ClientCard bestTarget = Util.GetProblematicEnemyCard(canBeTarget: true); - if(bestTarget != null && !exclude.Contains(bestTarget)) - return bestTarget; + // trigger Chengying + if (Bot.HasInMonstersZone(CardId.SwordsoulSupremeSovereign_Chengying, true, false, true) + && !activatedCardIdList.Contains(CardId.SwordsoulSupremeSovereign_Chengying) && Enemy.Graveyard.Count() > 0) + { + if (GetProblematicEnemyMonster() != null || (Duel.Phase == DuelPhase.End && Duel.Player == 1)) + { + bool triggerFlag = true; + List enemyTargetList = Enemy.GetMonsters().Where(card => + card.IsFaceup() && card.HasType(CardType.Effect) && !card.IsShouldNotBeMonsterTarget() && card.IsShouldNotBeTarget()).ToList(); + if (enemyTargetList.Count() == 0) + { + List botTargetList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasType(CardType.Effect) + && !card.IsDisabled() && card != Card && !card.IsCode(CardId.SwordsoulSupremeSovereign_Chengying)).ToList(); + if (botTargetList.Count() == 0) + { + triggerFlag = false; + } else { + botTargetList.Sort(CardContainer.CompareCardAttack); + enemyTargetList.AddRange(botTargetList); + } + } else { + enemyTargetList.Sort(CardContainer.CompareCardAttack); + enemyTargetList.Reverse(); + } + if (triggerFlag) + { + negateTargetList.AddRange(enemyTargetList); + } + } + } - ClientCard monster = SelectEnemyMonsterForRemoval(exclude); - if(monster != null) - return monster; + if (negateTargetList.Count() > 0) + { + // select banish card + List graveBanishList = Bot.Graveyard.Where(card => card.HasSetcode(SetcodeSwordsoul) || card.HasRace(CardRace.Wyrm)).ToList(); + + if (graveBanishList.Count() > 0) + { + bool selectFlag = false; + // trigger blackout + ClientCard blackOut = graveBanishList.FirstOrDefault(card => card.IsCode(CardId.SwordsoulBlackout)); + if (Duel.Player == 0 && !activatedCardIdList.Contains(CardId.SwordsoulBlackout) && blackOut != null) + { + AI.SelectCard(blackOut); + selectFlag = true; + } + if (!selectFlag) + { + // banish dump card + List checkIdList = new List{ + CardId.SwordsoulEmergence, CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, CardId.SwordsoulStrategistLongyuan, CardId.MonkOfTheTenyi, + CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna + }; + foreach (int checkId in checkIdList) + { + List checkCardList = graveBanishList.Where(card => card.IsCode(checkId)).ToList(); + if (checkCardList.Count() > 1) + { + AI.SelectCard(checkCardList); + selectFlag = true; + break; + } + } + } + if (!selectFlag) + { + // banish exists card + List checkIdList = new List{ + CardId.SwordsoulEmergence, CardId.MonkOfTheTenyi, CardId.ShamanOfTheTenyi, CardId.SwordsoulOfTaia, + CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfMoYe, CardId.TenyiSpirit_Adhara, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna + }; + foreach (int checkId in checkIdList) + { + List checkCardList = graveBanishList.Where(card => card.IsCode(checkId)).ToList(); + if (checkCardList.Count() > 0) + { + AI.SelectCard(checkCardList); + selectFlag = true; + break; + } + } + } + if (!selectFlag) + { + AI.SelectCard(ShuffleCardList(graveBanishList)); + } + } + AI.SelectNextCard(negateTargetList); + activatedCardIdList.Add(Card.Id); + return true; + } - IList spells = Enemy.GetSpells().GetMatchingCards(card => !card.IsFacedown() && !exclude.Contains(card) && !isNonPermamentSpell(card)); - if(spells.Count > 0) - return spells[Rand.Next(spells.Count)]; + } else { + // search + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + if (CheckRemainInDeck(CardId.SwordsoulBlackout) > 0) + { + AI.SelectCard(CardId.SwordsoulBlackout); + activatedCardIdList.Add(Card.Id); + return true; + } - // check the spell facedowns - spells = Enemy.GetSpells().Where(card => !exclude.Contains(card) && card.IsFacedown()).ToList(); - if(spells.Count > 0) - return spells[Rand.Next(spells.Count)]; + List searchIdList = new List{ + CardId.SwordsoulBlackout, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia, CardId.SwordsoulEmergence, + CardId.SwordsoulStrategistLongyuan + }; + foreach (int checkId in searchIdList) + { + if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } - return null; - } + if (CheckAtAdvantage()) + { + if (!activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) && !Bot.HasInHand(CardId.SwordsoulStrategistLongyuan) + && SwordsoulOfMoYeEffectCheck() && CheckRemainInDeck(CardId.SwordsoulStrategistLongyuan) > 0) + { + AI.SelectCard(CardId.SwordsoulStrategistLongyuan); + activatedCardIdList.Add(Card.Id); + return true; + } - private bool isNonPermamentSpell(ClientCard card) { - // normal spell - if(card.Type == (int)CardType.Spell) - return true; + if (!activatedCardIdList.Contains(CardId.SwordsoulStrategistLongyuan) && Bot.HasInHand(CardId.SwordsoulStrategistLongyuan) + && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && !activatedCardIdList.Contains(CardId.SwordsoulSacredSummit)) + { + // ready for another level 8 synchro + if (Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia) && !Bot.HasInHand(CardId.SwordsoulSacredSummit)) + { + if (CheckRemainInDeck(CardId.SwordsoulSacredSummit) > 0) + { + AI.SelectCard(CardId.SwordsoulSacredSummit); + activatedCardIdList.Add(Card.Id); + return true; + } + } + if (!Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia) && Bot.HasInHand(CardId.SwordsoulSacredSummit)) + { + if (CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + } + + if (!Bot.HasInMonstersZone(CardId.SwordsoulToken) && Bot.HasInMonstersZone(CardId.SwordsoulStrategistLongyuan) + && Bot.HasInMonstersZone(CardId.SwordsoulStrategistLongyuan) && CheckRemainInDeck(CardId.SwordsoulBlackout) > 0 + && !activatedCardIdList.Contains(CardId.SwordsoulBlackout)) + { + Logger.DebugWriteLine("Chixiao banish blackout"); + AI.SelectCard(CardId.SwordsoulBlackout); + AI.SelectOption(1); + activatedCardIdList.Add(Card.Id); + return true; + } - // quickplay spell - if(card.HasType(CardType.Spell | CardType.QuickPlay)) - return true; + if (CheckAtAdvantage()) + { + List searchIdList = new List{ + CardId.SwordsoulBlackout, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia, CardId.SwordsoulEmergence, + CardId.SwordsoulStrategistLongyuan + }; + foreach (int checkId in searchIdList) + { + if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } + + List checkIdList = new List{ + CardId.SwordsoulBlackout, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia, CardId.SwordsoulEmergence, + CardId.SwordsoulStrategistLongyuan + }; + foreach (int checkId in checkIdList) + { + if (CheckRemainInDeck(checkId) > 0 && !Bot.HasInHand(checkId)) + { + AI.SelectCard(checkId); + activatedCardIdList.Add(Card.Id); + return true; + } + } + } return false; } - private bool MonsterNegateNext() { - if(Duel.Player == 1) { - ClientCard target = Enemy.MonsterZone.GetShouldBeDisabledBeforeItUseEffectMonster(); - if(target != null) { - AI.SelectNextCard(target); + public bool BaxiaBrightnessOfTheYangZingActivate() + { + Logger.DebugWriteLine("Baxia desc: " + ActivateDescription.ToString()); + + if (ActivateDescription == Util.GetStringId(CardId.BaxiaBrightnessOfTheYangZing, 0)) + { + List enemyTargetList = GetNormalEnemyTargetList(true); + if (enemyTargetList.Count() > 0) + { + AI.SelectCard(enemyTargetList); + activatedCardIdList.Add(Card.Id + 1); return true; } - } - - ClientCard LastChainCard = Util.GetLastChainCard(); + } else + { + List destroyTarget = Bot.GetSpells(); + destroyTarget.AddRange(Bot.GetMonsters().Where(card => card.IsFacedown() || card.Attack <= 1000).ToList()); + if (destroyTarget.Count() == 0) + { + return false; + } - if(LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone && - !LastChainCard.IsDisabled() && !LastChainCard.IsShouldNotBeTarget() && !LastChainCard.IsShouldNotBeSpellTrapTarget()) { - AI.SelectNextCard(LastChainCard); - return true; - } + bool canUseMoye = !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck(); + bool canUseTaia = !activatedCardIdList.Contains(CardId.SwordsoulOfTaia) + && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 && SwordsoulOfTaiaEffectCheck(); - if(Bot.BattlingMonster != null && Enemy.BattlingMonster != null) { - if(!Enemy.BattlingMonster.IsDisabled() && Enemy.BattlingMonster.IsCode(_CardId.EaterOfMillions)) { - AI.SelectNextCard(Enemy.BattlingMonster); + if (canUseMoye && Bot.HasInGraveyard(CardId.SwordsoulOfMoYe)) + { + AI.SelectCard(destroyTarget); + AI.SelectNextCard(CardId.SwordsoulOfMoYe); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + if (canUseTaia && Bot.HasInGraveyard(CardId.SwordsoulOfTaia)) + { + AI.SelectCard(destroyTarget); + AI.SelectNextCard(CardId.SwordsoulOfTaia); + activatedCardIdList.Add(Card.Id + 2); return true; } + if (Bot.HasInGraveyard(CardId.IncredibleEcclesiaTheVirtuous)) + { + // sp summon ecclesia for moye/taia + if (!activatedCardIdList.Contains(CardId.IncredibleEcclesiaTheVirtuous)) + { + if ((canUseMoye && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0) + || (canUseTaia && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0)) + { + AI.SelectCard(destroyTarget); + AI.SelectNextCard(CardId.IncredibleEcclesiaTheVirtuous); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } + // sp summon ecclesia as tuner + if (Bot.GetMonsters().Any(card => card.IsFaceup() && !card.IsTuner() && card.Level == 4)) + { + AI.SelectCard(destroyTarget); + AI.SelectNextCard(CardId.IncredibleEcclesiaTheVirtuous); + activatedCardIdList.Add(Card.Id + 2); + return true; + } + } } - if(Duel.Phase == DuelPhase.BattleStart && Duel.Player == 1 && - Enemy.HasInMonstersZone(_CardId.NumberS39UtopiaTheLightning, true)) { - AI.SelectNextCard(_CardId.NumberS39UtopiaTheLightning); + return false; + } + + public bool YaziEvilOfTheYangZingActivate() + { + if (Card.Location == CardLocation.Grave) + { + // special summon + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck()) + { + AI.SelectCard(CardId.SwordsoulOfMoYe); + return true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + return true; + } + if (Bot.HasInMonstersZone(CardId.SwordsoulToken)) + { + List specialSummonIdListForSynchro = new List{CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia}; + foreach (int checkId in specialSummonIdListForSynchro) + { + if (CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + return true; + } + } + } + List specialSummonIdList = new List{ + CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Adhara, + CardId.SwordsoulStrategistLongyuan, CardId.SwordsoulOfMoYe, CardId.SwordsoulOfTaia + }; + foreach (int checkId in specialSummonIdList) + { + if (CheckRemainInDeck(checkId) > 0) + { + AI.SelectCard(checkId); + return true; + } + } + } else + { + // destroy + if (CheckWhetherNegated()) + { + return false; + } + bool selfDestroy = false; + if (!activatedCardIdList.Contains(CardId.SwordsoulOfMoYe) && CheckRemainInDeck(CardId.SwordsoulOfMoYe) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 && SwordsoulOfMoYeEffectCheck()) + { + selfDestroy = true; + } + if (!activatedCardIdList.Contains(CardId.SwordsoulOfTaia) && CheckRemainInDeck(CardId.SwordsoulOfTaia) > 0 + && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0) + { + selfDestroy = true; + } + if (selfDestroy) + { + AI.SelectCard(Card); + } else + { + List YangZingList = Bot.GetMonsters().Where(card => card.IsFaceup() && card.HasSetcode(SetcodeYangZing)).ToList(); + YangZingList.Sort(CardContainer.CompareCardAttack); + AI.SelectCard(YangZingList); + } + AI.SelectNextCard(GetNormalEnemyTargetList(true)); return true; } return false; } - private bool HasNonEffectMonster() { - return Bot.MonsterZone.IsExistingMatchingCard(card => !card.HasType(CardType.Effect) && card.IsFaceup()); - } - - private bool HasEffectMonster() { - return Bot.MonsterZone.IsExistingMatchingCard(card => card.HasType(CardType.Effect) && card.IsFaceup()); - } + public bool ShamanOfTheTenyiActivate() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + // destroy + AI.SelectCard(GetNormalEnemyTargetList()); + return true; + } else + { + // special summon + if (CheckAtAdvantage() && enemyActivateMaxxC && Util.IsTurn1OrMain2()) + { + return false; + } - private enum TargetSynchroLevel : int { - Level_10 = 10, - Level_9 = 9, - Level_8_Swordsoul = 8, - Level_8_Tenki = -8, - Level_7 = 7 - } + bool canUseMoye = Bot.HasInGraveyard(CardId.SwordsoulOfMoYe) && CheckCalledbytheGrave(CardId.SwordsoulOfMoYe) == 0 + && !activatedCardIdList.Contains(CardId.SwordsoulOfMoYe); + bool canUseTaia = Bot.HasInHandOrInGraveyard(CardId.SwordsoulOfTaia) && CheckCalledbytheGrave(CardId.SwordsoulOfTaia) == 0 + && !activatedCardIdList.Contains(CardId.SwordsoulOfTaia); + bool shouldDiscardTaia = !Bot.HasInGraveyard(CardId.SwordsoulOfTaia) && Bot.HasInHand(CardId.SwordsoulOfTaia); + List sortedReviveTargetList = Bot.GetGraveyardMonsters().Where(card => + card.IsCanRevive() && card.HasRace(CardRace.Wyrm)).ToList(); + sortedReviveTargetList.Sort(CardContainer.CompareCardAttack); + sortedReviveTargetList.Reverse(); + + if (CheckAtAdvantage()) + { + // try to kill + if (Duel.Turn > 1 && Enemy.GetMonsterCount() == 0) + { + int currentAttack = Util.GetTotalAttackingMonsterAttack(0); + if (currentAttack < Enemy.LifePoints) + { + List overkillList = sortedReviveTargetList.Where(card => + card.Attack + currentAttack >= Enemy.LifePoints).ToList(); + if (overkillList.Count() > 0) + { + SelectDiscardForShamanOfTheTenyi(shouldDiscardTaia); + AI.SelectNextCard(overkillList); + return true; + } + } + } - private List GetSynchroMaterials(TargetSynchroLevel level) { - List materials = new List(); + // for next synchro + if (canUseMoye) + { + SelectDiscardForShamanOfTheTenyi(); + AI.SelectNextCard(CardId.SwordsoulOfMoYe); + return true; + } + if (canUseTaia) + { + SelectDiscardForShamanOfTheTenyi(shouldDiscardTaia); + AI.SelectNextCard(CardId.SwordsoulOfTaia); + return true; + } - switch(level) { - case TargetSynchroLevel.Level_10: - if(Bot.HasInMonstersZone(CardId.SwordsoulToken, false, false, true)) { - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulToken))); + // choose max attack + SelectDiscardForShamanOfTheTenyi(); + AI.SelectNextCard(sortedReviveTargetList); + return true; - if(Bot.HasInMonstersZone(CardId.SwordsoulLongYuan, false, false, true)) - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulLongYuan))); + } else { + // reborn synchro monster + List synchroMonsterList = sortedReviveTargetList.Where(card => card.HasType(CardType.Synchro)).ToList(); + if (synchroMonsterList.Count() > 0) + { + SelectDiscardForShamanOfTheTenyi(); + AI.SelectNextCard(synchroMonsterList); + return true; } - break; - case TargetSynchroLevel.Level_9: - if(Bot.HasInMonstersZone(CardId.YangZingBaxia, false, false, true)) { - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.YangZingBaxia))); - if(Bot.HasInMonstersZone(CardId.TenyiAdhara, false, false, true)) - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.TenyiAdhara))); + // for next synchro + if (canUseMoye) + { + SelectDiscardForShamanOfTheTenyi(); + AI.SelectNextCard(CardId.SwordsoulOfMoYe); + return true; } - break; - case TargetSynchroLevel.Level_8_Swordsoul: - if(Bot.HasInMonstersZone(CardId.SwordsoulToken, false, false, true)) { - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulToken))); - - if(Bot.HasInMonstersZone(CardId.SwordsoulMoYe, false, false, true)) - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulMoYe))); - else if(Bot.HasInMonstersZone(CardId.SwordsoulTaia, false, false, true)) - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulTaia))); + if (canUseTaia) + { + SelectDiscardForShamanOfTheTenyi(shouldDiscardTaia); + AI.SelectNextCard(CardId.SwordsoulOfTaia); + return true; } - break; - case TargetSynchroLevel.Level_8_Tenki: - if(Bot.HasInMonstersZone(CardId.TenyiAdhara, false, false, true)) { - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.TenyiAdhara))); + } + } - if(Bot.HasInMonstersZone(CardId.TenyiVishuda, false, false, true)) - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.TenyiVishuda))); - else if(Bot.HasInMonstersZone(CardId.TenyiAshuna, false, false, true)) - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.TenyiAshuna))); + return false; + } + + public void SelectDiscardForShamanOfTheTenyi(bool useTaia = false) + { + if (useTaia) + { + AI.SelectCard(CardId.SwordsoulOfTaia); + } else { + // drop tenyi + List tenyiList = new List{CardId.TenyiSpirit_Vishuda, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Adhara}; + foreach (int tenyiId in tenyiList) + { + if (Bot.HasInHand(tenyiId)) + { + AI.SelectCard(tenyiId); + return; } - break; - case TargetSynchroLevel.Level_7: - if(Bot.HasInMonstersZone(CardId.SwordsoulToken, false, false, true)) { - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulToken))); + } - if(Bot.HasInMonstersZone(CardId.SwordsoulMoYe, false, false, true)) - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulMoYe))); - else if(Bot.HasInMonstersZone(CardId.SwordsoulTaia, false, false, true)) - materials.Add(Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SwordsoulTaia))); + // drop dump card + foreach (ClientCard hand in Bot.Hand) + { + if (Bot.Hand.Where(card => card.IsCode(hand.Id)).Count() > 1) + { + AI.SelectCard(hand); + return; } - break; - } + } - if(!VerifySynchroMaterials(materials, level)) - return null; + // check discard list + List discardList = new List{ + CardId.CrossoutDesignator, _CardId.PotOfDesires, CardId.TenyiSpirit_Ashuna, CardId.TenyiSpirit_Vishuda, + CardId.TenyiSpirit_Adhara, CardId.NibiruThePrimalBeing, CardId.SwordsoulSacredSummit, CardId.IncredibleEcclesiaTheVirtuous, + _CardId.InfiniteImpermanence, _CardId.CalledByTheGrave, CardId.SwordsoulOfTaia, CardId.SwordsoulOfMoYe, + CardId.SwordsoulStrategistLongyuan, _CardId.AshBlossom, _CardId.MaxxC, _CardId.EffectVeiler, + CardId.SwordsoulEmergence, CardId.SwordsoulBlackout + }; + foreach (int discardCheck in discardList) + { + if (Bot.HasInHand(discardCheck)) + { + AI.SelectCard(discardCheck); + return; + } + } - return materials; + } } - private ClientCard GetCurrentSearchCardFromChain() { - int[] searchCards = new int[] { - CardId.SwordsoulChixiao, - CardId.SwordsoulTaia, - CardId.IncredibleEcclesia, - CardId.TenyiAshuna, - CardId.VesselForDragonCycle, - CardId.SwordsoulChengying, - CardId.YangZingYazi, - CardId.YangZingChaofeng + public bool SpellSetCheck() + { + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + List onlyOneSetList = new List{ + CardId.SwordsoulBlackout }; + if (onlyOneSetList.Contains(Card.Id) && Bot.HasInSpellZone(Card.Id)) + { + return false; + } - if(EffectChain.Count == 0) { - foreach(ClientCard card in Duel.CurrentChain) { - if(card.Owner == 0 && searchCards.Contains(card.Id)) - EffectChain.AddLast(card); + // select place + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay))) + { + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } else + { + SelectSTPlace(); } + return true; } - if (EffectChain.Count > 0) + else if (Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true) || Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true)) { - ClientCard card = EffectChain.Last.Value; - EffectChain.RemoveLast(); - return card; + if (Card.IsSpell() && !Bot.HasInSpellZone(Card.Id)) + { + SelectSTPlace(); + return true; + } } - return Util.GetLastChainCard(); - } - - public override void OnChainEnd() { - EffectChain.Clear(); - } - - private bool VerifySynchroMaterials(List materials, TargetSynchroLevel level) { - if(materials.Count != 2) - return false; - - int combinedLevel = materials[0].Level + materials[1].Level; - if(combinedLevel != Math.Abs((int)level)) - return false; - - return true; + return false; } - private void ResetActivatedCount() { - typeof(GameAI) - .GetField("_activatedCards", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) - .SetValue(AI, new Dictionary()); + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(null, true); + return true; + } + return false; } - - #endregion Utils } -} +} \ No newline at end of file diff --git a/Game/AI/Decks/TearlamentsExecutor.cs b/Game/AI/Decks/TearlamentsExecutor.cs index 02114abc2..2300de7ea 100644 --- a/Game/AI/Decks/TearlamentsExecutor.cs +++ b/Game/AI/Decks/TearlamentsExecutor.cs @@ -2,7 +2,10 @@ using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using System.Linq; - +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using System; namespace WindBot.Game.AI.Decks { [Deck("Tearlaments", "AI_Tearlaments")] @@ -45,10 +48,10 @@ public class CardId public const int IP = 65741786; } // false: EDOPro - const bool IS_YGOPRO = false; + const bool IS_YGOPRO = true; // YGOPro: 0x181 // EDOPro: 0x182 - int SETCODE = 0x182; + int SETCODE = 0x181; bool activate_TearlamentsScheiren_1 = false; bool activate_TearlamentsScheiren_2 = false; @@ -179,8 +182,8 @@ public TearlamentsExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, CardId.BaronnedeFleur, BaronnedeFleurEffect); AddExecutor(ExecutorType.Activate, CardId.ElderEntityNtss, ElderEntityNtssEffect); AddExecutor(ExecutorType.Activate, CardId.PredaplantDragostapelia, PredaplantDragostapeliaEffect); - AddExecutor(ExecutorType.Activate, CardId.HeraldofOrangeLight); - AddExecutor(ExecutorType.Activate, CardId.HeraldofGreenLight); + AddExecutor(ExecutorType.Activate, CardId.HeraldofOrangeLight, DefaultTrap); + AddExecutor(ExecutorType.Activate, CardId.HeraldofGreenLight, DefaultTrap); AddExecutor(ExecutorType.Activate, CardId.TearlamentsRulkallos, TearlamentsRulkallosEffect); AddExecutor(ExecutorType.Activate, CardId.FADawnDragster); AddExecutor(ExecutorType.Activate, CardId.PrimevalPlanetPerlereino, PrimevalPlanetPerlereinoEffect); @@ -272,6 +275,7 @@ public override void OnNewTurn() spsummoned = false; summon_SprightElf = false; TearlamentsKitkallos_summoned = false; + base.OnNewTurn(); } private List GetZoneCards(CardLocation loc, ClientField player) { @@ -653,7 +657,7 @@ public override CardPosition OnSelectPosition(int cardId, IList po } return base.OnSelectPosition(cardId, positions); } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (player == 0 && location == CardLocation.MonsterZone) { @@ -697,7 +701,7 @@ public override int OnSelectPlace(long cardId, int player, CardLocation location } return base.OnSelectPlace(cardId, player, location, available); } - public override int OnSelectOption(IList options) + public override int OnSelectOption(IList options) { if (options.Count == 2 && (IS_YGOPRO ? options.Contains(1190) : options.Contains(573))) { @@ -705,9 +709,9 @@ public override int OnSelectOption(IList options) } return base.OnSelectOption(options); } - public override bool OnSelectYesNo(long desc) + public override bool OnSelectYesNo(int desc) { - if (desc == Util.GetStringId(CardId.PrimevalPlanetPerlereino, 0)) pre_activate_PrimevalPlanetPerlereino = true; + if (desc == 1233663200) pre_activate_PrimevalPlanetPerlereino = true; return base.OnSelectYesNo(desc); } public override void OnSelectChain(IList cards) @@ -978,7 +982,7 @@ private void SetSpSummon() if (Bot.HasInMonstersZone(CardId.ElShaddollWinda, true, false, true) || Enemy.HasInMonstersZone(CardId.ElShaddollWinda, true, false, true)) spsummoned = true; } - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { if ((AI.HaveSelectedCards() && mcard_0.All(card => card == null) && ran_fusion_mode_0.All(flag => !flag)) || (hint == HintMsg.FusionMaterial)) return null; @@ -989,7 +993,8 @@ public override IList OnSelectCard(IList cards, int min, return Util.CheckSelectCount(CardsIdToClientCards(ids, cards, false, true), cards, min, max); } - if (select_TearlamentsKitkallos && hint == HintMsg.AddToHand) + //!IS_YGOPRO && select_TearlamentsKitkallos && hint == HintMsg.AddToHand + if ((IS_YGOPRO && hint == HintMsg.OperateCard) || (!IS_YGOPRO && select_TearlamentsKitkallos && hint == HintMsg.AddToHand)) { if (!IS_YGOPRO) select_TearlamentsKitkallos = false; IList ids = new List(); @@ -1425,7 +1430,8 @@ public override IList OnSelectCard(IList cards, int min, res = CardsIdToClientCards(ids, cards, false); return res.Count > 0 ? Util.CheckSelectCount(res, cards, min, max) : null; } - if (hint == HintMsg.Negate) + //(IS_YGOPRO && hint == HintMsg.Disable) || (!IS_YGOPRO && hint == HintMsg.Negate) + if (IS_YGOPRO && hint == HintMsg.Disable) { if (chain_TearlamentsSulliek != null && cards.Contains(chain_TearlamentsSulliek)) { @@ -1699,7 +1705,7 @@ private bool UnderworldGoddessoftheClosedWorldLinkSummon(bool filter = true) if (Duel.Turn == 1 || Enemy.GetMonsterCount() <= 0) return false; List e_cards = Enemy.GetMonsters().Where(card => card != null && card.IsFaceup() && card.IsAttack()).ToList(); List b_cards = Bot.GetMonsters().Where(card => card != null && card.IsFaceup() && card.IsAttack()).ToList(); - if ((e_cards.Count <= 0 || b_cards.Count <= 0) && Enemy.MonsterZone.GetDangerousMonster() == null) return false; + if (e_cards.Count <= 0 || b_cards.Count <= 0 || Enemy.MonsterZone.GetDangerousMonster() == null) return false; e_cards.Sort(CardContainer.CompareCardAttack); e_cards.Reverse(); b_cards.Sort(CardContainer.CompareCardAttack); @@ -2167,6 +2173,7 @@ private bool DivineroftheHeraldSummon() } private bool EvaEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; List cards = Bot.GetGraveyardMonsters().Where(card => card != null && card.HasAttribute(CardAttribute.Light) && card.HasRace(CardRace.Fairy) && card != Card).ToList(); if (cards.Count <= 0) return false; activate_Eva = true; @@ -2202,6 +2209,7 @@ private bool TearlamentsScreamEffect_1() } private bool MudoratheSwordOracleEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.Location == CardLocation.Hand) { if ((Bot.Hand.Count(card => card != null && card.Id == CardId.AgidotheAncientSentinel) <= 0 || activate_AgidotheAncientSentinel_2) @@ -2647,4 +2655,4 @@ private bool TearlamentsSulliekEffect() } } -} +} \ No newline at end of file diff --git a/Game/AI/Decks/ThunderDragonExecutor.cs b/Game/AI/Decks/ThunderDragonExecutor.cs index 3811681e5..e5fb67312 100644 --- a/Game/AI/Decks/ThunderDragonExecutor.cs +++ b/Game/AI/Decks/ThunderDragonExecutor.cs @@ -1,4 +1,4 @@ -using YGOSharp.OCGWrapper.Enums; +using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using System.Linq; using WindBot; @@ -278,6 +278,8 @@ public override void OnNewTurn() for (int i = 0; i < selectAtt.Count; i++) selectAtt[i] = false; + + base.OnNewTurn(); } private bool IsAvailableZone(int seq) { @@ -366,7 +368,7 @@ private void ResetFlag() selectFlag[i] = false; } } - public override int OnSelectPlace(long cardId, int player, CardLocation location, int available) + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) { if (player == 0 && location==CardLocation.MonsterZone) { @@ -413,7 +415,7 @@ public override int OnSelectPlace(long cardId, int player, CardLocation location } return base.OnSelectPlace(cardId, player, location, available); } - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { if (selectFlag.Count(flag => flag) > 1) { @@ -656,7 +658,7 @@ public override IList OnSelectCard(IList cards, int min, if (res.Count > 0) return Util.CheckSelectCount(res, cards, min, max); return null; } - if (false /*hint == HintMsg.OperateCard*/) + if (hint == HintMsg.OperateCard) { if (cards.Any(card => card != null && card.Location == CardLocation.Removed)) { @@ -889,6 +891,7 @@ private int GetLinkMark(int cardId) } private bool AshBlossomEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.CurrentChain.Count > 0 && Duel.LastChainPlayer != 0; } public int CompareCardLink(ClientCard cardA, ClientCard cardB) @@ -1053,6 +1056,7 @@ private bool MekkKnightCrusadiaAvramaxSummon() } private bool GEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; return Duel.Player != 0; } private bool ThunderDragonColossusSummon_2() @@ -1101,6 +1105,7 @@ private bool PredaplantVerteAnacondaEffect() { if (ActivateDescription == Util.GetStringId(CardId.PredaplantVerteAnaconda, 1)) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (CheckRemainInDeck(CardId.ThunderDragonFusion) <= 0) return false; if (Bot.GetMonstersInMainZone().Count > 4 && Bot.GetMonstersInMainZone().Count(card => card != null && !card.IsExtraCard() && card.HasSetcode(0x11c) && card.HasType(CardType.Monster) && card.IsFaceup()) <= 0) return false; List g_card = Bot.Graveyard.ToList(); @@ -1148,6 +1153,7 @@ private bool CrossSheepEffect() } private bool KnightmareUnicornEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; List cards = new List(); cards.AddRange(Enemy.SpellZone); cards.AddRange(Enemy.MonsterZone); @@ -1598,6 +1604,7 @@ private bool ThunderDragonhawkEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; List banish_cards = new List(); List grave_cards = new List(); foreach (var card in Bot.Banished) @@ -1792,6 +1799,7 @@ private bool ThunderDragonroarEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (handActivated) return false; handActivated = true; activate_ThunderDragonroar = true; @@ -2035,6 +2043,7 @@ private bool ThunderDragonmatrixEffect_2() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Player == 0) { if (IsShouldChainTunder()) @@ -2243,6 +2252,7 @@ private bool TheBystialLubellionEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (HasInZoneNoActivate(CardId.BystialMagnamhut,CardLocation.Deck) && !Bot.HasInHand(CardId.BystialMagnamhut)) AI.SelectCard(CardId.BystialMagnamhut); else if(HasInZoneNoActivate(CardId.BystialDruiswurm, CardLocation.Deck) && !Bot.HasInHand(CardId.BystialDruiswurm)) @@ -2420,6 +2430,7 @@ private bool ThunderDragondarkEffect_2() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Player == 0) { if (IsShouldChainTunder()) @@ -2498,6 +2509,7 @@ private bool ThunderDragondarkEffect() } private bool NormalThunderDragonEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; handActivated = true; ResetFlag(); selectFlag[(int)Select.NormalThunderDragon] = true; diff --git a/Game/AI/Decks/TimeThiefExecutor.cs b/Game/AI/Decks/TimeThiefExecutor.cs index bdba09f18..b0426ec6b 100644 --- a/Game/AI/Decks/TimeThiefExecutor.cs +++ b/Game/AI/Decks/TimeThiefExecutor.cs @@ -1,12 +1,10 @@ -using System; +using YGOSharp.OCGWrapper; using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; -using System.Diagnostics; using WindBot; using WindBot.Game; using WindBot.Game.AI; using System.Linq; -using System.Reflection; namespace WindBot.Game.AI.Decks { @@ -194,6 +192,7 @@ private bool RegulatorEffect() { if (Card.Location == CardLocation.MonsterZone) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectCard(Monsters.TimeThiefCronocorder); AI.SelectCard(Monsters.TimeThiefWinder); return true; @@ -324,7 +323,7 @@ private bool FoolishBurialTarget() AI.SelectCard(Monsters.PerformTrickClown); return true; } - + private bool TrickClownEffect() { if (Bot.LifePoints <= 1000) @@ -372,6 +371,7 @@ private bool ThunderKingRaiOhsummon() } private bool ThunderKingRaiOheff() { + if (DefaultOnlyHorusSpSummoning()) return false; if (Duel.SummoningCards.Count > 0) { foreach (ClientCard m in Duel.SummoningCards) @@ -404,7 +404,6 @@ public bool PotofExtravaganceActivate() } - } } diff --git a/Game/AI/Decks/ToadallyAwesomeExecutor.cs b/Game/AI/Decks/ToadallyAwesomeExecutor.cs index 595b52750..a043e89c1 100644 --- a/Game/AI/Decks/ToadallyAwesomeExecutor.cs +++ b/Game/AI/Decks/ToadallyAwesomeExecutor.cs @@ -231,6 +231,7 @@ private bool SwapFrogEffect() } else { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Bot.HasInHand(CardId.DupeFrog)) { AI.SelectCard( @@ -267,6 +268,7 @@ private bool GraydleSlimeJrEffect() private bool RonintoadinEffect() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; AI.SelectPosition(CardPosition.FaceUpDefence); return true; } @@ -297,6 +299,7 @@ private bool ToadallyAwesomeEffect() { if (Duel.CurrentChain.Count > 0) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; // negate effect, select a cost for it List monsters = Bot.GetMonsters(); IList suitableCost = new[] { @@ -381,6 +384,7 @@ private bool ToadallyAwesomeEffect() } else if (Duel.Phase == DuelPhase.Standby) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; SelectXYZDetach(Card.Overlays); if (Duel.Player == 0) { diff --git a/Game/AI/Decks/TrickstarExecutor.cs b/Game/AI/Decks/TrickstarExecutor.cs index 4788fd167..34370ba10 100644 --- a/Game/AI/Decks/TrickstarExecutor.cs +++ b/Game/AI/Decks/TrickstarExecutor.cs @@ -3,6 +3,7 @@ using WindBot; using WindBot.Game; using WindBot.Game.AI; +using System.Linq; namespace WindBot.Game.AI.Decks { @@ -67,6 +68,7 @@ public int getLinkMarker(int id) return 1; } + List Impermanence_list = new List(); bool NormalSummoned = false; ClientCard stage_locked = null; bool pink_ss = false; @@ -76,8 +78,7 @@ public int getLinkMarker(int id) bool white_eff_used = false; bool lockbird_useful = false; bool lockbird_used = false; - int GraveCall_id = 0; - int GraveCall_count = 0; + List currentNegatingIdList = new List(); List SkyStrike_list = new List { 26077387, 8491308, 63288573, 90673288, @@ -190,21 +191,39 @@ public bool Five_Rainbow() return false; } - public int SelectSTPlace() + public int SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false) { - List list = new List { 0, 1, 2, 3, 4 }; + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; + list.Add(seq); + } + } int n = list.Count; while (n-- > 1) { - int index = Program.Rand.Next(n + 1); - int temp = list[index]; - list[index] = list[n]; - list[n] = temp; + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + return (int)System.Math.Pow(2, seq); + } } - foreach(int seq in list) + foreach (int seq in list) { - int zone = (int)System.Math.Pow(2, seq); - if (Bot.SpellZone[seq] == null) return zone; + return (int)System.Math.Pow(2, seq); } return 0; } @@ -228,9 +247,9 @@ public bool SpellSet() return false; } - public bool IsTrickstar(int id) + public bool IsTrickstar(ClientCard card) { - return (id == CardId.Yellow || id == CardId.Red || id == CardId.Pink || id == CardId.White || id == CardId.Stage || id == CardId.Re || id == CardId.Crown); + return card.HasSetcode(0x8d); } public bool field_activate() @@ -246,18 +265,18 @@ public bool field_activate() public bool spell_trap_activate() { if (Card.Location != CardLocation.SpellZone && Card.Location != CardLocation.Hand) return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Enemy.HasInMonstersZone(CardId.Exterio,true) && !Bot.HasInHandOrHasInMonstersZone(CardId.Ghost)) return false; if (Card.IsSpell()) { - if (Enemy.HasInMonstersZone(33198837, true) && !Bot.HasInHandOrHasInMonstersZone(CardId.Ghost)) return false; - if (Enemy.HasInSpellZone(61740673, true) || Bot.HasInSpellZone(61740673,true)) return false; + if (Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true) && !Bot.HasInHandOrHasInMonstersZone(CardId.Ghost)) return false; + if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Bot.HasInSpellZone(_CardId.ImperialOrder, true)) return false; if (Enemy.HasInMonstersZone(37267041, true) || Bot.HasInMonstersZone(37267041, true)) return false; return true; } if (Card.IsTrap()) { - if (Enemy.HasInSpellZone(51452091, true) || Bot.HasInSpellZone(51452091, true)) return false; - if (Enemy.HasInSpellZone(51452091, true) || Bot.HasInSpellZone(51452091, true)) return false; + if (Enemy.HasInSpellZone(_CardId.RoyalDecreel, true) || Bot.HasInSpellZone(_CardId.RoyalDecreel, true)) return false; return true; } // how to get here? @@ -505,7 +524,7 @@ public bool GalaxyCyclone() if (selected == null) return false; AI.SelectCard(selected); - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } @@ -526,13 +545,13 @@ public bool Feather_Act() if (self_card.IsCode(CardId.Galaxy)) return false; } - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } // activate when more than 2 cards if (Enemy.GetSpellCount() <= 1) return false; - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } @@ -602,7 +621,7 @@ public bool Stage_act() stage_locked = null; return true; } - if (Enemy.GetMonsterCount() > 0 && Util.GetBestEnemyMonster().Attack >= Util.GetBestAttack(Bot) && !Bot.HasInHand(CardId.White)) + if (Enemy.GetMonsterCount() > 0 && Util.GetBestEnemyMonster().Attack >= Util.GetBestAttack(Bot) && !Bot.HasInHand(CardId.White) && !DefaultCheckWhetherCardIdIsNegated(CardId.White)) { AI.SelectCard(CardId.White, CardId.Yellow, CardId.Pink, CardId.Red); stage_locked = null; @@ -627,7 +646,7 @@ public bool Pot_Act() if (!spell_trap_activate()) return false; if (Bot.Deck.Count > 15) { - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } return false; @@ -635,7 +654,7 @@ public bool Pot_Act() public bool Hand_act_eff() { - if (GraveCall_count > 0 && GraveCall_id == Card.Id) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Card.IsCode(CardId.Urara) && Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) // Danger! archtype hand effect return false; if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false; @@ -655,7 +674,7 @@ public bool Exterio_counter() public bool G_act() { - return (Duel.Player == 1 && !(GraveCall_count > 0 && GraveCall_id == Card.Id)); + return Duel.Player == 1 && !DefaultCheckWhetherCardIsNegated(Card); } public bool Pink_eff() @@ -742,7 +761,7 @@ public void Red_SelectPos(ClientCard return_card = null) monster_list.Reverse(); foreach(ClientCard card in monster_list) { - if (IsTrickstar(card.Id) && card != return_card && card.HasPosition(CardPosition.Attack)) + if (IsTrickstar(card) && card != return_card && card.HasPosition(CardPosition.Attack)) { int this_power = (Bot.HasInHand(CardId.White) && !white_eff_used) ? (card.RealPower + card.Attack) : card.RealPower; if (this_power >= self_power) self_power = this_power; @@ -757,12 +776,13 @@ public void Red_SelectPos(ClientCard return_card = null) public bool Red_ss() { - if ((Util.ChainContainsCard(CardId.DarkHole) || Util.ChainContainsCard(99330325) || Util.ChainContainsCard(53582587)) && Util.ChainContainsCard(CardId.Red)) return false; + if ((Util.ChainContainsCard(CardId.DarkHole) || Util.ChainContainsCard(_CardId.InterruptedKaijuSlumber) || Util.ChainContainsCard(_CardId.TorrentialTribute)) && Util.ChainContainsCard(CardId.Red)) return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Red)) { foreach (ClientCard m in Bot.GetMonsters()) { - if (Util.IsChainTarget(m) && IsTrickstar(m.Id)) + if (Util.IsChainTarget(m) && IsTrickstar(m)) { AI.SelectCard(m); Red_SelectPos(); @@ -780,7 +800,7 @@ public bool Red_ss() ClientCard tosolve_enemy = Util.GetOneEnemyBetterThanMyBest(); foreach (ClientCard c in self_m) { - if (IsTrickstar(c.Id) && !c.IsCode(CardId.Red)) + if (IsTrickstar(c) && !c.IsCode(CardId.Red)) { if (c.Attacked) { @@ -834,7 +854,7 @@ public bool Red_ss() self_monster.Sort(CardContainer.CompareDefensePower); foreach(ClientCard card in self_monster) { - if (IsTrickstar(card.Id) && !card.IsCode(CardId.Red)) + if (IsTrickstar(card) && !card.IsCode(CardId.Red)) { AI.SelectCard(card); Red_SelectPos(card); @@ -914,10 +934,11 @@ public bool Yellow_eff() public bool White_eff() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Phase >= DuelPhase.Main2) return false; if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) { - if (Bot.BattlingMonster == null || Enemy.BattlingMonster == null || !IsTrickstar(Bot.BattlingMonster.Id) || Bot.BattlingMonster.HasPosition(CardPosition.Defence)) return false; + if (Bot.BattlingMonster == null || Enemy.BattlingMonster == null || !IsTrickstar(Bot.BattlingMonster) || Bot.BattlingMonster.HasPosition(CardPosition.Defence)) return false; if (Bot.BattlingMonster.Attack <= Enemy.BattlingMonster.RealPower && Bot.BattlingMonster.Attack + Bot.BattlingMonster.BaseAttack >= Enemy.BattlingMonster.RealPower) { white_eff_used = true; @@ -934,7 +955,7 @@ public bool White_eff() { ClientCard tosolve = Util.GetBestEnemyMonster(true); ClientCard self_card = Bot.GetMonsters().GetHighestAttackMonster(); - if (tosolve == null || self_card == null || (tosolve != null && self_card != null && !IsTrickstar(self_card.Id))) + if (tosolve == null || self_card == null || (tosolve != null && self_card != null && !IsTrickstar(self_card))) { if (Enemy.GetMonsters().GetHighestAttackMonster()== null || Enemy.GetMonsters().GetHighestDefenseMonster() == null || @@ -946,7 +967,7 @@ public bool White_eff() } else return false; } - if (tosolve != null && self_card != null && IsTrickstar(self_card.Id) && !tosolve.IsMonsterHasPreventActivationEffectInBattle()) + if (tosolve != null && self_card != null && IsTrickstar(self_card) && !tosolve.IsMonsterHasPreventActivationEffectInBattle()) { int defender_power = tosolve.GetDefensePower(); Logger.DebugWriteLine("battle check 0:" + Duel.Phase.ToString()); @@ -970,6 +991,7 @@ public bool White_eff() public bool LockBird_act() { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (Duel.Player == 0 || lockbird_used) return false; lockbird_useful = true; if (Bot.HasInSpellZone(CardId.Re)) @@ -1003,12 +1025,12 @@ public bool Crown_eff() if (!spell_trap_activate()) return false; if (Duel.Phase <= DuelPhase.Main1 && Ts_reborn()) { - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } return false; } - if (Bot.HasInHand(CardId.Pink) && GraveCall_id != CardId.Pink) + if (Bot.HasInHand(CardId.Pink) && DefaultCheckWhetherCardIdIsNegated(CardId.Pink)) { AI.SelectCard(CardId.Pink); return true; @@ -1017,7 +1039,7 @@ public bool Crown_eff() { foreach(ClientCard hand in Bot.Hand) { - if (hand.IsMonster() && IsTrickstar(hand.Id)) + if (hand.IsMonster() && IsTrickstar(hand)) { if (hand.Attack >= Enemy.LifePoints) return true; if (!hand.IsCode(CardId.Yellow)) @@ -1607,12 +1629,17 @@ public bool GraveCall_eff() if (!spell_trap_activate()) return false; if (Duel.LastChainPlayer == 1) { - if (Util.GetLastChainCard().IsMonster() && Enemy.HasInGraveyard(Util.GetLastChainCard().Id)) + if (Util.GetLastChainCard().IsMonster()) { - GraveCall_id = Util.GetLastChainCard().Id; - GraveCall_count = 2; - AI.SelectCard(GraveCall_id); - return true; + int code = Util.GetLastChainCard().GetOriginCode(); + if (CheckWhetherNegated(code)) return false; + ClientCard target = Enemy.Graveyard.GetFirstMatchingCard(c => c.GetOriginCode() == code); + if (target != null) + { + currentNegatingIdList.Add(code); + AI.SelectCard(target); + return true; + } } } return false; @@ -1634,14 +1661,14 @@ public bool DarkHole_eff() { if (enemy.IsMonsterDangerous()) { - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } if (enemy.IsFaceup() && (enemy.GetDefensePower() > bestenemy)) bestenemy = enemy.GetDefensePower(); } if (bestPower <= bestenemy) { - AI.SelectPlace(SelectSTPlace()); + AI.SelectPlace(SelectSTPlace(Card, true)); return true; } } @@ -1656,7 +1683,7 @@ public bool IsAllEnemyBetter() ClientCard card = Bot.MonsterZone[i]; if (card == null || card.Data == null) continue; int newPower = card.Attack; - if (IsTrickstar(card.Id) && Bot.HasInHand(CardId.White) && !white_eff_used) newPower += card.RealPower; + if (IsTrickstar(card) && Bot.HasInHand(CardId.White) && !white_eff_used) newPower += card.RealPower; if (newPower > bestPower) bestPower = newPower; } @@ -1667,7 +1694,7 @@ public bool MonsterRepos() { if (Card.IsCode(CardId.Eater)) return (!Card.HasPosition(CardPosition.Attack)); - if (IsTrickstar(Card.Id) && !white_eff_used && Bot.HasInHand(CardId.White) && Card.IsAttack() && Duel.Phase == DuelPhase.Main1) return false; + if (IsTrickstar(Card) && !white_eff_used && Bot.HasInHand(CardId.White) && Card.IsAttack() && Duel.Phase == DuelPhase.Main1) return false; if (Card.IsFaceup() && Card.IsDefense() && Card.Attack == 0) return false; @@ -1705,13 +1732,41 @@ public override void OnNewTurn() white_eff_used = false; lockbird_useful = false; lockbird_used = false; - if (GraveCall_count > 0) + Impermanence_list.Clear(); + currentNegatingIdList.Clear(); + base.OnNewTurn(); + } + + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + + if (player == 1) { - if (--GraveCall_count <= 0) + if (card.IsCode(_CardId.InfiniteImpermanence)) { - GraveCall_id = 0; - } + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == card) + { + Impermanence_list.Add(4-i); + break; + } + } + } } + base.OnChaining(player, card); + } + + public override void OnChainEnd() + { + currentNegatingIdList.Clear(); + base.OnChainEnd(); + } + + public bool CheckWhetherNegated(int cardId) + { + return !DefaultCheckWhetherCardIdIsNegated(cardId) && !currentNegatingIdList.Contains(cardId); } public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList defenders) @@ -1763,10 +1818,20 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender { if (!defender.IsMonsterHasPreventActivationEffectInBattle()) { - if (IsTrickstar(attacker.Id) && Bot.HasInHand(CardId.White) && !white_eff_used) - attacker.RealPower = attacker.RealPower + attacker.Attack; + if (IsTrickstar(attacker) && Bot.HasInHand(CardId.White) && !white_eff_used && !CheckWhetherNegated(CardId.White)) + attacker.RealPower += attacker.Attack; } return base.OnPreBattleBetween(attacker, defender); } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + AI.SelectPlace(SelectSTPlace(Card, true)); + return true; + } + return false; + } } } diff --git a/Game/AI/Decks/WitchcraftExecutor.cs b/Game/AI/Decks/WitchcraftExecutor.cs index dfb68e343..8c2c8faee 100644 --- a/Game/AI/Decks/WitchcraftExecutor.cs +++ b/Game/AI/Decks/WitchcraftExecutor.cs @@ -1,4 +1,4 @@ -using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper; using YGOSharp.OCGWrapper.Enums; using System.Collections.Generic; using WindBot; @@ -21,30 +21,24 @@ public class CardId public const int Haine = 84523092; public const int Schmietta = 21744288; public const int Pittore = 95245544; - public const int AshBlossom_JoyousSpring = 14558127; public const int PSYGamma = 38814750; - public const int MaxxC = 23434538; public const int Potterie = 59851535; public const int Genni = 64756282; public const int Collaboration = 10805153; public const int ThatGrassLooksGreener = 11110587; - public const int LightningStorm = 14532163; public const int PotofExtravagance = 49238328; public const int DarkRulerNoMore = 54693926; public const int Creation = 57916305; public const int Reasoning = 58577036; public const int MetalfoesFusion = 73594093; public const int Holiday = 83301414; - public const int CalledbytheGrave = 24224830; public const int Draping = 56894757; - public const int CrossoutDesignator = 65681983; public const int Unveiling = 70226289; public const int MagiciansLeftHand = 13758665; public const int Scroll = 19673561; public const int MagiciansRestage = 40252269; public const int WitchcrafterBystreet = 83289866; public const int MagicianRightHand = 87769556; - public const int InfiniteImpermanence = 10045474; public const int Masterpiece = 55072170; public const int Patronus = 94553671; public const int BorreloadSavageDragon = 27548199; @@ -60,10 +54,7 @@ public class CardId public const int RelinquishedAnima = 94259633; public const int NaturalExterio = 99916754; - public const int NaturalBeast = 33198837; - public const int ImperialOrder = 61740673; public const int SwordsmanLV7 = 37267041; - public const int RoyalDecreel = 51452091; public const int Anti_Spell = 58921041; public const int Numbe41BagooskatheTerriblyTiredTapir = 90590303; public const int PerformapalFive_RainbowMagician = 19619755; @@ -84,7 +75,7 @@ public WitchcraftExecutor(GameAI ai, Duel duel) // clear AddExecutor(ExecutorType.Activate, CardId.DarkRulerNoMore, DarkRulerNoMoreActivate); - AddExecutor(ExecutorType.Activate, CardId.LightningStorm, LightningStormActivate); + AddExecutor(ExecutorType.Activate, _CardId.LightningStorm, LightningStormActivate); AddExecutor(ExecutorType.Activate, CardId.RelinquishedAnima); // counter & quick effect @@ -93,13 +84,13 @@ public WitchcraftExecutor(GameAI ai, Duel duel) AddExecutor(ExecutorType.Activate, CardId.Potterie, DeckSSWitchcraft); AddExecutor(ExecutorType.Activate, CardId.Genni, DeckSSWitchcraft); AddExecutor(ExecutorType.Activate, CardId.PSYGamma, PSYGammaActivate); - AddExecutor(ExecutorType.Activate, CardId.MaxxC, MaxxCActivate); + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); AddExecutor(ExecutorType.Activate, CardId.GolemAruru, GolemAruruActivate); AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonActivate); - AddExecutor(ExecutorType.Activate, CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); - AddExecutor(ExecutorType.Activate, CardId.AshBlossom_JoyousSpring, AshBlossom_JoyousSpringActivate); - AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, CalledbytheGraveActivate); - AddExecutor(ExecutorType.Activate, CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossom_JoyousSpringActivate); + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); AddExecutor(ExecutorType.Activate, CardId.MagicianRightHand, SpellsActivate); AddExecutor(ExecutorType.Activate, CardId.MagiciansLeftHand, SpellsActivate); AddExecutor(ExecutorType.Activate, CardId.Unveiling, UnveilingActivate); @@ -187,16 +178,13 @@ public WitchcraftExecutor(GameAI ai, Duel duel) List FirstCheckSS = new List(); List UseSSEffect = new List(); List ActivatedCards = new List(); - Dictionary CalledbytheGraveCount = new Dictionary(); - int CrossoutDesignatorTarget = 0; + List currentNegatingIdList = new List(); bool MadameVerreGainedATK = false; bool summoned = false; bool enemy_activate_MaxxC = false; bool enemy_activate_DimensionShifter = false; bool MagiciansLeftHand_used = false; bool MagicianRightHand_used = false; - ClientCard MagiciansLeftHand_negate = null; - ClientCard MagicianRightHand_negate = null; // go first public override bool OnSelectHand() @@ -207,90 +195,73 @@ public override bool OnSelectHand() // reset the negated card in case of activated again public override void OnChainEnd() { - if (MagiciansLeftHand_negate != null) - { - MagiciansLeftHand_used = true; - MagiciansLeftHand_negate = null; - } - if (MagicianRightHand_negate != null) - { - MagicianRightHand_used = true; - MagicianRightHand_negate = null; - } + currentNegatingIdList.Clear(); base.OnChainEnd(); } - // check whether enemy activate important card - public override void OnChaining(int player, ClientCard card) + public override void OnChainSolved(int chainIndex) { - if (card == null) return; - // MagiciansLeftHand / MagicianRightHand - if (!MagicianRightHand_used && card.IsSpell() && card.Controller == 1) + ChainInfo currentCard = Duel.GetCurrentSolvingChainInfo(); + if (currentCard != null && currentCard.ActivatePlayer == 1) { - if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster)) != null - && Bot.HasInSpellZone(CardId.MagicianRightHand, true)) + if (Duel.IsCurrentSolvingChainNegated()) { - Logger.DebugWriteLine("MagicianRightHand negate: " + card.Name ?? "???"); - MagicianRightHand_negate = card; - } - } - if (!MagiciansLeftHand_used && card.IsTrap() && card.Controller == 1) - { - if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster)) != null - && Bot.HasInSpellZone(CardId.MagiciansLeftHand, true)) - { - Logger.DebugWriteLine("MagiciansLeftHand negate: " + card.Name ?? "???"); - MagiciansLeftHand_negate = card; + // MagiciansLeftHand / MagicianRightHand + if (!MagicianRightHand_used && currentCard.IsSpell()) + { + if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null + && Bot.HasInSpellZone(CardId.MagicianRightHand, true)) + { + Logger.DebugWriteLine("MagicianRightHand negate: " + currentCard.RelatedCard.Name ?? "???"); + MagicianRightHand_used = true; + } + } + if (!MagiciansLeftHand_used && currentCard.IsTrap() && currentCard.ActivatePlayer == 1) + { + if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null + && Bot.HasInSpellZone(CardId.MagiciansLeftHand, true)) + { + Logger.DebugWriteLine("MagiciansLeftHand negate: " + currentCard.RelatedCard.Name ?? "???"); + MagiciansLeftHand_used = true; + } + } } - } - - if (player == 1 && card.Id == CardId.MaxxC && CheckCalledbytheGrave(CardId.MaxxC) == 0) - { - enemy_activate_MaxxC = true; - } - if (player == 1 && card.Id == CardId.DimensionShifter && CheckCalledbytheGrave(CardId.DimensionShifter) == 0) - { - enemy_activate_DimensionShifter = true; - } - if (player == 1 && card.Id == CardId.InfiniteImpermanence && CrossoutDesignatorTarget != CardId.InfiniteImpermanence) - { - for (int i = 0; i < 5; ++i) + if (!Duel.IsCurrentSolvingChainNegated()) { - if (Enemy.SpellZone[i] == card) + if (currentCard.IsCode(_CardId.MaxxC)) + enemy_activate_MaxxC = true; + if (currentCard.IsCode(CardId.DimensionShifter)) + enemy_activate_DimensionShifter = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) { - Impermanence_list.Add(4-i); - break; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard.RelatedCard) + { + Impermanence_list.Add(4 - i); + break; + } + } } } } - base.OnChaining(player, card); } // new turn reset public override void OnNewTurn() { - CrossoutDesignatorTarget = 0; MadameVerreGainedATK = false; summoned = false; enemy_activate_MaxxC = false; enemy_activate_DimensionShifter = false; MagiciansLeftHand_used = false; MagicianRightHand_used = false; - MagiciansLeftHand_negate = null; - MagicianRightHand_negate = null; Impermanence_list.Clear(); FirstCheckSS.Clear(); UseSSEffect.Clear(); ActivatedCards.Clear(); - // CalledbytheGrave refresh - List key_list = CalledbytheGraveCount.Keys.ToList(); - foreach (int dic in key_list) - { - if (CalledbytheGraveCount[dic] > 1) - { - CalledbytheGraveCount[dic] -= 1; - } - } + currentNegatingIdList.Clear(); + base.OnNewTurn(); } // power fix @@ -298,7 +269,7 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender { if (!defender.IsMonsterHasPreventActivationEffectInBattle()) { - if (!MadameVerreGainedATK && Bot.HasInMonstersZone(CardId.MadameVerre, true, false, true) && attacker.HasSetcode(Witchcraft_setcode)) + if (!MadameVerreGainedATK && Bot.HasInMonstersZone(CardId.MadameVerre, true, false, true) && attacker.HasSetcode(Witchcraft_setcode)) { attacker.RealPower += CheckPlusAttackforMadameVerre(); } @@ -307,7 +278,7 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender } // overwrite OnSelectCard to act normally in SelectUnselect - public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable) + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) { // Patronus if (hint == HintMsg.AddToHand) @@ -365,7 +336,7 @@ public override IList OnSelectCard(IList cards, int min, break; } } - + // only special summon advance monster if (flag && levels.Count > 1) { @@ -380,7 +351,7 @@ public override IList OnSelectCard(IList cards, int min, { result.Add(checked_card[1]); return result; - } + } } for (int i = 0; i < 3; ++i) { @@ -422,10 +393,10 @@ public override CardPosition OnSelectPosition(int cardId, IList po { return base.OnSelectPosition(cardId, positions); } - if (!Enemy.HasInMonstersZone(_CardId.BlueEyesChaosMAXDragon) + if (!Enemy.HasInMonstersZone(_CardId.BlueEyesChaosMAXDragon) && (Duel.Player == 1 && (cardId == CardId.MadameVerre || Util.GetOneEnemyBetterThanValue(Data.Attack + 1) != null)) - || cardId == CardId.MaxxC || cardId == CardId.AshBlossom_JoyousSpring) + || cardId == _CardId.MaxxC || cardId == _CardId.AshBlossom) { return CardPosition.FaceUpDefence; } @@ -454,34 +425,19 @@ public List CardListShuffle(List list) // check negated time count of id public int CheckCalledbytheGrave(int id) { - if (!CalledbytheGraveCount.ContainsKey(id)) - { - return 0; - } - return CalledbytheGraveCount[id]; + if (currentNegatingIdList.Contains(id)) return 1; + if (DefaultCheckWhetherCardIdIsNegated(id)) return 1; + return 0; } // check enemy's dangerous card in grave public List CheckDangerousCardinEnemyGrave(bool onlyMonster = false) { - List result = Enemy.Graveyard.GetMatchingCards(card => + List result = Enemy.Graveyard.GetMatchingCards(card => (!onlyMonster || card.IsMonster()) && card.HasSetcode(0x11b)).ToList(); return result; } - // check whether negate maxxc and InfiniteImpermanence - public void CheckDeactiveFlag() - { - if (Util.GetLastChainCard() != null && Util.GetLastChainCard().Id == CardId.MaxxC && Duel.LastChainPlayer == 1) - { - enemy_activate_MaxxC = false; - } - if (Util.GetLastChainCard() != null && Util.GetLastChainCard().Id == CardId.DimensionShifter && Duel.LastChainPlayer == 1) - { - enemy_activate_DimensionShifter = false; - } - } - /// /// Check count of discardable spells for witchcraft monsters. /// @@ -514,7 +470,26 @@ public bool CheckLastChainNegated() ClientCard lastcard = Util.GetLastChainCard(); if (lastcard == null || lastcard.Controller != 1) return false; if (lastcard.IsMonster() && lastcard.HasSetcode(TimeLord_setcode) && Duel.Phase == DuelPhase.Standby) return false; - return lastcard == MagiciansLeftHand_negate || lastcard == MagicianRightHand_negate; + if (DefaultCheckWhetherCardIdIsNegated(lastcard.GetOriginCode())) return false; + + // MagiciansLeftHand / MagicianRightHand + if (!MagicianRightHand_used && lastcard.IsSpell()) + { + if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null + && Bot.HasInSpellZone(CardId.MagicianRightHand, true)) + { + return true; + } + } + if (!MagiciansLeftHand_used && lastcard.IsTrap()) + { + if (Bot.MonsterZone.GetFirstMatchingCard(c => c.HasRace(CardRace.SpellCaster) && c.IsFaceup()) != null + && Bot.HasInSpellZone(CardId.MagiciansLeftHand, true)) + { + return true; + } + } + return false; } /// @@ -529,7 +504,7 @@ public bool CheckLinkMaterialsMatch(int LinkCount, int MaterialCount, List= 6 ? 6 : spells_id.Count(); return max_hand * 1000; - + } /// @@ -706,12 +681,12 @@ public int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.Schmietta, 3); case CardId.Pittore: return Bot.GetRemainingCount(CardId.Pittore, 3); - case CardId.AshBlossom_JoyousSpring: - return Bot.GetRemainingCount(CardId.AshBlossom_JoyousSpring, 1); + case _CardId.AshBlossom: + return Bot.GetRemainingCount(_CardId.AshBlossom, 1); case CardId.PSYGamma: return Bot.GetRemainingCount(CardId.PSYGamma, 3); - case CardId.MaxxC: - return Bot.GetRemainingCount(CardId.MaxxC, 1); + case _CardId.MaxxC: + return Bot.GetRemainingCount(_CardId.MaxxC, 1); case CardId.Potterie: return Bot.GetRemainingCount(CardId.Potterie, 1); case CardId.Genni: @@ -720,8 +695,8 @@ public int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.Collaboration, 1); case CardId.ThatGrassLooksGreener: return Bot.GetRemainingCount(CardId.ThatGrassLooksGreener, 2); - case CardId.LightningStorm: - return Bot.GetRemainingCount(CardId.LightningStorm, 2); + case _CardId.LightningStorm: + return Bot.GetRemainingCount(_CardId.LightningStorm, 2); case CardId.PotofExtravagance: return Bot.GetRemainingCount(CardId.PotofExtravagance, 3); case CardId.DarkRulerNoMore: @@ -734,12 +709,12 @@ public int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.MetalfoesFusion, 1); case CardId.Holiday: return Bot.GetRemainingCount(CardId.Holiday, 3); - case CardId.CalledbytheGrave: - return Bot.GetRemainingCount(CardId.CalledbytheGrave, 3); + case _CardId.CalledByTheGrave: + return Bot.GetRemainingCount(_CardId.CalledByTheGrave, 3); case CardId.Draping: return Bot.GetRemainingCount(CardId.Draping, 1); - case CardId.CrossoutDesignator: - return Bot.GetRemainingCount(CardId.CrossoutDesignator, 2); + case _CardId.CrossoutDesignator: + return Bot.GetRemainingCount(_CardId.CrossoutDesignator, 2); case CardId.Unveiling: return Bot.GetRemainingCount(CardId.Unveiling, 1); case CardId.MagiciansLeftHand: @@ -752,8 +727,8 @@ public int CheckRemainInDeck(int id) return Bot.GetRemainingCount(CardId.WitchcrafterBystreet, 3); case CardId.MagicianRightHand: return Bot.GetRemainingCount(CardId.MagicianRightHand, 1); - case CardId.InfiniteImpermanence: - return Bot.GetRemainingCount(CardId.InfiniteImpermanence, 3); + case _CardId.InfiniteImpermanence: + return Bot.GetRemainingCount(_CardId.InfiniteImpermanence, 3); case CardId.Masterpiece: return Bot.GetRemainingCount(CardId.Masterpiece, 1); case CardId.Patronus: @@ -808,7 +783,7 @@ public bool SpellNegatable(bool isCounter = false, ClientCard target = null) { // target default set if (target == null) target = Card; - if (target.Id == CrossoutDesignatorTarget) return true; + if (CheckCalledbytheGrave(target.GetOriginCode()) > 0) return true; // won't negate if not on field if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; @@ -816,13 +791,13 @@ public bool SpellNegatable(bool isCounter = false, ClientCard target = null) if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; if (target.IsSpell()) { - if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; - if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true)) return true; + if (Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Bot.HasInSpellZone(_CardId.ImperialOrder, true)) return true; if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; } if (target.IsTrap()) { - if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return true; + if (Enemy.HasInSpellZone(_CardId.RoyalDecreel, true) || Bot.HasInSpellZone(_CardId.RoyalDecreel, true)) return true; } // how to get here? return false; @@ -835,7 +810,7 @@ public bool NegatedCheck(bool disablecheck = true){ if (Card.IsSpell() || Card.IsTrap()){ if (SpellNegatable()) return true; } - if (CheckCalledbytheGrave(Card.Id) > 0 || Card.Id == CrossoutDesignatorTarget){ + if (CheckCalledbytheGrave(Card.GetOriginCode()) > 0){ return true; } if (Card.IsMonster() && Card.Location == CardLocation.MonsterZone && Card.IsDefense()) @@ -858,27 +833,44 @@ public bool NegatedCheck(bool disablecheck = true){ /// Card to set(default current card) /// Whether need to avoid InfiniteImpermanence /// Whether need to avoid set in this place - public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List avoid_list=null) + public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List avoid_list = null) { - List list = new List { 0, 1, 2, 3, 4 }; + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; + if (avoid_list != null && avoid_list.Contains(seq)) continue; + list.Add(seq); + } + } int n = list.Count; while (n-- > 1) { - int index = Program.Rand.Next(n + 1); - int temp = list[index]; - list[index] = list[n]; - list[n] = temp; + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; } - foreach (int seq in list) + if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) { - int zone = (int)System.Math.Pow(2, seq); - if (Bot.SpellZone[seq] == null) + foreach (int seq in list) { - if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; - if (avoid_list != null && avoid_list.Contains(seq)) continue; + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); AI.SelectPlace(zone); return; - }; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; } AI.SelectPlace(0); } @@ -886,7 +878,7 @@ public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = fals // Spell&trap's set public bool SpellSet(){ if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; - if (Card.Id == CardId.CrossoutDesignator && Duel.Turn >= 5) return false; + if (Card.Id == _CardId.CrossoutDesignator && Duel.Turn >= 5) return false; // set condition int[] activate_with_condition = { CardId.Masterpiece, CardId.Draping }; @@ -939,9 +931,9 @@ public bool SpellSet(){ Impermanence_set += (int)System.Math.Pow(2, 4 - i); } } - if (Bot.HasInHand(CardId.InfiniteImpermanence)) + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) { - if (Card.IsCode(CardId.InfiniteImpermanence)) + if (Card.IsCode(_CardId.InfiniteImpermanence)) { AI.SelectPlace(Impermanence_set); return true; @@ -1101,7 +1093,7 @@ public void SelectDiscardSpell() } else { - AI.SelectCard(CardId.ThatGrassLooksGreener, CardId.LightningStorm, CardId.PotofExtravagance, CardId.MagiciansLeftHand, CardId.MagicianRightHand, CardId.CrossoutDesignator, CardId.CalledbytheGrave); + AI.SelectCard(CardId.ThatGrassLooksGreener, _CardId.LightningStorm, CardId.PotofExtravagance, CardId.MagiciansLeftHand, CardId.MagicianRightHand, _CardId.CrossoutDesignator, _CardId.CalledByTheGrave); } } @@ -1151,7 +1143,7 @@ public bool SpellsActivatewithCounter() { if (SpellNegatable()) return false; if ((Card.Id == CardId.ThatGrassLooksGreener || Card.Id == CardId.Reasoning) && CheckWhetherWillbeRemoved()) return false; - int[] counter_cards = { CardId.PSYGamma, CardId.CalledbytheGrave, CardId.CrossoutDesignator }; + int[] counter_cards = { CardId.PSYGamma, _CardId.CalledByTheGrave, _CardId.CrossoutDesignator }; int count = Bot.Hand.GetMatchingCardsCount(card => counter_cards.Contains(card.Id)); count += Bot.SpellZone.GetMatchingCardsCount(card => counter_cards.Contains(card.Id)); if (count > 0 || Bot.Hand.GetCardCount(Card.Id) >= 2) @@ -1272,13 +1264,13 @@ public bool DeckSSWitchcraft() int best_power = Util.GetBestAttack(Bot); if (CheckRemainInDeck(CardId.Haine) > 0 && best_power < 2400) best_power = 2400; Logger.DebugWriteLine("less summon check: " + (best_power + extra_attack - 1000).ToString() + " to " + (best_power + extra_attack).ToString()); - if (Util.GetOneEnemyBetterThanValue(best_power) != null + if (Util.GetOneEnemyBetterThanValue(best_power) != null && Util.GetOneEnemyBetterThanValue(best_power + extra_attack) == null && Util.GetOneEnemyBetterThanValue(best_power + extra_attack - 1000) != null) { lesssummon = true; } - + // SS lower 4 if (!enemy_activate_MaxxC && !lesssummon && discardable_hands >= 2 && Duel.Player == 0) { @@ -1374,7 +1366,7 @@ public bool MadameVerreActivate() // negate battle related effect if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) { - if (Enemy.MonsterZone.GetFirstMatchingCard(card => + if (Enemy.MonsterZone.GetFirstMatchingCard(card => card.IsMonsterDangerous() || (Duel.Player == 0) && card.IsMonsterInvincible()) != null) { SelectDiscardSpell(); @@ -1477,7 +1469,7 @@ public bool HaineActivate() return true; } } - + // end check if (Duel.Player == 0 && Duel.Phase == DuelPhase.End) @@ -1537,7 +1529,7 @@ public bool SchmiettaActivate() bool can_find_Holiday = Bot.HasInHandOrInSpellZone(CardId.Holiday) || (can_recycle && Bot.HasInGraveyard(CardId.Holiday) && !(ActivatedCards.Contains(CardId.Holiday))); // monster check - if (Bot.HasInHand(important_witchcraft) && !Bot.HasInGraveyard(CardId.Pittore) + if (Bot.HasInHand(important_witchcraft) && !Bot.HasInGraveyard(CardId.Pittore) && !ActivatedCards.Contains(CardId.Pittore) && CheckRemainInDeck(CardId.Pittore) > 0 && can_find_Holiday){ AI.SelectCard(CardId.Pittore); ActivatedCards.Add(CardId.Schmietta); @@ -1650,7 +1642,6 @@ public bool PittoreActivate() public bool AshBlossom_JoyousSpringActivate() { if (NegatedCheck(true) || CheckLastChainNegated()) return false; - CheckDeactiveFlag(); return DefaultAshBlossomAndJoyousSpring(); } @@ -1658,7 +1649,6 @@ public bool AshBlossom_JoyousSpringActivate() public bool PSYGammaActivate() { if (NegatedCheck(true)) return false; - CheckDeactiveFlag(); return true; } @@ -1683,7 +1673,7 @@ public bool PotterieActivate() return true; } } - + // safe check if (CheckProblematicCards() == null){ int[] checklist = {CardId.Patronus, CardId.GolemAruru}; @@ -1775,7 +1765,7 @@ public bool LightningStormActivate() if (opt == -1) return false; // only one selection - if (Enemy.MonsterZone.GetFirstMatchingCard(card => card.IsAttack()) == null + if (Enemy.MonsterZone.GetFirstMatchingCard(card => card.IsAttack()) == null || Enemy.GetSpellCount() == 0) { AI.SelectOption(0); @@ -1930,30 +1920,30 @@ public bool CalledbytheGraveActivate() // negate if (Util.GetLastChainCard().IsMonster()) { - int code = Util.GetLastChainCard().Id; + int code = Util.GetLastChainCard().GetOriginCode(); if (code == 0) return false; - if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTarget == code) return false; - if (Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)) != null) + if (CheckCalledbytheGrave(code) > 0) return false; + ClientCard target = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.IsOriginalCode(code)); + if (target != null) { if (!(Card.Location == CardLocation.SpellZone)) { SelectSTPlace(null, true); } - AI.SelectCard(code); - CalledbytheGraveCount[code] = 2; - CheckDeactiveFlag(); + AI.SelectCard(target); + currentNegatingIdList.Add(code); return true; } } - + // banish target foreach (ClientCard cards in Enemy.Graveyard) { if (Duel.ChainTargets.Contains(cards)) { - int code = cards.Id; + int code = cards.GetOriginCode(); AI.SelectCard(cards); - CalledbytheGraveCount[code] = 2; + currentNegatingIdList.Add(code); return true; } } @@ -1966,9 +1956,9 @@ public bool CalledbytheGraveActivate() { enemy_monsters.Sort(CardContainer.CompareCardAttack); enemy_monsters.Reverse(); - int code = enemy_monsters[0].Id; - AI.SelectCard(code); - CalledbytheGraveCount[code] = 2; + int code = enemy_monsters[0].GetOriginCode(); + AI.SelectCard(enemy_monsters); + currentNegatingIdList.Add(code); return true; } } @@ -1978,13 +1968,13 @@ public bool CalledbytheGraveActivate() if (Duel.LastChainPlayer == 1) return false; List targets = CheckDangerousCardinEnemyGrave(true); if (targets.Count() > 0) { - int code = targets[0].Id; + int code = targets[0].GetOriginCode(); if (!(Card.Location == CardLocation.SpellZone)) { SelectSTPlace(null, true); } - AI.SelectCard(code); - CalledbytheGraveCount[code] = 2; + AI.SelectCard(targets); + currentNegatingIdList.Add(code); return true; } @@ -2024,14 +2014,12 @@ public bool DrapingActivate() public bool CrossoutDesignatorActivate() { if (NegatedCheck(true) || CheckLastChainNegated()) return false; - // negate + // negate if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) { - int code = Util.GetLastChainCard().Id; - int alias = Util.GetLastChainCard().Alias; - if (alias != 0 && alias - code < 10) code = alias; + int code = Util.GetLastChainCard().GetOriginCode(); if (code == 0) return false; - if (CheckCalledbytheGrave(code) > 0 || CrossoutDesignatorTarget == code) return false; + if (CheckCalledbytheGrave(code) > 0) return false; if (CheckRemainInDeck(code) > 0) { if (!(Card.Location == CardLocation.SpellZone)) @@ -2039,8 +2027,7 @@ public bool CrossoutDesignatorActivate() SelectSTPlace(null, true); } AI.SelectAnnounceID(code); - CrossoutDesignatorTarget = code; - CheckDeactiveFlag(); + currentNegatingIdList.Add(code); return true; } } @@ -2054,7 +2041,7 @@ public bool UnveilingActivate() if (NegatedCheck(true)) return false; // LightningStorm check - if (Bot.HasInHandOrInSpellZone(CardId.LightningStorm)) + if (Bot.HasInHandOrInSpellZone(_CardId.LightningStorm)) { int faceup_count = Bot.SpellZone.GetMatchingCardsCount(card => card.IsFaceup()); faceup_count += Bot.MonsterZone.GetMatchingCardsCount(card => card.IsFaceup()); @@ -2152,15 +2139,14 @@ public bool WitchcrafterBystreetActivate() public bool InfiniteImpermanenceActivate() { if (SpellNegatable()) return false; - if (CrossoutDesignatorTarget == CardId.InfiniteImpermanence) return false; if (CheckLastChainNegated()) return false; // negate before monster's effect's used foreach (ClientCard m in Enemy.GetMonsters()) { - if (!m.IsDisabled() && Duel.LastChainPlayer != 0 && + if (!m.IsDisabled() && Duel.LastChainPlayer != 0 && ((m.IsMonsterShouldBeDisabledBeforeItUseEffect() || m.IsFloodgate()) - || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2 && - (m.IsMonsterDangerous() || m.IsMonsterInvincible() + || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2 && + (m.IsMonsterDangerous() || m.IsMonsterInvincible() || (m.IsMonsterHasPreventActivationEffectInBattle() && Bot.HasInMonstersZone(CardId.MadameVerre))) ))) { @@ -2273,7 +2259,7 @@ public bool MasterpieceActivate() // ss effect { // LightningStorm check - if (Bot.HasInHandOrInSpellZone(CardId.LightningStorm)) + if (Bot.HasInHandOrInSpellZone(_CardId.LightningStorm)) { int faceup_count = Bot.SpellZone.GetMatchingCardsCount(card => card.IsFaceup()); faceup_count += Bot.MonsterZone.GetMatchingCardsCount(card => card.IsFaceup()); @@ -2460,7 +2446,6 @@ public bool BorreloadSavageDragonActivate() // negate if (NegatedCheck(true) || Duel.LastChainPlayer != 1) return false; if (Util.GetLastChainCard().HasSetcode(0x11e) && Util.GetLastChainCard().Location == CardLocation.Hand) return false; - CheckDeactiveFlag(); return false; } @@ -2512,10 +2497,10 @@ public bool PSYOmegaActivate() } if (CheckProblematicCards() == null) { - AI.SelectCard(CardId.CalledbytheGrave, CardId.CrossoutDesignator, - CardId.MaxxC, CardId.AshBlossom_JoyousSpring, - CardId.MagicianRightHand, CardId.MagiciansLeftHand, CardId.MagiciansRestage, CardId.Patronus, - CardId.LightningStorm, CardId.Reasoning); + AI.SelectCard(_CardId.CalledByTheGrave, _CardId.CrossoutDesignator, + _CardId.MaxxC, _CardId.AshBlossom, + CardId.MagicianRightHand, CardId.MagiciansLeftHand, CardId.MagiciansRestage, CardId.Patronus, + _CardId.LightningStorm, CardId.Reasoning); return true; } } @@ -2666,7 +2651,7 @@ public bool KnightmareUnicornActivate() } return false; } - + // check whether summon KnightmarePhoenix public List KnightmarePhoenixSummonCheck(ClientCard included = null) { @@ -2735,7 +2720,7 @@ public List CrystronHalqifibraxSummonCheck(ClientCard included = nul if (materials.Count < 2) return empty_list; // need CrystronHalqifibrax? - if (CheckRemainInDeck(CardId.PSYGamma, CardId.AshBlossom_JoyousSpring) == 0) return empty_list; + if (CheckRemainInDeck(CardId.PSYGamma, _CardId.AshBlossom) == 0) return empty_list; return empty_list; @@ -2914,5 +2899,15 @@ public bool ChickenGame() } return false; } + + protected override bool DefaultSetForDiabellze() + { + if (base.DefaultSetForDiabellze()) + { + SelectSTPlace(null, true); + return true; + } + return false; + } } -} +} \ No newline at end of file diff --git a/Game/AI/Decks/YosenjuExecutor.cs b/Game/AI/Decks/YosenjuExecutor.cs index 8e603c531..b58247e55 100644 --- a/Game/AI/Decks/YosenjuExecutor.cs +++ b/Game/AI/Decks/YosenjuExecutor.cs @@ -155,9 +155,10 @@ public override bool OnSelectHand() public override void OnNewTurn() { CardOfDemiseUsed = false; + base.OnNewTurn(); } - public override bool OnSelectYesNo(long desc) + public override bool OnSelectYesNo(int desc) { // Yosenju Kama 2 shouldn't attack directly at most times if (Card == null) diff --git a/Game/AI/Decks/YubelExecutor.cs b/Game/AI/Decks/YubelExecutor.cs new file mode 100644 index 000000000..88c2d8513 --- /dev/null +++ b/Game/AI/Decks/YubelExecutor.cs @@ -0,0 +1,2359 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +using YGOSharp.Network.Enums; +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; + +namespace WindBot.Game.AI.Decks +{ + [Deck("Yubel", "AI_Yubel")] + public class YubelExecutor : DefaultExecutor + { + public class CardId + { + // === Core Yubel === + public const int YUBEL = 78371393; + public const int YUBEL_TERROR_INCARNATE = 4779091; + public const int SPIRIT_OF_YUBEL = 90829280; + public const int PHANTOM_OF_YUBEL = 80453041; // (extra) + + // === Starters / Engine === + public const int SAMSARA_D_LOTUS = 62318994; + public const int GRUESOME_GRAVE_SQUIRMER = 24215921; + public const int FABLED_LURRIE = 97651498; + + // === Fiendsmith / Fiend package === + public const int SHARVARA = 41165831; + public const int FIENDSMITH_ENGRAVER = 60764609; + public const int LACRIMA_CT = 28803166; + public const int DARK_BECKONING_BEAST = 81034083; + public const int CHAOS_SUMMONING_BEAST = 27439792; + + // === Spells / Traps === + public const int NIGHTMARE_PAIN = 65261141; + public const int NIGHTMARE_THRONE = 93729896; + public const int SPIRIT_GATES = 80312545; + public const int FIENDSMITH_TRACT = 98567237; + public const int ABOMINABLE_CHAMBER = 80801743; + public const int FIENDSMITHS_PARADISE = 99989863; + public const int TERRAFORMING = 73628505; + + // === Extra Deck / อื่น ๆ === + public const int FIENDSMITHS_DESIRAE = 82135803; + //public const int FIENDSMITHS_LACRIMA = 46640168; + public const int VARUDASN_FINAL_BRINGER = 70636044; + public const int DDD_WAVE_HIGH_KING_CAESAR = 79559912; + public const int UNCHAINED_LORD_OF_YAMA = 24269961; + public const int UNCHAINED_SOUL_OF_RAGE = 67680512; + public const int SP_LITTLE_KNIGHT = 29301450; + public const int MOON_OF_THE_CLOSED_HEAVEN = 71818935; + //public const int FIENDSMITHS_SEQUENCE = 49867899; + //public const int MUCKRAKER_UNDERWORLD = 71607202; + public const int FIENDSMITHS_REQUIEM = 2463794; + public const int SALAMANGREAT_ALMIRAJ = 60303245; + public const int NECROQUIP = 93860227; + //public const int ARIALEATER = 28143384; + public const int GORGONOFZIL = 12067160; + public const int GUSTAVMAX = 56910167; + public const int JUGGERNAUT = 26096328; + public const int UNCHAINDEDABOMINATION = 29479265; + + // === Handtraps / Others (blacklist/targets etc.) === + public const int Fuwalos = 42141493; + public const int NaturalExterio = 99916754; + public const int NaturalBeast = 33198837; + public const int ImperialOrder = 61740673; + public const int SwordsmanLV7 = 37267041; + public const int RoyalDecree = 51452091; + public const int Number41BagooskatheTerriblyTiredTapir = 90590303; + public const int InspectorBoarder = 15397015; + public const int SkillDrain = 82732705; + public const int DivineArsenalAAZEUS_SkyThunder = 90448279; + public const int DimensionShifter = 91800273; + public const int MacroCosmos = 30241314; + public const int DimensionalFissure = 81674782; + public const int BanisheroftheRadiance = 94853057; + public const int BanisheroftheLight = 61528025; + public const int KashtiraAriseHeart = 48626373; + public const int AccesscodeTalker = 86066372; + public const int GhostMournerMoonlitChill = 52038441; + public const int NibiruThePrimalBeing = 27204311; + } + + const int SetcodeTimeLord = 0x4a; + const int SetcodePhantom = 0xdb; + const int SetcodeOrcust = 0x11b; + const int SetcodeHorus = 0x19d; + + Dictionary> DeckCountTable = new Dictionary>{ + {3, new List { CardId.SPIRIT_OF_YUBEL, CardId.SAMSARA_D_LOTUS,CardId.NIGHTMARE_THRONE, CardId.SPIRIT_GATES, + _CardId.AshBlossom, CardId.DARK_BECKONING_BEAST,_CardId.InfiniteImpermanence } }, + {2, new List { _CardId.MaxxC, _CardId.CalledByTheGrave,CardId.GRUESOME_GRAVE_SQUIRMER}}, + {1, new List { CardId.FIENDSMITH_ENGRAVER, CardId.FIENDSMITHS_PARADISE, + CardId.YUBEL, CardId.YUBEL_TERROR_INCARNATE, CardId.ABOMINABLE_CHAMBER, + _CardId.CrossoutDesignator, CardId.GRUESOME_GRAVE_SQUIRMER, CardId.FABLED_LURRIE, + CardId.NIGHTMARE_PAIN, CardId.TERRAFORMING, CardId.FIENDSMITH_TRACT,CardId.SHARVARA, + CardId.CHAOS_SUMMONING_BEAST, CardId.LACRIMA_CT + } } + }; + + List notToNegateIdList = new List { 58699500, 20343502, 19403423 }; + List notToDestroySpellTrap = new List { 50005218, 6767771 }; + List targetNegateIdList = new List { + _CardId.EffectVeiler, _CardId.InfiniteImpermanence, CardId.GhostMournerMoonlitChill, _CardId.BreakthroughSkill, 74003290, 67037924, + 9753964, 66192538, 23204029, 73445448, 35103106, 30286474, 45002991, 5795980, 38511382, 53742162, 30430448 + }; + + private static readonly int[] LinkFodderPriority = new[] + { + CardId.SHARVARA, + CardId.YUBEL_TERROR_INCARNATE, + CardId.UNCHAINED_SOUL_OF_RAGE, + CardId.UNCHAINED_LORD_OF_YAMA, + CardId.GRUESOME_GRAVE_SQUIRMER, + CardId.FABLED_LURRIE, + CardId.LACRIMA_CT, + CardId.SALAMANGREAT_ALMIRAJ, + CardId.DARK_BECKONING_BEAST, + CardId.CHAOS_SUMMONING_BEAST, + CardId.SAMSARA_D_LOTUS, + CardId.SPIRIT_OF_YUBEL, + CardId.YUBEL, + CardId.FIENDSMITH_ENGRAVER, + }; + + private static readonly HashSet YUBEL_SET = new HashSet { CardId.YUBEL, CardId.YUBEL_TERROR_INCARNATE, CardId.SPIRIT_OF_YUBEL, CardId.PHANTOM_OF_YUBEL }; + + public YubelExecutor(GameAI ai, Duel duel) : base(ai, duel) + { + + AddExecutor(ExecutorType.Activate, CardId.NIGHTMARE_THRONE, ActNightmareThroneSearch); + // ===== Generic counters ===== + AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, CalledbytheGraveActivate); + AddExecutor(ExecutorType.Activate, _CardId.CrossoutDesignator, CrossoutDesignatorActivate); + AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, InfiniteImpermanenceActivate); + AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, AshBlossomActivate); + AddExecutor(ExecutorType.Activate, _CardId.MaxxC, MaxxCActivate); + + // ===== Yubel-related ===== + AddExecutor(ExecutorType.Activate, CardId.SAMSARA_D_LOTUS, ActSamsaraDLotusGY); + AddExecutor(ExecutorType.Activate, CardId.YUBEL); + AddExecutor(ExecutorType.Activate, CardId.UNCHAINDEDABOMINATION, UnchainedAbominationActivate); + AddExecutor(ExecutorType.Activate, CardId.PHANTOM_OF_YUBEL, DontSelfNG); + + + // ===== Engine pieces ===== + AddExecutor(ExecutorType.Activate, CardId.ABOMINABLE_CHAMBER, ActAbo); + //AddExecutor(ExecutorType.Activate, CardId.SP_LITTLE_KNIGHT, ActLittleKnightSM); + AddExecutor(ExecutorType.Activate, CardId.SP_LITTLE_KNIGHT, ActLittleKnight); + AddExecutor(ExecutorType.Activate, CardId.DDD_WAVE_HIGH_KING_CAESAR, DontSelfNG); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITHS_DESIRAE, ActDesirae); + AddExecutor(ExecutorType.Activate, CardId.VARUDASN_FINAL_BRINGER, ActVarudras); + AddExecutor(ExecutorType.Activate, CardId.UNCHAINED_SOUL_OF_RAGE, ActRageQuickLink); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITHS_PARADISE, ActParadise); + + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITH_ENGRAVER, ActEngraverHand); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITH_TRACT, ActTract); + AddExecutor(ExecutorType.SpSummon, CardId.FABLED_LURRIE); + AddExecutor(ExecutorType.SpSummon, CardId.FIENDSMITHS_REQUIEM, SSRequiem); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITHS_REQUIEM, ActRequiemMZ); + AddExecutor(ExecutorType.Activate, CardId.LACRIMA_CT, ActLacimaCT); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITHS_REQUIEM, ActRequiemEQ); + AddExecutor(ExecutorType.SpSummon, CardId.NECROQUIP, SSNecroquip); + AddExecutor(ExecutorType.Activate, CardId.FIENDSMITH_ENGRAVER, ActEngraverGY); + AddExecutor(ExecutorType.SpSummon, CardId.DDD_WAVE_HIGH_KING_CAESAR); + + AddExecutor(ExecutorType.Activate, CardId.LACRIMA_CT, ActLacimaCTGY); + + // Field & search line + AddExecutor(ExecutorType.Activate, S1_ActivateTerraformingForThrone); + AddExecutor(ExecutorType.Activate, CardId.NIGHTMARE_THRONE, S6_ChainThroneFollowUp); + + // Normal Summon engine + AddExecutor(ExecutorType.Summon, CardId.DARK_BECKONING_BEAST, NSDarkBeckoningBeast); + AddExecutor(ExecutorType.Activate, CardId.DARK_BECKONING_BEAST, ActDarkBeckoningBeast); + + // === SPIRIT GATES === + AddExecutor(ExecutorType.Activate, CardId.SPIRIT_GATES, S4_ActivateSpiritGates); // ใช้จากมือเพื่อค้น + AddExecutor(ExecutorType.Activate, CardId.SPIRIT_GATES, Gate_RecycleContinuous); // e3: เก็บ Continuous (มีเลเวล 10) + + + AddExecutor(ExecutorType.Summon, CardId.SAMSARA_D_LOTUS, NSSamsaraDLotus); + AddExecutor(ExecutorType.Activate, CardId.SAMSARA_D_LOTUS, ActSamsaraDLotus); + + // Follow-ups + AddExecutor(ExecutorType.SpSummon, CardId.SPIRIT_OF_YUBEL); + AddExecutor(ExecutorType.Activate, CardId.SPIRIT_OF_YUBEL); + AddExecutor(ExecutorType.Activate, CardId.NIGHTMARE_PAIN, ActNightmarePainHand); + AddExecutor(ExecutorType.Activate, CardId.NIGHTMARE_PAIN, ActNightmarePainEffect); + AddExecutor(ExecutorType.Activate, CardId.GRUESOME_GRAVE_SQUIRMER, SSGGS); + AddExecutor(ExecutorType.Activate, CardId.GRUESOME_GRAVE_SQUIRMER, ActGGSGY); + + AddExecutor(ExecutorType.SpSummon, CardId.MOON_OF_THE_CLOSED_HEAVEN, SSMoon); + AddExecutor(ExecutorType.SpSummon, CardId.UNCHAINED_LORD_OF_YAMA, L2YamaSetup); + AddExecutor(ExecutorType.Activate, CardId.UNCHAINED_LORD_OF_YAMA, ActYamaMZ); + AddExecutor(ExecutorType.Activate, CardId.UNCHAINED_LORD_OF_YAMA, ActYamaGY); + AddExecutor(ExecutorType.SpSummon, CardId.UNCHAINED_SOUL_OF_RAGE, L2RageKeepYama); + AddExecutor(ExecutorType.SpSummon, CardId.UNCHAINDEDABOMINATION, L4ABOSS); + AddExecutor(ExecutorType.Activate, CardId.SHARVARA, ActSharvara); + AddExecutor(ExecutorType.Activate, CardId.SHARVARA, ActSharvaraGY); + //AddExecutor(ExecutorType.SpSummon, CardId.MUCKRAKER_UNDERWORLD, L2NoBrain); + + + + // Panic line + //AddExecutor(ExecutorType.SpSummon, CardId.VARUDASN_FINAL_BRINGER, SSVarudras); + AddExecutor(ExecutorType.SpSummon, CardId.VARUDASN_FINAL_BRINGER); + AddExecutor(ExecutorType.SpSummon, CardId.SALAMANGREAT_ALMIRAJ, AlmirajSummon); + AddExecutor(ExecutorType.Activate, CardId.SPIRIT_GATES, Gate_Revive00Fiend); // e2: ทิ้งมือ ชุบ Fiend 0/0 + AddExecutor(ExecutorType.SpSummon, CardId.PHANTOM_OF_YUBEL, SSPhantom); + AddExecutor(ExecutorType.SpSummon, CardId.GUSTAVMAX); + AddExecutor(ExecutorType.Activate, CardId.GUSTAVMAX); + AddExecutor(ExecutorType.SpSummon, CardId.JUGGERNAUT); + AddExecutor(ExecutorType.Activate, CardId.JUGGERNAUT); + //AddExecutor(ExecutorType.Activate, CardId.MUCKRAKER_UNDERWORLD, NeverUseMuckrakerRevive); + + // other + AddExecutor(ExecutorType.SpellSet, SpellSetCheck); + AddExecutor(ExecutorType.Repos, MonsterRepos); + } + //======================Default code + #region Default Code Start Here + private int _totalAttack; + private int _totalBotAttack; + bool enemyActivateMaxxC = false; + bool enemyActivateLockBird = false; + int dimensionShifterCount = 0; + bool enemyActivateInfiniteImpermanenceFromHand = false; + List infiniteImpermanenceList = new List(); + List currentNegateCardList = new List(); + List currentDestroyCardList = new List(); + List sendToGYThisTurn = new List(); + List activatedCardIdList = new List(); + List enemyPlaceThisTurn = new List(); + List escapeTargetList = new List(); + List summonThisTurn = new List(); + + private enum ThroneStage { None, Searching, AwaitDestroyPrompt } + private bool _yubelWantsTribute = false; + private ThroneStage _throneStage = ThroneStage.None; + // === Spirit Gates state === + int _gateReviveTargetId = 0; // จะชุบตัวไหน + int _gateDiscardPreferredId = 0; // จะทิ้งใบไหนเป็น cost + bool _gateWantsRecycle = false; // กำลังจะกดโหมดเก็บ Continuous + bool _spQuickMode = false; + bool moonSummoned = false; + bool requiemSummoned = false; + bool thronePending = false; // we're in a Throne activation flow + bool throneSearched = false; // after we chose the monster to search + int throneDesiredPick = 0; // preferred monster id to search + + public List ShuffleList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(result.Count); + int nextIndex = (index + Program.Rand.Next(result.Count - 1)) % result.Count; + T tempCard = result[index]; + result[index] = result[nextIndex]; + result[nextIndex] = tempCard; + } + return result; + } + + public override bool OnSelectHand() { return true; } + + public List ShuffleCardList(List list) + { + List result = list; + int n = result.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(n + 1); + ClientCard temp = result[index]; + result[index] = result[n]; + result[n] = temp; + } + return result; + } + + public int CheckRemainInDeck(int id) + { + for (int count = 1; count < 4; ++count) + { + if (DeckCountTable[count].Contains(id)) + { + return Bot.GetRemainingCount(id, count); + } + } + return 0; + } + + private bool MonsterRepos() + { + bool isYubelFam = + Card.Id == CardId.SPIRIT_OF_YUBEL || + Card.Id == CardId.YUBEL || + Card.Id == CardId.YUBEL_TERROR_INCARNATE || + Card.Id == CardId.PHANTOM_OF_YUBEL; + + if (isYubelFam) + { + if (Card.IsDefense()) + { + AI.SelectPosition(CardPosition.Attack); + return true; + } + return false; + } + if (Card.IsFacedown()) + return true; + if (CheckInDanger() && (_totalAttack > _totalBotAttack)) + return Card.IsDefense(); + return DefaultMonsterRepos(); + } + + public bool CheckAtAdvantage() + { + if (GetProblematicEnemyMonster() == null && Bot.GetMonsters().Any(card => card.IsFaceup())) + { + return true; + } + return false; + } + + public bool CheckInDanger() + { + if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) + { + int totalAtk = 0; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsAttack() && !m.Attacked) totalAtk += m.Attack; + } + if (totalAtk >= Bot.LifePoints) return true; + } + return false; + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + if (player == 0 && location == CardLocation.MonsterZone && cardId == CardId.UNCHAINED_SOUL_OF_RAGE) + { + int prefer = (GetMyLinkedMMZMask() & available) & 0x1F; + + int choose = (prefer != 0) ? LowestBit(prefer) + : LowestBit(available & 0x1F); // fallback + + AI.SelectPlace(choose); + return choose; + } + SelectSTPlace(Card, true); + return base.OnSelectPlace(cardId, player, location, available); + } + + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + if (positions == null || positions.Count == 0) + return base.OnSelectPosition(cardId, positions); + + bool isYubelFamily = + YUBEL_SET.Contains(cardId) || + (Card != null && YUBEL_SET.Contains(Card.Id)) || + (Card != null && (Card.Name?.Contains("Yubel") ?? false)); + + if(!isYubelFamily) + return base.OnSelectPosition(cardId, positions); + + CardPosition atkPref = + positions.Contains(CardPosition.FaceUpAttack) ? CardPosition.FaceUpAttack : + positions.Contains(CardPosition.Attack) ? CardPosition.Attack : + (CardPosition)0; + + if (isYubelFamily && atkPref != 0) + { + AI.SelectPosition(atkPref); + return atkPref; + } + + var chosen = positions[0]; + AI.SelectPosition(chosen); + return chosen; + } + + public bool AshBlossomActivate() + { + if (BlockIfThrone("AshBlossom")) return false;//added + if (InThroneFlow) return false;//added + if (CheckWhetherNegated(true) || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + if (CheckAtAdvantage()) + { + return false; + } + } + return DefaultAshBlossomAndJoyousSpring(); + } + + public bool MaxxCActivate() + { + if (BlockIfThrone("MaxxC")) return false; + if (InThroneFlow) return false;//added + if (CheckWhetherNegated(true) || Duel.LastChainPlayer == 0) return false; + return DefaultMaxxC(); + } + + public bool InfiniteImpermanenceActivate() + { + if (CheckWhetherNegated()) return false; + foreach (ClientCard m in Enemy.GetMonsters()) + { + if (m.IsMonsterShouldBeDisabledBeforeItUseEffect() && !m.IsDisabled() && Duel.LastChainPlayer != 0) + { + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + AI.SelectCard(m); + return true; + } + } + + ClientCard LastChainCard = Util.GetLastChainCard(); + + if (Card.Location == CardLocation.SpellZone) + { + int this_seq = -1; + int that_seq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) this_seq = i; + if (LastChainCard != null + && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.SpellZone && Enemy.SpellZone[i] == LastChainCard) that_seq = i; + else if (Duel.Player == 0 && Util.GetProblematicEnemySpell() != null + && Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFloodgate()) that_seq = i; + } + if ((this_seq * that_seq >= 0 && this_seq + that_seq == 4) + || (Util.IsChainTarget(Card)) + || (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))) + { + ClientCard target = GetProblematicEnemyMonster(canBeTarget: true); + List enemyMonsters = Enemy.GetMonsters(); + AI.SelectCard(target); + infiniteImpermanenceList.Add(this_seq); + return true; + } + } + if ((LastChainCard == null || LastChainCard.Controller != 1 || LastChainCard.Location != CardLocation.MonsterZone + || LastChainCard.IsDisabled() || LastChainCard.IsShouldNotBeTarget() || LastChainCard.IsShouldNotBeSpellTrapTarget())) + return false; + + if (Card.Location == CardLocation.SpellZone) + { + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) + { + infiniteImpermanenceList.Add(i); + break; + } + } + } + if (Card.Location == CardLocation.Hand) + { + SelectSTPlace(Card, true); + } + if (LastChainCard != null) AI.SelectCard(LastChainCard); + else + { + List enemyMonsters = Enemy.GetMonsters(); + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + foreach (ClientCard card in enemyMonsters) + { + if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget()) + { + AI.SelectCard(card); + return true; + } + } + } + return true; + } + + public bool CrossoutDesignatorActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null) + { + int code = Util.GetLastChainCard().Id; + int alias = Util.GetLastChainCard().Alias; + if (alias != 0 && alias - code < 10) code = alias; + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (CheckRemainInDeck(code) > 0) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectAnnounceID(code); + currentNegateCardList.AddRange(Enemy.MonsterZone.Where(c => c != null && c.IsFaceup() && c.IsCode(code))); + return true; + } + } + return false; + } + + public bool CalledbytheGraveActivate() + { + if (CheckWhetherNegated() || !CheckLastChainShouldNegated()) return false; + if (CheckAtAdvantage() && Duel.LastChainPlayer == 1 && Util.GetLastChainCard().IsCode(_CardId.MaxxC)) + { + return false; + } + if (Duel.LastChainPlayer == 1) + { + if (Util.GetLastChainCard().IsMonster()) + { + int code = Util.GetLastChainCard().GetOriginCode(); + if (code == 0) return false; + if (DefaultCheckWhetherCardIdIsNegated(code)) return false; + if (Util.GetLastChainCard().IsCode(_CardId.MaxxC) && CheckAtAdvantage()) + { + return false; + } + ClientCard graveTarget = Enemy.Graveyard.GetFirstMatchingCard(card => card.IsMonster() && card.GetOriginCode() == code); + if (graveTarget != null) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(graveTarget); + currentDestroyCardList.Add(graveTarget); + return true; + } + } + + foreach (ClientCard graveCard in Enemy.Graveyard) + { + if (Duel.ChainTargets.Contains(graveCard) && graveCard.IsMonster()) + { + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + int code = graveCard.Id; + AI.SelectCard(graveCard); + currentDestroyCardList.Add(graveCard); + return true; + } + } + + if (Duel.ChainTargets.Contains(Card)) + { + List enemyMonsters = Enemy.Graveyard.GetMatchingCards(card => card.IsMonster()).ToList(); + if (enemyMonsters.Count > 0) + { + enemyMonsters.Sort(CardContainer.CompareCardAttack); + enemyMonsters.Reverse(); + int code = enemyMonsters[0].Id; + AI.SelectCard(code); + currentDestroyCardList.Add(enemyMonsters[0]); + return true; + } + } + } + + if (Duel.LastChainPlayer == 1) return false; + List targets = GetDangerousCardinEnemyGrave(true); + if (targets.Count > 0) + { + int code = targets[0].Id; + if (!(Card.Location == CardLocation.SpellZone)) + { + SelectSTPlace(null, true); + } + AI.SelectCard(code); + currentDestroyCardList.Add(targets[0]); + return true; + } + + return false; + } + + public bool SpellSetCheck() + { + if (Card.Id == CardId.FIENDSMITHS_PARADISE) return false; + + if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false; + List onlyOneSetList = new List { CardId.ABOMINABLE_CHAMBER }; + if (onlyOneSetList.Contains(Card.Id) && Bot.HasInSpellZone(Card.Id)) + { + return false; + } + + if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay)))//added + { + List avoid_list = new List(); + int setFornfiniteImpermanence = 0; + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] != null && Enemy.SpellZone[i].IsFaceup() && Bot.SpellZone[4 - i] == null) + { + avoid_list.Add(4 - i); + setFornfiniteImpermanence += (int)System.Math.Pow(2, 4 - i); + } + } + if (Bot.HasInHand(_CardId.InfiniteImpermanence)) + { + if (Card.IsCode(_CardId.InfiniteImpermanence)) + { + AI.SelectPlace(setFornfiniteImpermanence); + return true; + } + else + { + SelectSTPlace(Card, false, avoid_list); + return true; + } + } + else + { + SelectSTPlace(); + } + return true; + } + + return false; + } + + public List GetDangerousCardinEnemyGrave(bool onlyMonster = false) + { + List result = Enemy.Graveyard.GetMatchingCards(card => + (!onlyMonster || card.IsMonster()) && (card.HasSetcode(SetcodeOrcust) || card.HasSetcode(SetcodePhantom) || card.HasSetcode(SetcodeHorus))).ToList(); + List dangerMonsterIdList = new List { 99937011, 63542003, 9411399, 28954097, 30680659 }; + result.AddRange(Enemy.Graveyard.GetMatchingCards(card => dangerMonsterIdList.Contains(card.Id))); + return result; + } + + public bool CheckWhetherNegated(bool disablecheck = true, bool toFieldCheck = false, CardType type = 0) + { + bool isMonster = type == 0 && Card.IsMonster(); + isMonster |= ((int)type & (int)CardType.Monster) != 0; + bool isSpellOrTrap = type == 0 && (Card.IsSpell() || Card.IsTrap()); + isSpellOrTrap |= (((int)type & (int)CardType.Spell) != 0) || (((int)type & (int)CardType.Trap) != 0); + bool isCounter = ((int)type & (int)CardType.Counter) != 0; + if (isSpellOrTrap && toFieldCheck && CheckSpellWillBeNegate(isCounter)) + return true; + if (DefaultCheckWhetherCardIsNegated(Card)) return true; + if (isMonster && (toFieldCheck || Card.Location == CardLocation.MonsterZone)) + { + if ((toFieldCheck && (((int)type & (int)CardType.Link) != 0)) || Card.IsDefense()) + { + if (Enemy.MonsterZone.Any(card => CheckNumber41(card)) || Bot.MonsterZone.Any(card => CheckNumber41(card))) return true; + } + if (Enemy.HasInSpellZone(CardId.SkillDrain, true)) return true; + } + if (disablecheck) return (Card.Location == CardLocation.MonsterZone || Card.Location == CardLocation.SpellZone) && Card.IsDisabled() && Card.IsFaceup(); + return false; + } + + public bool CheckNumber41(ClientCard card) + { + return card != null && card.IsFaceup() && card.IsCode(CardId.Number41BagooskatheTerriblyTiredTapir) && card.IsDefense() && !card.IsDisabled(); + } + + public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List avoidList = null) + { + if (card == null) card = Card; + List list = new List(); + for (int seq = 0; seq < 5; ++seq) + { + if (Bot.SpellZone[seq] == null) + { + if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; + if (avoidList != null && avoidList.Contains(seq)) continue; + list.Add(seq); + } + } + int n = list.Count; + while (n-- > 1) + { + int index = Program.Rand.Next(list.Count); + int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count; + int tempInt = list[index]; + list[index] = list[nextIndex]; + list[nextIndex] = tempInt; + } + if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled())) + { + foreach (int seq in list) + { + ClientCard enemySpell = Enemy.SpellZone[4 - seq]; + if (enemySpell != null && enemySpell.IsFacedown()) continue; + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + } + foreach (int seq in list) + { + int zone = (int)System.Math.Pow(2, seq); + AI.SelectPlace(zone); + return; + } + AI.SelectPlace(0); + } + + public bool CheckSpellWillBeNegate(bool isCounter = false, ClientCard target = null) + { + if (target == null) target = Card; + if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; + + if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; + if (target.IsSpell()) + { + if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; + if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; + if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; + } + if (target.IsTrap() && (Enemy.HasInSpellZone(CardId.RoyalDecree, true) || Bot.HasInSpellZone(CardId.RoyalDecree, true))) return true; + if (target.Location == CardLocation.SpellZone && (target.IsSpell() || target.IsTrap())) + { + int selfSeq = -1; + for (int i = 0; i < 5; ++i) + { + if (Bot.SpellZone[i] == Card) selfSeq = i; + } + if (infiniteImpermanenceList.Contains(selfSeq)) return true; + } + return false; + } + + public bool CheckLastChainShouldNegated() + { + ClientCard lastcard = Util.GetLastChainCard(); + if (lastcard == null || lastcard.Controller != 1) return false; + if (lastcard.IsMonster() && lastcard.HasSetcode(SetcodeTimeLord) && Duel.Phase == DuelPhase.Standby) return false; + if (notToNegateIdList.Contains(lastcard.Id)) return false; + if (DefaultCheckWhetherCardIsNegated(lastcard)) return false; + if (Duel.Turn == 1 && lastcard.IsCode(_CardId.MaxxC)) return false; + + return true; + } + + public ClientCard GetProblematicEnemyMonster(int attack = 0, bool canBeTarget = false, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + ClientCard floodagateCard = Enemy.GetMonsters().Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsFloodgate() && c.IsFaceup() + && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (floodagateCard != null) return floodagateCard; + + ClientCard dangerCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (dangerCard != null) return dangerCard; + + ClientCard invincibleCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (invincibleCard != null) return invincibleCard; + + ClientCard equippedCard = Enemy.MonsterZone.Where(c => c?.Data != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && c.EquipCards.Count > 0 && CheckCanBeTargeted(c, canBeTarget, selfType) + && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (equippedCard != null) return equippedCard; + + ClientCard enemyExtraMonster = Enemy.MonsterZone.Where(c => c != null && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(c)) + && (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) || (c.HasType(CardType.Link) && c.LinkCount >= 2)) + && CheckCanBeTargeted(c, canBeTarget, selfType) && CheckShouldNotIgnore(c)).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (enemyExtraMonster != null) return enemyExtraMonster; + + if (attack >= 0) + { + if (attack == 0) + attack = Util.GetBestAttack(Bot); + ClientCard betterCard = Enemy.MonsterZone.Where(card => card != null + && card.GetDefensePower() >= attack && card.GetDefensePower() > 0 && card.IsAttack() && CheckCanBeTargeted(card, canBeTarget, selfType) + && (ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).OrderByDescending(card => card.Attack).FirstOrDefault(); + if (betterCard != null) return betterCard; + } + return null; + } + + public bool CheckCanBeTargeted(ClientCard card, bool canBeTarget, CardType selfType) + { + if (card == null) return true; + if (canBeTarget) + { + if (card.IsShouldNotBeTarget()) return false; + if (((int)selfType & (int)CardType.Monster) > 0 && card.IsShouldNotBeMonsterTarget()) return false; + if (((int)selfType & (int)CardType.Spell) > 0 && card.IsShouldNotBeSpellTrapTarget()) return false; + if (((int)selfType & (int)CardType.Trap) > 0 && (card.IsShouldNotBeSpellTrapTarget() && !card.IsDisabled())) return false; + } + return true; + } + + public bool CheckShouldNotIgnore(ClientCard cards, bool ignore = false) + { + return !ignore || (!currentDestroyCardList.Contains(cards) && !currentNegateCardList.Contains(cards)); + } + + public List GetProblematicEnemyCardList(bool canBeTarget = false, bool ignoreSpells = false, CardType selfType = 0) + { + List resultList = new List(); + + List floodagateList = Enemy.MonsterZone.Where(c => c?.Data != null && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (floodagateList.Count > 0) resultList.AddRange(floodagateList); + + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsFloodgate() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).ToList(); + if (problemEnemySpellList.Count > 0) resultList.AddRange(ShuffleList(problemEnemySpellList)); + + List dangerList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterDangerous() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (dangerList.Count > 0 && (Duel.Player == 0 || (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2))) resultList.AddRange(dangerList); + + List invincibleList = Enemy.MonsterZone.Where(c => c?.Data != null && !resultList.Contains(c) && !currentDestroyCardList.Contains(c) + && c.IsMonsterInvincible() && c.IsFaceup() && CheckCanBeTargeted(c, canBeTarget, selfType)).OrderByDescending(card => card.Attack).ToList(); + if (invincibleList.Count > 0) resultList.AddRange(invincibleList); + + List enemyMonsters = Enemy.GetMonsters().Where(c => !currentDestroyCardList.Contains(c)).OrderByDescending(card => card.Attack).ToList(); + if (enemyMonsters.Count > 0) + { + foreach (ClientCard target in enemyMonsters) + { + if ((target.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz) + || (target.HasType(CardType.Link) && target.LinkCount >= 2)) + && !resultList.Contains(target) && CheckCanBeTargeted(target, canBeTarget, selfType)) + { + resultList.Add(target); + } + } + } + + List spells = Enemy.GetSpells().Where(c => c.IsFaceup() && !currentDestroyCardList.Contains(c) + && c.HasType(CardType.Equip | CardType.Pendulum | CardType.Field | CardType.Continuous) && CheckCanBeTargeted(c, canBeTarget, selfType) + && !notToDestroySpellTrap.Contains(c.Id)).ToList(); + if (spells.Count > 0 && !ignoreSpells) resultList.AddRange(ShuffleList(spells)); + + return resultList; + } + + public List GetNormalEnemyTargetList(bool canBeTarget = true, bool ignoreCurrentDestroy = false, CardType selfType = 0) + { + List targetList = GetProblematicEnemyCardList(canBeTarget, selfType: selfType); + List enemyMonster = Enemy.GetMonsters().Where(card => card.IsFaceup() && !targetList.Contains(card) + && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList(); + enemyMonster.Sort(CardContainer.CompareCardAttack); + enemyMonster.Reverse(); + targetList.AddRange(enemyMonster); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetSpells().Where(card => (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card)) && !enemyPlaceThisTurn.Contains(card)).ToList())); + targetList.AddRange(ShuffleList(Enemy.GetMonsters().Where(card => card.IsFacedown() && (!ignoreCurrentDestroy || !currentDestroyCardList.Contains(card))).ToList())); + + return targetList; + } + + public List GetMonsterListForTargetNegate(bool canBeTarget = false, CardType selfType = 0) + { + List resultList = new List(); + if (CheckWhetherNegated()) + { + return resultList; + } + + ClientCard target = Enemy.MonsterZone.FirstOrDefault(card => card?.Data != null + && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && !card.IsShouldNotBeTarget() + && CheckCanBeTargeted(card, canBeTarget, selfType) + && !currentNegateCardList.Contains(card)); + if (target != null) + { + resultList.Add(target); + } + + foreach (ClientCard chainingCard in Duel.CurrentChain) + { + if (chainingCard.Location == CardLocation.MonsterZone && chainingCard.Controller == 1 && !chainingCard.IsDisabled() + && CheckCanBeTargeted(chainingCard, canBeTarget, selfType) && !currentNegateCardList.Contains(chainingCard)) + { + resultList.Add(chainingCard); + } + } + + return resultList; + } + + public ClientCard GetBestEnemyMonster(bool onlyFaceup = false, bool canBeTarget = false) + { + ClientCard card = GetProblematicEnemyMonster(0, canBeTarget); + if (card != null) return card; + card = Enemy.MonsterZone.GetHighestAttackMonster(canBeTarget); + if (card != null) return card; + List monsters = Enemy.GetMonsters(); + if (monsters.Count > 0 && !onlyFaceup) return ShuffleCardList(monsters)[0]; + return null; + } + + public ClientCard GetBestEnemySpell(bool onlyFaceup = false, bool canBeTarget = false) + { + List problemEnemySpellList = Enemy.SpellZone.Where(c => c?.Data != null + && c.IsFloodgate() && c.IsFaceup() && (!canBeTarget || !c.IsShouldNotBeTarget())).ToList(); + if (problemEnemySpellList.Count > 0) + { + return ShuffleCardList(problemEnemySpellList)[0]; + } + + List spells = Enemy.GetSpells().Where(card => !(card.IsFaceup() && card.IsCode(_CardId.EvenlyMatched))).ToList(); + + List faceUpList = spells.Where(ecard => ecard.IsFaceup() && (ecard.HasType(CardType.Continuous) || ecard.HasType(CardType.Field) || ecard.HasType(CardType.Pendulum))).ToList(); + if (faceUpList.Count > 0) + { + return ShuffleCardList(faceUpList)[0]; + } + + if (spells.Count > 0 && !onlyFaceup) + { + return ShuffleCardList(spells)[0]; + } + + return null; + } + + public ClientCard GetBestEnemyCard(bool onlyFaceup = false, bool canBeTarget = false, bool checkGrave = false) + { + ClientCard card = GetBestEnemyMonster(onlyFaceup, canBeTarget); + if (card != null) return card; + + card = GetBestEnemySpell(onlyFaceup, canBeTarget); + if (card != null) return card; + + if (checkGrave && Enemy.Graveyard.Count > 0) + { + List graveMonsterList = Enemy.Graveyard.GetMatchingCards(c => c.IsMonster()).ToList(); + if (graveMonsterList.Count > 0) + { + graveMonsterList.Sort(CardContainer.CompareCardAttack); + graveMonsterList.Reverse(); + return graveMonsterList[0]; + } + return ShuffleCardList(Enemy.Graveyard.ToList())[0]; + } + + return null; + } + #endregion + + public override void OnChainSolved(int chainIndex) + { + ClientCard currentCard = Duel.GetCurrentSolvingChainCard(); + var solving = Duel.GetCurrentSolvingChainCard(); + bool neg = Duel.IsCurrentSolvingChainNegated(); + Logger.DebugWriteLine($"[CHAIN] Solved idx={chainIndex} negated={neg} solving={CardStr(solving)}"); + if (currentCard != null && !Duel.IsCurrentSolvingChainNegated() && currentCard.Controller == 1) + { + if (currentCard.IsCode(_CardId.MaxxC)) enemyActivateMaxxC = true; + if (currentCard.IsCode(CardId.Fuwalos)) enemyActivateMaxxC = true; + if (currentCard.IsCode(_CardId.LockBird)) enemyActivateLockBird = true; + if (currentCard.IsCode(_CardId.InfiniteImpermanence)) + { + for (int i = 0; i < 5; ++i) + { + if (Enemy.SpellZone[i] == currentCard) + { + infiniteImpermanenceList.Add(4 - i); + break; + } + } + } + } + } + public override void OnChainEnd() + { + escapeTargetList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + enemyActivateInfiniteImpermanenceFromHand = false; + for (int idx = enemyPlaceThisTurn.Count - 1; idx >= 0; idx--) + { + ClientCard checkTarget = enemyPlaceThisTurn[idx]; + if (checkTarget == null || (checkTarget.Location != CardLocation.SpellZone && checkTarget.Location != CardLocation.MonsterZone)) + { + enemyPlaceThisTurn.RemoveAt(idx); + } + } + if (thronePending && _throneStage == ThroneStage.None) + { thronePending = false; } + ResetThroneFlow(); + Logger.DebugWriteLine("[CHAIN] OnChainEnd"); + base.OnChainEnd(); + } + private void ResetThroneFlow() + { + Logger.DebugWriteLine($"[THRONE] Reset flow (was stage={_throneStage}, pending={thronePending})"); + thronePending = false; + throneSearched = false; + throneDesiredPick = 0; + _throneStage = ThroneStage.None; + } + public override void OnNewTurn() + { + if (Duel.Turn <= 1) { dimensionShifterCount = 0; } + + enemyActivateMaxxC = false; + enemyActivateLockBird = false; + enemyActivateInfiniteImpermanenceFromHand = false; + if (dimensionShifterCount > 0) dimensionShifterCount--; + infiniteImpermanenceList.Clear(); + currentNegateCardList.Clear(); + currentDestroyCardList.Clear(); + sendToGYThisTurn.Clear(); + activatedCardIdList.Clear(); + enemyPlaceThisTurn.Clear(); + summonThisTurn.Clear(); + + // reset Throne flow + thronePending = false; + throneSearched = false; + throneDesiredPick = 0; + _gateReviveTargetId = 0; + _gateDiscardPreferredId = 0; + _gateWantsRecycle = false; + _spQuickMode = false; + + base.OnNewTurn(); + } + + // ===== Material safety logic (inspired by windbot patterns) ===== + private static readonly HashSet NEVER_SAC = new HashSet + { + CardId.PHANTOM_OF_YUBEL, + CardId.DDD_WAVE_HIGH_KING_CAESAR, + CardId.VARUDASN_FINAL_BRINGER, + CardId.SP_LITTLE_KNIGHT, + CardId.GORGONOFZIL, + CardId.UNCHAINDEDABOMINATION + }; + private bool InThroneFlow => thronePending || _throneStage != ThroneStage.None; + private int PriorityIndex(int id) + { + int idx = Array.IndexOf(LinkFodderPriority, id); + return idx >= 0 ? idx : 999; + } + private bool IsProtectedMaterial(ClientCard c, bool allowUseYubelForLink = false) + { + if (c == null) return true; + + if (NEVER_SAC.Contains(c.Id)) return true; + + if (c.EquipCards != null && c.EquipCards.Count > 0) return true; + if (c.HasType(CardType.Link) && c.LinkCount >= 2) return true; + if (c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz)) return true; + + return false; + } + private ClientCard[] GetSafeMaterials(int need) + { + bool allowYubel = ShouldUseYubelForLink(); + + var list = Bot.GetMonsters() + .Where(m => !IsProtectedMaterial(m, allowYubel)) + .OrderBy(m => PriorityIndex(m.Id)) + .ThenBy(m => m.Attack) + .Take(need) + .ToArray(); + + return list; + } + private bool ShouldUseYubelForLink() + { + if (Duel.Player != 0) return false; // ทำเฉพาะเทิร์นเรา + var mons = Bot.GetMonsters().Where(m => m != null).ToList(); + if (mons.Count == 0) return false; + + bool twoOrLess = mons.Count <= 2; + + // มีลิงก์ที่อัปเกรดบอร์ดได้ + bool canMakeBetter; + + if (HasInExtra(CardId.FIENDSMITHS_REQUIEM)) + { + canMakeBetter = + HasInExtra(CardId.MOON_OF_THE_CLOSED_HEAVEN) || + HasInExtra(CardId.UNCHAINED_SOUL_OF_RAGE) || + HasInExtra(CardId.UNCHAINED_LORD_OF_YAMA) || + + //HasInExtra(CardId.MUCKRAKER_UNDERWORLD) || + //HasInExtra(CardId.FIENDSMITHS_SEQUENCE) || + HasInExtra(CardId.SP_LITTLE_KNIGHT); + //HasInExtra(CardId.GORGONOFZIL) ; + } + else + { + canMakeBetter = + HasInExtra(CardId.UNCHAINED_SOUL_OF_RAGE) || + HasInExtra(CardId.UNCHAINED_LORD_OF_YAMA) || + //HasInExtra(CardId.MUCKRAKER_UNDERWORLD) || + //HasInExtra(CardId.FIENDSMITHS_SEQUENCE) || + HasInExtra(CardId.SP_LITTLE_KNIGHT); + //HasInExtra(CardId.GORGONOFZIL); + } + + // ถ้าบนสนามเหลือแต่ชิ้น Yubel 1-2 ใบ และสามารถอัปเกรดเป็นลิงก์ที่ให้ interrupt/มูฟได้ ⇒ ใช้ไปลิงก์เถอะ + return twoOrLess && canMakeBetter; + } + private static readonly int[] YubelCostPriority = new[] + { + CardId.SAMSARA_D_LOTUS, + CardId.FABLED_LURRIE, + CardId.DARK_BECKONING_BEAST, + CardId.CHAOS_SUMMONING_BEAST, + CardId.GRUESOME_GRAVE_SQUIRMER, + CardId.SALAMANGREAT_ALMIRAJ, + //CardId.FIENDSMITHS_SEQUENCE + }; + private bool HasInExtra(int id) + { + return Bot.ExtraDeck.Any(c => c != null && c.Id == id); + } + // --- State for Nightmare Throne prompt flow --- + + + #region Work Space #1 + private bool DontSelfNG() { return Duel.LastChainPlayer != 0; } + private int LowestBit(int mask) => mask & -mask; + + // เอา mask ของช่องมอนสเตอร์ที่ลิงก์เราชี้ (เฉพาะ Main Monster Zone 0..4) + private int GetMyLinkedMMZMask() + { + int mask = 0; + foreach (var m in Bot.GetMonsters()) + { + if (m == null || !m.IsFaceup() || !m.HasType(CardType.Link)) continue; + mask |= m.GetLinkedZones(); + } + // เอาเฉพาะ 5 โซนหลัก (บิต 0..4) + mask &= 0x1F; + return mask; + } + private bool S1_ActivateTerraformingForThrone() + { + if (Type != ExecutorType.Activate) return false; + if (Card.Id != CardId.TERRAFORMING) return false; + if (Bot.HasInHandOrInSpellZone(CardId.NIGHTMARE_THRONE)) { return false; } + AI.SelectCard(CardId.NIGHTMARE_THRONE); + return true; + } + + private bool ActNightmareThroneSearch() + { + if (Type != ExecutorType.Activate) return false; + if (Card.Location == CardLocation.Hand && Bot.HasInSpellZone(CardId.NIGHTMARE_THRONE)) return false; + + int pick = 0; + if (!Bot.HasInHand(CardId.SAMSARA_D_LOTUS) && CheckRemainInDeck(CardId.SAMSARA_D_LOTUS) > 0) + pick = CardId.SAMSARA_D_LOTUS; + else if (Bot.HasInHand(CardId.SAMSARA_D_LOTUS) && !Bot.HasInHand(CardId.DARK_BECKONING_BEAST) && CheckRemainInDeck(CardId.DARK_BECKONING_BEAST) > 0) + pick = CardId.DARK_BECKONING_BEAST; + else if (Bot.HasInHand(CardId.SAMSARA_D_LOTUS) && Bot.HasInHand(CardId.DARK_BECKONING_BEAST) && !Bot.HasInHand(CardId.CHAOS_SUMMONING_BEAST) && CheckRemainInDeck(CardId.CHAOS_SUMMONING_BEAST) > 0) + pick = CardId.CHAOS_SUMMONING_BEAST; + + thronePending = true; + throneSearched = false; + throneDesiredPick = pick; + + Logger.DebugWriteLine($"[THRONE] Activate search; desiredPick={(pick == 0 ? "(auto)" : pick.ToString())}"); + DumpChain("ThroneActivate"); + + return true; + } + + private bool NSDarkBeckoningBeast() + { + if (Duel.Phase != DuelPhase.Main1) return false; + if (Bot.HasInMonstersZone(CardId.DARK_BECKONING_BEAST)) + { + if (Bot.HasInHand(CardId.SAMSARA_D_LOTUS)) + { + return false; + } + } + return true; + } + + private bool ActDarkBeckoningBeast() + { + if (Duel.Phase != DuelPhase.Main1) return false; + if ((CheckRemainInDeck(CardId.SPIRIT_GATES) > 0) && !Bot.HasInSpellZone(CardId.SPIRIT_GATES)) + { AI.SelectCard(CardId.SPIRIT_GATES); return true; } + else if (CheckRemainInDeck(CardId.CHAOS_SUMMONING_BEAST) > 0) + { AI.SelectCard(CardId.CHAOS_SUMMONING_BEAST); return true; } + else { return false; } + } + + private bool S4_ActivateSpiritGates() + { + // ใช้จาก "มือ" เพื่อค้น DBB/CSB + if (Type != ExecutorType.Activate) return false; + if (Card.Location != CardLocation.Hand) return false; + if (Bot.HasInSpellZone(CardId.SPIRIT_GATES, true, true)) return false; + + // กฎ: ถ้ามี DBB อยู่ "บนสนาม" ให้ค้น CSB + int pick = 0; + bool dbbOnField = Bot.HasInMonstersZone(CardId.DARK_BECKONING_BEAST, false, false, true); + + if (dbbOnField && CheckRemainInDeck(CardId.CHAOS_SUMMONING_BEAST) > 0) + pick = CardId.CHAOS_SUMMONING_BEAST; + else if (CheckRemainInDeck(CardId.DARK_BECKONING_BEAST) > 0) + pick = CardId.DARK_BECKONING_BEAST; + else if (CheckRemainInDeck(CardId.CHAOS_SUMMONING_BEAST) > 0) + pick = CardId.CHAOS_SUMMONING_BEAST; + + if (pick == 0) return false; + + AI.SelectCard(pick); + return true; + } + private bool Gate_RecycleContinuous() + { + // e3: มีเลเวล 10 -> เก็บ Continuous Spell จากสุสาน (เน้นเก็บ NIGHTMARE_PAIN) + if (Card.Location != CardLocation.SpellZone) return false; + if (!HaveFaceupLevel10()) return false; + + if (!Bot.HasInGraveyard(CardId.NIGHTMARE_PAIN)) + return false; + + _gateWantsRecycle = true; + // เลือก Pain ก่อน ถ้าไม่มีค่อยเลือก Paradise ตอน select card + return true; + } + private bool Is00FiendId(int id) + { + // รายชื่อ 0/0 Fiend ที่เราใช้ในเด็คนี้ + return id == CardId.YUBEL + || id == CardId.SPIRIT_OF_YUBEL + || id == CardId.DARK_BECKONING_BEAST + || id == CardId.CHAOS_SUMMONING_BEAST + || id == CardId.SAMSARA_D_LOTUS; + } + + // เลือกเป้าหมายที่จะชุบ ด้วยลำดับความสำคัญตาม 2.2.x + private int PlanSpiritGatesReviveTarget() + { + // Emergency Case + if (Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ)&&Bot.HasInGraveyard(CardId.DARK_BECKONING_BEAST)) + { return CardId.DARK_BECKONING_BEAST; } + + // 2.2.2: ถ้าขาด spirit → SS spirit (จากสุสาน หรือทิ้งจากมือ) + bool spiritOnBoard = Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL, true); + bool spiritInGY = Bot.HasInGraveyard(CardId.SPIRIT_OF_YUBEL); + bool spiritInHand = Bot.HasInHand(CardId.SPIRIT_OF_YUBEL); + if (!spiritOnBoard && (spiritInGY || spiritInHand)) + return CardId.SPIRIT_OF_YUBEL; + + // 2.2.3: ถ้า DBB โดนขัด/ตันเกมแล้วมี Almiraj → ชุบ DBB เพื่อไต่ไป Moon + if (Bot.HasInMonstersZone(CardId.SALAMANGREAT_ALMIRAJ, true) + && Bot.HasInGraveyard(CardId.DARK_BECKONING_BEAST) + && HasInExtra(CardId.MOON_OF_THE_CLOSED_HEAVEN)) + return CardId.DARK_BECKONING_BEAST; + + // 2.2.1: ถ้าขาด lotus → SS lotus + if (!Bot.HasInMonstersZone(CardId.SAMSARA_D_LOTUS, true) && Bot.HasInGraveyard(CardId.SAMSARA_D_LOTUS)) + return CardId.SAMSARA_D_LOTUS; + + // ทางเลือกทั่วไป: DBB > CSB > Yubel + if (Bot.HasInGraveyard(CardId.DARK_BECKONING_BEAST)) return CardId.DARK_BECKONING_BEAST; + if (Bot.HasInGraveyard(CardId.CHAOS_SUMMONING_BEAST)) return CardId.CHAOS_SUMMONING_BEAST; + if (Bot.HasInGraveyard(CardId.YUBEL)) return CardId.YUBEL; + + // ถ้าไม่มีอะไรชุบได้เลย อาจวางแผน discard ให้ Spirit ลงสุสานแล้วค่อยชุบ + if (!spiritOnBoard && spiritInHand) return CardId.SPIRIT_OF_YUBEL; + + return 0; + } + + // เลือกใบจะทิ้ง: CSB > Paradise > Terror > (บางกรณี) Spirit + private int PickSpiritGatesDiscard(int reviveTargetId) + { + // เคสอยากชุบ Spirit แต่ยังอยู่ในมือ → ทิ้ง Spirit เป็น cost แล้วชุบมันเอง + if (reviveTargetId == CardId.SPIRIT_OF_YUBEL && Bot.HasInHand(CardId.SPIRIT_OF_YUBEL)) + return CardId.SPIRIT_OF_YUBEL; + + if (Bot.HasInHand(CardId.FIENDSMITHS_PARADISE)) return CardId.FIENDSMITHS_PARADISE; + if (Bot.HasInHand(CardId.CHAOS_SUMMONING_BEAST)) return CardId.CHAOS_SUMMONING_BEAST; + if (Bot.HasInHand(CardId.YUBEL_TERROR_INCARNATE)) return CardId.YUBEL_TERROR_INCARNATE; + + // fallback: เลือกใบที่ "ทิ้งแล้วเจ็บน้อยสุด" + var hand = Bot.Hand.ToList(); + hand.Sort((a, b) => ScoreOwnCardForCost(a).CompareTo(ScoreOwnCardForCost(b))); + return hand.Count > 0 ? hand[0].Id : 0; + } + + private bool Gate_Revive00Fiend() + { + // e2: ทิ้งมือ 1 → SS Fiend 0/0 จากสุสาน + if (Card.Location != CardLocation.SpellZone) return false; + + if (requiemSummoned) + { + if (!Bot.HasInHandOrInGraveyard(CardId.SPIRIT_OF_YUBEL)) return false; // ต้องมีในหลุม + if (Bot.Hand.Count <= 0) return false; // ต้องมีใบทิ้ง + _gateReviveTargetId = CardId.SPIRIT_OF_YUBEL; + _gateDiscardPreferredId = PickSpiritGatesDiscard(_gateReviveTargetId); + _gateWantsRecycle = false; + return true; + } + + // วางแผนก่อนว่าจะชุบตัวไหน + int target = PlanSpiritGatesReviveTarget(); + if (target == 0) return false; + + // ต้องมีการ์ดให้ทิ้งอย่างน้อย 1 ใบ + if (Bot.Hand.Count <= 0) return false; + + int discard = PickSpiritGatesDiscard(target); + if (discard == 0) return false; + + _gateReviveTargetId = target; + _gateDiscardPreferredId = discard; + _gateWantsRecycle = false; + + // ไม่เลือกอะไรตรงนี้ ปล่อยให้ OnSelectCard จิ้ม cost/เป้าหมายให้ + return true; + } + + private bool HaveFaceupLevel10() + { + return Bot.MonsterZone.Any(m => m != null && m.IsFaceup() && m.Level == 10); + } + private bool ActNightmarePainHand() + { + if (Bot.HasInSpellZone(CardId.NIGHTMARE_PAIN, true, true)) return false; + if (Card.Location == CardLocation.Hand) return true; + return false; + } + + private bool ActNightmarePainEffect() + { + if (Card.Location == CardLocation.SpellZone) + { + if(CheckRemainInDeck(CardId.GRUESOME_GRAVE_SQUIRMER)==0)return false; + + if (Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL) || Bot.HasInHand(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + AI.SelectNextCard(CardId.GRUESOME_GRAVE_SQUIRMER); + return true; + } + } + return false; + } + + private bool S6_ChainThroneFollowUp() + { + if (Type != ExecutorType.Activate) return false; + if (sendToGYThisTurn.Any(c => c != null && YUBEL_SET.Contains(c.Id)) && Bot.HasInHand(CardId.NIGHTMARE_THRONE)) + { + AI.SelectYesNo(true); + return true; + } + return false; + } + + private bool NSSamsaraDLotus() + { + if (Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) return false; + return true; + } + + private bool ActSamsaraDLotus() + { + if (Duel.Player == 0) + { + if (Card.Location == CardLocation.MonsterZone) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + } + if (Duel.Player == 1) + { + if (Bot.HasInMonstersZone(CardId.YUBEL) || Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) + { + return true; + } + } + return false; + } + private bool ActSamsaraDLotusGY() + { + if (Card.Location == CardLocation.Grave) + { + if (Bot.HasInMonstersZone(CardId.YUBEL)) + { + AI.SelectOption(1); + return true; + } + } + return false; + } + + private bool ActTract() + { + if (Card.Location != CardLocation.Hand) return false; + + // ถ้าเข้า Fiendsmith line แล้ว -> ไม่ใช้ Tract + if (requiemSummoned) return false; + AI.SelectCard(CardId.FABLED_LURRIE); + AI.SelectNextCard(CardId.FABLED_LURRIE); + return true; + /*if (Card.Location == CardLocation.Hand) + { + if (CheckRemainInDeck(CardId.FIENDSMITH_ENGRAVER) == 0 && + CheckRemainInDeck(CardId.LACRIMA_CT) == 0) + { + return false; + } + if(CheckRemainInDeck(CardId.FABLED_LURRIE) == 0){ return false; } + AI.SelectCard(CardId.FABLED_LURRIE); + AI.SelectNextCard(CardId.FABLED_LURRIE); + return true; + } + if (Card.LastLocation == CardLocation.Grave) { return false; } + return false;*/ + } + + private bool ActParadise() + { + if (Card.Location != CardLocation.Grave) return false; + if (Bot.HasInMonstersZoneOrInGraveyard(CardId.FIENDSMITHS_DESIRAE) || Bot.HasInBanished(CardId.FIENDSMITHS_DESIRAE)) return false; + AI.SelectCard(CardId.FIENDSMITHS_DESIRAE); + return DontSelfNG(); + } + + private bool ActDesirae() + { + if (Card.Location != CardLocation.Grave) {return false; } + ClientCard target = GetBestEnemyCard(onlyFaceup: true, canBeTarget: true, checkGrave: false); + if (target == null) return false; + if (Bot.HasInGraveyard(CardId.FIENDSMITHS_REQUIEM)) + { + AI.SelectCard(CardId.FIENDSMITHS_REQUIEM); + AI.SelectNextCard(target); + return true; + } + AI.SelectCard(target); + return true; + } + + private bool ActRequiemMZ() + { + if (Card.Location != CardLocation.MonsterZone) { return false; } + if (Bot.HasInHand(CardId.LACRIMA_CT) || CheckRemainInDeck(CardId.LACRIMA_CT) > 0) + { + AI.SelectCard(CardId.LACRIMA_CT); + AI.SelectPosition(CardPosition.FaceUpDefence); + return true; + } + else if (Bot.HasInHand(CardId.FIENDSMITH_ENGRAVER) || CheckRemainInDeck(CardId.FIENDSMITH_ENGRAVER) > 0) + { + AI.SelectCard(CardId.FIENDSMITH_ENGRAVER); + AI.SelectPosition(CardPosition.FaceUpDefence); + return true; + } + return false; + } + + private bool ActRequiemEQ() + { + if (!HasInExtra(CardId.NECROQUIP)) { return false; } + if (Card.Location != CardLocation.Grave) { return false; } + if (Bot.HasInMonstersZone(CardId.LACRIMA_CT)) + { + AI.SelectCard(CardId.LACRIMA_CT); + return true; + } + else if (Bot.HasInMonstersZone(CardId.FIENDSMITH_ENGRAVER)) + { + AI.SelectCard(CardId.FIENDSMITH_ENGRAVER); + return true; + } + return false; + } + + private bool SSNecroquip() + { + if (Bot.HasInSpellZone(CardId.FIENDSMITHS_REQUIEM) && Bot.HasInMonstersZone(CardId.LACRIMA_CT)) + { + AI.SelectCard(CardId.FIENDSMITHS_REQUIEM); + AI.SelectNextCard(CardId.LACRIMA_CT); + return true; + } + else if (Bot.HasInSpellZone(CardId.FIENDSMITHS_REQUIEM) && Bot.HasInMonstersZone(CardId.FIENDSMITH_ENGRAVER)) + { + AI.SelectCard(CardId.FIENDSMITHS_REQUIEM); + AI.SelectNextCard(CardId.FIENDSMITH_ENGRAVER); + return true; + } + return false; + } + + private bool ActLacimaCT() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.FIENDSMITH_ENGRAVER) && !Bot.HasInBanished(CardId.FIENDSMITH_ENGRAVER)) + { AI.SelectCard(CardId.FIENDSMITH_ENGRAVER); return true; } + else if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.FIENDSMITHS_PARADISE) && !Bot.HasInBanished(CardId.FIENDSMITHS_PARADISE)) + { AI.SelectCard(CardId.FIENDSMITHS_PARADISE); return true; } + return false; + } + return false; + } + + private bool ActLacimaCTGY() + { + if (Card.Location == CardLocation.Grave) + { + if (Bot.HasInBanished(CardId.FIENDSMITHS_PARADISE) || Bot.HasInHandOrInGraveyard(CardId.FIENDSMITHS_PARADISE)) + { return false; } + else { return DontSelfNG(); } + } + return false; + } + + /*private bool SSVarudras() + { + if (Bot.HasInMonstersZone(CardId.YUBEL) && Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.YUBEL); + AI.SelectNextCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + return true; + }*/ + + private bool ActEngraverHand() + { + if (Card.Location != CardLocation.Hand) return false; + if (!Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.FIENDSMITH_TRACT) && !Bot.HasInBanished(CardId.FIENDSMITH_TRACT)) + { + AI.SelectCard(CardId.FIENDSMITH_TRACT); + return true; + } + return false; + } + + private bool ActEngraverGY() + { + if (Card.Location != CardLocation.Grave) return false; + if (Bot.HasInGraveyard(CardId.FABLED_LURRIE)) { AI.SelectCard(CardId.FABLED_LURRIE); return true; } + else if (Bot.HasInGraveyard(CardId.MOON_OF_THE_CLOSED_HEAVEN)) { AI.SelectCard(CardId.MOON_OF_THE_CLOSED_HEAVEN); return true; } + return false; + } + + private bool SSMoon() + { + if (moonSummoned){ return false; } + if (requiemSummoned) { return false; } + if (!HasInExtra(CardId.FIENDSMITHS_REQUIEM)) + return false; + var mats = GetSafeMaterials(2); + if (mats.Length < 2) return false; + AI.SelectMaterials(mats); + moonSummoned = true; + return true; + } + + private bool ActAbo() + { + if (Bot.HasInGraveyard(CardId.UNCHAINED_SOUL_OF_RAGE)) + { + AI.SelectCard(CardId.UNCHAINED_SOUL_OF_RAGE); + return true; + } + return false; + } + + private bool AlmirajSummon() + { + if (Bot.GetMonsterCount() > 1) return false; + ClientCard mat = Bot.GetMonsters().First(); + if (mat.IsCode(new[] { CardId.DARK_BECKONING_BEAST })) + { + AI.SelectMaterials(mat); + return true; + } + return false; + } + + private bool SSGGS() + { + if (!DontSelfNG()) { return false; } + if (BlockIfThrone("GGS")) return false; + if (Duel.Player == 1) { return false; } + if (InThroneFlow) { return false; } + if (Card.Location != CardLocation.Hand) { return false; } + if (Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectYesNo(true); + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + AI.SelectYesNo(false); + return true; + } + + private bool ActGGSGY() + { + if (Card.Location != CardLocation.Grave) { return false; } + if (Bot.HasInGraveyard(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + else { return false; } + } + private bool ActLittleKnight() + { + if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.SP_LITTLE_KNIGHT, 0)) + { + // banish card + List problemCardList = GetProblematicEnemyCardList(true, selfType: CardType.Monster); + problemCardList.AddRange(GetDangerousCardinEnemyGrave(false)); + problemCardList.AddRange(GetNormalEnemyTargetList(true, true, CardType.Monster)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => card.HasType(CardType.Monster)).OrderByDescending(card => card.Attack)); + problemCardList.AddRange(Enemy.Graveyard.Where(card => !card.HasType(CardType.Monster))); + if (problemCardList.Count() > 0) + { + AI.SelectCard(problemCardList); + activatedCardIdList.Add(Card.Id); + return true; + } + } + else if (ActivateDescription == Util.GetStringId(CardId.SP_LITTLE_KNIGHT, 1)) + { + ClientCard selfMonster = null; + foreach (ClientCard target in Bot.GetMonsters()) + { + if (Duel.ChainTargets.Contains(target) && !escapeTargetList.Contains(target)) + { + selfMonster = target; + break; + } + } + if (selfMonster == null) + { + if (Duel.Player == 1) + { + selfMonster = Bot.GetMonsters().Where(card => card.IsAttack()).OrderBy(card => card.Attack).FirstOrDefault(); + if (!Util.IsOneEnemyBetterThanValue(selfMonster.Attack, true)) selfMonster = null; + } + } + if (selfMonster != null) + { + ClientCard nextMonster = null; + List selfTargetList = Bot.GetMonsters().Where(card => card != selfMonster).ToList(); + if (Enemy.GetMonsterCount() == 0 && selfTargetList.Count() > 0) + { + selfTargetList.Sort(CompareUsableAttack); + nextMonster = selfTargetList[0]; + escapeTargetList.Add(nextMonster); + } + if (Enemy.GetMonsterCount() > 0) + { + nextMonster = GetBestEnemyMonster(true, true); + currentDestroyCardList.Add(nextMonster); + } + if (nextMonster != null) + { + AI.SelectCard(selfMonster); + AI.SelectNextCard(nextMonster); + escapeTargetList.Add(selfMonster); + activatedCardIdList.Add(Card.Id + 1); + return true; + } + } + } + + return false; + } + public int CompareUsableAttack(ClientCard cardA, ClientCard cardB) + { + if (cardA == null && cardB == null) + return 0; + if (cardA == null) + return -1; + if (cardB == null) + return 1; + int powerA = (cardA.IsDefense() && summonThisTurn.Contains(cardA)) ? 0 : cardA.Attack; + int powerB = (cardB.IsDefense() && summonThisTurn.Contains(cardB)) ? 0 : cardB.Attack; + if (powerA < powerB) + return -1; + if (powerA == powerB) + return CardContainer.CompareCardLevel(cardA, cardB); + return 1; + } + private bool ActRageQuickLink() + { + if (Card.Location != CardLocation.MonsterZone) return false; + // Quick Link เฉพาะเทิร์นศัตรูช่วง Main เพื่อสร้าง 1 interrupt + if (Duel.Player != 1) return false; + if (Duel.Phase < DuelPhase.Main1 || Duel.Phase > DuelPhase.Main2) return false; + if (!HasValidRageLinkCandidate()) return false; + + var target = GetBestEnemyMonster(onlyFaceup: true, canBeTarget: true); + if (target == null) return false; + + // ส่วนใหญ่เอนจินจะถามเลือกการ์ดฝั่งตรงข้ามที่จะใช้เป็นวัสดุ/หรือไล่ + AI.SelectCard(target); + return DontSelfNG(); + } + private bool SSPhantom() + { + var gyMat2Codes = new List { CardId.YUBEL_TERROR_INCARNATE, CardId.YUBEL, CardId.DARK_BECKONING_BEAST, CardId.CHAOS_SUMMONING_BEAST, CardId.SPIRIT_OF_YUBEL }; + if (!Bot.HasInGraveyard(gyMat2Codes)) + { + return false; + } + // select mat 1 + if (Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.YUBEL_TERROR_INCARNATE)) + { + AI.SelectCard(CardId.YUBEL_TERROR_INCARNATE); + } + else if (Bot.HasInMonstersZoneOrInGraveyard(CardId.YUBEL)) + { + AI.SelectCard(CardId.YUBEL); + } + else if (Bot.HasInGraveyard(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + } + else + { + return false; + } + // วัตถุดิบใบที่ 2 จากสุสานตามที่จัดไว้ + AI.SelectNextCard(gyMat2Codes); + return true; + } + + private bool ActSharvara() + { + if (BlockIfThrone("Sharvara")) return false; + if (Duel.Player == 1) { return false; } + if (InThroneFlow) return false; + if (Card.Location != CardLocation.Hand) return false; + if (Bot.HasInMonstersZone(CardId.SPIRIT_OF_YUBEL)) + { + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + return true; + } + else if (Bot.HasInMonstersZone(CardId.YUBEL)) + { + AI.SelectCard(CardId.YUBEL); + return true; + } + + return false; + } + private bool ActSharvaraGY() + { + if (Card.Location != CardLocation.Grave) return false; + return true; + } + + /*private bool L2NoBrain() + { + var mats = GetSafeMaterials(2); + if (mats.Length < 2) return false; + + AI.SelectMaterials(mats); + return true; + }*/ + private bool ActVarudras() + { + if (CheckWhetherNegated()) return false; + + // รายการเป้า (ศัตรูก่อน ถ้าไม่มีค่อย fallback) + List targetList = GetNormalEnemyTargetList(true, true); + int desc = (int)ActivateDescription; + int d1 = Util.GetStringId(CardId.VARUDASN_FINAL_BRINGER, 1); // ใช้ทั้ง e1 (Negate) และ e2 (Battle Start destroy) + int d2 = Util.GetStringId(CardId.VARUDASN_FINAL_BRINGER, 2); // e3 (Destroyed -> destroy 1) + + Logger.DebugWriteLine("[Varudras] desc: " + desc + ", timing = " + CurrentTiming); + + + var enemyPick = targetList.FirstOrDefault(c => c != null && c.Controller == 1); + + // e1: Quick effect Negate (ฝั่งคู่ต่อสู้กดเอฟเฟกต์) + if (desc == d1 && Duel.LastChainPlayer == 1 && Duel.CurrentChain.Count > 0) + { + if (!CheckLastChainShouldNegated()) return false; + activatedCardIdList.Add(Card.Id); // แท็กว่าเป็น e1 + return true; // เอนจินจะจัดการ detach เป็น cost ให้เอง + } + + // e2: Battle Start ทำลาย 1 / e3: ถูกทำลายแล้วทำลาย 1 + if (desc == d1 || desc == d2 || desc == -1) + { + if (targetList.Count == 0) return false; + + // พยายามให้เลือกฝั่งศัตรูก่อน + if (enemyPick != null) + targetList.Insert(0, enemyPick); + else + { + // ถ้าไม่มีการ์ดฝั่งศัตรูให้เลือกเลย -> แทรกฝั่งเราที่ "เสียหายน้อยสุด" ไว้หัวลิสต์ + var selfBest = + Bot.GetMonsters().Concat(Bot.GetSpells()) + .Where(c => c != null) + .OrderBy(ScoreOwnCardForCost) + .FirstOrDefault(); + if (selfBest != null) targetList.Insert(0, selfBest); + } + + // log / tag effect ย่อย + if (desc == d1 && Duel.CurrentChain.Count == 0) activatedCardIdList.Add(Card.Id + 1); // e2 + if (desc == d2) activatedCardIdList.Add(Card.Id + 2); // e3 + + AI.SelectCard(targetList); + return true; + } + + return false; + } + + private bool ShouldVarudrasDetachForPop(ClientCard target) + { + if (target == null) return false; + if (target.IsFloodgate() || target.IsMonsterDangerous() || target.IsMonsterInvincible()) return true; + // ใช้สกอร์เดิม ๆ ที่เรามีเพื่อประเมินความ "คุ้ม" ของการถอดวัตถุดิบแลกกับ 1 ทำลาย + return ScoreEnemyCardForRemoval(target) >= 3000; + } + private bool ActYamaGY() + { + if (Card.Location != CardLocation.Grave) return false; + if (Bot.HasInGraveyard(CardId.SPIRIT_OF_YUBEL)) return false; + AI.SelectCard(CardId.SPIRIT_OF_YUBEL); + AI.SelectYesNo(false); + return true; + } + private bool ActYamaMZ() + { + if (CheckRemainInDeck(CardId.SHARVARA) == 0 ) return false; + AI.SelectCard(CardId.SHARVARA); + return true; + } + private bool SSRequiem() + { + if (CheckRemainInDeck(CardId.LACRIMA_CT) == 0 && !Bot.HasInHand(CardId.LACRIMA_CT)) { return false; } + requiemSummoned = true; + return true; + } + private bool L4ABOSS() + { + if (!HasInExtra(CardId.UNCHAINDEDABOMINATION)) return false; + + var mons = Bot.GetMonsters(); + var yama = mons.FirstOrDefault(m => m != null && m.Id == CardId.UNCHAINED_LORD_OF_YAMA); + var rage = mons.FirstOrDefault(m => m != null && m.Id == CardId.UNCHAINED_SOUL_OF_RAGE); + var yubel = mons.FirstOrDefault(m => m != null && m.Id == CardId.YUBEL); + var terror = mons.FirstOrDefault(m => m != null && m.Id == CardId.YUBEL_TERROR_INCARNATE); + + if (yama != null && rage != null && IsInEMZ(yama)) + { + AI.SelectMaterials(new[] { yama, rage }); + return true; + } + + if (rage != null && yubel != null && terror != null && IsInEMZ(rage)) + { + AI.SelectMaterials(new[] { rage, yubel, terror }); + return true; + } + + // 3) greedy: เลือกลิงก์ที่มีอยู่ก่อน (prefer Rage > Yama > อื่น ๆ) แล้วเติมการ์ดจนแต้มรวมครบ 4 + ClientCard firstLink = + rage ?? + yama ?? + mons.Where(m => m.HasType(CardType.Link)).OrderByDescending(m => m.LinkCount).FirstOrDefault(); + + if (firstLink != null) + { + // ไม่ใช้ของที่ไม่ควรสังเวย (NEVER_SAC) แต่ยอมใช้ Yubel/Terror ได้ + var pool = mons + .Where(m => m != firstLink && !NEVER_SAC.Contains(m.Id)) + .OrderBy(ScoreOwnCardForCost) // เสียน้อยสุดมาก่อน + .ToList(); + + var pick = new List { firstLink }; + int need = 4 - LinkValue(firstLink); + + foreach (var m in pool) + { + pick.Add(m); + need -= LinkValue(m); + if (need <= 0) break; + } + + if (need <= 0) + { + AI.SelectMaterials(pick.ToArray()); + return true; + } + + } + return false; + } + private int LinkValue(ClientCard c) => (c != null && c.HasType(CardType.Link)) ? Math.Max(1, c.LinkCount) : 1; + + private bool IsInEMZ(ClientCard c) + { + var mz = Bot.MonsterZone; + return (mz.Length > 5 && mz[5] == c) || (mz.Length > 6 && mz[6] == c); + } + public bool UnchainedAbominationActivate() + { + if (CheckWhetherNegated()) return false; + List targetList = GetNormalEnemyTargetList(true, true, CardType.Monster); + if (targetList.Count() == 0) return false; + int logDesc = (int)ActivateDescription; + if (logDesc >= Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 0)) + { + logDesc = Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 0) - 10; + } + Logger.DebugWriteLine("[UnchainedAbomination]desc: " + logDesc + ", timing = " + CurrentTiming); + if (ActivateDescription == Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 0)) activatedCardIdList.Add(Card.Id); + if (ActivateDescription == Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 1) || ActivateDescription == -1) activatedCardIdList.Add(Card.Id + 1); + if (ActivateDescription == Util.GetStringId(CardId.UNCHAINDEDABOMINATION, 2)) activatedCardIdList.Add(Card.Id + 2); + AI.SelectCard(targetList); + + return true; + } + private ClientCard[] GetSafeMaterialsExcluding(HashSet excludeIds, int need) + { + return Bot.GetMonsters() + .Where(m => m != null + && (excludeIds == null || !excludeIds.Contains(m.Id)) + && !IsProtectedMaterial(m) // ไม่ยอมแลกของสำคัญ (Link≥2 / Extra ฯลฯ) + ) + .OrderBy(m => PriorityIndex(m.Id)) + .ThenBy(m => m.Attack) + .Take(need) + .ToArray(); + } + + private bool CanMakeRageWithoutYama() + { + var mats = GetSafeMaterialsExcluding(new HashSet { CardId.UNCHAINED_LORD_OF_YAMA }, 2); + return mats.Length >= 2; + } + private bool L2YamaSetup() + { + var mats = GetSafeMaterials(2); + if (mats.Length < 2) return false; + AI.SelectMaterials(mats); + return true; + } + private bool L2RageKeepYama() + { + // ต้องมี Yama อยู่ก่อน และต้องมีวัตถุดิบอื่น 2 ใบ (ไม่นับ Yama) + if (!Bot.HasInMonstersZone(CardId.UNCHAINED_LORD_OF_YAMA, true)) return false; + if (!CanMakeRageWithoutYama()) return false; + + var mats = GetSafeMaterialsExcluding(new HashSet { CardId.UNCHAINED_LORD_OF_YAMA }, 2); + if (mats.Length < 2) return false; // ยังไม่พอ → รอก่อน อย่าฝืนใช้ Yama + + AI.SelectMaterials(mats); + return true; + } + private bool HasFreeEMZ() + { + // ปกติ MonsterZone มี 7 ช่อง (0..4 = MMZ, 5..6 = EMZ) + var mz = Bot.MonsterZone; + bool slot5Free = mz.Length > 5 && mz[5] == null; + bool slot6Free = mz.Length > 6 && mz[6] == null; + return slot5Free || slot6Free; + } + + private bool HasValidRageLinkCandidate() + { + bool hasSP = HasInExtra(CardId.SP_LITTLE_KNIGHT); + bool hasGorgon = HasInExtra(CardId.GORGONOFZIL); + hasGorgon = HasInExtra(CardId.GORGONOFZIL); + + if (hasSP) return true; + if (hasGorgon && HasFreeEMZ()) return true; + return false; + } + + #endregion + + // ======================= On Select Somethings ==================== + #region Work Space #2 + private bool YesNoFor(int desc, int cardId, int idx) + { + var info = Duel.GetCurrentSolvingChainInfo(); + var card = Duel.GetCurrentSolvingChainCard(); + // ต้องทั้ง: คำอธิบายตรง + การ์ดบน chain ตอนนี้ตรง + return desc == Util.GetStringId(cardId, idx) + && ((info != null && info.IsCode(cardId)) || (card != null && card.IsCode(cardId))); + } + public override bool OnSelectYesNo(int desc) + { + Logger.DebugWriteLine($"[DEBUG] OnSelectYesNo: desc={desc}"); + var info = Duel.GetCurrentSolvingChainInfo(); + var solving = Duel.GetCurrentSolvingChainCard(); + DumpChain("OnSelectYesNo"); + Logger.DebugWriteLine($"[THRONE] OnSelectYesNo desc={desc} stage={_throneStage} solving={CardStr(solving)}"); + if (info != null && info.ActivatePlayer == 1) + { return false; } + // --- Nightmare Throne --- + // idx อาจต่างกันตามสคริปต์ แต่แนวคิดคือ anchor กับ desc+solving เสมอ + if (solving != null && solving.IsCode(CardId.NIGHTMARE_THRONE)) + { + // เปิด map ช่วย debug ให้เห็นว่า desc ตรง index ไหนจริง ๆ + DebugThroneDescMap(desc); + + // ยังไม่ได้เริ่มค้น -> ตอบ YES เพื่อเข้าโหมดค้น + if (_throneStage == ThroneStage.None && !throneSearched) + { + _throneStage = ThroneStage.Searching; + return true; // YES เริ่มค้น + } + + // ค้นเสร็จแล้ว และกำลังถาม "จะทำลายไหม?" -> default = NO + if (_throneStage == ThroneStage.AwaitDestroyPrompt || throneSearched) + { + _throneStage = ThroneStage.None; + return false; // ไม่ทำลาย + } + + // กันเคส engine ถามซ้ำก่อนโชว์เด็ค: ตอบ YES ไป (จะไปเข้า OnSelectCard) + if (_throneStage == ThroneStage.Searching && !throneSearched) + return true; + } + // --- Muckraker --- + /*if (YesNoFor(desc, CardId.MUCKRAKER_UNDERWORLD, 0)) + { + if (Duel.ChainTargets.Contains(Card)) return false; // ตัวเองกำลังโดนเล็งทำลาย -> ไม่ใช้ + bool protectAlly = Duel.ChainTargets.Any(t => t != null && t.Controller == 0 + && t.Location == CardLocation.MonsterZone && !YUBEL_SET.Contains(t.Id)); + return protectAlly; + }*/ + + // --- Varudras: ถามถอดวัตถุดิบอีก 1 เพื่อทำลาย --- + if (YesNoFor(desc, CardId.VARUDASN_FINAL_BRINGER, 1)) + { + var best = GetBestEnemyCard(); + return best != null && ShouldVarudrasDetachForPop(best); + } + if (solving != null + && solving.IsCode(CardId.VARUDASN_FINAL_BRINGER) + && Duel.CurrentChain.Count > 0) // แปลว่าอยู่ใน e1 ไม่ใช่ e2 + { + // มีเป้าศัตรูให้ทำลายไหม? + var t = GetNormalEnemyTargetList(true, true).FirstOrDefault(c => c.Controller == 1); + if (t == null) return false; // ไม่มีเป้า → ไม่ถอด + return ShouldVarudrasDetachForPop(t); // มีเป้า → ใช้เกณฑ์เดิมตัดสิน + } + + // aux.Stringid(78371393,2) -> คำถาม "จะสังเวยไหม?" + if (YesNoFor(desc, CardId.YUBEL, 2)) + { + // มี Lotus "บนสนามเรา" ไหม + bool haveLotusOnField = Bot.GetMonsters().Any(m => m != null && m.Id == CardId.SAMSARA_D_LOTUS); + + // ถ้ามี จะตอบ YES และตั้งธงว่ากำลังจะเลือกตัวสังเวยให้ Yubel + _yubelWantsTribute = haveLotusOnField; + return haveLotusOnField; // YES ถ้ามี Lotus, NO ถ้าไม่มี => Yubel ระเบิดตัวเอง + } + + + return base.OnSelectYesNo(desc); + } + + // Safety net for any selection the specific executors didn't pre-select + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + Logger.DebugWriteLine($"[DEBUG] OnSelectCard: hint={hint} (0x{hint:X}), min={min}, max={max}, cancelable={cancelable}, candidates={cards?.Count ?? 0}"); + + bool isReleasePrompt = + hint == (long)HintMsg.Release || + hint.ToString().ToLower().Contains("release"); // กันเหนียว + var solving = Duel.GetCurrentSolvingChainCard(); + if (cards != null && cards.Count > 0) + { + // === Throne === + if (_throneStage == ThroneStage.Searching && solving != null && solving.IsCode(CardId.NIGHTMARE_THRONE) && !throneSearched && cards != null && cards.Count > 0) + { + throneSearched = true; + _throneStage = ThroneStage.AwaitDestroyPrompt; + + ClientCard chosen = null; + if (throneDesiredPick != 0) + chosen = cards.FirstOrDefault(c => c != null && c.Id == throneDesiredPick); + + // fallback: ถ้าเลือกตามใจไม่ได้ ให้เลือกใบ Yubel ที่มีค่าที่สุด/หรือใบแรก + if (chosen == null) + chosen = cards.FirstOrDefault(c => c != null && YUBEL_SET.Contains(c.Id)) ?? cards[0]; + + Logger.DebugWriteLine($"[THRONE] Search pick => {CardStr(chosen)}"); + return new[] { chosen }; + } + // === SPIRIT GATES selections === + if (Card != null && Card.Id == CardId.SPIRIT_GATES && cards != null && cards.Count > 0) + { + // 2.1: เลือก Continuous Spell จากสุสาน (Recycle) + if (_gateWantsRecycle) + { + var pain = cards.FirstOrDefault(c => c != null && c.Id == CardId.NIGHTMARE_PAIN); + if (pain != null) return new[] { pain }; + + // อะไรต่อมิอะไรที่เป็น Continuous Spell ถ้ามี + var anyCont = cards.FirstOrDefault(c => c != null && c.IsSpell() && c.HasType(CardType.Continuous)); + if (anyCont != null) return new[] { anyCont }; + } + + // เลือกทิ้งมือเป็น cost (ลิสต์ทั้งหมดมาจากมือเรา) + bool selectingDiscard = cards.All(c => c != null && c.Controller == 0 && c.Location == CardLocation.Hand); + if (selectingDiscard && _gateDiscardPreferredId != 0) + { + var want = cards.FirstOrDefault(c => c.Id == _gateDiscardPreferredId); + if (want != null) return new[] { want }; + + // fallback: ใช้สกอร์เดิม + var sorted = cards.OrderBy(ScoreOwnCardForCost).ToList(); + return new[] { sorted[0] }; + } + + // เลือกเป้าหมายชุบจากสุสาน (Fiend 0/0) + bool selectingGYTarget = cards.Any(c => c != null && c.Location == CardLocation.Grave); + + if (selectingGYTarget) + { + if (requiemSummoned) + { + var sp = cards.FirstOrDefault(c => c != null && c.Id == CardId.SPIRIT_OF_YUBEL); + if (sp != null) return new[] { sp }; + } + if (_gateReviveTargetId != 0) + { + var t = cards.FirstOrDefault(c => c != null && c.Id == _gateReviveTargetId); + if (t != null) return new[] { t }; + } + if (moonSummoned) + { + int[] prio = { + CardId.SPIRIT_OF_YUBEL, + CardId.YUBEL + }; + foreach (var id in prio) + { + var pick = cards.FirstOrDefault(c => c != null && c.Id == id); + if (pick != null) return new[] { pick }; + } + } + else + { + int[] prio = { + CardId.SPIRIT_OF_YUBEL, + CardId.SAMSARA_D_LOTUS, + CardId.DARK_BECKONING_BEAST, + CardId.CHAOS_SUMMONING_BEAST, + CardId.YUBEL + }; + foreach (var id in prio) + { + var pick = cards.FirstOrDefault(c => c != null && c.Id == id); + if (pick != null) return new[] { pick }; + } + } + + var any00 = cards.FirstOrDefault(c => c != null && Is00FiendId(c.Id)); + if (any00 != null) return new[] { any00 }; + } + } + // === Throne: เลือกการ์ดที่ค้นเจอ === + if (Card.Id == CardId.NIGHTMARE_THRONE && _throneStage == ThroneStage.Searching && thronePending && !throneSearched) + { + throneSearched = true; + _throneStage = ThroneStage.AwaitDestroyPrompt; + ClientCard chosen = null; + if (throneDesiredPick != 0) chosen = cards.FirstOrDefault(c => c.Id == throneDesiredPick); + if (chosen == null) chosen = cards[0]; + + Logger.DebugWriteLine($"[THRONE] Search pick => {CardStr(chosen)}"); + return new[] { chosen }; + } + // --- Yubel is asking us to choose the tribute target --- + if (_yubelWantsTribute && isReleasePrompt && cards != null && cards.Count > 0) + { + var lotus = cards.FirstOrDefault(c => c != null && c.Id == CardId.SAMSARA_D_LOTUS); + if (lotus != null) + { + _yubelWantsTribute = false; // เคลียร์ธง + return new[] { lotus }; // เลือก Lotus สังเวยตามที่ต้องการ + } + // เผื่อกรณีเอนจินส่งลิสต์มาแต่ดันไม่มี Lotus (ไม่ควรเกิด เพราะเราตอบ YES เมื่อมี Lotus) + _yubelWantsTribute = false; + // ปล่อยให้ base ตัดสินใจ หรือจะ return null ก็ได้ตามฐานของคุณ + } + // --- Varudras: เลือกเป้าหมายทำลาย --- + if (Card.Id == CardId.VARUDASN_FINAL_BRINGER && hint == 502 && cards != null && cards.Count > 0) + { + // พยายามเลือกฝั่งศัตรูก่อน (คัดใบที่อันตราย/ป่วนที่สุด) + var enemyPick = cards + .Where(c => c != null && c.Controller == 1) + .OrderByDescending(c => ScoreEnemyCardForRemoval(c)) + .FirstOrDefault(); + if (enemyPick != null) return new[] { enemyPick }; + + return new[] { cards[0] }; // fallback + } + // --- Abomination: เลือกเป้าหมายทำลาย --- + if (Card.Id == CardId.UNCHAINDEDABOMINATION && hint == 502 && cards != null && cards.Count > 0) + { + // พยายามเลือกฝั่งศัตรูก่อน (คัดใบที่อันตราย/ป่วนที่สุด) + var enemyPick = cards + .Where(c => c != null && c.Controller == 1) + .OrderByDescending(c => ScoreEnemyCardForRemoval(c)) + .FirstOrDefault(); + if (enemyPick != null) return new[] { enemyPick }; + + return new[] { cards[0] }; // fallback + } + // --- Rage Quick Link --- + if (solving != null && solving.IsCode(CardId.UNCHAINED_SOUL_OF_RAGE) && cards.Any(c => c != null && c.Location == CardLocation.Extra)) + { + // 1) เลือก S:P Little Knight ก่อนเสมอ ถ้ามี + var pickSP = cards.FirstOrDefault(c => c != null && c.Id == CardId.SP_LITTLE_KNIGHT); + if (pickSP != null) return new List { pickSP }; + + // 2) เลือก Gorgon เฉพาะเมื่อ EMZ ว่างเท่านั้น + ClientCard pickGorgon = null; + pickGorgon = cards.FirstOrDefault(c => c != null && c.Id == CardId.GORGONOFZIL); + + if (pickGorgon != null) + { + if (HasFreeEMZ()) + return new List { pickGorgon }; + // ถ้า EMZ ไม่ว่าง ห้ามเลือก Gorgon -> ไปหาใบอื่นต่อ + } + + // 3) fallback: ถ้ามีลิงก์ตัวอื่นที่ generic ก็เลือกใบแรกไปก่อน + return new List { cards[0] }; + } + } + + + return base.OnSelectCard(cards, min, max, hint, cancelable); + } + + // --- Scoring helpers ------------------------------------------------- + private int ScoreOwnCardForCost(ClientCard c) + { + if (c == null) return int.MaxValue; + int score = 5000; // lower is more expendable + if (NEVER_SAC.Contains(c.Id)) return int.MaxValue; + if (YUBEL_SET.Contains(c.Id)) return 9000; + if ((c.HasType(CardType.Link) && c.LinkCount >= 2) || c.HasType(CardType.Fusion | CardType.Synchro | CardType.Xyz)) score += 2000; + if (c.EquipCards != null && c.EquipCards.Count > 0) score += 1000; + int idx = Array.IndexOf(YubelCostPriority, c.Id); + if (idx >= 0) score = 10 + idx; + score += Math.Max(0, c.Attack / 100); + return score; + } + + private int ScoreEnemyCardForRemoval(ClientCard c) + { + if (c == null) return -1; + int s = 0; + if (c.IsFloodgate()) s += 6000; + if (c.IsMonsterDangerous()) s += 4000; + if (c.IsMonsterInvincible()) s += 3500; + if (c.EquipCards != null && c.EquipCards.Count > 0) s += 800; + if (c.HasType(CardType.Fusion | CardType.Ritual | CardType.Synchro | CardType.Xyz)) s += 700; + if (c.HasType(CardType.Link) && c.LinkCount >= 2) s += 700; + s += Math.Max(0, c.Attack); + return s; + } + + #endregion + + #region DEBUG + + private string CardStr(ClientCard c) + { + if (c == null) return "null"; + string loc = c.Location.ToString(); + string face = c.IsFaceup() ? "FU" : "FD"; + return $"{c.Name}#{c.Id} [{loc}] P{c.Controller} {face}"; + } + private void DumpChain(string tag = "") + { + Logger.DebugWriteLine($"[CHAIN]{(tag == "" ? "" : $" ({tag})")} turn={Duel.Turn} player={Duel.Player} phase={Duel.Phase} chainCount={Duel.CurrentChain.Count}"); + for (int i = 0; i < Duel.CurrentChain.Count; i++) + { + var c = Duel.CurrentChain[i]; + Logger.DebugWriteLine($" [{i}] {CardStr(c)}"); + } + var solving = Duel.GetCurrentSolvingChainCard(); + if (solving != null) + { + Logger.DebugWriteLine($" -> Solving: {CardStr(solving)} ActivateDescription={ActivateDescription}"); + } + if (Duel.ChainTargets != null && Duel.ChainTargets.Count > 0) + { + var tg = Duel.ChainTargets.Where(t => t != null).Select(CardStr); + Logger.DebugWriteLine($" targets: {string.Join(" | ", tg)}"); + } + } + + private void DebugThroneDescMap(int incomingDesc) + { + for (int i = 0; i < 5; i++) + { + int sid = Util.GetStringId(CardId.NIGHTMARE_THRONE, i); + Logger.DebugWriteLine($"[THRONE] desc map i={i} strId={sid} match={(sid == incomingDesc)}"); + } + } + private bool BlockIfThrone(string who) + { + if (InThroneFlow) + { + Logger.DebugWriteLine($"[THRONE] BLOCKED {who} during Throne flow"); + return true; + } + return false; + } + + #endregion + + // ======================= END OF LIFE ==================== + } +} diff --git a/Game/AI/Decks/ZefraExecutor.cs b/Game/AI/Decks/ZefraExecutor.cs new file mode 100644 index 000000000..e66ce1508 --- /dev/null +++ b/Game/AI/Decks/ZefraExecutor.cs @@ -0,0 +1,2214 @@ +using YGOSharp.OCGWrapper; +using YGOSharp.OCGWrapper.Enums; +using System.Collections.Generic; +using System.Linq; +using System; +using WindBot; +using WindBot.Game; +using WindBot.Game.AI; +namespace WindBot.Game.AI.Decks +{ + [Deck("Zefra", "AI_Zefra")] + class ZefraExecutor : DefaultExecutor + { + public class CardId + { + //main code + public const int PSY_FrameDriver = 49036338; + public const int Zefraath = 29432356; + public const int TheMightyMasterofMagic = 3611830; + public const int AstrographSorcerer = 76794549; + public const int DestrudotheLostDragon_Frisson = 5560911; + public const int SupremeKingGateZero = 96227613; + public const int MythicalBeastJackalKing = 27354732; + public const int SecretoftheYangZing = 58990362; + public const int FlameBeastoftheNekroz = 20773176; + public const int StellarknightZefraxciton = 22617205; + public const int SupremeKingDragonDarkwurm = 69610326; + public const int Blackwing_ZephyrostheElite = 14785765; + public const int ShaddollZefracore = 95401059; + public const int Raidraptor_SingingLanius = 31314549; + public const int SatellarknightZefrathuban = 96223501; + public const int Raider_Wing = 52159691; + public const int Zefraxi_TreasureoftheYangZing = 21495657; + public const int RitualBeastTamerZeframpilica = 57777714; + public const int ServantofEndymion = 92559258; + public const int PSY_FramegearGamma = 38814750; + public const int MechaPhantomBeastO_Lion = 72291078; + public const int MaxxC = 23434538; + public const int Deskbot001 = 94693857; + public const int JetSynchron = 9742784; + public const int DDLamia = 19580308; + public const int DDSavantKepler = 11609969; + public const int LightoftheYangZing = 61488417; + public const int Rank_Up_MagicSoulShaveForce = 23581825; + public const int SpellPowerMastery = 38943357; + public const int DragonShrine = 41620959; + public const int Terraforming = 73628505; + public const int ZefraProvidence = 74580251; + public const int FoolishBurial = 81439173; + public const int CalledbytheGrave = 24224830; + public const int DarkContractwiththGate = 46372010; + public const int OracleofZefra = 32354768; + public const int ZefraWar = 96073342; + public const int ZefraDivineStrike = 35561352; + public const int NinePillarsofYangZing = 57831349; + public const int OneforOne = 2295440; + + //extra code + public const int BorreloadSavageDragon = 27548199; + public const int Odd_EyesMeteorburstDragon = 80696379; + public const int F_A_DawnDragster = 33158448; + public const int Denglong_FirstoftheYangZing = 65536818; + public const int HeraldoftheArcLight = 79606837; + public const int TruKingofAllCalamities = 88581108; + public const int Raidraptor_ArsenalFalcon = 96157835; + public const int Raidraptor_ForceStrix = 73347079; + public const int SaryujaSkullDread = 74997493; + public const int MechaPhantomBeastAuroradon = 44097050; + public const int HeavymetalfoesElectrumite = 24094258; + public const int CrystronHalqifibrax = 50588353; + public const int Raidraptor_WiseStrix = 36429703; + public const int Linkuriboh = 41999284; + public const int PSY_FramelordOmega = 74586817; + + public const int MechaPhantomBeastToken = 44097051; + } + private bool opt_0 = false; + private bool opt_1 = false; + private bool opt_2 = false; + //edo false + private const bool IS_YGOPRO = true; + private const int P_ACTIVATE_DESC = 1160; + //private const int P_SPSUMMON_DESC = 1163; + private int p_count = 0; + private int spell_activate_count = 0; + private bool summoned = false; + private bool link_summoned = false; + private bool p_summoned = false; + private bool p_summoning = false; + private bool activate_SupremeKingDragonDarkwurm_1 = false; + private bool activate_p_Zefraath = false; + private bool activate_OracleofZefra = false; + private bool activate_ZefraProvidence = false; + private bool activate_SupremeKingDragonDarkwurm_2 = false; + private bool activate_JetSynchron = false; + private bool activate_Blackwing_ZephyrostheElite = false; + private bool activate_DragonShrine = false; + private bool activate_SpellPowerMastery = false; + private bool activate_DestrudotheLostDragon_Frisson = false; + private bool activate_DarkContractwiththGate = false; + private bool activate_SecretoftheYangZing = false; + private bool activate_ShaddollZefracore = false; + private bool activate_DDLamia = false; + private bool xyz_mode = false; + private bool Blackwing_ZephyrostheElite_activate = false; + private bool HeavymetalfoesElectrumite_activate = false; + private bool should_destory = false; + private List Odd_EyesMeteorburstDragon_materials = new List(); + private bool duel_start = true; + private int activate_count = 0; + private int summon_count = 0; + private bool enemy_activate = false; + private enum CustomMessage + { + Happy, + Angry, + Surprise + } + private static class Toos + { + public delegate bool Delegate(ClientCard card); + private static bool DefaultFunc(ClientCard card) + { + return true; + } + public static bool LinqAny(IList cards, Delegate @delegate = null) + { + if (cards == null) return false; + @delegate = @delegate ?? DefaultFunc; + return cards.Any(card => card != null && @delegate(card)); + } + public static bool LinqAll(IList cards, Delegate @delegate = null, bool flag = true) + { + if (cards == null) return false; + IList rcards = new List(cards); + if (flag) rcards = cards.Where(card => card != null).ToList(); + @delegate = @delegate ?? DefaultFunc; + return rcards.All(card => card != null && @delegate(card)); + } + public static int LinqCount(IList cards, Delegate @delegate = null) + { + if (cards == null) return -1; + @delegate = @delegate ?? DefaultFunc; + return cards.Count(card => card != null && @delegate(card)); + } + public static List LinqWhere(IList cards, Delegate @delegate = null) + { + if (cards == null) return new List(); + @delegate = @delegate ?? DefaultFunc; + return cards.Where(card => card != null && @delegate(card)).ToList(); + } + } + private class Func + { + private IList _parameters = new List(); + private List no_p_spsummon_ids = new List() + { + CardId.Zefraath + }; + private List selectCardList = null; + private List selectCardIdList = null; + public List GetSelectCardList() + { + if (selectCardList == null) + { + selectCardList = new List(); + } + else + { + selectCardList.Clear(); + } + return selectCardList; + } + public List GetSelectCardIdList() + { + if (selectCardIdList == null) + { + selectCardIdList = new List(); + } + else + { + selectCardIdList.Clear(); + } + return selectCardIdList; + } + public bool IsLocation(ClientCard card) + { + return card.Location == (CardLocation)_parameters[0]; + } + public bool IsCode(ClientCard card) + { + return card.IsCode((int)_parameters[0]); + } + public static bool IsCode(ClientCard card, params int[] ids) + { + if (card == null) return false; + foreach (var id in ids) + { + if (card.IsCode(id)) return true; + } + return false; + } + public bool HasSetCode(ClientCard card) + { + return card.HasSetcode((int)_parameters[0]); + } + public static bool HasSetCode(ClientCard card, params int[] set_codes) + { + if (card == null) return false; + foreach (var set_code in set_codes) + { + if (card.HasSetcode(set_code)) return true; + } + return false; + } + public static bool IsFaceUp(ClientCard card) + { + return card.IsFaceup(); + } + public bool HasAttribute(ClientCard card) + { + return card.HasAttribute((CardAttribute)_parameters[0]); + } + public bool HasRace(ClientCard card) + { + return card.HasRace((CardRace)_parameters[0]); + } + public bool HasLevel(ClientCard card) + { + return card.Level == (int)_parameters[0]; + } + public bool HasType(ClientCard card) + { + return card.HasType((CardType)_parameters[0]); + } + public static bool IsOnfield(ClientCard card) + { + return (card.Location & CardLocation.MonsterZone) > 0 || (card.Location & CardLocation.SpellZone) > 0; + } + public static Toos.Delegate NegateFunc(Toos.Delegate @delegate) + { + return card => { return !@delegate(card); }; + } + private void SetParameters(IList parameters) + { + ClearParameters(); + for (int i = 0; i < parameters?.Count(); ++i) + { + _parameters.Add(parameters[i]); + } + } + private void ClearParameters() + { + _parameters.Clear(); + } + public bool CardsCheckAny(IList cards, Toos.Delegate @delegate = null, params object[] parameters) + { + SetParameters(parameters); + return Toos.LinqAny(cards, @delegate); + } + public bool CardsCheckALL(IList cards, Toos.Delegate @delegate = null, bool all = true, params object[] parameters) + { + SetParameters(parameters); + return Toos.LinqAll(cards, @delegate, all); + } + public int CardsCheckCount(IList cards, Toos.Delegate @delegate = null, params object[] parameters) + { + SetParameters(parameters); + return Toos.LinqCount(cards, @delegate); + } + public List CardsCheckWhere(IList cards, Toos.Delegate @delegate = null, params object[] parameters) + { + SetParameters(parameters); + return Toos.LinqWhere(cards, @delegate); + } + public static List MergeList(params List[] lists) + { + List result = new List(); + foreach (var list in lists) + { + if (list == null) continue; + result.AddRange(list); + } + return result; + } + public List CardsIdToClientCards(IList cardsId, IList cardsList, bool uniqueId = true) + { + if (cardsList?.Count() <= 0 || cardsId?.Count() <= 0) return new List(); + List result = new List(); + cardsId = cardsId.Distinct().ToList(); + foreach (var cardid in cardsId) + { + List cards = CardsCheckWhere(cardsList, IsCode, cardid); + if (cards.Count <= 0) continue; + if (uniqueId) result.Add(cards.First()); + else result.AddRange(cards); + } + return result; + } + public static List ClientCardsToCardsId(IList cardsList, bool uniqueId = false, bool alias = false) + { + if (cardsList?.Count <= 0) return new List(); + List res = new List(); + foreach (var card in cardsList) + { + if (card == null) continue; + if (card.Alias != 0 && alias && !(res.Contains(card.Alias) & uniqueId)) res.Add(card.Alias); + else if (card.Id != 0 && !(res.Contains(card.Id) & uniqueId)) res.Add(card.Id); + } + return res; + } + //AIUtil + public static IList CheckSelectCount(AIUtil util, IList _selected, IList cards, int min, int max) + { + return _selected?.Count() <= 0 ? null : util.CheckSelectCount(_selected, cards, min, max); + } + public static List GetZoneCards(ClientField player, CardLocation loc, bool feceup = false, bool disable = false) + { + if (!feceup) disable = false; + List result = new List(); + if ((loc & CardLocation.Hand) > 0) result.AddRange(Toos.LinqWhere(player.Hand)); + if ((loc & CardLocation.MonsterZone) > 0) result.AddRange(Toos.LinqWhere(player.MonsterZone, card => !(!card.IsFaceup() & feceup) && !(!card.IsDisabled() & disable))); + if ((loc & CardLocation.SpellZone) > 0) result.AddRange(Toos.LinqWhere(player.SpellZone, card => !(!card.IsFaceup() & feceup) && !(!card.IsDisabled() & disable))); + if ((loc & CardLocation.PendulumZone) > 0) result.AddRange(Toos.LinqWhere(new List() { player.SpellZone[0], player.SpellZone[4] }, card => !(!card.IsFaceup() & feceup) && !(!card.IsDisabled() & disable))); + if ((loc & CardLocation.Grave) > 0) result.AddRange(Toos.LinqWhere(player.Graveyard)); + if ((loc & CardLocation.Removed) > 0) result.AddRange(Toos.LinqWhere(player.Banished, card => !(!card.IsFaceup() & feceup))); + if ((loc & CardLocation.Extra) > 0) result.AddRange(Toos.LinqWhere(player.ExtraDeck, card => !(!card.IsFaceup() & feceup))); + result = result.Distinct().ToList(); + return result; + } + public bool HasInZone(ClientField player, CardLocation loc, int id, bool feceup = false, bool disable = false) + { + return CardsCheckAny(GetZoneCards(player, loc, feceup, disable), IsCode, id); + } + public static bool SpellActivate(ClientCard card) + { + return card.Location == CardLocation.Hand || (card.Location == CardLocation.SpellZone && card.IsFacedown()); + } + public static bool PendulumActivate(int desc, ClientCard card) + { + return desc == P_ACTIVATE_DESC && card.Location == CardLocation.Hand; + } + private static Toos.Delegate GetPSpSummonLimilt(ClientCard pcard) + { + int setcode = -1; + int setcode2 = -1; + switch (pcard.Id) + { + case CardId.SecretoftheYangZing: + case CardId.Zefraxi_TreasureoftheYangZing: { setcode = 0xc4; setcode2 = 0x9e; break; } + case CardId.FlameBeastoftheNekroz: { setcode = 0xc4; setcode2 = 0xb4; break; } + case CardId.StellarknightZefraxciton: + case CardId.SatellarknightZefrathuban: { setcode = 0xc4; setcode2 = 0x109c; break; } + case CardId.RitualBeastTamerZeframpilica: { setcode = 0xc4; setcode2 = 0x10b5; break; } + case CardId.ShaddollZefracore: { setcode = 0xc4; setcode2 = 0x9d; break; } + case CardId.DDSavantKepler: { setcode = 0xaf; break; } + default: break; + } + return card => { + return (setcode == -1 ? true : card.HasSetcode(setcode)) + || (setcode2 == -1 ? true : card.HasSetcode(setcode2)); + }; + } + public static int[] GetPScales(ClientField bot) + { + int[] pScales = new int[2]; + ClientCard lcard = bot.SpellZone[0]; + ClientCard rcard = bot.SpellZone[4]; + pScales[0] = (lcard == null || lcard.IsFacedown() || !lcard.HasType(CardType.Pendulum)) ? -1 : lcard.RScale; + pScales[1] = (rcard == null || rcard.IsFacedown() || !rcard.HasType(CardType.Pendulum)) ? -1 : rcard.LScale; + return pScales; + } + public static int GetPScale(ClientField bot, int id) + { + bool rscale = false; + ClientCard pcard = null; + if (bot.SpellZone[0] != null && bot.SpellZone[0].Id == id) + { + pcard = bot.SpellZone[4]; + } + else + { + pcard = bot.SpellZone[0]; + rscale = true; + } + if (pcard == null || pcard.IsFacedown() || !pcard.HasType(CardType.Pendulum)) return -1; + return rscale ? pcard.RScale : pcard.LScale; + } + public List GetPSpSummonMonster(ClientField bot, ClientCard lcard, ClientCard rcard) + { + if (lcard == null || rcard == null || !lcard.HasType(CardType.Pendulum) || !rcard.HasType(CardType.Pendulum) || (IsOnfield(lcard) & lcard.IsFacedown()) || (IsOnfield(lcard) & rcard.IsFacedown())) return null; + int MaxScale = Math.Max(lcard.RScale, rcard.LScale); + int MinScale = Math.Min(lcard.RScale, rcard.LScale); + Toos.Delegate @llimit = GetPSpSummonLimilt(lcard); + Toos.Delegate @rlimit = GetPSpSummonLimilt(rcard); + return CardsCheckWhere(GetZoneCards(bot, CardLocation.Hand | CardLocation.Extra, true), + card => { + return card != lcard && card != rcard && card.HasType(CardType.Monster) && card.Level > MinScale && card.Level < MaxScale + && !no_p_spsummon_ids.Contains(card.Id) && @llimit(card) && @rlimit(card); + }); ; + } + public bool IsActivateScale(ClientField bot, ClientCard card) + { + ClientCard lcard = bot.SpellZone[0]; + ClientCard rcard = bot.SpellZone[4]; + List spSummonMonster = null; + if (lcard != null && rcard != null) return false; + if (lcard == null && rcard == null) return true; + + spSummonMonster = lcard == null ? GetPSpSummonMonster(bot, card, rcard) : GetPSpSummonMonster(bot, lcard, card); + return spSummonMonster?.Count() > 0; + } + public static int CompareCardScale(ClientCard cardA, ClientCard cardB) + { + if (cardA.RScale < cardB.RScale) + return -1; + if (cardA.RScale == cardB.RScale) + return 0; + return 1; + } + public static List GetCardsRepeatCardsId(IList cards) + { + if (cards?.Count <= 0) return new List() { -1 }; + IList cardsid = new List(); + List res = new List(); + foreach (var card in cards) + { + if (card == null) continue; + cardsid.Add(card.Id); + } + for (int i = 0; i < cardsid.Count; i++) + { + if (res.Count >= 0 && res.Contains(cardsid[i])) continue; + int times = 0; + for (int j = 0; j < cardsid.Count; j++) + { + if (times > 1) { res.Add(cardsid[i]); break; } + if (cardsid[i] == cardsid[j]) ++times; + } + } + if (res.Count <= 0) return new List() { -1 }; + return res; + } + } + private Func func = new Func(); + public ZefraExecutor(GameAI ai, Duel duel) : base(ai, duel) + { + AddExecutor(ExecutorType.Activate, CardId.CalledbytheGrave, CalledbytheGraveEffect); + AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonEffect_2); + AddExecutor(ExecutorType.Activate, CardId.F_A_DawnDragster, ResetFlag); + AddExecutor(ExecutorType.Activate, CardId.NinePillarsofYangZing, NinePillarsofYangZingEffect); + AddExecutor(ExecutorType.Activate, CardId.ZefraDivineStrike, ZefraDivineStrikeEffect); + AddExecutor(ExecutorType.Activate, CardId.HeraldoftheArcLight, HeraldoftheArcLightEffect); + AddExecutor(ExecutorType.Activate, CardId.TruKingofAllCalamities, TruKingofAllCalamitiesEffect); + AddExecutor(ExecutorType.Activate, CardId.PSY_FramegearGamma, ResetFlag); + AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC); + AddExecutor(ExecutorType.Activate, CardId.SupremeKingDragonDarkwurm, SupremeKingDragonDarkwurmEffect); + AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect); + AddExecutor(ExecutorType.Activate, CardId.Terraforming, TerraformingEffect); + AddExecutor(ExecutorType.Activate, CardId.SpellPowerMastery, ResetFlag); + AddExecutor(ExecutorType.Activate, CardId.DragonShrine, DragonShrineEffect); + AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect); + AddExecutor(ExecutorType.Activate, CardId.DarkContractwiththGate, DarkContractwiththGateEffect); + AddExecutor(ExecutorType.Activate, CardId.Terraforming, ResetFlag); + AddExecutor(ExecutorType.Activate, CardId.OracleofZefra, OracleofZefraEffect); + AddExecutor(ExecutorType.Activate, CardId.ZefraProvidence, ZefraProvidenceEffect); + AddExecutor(ExecutorType.Activate, CardId.AstrographSorcerer, AstrographSorcererEffect); + AddExecutor(ExecutorType.Activate, CardId.HeavymetalfoesElectrumite, HeavymetalfoesElectrumiteEffect); + AddExecutor(ExecutorType.Summon, CardId.SupremeKingDragonDarkwurm, SupremeKingDragonDarkwurmSummon); + AddExecutor(ExecutorType.Activate, CardId.SupremeKingGateZero, SupremeKingGateZeroEffect); + AddExecutor(ExecutorType.Activate, CardId.Zefraxi_TreasureoftheYangZing, Zefraxi_TreasureoftheYangZingEffect); + AddExecutor(ExecutorType.Activate, CardId.SatellarknightZefrathuban, SatellarknightZefrathubanEffect); + AddExecutor(ExecutorType.Activate, CardId.RitualBeastTamerZeframpilica, RitualBeastTamerZeframpilicaEffect); + AddExecutor(ExecutorType.Activate, CardId.SecretoftheYangZing, SecretoftheYangZingEffect); + AddExecutor(ExecutorType.Activate, CardId.FlameBeastoftheNekroz, FlameBeastoftheNekrozEffect); + AddExecutor(ExecutorType.Activate, CardId.ShaddollZefracore, ShaddollZefracoreEffect); + AddExecutor(ExecutorType.Activate, CardId.StellarknightZefraxciton, StellarknightZefraxcitonEffect); + AddExecutor(ExecutorType.Activate, CardId.SupremeKingDragonDarkwurm, SupremeKingGateZeroEffect); + AddExecutor(ExecutorType.Activate, CardId.AstrographSorcerer, SupremeKingGateZeroEffect); + AddExecutor(ExecutorType.Activate, CardId.Zefraath, ZefraathEffect); + AddExecutor(ExecutorType.Activate, CardId.DDSavantKepler, DDSavantKeplerEffect); + AddExecutor(ExecutorType.Summon, CardId.DDSavantKepler, DDSavantKeplerSummon); + AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect_3); + AddExecutor(ExecutorType.Activate, CardId.MythicalBeastJackalKing, MythicalBeastJackalKingEffect); + AddExecutor(ExecutorType.SpSummon, Psummon); + AddExecutor(ExecutorType.Activate, CardId.OneforOne, OneforOneEffect); + AddExecutor(ExecutorType.Activate, CardId.ServantofEndymion, ServantofEndymionEffect_2); + AddExecutor(ExecutorType.Activate, CardId.CrystronHalqifibrax, CrystronHalqifibraxEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_ArsenalFalcon, Raidraptor_ArsenalFalconSummon); + AddExecutor(ExecutorType.Activate, CardId.Raidraptor_ArsenalFalcon, Raidraptor_ArsenalFalconEffect); + AddExecutor(ExecutorType.SpSummon, CardId.HeavymetalfoesElectrumite, HeavymetalfoesElectrumiteSummon); + //xyz mode + AddExecutor(ExecutorType.SpSummon, CardId.Odd_EyesMeteorburstDragon, Odd_EyesMeteorburstDragonSummon); + AddExecutor(ExecutorType.Activate, CardId.Odd_EyesMeteorburstDragon, Odd_EyesMeteorburstDragonEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_WiseStrix, Raidraptor_WiseStrixSummon); + AddExecutor(ExecutorType.Activate, CardId.Raidraptor_WiseStrix, Raidraptor_WiseStrixEffect); + AddExecutor(ExecutorType.Activate, CardId.Blackwing_ZephyrostheElite, Blackwing_ZephyrostheEliteEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixSummon); + AddExecutor(ExecutorType.Activate, CardId.Raidraptor_ForceStrix, Raidraptor_ForceStrixEffect); + AddExecutor(ExecutorType.Activate, CardId.Rank_Up_MagicSoulShaveForce, ResetFlag); + AddExecutor(ExecutorType.Activate, CardId.Raider_Wing, Raider_WingEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Raidraptor_SingingLanius); + //xyz mode + AddExecutor(ExecutorType.SpSummon, CardId.SaryujaSkullDread, SaryujaSkullDreadSummon); + AddExecutor(ExecutorType.Activate, CardId.SaryujaSkullDread, SaryujaSkullDreadEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Denglong_FirstoftheYangZing, Denglong_FirstoftheYangZingSummon_2); + AddExecutor(ExecutorType.SpSummon, CardId.BorreloadSavageDragon, BorreloadSavageDragonSummon_2); + AddExecutor(ExecutorType.SpSummon, CardId.CrystronHalqifibrax, CrystronHalqifibraxSummon); + AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, LinkuribohSummon); + AddExecutor(ExecutorType.Activate, CardId.DDLamia, DDLamiaEffect); + AddExecutor(ExecutorType.SpSummon, CardId.MechaPhantomBeastAuroradon, MechaPhantomBeastAuroradonSummon); + AddExecutor(ExecutorType.Activate, CardId.MechaPhantomBeastAuroradon, MechaPhantomBeastAuroradonEffect); + AddExecutor(ExecutorType.SpSummon, CardId.Denglong_FirstoftheYangZing, Denglong_FirstoftheYangZingSummon); + AddExecutor(ExecutorType.Activate, CardId.Denglong_FirstoftheYangZing, Denglong_FirstoftheYangZingEffect); + AddExecutor(ExecutorType.SpSummon, CardId.BorreloadSavageDragon, BorreloadSavageDragonSummon); + AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonEffect); + AddExecutor(ExecutorType.SpSummon, CardId.HeraldoftheArcLight); + AddExecutor(ExecutorType.SpSummon, CardId.F_A_DawnDragster, F_A_DawnDragsterSummon); + AddExecutor(ExecutorType.SpSummon, CardId.PSY_FramelordOmega, BorreloadSavageDragonSummon); + AddExecutor(ExecutorType.Activate, CardId.PSY_FramelordOmega, PSY_FramelordOmegaEffect); + AddExecutor(ExecutorType.Activate, CardId.Linkuriboh, LinkuribohEffect); + AddExecutor(ExecutorType.Activate, CardId.MechaPhantomBeastO_Lion); + AddExecutor(ExecutorType.Activate, CardId.JetSynchron, JetSynchronEffect); + AddExecutor(ExecutorType.Activate, CardId.Blackwing_ZephyrostheElite, Blackwing_ZephyrostheEliteEffect_2); + AddExecutor(ExecutorType.Summon, CardId.JetSynchron, DDLamiaSummon); + AddExecutor(ExecutorType.Summon, CardId.DDLamia, DDLamiaSummon); + AddExecutor(ExecutorType.Summon, CardId.Deskbot001, DDLamiaSummon); + AddExecutor(ExecutorType.Summon, CardId.LightoftheYangZing, DDLamiaSummon); + List p_summon_ids = new List() {CardId.Zefraxi_TreasureoftheYangZing,CardId.SatellarknightZefrathuban,CardId.ServantofEndymion,CardId.RitualBeastTamerZeframpilica, + CardId.DDSavantKepler,CardId.StellarknightZefraxciton,CardId.ShaddollZefracore,CardId.SupremeKingDragonDarkwurm}; + for (int i = 0; i < p_summon_ids.Count; ++i) AddExecutor(ExecutorType.Summon, p_summon_ids[i], DefaultSummon); + AddExecutor(ExecutorType.Summon, DefaultSummon); + AddExecutor(ExecutorType.Activate, CardId.Deskbot001, ResetFlag); + AddExecutor(ExecutorType.Activate, CardId.TheMightyMasterofMagic, TheMightyMasterofMagicEffect); + AddExecutor(ExecutorType.Activate, CardId.DestrudotheLostDragon_Frisson, DestrudotheLostDragon_FrissonEffect); + AddExecutor(ExecutorType.Summon, CardId.Blackwing_ZephyrostheElite, DefaultSummon_2); + AddExecutor(ExecutorType.Summon, DefaultSummon_2); + AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh); + AddExecutor(ExecutorType.SpellSet, SpellSet); + AddExecutor(ExecutorType.SpellSet, SpellSet_2); + AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); + AddExecutor(ExecutorType.Activate, DefaultPActivate); + AddExecutor(ExecutorType.GoToEndPhase, GoToEndPhase); + } + public override void OnNewTurn() + { + if (duel_start) + { + duel_start = false; + AI.SendCustomChat((int)CustomMessage.Happy); + } + activate_SupremeKingDragonDarkwurm_1 = false; + activate_SupremeKingDragonDarkwurm_2 = false; + activate_JetSynchron = false; + activate_DestrudotheLostDragon_Frisson = false; + activate_ZefraProvidence = false; + activate_OracleofZefra = false; + activate_DragonShrine = false; + activate_p_Zefraath = false; + p_summoned = false; + summoned = false; + activate_DarkContractwiththGate = false; + activate_SecretoftheYangZing = false; + activate_ShaddollZefracore = false; + activate_SpellPowerMastery = false; + link_summoned = false; + activate_DDLamia = false; + xyz_mode = false; + Blackwing_ZephyrostheElite_activate = false; + HeavymetalfoesElectrumite_activate = false; + spell_activate_count = 0; + p_count = 0; + activate_count = 0; + summon_count = 0; + enemy_activate = false; + base.OnNewTurn(); + } + private bool ZefraProvidenceEffect() + { + if (ActivateDescription == 96) + { + if (should_destory) + { + should_destory = false; + return false; + } + return BeforeResult(ExecutorType.Activate); + } + else + { + activate_ZefraProvidence = true; + return BeforeResult(ExecutorType.Activate); + } + + } + private List CheckShouldSpsummonExtraMonster() + { + List extra_ids = new List() { CardId.HeavymetalfoesElectrumite, CardId.CrystronHalqifibrax }; + if (!Bot.HasInExtra(CardId.HeavymetalfoesElectrumite)) extra_ids.Remove(CardId.HeavymetalfoesElectrumite); + if (!Bot.HasInExtra(CardId.CrystronHalqifibrax)) extra_ids.Remove(CardId.CrystronHalqifibrax); + if (extra_ids.Count <= 0) return extra_ids; + bool DD_summon_check = false; + if (Bot.HasInExtra(CardId.CrystronHalqifibrax) && ((!summoned && HasInDeck(CardId.DDSavantKepler) && (HasInDeck(CardId.DarkContractwiththGate) || Bot.HasInHandOrInSpellZone(CardId.DarkContractwiththGate) + ) && !activate_DarkContractwiththGate && HasInDeck(CardId.DDLamia)) || (func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner) && + (HasInDeck(CardId.AstrographSorcerer) || Bot.HasInHand(CardId.AstrographSorcerer))))) + { + DD_summon_check = true; + } + if (Bot.SpellZone[0] != null && Bot.SpellZone[4] != null) + { + List spSummonMonster = func.GetPSpSummonMonster(Bot, Bot.SpellZone[0], Bot.SpellZone[4]); + if (DD_summon_check && spSummonMonster != null) + { + + List pSpsummonMonster = func.CardsCheckWhere(spSummonMonster, func.HasType, CardType.Pendulum); + List monsterCards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone), card => + { return card.IsFaceup() && card.HasType(CardType.Pendulum); }); + if (Func.MergeList(pSpsummonMonster, monsterCards).Count <= 0) extra_ids.Remove(CardId.HeavymetalfoesElectrumite); + } + else + { + extra_ids.Remove(CardId.HeavymetalfoesElectrumite); + } + } + else + { + if (!((Bot.HasInHand(CardId.OracleofZefra) && !activate_OracleofZefra) || (Bot.HasInHand(CardId.ZefraProvidence) + && !activate_ZefraProvidence) || (Bot.HasInHand(CardId.Zefraath) && !activate_p_Zefraath))) + { + extra_ids.Clear(); + } + } + if (!DD_summon_check) extra_ids.Remove(CardId.HeavymetalfoesElectrumite); + return extra_ids; + } + private bool DDLamiaSummon() + { + if (!IsCanSynchroSummon(Card.Level)) return false; + if (Bot.HasInExtra(CardId.Linkuriboh) || (Bot.HasInExtra(CardId.CrystronHalqifibrax) && + Func.GetZoneCards(Bot, CardLocation.MonsterZone, true).Count > 0)) + { + summoned = true; + return BeforeResult(ExecutorType.Summon); + } + return false; + } + private bool XyzModeCheck(bool flag1 = false) + { + return !link_summoned && !(!Bot.HasInExtra(CardId.Raidraptor_ArsenalFalcon) & flag1) && HasInDeck(CardId.Blackwing_ZephyrostheElite) && Bot.HasInExtra(CardId.Raidraptor_ForceStrix) && Bot.HasInExtra(CardId.Raidraptor_WiseStrix) + && Bot.HasInExtra(CardId.TruKingofAllCalamities) && (HasInDeck(CardId.Raider_Wing) || Bot.HasInHand(CardId.Raider_Wing)) + && (HasInDeck(CardId.Raidraptor_SingingLanius) || Bot.HasInHand(CardId.Raidraptor_SingingLanius)) + && (HasInDeck(CardId.Rank_Up_MagicSoulShaveForce) || Bot.HasInHand(CardId.Rank_Up_MagicSoulShaveForce)); + } + private bool Raidraptor_ForceStrixEffect() + { + AI.SelectCard(CardId.Raider_Wing); + AI.SelectNextCard(CardId.Raidraptor_SingingLanius); + return BeforeResult(ExecutorType.Activate); + } + private bool Raidraptor_ForceStrixSummon() + { + return xyz_mode && BeforeResult(ExecutorType.Summon); + } + + private bool Blackwing_ZephyrostheEliteEffect_2() + { + if (!xyz_mode && Bot.GetMonstersInMainZone().Count > 4) return false; + List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Onfield, true), card => { + return !IsNoLinkCards(card) && !card.IsExtraCard() && !(card.Location == CardLocation.SpellZone + && Func.IsCode(card, CardId.SaryujaSkullDread, CardId.MechaPhantomBeastAuroradon, CardId.HeavymetalfoesElectrumite, CardId.CrystronHalqifibrax, CardId.Raidraptor_WiseStrix, + CardId.Linkuriboh)); + }); + if (cards.Count <= 0 || (cards.Count < 2 && func.CardsCheckCount(cards, func.HasLevel, 4) == cards.Count)) + { + Blackwing_ZephyrostheElite_activate = true; + return false; + } + cards.Sort((cardA, cardB) => + { + if (cardA.Location != CardLocation.MonsterZone && cardB.Location == CardLocation.MonsterZone) return -1; + if (cardA.Location == CardLocation.MonsterZone && cardB.Location != CardLocation.MonsterZone) return 1; + if (cardA.Location == CardLocation.SpellZone && cardB.Location == CardLocation.SpellZone) + { + if (cardA.IsCode(CardId.OracleofZefra) && !cardB.IsCode(CardId.OracleofZefra)) return -1; + if (!cardA.IsCode(CardId.OracleofZefra) && cardB.IsCode(CardId.OracleofZefra)) return 1; + return 0; + } + if (xyz_mode) + { + if (cardA.Level == 4 && cardB.Level != 4) return 1; + if (cardA.Level != 4 && cardB.Level == 4) return -1; + return CardContainer.CompareCardAttack(cardA, cardB); + } + else + { + return CardContainer.CompareCardAttack(cardA, cardB); + } + }); + Blackwing_ZephyrostheElite_activate = false; + AI.SelectCard(cards); + return BeforeResult(ExecutorType.Activate); + } + public override void OnChaining(int player, ClientCard card) + { + if (card == null) return; + if (player == 1 && Func.IsCode(card, 14558127, 59438930, 94145021, 38814750, 73642296, 97268402)) + enemy_activate = true; + base.OnChaining(player, card); + } + private bool BeforeResult(ExecutorType type) + { + if (type == ExecutorType.Activate) + { + ResetFlag(); + ++activate_count; + } + if (type == ExecutorType.Summon) + { + ++summon_count; + } + return true; + } + private bool GoToEndPhase() + { + if (Duel.Player == 0 && Duel.Turn == 1 && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), IsNoLinkCards) <= 0 + && activate_count + summon_count < 5 && !enemy_activate) + { + + AI.SendCustomChat((int)CustomMessage.Angry); + return true; + } + return false; + + } + private bool DefaultPActivate() + { + if (PendulumActivate() && Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing)) + { + return Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.SpellZone, + true), card => { return Func.IsCode(Card, CardId.Zefraxi_TreasureoftheYangZing, CardId.SecretoftheYangZing); }) <= 0 && BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool Blackwing_ZephyrostheEliteEffect() + { + if (!xyz_mode) return false; + return Blackwing_ZephyrostheEliteEffect_2(); + } + private bool Raidraptor_WiseStrixSummon() + { + if (!xyz_mode) return false; + AI.SelectMaterials(CardId.Raidraptor_ArsenalFalcon, CardId.Blackwing_ZephyrostheElite); + return BeforeResult(ExecutorType.Summon); + } + private bool Raidraptor_WiseStrixEffect() + { + if (ActivateDescription == -1) + { + int count = 0; + if (HasInDeck(CardId.Raidraptor_SingingLanius)) ++count; + if (HasInDeck(CardId.Blackwing_ZephyrostheElite)) ++count; + if (HasInDeck(CardId.Raider_Wing)) ++count; + if (count <= 1) return false; + AI.SelectCard(CardId.Raider_Wing); + return BeforeResult(ExecutorType.Activate); + } + return BeforeResult(ExecutorType.Activate); + } + private bool Raidraptor_ArsenalFalconEffect() + { + if (Card.Location == CardLocation.MonsterZone) + { + AI.SelectCard(CardId.SupremeKingGateZero); + AI.SelectNextCard(new int[] { CardId.Blackwing_ZephyrostheElite, CardId.Raider_Wing, CardId.Raidraptor_SingingLanius }); + return BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool Raidraptor_ArsenalFalconSummon() + { + if (!XyzModeCheck(true)) return false; + var materials_lists = Util.GetXyzMaterials(Bot.MonsterZone, 7, 2, false, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + xyz_mode = true; + return BeforeResult(ExecutorType.Summon); + } + private bool Odd_EyesMeteorburstDragonCheck() + { + if (!XyzModeCheck()) return false; + var materials_lists = Util.GetXyzMaterials(Func.MergeList(new List() { Card }, + Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.PendulumZone)), 7, 2, false, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); }); + if (materials_lists.Count <= 0) return false; + List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), SecretoftheYangZingCheck); + var materials_sy_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_sy_lists.Count <= 0) return false; + Odd_EyesMeteorburstDragon_materials.Clear(); + foreach (var materials in materials_sy_lists) + { + if (func.CardsCheckCount(materials, func.IsCode, CardId.SupremeKingGateZero) > 0) + { + Odd_EyesMeteorburstDragon_materials.AddRange(materials); + return true; + } + } + Odd_EyesMeteorburstDragon_materials.AddRange(materials_sy_lists[0]); + return true; + } + private bool Odd_EyesMeteorburstDragonSummon() + { + if (!Odd_EyesMeteorburstDragonCheck()) return false; + AI.SelectMaterials(Odd_EyesMeteorburstDragon_materials); + return BeforeResult(ExecutorType.Summon); + } + private bool Odd_EyesMeteorburstDragonEffect() + { + AI.SelectCard(CardId.SupremeKingGateZero); + return BeforeResult(ExecutorType.Activate); + } + private bool DDSavantKeplerSummon() + { + if (HasInDeck(CardId.DarkContractwiththGate)) + { + summoned = true; + return BeforeResult(ExecutorType.Summon); + } + return false; + } + // private void DebugCards(string msg, IList cards) + // { + //#if DEBUG + // Logger.DebugWriteLine(cards.Count + msg); + // foreach (var card in cards) + // { + // if (card == null) continue; + // NamedCard namedCard = NamedCard.Get(card.Id); + // if (namedCard == null) continue; + // Logger.DebugWriteLine(msg + namedCard.Name); + // } + //#endif + // } + private bool ServantofEndymionEffect_2() + { + if (Card.Location == CardLocation.SpellZone) return BeforeResult(ExecutorType.Activate); + return false; + } + private bool IsSpsummonPMonster(ClientCard card) + { + return IsZefraScaleAbove(card) || IsZefraScaleBelow(card) || card.Id == CardId.SupremeKingGateZero || card.Id == CardId.ServantofEndymion; + } + private int GetSpellActivateCount() + { + int count = 0; + if (!activate_DragonShrine && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.DragonShrine) && + (HasInDeck(CardId.FlameBeastoftheNekroz) || HasInDeck(CardId.DestrudotheLostDragon_Frisson) || HasInDeck(CardId.SupremeKingDragonDarkwurm))) ++count; + if (!activate_SpellPowerMastery && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.SpellPowerMastery) + && (HasInDeck(CardId.TheMightyMasterofMagic) || HasInDeck(CardId.ServantofEndymion))) ++count; + if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.DarkContractwiththGate)) ++count; + if (!activate_ZefraProvidence && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.ZefraProvidence)) + { + if (func.CardsCheckCount(Bot.Hand, func.IsCode, CardId.OracleofZefra) <= 0 && !activate_OracleofZefra + && HasInDeck(CardId.OracleofZefra)) + { + count += 2; + } + else + { + ++count; + } + } + if (!activate_OracleofZefra && func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.OracleofZefra)) ++count; + if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.Terraforming) && HasInDeck(CardId.OracleofZefra)) ++count; + if (func.CardsCheckAny(Bot.Hand, func.IsCode, CardId.FoolishBurial)) ++count; + if (func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Pendulum) > 1 && Bot.SpellZone[0] == null && + Bot.SpellZone[4] == null) ++count; + if (!summoned && Bot.HasInHand(CardId.DDSavantKepler) && HasInDeck(CardId.DarkContractwiththGate)) ++count; + return count; + } + private bool ServantofEndymionEffect_3() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool ZefraDivineStrikeEffect() + { + if (Duel.LastChainPlayer == 0) return false; + AI.SelectCard(CardId.RitualBeastTamerZeframpilica, CardId.SatellarknightZefrathuban, CardId.StellarknightZefraxciton, CardId.FlameBeastoftheNekroz, CardId.ShaddollZefracore, + CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing); + return BeforeResult(ExecutorType.Activate); + } + private bool NinePillarsofYangZingEffect() + { + if (Duel.LastChainPlayer == 0) return false; + List cards = func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing }, Bot.MonsterZone); + cards.AddRange(func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing }, Bot.SpellZone)); + AI.SelectCard(cards); + should_destory = true; + return BeforeResult(ExecutorType.Activate); + } + private bool IsActivateBlackwing_ZephyrostheElite() + { + return (Blackwing_ZephyrostheElite_activate || HeavymetalfoesElectrumite_activate) && Func.GetZoneCards(Bot, CardLocation.PendulumZone, true).Count <= 0; + } + private bool PendulumDefaultActivate() + { + return IsActivateBlackwing_ZephyrostheElite() || (checkPActivate() && IsActivateScale()); + } + private bool ServantofEndymionEffect() + { + if (PendulumActivate()) + { + if (IsActivateBlackwing_ZephyrostheElite()) return BeforeResult(ExecutorType.Activate); + if ((!HasInDeck(CardId.TheMightyMasterofMagic) && !HasInDeck(CardId.MythicalBeastJackalKing) || GetSpellActivateCount() < 2)) return false; + return BeforeResult(ExecutorType.Activate); + } + else if (Card.Location == CardLocation.SpellZone) + { + if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) + { + return func.CardsCheckAny(Bot.Hand, IsSpsummonPMonster) && BeforeResult(ExecutorType.Activate); + } + return BeforeResult(ExecutorType.Activate); + } + else if (Card.Location == CardLocation.MonsterZone) return BeforeResult(ExecutorType.Activate); + else return false; + } + private bool IsZefraScaleAbove(ClientCard card) + { + return Func.IsCode(card, CardId.StellarknightZefraxciton, CardId.SecretoftheYangZing, CardId.FlameBeastoftheNekroz, CardId.ShaddollZefracore); + } + private bool IsZefraScaleBelow(ClientCard card) + { + return Func.IsCode(card, CardId.RitualBeastTamerZeframpilica, CardId.Zefraxi_TreasureoftheYangZing, CardId.SatellarknightZefrathuban); + } + private bool TerraformingEffect() + { + return Bot.HasInHand(CardId.OracleofZefra) && BeforeResult(ExecutorType.Activate); + } + private bool DDSavantKeplerEffect() + { + if (PendulumActivate()) return false; + return BeforeResult(ExecutorType.Activate); + } + private bool FoolishBurialEffect() + { + return BeforeResult(ExecutorType.Activate); + } + private List GetSynchroMaterials() + { + List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), + card => { return !IsNoLinkCards(card) && !card.HasType(CardType.Link | CardType.Xyz); }); + return materials; + } + private bool DestrudotheLostDragon_FrissonEffect() + { + if (Bot.HasInExtra(CardId.CrystronHalqifibrax)) return BeforeResult(ExecutorType.Activate); + if (!Bot.HasInExtra(CardId.F_A_DawnDragster) && !Bot.HasInExtra(CardId.Odd_EyesMeteorburstDragon)) return false; + List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return SecretoftheYangZingCheck(card) && !IsNoLinkCards(card) && !card.HasType(CardType.Tuner) && card.Level > 0; }); + if (pre_materials.Count <= 0) return false; + List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => + { + return !IsNoLinkCards(card) && card.Level > 0 && !card.HasType(CardType.Tuner); + }); + if (cards.Count <= 0) return false; + AI.SelectCard(cards); + return BeforeResult(ExecutorType.Activate); + } + private bool IsCanSynchroSummon(int level) + { + return func.CardsCheckAny(GetSynchroMaterials(), card => { + return (card.Level + level == 8 + && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.BorreloadSavageDragon, CardId.PSY_FramelordOmega); })) + || (card.Level + level == 7 && SecretoftheYangZingCheck(card) && func.CardsCheckAny(Bot.ExtraDeck, synchro_card => { return Func.IsCode(synchro_card, CardId.Odd_EyesMeteorburstDragon, CardId.F_A_DawnDragster); })) + || (card.Level + level == 5 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)) + || (card.Level + level == 4 && Bot.HasInExtra(CardId.HeraldoftheArcLight)); + }); + } + private bool DDLamiaEffect() + { + if (Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon) && Bot.GetMonstersInMainZone().Count >= 3) return false; + if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && !IsCanSynchroSummon(Card.Level)) return false; + AI.SelectCard(CardId.DarkContractwiththGate, CardId.DDSavantKepler); + activate_DDLamia = true; + return true; + } + private bool DragonShrineEffect() + { + return BeforeResult(ExecutorType.Activate); + } + private bool ZefraathEffect() + { + if (PendulumActivate()) return !activate_p_Zefraath || IsActivateBlackwing_ZephyrostheElite(); + if (Card.Location == CardLocation.SpellZone) + { + activate_p_Zefraath = true; + return BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool RitualBeastTamerZeframpilicaEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + return BeforeResult(ExecutorType.Activate); + } + private bool BorreloadSavageDragonSummon_2() + { + if (xyz_mode) return BorreloadSavageDragonSummon(); + return false; + } + private bool BorreloadSavageDragonSummon() + { + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, Card.Level, 1, 1, false, true, null, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic) && !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_lists.Count <= 0) return false; + foreach (var materials in materials_lists) + { + if (func.CardsCheckAny(materials, func.IsCode, CardId.MechaPhantomBeastToken)) + { + AI.SelectMaterials(materials); + return BeforeResult(ExecutorType.Summon); + } + } + AI.SelectMaterials(materials_lists[0]); + return BeforeResult(ExecutorType.Summon); + } + private bool BorreloadSavageDragonEffect() + { + /* + * effect1 bug: Unable to read card info in the func "OnselectCard" + * Unable to run in the "ActivateDescription == -1" + */ + AI.SelectCard(new[] + { + CardId.SaryujaSkullDread, + CardId.MechaPhantomBeastAuroradon, + CardId.HeavymetalfoesElectrumite, + CardId.CrystronHalqifibrax, + CardId.Raidraptor_WiseStrix + }); + return BeforeResult(ExecutorType.Activate); + } + private bool TheMightyMasterofMagicEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + else if (Card.Location == CardLocation.MonsterZone) + { + if (Duel.LastChainPlayer == 0) return false; + AI.SelectCard(CardId.ServantofEndymion, CardId.TheMightyMasterofMagic); + return BeforeResult(ExecutorType.Activate); + } + else + { + return BeforeResult(ExecutorType.Activate); + } + } + private bool checkPActivate() + { + if (p_summoned) return false; + if (func.HasInZone(Bot, CardLocation.PendulumZone, CardId.Zefraath, true)) return true; + if (Bot.HasInHand(CardId.Zefraath) && (Bot.SpellZone[0] != null || Bot.SpellZone[4] != null)) return false; + if (Bot.SpellZone[0] == null && Bot.SpellZone[4] == null) + { + if (!Bot.HasInHand(CardId.Zefraath) && !func.CardsCheckAny(Bot.Hand, card => { + return IsSpsummonPMonster(card) && +(Card.LScale >= 5 ? card.LScale < 5 : card.LScale > 5) && func.GetPSpSummonMonster(Bot, card, Card)?.Count > 0; + })) return false; + } + else + { + if (func.GetPSpSummonMonster(Bot, Bot.SpellZone[0], Card)?.Count <= 0 && func.GetPSpSummonMonster(Bot, Bot.SpellZone[4], Card)?.Count <= 0) return false; + } + + return true; + } + private bool SecretoftheYangZingEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + activate_SecretoftheYangZing = true; + return BeforeResult(ExecutorType.Activate); + } + private bool SatellarknightZefrathubanEffect() + { + + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool BorreloadSavageDragonEffect_2() + { + if (Duel.LastChainPlayer == 1) + { + ClientCard card = Util.GetLastChainCard(); + return card != null && !card.HasType(CardType.Continuous | CardType.Field) && card.HasType(CardType.Spell | CardType.Trap) && BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool Zefraxi_TreasureoftheYangZingEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + return BeforeResult(ExecutorType.Activate); + } + private bool OracleofZefraEffect() + { + activate_OracleofZefra = true; + return BeforeResult(ExecutorType.Activate); + + } + private bool FlameBeastoftheNekrozEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + else + { + return BeforeResult(ExecutorType.Activate); + } + + } + private bool AstrographSorcererEffect() + { + if (PendulumActivate()) return false; + return BeforeResult(ExecutorType.Activate); + } + private bool StellarknightZefraxcitonEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + else + { + return BeforeResult(ExecutorType.Activate); + } + } + private bool IsNoLinkCards(ClientCard card) + { + if (card == null) return false; + return ((card.IsCode(CardId.MythicalBeastJackalKing) || card.IsCode(CardId.TheMightyMasterofMagic)) && !card.IsDisabled()) + || card.IsCode(CardId.BorreloadSavageDragon) || card.IsCode(CardId.PSY_FramelordOmega) || card.IsCode(CardId.F_A_DawnDragster) + || card.IsCode(CardId.TruKingofAllCalamities) || card.IsCode(CardId.HeraldoftheArcLight) || card.LinkCount >= 3; + } + private bool LinkuribohSummon() + { + List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasLevel, 1); + if (func.CardsCheckCount(materials, Func.NegateFunc(func.HasType), CardType.Tuner) <= 0 && + func.CardsCheckCount(materials, func.HasType, CardType.Tuner) <= 1) return false; + materials.Sort((cardA, cardB) => + { + if (cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner)) return 1; + if (!cardA.HasType(CardType.Tuner) && cardB.HasType(CardType.Tuner)) return -1; + return 0; + }); + AI.SelectMaterials(materials); + return true; + } + private bool SpellSet() + { + if (Card.HasType(CardType.Trap)) + { + AI.SelectPlace(Zones.z1 | Zones.z2 | Zones.z3 | Zones.z4 | Zones.z0); + return true; + } + return false; + } + private bool SpellSet_2() + { + if (Card.HasType(CardType.QuickPlay)) + { + AI.SelectPlace(Zones.z1 | Zones.z2 | Zones.z3 | Zones.z4 | Zones.z0); + return true; + } + return false; + } + private bool ShaddollZefracoreEffect() + { + if (PendulumActivate()) + { + return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + } + else + { + return BeforeResult(ExecutorType.Activate); + } + } + private bool PSY_FramelordOmegaEffect() + { + if (Card.Location == CardLocation.MonsterZone) + { + if (Duel.Player == 0) return BeforeResult(ExecutorType.Activate); + else + { + if (Bot.Banished.Count <= 0) return false; + AI.SelectCard(func.CardsIdToClientCards(new List { CardId.JetSynchron, CardId.DDLamia }, Bot.Banished)); + return BeforeResult(ExecutorType.Activate); + } + } + else + { + if (Bot.Graveyard.Count <= 0) return false; + AI.SelectCard(func.CardsIdToClientCards(new List { CardId.Zefraath, CardId.CrystronHalqifibrax, CardId.Denglong_FirstoftheYangZing, CardId.BorreloadSavageDragon, CardId.DDLamia }, Bot.Graveyard)); + return BeforeResult(ExecutorType.Activate); + } + } + private bool Psummon() + { + //if (ActivateDescription == P_SPSUMMON_DESC) + if (Card.Location == CardLocation.SpellZone) + { + p_summoning = true; + p_summoned = true; + return true; + } + return false; + } + private bool IsExtraZoneCard(ClientCard card) + { + if (card == null) return false; + ClientCard ex_card = Bot.MonsterZone[5]; + if (ex_card == card) return true; + ex_card = Bot.MonsterZone[6]; + if (ex_card == card) return true; + return false; + } + private bool HeavymetalfoesElectrumiteSummon() + { + if (Odd_EyesMeteorburstDragonCheck()) return false; + List materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum); + if (materials.Count > 0) + { + materials.Sort((cardA, cardB) => + { + if ((cardA.Level == 3 || cardA.HasType(CardType.Tuner)) && cardB.Level != 3 && !cardB.HasType(CardType.Tuner)) return -1; + if (cardA.Level != 3 && !cardA.HasType(CardType.Tuner) && (cardB.Level == 3 || cardB.HasType(CardType.Tuner))) return 1; + return CardContainer.CompareCardLevel(cardA, cardB); + }); + materials.Reverse(); + List result = new List(); + foreach (var material in materials) + { + if (IsExtraZoneCard(material)) result.Insert(0, material); + else if (IsNoLinkCards(material) || (material.HasType(CardType.Tuner) && Bot.HasInExtra(CardId.CrystronHalqifibrax) + && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Tuner) <= 0)) continue; + else result.Add(material); + } + if (result.Count < 2) return false; + AI.SelectMaterials(result); + return BeforeResult(ExecutorType.Summon); + } + return false; + } + private bool SecretoftheYangZingCheck(ClientCard card) + { + if (card.IsCode(CardId.SecretoftheYangZing) && Bot.HasInHandOrInSpellZone(CardId.NinePillarsofYangZing)) + { + return func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.PendulumZone | CardLocation.MonsterZone, true), p_card => { + return p_card.HasSetcode(0xc4) && p_card.HasType(CardType.Pendulum); + }) <= 0; + } + return true; + } + private bool F_A_DawnDragsterSummon() + { + List pre_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), SecretoftheYangZingCheck); + var materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing) && !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_lists.Count <= 0) return false; + foreach (var materials in materials_lists) + { + if (func.CardsCheckCount(materials, card => + { + return card.HasType(CardType.Tuner) && card.HasRace(CardRace.Machine); + }) <= 0) + { + AI.SelectMaterials(materials); + return BeforeResult(ExecutorType.Summon); + } + } + AI.SelectMaterials(materials_lists[0]); + return BeforeResult(ExecutorType.Summon); + } + private bool CrystronHalqifibraxEffect() + { + return BeforeResult(ExecutorType.Activate); + } + private bool MechaPhantomBeastAuroradonSummon() + { + if (Bot.GetMonstersInMainZone().Count >= 4 || (!HasInDeck(CardId.MechaPhantomBeastO_Lion) && !IsCanSPSummonTunerLevel1() + && !func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.Grave, true), func.IsCode, CardId.Deskbot001))) return false; + if (XyzModeCheck()) + { + List pre_materials = new List(); + List key_materials = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Grave), card => { + return (card.IsCode(CardId.DDLamia) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), scard => + { return Func.HasSetCode(scard, 0xaf, 0xae) && scard.Id != CardId.DDLamia; }) > 0); + }); + List key_materials_2 = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Grave), card => { return card.IsCode(CardId.JetSynchron) && !activate_JetSynchron; }); + pre_materials.AddRange(key_materials); + pre_materials.AddRange(key_materials_2); + if (!summoned) pre_materials.AddRange(func.CardsCheckWhere(Bot.Hand, card => { return !card.IsCode(CardId.DestrudotheLostDragon_Frisson) && card.Level < 5; })); + pre_materials.AddRange(Bot.MonsterZone); + var synchro_materials_lists = Util.GetSynchroMaterials(pre_materials, 7, 1, 1, false, true, null, card => { return !card.IsCode(CardId.MythicalBeastJackalKing); }); + var xyz_materials_lists = Util.GetXyzMaterials(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.PendulumZone), 7, 1, false, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); }); + var xyz_materials_lists_2 = Util.GetXyzMaterials(Func.GetZoneCards(Bot, CardLocation.MonsterZone), 7, 2, false, + card => { return !card.IsCode(CardId.F_A_DawnDragster) && !card.IsCode(CardId.TheMightyMasterofMagic); }); + if ((synchro_materials_lists.Count > 0 && xyz_materials_lists.Count > 0) || xyz_materials_lists_2.Count > 0) return false; + } + List m = new List(); + int link_count = 0; + List cards = Bot.GetMonsters(); + cards.Sort(CardContainer.CompareCardLink); + cards.Reverse(); + foreach (var card in Bot.GetMonsters()) + { + if (card == null) continue; + if (card.IsFacedown() || !card.HasRace(CardRace.Machine) || IsNoLinkCards(card)) continue; + m.Add(card); + link_count += (card.HasType(CardType.Link)) ? card.LinkCount : 1; + if (link_count >= 3) break; + } + if (link_count < 3) return false; + AI.SelectMaterials(m); + return true; + } + private bool SaryujaSkullDreadEffect() + { + if (ActivateDescription == Util.GetStringId(CardId.SaryujaSkullDread, 2)) + { + AI.SelectCard(GetSendToDeckIds()); + return BeforeResult(ExecutorType.Activate); + } + return BeforeResult(ExecutorType.Activate); + } + private bool SaryujaSkullDreadSummon() + { + if (Bot.GetMonstersInMainZone().Count < 4 || (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && !xyz_mode)) return false; + List materials = new List(); + int link_count = 0; + int materials_count = 0; + int tuner_count = func.CardsCheckCount(Bot.MonsterZone, func.HasType, CardType.Tuner); + List temp_materials = Bot.GetMonsters(); + temp_materials.Sort((cardA, cardB) => + { + if ((cardA.HasType(CardType.Tuner) && cardB.HasType(CardType.Tuner)) + || (!cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner))) + { + return CardContainer.CompareCardLevel(cardA, cardB); + } + else if (cardA.HasType(CardType.Tuner) && !cardB.HasType(CardType.Tuner)) return 1; + return -1; + }); + foreach (var material in temp_materials) + { + ++materials_count; + if (IsExtraZoneCard(material)) materials.Insert(0, material); + else if (IsNoLinkCards(material)) { --materials_count; continue; } + else materials.Add(material); + link_count += material.HasType(CardType.Link) ? material.LinkCount : 1; + if (link_count >= 4) + { + if (materials_count == 3 && Bot.Deck.Count > 4 && ((func.CardsCheckCount(Bot.Hand, func.HasType, CardType.Tuner) > 0 + || (Bot.HasInMonstersZone(CardId.DDLamia, false, false, true) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards + (Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) + > 0) || (Bot.HasInMonstersZone(CardId.JetSynchron, false, false, true) && !activate_JetSynchron)) || xyz_mode)) + { + --link_count; + continue; + } + break; + } + } + if (materials.Count < 3) return false; + AI.SelectMaterials(materials); + return BeforeResult(ExecutorType.Summon); + } + private bool CrystronHalqifibraxSummon() + { + List materials = new List(); + if (Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon)) + { + materials.Add(Bot.MonsterZone[5]); + materials.Add(Bot.MonsterZone[6]); + } + List mainMonsters = Bot.GetMonstersInMainZone(); + mainMonsters.Sort(CardContainer.CompareCardAttack); + materials.AddRange(mainMonsters); + AI.SelectMaterials(materials); + if (materials.Distinct().Count() <= 3) + { + AI.SendCustomChat((int)CustomMessage.Surprise); + } + return true; + } + private bool PendulumActivate() + { + return Func.PendulumActivate((int)ActivateDescription, Card); + } + private bool IsActivateScale() + { + return func.IsActivateScale(Bot, Card); + } + private bool SpellActivate() + { + return Func.SpellActivate(Card); + } + private bool SupremeKingGateZeroEffect() + { + if (PendulumActivate()) return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + return false; + } + private bool MythicalBeastJackalKingEffect() + { + if (PendulumActivate()) return PendulumDefaultActivate() && BeforeResult(ExecutorType.Activate); + return BeforeResult(ExecutorType.Activate); + } + private bool Denglong_FirstoftheYangZingSummon_2() + { + if (xyz_mode) return Denglong_FirstoftheYangZingSummon(); + return false; + } + private bool Denglong_FirstoftheYangZingSummon() + { + var materials_lists = Util.GetSynchroMaterials(Bot.MonsterZone, 5, 1, 1, false, true, null, + card => { return !card.IsCode(CardId.HeraldoftheArcLight); }); + if (materials_lists.Count <= 0) return false; + AI.SelectMaterials(materials_lists[0]); + return BeforeResult(ExecutorType.Summon); + } + private bool Denglong_FirstoftheYangZingEffect() + { + if (ActivateDescription == Util.GetStringId(CardId.Denglong_FirstoftheYangZing, 1)) return false; + if (Card.Location == CardLocation.MonsterZone) + { + AI.SelectCard(CardId.NinePillarsofYangZing, CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing); + } + else + { + AI.SelectCard(CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing, CardId.LightoftheYangZing); + } + return true; + } + private bool DarkContractwiththGateEffect() + { + if (SpellActivate()) + { + return (HasInDeck(CardId.DDLamia) || func.HasInZone(Bot, CardLocation.PendulumZone, CardId.ServantofEndymion, true, true)) && BeforeResult(ExecutorType.Activate); + } + return BeforeResult(ExecutorType.Activate); + } + private int DisabledSort(ClientCard cardA, ClientCard cardB) + { + bool RitualBeastTamerZeframpilica_flag = !summoned && Bot.HasInExtra(CardId.HeraldoftheArcLight) && IsCanSPSummonTunerLevel1(); + if (((cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardA.HasType(CardType.Trap) || cardA.HasType(CardType.Tuner)) + && !cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardB.HasType(CardType.Trap) && !Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardB.HasType(CardType.Tuner)) return 1; + else if (!cardA.IsCode(CardId.RitualBeastTamerZeframpilica) && !cardA.HasType(CardType.Trap) && !Func.IsCode(cardA, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) && !cardA.HasType(CardType.Tuner) + && ((cardB.IsCode(CardId.RitualBeastTamerZeframpilica) && RitualBeastTamerZeframpilica_flag) || Func.IsCode(cardB, CardId.MaxxC, CardId.Zefraath, CardId.MythicalBeastJackalKing, CardId.TheMightyMasterofMagic) || cardB.HasType(CardType.Trap) || cardB.HasType(CardType.Tuner))) return -1; + return 0; + } + private List GetDisabledIds() + { + List ids = new List(); + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.Blackwing_ZephyrostheElite); + ids.Add(CardId.Raider_Wing); + ids.Add(CardId.Raidraptor_SingingLanius); + ids.Add(CardId.PSY_FrameDriver); + if (!Bot.HasInGraveyard(CardId.Raidraptor_ArsenalFalcon) || !Bot.HasInExtra(CardId.TruKingofAllCalamities)) ids.Add(CardId.Rank_Up_MagicSoulShaveForce); + if (Bot.HasInBanished(CardId.PSY_FrameDriver)) ids.Add(CardId.PSY_FramegearGamma); + ids.Add(CardId.LightoftheYangZing); + ids.Add(CardId.DDLamia); + ids.AddRange(Func.GetCardsRepeatCardsId(Bot.Hand)); + List hands = Func.GetZoneCards(Bot, CardLocation.Hand); + hands.Sort(DisabledSort); + List hand_ids = Func.ClientCardsToCardsId(hands, true); + ids.AddRange(hand_ids); + return ids; + } + private List GetSendToDeckIds() + { + List ids = new List(); + List repeat_ids = Func.GetCardsRepeatCardsId(Func.GetZoneCards(Bot, CardLocation.Hand)); + ids.Add(CardId.MechaPhantomBeastO_Lion); + ids.AddRange(repeat_ids); + ids.Add(CardId.Raidraptor_SingingLanius); + ids.Add(CardId.Raider_Wing); + ids.Add(CardId.Blackwing_ZephyrostheElite); + ids.Add(CardId.PSY_FrameDriver); + ids.Add(CardId.LightoftheYangZing); + ids.Add(CardId.Rank_Up_MagicSoulShaveForce); + if (activate_ZefraProvidence) ids.Add(CardId.ZefraProvidence); + if (activate_OracleofZefra) ids.Add(CardId.OracleofZefra); + if (activate_DragonShrine) ids.Add(CardId.DragonShrine); + if (activate_SpellPowerMastery) ids.Add(CardId.SpellPowerMastery); + List hands = Func.GetZoneCards(Bot, CardLocation.Hand); + hands.Sort(DisabledSort); + List hand_ids = Func.ClientCardsToCardsId(hands, true); + ids.AddRange(hand_ids); + return ids; + } + private bool TruKingofAllCalamitiesEffect() + { + if (Duel.Player == 1) + { + AI.SelectAttributes(new CardAttribute[] { CardAttribute.Divine }); + return BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool JetSynchronEffect() + { + + if (Card.Location == CardLocation.Grave) + { + if (!IsCanSynchroSummon(Card.Level)) return false; + if (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Extra), card => { return card.HasType(CardType.Synchro) || Func.IsCode(card, CardId.CrystronHalqifibrax, CardId.Linkuriboh); })) + { + activate_JetSynchron = true; + List dcards = func.CardsIdToClientCards(GetDisabledIds(), Bot.Hand); + if (!Bot.HasInExtra(CardId.CrystronHalqifibrax) && dcards.Count <= 0) return false; + AI.SelectCard(dcards); + return BeforeResult(ExecutorType.Activate); + } + } + return false; + } + private bool MechaPhantomBeastAuroradonEffect() + { + if (ActivateDescription == -1) { link_summoned = true; return true; } + else + { + if (!HasInDeck(CardId.MechaPhantomBeastO_Lion) + && Func.GetZoneCards(Enemy, CardLocation.Onfield).Count <= 0) return false; + List tRelease = new List(); + List nRelease = new List(); + foreach (var card in Bot.GetMonsters()) + { + if (card == null || IsNoLinkCards(card)) continue; + if (card.Id == CardId.MechaPhantomBeastToken) tRelease.Add(card); else nRelease.Add(card); + } + int count = tRelease.Count() + nRelease.Count(); + opt_0 = false; + opt_1 = false; + opt_2 = false; + if (count >= 3 && func.CardsCheckCount(Bot.Graveyard, func.HasType, CardType.Trap) > 0) opt_2 = true; + if (count >= 2 && CheckRemainInDeck(CardId.MechaPhantomBeastO_Lion) > 0) opt_1 = true; + if (count >= 1 && Func.GetZoneCards(Enemy, CardLocation.Onfield).Count > 0) opt_0 = true; + if (!opt_0 && !opt_1 && !opt_2) return false; + return true; + } + } + private bool SupremeKingDragonDarkwurmEffect() + { + if (Card.Location == CardLocation.Grave) + { + activate_SupremeKingDragonDarkwurm_1 = true; + return BeforeResult(ExecutorType.Activate); + } + if (Card.Location == CardLocation.MonsterZone) + { + activate_SupremeKingDragonDarkwurm_2 = true; + return BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool SupremeKingDragonDarkwurmSummon() + { + if ((!activate_p_Zefraath && Bot.HasInHand(CardId.Zefraath) && !activate_SupremeKingDragonDarkwurm_1 && HasInDeck(CardId.SupremeKingGateZero) && func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner)) + || (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand), card => { return card.LinkCount > 5; }) && + !Bot.HasInHand(CardId.SupremeKingGateZero) && !activate_SupremeKingDragonDarkwurm_2)) + { + summoned = true; + return BeforeResult(ExecutorType.Summon); + } + return false; + } + private bool DefaultSummon_2() + { + if (Card.Location == CardLocation.Hand && Card.Level <= 4 + && Bot.HasInExtra(CardId.CrystronHalqifibrax) && (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), card => { return Card.HasType(CardType.Tuner) ? true : card.HasType(CardType.Tuner); }))) + { + summoned = true; + return BeforeResult(ExecutorType.Summon); + } + return false; + } + private bool IsCanSPSummonTunerLevel1() + { + return func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone | CardLocation.Grave, true), card => { + return (card.IsCode(CardId.DDLamia) && !activate_DDLamia && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), scard => { return Func.HasSetCode(scard, 0xaf, 0xae) && scard.Id != CardId.DDLamia; }) + > 0) || (card.IsCode(CardId.JetSynchron) && !activate_JetSynchron) && Bot.GetMonstersInMainZone().Count <= 3; + }); + } + private bool DefaultSummon() + { + if (Card.Level > 4) return false; + if ((!link_summoned && Bot.HasInExtra(CardId.HeavymetalfoesElectrumite) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum) > 0 + && Card.HasType(CardType.Pendulum)) + || (IsCanSPSummonTunerLevel1() && ((Card.Level == 3 && Bot.HasInExtra(CardId.HeraldoftheArcLight)) || ( + Card.Level == 4 && Bot.HasInExtra(CardId.Denglong_FirstoftheYangZing)))) || + (Card.Id == CardId.SupremeKingDragonDarkwurm && !activate_SupremeKingDragonDarkwurm_2) + || (Bot.HasInExtra(CardId.CrystronHalqifibrax) && Bot.HasInHandOrInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)) + { + summoned = true; + return BeforeResult(ExecutorType.Summon); + } + return false; + } + private bool OneforOneEffect() + { + AI.SelectCard(GetDisabledIds()); + AI.SelectNextCard(CardId.JetSynchron, CardId.LightoftheYangZing, CardId.DDLamia); + return BeforeResult(ExecutorType.Activate); + } + private void HeavymetalfoesElectrumiteAddIds(List ids) + { + if (!summoned && HasInDeck(CardId.DarkContractwiththGate) && HasInDeck(CardId.DDLamia)) + { + if (!func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Tuner)) + { + ids.Add(CardId.DDSavantKepler); + } + else + { + ids.Add(CardId.AstrographSorcerer); + ids.Add(CardId.DDSavantKepler); + } + } + ids.Add(CardId.AstrographSorcerer); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.DDSavantKepler); + } + private bool LinkuribohEffect() + { + if (Card.Location == CardLocation.Grave) + { + if (Duel.Player != 0) return BeforeResult(ExecutorType.Activate); + return false; + } + return BeforeResult(ExecutorType.Activate); + } + private bool Raider_WingEffect() + { + if (!Bot.HasInMonstersZone(CardId.Raidraptor_ForceStrix, false, true, true)) return false; + AI.SelectCard(CardId.Raidraptor_ForceStrix); + return BeforeResult(ExecutorType.Activate); + } + private bool HeavymetalfoesElectrumiteEffect() + { + if (ActivateDescription != -1) + { + List cards = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.SpellZone, true), Func.NegateFunc(func.IsCode), CardId.DarkContractwiththGate); + if (cards.Count <= 0) + { + HeavymetalfoesElectrumite_activate = true; + return false; + } + HeavymetalfoesElectrumite_activate = false; + return BeforeResult(ExecutorType.Activate); + } + return BeforeResult(ExecutorType.Activate); + } + public override bool OnSelectHand() + { + return true; + } + private bool ResetFlag() + { + should_destory = false; + return true; + } + private bool HeraldoftheArcLightEffect() + { + if (Card.Location == CardLocation.MonsterZone) + { + return Duel.LastChainPlayer != 0 && BeforeResult(ExecutorType.Activate); + } + return false; + } + private bool CalledbytheGraveEffect() + { + if ((Bot.SpellZone[5] == Card || Bot.SpellZone[0] == Card) && Duel.Player == 0) return BeforeResult(ExecutorType.Activate); + ClientCard card = Util.GetLastChainCard(); + if (card == null) return false; + int id = card.Id; + List g_cards = func.CardsCheckWhere(Enemy.Graveyard, func.IsCode, id); + if (Duel.LastChainPlayer != 0) + { + if (card.Location == CardLocation.Grave && card.HasType(CardType.Monster)) + { + AI.SelectCard(card); + return BeforeResult(ExecutorType.Activate); + } + else if (g_cards.Count() > 0 && card.HasType(CardType.Monster)) + { + AI.SelectCard(g_cards); + return BeforeResult(ExecutorType.Activate); + } + } + return false; + } + public override CardPosition OnSelectPosition(int cardId, IList positions) + { + NamedCard card = NamedCard.Get(cardId); + if (cardId == CardId.F_A_DawnDragster && Duel.Turn > 1) return CardPosition.FaceUpAttack; + if (card.Attack <= 1000) return CardPosition.FaceUpDefence; + return base.OnSelectPosition(cardId, positions); + } + public override int OnSelectOption(IList options) + { + if (options.Contains(Util.GetStringId(CardId.MechaPhantomBeastAuroradon, 3))) + { + if (opt_1) return options.IndexOf(Util.GetStringId(CardId.MechaPhantomBeastAuroradon, 3)); + else if (opt_0) return 0; + return options[options.Count - 1]; + } + return base.OnSelectOption(options); + } + + public override int OnSelectPlace(int cardId, int player, CardLocation location, int available) + { + NamedCard card = NamedCard.Get(cardId); + if (player == 0) + { + if (location == CardLocation.SpellZone) + { + if (card.HasType(CardType.Pendulum)) + { + if ((available & Zones.z4) > 0) return Zones.z4; + if ((available & Zones.z0) > 0) return Zones.z0; + } + else + { + List keys = new List() { 1, 2, 3 }; + while (keys.Count > 0) + { + int index = Program.Rand.Next(keys.Count); + int key = keys[index]; + int zone = 1 << key; + if ((zone & available) > 0) return zone; + keys.Remove(key); + } + } + } + else if (location == CardLocation.MonsterZone) + { + if (card.HasType(CardType.Link)) + { + if ((available & Zones.z5) > 0) return Zones.z5; + if ((available & Zones.z6) > 0) return Zones.z6; + } + } + } + + return base.OnSelectPlace(cardId, player, location, available); + } + private IList _OnSelectPendulumSummon(IList cards, int min, int max) + { + List ids = func.GetSelectCardIdList(); + List result = func.GetSelectCardList(); + List exs = func.CardsCheckWhere(cards, func.IsLocation, CardLocation.Extra); + List hs = func.CardsCheckWhere(cards, Func.NegateFunc(func.IsLocation), CardLocation.Extra); + if (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.PendulumZone, true), card => { + return card.HasSetcode(0xc4) && !card.IsCode(CardId.Zefraath); + }) && func.CardsCheckAny(exs, func.IsCode, CardId.ShaddollZefracore)) ids.Add(CardId.ShaddollZefracore); + result = func.CardsIdToClientCards(ids, cards); + List temp_cards = func.CardsCheckWhere(cards, Func.NegateFunc(func.IsCode), CardId.MaxxC); + result.AddRange(temp_cards); + if (result.Count <= 0) return Func.CheckSelectCount(Util, result, cards, min, min); + if (result[0] != null && result[0].Location != CardLocation.Extra) ++p_count; + return Func.CheckSelectCount(Util, result, cards, max, max); + } + + public override IList OnSelectCard(IList cards, int min, int max, int hint, bool cancelable) + { + if (AI.HaveSelectedCards()) return null; + List ids = func.GetSelectCardIdList(); + List result = func.GetSelectCardList(); + if (hint == HintMsg.AddToHand) + { + if (func.CardsCheckAny(cards, card => { return card.Location == CardLocation.Deck && card.HasSetcode(0xc4); })) + { + if (!activate_ZefraProvidence) ids.Add(CardId.ZefraProvidence); + if (p_summoned) + { + if (!summoned && Bot.HasInExtra(CardId.HeavymetalfoesElectrumite) && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.MonsterZone, true), func.HasType, CardType.Pendulum) == 1) + { + List pre_ids = new List {CardId.Zefraxi_TreasureoftheYangZing,CardId.StellarknightZefraxciton,CardId.RitualBeastTamerZeframpilica,CardId.NinePillarsofYangZing + ,CardId.StellarknightZefraxciton,CardId.ShaddollZefracore}; + ids.AddRange(pre_ids); + } + ids.Add(CardId.ZefraDivineStrike); + } + if (!activate_OracleofZefra) ids.Add(CardId.OracleofZefra); + if (!activate_p_Zefraath && !func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true)) ids.Add(CardId.Zefraath); + if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.SupremeKingGateZero, true) && !func.CardsCheckAny(Bot.Hand, func.HasType, CardType.Tuner) + && !Bot.HasInHand(CardId.Zefraxi_TreasureoftheYangZing)) ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + List pMonsters = func.CardsCheckWhere(Func.GetZoneCards(Bot, CardLocation.Hand), card => + { + return card.HasType(CardType.Pendulum) && !card.IsCode(CardId.Zefraath); + }); + if (pMonsters.Count > 0) + { + List zefraPMonsters = func.CardsCheckWhere(pMonsters, func.HasSetCode, 0xc4); + if (zefraPMonsters.Count > 0) + { + zefraPMonsters.Sort(Func.CompareCardScale); + int minScale = zefraPMonsters[0].RScale; + if (Bot.HasInHand(CardId.Zefraath)) + { + if (minScale < 5) + { + if (func.CardsCheckCount(cards, IsZefraScaleAbove) > 1) + { + ids.Add(CardId.ShaddollZefracore); + if (!Bot.HasInHand(CardId.Zefraxi_TreasureoftheYangZing)) ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + } + else + { + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.RitualBeastTamerZeframpilica); + ids.Add(CardId.SatellarknightZefrathuban); + } + } + else + { + if (func.CardsCheckCount(cards, IsZefraScaleBelow) > 1) + { + ids.Add(CardId.ShaddollZefracore); + if (!Bot.HasInHand(CardId.Zefraxi_TreasureoftheYangZing)) ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + } + else + { + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.ShaddollZefracore); + } + } + } + else + { + if (Bot.HasInGraveyard(CardId.FlameBeastoftheNekroz)) ids.Add(CardId.RitualBeastTamerZeframpilica); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + } + } + else + { + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + } + } + else + { + if (func.HasInZone(Bot, CardLocation.Hand | CardLocation.PendulumZone, CardId.Zefraath, true) && + !activate_p_Zefraath) + { + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + } + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + } + result = func.CardsIdToClientCards(ids, cards); + } + else if (func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Extra)) + { + HeavymetalfoesElectrumiteAddIds(ids); + result = func.CardsIdToClientCards(ids, cards); + } + else if (func.CardsCheckALL(cards, func.HasSetCode, true, 0x12a)) + { + if (!func.HasInZone(Bot, CardLocation.PendulumZone | CardLocation.Hand, CardId.ServantofEndymion, true) || + (func.HasInZone(Bot, CardLocation.PendulumZone | CardLocation.Hand, CardId.ServantofEndymion, true) && (!HasInDeck(CardId.TheMightyMasterofMagic) || !HasInDeck(CardId.MythicalBeastJackalKing)))) ids.Add(CardId.ServantofEndymion); + ids.Add(CardId.TheMightyMasterofMagic); + ids.Add(CardId.MythicalBeastJackalKing); + result = func.CardsIdToClientCards(ids, cards); + } + else if (func.CardsCheckALL(cards, func.HasSetCode, true, 0xaf)) + { + ids.Add(CardId.DDLamia); + ids.Add(CardId.DDSavantKepler); + result = func.CardsIdToClientCards(ids, cards); + } + } + else if (hint == HintMsg.ToDeck && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand) && min == 3 && max == 3) + { + result = func.CardsIdToClientCards(GetSendToDeckIds(), cards); + } + else if (hint == HintMsg.ToGrave && func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Deck)) + { + List extra_ids = CheckShouldSpsummonExtraMonster(); + //if (func.CardsCheckAny(cards, Func.HasRace, CardRace.Dragon)) + if (extra_ids.Count <= 0) + { + if (!activate_SupremeKingDragonDarkwurm_2 && Bot.GetMonsterCount() <= 0) ids.Add(CardId.SupremeKingDragonDarkwurm); + if (!activate_DestrudotheLostDragon_Frisson) ids.Add(CardId.DestrudotheLostDragon_Frisson); + if (!activate_JetSynchron) ids.Add(CardId.JetSynchron); + ids.Add(CardId.FlameBeastoftheNekroz); + } + else if (extra_ids.Count > 1) + { + if (Bot.GetMonsterCount() <= 0 && !activate_SupremeKingDragonDarkwurm_2) ids.Add(CardId.SupremeKingDragonDarkwurm); + if (func.CardsCheckAny(Bot.Hand, card => { return card.Level < 7 && card.HasType(CardType.Monster); })) ids.Add(CardId.DestrudotheLostDragon_Frisson); + if (Bot.GetHandCount() > 0) ids.Add(CardId.JetSynchron); + if (!summoned && Bot.HasInHand(CardId.RitualBeastTamerZeframpilica)) ids.Add(CardId.FlameBeastoftheNekroz); + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.FlameBeastoftheNekroz); + } + else if (extra_ids.Contains(CardId.HeavymetalfoesElectrumite)) + { + if (Bot.GetMonsterCount() <= 0 && !activate_SupremeKingDragonDarkwurm_2) ids.Add(CardId.SupremeKingDragonDarkwurm); + if (!summoned && Bot.HasInHand(CardId.RitualBeastTamerZeframpilica)) ids.Add(CardId.FlameBeastoftheNekroz); + //if (!summoned && func.CardsCheckAny(Bot.Hand, card => { return card.Level < 7 && card.HasType(CardType.Monster); })) ids.Add(CardId.DestrudotheLostDragon_Frisson); + //if (Bot.GetHandCount() > 0) ids.Add(CardId.JetSynchron); + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.FlameBeastoftheNekroz); + } + else if (extra_ids.Contains(CardId.CrystronHalqifibrax)) + { + if (func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.MonsterZone, true), func.HasType, CardType.Tuner)) + { + if (Bot.GetMonsterCount() <= 0 && !activate_SupremeKingDragonDarkwurm_2) ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.FlameBeastoftheNekroz); + } + else + { + ids.Add(CardId.DestrudotheLostDragon_Frisson); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.SupremeKingDragonDarkwurm); + ids.Add(CardId.FlameBeastoftheNekroz); + + } + } + result = func.CardsIdToClientCards(ids, cards); + } + else if (hint == Util.GetStringId(CardId.Zefraath, 1)) + { + int[] pScales = Func.GetPScales(Bot); + int rScale = pScales[0]; + int lScale = pScales[1]; + int pScale = (rScale != 5) ? rScale : lScale; + if (pScale < 5) + { + if (!activate_SecretoftheYangZing && !func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.Hand | CardLocation.Extra, true), func.IsCode, CardId.SecretoftheYangZing)) ids.Add(CardId.SecretoftheYangZing); + if (!activate_ShaddollZefracore && func.CardsCheckAny(Func.GetZoneCards(Bot, CardLocation.PendulumZone, true), card => { return !card.IsCode(CardId.Zefraath) && card.HasSetcode(0xc4); })) ids.Add(CardId.ShaddollZefracore); + ids.Add(CardId.StellarknightZefraxciton); + ids.Add(CardId.SecretoftheYangZing); + ids.Add(CardId.ShaddollZefracore); + } + else + { + ids.Add(CardId.Zefraxi_TreasureoftheYangZing); + ids.Add(CardId.SatellarknightZefrathuban); + ids.Add(CardId.RitualBeastTamerZeframpilica); + } + result = func.CardsIdToClientCards(ids, cards); + } + else if (hint == Util.GetStringId(CardId.HeavymetalfoesElectrumite, 3)) + { + HeavymetalfoesElectrumiteAddIds(ids); + result = func.CardsIdToClientCards(ids, cards); + } + else if (!(IS_YGOPRO & !(hint == HintMsg.SpSummon)) && func.CardsCheckALL(cards, card => { + return card.IsCode(CardId.TheMightyMasterofMagic) || card.IsCode(CardId.MythicalBeastJackalKing); + }, true)) + { + ids.Add(CardId.MythicalBeastJackalKing); + ids.Add(CardId.TheMightyMasterofMagic); + result = func.CardsIdToClientCards(ids, cards); + } + else if (p_summoning || ((Card == Bot.SpellZone[0] || Card == Bot.SpellZone[4]) && hint == HintMsg.SpSummon && + Card.HasType(CardType.Pendulum))) + { + p_summoning = false; + if (p_count >= 3 && !Bot.HasInExtra(CardId.SaryujaSkullDread) && Bot.HasInExtra(CardId.MechaPhantomBeastAuroradon)) return Func.CheckSelectCount(Util, result, cards, min, min); + return _OnSelectPendulumSummon(cards, min, max); + } + else if (hint == HintMsg.Destroy) + { + if (func.CardsCheckALL(cards, card => { return card.Controller == 0 && card.IsFaceup(); }, true)) + { + should_destory = true; + if (func.CardsCheckALL(cards, func.HasSetCode, true, 0x9e)) + { + if (!activate_SecretoftheYangZing) result = func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing }, func.CardsCheckWhere(cards, + func.IsLocation, CardLocation.MonsterZone)); + result.AddRange(func.CardsIdToClientCards(new List { CardId.SecretoftheYangZing, CardId.Zefraxi_TreasureoftheYangZing }, func.CardsCheckWhere(cards, + Func.NegateFunc(func.IsLocation), CardLocation.MonsterZone))); + } + else + { + List scards = func.CardsCheckWhere(cards, card => { return card.Location == CardLocation.SpellZone; }); + scards.Sort((cardA, cardB) => + { + if (Func.IsCode(cardA, CardId.OracleofZefra, CardId.DarkContractwiththGate) && !Func.IsCode(cardB, CardId.OracleofZefra, CardId.DarkContractwiththGate)) return 1; + if (!Func.IsCode(cardA, CardId.OracleofZefra, CardId.DarkContractwiththGate) && Func.IsCode(cardB, CardId.OracleofZefra, CardId.DarkContractwiththGate)) return -1; + return 0; + }); + result.AddRange(scards); + } + + } + else if (func.CardsCheckAny(cards, card => { return card.Controller == 1 && (card.Location & CardLocation.Onfield) > 0; }) && min == 1 && max == 1) + { + ClientCard card = Util.GetBestEnemyCard(); + if (card != null && cards.Contains(card)) result.Add(card); + else + { + result = new List(func.CardsCheckWhere(cards, ecard => { return ecard.Controller == 1; })); + if (result.Count <= 0) return null; + result.Sort(CardContainer.CompareCardAttack); + result.Reverse(); + } + } + } + else if (hint == HintMsg.SpSummon) + { + List tuner_ids = new List() + { + CardId.DestrudotheLostDragon_Frisson, CardId.PSY_FrameDriver, CardId.JetSynchron, CardId.PSY_FramegearGamma,CardId.LightoftheYangZing + }; + List no_tuner_ids = new List() + { + CardId.TheMightyMasterofMagic, CardId.MythicalBeastJackalKing, CardId.SecretoftheYangZing + }; + if (func.CardsCheckALL(cards, func.IsLocation, true, CardLocation.Hand)) + { + if (summoned && Bot.HasInExtra(CardId.CrystronHalqifibrax) && func.CardsCheckCount(Bot.MonsterZone, card => { + return card.IsFaceup() && card.HasType(CardType.Tuner); + }) <= 0 && !(Bot.HasInGraveyard(CardId.DDLamia) && !activate_DDLamia + && func.CardsCheckCount(Func.GetZoneCards(Bot, CardLocation.Onfield | CardLocation.Hand, true), card => { return Func.HasSetCode(card, 0xaf, 0xae) && card.Id != CardId.DDLamia; }) + <= 0) && !(Bot.HasInGraveyard(CardId.JetSynchron) && !activate_JetSynchron) + && !(Bot.HasInGraveyard(CardId.DestrudotheLostDragon_Frisson) && !activate_DestrudotheLostDragon_Frisson)) + { + ids.AddRange(tuner_ids); + ids.AddRange(no_tuner_ids); + } + else + { + ids.AddRange(no_tuner_ids); + ids.AddRange(tuner_ids); + } + result = func.CardsIdToClientCards(ids, cards); + } + else if (func.CardsCheckALL(cards, card => { + return Func.IsCode(card, CardId.LightoftheYangZing, CardId.PSY_FramegearGamma, + CardId.MechaPhantomBeastO_Lion, CardId.JetSynchron, CardId.Deskbot001, CardId.DDLamia); + })) + { + if (Bot.GetMonstersInMainZone().Count <= 1) ids.Add(CardId.Deskbot001); + ids.Add(CardId.JetSynchron); + ids.Add(CardId.Deskbot001); + ids.Add(CardId.LightoftheYangZing); + ids.Add(CardId.PSY_FramegearGamma); + result = func.CardsIdToClientCards(ids, cards); + } + + } + else if (hint == HintMsg.Release && func.CardsCheckAny(cards, func.IsLocation, CardLocation.MonsterZone)) + { + List tRelease = new List(); + List nRelease = new List(); + foreach (var card in cards) + { + if (card == null || IsNoLinkCards(card)) continue; + if (card.Id == CardId.MechaPhantomBeastToken) tRelease.Add(card); + else if (card.Id == CardId.Raidraptor_WiseStrix) tRelease.Insert(0, card); + else nRelease.Add(card); + } + result.AddRange(tRelease); + result.AddRange(nRelease); + } + IList selectResult = Func.CheckSelectCount(Util, result, cards, min, max); + if (selectResult == null) return base.OnSelectCard(cards, min, max, hint, cancelable); + return selectResult; + } + private bool HasInDeck(int id) + { + return CheckRemainInDeck(id) > 0; + } + private int CheckRemainInDeck(int id) + { + switch (id) + { + case CardId.PSY_FrameDriver: + return Bot.GetRemainingCount(CardId.PSY_FrameDriver, 1); + case CardId.Zefraath: + return Bot.GetRemainingCount(CardId.Zefraath, 3); + case CardId.TheMightyMasterofMagic: + return Bot.GetRemainingCount(CardId.TheMightyMasterofMagic, 1); + case CardId.AstrographSorcerer: + return Bot.GetRemainingCount(CardId.AstrographSorcerer, 1); + case CardId.DestrudotheLostDragon_Frisson: + return Bot.GetRemainingCount(CardId.DestrudotheLostDragon_Frisson, 1); + case CardId.SupremeKingGateZero: + return Bot.GetRemainingCount(CardId.SupremeKingGateZero, 2); + case CardId.MythicalBeastJackalKing: + return Bot.GetRemainingCount(CardId.MythicalBeastJackalKing, 1); + case CardId.SecretoftheYangZing: + return Bot.GetRemainingCount(CardId.SecretoftheYangZing, 3); + case CardId.FlameBeastoftheNekroz: + return Bot.GetRemainingCount(CardId.FlameBeastoftheNekroz, 1); + case CardId.StellarknightZefraxciton: + return Bot.GetRemainingCount(CardId.StellarknightZefraxciton, 1); + case CardId.SupremeKingDragonDarkwurm: + return Bot.GetRemainingCount(CardId.SupremeKingDragonDarkwurm, 1); + case CardId.Blackwing_ZephyrostheElite: + return Bot.GetRemainingCount(CardId.Blackwing_ZephyrostheElite, 1); + case CardId.ShaddollZefracore: + return Bot.GetRemainingCount(CardId.ShaddollZefracore, 1); + case CardId.Raidraptor_SingingLanius: + return Bot.GetRemainingCount(CardId.Raidraptor_SingingLanius, 1); + case CardId.SatellarknightZefrathuban: + return Bot.GetRemainingCount(CardId.SatellarknightZefrathuban, 1); + case CardId.Raider_Wing: + return Bot.GetRemainingCount(CardId.Raider_Wing, 1); + case CardId.Zefraxi_TreasureoftheYangZing: + return Bot.GetRemainingCount(CardId.Zefraxi_TreasureoftheYangZing, 2); + case CardId.RitualBeastTamerZeframpilica: + return Bot.GetRemainingCount(CardId.RitualBeastTamerZeframpilica, 1); + case CardId.ServantofEndymion: + return Bot.GetRemainingCount(CardId.ServantofEndymion, 3); + case CardId.PSY_FramegearGamma: + return Bot.GetRemainingCount(CardId.PSY_FramegearGamma, 3); + case CardId.MechaPhantomBeastO_Lion: + return Bot.GetRemainingCount(CardId.MechaPhantomBeastO_Lion, 1); + case CardId.MaxxC: + return Bot.GetRemainingCount(CardId.MaxxC, 3); + case CardId.Deskbot001: + return Bot.GetRemainingCount(CardId.Deskbot001, 1); + case CardId.JetSynchron: + return Bot.GetRemainingCount(CardId.JetSynchron, 1); + case CardId.DDLamia: + return Bot.GetRemainingCount(CardId.DDLamia, 1); + case CardId.DDSavantKepler: + return Bot.GetRemainingCount(CardId.DDSavantKepler, 1); + case CardId.LightoftheYangZing: + return Bot.GetRemainingCount(CardId.LightoftheYangZing, 1); + case CardId.Rank_Up_MagicSoulShaveForce: + return Bot.GetRemainingCount(CardId.Rank_Up_MagicSoulShaveForce, 1); + case CardId.SpellPowerMastery: + return Bot.GetRemainingCount(CardId.SpellPowerMastery, 3); + case CardId.DragonShrine: + return Bot.GetRemainingCount(CardId.DragonShrine, 3); + case CardId.Terraforming: + return Bot.GetRemainingCount(CardId.Terraforming, 1); + case CardId.ZefraProvidence: + return Bot.GetRemainingCount(CardId.ZefraProvidence, 3); + case CardId.FoolishBurial: + return Bot.GetRemainingCount(CardId.FoolishBurial, 1); + case CardId.CalledbytheGrave: + return Bot.GetRemainingCount(CardId.CalledbytheGrave, 2); + case CardId.DarkContractwiththGate: + return Bot.GetRemainingCount(CardId.DarkContractwiththGate, 1); + case CardId.OracleofZefra: + return Bot.GetRemainingCount(CardId.OracleofZefra, 3); + case CardId.ZefraWar: + return Bot.GetRemainingCount(CardId.ZefraWar, 1); + case CardId.ZefraDivineStrike: + return Bot.GetRemainingCount(CardId.ZefraDivineStrike, 1); + case CardId.NinePillarsofYangZing: + return Bot.GetRemainingCount(CardId.NinePillarsofYangZing, 1); + default: + return 0; + } + } + } +} diff --git a/Game/AI/Decks/ZoodiacExecutor.cs b/Game/AI/Decks/ZoodiacExecutor.cs index 469eb0361..81d3e5f56 100644 --- a/Game/AI/Decks/ZoodiacExecutor.cs +++ b/Game/AI/Decks/ZoodiacExecutor.cs @@ -127,6 +127,7 @@ public override void OnNewTurn() TigermortarSpsummoned = false; ChakanineSpsummoned = false; BroadbullSpsummoned = false; + base.OnNewTurn(); } public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) @@ -150,6 +151,7 @@ private bool AleisterTheInvokerEffect() { if (Card.Location == CardLocation.Hand) { + if (DefaultCheckWhetherCardIsNegated(Card)) return false; if (!(Duel.Phase == DuelPhase.BattleStep || Duel.Phase == DuelPhase.BattleStart || Duel.Phase == DuelPhase.Damage)) @@ -429,8 +431,7 @@ private bool WhiptailEffect() { if (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) return false; - if (Card.IsDisabled()) - return false; + if (DefaultCheckWhetherCardIsNegated(Card)) return false; ClientCard target = null; List monsters = Bot.GetMonsters(); foreach (ClientCard monster in monsters) diff --git a/WindBot.csproj b/WindBot.csproj index 2e9e91b24..08c85606c 100644 --- a/WindBot.csproj +++ b/WindBot.csproj @@ -59,6 +59,16 @@ + + + + + + + + + + @@ -72,7 +82,6 @@ - diff --git a/bots.json b/bots.json index 145f1bd5f..1ed1e2af8 100644 --- a/bots.json +++ b/bots.json @@ -11,6 +11,12 @@ "difficulty": 3, "masterRules": [ 4, 5 ] }, + { + "name": "Apophis", + "deck": "Apophis", + "difficulty": 3, + "masterRules": [ 5 ] + }, { "name": "Blue-Eyes", "deck": "Blue-Eyes", @@ -71,6 +77,12 @@ "difficulty": 2, "masterRules": [ 3, 4, 5 ] }, + { + "name": "Exosister", + "deck": "Exosister", + "difficulty": 3, + "masterRules": [ 5 ] + }, { "name": "Familiar Possessed", "deck": "FamiliarPossessed", @@ -107,12 +119,30 @@ "difficulty": 3, "masterRules": [ 4, 5 ] }, + { + "name": "Labrynth", + "deck": "Labrynth", + "difficulty": 3, + "masterRules": [ 5 ] + }, { "name": "Lightsworn Shaddoll Dino", "deck": "LightswornShaddoldinosour", "difficulty": 3, "masterRules": [ 3, 4, 5 ] }, + { + "name": "Maliss", + "deck": "Maliss", + "difficulty": 3, + "masterRules": [ 5 ] + }, + { + "name": "Maliss OCG", + "deck": "MalissOCG", + "difficulty": 3, + "masterRules": [ 5 ] + }, { "name": "Mathmech", "deck": "MathMech", @@ -167,6 +197,12 @@ "difficulty": 2, "masterRules": [ 3, 4, 5 ] }, + { + "name": "Ryzeal", + "deck": "Ryzeal", + "difficulty": 3, + "masterRules": [ 5 ] + }, { "name": "Salamangreat", "deck": "Salamangreat", @@ -179,6 +215,12 @@ "difficulty": 3, "masterRules": [ 4, 5 ] }, + { + "name": "Superheavy Samurai", + "deck": "SuperheavySamurai", + "difficulty": 3, + "masterRules": [ 5 ] + }, { "name": "Swordsoul", "deck": "Swordsoul", @@ -233,6 +275,18 @@ "difficulty": 0, "masterRules": [ 3, 4, 5 ] }, + { + "name": "Yubel", + "deck": "Yubel", + "difficulty": 3, + "masterRules": [ 5 ] + }, + { + "name": "Zefra", + "deck": "Zefra", + "difficulty": 3, + "masterRules": [ 5 ] + }, { "name": "ZEXAL Weapon", "deck": "Zexal Weapons", diff --git a/libWindbot.csproj b/libWindbot.csproj index 87a79a85f..e7a1a7afb 100644 --- a/libWindbot.csproj +++ b/libWindbot.csproj @@ -51,6 +51,16 @@ + + + + + + + + + + @@ -60,7 +70,6 @@ - @@ -136,10 +145,7 @@ - set E4K_OUTPUT="$(SolutionDir)output" -if exist %25E4K_OUTPUT%25 rmdir /S /Q %25E4K_OUTPUT%25 -"$(NuGetPackageRoot)embeddinator-4000\0.4.0\tools\Embeddinator-4000.exe" "$(TargetPath)" --gen=Java --platform=Android --outdir=%25E4K_OUTPUT%25 -c -v - + 0BUA!-^aOl@TiloB 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

HgL+0*rHXBmbn3Zis5U5C1z5>&W~?k{+3L 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

uj0Lx$3@C1QXzsAQ|{SX)B??G>}%2;vQ}`_!ph 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

1$+J{T52W)l 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 YOKq=SX{<>lZ#2c-Jl76`*TuyD5BfYv7XSbN literal 2485760 zcmeFa30zax*Dibl5rak&6%-W}G+0!sC{73}D1uWFM8OeI5h>NGm>^aJG(-tU6s@zi z&Q@Dnt+k5Q0YnAosdXsUI@VB}>VV*s?|DwpT08vvzVG+l`@7$z{bgnCy@tK^+SA(W zoZx$dvjl5F5ajrn&4Q4PZ~o^i!G8v7nIPCT++`O6K_^r#lqs#VdHt4?0QQK#fl@ z>WC4y5(FET@ZYO%A*zYRxu~-eeBm)LlK1turFf;YM)<9rAS}0X72HVna21Z#AoA9K z!LEYox*)7{&4k>0z6g%_z!m$inbOu5Q@(3 z1GSBxwNRA52*n{ILG864AnS7w_P^6mD4Nj=pyfyu-J?LL-{DOMTG;P?@SDeG0Wq?bD|0|y?+vVGQ($ImP?JUg^v;8- zVgcCky^!7U9Y8PkZN?UWc1J*cu@>0)T_9XZL~-GA6eqCg@B+3hq+d2?qd2-I)Sqbx zpi!XiYCV80R2oqX`?T}HoU#xghZamofGYoFP`7pmmMDNF_#vq0PoTJ|5&V3B?ao_+ z&b+rB68G}K+@dmA?7~4!8V>6Ab`Y!87ZUGL!FNTV{xBKEtP#Lkvu~}oLP2H99{&N<^wSV|d+?ZSZNKL(bv9_szJqF9^m^sJ1!;zVfaH4;jzaLng4LEZg1 zC=OkXVyA_mUJZss{9zOy&j+?69booiu#7tcYFz=g==@M;$N`pi7@8NZ1R;(CFV}#e z)i`5ryoaKRRs~Z_r~BaBn1R+FErDixJ&GzPD0Pv6dg@bv-SYtMz5vVmK9H@|62)2T z(1n z`~hSq(SONPp`i6w;Cr|k!1fEUytfVtyh}kXD@8*CY=LdRi@G0vgV^kQ03Xal-7OK! z+b4l#xhskS*YAovfE^2TMmNn*&N8G6{GIm@nG)R3*gF3fce}(#)JX;aT^pA)I!nsH(*En zP}iAY@m`3HTmeFdy(lgmgraN*io-ZYyEOoptwCrx5^aPLE8t{xv`44s?SZN_H&Aqq z17ZA&+SnOZpzarE^zGINNQgloh;6|Nmz0kb!#TT#mUtno8An3ednN|WE+5` z8v)jFR9E%`bNE3pFWHY?errOVJ?F+~c1t$|#mC1$joXd7cZZ_g57W@lW?C>N1JtWr zQ6II2mT_~za@q%VspNb52|(Rt0J#Ke&cBAgLe;)Azy@>w8^h^+?f`&-)2HMI00%m! z%3A1a+Zcq+9%wDN9;`o@1H#4Y0F$~x%gYV`7uJC#&kfWr?Llz%2lM?r6t7N2lb>>H zIWiS2ed%W*7sVYMo;6(TZQ6j@lY7oPoCiO5Lh;*ALCs*3*9Bk`d%=uTG$WdgKbirt zzH-csad%OiUIK!?1X#UK1&rGk6lK*wb*c-o_FF*MJ{rJn7;L$~-RzDYny*9vbfb&E z4n&>a6-sBZM;C{HulICl895hNL+YE>0;&qR|5fe`Y;9xky`u#<&J|E=D_BzfQM{D| ziHqw28gxN1Zx192nxLUfo`ao+lld8D&YCznCl1A@s{pdT2Y9~|SlZ77!Tmd6Re0FE zKMSozEr6;+&d@UP8`KT?48VhnsdO{ckK6-l<+CWRjRE*gw&f7?xfWYt3*zctdL5u8k7K{3pdRysEwVKze#t|r+h#Dg z<q1JyTN?!6x8QlLS2(D0B-LE^OqMOwv^lTfnwB6<4HV; zb;nym;_C>2HlLzy$!+v#!&l%_vuOMhs#Ilui%@iX0_ql?*nPNz)aij@Bp3Ua39w2(14j zc=QM1=55H9@f;jUGo~Ixw+1%^OaDOt`Dzf{DHh11Xvju@BQ>Epl^(ZY1iFDNZL0wc z_eNb$o<|OxQg`~H?)zn6na-o~Q${k=7#`IzVeUQ~2qSmz1|jMgz_Esq=rS60zGU7q z1E%dNLEZKiz~=EZ?MdJ7Sq~PskKx2_sUV!FMTLftg5 zRQ&>k)AJ!wkN&IlHCTFl1nStUP};FRK$9J4{8B407u~`fU&r9d?K>3HIUXaOQQXKq zqA(G%M`nR}z=x=_;zInaC2W3>1;T)MsLx_l;5igs@aqpOlPA~#F6X*bdSe8@IXe`i zDAAhxz-LH}C7WMo;OgazY+ z&}7RP6mK>F->N$RFFuFn$s3?_&qjcHoGSM?k%lisYi)L-uIY5t#qowQhGsZig94G) zhsl{B9J~qe6VIMWn^0GuVt083DEb_-^X)QPCFe%$@;cV(6X1|Z|C^{ZP``-FJRi-bYNT9qwdY1 zH28gp^;-(&qRJqgPD9;e&g}l2*#{U_cyo~ybOT|)4isn8*(W(D?R|my4+nJvL)gcT z@Lx_CFylt3U%wp8mw2!&;88xQBZ>{8Vc(V>D1LGSd_VJcw_!W#F4D+0x52XiB_vuL zMbRM>O)gM_+O!=y-J8Sh_6fjJUIl%rxhMC|Zjqp_I`J3P)k>iWvg`p+Th>?ZUglPuFK2x-=@#N=R6g4!Hi4Fs=}7< zjSySW0iaqC43Ga61ZUn-$8bj6Sb;j1ub}DxL&W=x8TMC0om~ow7kto~QwtO?^Hx5d zTVH3M#QV6WcQpX$?}Or%U|^=Mz=pU3bfG6(GjRBv3u3`4h<(fLb#-@OBYy&LKaGa! z*h8$19YB?2NHiM+ELsL^&W~We#x5+F0lqj+kV^wVb*G>AuLia2`@pU_LH&rMD6VP* zrK8NiemV@WeigI~VSwh^62(hfz*krbi9QS~ewztGNMnE>c~;cmFy5^V1>TY1TU-S! z5tSg;o=3-8y8UNbx`5I3?yIPqSOk{OxW_(jh2jOCGrx>P@yKVu#xjJMMoZOPl1`kR zQiS{o2Vh<+G_>A`y2~bjBV1*^HW-gHeLy(B7+}{1_E(0wXikghMF5XC06gshOK*8V z%Y}U?*8diKbGS>DvbBuw02algM_U%d+zHo!c?O`a9>?Ps?hM~^G1aaOu&qC|v}5d( zY>y_}-vYLzJ(^s_D76x_GqntY*zGFM)50I+8Xibv)^B4{Y6^ZG#ISFWhjL!fyHgVen|qE-DtZJGg9*Mk90 z4g%lxd2miWj!Yfi7JuVrUX6Xb#e+ppM>q#Tb`t~tlZ<0?T|v!EW4k+0ccuWvO>Kdt ztAL&0R9U_UVojOjne_{>eK%m*6wXsmUS;<1bg9hsmcVe|^C7S@&fP-p2O$H&a-5s* zhHDV}fzxa_{hV_Hgzq_b>q+;8`>5N?@W{+=wdVEV+vO;>;vT#G8x)-?K_ZRq4jK$_ zb{dM^dVuQWhpx8gz^Bbc8_#Tk?HUEFCw&mkz}oH>l)7X$FE-9bj#lEn831 z4toKFGr5u{1J?N`L^tXXV87gg0yVeSDxOf#c0Y_v*n_$+n6Mf@77A`$qN+(?c`*eF zrW}A+{|3Muxl6V99?UJctiIU+@Mt@L6*sc;6WRD($Sw&2cIzU<`Z9rYdK$!TvA-)u zfbg8DwdowA6+BZK|0-bPVd%Wf0o3UCQJlo-Qmx6luC4k#B==~ybE`VrQlo7nD8;zuT?M_y1f+kIX?qo!?&nQ zYK*$4mm$$;Bvf5tb}-5nb!U~}vpa@j(O@t?TL-Km6H!-}Qk50k;OJj}2YiP8C@y4F z+J+Ipjs##!YeI`P`Py@_*V+KFEn}f&XD%8#cpZe*Jfrl9AY5L?zI_C+>PxW9SOmgp z16osehnAUi`{j6GQzk=IYj*YXc3@7M4cR(BLEkn5nr!k7sBX^Sds!1Kmq}IM1oqA; zfa)utMb8dC;`w_g56q6?U{-8IQO$jP<_ajCy99(K9L6p8!2HWuXs+E3U~vIhmT^ul zo(?{TmZ)3)48`;F(a@E-kZ95t`s#44)_jC0_oFpX@SqS>Ib)hCxa$`#y8QSEUB1>$t(^F^9MK5sHhNfV!Rob&s263SGCCdwcRq zu#9ECB=Z{Tj?nsoL@+zPk79U3U?FS4a%cyNI~dG17zraM--Q-KFHrAIhD5|BV4pI5 zx19!kbp>ELZ||kdzw8|d!XPf}=y4!)ngH2e48g8(-^l(9nonE;pGyGh-eHpqJ_n!u zdJt;zaBa#&#p4+$p5&w%`yRl7+o&tr2Gc~wwoQ1o%zFS|4JC{AD`?rw&G*#TAY3#8 zyr5q~7DG(rMOIhY8I6B|;wH|zxeQY0GJbBy&~(HTFt3RKU)`ptJH~yZVJq-$8V*7# zHRoNXdUoscngEJa*m9Sas>Xq3=VWTx4F#>kP`4)|rGet!#mGkFe{4n|$WQE=yx z3$SlMJop-OhwIH%aV{CMkzDKpKZV3>PNe-KP&Z=~%qXr7+2vONKCK19-FXoEg~9P6 zrl>O*#;-S_Zigo{59e)STrmjC>CPYagRrqGuta8Os%oGw(F3v*r$a2W39yY%;mH&( zdnsp`LIu;OqoEx3H?2A(;-7=>u@#ES(Xi^9Q^3CA2H=F5d7ys41<{ft0?G!yK;PC*EM59S+&=c*Z|phq~%kD1ONU{N_6lJFbSry*?l$a%*YG%`&(r zs0SLMZYj6i6U^#{uyJeJ_YDWMYY>WB8Gug?!1pn*#cBw!HJl7z@_9u&-cGvH`T}1x zw1lUc{3^_tu@&miG9+nBmt5fq@tlvg6nw(bjvz7@gdccCwxU&PZk9{FLL1!}C{-Vg zhSEGx*Sr}(ub%+6vkMOA!1CTL$hHp!pDj<~FByK!?hP=eFU(lYWZa~lz`A}6Ek_xt z&Y&4hNho1n{^Vg;VD1OP&_b|ynSuRAzJvl0dNH4v%3ax&GiQVcoPC^W=F{^5Y&h^Q zhoEjf!_aQj++{qJHl`}qk3cBm`ndTMim^;=DLBpMv-|$*fz{+qSixO1aVfwz;iwx; z>ksn$cou*jNe?`p(%iv3YnyQrCLRZ9HyEBA-U0-Hd5h8P!b2~BoW=mI?a{_*rVYE% zFCm=Sl^8*N&<0rk0}w`WpG-A?@8~2nzJNB@`Vqi=IapRcL|u)E;M>ftYHJK+(-wgF zE9US%^#DOJ7lg2dz;5%vD6|6M*m!`;Z1*RosE>39CMy9o&=X2q3n;GVI$zurswTUk zE}mDOul+z!xuCf3M@)fvOCVc~4~IN10gPbZny&z#7d6}S&>YR-sdfR_Z?~X+!Yp9N zCxRt`35X9w)WyvPILHmDR$veNy_eTR1ZB#XdZLY?J^*>G0i^r>a4J~FOM}aIXk*YaNQ~$6=_zd>@!lg4wsS31Lx0#Nb(v5pJk8jr<(?C&8SV?)az(VKUO=F~iM zC-~M*hk^}!4%TQbiVgU*zfL#K-Qr^y#o4AW^`>I)#t&q8P3&&;q-!0jR^EsCrX? zA=4l+pWBTt6AF&;MzD{^T?-CH4Og%%nvA-^JUN$=Ed8FMI7S0P zFb~Mwn@}+I8mP0nqb`Q6`JRLNZ7Be4Qz5at8bAr7>+z#O?RF1@rwP#FIS6(8K0{qE z#vlRQ(!8i(qAiLWF97?552d~sh+;>ctCtzt@1_%PuLt%M!}un%0eTIi`4VxEIhzX7X1AJpnRVl-P}^P=`pwS@=Y!B7-8 z+oSjaZ=|2|yxcS&geQAosVB!R>lhS>cd4GwCi+GJw1_~r>NCFY$TaRAz7TPO2Y5Q~ z>;h-b$}zwK>S2yAe+mhM4HPucgJn9ms`nW5KK%*mcQUvBxGM-B-UArQox0!wBnmzN z)^r%e(p}NUA}*XMu_#{U6OLrg?DiudyW|NlVGEdh3a&3It(>`d_`_%t94wluSb`VPD)9pf{qHQiBc%z3}K9V8kvNa)GY-^e>j7`vMF z4K&wf(sLQlJe4i#?tY89g^Z9Ja*qw|35iKg=zgmXAjI&ztj(FTstbzItAH*11o}=N z0-+!M+**cqf4Bpyy4L_pLoUu8t)OKY(_^!~M&FV;L*gdS-@(L^w*f5e1!@(VTU-TT z8&AZT@sPdBFmGBZm~|ad{2&)azuCZk<(5|eI>2Ry75O}ShDE`GQdjh7BPV}4H=c2U zkeEFbR&Ct~=Fj<}l60N3;eJ{&0W4B15c4I9?hJ{`xR;dG1>ueZdTw2xS~xttKLaQl z2$r_>p!C4|AUx(}r9Jo4GYl}!8Cl0|xEb&Eo2H;2E}WQ-T_AhO8Q@VMzzJS+M=u2! zR}T_{ih-TyaycLeR+(T)I~1EggjFs~xO{XM;5?rxjo^V{?gpiE=Ao_!58UI6Au&4` z*aII(^y4C_{|OWfWx}B2hY(vyTWsQK_&5|NbVond@@ig(64x3+;wQdN6yE`03+t9n z1sKRdb~z0!Iu3P@xC7Vb{+Ag?!a0DLPa!dd zqhH7)%bW(jPq-}wFF-Ma{%gpgcsUVRB*!v|>(Xi-SiT*HqWA*{(PseMV$qon45Q+? zAZ*#`4F)jFSo~-mu+#|f%^C?THx+dOOg?tuQNHIS2rZU?aOoFlE@3gY2$R1tkMb^@ ze>WM8gc`xzqceu=A=l9uEAX8g0+wZcp=u1B-LecUH4;G>_&roPZbhBfDHNqQL&nk; z>BK%p@22S>)?E+H)|^rX2Et#Kf-sfmWgP~`6FvY-%u6Vp!z<{7rKl^*ffkXelG}{` z_FhEY^?cO5GZo-DeSc#in(Q(Mn7~7B`AuMf+;=@j0z6bcTInoalD7NI`-@Y#-Dswsp@%Y@w^L#=hfRIm7ca5>xQ?kUc z`vy*sPl z_e;)$5IY4xV00s+;qTKWPZ;`r!H0D*OiFyiN2?=eK)uBa$R6xpZP+HlC) z@g7jbF>1qTy+=Ptj2F<*S2IAB0*ud|g5~@P)P-1q@8Kty@+)|%Ex7@(CJ?}pk9DdM ztf&tKE0|hq`Un>I>4AkZ;?(!+{xj z&`;*Wmz^A=X7|B7mK)EF2LLVgV2R@G_~T>1Lid7YEhk(YgXq>1P?s|RvPw?n>t?9B z_zUXt5@67lqo|w3$Zbv$SoS_gu?yeWk~X}>3|PGBrs0ePf9CxAwkDKrNe6iMAa=~6 zBVZX>3Tz}}q-q@LZ#WrZ+XGDCl_K^!>h#oH$RWFC55B8>ux_9yds5$Uj{dNLkSJq@ zYJ3a~D&$q>7PAHqc$fUOBNXgPLEU~H;2UYU&nOf-bO2R$67F2h(67J~b;CHNrkw}Y zjN#kIcrhL6e5k6!+0=ojLDeQ`V->xtIEK3=${C_ul-S%RS#mbxOWB*g_w63sOov(o4_mCpemr2?grlj1ys3n z7VDw`7PzABlzfS4+40|3)=zSU9>b@Wd$ui zGWgv5A?iW~qvt_qAQn`By3j>va)buO2}TrK@hUhw3w(j}{md4S?ZgnG@5kUf_y~lp zz0lfVuAar!VZq0I7X2RQ^SR4l+4ntF?T5rB1!N6;ZXZqA`+N-|l-uT28%We&2EMwC zcPrIFyZ7b-yD$ivw=<$RYz^vRzAq5X`0psw>Uo|Z6kGxG@>pPlmOy>GJS@)K_Rv?r zb1Rx%_=7{Oi&hNy8odw9pErLMqx#=Cf*a`U zR0oLV+rs*FjFB$fL2)V{P_z$18y|)XXoEZEy4tAA+Cl|fwF{15k8o}ZvHAI+hA}}h zj#%h0G_+&`nU8?)b~eDVC$QiWulm=EP~7YXmU?t?WE~KkInvFToEOeR>9Yf9@*G|4 z@)@v^jMpM2fcaV`u=PqXyK$i0n*%%48hlfxvNHsa=(VeShCAN|nEDCyg)30}d^Tjy z@NOD^020r613JQ6OiUgyN174JmyzxKA$HOSn%gl_9XA=p*4_Xf4Bmfb+QG=w!7rTr zB}{;AVtVljWoNz*i2>Yh+`@tB*?87UP=DYU+3&*)Tk3-1a;+UWI}*PU<+uYiBsB-}Q$r z6L{s`+yJ0G7sOOXc+)=t%O1W~QH$YQ9+MpRN+IhcTvkGPJaN3~WIZ21-2v zgw1re>mq=!uR?YUFY|t!0!{hYy%SFjD?TV#%!4_ZQ)LNX)BV8%#We>(^*I3Gz_X(7 zEMOBO!SZ2!6noL_UAeZZ3 zJmC(pvky@h#64{1I20eY0HGcgwBn6mTXhf~c>>sQ;C&dM2DSv%Jq?&z$;LT>2aG|_ z*Ihu}Y$}+>2|R!?$R$3J-NB*wwhHupvkF?al92xqu+)jbs@s7ue+N{};8dB8rL7=l@@-$Ddr-Nb81J1vZ>%h048`P)o0i5C8?<8Z<&!?eXkJiAvnAF)s z@H4w`sXka%a0_a~bnj!HQJ*{pVGH&38h~OuzBo3!7eKd@m`!^UP$zx}^*8CJle`oz zV-jXfdx)*!X88dxt(Vxw+`|F_B?fKje9|!PA^0Bc0_ecYz>gg1m)t;S@f`xgbYQbt zx4#cGU*l?g`7ZQ@wMX5OmH;mGAvVhc*pLuN#4{t8$Mse>5`$ESkVcq=M%g{tSiQ2!+_g;Fk~mK@kGjO)(K z1)n|p@dX#tsp>efb813Wtxaf6l?%R!obBVr0DH+tDL*q%ilK|+3Lx=gF6uU(Lqq-- zfj!6t;VUZG%6I8@bEH3v1i|JW#1i>b;b2FApLmr?puUlMfQ?yD701XZxexlb@pAx& ziC{7EpwnLw}w!QXEQLj za7S_Md`LVwgrX3O){dQHS3iQ-YM##LbHM!5FCZ+t2foTRfcY|%JQ|H+Hn*?dQ2_h+ zoFtyUn))LMDrRhEQ=fA_sQ1R8?kRV|Fy?aay#Qev7tX{CNbHOR;j`mVT7|3ZBOXOZ z52CIrx4G^dql6p4W_Abjsa+trF+Pw|8;$k=%XUFOG6#Y$glnNH!=BThLQAEt0AtR8 zFpNiK#8rS(aiG?^3cg)EQEd4+u#WwJC2;Vhbbjq@IZwJDm+l(feH^)c%Z@q6&|SYK!pb?JW%0*3J+9x zpuz(c9;om@g$F7;P~m|J4^()d!UGi^sPI6A2P!;J;eiSdRCu7m0~H>q@IZwJDm+l( zfeH^)c%Z@q6&|SYK!peXukwIdt5J*o8g-nN{>sZ>l~BwzwYn&!@|WRjZ$i*eVFOQkXk}UprihPq9j0VrK^-4P@`DYA)tn~N^qE|`q)~q zQK8xqpx#hJ+gc1#ZsfnfthKVX69eqMdn6_|h!f&uappL4Y;c*2+T1=r(7uKs2&T%T zDd`v)@#p@%-C_7f9wvHZ3t55?V+c^|Z1l;Fg4Q<7bgh>ol*qGX&=?kD3{aa+p$7c+ zs5Rsq3aB}Lr$3ribuU1r(iot~meqw4aFWT8W3=0Ozp*{(#vskVFhw#=?4wb5<`@pE z`sOa_$MI5{E^RZL^#_!H-52o7C7-IrR`81Go4CZQzs5ek`6Rh_X@ct?92A!CXYtRi zQIdbM=`1+uFFJp-r=|01I6OZ<2|lS~u*`fYpoT0zK*1_i&wQheXU@Oz^DDp8-=ZSJ zU!zF(tC=l8O^mId`uDztiCT>!Tntbeaxe+Z4zZ~kHT)eXz!lDKe!@&&PnL6(Q!%Qvz#)5qO6A1rJ3oPw> znt!*w+ykL;R&i!D?G$F}F~&g1BO7{K9IE<>=I75S_A}xg(?!*F=`7_+OdhlOF`EZsGglEq0 zBmQb;Sib*BKb5_upH2Rk^v4ON?>{%2#R4wk!#Y_WC!`@~vfMML*yjBllQsVJbJ5Qy z#C(b@itMxRjZi-+%6)1h?$0$fwBG-BcE9QcJdZW&Sr{(X5`!GYkCbAdQeS4R3-I#S zII0YzEnTn|gM7s>|GnIGMC?1`)!OR)LV``7MswLI#k|OfA$dl{POLs5(ikj{G4@c4 zd8iv8j?p-In{=IFwxbxN7Q^h{R8oUV2E9@;j9P~Ml^S2D7^*L`(%FY`N|_eEP)HLt zPZH6W$+WimGP%mI1MPc71nX*snXK&<(xj6c3RQ*`s5d7JG$-`uVhA%Q1e-<-a=EX){~WE!Qmm82DhLS3EA?y_KWf`@7NXJ#|EIE~3^J-0aZu>8Oz zj;5vmUXdED7y9eCQwBeX-Gvy@R~^$hH^w_x=VG3ui0!bWk=nHJ3ykLdICIzlQ@eF$ zbC_xID(Z4XPsF?-|7o~h4cq@~-<(dW?Y;wEHEfw)T5D0r`^!ns{oZgmu?G3Pd)QC4 zMIWsXi}HfMWNBtGq zD<8b++)!~SI-oyc4i~$-M{FSZdw?LE!Cyq~7L zD|S<{3oIuin^+q#))rvHBe?H&PceS|J z#JS%`V{e>sn^=I-IGa^})cntf*gxvO|62c}SNd7?U(wI;Q(_U1^2|{+^oNn@9Srcp zVXciZy$vui-T!sjS1Jd;F87hjLtmE%O6Azslh-_+39nv^to1PXLL8Pg;%PVqc7lmaL^x822Oh^ zsoEDAk=4Z8Jo__F@1|W1Y>D3-xk}?O>~2aJb1|=D-~oC8d~Pk9qZDBv&)U9V7FF zsG`aYDjkg;QaJh#i&h%{KcCMtM;Ar3?2Xa z(0-%)P$2c!K3McHbvaQ(V29Bd;?|}!zE}=P?!_svCqG2q(%VK&g5{8r-w7R z0%D)b$VK=DS1_3F|L}^*C3e2a1x$o*F&(uq>61MKtt<4o#AZwS2;X8|`HIz9&{g_-phZ*JtVL_4)kO`eYTxjiKu$ZS<@m3;f^fV1w0rx| zE1#c^qOUu;RVz!M=qS@EygYPreGeaJ93B|5VsnDM$@*9g%m@}0SeHsaW03P-P5Zx| z@2Sa=f)01MuMRK}mtz<4O14jK8R}Vx!%_5igj#KF>1Y&FZ@|Om@omfwn=F@vKz*Lt zJJ~+zhauDwNj2{rmel+=m&9w|5D775t~Hy{JP*&Rrv~MP4hR$5Cf?v#qE&}kEfX}43Bq4sCSkF+RN?VT}K=Rf6I4GWt7&c^3Ubxt47WJBw z@E0u8fu$gJ)7pEVPf;exy^l_^5p%2V*U81B;(2W9YGXCFV02(>k%lu#&M6JBt=C0U zwUQLx)zqk-q|C3Bg>P&RLU9!f4pe~YuH^>2HXU`<%e(X1HbsO8<7nF-eDXgjSmrz8 z33RPzxM#^eX}VVykE$A`(zJg&@0I#|WxzD^jdYDVDJL>O|1x-L-As8xre)&mJ0O12 z=O_a@JtD*X@^z7bb;0)j^Rjr|Mbqrn((v0z!=JZG8u=Wpsywui${6@i%ZLpS-{lZ; zlH*KB>WuN{C?1Y)W30vzHMS+$yDi5o$zF8e2&TxrkHjmgO5>2 z`hQ%|uPwJAumD#jYf~FrDpnT)CgAl zde*drkwzRs2D8dwkC}@LM;m;6!b~155oMZi-!j}$rELT$b!u}fRoV)ketk4P=wzA> zxN2YbMuwc^cH%I(YM-uAh}jd(dzj{x*}p!q!7XhYFO#mqbPp^iH%d{9cd4#rNq47I zm0>PA5@PydXidw$rbaWR+eKZ=?zW1Ds{c%4$sk1|q3V6>MYLOiwMt(z% zDh+?eQ#zDkq(`xW$Ft`h&%#$brjKRE#5V2=2iu?rjz$Ga{wP@)9f9>Iuh&TReacHt zQYpB+zXxjes%q7gsK)VV!a! z@e`Xqx{*4}G&=zk4tWDLhC{uNb{EUxLbd0a>{+Tt2$Mrp{`-TGhUvaa%~;DBtkBGC zr}cPdYZOv8>s7KQC7!eS?=o4#hUgDC{l4;Iuh2Qk`v|~vY92t_2R6|4pAuKGK)~CL|di& zL`7-U&|fgG4)gr8$1xFw5@u3Wuc4WOwvwNBLHuLy0$o>}U(6w4pHQ3Z(GJ3?rqWY@ z0jAddxqtCqTU)F~WoxLz=#=hfl#0cb_Em=Hup#B`z6vk$BO?C?=XYu+_D%>3*V%ZM zAYoho4_)*$|FM&z0}adU3cC|q;!LE4Oo7>Zx$85PdIV7>+2n`C$ew)syq8g8mR6ln z_Gh#IUF>eUixUmoq+!#4VJr}7N&Yu$|G(K~@+(n23=;Ay(ILbl|2Qmv6&t@f&;Jg$ zk}PRSX#sPQzpzBvAp`h8Pc3d_s{nf;#h&lAsXu^T6>nj$^K%Q*jFym|7||UR`mZy9)RuZ5Snx3nX32sM$k=y z)#3zR=iYF8oRB$lKFkRVHg$5sfsF1d(cPvPjysZ16#4*#Syu-G2|*+xlu|wf+ZXYzHIWAnF1Kel+32}@m&7!mdcQeGHl=-kl`Go$qo_W zD#J!1kPM&8BIXfAZ1tZ}Xg69;b zEsLa}%>DPE?86voK72v_bD9kx}qGW?GhPHcvai8T#*cthZZn!f{TS+?m!ecpmOm1_fD=-sPk=cxxBJyG*S_;T( zTKeppi-ENN~7&Ba4G{OaFiMzS(fGo;b^|)pg1Q6ct!jYh z9T3`Z$B-^XZk{<_X_`b(xOMQprCN{!4h^rRn@zx%kwR^QWlo8n6N2W^a0F)bz%Fq~? z53c@v-N87;X{V41JHvepXAm0)Aj(GS$4jlPihoiu(^u{1rPkry0z71ctH)@Z@vzR= z%~7>4vXP-MIY3O|lc5e`?dA{oyh63TifX&O7Gm+rm`BcCi|?wor<(BKO|{*~ujU0h z>#oHYyX*7S-o;4=A*!ZM?_yON{#g=1zgv?E{|KtIG(a)H8E*#QY;_fU1)*xb)?J+F zfs@S@kAV$ml51xMX}p?d_EcoY)^CLOPV(^x4bQ-CiwU?p=nBOl*jKdeRXZlOMh2%u z+erLCo~7E+zdMo;N4)!JoV7MF`ll~-mG&h<+}Hb1(lv1iMp<_p5jT?*1_x}<9I9Z` zw^4Wn0ftBy6XQfAFI8!rW7t?7_etLCf&7WK4$5kn?91etmqKfs1^)$lDd4{lxmZUG z8sil-KE=KtBNvbGI4eBQ#J@R(xl!C4ZMtRp$&3MGGL=R#Al5i0T|qnY<>^*0FiJ`3 za^ui+rLljyS_~M2{ERwNnYxR<0&@(i@5TwS-w$(9$JvCL+6^p!V?vyf( zvkY#q5l`ZQsV@@41@hEHTS2Q5XRLh1Mug!8Q?aR&!v&RL7HW)BhNo+>G6n zqD^Wd!Yn7WjbO92KF19^eGdKwFNiwhJb5Lp>-TCzwemyV>?cS{oQzYP4|Q{Rq1xBA zk*~2E@;F@^8N2y==J0H0_CxY{7*;1;%vH*TE|^ZWWPqo@IM{RE#27zN7$+izw&cF! zw@Ryl$BN1@-=f7m*t|`eP~~5trss2+VPl|Z!qoG?LTRHnw^n7IMjQGU)m4T9 zAeLc|_y(&9JUru)kcz|NE2{DwYh@@BCb4OlHld~r>9VX8OH-#r3VUd%&NkF^<7>$p z$yQDmoS%Ek&(AQ^jwp6S9%f38w49&l4UWG15tfC1*pfUkhpYT^gRuc9vRJPkf>XE( zcGSZbHdyEzY}&n5O0QXZO~V1@1r05{NV77bFY#^9%9b)^y;xN;NXv)xHxK6TI zWe7!Z7gp3A5R95w4=@(<)j3V9oG8O)P3#q?Mrt(MC)l)LHce7uHuS*8iHr?g(*wDm zB#qM>O0B5WbkVX+6+LRz50C#-kLv%ufx`cy)_HqEu2k395{u29Bl}|{ zcPxw1g?(nALu6iP zuqfh>Aran4_;1fKDIUXi;1??X{U!R=;J>>>50~77OEe!U{F`eumJV-=w)#Y*g8$;J zoY*bP)l3a=t-t=5w$Ekf|KfGoW3ekg`3wFTf6I^Of9cW#AUs7Gl=pi!j4v<#p6s;l3Fdi>Ci4N>Q7-mj8@6)=fVu;cx)fB&jD66sfK%cA>aIFhadgp3w zvBhzo>mGUqDRnl;@)~h_L5MCy=u}{@Dt1*GQQ1pbY-@y~YLag({wlxP;1Sb*YfhT( z&am_^3H|%GxmcX;3Yg_BN``nJ(N%$gYiJaDcUaq4KN)?ifo{ZPdGAN>3V=$z3t{i1 zzF=gT+n08Khin*{)s*Y^glN7M|pPVkMaY=+xi=&`rAWaU1|I^1I6w*?Zd^X3eOUlWiNKO z=lw*woZvR*HOWU?JKF}KCtg25I5iN5Tg~w}I&TikGY7h3v-61aV5mQZmECb?Q|e1) zs@Y#bLbbiGgFffEcdja^AT_0yl!sCoYJh?~)M3?ZPac>EpYX`P{Qe?#d#>8iLtT=q z(AqpusTIYoN^&&_2!rv~vgzi0vsvX-)X+H2~h$+swmXvbi`$hKRj~GTZJ|4I+wh{3Fvxi!LwM*(w zNrXQ120Lu_KBQB4pH-#Z#j*|3P_86DqGo5wab0X9;TV7fS}QTxsUh#6kc*1^?7)k1~nQ- zZyc~m1w|L&r_63_#`wCK=4ggl#Yw0ss)+*ad}SD(#nMH5d`!o^sp~=Zf=eB*OY{D?5(A?TP~)Dt5SY2Ik3Lx;(0Am+Wr^0#i; zyU1p|scdZ)lS&cGsnYyVnVN#^LJf1EGBu?NuEpV|`fIpG{t3%7oJ3ZoS78zu5E$yX|Upwdi7Z97(5a@6aW#>*q6 z|KjW1|KsTlAId}ZInVGUMqgTAH8aQ>VWL@MNY542J6+J#y^C+))eq;J$Qb24To(~J zB+pXKnti0bs)i;$$KnL4#^jT)Qp8Z=*J4Z?8>_ibLm1aq+DR1n=?CGSyA)J)j!y^;> zh}AByinJ|ajRtZORWjAmRQd)C2^DzNH-TGa_yjXALVBKKu?n}mKV7Nmx-iq~GU*nK zHxIgsv$sJ_`iw19hDBtZg?PYa}m1NEFtv@>PXcZNv4yU|}U$5IVx2`rC+4tIIW} zAN$rs*meqCLt^qsKcm8w9*ittAB}szV57_!A~(ebadF$L_VI_18oWFIdK56aNw&eJ z^DV2;32>!@YDJD`VOq}WMi`9<)q*@}6jrjtYE-~l*pTJ3S5SxIvkafZ`238IY@eX6 zgHJnr{PCHFH8-gI+lcQte7?nJQF&buzAxZ&0H1s1b@4gigRb=`F9p64AL_Bjrx!kZ zP(F#z6?`7x^FQ7&{ts7>{V}H3>(lVqF*Nxw-y{`EC+!dm0DVN8eOe;;FPnraxsMWV)qFi{n8Nc+n1~mF`)Cp~dOP4%cx=}GsaLJ=rs#O&`hC*- zXj#^jT2u|6wkvl0%QSc zIa;}otL_oP9q@=JpvkTIN$Xs24}=_rFv?M>VrC4lX=_JN1*G#-_OvUzCv*oyR<-isnVf z%Q5GoJPX!NR?#Z5$Cg{aKR>?%Va$A=iZ%1y;;={}7yh%TN3P*M5c6wCj>HA*L@IqiY-VS{O6PaQ}tbT)5ZuLh{K3)uyd(}#5^!teS(L|#@Dx<%qEzEYu3Uw>ux)%dpdpbaF`qfUF0L5+y zlGa$o)_190e_D8Q zQEDRdwOM_CH_PRBv-~yDm`ZM(kWdAqP;xIG_(!YyTdd;NKr-7bZd-1lqs2negYD|< zEq21n>XMaGtz@a^VcOIBOgbDO9;%wFljAL>cJNqVL0bzA_wdX~JA*@_d4cyuRiBHT zIQnOWgIE(Lp%xGy0f68c(~LW8FY>^>?3?^ipI$Ke>*lgZ(v$?A(*9$OZpMY!^?OC)cb`z{T!l)}Ixu%h0JrSmv2yeGzC> z%^d5a;^msBRGUs)=l*J)DK}c@G{2yKCZB4LOGA}@A*Q+S1^=BMl1Zl2_A*-+ zcpshWDCRZK5Dm{meUYuM(C#DZ|g1?{{r3oi>J& zEY*1;OIs(zlp?PxpxhpD0CKcZQlK4GT#GE!%Ui#j zH2XmjurF5r&IY|Jwwv}$xcazKHi4?|1sm#E^= zV(ZM_GW5HRunT{aM95~0qw2mtI0RvRW}0R(ic)lsU+^@pE@Y%>K0ys)c!c0-uIM;k zhB3@X6;$*U_I1DyF|vIDRQ{!+G*X#CvKY(zn>IN9b!E+eoAwK)NEZyYKf3b{deWo$ zAxt2gJF3~SDnUrY=6klPl$i|nJiG*?flQC!tL70^`WjGDY!M--rY{EC50h+Ys3~Qi zy&y6vU^t_iy%6<9DFBj9cx05Op@oM8uWS=00bZ5JLNPy0!}l}L1)(@5b+;xR$h(=l zrM186l3gP;__z}zG&Q4u{EYe5UeLNhlO{FU?4hd?bjU^^rY!+%p|eXX(OUW@ zmnb*{uzF@-GQfb~%rGmwnZbF|6T=lHUc|!+`4c{C=y@?CmHTeGjcRdDro4M|@T3RG z@F?_Ibds}(lRmqlp*ZA8aqiPf;*s2uyClRhxbEOW?kZE#iPy7dH{6Rzmz9kDY}B< zYh~q~5Q_M-wm14ctt=H46RVduW9i>&^5jk{<6k|R*eKUzlX|s_rr}=LF1Y)q=B8ph zVq1`5_lpxUPN!b$lDaJH@jq$PHngE9K!7Mk zql;Rl({9Dt8q^j_S_L7cGzF2uchjz`d>KLlIBQ!>i-cp8-N$au?=Ih6{OT@#72T$k z3ITNrY&yJb)6L7N!HK#7PDlRl&vTMCy>QXF@AiBBcC%?r}0Kcu~4AI@ihTY*Th*_XLdT%M?V;ipUTimGKIW+acRY4xJVuy<#(xn|%+r z72+y;V6|O;7@0Gb=-ygB%j$y0*Dq6wnE6m2HHw0lUS@9_2g$VdBy%`psT!EqXgsrp z;jpoVXYD{Tz5ve#c?k4>HpH%#y^y_4#y?udU(#q?(Lnzv0EOdK!IX!i%+$_0BdP=h zqLo`P<@efmUbki+lwQd=Zk;8k4Ns@Gj%=B}kFdOI!-ZD&@05=GvgA*4E6jF<`^lz?ce zcVA@YJKxGRttF{hEe1E?_Q+Z+A=YBFP-_Wa3x)Haooku1PwM;hY)mQ<+!Xt^tOdwc zd3;;MR(WOKmQGqqO!93}uAZZ`dprGblPkaP&9>M3a=B6@Li47LgXp1-KJjSie5-KF zS&ZWT)A@q~s9H7ValY2Ij*@}Z8_mutp~TYHDdlOl4k{C6i9@If#uD-tC$1c}gyYl_ zj@GZWOEp#L0$Ie&r_PjRob}>Fp+S9u6c5me;>?8I4|&3pvjN`LCQSD;F3`_3_+s_r{mE?6dg7RY*riL7TRWUbdb zW3!wh>0>0>PclIzKIh8(Afmqi41ny$gREUV5`-fdlf4Zl`Wwv(NwZLASwgd!-eNE< zCy5DJ7iS;lM+rwq5hE)%PmZhVjTJu|I5{RJa_CI$CcUt~Gw{3}2W0$xGdU%N;5ayA zJYtof@k@~-yzXP_kk-0{0n#y@*SbytNDldJawcotWB9?g6BtFNY%AN9aOpciEgMa& zlENsLFyQPxzIt$a9XK6EW&K=+c@k8KTjZHiHl-&@rELM@r&pU4Qh`bD9`xI?!+E;j z+r71eNIzmsu)l9MNFrJ#^wD&#bg|w*sj79|D7~y@^J`sei3Aih^uq-#~2s*Dm^l0bE!Vo_vA`K zBNh5~ufpNZyLQTx(SUU8M=~${6Z&!KWIysR)r0V7p+#!m zE$^t3Z}pdm$@#QnY{+M4r#2+=*^CY8peHP8IU`o+i0vnvnW8qpXiOkkW_`e80i>q`1ZD<+_~DOI+ve zv^Xu+f~*4dFWZ)rn^#~TmHuazzMH@KtoOCFS@`I{=b}9p=bgVXKcC>blh6Do&Cjl< z=<72U=Q5s=GI@42pJ7U+4+=h*fe&WjgBkc>20oa9fAS1)XiG#QM^InsgeF^QUs>41 zNsk|;*Vgx7wN0oLw?17Fu}@dWE7mMsP}?JiF-4v>1>5L}1F!XghS@<8?-t`J$tHM?+88 zc2v5pX|Dq_-m-X6xpYM0L`2?)w(OB{+t#{})65aE3m#1$`)?KNMxyMrkKc$VCl%)s zhI50<7V}|@N z{nN#M1eGRyKOuc2^yQ0ZDB`QLdHmZ;;(mA)G#!4Y`6XgLoX!XOoOvbvr;!|_&aPhN zo<6u@>OMBF&Jm*}y_fORSB&xzF!16G2SsRVwYtX~Kd>owJ7e`aSW6szs$ev;i0)(? zv3ICfs|Eg8en&u`>(v`Qb@Kx1e@kiPbf=-$L53cPJXFl0eFlGk;)0Y{elWSlVKkM= zdbqLMO~nSQ9U(T@3E7Hg3{zS7WLS)g!B09cK<3Jv*mY#TvX6~bdmYFd0({$*EWs`& zQXX~bHhxM>v=2=9zC+{)ds|s5Q$vA1t}=G$J#Z z5gfId=T9Zl5Yv_sa|#KA%7CEaQ0lHtv*RBcWgKSUiTCEd^=KL&wAXHIa_{i7Y5nG=O%ipchTu`37LNmb zjPP8@j2Y9|V5~bGxSc6*yLd3*GSg1ukm{Rl$%ZC3)>W7YTQJ9)!FvvZhjnGyF?SEF}IZT(B~Zeh-C(tN>NkJ0Qfj0+^uOGU-l2;6e!z9vGsva9+GnkI>TgvCLvs6tv4OTE`s_$wP* zzBsxJSDp19k-MxHIe2uvL;$E*&UkB)ZmB6581I$Y5}(5@?&AgAZFMHc*D@-77T!O$ z>{%t*vx>53IkdZatTe695DRo{4AbIt38HS^n0mAu2(LzdqWUN|t|^tkM0L{t8zeGh z*9BaP4}{kJVXl&Eih{=J7qI8O$9VJswzq= zkPZOJEdj-h0Fa#hSNu_okB<`ovVOQj5Jg9I2uj^!I`t(gT<81P-yc5zPwj6il2y={ z{w+mPB-aoD;Y+_&q0v%tIm=RUIny(qj?1ZL`~*U78qb};2vYi+cOP<-aAFeE;b$1~ zvGv^g_2SolrWx*Ogm6o<&K7FZu3v(FN-V9sJmjjx;S-b~v1DC7KRa|g+G}%%>gz@S z6jz%K2up1>*^j4v+Vs^C6op9N+_kh=9JTg2c?PRq*{k59%$+L2eYIQZ<%H%;$5nMGK*j*uu|J2oJhQE9g@3bNB>|-qU8xO z+bE3|SKL`dH#*L2vsc{d=4wq*#horGaY>0&N<`5h1|DeKrHp21xLDB!? zGr&%=N8b8Gc)3Z$>lX~8l2E8Q1a5@{&fHmz=7upYJBj_IHZ5B!wTUG4knAD(w`52f z0|3?5%eKIbldG6xgTC%NR14+D)weuybaHvvY@6NAjGtNhUC8F4@iVW!ZE*Zd$BD+z z6dKX3UgE4zuJI<Gi7RQ?pF1X^vzA10^$DTL^8m`EZjy!Qy4q&YR|cpg`zS*n`%%2K%p9HqoP zVt}JMy0ZjbFwQmme^sEh$T*e$i~XPkXQ&rQi(V$0^qlBr_QWZyK0Ls6cC8^Fn0rEc`sKf|JnMogT`rDCvg(nlB?{=@sj!l zexhg-k@mB1IKB0%*U6A7tkZ8SbNQ|Kj8TfV~j zV{ct*Ja{tj#WqAMsC8|VQUXx~jW<5bk%~^co_M2Qu}P$>Sa^Nb&`6Z;Dy7np6*>0L$o^7U zvT~M;LTMjNr9R8eIin0W8uV*yq(->brsqN;7V9%fprzQyWN0+L&spKT2YA4e z@JR@fP;TdSc1!rY&g({5!ufI?GN%y$sWWcFJD8S%8qDLRRo+o5%N@BM@9DFEn(kZq zg>)+zOs?=Y7;}E8e67U=+@>E$gz>CNh&lZ-^+0pyXGUSAVGmbtoNmW}=Avm=xG*P1oY`1|ED zTXc_?eRbVXHea=?WA6 zj(AG>zF%#T9gDG$KCd)(y_n9q%C>@eYnee0dCqLUo*O=+U*qJS@0B$xWCm_GUkMRg zYr9=MiVt1uB|lwgMr#&FKAz#sSwleYe3p7-q~bibQ5g$?JhDw>0medF&x6!gZ=rB8INA8SmV!DHMaDh}L~X z)>KY=Mwo3^j>TAAROf^z5=EWLcL6?WeAK;1D$ClndA+{Jwb)JaJB~{Q7A;lD?Cs)Q zu@?^**16Ue`*d<(?#23s5W24klW}MnB0Uk9)l~9TM37$AR2)>0J&ON^&(LoAIs>Me zVJo;+#S+2W`zBethQ@)_YocS-2dj!~dYy|Pk<*KORqmBzDpt0H>~+R{*G{w~&IClK z=qtq#&8y!iZ>aO#C}Nn^c}DGj6j%~D#`B-SU<=SvbIcwXRc9<;+P~~G1t&ML=83Vi zQAm8>Mx*0mxec_dv0|R;RlY8Ohgds!7?szzjqEs*=ECLMxhgkNC|AneM>1=8)6Y4@ zb?6mY5($gqV`FHyewNOWDCaFLauZiP=iJm^7Tx^?U$*9zmnTU*Dx%ZA8)n6x^^x4LBPvkE!sCTjnj7apRVg z?AtBfAhuu(PtLkVJ&z=0<_gGh)h(vJJW^7DrCZx69m2`ED(K(pv3j0ZFtHiPfx-I} za?rYOl={mko>{3&1m+3B*6|XxK~;$ycChD}=OtwaJ8#IdgnimQm*?vZl~gR$v+CyQ zl`g4hPk30@Q}iC*?B0AR*=o`5+770SRuvh4oR(S~nsEmOoOk0lk^<)~SMz$U`T%r$ zsbz6!BB2XbxsBI8sexzZ>bq2h9A0-MACgUxWmJx?D$=v%>>4w0a-@&2)XAYmDkZ)| zz?i?$^wgc@(k~t1bc;MxdVJdX*eBTscmFSDAjN-(Ie~?-6{{`Ltpu?;r29*vRte!jemmpO zUju@3%TQ`KBJD+2Yct#Bd@6~qt%O4yQ?W&ef$*q!CF~lADj&$_@`%Q8~0$oIq(rS+24W2)kFOL@ix)>KTFzNFMQcWOs7 z3Cj|zmZD28*LQ5r-ac-RuW@R}hbZk`Gg+@G31)8>eb_XkdYViJre%v^8X}~}(dU*- z`CWbXuaNXj6*{u6-tbU|?jj5qTer&WeNzr>&Njw9OaLxvpNa_D=zyZgO%rlc=*DU7 zp>tly61QmLDg!}ya=4lAz`8IAvrN8(s5-bXLbXU87x{SqEDQ?DP;wVg+R`hW%$lNT zjjN>?W(GC}C@^|oNU~5hs(P6UT4Nz*Y3$% zqTRE>44$3al!~K0rRQCZiEhbC*ed`^T$u!1MI?{{*VaWX`~Qo`<8_AZt3tdDSDYUE zd0^1da=>h1+vbs4ShxQGC)q%xhW-4CTx2734Hm8vYeRr5Zu4>_T!$^zrK}(&Zu2|l zU9m8C?&Uhbg_1?^T_p9Jx$po=U7!Uhgx8cLpTr$fo{(kJP@Rw-=dU}0+q=Awm80l5^W^wmv8{G;yf7x5=_2fvd6oZhwh{YPgE8r*q zq|(U{s6Uh&&yzz@^c%$e&x_Br$WLI{Ma&~1US($0A`g;yDS0W;anI@WF|myPnY;QY zwq8xFN)W}2Z!623SVd@i2d0(q?PGq##2%*RS3c4|v5WfSA^*uXcvc5Z>PR7y7pJTq zKC^8|vW~uw37Sq>J-pw6{nGMjQxK9N8q{z7j%=-6;k+$bOS3Eq2{Piul`nhEIfSPO z6HRT5Fq|U+QUbj6eSBS^x*@RO(5Ft70#xR1}kUme?c&)7>)Es?f0R< zw?qTB<|u?>W>(CjcVGH@zm?~7(%aV}RBryz!_B^jwJ&TP)^*hg_3iWqRo_~lFYAU2 zVvb6z_4Miuc6C)Ni45Fiq)?7_WGq}c+c>*DwF6YV>n)N*@hHYrydkpRC0nSNp$kb? zs&AL+DiKq@4q^u>LP$LPJYr$M0fj70yX6UnO~*=DOPEb(9e<|Q1%o(|L{GwW^uMe{BWc5)VHhdO7EmrcF&a8xki+r-AaJXB*^6~ zNRc#Ib>UVatKx&nss?2lM#5v0j&${!T}M_UtZQ+!$`v_$R;V~~ctz+#E#X^|q9ys!WwCt)q=62H!tAe7xUxm=NgsKtFIX8oMIZfBjt9-pE_0 z3Y2Sew{=&|hYy;MhGcJe)S=y{RV^UKP;YzosHz33_E7;yp3lJlZt(w`gZ5S-p||Ah ziC4m@52qvGo1mfOV_f?~wYB=Ys-{Ba(J}AWjdWj~xB475_jMdVS}TG4cD-R@>YW@x zmx}1(GCEjLjcyN2xuokHNr4HhO3@_JoG*dDWSw-e|4O+~(xl zsC6Ef)sp!|0?Ljx$>3dUKjq86;cApl6Dw>#jZOV&xLTh+JLb5wUUzStF(2WoSlIv3tmQb6u%A zZ{i~4x2Pmf@50tj@TZK#rLSR*!7R+NlX$$Zn{#}CITj}=t?Q38uDCj{PTt&mXGo-I zA=$w`95UgPB)RQt2sG8LhwK@54QuFP2?-NOhHb{)Q>C*KE`{LK#3ghZ|1ln_V5i#L zPaE|WNpRA+l;3vnq3X{}2E2gwuaAaO}1M3BwKdALW1`T z;x#S-MB}MvrKWrFq9sj&v?ICJ2rlNn+_1;jWFu~I*kUwIRK1A$g?B*SYoZ5R`jPi> zlQO@iiV9>)tkxNlpGj6eoy& z{M0*d+?9lQc+DD^^g9%Hzk&LkBB7t0lb+^S@t7gAfI1H#=H=U2vAl#tFYTpz)6@Y< z!Ns(=Wr~8vM_*L7vR;-beH=*|J|Z=VsKPC=u*d&`gDi458NMKOylf49xaCw453DYV z`duv!^FW!vLVf2qwB{!=wCldvl-~cDttbo5QjPrBls=T1ZCtdIGc$B1kKcEtRP3PQ zJld;6&VXU2u}B&+Xor+D7vhloG3Ah4O4M>s+o>J7K1RHHqU;j#7d;_|m_y%=NJ&jv zJ;d;j%tDHkEl*}F!sD;TyRV_}ImtCaHXRDtpkF<_-$XWtK{g$j6B2|`CHuP=qJ8gV zu)`WV@B^@(xy7W`{7&-kp>Y*~S-~#_YubX65%kuBDl~4~Ob~c2Ed~7Q^&V0Q6 z^MU#3`0Kl#5A(eBmoO(~0@>pYlh!-agvOR<0KXJ8FEgPTk%jT(9z`BC^(p|~t&9Os zoFcMKJ@(4LV{6UFfNJBm^kW$da-2(9FM?zDlLGL&+0M2yj`c-05>YaNj% zEzvrt16%Z32ZkbJqSxAvdB#Wfd(wc0gMt`HiFM`2*9bA1{;j)?#s6X8}xlf z;C3ur=X+;I9&%z$y*D&Eo&~N<#;4ol3rFY;O`~ARo(X+YUxk}9w%WOP$3(NRT0v-2 zX+_K1?iT)BM0uWG{bIezW?X!_*z1HGL>uqF1OD>&7P%5UrtKHNqyLGNKMR=yAx7+@c^Tmmj6F+GdC=4<2y!09@rq4tBG!4{P-`U zKqdB|ap+A&YwTDr5ge^?KNH5X`n^)KIlf-Z%(M7iEWhLa67x$$T>L6Ee^r`a)$-M; zGWIeF`GmW<{x4bbl7T*@Ps~@>=IvN7VOEX=joi%PcDZ>wyj#Y+q@IZ+uhP06=Mko_ zO04vyQcRQ($N_9+&m_u*#T7{hRa$6IOptgYQfsut5y`$?@CISUb-%cX=LZ^$%GVY8 z=)3^|)B+`ddKFQ@Bbo6N0G%pppaHllHa`0Xv-^RAJ4J_1Ns~<1A0X*fM_v5NeM#M8VBD{ixBmDGhdaORZtB2 zU}7c)>Kf{yddeByRAV7~Ti=J$xJZ9Q_|k%h&45xT4qkO{q`>PdumAJFtH>PLFz_-3 zjV)J#2UwbFqwL6$B%xOyaMWbWhFSUNqmf&V1eeov6e_8P$#*~Ea7O)SF$!1IaE za^gU0mOpynpEt|*92j{MBhK_#+6MOV#jP2`?HVJXjSOXAUNZJ^_w5oO;#~v&m6J08 z{{h&)p@6S-KhM;18g)y+jk2wM3RMz9S>M=?DUu1&h#n>U+I9VyLejW{DW3Yei75^P z4CQHTG0zzLs=^jBK$Sc53W$HfF6H{;!!ZUhDE22M#+82-X}2JaXB5)#5M*X9_?D6e zDou+vwHdXqW#EjTGfhKr#*ZjtS9_=@m}SIWO=Dg@CD<3;0_^Mi`pWS*AeP7r@(WnA zbMzF8TgxGV#6p$QE0aw-4hH)5q|Ajl|6UfN5LU!5`~qx8x#Su}*esZ}&RG5DWAv06 zEK%A5;qXLhG|l&R+tvEt^#jP`)LAVN+bZd$C7`dD)vOO<2(nBOA`DSPa|OvT>8o>3 zMGI}0q#x(ys3`?Ak7_X77p09%oHO7P%G-Y^=Q<4(3x6kPo_;ZlH#LnG+^mO*7Jj;9 z$npJm-hhq*mLg5Wr2J9(O;#f#pS9JmrnafRe>|f9eMWskSyZRaN=aPUXv}?8O;e-c z|DDpEFA*L^(MpZRy3z7xTUw$wpwT`K0r|o04`$$foPlBdA#{21?@f-RpFgbC^Bxq= z6^sx>2D#Q5nk2f0PL%`45r=XU$`Ou8^!h{e4nyxAr|-x|6#wE5s?c(dVYD=-w+C8o zlyEa{k%Tltrmg>iLSEn+@x>od5gFp+Bz z*Kn&L+q6jES8=`@^W4z%5loxkyPud~wr9dCA~A8G5>rsuhVCD8naPg)=On=jL)ei8 zW??2f^68_HIUiP4U6Jp~JKi?2FkYg97f%zq=3F62gwRRj#&=FWDsFt9Tg*n^3shGG z5ggbsf~e@@85BbI>%28h5WOhZCPCyjWHVcH?tJb~nU6DllUQXfKQ(yk)kwo8q z`KTn3E0ZLe@*f!k?$S(>C}U>QB$2rSktBw+VUBk>z8j1qKTw{CDrB*cO96D^075ZR z`O@fgG4m|Jml+BK7MrrExPL@R$9b7EI-O)kF3cZ@&^+dLCl}ZnVGv4Ep6C@4;C325 zx6{3S2}570&^vrSHFo^kL`Y1+uCXrsl)p^Zcn=P@c@984RzppD9u zZB*P{Bg7VW_#`PdtH0|iROc@~(A>;aArZle$d&N#?Si+zo0~yqR zS1bC;uRf{zA3;qS2{atxYnq~~A-5=cGZsMi;` z)JPi9tsr`zK?G8Qm`^ier-1oivl5ZN+Uw9Ck32&xZeuNlsJtZqk)+~k+R1H)7w@9K z9^sh4wbs;D?YE<b;#qh&reKJjkWbI|i@J})z$@1Mit&8J{x zkLbWW4M9{}2R9O`;GR7QQi>aus>!#zEk8}gyL%7LaAx7hb2v+jN#q9t_>YYowrSm8 z=ZA#Mzv%*wzF%?_TTK0yvfyXNz*I$-i#kSGGzeLOZqU-2jRzXc(lqKz9-(siPL2O5I$>0|ycl;xk-AtkK;q`5Km2s2O|p z*A#LjNyo>*ev|5rAN&N3j46Q(&E%ye^jINK+Afl09$356KaBEljv>k_`P6nP7?(f_ zLU%CdB}7$eTD)PFL%ky1!^C||O!z!rbGI6|ImpTYjkIP549gbt#bR#tsJs}$!;DpP0d;DxCcT8_}YR!d}SR=Sz{?v>sY!K$8w%U-qDD}*UJZ!Bep^r#*Q z@y~xOwdJ%e*^)!WCDB!`fu5fLg#L4@$bKHG--aLV-aCXuzksNxm>C#*A=>nyi+ECM z_u7pf3e>i>XKvd@!}o@{ZPl(l`WQyy59~u3mr~oEQge^2Wg6(;@csOmJt_Q{LhEWj9~H%??1_qk`l^0= z0e8J|zS#(SByBJ760jf^pBw}Y`f}kYZWbd~^m~X{cFN5{)POdeXX?ZTTSO$r+i1>+ zEvB!Qm_87?VK=d%#~qNs!*{)APWR#_b_C`-plBtdZ3xKYrPMDm?%9tdN8GKj=$T?L zneIssS8lH3o=e}>AX?g@lsLE8*hpR98yyoN0}rnnBjl9OQYZn|(1*lHQg_N>{(2|9 zLE*8jSCa z8$L<8fydJNrUTjowv)QHt_72qwvFoCvUM>*w!(!tok!O=^vCoazBk&Q*8j|7XX=kN zZ%WlJl-lD{wL^|{ZR-A>C;r+|$ko^6Sh<>oThu${uf8?z_VZ$XSG2~h*QgLzhBsF< zgW&~~Zl0&0*|_)tNIKuD8UD%e4q~n{E({`Tf-GW(}rm%X_>!GsiIr%fLJt7NK7K^oNl#0Q^%=( zIFVPD?0h?GWkvdp=B^odU;iE$zGvjM=q?p|$?L{;zHMDOI%wRyjWd>w1!Q%;oxSqH zbj$ri=x zUmMtDz9-ZsGsRHHJ6#?%^J!)f&zN_dWWGO5JUb;VGE(rMaqw-y>Gosl9vqwYw zH}p3!n(n {QX062hW37&%;|-INE#hEd&LF0@KE%ZK>lK6!QTsdaDxvmvK|U4n2s zoAg?dTV$5Gn^b}xN3_dlAY4=#PTOMOyv%_pm$rW!X5t)dQBzZE2rCZrX`mk)& zZr(^yN4^jHMs0mN*L4K=-0-wK;ZT$gIL6&-lfOpK-LlO{dInnPf@uZDk-5dPF^}I$_0pEAQI}us2EM-7a4^zE>e^Xm@;D{H0P=Zqa2o0W$SK|c#6#E=tmJ)%HdSh z&`2Pq>uvft-&<|k?K>$ZX~FK*Hhs7LR(Dd8%wWo4U-w63QXQZNaIWqz*XK-&W=Ch) zs4z_`to)cSSRT&twNDF`V5b&7D;g}1woj{AKDDi=Bd20{>FV)8w|f#M*a&<_L>u#h9i4?0Ti)XIVQ|HNk8 zr4f;y3N^NkwybHLtK7J>P2W*nYP0(GwDk#KEs2%_hrQ`g97v3hLettz>?VzoV1bz9`{No(>l1l+j79oe~|`Xja~ zGjmm2Jfpknls_iceeZA)+24|Oh9jjWFI~poUQsU=A|AcVE6Wqq@Ah``O;L5KNF3;0 zlBZ@97npXcS2 z0*WKgNiJDeWT!Q17WVbN!{DTUEq@jahviIYc^WS*8UZgg43CgW(U1t4B^h|B5CDWl zSj2m;!gX}%3-X$l-qb_9QTPX`l&*1css>^Sw9 zleys#nNfsbQML&oYRoUwrf`PI$Inoh@b;||@o4lz{B4TPD97$SI%`^buJ``YTn)N< zOo%+8(`Z2PGH?iOkw6?QeMr`b<^PY=3*Y-m@xhbt#|)6pS%s7l?-JwF_rRQDOa)>J zBU4vvwrF8*19+&E(@D;f<@%rHG!Z;P=^e^aTkGD;&$N))bmzO_QxZ_?w8#+;GV3F! zg(gOhT!1M4NM&er2@Mub{sD5)jd=2Ok!g|-SnB4(*{HhVOwr_@!1r#%ldpGZh$p`*=erV5F6^E1 zy2vL#iexgj+!g(_m@7DquGbZ$tR$AY5>L8~+kTK1PcD|G5K+Qa9c({2`>BnNaj~ig zr=7GWyR*kbGaDRP(|u328AvQS5{pc6rFy26-`=#m(iB{l3>I9X7*0zrkEb0zu|1br zi?=%nzLG3ewAGzgk4i^xBTH)`%)2G#_!WrIQWu+}a;&(G%f3~}3GYfHqM0MmUMF-4 zPZ*%RGP%Kb$+xBD?QUU(pQfWo{giYp!vRsRSsI%wQI86mH^pjg>9|L>s5L!^kqo&` zXb>Zj67dkTbQzlp1n&XT$ z*{ZP2njbP&QWJ37ZH_a&{~qR1uvitYC4u_g95HRlXlWWQ6p zLaYd?y;6{E{;+vlcIwhp)n15Zn9JBAdnIHyySLnz*S1|)J!+HcMLn*^`x~gV_qVW5 zwUFE+^rm~=5$SShnqB~nel}6dN%>56N5aw+Ny?k>grM=Y$x6bi?+Y4_JueU05}H0K zX!N9hWR*SB(sZ7MkgToAddv%r{BI1}KbMWLe@@7TaMHm3;S`tLg*=uz$5REF8~tB& z%`&iB#AsOHZjeL?5~5w7B0AEsa)l=Iet=B{M=92~HO3r;&A)yQ#nP|;*gR#McJE<* zrYTMDx3}hzsrt;N2Ybkr`W>Ex16Mo+JL{xoY0uXivNadf<|C5@a$j$Tp)aNv#UF|{ z^ZOGq|5_gL@T3T6+{iuP+MP<7L8Jqr)5_CL@+<5#6*ROiaZ(FSdM`S2fr_aL&gm8( zgG0Y})n7XL zl8og;k2mAhgGTIK^cm|8>9yE^9Ie;k_U2L7=O@#rU5d6;r=H(Ztk; zgNFB66H_~}&5BQ#F>od-JNw!BQzbqMBlh^kJkY>zwCo)*0-~slE*yhugM}Hh_ zF4+p~u@!lJ%c%v}x?&}Fp+#$;LeZ4B>0*&y7Mo)=`Gx-c_R*44V}2`%fg6m+(UCM5 z|MgR+WoG0dXZD{Xy|xHpyR6|jI9K8id&J5{-h?RiE!~iYANazu)18sOTidco`5>vN zQ}{BKPgw+JQ&I_@aX-+ye$JpH*GrJRpK#Ubv)*SpkmC$&*>p#qGpNn%!J%oE23)-9>{sv+*#TclVUjcol zjrLduQ3^Tqw-GTn8c!f$J$cr+LEg`SP#opybig*p1PblDQ zIzsk3)r$M*t<219WvtnXOSOVsPr4NfAoHC^ZzTy|-rtu;*Qkk+*{sGAxxW>+YGu%r zcoH9x5ozX>+(#=~@pJtRMa+h#($H1jsi}ru5H7P%_DG@VPuoAm-DO^T%rEbQf#YwR z*UgdXp3a}ZJK7a{wJV;{iXVPMTliZ(EUs3}DY_7Pl)t}!LtB8E^nzdW`4ykvG;3G% zys3?;e20r|Twu0p*9+0c-l14=n_|TSF~3bzeY1@RHw`+UE*)X}oe&p$^1$|!m_ntQ z%31aM-+6}}yKkG)Z1-fwn8|j_VFP-#CC?BVbcoh{piNjsIp9cXgDu1=qzvH+^~Ryk z^;bo~aa4M8{DEhSTW;EpB$=clhcivW#vx8VKW2)P5BK50Du<$T zbH#jbQODf2+zK%Esv6Wfr5r|8+?@vi(emf+HCu+`r{yoDTDFU3C!MZDT7Kr{bjvx? za?^aH?e}u9Xx#_c2Qk~L!t8TU*BhVxQc4=8bxD9dcpd-zjs5`2*Dv(M9G8m}i8B=! ziF64QCnat*4|niG`Tqjh#2iBBoLo&$Hi*bzAJT?7`kdKid$qfmD!u2>`MY1F9CVev zZOX%$XX|t3N2~V`B4M`fpC2vSne@+=la80Qe>E{JCAh~Bv}F%N zkNOuRiHPTB^cdNVXWV~c!C**8!HeTIElUQNM9zbvCXyz|sK^VnyXZpMUb8#d^ZRTl znfKDIsf(k|&h~&Ml;52+GfY$;?gx()&yzBaJ38nM0O7yzO3CN3b7nE1Nz{p-KJEXH zGbNdmApLQa?b0U@lKE5;4nq=kuC$!n``K#9TtaOiahK^5OLB}uE8s*HnAV%`MJ!$y? z$4up6{?xwnrgo*}O>IFfQ-Vxv;ZBYcju;M`1-m1C*6@>5s(w;z@u=t*soCr&9n_!0 zpUleJm^px`rTj9;J2O4$B|ilkKc2Crw+oQ(B6A9zcz zW!YZj)LP>Ub7f7F?Pap2kL$lx{QA3E&*Lm+vv%Hdt843(qp$Dn_KRY395KgRu^`D; zP5BdWF#Vm_JhI5V6T9?qboyUr5NvWTq(_xaZczesjj6Kx{?PWDMTDdgjeu>t;PNyX zQe>2G$RtCSg#Il7Wn}PqH08gNM{XRw))A}m1Y$Ksd`1MYShm&uHjiA6$>D@)_ox$0YdZYh3`I~(MK03 zVF?yvxh8F#6)NalJJw1duN96&>A@bSun>+zJr-7rbP%Q4ZzN9E-ykefkAy`!D8Ww1 z-!R8)<$&?sClv=iPVs>88d+kCDVOVoaYp53bl$1ZU9?67s}5B!RRN_}L9jkxgh7tN zf!5fN)Yk`hkXjj!R+0-L6vR2)oJ6855=68BX%40?$C~)ELGwO_C?7Wtn)lSpkFv7w zPciY*1jUr5C)pm-*uyCwMyQ#DKZ92bznJ3HT*8Qzq91b%{8KK3x>p zcDgeb6prfr=Q#HG#)Pq1TfXy6?WJ96?(EG7cTD_6`SX;&z)|-yPN&an#m~N>UHN;u zJJ~}!E1B#o|G=-`ubjfwWG7|H&uvVR*Vw&ilrYh7Vov^YkZX;TJ@M0>iSxB$Sh9t` zHW{}^xSYI+o@m8#q6#mU6HpynINGDWuiVEe`xI|EL*7YqklfVz9dGP~liLago&JvM z%F9%GNp4Hg*Q2)g$O0E*# z^oob*NLFN<-M3S_xfiGTOl&SzHq(s%ym2rpuYIp9m+p zY(vp=;?P=T#(R#mPqVbm?jRg$xn*^Aq`kxv9>e_LQ?M70IeN)abRLb0vx9SUb`L&` zt{kya#EY>aIJIpI-U$BEmHE1#xa!foq~9yvV1r(n`T9p`O6YM>`AepEQh$8Xt0NVbuuG7jJ#J+sEKNd9igFK%vdSh0 ziG6h*&D(Kvp@^4i=T(_Sj%byzCRLPhxT#t=!@#0Y%SA1-$OSxtHQtMdrh>1*{#y&b zs0NVs-?|Ws2)Igg!9nAei&=f7FOstTG+k5pGHnkt*H#xaF1n!*Z|f&|WWQnFJ8XIf z!Iu0Gd6M*@NMO8Jgu+3id^&HL%M3a6eWEBkxXm6CnXNT(?!j#$v#qn~qYU@&)ET}F zk!zjt;>U*&0V$E|2$X<*keG8XI9Ds)*-s37-E4^CiW9>fF^K`}w|Ds4Z_=or)1 z^q78ScH&7vmD+iKRAc(}s%yD^mN9*b@87J(^_X!k=I_&M8X3rTK2P)cBLjj-Z(?u@ zw$t`bv#pJ0TRnQ=>M5q*%bD_GH7GZY^r=DhtYIb2`_<|t{N1^FA<}}a+1tKvRbiyV zA8ziha)vZPW_8A2Iu%Y&d@|1PAmIe9$Ey^PFW5aXx4&{$oe@t}zA$bD1T2X?dhUH@ zWa?V8K^TW`r|L{l*#%4=?s#RYLDGqs37!{+MzU{t4@y(^V1}J4N>eEqw!8k{FG$(5 zarB5`*2n6NNuVIE@XtG3Zxr$aM1v~{R$AgC!>P0c|NYf7!5}*$h@y5~S5R*>|61^o zEm0kLD=VBs_SD4avaR>aQbyjgk!e9MxZhmPI%lX5TD{JAqTK|Kv8fY312od&pOI|j zPRLN{s7b)-{D3jP$m3HYdb)l>YKwHk)CV9kNKEcsU=_oE(E9iR90bXFY$VB5>mw$wRx%FO1m0JoxlCWtkYNzk5!gz5LK5OeRH{7 z6bG?aob4?d@V`Rg8xU!@)=kj;p%(2IosdQQ#9FY+4+3V*$B@S$pWm=B&v%Do=^UuMsdG zi@a(HJrsG>O5!g5+@ILW^921%h6=uK4d*FASmF-CwtoMg1R%$0cG&**U6`@I&*ew| z{{EV|zo)amzf>jVfS2s<4Uen&Nt~@0{9Lv%r29g$z6j-Bc)hue3sc(|>RPb-2V1y* zRkjWBS6BIY1c-)xj4?i$^dTuILB%7~l``XbwRl77_uGp>^@Z&y5rg_E>~9wzPjW_y z@rykU5s?XY@Y@NVq;YeK2x7!3vA9lU*PaiK0Lx5O#){Ku!E3Dj4s86Y z`Ns6SvEZ6DAJ~Z;zKYNXb;jfD5%q8pnVj7`=9$-6hnDX8P5G!0QH|j$`p9j{?hE?? zPhxVN@eBD0?vl_#n}JCPvBvPC*%(Q7%Sh?$Y%P?ZTXgsZ0E>BUTJ*8oUwgdio&zOGcOf1Tu})Vv zimKJuRP)zt`Gu6LMrckXX4I5l9`$Ql>Q}k?Ri2pLUx(JrW{S*arkcNI%ddgf^hr<%ii_ahp z2-#7c61Q~l!V;xDVKe;B_FnDGx79n~9~&NX|EcwgC9_al-2 zA6-aj!?ImyG4yjdn;Q#$k5M1y5ZLlfChu4Crp~oF76c=u-3PB**tyo06>b%43H|l% zgKJml(?u4Vvk94Ke7dQ0o$faNcA7J8J0M$w`%89I9}wkh)8hDaVazP?>E-eTz)dfX zPgjnii+aQ3H!dI?&6ie=*6w**P}92CzCb0V=lzv-^I8EF>C`i8FHXJF(tEly`WaVz zx_dUJqH){4^!u6?@2K8qgYDye`NLi$-QCKgDq;|Qwy7Su=Sv&YOTV?=I;3OoKOl(z z6I;a9xY3`ZUkr|S<4T(oYbs8RRvCeE^d=8R2G6iDW6LX*?R?p;DZ49Xf6)?K_C-th z3|!X=2&*d*94j3O60(%){;A^4P5}9ijS8KT`(dWo_e#QMJJxo34^Du>@ZZgFAu&Br zW@05+bYD8rW2LkCLp{yD9CD`qNpLCR z%gW>mhw<7sg;bFHzNSpjZ5^}k1wa;y{^U*OmSA(;W57WQ)Q@K+RZM0}XH zNnb9WQ;hBXU#9*R>pCwg!hT3u!8*m-$0^I_5$TR6bYW{ja{N-$wNlOZ*3elg9*3B3 z4aOyl-9k=y^#f)kSSHFee_YtB?w`tihWBm;Au$UahW~o3jYNfmsx7Ojw-I(KAYrCV zrd&T9x>O&%_5}q1`E~uS6(_`WWqALI1xp6krGEBL%uy~P`>z_{pOyjxA)$zu$)v4? zIs&(pi&BZ%nkvB0$60axw9rJneRH!+-}|L-0NbE@A`e~F3kjtcYWG6oK6eS(xVN0< zBqO0VEhnVa8J`V~mxG5$oUX)pPBTR|d3mK!HR6Wn1-Y%|x~L)YH)}ho9#FwaB$i7$ zw@6Dlp)+8+k%txw@-U{;9Javou|Ikk8|P}1N~%trBZOGG`C=eIqBWO*rHZLl$#*ra zYqto->umFm%L$!{_)(=$Z6--#^M|%I`?iJ0(iM;IiEw@e*bUa6%1|{ZpsT&J1B45M zu*o_H!iHA?5WKMne(e;Zv1;AlgRW><3WhS~+^b+eI>X-gSqhQZdM!%tys_FlPG(i> zTE|G3o&ML+RX2f=ibJdDc(r7tsAda7P@ei#ld$ajf%+y8<~P5{c0?8`Yf{9=6*+QM zxP;7j?B^>xw@CKd9IgA$yg)TmZ(KV@j!%aQM5-QOjZ38~GFEvpq*b@UqVnoCESf`N z$$uKXn_NfQiZY&-*GWP_^|aI$8HQLu-|`bK#1`{bCQ6M{mWfweNE9xK?(2>E56Rof zBF)>%S?o&QSgmqXNkiB2JQa%rjr^^p`rWv3q$IsscfE89{Gyt|I6JP$P-sah2$ePl zDEswvi4N^dTqcPjgN5p4eNIjy8DZJMJ_4=dvfk(5ORC>pVYUzL6Fv!DD{IPR&z4WU z@$%msw1ur%*{d?BZ!wODUq~Yf5i6uoJEW1LV!300GRlQAa?)?d7xIBhp^aV*J9y7K z{FY%GTzhUgE_HN5TYi8#qI$~1OeRqRzv_SQUmqgJpG=9skbcdwvaNE#7AS4CN_3p5 z#-m>bfQX61tmy$PaW8Y~J!i-XbCLWBYpq!g#{a700*WKCBJ%ttWd}R&lbx6yzL=SJ z1&GzuC+3v{R2^7!vdYd}lSUgGqFMSG1JwKMhx@ z*$$P)1$ss(Bp1O;e;ig?TUVUDieO!~Y;Q}os(k9O%Db-}R9SM-ke2ZndL#661Lvhv zrM@UuHcKT?Sq;VoYQG4hjiJ)`O$@1QFL9jisdhQbc9q)B^~>cL-yv=GW2LsU$z@iy z%NN&X@08-P!%DzgW|`DE5ZPvn{LR_+)8u#y?drQ}&~>g~wbf(T2R*EB>oJ^zN_t*# zm%7d_I~Y@MRqZ9mZaCM7ajC2v-i-JboCq(Hmk1by~El{xJ!!$x0M?3 zS0HK_3Zs_6Vy2WHoOjHi-bkHc!}X3ER>w80Wc;v_3ByVzQnJOvQgXz2e22B!DzPD3 zyXfl*{|tw+esKGzU(hA{mS11~ac3|VeHo(QP+!mAa`iWQ{(Nfo8(?z@AN8pn1~-lZ zgE0Rwn-|#nx~yF_#tXZ$9bQr?I&m?K>=xa@89xWFqkYe@-2e5_>-K)+e@(+zWRGCI zcKyQ~se$D{) z`Sl7<;Ak|s$Fl#4$LXhTrhY;MR4sPh>uh=96!D309dT5<`2uB4VZt zAxl>J@s#a12Ua5uI|go~GRUc{{Xu@Qo}<93rIl)O1t8du$^By6%G#nJLuO&;f)Kmc>) zGOE`jSyQq_qGEzQ9T4>5Y^G`)`n`!fQ~JY62N5Z8&k}hlE4siDUExgG%Adgc4jq|V zKf&K=8PWf-)w*mM+=TTNwn+O_95DXQuu?3e${sf<%_64a8j%;QpC7w@A5IQLrQWLD z@-rUOFM5{W4HZ*wjg?5oY|K2Wd^_7->-(bIoKplhKR(6GnN^`OR1=Z*Qfqh>DayYs z4eGX=qPFwGpMZfF(7uge=5<24y#dm2KyVh%k$y@C7vno2<4Hk%ti33Kp<@x>gLhMM zPAPq~XtzoP^@Dz|HFTxkggEEe9Xuf|@<0cvo{n-fBr->Tq>ighRy_?W7mP3~$0wK* zV+W{Y5lk%V?QcId4@=&cNFGBW{k{DT8vg?w%!c#@S{E4Kys_VAGjvYt0zqO=2-}AS z06LeHfr?;``l|(dHb>`Fn(;x^P9B0dQ{55xmyqKtFjF0}>a^PjEyd@t- zZZXau?z(j4UxTEmNqZ>}?5|9~xxuLageFwRm%^DC3a_w<;Kw`Al@wYhPb)DX$W-4y z2mPwmzN&+llvt|P~{+`f9{ z!5++2a9$!JiHFT2F2`nS2j8}~LhaTcN%cPMrf*C6@3imivt~ad(hj-H96z<%u0N&n zy>1KClW*DBvoz(u70y#`PKlLKza%#)iZ=7$$EV|E}j-DGO0Jq4s{9=#jW$ukdBFr0M-eH1J>dG-ODTIlLMtgy5_}+dU;vQQC;*J9@*}E@O5AQ5yf{NAJ_VS{ zUci(qmmO>*Zny6mdk2)2>akvv-Yuz@ARB8ReXz!B3*|i^6jXwQqMZAoneyi}`BN0> zD7Loesqi(4%Ep1HO0|u$nu@;KpLMZ zPyP3RN7MUI#!L7Ju&7gCWAiPs-%vGtDr@YKx2@q(zTS3ca!yI20KIv8Hdo0x#nC19 zf%@rA9pk)J>(%%mUY(YstQuh@9pTAUl76m=sO^3AbzOy;PHubSAstD{iT+pMBn#J+MRatKkP$D@8{bdF1jBk?O9iu6uoqoyW| zUMPEVcgmi8i*>@V_~J){N7v?TfD(&oK_4A%I-I*^EaX>Km{dXTq~DWGGA{|6%p^&M zjT430^jgYyzdnl<_2|oG3p9x}f-`3OALiVWy*+ZB(-LzebVn@{}N+@M-#`9%$&3ae%8>P{JJG6)ctR zhUL*m;h^=B>U<>biX>otHvMLu=(!*5)Oz zbr{WIC8dgT;3g5ui=nI8389!ujGF?3Ua#Fd9le?~dF$XN@ky`n+qEtUPo>Xt#_F<} zg`E3;Aw1yDc8xjm zFMdYNv58n0_HMd)v(^#PsE_TTGz>< zc==mwu61KxP1n}&TT|Xz_c98UOGMGN{_jBX#;j@Qh3wO=)Vg2eS0*EU>M< ziVq9>+g@|Ku&4UN`qb~E8Q#X5Ivi3xJvby$$Untv}$eFa2 z806xeCLx5SotZw>Oxu028lQmjHQ|1ii5$9gO0nGHC2N`pCC``F8KH)8%0kz{4r;H+ zQR#zQ-xGf+ow<+BKnKeC*7rlMMQgN-i5fUbQUpQLU)qN}&XQtD`)=Uc>|i;}U3BWY zN+lDBj#i!QyGc?Dc!g9_Ib`+GE;7k-R>f+FoPLtsIKKVCUo#*SP`sm{!QMdJuS`JtIz1z+VT z7}D5&hMaGmoP&h-}maBw6%RjFTSA z68j>*DZ+&H@C$Wmsh|eOP1G-@2Ohm#yLT=M(0*%!>~OP4Od}K*16~V0t zTdAF>U-$fjr1o6*mKF1-@Wq`S<5q;r^}PEY;!u}($tQ*naWbbFT<5{NYwsf6J!c6fjAu#p(b_b%dNvQrr87))hD zY`MFEkO%}fw%6fONvO4^QkYB#Z=C4hEA$CcAPg+$Wif^iqB+X zp;}~IDZX-sGgU|xm%1@@*Zk{#%YIeFmYBLdhh<)UP|^VZoKQbv^5ATIP^{v#nQsxt zW)9BN#6$rtUqxBmudMM>K~*Xyw9l6Kj-A(G|94^Mby)sQ;*_YchLP|(%bwX$z1wEx zDsI~?Fi3@(@VJVKu%-g8a4!{xWqPE?;hWI5Wl0lhu1CZ`$DXUmej)oylw!1m$lQcO zz-TsmpU82F$L+zM$c2o{?F+iv#vwLqa;|o8W{6x6p_99}vBK{O7go&ihDR0j5Qh^x zyL!DzC=_KaL@2+|4D5nv%&Qm}92GXxo@9J3XN$QuWgi~LtdZeR60ZMkO}?(w!sI7- zN$dxBu7vJQqX_~iNUXnV;~elUVJG#!PC4v*O}qRMzJ|fD{R{Oe|LXTEQH+Qu9KKJxv|Ddwi9}@KYAf(9ajwk8Jq0mxQ12}}Sg<`jI=RMS z{IDe7Lh8)KB}By_sQqRE8)!A4 z-Jsv0z9og#cla%d2(k3J<;Uz{Hdl79@+d$ZH|}Pyfahl4!`jWC=VnJf$D31Ie-qc5 zGq<&}l{iSiVo-DXopKe>#&mf*d4vLw6fEVUR4yuwl{et%gZn8DHEZoV3A50wt=eZl zqXUcZ03}-~2}+So{R&_;N+c0%!#rYzBu1-ZDeqM^s2)%63U_}oUXtw+ywoGdA}41n zdqvE3L=xfB;|y%v9&!S%MKGT0!zOWcE-M_G@-~~&1=G)p)w4|-186{k5(7)37%_L@ab0Y=>a~Ip;CRK&ul3JNZtD1 z08*wu{Ja2Z{A@Km(*+{+-e|i!+63>wF>J!A-^07p;#>lN-?E;co8+ZUZb_)H+C_{p z!*MOx@&9A*T>zUb@BQ)I+NN#b4GLaL@My~s7CHbuGA?YOS1&I=?^ zwUpr7LeqyR+nJl}=4G36XFF$XPN_PvrO*}-MVzzBrl7mLHKKTfqC$S3@AJG#lhR^w zy6yb`$BpK_JnwV;KHuki|3X4`GNYU382XC^Cos`#+06!dmqF2hg}{iK{s-Su9V9d2 z`52TpzplpO5;n?$<^{IQ3hKibrT6$lLf5{5rfn;}!g_j?UEd+v1iEMvr>gTtYK~v= zBCJO!K&+MOH%K0!-&>~KgRiu|7wgcK@$MGX5ENf%i_N3F7If?$2e`3>YH=g-)u_#! z4buHzT()=bqsI6Qp}kKf-jnW(TfE!ky>KtsoBm1m5s)6qVxu-JWvdP8;gD%@p#E+U z8nfiQyEXpomic!Z*p9#n9W1;9CyY4rcSuEDffHu-u~gI-I049&igrPhhTR@GVesqN zTLrHD^{qHW?XXBRBaAJ!Dcl9df*Rpjd!p1(FtaCIK{pS;3jn_(DDWDmf|_>MO{3DF z9AdHK5VO-#-pUX&k!{AC6?fZoYMh`a<0Zd5&jaI;LR4l zr3z9;qLRoDg6qQYQ~(bt#=g+i$CMydsY$V%%eU-lTp!{S&=F_#W*;N20iB`<`<#`5 zn;Kg{zLut0e&qY}l-1at0e#=o!uL?H2w_mQE0)XTs9ovtl#%VSy=D%Ic$7bWZ4|ez zg~_jP9k+3@!pBQxTM%m7qU2O@wuSY~x|GXC28(4nEQ^G=gc(?FOW2}nnQ%koIwCs5 zx&`c65ub7B5u`aiIEHf|A4>LLQ}a9PbaU-kB?&g0HJNSG%{9+{RjaAF>Fc=4!5_SO z>svHl8z#vCm!~2-O%ZwIjxgXC=g}63PauzJdJ&M)`*qw1V1~pR2T#00gfLNPq`yz9>IJ5-7EOIh=LWJ-IfZ1VJ#j;Blt^R+ zDC?h_=x31|q$aXJXUYBVqKdTQIy9P|y}R0V_h!_(astBAP4INN-4k%9WH6rPxV7|& zX#l*?xiH!viMhk!_!cX61a7a?NKJ2`AWbCYi|KtGe?UH)Sqn*@cpSD!`0^nG*57VK z1hpL$L5-}u5VZckkmZYpPKM@?Al363S**Ny9q$K6L3Nm^Il#N@NVxIykNNm?!6=F5}E7$InjOcXY@_%liwonY{EX-!Mkk>RgHxi{85_ZVFGOG zG8JGwOUEKHNRMK@j%zbifIH|jl~*bjF*4Rusie*))Pab0v+%$}eBVt~P}XdvJ<4f`yb_#6oIIc>Z@R6&R3^3<+f)q;b=XT^XIRUxtR9vCVje zD(4V(K{u-6>l^0W?YmB$JIi%6cZ%|-CGm52#Fti4sq|dOp`ucGelDLmv`J$~Xz&X? zbpEfh&piVJ4`{5DftA96f~1H>ZcC6*qzsG6EjTR|NG{IGOqC4Ar1|FKf1Y#%xfM(S zR#3yPY5o*Rmac&&Ceh!?>*Wp*vw&$DW~=&B)1#_;Rn#deYjIg5=P5;B4LLl75WrR0 zyO7^^epfN;bK%SSXYrblm2ym|Ggnldg%2L*?_p2-KSuajbArHUAFqj(Pp z`e1v|`-5EcK!k}?qfK-mv3MhqB5X&3EcAJI~(b>q4KH@**AjE%eff6mxJ(lVoRcp1S2lG|e@;+4#49%Tj> zk{d)$ahjG6oNbk@S~LCoj{4ibs-OP~{uyN6NJf8)kgbro3kV4iffaj>NM+`(ah2dS zg}F26Lk-AdOGi0Eo0Mc}ake-|RUw&`jp9x%mwtW?f@1lyGtK@&RTBs8)vPtBQ$UQXe36=MXZyG zt`ZZ`rFe!=NC*8c9yQ=nz=1`svq2XDnGF`gwQucsR^kj8Js;KaOm$TGShsU&<$>t%iNaNE5++W&9z27Qi#*_^Xo+oU@;mSg|Y+{7B6K zdcVl#QrJh*f}`>~hLz)ly@}SP^PA;%19{K9V_5aBeCktQPK$Q7&VQbK>ZEUGOTKn? zf!04!K6T1xYsuHmF3=(B!KsK(YRT8nF3|f@xXPJyD@|>6DgJS@Zn3T%wNxE3x0v9a zh15A%l^0r+3rg`)*Efu-Csve!c*#OOk3X3yfpd;bHm?2&D8jV*d;?jh*gVPsw1qd? zTk_ifrl-u0YaGgZ-#8WFmrmtxxRiHVRjDFTR0lyy_QzYLv?8i-+y=&wGYg=e0IA6L z!EQCOB_>)1=C;X-MrtIlf0&*5k>lDw8{Ol2F|(rnrF7C7vQ17}(YYLA zT$OoJ({B3WfOK~addSw~f(k$W%B0=rbjxoUR*pi7$Yj5TR^Y(fuUV1U(;>?{5fLR2{YIA zb+sm6Tkl@X$WsLCz0cta0l^?V!$m^*??uZ?P0;3ZmW;&IR`%9rgl4j@dj>>>4MM{1 zRgck1AacHZP4|G+Dv#EI<+u8}d&^M~)Prm6#Aq!;@^(ypU@ai?sMNR(bKhHvXP+PM z{@<5_&j4nhpYPlwKH+q40@xwQY)_lkT&B#g5+M{!$`30zK0v?$QfmBGTgFnL@1O0t zX40|auN5ojpdj|z7Fbsx0(j1fQ<24{t?{&131;o){Ij=!5fql2XiT})7YWB z(HQsi67?y%IPkb$J(}o%_~ZI&bd&xC@b6Om8+^2%{gmc|NUhUI9$+OQDV7z3?<<3c z-27QEF68D)iHF>TP89NZxVDL~*;3_h9(yrGs!XDQ&1eg{_@L=6mm5Z@w=(7Bv0PHax|H zsd=^-30tzd+&sRD@^mIwSW}(HUqJ}mlBM8xM0t9?qeesA?$9n&&$tmDG-fc*qKzNRk@A4G~)&ep~QczF1iU zdJwVZAu;%-pbQCz0sY+lHqal%UNHD4<0r@9UjW_y!7@?$sPY1?Fk@jmf9cD@%l%E! zmz}u6OD-kmp$se#@-?nOjX;Xl-sjPElt1z{5X+>-0e#>gOSTm#pt`un+jHE(Y2cN{ z@I*>r+LVh@wc5o>b>BE*rZUkG2pUjJQ}JT4^6=8=fI?J1x%p#?Y?M9q6xx-xEg%>A z{`#fBTGXG))>5)Oi`vE?P!cZqiVkg11#~+1(HO{Iq(Uh`8x%T{hy3EBgwh0&7(~L- zmK4O($Z_qJ?paR_PSxZl!*lVEa&L^@(YaDU?||6pGT`(^;|kPm}30!Y|A4`Bg)#+GD9TVBBT zzH9F~6XGf4gqvqUS=TTXSqr8@hGxLQPx0C^mHGfjFq}aNUrzFUdWG6DS!X=gBEsXn zn?XAc=|~e977$Ag40>91(<-w+Sw`#>UuwDX?Gb!?mPb}W-d4hec}vkZl=4%lwN$D? zxk;3&AQ|@2VqS`qlh#3azaclpzwrzCZ4>k}bT-(t4_0EcTEV*_og=Qe;25eDoEKzn zB+^4#l>hp%kzm;gkit4-5u2&?>Da}`cIbQtmbu=2YzN#Em|;D>;W9EZV3f8|TIkUU z(42;>iLf&&7MsPF7R3}{saES%vOkJ~vziWa9m)D=5zcBt%lX(b%vwtk5>$n0nQRoYb zu!qU>CvBf|g5=!wqS9cAHB_TjUR}vu`V24_fti2}^=o2gmVo~bp)vgpq<=hUY;X~L zNB!x5+faTA^iL>IVs(2U1Nhk*>MQbj7}>2b0#y?v+sd)`vb;)G9;Bo|de)``{zYtI z4f$}3bR<53joG^%-Jpf|6>g+$*O^&I!WzaM@f|qgH=q<9@$ymZT%2;W zcli%1`*)aE$2-yz-#yeDP#7~MBwpP`Qv5!lVe^%rQ>;}F?%zzov{O2C`cqXl%pe; zAHDQ-_}r%5^`qBeL_Q=0j>s=W_)}P>hW@g>V$5&6Xk#(+cgB4pBgA>-Xid)0=g z@`fj%X4a?HO<(>n1e)*hn!U1zutSuIECOUwU{y*Xm z>-6QY=hOH4E^IM!N#mrLq;V9N->Bk7k~V%QdKrMK{@IMqE5MSklQwc+dkF4`{-(H2 zd6P$KBH2pO1)S~%@~V&rMf=~Ybem3)d-889G^rZ;SYbZf?XG#y#DW-_H8s0 z%ZuDbajfmiZIfc2MIF%CEr3^{-|5;fHR`d8;2Q>;4l%)zoM!%kJMIHkW*3KAzLS~u zvupMn!qZv4BYHg!hk(D*)kWCdiA)n^4wl9i<5ZM3{R~S4<18Es6z~~+GmES&T;%UF zFD~;amrvt#D+&KPRB3;eD(#z48E9elq!i z7Dn1g`2MM|l<>&75`;fY7XVB= z7LTz?4d8(@7m<{Lb+B*f9A+Os|N5=``xmi(pZ>Xj{Z@$eEAL;wcP3%|VC;co)OQuu z?_9Pw;}iDB>V)-^LRVw`l*d36=11hWwEl2(*@(|UKD@C}>h=p*wtuz#y0ZNS&Kq9h zsWmCT&I2HTJ2OK2H;qn8BD%0m;g_lFDj-H5=bkAz*AOK4Fb*W2H3h&mA;b%-H7Yab z0vI{^G%||=6y+EYI0sgZ;HYZd@mJ*+G{;{-YlBHA@fm0)q2eZgr(mgYS_zt?Lek-G z5!Ifc;y(#Y{te=JsQzLMAyw|o1yoi=EgI$z;tV=0_a{nhu3B^j8~8!LG%iz4?9nhM zj4wzfk`I(e$Z!Z@+aZGBDOcdPRHD3u}uLA~AtU@{6xcFYuk zr>mP_RjH%X)75?Ups9UTJPtD%3%77!9w&_Ae51hs2{0r(heyW)4D$_Kiys_CSv3aT z3Vb|n=o^@axa8ALyusV6VeXp-v{yLH_Ru%VCumgTKMY>~t<3EkQ2(3bhBY3@>q%^3 zhYYZsONX-~igEKeO{maF(6N+^Qq2eg%&i_{p1XL!Rt<ieVAF9TV}~0xS;IV@A91dPe5h`SF6@wIJ4m9fXrWLced3R)9%823-DBEd=lHkF zfye-g22P%R}yMp=Rv$-A^j!;AQfm?E+S zGgH7l@<^lk%Vc#1VQd)-7F0r1EL%-pqj3h(uzS7%M7E{32I3BB+Xfqxyr2@UJcmnwyKQAD{vyw3H z3wK2O?5+K|N?`gpt#0S`|D)W_E_c?4SfMU=4u%X1{QRCIhor?TDDQ6;k(QcNGeC z-*e_DXMb%6NmKNdQd2Lw$>wr~vK}2DlAyjiDrNMd6iFEmtE5!75X4B0SKvkVf!t9( zKlC-LW`N~@h{dXkrOd)UpTi9*R%eJ(?i5rlbbH{A{#te zghqVLpHi0Y%au%!goGMlVNar>1q9Bq@C8GHYt(M=RRYz^4)Ue*h)4#PDGwjx#EM5*AT;hnGcVZR!XAJG zE)ON{kMgM3y%57+8{Hsxs2im1RRJ(PurzA?8Xn?Me3A_B*$2=33eF+q58aYH7XsW# z(&G|9TW}S#*As8yPbn?|DfRl?rUSPlh;DeC^mwxLcr(3{9#0`l4P0e(H|-9Ur$|LF z5+a4X23gR;lh~`Fd0J^|04-@+^dtg4k@3p^(_=Lv$l)YdHUfU#|BcoE*s_VNaAe@{j_@4l*J& z6+Sh1jd?;;lMH-q=`?6bC1TdBwjKjAHTXy2OZYp!vw9Q-g|()=?T z*BzgU8I}-cu)WOpD5jBcSP_KxJ~zg0@_LlRqd{&7d0xC}zzPt?WKxZ(#UvYg_oM>? z6AhY&(a&fR=*ug-%C!*i5uNG*k|2Ww1Uti(25zp3>jFZs#M+V`h#YV52ANODo0TH< zl+)@*a$1!G?{Sc8I)K0hqng@Qj=$mSJVxl*GOx9!^ty&MdFS2g6>j`24$;2boqdWkX^wHH7jGLk#|kqYw>l2?k8<~CFKf=A3g3*0q+p@9vzFPUAee?L5d zy&oR?2)UZ66pOT196(3Gky%I=34PY_UWhEY#H(D17*%m4dx>m>f+zr?*GwEnp>V#zY5m816)$V$tBAyzuyXmZn6F~u z3KA8{^-HA?#H-X!bO9Gvlq=J8Ts3z7=>E4~{A81T3TDGbHY({)lQ9Iaq8S4x6I=4p z8=4?I&6DrY0WrOOaE^iYdmsgWt0|my8U>$)b()BE8Yd`tzEFs7w_9B(AYlhAZYf+h zn=L24_*VucW}6Iuv9%K-@{YL zN0Cfs_*@WQQKszg=Dh;y;aLrdX(KSM6_ zjINP**Ou{(P<>a^)gGdEq{nv%vcL#SaT+BY-}HZm`gB!ViS+n;G>_piK)_Cq@|6+5 zzffBfIylPq0ohty;Z-wRw0S6;4|0i~gz2QRz|xcob9K4F)#F*F(PFsPP2(P1@SL|6_}&{Cz9yRd8a(x8s5CxJg= zBUa-r;n~C5miD$o`t#dc_MG3-#vcUUl<@4ZUe~VM(RRp?*3&$txMe)eX3HMTVpALN zC4fhCTa8T~?F=;tr0GxvY8gkpv@lu9v!^K25P665K7a8W>YrRA#z^!yNUS&BQqQ|} zV<9MRTb1YyWpHrFv?vWie}%&x!VMoH>;05JfHZ1QDpBZ1PIEm4CezgP?3re+vEN3T zlb_`ilClUFQ;u#SKH54>I5i*b|6CQcg6T`*I+Akb<^|%Yp96I4skJIgXFwEn6ulvN z*F|_(v*daZizzkVxoNt&x+_@=&uc;16?1PLH98n#bph}+UNyXu@`p>!=n&b5H4*z! z<6gllx#3pIHnFY$<#KwN_j9~VtGS84{C@vSH@&Q*r;ULbsnZ~|- zHqNE!o6-2BR$G(D-~2TGO&_|4H-EU1zG;bn^BTR;sc&wLf3s73v+UF~eB+IOLq>m* zVoOci2We(+&3(JD5}BBwO63SlZ>Tqj4JI{_!QFsTn=l;YVT~{KoG8`5N~)*0TKQ(o ze@*KuKGduFmpKLH!Cl=*g2K+J@TW$jh>_w;^(tRCkQXh<(8BYdA}YeG_%5dPFhr&G zgM}v;4({>I=*K(U^C&)l9(f{l@b<*3fAUuRLYhQZpZL09ubq^a{Nb-T$< z7A6=z7b`Uc4(kIawEnC>t`0%uwv#wj;~QVI^=pW>kmObN&Zokr)+9U*-$p?mf3cXG z*@Ds10_sGSGf*W_Rxr*+!uyhxa0wI=n)_gU2r21KqkKrO21r7Xc{^O=%$^-1A<2Zu z0g_*85!rgh50}_>mGCXvnWEzvT_85)w1f#H=?^9gq%c@g7paNz?hTUEh5B0a2p{~N z-O<6%?jQU`xyHf9{`|awWB>26{;@}EoQWDw8@u6qLyz6wKCH28PaFIFwlj_WUJ`H* zy6};jRzCK1UD2^8E_`IL!5^4AaPV6_{ezEInTaY-8+^)lhaSA=nPCk+a@yb@nslbY z-v_)o*x-S=f95dPP!?LRa+OPTuO6xl_PxJ zwpLtwl^!#Q!!BqPGFi|12q_I#KAo-ls}a_2qPpqRIp2mE+BP@-mY3I1&9JxHR*GA% z@}0Ok(+Ft|KgY$nN9mjfHd ziES!{d{yFHZz{W;yi^=8mfrz0*^5z>c$8(kqCAR2c&R|ij7rO+%un>=Ybi8`B@AZ* zGt#QW7@#yZLEppQoQvpPRDv@?Mqy|h9z{*;ek$681xENJdX^d~pJ-f969vH#JzIDu z8A?$N+jd54$Ru{chsR_kI-ayN<%rmF-UpmW7xvIu9TdOd;CUcxyreVb>=$^bD|wS= zQa6lw1QRo!x4Bp;jJ26XZEElsIYbp1^%9pBD%5V_!TD@uo(eEhnacZpplKAMA;IHO zuzIWzY?U)QQ9Q4e4m-}>^{_svnG{8;zbU+s@SFlkI`v&GMmS&1pPeQ(C7}d)IgesS zR~j6C+7cX`uV^t+p+BKga&o>9R#EQUrHi#$i+y>KS`4t{@@E&q}uQ$4mN*l?5 z5~Y!A7k`@2cRzW8TepC5y~!~jmln2XOUBVjd-UL`#*j%|C)p&Ic`KCHPJmd)98tKP zIVfo-mLex)$nYrt1(644%(e)R!Lpk4r=Xk047SX1%x^YiaE)h)zQjlluE{JNELg8n4&4Jx*_IPOC9A)W9fG<7S{LLMF|GvIcYPh#`_{72Dn17DXf=F{Q>ucwAmVvcg}T zBgCfN5Fq7fu?uqj&Zn>i$$NwQU2U)X2^2pNwmex+7tkO;h;8j9-z62LML2#L;9?R* zp9#44C5~dslta%%d!yps-{VEg`0Qisc@p}37k8WU10T1ow5U2@Q}yP4{cp>tVg${9 z9c=I2H=*PcL_w2ylJo7k%71)FlTQ*QE=&3fiew)QWo~89lZ8j_RH^YYJOZ@>1IwUk zJbO>5nyY3qz{U%-H&|SU!v44p zx#(Cdu0uwAT!$%YT!(SIS5!TES_F4VSGfM(u$`W2aZqLKrRULJ(~3(?RU~<$UL(Q* z8J-Yukx7c^^h4BX;4H}0tQlRTfD@fhLFaE|<5_z~2m1gSUMw^Kn>v3SeOuztH?>bO zDoO~2ix?HT0)2}Z6&V6`ix?GC1lmS8Vzd?=49c9k}Y2f4VCR*r#(Dd?DoZ%uOX2* zqI}?hiT+bcU!|>R8FX5>yv)K<{sH0lH-5{}2xPpJXK|jiZAjNfH^sHzq4l3fRxe)_ zWEnnz4lz_>ptI0cN(Zt{`R*&c$3vST3^{R-Evo*j4u+r~VB^oqMr7ZU(Xl{_7sb6q z<}R_YdG_^(VFjg;cWeAJVg@?Rvk>sIt4P@ATzG_Jn%oWqtQeW-*ma1uzX&v^@8Tip zO;s_0jOd^>=czsDLqwPe$rOJ>D1M;99fal%PbK`3=4(mUWe(hlkb^>OaV%_tMao}H zG=oq%vUx~B;!8uK&?q;EI!THM^y6TDjoNjvW9O(L?~Bd8kzVD+{WKGX-u=KjocQV8 zLHMVb#5hUJQx{HpQnTm#F7`=$_7=7ydpBZ4*B2l)UEgX@onRKLn^0jo>}5oS;Z$B* zHL{F|%2u)f1@}R<}hQ;G`PE@HaV96CB2R6C_MqBc1adIr6vc(Vnfen|9C#NbBGx5y`V2C8!fximrmlw zJN}Cz^0=xMAUq6_8H7;!59QB+tcPB< z*cIeGN$QaWn>iZRK3aGm3feX&(5du^HkC7W&Hey|H+K?qNOtO-f3%pOCKz^D@T9C0gf`w4B0gf4|QnH21+j1 zgB+S&C0x&_{8oG&T!R=3{olvIPaOCZLw1D8WJd+~KnPRGW=Y#h27u3G+GwvP5%}O0 z%9C&<20~Q?LL}eeAoKuTARjP52(op%hNYJI$0$dh=btPW=cvWBz!I&o^e<%>@C( z+EFA!Y14hUT9+o*!904yCR_*V>>A&iK;1Nruiq$~$AG#_&8VY1@dhV4`Cu?ww-Ie( zoO57E2SFRrtVh?aKS6)}Ad5 z8Msg(#tzL3uhmbvO$_9bCu!2#{UcgQXoI53L=~Uy&=ck%dc)zr6jOjKuQ-~FIIlkt zxTPDDaJ3OEkx>JA0zoIxNPO%LA0nmrQe>@GE;9^C<^iOQ*#|h)#@dgs&SAy5%&-|$ z%xEFco>gjuy|SB*mJexO@#Yc_4y&B+6D~Ea=wKd%ukqPgscl8D%!)f)1?SpWsin)! zRl#1L4tV)Ym6XVQ56GqHz_Y#b{vy9x|2k;VZYDzF6eZLA_Zl5o6q;HlUC3w*+Vqv4SEpGbgJ8U?OcD(M**} z*?R&odoVFedA1xvxYD*Fv$SmY9KeYb=`5L`MS$xLdbWUKpjMi^ zYMAZ$2(w*cD61$3ai+YOCLAk{t?-S3x&8SAK5uGUH-5k)9*8kmXn`rE_XR@fMrtR1 zFrVX^#*h6%6JWxcnUAl@VI{dC(`JM`?ewK>4k5NUt}y?|;&uQL=yCRAW39;vE<|<* z+FQU3xCrKKb}e$O)(00k;>n5AdL(vc0uJnbH(@i3;^!b(8LzU7vt(ynNww!|uyBId z1qE`Ss8FR=K#ynemp;mVu~JkS!;y&G)k20D2H* z!(m-&gkb<#@n>oQ3FW2=5xNI#g?~CQ*67+yC>s@7usOXU@WNe%JX=REIY5#U05bbp zTmmr5&LnFZO(M99NY?cF&xN$Bk2IDu)9H{Wb)|(VU_8fFRF*3zPM*X=Q&=ifQpNl1 zBaq))LWL9p&f&Vz=0{R_yC!raCEBq{jUQnPG5CNLTH6mH5jK1^zb`?t22&ll4NFar z;&p9Gx$?CJ%5Y-r?WE%K?4d$CsSDZniI@8z$_o_v%lC z^7UKfH}oNs4jaSPenQuN*wEgq`{0*YC%fw-__dH!Odm9CD|UTUe~gRhp&?}R(6I*c zT1F6(SyV(dZS!gHI7b`%x6luIr!{ny62Ah5s zpb3$O5q3G>0BC$+CMRXXdVK?e1e#ra^~hw*#ZBRH*h5gs0^fxUvrzP5QIznGe*)5x ztCpL}%j5Z)BcTrZs##I>kD};=)f)`oJ@QuKEcw0xL|1qWVvyB#Y$71QB~f`!(IC>y zf2vSN;Qxg&0uanjZ?EXSAV9D%-)zaZ*6Wt4lpW*HWy)OxVrXw%K54mwLlTSA& zi86S|k?{xD|8yF3n#gSkzEAE+55K_mKZtiinxWeuxWU73MIRlI4C7mXcA(R!fJNEzv@o6L zq$Iu)c^iBX)1iwAu1>H2aohk`CsD~~%*olj{_`9zpF&3!Enm0+R@!mz*VHao>hS!{Yw4_frdkM4Y~#AY@GCX)?%y=uGSR9=xo= zlaGlVwEfY+)|0j)`hi&mt7~wGZOQkO%1mPhNmLZoRP{VY2g_+ZwGgUsVdZH&wQ&fZ z`U~G*73^*KFTe>f!1E)H)|ICV=^*2+R4#p=CY1~6;!#+1QgyUR8sK3xP{PMQ?tAZy zAMc_S0l8a>AiRU&v?}cT*otKSmaj-22UX-b7C22T1x&Ywu4O`eEr0tBuO)}qfWRrtGk2!^(<27p7q|K4?y%7yeuom zj}RwP_b7)ibScSYi;QTG>znTOmp!HafQgQMXa z<*eArY^~7hRz~TdD?w(E&RbQM4Xw}>^#Mrm!30%F9!^1d^3RICg!gNMqkhX$*5Cw9 z?uj;XMPehv(#Z9jv-E5GSVLx)NW+NQ|8a%lpiLB8e*vFg4Pqb=Jm7r6A!B6jWr_Mf zwh-#C8<-YPCklBQgaqj!BzwUl{|8}2=gx(UfJ)VL73ZQV4KHjF#q#=#<)K)yv8y zpmmz66>Jv;4`KIr;}N^(S^7%>d4Bx|T)AHHU(N0(Q;eqFt#15CMeU&+jdB>mdU6@N z3y(qu;=M6ju>LsqoDe>>`EC>y1~<~j!EL-+I3R|KtdR6L<#+5*slvn-64Hgx_lHWg zv+ij_$yLcg{>#L7^Lq^J9^Ns2-({d{O=KheWFLw4z3OT5ol*xvdbz^m`4FihRTLzG zAZ&cuKo?He#$TaS{dwz*u5FLtYUN~@{Mf;1+p~{A^i`n+F9)g_6mIWaOdMW1DYG5k zQy4NQGnOMQw~=S%COL)FI02<7%(&Df;cETKG>B28CJN%3j`C8|duRkTTIDw0i{s?{ zj*ajt9wX0`)I_nl*~U-t*PGY^Sqf8f=O(f}4z0?8fBF#-^W}IC_=}5M(h(NRQQ=X} z<5zZEP3BiNvTquVOHnQ2<-0whLgbk|6~wc8$9%X_$dMZwriV&?=n1X50TBdNXh1e@ zdmf`^?alLQ+ZAJT;Ws*yN1)?o(PLkx^!Pjk&?%fiMuY8#jrwlfOpIPk;unx)w-k

f)^9#T+bs=ed5(VR0&8@qP}AV_7?r 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

;E<3-FVo&!qzQBcnwM*v7wF_&`mnRT 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 z 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�(YJRWX!iRj5TW|dA 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

U>OQ` zbmfiGN1SMxrZJK!&<<@wKJPo|=$vJuYt)aNIm_2t$}4NqKx)<&`nZ3kn6vOy;1Mxj zL3O?gQ4i)wqH@9dHh^gx1YT`ou2kIQH)9AB5V&&hgTkI7diQ#K>i=& z4zx~R#NFQ$z~j+URP@(y8M;J083X$1aR{>}=uGt=WcgBK*g#9P!Msckwg zG!+BakKm8MPJ?@3CwC!4Pz8{O0Z`nouzcT1${T_u);2Qv-e3V|0!E8OE^*pOn9Tb( zQMpG21RO84EtXq;MmJg@J@-%dxFJT^2U=*CsPB7Vr!^QML8+*{beW?nqhkC zlL$r)6uvYjub%%g-ly$}F)ZtDacss{`X@AeFSR%x!}p+iTOQfs_%VK>)Wf*ATO?Y# zu_5&?R-eT5RX+Gv}Q8UXs}cixZS@g7vHZW!e2p%X=f>={{WuJD%e-Qy4{ z4dX=tu}_e19MK}tJtZOqsx;ui*3*Col@IgrN0tld>Dh^zHGqkSBLL4ZJRzXQWl$jM zp-AGQ-AH0|lbbhV4Rq`_qg>F7eX5(}@>Z zUalc8d(H3)Um5?O-KPkBgom+P-Pm41=@D8o0U-pF)cZW8ozCTSf*4ndd>`TysIaNQ zrHY@r-KysDLB}!C9-U-0_(msLfp#sWD;+Kb#N*Im7OU0&pG|TP>7viuDFPRwSoEaL!5_ z4%F#LA3{2B|43mE=i25s!T>H0efXd$_exr*(!eEM(v|w4bTC+YP|8QvXWV0J&7i6_ zu`UG2S5Izu#h{k4AFEEe86qV~TFE*z18&81FpX zrFnJGwWkMvnh)#jc)nBT|GaW{Ho~#8LLGC%)DlqOmz6pgP7G^$>c6PGKP6g2_)^+N zHBGpQ7!z9za0P^+um#gN51q~yd#r+wypy&HY0)po96G`c>U~tQgsS83-+|2qWdUI) z2WDzfq%Z?pidAIL4MNM82oS9;hQGocDn`C$z)mVgMd#W{k=fa-kaU=yC^C^-7>*K9 z#u-3=P54Sh$Tg=STi&?fs@zn6qP!8Or}9y%$nPN+ynX{dh9x%8;=>+Ps@=;=7^^KkWl>ozM(3(<*3`iwU#bJJ5(pNN7vek$WMy)(A4Yr2}nd((nq7s;_h>}i)<30 zD^OE#S(`~4KU$xNN7Ntc0p{9_pSn;!gf)rsy?+6A0G(G#bRNR?klP@6&#=}e`uj)0 zuq9%C^&0wbZP&hl5F!PiU;Ehw6-5RAn;kC^1(ZRcJ%!%$*7}fdu~y6!wnaVKquohK ze04oUWn$K%_hUqnRsfy%p&ZB?K}@Re_9rHL6x`J&jR3)2UULs#@$n?JO;D%(sV#a+ zvq4bj#&=vzxX@M149LR=1*nNbvOl5q5nlXQ`5Hj*>bM!AqfrGE?F-FK1tLQPX+5_TEs(Os{Y(e z{M4SUy% zQO^`pIG4J-aRk5=--(}8Sq&w3vrcX)!F}*Z1rXr?Lz{Bu+oA~iJ%JSoOZzWJs<+AU zogzLbOy&SfRIULX3wn$=HcAAEiI=j2h1r8qny+0Fqcq832|dFUYF)wtGRx+;V{Dd> z-@jB$=NbEM7GA^r(UCDIL5L~|(SbyVCO=r1#qu3&5g}ikkRVCCyzoyd+Xpp(GeUXA z;kZK9Y`GAv^rWcga0K3UUOqKhW%S7A2UFTzm_?0Z{NGob*pJD!YeNwB`fi+FnM~S@ zrWc0l^q41Fi!6DQJB#gD>e?eK3kb`+Cs_PUdJMBA2MbH zV_8AAAZE1Q-+QPZDIOa{YDHxkAGS+nRMr09o}~6)V{T!DuMv={2Q4g$$~8(z-kNWB z?eOQ9d->aG@%%hiX2y36duVA!!o9D&w#>&rSfZ}X(gDb$j3y^X!#!XVNkkydxN;wF z*WQ^9yhF<~;MH>6iXu*21tP`aLoBRB)1-7;KnFtwSkz4CpO(>zMX zLF|YYcAz?W(@6nV_fX%{%1OeNTl;w*zh3LfRP33o0p0jK-lIce;28_43L$3VGtB;5 zav%T=wCU-HKJ*MlROH1M@o z=(RTOwV%>!;7h?_5|Q;ve4JiVi>Fbx^R*@LYQ zV_L&kve`CPVaLMSTpepi7`9Ctx0Yb@%2<;1$mN3#|{G7Q$yUMk5B&sC?ITAB7d$299RJdhVP4k_R&5V z8Wk4cFvv-WjU&!#pjZ*=SZyzj_~qPkqUv^kUfm`Aq%;Da0V}9n&~m644aB50pt_c+ z5{*xA&Jtr8Pt)~q+{B17T)lD&jTh3yqf1>S(`7{<(}VJ+$}BKY`;dB?@JenC3KNP^ z?HQN4vi;YA(M)jds{gyP1L?Jw$y@heMwinTvByo77pV)Xd^}Yf!VGy+M|dwm1I?2P z5SS;-;BpO6RJIGFs-h_akYJ$wM}}S(5_seT8BTX`8ijmcDcQqC_Z9{&wz^&@;rw`rEawZCya!NTJ)VB z_O#?0cJKsZ6*HV`G4?_^-GaFC;`#~`fxWDfR&P@Mvv8pxzmf8UcA1}?3=#fDibZ#^ zKdE*+sQUUf$3CWbM7ArZ3w^zV+#;qFGzpoXSfOx^ZA%Sb3*^SOEv$xyZFAmc3@Aal z3>p^^+$NuZm0PqwW0;6Ikho%&hM}x`?@dnHa5bIDPq@F#wl~(sYZm{A)_OFIXZlO$ zi({2%c#1$PzR5G-w;yG5E^L-0Qw%@?`6Du%TQj`fp;EhxQ3&YF|?XA%>?akP($;$+|@ZEIr1(@syG= zA;xYKMxShpZIMr>=S1Y%vBoJjUzX06@A4BeKd+7^6Z)0fv>m%WkxW8uSWR8rp1|7j z)gF@7q~8(bQo^$4Ma2(U4z{vY19oehWnP$M6P!=o5^ptEIQ8NW)Yb?1IAreN7%z*~ zp0ur!>3!R(gdSQ~4C0Uih%j^ZMY1PcohrK&>H@+XBN11dz7!B34JQIY$s5$>AAUvs zXXD_tN@Q7F^S8+x6hBZo$`4GEh5ZMQ9=DD85-|59=a(5xWuSkhzNx?#S)A(KDXdjY zj8#g)-n~>URzU$^DXG_u?__F0sf6^tmzW(x_dBNv+sQJYD3100E+b7J)$~ShtGN11 zwi=EnG&I3}af*mw?o7-eOWq8%5<**fr`9E7g*09+$bLq2n;amZ)xMRIp_~quJjgpC zkaBGbnNNHoO_VCfs8OH=QY2gi_~{`ZYu)D3UhF#|4^y0;^hd#J{R!b5E9>b}2~+K^Y;llI zO?;>fMR{5?n#|x#%E}TkWlE=$f{N^QQW_F#uan+_AJ4t1L4I=E@q=7J$nnSp6r%W` zQ<0m_?5WPJbge&?c@}?Amu?=d&K=IFsLpH8idW~wKPL+@0y3@ZUfw~bH_0|m>6b-* z7Ri(S+6*O8n-b&HTCM9Q$){v%zZIkbhvtpjN`cVT*ILu>coD|F~ijH!-cg8}@-cF)EVHZMHy!F=r`nZ=r{6K)TZ+Ks1SVi0-P=nyAH# zTBn4}{|JvZ=Mvr(9NVOEGj$48oDAO7B9hjBmdW~{#a_M^`K;CJQzQV|VrErZYWR7p zw&9C_)3G}$X}Ji-gX6i(acjG^Bx|Efa<*ELt!mDs1}QC7ncRxV(4MNSjLLp002-yU zqm@aAQca=Wl&o-!vprT~bpAMr5is8=HCl!jN%Wtblgy-Mrd_8*NBPN%Q+X^2Qi*x7 z%0c1ekd4w;taTN{Gg|Q&iJo2lFENTl+mn&f_RO1MUu5P8!LS-43Ln$xkzC!oTi>F) z^;+$-pj8I9YX;^`v$qDC&95U)Gip>^Ld%*8^;(&(5xQ~jE_oE^TjbEnYi{!ibW>$!$M zxoTg`^(?$8*K=z3*x#dF*xKsY4|DzMU1NXyxv#xD*Yg9eCm36OobWLOK8C=@5cn7Z zA4A|{2z(5I{{aXz!rA0CsfY_IZUeCt#KOgc*!>IoEo|36om_~we_311424@5T(WZ6%ND$f^jkJOgAB3atj+KYz~E!L_~Y}(dd?A$g@BJ(~m z3L~Q^y(-XhaG0b>7qaleCAD;9bvZ^|k#*8UB`0>THENx!E8J_b{1i1*0L%KIga9aP z4x7Iplt2iaaqV5LSFW|SolD6cBeft!QUL=F9ep#MiT%Ph+*#d+sa5*isq*h1o>`>()kSg zQ)-WR9YBs7buIXJ%MK3Z1Xs7Voz3lPfSbX1l_0Ajdm)bkbB_pz-xX;Y7ENJ}WEcGH zWsHlXlQ8g^z!wXKz75`LTNV`5G&Z$5BrgW-_!OAGeA~`vv~7X;AfbYdYl`)q$_*iB z4@$^c^r|p%qrJ+}C!xzx_|OsQgpUxL^uXUr7b5jaAXaG!#MTs)$$lo?4TRVtcP;=; zf`Ec1pCH!20()e2MfI#(>IJ2AHh)v~qi1%UulyH`XP(>Ny(5y(Wc-g2MBwbLzD8?; zp=K<9FaI%f0fRye|D>^jii2&vQW-7t8XMPe5rLAg2_FH=cTdXA9Xz7F4`` zON4oxXM0qQ({{#Wn+%&)vqyTFr-mw3Oy#1mdE^2$TKY4|VgLAEZuV|2-7DMn44PBI zRrdQ{uGRoXHhcJlM=U!TDkdI7B7>mBy3jP!e~Ap6FZRWv46Vz-SaC=T^{V*Ay#AyJ zIu@?Mm1C!`47s704Ax+1MjH{7iU6)mna709KLo4^E0ReiejObMt5Gr#x5_}!w&UeX zv0J9vB0j?bAu4X!WakVTv;Kg@WklhPnj|}AIU^;;z)&$!ej7!_J8B9$3%*!^nnE(C`u(ocKQ z1oISken};aP5u90-Vx77e==FRTj(7Tl_cVfaf53lkQY;4cr%Q4Ifvbo()eMX(n0W& z=s{zHoZZ-!57I(&3MFcRn9X|bR^qeB1mvSy*Q+2z#UZWhWx1jg*Shv`x2Q2exSya* zPeEasZDr=P!xHx?pCa-{0@k|Ppw`s}3^$%Nu31xljTjIFn_BLmh-ULI)oF~UVwse+ zih|a*D0LbZA)-r@MuGYAg-pY=lpA4E8f9f&PfL;nb97sxyg`uFKONmX%9~W~;?qPXYwo=V} z{jox+O6&R&zmSi@CbR#OBAIx{PFYcQ!_YzKHwVWEFF9FoYstxdABACS1}Co1+^{Ji)o)UW3+wHo77q2 z0Xa*&UCt5@nWvsDUpYg`4PNsfS149<6wVi5<39>#j5AJvGsBw?tQQEZqbrRII3eM+ z2)3E{o4xUS>)U!_f<~rkTW-JqllWsYO72d*Pey6JOTUS)E|xOt^rWM0r!1SLBOrjU zxy2WdP}R%sk_Nd4tKD{bVnxTgwqNtuxdmo}0mTg|=Ix`v){njnh5tb}su)>R=Aqu+ z{7!lWxfv96u7|v+?OCoOpI0>%lX~qB~9S=!++z>^I)b4-V?%?2~++Wq|@8-1qTz_}sGVQKkQxWvTZTzh0NuyuiCk_C2iHx_+-FXB> zS%-G}qdY;HG7kMl#x7o_5E;*RMykKENb6cmww`^JC7k#zca8SgTbnS0e`|@>Jy#NL z%1AV3^z75N3|d`rX+5;yyj}WBn&XIm)YY~Jul+OedY+ytI6C#j7Ag-|Y3fHm+9#F>BwhMjb`>Ph z*;6GJPua<;Vxy|KAA_eVW$@J1Df^Iq>q9=hk z{aQafF~Z>2@EJVa@n2M4!H{`yx3H}xe`#;*=8P*=V1s~-((-;{n0<~^g>XQGjMQYC zo=zG~nQ=mjv{`*Nny2-Ilr^I%v77DZMXw~zT32tR>=8^h*tZ-M|CfYwihlIGXlAVJ z!U!-bf%rM9hKIUGSoBxO9t-c~bl=m>yJ580bjs&XND*rv>8pJ%UG*!l%~i;&I(V7n z7x490UJ?0RrNr>{L?;7`mh=k+nlgEkjxImGfbw)c3K;$P`gEfD_|mbDRWrJ;gn>>s zSVRw219&HAr+6Y#{b$F%;pq$MOk*R1&(CpCUwuN#y3rJE%gq*Y!Q!1^*{4+;i2~-D zi|tq)=LEDZZGtq(sHrEr>JSDD9NBrtmeiIjMnu8 zjOvN-bf(}bgG8{lZ23%Ln{2t-PJNfF^&-`%h$ApOML$v)@##k{kIpDtkYSHb@iRCc zyB|l<7lxhPBOOzOCvIWBSbc(|Hr?HG9XYfuPj$T*nVhC+nfj4)qrZ>6eeTle^D77s zAx({K6Y7|u-7bcuf*FdsrBXNg#@1go+NtynuaARlBr7oVZ2=4j8w@S7P}cnEA;lEa z7AD#`(GECZkMg4$%=&t&rZmRo3O!={rr4`eNl~zA$~nEp$ENc-ID8Z^7kkHe)Hp8PuIU$e^+z0{V>j@w{tDw`LjRD^*q2|kiXyY z_XpAv{QVPuKjg2Uzvub8f_LZeO*wz_`RnCR>bQV4>rDQh<^Gt3?&F95l@L(ze%U8@ z;g~~+?1W!-hkKSW5z>5d7#!+DSxWsPxokqpqK*L=M(omE8_Nt?D0lt ze@`8>P;9qdp|0Ld=f+;@Aj>_3YI%cN+}i!mWZ%>GQg+TRo;*2k#Me5P$6XI)tbm@? zWoTP=_q{ZkcdvK;zN7a{8x@F6vPXZpqwnSHoL?-Ddj|a?QL{bdP+vIuUY?w@r^)zL z=PN4z-c1sm)7$s^?3_23#!Hr`b30e`8^1uFqiy+uQ$BgVYp*KV*Y`?x&ae9ZICWXv zm-EchnYc%Nk)^)KQf;B& zS(2H8ODQ;~^Oe|@`?b~PEBnjYr4;Jyd|9$DD}7G2#v|=>L-y-gG_v{g& zuZt5aM1|yyPKdjDb|{1&w80%DQxEUg&h$G$a-y|@-=~*%#z3cIz3)*6IEOYhWV~0n z=AWiENg@S|o>~5Qs)VeRMOR=3hl7{%xtMYtW-sFZ3zcS=5-0cu|#2uvf;s0jQJ z=Mc?6R3Q1Sfw0+MgIQNy%B+iR4idC+V&D(D-BRsCVuS>HdTB4}Fd}bzN9_4gw_oq` zR_thdv$S`4KT?pMn%g`q%o8dd+jdpWB4G8lUM|6wJ^YHG$^3M?l6<7t`84=WxT^T9 zXd=JpM(Q$XSs}l0%^U_!lJT6N*p~m$0g;0O@~*V@9UwG56!# zH||ha0tpiYFZJ!`-0?5Ej0R32XmILBCTh1f@Rcz=;hb8rOS=t|Zd;;q!Xq(Yk#N4t zuWhc4Vb_nfx*B@W#jAtVyJ0m^?KWG`)c@n24JMJRx#PCc4sLS;fM7Y=r1Vn15FwQ95)f`n$zQT2vsz1qtsSYN|CdR0AkBqja}F{t0J1 z0|;FZ&oQc;@oMOV27W z0Wv23YI9zB#b4TfveXz*^(`N8mdP0mA12Vd&^KdG-&?nZoar!dc)>tZdOt72Ambl^FF1_a1J+DJhoOU zpQdfq1KiwG@y5mp>pClT4Mmt-p+=m#|E?B#eNY#Z8?BquI+LWy-kdI`q{XiOQqEZX ze5y#C!~rA$TLy$7%8PCL4>D)0(`XJZ*FiH2)e-~0Oe7(Z+5gmv$aNwX5<6;@Zl_v*!c}ob+aH!yY?a|zKc`}=8k(ub?IH?^ zXT`V5b;Z)<{S{jk+;}5l?&OVJ<&C~QU!;+d$rvl0I^i(uhD#-<&NZ$(3DfbRm;or9 zl$YWNQcov#{%=T0+tY+(S$>v27!FyriNNoCLKXx37EcK%EElX~z3vhPjFE#ssjFwc zb8|h$E*vqEtKIo`q$lRPiuN^!!BcNylN&Xw&p1V$3pX-cYxLuxeD`ShMrvrWH^VgL zgv_mKDBR4WZ(cn*kH8!pqwd?7K5#=^lth~8n-|~sj^5{@nFZACF`Q-bY<*A=uTUzk z@U-;^60TS#sOBN^t#$nyfOC>h6n`lP>=cP=uf1CDmxf@UQG__WhUu;1k7f~nG>1TJ zr&t^SJIWISkUn3>w-xWU^|FrOX#4^BIsE`uPr`X9Mi>t+G`%$iE>6VS=pL-I*ii=R zU^G*-X1Qp_;|`RkHF7qxE4~p^5)0hp zK%mX&q?tx#L34qm?jkjI#NR$6_O`!$YV1h$ElXl=SKrdK+>#FT^G@6HBAah*;l9{Y z{^7F^1)RjDwh??WAcwr64$Mogb(#O?&TV_)p;d2Rn5orD^IIXrJUiU2uW zM;@w|Yv24Zr|gV%j{O#j9~db%ZQKsM<9hv=BX+F)7!48zB-dyxE)Nz*oe0}GJO}iT z9vqF(KUU`WJH`3RYEkPkmidiMVx8gV#G^M)z>mq`M_&Avno>c4lgFstYgu#jf?=G8 z)ztFmMv26H?TrE@&p=>`UBOpDf(7yHc%)M*DBp+O9_wG$~Mzu&?T=f;Z zq80k?WMlHuaI4L9|GTP;o}V2ySKKTQ&dREdS+VvhRl`#%=S4Hi0#k-vmDTH}kyIVg zFtflk;a@>6aQfQ*SUb*=^Ifv8$@1lEPOV;5VtR)`h9k&fXszBx^OZ|72!^r2%_H3{ z6W97ZBw=Y}wqy{-Z+(4pxM{GuUSV?JHrBhv1&j5amGSlUMuxG@3Nopwh%oUI&g((_ zdaaVTT6$)j)b!qxu{Tytt;-wDR%+3Adefi0AMpN$cNV>%_a39#XUzAgpy+fR(-n7* z|C-I!i@6!`H`t>%4{~CS~RAjn;>Z_1*>o9JgO+97WHo;>}e<1GB9!B-jWx z7KHXqeK4&-{}W4g$FH#R@!BFz{nNgqDfIfFO}FN|P#B+ah7oe<^L>8VPhhQTO9s4R zl^emikYm*sU8uH;DHL4VFaH0G?uBGD7AiL7?^qqREvN=$ukdMtL#pShR07;Vl!PAr zAz3*7RhE^_|Bu`^CpWq`L)XlF&P|3?ft7^#@s-!wHb@XTUu^D7w#>GO*3woz%R@_c zU7%W`-}f+I9~J8*wnk#4)|!kzCc^gQMj?XAT)4@63)2Ck+7IpPVYS$7NR<>@F`~=o z_UOeG0e3r_P`7?KI|`Hc^^kzqIeaQM1CeQ!S&=DC=9SA1B!kr4plbGjuz7>J)a1Su z4hzJTFzFBTJOoY$))Rm$caS@#nit1OCDY*wcVFBvv(xKagZ z51XqlRJ};o@dc-FmpWy!A3QmYBGPsNvOb$z7(ZLY*u>2rXN$5LMMln z1PK0yQvyCHc7OEw^aHEL&Qn?m-?8@5IcH+2BLpwo?uND)jje6uz*fL|+iN^>vS*S}gWitgrXlC21MjcUX*|QMEHsWUUR=QW40{E0vVX<+IR8b@Qz_?um3(Sif zI5T*p&ma9v>}3Z6W)%lmtJwkJDk%S_f2XMSsh8I+j!YWqb4Fc>Ph<||2nB^_4Vz#4 zCuP4&sXcXzH&rGwxozU3n8Y)Kd53Canf73GzkImlWHSI9=9vymTL)9Q(h^) z0^DlhZx!=@Cf5c0E#WT$EtVJ#W#zR6TKAWxQpPu|U>(pT*&j2o7au~R4{?Z`TV6dU zT3}S?wc6uf%wyH4Y!aMZVurU1jm1EkLmT)9QG&wbY5o8Y&E^XafPv6P+Xb+2|b>Bczv-#+6 zkq94VCQt;n?^;(#mMOd@qS^XgU!w*OQ_W|K=5VQpQsFR`shHL#VuAkpCh4e~SV9j; zd!y$;2*f39mX-N52^%GR9j-0N&$6gl0VUzV83g}_f2?3h6Ym^1-MCKM9+>4%Tx)mq z8PDOB6KgNB1KuD)ih^iPqRH-;J6;?LF4{J&DRxh?77yJ357yk zwtFDpWVLC}O9b4b_A{1(G2wR^)2j$kc92tA*T_K&+MT;72)yuU+gHp&w)$dwrP1L` zIA0@KB4tQDR8ncIDRd<-Yc?IMSm2CEbmU|sIbgBk&9>h`Y>K6n9@?U9ubYMU&L==w z`MTxd*|T7EhhaGf2rREYjuf`^k{U7}9!;6vvP-3WJDs9+KSc#>+ZVIMiRt>qFVf}` z=`A=QCD%$HDhjnb{9qWhdugw%g=*lmuB5D-wZ%rq8Y5av#86Nv)S3fHE-=4$P6oCH z16?Y{*QBl&IhEpWJ|tw=SGdSOtyX5D6&HuWE#TF+)C*p1_s`;uU?E5;S^9W4V?jC}(0*iakfJi#HYTkMaF&>RWz z@_o6jwUw&_HGGH={z6VGSgj21FKD(vREAK7vhQVQJmPYf?skNo6@SDyicziE#lYtG zynxH$(=rHJEj;DOyvZwRBR(L+!%PxP#G)=O_t(kj{$82!qX`k)ZU+Fiioy1EhCQ({w`WNh(avZ%rK%RkK#wbSWGyofuC~11 z9W65Ig?aN-aANU7OAh0!s4tFGTLPFr4`YbYYO zGU@V$3I*=t6Hb$a=ECNInu6JOW@4EHTBfv2Ri9hLHKQ z0*2K>rC_T&#OV0V`J_pl%vHugXhRo$YyBjT_2w+XtclotZEFX=OUy5mQQukLq=IU; z#K=f;f%!Jc;!{&>e(81VZjQP2ZOUvmSDqzqf9ADZQd3UfIY&A)yc~cmfGbtzJ#GA2 zy9jk7c&ly%30bcj4#3KXl3NWL@?RCcT=J9q_MB>C8ypu+0oz}v9Bb^b>gan zT1~(Hs@>Rk(`yVu3GmP3qfbRwFo{bfY7u8#X?f5e&EZRlYeYpND*k zn!*Q`_8M0e=r7rG`Xc3Oc_`I?BEtvKkNxDIcUV5$zl%7lCkut zh1UxuI}3-vFY*G|t`q>*NcJRuH!`w?&E`K}MQH~`i2iRbvI$vPX+C>_G`$#T7BVz9 zNM8xYAH+AOeKwFP)I@%4)gDJTN#N)?cG|MYTk%YrDWF8+RhWL?!{n2NN!APSMVXWK zR25Z1E$$*Yc~Q$s1&88gQmLD+6{c_svfxYc4vc#x^2B?gNsK@oSW9i9G;Es7~=GXAs4yzTdv6u=6p`?U)d-z+R>=T0HV{goNf z+?KDY2K~cz>g7 zKta5rFmi5cX$~!dUtx2__z3b&l|uMZm5?fI12UQDR>p0nEh0O|Ij!u%ZbfCoSVROm zbs~*iHC&+UkRX)v7vYM_x0DBv^h;zI{SCLm7=F%>r zILIvkAmTTNgPdR!yyvkY$c9c41fYKAqp=oe_nOI*9j`y|DXj}hlT89g<~@)f$(ld( zIv+pak9bDlx$KtT-_Ux2S9%(0-DT3$tuP#^J-PIh)4ht2CbC1HZrnJB9k^DWb&EV^ zW4L2PZu@iWmKnB4Gb^hMw)|73@jS=4PpKfV6N4$ zVDg585Srk%o{uZE9lpZ2MKVhyLmM)$?{^AfrXvKf4MRXj?#tGy++-BN*gX#_3=?c& z#^ecLs_8{>l?;ebmx^7IrrohtR=R7-6f}%wWm?w}7!Aqbhcj$?TH&Q}kh~=!Fe|!FH1pL z>;5{;C>H%t*cSqhhgk``Z(&{uLfq`Iwuxa=n)rtvHkN=h?h?vwi3YW<0=bHc~4g!<7Q6 zji<}_d56U)HV6(UBb}~h&JR&o6lyI+ah}K8EQ8G_#V`j?@GOXcnAUI+*g?*_OLH+3 zRD_4^Xc$7RA}Gj<2VG_X9|&au(Gu-;kP4@0;RF`6N-GM?KU)Q&it~>6Sypp`0Oibg z)ow&BFcGiF4ZZSBo;mQatlVz3{;)vS%`%=z?@WqzUDX&CXI;g1tZFtd|NT2j$)fKh zng(&DPi0!1Lu~1El!u4A?`N!z*5(dRsi@6scgJh<;?aDoXjQY;^*!*qXJL`lA3H(` zv_TfQ`C;=XrvV2TBqm``LlGYd=b+dFZS!7=wXjo>$WdrdP@wP*&sWqnS_3A72{EJQ zR#&X-rs&yJ5t&I9*YQ`#Uwvyw*!(#a0UKp+KlE>u%!>l1<$^V8kc2Oe%#}15t*xhK z$om#pG7z7?#ZttVC<1cui8rJqDY&3@QrI-eE1>+87&rE2NGl6lFAkfpsB}*{+p1Ky z3TfSJy0w_Ip?G;rBQG4+$l+Y|se;nqTV*MJ<~n?tr^%~ei!d3EqUhWVex8TcOcQU?-Q5 zA|hNGQYm=1lgB>u%sJSB;jAm5Uqfn)RBl)C7o?5r?qX6C7*u#zKf+Z%jSzX5kaDst zQNQ`k=C9tA5taCuMD?AdZ{JTbvf8A#=|Slxp)L4EhIS=?5&0gv|C38tn{ zF#>Njxs^R4L$948W9XF)>BVYo)HDgmpAIfM9Nu+|-4!8*0E2=oc6dZak?OEPL zhyvfLah~O{3eI~hG+#_JR|4wq~WfItHKM2HA+~Lqmk_3y0MUS=ZANm<7 z|69d*AGiBs2z(5Ik0CG$0ny94G2FUI89I0#n*r$y>jQ41UE-$5s*`){F~j1Bf2H=g z=IFcU(A#0-SJ+#0tDQk2^k9HD;zrN{H7dB9S`{8UUjDr6slVE z*X+@IQ1E{k>r{z{;2+a3i=XoXRcw~q?M4!!Jn zhHM`FIe2@uoANl0P`_7yUWE-Q?RES*x7YDp?k?@YCmlUI`i306`!m>P5oHO!*X=3o z&DecjpR)wXe*MsWRAKBp^rHT(?a&Lu8OFXxrA6fS82w0#d;>KFSJ@J+$wM!vn$~YM z&FFhXG9G$K8b_}^@7*@!T=}$3+Qm3~RohJM!B?eiuc@}tE@Wh0+D1vfvDO(oa-Pt- zM1=O3SK7HFRp)#KYH=8os4@A8Ym)#8c#+^8ZIO3;i+p3y@)3mL*w(-;mx z-+*QlsWtq@wrT2hN*$OpN7RA-|BKau*jvA$dBC7Iv?*>8J~-vbN!!7W5DM{w9m*%y z+4&NxXpKIT8?eBY$H1zW(^WYPr zfWEMA<5m1l+Ou<(XZ>YbVV^k%05K^jsNxrGv#H+GaZbgqb*EMQqT|dqXT`3KrA0SswFn?SZ5^8W1hlV8DwI0x3i| zd8yg>wy=!(7#Logc7zF>#L)Nyc{j}nCa0|him1_W?cx*hO0ph4Tu)T{jVvhREPP6^ zD?F_+xxty-Ba%aGF7Yq{p_9w|lL6OqG0i<56`5CN11&b9*Q*LsjoePt{P)Yuq+lCIQ@uqK2! zMvYF0NS3M^z#b3RbP42ksrh7meM0^e{-HjKb+84!!3aZ)0OeF;vXW1a^T!qI3(g3g zV~b8ywGK&`2wk}#+EC48$*wOZN$mQvQ3j&8&M4hYY=Eg1eH%Q<%Ub+|GzytLmU%fV z?{cFq@Bi36$}V{F19tp(s`6*^9YI&@5iCv#gm)#a%0PMw^%X1;Bcw>RzA4`polAjt zr~=Ea0#%zp=03Hn`y;KP%#a%4|P@WQ<~C{`K@oHwWQ~yw4`^A zrc6s|N!zTHL;FtaC6a<_^9gfed;`+<#j#sNF*pEFjb>sGDf=m}@kXM--jfx;8|z3B zj?2Qj0IEFWD046C(63J0J3L>Mh@v4d_8}LVb$5?rA!vP?3UJfgqrAEKo{Vglgud=OI0(9nrZGR>|`6r(-`hk)${;QbI%~2yzQ~IKew3vAmmiCIIt{&c_ z5Z0mqH38A>U>7)QhvzvwmyykjNErQ&vABy+lpJ5iFbKC{T4sB3oE4RI%W!rt-Z^u; zcic~vKeR{iC9l;lw(TS5DGNr1IG;~_;n^J>F1rB3D@x+LAh8c*@$^E-x|7D>Bk!P7 z*Bbib0k!DF12W&(Y{-$*?s&T^9+-o{_h6PZ?|tb=8b*BQH0qt({ER!Es0;g!n+D4H zO*Ty)$FG$ot2a@NRY?qKAog%m#w`4*6Z10@?mOcR9&PK>tK$t>4kVdeU1H-HaEf}^ zspE(mOay#`S+W|4P3WO>Rre)87CsPR^Zauasa8+vCcf`gy04n&m-*;HWjxvFD|$j^ zlt9tPQ7ICzC+!@!G!-n_@pO~%>%^Qp^#K>B5BYAHm-vEL&CleefZb;{Z&o@aVOc1} zYjAduD~^5h6HcsTi|AQTz=hqxX6Gr@M9%cJ?J@=>kmPZ|d*7B@FVp^o(g$Bi4t))4 zTW=w#W>n6m^l06`lL^^eW(?{tyNU*kCl9@F+U~P zGMA2&1BeanDSA_zZ+IV)-CO5dy&OZOwz%_+oSxAG{@4Z*^MKR+5QI0H?>r(M_YmV_ z76gKr*hD1s@yaVZ7uj79y0PVZvH=!tI7;bw%~r2bn+I5WoLQTllLLg6^|Wo4o*07> zROw~^M~vH|+9bJf@U6ryi7NJi3T6`OjV zq9ciS2a{{v=Bpl6eX3SrE!>070*T&(HGA8Pgu9?o`t32Ren3cN-U91u`?pDklZ3;T zsqKn&eDb?m_X4JB*nI3il?Yb$ zB5Cp&LGw?a5`i>&-y$cq+4Q6K2+Fl0w>$*&Cp;A!y=~8k^`2iGBd{3#{@JqTIm2c* zJ^^9#2YXQ{{6MItu-~sm=Hk!2%w?=EVCkQsXC1s%I|uNu8B6?n^;SMu=%o9Gs$9cT%Rgj6}uyGyV!&U&3RJnKfw+uUhT!mQfs|jPkF-Yozq#Lr*sIG zt0nO|p^Q-}?jE1AR$y-=aM9Ue;CC0m7$D*jFCS?H-Fq%a4Kp6RFGl|*al6H#Jo6L5 zWanU=Uwyj0gxXO;h*$ilu{Z~6!`Xv%H4u=bu~l9IxU)|ZGxYb$Ho}S-+Ge4xGPv=tzdGdWxOGj1oEa*R1N?(GMr0{?q6;-4$h2w8@Sd4FCg3`?1p zm@keZ3f+4g)xzyVbxMj}U|X9tC|2neoxAmPk$I)Rgi9(7MinOc>gjlSgT9(UXp+a>bEd-@~^Xed}DE zN2Jb;laH+-E#Wv>{FV=dt+^=)$9QaonsaKlD6tDWlP>AP9hFRV`p|Vgpn~edMAVkh zPt^lu$tWK2_tC&|_*Jd@)2w8`o;V;xC^>ZE?#uic-4~c(Bt&e!Glb`PWRjxC0$-^~ zPV?0Vl7qJOH?Fy!7%P#_l&;vsVtPg8g@nVoE|RJL(SFmxx<`e=I*vv&2?svB@F)8j zC|NIhvae?U29JLYu6D<5;Oc6-_jdf})p9az>E7WP+Ll`Kq;_%a1yZ{>7!P(MYJa|s zPTRJNjS(1-@MZxRpJOqWX^&52&xV1TA3gE~5dzAl0xV`kCibY^;%4V%b=u=s+vj29 z`XBfHmd3@Mm#x0nj0JitwJpEnM)Bt zHB`)*0>q-;mX=3ndV)>KU$DFh#Gj$Uxk5k*c`f6I$P|Jo`g?Cn{#D>?_r)?hTyX&a z-mF?z_xL7$o`;h(@q=KY)>XmBsb&rpbDtt`L-n%8z-1Vp;7p9bv*=+j5Bk{+e zykPRjvOb5*vdgT!h%S$6-D)zw>9Dv4^$oE1#8u|F`?jP?Vw6-27@7bD#_T>BS<%@q zL!$q}X70U64MeU*lSg;2LT#}f|KWtO0g*^KXAAIKg!r}8gN2Mpe9}oqL=b~K7GnJG zUD*CV+H%W(+L%0kf900_6@%-Qzs8h(qHM8*Yqz#oQw6bAo{%}=TWWiSEAUBR)W`-x zs8ZOtVx-RJiC!GrF6P>{=(&l26ISt#KBb(b;K|8A!3x}%C6mP9UO0c}|_IMYMhZ=6L~08>Yr|5{`Q2FYJ4P?n_RonX`=Fp*xXzOr2(>C1?u z0ydFI=@LC**r&{_Lek$zklCFFSLLG*HUh?Odw_mCvW*|Y!ZuMwUURTzO}M-ozdui_Jd=|iP7ZuXtR=r=3CNGPkb30q-aG; zJu-v7Wdh1nMN(QXIC-BM24Uy@Uk4ADTZ-`{K#3*F= z;g*P8zE^%7Rh;nYj8}rphJDg}2E`#NZpYeYo)AlrrJqVM>XjaDB z!#1);OFQ2caYS^o(O<0}KIN9PK$*hfpXl#SiTYZToS!_xNBwXE)gnVzFTWLQUqPJ4 zka=ZLRY@_iD{WCZRM&~en;TsGOY%>`L7*vaa1Y+LPv|xOV4@~Aj`Ap}*f8$_*pDa~ zJas);mE)cs^+gr0w`Z*u!1pKSomp{EvPz(IW1wiqXhuGI?@24l@NhaOQ#cwii?~Wc<;L+pl9% zK&!J2TNN|wh!s=|4oW2jtfW=s!KPj%&9jnPNOC+|x|_s_63@%}+M!NOkojfYzJMG> zI|w3Z-3_cL+VMUEdK`e*FCZ3V6y(qRM^of!;{*K37zmAZ83WiKbX_i;*sa}uG1qnO z&ZEhravn$lPoq1U93D=>D>pTVVQcFxxrlMN;*tfwMQWQBS6AbbE}pta+O9Vy#klKW zo<)`!gZCKwj8}`EI_)o|y%hs(bsetqNfJwR-Q4hCrUc@nDw{chUt`i{9$7h!X?JjA z^yTb`oX&^O^Wl!R+|dsw;Kk8&pL`1QT}ESMqw8d&aYbr7W2g#9bL@(%+lonLPSvo$s=vh=kAg8`=qqUw9dIdmnYVz zHk!Xr?mN7LnJNoIJ(#IpbC+t(v;|fvG;qrMwd%dWs$em${mI!9vUV)LXr-*V@diOe z1Y6{6DGABpk`2~59%~Q9K#zSh{;p93ee$*w~iODq?lO< z24bFQ2~NAQO5cj;StNM;SZWy)jH>I9EWvhKxHqZu8r2;1DtyChl!R%vyq12!AFcRr zXD8WTz~iU@W^R4IgTe5@Bt(<~xBE*n5Ju(EGIUhC~@!Dp}vf-e7M#_6FGvmc2pFiQ=m2wB{Od7Q2BlNmUAzTDQUp3XdVT z(YiAzxYqG%x(!oAK6QLM@@dC%s~yiV;;DAb{I4}5E+wHilV+$RDe{;D9i#}XqNVd3 z&lkOs_V<&MgPhY*=}Ua$HS>mX!dBf$g#;|x6}@8K@C*83M|5GzY~=czQ-%wX(v;aq zcr;~Z%50=|G==cBB7(TKpMmi?2vdhe!k`GZBm{^hDEMzjn(-6-xO@FTzR0eNC1he- z!JNk>CWSG-(zp<4oJNp5^k2PhjEb}ryx5-vBrXNrsATAHJ!8k$Z2sF-LLNMzW7#k& zu!1uB#~YlfE;Da>6D?O-1Ns|DuTRvu2J1wUB3}>aEb z+{G&#DhEYoP3%i5fV#uRzc?H?Ni-r}`-AKra)_Tmt&~H|%ArGwK?A{GRD@9EZQdqx zs6dgz_zI6>M4|!a9YpgaUXzu^Q%LYq{q3<=DQlf45nffRV4E1dVvqu1p-}Mal+>OAl|&V(i;b1Wy%Kla|h8HU^EQa7FfNt z9C~;Trk)qe)m%GS5KqL6c=+O8v;St<-blo2gpluHA9LJrf8>vJ#c6cLXdWv;?XH2U zY4&4Q7E9hDy~k^^!DGCjZABltN5+w(E}qQUC1<}()?cyXQ@En&x#h-=rTrs)#ah=l zDbm<+R{sM9(fS8m5g)AjWd5>+J=bpkd)^AuK3qT2Ul5r;vcnaDdG};1^VBKM0-^ws1!smZOaoZ**L#EJw>NbHI^)SL6c8eHrCt zjh4632_`3huF5;KPnC$sqI9G`BRXM4I*#VZj*Muw6ihm73p!{yFk=%y|E`#;4h=v)>&S5S;KWAuXLgguuwW zUlo0=Hf>&Ci`Zb^_YHo`Z@zi*vZO6{A6J8tb1)%^MfKUS z2!EH(5?Wx1Igb56;Hj2eud&1#GD-xKeci9MT@TBTVQ+J|MRr}SN%NxV2a*-P((c+p z6Wd%B2esR`amRapWAy6Gv(@`MzRh!oyubBp>OG|6=+R-3SBXe0P8>ImMp@e5{aVK> zZB()T*WE9+6;c^TG&F_Mh3%b9VXwAb+p)dk@bJHNzu2*ryd&#>h?$bBQ@F4gXB&)g z|F*inDBTRZ`8B>Yo;mb_FfPVZ%GAH&N$n1aEZs4&9Gul|lOBz(O~*pxuZ`|se}4kK z@E%Jq(tNjU+LN<|={~m1d#@vjd6kjePmW{X$rI-r=yT;W_>X6#^A;a3ju?^3dyBt2 z)ANXrA7h$VelN+B-?{nndwPNVo?pnXP^WuKtQ+sPlDZ7faE&o7IKan?`7th8!tb{H z-)8Xbb&_!UO8Gs16~79wlUl4hk1=VDbti`JzWbKYFfhtB%0QFh-Ze(pBxjK+P^r=`hhQo`NGZh21x!iPwqHDV32q{;BX0c?`Elodqc z_*p7+IWxs)ZW|t3?()MR?DtXA(1ro$Wo#)XDiw@V)I@~;9SNC7GDIhnPB_^hjccEN zV1e)-i<^}}Qjt;X1Nbhj`z0B>$Nqy~22vD0td=WfDXd#(lor)N@lJ zH%kbCSLY}G9W12zmkg!jS)*U$%V;uh__Ir654av_<7V3`evq+;f}Hn}T$|srnP)Qt z0a(iG;ox9h%IhJ-8oBgI@p>qLUM)?lBJ0x|`f)R9ft zu&lBFi)R-JeU~HJBW3!wUEqf;dZ8ZkgD=Sef7mt{D-+(7f02o$yI03I*YMb{ZQUH; zntnV6-p4;ES(M1Kqc_Fcm)N4~^~Y5;1A(x;ed6G4QodA?yiF>_5hi|{)M4D_=9h_C z-Eucp(LvKW1D%FSWYuJW7uB=%Y{Y~&CaX{OS4n?C`fVybdf>y@&I>%Si`_q%!Wz~7 zusX&3z0NPX>31?6Ilo9IvR8lG9yuH50s_`?h_F$!%LF5leUZ!ihA%uWe8r6{YJ{zD(o?y*1Z3$b8Cbm7^!7sAQm8s((^pxgxic;T(M0k6fTmk6-%e2Z|RPmmK2xp!W%I*7H@k_r6xqw z*>|W8s$<}n(M`fD6%cq^!eyMYs7Yir1^mqko4@{^>aUQ3{_$O2L97hd@`QUcdIqZO?-Gqz4wC0Awm?~dqf&y7sqo$hsnZA*OMSCc1QM|m zC<&WKpBMqWUiJkIvULuHeSsMw6hWkig%3kaNrU9iX6z)rU8ZPRfT zS&j=Jg>#TMbti9f7&jGS##Lzy*2Oc_s7WxVG8A-~vCD~M4fKjbO~FR<*XY}Z^9{Q~ zh|?JO;v18fjvM+$^X>IA8^r6!&lwDh336Me#t7ponb!omk~lXqV8$;C9AfxeNA#s> zrc=_M`=&Mvgj@;>}Egtr>ej z5I`UY@OllG3aOH(KO&Y=sI&EqWVB#Wa-G|}>UU~4L+~L#)y7nAe+z}ac9@#pF>2Qk z=K}A8#RVnuy0&FC$$tbAVmarl0%Iivl24!_##=9=Poa#0icN)t`QB8Bl-k&V-`@CD z?4!f44_gwao`W_X<1#E*^-W#~dTjfP0>o%*i-a3e;i7%P5WD_M&E#iboc2M_;Hpk- zsjrpbw-uH(b$o?;n?%H#3m%^2;3^p8!uUY613G3x6f1rxwxRnSWz!VPmwpyBr?_prII5mRxz zS+C8sp#n4xn!h|^?ZZ$_4X_FOK)#|1p7nXulVw$M+^)oeH#=F`&{$wE84q@Ouaf<9 zM#sl`EZ@u%4??`F{c<;gMjSRBUNp)=;qN(reYk*gd5*><%nY(`sXd!d1+p@?U zqItpAiRO6{KlY%IA`JaxCy++0kJQu@Z4BC)-?4AxU(3VXpessUcJh>*)^!_G)ZS7S zN8(WQ$}rIcTke+oGp&15?sKhszepvrxkoIQ-q21c?Y%GZ+XB3P2#uQ7CaDx*&y*?Q zUqS5@gx~)%ethyyGCrNF&{pEYG&VTLj-v2CE)fQQ&S^XWrOUeq758^v9vyoa`mSRG+z$>Xk8U#bK>sFxVn_cu`<_v5|z{%I<(?K|wbzNB%OI z4DJuIRp6_W&nMS=%qNk5+6_OxaZmsrlKZ!b&MG}=M&Zn-|0W!TRa6?AtiEE$ut(MW`Skv9{ zODah*j>a!3;3^@9J%@gCTJo&J`X3I*=jM~9AN@poZYeaNkOwipxX;hc@HyK)yL$EN zLx1dhE5q19NG-o($9DZCZy2{+|4L#fHqs z?GU1YwHI?=3iDKGg z2W{L_OYA<>=u^$WA5JclRqT@+(mw}T!HO3~1xwg))0oydLR@ZreK^?z7s`|c9KOw2 za>zn*bv!VOZg}xvL?ArdmEpHdz{~O~U)6A?vW^$h<%>56vvpd0x!b57%T(>F=xfVL z)Z2M&WG^*hT~t=FtNrp|%bWt?%D$5=GAp+Tu|#q&4ox|tyL#43m|D8KGGm>yGBbK^S;Hg(&FyAq5%9NW z1c~fel}91y28dh{ttR3?X2dxVn98Z4(M!rX_!&6SFjtjon6ZoGGl-3kEonwPP$+R} z1Nno2AQjpM1B>Ni^nDbAIBw8W~_5o{SQkRa->0(B$ba2!np6% zc<2g{#IcCAXJ$rKL_WBUol|ECnawjdD$c^2$`z@Tis-61kz^Tv*GtJ{^J!ZG5`*2B z+_GO%wmiUZFu6s9MT-Q*ic_Hfx&nRS2ekH~E@$i}oK6dqRcnl@m7v9B6iu>~QHx;o z4VLI1{+35`rXODIcomO2CKsZXwvzt-ezH;s$L1Q3-_3m!YLynXWl;1g#q1d?Jjb8b z{DGVqd?^XyaCXXhL6r=q8E>QQ{WcUMzcfi4e-1L?2<&RYAiBiXG-NJ*R+)~1+%@kC zB*Q5HHl?8UTepMrw${L68-bOBYKG8wn;2A`2#+la9#gJV@QAf*wg@r$_f{TG4*QKz zjXDMQqF8&jjp#XkZ)?UPU=iZD69n^|?=vwGSQ1=hR4G4m7lEGRoczMekl8!yaPr=k z-zvML6bRdE)S`b|vwR6TDS&mO{Hs4u$7`dXfFS&M3a@qr^7brW;VlVhx z_iky^Em{CC#sP}p!Pp*7_OB{w9OD09a%<7U-f}gf(e*tIQ{j&YfNx)y89S00Eh-BL zN$MT;2}yz`TO^6@2^stjU>qe%c1e+wmW(X+oi2`YPHs8CBkX9t;*S{JjpY;`nG`ag zn4YqukFH8j>!l&{PgByV4JjPlPXXzv3@Jz4f z2F#T+72+uK+K&p{3SPpRSPRGz2*JHRxN(rp+j2Kg3JZD4O4Lncab8T%<|Y zsCEjXpUXS~VqFjL4J=pM9_(1!GStJ{azz~@pHHf3C0_XE^owL_VU`v>O#*GfgWe`9 z7d0@I6er<{Z({eB+>plv+LsT`A7&v^3oq^nK{IovRX|efo+FL6X6zR(RH;Lv-Y8AR z+H-BuXnA|yhPB}nDv{#QzScrm-R3#77>IJm0K@8g}8VWX?j@9X%_frs(%%WW|fdiLX zpGaxvux=se68AgmE6l?I5%#ReUJ}UH7@jUQQhr5Yh1ic3RGNMz; z0#0HRwP)I+S>k81yr0?SWj2S*pPYR-$>r=KnJM0r@CL#^A?F-jx@A2ys{A@~+AEDt zp`+YJ=NO&B)`0c}B6Gr$$H}AO?A$?fSB?Ws59}th-zh;#lwfb15afM&uj*^`#%^W_ zK2_UVmG?kKWU7913;qtX-^Tb~--SbG)q5WsYqeLvkz20X2x)LOn$KURNW*BiMq6O@ z*FX9KWN;~8g@`w{NyDk4vrG&zh~e{FVh;5iF|m3W%}qQNwR4YkXdJ0m9IZ@l6%d)L z&sS&-hc*%|Y=ZYa-KfgXsVXq8^+eqSGQZSfE!mem#qR1iOBJ*IfjDkyuiDYZgaDkl zA-4MC9BrZXJhs7+XKjl=Go3-6V-jRzLTnRe!Xm}9Mk@s&dEeuooX#%tGY+Oqw&eh5 zSI2byNOJuYrnA$y^(eEDGkk0gYQ9|?-Ydn7%6tEAIa+1gqTAHKVOX-e>JUu(jEAit1;sakt97mxx|B7iB~o93c%r z#vnF|8tO*TeiTi@0U;x9F!4lizfgl>7>$)1^9XtML`d@z?|W>U}kiBZ|rS z3ax7*7Wp(WoraicKRC3)G2qZ8*IzTqvgBi>uZ3b?bc<&)XW*bOavBZZ$TW5*oUOTT zQu*~Qk@Aq)M^upEvyCdXvs%p(Vsr`(4^?zZMH{ls;AwDxndZD*0TJIddQnJGcquxPwO>#^-%1^8D;W%=sp^#(CyC(VMX7K(iyC)jJAoZI^ar z=^gp@4HtyX*{34aEbhhP>9+(OZCN~O`;=o|t}L;9+i*X&Byy_>^R`;w?^-<}kSD!F zyI7s)$9M5tEE<$QJRxjGi_`>WB=b1>RZiZ?Gdp=5GT&BH+pRvFK~t35Hs_o2GHm|i zDe@WdT_Y$+SVM8&*JYkIi`4L-ETJQjGb%opzj12v$NMEcxxUgInyM^0Eq7zJJLibL zJSFEg6Vyf{d}fU*ITfTPjSMGX&qtpi^fY!8JWU=VcUc7{>o+a7bxdx{k|QHGo)Ew9 z_!j5~EXCsv3My8I53^Xf=(?>5pyIfPtm6^CfC9l5uZrbWMIU$hB4!loT9f#kU0b+| zpk9TEs%(A#VHpkPy+1B7XoEa?^_Md^`4=oAI>iEsG$BXQl$~k$#~42w@379e+z4a# z@K3>}eS%H+jh=_JHiXmm7EzGA$p8{aA#ERfY&1Kp*I>V>wlZ<&y|ffcmzQui;7{O3 z>>!PEJdtn)9evWQO0z*~v2a%FT82A3V~GeTYzCaG%+L>Qi*yjy>ll0Qv!d?;!?yG&JFCtjvj0`DWAm~FRg;$}x*Sd0e;G;?- z>Ix*Bmx|1M{Zr!rIF!kFh6eD5tt|*kYz6u(0qBH5&+kl%14-1!P+Na#7%H66$q zljL~bcyfFZ+&f+^tF=X+5fBv()xzTyaa)-PxGJh#+MNZEn3gCbVoqyCaz`iRP(M1M zbxja2xVb(Esx9*WviBz7QI_Z8_e?TL1{in;86;|yfTIM78cEc|iFHC&A;5%?2?~M> zrqeW5gc(7BFmV#e@G^?6J=L$a)gIf^#nV$;%i>02kbu^T+8(iXaXVk%bVPA!*p&JI z?&qD!0=TrNU$5`_U*cuvU7q(@?&p5)=YH;W_6bgn^(M6)YVX4%(di{mt<3K!-{*J%Cx6*QM^Npe2O55_UUDFbIdISaJ z$Yp%oFLRsSYdi1UmDjWgO5e`o|8;+dx=xv>Q5#1AqJ{+A z(kb}|4%YHc(yW&9fh#&Os!}4#K}c*|!o?QS>roI|S<0F(m5+R6DsOvTlsI*XmEOb_ zL3N>@G>H3IH+(C}APICDdCf}eF4`#QtR_RL*72W|)T_O^NYBL5eH60#0(C%x_$n^{ ztVUzz14k12o%d0c?h~RKDs%Igt(IIBf3A8LRk{N|7g3aI*!bW>CFo`LPDZM0#UJv4 z{zTz!R#JNx%SJ+qcFrArV5d|N$_s2A{BqmCmnsS@@hJIHeU}PH>X_a|Wa`rRsUq2B zL`}WbW39HG)uYwGcJj(9!@A$XQ7-|A^4O$aWgkmsF(#uqZ}jg8@py9om4uWg(ZmKO zB=S^N*0(&w9&qb7)26`x*FugB1pX5c_$ymuQ`H$KW3{c6wKDwQ}1ao_J^VsQ4&uv13cySv^X5xP-qv z{%B)UbiJ@&z3YF@U+PKpt`{~}u8g<7dxW{Rfpz&7PGQvYSonect z%a?=3{OJ0mJeocP5I;Q;yI4cl_hr=AbV&YYLHMBx)+4ORbC0xo3`fSlA5C6bnG%u zEbsLj!8CQK(046?)}OkwDkGz_YAkjJW2jN7xE!Vv+UGk}4nk6m$D2EV*Xq7THaL59 z@Dx2*9-4{cDSutYPk*OaFiuP+w@o3uy}0vNG9PVs`5Dy zhL2cRW~f-}>@$>m}w%jW}AH7PQ z4syds(t@Xnl5+)zKi;WwTL#MsK>Wr7K6z$cHKZCBl0W7cV*|Ky{&ov7F1h z-?XJKUK&}QV+mI1RW*7ZM?p{9$KqlXI#<6#4#xWJ5AiqBZ38n_WMjpT+2tRejVI<| zTU&#pp71L`1}2EGy4VI1ECT1sq{a+UpMvvW!1|L4yAb6aQ47J2Z!X2?ZKP{Y`cpiA zbJ%lL$+58dXWR?^fqM4XU0sYSDh9lcXxk1MXPLPM#>1c?n8^dUB>ltpfp^CkT@C37 z--~@)y?&2yHFEsRj;;pdZn;D+cc+)<`Ukm$UXx4sA=-5P;Nm2kkTBVV?MXJlK_$dE zTY>6Fm;^yqwyjTC8`2HtRE>vqvY(DSBL8oe$RdNT>902R&VVK8ymG|D*3K(OPJb(Y zDFIOlPaQd$-Z?W%`$kXXsIBu#I|9$n86$WVvhSQR(n7iM{ZwQR%5C~1>G4c{(;i9N zutRu@8KX!?oH23-7od`(zsDII(M}i>hl3{@W{%&`9e(|&gG6V$rIK7su*sjixO3+C zg##pN2=qStQfReF17zuK@MmzKKV-v*@KBo8@e#n%Ha|ri=Jxlv6wOLw=bQ|(X3O0h z8R5gkd>0m{{TZ!8u=tbcGfJYgqQiF;Q-w&=OQiJQOK?5|*9DO5Ai%Y?2srHmLUjVg168sYcqJ>M0Y5}ZZ!-eh`aXK~fo zn@^XWRCXX&3?em;tq1jLQW6mwA1k-}jPK7z2SPL=Lg&(WYN8tD z&b%cDoo9NbZ&O~Zo8+)# zS~rbW)=kh%7Y$oHf7WInNr?zPg@O$qX5{Uh!TbT)vN^gzDO1I$bzBP@!h*AC9SgW( zCDE9&bub=0V?aZO$+{|bl6B=|4xyr=-}$Zn0l8Mk4&IjVTx&mt?Ka#x#uA+5-)?6) z8^6ghF^cVn$;&2S|A=49aXP0*>{wm{dy+V*b+l3on_Ee7=teYGX~D15>u1m!sRB*9 z!5LA603uidi)PZGGgu)MnnDf{83fYoY%Didn8lN2C8^dKLOHF$34zx4>5^vw6L@n4 zIaS|#L9EX03zJ)_+i%u6_`{#1bDfsBHeg++Uggv*Cn( zrzvj7Z~Q^AJ!(ZHM?8VOT}B*kMa!}(+?s6(E@yShx`Y|ZZpN%o)+el?G%cxNTx|)( zA9geYPZdUm!N%q++b+AAe5YGIX=o?AiGgK{ylY$WZamj-{NfY^>u@W%knze^oafD6 z!}GH8=@v3V`$46wM+G%hSDylEBS3WotCMs5#-V}P30=w?JGMq9K@W~ieXgvV^@H)# z2|IR*Fm|VZs9?&Yk;=9Q%_+Lvl!4W)KJZHhVKLs?mnK3VVjYcAi`6P&tUU87t_BwitWt*!5@ z3CH-Q4(s%g8|fdOrpsK$`zKTN9RgVhPI60!4SM!twWWR%9MpJ+3`*Un^q-^jGDmNj zT40}avILRQ=Zsd|xkY8S3g063GjiyDUy>;W-yWv_9ny7mIjp_0dRsgF?^S=fupHm2 zv`3O*n_lM%o~qBt@swpRSNeRWh*y1UG#j=8Xi!CEe^9^eK5FsYCeXgwEHEl@AfZZr zpF`xay*d6~;bY)_zDLnRBuQiZPFxvkW4G^7kFbQ{o=%bYI$LiOC)DWeJ9rg+SY3}% zUSMOCQ!4wxAC%|UC(VVluJomidig5dqhybb#;O0MKEf?~BlU`o=6QZo_C9)MG$PLl z;6a`OWy3}+{viEWQRvyy!te5N`uc$MD>J%9e*12txJQM}U+y%c)XA%>c@=MtnAr$| z4l)c(x=|6c`2Rk#{t081r-sv^@|l!-7bnMi&d=0%_4113gWXP*4}nZV*;Chh>83I$ zgLhnSdKIr%4!{uw_4NYvCI8@A=J?q^{t5gKD4VBj%u99UYgv%usN}fci2PcDW}d7c zjm@<-5g)2r#ltz&_7^zH%le=4hDL`kJp;0brs6!*T#-bEcH3E8w0)`RD=pV+9j9;& zTX2cip~>rKyuw2$Uc-=Lgks;T%mcWfGJTq;f zk=ue)ddWzdr~0!ulUnUh=_HHI$fhoSJuAxujF1TUmZStHV&(YFV#B!AHEN-nU=7G&NBP5 zN&M5LKkLJ53KC}r!>Kyseaq-98x3C4sSlev4s zV#&lW-krM#T->_%djt?^al7LeaGcjVtQ2Uwq^Q!le3CPmHy~fvw*0rY#nDi_i4e)4`?WFKDE+;r5{D`mdR^P% zs{GM4#2%80|HS^MZTUSFFTYyb^31ed;cZ>_Ou}k$BmvLXi@)TG>tuBa2B-eV*fRP? z1}t{Awq;MBYz5PvYKoLr{+@1JAJUp21S6%9<=0Mf#)(Djy5Z+KS9fmxJ=Mt&8i>@l z%n`lVvqc)Xd0aHB(b)1QsZk}4jNk_tyX_vg*hp|G;RAAl<2f=reF67% z5(fT-7nI#td`zHosoZy~dpkw4sm|Acm67UaGJxKR{T2VY*l~PqiXZ1R?oieNqkP7! z@0-208yEbCDJ$56_4pb3?ZOo^Zimt#IHUh2_fbs9XOgH_&FV!7*ePh#r-pk0dNyr~ ztx^z5j()2BMx-9Cc2DokXKaeqd>9=Q!{l>|H?0l{z@k4QpU8yZczRd9d4jkq^a#Hr zYPB~->+o75V4Gcnn4xJK8EYfzoh8~Ph;hs@a{v$z6yYX0$? zS$=c|en|O^M6po|qgoaQHrF@hGrLRF%BYf+kp|?|%2+nI#Wu@eMI-0?$kwiABv02PT>z8U|=EJy|t zRph<+c(lp|sQE>!OldS=2QxxvH>W9zDvc>qcHuYoD3^_n7o%ghN$>)!6FyDu@kz7& zKs%kMSFV(!^yxo|C)7jQPh1%0tun|v0Vq|K0y;la|Budm6GrNf3RP`7lYM>{gs}|E zW%0dO3}q}MV|S7=eqMw)W}xQ&QbR(QvB9}*ufI!6+LjlD{PsU(1!-#>k@wS^qQ0DD zuu*+%)RzYV$%xL#kB=6*%pQUPSlLu-+`TXQXiIQkqMfO&!!;#M)ZFG0e&D&YcK&wq#$m*fCkZ4h{`48d$ z7pu%tj-U1V5>fV*>ecS_>f=KhyuXJt(x)l=IJV`~HzX|^tHrW0mC7J#+8Di&M9a~Y zx$NdA+?W3@APy-EJdu3o>hs*@3Ke`Ga4G?Xj$OC%K80>4v`v5)F=nU55t*pn9U}%}b(3!`wE<>R7$(KrZzX-YF=dfIP z`!`_0Kh1K*>{Buxb)+@d5}b=YLmu?P<M9Vl90geGhYW(IIF*o*AcWhQJoA%kaOw=na>DJ@S zcmDF60D(f$)uJX}oue<5m2>eirIRs0wn^zvTR8uimV9s!1NeTNrpqkzK&RT@f+JFU z*)crn)?zSt2#h3~fnA?nBxW$L@rq&9i}m}Ra*d2hod7sbFUTvY$-eo9f8AL??ALmb z1a{Ctq&svGOu>piM9OUEs7hDRP0&h`MI~7u@L?P|;_C^}(esevnI97dIaY42jlV5Y& zspwSu4zupktyZ^l9{@!N+(Cj459tIO<-& z%fgt@5cmUy;NNnL=PAcp?fZ*}9H^G=E{kj0=6mE6ge)eHua}8rQ19t}O@uW?db2ZK zq%=8VusF6(=@)>2_~w0|N~krD|6Rt@KU8OPJ}DM#y`6WF$K9_{VV3_-T2QuxIsk)X@Cecr7$mzTN*9-qVu{+o~dXxRyIcs`$hCJx`1JcR~p zQw|5~{!xd6p-x6EN_a=a&mY`@{}r-nnJU?d8jNr7gu5jiOl9s7VsJEl>_6maD%g>7 zql#~heC*KL@8=QpLa2w}?`{100vpNV2fpPP-+GeTO%O6Ykcm&tD*L%YIj6G9(&=ob zjWEU0fTM33NA$t4AiQ%WU!24Xx>9W1cR9yJFwz!%$bGl;mV`BbLw?_1nPCm8h=<0Z z4}!zm>6vYG5KntvJlEOxE=3nzs6l4G*K_zG{-ki7>FDJc93sL~r3YUcVz6wU2Qlw;iG zQ}Bfn*b|&|*5UhQ32!wBYp^VIW@CNe7tE*MSQwTL6HBB~XvA#uuJ2l@lDS|p&Wvqz zKV(k*`CnISlEGcbvXo7SH7D;ncCQ<|W>QDj^3ywZugPDB(BbIKXKiIp6Oe8xC;#H( zOg*^yN%Bh{9r-0Mu?JR76ShKiWXC$yt-e=|pa^|2SP%Khx`^b?roC?&gL0~6~#TnU!>1E_uB^8W_SxX6gcf0?`rsSKdIwCXY*(||a&tdWdOGPJR<9O2pX%=|GMls#|Rja@q zB_;T~&q)!VnUxxdebcQ#@%3q-#=n5tiODyXpN$a#>h^S z6fWmkpmYj}vW<(iBo+p*3p|uUz{#nHp)6%l6|W9Fl6sdpw7AtlaDI$8;mp8D{4_3*^%3~ zmTFR+1Ck;{&tr!6HM!285Ha}&rR-|dlv;7hgN$XH_qcfRB|Hm0a^4Ri6oH2?xA~qir)D? z7_tSdxLx4j>U)*4!+<%@$fKWp>Sn1F=rbMBvLRbgE#L#(H4K^=KaWbJlr-9DHhQic zi!eTpyp}uasZiFv^ZGVrKqKf0TOE7YV-pqpdA^G0sg{Kc1wucYLd(!-W)LWee{POn zKDyofhy%wryHr&DAQbB+x0*iK2M&z6dV?EB)QrgPT!`1}e~!-1ZHP9wjhrPA4l;5z z7`Jt(zN&5L5B&lltzEdp!4XNj_B63Tv`3pw`;kXvY(W zfJlI@mEm6eMLRpC z>_+!J@@3~n{u;GAmARzU9@HY$!caFF7pIvFwQ%cnEAp+G9cb38o2ICUK{WJKv~ys)rPIkDzw!KjlX}$rjfH@vYx`wf&{bEW%pEOr z^c8Rm-fDtEn8V?_)K|}`Zo|k8-T4KjX)Ep8ldnYL1@Y;DgNG+M=Na#g9Nf(oSmUP! zN-fFV?04py1A9+_6(V9U~VaDayBqt9f1ZWzw6Bpk9rbNd2I)kNlLC-z` z6jA#Hh`}!-(!eM^e;(q3p|Rh@iaS4ad7veAP@MEjwNgH%<>Z-1I^AG=|F*#%fAj%8 zUhB821XC}qzxI4{0?lsuy@WJVO)QuB3p3z&xTbcio~8}c5xx+m)~ARR0i?O zg!s+M#nruN>f{LjDnJb4Og|j?dAbCj{{e2lh;woja-0 zO*j*RXogNgR5m91oou%6=y!7X8$Ubp7i;8sOYn@quT9wH7-!%x$cUgF9P_QK)HyCG zK^lk6Z-X)W3I&&n2IH6O6kPJ9o=gAAQ8Fh%KbD|EX((=jxUAQI(F+h(v`u*f*1H21Kane=0Ya zrA!s$4sG+{$X~pX=X1N?%|I1~I`hT&CD4%kM`bTWEq(4iLifr3?A9;0=|(C)>2@oo zZ8bsrj7WEy=Xb5|BGr=}LEBR9Xaa5$i&9Kv7lm(`W*QQos$Y&YRlU$ktZStJxirIi zMcap1L9Q4L6&s<~NSK^Fm8vt3+TiJ>`+#QYZ<(8rr0`t&8dv@8YM3^1fsPVU9z9H2 zIO^%s*mJz;yW*!1X}R05MPAdW*wG=rXhdYLI5f%GD51Uz^d4#}6-5)+U)pbTYC;|@ zZ0$aPv|w7hyPey*M4^w3Bh019ao%d-Fkb6k7TJ+Up+#kp9x?W*!7OF6zULm#F8K8d z{V8o@ix39rAsFmxFz#48NE3~BnEeWN0YMO7uQxxFstv~sN|;odO-ve=f04B=i+0BY zd{LMHS&BHu(ham@TDznXQBkq-fmgnC z%ctCQ5^{{qGo}kR6YWW)Sm5%#yq5&aq5QxjB;;xyZ`|~7JYmN8`o$8fWmtYgKd<;M zew|*PlAk4avB-8|6D(`SlYe`=V6^4tkwkj>L96T__D19FwP}_{roF}Z1uQD?B;>6< zyqbJg90J%5>y4kZiuBK3Z#?idAs9B`y-1|`Oh;lhz+S@)dvQtq-3l&h@HTR&n(wk_Q^NphVr-~xTxqe2v9 zX4delfBab9#L3PLSu>%C_~@K4Kk|#~{yeke#Z|;!K2d(;P+@FsRzN2YR-@rg^)Zz7 z#8T>wPY8JUX*5O+yvTT>mM1dhdZS&RnWJ}i8%_vucVCuI+dgA50deYpM5!EyN(JI> zP%=?u4cKN$rY*m5|5xOAAQ4`&^~;j*>v&ec$&#SnBA85B0UXo4g7q+)a_gydX&Vo- zsr7A&n{>9FU&?#cdd@cN7n$OA2iWIPVd!|7)0{?rsa1jk@Pb;qk8jZ2hgk+(5f94; z4EKT`vQ!Fr1V$i(!Ns5My9^h`@%n5#NHA))L*Ek|1%WHtCQCLxg3IaK;0u*KG*(|A z@jSuFBI8eA`iK?FM@=Pb+yyM5ztYiijMr?dwC#JKkGBZ<8w1+r>(59+GMjGO<(tjUm2Kw7>GK-QrW$Sud7ey5C~!MJ!x|L>wf z89kdIqkyc+#FVUcX?I-98w{dnBON+Lh{J_SLZqUEI?X7doP$+-(0GQ57V1kBozfV{ zPqzGilY(qDl-{$}wPs7-NvW1zO|}HlwdhamVoA%$KQPD%ut~4BCkpBV1<6YOlS=f< z;1Q(vZ}vS;89M8H;^%OK_!mpZyW<(88&2*AoAk9*7IcZ+27jjM2%Fb&ViXtJwvi-LKrP+`4(!GGyF+23u8CBwawM11d0H!&*&;udLAE-PW2hT;Ev1^tmyRJ=s1<>yh!(ob^#dS z!)gPi$yu4e7|LTefVKIaC9X9O(fI;>ovo6F=~d|Kf@M5o$9OI@xKgG_w|OduZM`y| z>wSgh|f8 zlUN_YQC=t=HM9t*K7`Jgp!zFUkyQm2l+j%2HKi)096OAQmXJHDT>?H!D z=+DBBtP&lWEsaXOdPkV*sk+io-1$qd>9ZGgbZZ^y;DYwkSE92Q$>E^mV@i?F^c&{J z*@C1W6JBk5<>Yk6Rx%@hEoOZA&C43Vwt2=icM4;k2*D)4D9K(8dw>RO8*b2gB?ksE zi7rql3t^RHV2IH~Vc|_IlW>{Y#+VCC{hs1CUZe&%jU0X~^d>k}8V7u<^pX1IfYoYd zZam3sG32VBXUsWGqzR}+V(3X^-zgT}#BFS@6Vy`*$_4)exTzIpXTJ2D_w!Ym@82P# zboDJXo737Ipd#}qi={QTmty z?(>Z|RtxD$bRbM*_NsKF6l`jGr6`tT}ffJi9h36C=x|$nW(%TtutYCp|q0f0i|}o|=WiQp z)k4I^d*!!JjxL^imvM8<20ss3RM70HG|~vJbs;K>JwEy z+P^_-~atd&i1ZtAM*30@L}3Fdx-B@c_^0iN9hY)PyQDO|IzA1P2mrOIZHJd-=6;w z)eX5n?c+pMWQSL;v5k6G{0aY@h}PJM5!Lz_7zVTX%ngGqfLl6;jSd;f=`qoGiDxW` ziDq^~STwVxH+5FHuj5fEfu`8ig%92aF-l-?zI7=#y_M?RuT{Llw*_MF!*5W=*~nYA zu^?)QDVl6eh@n(ow4jvi=vr5zDu|!g@#-qJCT2I8(%7~OBOSQrpr|++jFBx$GIVuh zhm=wuH(O&hi8|5ioO`VzZMhQFP6QYgB{dN6Qz0I3>JQQbkx`PN?A29v&$HxTI-R-c z2=h$;op29(QryFpi#mEj+1gK^jb6DZa>yDQJYfk$4(V4(3OJkRrO=fA@|-aEMaWE?cy{UK0t0O0U1c-azYlm` z*5)2o-`v1CIMgeLM4>B!H^o%f@gm=f6fu ztB@gW%dF{_gCwQtyXt(Lx!DotBjN%caq-YCO}1Yozbxrhk^`nf0EpZj9u%xBFn-yg zND1PzTzH~U>m;jI7XPzIjhTw#V%F=5mw@iM08>y(_GPwbrn8!gWjf77(Bf%m7~{euC*<`>D)s)ARCIEEml)i+dS28ym7wb zXN7iv1l}R^BgxJRTbp8Mr+%!Us^|!lCp(RaR*D#b;H5&2Ce|d`SCF`9_;3|(pXAHv z^a-aZQ4k0S8z@BlZWeR%;UPq*evuWDacPr~3?Xw9ILvpyo;DOv8NevLTZl&H07dZ$ z6JqB@q$?-A8;mUFz=S}m$x}Ifg`9F+GI)kll-}d3_v4g%$&Qa$@Rifc!C}wdHE+oZ zkxhp&EhyZ_F{nk<09T%Y5C=-JsL3;9GCUNJG3~+Tk+&9O-t;|5X(m-Kh~DkKpD_zk zc?_-nGz!ONN@(_=qCeKN_Vc#H+>k~17avVCyba%KFVnu))o<0P>^{nb*dLKHg6sV= z#^geJazrQ>Ji9qvh>Y03EcF|&pb(_*ysZ_2_^4o3pKRpXmKmb6F>wRRFXU5LSotUF z8#DKmQr~FplJkQ!pc^OgE9#rtwhv|7J&9Y6-|g;Ae1s$h$G`c6&gEjhuWp`k=_t}b z-KRJUq?ED&zfL*mr<1_&uU)2X4jWr1Ia$X!2f8g(5z36LCg9qLdZXtY($IM{n$TJr%GQ<#Tuc`81#f%uOfFbFJ*w(p@J+ zuE8u-W&->Wc*GVc*=Y1W(*$FIgoX(ATQsdbOEgBZXwNUnTQ>61;{mc|BkqY+DjNHr)G43kra#9LsMW~_p$?!qvNP~`E%%}!kOS#SkO)YFgG7I? z-f{+P%{Zvmqgt{8-DGO?Klbh6i7-99eRA}Wx53VL)KW`Pma)*$dLg2_%T1~>e6ONY z>cIDDbhJ60f!6Xrhx~C<6~Ndh)X_E7UA1vu4oFcmyAw}audP93-gxhK}43=%F9X&@oK_~022L+^aI8eYD@@@k#B-_Qi6W)+ z4LoE*J=bV#ItJ<|`-NL8=&O`fV6G#eaKFF<>dtZsa|tjy+!P3}vX^TcPfaZtO?uD3 zYD?_eo$pXiKr;{fePHt4JX0nlYQAKJ`rp_fQdLsb3|OTUR3{z_)dph`HGuXCs)FFd z!I$}2&_h4ms>wQ&Q-z+X4i5Bp09-Q!T#4y{T`7bty?z*I8jK_J6+((ioUT9O4s!uD zd5E7rY@;m$+qhZ_$IfC43`}Y!r7vpDpT@V0nf0mqgX#2yft8rtqb~fZ+M}8ifw$-x z9Hf;+$SS=-dNbsxajHN}tke?%?(?S%qTuvFTqDDeFv^O%6e=VuRd&7<`uA3{Kl{A1(Wg-BSAxipAhf9<0@*5kjf@PWG z;FxpZrBu;+ioWrk;YII-o-SfgH8Ovqny3*aEBwO7A7SaJ&r}+QT0u0^;PEWU+JjMy z)^RZpeRcIl!9f8k+Dp-ovrjD2IxtI<@^UiudiAds&nB@5TZY;zFfW}|te-jy^cMmF zPh6%yZobO@4t1;aV(IZ%{!cK9XSw+e?ahx8vtl>A4GryhbzR>8XJl4LzZXFlq^@R! zR?9`?pKBcX3v^e8?;I|7d-J~G!~Zc|boF}G8H&pVP*F>5k{Mio?J=`ZHBXqqf<;Nl z<`0K#=P^|aWW}}Hj@loMgC@GK+b78|_yZ*uqKkN0aoY3iea4~vM`d^Y5sxEs_)CWhQl*m7 zvQx_emh;(3vIyqMVds@nbHBS#;5&TzK|F;s5~=`_f6`gUjge51;`vXJlZZNi=7|XV z-7`}x|L`pi?fJmg-olpdNN(vvh1kfA-OLBQOiBfw@(o|Ata1L!5~;uhMgS%cI|Z6v zc*CRvsUutR=rc?@Ky&$KbHw2nAw>N#&6z?7n>6<$Px9C?0IXrn$f;SNb)sg3t}{`h z(`rsO^w+tJOXFF!hyz8OhQWN@oDYh?{x*R8KZwtwmSkiEXiiP zKp6w|SM0KB!~>LqDa--(9DAmdpZy}niq}p=>0wSZ(MqN=M1(X9?lf6x&NLjvYGzrr zAg4dlzo@;*E!v(IX=RZj)pG6=y2IH|VXArDh-Pu%5Gpc->QhuC+0yWtPL1GXDp_Po z8$qB^G@ynsNRs3|6%Iw86!s4rLQ0DBISxSrU{21axQnGSL2Z1p1oK4J)t{p_KBe?b zZA6g%95l3|4``t`BH>c3Y)hwuVY1N$9vnusUc7ubS~5{ozY1V7%CjysM=46l;J`>v zv{0z~_~RpsWEgL_^Bcn#$-P4)T8e6oOJXd{Eb|Jdjcicpm&s=E$OW%+j=sPSdpe5% zNT$AX9*W4XCaWGH`p)u}sO>H(&6Ly%U!yN{p+Mw#uNa|@@xpnkc?C*Kfh(Jik~9hG zTu?NCIw%SSaS&S%$a;sOj3~m7BMhn8&DyGDbYo?^OCE3;Or+~W#hXQ;v*L5kbnGyv zBMped50uxa=?Dsy2q?+-Mw5hNs@_yW*)Hj+U~Sroqd=7j2rJM9Sk3@>o_yxP6(Rp&jrWdqfk= zj(LoJ#vz>%9wmizfSO08`VDBxxMn-)=n!icC5aAxNwyn2Emd&cBGB?&A($J=#+BMv zOvbq?dUxA{G=H>gTzs6o@s#DXj+CfS$Yi5sx%?=PH&kt$i9`w1kuXhsQi{d%%z5`| z6Dt4|x<%0d^=KWVc#iEYYU1{fXrL5(rw{pUimaY&S$C#hUH~LTV3VD3Hzj?>O)tx_ zz!6zxhp<0GNgPS7!7Q`dGP(&s_ppfoWGFgc>EEd*UyG&Q4*rsh< zFBhw>rn0qMaWIfGwRsQ@Na8NeQx^{Y}CZ^S*$F9Lvy4YYr?(|-t z==BDdzC#Sqtca23lPnWiI3O^9zF%(_m44__+H=(#FCaw&nSfEpFL|M3qU@cYD0+Gm zjron29#ifiUcj7VRLxOVfPFuca#$MnS7v*)jyCQdkkU`eAA$7(z=;05@pn?QOuUnL zY>}NxCXE95t@tGy=Gc_`Fn*csyHRLkqTG46nu+9u5YeHb(>L2V^ARQxWS80Om_SQ1 z-+{LoqUw>YRe9Oq2=bHJN|2b(to7NXe``tDWPB)QlDNU*WX^=Q(=Q?f*tL#ZWzH>u zy#i1?_&-M4rtj}f>I`H2ik2}yy4XgPuV`zIk@GHxMYM-V*<|3+s$8XlC&Tv1*!6a_ zK1qXvJ}_GQ4LqQR;+<8l#~O?=X5Vt@Nne0BwEUX1obERwwCqp%ldj4&f^((6uD+>K zVFe7#t5~G646wwTuB{JofqSzP3x{%n^Yv;J%&pRBLVcf}aV*u5S1N49sppwgXY&Bn zQK47nQw1aj9|n_IO#TjIA>z0BjaTQSS^73Tp?X#NguKR-LaU4yD&vq^?v)GgJmcDz zl9P_-{wizy!hmCTa;|EIzDbLp7Fd*W(>u?6ql~#3SH&S2I;OYq)&8U@v2kk|Ua#rq zSl;mpBD?$2=?|3aY$hz9$;+n~f_FFWJ1W30Vy1E$jM3LBM?}-ppzVnqM!2bFf-^Kh z@5tp^xx`+&Rc-8jn;#ztgm6ys(ZBOZrd+RdfXG7}{laUPs4yoN+$&5Bd2>rbuGZ;= z36tJcI>i~DFD58+XMK1s5Xx7H7ktRI=69)je*7I(5AF2*XqOt-)MLi=t+zo!EL=e& zC_`RwnXr=r&`n|DrX9NtSBZ68jnbu<{=Qs_i?*myCeZ|Z!QhDvD~&`U04r8j8umao zXg-hiD^?m#eNR6I5&*D`&xFiwm^F?>0`^3CzP>O&t{vSC;p?0=PQNcAn{4x8j`d;& zz!FZoZ1@sZ0;qbiuv>7B+2QKrS8$360;75KH#}c2Qs;72K;BKD#jqiO)mXGKW zYLumn)^QaJhHmCFuVR2I+iwvJ=dwtb^MxMJrAV-%1ivfojyDM1k@Uq|Un=$3`_^Du z#WI{0Gv(8)z}a(Uqkv|IPKKWUoK}-R#$7ime@q0&38RB+@vGeah^#(WUy-UuYj2?Z zU|rUMy1eSE^VZ<#`FJY80a48oYo?$)5CmE$q2Eu{dqzDK9O-#^jdPvN^9p`Tb;jY< zgRQ>9wX}M9vehTIs@~5SZ1GOD%}MXiMf)qg$NA128!dD#pCI($EC~EMU-PI2!mz)pD(>jwP$kR8_O2 z1Y*O9V6y?Sz%YwxklH#Dt*15w!V9ypy_*_R9gaRBc1V3bzCDh(@u0V3kDwF(dOLnQ zaJ6^fN*OWnmR0KQ-+0pHoYn4fcIz(Z zv)uP}xSWe`cRA1duFJXoZkO}H?Jnmv8(hu?uJhKpoL0(j|2LO&?>Ak}H2%MLhs*gD zzA5{<%lXZ3xSUV%-Q%~poIi}1^?lgpa%S`Y$n`Gga>{?d+vR+fdLHIF5~dyQ>!{-l z+J9xE%X#z;m-B&6m$NwPa%%MFnJ$;}68;|+Xzh!eFCg#*1ipa47ZCUY0$)Jj3kZAx zfiEEN1q8l;z!wns0s>z^;0p+R0f8?d@C5|^ZU{&|Cr7L*%V#{bPn<$Tb8>pWH=`hk zL!K|Npch>vg8OWvaK2KIEhc65r{!5v`QlWdCV!)tj^2)-QvYDPglbaynGKoAcuj=; z?=pRcFKH9c;ZRmpb;n@5rYvo9r##j+6ZBZQ7EkLAmBvojfb~!4~%Lw`bvyOc$RIRBdk;A$T3k?@+)U5@WGDmc$O? zEFg&;&eYd+s56BDS zWFF`$%QPBKlqUus@{v2Lp5gH8#vS(*{dO^`?KaZf>6oay__nj%jT*`lUWd|qqI{r& zdijh+SAUdvQp^MaR&=GeZx$vEbV~a9BWrNnQ8cazmGruBcT@CE8Af>B5=&==n~cFf z=Ci_mB{$+BE$V!1xoXj4Rg-MkO4O)eFua-|rY9%L9pTjy0=3@wuiLOk$7BICl6ORY z3eGKA;0uoK_hx&8Sx;tCef(_QTPsLr`eT-42eB})SwkrN?bgsAR6>DJUtxcwTwjteI(@g1iB^UDsEl-r-?r03uQo126@d0cG{dgQ_J^n)*QrKh>(zp)64a0qXDls3Dk_^GG#nOhWC+1QhJF6cdZ)P8~FoQ@{dlQukRe_WTMdMIGQ9TzG9Dn8Ti74X*4IlRzDSm$u8G^k z(XOeZ#u+5N=R+ST^opCw&dH1BOscd{Xib**z-6|&M%E$L5Ef&5KAkcX4GQhq9eQ1+ z&1d{a7(Cplh=2@vr=+YT+rx8}lI=n0$KOqMJ|A)Vzo1kq|59&-Tg=o@p1N)FtK#SR zdn@G{SB%h?0yPA%43v@*gV2g6U#(ErjIKE0oV4N56%Q_vx2~<@`BdevwfAf&zozu& z;K`+r21k|N5X=gMsVDw$ASgdS0S6_)_QNVma7SX*BmzJrT2E2?Rk*ak63QY$x)oz0 zaZBu7^R|BQxUh``+anjWHXejNC@7lUkO%1 zxX6|gymZ?0o`Md6k4>KMvJk7#y9#$ltn@8qVasRw!FnsrN6>Dh5-1oFY7j|3SvcodaV`mBe|&V0uhi&{ZDkt?^*&pxtSg@1dpf-^e&5m|lM< z-`^|ZH!o^i2qkxgl~xZudPS$P&0+s2B5$XYkk8DLT&60YR@Vk$|XKNu-2u>dh>LLe$-2$jdU z30#{+`3P}OV6OB$u@4qz&udurtDHAH_JUBI6Q$N!d9sCc_c}XnHpaZ6rcp-M3nW0kaePqQNQ#kPKCVcVzCT_{zyhDO z#BW%Z}b6PS$Q2e=h$^ zOu=H~)(rX7sUJL0X%2skUP*Kcdim|t=(DBo3=AWz<3~*&@}x$>6E+yJucyY`ags2X zEF!FM`CA`YGgl%6I~r6+W!e0K5e^JxEW-#{j6Xj5dB<@T27-Zui`dh|fTrFkgvm_q z9mMJe3E5B1-=G}x3KQ|mw+4ycG))=oMyurvaJD|1);(?TGM3g;!fQ{mgvOcm{fJnW z4aRlEd19?c=GyFy4bhb@u@IB9I4#^76AopnTlkX7oA0Ulj${0t(uF(&h?5*S%13{J2Nk&WlS_D!}+9exSh(--QS)y~YS-Yo2TOFiR7=TehHoHC7Pf1rj*%MMV|VmxNvg8@E&Vg)%fu7u}j+56}s z>s?~`xuWH=u<{suX}PRhu05ylBwJRnwy_vf*Z6b@(DcT{ihQ4O5OcW1iUPjAI=-AW10XbZowuG6V-uZK5h zEw{HFPFw~vaGL&%_E2}0DzZB)rR<$P>sAiRmL8v&iaLznzbkU36Xhb8ensAPiU=x4 z+cIZZNE8ynrEBZOJeGuT?sr{S#80U}G(yq3Kf>y~uQ?%N?`vai?m$g7$8_VP3uN;NSfIz_*wOI3vW$LXHPu`+!|l|E;z8m6>fD| z5PsZDUNB59E3t%pm3S&dZHu+0Zz3A@)Y!T-;zVo+A0!xHXZ6S0leVd4ME_4cII4Hw z>wy%lc?q-3p5+oQBbzCA$80x+mXF{G@*vAtq%ZRz#GASp%=ndv7jLRmQx??G$C_mPqk z$kgMpanRU_Adq$@(~fwrI8*K556_ISplB$A&1!KE%)phYtd`X$$ZGky@O~I@qc)4ti& zW757)p2t)Zq()xDgk2ndQVHxrQ)1ONY@W};&4_ivoQ+6Slepc%AvWB)1aW0#PPUVq z!meS*+EjJWN4tPDTmOwzoU6ZVbS)5qG#1n|X&@vkBiuFFDMV}aB@i{T^~Rv!p0tn~ z>6K@OEtDfUU=AkMxS$>V%g2}*Vb+XMclIUBFkS0eqK2q02U`E^3;K}p+S8Mr{IVdL zwDY@fwik9i3jD%7+>P$qG1+2^xk{* zT}T&P4}^I#ty{^;N4Il*+B1bOdR|y_#X89_m9rd4&$n_pT8!SvJ33Cr$uB+7$+eic z2MecF@CB2ozBw!T&FMq?loZ}vwJb9s~Bb!&zM#w^HvdyM=R-M?>)AdQRRou^+M>1Ebh&obp~kW$u8#h7uj#AFND(AjzkEA2^=+<%@)`K-p5s3|P%e9sHJGjA2;n`Yk+-w! z1jzQ+kci-e^!`NAe$zkr zG~^|h4`l8Bnh0+QvG3NAIx>Iz&CvSefr5*$?bgIHSAClOiIY^F6j zS0*7XVQD_-ljw@9)OpP-{l*$16g4k{>J^DhVnL&E1WBEe2Q8I&qBo4NS~kob7un&Z zt{mmrRGqIk4tO@r9jD*D{z3Ywub1BH&o?8xq)GhLaUuh&iliZGuGm@TvJ%~~<;SMW zp0pT{2o3mW(FV(MQDjE}D|0FtJ#d<@NjlAQcgyH`usenGm3v8C`OSNie)BnA@$xDX zZ}=WWk$P22gfPn@drSKB5*b|ub>Ue)f)x=a5p$h%bK*{4(ZpxJggzA(3jTRdu#m-kB z1I+lz=Ij0z6?}7~3QtGy0pf@<-)2Mtn#PIEjw3&jQmCmYrqet@NJS#mT$C z>yu$;2SkWUegKt{&2^x%SmbRX5t&gU5LGYVL8B^i44&2VaD#eyIbWENXC39ILVP)S z2gx!ckRg`YP%RGUqs8I;K7}zytH%knrC0UMXWd~}@yL&PKD@_zM zG~eoHyvEh^hF}>!ZjJd|*UQB$)kU`{vdI4D6O4Zr;rSQU)0`1lrn{ZSgYO?rG;4tc zg!MD-k?WCxJQB4T8|6ATP;fujVYzMz_%?DKP9SzMHS!t0Vldk)-M>`h@p& z%%+2bW!Iw;O1@tEX7^)qcyH+F^2Z#{$)>>?aBP!s^IGLIit*w>4$6C32MB<_YHj;C z%!RgI7+&#+u2+%f8;!CjWETO&gC2s*D=m*TRG>X+@$`hIMz%jrak5_qettbFy^KcV z>s}@Q>g!b1G#bmR)Fvcu)TtWZMTRWImYp!T6s^JY`ri_q>Y=P;QR=O7OO2x~mRw73 zl~cmrN0AS*sCugq=5rpa$~J!_HlQV1W$!#Aeuk++9M^S>3h`Iv!c-CrbFlH{()b^F zD3S89Kp2dbet8aiAv>sSRQU6M1ttr~h`wzMr<2B$gqGWvEWV;gZN9naBr_vKX$ZCW5*HZ( zPPU3&7K0u!V%ShUKXzvq7dX$>VJqS`D!-{t^k$UTsoG|^9|ZU@?~$0T4Fs4#M1c3l z9!jvOt{yGZ>J-kC)}Wu<(-owrcFr!@Bxms(>whIIt85%%z|*;n=@N>Fet+_io_wFj zk+r1#9>bYH>{5s!lrOme_BBxNFLx_+qHzLpQ|F3ts`-x`^4MiIFXf)yMV3lV1;!iZ z8;1TRos?&FrQ0m1_1OVoJjhfesfL_ENi|ef;tU-mpdI;i=aDcvfz3x1abXbunzaTV zuM~OI8>I?=&1e7XdH=i>$a0q8B9oL5@5Nxg9C*#(B9n#%7ZIOx+mP5I=vQ)2fI!J= zL|~MxMr|1bF-ng8B=WZGVQw?^DSc5qu*6=rg}sXRweROwNj>wBhub%NSBzG6-Y$R1 z8ECSl4xjPcI>q{Ss@IE=apxS{(upBL`@*m1394?QPQ^RR|S$q)t@ID-r@LaZZ>8YI@#q&7IwPDnC|8el?51`7u4 zrD>W{MV#SLLl``XW^x!Gz4q?Q{Oik(!kyznjCZVwh$o#awj@WQ?85|WI+y!J2F z%WKA4nb#!L#yI-gzYqaYyd+fd*O9oAFz1d$mBYwMTdoF48_l^3)j*`m)l%nzkEl9T zVSW}qDTlOEmF7M1#P&l3fV3Uc&s@tdynYd_Rva6z=fUa1S)crfo0~UOwl<$(mbtCPvc;v^FKiO2DBer(SH0_-ise?6iz5YiB)#jaK#d* z*0G87mIB(~V8yvAY_9O7(we)%nXJGCJR-V6eiUSG0|{!(3^Vr}A_h?u$-LJNR+PxQ zxuNH6%JPw&uUWg{ptD(PACwq@ZG2T{(CBsXb`&i?k=~du4TjC7?_=+@eDqj^leD>L z1%N^7vSTDMFPkV6rB43jythl`l$#J$+bg@@7RANoC@uaXbEp1cq5*c0Ru(pYx)Zks zoVu8t!3sG{aLehk9!~3_m@HP`0N~tj7)yoX?%zoxXuW9 z?c0A(4&a73*t$ets8Y6l5}13K;|*8f*b!D zX_MGnwm&C*N{~jq`WC-!n}lmGMgPbXnA4_xDo$yxsppY^@~5p(7GlZI=<8LxA;}j zCKBn692X0D3Vn5mOxGpYBUqGKc8bQC=hes_<{z(K{m|y@W`w(B;cIpPYpN>{^ME^f zhc6Qgfi7NKWz(>v#OiN>`dea7p98mKg=EmV=sSQk+zMklk*>&%wrpxOyyJxlt_Pjv zMP;z^9E2?QzMO#_w$#L9zw896@Vgk8pEFhwy>UTK-1y?=h%UPY%&O=dO_MKRZ-gLu zg1I~VaoU2aWMMFOiI`8{CW?Ev(S7Bc zFpBkwjD?Wb>UZogd~~qE{FKd-D2Vp{$6AAOsJqjfO84v|EAj#XHF`|vCPR*JGBj@x zZB87WrEkcOm_L0SAfY=|j~t>Jg&?lD5CW1JNut>+P#a$|!zZ;IOY zGOI#(QkL1f!t32KSjYSBkcTMfALM{1a!R)uyig{~IUJhlAbK^U$ml*Gw50nNo5OD@ zO~j$s>7itb=C}CH@elzSW+1&$LQCeGr#krBp|Y1G|*!D8V3GXgM)4u}hvqH<2x{Ydx+ooda- zsd3>wD%~prcxS31d%ZnggviK=5h6({<33DXc`59U9*Yo}`34&kZ=QK{^=N0RjV|M_luA}zs`IjDKjl9JBzJeUhj$JCh9!m&@}dv z`XrZS9C-%hYL27Pbr&_v`GMe3~$(j3R8q|BAwK|VNQgVq8a_Chk$;%vL zAkpp^cQlD5?!i#L4DVf_Hv-0y7d2j(60fljwj_2Qbm|DVa5CmQ)R^VO^D$#u!ny0i z)Q`3Z`kf&+mJ=w5N%xZFh>67*BPeK~Fd(roQRf&eS70|nQo$L4uw$Fn<_MH-n)HzP zdu%?daSl#jS0hVl>PND|^VGU-!CTu|J?H+M*zEi5v1vqSH=92$Op7B??QGVU&dD_* zSsuqt?C)icgfkI#aPx-Y1X&m+vW@@19Uw(AS{wbM3vepS1bpZGfrnNok0+9B@&rQp zTE`oJrop&Yxs86F_u{6CAe!y?5}9EsJQ7&j zgEHNxKJj{5REm9r)e2qBH$Mhnh*~{62{p)h^5J8%^?^~d^}8dMaRVkQF$rjtpKzwG zM3dj1MD=@`HF?lF;?xRVW>LB_ zYkZN96~6gmZTCK75wOA!lRH$!iMwS3g>^5%QL9P4 zMwh6^Bzoj8yt+GFPnkmVmMScczXgowW^m>YcCaJ-Prj_ zM6DFp-zIYcBNct{Vab^)zVu(EXy+`tl4(;4&9({^XPS{b`VmS#EDcG2 z8Llt**y32f*V5kJo8yhS^`{2 zGi#?&41GS(T@F>Hfqfew&y}ID-{4h0g1PN|lD28r`%<8!ot;!AGmL z2lwbl&bVQj;pnXSs<;A=RvY_L6*5w~Qb-R9!Yy~Lo#&1~)l1Ckc}i|EB!;szEV|}H zALM=4Dk@L8cHJqD3A;A)sB77QjbwxAIU*2nC8{0ior09%mLE`EdXvlSK3CSf5E=3C zY%_Mcd03bWAMuW?dxmcq9o(Iyld|raZ=jQLi`*74%z4(;h%I({_Pk{Y8z+Yw%Ba0&>x5ji9kiB)8S>Hf3DgjKQ;>`*IubyK2K)|voPQL;BC ziA+&Qz^QDu??_4hcYMUYQfw;;D_Q(PM6vET4=-pmJz}efDXeI#%|l0Y^Hn&2m_CuW zF7;OJeobqi@CDwRwO>^GIN{eCa{o7(tJ)PWsd-2Q)GjJ}h>nSi{;-fxdwVO)>Vih| zKQN}tHc&#f_m4EtGpd1o*#?^L-7l}`joovAm#*sbN1FURP5$A<@tS14t}sGnEFo0Q zw2lX9pZLaZV-KNQ<2@3&H8;AH?huO4KdL)3>CQ8%6BC<_sfSd%OYxdu4N>dhIz3IB z*N@-ko>6-D1TjGGe!5YIl&egC?rr_iyu^~S)CY(6a6}}j_`tD5U#q>&eDa@i(Ou#S z!N~_>em>keyQ(wj_r@yIk54i%xGVqSmGN9HQ5YTE(t-SJ<6lfXv>v*l;srT z>fB)yW+6sB$1yGYCErv;=7eS3O$CO?-mh7Ay-JbMBOQ#%6O;F87Oy>%U zERm6kSaXF@>vW~BheoZ@Q7^FZ{pO=-e%g8HkNfHy%+GfoO}DrYDRE4+(JXLTKr0ex z$q}0ouGq!X7S<~JaGmh+%V+@eK9^*8P3W05EfXfhCJ7KZzBa9uG%n6j=}51~sO{_y zSrMXt(fI>PP-T8>7Mf`r*EX0FkA1s`Z}IjB+wkXj>kfScPZSfhhkH{TQC@D4Djak@ z?hjlxEDx=sHBjyZD8y{!;hSNeoxN z`)-C%Br6*=P~?<6{Mb(NC{5sjpIg2}XdRDWs~s~lUTRv=l8ScIBm5T(sJXIrg_=yK zs@gpeYOtd%b9y@FFk>H9Q$1M4&d4dON*(?h&4&q}BA^pXMMcE_cWiq9i$=jT!*RxD zk8!WDGhbLb>|gr3gW@;i9Q29;lJ=z1hoWav z@m!p7%vR1gvelKnOLdf2f(N1c^~MTx@(Ywm#RDc57WW#D>wWeaz2Um_hs--n7DPsz zHA6h}+`_dA!xG0l2vmm~&EKXK*21QK+*mCO?d*kj$Eo;uCGYe82+4$gishZe*+rYW zF405xAxl)ZN)6HysqcI$A;KcB~XJFg+<_q3qO!XnNb}n^z&ns5%R}ZMkpMmjDTW73FEh!f8f9)$_RyQ z0i%==qHW_SA_T+c0QU)F6cI@K%pcTn2kqKJS|#1(W6eiK!qcT+@ozsP4tbP)t@V{{Q{>DE`QBSKae0mZY_=Q6qo z|HaGrx(GWIw3Rx->LyV}ko&P`-+G>tfi&`NOW^NHJ%sfZd2LI)eG;C>+8xo;(jl%C z*uBuEdEbYWOkUqsVv8-1I48@^Pd*R$z-7=qI<<8<+r9Y}y3V>ttS%X>E)AYL)4ftE zV>=7UcGhTq;TpA_8JkL0r_NNBoGX=xz=4*hOC?x>T9t4QFYKJt{Kq%tz=$&>F?6f7 z#iAouENX8Uk-~Wd-v&cI>!Cy@gIPsgzm-^IJqoQyf%Q;$Iv5ICzsjsfsr9Io$3SSY zU0VOUg8K>NQ6ih2D|8I~w4nPqy-=gCzen^&Pu47)paXS+U?KRQU#IRj^dr8lc|A74 z95h|+wm_e@RBCaLhf3QI$?02G{F^)*M8-!j7|7F&PNGtFsHn>PvsbrG zA15U?Ib*j{G232mE`LtwlSo?Do>~X=^@^jZ28~Jdb4s?hQ?`~ zKjnkb;g@r9yfkmq0;8&k!ORM`#Q$x&yWV^#D0{wZ5N{m(GpZc=vu|@D9keB?9B3~# z)SD|Rq-~cp6I*1&9ES&}$%d4^$`?-7IO{k#_{_7vq;!(0xe}OpjdCak7Rcpp1KGn} z%jeNje7X{27=}qh@cW%FUnokANTqa1VTwwxMnz5l*1!FaSOTUKF$X;t_Ap*LDK?qD z)LyP6JG{L*D3|(jLiiS)mg7VWw>^DkE>2Pq8&v|TRSZ>|-r+w;jr`1)cWEhMC2>CJ zP-={F@>#gJMC;tj(IqfVOYY{GbUbP-AMhp%2k=iq>6-4ULQXNFn^Jp!jn;vkgpCVa z{n=nR)5mnI1XkR9eZ3l{h}(Z<4XfyIFl_UQ?CVhysONrX^t}7s(TV=UT~&pteE%EBOg~;Q6g9Vf`zUju%L>A;Xlp&3z zcIQ#^`)DE0|58_8itu3RjZXiMyYkYT{N`I%t4fU-Rr)|p;Q6)#NYSGpr=Sy*Nv6)D z@4=7J+fx(p~1@zy3+*Axr#dRTF>{3w=O@XP{kn}dw=Bw>miE&Isc zBb2N;u)UJhjTh^?q^vFGOK%r1PVB&S=8|6v{dEo9%?BCb&>67#DllQJ_`r~uTN!uA zjW`qqPaz3)OP<~yCM9*famU(GU*tXWC1TvMX4DsX&wRPmxMS7G7b`8XT~bnKr?;=* z$y#>RnLW>_UZq^})BMQq)e127(~0?pzJpFBau~Hc@sH|#k(_*L1{XPHc@GBFs!o+i zhA@r=cT{k8Lw%5yll_LQB!<0`LqHat0=T2C!=dQB*jn}l30vk3v)X?4&!P>XE?6yc zbFpZm>`SvSl!+6IPZpi%E@_=}_?B4{f+O)#Cs!|3MY04lOAloiYxc|attFz&1%B(4 zBKnoAb{hQMw?vn~#jdp#HC5aY-to<70EBblejF)-Q+NG_1*~a?7IY@9ZC&I@<8Mu)3=i- z|9HLAdXv|Cj=hQmSpErR#m!XvbaCKBmb*xUm~ca$`9VvpaDUQjA#6_h2c>3$@}+7+ z>o|uTe3focWG@f-N00XLkWt;GB5m>Qdn6P+;d1lZ!)yGynezGrUgaOJz3N4EYI>MD zr9jx6KTi=(CP>;q%jq6@z#5Fw2l-A$ALKjh=*@<#K1g2TJIC}vzO!CFW%WV$B#1pq z9|Ya5m;U(_^g;e+p)w#-bD?#vK)Mh0Dmokri?Azp7WmWugklw$j~SM{qZ8*n#$q41 zR)DWD{<80YybGZ&HBOMg(l^3aRx)T$mh>5+(kY=bOa&A}>g9r3Db$2pi3IwmX|T`S z4RDAsLL#v*5j1;+V|$Wi#uo1eqBi6xm+i&iN&h`RSZ|al%H>-^B^)jf3&#*EIUFjm z0XdYxLM)%tY|(joY0lO&WZ{S^ULnZBBS`$wdk#yhm9#2_S*}`V9VMwi$hX!hbj@h= z7<(Y1XskvrfS<;0dXm<8zI>@ELF6?lUU~})l;8U1O3KJ;Gy2#>e_^y1F=m93jAsQ< zs^o;$gjy@FT(`H^>yHp~5P2##i2$_(BU$Va?`im-w5)YL~WC(jh?&pM?CtFT`G+2WDTxBh^Fnne4f>Ub}Lty;%LuT{DSdo40w)y z_=dSgfAInB>wU0XTE$O_AEPBH$9rmmC^E&*=62@neN!HbU1$tyDt>NFzEL~h8DF?1 zI(_>!j`VL2rw8m?w%0hw4I9Tq;j@-1D(DL?_}p!u8@&T&b|l>)P+s#}QgI0aB9mRrH3c|}M(D%xWxzp=&D zfQ6vFK5?ygpu;bOaVpeH2q7ft9vMLFq-2cc8|^T8|bzm0cuuWTP!RVWb~uN{MsR=$<)~lxmy(>iqYT|mgQo3UAoTV z7QIY_cAM~L%tg3$a>U%TQ%%N@CfTUgxVF-0z?VY%zp6rVSt*6KP0tp%!zz%v7+w#x zmt%7vK`b*8_-t3a)xklxDp(NVU#dB=lvvkH}L ziL^;GYQ}Shs{gj0R*kJi_6Zgaq^6<}of2>bqPb>aWc{{T4Gj&g2!&6R=DCCL$cNPV zS>O;TR@TC2thFFlvEV<~8(mIW2mI#-6Wzp<9fm9mwLpLyYc#G~xA404+h(fcnXOer zALu_7Iv8eZAvV~m&Tq=}QE%>(OsmE_Qz>*yp6pQSId+Oeg^evfYqe#Tn(J>_YMX95 zeyLTxVl6d9Vxv|Yv_d>EWY$&2zFa$Q9VNm}L1?HE40Hye8$NJXk=!n z6%0)XiU9EhEIz(DF=t;R=IpFqM;DEaTGm3CWh=Z?s52&&ODefQOO!i|P(JPnj8I{s z+(q#$E-CrC#j&=?crEHLTX?vEP24LWH*fp_XuuCP@cC-v=7$f2EXZsMm3~iUU@KR2)%q{&+TnkKCd%y4cnmvQ z)38jn>oSMO*o6zLDr4vCA9K8oBSdlfIQ>(&Erhj~qxfP6HYNoRoEwCD>bRAU>{Ki83b8(oS>`p6f+BoT z_C1%w{$4p;Io%VCRT-7jIkDsUq~1J$Ur0JuE1Z#(tDG(}M)~6WiDIutzT_;a(T6+< zRS!N@zL!~w#Ru?}FbBSGMRJLAxZD*)++ZKDZCRxEc>=TASlOjDiHcI`VGsoC@GGpC zq>g=D2j=Ko%Q)}I;pUbvsRNe2)oF{pUsMSg3#Mmh8xsXPvO(#&cw)myfOYX53Xn9m zX}HRPT8D8%LF*A&+sTj}7xB+fK2cGSj^)>zfnGVTxv?Bz{}8}k0pRG&%jA*ORlP3j z@j;e2O(>5K59FqDF6w3HStZBvGN$-RsT0q&TIXeuE|~Ssi+L75+9RVX1)Cm{QR1Bf zdhBREdr$L}eMVKKw(}JV;Vd~S!jp7TasJxws+@3R1Kk6!3i(e?dN7!4Q0)~dp-+wi zjV}^^c4w%hIZ&0e)zO@&%E5R1g|_G!-AgWHzA9mO9y~yBW@6GqAS($5gHpMLmME1?!yaogH)+>CEyYVuInWspD@H zG=R=CW~F~cN{M;jXL2OgatCFY8tDC=eo8NOB{zxkHLSfKFDjOuihCKl?XOK!b}Gs1 z)^U$`d5|ZjIvA?}y7kEp|9fF{O*4(=7ZJlS90o?G zhkiv#h+C=jlIQZwbCo=0-o?bgSe$RzLCfiS-<;wD$;&-8&5620oxR&$6;0^&>B%L> zB{%C^a~8Ev>RCi#K@}lqB6YD`?m`+n@8=8J4+BUL+Ao0R&NqGpfhb#WwA-Q4fZx8T ztNf6W8`$6W;%J7PdII*?wRBYRG!$MYD5m#07cfZ>mNg)sw>$3=$3?Lk0Q`aUM%JNu zag9(>+KLqmgfVb3puvmi)*6TdMI+-nKq!7om$Sg^8c^K7A$FQVLec+9(BE zHk*IJ%vIe@LAy%?Ogi~n2@Qhg%padmBRkluq%$luENTapQLOmw{^kKoShJ6#*PM*7 z#-1>CP&#qF=q$&d%5|p}8cRGzuAr+@N(h^IPtcsT>7f5X;$(DnU%`R}WS7mrWB%Uy zL8c;W2m9COW$$r|9F&u3A|&2%#XiXrSg4n~XjQ!kyM3Ib<9kZ{KubuwxoqpDkrk-z z<|H$63RJ$$XD1?|iDHvv)rr3=5+IjxsuO54;op*1bWLp7zE>5}8P#47sp_Sdm$CAT z2mUa$)Ym;57D`Xc|#c{CuE!y$z7^{oY*ex4#--&)AqkL9i158^(;8yX;n zQ%oWOEXw~xLkNNetcPSW~GmIDiQZSM!B=4=Veq07=h2cwvK{IW-TWF zQeAqz)2x{$*ymt6fri$3pCn6c04wB(6+K{< z?0-mDpYS1ntn~-M7g%3>e<&sQc0{gHKH(IN>2quoz(EFNR21NECe1dz z(W^R9S#REoO*hOdbW+>dm_r}QxS1PK9$sYsB0O3nEG@B?IMi*5m@j;7^daFx?A7X| zR%NqJ%W`fatpx5?n4C2*yPJT{2~4hL>`_u?oLc(W{cJH|*)}tMm+SNGvC6vi^)7Rs zwc=A3cOF0kyvkN%F~RY+E|_;mmlTL;~H7zi1St}=wKZhDT)SkOv>Yv4Qd6or*Wx6tAcGG}V z9-tx*m1hrPt_015V3+`Mwvj7GH3H0W6_Pm%TODWG=yCs~(Ee+~KEsf;?Jnb06LQoLmaRCKc!4_W}m2c?#gvcJ_tYo$)&-)FCP> zReF%&xelEMnPbTcYK1}j_X(=X()q53WlFvh^Qi?&LOgU2Df*2ywrEqc-cG5;{6wR7 zV;NkLx<&~W7|zQPC-@No>U*XYr!|p>X}fch%iLU1F6l$XIMALCU(A&cqs>tF3^|B? zU6F$oLJ=zpgNcyK2>Ej{ZL28M9xT657C?9T1;vkc^lA_9r;laY<&OoNv8j-THimB- zYR^?eheJFq(<4NW_MQ?>r_l*LK_20j{WwRL3+##8aa9H$f}>Ji_FltnJSL=gIU8=R ze=Y3=+3Xh??Ur$^geIe%JUPum%Qpdfb-lRV#1Z`MzScEdP~9C%W) z01C!g0BbXJtCWRsjeuwDlClV+Pb!Ck;!oQkPsDuctH){<*_Cfh&0}O&Qb5``fgqxP z$uZ)zZaY5jT*?oUnxD7DB51AnOUjonljUrc<&4o;Qd*!QzkPC|LOdHWQ$D69j6Z&s z41!;|LaHxFG&-UD-A;k@yFqWc3~;tUZ<#E}VC$BM`Iq}FqI7YV8l6ZzmS=#s7T|3e z2Y8JRsTY@J)VY3H>%540Po`3l2anJq_97}0a&t1}n}44@%r$5k`pRlnwF*MhZZu+8@H-vomGa+;Wy=3z z#9aB6Q=SrOf}2CZS9)y2>%xfl{whO-7O`m*+Acd89BcfaZlU|1dvXST%|8T4q1 zn7_E!>O>{*DjhwWnW^x686h&9VPs)T&4627k*$@ns;OzX6Wx#=DYyb=tg#KNFNgN@!zvta3Cmv9{l&W1|sI_ zOwB^i$MRvvC`cgF;S)&i=o&{@q^YB7{Hs}{iD2Vs0h)+zSB;2n>9jWyR>#@p=qr_B z2(ehWR-uZ>$@v_{jR72H;-4*e$*5{aFDBrVXbZMUvQaWDqGz9wAhv69)UaGu+bdtr;w6?siNzfG zBUnk2`iG8Ad=TI zz7?@%WRDm5u_c=<XOHdSTVMJ+z@C%USipb&_2U80Kyvw<6SWKxePc=UQLuTqo~~eL4(B=NjJiE%``M8s$w%plan! zNu?G^&dbHMSWSG(0y2F-5|%mRm)x&)p2PdX4QM#!OCoGs&~Z5EklEEbCXsY_k%Q$+ z8*g$*HLfpvNYq|oV8ZAGpJU_}ACUKqf^1QAMphpt=w7t2D0W1BtSBHxE60f-mm7*n zLe0}-JWi6^&;{2xxK`~GLSU4yG9Hs%Rv8)m^jTqDI{RW`dKJ{Z{*y$_D*X+6%pEol z{agg3j?@MGjuzmo?=igniHrArSr_jNHjU$f^!1))_2$$j%f&k=G`uK39-VD$5S?aJ zGD`iqWfGKfBhH3nFQc^u=ZX7bW04c`I)6A=N>~kTXH8La;EIB+r-=`*nCM~WH3yay zZOy@fn~G-nOOj@CQP?OBE4}7r|E9#Z@@|QR1a;1U?yxn9Alj>3v$w8~n9H}l$T+;} zC^a6(2d}L}Kw(g7{aeR46Q)NlO;8|+F3nsw2A6rxE{l&sc{f96 z5c%l6hvJ)wbBfeQA{$@RY%x$16Jbl@!>yk>%X8^j?$0fkv%FE~%B}NesA`6o1zSHF zG5w#n7PcJN#`b^Af$gKGwyJ`ypN^P6`COJh9>)X&f=^rZoRmbzzyCBjP>?~%SC&-` z^Wq&YXT~RGr+Si+XZhNhSbU&I>?OmU2YS|{2l%l3&?*PQ=?}E*;I~K|K8vy%(=)W0 z>h$(})`veU)a2=-Ejg?s0hQHq2Y=P&;(20xX_r;R!ih~HItwxlUu-I+-Z1R#YYid ziCRm6sI`;;C+)$i3)R)Lgw^xcoA+J>i^jz_JQ{Mv+4O~#+<)4S^QcbpW!Ulb$#7U>d;D$;5&pv#<=B{jRFQy1uHNAD*R>K3DeB+MY54c_TmIFXTZmWK*vNbo zFnkdwsf)rAe$<=)gw~?Iw+NuFlZ(k|WB1L~uO7c|0;tN|*vu9YyN!t3zVIm-iW_}N zbp(%|Lt9Gk4|Y6V1Pkyi{g5+|TvyhcrK$@Vd}&D1N$w@KKg3cq%DFIW-; zKZ-cntILO8tz-IrET`+t*|QZ}JCwsu;|6CYxWpMvD)PeWtHn)D)&ig;tJ<6NB#b33 z==vrdcZ{21btdj&Miuz)Yc}#;ZSO(gJqWx9f%hQr9t7TlzMA{97+BQizGoA-&OiOYaUnr$6fdAobEQiosxssxPHg8prkSpP-)@@2G0Oy z?faD~@`yS5@!t!N|BiinH+6K$&A1C)cXSHnSUFgZwun4j)(8Xh?5D-Fe+*Z>Aei zs7r71)thIcM}|obf)}IOuSRJTUmN@0kTJSN&5*4A^rnJ(vxIUeEpk#estb>0{iiWm z3)7p5>di?iD_07x?ulJ_3>yW$(!o%Pbls>fJ63qjvBJ2f8XV)7*Qj>r&;E8W&<&UpF{V9gP}^PI=u-Y$&;O;G>A<{jlQkY7A=k6D0kTa zPa+ig9!N}fHwrowKFb@=A}PqzFHf{m%FMfllvsffRd_>HrA1NG!#8iDC>bg-wv_;O zf`w|GcZyXbsD%rX)re*KiFH^%7%G*j%ySA~l5hC{A^Vvq4wCEG)c${Y%d8K^?2sjp zaQNe!XW61>$%4t?nCtde9BzSj|?-+wFLk4SntdR}XZ`2Na!NcrX%nD{-6qj6t1FIioJ58wgNpjyN$ zwg}}SA5v++L*AKN2217OS%b22678exvCK34sUM0kA7y}k#z9L{&OcBIEwfI_z_DJht zaWlKhctm{akhnUN`2QA78LZ=iTj+i?UmS8ymp^$u`%p~l@A;nk+pGTGFMr4Bnv^%( z`a`15XN#WCh@AQsytVj@@>1qulCe*{#10$fD6mOnF=yf?$vj?V)Srom;;2Y`UPssPqRj>EjIOU6L~KUXTUjyL`#Ig-g^W zfw=mqZZz-SYKh1%6!CaSDV>DG;&#mKz^W6q9Ps(b&g@;-t}dwY*&?Bbmsyn=M^YCO z%|%tW+fdaBb;Q>0q?a$5eod!W4XsT?Y|nH{+3k($meO1rRS#F+$24w3>(JkHb0@B} zWNBF0HDP#`3A;N5GLV=V{-fVb@R|^YRl6mDOR~R1kd0AuApVx*hH#|{l>DgwZ(@lbW3Lc;>e2HEkXG7$R`Ju#x1(Af&2^fOzzgs#xl*h~{ng-1ptS9GeB9_V zzb4-{x`pfy$G(j-ig)r^BrKClc|7w%uN}q1smqKXC+qClxaf}o&olZt|`WYch~=;7iO_cvcu*Mf-;0lRS)&nP%#U+cSx&7z!8 z;mf@jkEqF;d!bHUP0Pb(keTPKTbBVKQC9pc(==uWqqx_iW zB-Fdo@Q?lJlsce5;ci_WF+clN>}Fopv4$9q7O_XMK+&7Eng8A(o1<$WPoiARj&ELo zL)D1v5vpyKKVf~VV0=#zXu94xT;pdY7khi2d}04l;r_1f*8 z;JEn-83WWk1~aI2P5@f$x%K9M0efWFe3`i)${`7}h?UAtgWsVyH2I5$vdO(f{{xP^gV`7zm{r=)~ z#5{N08tAH6tloHh2d^B}!L~0P8#?aqM>_b)$3}H<@Y||`j9K-Oz$+uYl-BQmr_bXR z$}X1w0Z(A$RHRESTFz=$qht~L0Bhy~V_LGE$S*O+LM@7o*h9{$dF~zue=t4>x43y} zFsBX(WL)?Y!eB%GgJ{er5`~x?hz*>F^5s&^aP&+Sqced5|3m8J3AvhJg;qUDmhZY-6byys48iMJDKY@DZ;>`C+_v|EgOt z8~pU^oAEd_mFgb+chy9q`U#Syl^KcZpUE~4az!U@UuxP|uTa}*Xq{BQOdb`fpkHsN z{4DwG012T{qrMS}V$`qywwV-CDj{6gsGwI7oNZk!i?iO;C(tFlRukXx3xm(6CF7(!kK)3X>qdti*~Bq+e#+I#*1e^3Z=bLZ-}UdOc_LewHp>BN$vwV5_a| zmrW~IpURe!X;16;6T>6SkqXGN@M@cO>tiI)E~+_i(ui2=uKAoGBiFx~-{H*fkRy}u zVJl%cSQDR<;EsvOCV(aC*B1P3wTbCU0LeYd5Aob@MC(SLKsZM7V0tp7PBLHNY@bG)@XH_>=uRImF zyz4||GU$ig*%01Z$7e;^rHTdKJ_Y2^dk=#jA|-+DeH- z2+Ef=1f7ux;KC9Ec;HXCNL!=vWOBW0!M;dxt4B7O=G%?xKPN(O8jcTG6~K`^ovJeS z!I4<_F~XO?mVCnAfYZq-_2ywU0dlnbwG~*wILL=-5;(?NZ$7(Mk>bSrjOsT>)mouy z&D1BWeZgayI@NLYzL7c;; zC|vDIgd}h{-a3Z+a-ypYj_nG>3PM+?v50-dNyqckJJh@Yqg^;66}%h`qaXAu7#U0a ziKa568VAn7!+oM$AxiuB<8isOw&NGFML?^d@3?_>_Y=KXJx>*@|L5ehf*p8-Eal@ovG9_>wGQp( z{j3mUk8-(wc!(qWuZ+Pj=8EEC{)}ItYvbAe);@By&1sQG%fZTd?q%klht&jUw!F@# z+h%TaZhu`eY@D)79>q^f1;&ukXFRTbwJ(>&n`_Q^%9yNuHI>`}e%iJo>G(MXZMl1ru7RZEk_A77mMjvdW{!d8+mn~~B!fMg zySzr59<1THg69gJEj(LzZsxfe5Bl4?r~~7nxI9stialb#Ea`X}-Zkk+t9`4=DPD_b z{@e5Eq~lC*F>r9}^yK1_K|8%lCoiwjU$Vzu{d>htJXMSWf5o#uL3D+J)=F42S06BP zCG0AAx-5(^zn$qKGybaDAl`9P1slYF>?PFe(ziHl8;kgBH*y-OK3TFSHbq}3PKuY9 zcD8h?t)pJ^UW=QN)V$Wh$JMjNm!6MX=qn<0b3_5`0^{>PUAz3(-kVYuc(OX?>NpZd}X1CICBFg4R6@n zKY2xcV{%jBMNf+_&=T;cJJgfh*mFf!sAlrP&I8+CZW``)4^$W0RuYeGVhuaj+@z~F z>3XtIF!0CCw=1WixNqUpw%0IO9`#KV`_%ZPASj8jX3JmRF|K{Kf9#jLO3uWatO{b{ zix}^Z|L{AsWs6>?|4`JmlY4lmpc+S3zbXU`UHRFTIjoS%H!(DwrlMR zXSpLi>x$**LHvqF^V}jCA=s;Rid`^%DU_;i>1SnLppI3`{Y8DxIlwT6DE>I|F*;Q9 zDt;0Q)Xbr)N@WtOW%CbJ{8Fi{h}ssSfgUSh)PDNulf_&X(H`t5FMAvv;70R`W4Uvr zZRRU30pjnHrmK|G+D2NFcFec2pW|dJHUENjBy~m_%z`Sl_pdS$j+Po!nDDtfId>KeL= zT!;V(aJwU+b{Trdg&98O&C>^JXaewi1p6`)CS=ErZFFR@UDRO#mCugnU9i<&nB z72kM?TaWOTSsq$vE>$&}>q;Rm97`NBgD;b{o@*uZ!6ya6E=F65Bg&S4ryTm*H>y)S z+VDZ?P9n4>*qW0Ftqq3jTmJ!9dxfS3!&x6OdkAU;n1gz6PPo+_F`aEd8iR(t1v<{3 z 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℞#BH4 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%0AGG1 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 E0Z&RQ&;S4c

1$+J{T52W)l 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 YOKq=SX{<>lZ#2c-Jl76`*TuyD5BfYv7XSbN From 6ce350456f30390327fc7b8ee12b1dba792f0a61 Mon Sep 17 00:00:00 2001 From: mercury233 Date: Wed, 17 Apr 2024 11:20:55 +0800 Subject: [PATCH 029/110] update build & sqlite --- .github/workflows/test-build.yml | 8 ++++---- sqlite3.dll | Bin 2485248 -> 2485760 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 583a10762..6995ab4c1 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -15,12 +15,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup MSBuild.exe - uses: microsoft/setup-msbuild@v1 + uses: microsoft/setup-msbuild@v2 - name: Build! run: msbuild $env:Solution_Name /t:Build /p:Configuration=Release @@ -36,7 +36,7 @@ jobs: cd .. - name: Upload build artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: dist\WindBot.7z @@ -46,7 +46,7 @@ jobs: with: repo_token: "${{ secrets.GITHUB_TOKEN }}" automatic_release_tag: "latest" - prerelease: true + prerelease: false title: "Development Build" files: | dist/WindBot.7z diff --git a/sqlite3.dll b/sqlite3.dll index dd0c7364b4c3c3d217c0f2b9acaab7215fddd56f..c2d697f2bc2129f95764e70eee0d835dace32b39 100644 GIT binary patch delta 448392 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ʯ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

A?lEas*o1BlSF`Bpf?{f$C0gv^cQFyHlh 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[mcv(WCaW;XR)mZ6(l}7*rkbJ1 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�E1;9Kk=V&{U)Jlb6IyrWJr*#ux)bsq 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