diff --git a/Game/AI/DefaultExecutor.cs b/Game/AI/DefaultExecutor.cs
index fe1ac360..cd968140 100644
--- a/Game/AI/DefaultExecutor.cs
+++ b/Game/AI/DefaultExecutor.cs
@@ -127,10 +127,49 @@ protected class _CardId
public const int DivineArsenalAAZEUS_SkyThunder = 90448279;
public const int RescueACEHydrant = 37617348;
+
+ public const int LabrynthArchfiend = 48745395;
+ public const int DynaHeroFurHire = 25123713;
+ public const int BelialMarquisOfDarkness = 33655493;
+ public const int PerformapalBarokuriboh = 19050066;
+ public const int HarpiesPetDragonFearsomeFireBlast = 4991081;
+ 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 LadyOfD = 67511500;
+ public const int MermailAbysslung = 95466842;
+ 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;
}
protected class _Setcode
{
+ public const int Watt = 0xe;
+ public const int Speedroid = 0x2016;
+ public const int EarthboundImmortal = 0x1021;
+ public const int Nordic = 0x42;
+ public const int Harpie = 0x64;
+ public const int Ghostrick = 0x8d;
+ public const int Performapal = 0x9f;
+ public const int FurHire = 0x114;
+ public const int Altergeist = 0x103;
public const int RescueACE = 0x18b;
}
@@ -143,6 +182,46 @@ 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.LabrynthArchfiend, defender => defender.HasRace(CardRace.Fiend)},
+ {_CardId.BelialMarquisOfDarkness, defender => defender.IsFaceup()},
+ {_CardId.PerformapalBarokuriboh, defender => true},
+ {_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.LadyOfD, defender => defender.HasRace(CardRace.Dragon)},
+ {_CardId.MermailAbysslung, defender => defender.HasAttribute(CardAttribute.Water)},
+ {_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}
+ };
+
///
/// Decide which card should the attacker attack.
///
@@ -242,27 +321,33 @@ public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender
}
}
- if (Enemy.HasInMonstersZone(_CardId.MekkKnightCrusadiaAstram, true) && !(defender).IsCode(_CardId.MekkKnightCrusadiaAstram))
- return false;
-
- if (Enemy.HasInMonstersZone(_CardId.DupeFrog, true) && !(defender).IsCode(_CardId.DupeFrog))
- return false;
+ foreach (ClientCard protecter in Enemy.GetMonsters())
+ {
+ if (!protecter.IsDisabled() && protecter != defender && DefenderProtectRule.ContainsKey(protecter.Id))
+ {
+ Func defenderRule = card => false;
+ if (DefenderProtectRule.TryGetValue(protecter.Id, out defenderRule))
+ {
+ if (defenderRule(defender)) 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)))
return false;
- if (Enemy.GetMonsters().Any(monster => !monster.Equals(defender) && monster.IsCode(_CardId.HamonLordofStrikingThunder) && !monster.IsDisabled() && monster.IsDefense()))
- return false;
-
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;
-
+
+ if (defender.HasSetcode(_Setcode.EarthboundImmortal) && !defender.IsDisabled())
+ return false;
+
return true;
}
@@ -1227,7 +1312,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 +1348,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);