Commit 9e9d7442 authored by mercury233's avatar mercury233

update common S&T executors

parent aef57f18
......@@ -119,6 +119,21 @@ namespace WindBot.Game.AI
return null;
}
public ClientCard GetAnyEnemyMonster()
{
List<ClientCard> monsters = Enemy.GetMonsters();
ClientCard hmonster = monsters.GetHighestAttackMonster();
if (hmonster != null)
{
return hmonster;
}
foreach (ClientCard monster in monsters)
{
return monster;
}
return null;
}
public ClientCard GetProblematicCard(int attack = 0)
{
ClientCard card = Enemy.MonsterZone.GetInvincibleMonster();
......@@ -135,6 +150,20 @@ namespace WindBot.Game.AI
return GetOneEnemyBetterThanValue(attack, true);
}
public ClientCard GetBestEnemyCard()
{
ClientCard card = GetProblematicCard();
if (card != null)
return card;
card = Enemy.MonsterZone.GetHighestAttackMonster();
if (card != null)
return card;
List<ClientCard> spells = Enemy.GetSpells();
if (spells.Count > 0)
return spells[0];
return null;
}
public ClientCard GetProblematicMonsterCard(int attack = 0)
{
ClientCard card = Enemy.MonsterZone.GetInvincibleMonster();
......
......@@ -52,6 +52,7 @@ namespace WindBot.Game.AI.Decks
: base(ai, duel)
{
// 有坑先清
AddExecutor(ExecutorType.Activate, (int)CardId.鹰身女妖的羽毛扫, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, (int)CardId.银河旋风, DefaultGalaxyCyclone);
AddExecutor(ExecutorType.Activate, (int)CardId.鹰身女妖的羽毛扫);
......@@ -71,7 +72,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, (int)CardId.抵价购物, 抵价购物效果);
// 吸一口
AddExecutor(ExecutorType.Activate, (int)CardId.强欲而贪欲之壶, 强欲而贪欲之壶效果);
AddExecutor(ExecutorType.Activate, (int)CardId.强欲而贪欲之壶, DefaultPotOfDesires);
// 有亚白就跳
AddExecutor(ExecutorType.SpSummon, (int)CardId.青眼亚白龙, 青眼亚白龙特殊召唤);
......@@ -484,11 +485,6 @@ namespace WindBot.Game.AI.Decks
return true;
}
private bool 强欲而贪欲之壶效果()
{
return Bot.Deck.Count > 15;
}
private bool 苍眼银龙效果()
{
Logger.DebugWriteLine("苍眼银龙效果.");
......
......@@ -19,7 +19,7 @@ namespace WindBot.Game.AI.Decks
: base(ai, duel)
{
AddExecutor(ExecutorType.SpSummon);
AddExecutor(ExecutorType.Activate, DontChainMyself);
AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
AddExecutor(ExecutorType.SummonOrSet);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.SpellSet);
......@@ -41,9 +41,5 @@ namespace WindBot.Game.AI.Decks
return Program.Rand.Next(options.Count);
}
private bool DontChainMyself()
{
return LastChainPlayer != 0;
}
}
}
\ No newline at end of file
......@@ -170,7 +170,7 @@ namespace WindBot.Game.AI.Decks
break;
}
}
if (!hasRealMonster || GetProblematicCard() != null)*/
if (!hasRealMonster || AI.Utils.GetProblematicCard() != null)*/
needId = (int)CardId.DragunityDux;
}
......@@ -344,13 +344,13 @@ namespace WindBot.Game.AI.Decks
{
//if (AI.Utils.IsOneEnemyBetterThanValue(2500, true))
// return true;
ClientCard invincible = GetProblematicCard();
ClientCard invincible = AI.Utils.GetProblematicCard();
return invincible != null;
}
private bool ScrapDragonEffect()
{
ClientCard invincible = GetProblematicCard();
ClientCard invincible = AI.Utils.GetProblematicCard();
if (invincible == null && !AI.Utils.IsOneEnemyBetterThanValue(2800 - 1, false))
return false;
......@@ -489,11 +489,5 @@ namespace WindBot.Game.AI.Decks
}
return Duel.Player == 1;
}
private ClientCard GetProblematicCard()
{
ClientCard card = Enemy.MonsterZone.GetInvincibleMonster();
return card ?? Enemy.SpellZone.GetFloodgate();
}
}
}
\ No newline at end of file
......@@ -23,28 +23,18 @@ namespace WindBot.Game.AI.Decks
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, (int)CardId.黑洞, DefaultDarkHole);
AddExecutor(ExecutorType.Activate, (int)CardId.宇宙旋风, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, (int)CardId.神之宣告, DefaultTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.神之警告, DefaultTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.神之通告, DefaultTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.宇宙旋风, DefaultCosmicCyclone);
AddExecutor(ExecutorType.Activate, (int)CardId.神之宣告, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, (int)CardId.神之警告, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, (int)CardId.神之通告, DefaultSolemnStrike);
AddExecutor(ExecutorType.SpellSet, (int)CardId.侵略的泛发感染);
AddExecutor(ExecutorType.Activate, DontChainMyself);
AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
AddExecutor(ExecutorType.Summon);
AddExecutor(ExecutorType.SpSummon);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.SpellSet);
}
private bool DontChainMyself()
{
foreach (CardExecutor exec in Executors)
{
if (exec.Type == Type && exec.CardId == Card.Id)
return false;
}
return LastChainPlayer != 0;
}
// will be added soon...?
}
}
\ No newline at end of file
......@@ -189,11 +189,6 @@ namespace WindBot.Game.AI.Decks
return false;
}
private bool DarkHole()
{
return AI.Utils.IsEnemyBetter(false, false);
}
private bool Terraforming()
{
if (Bot.HasInHand((int)CardId.Wetlands))
......
......@@ -52,7 +52,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, (int)CardId.王家长眠之谷, 王家长眠之谷);
AddExecutor(ExecutorType.Activate, (int)CardId.奈落的落穴, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.神之警告, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.神之警告, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, (int)CardId.次元幽闭, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.降灵的仪式, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.王家长眠之谷的王墓, DefaultUniqueTrap);
......
......@@ -22,27 +22,17 @@ namespace WindBot.Game.AI.Decks
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, (int)CardId.黑洞, DefaultDarkHole);
AddExecutor(ExecutorType.Activate, (int)CardId.宇宙旋风, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, (int)CardId.神之宣告, DefaultTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.神之警告, DefaultTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.神之通告, DefaultTrap);
AddExecutor(ExecutorType.Activate, DontChainMyself);
AddExecutor(ExecutorType.Activate, (int)CardId.宇宙旋风, DefaultCosmicCyclone);
AddExecutor(ExecutorType.Activate, (int)CardId.神之宣告, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, (int)CardId.神之警告, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, (int)CardId.神之通告, DefaultSolemnStrike);
AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
AddExecutor(ExecutorType.MonsterSet);
AddExecutor(ExecutorType.SpSummon);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.SpellSet);
}
private bool DontChainMyself()
{
foreach (CardExecutor exec in Executors)
{
if (exec.Type == Type && exec.CardId == Card.Id)
return false;
}
return LastChainPlayer != 0;
}
// will be added soon...?
}
}
\ No newline at end of file
......@@ -40,7 +40,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.SpellSet, DefaultSpellSet);
AddExecutor(ExecutorType.Activate, (int)CardId.HorusTheBlackFlameDragonLv6);
AddExecutor(ExecutorType.Activate, (int)CardId.StampingDestruction, DefaultStampingDestruction);
AddExecutor(ExecutorType.Activate, (int)CardId.StampingDestruction, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, (int)CardId.MysticalSpaceTyphoon, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, (int)CardId.FoolishBurial, FoolishBurial);
AddExecutor(ExecutorType.Activate, (int)CardId.Mountain, DefaultField);
......
......@@ -112,7 +112,7 @@ namespace WindBot.Game.AI.Decks
// 坑人
AddExecutor(ExecutorType.Activate, (int)CardId.反大革命, DefaultTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.神之通告, 神之通告);
AddExecutor(ExecutorType.Activate, (int)CardId.神之通告, DefaultSolemnStrike);
AddExecutor(ExecutorType.Activate, (int)CardId.技能抽取, 技能抽取);
AddExecutor(ExecutorType.Activate, (int)CardId.虚无空间, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.强制脱出装置, DefaultCompulsoryEvacuationDevice);
......@@ -159,11 +159,6 @@ namespace WindBot.Game.AI.Decks
return true;
}
private bool 神之通告()
{
return (Duel.LifePoints[0] > 1500) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
private bool 技能抽取()
{
return (Duel.LifePoints[0] > 1000) && DefaultUniqueTrap();
......@@ -425,9 +420,5 @@ namespace WindBot.Game.AI.Decks
return false;
}
private bool DontChainMyself()
{
return LastChainPlayer != 0;
}
}
}
\ No newline at end of file
......@@ -64,7 +64,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Summon, (int)CardId.救援兔);
AddExecutor(ExecutorType.Activate, (int)CardId.救援兔, 救援兔效果);
AddExecutor(ExecutorType.Activate, (int)CardId.强欲而贪欲之壶, 强欲而贪欲之壶效果);
AddExecutor(ExecutorType.Activate, (int)CardId.强欲而贪欲之壶, DefaultPotOfDesires);
AddExecutor(ExecutorType.Summon, (int)CardId.曼陀罗天使号手, 曼陀罗天使号手通常召唤);
AddExecutor(ExecutorType.Summon, (int)CardId.打喷嚏的河马龙, 打喷嚏的河马龙通常召唤);
......@@ -94,7 +94,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.SpSummon, (int)CardId.芙莉西亚之虫惑魔, 芙莉西亚之虫惑魔特殊召唤);
AddExecutor(ExecutorType.Activate, (int)CardId.芙莉西亚之虫惑魔);
AddExecutor(ExecutorType.Activate, (int)CardId.地碎, 地碎效果);
AddExecutor(ExecutorType.Activate, (int)CardId.地碎, DefaultSmashingGround);
AddExecutor(ExecutorType.SpSummon, (int)CardId.鸟铳士卡斯泰尔, 鸟铳士卡斯泰尔特殊召唤);
AddExecutor(ExecutorType.Activate, (int)CardId.鸟铳士卡斯泰尔, 鸟铳士卡斯泰尔效果);
......@@ -507,16 +507,6 @@ namespace WindBot.Game.AI.Decks
return AI.Utils.IsEnemyBetter(false, false);
}
private bool 强欲而贪欲之壶效果()
{
return Bot.Deck.Count > 15;
}
private bool 地碎效果()
{
return AI.Utils.IsEnemyBetter(false, false);
}
private bool 陷阱卡覆盖()
{
return !Bot.HasInMonstersZone((int)CardId.No59背反之料理人, true, true);
......
......@@ -415,19 +415,5 @@ namespace WindBot.Game.AI.Decks
}
return false;
}
private ClientCard GetBestEnemyCard()
{
ClientCard card = AI.Utils.GetProblematicCard();
if (card != null)
return card;
card = Enemy.MonsterZone.GetHighestAttackMonster();
if (card != null)
return card;
List<ClientCard> spells = Enemy.GetSpells();
if (spells.Count > 0)
return spells[0];
return null;
}
}
}
......@@ -45,6 +45,7 @@ namespace WindBot.Game.AI.Decks
public ToadallyAwesomeExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, (int)CardId.鹰身女妖的羽毛扫, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, (int)CardId.银河旋风, DefaultGalaxyCyclone);
AddExecutor(ExecutorType.Activate, (int)CardId.鹰身女妖的羽毛扫);
AddExecutor(ExecutorType.Activate, (int)CardId.黑洞, DefaultDarkHole);
......
......@@ -58,7 +58,8 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, (int)CardId.我我我枪手);
// 清场
AddExecutor(ExecutorType.Activate, (int)CardId.宇宙旋风, 宇宙旋风);
AddExecutor(ExecutorType.Activate, (int)CardId.鹰身女妖的羽毛扫, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, (int)CardId.宇宙旋风, DefaultCosmicCyclone);
AddExecutor(ExecutorType.Activate, (int)CardId.鹰身女妖的羽毛扫);
AddExecutor(ExecutorType.Activate, (int)CardId.黑洞, DefaultDarkHole);
......@@ -140,9 +141,9 @@ namespace WindBot.Game.AI.Decks
// 坑人
AddExecutor(ExecutorType.Activate, (int)CardId.星光大道, DefaultTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.魔力抽取);
AddExecutor(ExecutorType.Activate, (int)CardId.神之警告, 神之警告);
AddExecutor(ExecutorType.Activate, (int)CardId.神之通告, 神之通告);
AddExecutor(ExecutorType.Activate, (int)CardId.神之宣告, 神之宣告);
AddExecutor(ExecutorType.Activate, (int)CardId.神之警告, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, (int)CardId.神之通告, DefaultSolemnStrike);
AddExecutor(ExecutorType.Activate, (int)CardId.神之宣告, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, (int)CardId.大宇宙, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.虚无空间, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, (int)CardId.波纹防护罩波浪之力, DefaultUniqueTrap);
......@@ -192,29 +193,6 @@ namespace WindBot.Game.AI.Decks
return attacker.RealPower > defender.GetDefensePower();
}
private bool 宇宙旋风()
{
foreach (ClientCard card in CurrentChain)
if (card.Id == (int)CardId.宇宙旋风)
return false;
return (Duel.LifePoints[0] > 1000) && DefaultMysticalSpaceTyphoon();
}
private bool 神之警告()
{
return (Duel.LifePoints[0] > 2000) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
private bool 神之通告()
{
return (Duel.LifePoints[0] > 1500) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
private bool 神之宣告()
{
return !(Duel.ChainTargets.Count == 1 && Card.Equals(Duel.ChainTargets[0])) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
private bool 强欲而谦虚之壶()
{
if (已发动削命)
......@@ -372,9 +350,5 @@ namespace WindBot.Game.AI.Decks
return LastChainPlayer == 1;
}
private bool DontChainMyself()
{
return LastChainPlayer != 0;
}
}
}
\ No newline at end of file
......@@ -116,9 +116,9 @@ namespace WindBot.Game.AI.Decks
// Set and activate traps
AddExecutor(ExecutorType.SpellSet, DefaultSpellSet);
AddExecutor(ExecutorType.Activate, (int)CardId.BreakthroughSkill, BreakthroughSkill);
AddExecutor(ExecutorType.Activate, (int)CardId.SolemnWarning, SolemnWarning);
AddExecutor(ExecutorType.Activate, (int)CardId.SolemnStrike, SolemnStrike);
AddExecutor(ExecutorType.Activate, (int)CardId.BreakthroughSkill, DefaultBreakthroughSkill);
AddExecutor(ExecutorType.Activate, (int)CardId.SolemnWarning, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, (int)CardId.SolemnStrike, DefaultSolemnStrike);
}
public override bool OnSelectHand()
......@@ -276,21 +276,6 @@ namespace WindBot.Game.AI.Decks
return true;
}
private bool BreakthroughSkill()
{
return (CurrentChain.Count > 0 && DefaultTrap());
}
private bool SolemnWarning()
{
return (Duel.LifePoints[0] > 2000) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
private bool SolemnStrike()
{
return (Duel.LifePoints[0] > 1500) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
private bool MonsterRepos()
{
if (Card.Id == (int)CardId.NumberS39UtopiatheLightning)
......
......@@ -39,11 +39,7 @@ namespace WindBot.Game.AI.Decks
十二兽虎炮 = 11510448,
十二兽狗环 = 41375811,
十二兽龙枪 = 48905153,
十二兽牛犄 = 85115440,
雷击坏兽雷鸣龙王 = 48770333,
怒炎坏兽多哥兰 = 93332803,
对坏兽用决战兵器超级机械多哥兰 = 84769941
十二兽牛犄 = 85115440
}
bool 已特殊召唤虎炮 = false;
......@@ -56,14 +52,14 @@ namespace WindBot.Game.AI.Decks
{
// Quick spells
AddExecutor(ExecutorType.Activate, (int)CardId.鹰身女妖的羽毛扫);
AddExecutor(ExecutorType.Activate, (int)CardId.遭受妨碍的坏兽安眠, 遭受妨碍的坏兽安眠效果);
AddExecutor(ExecutorType.Activate, (int)CardId.遭受妨碍的坏兽安眠, DefaultInterruptedKaijuSlumber);
AddExecutor(ExecutorType.Activate, (int)CardId.黑洞, DefaultDarkHole);
AddExecutor(ExecutorType.SpSummon, (int)CardId.海龟坏兽加美西耶勒, 坏兽特殊召唤);
AddExecutor(ExecutorType.SpSummon, (int)CardId.黏丝坏兽库莫古斯, 坏兽特殊召唤);
AddExecutor(ExecutorType.SpSummon, (int)CardId.怪粉坏兽加达拉, 坏兽特殊召唤);
AddExecutor(ExecutorType.SpSummon, (int)CardId.多次元坏兽拉迪安, 坏兽特殊召唤);
AddExecutor(ExecutorType.SpSummon, (int)CardId.坏星坏兽席兹奇埃鲁, 坏兽特殊召唤);
AddExecutor(ExecutorType.SpSummon, (int)CardId.海龟坏兽加美西耶勒, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, (int)CardId.黏丝坏兽库莫古斯, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, (int)CardId.怪粉坏兽加达拉, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, (int)CardId.多次元坏兽拉迪安, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, (int)CardId.坏星坏兽席兹奇埃鲁, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.Activate, (int)CardId.星球改造);
AddExecutor(ExecutorType.Activate, (int)CardId.暴走魔法阵);
......@@ -150,73 +146,6 @@ namespace WindBot.Game.AI.Decks
return attacker.RealPower > defender.GetDefensePower();
}
private bool 遭受妨碍的坏兽安眠效果()
{
if (Card.Location == CardLocation.Grave)
{
AI.SelectCard(new[]
{
(int)CardId.海龟坏兽加美西耶勒,
(int)CardId.黏丝坏兽库莫古斯,
(int)CardId.多次元坏兽拉迪安,
(int)CardId.怪粉坏兽加达拉
});
return true;
}
AI.SelectCard(new[]
{
(int)CardId.坏星坏兽席兹奇埃鲁,
(int)CardId.多次元坏兽拉迪安,
(int)CardId.怪粉坏兽加达拉,
(int)CardId.黏丝坏兽库莫古斯
});
AI.SelectNextCard(new[]
{
(int)CardId.海龟坏兽加美西耶勒,
(int)CardId.黏丝坏兽库莫古斯,
(int)CardId.怪粉坏兽加达拉,
(int)CardId.多次元坏兽拉迪安
});
return DefaultDarkHole();
}
private bool 坏兽特殊召唤()
{
IList<int> kaijus = new[] {
(int)CardId.坏星坏兽席兹奇埃鲁,
(int)CardId.怪粉坏兽加达拉,
(int)CardId.海龟坏兽加美西耶勒,
(int)CardId.多次元坏兽拉迪安,
(int)CardId.黏丝坏兽库莫古斯,
(int)CardId.雷击坏兽雷鸣龙王,
(int)CardId.怒炎坏兽多哥兰,
(int)CardId.对坏兽用决战兵器超级机械多哥兰
};
foreach (ClientCard monster in Enemy.GetMonsters())
{
if (kaijus.Contains(monster.Id))
return Card.GetDefensePower() > monster.GetDefensePower();
}
ClientCard card = Enemy.MonsterZone.GetFloodgate();
if (card != null)
{
AI.SelectCard(card);
return true;
}
card = Enemy.MonsterZone.GetDangerousMonster();
if (card != null)
{
AI.SelectCard(card);
return true;
}
card = AI.Utils.GetOneEnemyBetterThanValue(Card.GetDefensePower(), false);
if (card != null)
{
AI.SelectCard(card);
return true;
}
return false;
}
private bool 电光皇特殊召唤()
{
......
......@@ -11,7 +11,16 @@ namespace WindBot.Game.AI
{
private enum CardId
{
JizukirutheStarDestroyingKaiju = 63941210,
GadarlatheMysteryDustKaiju = 36956512,
GamecieltheSeaTurtleKaiju = 55063751,
RadiantheMultidimensionalKaiju = 28674152,
KumongoustheStickyStringKaiju = 29726552,
ThunderKingtheLightningstrikeKaiju = 48770333,
DogorantheMadFlameKaiju = 93332803,
SuperAntiKaijuWarMachineMechaDogoran = 84769941,
MysticalSpaceTyphoon = 5318639,
CosmicCyclone = 8267140,
ChickenGame = 67616300
}
......@@ -21,17 +30,15 @@ namespace WindBot.Game.AI
AddExecutor(ExecutorType.Activate, (int)CardId.ChickenGame, DefaultChickenGame);
}
/// <summary>
/// Destroy face-down cards first, in our turn.
/// </summary>
protected bool DefaultMysticalSpaceTyphoon()
{
foreach (ClientCard card in CurrentChain)
if (card.Id == (int)CardId.MysticalSpaceTyphoon)
return false;
return DefaultStampingDestruction();
}
protected bool DefaultStampingDestruction()
{
List<ClientCard> spells = Enemy.GetSpells();
if (spells.Count == 0)
return false;
......@@ -56,11 +63,26 @@ namespace WindBot.Game.AI
return true;
}
/// <summary>
/// Destroy face-down cards first, in our turn.
/// </summary>
protected bool DefaultCosmicCyclone()
{
foreach (ClientCard card in CurrentChain)
if (card.Id == (int)CardId.CosmicCyclone)
return false;
return (Duel.LifePoints[0] > 1000) && DefaultMysticalSpaceTyphoon();
}
/// <summary>
/// Activate if avail.
/// </summary>
protected bool DefaultGalaxyCyclone()
{
List<ClientCard> spells = Enemy.GetSpells();
if (spells.Count == 0)
return false;
ClientCard selected = null;
if (Card.Location == CardLocation.Grave)
......@@ -97,6 +119,9 @@ namespace WindBot.Game.AI
return true;
}
/// <summary>
/// Set the highest ATK level 4+ effect enemy monster.
/// </summary>
protected bool DefaultBookOfMoon()
{
if (AI.Utils.IsEnemyBetter(true, true))
......@@ -111,6 +136,9 @@ namespace WindBot.Game.AI
return false;
}
/// <summary>
/// Return problematic monster, and if this card become target, return any enemy monster.
/// </summary>
protected bool DefaultCompulsoryEvacuationDevice()
{
ClientCard target = AI.Utils.GetProblematicMonsterCard();
......@@ -123,8 +151,8 @@ namespace WindBot.Game.AI
{
if (Card.Equals(card))
{
List<ClientCard> monsters = Enemy.GetMonsters();
foreach (ClientCard monster in monsters)
ClientCard monster = AI.Utils.GetAnyEnemyMonster();
if (monster != null)
{
AI.SelectCard(monster);
return true;
......@@ -134,6 +162,9 @@ namespace WindBot.Game.AI
return false;
}
/// <summary>
/// Revive the best monster when we don't have better one in field.
/// </summary>
protected bool DefaultCallOfTheHaunted()
{
if (!AI.Utils.IsEnemyBetter(true, true))
......@@ -152,39 +183,121 @@ namespace WindBot.Game.AI
return true;
}
/// <summary>
/// Chain the enemy monster.
/// </summary>
protected bool DefaultBreakthroughSkill()
{
ClientCard LastChainCard = GetLastChainCard();
if (LastChainCard == null)
return false;
return LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone && DefaultUniqueTrap();
}
/// <summary>
/// Activate only except this card is the target or we summon monsters.
/// </summary>
protected bool DefaultSolemnJudgment()
{
return !(Duel.ChainTargets.Count == 1 && Card.Equals(Duel.ChainTargets[0])) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
/// <summary>
/// Activate only except we summon monsters.
/// </summary>
protected bool DefaultSolemnWarning()
{
return (Duel.LifePoints[0] > 2000) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
/// <summary>
/// Activate only except we summon monsters.
/// </summary>
protected bool DefaultSolemnStrike()
{
return (Duel.LifePoints[0] > 1500) && !(Duel.Player == 0 && LastChainPlayer == -1) && DefaultTrap();
}
/// <summary>
/// Activate when all enemy monsters have better ATK.
/// </summary>
protected bool DefaultTorrentialTribute()
{
return (AI.Utils.IsEnemyBetter(true, true));
}
/// <summary>
/// Activate enemy have more S&T.
/// </summary>
protected bool DefaultHeavyStorm()
{
return Bot.GetSpellCount() < Enemy.GetSpellCount();
}
/// <summary>
/// Activate before other winds, if enemy have more than 2 S&T.
/// </summary>
protected bool DefaultHarpiesFeatherDusterFirst()
{
return Enemy.GetSpellCount() >= 2;
}
/// <summary>
/// Activate when one enemy monsters have better ATK.
/// </summary>
protected bool DefaultHammerShot()
{
return AI.Utils.IsEnemyBetter(true, false);
}
/// <summary>
/// Activate when one enemy monsters have better ATK or DEF.
/// </summary>
protected bool DefaultDarkHole()
{
return AI.Utils.IsEnemyBetter(false, false);
}
/// <summary>
/// Activate when one enemy monsters have better ATK or DEF.
/// </summary>
protected bool DefaultRaigeki()
{
return AI.Utils.IsEnemyBetter(false, false);
}
/// <summary>
/// Activate when one enemy monsters have better ATK or DEF.
/// </summary>
protected bool DefaultSmashingGround()
{
return AI.Utils.IsEnemyBetter(false, false);
}
/// <summary>
/// Activate when we have more than 15 cards in deck.
/// </summary>
protected bool DefaultPotOfDesires()
{
return Bot.Deck.Count > 15;
}
/// <summary>
/// Set traps only and avoid block the activation of other cards.
/// </summary>
protected bool DefaultSpellSet()
{
return Card.IsTrap() && Bot.GetSpellCountWithoutField() < 4;
}
/// <summary>
/// Summon with tributes ATK lower.
/// </summary>
protected bool DefaultTributeSummon()
{
foreach (ClientCard card in Bot.SpellZone)
foreach (ClientCard card in Bot.MonsterZone)
{
if (card != null &&
card.Id == Card.Id &&
......@@ -196,17 +309,23 @@ namespace WindBot.Game.AI
{
ClientCard tributeCard = Bot.MonsterZone[j];
if (tributeCard == null) continue;
if (tributeCard.Attack < Card.Attack)
if (tributeCard.GetDefensePower() < Card.Attack)
tributecount--;
}
return tributecount <= 0;
}
/// <summary>
/// Activate when we have no field.
/// </summary>
protected bool DefaultField()
{
return Bot.SpellZone[5] == null;
}
/// <summary>
/// Turn if all enemy is better.
/// </summary>
protected bool DefaultMonsterRepos()
{
bool enemyBetter = AI.Utils.IsEnemyBetter(true, true);
......@@ -218,11 +337,17 @@ namespace WindBot.Game.AI
return false;
}
/// <summary>
/// Chain enemy activation or summon.
/// </summary>
protected bool DefaultTrap()
{
return (LastChainPlayer == -1 && Duel.LastSummonPlayer != 0) || LastChainPlayer == 1;
}
/// <summary>
/// Activate when avail and no other our trap card in this chain or face-up.
/// </summary>
protected bool DefaultUniqueTrap()
{
if (HasChainedTrap(0))
......@@ -239,6 +364,22 @@ namespace WindBot.Game.AI
return true;
}
/// <summary>
/// Dumb way to avoid the bot chain in mess.
/// </summary>
protected bool DefaultDontChainMyself()
{
foreach (CardExecutor exec in Executors)
{
if (exec.Type == Type && exec.CardId == Card.Id)
return false;
}
return LastChainPlayer != 0;
}
/// <summary>
/// Draw when we have lower LP, or destroy it. Can be overrided.
/// </summary>
protected bool DefaultChickenGame()
{
int count = 0;
......@@ -256,8 +397,16 @@ namespace WindBot.Game.AI
return false;
}
/// <summary>
/// Clever enough.
/// </summary>
protected bool DefaultDimensionalBarrier()
{
const int RITUAL = 0;
const int FUSION = 1;
const int SYNCHRO = 2;
const int XYZ = 3;
const int PENDULUM = 4;
if (Duel.Player != 0)
{
List<ClientCard> monsters = Enemy.GetMonsters();
......@@ -272,21 +421,21 @@ namespace WindBot.Game.AI
nontuner = true;
if (monster.IsOneForXyz())
{
AI.SelectOption(3);
AI.SelectOption(XYZ);
return true;
}
levels[monster.Level] = levels[monster.Level] + 1;
}
if (tuner && nontuner)
{
AI.SelectOption(2);
AI.SelectOption(SYNCHRO);
return true;
}
for (int i=1; i<=12; i++)
{
if (levels[i]>1)
{
AI.SelectOption(3);
AI.SelectOption(XYZ);
return true;
}
}
......@@ -294,7 +443,7 @@ namespace WindBot.Game.AI
ClientCard r = Enemy.SpellZone[7];
if (l != null && r != null && l.LScale != r.RScale)
{
AI.SelectOption(4);
AI.SelectOption(PENDULUM);
return true;
}
}
......@@ -303,27 +452,27 @@ namespace WindBot.Game.AI
{
if (lastchaincard.HasType(CardType.Ritual))
{
AI.SelectOption(0);
AI.SelectOption(RITUAL);
return true;
}
if (lastchaincard.HasType(CardType.Fusion))
{
AI.SelectOption(1);
AI.SelectOption(FUSION);
return true;
}
if (lastchaincard.HasType(CardType.Synchro))
{
AI.SelectOption(2);
AI.SelectOption(SYNCHRO);
return true;
}
if (lastchaincard.HasType(CardType.Xyz))
{
AI.SelectOption(3);
AI.SelectOption(XYZ);
return true;
}
if (lastchaincard.IsFusionSpell())
{
AI.SelectOption(1);
AI.SelectOption(FUSION);
return true;
}
}
......@@ -331,11 +480,86 @@ namespace WindBot.Game.AI
{
if (Card.Equals(card))
{
AI.SelectOption(3);
AI.SelectOption(XYZ);
return true;
}
}
return false;
}
/// <summary>
/// Clever enough.
/// </summary>
protected bool DefaultInterruptedKaijuSlumber()
{
if (Card.Location == CardLocation.Grave)
{
AI.SelectCard(new[]
{
(int)CardId.GamecieltheSeaTurtleKaiju,
(int)CardId.KumongoustheStickyStringKaiju,
(int)CardId.RadiantheMultidimensionalKaiju,
(int)CardId.GadarlatheMysteryDustKaiju
});
return true;
}
AI.SelectCard(new[]
{
(int)CardId.JizukirutheStarDestroyingKaiju,
(int)CardId.RadiantheMultidimensionalKaiju,
(int)CardId.GadarlatheMysteryDustKaiju,
(int)CardId.KumongoustheStickyStringKaiju
});
AI.SelectNextCard(new[]
{
(int)CardId.GamecieltheSeaTurtleKaiju,
(int)CardId.KumongoustheStickyStringKaiju,
(int)CardId.GadarlatheMysteryDustKaiju,
(int)CardId.RadiantheMultidimensionalKaiju
});
return DefaultDarkHole();
}
/// <summary>
/// Clever enough.
/// </summary>
protected bool DefaultKaijuSpsummon()
{
IList<int> kaijus = new[] {
(int)CardId.JizukirutheStarDestroyingKaiju,
(int)CardId.GadarlatheMysteryDustKaiju,
(int)CardId.GamecieltheSeaTurtleKaiju,
(int)CardId.RadiantheMultidimensionalKaiju,
(int)CardId.KumongoustheStickyStringKaiju,
(int)CardId.ThunderKingtheLightningstrikeKaiju,
(int)CardId.DogorantheMadFlameKaiju,
(int)CardId.SuperAntiKaijuWarMachineMechaDogoran
};
foreach (ClientCard monster in Enemy.GetMonsters())
{
if (kaijus.Contains(monster.Id))
return Card.GetDefensePower() > monster.GetDefensePower();
}
ClientCard card = Enemy.MonsterZone.GetFloodgate();
if (card != null)
{
AI.SelectCard(card);
return true;
}
card = Enemy.MonsterZone.GetDangerousMonster();
if (card != null)
{
AI.SelectCard(card);
return true;
}
card = AI.Utils.GetOneEnemyBetterThanValue(Card.GetDefensePower(), false);
if (card != null)
{
AI.SelectCard(card);
return true;
}
return false;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment