Commit 36a6568b authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:moecube/windbot

parents 1e5a7764 67ef67af
......@@ -178,4 +178,3 @@ AI_LV3 SUPPORT_NEW_MASTER_RULE
Name=彩音 Deck=DarkMagician Dialog=ayane.zh-CN
黑魔术师卡组。
AI_LV3 SUPPORT_NEW_MASTER_RULE
#created by ...
#main
93920420
5560911
4055337
4055337
98169343
61283655
57835716
57835716
57835716
28985331
21441617
4334811
90432163
36426778
14558127
14558127
73642296
73642296
23434538
23434538
23434538
9742784
32807846
63166095
63166095
73628505
81439173
24224830
24224830
24224830
25733157
52340444
35371948
35371948
35371948
90351981
98827725
25542642
25542642
703897
#extra
27548199
68431965
93854893
93854893
85289965
76145142
26692769
2857636
30741503
30741503
30741503
50588353
63288573
3679218
60303245
!side
82385847
82385847
78661338
78661338
78661338
34267821
34267821
34267821
18144506
37520316
37520316
37520316
43898403
43898403
43898403
#created by ygopro2
#main
97268402
97268402
97268402
94620082
94620082
94620082
26889158
26889158
26889158
89662401
14558127
14558127
20618081
56003780
52277807
52277807
52277807
23434538
23434538
23434538
16188701
16188701
16188701
52155219
52155219
52155219
24224830
24224830
24224830
81439174
18144507
1295111
14934922
51339637
51339637
10045474
10045474
10045474
41420027
41420027
#extra
6983839
87327776
87327776
87871125
87871125
87871125
31833038
14812471
14812471
14812471
41463182
41463182
48815792
2857636
85289965
!side
64178424
......@@ -7,7 +7,7 @@
"我的超主流卡组需要{0}才能玩。"
],
"duelstart": [
"闪刀姬卡组测试中,渣操是正常情况,请多指教。",
"自奏圣乐卡组测试中,渣操是正常情况,请多指教。",
"超主流是游戏王的一环,不爽不要玩。",
"抄主流是游戏王的一环,不爽不要玩。",
"抄来的卡组不会用,怎么办?"
......@@ -59,6 +59,7 @@
"出来吧,{0}!",
"出现吧,{0}!",
"我召唤了美丽的{0}!",
"我召唤了强大的{0}!",
"我呼唤{0}参加战斗!",
"我呼唤出{0}。",
"让我召唤{0}。"
......
{
"welcome": [
"今天又是谁来拜访本茶会啦?",
"最近茶会总是没有人,怎么办呢"
],
"deckerror": [
"我的超主流卡组需要{0}才能玩。"
],
"duelstart": [
"那么,本小姐要上啦!",
"本小姐没那么容易被打败的!",
"本小姐的牌技还是不错的!",
"大家为本小姐加油哦。"
],
"newturn": [
"到我的回合了,抽卡!",
"我的回合,抽卡!",
"我抽了一张卡。"
],
"endturn": [
"回合结束。",
"我的回合结束了。",
"轮到你啦!快点!",
"轮到你了。"
],
"directattack": [
"{0},直接攻击!",
"{0},给我上!",
"{0},给本小姐上!",
"{0},不要停,给我上!",
"{0},给我上,有糖吃。",
"{0},给我上,这局赢定啦!",
"对面没怪了?好,{0},给我上!"
],
"attack": [
"{0},给我打倒{1}!",
"{0},替本小姐打倒{1}!",
"{0},打倒{1}!",
"{0},冲向那只{1}!",
"{0},把你的力量释放到{1}上吧!"
],
"ondirectattack": [
"这么可怕的吗…",
"本小姐这次让你一回。",
"果然本小姐还是太弱了……"
],
"facedownmonstername": "怪兽",
"activate": [
"本小姐发动{0}。",
"本小姐使用{0}。"
],
"summon": [
"我召唤{0}。",
"本小姐召唤{0}。",
"出来吧,{0}!",
"出现吧,{0}!",
"给我出来,{0}!",
"给本小姐出来,{0}!"
],
"setmonster": [
"我放置了一只怪兽。",
"我里侧表示放置了一只怪兽。"
],
"chaining": [
"本小姐发动{0}!",
"本小姐使用{0}!",
"本小姐使用{0},惊喜吗?",
"送给你一个大惊喜。本小姐发动{0}!",
"没留意吧!本小姐要使用{0}了!"
]
}
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using YGOSharp.OCGWrapper.Enums;
namespace WindBot.Game.AI
{
public class AIFunctions
public class AIUtil
{
public Duel Duel { get; private set; }
public ClientField Bot { get; private set; }
public ClientField Enemy { get; private set; }
public AIFunctions(Duel duel)
public AIUtil(Duel duel)
{
Duel = duel;
Bot = Duel.Fields[0];
Enemy = Duel.Fields[1];
}
public static int CompareCardAttack(ClientCard cardA, ClientCard cardB)
{
if (cardA.Attack < cardB.Attack)
return -1;
if (cardA.Attack == cardB.Attack)
return 0;
return 1;
}
public static int CompareDefensePower(ClientCard cardA, ClientCard cardB)
{
if (cardA == null && cardB == null)
return 0;
if (cardA == null)
return -1;
if (cardB == null)
return 1;
int powerA = cardA.GetDefensePower();
int powerB = cardB.GetDefensePower();
if (powerA < powerB)
return -1;
if (powerA == powerB)
return 0;
return 1;
}
/// <summary>
/// Get the total ATK Monster of the player.
/// </summary>
......@@ -129,7 +104,7 @@ namespace WindBot.Game.AI
public ClientCard GetOneEnemyBetterThanValue(int value, bool onlyATK = false, bool canBeTarget = false)
{
return Enemy.MonsterZone.GetMonsters()
.FirstOrDefault(card => card.GetDefensePower() > value && (!onlyATK || card.IsAttack()) && (!canBeTarget || !card.IsShouldNotBeTarget()));
.FirstOrDefault(card => card.GetDefensePower() >= value && (!onlyATK || card.IsAttack()) && (!canBeTarget || !card.IsShouldNotBeTarget()));
}
public ClientCard GetOneEnemyBetterThanMyBest(bool onlyATK = false, bool canBeTarget = false)
......@@ -248,11 +223,11 @@ namespace WindBot.Game.AI
{
if (Duel.IsNewRule)
{
return Duel.Fields[player].SpellZone[id*4];
return Duel.Fields[player].SpellZone[id * 4];
}
else
{
return Duel.Fields[player].SpellZone[6+id];
return Duel.Fields[player].SpellZone[6 + id];
}
}
......@@ -266,57 +241,70 @@ namespace WindBot.Game.AI
return Duel.Turn == 1 || Duel.Phase == DuelPhase.Main2;
}
internal bool inListOrNull(ClientCard card, IList<ClientCard> list)
public int GetBotAvailZonesFromExtraDeck(IList<ClientCard> remove)
{
ClientCard[] BotMZone = (ClientCard[])Bot.MonsterZone.Clone();
ClientCard[] EnemyMZone = (ClientCard[])Enemy.MonsterZone.Clone();
for (int i = 0; i < 7; i++)
{
return card == null || list.Contains(card);
if (remove.Contains(BotMZone[i])) BotMZone[i] = null;
if (remove.Contains(EnemyMZone[i])) EnemyMZone[i] = null;
}
public int GetBotAvailZonesFromExtraDeck(IList<ClientCard> remove)
{
if (!Duel.IsNewRule)
return Zones.MainMonsterZones;
int result = 0;
if (inListOrNull(Bot.MonsterZone[5], remove) && inListOrNull(Bot.MonsterZone[6], remove) &&
(inListOrNull(Enemy.MonsterZone[5], remove) || inListOrNull(Enemy.MonsterZone[6], remove)))
result |= Zones.ExtraMonsterZones;
if (inListOrNull(Bot.MonsterZone[0], remove) &&
(!inListOrNull(Bot.MonsterZone[1], remove) && Bot.MonsterZone[1].HasLinkMarker(CardLinkMarker.Left) ||
!inListOrNull(Bot.MonsterZone[5], remove) && Bot.MonsterZone[5].HasLinkMarker(CardLinkMarker.BottomLeft) ||
!inListOrNull(Enemy.MonsterZone[6], remove) && Enemy.MonsterZone[6].HasLinkMarker(CardLinkMarker.TopRight)))
result += Zones.z0;
if (inListOrNull(Bot.MonsterZone[1], remove) &&
(!inListOrNull(Bot.MonsterZone[0], remove) && Bot.MonsterZone[0].HasLinkMarker(CardLinkMarker.Right) ||
!inListOrNull(Bot.MonsterZone[2], remove) && Bot.MonsterZone[2].HasLinkMarker(CardLinkMarker.Left) ||
!inListOrNull(Bot.MonsterZone[5], remove) && Bot.MonsterZone[5].HasLinkMarker(CardLinkMarker.Bottom) ||
!inListOrNull(Enemy.MonsterZone[6], remove) && Enemy.MonsterZone[6].HasLinkMarker(CardLinkMarker.Top)))
result += Zones.z1;
if (inListOrNull(Bot.MonsterZone[2], remove) &&
(!inListOrNull(Bot.MonsterZone[1], remove) && Bot.MonsterZone[1].HasLinkMarker(CardLinkMarker.Right) ||
!inListOrNull(Bot.MonsterZone[3], remove) && Bot.MonsterZone[3].HasLinkMarker(CardLinkMarker.Left) ||
!inListOrNull(Bot.MonsterZone[5], remove) && Bot.MonsterZone[5].HasLinkMarker(CardLinkMarker.BottomRight) ||
!inListOrNull(Enemy.MonsterZone[6], remove) && Enemy.MonsterZone[6].HasLinkMarker(CardLinkMarker.TopLeft) ||
!inListOrNull(Bot.MonsterZone[6], remove) && Bot.MonsterZone[6].HasLinkMarker(CardLinkMarker.BottomLeft) ||
!inListOrNull(Enemy.MonsterZone[5], remove) && Enemy.MonsterZone[5].HasLinkMarker(CardLinkMarker.TopRight)))
result += Zones.z2;
if (inListOrNull(Bot.MonsterZone[3], remove) &&
(!inListOrNull(Bot.MonsterZone[2], remove) && Bot.MonsterZone[2].HasLinkMarker(CardLinkMarker.Right) ||
!inListOrNull(Bot.MonsterZone[4], remove) && Bot.MonsterZone[4].HasLinkMarker(CardLinkMarker.Left) ||
!inListOrNull(Bot.MonsterZone[6], remove) && Bot.MonsterZone[6].HasLinkMarker(CardLinkMarker.Bottom) ||
!inListOrNull(Enemy.MonsterZone[5], remove) && Enemy.MonsterZone[5].HasLinkMarker(CardLinkMarker.Top)))
result += Zones.z3;
if (inListOrNull(Bot.MonsterZone[4], remove) &&
(!inListOrNull(Bot.MonsterZone[3], remove) && Bot.MonsterZone[3].HasLinkMarker(CardLinkMarker.Right) ||
!inListOrNull(Bot.MonsterZone[6], remove) && Bot.MonsterZone[6].HasLinkMarker(CardLinkMarker.BottomRight) ||
!inListOrNull(Enemy.MonsterZone[5], remove) && Enemy.MonsterZone[5].HasLinkMarker(CardLinkMarker.TopLeft)))
result += Zones.z4;
if (BotMZone[5] == null && BotMZone[6] == null)
{
if (EnemyMZone[5] == null)
result |= Zones.z6;
if (EnemyMZone[6] == null)
result |= Zones.z5;
}
if (BotMZone[0] == null &&
((BotMZone[1]?.HasLinkMarker(CardLinkMarker.Left) ?? false) ||
(BotMZone[5]?.HasLinkMarker(CardLinkMarker.BottomLeft) ?? false) ||
(EnemyMZone[6]?.HasLinkMarker(CardLinkMarker.TopRight) ?? false)))
result |= Zones.z0;
if (BotMZone[1] == null &&
((BotMZone[0]?.HasLinkMarker(CardLinkMarker.Right) ?? false) ||
(BotMZone[2]?.HasLinkMarker(CardLinkMarker.Left) ?? false) ||
(BotMZone[5]?.HasLinkMarker(CardLinkMarker.Bottom) ?? false) ||
(EnemyMZone[6]?.HasLinkMarker(CardLinkMarker.Top) ?? false)))
result |= Zones.z1;
if (BotMZone[2] == null &&
((BotMZone[1]?.HasLinkMarker(CardLinkMarker.Right) ?? false) ||
(BotMZone[3]?.HasLinkMarker(CardLinkMarker.Left) ?? false) ||
(BotMZone[5]?.HasLinkMarker(CardLinkMarker.BottomRight) ?? false) ||
(EnemyMZone[6]?.HasLinkMarker(CardLinkMarker.TopLeft) ?? false) ||
(BotMZone[6]?.HasLinkMarker(CardLinkMarker.BottomLeft) ?? false) ||
(EnemyMZone[5]?.HasLinkMarker(CardLinkMarker.TopRight) ?? false)))
result |= Zones.z2;
if (BotMZone[3] == null &&
((BotMZone[2]?.HasLinkMarker(CardLinkMarker.Right) ?? false) ||
(BotMZone[4]?.HasLinkMarker(CardLinkMarker.Left) ?? false) ||
(BotMZone[6]?.HasLinkMarker(CardLinkMarker.Bottom) ?? false) ||
(EnemyMZone[5]?.HasLinkMarker(CardLinkMarker.Top) ?? false)))
result |= Zones.z3;
if (BotMZone[4] == null &&
((BotMZone[3]?.HasLinkMarker(CardLinkMarker.Right) ?? false) ||
(BotMZone[6]?.HasLinkMarker(CardLinkMarker.BottomRight) ?? false) ||
(EnemyMZone[5]?.HasLinkMarker(CardLinkMarker.TopLeft) ?? false)))
result |= Zones.z4;
return result;
}
public int GetBotAvailZonesFromExtraDeck(ClientCard remove)
{
return GetBotAvailZonesFromExtraDeck(new [] { remove });
return GetBotAvailZonesFromExtraDeck(new[] { remove });
}
public int GetBotAvailZonesFromExtraDeck()
......
......@@ -7,6 +7,41 @@ namespace WindBot.Game.AI
{
public static class CardContainer
{
public static int CompareCardAttack(ClientCard cardA, ClientCard cardB)
{
if (cardA.Attack < cardB.Attack)
return -1;
if (cardA.Attack == cardB.Attack)
return 0;
return 1;
}
public static int CompareCardLevel(ClientCard cardA, ClientCard cardB)
{
if (cardA.Level < cardB.Level)
return -1;
if (cardA.Level == cardB.Level)
return 0;
return 1;
}
public static int CompareDefensePower(ClientCard cardA, ClientCard cardB)
{
if (cardA == null && cardB == null)
return 0;
if (cardA == null)
return -1;
if (cardB == null)
return 1;
int powerA = cardA.GetDefensePower();
int powerB = cardB.GetDefensePower();
if (powerA < powerB)
return -1;
if (powerA == powerB)
return 0;
return 1;
}
public static ClientCard GetHighestAttackMonster(this IEnumerable<ClientCard> cards, bool canBeTarget = false)
{
return cards
......@@ -90,6 +125,21 @@ namespace WindBot.Game.AI
return cards.FirstOrDefault(card => card?.Data != null && card.IsFaceup() && filter.Invoke(card));
}
public static IList<ClientCard> GetMatchingCards(this IEnumerable<ClientCard> cards, Func<ClientCard, bool> filter)
{
return cards.Where(card => card?.Data != null && filter.Invoke(card)).ToList();
}
public static int GetMatchingCardsCount(this IEnumerable<ClientCard> cards, Func<ClientCard, bool> filter)
{
return cards.Count(card => card?.Data != null && filter.Invoke(card));
}
public static bool IsExistingMatchingCard(this IEnumerable<ClientCard> cards, Func<ClientCard, bool> filter, int count = 1)
{
return cards.GetMatchingCardsCount(filter) >= count;
}
public static ClientCard GetShouldBeDisabledBeforeItUseEffectMonster(this IEnumerable<ClientCard> cards, bool canBeTarget = true)
{
return cards.FirstOrDefault(card => card?.Data != null && card.IsMonsterShouldBeDisabledBeforeItUseEffect() && card.IsFaceup() && (!canBeTarget || !card.IsShouldNotBeTarget()));
......
......@@ -271,7 +271,7 @@ namespace WindBot.Game.AI.Decks
public bool is_should_not_negate()
{
ClientCard last_card = AI.Utils.GetLastChainCard();
ClientCard last_card = Util.GetLastChainCard();
if (last_card != null
&& last_card.Controller == 1 && last_card.IsCode(should_not_negate))
return true;
......@@ -479,7 +479,7 @@ namespace WindBot.Game.AI.Decks
if (card != null)
return card;
List<ClientCard> enemy_monsters = Enemy.GetMonsters();
enemy_monsters.Sort(AIFunctions.CompareCardAttack);
enemy_monsters.Sort(CardContainer.CompareCardAttack);
enemy_monsters.Reverse();
foreach(ClientCard target in enemy_monsters)
{
......@@ -496,10 +496,10 @@ namespace WindBot.Game.AI.Decks
public ClientCard GetBestEnemyCard_random()
{
// monsters
ClientCard card = AI.Utils.GetProblematicEnemyMonster(0, true);
ClientCard card = Util.GetProblematicEnemyMonster(0, true);
if (card != null)
return card;
if (AI.Utils.GetOneEnemyBetterThanMyBest() != null)
if (Util.GetOneEnemyBetterThanMyBest() != null)
{
card = Enemy.MonsterZone.GetHighestAttackMonster(true);
if (card != null)
......@@ -619,11 +619,11 @@ namespace WindBot.Game.AI.Decks
if (!spell_trap_activate()) return false;
if (Bot.LifePoints <= 1000)
return false;
if (Bot.LifePoints - 1000 <= Enemy.LifePoints && ActivateDescription == AI.Utils.GetStringId(_CardId.ChickenGame, 0))
if (Bot.LifePoints - 1000 <= Enemy.LifePoints && ActivateDescription == Util.GetStringId(_CardId.ChickenGame, 0))
{
return true;
}
if (Bot.LifePoints - 1000 > Enemy.LifePoints && ActivateDescription == AI.Utils.GetStringId(_CardId.ChickenGame, 1))
if (Bot.LifePoints - 1000 > Enemy.LifePoints && ActivateDescription == Util.GetStringId(_CardId.ChickenGame, 1))
{
return true;
}
......@@ -693,11 +693,11 @@ namespace WindBot.Game.AI.Decks
public bool SolemnJudgment_activate()
{
if (AI.Utils.IsChainTargetOnly(Card) && (Bot.HasInHand(CardId.Multifaker) || Multifaker_candeckss())) return false;
if (Util.IsChainTargetOnly(Card) && (Bot.HasInHand(CardId.Multifaker) || Multifaker_candeckss())) return false;
if (!Should_counter()) return false;
if ((DefaultSolemnJudgment() && spell_trap_activate(true)))
{
ClientCard target = AI.Utils.GetLastChainCard();
ClientCard target = Util.GetLastChainCard();
if (target != null && !target.IsMonster() && !spell_trap_activate(false, target)) return false;
return true;
}
......@@ -733,7 +733,7 @@ namespace WindBot.Game.AI.Decks
}
}
ClientCard LastChainCard = AI.Utils.GetLastChainCard();
ClientCard LastChainCard = Util.GetLastChainCard();
if (LastChainCard == null
&& !(Duel.Player == 1 && Duel.Phase > DuelPhase.Main2 && Bot.HasInHand(CardId.Multifaker) && Multifaker_candeckss() && !Multifaker_ssfromhand))
......@@ -748,16 +748,16 @@ namespace WindBot.Game.AI.Decks
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 && AI.Utils.GetProblematicEnemySpell() != null
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)
|| (AI.Utils.IsChainTarget(Card))
|| (Util.IsChainTarget(Card))
|| (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.IsCode(_CardId.HarpiesFeatherDuster))
|| (Duel.Player == 1 && Duel.Phase > DuelPhase.Main2 && Bot.HasInHand(CardId.Multifaker) && Multifaker_candeckss() && !Multifaker_ssfromhand))
{
List<ClientCard> enemy_monsters = Enemy.GetMonsters();
enemy_monsters.Sort(AIFunctions.CompareCardAttack);
enemy_monsters.Sort(CardContainer.CompareCardAttack);
enemy_monsters.Reverse();
foreach(ClientCard card in enemy_monsters)
{
......@@ -795,7 +795,7 @@ namespace WindBot.Game.AI.Decks
else
{
List<ClientCard> enemy_monsters = Enemy.GetMonsters();
enemy_monsters.Sort(AIFunctions.CompareCardAttack);
enemy_monsters.Sort(CardContainer.CompareCardAttack);
enemy_monsters.Reverse();
foreach (ClientCard card in enemy_monsters)
{
......@@ -990,7 +990,7 @@ namespace WindBot.Game.AI.Decks
public bool Feather_activate()
{
if (!spell_trap_activate()) return false;
if (AI.Utils.GetProblematicEnemySpell() != null)
if (Util.GetProblematicEnemySpell() != null)
{
AI.SelectPlace(SelectSTPlace(Card, true));
return true;
......@@ -1039,8 +1039,8 @@ namespace WindBot.Game.AI.Decks
}
if (Duel.Phase == DuelPhase.End
|| activate_immediately >= 2
|| (AI.Utils.IsChainTarget(Card)
|| (AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().Controller == 1 && AI.Utils.GetLastChainCard().IsCode(_CardId.HarpiesFeatherDuster))))
|| (Util.IsChainTarget(Card)
|| (Util.GetLastChainCard() != null && Util.GetLastChainCard().Controller == 1 && Util.GetLastChainCard().IsCode(_CardId.HarpiesFeatherDuster))))
{
if (select_list.Count > 0)
{
......@@ -1057,7 +1057,7 @@ namespace WindBot.Game.AI.Decks
{
if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2)
{
if (AI.Utils.ChainContainsCard(CardId.Linkuriboh)) return false;
if (Util.ChainContainsCard(CardId.Linkuriboh)) return false;
if (Bot.BattlingMonster == null || (Enemy.BattlingMonster.Attack >= Bot.BattlingMonster.GetDefensePower()) || Enemy.BattlingMonster.IsMonsterDangerous())
{
AI.SelectPosition(CardPosition.FaceUpDefence);
......@@ -1137,19 +1137,19 @@ namespace WindBot.Game.AI.Decks
}
}
}
if (!AI.Utils.IsTurn1OrMain2())
if (!Util.IsTurn1OrMain2())
{
ClientCard self_best = AI.Utils.GetBestBotMonster();
ClientCard enemy_best = AI.Utils.GetProblematicEnemyCard(self_best.Attack, true);
ClientCard self_best = Util.GetBestBotMonster();
ClientCard enemy_best = Util.GetProblematicEnemyCard(self_best.Attack, true);
ClientCard enemy_target = GetProblematicEnemyCard_Alter(true,false);
if ((enemy_best != null || enemy_target != null)
&& Bot.HasInGraveyard(CardId.Meluseek)) next_card = CardId.Meluseek;
else if (Enemy.GetMonsterCount() <= 1 && Bot.HasInGraveyard(CardId.Meluseek) && Enemy.GetFieldCount() > 0) next_card = CardId.Meluseek;
else if (Bot.HasInGraveyard(CardId.Hexstia) && AI.Utils.GetProblematicEnemySpell() == null && AI.Utils.GetOneEnemyBetterThanValue(3100, true) == null && can_choose_other)
else if (Bot.HasInGraveyard(CardId.Hexstia) && Util.GetProblematicEnemySpell() == null && Util.GetOneEnemyBetterThanValue(3100, true) == null && can_choose_other)
{
next_card = CardId.Hexstia;
choose_other = (AI.Utils.GetOneEnemyBetterThanMyBest(true) != null);
choose_other = (Util.GetOneEnemyBetterThanMyBest(true) != null);
}
}
else
......@@ -1210,18 +1210,18 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(CardId.Protocol);
AI.SelectNextCard(next_card);
Marionetter_reborn = true;
if (next_card == CardId.Meluseek && AI.Utils.IsTurn1OrMain2()) AI.SelectPosition(CardPosition.FaceUpDefence);
if (next_card == CardId.Meluseek && Util.IsTurn1OrMain2()) AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
List<ClientCard> list = Bot.GetMonsters();
list.Sort(AIFunctions.CompareCardAttack);
list.Sort(CardContainer.CompareCardAttack);
foreach (ClientCard card in list)
{
if (isAltergeist(card) && !(choose_other && card == Card))
{
AI.SelectCard(card);
AI.SelectNextCard(next_card);
if (next_card == CardId.Meluseek && AI.Utils.IsTurn1OrMain2()) AI.SelectPosition(CardPosition.FaceUpDefence);
if (next_card == CardId.Meluseek && Util.IsTurn1OrMain2()) AI.SelectPosition(CardPosition.FaceUpDefence);
Marionetter_reborn = true;
return true;
}
......@@ -1239,7 +1239,7 @@ namespace WindBot.Game.AI.Decks
{
if (Card.Location == CardLocation.MonsterZone && Duel.LastChainPlayer != 0 && (Protocol_activing() || !Card.IsDisabled()))
{
ClientCard target = AI.Utils.GetLastChainCard();
ClientCard target = Util.GetLastChainCard();
if (target != null && !spell_trap_activate(false, target)) return false;
if (!Should_counter()) return false;
// check
......@@ -1256,7 +1256,7 @@ namespace WindBot.Game.AI.Decks
}
return true;
}
if (ActivateDescription == AI.Utils.GetStringId(CardId.Hexstia,0)) return false;
if (ActivateDescription == Util.GetStringId(CardId.Hexstia,0)) return false;
if (Enemy.HasInSpellZone(82732705) && Bot.GetRemainingCount(CardId.Protocol,3) > 0 && !Bot.HasInHandOrInSpellZone(CardId.Protocol))
{
AI.SelectCard(CardId.Protocol);
......@@ -1301,7 +1301,7 @@ namespace WindBot.Game.AI.Decks
public bool Meluseek_eff()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.Meluseek,0)
if (ActivateDescription == Util.GetStringId(CardId.Meluseek,0)
|| (ActivateDescription == -1 && Card.Location == CardLocation.MonsterZone))
{
attacked_Meluseek.Add(Card);
......@@ -1311,7 +1311,7 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(target);
return true;
}
target = AI.Utils.GetOneEnemyBetterThanMyBest(true, true);
target = Util.GetOneEnemyBetterThanMyBest(true, true);
if (target != null)
{
AI.SelectCard(target);
......@@ -1384,7 +1384,7 @@ namespace WindBot.Game.AI.Decks
{
if (!Multifaker_candeckss() || Card.Location != CardLocation.Hand) return false;
Multifaker_ssfromhand = true;
if (Duel.Player != 0 && AI.Utils.GetOneEnemyBetterThanMyBest() != null) AI.SelectPosition(CardPosition.FaceUpDefence);
if (Duel.Player != 0 && Util.GetOneEnemyBetterThanMyBest() != null) AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
......@@ -1429,7 +1429,7 @@ namespace WindBot.Game.AI.Decks
public bool Silquitous_eff()
{
if (ActivateDescription != AI.Utils.GetStringId(CardId.Silquitous,0))
if (ActivateDescription != Util.GetStringId(CardId.Silquitous,0))
{
if (!Bot.HasInHandOrInSpellZone(CardId.Manifestation) && Bot.HasInGraveyard(CardId.Manifestation))
{
......@@ -1461,7 +1461,7 @@ namespace WindBot.Game.AI.Decks
}
}
if (spell.IsCode(CardId.Manifestation) && spell.IsFaceup()) faceup_Manifestation = spell;
if (Duel.LastChainPlayer != 0 && AI.Utils.IsChainTarget(spell) && spell.IsFaceup() && isAltergeist(spell))
if (Duel.LastChainPlayer != 0 && Util.IsChainTarget(spell) && spell.IsFaceup() && isAltergeist(spell))
{
selected_target = spell;
}
......@@ -1479,12 +1479,12 @@ namespace WindBot.Game.AI.Decks
ClientCard faceup_Multifaker = null;
ClientCard faceup_monster = null;
List<ClientCard> monster_list = Bot.GetMonsters();
monster_list.Sort(AIFunctions.CompareCardAttack);
monster_list.Sort(CardContainer.CompareCardAttack);
foreach(ClientCard card in monster_list)
{
if (card.IsFaceup() && isAltergeist(card) && card != Card)
{
if (Duel.LastChainPlayer != 0 && AI.Utils.IsChainTarget(card) && card.IsFaceup())
if (Duel.LastChainPlayer != 0 && Util.IsChainTarget(card) && card.IsFaceup())
{
selected_target = card;
}
......@@ -1512,13 +1512,13 @@ namespace WindBot.Game.AI.Decks
if (Duel.LastChainPlayer != 0)
{
Logger.DebugWriteLine("Silquitous: battle");
if (AI.Utils.ChainContainsCard(CardId.Linkuriboh) || Bot.HasInHand(CardId.Kunquery)) return false;
if (Util.ChainContainsCard(CardId.Linkuriboh) || Bot.HasInHand(CardId.Kunquery)) return false;
if (Enemy.BattlingMonster != null && Bot.BattlingMonster != null && Enemy.BattlingMonster.GetDefensePower() >= Bot.BattlingMonster.GetDefensePower())
{
if (Bot.HasInMonstersZone(CardId.Kunquery)) AI.SelectCard(CardId.Kunquery);
else AI.SelectCard(bounce_self);
List<ClientCard> enemy_list = Enemy.GetMonsters();
enemy_list.Sort(AIFunctions.CompareCardAttack);
enemy_list.Sort(CardContainer.CompareCardAttack);
enemy_list.Reverse();
foreach(ClientCard target in enemy_list)
{
......@@ -1567,8 +1567,8 @@ namespace WindBot.Game.AI.Decks
{
if (Card.Location == CardLocation.Grave)
{
if (AI.Utils.ChainContainsCard(CardId.Silquitous)) return false;
if (!Bot.HasInHandOrInSpellZone(CardId.Protocol) && !AI.Utils.ChainContainsCard(CardId.Protocol))
if (Util.ChainContainsCard(CardId.Silquitous)) return false;
if (!Bot.HasInHandOrInSpellZone(CardId.Protocol) && !Util.ChainContainsCard(CardId.Protocol))
{
AI.SelectCard(CardId.Protocol);
return true;
......@@ -1577,8 +1577,8 @@ namespace WindBot.Game.AI.Decks
}
else
{
if (AI.Utils.ChainContainsCard(CardId.Manifestation) || AI.Utils.ChainContainsCard(CardId.Spoofing)) return false;
if (Duel.LastChainPlayer == 0 && !(AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().IsCode(CardId.Hexstia))) return false;
if (Util.ChainContainsCard(CardId.Manifestation) || Util.ChainContainsCard(CardId.Spoofing)) return false;
if (Duel.LastChainPlayer == 0 && !(Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.Hexstia))) return false;
if (Bot.HasInMonstersZone(CardId.Hexstia))
{
......@@ -1644,9 +1644,9 @@ namespace WindBot.Game.AI.Decks
public bool Protocol_negate_better()
{
// skip if no one of enemy's monsters is better
if (ActivateDescription == AI.Utils.GetStringId(CardId.Protocol, 1))
if (ActivateDescription == Util.GetStringId(CardId.Protocol, 1))
{
if (AI.Utils.GetOneEnemyBetterThanMyBest(true) == null) return false;
if (Util.GetOneEnemyBetterThanMyBest(true) == null) return false;
}
return Protocol_negate();
}
......@@ -1654,7 +1654,7 @@ namespace WindBot.Game.AI.Decks
public bool Protocol_negate()
{
// negate
if (ActivateDescription == AI.Utils.GetStringId(CardId.Protocol, 1) && (!Card.IsDisabled() || Protocol_activing()))
if (ActivateDescription == Util.GetStringId(CardId.Protocol, 1) && (!Card.IsDisabled() || Protocol_activing()))
{
if (!Should_counter()) return false;
if (is_should_not_negate()) return false;
......@@ -1690,7 +1690,7 @@ namespace WindBot.Game.AI.Decks
}
}
List<int> cost_list = new List<int>();
if (AI.Utils.ChainContainsCard(CardId.Manifestation)) cost_list.Add(CardId.Manifestation);
if (Util.ChainContainsCard(CardId.Manifestation)) cost_list.Add(CardId.Manifestation);
if (!Card.IsDisabled()) cost_list.Add(CardId.Protocol);
cost_list.Add(CardId.Multifaker);
cost_list.Add(CardId.Marionetter);
......@@ -1718,7 +1718,7 @@ namespace WindBot.Game.AI.Decks
}
if (!Silquitous_bounced) cost_list.Add(CardId.Silquitous);
if (!Meluseek_searched) cost_list.Add(CardId.Meluseek);
if (!AI.Utils.ChainContainsCard(CardId.Manifestation)) cost_list.Add(CardId.Manifestation);
if (!Util.ChainContainsCard(CardId.Manifestation)) cost_list.Add(CardId.Manifestation);
AI.SelectCard(cost_list);
return true;
}
......@@ -1727,10 +1727,10 @@ namespace WindBot.Game.AI.Decks
public bool Protocol_activate_not_use()
{
if (AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().Controller == 0 && AI.Utils.GetLastChainCard().IsTrap()) return false;
if (ActivateDescription != AI.Utils.GetStringId(CardId.Protocol, 1))
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().Controller == 0 && Util.GetLastChainCard().IsTrap()) return false;
if (ActivateDescription != Util.GetStringId(CardId.Protocol, 1))
{
if (AI.Utils.IsChainTarget(Card) && Card.IsFacedown()) return true;
if (Util.IsChainTarget(Card) && Card.IsFacedown()) return true;
if (Should_activate_Protocol()) return true;
if (!Multifaker_ssfromhand && Multifaker_candeckss() && (Bot.HasInHand(CardId.Multifaker) || Bot.HasInSpellZone(CardId.Spoofing)))
{
......@@ -1760,7 +1760,7 @@ namespace WindBot.Game.AI.Decks
}
}
if (can_bounce == 10 || should_disnegate) return true;
if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2 && Bot.HasInHand(CardId.Kunquery) && AI.Utils.GetOneEnemyBetterThanMyBest() != null) return true;
if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2 && Bot.HasInHand(CardId.Kunquery) && Util.GetOneEnemyBetterThanMyBest() != null) return true;
}
return false;
}
......@@ -1783,7 +1783,7 @@ namespace WindBot.Game.AI.Decks
{
foreach (int id in list)
{
if (card.IsCode(id) && !(id == CardId.Multifaker && AI.Utils.GetLastChainCard() == card))
if (card.IsCode(id) && !(id == CardId.Multifaker && Util.GetLastChainCard() == card))
{
AI.SelectCard(card);
return;
......@@ -1817,9 +1817,9 @@ namespace WindBot.Game.AI.Decks
public bool Spoofing_eff()
{
if (AI.Utils.ChainContainsCard(CardId.Spoofing)) return false;
if (Util.ChainContainsCard(CardId.Spoofing)) return false;
if (Card.IsDisabled()) return false;
if (!AI.Utils.ChainContainPlayer(0) && !Multifaker_ssfromhand && Multifaker_candeckss() && Bot.HasInHand(CardId.Multifaker) && Card.HasPosition(CardPosition.FaceDown))
if (!Util.ChainContainPlayer(0) && !Multifaker_ssfromhand && Multifaker_candeckss() && Bot.HasInHand(CardId.Multifaker) && Card.HasPosition(CardPosition.FaceDown))
{
AI.SelectYesNo(false);
return true;
......@@ -1913,9 +1913,9 @@ namespace WindBot.Game.AI.Decks
}
else
{
ClientCard self_best = AI.Utils.GetBestBotMonster();
ClientCard self_best = Util.GetBestBotMonster();
int best_atk = self_best == null ? 0 : self_best.Attack;
ClientCard enemy_best = AI.Utils.GetProblematicEnemyCard(best_atk, true);
ClientCard enemy_best = Util.GetProblematicEnemyCard(best_atk, true);
ClientCard enemy_target = GetProblematicEnemyCard_Alter(true, false);
if (!Multifaker_ssfromhand && Multifaker_candeckss() && can_ss_Multifaker)
......@@ -2019,7 +2019,7 @@ namespace WindBot.Game.AI.Decks
bool go = false;
foreach(ClientCard card in Bot.GetSpells())
{
if ( (AI.Utils.ChainContainsCard(_CardId.HarpiesFeatherDuster) || AI.Utils.IsChainTarget(card))
if ( (Util.ChainContainsCard(_CardId.HarpiesFeatherDuster) || Util.IsChainTarget(card))
&& card.IsFaceup() && Duel.LastChainPlayer != 0 && isAltergeist(card))
{
AI.SelectCard(card);
......@@ -2031,7 +2031,7 @@ namespace WindBot.Game.AI.Decks
{
foreach (ClientCard card in Bot.GetMonsters())
{
if ( (AI.Utils.IsChainTarget(card) || AI.Utils.ChainContainsCard(CardId.DarkHole) || (!Protocol_activing() && card.IsDisabled()))
if ( (Util.IsChainTarget(card) || Util.ChainContainsCard(CardId.DarkHole) || (!Protocol_activing() && card.IsDisabled()))
&& card.IsFaceup() && Duel.LastChainPlayer != 0 && isAltergeist(card))
{
Logger.DebugWriteLine("Spoofing target:" + card?.Name);
......@@ -2065,7 +2065,7 @@ namespace WindBot.Game.AI.Decks
CardId.Kunquery,
CardId.GO_SR
);
if (AI.Utils.IsTurn1OrMain2()) AI.SelectPosition(CardPosition.FaceUpDefence);
if (Util.IsTurn1OrMain2()) AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
if (!summoned && !Meluseek_searched && !Bot.HasInHand(CardId.Marionetter))
......@@ -2272,7 +2272,7 @@ namespace WindBot.Game.AI.Decks
public bool Linkuriboh_ss()
{
if (Bot.GetMonstersExtraZoneCount() > 0) return false;
if (AI.Utils.IsTurn1OrMain2() && !Meluseek_searched)
if (Util.IsTurn1OrMain2() && !Meluseek_searched)
{
AI.SelectPlace(Zones.z5);
ss_other_monster = true;
......@@ -2283,8 +2283,8 @@ namespace WindBot.Game.AI.Decks
public bool Linkuriboh_eff()
{
if (AI.Utils.ChainContainsCard(CardId.Linkuriboh)) return false;
if (AI.Utils.ChainContainsCard(CardId.Multifaker)) return false;
if (Util.ChainContainsCard(CardId.Linkuriboh)) return false;
if (Util.ChainContainsCard(CardId.Multifaker)) return false;
if (Duel.Player == 1)
{
if (Card.Location == CardLocation.Grave)
......@@ -2311,7 +2311,7 @@ namespace WindBot.Game.AI.Decks
AI.SelectPlace(Zones.z0 | Zones.z4);
return true;
}
else if (AI.Utils.IsTurn1OrMain2())
else if (Util.IsTurn1OrMain2())
{
AI.SelectCard(new[] { CardId.Meluseek });
ss_other_monster = true;
......@@ -2340,7 +2340,7 @@ namespace WindBot.Game.AI.Decks
{
List<ClientCard> targets = new List<ClientCard>();
List<ClientCard> list = Bot.GetMonsters();
list.Sort(AIFunctions.CompareCardAttack);
list.Sort(CardContainer.CompareCardAttack);
//list.Reverse();
bool Meluseek_selected = false;
bool Silquitous_selected = false;
......@@ -2405,7 +2405,7 @@ namespace WindBot.Game.AI.Decks
public bool TripleBurstDragon_eff()
{
if (ActivateDescription != AI.Utils.GetStringId(CardId.TripleBurstDragon,0)) return false;
if (ActivateDescription != Util.GetStringId(CardId.TripleBurstDragon,0)) return false;
return (Duel.LastChainPlayer != 0);
}
......@@ -2413,9 +2413,9 @@ namespace WindBot.Game.AI.Decks
{
if (!Enemy.HasInGraveyard(CardId.Raye))
{
ClientCard self_best = AI.Utils.GetBestBotMonster(true);
ClientCard self_best = Util.GetBestBotMonster(true);
int self_power = (self_best != null) ? self_best.Attack : 0;
ClientCard enemy_best = AI.Utils.GetBestEnemyMonster(true);
ClientCard enemy_best = Util.GetBestEnemyMonster(true);
int enemy_power = (enemy_best != null) ? enemy_best.GetDefensePower() : 0;
if (enemy_power <= self_power) return false;
Logger.DebugWriteLine("Three: enemy: " + enemy_power.ToString() + ", bot: " + self_power.ToString());
......@@ -2440,7 +2440,7 @@ namespace WindBot.Game.AI.Decks
}
}
List<ClientCard> monsters = Bot.GetMonsters();
monsters.Sort(AIFunctions.CompareCardAttack);
monsters.Sort(CardContainer.CompareCardAttack);
//monsters.Reverse();
foreach(ClientCard card in monsters)
{
......@@ -2465,9 +2465,9 @@ namespace WindBot.Game.AI.Decks
{
if (!Enemy.HasInGraveyard(CardId.Raye))
{
ClientCard self_best = AI.Utils.GetBestBotMonster(true);
ClientCard self_best = Util.GetBestBotMonster(true);
int self_power = (self_best != null) ? self_best.Attack : 0;
ClientCard enemy_best = AI.Utils.GetBestEnemyMonster(true);
ClientCard enemy_best = Util.GetBestEnemyMonster(true);
int enemy_power = (enemy_best != null) ? enemy_best.GetDefensePower() : 0;
if (enemy_power < self_power) return false;
if (Bot.GetMonsterCount() <= 2 && enemy_power >= 2401) return false;
......@@ -2478,7 +2478,7 @@ namespace WindBot.Game.AI.Decks
}
List<ClientCard> material_list = new List<ClientCard>();
List<ClientCard> monsters = Bot.GetMonsters();
monsters.Sort(AIFunctions.CompareCardAttack);
monsters.Sort(CardContainer.CompareCardAttack);
//monsters.Reverse();
foreach(ClientCard t in monsters)
{
......@@ -2515,9 +2515,9 @@ namespace WindBot.Game.AI.Decks
{
if (Duel.Phase != DuelPhase.Main1) return false;
ClientCard self_best = AI.Utils.GetBestBotMonster(true);
ClientCard self_best = Util.GetBestBotMonster(true);
int self_power = (self_best != null) ? self_best.Attack : 0;
ClientCard enemy_best = AI.Utils.GetBestEnemyMonster(true);
ClientCard enemy_best = Util.GetBestEnemyMonster(true);
int enemy_power = (enemy_best != null) ? enemy_best.GetDefensePower() : 0;
if (enemy_power < self_power) return false;
......@@ -2528,7 +2528,7 @@ namespace WindBot.Game.AI.Decks
List<ClientCard> material_list = new List<ClientCard>();
List<ClientCard> bot_monster = Bot.GetMonsters();
bot_monster.Sort(AIFunctions.CompareCardAttack);
bot_monster.Sort(CardContainer.CompareCardAttack);
//bot_monster.Reverse();
int link_count = 0;
foreach(ClientCard card in bot_monster)
......@@ -2553,10 +2553,10 @@ namespace WindBot.Game.AI.Decks
public bool Borrelsword_eff()
{
if (ActivateDescription == -1) return true;
else if ((Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) || AI.Utils.IsChainTarget(Card))
else if ((Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) || Util.IsChainTarget(Card))
{
List<ClientCard> enemy_list = Enemy.GetMonsters();
enemy_list.Sort(AIFunctions.CompareCardAttack);
enemy_list.Sort(CardContainer.CompareCardAttack);
enemy_list.Reverse();
foreach(ClientCard card in enemy_list)
{
......@@ -2567,7 +2567,7 @@ namespace WindBot.Game.AI.Decks
}
}
List<ClientCard> bot_list = Bot.GetMonsters();
bot_list.Sort(AIFunctions.CompareCardAttack);
bot_list.Sort(CardContainer.CompareCardAttack);
//bot_list.Reverse();
foreach (ClientCard card in bot_list)
{
......@@ -2590,9 +2590,9 @@ namespace WindBot.Game.AI.Decks
}
if (!Enemy.HasInGraveyard(CardId.Raye))
{
ClientCard self_best = AI.Utils.GetBestBotMonster(true);
ClientCard self_best = Util.GetBestBotMonster(true);
int self_power = (self_best != null) ? self_best.Attack : 0;
ClientCard enemy_best = AI.Utils.GetBestEnemyMonster(true);
ClientCard enemy_best = Util.GetBestEnemyMonster(true);
int enemy_power = (enemy_best != null) ? enemy_best.GetDefensePower() : 0;
Logger.DebugWriteLine("Tuner: enemy: " + enemy_power.ToString() + ", bot: " + self_power.ToString());
if (enemy_power < self_power || enemy_power == 0) return false;
......@@ -2671,7 +2671,7 @@ namespace WindBot.Game.AI.Decks
if (isAltergeist(Card) && Bot.HasInHandOrInSpellZone(CardId.Protocol) && Card.IsFacedown())
return true;
bool enemyBetter = AI.Utils.IsAllEnemyBetter(true);
bool enemyBetter = Util.IsAllEnemyBetter(true);
if (Card.IsAttack() && enemyBetter)
return true;
if (Card.IsDefense() && !enemyBetter)
......@@ -2681,12 +2681,12 @@ namespace WindBot.Game.AI.Decks
public bool MonsterSet()
{
if (AI.Utils.GetOneEnemyBetterThanMyBest() == null && Bot.GetMonsterCount() > 0) return false;
if (Util.GetOneEnemyBetterThanMyBest() == null && Bot.GetMonsterCount() > 0) return false;
if (Card.Level > 4) return false;
int rest_lp = Bot.LifePoints;
int count = Bot.GetMonsterCount();
List<ClientCard> list = Enemy.GetMonsters();
list.Sort(AIFunctions.CompareCardAttack);
list.Sort(CardContainer.CompareCardAttack);
foreach(ClientCard card in list)
{
if (!card.HasPosition(CardPosition.Attack)) continue;
......@@ -2712,7 +2712,7 @@ namespace WindBot.Game.AI.Decks
if (EvenlyMatched_ready())
{
List<ClientCard> enemy_m = Enemy.GetMonsters();
enemy_m.Sort(AIFunctions.CompareCardAttack);
enemy_m.Sort(CardContainer.CompareCardAttack);
//enemy_m.Reverse();
foreach (ClientCard e_card in enemy_m)
{
......@@ -2748,7 +2748,7 @@ namespace WindBot.Game.AI.Decks
int HIINT_TOGRAVE = 504;
if (max == 1 && cards[0].Location == CardLocation.Deck
&& AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().IsCode(23002292) && Bot.GetRemainingCount(CardId.WakingtheDragon,1) > 0)
&& Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(23002292) && Bot.GetRemainingCount(CardId.WakingtheDragon,1) > 0)
{
IList<ClientCard> result = new List<ClientCard>();
foreach (ClientCard card in cards)
......@@ -2762,14 +2762,14 @@ namespace WindBot.Game.AI.Decks
}
if (result.Count > 0) return result;
}
else if (AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().IsCode(CardId.EvenlyMatched) && Duel.LastChainPlayer != 0)
else if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.EvenlyMatched) && Duel.LastChainPlayer != 0)
{
Logger.DebugWriteLine("EvenlyMatched: min=" + min.ToString() + ", max=" + max.ToString());
}
else if (cards[0].Location == CardLocation.Hand && cards[cards.Count - 1].Location == CardLocation.Hand
&& (hint == 501 || hint == HIINT_TOGRAVE) && min == max)
{
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard().IsCode(CardId.OneForOne)) return null;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.OneForOne)) return null;
Logger.DebugWriteLine("Hand drop except OneForOne");
int todrop = min;
IList<ClientCard> result = new List<ClientCard>();
......@@ -2807,7 +2807,7 @@ namespace WindBot.Game.AI.Decks
public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{
if (AI.Utils.IsTurn1OrMain2()
if (Util.IsTurn1OrMain2()
&& (cardId == CardId.Meluseek || cardId == CardId.Silquitous))
{
return CardPosition.FaceUpDefence;
......@@ -2815,15 +2815,15 @@ namespace WindBot.Game.AI.Decks
return 0;
}
public override int OnSelectPlace(int cardId, int player, int location, int available)
public override int OnSelectPlace(int cardId, int player, CardLocation location, int available)
{
if (player == 0)
{
if (location == (int)CardLocation.SpellZone)
if (location == CardLocation.SpellZone)
{
// unfinished
}
else if (location == (int)CardLocation.MonsterZone)
else if (location == CardLocation.MonsterZone)
{
if(cardId == CardId.Linkuriboh)
{
......
......@@ -93,7 +93,7 @@ namespace WindBot.Game.AI.Decks
{
if (Card.Location == CardLocation.Hand && Bot.HasInSpellZone(Card.Id))
return false;
if (ActivateDescription == AI.Utils.GetStringId((int)Card.Id,0))
if (ActivateDescription == Util.GetStringId((int)Card.Id,0))
AI.SelectCard(CardId.GaleTheWhirlwind);
return true;
}
......
......@@ -143,7 +143,7 @@ namespace WindBot.Game.AI.Decks
if (!Bot.HasInHand(CardId.WhiteDragon))
result.AddRange(cards.Where(card => card.IsCode(CardId.WhiteDragon)).Take(1));
result.AddRange(cards.Where(card => card.IsCode(CardId.AlternativeWhiteDragon)));
return AI.Utils.CheckSelectCount(result, cards, min, max);
return Util.CheckSelectCount(result, cards, min, max);
}
Logger.DebugWriteLine("Use default.");
return null;
......@@ -152,8 +152,8 @@ namespace WindBot.Game.AI.Decks
public override IList<ClientCard> OnSelectXyzMaterial(IList<ClientCard> cards, int min, int max)
{
Logger.DebugWriteLine("OnSelectXyzMaterial " + cards.Count + " " + min + " " + max);
IList<ClientCard> result = AI.Utils.SelectPreferredCards(UsedAlternativeWhiteDragon, cards, min, max);
return AI.Utils.CheckSelectCount(result, cards, min, max);
IList<ClientCard> result = Util.SelectPreferredCards(UsedAlternativeWhiteDragon, cards, min, max);
return Util.CheckSelectCount(result, cards, min, max);
}
public override IList<ClientCard> OnSelectSynchroMaterial(IList<ClientCard> cards, int sum, int min, int max)
......@@ -259,16 +259,24 @@ namespace WindBot.Game.AI.Decks
private bool AlternativeWhiteDragonEffect()
{
ClientCard target = AI.Utils.GetProblematicEnemyMonster(Card.GetDefensePower());
ClientCard target = Util.GetProblematicEnemyMonster(Card.GetDefensePower());
if (target != null)
{
AI.SelectCard(target);
UsedAlternativeWhiteDragon.Add(Card);
return true;
}
if (CanDealWithUsedAlternativeWhiteDragon())
if (Util.GetBotAvailZonesFromExtraDeck(Card) > 0
&& (Bot.HasInMonstersZone(new[]
{
target = AI.Utils.GetBestEnemyMonster(false, true);
CardId.SageWithEyesOfBlue,
CardId.WhiteStoneOfAncients,
CardId.WhiteStoneOfLegend,
CardId.WhiteDragon,
CardId.DragonSpiritOfWhite
}) || Bot.GetCountCardInZone(Bot.MonsterZone, CardId.AlternativeWhiteDragon) >= 2))
{
target = Util.GetBestEnemyMonster(false, true);
AI.SelectCard(target);
UsedAlternativeWhiteDragon.Add(Card);
return true;
......@@ -389,7 +397,7 @@ namespace WindBot.Game.AI.Decks
{
if (ActivateDescription == -1)
{
ClientCard target = AI.Utils.GetBestEnemySpell();
ClientCard target = Util.GetBestEnemySpell();
AI.SelectCard(target);
return true;
}
......@@ -405,7 +413,7 @@ namespace WindBot.Game.AI.Decks
&& !Bot.HasInGraveyard(CardId.DragonSpiritOfWhite)
&& !Bot.HasInGraveyard(CardId.WhiteDragon);
}
if (AI.Utils.IsChainTarget(Card))
if (Util.IsChainTarget(Card))
{
return true;
}
......@@ -415,7 +423,7 @@ namespace WindBot.Game.AI.Decks
private bool BlueEyesSpiritDragonEffect()
{
if (ActivateDescription == -1 || ActivateDescription == AI.Utils.GetStringId(CardId.BlueEyesSpiritDragon, 0))
if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.BlueEyesSpiritDragon, 0))
{
return Duel.LastChainPlayer == 1;
}
......@@ -426,7 +434,7 @@ namespace WindBot.Game.AI.Decks
}
else
{
if (AI.Utils.IsChainTarget(Card))
if (Util.IsChainTarget(Card))
{
AI.SelectCard(CardId.AzureEyesSilverDragon);
return true;
......@@ -437,7 +445,7 @@ namespace WindBot.Game.AI.Decks
private bool HopeHarbingerDragonTitanicGalaxyEffect()
{
if (ActivateDescription == -1 || ActivateDescription == AI.Utils.GetStringId(CardId.HopeHarbingerDragonTitanicGalaxy, 0))
if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.HopeHarbingerDragonTitanicGalaxy, 0))
{
return Duel.LastChainPlayer == 1;
}
......@@ -446,7 +454,7 @@ namespace WindBot.Game.AI.Decks
private bool WhiteStoneOfAncientsEffect()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.WhiteStoneOfAncients, 0))
if (ActivateDescription == Util.GetStringId(CardId.WhiteStoneOfAncients, 0))
{
if (Bot.HasInHand(CardId.TradeIn)
&& !Bot.HasInHand(CardId.WhiteDragon)
......@@ -538,7 +546,7 @@ namespace WindBot.Game.AI.Decks
{
return false;
}
if (AI.Utils.IsOneEnemyBetterThanValue(2999, false))
if (Util.IsOneEnemyBetterThanValue(2999, false))
{
return true;
}
......@@ -561,7 +569,7 @@ namespace WindBot.Game.AI.Decks
}
if (Bot.HasInMonstersZone(CardId.GalaxyEyesPrimePhotonDragon))
{
if (!AI.Utils.IsOneEnemyBetterThanValue(4000, false))
if (!Util.IsOneEnemyBetterThanValue(4000, false))
{
AI.SelectCard(CardId.GalaxyEyesPrimePhotonDragon);
return true;
......@@ -572,7 +580,7 @@ namespace WindBot.Game.AI.Decks
private bool GalaxyEyesCipherBladeDragonSummon()
{
if (Bot.HasInMonstersZone(CardId.GalaxyEyesFullArmorPhotonDragon) && AI.Utils.GetProblematicEnemyCard() != null)
if (Bot.HasInMonstersZone(CardId.GalaxyEyesFullArmorPhotonDragon) && Util.GetProblematicEnemyCard() != null)
{
AI.SelectCard(CardId.GalaxyEyesFullArmorPhotonDragon);
return true;
......@@ -622,13 +630,13 @@ namespace WindBot.Game.AI.Decks
private bool GalaxyEyesFullArmorPhotonDragonEffect()
{
ClientCard target = AI.Utils.GetProblematicEnemySpell();
ClientCard target = Util.GetProblematicEnemySpell();
if (target != null)
{
AI.SelectCard(target);
return true;
}
target = AI.Utils.GetProblematicEnemyMonster();
target = Util.GetProblematicEnemyMonster();
if (target != null)
{
AI.SelectCard(target);
......@@ -679,7 +687,7 @@ namespace WindBot.Game.AI.Decks
{
return true;
}
ClientCard target = AI.Utils.GetProblematicEnemyCard();
ClientCard target = Util.GetProblematicEnemyCard();
if (target != null)
{
AI.SelectCard(target);
......@@ -737,8 +745,8 @@ namespace WindBot.Game.AI.Decks
{
if (Duel.Phase != DuelPhase.Main1 || Duel.Turn == 1 || SoulChargeUsed)
return false;
int bestSelfAttack = AI.Utils.GetBestAttack(Bot);
int bestEnemyAttack = AI.Utils.GetBestPower(Enemy);
int bestSelfAttack = Util.GetBestAttack(Bot);
int bestEnemyAttack = Util.GetBestPower(Enemy);
return bestSelfAttack <= bestEnemyAttack && bestEnemyAttack > 2500 && bestEnemyAttack <= 3100;
}
......@@ -856,7 +864,7 @@ namespace WindBot.Game.AI.Decks
private bool Repos()
{
bool enemyBetter = AI.Utils.IsAllEnemyBetter(true);
bool enemyBetter = Util.IsAllEnemyBetter(true);
if (Card.IsAttack() && enemyBetter)
return true;
......@@ -887,18 +895,6 @@ namespace WindBot.Game.AI.Decks
return num >= 2;
}
private bool CanDealWithUsedAlternativeWhiteDragon()
{
return Bot.HasInMonstersZone(new[]
{
CardId.SageWithEyesOfBlue,
CardId.WhiteStoneOfAncients,
CardId.WhiteStoneOfLegend,
CardId.WhiteDragon,
CardId.DragonSpiritOfWhite
}) || Bot.GetCountCardInZone(Bot.MonsterZone, CardId.AlternativeWhiteDragon)>=2 ;
}
private bool HaveEnoughWhiteDragonInHand()
{
return HasTwoInHand(CardId.WhiteDragon) || (
......
......@@ -128,32 +128,32 @@ namespace WindBot.Game.AI.Decks
{
if(Duel.LastChainPlayer==1)
{
ClientCard lastCard = AI.Utils.GetLastChainCard();
ClientCard lastCard = Util.GetLastChainCard();
if (lastCard.IsCode(CardId.MaxxC))
{
AI.SelectCard(CardId.MaxxC);
if(AI.Utils.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
if(Util.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
AI.SelectNextCard(CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesAlternativeWhiteDragon);
return UniqueFaceupSpell();
}
if (lastCard.IsCode(CardId.LockBird))
{
AI.SelectCard(CardId.LockBird);
if (AI.Utils.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
if (Util.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
AI.SelectNextCard(CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesAlternativeWhiteDragon);
return UniqueFaceupSpell();
}
if (lastCard.IsCode(CardId.Ghost))
{
AI.SelectCard(CardId.Ghost);
if (AI.Utils.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
if (Util.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
AI.SelectNextCard(CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesAlternativeWhiteDragon);
return UniqueFaceupSpell();
}
if (lastCard.IsCode(CardId.AshBlossom))
{
AI.SelectCard(CardId.AshBlossom);
if (AI.Utils.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
if (Util.ChainContainsCard(CardId.TheMelodyOfAwakeningDragon))
AI.SelectNextCard(CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesChaosMaxDragon, CardId.BlueEyesAlternativeWhiteDragon);
return UniqueFaceupSpell();
}
......@@ -170,9 +170,9 @@ namespace WindBot.Game.AI.Decks
}
else
{
if(AI.Utils.GetProblematicEnemyMonster(3000,true)!=null)
if(Util.GetProblematicEnemyMonster(3000,true)!=null)
{
AI.SelectCard(AI.Utils.GetProblematicEnemyMonster(3000, true));
AI.SelectCard(Util.GetProblematicEnemyMonster(3000, true));
return true;
}
}
......@@ -464,7 +464,7 @@ namespace WindBot.Game.AI.Decks
private bool Linkuriboheff()
{
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
return true;
}
private bool BirrelswordDragonsp()
......@@ -498,11 +498,11 @@ namespace WindBot.Game.AI.Decks
private bool BirrelswordDragoneff()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.BirrelswordDragon, 0))
if (ActivateDescription == Util.GetStringId(CardId.BirrelswordDragon, 0))
{
if (AI.Utils.IsChainTarget(Card) && AI.Utils.GetBestEnemyMonster(true, true) != null)
if (Util.IsChainTarget(Card) && Util.GetBestEnemyMonster(true, true) != null)
{
AI.SelectCard(AI.Utils.GetBestEnemyMonster(true, true));
AI.SelectCard(Util.GetBestEnemyMonster(true, true));
return true;
}
if (Duel.Player == 1 && Bot.BattlingMonster == Card)
......
......@@ -415,7 +415,7 @@ namespace WindBot.Game.AI.Decks
private bool must_chain()
{
if (AI.Utils.IsChainTarget(Card)) return true;
if (Util.IsChainTarget(Card)) return true;
foreach (ClientCard card in Enemy.GetSpells())
{
if (card.IsCode(CardId.HarpiesFeatherDuster)&&card.IsFaceup())
......@@ -509,7 +509,7 @@ namespace WindBot.Game.AI.Decks
}
private bool BattleFadereff()
{
if (AI.Utils.ChainContainsCard(CardId.BlazingMirrorForce) || AI.Utils.ChainContainsCard(CardId.MagicCylinder))
if (Util.ChainContainsCard(CardId.BlazingMirrorForce) || Util.ChainContainsCard(CardId.MagicCylinder))
return false;
if (prevent_used || Duel.Player == 0) return false;
AI.SelectPosition(CardPosition.FaceUpDefence);
......@@ -545,11 +545,11 @@ namespace WindBot.Game.AI.Decks
}
public bool Ring_act()
{
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard() != null ) return false;
ClientCard target = AI.Utils.GetProblematicEnemyMonster();
if (target == null && AI.Utils.IsChainTarget(Card))
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard() != null ) return false;
ClientCard target = Util.GetProblematicEnemyMonster();
if (target == null && Util.IsChainTarget(Card))
{
target = AI.Utils.GetBestEnemyMonster(true, true);
target = Util.GetBestEnemyMonster(true, true);
}
if (target != null)
{
......@@ -569,7 +569,7 @@ namespace WindBot.Game.AI.Decks
count++;
}
bool Demiseused = AI.Utils.ChainContainsCard(CardId.CardOfDemise);
bool Demiseused = Util.ChainContainsCard(CardId.CardOfDemise);
if (drawfirst) return UniqueFaceupSpell();
if (DefaultOnBecomeTarget() && count > 1) return true;
if (Demiseused) return false;
......@@ -724,8 +724,8 @@ namespace WindBot.Game.AI.Decks
return true;
if (GetTotalATK(newlist) / 2 >= Enemy.LifePoints && Bot.HasInSpellZone(CardId.BlazingMirrorForce))
return false;
if (AI.Utils.GetLastChainCard() == null) return true;
if (AI.Utils.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
if (Util.GetLastChainCard() == null) return true;
if (Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
return true;
}
public bool MonsterRepos()
......
......@@ -126,7 +126,7 @@ namespace WindBot.Game.AI.Decks
private bool EvolutionBurstEffect()
{
ClientCard bestMy = Bot.GetMonsters().GetHighestAttackMonster();
if (bestMy == null || !AI.Utils.IsOneEnemyBetterThanValue(bestMy.Attack, false))
if (bestMy == null || !Util.IsOneEnemyBetterThanValue(bestMy.Attack, false))
return false;
else
AI.SelectCard(Enemy.MonsterZone.GetHighestAttackMonster());
......@@ -142,7 +142,7 @@ namespace WindBot.Game.AI.Decks
private bool ArmoredCybernSet()
{
if (CyberDragonInHand() && (Bot.GetMonsterCount() == 0 && Enemy.GetMonsterCount() != 0) || (Bot.HasInHand(CardId.CyberDragonDrei) || Bot.HasInHand(CardId.CyberPhoenix)) && !AI.Utils.IsOneEnemyBetterThanValue(1800,true))
if (CyberDragonInHand() && (Bot.GetMonsterCount() == 0 && Enemy.GetMonsterCount() != 0) || (Bot.HasInHand(CardId.CyberDragonDrei) || Bot.HasInHand(CardId.CyberPhoenix)) && !Util.IsOneEnemyBetterThanValue(1800,true))
return false;
return true;
}
......@@ -151,7 +151,7 @@ namespace WindBot.Game.AI.Decks
{
if (Bot.GetCountCardInZone(Bot.Hand, CardId.CyberDragon) + Bot.GetCountCardInZone(Bot.MonsterZone, CardId.CyberDragon) + Bot.GetCountCardInZone(Bot.MonsterZone, CardId.CyberDragonCore) >= 1 && Bot.HasInHand(CardId.Polymerization) || Bot.GetCountCardInZone(Bot.Hand, CardId.CyberDragon) + Bot.GetCountCardInZone(Bot.MonsterZone, CardId.CyberDragon) + Bot.GetCountCardInZone(Bot.Graveyard, CardId.CyberDragon) + Bot.GetCountCardInZone(Bot.Graveyard, CardId.CyberDragonCore) >= 1 && Bot.HasInHand(CardId.PowerBond))
return true;
if (CyberDragonInHand() && (Bot.GetMonsterCount() == 0 && Enemy.GetMonsterCount() != 0) || (Bot.HasInHand(CardId.CyberDragonDrei) || Bot.HasInHand(CardId.CyberPhoenix)) && !AI.Utils.IsOneEnemyBetterThanValue(1800, true))
if (CyberDragonInHand() && (Bot.GetMonsterCount() == 0 && Enemy.GetMonsterCount() != 0) || (Bot.HasInHand(CardId.CyberDragonDrei) || Bot.HasInHand(CardId.CyberPhoenix)) && !Util.IsOneEnemyBetterThanValue(1800, true))
return false;
return true;
}
......@@ -167,8 +167,8 @@ namespace WindBot.Game.AI.Decks
return true;
else if (Card.Location == CardLocation.SpellZone)
{
if (AI.Utils.IsOneEnemyBetterThanValue(Bot.GetMonsters().GetHighestAttackMonster().Attack, true))
if (ActivateDescription == AI.Utils.GetStringId(CardId.ArmoredCybern, 2))
if (Util.IsOneEnemyBetterThanValue(Bot.GetMonsters().GetHighestAttackMonster().Attack, true))
if (ActivateDescription == Util.GetStringId(CardId.ArmoredCybern, 2))
return true;
return false;
}
......
......@@ -235,7 +235,7 @@ namespace WindBot.Game.AI.Decks
bool CrystalWingSynchroDragon_used = false;
public override void OnNewPhase()
{
//AI.Utils.UpdateLinkedZone();
//Util.UpdateLinkedZone();
//Logger.DebugWriteLine("Zones.CheckLinkedPointZones= " + Zones.CheckLinkedPointZones);
//Logger.DebugWriteLine("Zones.CheckMutualEnemyZoneCount= " + Zones.CheckMutualEnemyZoneCount);
plan_C = false;
......@@ -478,12 +478,12 @@ namespace WindBot.Game.AI.Decks
private bool OddEyesAbsoluteDragoneff()
{
Logger.DebugWriteLine("OddEyesAbsoluteDragonef 1");
if (Card.Location == CardLocation.MonsterZone/*ActivateDescription == AI.Utils.GetStringId(CardId.OddEyesAbsoluteDragon, 0)*/)
if (Card.Location == CardLocation.MonsterZone/*ActivateDescription == Util.GetStringId(CardId.OddEyesAbsoluteDragon, 0)*/)
{
Logger.DebugWriteLine("OddEyesAbsoluteDragonef 2");
return Duel.Player == 1;
}
else if (Card.Location == CardLocation.Grave/*ActivateDescription == AI.Utils.GetStringId(CardId.OddEyesAbsoluteDragon, 0)*/)
else if (Card.Location == CardLocation.Grave/*ActivateDescription == Util.GetStringId(CardId.OddEyesAbsoluteDragon, 0)*/)
{
Logger.DebugWriteLine("OddEyesAbsoluteDragonef 3");
AI.SelectCard(CardId.OddEyesWingDragon);
......@@ -501,8 +501,8 @@ namespace WindBot.Game.AI.Decks
private bool ChainEnemy()
{
if (AI.Utils.GetLastChainCard() != null &&
AI.Utils.GetLastChainCard().IsCode(CardId.UpstartGoblin))
if (Util.GetLastChainCard() != null &&
Util.GetLastChainCard().IsCode(CardId.UpstartGoblin))
return false;
return Duel.LastChainPlayer == 1;
}
......@@ -589,7 +589,7 @@ namespace WindBot.Game.AI.Decks
private bool Linkuriboheff()
{
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
if (Bot.HasInMonstersZone(CardId.WindwitchSnowBell)) return false;
return true;
}
......@@ -617,7 +617,7 @@ namespace WindBot.Game.AI.Decks
}
return true;
};
ClientCard BestEnemy = AI.Utils.GetBestEnemyMonster(true,true);
ClientCard BestEnemy = Util.GetBestEnemyMonster(true,true);
if (BestEnemy == null || BestEnemy.HasPosition(CardPosition.FaceDown)) return false;
AI.SelectCard(BestEnemy);
return true;
......@@ -641,12 +641,12 @@ namespace WindBot.Game.AI.Decks
magician.Add(check);
}
}
if (AI.Utils.IsChainTarget(Card) && Bot.GetMonsterCount() == 0)
if (Util.IsChainTarget(Card) && Bot.GetMonsterCount() == 0)
{
AI.SelectYesNo(false);
return true;
}
if (AI.Utils.ChainCountPlayer(0) > 0) return false;
if (Util.ChainCountPlayer(0) > 0) return false;
if (Enemy.HasInSpellZone(CardId.HarpiesFeatherDuster) && Card.IsFacedown())
return false;
......@@ -782,7 +782,7 @@ namespace WindBot.Game.AI.Decks
{
foreach (ClientCard check in Enemy.GetSpells())
{
if (AI.Utils.GetLastChainCard() == check)
if (Util.GetLastChainCard() == check)
{
spell.Add(check);
spell_act = true;
......@@ -804,11 +804,11 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(spell);
return true;
}
if (AI.Utils.IsChainTarget(Card))
if (Util.IsChainTarget(Card))
{
AI.SelectPlace(Zones.z0 | Zones.z4);
AI.SelectCard(CardId.DarkMagician);
ClientCard check = AI.Utils.GetOneEnemyBetterThanValue(2500, true);
ClientCard check = Util.GetOneEnemyBetterThanValue(2500, true);
if (check != null)
AI.SelectNextCard(CardId.ApprenticeLllusionMagician, CardId.DarkMagician, CardId.MagicianOfLllusion);
else
......@@ -820,7 +820,7 @@ namespace WindBot.Game.AI.Decks
{
AI.SelectPlace(Zones.z0 | Zones.z4);
AI.SelectCard(CardId.DarkMagician);
ClientCard check = AI.Utils.GetOneEnemyBetterThanValue(2500, true);
ClientCard check = Util.GetOneEnemyBetterThanValue(2500, true);
if (check != null)
AI.SelectNextCard(CardId.ApprenticeLllusionMagician, CardId.DarkMagician, CardId.MagicianOfLllusion);
else
......@@ -832,7 +832,7 @@ namespace WindBot.Game.AI.Decks
{
AI.SelectPlace(Zones.z0 | Zones.z4);
AI.SelectCard(CardId.DarkMagician);
ClientCard check = AI.Utils.GetOneEnemyBetterThanValue(2500, true);
ClientCard check = Util.GetOneEnemyBetterThanValue(2500, true);
if (check != null)
AI.SelectNextCard(CardId.ApprenticeLllusionMagician, CardId.DarkMagician, CardId.MagicianOfLllusion);
else
......@@ -846,7 +846,7 @@ namespace WindBot.Game.AI.Decks
{
AI.SelectPlace(Zones.z0 | Zones.z4);
AI.SelectCard(CardId.DarkMagician);
ClientCard check = AI.Utils.GetOneEnemyBetterThanValue(2500, true);
ClientCard check = Util.GetOneEnemyBetterThanValue(2500, true);
if (check != null)
AI.SelectNextCard(CardId.ApprenticeLllusionMagician, CardId.DarkMagician, CardId.MagicianOfLllusion);
else
......@@ -860,7 +860,7 @@ namespace WindBot.Game.AI.Decks
{
AI.SelectPlace(Zones.z0 | Zones.z4);
AI.SelectCard(CardId.DarkMagician);
ClientCard check = AI.Utils.GetOneEnemyBetterThanValue(2500, true);
ClientCard check = Util.GetOneEnemyBetterThanValue(2500, true);
if (check != null)
AI.SelectNextCard(CardId.ApprenticeLllusionMagician, CardId.DarkMagician, CardId.MagicianOfLllusion);
else
......@@ -884,9 +884,9 @@ namespace WindBot.Game.AI.Decks
{
if (magician_sp)
{
AI.SelectCard(AI.Utils.GetBestEnemyCard(false, true));
if (AI.Utils.GetBestEnemyCard(false, true) != null)
Logger.DebugWriteLine("*************SelectCard= " + AI.Utils.GetBestEnemyCard(false, true).Id);
AI.SelectCard(Util.GetBestEnemyCard(false, true));
if (Util.GetBestEnemyCard(false, true) != null)
Logger.DebugWriteLine("*************SelectCard= " + Util.GetBestEnemyCard(false, true).Id);
magician_sp = false;
}
}
......@@ -932,7 +932,7 @@ namespace WindBot.Game.AI.Decks
}
if (ghost_count != ghost_done)
{
if (Duel.CurrentChain.Count >= 2 && AI.Utils.GetLastChainCard().IsCode(0))
if (Duel.CurrentChain.Count >= 2 && Util.GetLastChainCard().IsCode(0))
{
AI.SelectCard(CardId.MagiciansRod);
AI.SelectNextCard(CardId.DarkMagician, CardId.DarkMagician);
......@@ -942,7 +942,7 @@ namespace WindBot.Game.AI.Decks
int count = 0;
foreach (ClientCard m in Bot.GetMonsters())
{
if (AI.Utils.IsChainTarget(m))
if (Util.IsChainTarget(m))
{
count++;
target = m;
......@@ -1128,14 +1128,14 @@ namespace WindBot.Game.AI.Decks
if (Duel.Turn != 1)
{
if (Duel.Phase == DuelPhase.Main1 && Enemy.GetSpellCountWithoutField() == 0 &&
AI.Utils.GetBestEnemyMonster(true, true) == null)
Util.GetBestEnemyMonster(true, true) == null)
return false;
if (Duel.Phase == DuelPhase.Main1 && Enemy.GetSpellCountWithoutField() == 0 &&
AI.Utils.GetBestEnemyMonster().IsFacedown())
Util.GetBestEnemyMonster().IsFacedown())
return true;
if (Duel.Phase == DuelPhase.Main1 && Enemy.GetSpellCountWithoutField() == 0 &&
AI.Utils.GetBestBotMonster(true) != null &&
AI.Utils.GetBestBotMonster(true).Attack > AI.Utils.GetBestEnemyMonster(true).Attack)
Util.GetBestBotMonster(true) != null &&
Util.GetBestBotMonster(true).Attack > Util.GetBestEnemyMonster(true).Attack)
return false;
}
return true;
......@@ -1209,7 +1209,7 @@ namespace WindBot.Game.AI.Decks
}
private bool ApprenticeLllusionMagicianeff()
{
if (AI.Utils.ChainContainsCard(CardId.ApprenticeLllusionMagician)) return false;
if (Util.ChainContainsCard(CardId.ApprenticeLllusionMagician)) return false;
if (Duel.Phase == DuelPhase.Battle ||
Duel.Phase == DuelPhase.BattleStart ||
Duel.Phase == DuelPhase.BattleStep ||
......@@ -1434,9 +1434,9 @@ namespace WindBot.Game.AI.Decks
IList<ClientCard> list_1 = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (AI.Utils.GetWorstBotMonster(true) != null)
if (Util.GetWorstBotMonster(true) != null)
{
if (monster.IsAttack() && monster.Id != AI.Utils.GetWorstBotMonster(true).Id)
if (monster.IsAttack() && monster.Id != Util.GetWorstBotMonster(true).Id)
list_1.Add(monster);
}
}
......@@ -1477,7 +1477,7 @@ namespace WindBot.Game.AI.Decks
private bool BigEyesp()
{
if (plan_C) return false;
if (AI.Utils.IsOneEnemyBetterThanValue(2500, false) &&
if (Util.IsOneEnemyBetterThanValue(2500, false) &&
!Bot.HasInHandOrHasInMonstersZone(CardId.ApprenticeLllusionMagician))
{
//AI.SelectPlace(Zones.z5, Zones.ExtraMonsterZones);
......@@ -1489,7 +1489,7 @@ namespace WindBot.Game.AI.Decks
private bool BigEyeeff()
{
ClientCard target = AI.Utils.GetBestEnemyMonster(false, true);
ClientCard target = Util.GetBestEnemyMonster(false, true);
if (target != null && target.Attack >= 2500)
{
AI.SelectCard(CardId.DarkMagician);
......@@ -1502,7 +1502,7 @@ namespace WindBot.Game.AI.Decks
private bool Dracossacksp()
{
if (plan_C) return false;
if (AI.Utils.IsOneEnemyBetterThanValue(2500, false) &&
if (Util.IsOneEnemyBetterThanValue(2500, false) &&
!Bot.HasInHandOrHasInMonstersZone(CardId.ApprenticeLllusionMagician))
{
//AI.SelectPlace(Zones.z5, Zones.ExtraMonsterZones);
......@@ -1514,13 +1514,13 @@ namespace WindBot.Game.AI.Decks
private bool Dracossackeff()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.Dracossack, 0))
if (ActivateDescription == Util.GetStringId(CardId.Dracossack, 0))
{
AI.SelectCard(CardId.DarkMagician);
return true;
}
ClientCard target = AI.Utils.GetBestEnemyCard(false, true);
ClientCard target = Util.GetBestEnemyCard(false, true);
if (target != null)
{
AI.SelectCard(CardId.Dracossack + 1);
......@@ -1624,11 +1624,11 @@ namespace WindBot.Game.AI.Decks
Logger.DebugWriteLine("++++++++SpellZone[" + i + "]= " + Bot.SpellZone[i].Id);
}*/
if ((Duel.CurrentChain.Count >= 1 && AI.Utils.GetLastChainCard().Id == 0) ||
(Duel.CurrentChain.Count == 2 && !AI.Utils.ChainContainPlayer(0) && Duel.CurrentChain[0].Id == 0))
if ((Duel.CurrentChain.Count >= 1 && Util.GetLastChainCard().Id == 0) ||
(Duel.CurrentChain.Count == 2 && !Util.ChainContainPlayer(0) && Duel.CurrentChain[0].Id == 0))
{
Logger.DebugWriteLine("current chain = " + Duel.CurrentChain.Count);
Logger.DebugWriteLine("******last chain card= " + AI.Utils.GetLastChainCard().Id);
Logger.DebugWriteLine("******last chain card= " + Util.GetLastChainCard().Id);
int maxxc_count = 0;
foreach (ClientCard check in Enemy.Graveyard)
{
......@@ -1637,7 +1637,7 @@ namespace WindBot.Game.AI.Decks
}
if (maxxc_count != maxxc_done)
{
Logger.DebugWriteLine("************************last chain card= " + AI.Utils.GetLastChainCard().Id);
Logger.DebugWriteLine("************************last chain card= " + Util.GetLastChainCard().Id);
maxxc_used = true;
}
int lockbird_count = 0;
......@@ -1648,7 +1648,7 @@ namespace WindBot.Game.AI.Decks
}
if (lockbird_count != lockbird_done)
{
Logger.DebugWriteLine("************************last chain card= " + AI.Utils.GetLastChainCard().Id);
Logger.DebugWriteLine("************************last chain card= " + Util.GetLastChainCard().Id);
lockbird_used = true;
}
int ghost_count = 0;
......@@ -1659,10 +1659,10 @@ namespace WindBot.Game.AI.Decks
}
if (ghost_count != ghost_done)
{
Logger.DebugWriteLine("************************last chain card= " + AI.Utils.GetLastChainCard().Id);
Logger.DebugWriteLine("************************last chain card= " + Util.GetLastChainCard().Id);
ghost_used = true;
}
if (ghost_used && AI.Utils.ChainContainsCard(CardId.WindwitchGlassBell))
if (ghost_used && Util.ChainContainsCard(CardId.WindwitchGlassBell))
{
AI.SelectCard(CardId.WindwitchIceBell);
Logger.DebugWriteLine("***********WindwitchGlassBell*********************");
......
......@@ -170,7 +170,7 @@ namespace WindBot.Game.AI.Decks
break;
}
}
if (!hasRealMonster || AI.Utils.GetProblematicCard() != null)*/
if (!hasRealMonster || Util.GetProblematicCard() != null)*/
needId = CardId.DragunityDux;
}
......@@ -200,7 +200,7 @@ namespace WindBot.Game.AI.Decks
else
option = 1;
if (ActivateDescription != AI.Utils.GetStringId(CardId.DragonRavine, option))
if (ActivateDescription != Util.GetStringId(CardId.DragonRavine, option))
return false;
AI.SelectCard(tributeId);
......@@ -253,8 +253,8 @@ namespace WindBot.Game.AI.Decks
private bool MonsterReborn()
{
List<ClientCard> cards = new List<ClientCard>(Bot.Graveyard);
cards.Sort(AIFunctions.CompareCardAttack);
List<ClientCard> cards = new List<ClientCard>(Bot.Graveyard.GetMatchingCards(card => card.IsCanRevive()));
cards.Sort(CardContainer.CompareCardAttack);
ClientCard selectedCard = null;
for (int i = cards.Count - 1; i >= 0; --i)
{
......@@ -269,8 +269,8 @@ namespace WindBot.Game.AI.Decks
break;
}
}
cards = new List<ClientCard>(Enemy.Graveyard);
cards.Sort(AIFunctions.CompareCardAttack);
cards = new List<ClientCard>(Enemy.Graveyard.GetMatchingCards(card => card.IsCanRevive()));
cards.Sort(CardContainer.CompareCardAttack);
for (int i = cards.Count - 1; i >= 0; --i)
{
ClientCard card = cards[i];
......@@ -333,16 +333,16 @@ namespace WindBot.Game.AI.Decks
private bool ScrapDragonSummon()
{
//if (AI.Utils.IsOneEnemyBetterThanValue(2500, true))
//if (Util.IsOneEnemyBetterThanValue(2500, true))
// return true;
ClientCard invincible = AI.Utils.GetProblematicEnemyCard(3000);
ClientCard invincible = Util.GetProblematicEnemyCard(3000);
return invincible != null;
}
private bool ScrapDragonEffect()
{
ClientCard invincible = AI.Utils.GetProblematicEnemyCard(3000);
if (invincible == null && !AI.Utils.IsOneEnemyBetterThanValue(2800 - 1, false))
ClientCard invincible = Util.GetProblematicEnemyCard(3000);
if (invincible == null && !Util.IsOneEnemyBetterThanValue(2800 - 1, false))
return false;
int tributeId = -1;
......@@ -362,7 +362,7 @@ namespace WindBot.Game.AI.Decks
tributeId = CardId.DragonRavine;
List<ClientCard> monsters = Enemy.GetMonsters();
monsters.Sort(AIFunctions.CompareCardAttack);
monsters.Sort(CardContainer.CompareCardAttack);
ClientCard destroyCard = invincible;
if (destroyCard == null)
......@@ -432,7 +432,7 @@ namespace WindBot.Game.AI.Decks
|| Bot.HasInHand(CardId.DragunitySpearOfDestiny))
{
List<ClientCard> monster_sorted = Bot.GetMonsters();
monster_sorted.Sort(AIFunctions.CompareCardAttack);
monster_sorted.Sort(CardContainer.CompareCardAttack);
foreach (ClientCard monster in monster_sorted)
{
AI.SelectMaterials(monster);
......
......@@ -87,7 +87,7 @@ namespace WindBot.Game.AI.Decks
private bool SwapFrogSummon()
{
int atk = Card.Attack + GetSpellBonus();
if (AI.Utils.IsAllEnemyBetterThanValue(atk, true))
if (Util.IsAllEnemyBetterThanValue(atk, true))
return false;
AI.SelectCard(CardId.Ronintoadin);
......@@ -120,7 +120,7 @@ namespace WindBot.Game.AI.Decks
{
m_flipFlopFrogSummoned = -1;
List<ClientCard> monsters = Enemy.GetMonsters();
monsters.Sort(AIFunctions.CompareCardAttack);
monsters.Sort(CardContainer.CompareCardAttack);
monsters.Reverse();
AI.SelectCard(monsters);
return true;
......@@ -144,7 +144,7 @@ namespace WindBot.Game.AI.Decks
{
int atk = Card.Attack + GetSpellBonus();
if (AI.Utils.IsOneEnemyBetterThanValue(atk, true))
if (Util.IsOneEnemyBetterThanValue(atk, true))
return false;
if (Card.IsCode(CardId.SwapFrog))
......@@ -156,7 +156,7 @@ namespace WindBot.Game.AI.Decks
{
List<int> cards = new List<int>();
if (AI.Utils.IsOneEnemyBetter())
if (Util.IsOneEnemyBetter())
{
cards.Add(CardId.FlipFlopFrog);
}
......@@ -213,7 +213,7 @@ namespace WindBot.Game.AI.Decks
if (Card.IsCode(CardId.DewdarkOfTheIceBarrier))
return Card.IsDefense();
bool enemyBetter = AI.Utils.IsOneEnemyBetterThanValue(Card.Attack + (Card.IsFacedown() ? GetSpellBonus() : 0), true);
bool enemyBetter = Util.IsOneEnemyBetterThanValue(Card.Attack + (Card.IsFacedown() ? GetSpellBonus() : 0), true);
if (Card.Attack < 800)
enemyBetter = true;
bool result = false;
......
......@@ -130,7 +130,7 @@ namespace WindBot.Game.AI.Decks
private bool GravekeepersDescendantEffect()
{
int bestatk = Bot.GetMonsters().GetHighestAttackMonster().Attack;
if (AI.Utils.IsOneEnemyBetterThanValue(bestatk, true))
if (Util.IsOneEnemyBetterThanValue(bestatk, true))
{
AI.SelectCard(Enemy.GetMonsters().GetHighestAttackMonster());
return true;
......
......@@ -183,14 +183,14 @@ namespace WindBot.Game.AI.Decks
targets.Add(check);
}
if (AI.Utils.GetPZone(1, 0) != null && AI.Utils.GetPZone(1, 0).Type == 16777218)
if (Util.GetPZone(1, 0) != null && Util.GetPZone(1, 0).Type == 16777218)
{
targets.Add(AI.Utils.GetPZone(1, 0));
targets.Add(Util.GetPZone(1, 0));
}
if (AI.Utils.GetPZone(1, 1) != null && AI.Utils.GetPZone(1, 1).Type == 16777218)
if (Util.GetPZone(1, 1) != null && Util.GetPZone(1, 1).Type == 16777218)
{
targets.Add(AI.Utils.GetPZone(1, 1));
targets.Add(Util.GetPZone(1, 1));
}
foreach (ClientCard check in Enemy.GetSpells())
{
......@@ -208,9 +208,9 @@ namespace WindBot.Game.AI.Decks
if (check.Type == 16777218)
count++;
}
if(AI.Utils.GetLastChainCard()!=null &&
(AI.Utils.GetLastChainCard().HasType(CardType.Continuous)||
AI.Utils.GetLastChainCard().HasType(CardType.Field) || count==2) &&
if(Util.GetLastChainCard()!=null &&
(Util.GetLastChainCard().HasType(CardType.Continuous)||
Util.GetLastChainCard().HasType(CardType.Field) || count==2) &&
Duel.LastChainPlayer==1)
{
AI.SelectCard(targets);
......@@ -235,9 +235,9 @@ namespace WindBot.Game.AI.Decks
}
if(count==2)
{
if (AI.Utils.GetPZone(1, 1) != null && AI.Utils.GetPZone(1, 1).Type == 16777218)
if (Util.GetPZone(1, 1) != null && Util.GetPZone(1, 1).Type == 16777218)
{
card=AI.Utils.GetPZone(1, 1);
card=Util.GetPZone(1, 1);
}
}
......@@ -251,27 +251,27 @@ namespace WindBot.Game.AI.Decks
private bool DarkBribeeff()
{
if (AI.Utils.GetLastChainCard()!=null && AI.Utils.GetLastChainCard().IsCode(CardId.UpstartGoblin))
if (Util.GetLastChainCard()!=null && Util.GetLastChainCard().IsCode(CardId.UpstartGoblin))
return false;
return true;
}
private bool ImperialOrderfirst()
{
if (AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().IsCode(CardId.UpstartGoblin))
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.UpstartGoblin))
return false;
return DefaultOnBecomeTarget() && AI.Utils.GetLastChainCard().HasType(CardType.Spell);
return DefaultOnBecomeTarget() && Util.GetLastChainCard().HasType(CardType.Spell);
}
private bool ImperialOrdereff()
{
if (AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().IsCode(CardId.UpstartGoblin))
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.UpstartGoblin))
return false;
if (Duel.LastChainPlayer == 1)
{
foreach(ClientCard check in Enemy.GetSpells())
{
if (AI.Utils.GetLastChainCard() == check)
if (Util.GetLastChainCard() == check)
return true;
}
}
......@@ -284,7 +284,7 @@ namespace WindBot.Game.AI.Decks
if(Enemy.BattlingMonster.Attack-Bot.LifePoints>=1000)
return DefaultUniqueTrap();
}
if (AI.Utils.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints)
if (Util.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints)
return DefaultUniqueTrap();
if (Enemy.GetMonsterCount() >= 2)
return DefaultUniqueTrap();
......@@ -307,7 +307,7 @@ namespace WindBot.Game.AI.Decks
if (card.HasType(CardType.Monster))
count++;
}
if(AI.Utils.GetBestEnemyMonster()!=null && AI.Utils.GetBestEnemyMonster().Attack>=1900)
if(Util.GetBestEnemyMonster()!=null && Util.GetBestEnemyMonster().Attack>=1900)
AI.SelectCard(
CardId.EaterOfMillions,
CardId.PotOfDesires,
......@@ -473,7 +473,7 @@ namespace WindBot.Game.AI.Decks
}
return true;
};
ClientCard BestEnemy = AI.Utils.GetBestEnemyMonster(true);
ClientCard BestEnemy = Util.GetBestEnemyMonster(true);
ClientCard WorstBot = Bot.GetMonsters().GetLowestAttackMonster();
if (BestEnemy == null || BestEnemy.HasPosition(CardPosition.FaceDown)) return false;
if (WorstBot == null || WorstBot.HasPosition(CardPosition.FaceDown)) return false;
......@@ -493,9 +493,9 @@ namespace WindBot.Game.AI.Decks
AI.SelectPlace(Zones.z4);
if (Enemy.HasInMonstersZone(CardId.KnightmareGryphon, true)) return false;
if (Bot.HasInMonstersZone(CardId.InspectBoarder) && !eater_eff) return false;
if (AI.Utils.GetProblematicEnemyMonster() == null && Bot.ExtraDeck.Count < 5) return false;
if (Util.GetProblematicEnemyMonster() == null && Bot.ExtraDeck.Count < 5) return false;
if (Bot.GetMonstersInMainZone().Count >= 5) return false;
if (AI.Utils.IsTurn1OrMain2()) return false;
if (Util.IsTurn1OrMain2()) return false;
AI.SelectPosition(CardPosition.FaceUpAttack);
IList<ClientCard> targets = new List<ClientCard>();
foreach (ClientCard e_c in Bot.ExtraDeck)
......@@ -588,7 +588,7 @@ namespace WindBot.Game.AI.Decks
private bool Linkuriboheff()
{
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
return true;
}
private bool MonsterRepos()
......
......@@ -97,7 +97,7 @@ namespace WindBot.Game.AI.Decks
return false;
List<ClientCard> cards = new List<ClientCard>(Bot.Graveyard);
cards.Sort(AIFunctions.CompareCardAttack);
cards.Sort(CardContainer.CompareCardAttack);
for (int i = cards.Count - 1; i >= 0; --i)
{
ClientCard card = cards[i];
......@@ -114,8 +114,8 @@ namespace WindBot.Game.AI.Decks
private bool MonsterReborn()
{
List<ClientCard> cards = new List<ClientCard>(Bot.Graveyard);
cards.Sort(AIFunctions.CompareCardAttack);
List<ClientCard> cards = new List<ClientCard>(Bot.Graveyard.GetMatchingCards(card => card.IsCanRevive()));
cards.Sort(CardContainer.CompareCardAttack);
ClientCard selectedCard = null;
for (int i = cards.Count - 1; i >= 0; --i)
{
......@@ -128,8 +128,8 @@ namespace WindBot.Game.AI.Decks
break;
}
}
cards = new List<ClientCard>(Enemy.Graveyard);
cards.Sort(AIFunctions.CompareCardAttack);
cards = new List<ClientCard>(Enemy.Graveyard.GetMatchingCards(card => card.IsCanRevive()));
cards.Sort(CardContainer.CompareCardAttack);
for (int i = cards.Count - 1; i >= 0; --i)
{
ClientCard card = cards[i];
......@@ -152,7 +152,7 @@ namespace WindBot.Game.AI.Decks
private bool WhiteNightDragon()
{
// We should summon Horus the Black Flame Dragon LV6 if he can lvlup.
if (Enemy.GetMonsterCount() != 0 && !AI.Utils.IsAllEnemyBetterThanValue(2300 - 1, false))
if (Enemy.GetMonsterCount() != 0 && !Util.IsAllEnemyBetterThanValue(2300 - 1, false))
foreach (ClientCard card in Main.SummonableCards)
if (card.IsCode(11224103))
return false;
......@@ -170,7 +170,7 @@ namespace WindBot.Game.AI.Decks
List<ClientCard> cards = new List<ClientCard>(Bot.GetMonsters());
if (cards.Count == 0)
return false;
cards.Sort(AIFunctions.CompareCardAttack);
cards.Sort(CardContainer.CompareCardAttack);
ClientCard tributeCard = null;
foreach (ClientCard monster in cards)
{
......@@ -190,7 +190,7 @@ namespace WindBot.Game.AI.Decks
cards.AddRange(Bot.Graveyard);
if (cards.Count == 0)
return false;
cards.Sort(AIFunctions.CompareCardAttack);
cards.Sort(CardContainer.CompareCardAttack);
ClientCard summonCard = null;
for (int i = cards.Count - 1; i >= 0; --i)
{
......
......@@ -116,7 +116,7 @@ namespace WindBot.Game.AI.Decks
break;
}
return AI.Utils.CheckSelectCount(result, cards, min, max);
return Util.CheckSelectCount(result, cards, min, max);
}
private bool ReinforcementOfTheArmyEffect()
......@@ -222,10 +222,10 @@ namespace WindBot.Game.AI.Decks
{
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = AI.Utils.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster();
if (target1 != null)
targets.Add(target1);
ClientCard target2 = AI.Utils.GetBestEnemySpell();
ClientCard target2 = Util.GetBestEnemySpell();
if (target2 != null)
targets.Add(target2);
......
......@@ -479,7 +479,7 @@ namespace WindBot.Game.AI.Decks
private bool FairyTailSnowsummon()
{
ClientCard target = AI.Utils.GetBestEnemyMonster(true, true);
ClientCard target = Util.GetBestEnemyMonster(true, true);
if(target != null)
{
return true;
......@@ -493,7 +493,7 @@ namespace WindBot.Game.AI.Decks
if (Card.Location == CardLocation.MonsterZone)
{
AI.SelectCard(AI.Utils.GetBestEnemyMonster(true, true));
AI.SelectCard(Util.GetBestEnemyMonster(true, true));
return true;
}
else
......@@ -524,14 +524,14 @@ namespace WindBot.Game.AI.Decks
all.Add(check);
}
}
if (AI.Utils.ChainContainsCard(CardId.FairyTailSnow)) return false;
if (Util.ChainContainsCard(CardId.FairyTailSnow)) return false;
if ( Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Bot.BattlingMonster == null && Enemy_atk >=Bot.LifePoints ||
Duel.Player == 0 && Duel.Phase==DuelPhase.BattleStart && Enemy.BattlingMonster == null && Enemy.LifePoints<=1850
)
{
AI.SelectCard(all);
AI.SelectNextCard(AI.Utils.GetBestEnemyMonster());
AI.SelectNextCard(Util.GetBestEnemyMonster());
return true;
}
}
......@@ -602,7 +602,7 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(CardId.UltimateConductorTytanno);
return true;
}
if (!AI.Utils.IsOneEnemyBetter(true)) return false;
if (!Util.IsOneEnemyBetter(true)) return false;
IList<int> targets = new[] {
CardId.ElShaddollConstruct,
CardId.DogorantheMadFlameKaiju,
......@@ -752,7 +752,7 @@ namespace WindBot.Game.AI.Decks
return true;
}
}
if (!AI.Utils.IsOneEnemyBetter()) return false;
if (!Util.IsOneEnemyBetter()) return false;
foreach (ClientCard monster in Bot.Hand)
......@@ -830,7 +830,7 @@ namespace WindBot.Game.AI.Decks
ShaddollSquamata_used = true;
if (Card.Location != CardLocation.MonsterZone)
{
if(AI.Utils.ChainContainsCard(CardId.ElShaddollConstruct))
if(Util.ChainContainsCard(CardId.ElShaddollConstruct))
{
if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion))
AI.SelectNextCard(CardId.ShaddollCore);
......@@ -851,7 +851,7 @@ namespace WindBot.Game.AI.Decks
else
{
if (Enemy.GetMonsterCount() == 0) return false;
ClientCard target = AI.Utils.GetBestEnemyMonster();
ClientCard target = Util.GetBestEnemyMonster();
AI.SelectCard(target);
}
return true;
......@@ -890,7 +890,7 @@ namespace WindBot.Game.AI.Decks
ShaddollHedgehog_used = true;
if (Card.Location != CardLocation.MonsterZone)
{
if (AI.Utils.ChainContainsCard(CardId.ElShaddollConstruct))
if (Util.ChainContainsCard(CardId.ElShaddollConstruct))
{
AI.SelectNextCard(
CardId.ShaddollFalco,
......@@ -924,14 +924,14 @@ namespace WindBot.Game.AI.Decks
ShaddollDragon_used = true;
if (Card.Location == CardLocation.MonsterZone)
{
ClientCard target = AI.Utils.GetBestEnemyCard();
ClientCard target = Util.GetBestEnemyCard();
AI.SelectCard(target);
return true;
}
else
{
if (Enemy.GetSpellCount() == 0) return false;
ClientCard target = AI.Utils.GetBestEnemySpell();
ClientCard target = Util.GetBestEnemySpell();
AI.SelectCard(target);
return true;
}
......@@ -996,7 +996,7 @@ namespace WindBot.Game.AI.Decks
if (Card.Location == CardLocation.Grave)
return true;
if (Bot.LifePoints <= 1000) return false;
ClientCard select = AI.Utils.GetBestEnemyCard();
ClientCard select = Util.GetBestEnemyCard();
if (select == null) return false;
if(select!=null)
{
......@@ -1018,10 +1018,10 @@ namespace WindBot.Game.AI.Decks
{
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = AI.Utils.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster();
if (target1 != null)
targets.Add(target1);
ClientCard target2 = AI.Utils.GetBestEnemySpell();
ClientCard target2 = Util.GetBestEnemySpell();
if (target2 != null)
targets.Add(target2);
......@@ -1106,16 +1106,16 @@ namespace WindBot.Game.AI.Decks
return true;
}
else if (DarkHole || AI.Utils.IsChainTarget(Card) || AI.Utils.GetProblematicEnemySpell() != null)
else if (DarkHole || Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null)
{
AI.SelectCard(CardId.TG_WonderMagician);
return true;
}
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && AI.Utils.IsOneEnemyBetterThanValue(1500, true))
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(1500, true))
{
AI.SelectCard(CardId.TG_WonderMagician);
if (AI.Utils.IsOneEnemyBetterThanValue(1900, true))
if (Util.IsOneEnemyBetterThanValue(1900, true))
{
AI.SelectPosition(CardPosition.FaceUpDefence);
}
......@@ -1136,7 +1136,7 @@ namespace WindBot.Game.AI.Decks
private bool ScarlightRedDragoneff()
{
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = AI.Utils.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster();
if (target1 != null)
{
targets.Add(target1);
......@@ -1160,8 +1160,8 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(Useless_List());
return true;
}
//if (ActivateDescription == AI.Utils.GetStringId(CardId.snake, 2)) return true;
if (ActivateDescription == AI.Utils.GetStringId(CardId.snake, 1))
//if (ActivateDescription == Util.GetStringId(CardId.snake, 2)) return true;
if (ActivateDescription == Util.GetStringId(CardId.snake, 1))
{
foreach (ClientCard hand in Bot.Hand)
{
......@@ -1186,7 +1186,7 @@ namespace WindBot.Game.AI.Decks
private bool BlackRoseMoonlightDragoneff()
{
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = AI.Utils.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster();
if (target1 != null)
{
targets.Add(target1);
......@@ -1224,18 +1224,18 @@ namespace WindBot.Game.AI.Decks
return true;
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = AI.Utils.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster();
if (target1 != null)
targets.Add(target1);
ClientCard target2 = AI.Utils.GetBestEnemySpell();
ClientCard target2 = Util.GetBestEnemySpell();
if (target2 != null)
targets.Add(target2);
else if (AI.Utils.IsChainTarget(Card) || AI.Utils.GetProblematicEnemySpell() != null)
else if (Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null)
{
AI.SelectCard(targets);
return true;
}
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && AI.Utils.IsOneEnemyBetterThanValue(2400, true))
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(2400, true))
{
AI.SelectCard(targets);
return true;
......
......@@ -159,7 +159,7 @@ namespace WindBot.Game.AI.Decks
private bool DecisiveArmorEffect()
{
if (AI.Utils.IsAllEnemyBetterThanValue(3300, true))
if (Util.IsAllEnemyBetterThanValue(3300, true))
{
AI.SelectCard(CardId.DecisiveArmor);
return true;
......@@ -176,7 +176,7 @@ namespace WindBot.Game.AI.Decks
private bool GungnirEffect()
{
if (AI.Utils.IsOneEnemyBetter(true) && Duel.Phase == DuelPhase.Main1)
if (Util.IsOneEnemyBetter(true) && Duel.Phase == DuelPhase.Main1)
{
AI.SelectCard(Enemy.GetMonsters().GetHighestAttackMonster());
return true;
......@@ -196,12 +196,12 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(CardId.Mirror);
return true;
}
else if (AI.Utils.IsOneEnemyBetterThanValue(3300, true) && !Bot.HasInHand(CardId.Trishula))
else if (Util.IsOneEnemyBetterThanValue(3300, true) && !Bot.HasInHand(CardId.Trishula))
{
AI.SelectCard(CardId.Trishula);
return true;
}
else if (AI.Utils.IsAllEnemyBetterThanValue(2700,true) && !Bot.HasInHand(CardId.DecisiveArmor))
else if (Util.IsAllEnemyBetterThanValue(2700,true) && !Bot.HasInHand(CardId.DecisiveArmor))
{
AI.SelectCard(CardId.DecisiveArmor);
return true;
......@@ -221,12 +221,12 @@ namespace WindBot.Game.AI.Decks
private bool ThousandHandsEffect()
{
if (AI.Utils.IsOneEnemyBetterThanValue(3300, true) && !Bot.HasInHand(CardId.Trishula))
if (Util.IsOneEnemyBetterThanValue(3300, true) && !Bot.HasInHand(CardId.Trishula))
{
AI.SelectCard(CardId.Trishula);
return true;
}
else if (AI.Utils.IsAllEnemyBetterThanValue(2700, true) && !Bot.HasInHand(CardId.DecisiveArmor))
else if (Util.IsAllEnemyBetterThanValue(2700, true) && !Bot.HasInHand(CardId.DecisiveArmor))
{
AI.SelectCard(CardId.DecisiveArmor);
return true;
......@@ -277,7 +277,7 @@ namespace WindBot.Game.AI.Decks
foreach (int Id in NekrozCard)
{
if (Id == CardId.Trishula && AI.Utils.IsAllEnemyBetterThanValue(2700, true) && Bot.HasInHand(CardId.DecisiveArmor))
if (Id == CardId.Trishula && Util.IsAllEnemyBetterThanValue(2700, true) && Bot.HasInHand(CardId.DecisiveArmor))
{
AI.SelectCard(CardId.Trishula);
return true;
......
......@@ -104,7 +104,7 @@ namespace WindBot.Game.AI.Decks
if (handCard.IsFacedown())
return true;
}
return AI.Utils.IsOneEnemyBetter(true);
return Util.IsOneEnemyBetter(true);
}
}
}
\ No newline at end of file
using System;
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
{
[Deck("Orcust", "AI_Orcust")]
class OrcustExecutor : DefaultExecutor
{
public class CardId
{
public const int OrcustKnightmare = 4055337;
public const int OrcustHarpHorror = 57835716;
public const int OrcustCymbalSkeleton = 21441617;
public const int WorldLegacyWorldWand = 93920420;
public const int ThePhantomKnightsofAncientCloak = 90432163;
public const int ThePhantomKnightsofSilentBoots = 36426778;
public const int TrickstarCarobein = 98169343;
public const int TrickstarCandina = 61283655;
public const int ArmageddonKnight = 28985331;
public const int ScrapRecycler = 4334811;
public const int DestrudoTheLostDragonsFrisson = 5560911;
public const int JetSynchron = 9742784;
public const int AshBlossomJoyousSpring = 14558127;
public const int GhostBelleHauntedMansion = 73642296;
public const int MaxxC = 23434538;
public const int SkyStrikerMobilizeEngage = 63166095;
public const int SkyStrikerMechaEagleBooster = 25733157;
public const int SkyStrikerMechaHornetDrones = 52340444;
public const int SkyStrikerMechaHornetDronesToken = 52340445;
public const int TrickstarLightStage = 35371948;
public const int OrcustratedBabel = 90351981;
public const int ReinforcementofTheArmy = 32807846;
public const int Terraforming = 73628505;
public const int FoolishBurial = 81439173;
public const int CalledbyTheGrave = 24224830;
public const int ThePhantomKnightsofShadeBrigandine = 98827725;
public const int PhantomKnightsFogBlade = 25542642;
public const int OrcustratedClimax = 703897;
public const int BorreloadSavageDragon = 27548199;
public const int ShootingRiserDragon = 68431965;
public const int SheorcustDingirsu = 93854893;
public const int BorrelswordDragon = 85289965;
public const int LongirsuTheOrcustOrchestrator = 76145142;
public const int ThePhantomKnightsofRustyBardiche = 26692769;
public const int KnightmarePhoenix = 2857636;
public const int GalateaTheOrcustAutomaton = 30741503;
public const int CrystronNeedlefiber = 50588353;
public const int SkyStrikerAceKagari = 63288573;
public const int KnightmareMermaid = 3679218;
public const int SalamangreatAlmiraj = 60303245;
}
public OrcustExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, CardId.SkyStrikerMechaEagleBooster, EagleBoosterEffect);
AddExecutor(ExecutorType.Activate, CardId.OrcustratedClimax, ClimaxEffect);
AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC);
AddExecutor(ExecutorType.Activate, CardId.AshBlossomJoyousSpring, DefaultAshBlossomAndJoyousSpring);
AddExecutor(ExecutorType.Activate, CardId.GhostBelleHauntedMansion, DefaultGhostBelleAndHauntedMansion);
AddExecutor(ExecutorType.Activate, CardId.CalledbyTheGrave, DefaultCalledByTheGrave);
AddExecutor(ExecutorType.Activate, CardId.Terraforming, TerraformingEffect);
AddExecutor(ExecutorType.Activate, CardId.ReinforcementofTheArmy, ReinforcementofTheArmyEffect);
AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect);
AddExecutor(ExecutorType.Activate, CardId.TrickstarLightStage, LightStageEffect);
AddExecutor(ExecutorType.Activate, CardId.SkyStrikerMobilizeEngage, EngageEffect);
AddExecutor(ExecutorType.Activate, CardId.SkyStrikerMechaHornetDrones, DronesEffectFirst);
AddExecutor(ExecutorType.SpSummon, CardId.SkyStrikerAceKagari);
AddExecutor(ExecutorType.Activate, CardId.SkyStrikerAceKagari);
AddExecutor(ExecutorType.SpSummon, CardId.KnightmareMermaid, KnightmareMermaidSummon);
AddExecutor(ExecutorType.Activate, CardId.KnightmareMermaid, KnightmareMermaidEffect);
AddExecutor(ExecutorType.SpSummon, CardId.TrickstarCarobein, CarobeinSummon);
AddExecutor(ExecutorType.Activate, CardId.TrickstarCarobein);
AddExecutor(ExecutorType.SpellSet, CardId.ThePhantomKnightsofShadeBrigandine);
AddExecutor(ExecutorType.Summon, CardId.ArmageddonKnight, ArmageddonKnightSummon);
AddExecutor(ExecutorType.Activate, CardId.ArmageddonKnight, ArmageddonKnightEffect);
AddExecutor(ExecutorType.Summon, CardId.ScrapRecycler, ScrapRecyclerSummon);
AddExecutor(ExecutorType.Activate, CardId.ScrapRecycler, ScrapRecyclerEffect);
AddExecutor(ExecutorType.Activate, CardId.SkyStrikerMechaHornetDrones, DronesEffect);
AddExecutor(ExecutorType.Summon, CardId.JetSynchron, JetSynchronSummon);
AddExecutor(ExecutorType.Activate, CardId.DestrudoTheLostDragonsFrisson, DestrudoSummon);
AddExecutor(ExecutorType.SpSummon, CardId.CrystronNeedlefiber, NeedlefiberSummonFirst);
AddExecutor(ExecutorType.Activate, CardId.CrystronNeedlefiber, NeedlefiberEffect);
AddExecutor(ExecutorType.Activate, CardId.ShootingRiserDragon, ShootingRiserDragonEffect);
AddExecutor(ExecutorType.Summon, CardId.TrickstarCandina, CandinaSummon);
AddExecutor(ExecutorType.Activate, CardId.TrickstarCandina, CandinaEffect);
AddExecutor(ExecutorType.Summon, CardId.JetSynchron, OneCardComboSummon);
AddExecutor(ExecutorType.Summon, CardId.ThePhantomKnightsofAncientCloak, OneCardComboSummon);
AddExecutor(ExecutorType.Summon, CardId.ThePhantomKnightsofSilentBoots, OneCardComboSummon);
AddExecutor(ExecutorType.SpSummon, CardId.SalamangreatAlmiraj, AlmirajSummon);
AddExecutor(ExecutorType.Activate, CardId.ThePhantomKnightsofShadeBrigandine, ShadeBrigandineSummonFirst);
AddExecutor(ExecutorType.SpSummon, CardId.KnightmarePhoenix, KnightmarePhoenixSummon);
AddExecutor(ExecutorType.Activate, CardId.KnightmarePhoenix, KnightmarePhoenixEffect);
AddExecutor(ExecutorType.SpSummon, CardId.GalateaTheOrcustAutomaton, GalateaSummonFirst);
AddExecutor(ExecutorType.Activate, CardId.JetSynchron, JetSynchronEffect);
AddExecutor(ExecutorType.Activate, CardId.OrcustKnightmare, OrcustKnightmareEffect);
AddExecutor(ExecutorType.Activate, CardId.OrcustHarpHorror, HarpHorrorEffect);
AddExecutor(ExecutorType.Activate, CardId.WorldLegacyWorldWand, WorldWandEffect);
AddExecutor(ExecutorType.Activate, CardId.ThePhantomKnightsofAncientCloak, AncientCloakEffect);
AddExecutor(ExecutorType.SpSummon, CardId.ThePhantomKnightsofRustyBardiche, RustyBardicheSummon);
AddExecutor(ExecutorType.Activate, CardId.ThePhantomKnightsofRustyBardiche, RustyBardicheEffect);
AddExecutor(ExecutorType.Activate, CardId.OrcustCymbalSkeleton, CymbalSkeletonEffect);
AddExecutor(ExecutorType.Activate, CardId.GalateaTheOrcustAutomaton, GalateaEffect);
AddExecutor(ExecutorType.SpSummon, CardId.SheorcustDingirsu, SheorcustDingirsuSummon);
AddExecutor(ExecutorType.Activate, CardId.SheorcustDingirsu, SheorcustDingirsuEffect);
AddExecutor(ExecutorType.SpSummon, CardId.ThePhantomKnightsofSilentBoots, SilentBootsSummon);
AddExecutor(ExecutorType.Activate, CardId.ThePhantomKnightsofShadeBrigandine, ShadeBrigandineSummonSecond);
AddExecutor(ExecutorType.SpSummon, CardId.BorreloadSavageDragon);
AddExecutor(ExecutorType.Activate, CardId.BorreloadSavageDragon, BorreloadSavageDragonEffect);
AddExecutor(ExecutorType.SpSummon, CardId.GalateaTheOrcustAutomaton, GalateaSummonSecond);
AddExecutor(ExecutorType.Activate, CardId.ThePhantomKnightsofSilentBoots, SilentBootsEffect);
AddExecutor(ExecutorType.Summon, CardId.GhostBelleHauntedMansion, TunerSummon);
AddExecutor(ExecutorType.Summon, CardId.AshBlossomJoyousSpring, TunerSummon);
AddExecutor(ExecutorType.Summon, CardId.OrcustCymbalSkeleton, OtherSummon);
AddExecutor(ExecutorType.Summon, CardId.OrcustHarpHorror, OtherSummon);
AddExecutor(ExecutorType.Summon, CardId.ThePhantomKnightsofAncientCloak, LinkMaterialSummon);
AddExecutor(ExecutorType.Summon, CardId.MaxxC, LinkMaterialSummon);
AddExecutor(ExecutorType.Summon, CardId.ThePhantomKnightsofSilentBoots, LinkMaterialSummon);
AddExecutor(ExecutorType.SpSummon, CardId.CrystronNeedlefiber, NeedlefiberSummonSecond);
AddExecutor(ExecutorType.SpSummon, CardId.BorrelswordDragon, BorrelswordDragonSummon);
AddExecutor(ExecutorType.Activate, CardId.BorrelswordDragon, BorrelswordDragonEffect);
AddExecutor(ExecutorType.SpellSet, CardId.PhantomKnightsFogBlade);
AddExecutor(ExecutorType.Activate, CardId.PhantomKnightsFogBlade, FogBladeEffect);
AddExecutor(ExecutorType.SpellSet, CardId.OrcustratedClimax);
AddExecutor(ExecutorType.Activate, CardId.OrcustratedBabel, BabelEffect);
AddExecutor(ExecutorType.Repos, MonsterRepos);
}
private bool NormalSummoned = false;
private bool SheorcustDingirsuSummoned = false;
private bool HarpHorrorUsed = false;
private bool CymbalSkeletonUsed = false;
private bool BorrelswordDragonUsed = false;
private ClientCard RustyBardicheTarget = null;
private int[] HandCosts = new[]
{
CardId.OrcustCymbalSkeleton,
CardId.OrcustKnightmare,
CardId.DestrudoTheLostDragonsFrisson,
CardId.WorldLegacyWorldWand,
CardId.OrcustHarpHorror,
CardId.ThePhantomKnightsofAncientCloak,
CardId.ThePhantomKnightsofSilentBoots,
CardId.JetSynchron,
CardId.TrickstarLightStage,
CardId.SkyStrikerMobilizeEngage,
CardId.Terraforming,
CardId.ReinforcementofTheArmy,
CardId.MaxxC,
CardId.GhostBelleHauntedMansion
};
public override bool OnSelectHand()
{
// go first
return true;
}
public override void OnNewTurn()
{
NormalSummoned = false;
SheorcustDingirsuSummoned = false;
HarpHorrorUsed = false;
CymbalSkeletonUsed = false;
BorrelswordDragonUsed = false;
RustyBardicheTarget = null;
}
public override void OnChainEnd()
{
RustyBardicheTarget = null;
}
public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{
YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId);
if (cardData != null)
{
if (cardData.Attack <= 1000)
return CardPosition.FaceUpDefence;
}
return 0;
}
public override int OnSelectPlace(int cardId, int player, CardLocation location, int available)
{
if (location == CardLocation.SpellZone)
{
if (cardId == CardId.KnightmarePhoenix || cardId == CardId.CrystronNeedlefiber)
{
ClientCard b = Bot.MonsterZone.GetFirstMatchingCard(card => card.Id == CardId.BorreloadSavageDragon);
int zone = (1 << (b?.Sequence ?? 0)) & available;
if (zone > 0)
return zone;
}
if ((available & Zones.z0) > 0)
return Zones.z0;
if ((available & Zones.z1) > 0)
return Zones.z1;
if ((available & Zones.z2) > 0)
return Zones.z2;
if ((available & Zones.z3) > 0)
return Zones.z3;
if ((available & Zones.z4) > 0)
return Zones.z4;
}
if (location == CardLocation.MonsterZone)
{
if (cardId == CardId.SheorcustDingirsu)
{
ClientCard l = Bot.MonsterZone.GetFirstMatchingCard(card => card.Id == CardId.ThePhantomKnightsofRustyBardiche);
int zones = (l?.GetLinkedZones() ?? 0) & available;
if ((zones & Zones.z4) > 0)
return Zones.z4;
if ((zones & Zones.z3) > 0)
return Zones.z3;
if ((zones & Zones.z2) > 0)
return Zones.z2;
if ((zones & Zones.z1) > 0)
return Zones.z1;
if ((zones & Zones.z0) > 0)
return Zones.z0;
}
if (cardId == CardId.GalateaTheOrcustAutomaton)
{
int zones = Bot.GetLinkedZones() & available;
if ((zones & Zones.z0) > 0)
return Zones.z0;
if ((zones & Zones.z2) > 0)
return Zones.z2;
if ((zones & Zones.z1) > 0)
return Zones.z1;
if ((zones & Zones.z3) > 0)
return Zones.z3;
if ((zones & Zones.z4) > 0)
return Zones.z4;
}
if (cardId == CardId.KnightmarePhoenix)
{
if ((Enemy.MonsterZone[5]?.HasLinkMarker(CardLinkMarker.Top) ?? false) && (available & Zones.z3) > 0)
return Zones.z3;
if ((Enemy.MonsterZone[6]?.HasLinkMarker(CardLinkMarker.Top) ?? false) && (available & Zones.z1) > 0)
return Zones.z1;
}
if ((available & Zones.z6) > 0)
return Zones.z6;
if ((available & Zones.z5) > 0)
return Zones.z5;
if ((available & Zones.z1) > 0)
return Zones.z1;
if ((available & Zones.z3) > 0)
return Zones.z3;
if ((available & Zones.z0) > 0)
return Zones.z0;
if ((available & Zones.z4) > 0)
return Zones.z4;
if ((available & Zones.z2) > 0)
return Zones.z2;
}
return 0;
}
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
{
if (!defender.IsMonsterHasPreventActivationEffectInBattle())
{
if (attacker.IsCode(CardId.TrickstarCandina) && Bot.HasInHand(CardId.TrickstarCarobein))
attacker.RealPower = attacker.RealPower + 1800;
if (attacker.IsCode(CardId.BorrelswordDragon) && !attacker.IsDisabled() && !BorrelswordDragonUsed)
{
attacker.RealPower = attacker.RealPower + defender.GetDefensePower() / 2;
defender.RealPower = defender.RealPower - defender.GetDefensePower() / 2;
}
}
return base.OnPreBattleBetween(attacker, defender);
}
private bool TerraformingEffect()
{
AI.SelectCard(CardId.TrickstarLightStage);
return true;
}
private bool ReinforcementofTheArmyEffect()
{
AI.SelectCard(CardId.ArmageddonKnight);
return true;
}
private bool FoolishBurialEffect()
{
AI.SelectCard(new[] {
CardId.DestrudoTheLostDragonsFrisson,
CardId.JetSynchron,
CardId.OrcustHarpHorror,
CardId.OrcustCymbalSkeleton
});
return true;
}
private bool LightStageEffect()
{
if (Card.Location == CardLocation.Hand || Card.IsFacedown())
{
ClientCard field = Bot.GetFieldSpellCard();
if ((field?.IsCode(CardId.OrcustratedBabel) ?? false) && Bot.GetMonsterCount() > 1)
return false;
if ((field?.IsCode(CardId.TrickstarLightStage) ?? false) && Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.TrickstarCandina) && Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.TrickstarCarobein))
return false;
AI.SelectYesNo(true);
if (Bot.HasInHandOrHasInMonstersZone(CardId.TrickstarCandina))
AI.SelectCard(CardId.TrickstarCarobein);
else
AI.SelectCard(CardId.TrickstarCandina);
return true;
}
ClientCard target = Enemy.SpellZone.GetFirstMatchingCard(card => card.IsFacedown());
AI.SelectCard(target);
return true;
}
private bool CarobeinSummon()
{
if (Bot.HasInMonstersZone(CardId.TrickstarCandina))
{
// TODO: beat mode
return Bot.HasInExtra(CardId.KnightmarePhoenix);
}
else
{
return !NormalSummoned && Bot.Hand.IsExistingMatchingCard(card => card.Level <= 4);
}
}
private bool EngageEffect()
{
bool needProtect = false;
if (Bot.HasInHand(CardId.ArmageddonKnight))
needProtect = true;
else if (Bot.HasInHandOrInGraveyard(CardId.DestrudoTheLostDragonsFrisson) && Bot.Hand.IsExistingMatchingCard(card => card.Level <= 4))
needProtect = true;
else if (Bot.HasInHand(CardId.TrickstarCandina))
needProtect = true;
if (needProtect)
AI.SelectCard(CardId.SkyStrikerMechaEagleBooster);
else
AI.SelectCard(CardId.SkyStrikerMechaHornetDrones);
AI.SelectYesNo(true);
return true;
}
private bool DronesEffectFirst()
{
return Bot.GetMonsterCount() == 0;
}
private bool DronesEffect()
{
return !Bot.HasInHand(CardId.ArmageddonKnight) && !Bot.HasInHand(CardId.TrickstarCandina);
}
private bool CandinaSummon()
{
NormalSummoned = true;
return true;
}
private bool CandinaEffect()
{
AI.SelectCard(CardId.TrickstarLightStage);
return true;
}
private bool ArmageddonKnightSummon()
{
NormalSummoned = true;
return true;
}
private bool ArmageddonKnightEffect()
{
AI.SelectCard(new[] {
CardId.DestrudoTheLostDragonsFrisson,
CardId.OrcustHarpHorror
});
return true;
}
private bool ScrapRecyclerSummon()
{
NormalSummoned = true;
return true;
}
private bool ScrapRecyclerEffect()
{
AI.SelectCard(new[] {
CardId.JetSynchron,
CardId.OrcustHarpHorror
});
return true;
}
private bool JetSynchronSummon()
{
if (Bot.GetMonsterCount() > 0)
{
NormalSummoned = true;
return true;
}
return false;
}
private bool JetSynchronEffect()
{
AI.SelectCard(HandCosts);
return true;
}
private bool AlmirajSummon()
{
if (Bot.GetMonsterCount() > 1)
return false;
ClientCard mat = Bot.GetMonsters().First();
if (mat.IsCode(new[] {
CardId.JetSynchron,
CardId.ThePhantomKnightsofAncientCloak,
CardId.ThePhantomKnightsofSilentBoots
}))
{
AI.SelectMaterials(mat);
return true;
}
return false;
}
private bool DestrudoSummon()
{
return Bot.GetMonsterCount() < 3 && Bot.HasInExtra(new[] { CardId.CrystronNeedlefiber, CardId.KnightmarePhoenix });
}
private bool NeedlefiberSummonFirst()
{
if (!Bot.HasInExtra(CardId.BorreloadSavageDragon))
return false;
if (!Bot.HasInHand(CardId.JetSynchron) && Bot.GetRemainingCount(CardId.JetSynchron, 1) == 0)
return false;
int[] matids = new[] {
CardId.DestrudoTheLostDragonsFrisson,
CardId.AshBlossomJoyousSpring,
CardId.GhostBelleHauntedMansion,
CardId.SkyStrikerMechaHornetDronesToken,
CardId.TrickstarCarobein,
CardId.SkyStrikerAceKagari,
CardId.ScrapRecycler,
CardId.ArmageddonKnight,
CardId.TrickstarCandina,
CardId.OrcustHarpHorror,
CardId.OrcustCymbalSkeleton,
CardId.ThePhantomKnightsofAncientCloak,
CardId.ThePhantomKnightsofSilentBoots
};
if (Bot.MonsterZone.GetMatchingCardsCount(card => card.IsCode(matids)) >= 2)
{
AI.SelectMaterials(matids);
return true;
}
return false;
}
private bool NeedlefiberSummonSecond()
{
IList<ClientCard> selected = new List<ClientCard>();
ClientCard tuner = Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(new[]
{
CardId.DestrudoTheLostDragonsFrisson,
CardId.AshBlossomJoyousSpring,
CardId.GhostBelleHauntedMansion,
CardId.JetSynchron
}));
if (tuner != null)
selected.Add(tuner);
int[] matids = new[] {
CardId.SkyStrikerMechaHornetDronesToken,
CardId.ThePhantomKnightsofShadeBrigandine,
CardId.SkyStrikerAceKagari,
CardId.ScrapRecycler,
CardId.ArmageddonKnight,
CardId.OrcustHarpHorror,
CardId.OrcustCymbalSkeleton,
CardId.ThePhantomKnightsofAncientCloak,
CardId.ThePhantomKnightsofSilentBoots
};
IList<ClientCard> mats = Bot.MonsterZone.GetMatchingCards(card => card.Attack <= 1700);
for (int i = 0; i < matids.Length && selected.Count < 2; i++)
{
ClientCard c = mats.GetFirstMatchingFaceupCard(card => card.IsCode(matids[i]));
if (c != null)
{
selected.Add(c);
if (selected.Count == 2 && Util.GetBotAvailZonesFromExtraDeck(selected) == 0)
selected.Remove(c);
}
}
if (selected.Count == 2)
{
AI.SelectMaterials(selected);
return true;
}
return false;
}
private bool NeedlefiberEffect()
{
AI.SelectCard(CardId.JetSynchron);
return true;
}
private bool ShootingRiserDragonEffect()
{
if (ActivateDescription == -1 || (ActivateDescription == Util.GetStringId(CardId.ShootingRiserDragon, 0)))
{
if (Bot.MonsterZone.IsExistingMatchingCard(card => card.Level == 3 && card.IsFaceup() && !card.IsTuner()) && Bot.GetRemainingCount(CardId.MaxxC, 3) > 0)
{
AI.SelectCard(CardId.MaxxC);
}
else if (Bot.MonsterZone.IsExistingMatchingCard(card => card.Level == 4 && card.IsFaceup() && !card.IsTuner()))
{
AI.SelectCard(new[] {
CardId.ThePhantomKnightsofAncientCloak,
CardId.ThePhantomKnightsofSilentBoots,
CardId.ScrapRecycler,
CardId.OrcustCymbalSkeleton,
CardId.AshBlossomJoyousSpring,
CardId.GhostBelleHauntedMansion
});
}
else if (Bot.MonsterZone.IsExistingMatchingCard(card => card.Level == 5 && card.IsFaceup() && !card.IsTuner()))
{
AI.SelectCard(new[] {
CardId.OrcustHarpHorror,
CardId.ArmageddonKnight,
CardId.TrickstarCandina
});
}
else
{
FoolishBurialEffect();
}
return true;
}
else
{
return Duel.LastChainPlayer != 0;
}
}
private bool KnightmarePhoenixSummon()
{
if (!KnightmareMermaidSummon())
return false;
if (!Bot.HasInExtra(CardId.KnightmareMermaid))
return false;
int[] firstMats = new[] {
CardId.JetSynchron,
CardId.CrystronNeedlefiber,
CardId.SkyStrikerMechaHornetDronesToken,
CardId.ThePhantomKnightsofShadeBrigandine,
CardId.ScrapRecycler,
CardId.SkyStrikerAceKagari,
CardId.ArmageddonKnight,
CardId.TrickstarCandina,
CardId.TrickstarCarobein
};
if (Bot.MonsterZone.GetMatchingCardsCount(card => card.IsCode(firstMats)) >= 2)
{
AI.SelectMaterials(firstMats);
return true;
}
int[] secondMats = new[] {
CardId.OrcustCymbalSkeleton,
CardId.OrcustHarpHorror,
CardId.DestrudoTheLostDragonsFrisson,
CardId.JetSynchron,
CardId.AshBlossomJoyousSpring,
CardId.GhostBelleHauntedMansion,
CardId.ThePhantomKnightsofSilentBoots,
CardId.ThePhantomKnightsofAncientCloak,
CardId.MaxxC,
CardId.SalamangreatAlmiraj
};
int[] mats = firstMats.Concat(secondMats).ToArray();
if (Bot.MonsterZone.GetMatchingCardsCount(card => card.IsCode(mats)) >= 2)
{
AI.SelectMaterials(mats);
return true;
}
return false;
}
private bool KnightmarePhoenixEffect()
{
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)));
if ((costcount > 1 && anytarget != null) || (Bot.GetHandCount() > 1 && target != null))
{
AI.SelectCard(HandCosts);
if (target == null)
target = anytarget;
AI.SelectNextCard(target);
return true;
}
return false;
}
private bool KnightmareMermaidSummon()
{
if (Bot.GetHandCount() == 0)
return false;
if (Bot.GetRemainingCount(CardId.OrcustKnightmare, 2) == 0)
return false;
AI.SelectPlace(Zones.ExtraMonsterZones);
return true;
}
private bool KnightmareMermaidEffect()
{
AI.SelectCard(HandCosts);
return true;
}
private bool GalateaSummonFirst()
{
// only summon with Mermaid and Orcust Knightmare
IList<ClientCard> mats = Bot.MonsterZone.GetMatchingCards(card => card.IsCode(CardId.KnightmareMermaid, CardId.OrcustKnightmare));
if (mats.Count >= 2)
{
AI.SelectMaterials(mats);
return true;
}
return false;
}
private bool OrcustKnightmareEffect()
{
if (!Bot.HasInGraveyard(CardId.OrcustHarpHorror))
{
AI.SelectCard(Util.GetBestBotMonster());
AI.SelectNextCard(CardId.OrcustHarpHorror);
return true;
}
else if (!Bot.HasInGraveyard(CardId.WorldLegacyWorldWand) && Bot.GetRemainingCount(CardId.WorldLegacyWorldWand, 1) > 0)
{
AI.SelectCard(CardId.GalateaTheOrcustAutomaton);
AI.SelectNextCard(CardId.WorldLegacyWorldWand);
return true;
}
else if (!Bot.HasInGraveyard(CardId.OrcustCymbalSkeleton) && Bot.GetRemainingCount(CardId.OrcustCymbalSkeleton, 1) > 0 && Bot.HasInGraveyard(CardId.SheorcustDingirsu) && !SheorcustDingirsuSummoned)
{
AI.SelectCard(CardId.GalateaTheOrcustAutomaton);
AI.SelectNextCard(CardId.OrcustCymbalSkeleton);
return true;
}
return false;
}
private bool HarpHorrorEffect()
{
HarpHorrorUsed = true;
AI.SelectCard(CardId.OrcustCymbalSkeleton);
return true;
}
private bool WorldWandEffect()
{
AI.SelectCard(CardId.OrcustCymbalSkeleton);
return true;
}
private bool RustyBardicheSummon()
{
//if (Bot.GetRemainingCount(CardId.ThePhantomKnightsofAncientCloak, 1) == 0 && Bot.GetRemainingCount(CardId.ThePhantomKnightsofSilentBoots, 1) == 0)
// return false;
//if (Bot.GetRemainingCount(CardId.ThePhantomKnightsofShadeBrigandine, 1) == 0 && Bot.GetRemainingCount(CardId.PhantomKnightsFogBlade, 2) == 0)
// return false;
IList<ClientCard> mats = Bot.MonsterZone.GetMatchingCards(card => card.IsCode(CardId.GalateaTheOrcustAutomaton));
ClientCard mat2 = Bot.MonsterZone.GetMatchingCards(card => card.IsCode(CardId.OrcustCymbalSkeleton)).FirstOrDefault();
if (mat2 != null)
mats.Add(mat2);
AI.SelectMaterials(mats);
AI.SelectPlace(Zones.ExtraMonsterZones);
return true;
}
private bool RustyBardicheEffect()
{
if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.ThePhantomKnightsofRustyBardiche, 0))
{
ClientCard target = GetFogBladeTarget();
if (target == null)
target = Util.GetBestEnemyCard(false, true);
if (target == null)
return false;
RustyBardicheTarget = target;
AI.SelectCard(target);
return true;
}
else
{
AI.SelectCard(CardId.ThePhantomKnightsofAncientCloak);
if (Bot.HasInMonstersZone(CardId.JetSynchron) && !Bot.MonsterZone.IsExistingMatchingCard(card => card.Level == 4))
AI.SelectNextCard(CardId.ThePhantomKnightsofShadeBrigandine);
else
AI.SelectNextCard(CardId.PhantomKnightsFogBlade);
return true;
}
}
private ClientCard GetFogBladeTarget()
{
return Enemy.MonsterZone.GetFirstMatchingCard(card => card.OwnTargets.Any(cont => cont.IsCode(CardId.PhantomKnightsFogBlade)));
}
private bool CymbalSkeletonEffect()
{
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)
{
AI.SelectCard(botTurnTargets);
CymbalSkeletonUsed = true;
return true;
}
else if (Duel.Player == 0 && Bot.HasInGraveyard(CardId.SheorcustDingirsu) && !SheorcustDingirsuSummoned)
{
AI.SelectCard(emenyTurnTargets);
SheorcustDingirsuSummoned = true;
CymbalSkeletonUsed = true;
return true;
}
if (Duel.Player == 1 && Bot.HasInGraveyard(CardId.SheorcustDingirsu) && !SheorcustDingirsuSummoned &&
(Util.GetProblematicEnemyCard() != null || Duel.Phase == DuelPhase.End))
{
AI.SelectCard(emenyTurnTargets);
CymbalSkeletonUsed = true;
SheorcustDingirsuSummoned = true;
return true;
}
return false;
}
private bool SheorcustDingirsuSummon()
{
SheorcustDingirsuSummoned = true;
return true;
}
private bool SheorcustDingirsuEffect()
{
if (ActivateDescription == 96)
{
// TODO: FogBlade lost target
AI.SelectCard(CardId.OrcustCymbalSkeleton);
return true;
}
ClientCard target;
target = GetFogBladeTarget();
if (target != null && target != RustyBardicheTarget)
{
AI.SelectOption(0);
AI.SelectCard(target);
return true;
}
target = Util.GetProblematicEnemyMonster();
if (target != null && target != RustyBardicheTarget)
{
AI.SelectOption(0);
AI.SelectCard(target);
return true;
}
target = Util.GetProblematicEnemySpell();
if (target != null && target != RustyBardicheTarget)
{
AI.SelectOption(0);
AI.SelectCard(target);
return true;
}
if (Bot.HasInBanished(CardId.OrcustCymbalSkeleton))
{
AI.SelectOption(1);
AI.SelectCard(CardId.OrcustCymbalSkeleton);
return true;
}
target = Enemy.MonsterZone.GetFirstMatchingCard(card => card != RustyBardicheTarget) ?? Enemy.SpellZone.GetFirstMatchingCard(card => card != RustyBardicheTarget);
if (target != null)
{
AI.SelectOption(0);
AI.SelectCard(target);
return true;
}
AI.SelectOption(1);
//AI.SelectCard(); any card
return true;
}
private bool AncientCloakEffect()
{
if (Bot.HasInMonstersZone(CardId.SalamangreatAlmiraj) && Bot.HasInExtra(CardId.KnightmarePhoenix))
AI.SelectCard(CardId.ThePhantomKnightsofShadeBrigandine);
else
AI.SelectCard(CardId.ThePhantomKnightsofSilentBoots);
return true;
}
private bool SilentBootsSummon()
{
return true;
}
private bool SilentBootsEffect()
{
if (Bot.HasInMonstersZone(CardId.SalamangreatAlmiraj) && Bot.HasInExtra(CardId.KnightmarePhoenix))
AI.SelectCard(CardId.ThePhantomKnightsofShadeBrigandine);
else
AI.SelectCard(CardId.PhantomKnightsFogBlade);
return true;
}
private bool ShadeBrigandineSummonSecond()
{
if (DefaultOnBecomeTarget())
return true;
return (Bot.HasInMonstersZone(CardId.SalamangreatAlmiraj) && Bot.HasInExtra(CardId.KnightmarePhoenix)) ||
(Bot.HasInMonstersZone(CardId.JetSynchron) && Bot.HasInMonstersZone(CardId.ThePhantomKnightsofSilentBoots));
}
private bool GalateaSummonSecond()
{
if (!Util.IsTurn1OrMain2())
return false;
if (Bot.HasInMonstersZone(CardId.GalateaTheOrcustAutomaton))
return false;
IList<ClientCard> selected = new List<ClientCard>();
if (!Bot.HasInGraveyard(CardId.SheorcustDingirsu))
{
ClientCard sheorcustDingirsu = Bot.MonsterZone.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.SheorcustDingirsu));
if (sheorcustDingirsu != null)
selected.Add(sheorcustDingirsu);
}
int[] matids = new[] {
CardId.OrcustKnightmare,
CardId.ThePhantomKnightsofSilentBoots,
CardId.ThePhantomKnightsofAncientCloak,
CardId.OrcustCymbalSkeleton,
CardId.OrcustHarpHorror,
CardId.ScrapRecycler,
CardId.CrystronNeedlefiber,
CardId.SkyStrikerAceKagari,
CardId.KnightmareMermaid,
CardId.ArmageddonKnight
};
IList<ClientCard> mats = Bot.MonsterZone.GetMatchingCards(card => card.Level > 0 && card.Level <= 7);
for (int i = 0; i < matids.Length && selected.Count < 2; i++)
{
ClientCard c = mats.GetFirstMatchingFaceupCard(card => card.IsCode(matids[i]));
if (c != null)
{
selected.Add(c);
if (selected.Count == 2 && Util.GetBotAvailZonesFromExtraDeck(selected) == 0)
selected.Remove(c);
}
}
if (selected.Count == 2)
{
AI.SelectMaterials(selected);
return true;
}
return false;
}
private bool GalateaEffect()
{
if (Duel.Player == 0)
{
AI.SelectCard(CardId.OrcustKnightmare);
AI.SelectNextCard(CardId.OrcustratedBabel);
}
if (Duel.Player == 1)
{
AI.SelectCard(CardId.OrcustKnightmare);
AI.SelectNextCard(CardId.OrcustratedClimax);
}
return true;
}
private bool BorrelswordDragonSummon()
{
if (Util.IsTurn1OrMain2())
return false;
List<ClientCard> mats = Bot.MonsterZone.GetMatchingCards(card => card.IsFaceup() && card.HasType(CardType.Effect) && card.Attack <= 2000).ToList();
mats.Sort(CardContainer.CompareCardAttack);
mats.Reverse();
int link = 0;
bool doubleused = false;
IList<ClientCard> selected = new List<ClientCard>();
foreach (ClientCard card in mats)
{
selected.Add(card);
if (!doubleused && card.LinkCount == 2)
{
doubleused = true;
link += 2;
}
else
link++;
if (link >= 4)
break;
}
if (link >= 4 && Util.GetBotAvailZonesFromExtraDeck(selected) > 0)
{
AI.SelectMaterials(selected);
return true;
}
return false;
}
private bool BorrelswordDragonEffect()
{
if (ActivateDescription == -1 || ActivateDescription == Util.GetStringId(CardId.BorrelswordDragon, 1))
{
BorrelswordDragonUsed = true;
return true;
}
else
{
if (Duel.Player == 0 && (Duel.Turn == 1 || Duel.Phase >= DuelPhase.Main2))
{
return false;
}
ClientCard target = Bot.MonsterZone.GetFirstMatchingCard(card => card.IsAttack() && !card.HasType(CardType.Link) && card.Attacked && !card.IsShouldNotBeTarget());
if (target != null)
{
AI.SelectCard(target);
return true;
}
if (!Bot.MonsterZone.IsExistingMatchingCard(card => card.IsAttack() && !card.HasType(CardType.Link)))
{
target = Enemy.MonsterZone.GetFirstMatchingCard(card => card.IsAttack() && !card.HasType(CardType.Link) && !card.IsShouldNotBeTarget());
if (target != null)
{
AI.SelectCard(target);
return true;
}
}
return false;
}
}
private bool BabelEffect()
{
if (Card.Location == CardLocation.Grave)
{
IList<ClientCard> costCards = Bot.Hand.GetMatchingCards(card => card.IsCode(HandCosts));
if (costCards.Count > 0)
{
AI.SelectCard(HandCosts);
return true;
}
return false;
}
return Bot.HasInMonstersZoneOrInGraveyard(new[] {
CardId.OrcustCymbalSkeleton,
CardId.OrcustHarpHorror,
CardId.OrcustKnightmare,
CardId.GalateaTheOrcustAutomaton,
CardId.LongirsuTheOrcustOrchestrator,
CardId.SheorcustDingirsu
});
}
private bool ShadeBrigandineSummonFirst()
{
return Bot.GetMonsterCount() < 2;
}
private bool OneCardComboSummon()
{
if (Bot.HasInExtra(CardId.SalamangreatAlmiraj) && Bot.HasInExtra(new[] { CardId.CrystronNeedlefiber, CardId.KnightmarePhoenix }) && Bot.GetMonsterCount() < 3)
{
NormalSummoned = true;
return true;
}
return false;
}
private bool LinkMaterialSummon()
{
if (Bot.HasInExtra(CardId.KnightmarePhoenix) && Bot.GetMonsterCount() > 0 && Bot.GetMonsterCount() < 3)
{
NormalSummoned = true;
return true;
}
return false;
}
private bool TunerSummon()
{
if (Bot.HasInExtra(new[] { CardId.CrystronNeedlefiber, CardId.KnightmarePhoenix }) && Bot.GetMonsterCount() > 0 && Bot.GetMonsterCount() < 3)
{
NormalSummoned = true;
return true;
}
return false;
}
private bool OtherSummon()
{
NormalSummoned = true;
return true;
}
private bool BorreloadSavageDragonEffect()
{
if (Duel.CurrentChain.Count == 0)
{
AI.SelectCard(new[] { CardId.KnightmarePhoenix, CardId.CrystronNeedlefiber });
return true;
}
else
{
return true;
}
}
private bool FogBladeEffect()
{
if (Card.Location == CardLocation.SpellZone)
{
return !Util.HasChainedTrap(0) && DefaultDisableMonster();
}
else if (Bot.HasInGraveyard(CardId.ThePhantomKnightsofRustyBardiche) || Bot.GetMonsterCount() < 2)
{
AI.SelectCard(CardId.ThePhantomKnightsofRustyBardiche);
return true;
}
return false;
}
private bool ClimaxEffect()
{
if (Card.Location == CardLocation.SpellZone)
{
return Duel.LastChainPlayer == 1;
}
// TODO
return false;
}
private bool EagleBoosterEffect()
{
if (Duel.LastChainPlayer != 1)
return false;
ClientCard target = Bot.GetMonstersInExtraZone().GetFirstMatchingCard(
card => Duel.CurrentChain.Contains(card) || card.IsCode(CardId.KnightmareMermaid));
if (target != null)
{
AI.SelectCard(target);
return true;
}
return false;
}
private bool MonsterRepos()
{
if (Card.IsFacedown())
return true;
return DefaultMonsterRepos();
}
}
}
......@@ -117,11 +117,13 @@ namespace WindBot.Game.AI.Decks
bool summon_used = false;
bool CardOfDemiseeff_used = false;
bool SeaStealthAttackeff_used = false;
int City_count = 0;
public override void OnNewTurn()
{
summon_used = false;
CardOfDemiseeff_used = false;
SeaStealthAttackeff_used = false;
City_count = 0;
base.OnNewTurn();
}
private bool PreventFeatherDustereff()
......@@ -133,7 +135,7 @@ namespace WindBot.Game.AI.Decks
{
if (Enemy.GetMonsterCount() == 0)
{
if (AI.Utils.GetTotalAttackingMonsterAttack(0) >= Enemy.LifePoints)
if (Util.GetTotalAttackingMonsterAttack(0) >= Enemy.LifePoints)
{
return true;
}
......@@ -145,7 +147,7 @@ namespace WindBot.Game.AI.Decks
{
if (DefaultOnBecomeTarget() && Card.Location==CardLocation.SpellZone)
{
AI.SelectCard(AI.Utils.GetBestEnemyCard(false,true));
AI.SelectCard(Util.GetBestEnemyCard(false,true));
return true;
}
if(Enemy.HasInSpellZone(CardId.EternalSoul))
......@@ -159,17 +161,17 @@ namespace WindBot.Game.AI.Decks
return UniqueFaceupSpell();
}
if (Bot.GetMonsterCount() > 0 && !Bot.HasInSpellZone(CardId.SeaStealthAttack) &&
AI.Utils.IsOneEnemyBetterThanValue(2000, false) && Duel.Phase==DuelPhase.BattleStart)
Util.IsOneEnemyBetterThanValue(2000, false) && Duel.Phase==DuelPhase.BattleStart)
{
AI.SelectCard(AI.Utils.GetBestEnemyMonster(true,true));
AI.SelectCard(Util.GetBestEnemyMonster(true,true));
return UniqueFaceupSpell();
}
if (AI.Utils.GetProblematicEnemyCard(9999,true)!=null)
if (Util.GetProblematicEnemyCard(9999,true)!=null)
{
if (AI.Utils.GetProblematicEnemyCard(9999, true).IsCode(CardId.ElShaddollWinda) &&
!AI.Utils.GetProblematicEnemyCard(9999, true).IsDisabled())
if (Util.GetProblematicEnemyCard(9999, true).IsCode(CardId.ElShaddollWinda) &&
!Util.GetProblematicEnemyCard(9999, true).IsDisabled())
return false;
AI.SelectCard(AI.Utils.GetProblematicEnemyCard(9999, true));
AI.SelectCard(Util.GetProblematicEnemyCard(9999, true));
return UniqueFaceupSpell();
}
return false;
......@@ -201,7 +203,7 @@ namespace WindBot.Game.AI.Decks
{
if (m.IsAttack()) count++;
}
if (AI.Utils.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints)
if (Util.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints)
return true;
return count >= 2;
}
......@@ -239,7 +241,7 @@ namespace WindBot.Game.AI.Decks
private bool SkillDraineff()
{
if (Duel.LastChainPlayer == 1 && AI.Utils.GetLastChainCard().Location == CardLocation.MonsterZone)
if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard().Location == CardLocation.MonsterZone)
return UniqueFaceupSpell();
return false;
}
......@@ -354,6 +356,9 @@ namespace WindBot.Game.AI.Decks
}
else
{
if (City_count > 10)
return false;
ClientCard target = null;
foreach(ClientCard s in Bot.GetSpells())
{
......@@ -369,12 +374,13 @@ namespace WindBot.Game.AI.Decks
{
if (target != null && !SeaStealthAttackeff_used)
{
if (AI.Utils.IsChainTarget(Card) || AI.Utils.IsChainTarget(target))
if (Util.IsChainTarget(Card) || Util.IsChainTarget(target))
return false;
}
break;
}
}
City_count++;
AI.SelectPlace(Zones.z1 | Zones.z3);
AI.SelectCard(CardId.PhantasmSprialBattle);
return true;
......@@ -421,11 +427,11 @@ namespace WindBot.Game.AI.Decks
private bool BorrelswordDragoneff()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.BorrelswordDragon, 0))
if (ActivateDescription == Util.GetStringId(CardId.BorrelswordDragon, 0))
{
if (AI.Utils.IsChainTarget(Card) && AI.Utils.GetBestEnemyMonster(true, true) != null)
if (Util.IsChainTarget(Card) && Util.GetBestEnemyMonster(true, true) != null)
{
AI.SelectCard(AI.Utils.GetBestEnemyMonster(true, true));
AI.SelectCard(Util.GetBestEnemyMonster(true, true));
return true;
}
if (Duel.Player == 1 && Bot.BattlingMonster == Card)
......@@ -461,9 +467,9 @@ namespace WindBot.Game.AI.Decks
else
AI.SelectPlace(Zones.z3);
if (Enemy.HasInMonstersZone(CardId.KnightmareGryphon, true)) return false;
if (AI.Utils.GetProblematicEnemyMonster() == null && Bot.ExtraDeck.Count < 5) return false;
if (Util.GetProblematicEnemyMonster() == null && Bot.ExtraDeck.Count < 5) return false;
if (Bot.GetMonstersInMainZone().Count >= 5) return false;
if (AI.Utils.IsTurn1OrMain2()) return false;
if (Util.IsTurn1OrMain2()) return false;
AI.SelectPosition(CardPosition.FaceUpAttack);
IList<ClientCard> material_list = new List<ClientCard>();
if(Bot.HasInExtra(CardId.BorreloadDragon))
......@@ -538,7 +544,7 @@ namespace WindBot.Game.AI.Decks
private bool Linkuriboheff()
{
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
return true;
}
private bool SeaStealthAttackeff()
......@@ -591,12 +597,12 @@ namespace WindBot.Game.AI.Decks
if (s.IsCode(CardId.PacifisThePhantasmCity))
target = s;
}
if (target != null && AI.Utils.IsChainTarget(target))
if (target != null && Util.IsChainTarget(target))
{
SeaStealthAttackeff_used = true;
return true;
}
target = AI.Utils.GetLastChainCard();
target = Util.GetLastChainCard();
if(target!=null)
{
if(target.IsCode(CardId.BrandishSkillAfterburner))
......
......@@ -183,7 +183,7 @@ namespace WindBot.Game.AI.Decks
private bool CardOfDemiseEffect()
{
if (AI.Utils.IsTurn1OrMain2() && !ShouldPendulum())
if (Util.IsTurn1OrMain2() && !ShouldPendulum())
{
CardOfDemiseUsed = true;
return true;
......@@ -215,8 +215,8 @@ namespace WindBot.Game.AI.Decks
{
if (Card.Location == CardLocation.Grave)
{
ClientCard l = AI.Utils.GetPZone(0, 0);
ClientCard r = AI.Utils.GetPZone(0, 1);
ClientCard l = Util.GetPZone(0, 0);
ClientCard r = Util.GetPZone(0, 1);
if (l == null && r == null)
AI.SelectCard(CardId.Scout);
}
......@@ -227,8 +227,8 @@ namespace WindBot.Game.AI.Decks
{
if (Card.Location != CardLocation.Hand)
return false;
ClientCard l = AI.Utils.GetPZone(0, 0);
ClientCard r = AI.Utils.GetPZone(0, 1);
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)
......@@ -252,8 +252,8 @@ namespace WindBot.Game.AI.Decks
{
count++;
}
ClientCard l = AI.Utils.GetPZone(0, 0);
ClientCard r = AI.Utils.GetPZone(0, 1);
ClientCard l = Util.GetPZone(0, 0);
ClientCard r = Util.GetPZone(0, 1);
if (l == null && r == null)
{
if (CardOfDemiseUsed)
......@@ -316,7 +316,7 @@ namespace WindBot.Game.AI.Decks
{
if (Card.Location == CardLocation.Hand)
return false;
ClientCard target = AI.Utils.GetBestEnemyCard();
ClientCard target = Util.GetBestEnemyCard();
if (target != null)
{
AI.SelectCard(target);
......@@ -329,7 +329,7 @@ namespace WindBot.Game.AI.Decks
{
if (Card.Location == CardLocation.Hand)
return false;
ClientCard target = AI.Utils.GetBestEnemyMonster();
ClientCard target = Util.GetBestEnemyMonster();
if (target != null)
{
AI.SelectCard(target);
......@@ -342,7 +342,7 @@ namespace WindBot.Game.AI.Decks
{
if (Card.Location == CardLocation.Hand)
return false;
ClientCard target = AI.Utils.GetBestEnemySpell();
ClientCard target = Util.GetBestEnemySpell();
if (target != null)
{
AI.SelectCard(target);
......@@ -353,8 +353,8 @@ namespace WindBot.Game.AI.Decks
private bool ShouldPendulum()
{
ClientCard l = AI.Utils.GetPZone(0, 0);
ClientCard r = AI.Utils.GetPZone(0, 1);
ClientCard l = Util.GetPZone(0, 0);
ClientCard r = Util.GetPZone(0, 1);
if (l != null && r != null && l.LScale != r.RScale)
{
int count = 0;
......
using YGOSharp.OCGWrapper.Enums;
using System;
using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic;
using WindBot;
using WindBot.Game;
......@@ -61,7 +62,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.UnexpectedDai, UnexpectedDaiEffect);
AddExecutor(ExecutorType.Summon, CardId.RescueRabbit);
AddExecutor(ExecutorType.Summon, CardId.RescueRabbit, RescueRabbitSummon);
AddExecutor(ExecutorType.Activate, CardId.RescueRabbit, RescueRabbitEffect);
AddExecutor(ExecutorType.Activate, CardId.PotOfDesires, DefaultPotOfDesires);
......@@ -173,7 +174,7 @@ namespace WindBot.Game.AI.Decks
break;
}
return AI.Utils.CheckSelectCount(result, cards, min, max);
return Util.CheckSelectCount(result, cards, min, max);
}
private bool UnexpectedDaiEffect()
......@@ -184,7 +185,7 @@ namespace WindBot.Game.AI.Decks
CardId.PhantomGryphon,
CardId.MegalosmasherX
);
else if (AI.Utils.IsTurn1OrMain2())
else if (Util.IsTurn1OrMain2())
{
if (Bot.HasInHand(CardId.MysteryShellDragon))
AI.SelectCard(CardId.MysteryShellDragon);
......@@ -207,9 +208,16 @@ namespace WindBot.Game.AI.Decks
return true;
}
private bool RescueRabbitSummon()
{
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);
}
private bool RescueRabbitEffect()
{
if (AI.Utils.IsTurn1OrMain2())
if (Util.IsTurn1OrMain2())
{
AI.SelectCard(
CardId.MegalosmasherX,
......@@ -255,7 +263,7 @@ namespace WindBot.Game.AI.Decks
}
private bool NormalSummon()
{
return true;
return Card.Id != CardId.RescueRabbit;
}
private bool GagagaCowboySummon()
......@@ -270,15 +278,15 @@ namespace WindBot.Game.AI.Decks
private bool IgnisterProminenceTheBlastingDracoslayerSummon()
{
return AI.Utils.GetProblematicEnemyCard() != null;
return Util.GetProblematicEnemyCard() != null;
}
private bool IgnisterProminenceTheBlastingDracoslayerEffect()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.IgnisterProminenceTheBlastingDracoslayer, 1))
if (ActivateDescription == Util.GetStringId(CardId.IgnisterProminenceTheBlastingDracoslayer, 1))
return true;
ClientCard target1 = null;
ClientCard target2 = AI.Utils.GetProblematicEnemyCard();
ClientCard target2 = Util.GetProblematicEnemyCard();
List<ClientCard> spells = Enemy.GetSpells();
foreach (ClientCard spell in spells)
{
......@@ -325,7 +333,7 @@ namespace WindBot.Game.AI.Decks
private bool Number37HopeWovenDragonSpiderSharkSummon()
{
return AI.Utils.IsAllEnemyBetterThanValue(1700, false) && !AI.Utils.IsOneEnemyBetterThanValue(3600, true);
return Util.IsAllEnemyBetterThanValue(1700, false) && !Util.IsOneEnemyBetterThanValue(3600, true);
}
private bool LightningChidoriSummon()
......@@ -345,12 +353,12 @@ namespace WindBot.Game.AI.Decks
}
}
return AI.Utils.GetProblematicEnemyCard() != null;
return Util.GetProblematicEnemyCard() != null;
}
private bool LightningChidoriEffect()
{
ClientCard problematicCard = AI.Utils.GetProblematicEnemyCard();
ClientCard problematicCard = Util.GetProblematicEnemyCard();
AI.SelectCard(0);
AI.SelectNextCard(problematicCard);
return true;
......@@ -358,12 +366,12 @@ namespace WindBot.Game.AI.Decks
private bool EvolzarLaggiaSummon()
{
return (AI.Utils.IsAllEnemyBetterThanValue(2000, false) && !AI.Utils.IsOneEnemyBetterThanValue(2400, true)) || AI.Utils.IsTurn1OrMain2();
return (Util.IsAllEnemyBetterThanValue(2000, false) && !Util.IsOneEnemyBetterThanValue(2400, true)) || Util.IsTurn1OrMain2();
}
private bool EvilswarmNightmareSummon()
{
if (AI.Utils.IsTurn1OrMain2())
if (Util.IsTurn1OrMain2())
{
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
......@@ -373,7 +381,7 @@ namespace WindBot.Game.AI.Decks
private bool TraptrixRafflesiaSummon()
{
if (AI.Utils.IsTurn1OrMain2() && (Bot.GetRemainingCount(CardId.BottomlessTrapHole, 1) + Bot.GetRemainingCount(CardId.TraptrixTrapHoleNightmare, 1)) > 0)
if (Util.IsTurn1OrMain2() && (Bot.GetRemainingCount(CardId.BottomlessTrapHole, 1) + Bot.GetRemainingCount(CardId.TraptrixTrapHoleNightmare, 1)) > 0)
{
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
......@@ -384,14 +392,14 @@ namespace WindBot.Game.AI.Decks
private bool Number59CrookedCookSummon()
{
return ((Bot.GetMonsterCount() + Bot.GetSpellCount() - 2) <= 1) &&
((AI.Utils.IsOneEnemyBetter() && !AI.Utils.IsOneEnemyBetterThanValue(2300, true)) || AI.Utils.IsTurn1OrMain2());
((Util.IsOneEnemyBetter() && !Util.IsOneEnemyBetterThanValue(2300, true)) || Util.IsTurn1OrMain2());
}
private bool Number59CrookedCookEffect()
{
if (Duel.Player == 0)
{
if (AI.Utils.IsChainTarget(Card))
if (Util.IsChainTarget(Card))
return true;
}
else
......@@ -414,7 +422,7 @@ namespace WindBot.Game.AI.Decks
private bool StarliegePaladynamoEffect()
{
ClientCard result = AI.Utils.GetOneEnemyBetterThanValue(2000, true);
ClientCard result = Util.GetOneEnemyBetterThanValue(2000, true);
if (result != null)
{
AI.SelectCard(0);
......
......@@ -120,13 +120,13 @@ namespace WindBot.Game.AI.Decks
public override IList<ClientCard> OnSelectXyzMaterial(IList<ClientCard> cards, int min, int max)
{
IList<ClientCard> result = AI.Utils.SelectPreferredCards(new[] {
IList<ClientCard> result = Util.SelectPreferredCards(new[] {
CardId.MistArchfiend,
CardId.PanzerDragon,
CardId.SolarWindJammer,
CardId.StarDrawing
}, cards, min, max);
return AI.Utils.CheckSelectCount(result, cards, min, max);
return Util.CheckSelectCount(result, cards, min, max);
}
private bool NormalSummon()
......@@ -181,6 +181,8 @@ namespace WindBot.Game.AI.Decks
{
if (HaveOtherLV5OnField())
return true;
if (Util.GetBotAvailZonesFromExtraDeck() == 0)
return false;
int lv5Count = 0;
foreach (ClientCard card in Bot.Hand)
{
......@@ -216,10 +218,10 @@ namespace WindBot.Game.AI.Decks
return false;
if (Bot.HasInHand(new[]
{
CardId.MistArchfiend,
CardId.WindUpSoldier,
CardId.StarDrawing,
CardId.ChronomalyGoldenJet
CardId.ChronomalyGoldenJet,
CardId.MistArchfiend
}))
{
NormalSummoned = false;
......@@ -236,7 +238,7 @@ namespace WindBot.Game.AI.Decks
private bool CyberDragonNovaEffect()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.CyberDragonNova, 0))
if (ActivateDescription == Util.GetStringId(CardId.CyberDragonNova, 0))
{
return true;
}
......@@ -282,12 +284,12 @@ namespace WindBot.Game.AI.Decks
private bool Number61VolcasaurusSummon()
{
return AI.Utils.IsOneEnemyBetterThanValue(2000, false);
return Util.IsOneEnemyBetterThanValue(2000, false);
}
private bool Number61VolcasaurusEffect()
{
ClientCard target = AI.Utils.GetProblematicEnemyMonster(2000);
ClientCard target = Util.GetProblematicEnemyMonster(2000);
if (target != null)
{
AI.SelectCard(CardId.CyberDragon);
......@@ -300,9 +302,9 @@ namespace WindBot.Game.AI.Decks
private bool TirasKeeperOfGenesisEffect()
{
ClientCard target = AI.Utils.GetProblematicEnemyCard();
ClientCard target = Util.GetProblematicEnemyCard();
if (target == null)
target = AI.Utils.GetBestEnemyCard();
target = Util.GetBestEnemyCard();
if (target != null)
{
AI.SelectCard(target);
......@@ -357,7 +359,7 @@ namespace WindBot.Game.AI.Decks
private bool PanzerDragonEffect()
{
ClientCard target = AI.Utils.GetBestEnemyCard();
ClientCard target = Util.GetBestEnemyCard();
if (target != null)
{
AI.SelectCard(target);
......@@ -384,9 +386,10 @@ namespace WindBot.Game.AI.Decks
{
if (monster.HasType(CardType.Monster) &&
!monster.HasType(CardType.Xyz) &&
Util.GetBotAvailZonesFromExtraDeck(monster) > 0 &&
(monster.Level == 5
|| monster.IsCode(CardId.StarDrawing)
|| (monster.IsCode(CardId.WindUpSoldier)) && !monster.Equals(Card)))
|| monster.IsCode(CardId.WindUpSoldier) && !monster.Equals(Card)))
return true;
}
return false;
......
......@@ -189,7 +189,7 @@ namespace WindBot.Game.AI.Decks
private bool MindControlEffect()
{
ClientCard target = AI.Utils.GetBestEnemyMonster();
ClientCard target = Util.GetBestEnemyMonster();
if (target != null)
{
AI.SelectCard(target);
......@@ -461,8 +461,8 @@ namespace WindBot.Game.AI.Decks
private bool LinkSummon()
{
return (AI.Utils.IsTurn1OrMain2() || AI.Utils.IsOneEnemyBetter())
&& AI.Utils.GetBestAttack(Bot) < Card.Attack;
return (Util.IsTurn1OrMain2() || Util.IsOneEnemyBetter())
&& Util.GetBestAttack(Bot) < Card.Attack;
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using YGOSharp.OCGWrapper.Enums;
namespace WindBot.Game.AI.Decks
{
[Deck("Salamangreat", "AI_Salamangreat")]
class SalamangreatExecutor : DefaultExecutor
{
bool foxyPopEnemySpell = false;
bool wasGazelleSummonedThisTurn = false;
bool wasFieldspellUsedThisTurn = false;
bool wasWolfSummonedUsingItself = false;
int sunlightPosition = 0;
bool wasVeilynxSummonedThisTurn = false;
bool falcoHitGY = false;
List<int> CombosInHand;
List<int> Impermanence_list = new List<int>();
public class CardId
{
public const int JackJaguar = 56003780;
public const int EffectVeiler = 97268402;
public const int LadyDebug = 16188701;
public const int Foxy = 94620082;
public const int Gazelle = 26889158;
public const int Fowl = 89662401;
public const int Falco = 20618081;
public const int Spinny = 52277807;
public const int MaxxC = 23434538;
public const int AshBlossom = 14558127;
public const int FusionOfFire = 25800447;
public const int Circle = 52155219;
public const int HarpieFeatherDuster = 18144507;
public const int FoolishBurial = 81439174;
public const int Sanctuary = 1295111;
public const int CalledByTheGrave = 24224830;
public const int SalamangreatRage = 14934922;
public const int SalamangreatRoar = 51339637;
public const int Impermanence = 10045474;
public const int SolemnJudgment = 41420027;
public const int SolemnStrike = 40605147;
public const int SalamangreatVioletChimera = 37261776;
public const int ExcitionKnight = 46772449;
public const int MirageStallio = 87327776;
public const int SunlightWolf = 87871125;
public const int Borrelload = 31833038;
public const int HeatLeo = 41463181;
public const int Veilynx = 14812471;
public const int Charmer = 48815792;
public const int KnightmarePheonix = 2857636;
public const int Borrelsword = 85289965;
public const int GO_SR = 59438930;
public const int DarkHole = 53129443;
public const int NaturalBeast = 33198837;
public const int SwordsmanLV7 = 37267041;
public const int RoyalDecreel = 51452091;
public const int Anti_Spell = 58921041;
public const int Hayate = 8491308;
public const int Raye = 26077387;
public const int Drones_Token = 52340445;
public const int Iblee = 10158145;
public const int ImperialOrder = 61740673;
public const int TornadoDragon = 6983839;
}
List<int> Combo_cards = new List<int>()
{
CardId.Spinny,
CardId.JackJaguar,
CardId.Fowl,
CardId.Foxy,
CardId.Falco,
CardId.Circle,
CardId.Gazelle,
CardId.FoolishBurial
};
List<int> normal_counter = new List<int>
{
53262004, 98338152, 32617464, 45041488, CardId.SolemnStrike,
61257789, 23440231, 27354732, 12408276, 82419869, CardId.Impermanence,
49680980, 18621798, 38814750, 17266660, 94689635,CardId.AshBlossom,
74762582, 75286651, 4810828, 44665365, 21123811, _CardId.CrystalWingSynchroDragon,
82044279, 82044280, 79606837, 10443957, 1621413,
90809975, 8165596, 9753964, 53347303, 88307361, _CardId.GamecieltheSeaTurtleKaiju,
5818294, 2948263, 6150044, 26268488, 51447164, _CardId.JizukirutheStarDestroyingKaiju,
97268402
};
List<int> should_not_negate = new List<int>
{
81275020, 28985331
};
List<int> salamangreat_links = new List<int>
{
CardId.HeatLeo,
CardId.SunlightWolf,
CardId.Veilynx
};
List<int> JackJaguarTargets = new List<int>
{
CardId.SunlightWolf,
CardId.MirageStallio,
CardId.HeatLeo
};
List<int> salamangreat_combopieces = new List<int>
{
CardId.Gazelle,
CardId.Spinny,
CardId.JackJaguar,
CardId.Foxy,
CardId.Circle,
CardId.Falco
};
List<int> WolfMaterials = new List<int>
{
CardId.Veilynx,
CardId.JackJaguar,
CardId.Falco,
CardId.Foxy,
CardId.MirageStallio,
CardId.Gazelle
};
List<int> salamangreat_spellTrap = new List<int>
{
CardId.SalamangreatRoar,
CardId.SalamangreatRage,
CardId.Circle,
CardId.Sanctuary
};
private bool falcoUsedReturnST;
private bool wasStallioActivated;
private bool wasWolfActivatedThisTurn;
bool JackJaguarActivatedThisTurn = false;
bool FoxyActivatedThisTurn = false;
public SalamangreatExecutor(GameAI ai, Duel duel) : base(ai, duel)
{
AddExecutor(ExecutorType.Activate, CardId.HarpieFeatherDuster);
AddExecutor(ExecutorType.Activate, CardId.MaxxC, G_activate);
AddExecutor(ExecutorType.Activate, CardId.CalledByTheGrave, Called_activate);
AddExecutor(ExecutorType.Activate, CardId.AshBlossom, Hand_act_eff);
AddExecutor(ExecutorType.Activate, CardId.EffectVeiler, DefaultBreakthroughSkill);
AddExecutor(ExecutorType.Activate, CardId.Impermanence, Impermanence_activate);
AddExecutor(ExecutorType.Activate, CardId.SalamangreatRoar, SolemnJudgment_activate);
AddExecutor(ExecutorType.Activate, CardId.SolemnStrike, SolemnStrike_activate);
AddExecutor(ExecutorType.Activate, CardId.SolemnJudgment, SolemnJudgment_activate);
AddExecutor(ExecutorType.Activate, CardId.Sanctuary, Sanctuary_activate);
AddExecutor(ExecutorType.Activate, CardId.Charmer);
AddExecutor(ExecutorType.Activate, CardId.SunlightWolf, Wolf_activate);
AddExecutor(ExecutorType.Activate, CardId.LadyDebug, Fadydebug_activate);
AddExecutor(ExecutorType.Activate, CardId.Foxy, Foxy_activate);
AddExecutor(ExecutorType.Activate, CardId.Falco, Falco_activate);
AddExecutor(ExecutorType.Activate, CardId.Circle, Circle_activate);
AddExecutor(ExecutorType.Activate, CardId.Borrelsword, Borrelsword_eff);
AddExecutor(ExecutorType.Activate, CardId.Gazelle, Gazelle_activate);
AddExecutor(ExecutorType.Activate, CardId.Spinny, Spinny_activate);
AddExecutor(ExecutorType.Activate, CardId.MirageStallio, Stallio_activate);
AddExecutor(ExecutorType.Activate, CardId.Veilynx);
AddExecutor(ExecutorType.Activate, CardId.JackJaguar, JackJaguar_activate);
AddExecutor(ExecutorType.Summon, CardId.LadyDebug);
AddExecutor(ExecutorType.Summon, CardId.Foxy);
AddExecutor(ExecutorType.Summon, CardId.Spinny);
AddExecutor(ExecutorType.Summon, CardId.JackJaguar);
AddExecutor(ExecutorType.Summon, CardId.Gazelle);
AddExecutor(ExecutorType.Summon, CardId.Fowl);
AddExecutor(ExecutorType.Activate, CardId.Spinny, Spinny_activate);
AddExecutor(ExecutorType.Activate, CardId.HeatLeo, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.SpSummon, CardId.Borrelsword, Borrelsword_ss);
AddExecutor(ExecutorType.SpSummon, CardId.Veilynx, Veilynx_summon);
AddExecutor(ExecutorType.SpSummon, CardId.MirageStallio, Stallio_summon);
AddExecutor(ExecutorType.Activate, CardId.MirageStallio, Stallio_activate);
AddExecutor(ExecutorType.SpSummon, CardId.Charmer, Charmer_summon);
AddExecutor(ExecutorType.SpSummon, CardId.SunlightWolf, SunlightWolf_summon);
AddExecutor(ExecutorType.SpSummon, CardId.HeatLeo, HeatLeo_summon);
AddExecutor(ExecutorType.SpSummon, CardId.TornadoDragon);
AddExecutor(ExecutorType.Activate, CardId.TornadoDragon, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, CardId.SalamangreatRage, Rage_activate);
AddExecutor(ExecutorType.Activate, CardId.Fowl, Fowl_activate);
AddExecutor(ExecutorType.Activate, CardId.SunlightWolf, Wolf_activate);
AddExecutor(ExecutorType.Activate, CardId.Gazelle, Gazelle_activate);
AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurial_activate);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.SpellSet, SpellSet);
}
public int get_Wolf_linkzone()
{
ClientCard WolfInExtra = Bot.GetMonstersInExtraZone().Where(x => x.Id == CardId.SunlightWolf).ToList().FirstOrDefault(x => x.Id == CardId.SunlightWolf);
if (WolfInExtra != null)
{
int zone = WolfInExtra.Position;
if (zone == 5) return 1;
if (zone == 6) return 3;
}
return -1;
}
private bool Charmer_summon()
{
if (Duel.Phase != DuelPhase.Main1) return false;
if (Duel.Turn == 1) return false;
if (Enemy.Graveyard.Where(x => x.Attribute == (int)CardAttribute.Fire).Count() > 0
&& (Bot.GetMonstersInExtraZone().Count == 0
|| Bot.GetMonstersInExtraZone().Where(x =>
(x.Id == CardId.Veilynx
|| x.Id == CardId.MirageStallio)
&& x.Owner == 0).Count() == 1))
{
List<ClientCard> material_list = new List<ClientCard>();
List<ClientCard> bot_monster = Bot.GetMonsters();
bot_monster.Sort(CardContainer.CompareCardAttack);
//bot_monster.Reverse();
int link_count = 0;
foreach (ClientCard card in bot_monster)
{
if (card.IsFacedown()) continue;
if (!material_list.Contains(card) && card.LinkCount < 2)
{
material_list.Add(card);
link_count += (card.HasType(CardType.Link)) ? card.LinkCount : 1;
if (link_count >= 4) break;
}
}
if (link_count >= 3)
{
AI.SelectCard(CardId.Veilynx);
return true;
}
}
return false;
}
private bool HeatLeo_summon()
{
if (Duel.Turn == 1) return false;
if (Duel.Phase != DuelPhase.Main1) return false;
if (wasWolfSummonedUsingItself && Bot.GetMonsters().Count() <= 3) return false;
ClientCard self_best = Util.GetBestBotMonster(true);
int self_power = (self_best != null) ? self_best.Attack : 0;
ClientCard enemy_best = Util.GetBestEnemyMonster(true);
int enemy_power = (enemy_best != null) ? enemy_best.GetDefensePower() : 0;
if (enemy_power < self_power) return false;
if (Enemy.GetSpells().Where(x => x.IsFloodgate()).Count() > 0)
{
List<ClientCard> material_list = new List<ClientCard>();
List<ClientCard> bot_monster = Bot.GetMonsters();
bot_monster.Sort(CardContainer.CompareCardAttack);
//bot_monster.Reverse();
int link_count = 0;
foreach (ClientCard card in bot_monster)
{
if (card.IsFacedown()) continue;
if (!material_list.Contains(card) && card.LinkCount < 2)
{
material_list.Add(card);
link_count += (card.HasType(CardType.Link)) ? card.LinkCount : 1;
if (link_count >= 3) break;
}
}
if (link_count >= 3)
{
AI.SelectMaterials(material_list);
return true;
}
}
return false;
}
private bool Stallio_summon()
{
if (!wasStallioActivated)
{
AI.SelectMaterials(CardId.Spinny);
return true;
}
return false;
}
private bool SunlightWolf_summon()
{
if (Bot.HasInMonstersZone(CardId.SunlightWolf))
{
if (wasWolfSummonedUsingItself)
{
return false;
}
if (!wasFieldspellUsedThisTurn && Bot.HasInGraveyard(salamangreat_spellTrap) || Bot.HasInHandOrInSpellZone(CardId.SalamangreatRage))
{
AI.SelectOption(1);
AI.SelectMaterials(new List<int>() {
CardId.SunlightWolf,
CardId.Veilynx,
CardId.JackJaguar,
CardId.Gazelle
});
wasWolfSummonedUsingItself = true;
AI.SelectPlace(sunlightPosition);
return true;
}
else
{
return false;
}
}
wasWolfSummonedUsingItself = false;
if (Bot.HasInMonstersZone(CardId.Veilynx))
{
if (Bot.HasInMonstersZone(CardId.MirageStallio)
&& Bot.HasInMonstersZone(CardId.Veilynx)
&& Bot.HasInMonstersZone(CardId.Gazelle))
{
AI.SelectCard(CardId.Veilynx);
AI.SelectNextCard(CardId.MirageStallio);
}
else
{
AI.SelectCard(WolfMaterials);
AI.SelectNextCard(WolfMaterials);
}
sunlightPosition = SelectSetPlace(new List<int>() { CardId.Veilynx }, true);
AI.SelectPlace(sunlightPosition);
}
return true;
}
private bool Wolf_activate()
{
wasWolfActivatedThisTurn = true;
AI.SelectCard(new List<int>() {
CardId.Gazelle,
CardId.SalamangreatRoar,
CardId.SalamangreatRage,
CardId.Foxy,
CardId.AshBlossom,
CardId.Fowl,
CardId.SunlightWolf,
CardId.Veilynx,
CardId.HeatLeo,
CardId.Spinny
});
return true;
}
private bool Stallio_activate()
{
if (Card.Location == CardLocation.MonsterZone)
{
wasStallioActivated = true;
if (!wasGazelleSummonedThisTurn)
{
AI.SelectCard(CardId.Gazelle, CardId.Spinny);
AI.SelectNextCard(CardId.Gazelle);
return true;
}
if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.JackJaguar))
{
AI.SelectCard(CardId.Gazelle);
AI.SelectNextCard(CardId.JackJaguar);
return true;
}
if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.Falco) && FalcoToGY(true))
{
AI.SelectCard(CardId.Gazelle);
AI.SelectNextCard(CardId.Falco);
return true;
}
AI.SelectCard(CardId.Gazelle);
return true;
}
else
{
if (Util.GetBestEnemyMonster(canBeTarget: true) != null)
{
AI.SelectCard(Util.GetBestEnemyMonster(canBeTarget: true));
return true;
}
}
return false;
}
private bool Veilynx_summon()
{
if (wasStallioActivated && wasWolfActivatedThisTurn)
{
return false;
}
if ((wasStallioActivated
&& !wasWolfActivatedThisTurn)
||
(!wasStallioActivated
&& wasWolfActivatedThisTurn))
{
return false;
}
if (Bot.HasInHand(CardId.Gazelle)
&& !wasGazelleSummonedThisTurn
&& !Bot.HasInGraveyard(CardId.JackJaguar)
&& Bot.GetMonstersInMainZone().Where(x => x.Level == 3).Count() <= 1
|| (Bot.HasInMonstersZone(CardId.SunlightWolf)
&& !Bot.HasInSpellZoneOrInGraveyard(CardId.Sanctuary)
&& !wasWolfSummonedUsingItself))
{
var monsters = Bot.GetMonstersInMainZone();
if (Bot.HasInMonstersZone(CardId.Veilynx) && monsters.Count == 2)
{
return false;
}
monsters.Sort(CardContainer.CompareCardLevel);
monsters.Reverse();
AI.SelectMaterials(monsters);
return true;
}
if (!Bot.HasInMonstersZone(CardId.Veilynx)
&&
Bot.GetMonstersInMainZone().Count >= 3
&&
(Bot.GetMonstersInExtraZone().Where(x => x.Owner == 0).Count() == 0))
{
var monsters = Bot.GetMonstersInMainZone();
monsters.Sort(CardContainer.CompareCardLevel);
monsters.Reverse();
AI.SelectMaterials(monsters);
return true;
}
if (CombosInHand.Where(x => x != CardId.Foxy).Where(x => x != CardId.Spinny).Count() == 0
&& Bot.HasInHand(CardId.Spinny))
{
if (Bot.HasInMonstersZone(CardId.Gazelle) && Bot.HasInMonstersZone(CardId.SunlightWolf))
{
AI.SelectMaterials(CardId.Gazelle);
return true;
}
if (!wasVeilynxSummonedThisTurn)
{
wasVeilynxSummonedThisTurn = true;
return true;
}
}
return false;
}
private bool JackJaguar_activate()
{
if (Card.Location == CardLocation.Grave)
{
if (Bot.HasInGraveyard(JackJaguarTargets)
|| Bot.Graveyard.Where(x => x.Id == CardId.Veilynx).Count() >= 2
|| (!Bot.HasInGraveyard(salamangreat_spellTrap)
&& Bot.HasInMonstersZone(CardId.SunlightWolf)
&& Bot.HasInGraveyard(CardId.Gazelle)
&& !Bot.HasInHand(CardId.Gazelle)))
{
JackJaguarActivatedThisTurn = true;
if (Bot.Graveyard.Where(x => x.Id == CardId.Veilynx).Count() >= 2
&& Bot.Graveyard.Select(x => x.Id).Intersect(JackJaguarTargets).Count() == 0)
{
AI.SelectCard(CardId.Veilynx);
return true;
}
AI.SelectCard(JackJaguarTargets);
return true;
}
}
return false;
}
private bool Fowl_activate()
{
if (Card.Location == CardLocation.Hand)
{
return Bot.HasInMonstersZone(CardId.JackJaguar) && JackJaguarActivatedThisTurn;
}
return false;
}
private bool Spinny_activate()
{
if (Card.Location == CardLocation.Hand)
{
if (Bot.HasInGraveyard(CardId.Foxy) && !FoxyActivatedThisTurn) return false;
if (CombosInHand.Where(x => x != CardId.Foxy).Where(x => x != CardId.Spinny).Count() == 0)
{
return false;
}
if (!Bot.HasInMonstersZoneOrInGraveyard(CardId.Spinny)
&& Util.GetBestBotMonster(true) != null
&& !(Bot.GetMonsters().Count == 1
&& Bot.HasInMonstersZone(CardId.Spinny)))
{
AI.SelectCard(Util.GetBestBotMonster(true));
return true;
}
}
return true;
}
private bool Falco_activate()
{
if (!falcoUsedReturnST && falcoHitGY)
{
if (Bot.HasInGraveyard(salamangreat_spellTrap))
{
falcoUsedReturnST = true;
AI.SelectCard(salamangreat_spellTrap);
return true;
}
}
return false;
}
private bool Gazelle_activate()
{
wasGazelleSummonedThisTurn = true;
if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.Spinny))
{
AI.SelectCard(CardId.Spinny);
return true;
}
if (!Bot.HasInSpellZoneOrInGraveyard(CardId.SalamangreatRoar))
{
AI.SelectCard(CardId.SalamangreatRoar);
return true;
}
if (!Bot.HasInSpellZoneOrInGraveyard(CardId.SalamangreatRage))
{
AI.SelectCard(CardId.SalamangreatRage);
return true;
}
if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.JackJaguar))
{
AI.SelectCard(CardId.JackJaguar);
return true;
}
if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.Foxy))
{
AI.SelectCard(CardId.Foxy);
return true;
}
if (!Bot.HasInHandOrInMonstersZoneOrInGraveyard(CardId.Falco))
{
AI.SelectCard(CardId.Falco);
return true;
}
return true;
}
private bool Foxy_activate()
{
if (Card.Location == CardLocation.MonsterZone)
{
if (CombosInHand.Where(x => x != CardId.Foxy).Where(x => x != CardId.Spinny).Count() == 0 && Bot.HasInHand(CardId.Spinny))
{
return false;
}
AI.SelectCard(salamangreat_combopieces);
FoxyActivatedThisTurn = true;
return true;
}
else
{
if (Bot.HasInHand(CardId.Spinny) || FalcoToGY(false))
{
if (Bot.HasInHand(CardId.Spinny) && !Bot.HasInGraveyard(CardId.Spinny))
{
AI.SelectCard(CardId.Spinny);
}
else
{
if (FalcoToGY(false))
{
AI.SelectCard(CardId.Falco);
}
else
{
return false;
}
}
if (Util.GetBestEnemySpell(true) != null)
{
AI.SelectNextCard(Util.GetBestEnemySpell(true));
foxyPopEnemySpell = true;
}
FoxyActivatedThisTurn = true;
return true;
}
return false;
}
}
private bool FalcoToGY(bool FromDeck)
{
if (FromDeck && Bot.Deck.ContainsCardWithId(CardId.Falco))
{
if (Bot.HasInGraveyard(salamangreat_spellTrap))
{
return true;
}
return false;
}
else
{
if (Bot.HasInHand(CardId.Falco) && Bot.HasInGraveyard(salamangreat_spellTrap))
{
return true;
}
return false;
}
}
private bool Fadydebug_activate()
{
if (!Bot.HasInHand(CardId.Gazelle))
{
AI.SelectCard(CardId.Gazelle);
return true;
}
if (!Bot.HasInHandOrInGraveyard(CardId.Spinny))
{
AI.SelectCard(CardId.Spinny);
return true;
}
if (!Bot.HasInHand(CardId.Foxy))
{
AI.SelectCard(CardId.Foxy);
return true;
}
return true;
}
private bool Circle_activate()
{
var x = ActivateDescription;
if (ActivateDescription == Util.GetStringId(CardId.Circle, 0) || ActivateDescription == 0)
{
AI.SelectOption(0);
if (!Bot.HasInHand(CardId.Gazelle))
{
AI.SelectCard(CardId.Gazelle);
return true;
}
if (!Bot.HasInHandOrInGraveyard(CardId.Spinny))
{
AI.SelectCard(CardId.Spinny);
return true;
}
if (!Bot.HasInHand(CardId.Foxy))
{
AI.SelectCard(CardId.Foxy);
return true;
}
if (!Bot.HasInHand(CardId.Fowl))
{
AI.SelectCard(CardId.Fowl);
return true;
}
if (!Bot.HasInHand(CardId.JackJaguar))
{
AI.SelectCard(CardId.JackJaguar);
return true;
}
if (!Bot.HasInHand(CardId.Falco))
{
AI.SelectCard(CardId.Falco);
return true;
}
return false;
}
return false;
}
private bool FoolishBurial_activate()
{
if (FalcoToGY(true) && Bot.HasInHandOrInGraveyard(CardId.Spinny))
{
AI.SelectCard(CardId.Falco);
return true;
}
AI.SelectCard(CardId.Spinny, CardId.JackJaguar, CardId.Foxy);
return true;
}
private bool Sanctuary_activate()
{
if (Card.Location == CardLocation.Hand)
{
return true;
}
return false;
}
private bool Rage_activate()
{
if (ActivateDescription == Util.GetStringId(CardId.SalamangreatRage, 1))
{
AI.SelectCard(salamangreat_links);
AI.SelectOption(1);
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = Util.GetBestEnemyMonster(canBeTarget: true);
if (target1 != null)
targets.Add(target1);
ClientCard target2 = Util.GetBestEnemySpell();
if (target2 != null)
targets.Add(target2);
foreach (ClientCard target in Enemy.GetMonsters())
{
if (targets.Count >= 2)
break;
if (!targets.Contains(target))
targets.Add(target);
}
foreach (ClientCard target in Enemy.GetSpells())
{
if (targets.Count >= 2)
break;
if (!targets.Contains(target))
targets.Add(target);
}
if (targets.Count == 0)
return false;
AI.SelectNextCard(targets);
return true;
}
else
{
if (Util.GetProblematicEnemyCard(canBeTarget: true) != null)
{
if (Util.GetBestBotMonster(true) != null)
{
AI.SelectCard(Util.GetProblematicEnemyCard(Util.GetBestBotMonster(true).Attack, canBeTarget: true));
}
else
{
AI.SelectCard(Util.GetProblematicEnemyCard(canBeTarget: true));
}
return true;
}
}
return false;
}
public bool G_activate()
{
return (Duel.Player == 1);
}
public bool Hand_act_eff()
{
return (Duel.LastChainPlayer == 1);
}
public bool Impermanence_activate()
{
if (!Should_counter()) return false;
if (!spell_trap_activate()) 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)
{
Impermanence_list.Add(i);
break;
}
}
}
if (Card.Location == CardLocation.Hand)
{
AI.SelectPlace(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)))
{
List<ClientCard> enemy_monsters = Enemy.GetMonsters();
enemy_monsters.Sort(CardContainer.CompareCardAttack);
enemy_monsters.Reverse();
foreach (ClientCard card in enemy_monsters)
{
if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget())
{
AI.SelectCard(card);
Impermanence_list.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 (is_should_not_negate() && LastChainCard.Location == CardLocation.MonsterZone) return false;
if (Card.Location == CardLocation.SpellZone)
{
for (int i = 0; i < 5; ++i)
{
if (Bot.SpellZone[i] == Card)
{
Impermanence_list.Add(i);
break;
}
}
}
if (Card.Location == CardLocation.Hand)
{
AI.SelectPlace(SelectSTPlace(Card, true));
}
if (LastChainCard != null) AI.SelectCard(LastChainCard);
else
{
List<ClientCard> enemy_monsters = Enemy.GetMonsters();
enemy_monsters.Sort(CardContainer.CompareCardAttack);
enemy_monsters.Reverse();
foreach (ClientCard card in enemy_monsters)
{
if (card.IsFaceup() && !card.IsShouldNotBeTarget() && !card.IsShouldNotBeSpellTrapTarget())
{
AI.SelectCard(card);
return true;
}
}
}
return true;
}
public bool is_should_not_negate()
{
ClientCard last_card = Util.GetLastChainCard();
if (last_card != null
&& last_card.Controller == 1 && last_card.IsCode(should_not_negate))
return true;
return false;
}
public bool SolemnStrike_activate()
{
if (!Should_counter()) return false;
return (DefaultSolemnStrike() && spell_trap_activate(true));
}
public bool SolemnJudgment_activate()
{
return !Util.IsChainTargetOnly(Card)
&&
!(Duel.Player == 0
&& Duel.LastChainPlayer == -1)
&& DefaultTrap() && spell_trap_activate(true);
}
public bool spell_trap_activate(bool isCounter = false, ClientCard target = null)
{
if (target == null) target = Card;
if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return true;
if (target.IsSpell())
{
if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true) && !Bot.HasInHandOrHasInMonstersZone(CardId.GO_SR) && !isCounter && !Bot.HasInSpellZone(CardId.SolemnStrike)) return false;
if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return false;
if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return false;
return true;
}
if (target.IsTrap())
{
if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return false;
return true;
}
// how to get here?
return false;
}
public bool Should_counter()
{
if (Duel.CurrentChain.Count < 2) return true;
ClientCard self_card = Duel.CurrentChain[Duel.CurrentChain.Count - 2];
if (self_card?.Controller != 0
|| !(self_card.Location == CardLocation.MonsterZone || self_card.Location == CardLocation.SpellZone)) return true;
ClientCard enemy_card = Duel.CurrentChain[Duel.CurrentChain.Count - 1];
if (enemy_card?.Controller != 1
|| !enemy_card.IsCode(normal_counter)) return true;
return false;
}
public int SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false)
{
List<int> list = new List<int>();
list.Add(0);
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(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 && avoid_Impermanence && Impermanence_list.Contains(seq)) continue;
return zone;
};
}
return 0;
}
public override bool OnSelectYesNo(int desc)
{
if (desc == Util.GetStringId(CardId.Sanctuary, 0))
{
wasFieldspellUsedThisTurn = true;
}
if (desc == Util.GetStringId(CardId.Foxy, 3))
{
return foxyPopEnemySpell;
}
return base.OnSelectYesNo(desc);
}
public override void OnNewTurn()
{
FoxyActivatedThisTurn = false;
JackJaguarActivatedThisTurn = false;
wasWolfActivatedThisTurn = false;
wasStallioActivated = false;
falcoUsedReturnST = false;
CombosInHand = Bot.Hand.Select(h => h.Id).Intersect(Combo_cards).ToList();
wasFieldspellUsedThisTurn = false;
wasGazelleSummonedThisTurn = false;
base.OnNewTurn();
}
public override bool OnSelectHand()
{
return true;
}
public bool SpellSet()
{
if (Card.Id == CardId.Circle)
{
return false;
}
if (Duel.Phase == DuelPhase.Main1 && Bot.HasAttackingMonster() && Duel.Turn > 1) return false;
if (Card.IsCode(CardId.SolemnStrike) && Bot.LifePoints <= 1500) return false;
if ((Card.IsTrap() || Card.HasType(CardType.QuickPlay)))
{
List<int> avoid_list = new List<int>();
int Impermanence_set = 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);
Impermanence_set += (int)System.Math.Pow(2, 4 - i);
}
}
if (Bot.HasInHand(CardId.Impermanence))
{
if (Card.IsCode(CardId.Impermanence))
{
AI.SelectPlace(Impermanence_set);
return true;
}
else
{
AI.SelectPlace(SelectSetPlace(avoid_list));
return true;
}
}
else
{
AI.SelectPlace(SelectSTPlace());
}
return true;
}
return false;
}
public bool Called_activate()
{
if (!DefaultUniqueTrap())
return false;
if (Duel.Player == 1)
{
ClientCard target = Enemy.MonsterZone.GetShouldBeDisabledBeforeItUseEffectMonster();
if (target != null && Enemy.HasInGraveyard(target.Id))
{
AI.SelectCard(target.Id);
return true;
}
}
ClientCard LastChainCard = Util.GetLastChainCard();
if (LastChainCard != null
&& LastChainCard.Controller == 1
&& (LastChainCard.Location == CardLocation.Grave
|| LastChainCard.Location == CardLocation.Hand
|| LastChainCard.Location == CardLocation.MonsterZone
|| LastChainCard.Location == CardLocation.Removed)
&& !LastChainCard.IsDisabled() && !LastChainCard.IsShouldNotBeTarget()
&& !LastChainCard.IsShouldNotBeSpellTrapTarget()
&& Enemy.HasInGraveyard(LastChainCard.Id))
{
AI.SelectCard(LastChainCard.Id);
return true;
}
if (Bot.BattlingMonster != null && Enemy.BattlingMonster != null)
{
if (!Enemy.BattlingMonster.IsDisabled() && Enemy.BattlingMonster.IsCode(_CardId.EaterOfMillions) && Enemy.HasInGraveyard(_CardId.EaterOfMillions))
{
AI.SelectCard(Enemy.BattlingMonster.Id);
return true;
}
}
if (Duel.Phase == DuelPhase.BattleStart && Duel.Player == 1 &&
Enemy.HasInMonstersZone(_CardId.NumberS39UtopiaTheLightning, true) && Enemy.HasInGraveyard(_CardId.NumberS39UtopiaTheLightning))
{
AI.SelectCard(_CardId.NumberS39UtopiaTheLightning);
return true;
}
return false;
}
public bool Borrelsword_ss()
{
if (Duel.Phase != DuelPhase.Main1) return false;
if (Duel.Turn == 1) return false;
List<ClientCard> material_list = new List<ClientCard>();
List<ClientCard> bot_monster = Bot.GetMonsters();
bot_monster.Sort(CardContainer.CompareCardAttack);
//bot_monster.Reverse();
int link_count = 0;
foreach (ClientCard card in bot_monster)
{
if (card.IsFacedown()) continue;
if (!material_list.Contains(card) && card.LinkCount < 3)
{
material_list.Add(card);
link_count += (card.HasType(CardType.Link)) ? card.LinkCount : 1;
}
}
if (link_count >= 4)
{
if (link_count > 4 && material_list.Where(x => x.Id == CardId.MirageStallio).Count() > 0)
{
material_list.Remove(material_list.First(x => x.Id == CardId.MirageStallio));
}
AI.SelectMaterials(material_list);
return true;
}
return false;
}
public bool Borrelsword_eff()
{
if (ActivateDescription == -1) return true;
else if ((Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2) || Util.IsChainTarget(Card))
{
List<ClientCard> enemy_list = Enemy.GetMonsters();
enemy_list.Sort(CardContainer.CompareCardAttack);
enemy_list.Reverse();
foreach (ClientCard card in enemy_list)
{
if (card.HasPosition(CardPosition.Attack) && !card.HasType(CardType.Link))
{
AI.SelectCard(card);
return true;
}
}
List<ClientCard> bot_list = Bot.GetMonsters();
bot_list.Sort(CardContainer.CompareCardAttack);
//bot_list.Reverse();
foreach (ClientCard card in bot_list)
{
if (card.HasPosition(CardPosition.Attack) && !card.HasType(CardType.Link))
{
AI.SelectCard(card);
return true;
}
}
}
return false;
}
public override void OnChainEnd()
{
if (!falcoHitGY && !falcoUsedReturnST && Bot.HasInGraveyard(CardId.Falco))
{
falcoHitGY = true;
}
else if (!Bot.HasInGraveyard(CardId.Falco))
{
falcoHitGY = false;
}
base.OnChainEnd();
}
public override int OnSelectPlace(int cardId, int player, CardLocation location, int available)
{
if (player == 0)
{
if (location == CardLocation.MonsterZone)
{
if (Bot.GetMonstersInExtraZone().Where(x => x.Id == CardId.SunlightWolf).Count() > 1)
{
for (int i = 0; i < 7; ++i)
{
if (Bot.MonsterZone[i] != null && Bot.MonsterZone[i].IsCode(CardId.SunlightWolf))
{
int next_index = get_Wolf_linkzone();
if (next_index != -1 && (available & (int)(System.Math.Pow(2, next_index))) > 0)
{
return (int)(System.Math.Pow(2, next_index));
}
}
}
}
}
}
return base.OnSelectPlace(cardId, player, location, available);
}
public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{
if (Util.IsTurn1OrMain2()
&&
(cardId == CardId.Gazelle
|| cardId == CardId.Spinny
|| cardId == CardId.Foxy))
{
return CardPosition.FaceUpDefence;
}
return 0;
}
public int SelectSetPlace(List<int> avoid_list = null, bool avoid = true)
{
List<int> list = new List<int>();
list.Add(5);
list.Add(6);
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.MonsterZone[seq] == null || !avoid)
{
if (avoid)
{
if (avoid_list != null && avoid_list.Contains(seq)) continue;
return zone;
}
else
{
if (avoid_list != null && avoid_list.Contains(seq))
{
return list.First(x => x == seq);
}
continue;
}
};
}
return 0;
}
public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders)
{
foreach (ClientCard defender in defenders)
{
attacker.RealPower = attacker.Attack;
defender.RealPower = defender.GetDefensePower();
if (attacker.IsCode(CardId.Borrelsword) && !attacker.IsDisabled())
return AI.Attack(attacker, defender);
if (!OnPreBattleBetween(attacker, defender))
continue;
if (attacker.RealPower > defender.RealPower || (attacker.RealPower > defender.RealPower && attacker.IsLastAttacker && defender.IsAttack()))
return AI.Attack(attacker, defender);
}
if (attacker.CanDirectAttack)
return AI.Attack(attacker, null);
return null;
}
}
}
......@@ -114,7 +114,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.SpSummon, CardId.Hayate, HayateSummon);
AddExecutor(ExecutorType.Activate, CardId.Hayate, HayateEffect);
AddExecutor(ExecutorType.SpSummon, CardId.TopologicBomberDragon, AI.Utils.IsTurn1OrMain2);
AddExecutor(ExecutorType.SpSummon, CardId.TopologicBomberDragon, Util.IsTurn1OrMain2);
AddExecutor(ExecutorType.Summon, CardId.Raye, RayeSummon);
......@@ -160,15 +160,15 @@ namespace WindBot.Game.AI.Decks
public override bool OnSelectYesNo(int desc)
{
if (desc == AI.Utils.GetStringId(CardId.SummonSorceress, 2)) // summon to the field of opponent?
if (desc == Util.GetStringId(CardId.SummonSorceress, 2)) // summon to the field of opponent?
return false;
if (desc == AI.Utils.GetStringId(CardId.Engage, 0)) // draw card?
if (desc == Util.GetStringId(CardId.Engage, 0)) // draw card?
return true;
if (desc == AI.Utils.GetStringId(CardId.WidowAnchor, 0)) // get control?
if (desc == Util.GetStringId(CardId.WidowAnchor, 0)) // get control?
return true;
if (desc == AI.Utils.GetStringId(CardId.JammingWave, 0)) // destroy monster?
if (desc == Util.GetStringId(CardId.JammingWave, 0)) // destroy monster?
{
ClientCard target = AI.Utils.GetBestEnemyMonster();
ClientCard target = Util.GetBestEnemyMonster();
if (target != null)
{
AI.SelectCard(target);
......@@ -177,9 +177,9 @@ namespace WindBot.Game.AI.Decks
else
return false;
}
if (desc == AI.Utils.GetStringId(CardId.Afterburners, 0)) // destroy spell & trap?
if (desc == Util.GetStringId(CardId.Afterburners, 0)) // destroy spell & trap?
{
ClientCard target = AI.Utils.GetBestEnemySpell();
ClientCard target = Util.GetBestEnemySpell();
if (target != null)
{
AI.SelectCard(target);
......@@ -199,7 +199,7 @@ namespace WindBot.Game.AI.Decks
private bool TwinTwistersEffect()
{
if (AI.Utils.ChainContainsCard(CardId.TwinTwisters))
if (Util.ChainContainsCard(CardId.TwinTwisters))
return false;
IList<ClientCard> targets = new List<ClientCard>();
foreach (ClientCard target in Enemy.GetSpells())
......@@ -261,7 +261,7 @@ namespace WindBot.Game.AI.Decks
private bool AfterburnersEffect()
{
ClientCard target = AI.Utils.GetBestEnemyMonster(true, true);
ClientCard target = Util.GetBestEnemyMonster(true, true);
if (target != null)
{
AI.SelectCard(target);
......@@ -291,9 +291,9 @@ namespace WindBot.Game.AI.Decks
private bool WidowAnchorEffectFirst()
{
if (AI.Utils.ChainContainsCard(CardId.WidowAnchor))
if (Util.ChainContainsCard(CardId.WidowAnchor))
return false;
ClientCard target = AI.Utils.GetProblematicEnemyMonster(0, true);
ClientCard target = Util.GetProblematicEnemyMonster(0, true);
if (target != null)
{
WidowAnchorTarget = target;
......@@ -359,7 +359,7 @@ namespace WindBot.Game.AI.Decks
return true;
if (Bot.HasInMonstersZone(CardId.TopologicBomberDragon) && Enemy.GetMonsterCount() > 1)
return true;
if (!AI.Utils.IsTurn1OrMain2())
if (!Util.IsTurn1OrMain2())
{
foreach (ClientCard card in Bot.Hand)
{
......@@ -375,14 +375,14 @@ namespace WindBot.Game.AI.Decks
{
if (DefaultBreakthroughSkill())
{
WidowAnchorTarget = AI.Utils.GetLastChainCard();
WidowAnchorTarget = Util.GetLastChainCard();
return true;
}
if (!HaveThreeSpellsInGrave() || Duel.Player == 1 || Duel.Phase < DuelPhase.Main1 || Duel.Phase >= DuelPhase.Main2 || AI.Utils.ChainContainsCard(CardId.WidowAnchor))
if (!HaveThreeSpellsInGrave() || Duel.Player == 1 || Duel.Phase < DuelPhase.Main1 || Duel.Phase >= DuelPhase.Main2 || Util.ChainContainsCard(CardId.WidowAnchor))
return false;
ClientCard target = AI.Utils.GetBestEnemyMonster(true, true);
ClientCard target = Util.GetBestEnemyMonster(true, true);
if (target != null && !target.IsDisabled() && !target.HasType(CardType.Normal))
{
WidowAnchorTarget = target;
......@@ -410,9 +410,9 @@ namespace WindBot.Game.AI.Decks
}
else
{
if (AI.Utils.IsTurn1OrMain2())
if (Util.IsTurn1OrMain2())
return false;
ClientCard bestBotMonster = AI.Utils.GetBestBotMonster(true);
ClientCard bestBotMonster = Util.GetBestBotMonster(true);
if (bestBotMonster != null)
{
int bestPower = bestBotMonster.Attack;
......@@ -527,7 +527,7 @@ namespace WindBot.Game.AI.Decks
{
return false;
}
if (AI.Utils.IsChainTarget(Card))
if (Util.IsChainTarget(Card))
{
RayeSelectTarget();
return true;
......@@ -582,11 +582,11 @@ namespace WindBot.Game.AI.Decks
private bool KagariEffect()
{
if (EmptyMainMonsterZone() && AI.Utils.GetProblematicEnemyMonster() != null && Bot.HasInGraveyard(CardId.Afterburners))
if (EmptyMainMonsterZone() && Util.GetProblematicEnemyMonster() != null && Bot.HasInGraveyard(CardId.Afterburners))
{
AI.SelectCard(CardId.Afterburners);
}
else if (EmptyMainMonsterZone() && AI.Utils.GetProblematicEnemySpell() != null && Bot.HasInGraveyard(CardId.JammingWave))
else if (EmptyMainMonsterZone() && Util.GetProblematicEnemySpell() != null && Bot.HasInGraveyard(CardId.JammingWave))
{
AI.SelectCard(CardId.JammingWave);
}
......@@ -597,7 +597,7 @@ namespace WindBot.Game.AI.Decks
private bool ShizukuSummon()
{
if (AI.Utils.IsTurn1OrMain2())
if (Util.IsTurn1OrMain2())
{
ShizukuSummoned = true;
return true;
......@@ -617,7 +617,7 @@ namespace WindBot.Game.AI.Decks
private bool HayateSummon()
{
if (AI.Utils.IsTurn1OrMain2())
if (Util.IsTurn1OrMain2())
return false;
HayateSummoned = true;
return true;
......@@ -641,14 +641,14 @@ namespace WindBot.Game.AI.Decks
CardId.EffectVeiler,
CardId.GhostRabbit,
CardId.JetSynchron
}) && !AI.Utils.IsTurn1OrMain2()
}) && !Util.IsTurn1OrMain2()
&& Bot.GetMonsterCount() > 0
&& Bot.HasInExtra(CardId.CrystronNeedlefiber);
}
private bool CrystronNeedlefiberSummon()
{
return !AI.Utils.IsTurn1OrMain2();
return !Util.IsTurn1OrMain2();
}
private bool CrystronNeedlefiberEffect()
......@@ -701,15 +701,15 @@ namespace WindBot.Game.AI.Decks
{
return CardId.HornetDrones;
}
else if (AI.Utils.GetProblematicEnemyMonster() != null && Bot.GetRemainingCount(CardId.WidowAnchor, 3) > 0)
else if (Util.GetProblematicEnemyMonster() != null && Bot.GetRemainingCount(CardId.WidowAnchor, 3) > 0)
{
return CardId.WidowAnchor;
}
else if (EmptyMainMonsterZone() && AI.Utils.GetProblematicEnemyMonster() != null && Bot.GetRemainingCount(CardId.Afterburners, 1) > 0)
else if (EmptyMainMonsterZone() && Util.GetProblematicEnemyMonster() != null && Bot.GetRemainingCount(CardId.Afterburners, 1) > 0)
{
return CardId.Afterburners;
}
else if (EmptyMainMonsterZone() && AI.Utils.GetProblematicEnemySpell() != null && Bot.GetRemainingCount(CardId.JammingWave, 1) > 0)
else if (EmptyMainMonsterZone() && Util.GetProblematicEnemySpell() != null && Bot.GetRemainingCount(CardId.JammingWave, 1) > 0)
{
return CardId.JammingWave;
}
......
......@@ -413,7 +413,7 @@ namespace WindBot.Game.AI.Decks
private bool CatSharkSummon()
{
if (Bot.HasInMonstersZone(CardId.ToadallyAwesome)
&& ((AI.Utils.IsOneEnemyBetter(true)
&& ((Util.IsOneEnemyBetter(true)
&& !Bot.HasInMonstersZone(new[]
{
CardId.CatShark,
......@@ -470,8 +470,8 @@ namespace WindBot.Game.AI.Decks
num++;
}
}
return AI.Utils.IsOneEnemyBetter(true)
&& AI.Utils.GetBestAttack(Enemy) > 2200
return Util.IsOneEnemyBetter(true)
&& Util.GetBestAttack(Enemy) > 2200
&& num < 4
&& !Bot.HasInMonstersZone(new[]
{
......@@ -496,7 +496,7 @@ namespace WindBot.Game.AI.Decks
{
defence += monster.GetDefensePower();
}
if (attack - 2000 - defence > Enemy.LifePoints && !AI.Utils.IsOneEnemyBetter(true))
if (attack - 2000 - defence > Enemy.LifePoints && !Util.IsOneEnemyBetter(true))
return true;
}
return false;
......@@ -512,7 +512,7 @@ namespace WindBot.Game.AI.Decks
{
if (Card.IsFacedown())
return true;
if (Card.IsDefense() && !AI.Utils.IsAllEnemyBetter(true) && Card.Attack >= Card.Defense)
if (Card.IsDefense() && !Util.IsAllEnemyBetter(true) && Card.Attack >= Card.Defense)
return true;
return false;
}
......
......@@ -325,7 +325,7 @@ namespace WindBot.Game.AI.Decks
// can ss from exdeck
if (judge)
{
bool fornextss = AI.Utils.ChainContainsCard(CardId.Awaken);
bool fornextss = Util.ChainContainsCard(CardId.Awaken);
IList<ClientCard> ex = Bot.ExtraDeck;
ClientCard ex_best = null;
foreach (ClientCard ex_card in ex)
......@@ -389,7 +389,7 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(ex_best);
}
}
if (!judge || AI.Utils.ChainContainsCard(CardId.Awaken))
if (!judge || Util.ChainContainsCard(CardId.Awaken))
{
// cannot ss from exdeck or have more than 1 grass in chain
int[] secondselect = new[]
......@@ -405,7 +405,7 @@ namespace WindBot.Game.AI.Decks
CardId.Yellow,
CardId.Pink
};
if (!AI.Utils.ChainContainsCard(CardId.Awaken))
if (!Util.ChainContainsCard(CardId.Awaken))
{
if (!judge && Bot.GetRemainingCount(CardId.Ghost, 2) > 0)
{
......@@ -437,12 +437,12 @@ namespace WindBot.Game.AI.Decks
// counter
if (!Enemy.HasInMonstersZone(CardId.Ghost) || Enemy.GetHandCount() <= 1)
{
ClientCard tosolve = AI.Utils.GetProblematicEnemyCard();
ClientCard tosolve = Util.GetProblematicEnemyCard();
if (tosolve == null)
{
if (Duel.LastChainPlayer == 1 && AI.Utils.GetLastChainCard() != null)
if (Duel.LastChainPlayer == 1 && Util.GetLastChainCard() != null)
{
ClientCard target = AI.Utils.GetLastChainCard();
ClientCard target = Util.GetLastChainCard();
if (target.HasPosition(CardPosition.FaceUp) && (target.Location == CardLocation.MonsterZone || target.Location == CardLocation.SpellZone)) tosolve = target;
}
}
......@@ -494,7 +494,7 @@ namespace WindBot.Game.AI.Decks
ClientCard selected = null;
if (Card.Location == CardLocation.Grave)
{
selected = AI.Utils.GetBestEnemySpell(true);
selected = Util.GetBestEnemySpell(true);
}
else
{
......@@ -524,7 +524,7 @@ namespace WindBot.Game.AI.Decks
public bool Feather_Act()
{
if (!spell_trap_activate()) return false;
if (AI.Utils.GetProblematicEnemySpell() != null)
if (Util.GetProblematicEnemySpell() != null)
{
List<ClientCard> grave = Bot.GetGraveyardSpells();
foreach (ClientCard self_card in grave)
......@@ -547,7 +547,7 @@ namespace WindBot.Game.AI.Decks
if (!spell_trap_activate()) return false;
if (Duel.Player == 0) return false;
if (Duel.Phase == DuelPhase.End) return true;
if (Duel.LastChainPlayer == 1 && (AI.Utils.IsChainTarget(Card) || (AI.Utils.GetLastChainCard().IsCode(CardId.Feather) && !Bot.HasInSpellZone(CardId.Awaken)))) return true;
if (Duel.LastChainPlayer == 1 && (Util.IsChainTarget(Card) || (Util.GetLastChainCard().IsCode(CardId.Feather) && !Bot.HasInSpellZone(CardId.Awaken)))) return true;
if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2)
{
int total_atk = 0;
......@@ -585,7 +585,7 @@ namespace WindBot.Game.AI.Decks
stage_locked = null;
return true;
}
else if (Enemy.GetMonsterCount() > 0 && AI.Utils.GetBestEnemyMonster().Attack >= AI.Utils.GetBestAttack(Bot))
else if (Enemy.GetMonsterCount() > 0 && Util.GetBestEnemyMonster().Attack >= Util.GetBestAttack(Bot))
{
AI.SelectCard(CardId.White, CardId.Yellow, CardId.Pink, CardId.Red);
stage_locked = null;
......@@ -608,7 +608,7 @@ namespace WindBot.Game.AI.Decks
stage_locked = null;
return true;
}
if (Enemy.GetMonsterCount() > 0 && AI.Utils.GetBestEnemyMonster().Attack >= AI.Utils.GetBestAttack(Bot) && !Bot.HasInHand(CardId.White))
if (Enemy.GetMonsterCount() > 0 && Util.GetBestEnemyMonster().Attack >= Util.GetBestAttack(Bot) && !Bot.HasInHand(CardId.White))
{
AI.SelectCard(CardId.White, CardId.Yellow, CardId.Pink, CardId.Red);
stage_locked = null;
......@@ -674,7 +674,7 @@ namespace WindBot.Game.AI.Decks
pink_ss = true;
return true;
}
else if (Enemy.GetMonsterCount() > 0 && (AI.Utils.GetBestEnemyMonster().Attack - 800 >= Bot.LifePoints)) return false;
else if (Enemy.GetMonsterCount() > 0 && (Util.GetBestEnemyMonster().Attack - 800 >= Bot.LifePoints)) return false;
pink_ss = true;
return true;
}
......@@ -695,9 +695,9 @@ namespace WindBot.Game.AI.Decks
public bool Eater_ss()
{
if (AI.Utils.GetProblematicEnemyMonster() == null && Bot.ExtraDeck.Count < 5) return false;
if (Util.GetProblematicEnemyMonster() == null && Bot.ExtraDeck.Count < 5) return false;
if (Bot.GetMonstersInMainZone().Count >= 5) return false;
if (AI.Utils.IsTurn1OrMain2()) return false;
if (Util.IsTurn1OrMain2()) return false;
AI.SelectPosition(CardPosition.FaceUpAttack);
IList<ClientCard> targets = new List<ClientCard>();
if (Bot.SpellZone[5] != null && !Bot.SpellZone[5].IsCode(CardId.Stage))
......@@ -742,7 +742,7 @@ namespace WindBot.Game.AI.Decks
if (Duel.Player == 0)
{
List<ClientCard> monster_list = Bot.GetMonsters();
monster_list.Sort(AIFunctions.CompareCardAttack);
monster_list.Sort(CardContainer.CompareCardAttack);
monster_list.Reverse();
foreach(ClientCard card in monster_list)
{
......@@ -753,7 +753,7 @@ namespace WindBot.Game.AI.Decks
} else if (card.RealPower >= self_power) self_power = card.RealPower;
}
}
ClientCard bestenemy = AI.Utils.GetOneEnemyBetterThanValue(self_power, true);
ClientCard bestenemy = Util.GetOneEnemyBetterThanValue(self_power, true);
if (bestenemy != null) AI.SelectPosition(CardPosition.FaceUpDefence);
else AI.SelectPosition(CardPosition.FaceUpAttack);
return;
......@@ -762,12 +762,12 @@ namespace WindBot.Game.AI.Decks
public bool Red_ss()
{
if (red_ss_count >= 6) return false;
if ((AI.Utils.ChainContainsCard(CardId.DarkHole) || AI.Utils.ChainContainsCard(99330325) || AI.Utils.ChainContainsCard(53582587)) && AI.Utils.ChainContainsCard(CardId.Red)) return false;
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard().IsCode(CardId.Red))
if ((Util.ChainContainsCard(CardId.DarkHole) || Util.ChainContainsCard(99330325) || Util.ChainContainsCard(53582587)) && Util.ChainContainsCard(CardId.Red)) return false;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Red))
{
foreach (ClientCard m in Bot.GetMonsters())
{
if (AI.Utils.IsChainTarget(m) && IsTrickstar(m.Id))
if (Util.IsChainTarget(m) && IsTrickstar(m.Id))
{
red_ss_count += 1;
AI.SelectCard(m);
......@@ -779,11 +779,11 @@ namespace WindBot.Game.AI.Decks
if (Duel.LastChainPlayer == 1) return true;
if (Duel.Player == 0)
{
if (AI.Utils.IsTurn1OrMain2()) return false;
if (Util.IsTurn1OrMain2()) return false;
if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2)
{
List<ClientCard> self_m = Bot.GetMonsters();
ClientCard tosolve_enemy = AI.Utils.GetOneEnemyBetterThanMyBest();
ClientCard tosolve_enemy = Util.GetOneEnemyBetterThanMyBest();
foreach (ClientCard c in self_m)
{
if (IsTrickstar(c.Id) && !c.IsCode(CardId.Red))
......@@ -838,10 +838,10 @@ namespace WindBot.Game.AI.Decks
{
if (Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2)
{
if (AI.Utils.GetOneEnemyBetterThanMyBest() != null)
if (Util.GetOneEnemyBetterThanMyBest() != null)
{
List<ClientCard> self_monster = Bot.GetMonsters();
self_monster.Sort(AIFunctions.CompareDefensePower);
self_monster.Sort(CardContainer.CompareDefensePower);
foreach(ClientCard card in self_monster)
{
if (IsTrickstar(card.Id) && !card.IsCode(CardId.Red))
......@@ -878,7 +878,7 @@ namespace WindBot.Game.AI.Decks
return true;
}
}
if (Enemy.GetMonsterCount() == 0 && !AI.Utils.IsTurn1OrMain2())
if (Enemy.GetMonsterCount() == 0 && !Util.IsTurn1OrMain2())
{
if (Bot.HasInGraveyard(CardId.Red) && Bot.GetRemainingCount(CardId.Pink, 1) > 0 && !pink_ss)
{
......@@ -902,9 +902,9 @@ namespace WindBot.Game.AI.Decks
}
return true;
}
if (AI.Utils.GetProblematicEnemyMonster() != null)
if (Util.GetProblematicEnemyMonster() != null)
{
int power = AI.Utils.GetProblematicEnemyMonster().GetDefensePower();
int power = Util.GetProblematicEnemyMonster().GetDefensePower();
if (power >= 1800 && power <= 3600 && Bot.GetRemainingCount(CardId.White, 2) > 0 && !Bot.HasInHand(CardId.White))
{
AI.SelectCard(CardId.White, CardId.Red, CardId.Pink, CardId.Re, CardId.Stage, CardId.Crown, CardId.Yellow);
......@@ -937,13 +937,13 @@ namespace WindBot.Game.AI.Decks
return false;
} else
{
if (Enemy.GetMonsterCount() == 0 && !AI.Utils.IsTurn1OrMain2()) {
if (Enemy.GetMonsterCount() == 0 && !Util.IsTurn1OrMain2()) {
white_eff_used = true;
return true;
}
else if (Enemy.GetMonsterCount() != 0)
{
ClientCard tosolve = AI.Utils.GetBestEnemyMonster(true);
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)))
{
......@@ -985,8 +985,8 @@ namespace WindBot.Game.AI.Decks
lockbird_useful = true;
if (Bot.HasInSpellZone(CardId.Re))
{
if (AI.Utils.ChainContainsCard(CardId.Re)) lockbird_used = true;
return AI.Utils.ChainContainsCard(CardId.Re);
if (Util.ChainContainsCard(CardId.Re)) lockbird_used = true;
return Util.ChainContainsCard(CardId.Re);
}
lockbird_used = true;
return true;
......@@ -998,7 +998,7 @@ namespace WindBot.Game.AI.Decks
if (!spell_trap_activate()) return false;
if (Bot.HasInHand(CardId.LockBird))
{
if (lockbird_useful || AI.Utils.IsChainTarget(Card) || (Duel.Player == 1 && AI.Utils.ChainContainsCard(CardId.Feather))) {
if (lockbird_useful || Util.IsChainTarget(Card) || (Duel.Player == 1 && Util.ChainContainsCard(CardId.Feather))) {
lockbird_useful = false;
return true;
}
......@@ -1033,7 +1033,7 @@ namespace WindBot.Game.AI.Decks
if (hand.Attack >= Enemy.LifePoints) return true;
if (!hand.IsCode(CardId.Yellow))
{
if (AI.Utils.GetOneEnemyBetterThanValue(hand.Attack, false) == null) return true;
if (Util.GetOneEnemyBetterThanValue(hand.Attack, false) == null) return true;
}
}
}
......@@ -1043,7 +1043,7 @@ namespace WindBot.Game.AI.Decks
public bool Ts_reborn()
{
if (AI.Utils.IsTurn1OrMain2()) return false;
if (Util.IsTurn1OrMain2()) return false;
if (Duel.Player == 0 && Enemy.LifePoints <= 1000)
{
AI.SelectCard(CardId.Pink);
......@@ -1094,7 +1094,7 @@ namespace WindBot.Game.AI.Decks
NormalSummoned = true;
return true;
}
else if (!AI.Utils.IsTurn1OrMain2() && (Bot.HasInGraveyard(CardId.Yellow) || Bot.HasInGraveyard(CardId.Red)))
else if (!Util.IsTurn1OrMain2() && (Bot.HasInGraveyard(CardId.Yellow) || Bot.HasInGraveyard(CardId.Red)))
{
NormalSummoned = true;
return true;
......@@ -1140,12 +1140,12 @@ namespace WindBot.Game.AI.Decks
public bool Ring_act()
{
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().IsCode(CardId.Ghost)) return false;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.Ghost)) return false;
if (!spell_trap_activate()) return false;
ClientCard target = AI.Utils.GetProblematicEnemyMonster();
if (target == null && AI.Utils.IsChainTarget(Card))
ClientCard target = Util.GetProblematicEnemyMonster();
if (target == null && Util.IsChainTarget(Card))
{
target = AI.Utils.GetBestEnemyMonster();
target = Util.GetBestEnemyMonster();
}
if (target != null)
{
......@@ -1171,7 +1171,7 @@ namespace WindBot.Game.AI.Decks
public bool Linkuri_eff()
{
if (Duel.LastChainPlayer == 0 && AI.Utils.GetLastChainCard().IsCode(CardId.Linkuri)) return false;
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuri)) return false;
AI.SelectCard(CardId.Tuner, CardId.BF + 1);
return true;
}
......@@ -1200,7 +1200,7 @@ namespace WindBot.Game.AI.Decks
}
if (targets.Count == 0) return false;
List<ClientCard> m_list = new List<ClientCard>(Bot.GetMonsters());
m_list.Sort(AIFunctions.CompareCardAttack);
m_list.Sort(CardContainer.CompareCardAttack);
foreach (ClientCard e_check in m_list)
{
if (e_check.IsFacedown()) continue;
......@@ -1223,9 +1223,9 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(CardId.Tuner, CardId.Ghost, CardId.Urara);
return true;
}
else if (AI.Utils.IsChainTarget(Card) || AI.Utils.GetProblematicEnemySpell() != null) return true;
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && AI.Utils.IsOneEnemyBetterThanValue(1500,true)) {
if (AI.Utils.IsOneEnemyBetterThanValue(1900, true))
else if (Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null) return true;
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(1500,true)) {
if (Util.IsOneEnemyBetterThanValue(1900, true))
{
AI.SelectPosition(CardPosition.FaceUpDefence);
}
......@@ -1241,7 +1241,7 @@ namespace WindBot.Game.AI.Decks
public bool TG_eff()
{
if (Card.Location != CardLocation.MonsterZone) return true;
ClientCard target = AI.Utils.GetProblematicEnemySpell();
ClientCard target = Util.GetProblematicEnemySpell();
IList<ClientCard> list = new List<ClientCard>();
if (target != null) list.Add(target);
foreach(ClientCard spells in Enemy.GetSpells())
......@@ -1254,8 +1254,8 @@ namespace WindBot.Game.AI.Decks
public bool Safedragon_ss()
{
if (AI.Utils.IsTurn1OrMain2()) return false;
ClientCard m = AI.Utils.GetProblematicEnemyMonster();
if (Util.IsTurn1OrMain2()) return false;
ClientCard m = Util.GetProblematicEnemyMonster();
foreach(ClientCard ex_m in Bot.GetMonstersInExtraZone())
{
if (getLinkMarker(ex_m.Id) >= 4) return false;
......@@ -1302,14 +1302,14 @@ namespace WindBot.Game.AI.Decks
public bool Phoneix_ss()
{
ClientCard m = AI.Utils.GetProblematicEnemySpell();
ClientCard m = Util.GetProblematicEnemySpell();
if (m == null)
{
if (Enemy.GetMonsterCount() == 0 && Enemy.LifePoints <= 1900 && Duel.Phase == DuelPhase.Main1)
{
IList<ClientCard> m_list = new List<ClientCard>();
List<ClientCard> list = new List<ClientCard>(Bot.GetMonsters());
list.Sort(AIFunctions.CompareCardAttack);
list.Sort(CardContainer.CompareCardAttack);
foreach(ClientCard monster in list)
{
if (getLinkMarker(monster.Id) == 1 && monster.IsFaceup()) m_list.Add(monster);
......@@ -1326,7 +1326,7 @@ namespace WindBot.Game.AI.Decks
if (Bot.Hand.Count == 0) return false;
IList<ClientCard> targets = new List<ClientCard>();
List<ClientCard> main_list = new List<ClientCard>(Bot.GetMonstersInMainZone());
main_list.Sort(AIFunctions.CompareCardAttack);
main_list.Sort(CardContainer.CompareCardAttack);
foreach (ClientCard s_m in main_list)
{
if (s_m.IsFacedown()) continue;
......@@ -1356,7 +1356,7 @@ namespace WindBot.Game.AI.Decks
public bool Phoneix_eff()
{
AI.SelectCard(Useless_List());
ClientCard target = AI.Utils.GetProblematicEnemySpell();
ClientCard target = Util.GetProblematicEnemySpell();
if (target != null)
{
AI.SelectNextCard(target);
......@@ -1373,7 +1373,7 @@ namespace WindBot.Game.AI.Decks
}
public bool Unicorn_ss() {
ClientCard m = AI.Utils.GetProblematicEnemyCard();
ClientCard m = Util.GetProblematicEnemyCard();
int link_count = 0;
if (m == null)
{
......@@ -1381,7 +1381,7 @@ namespace WindBot.Game.AI.Decks
{
IList<ClientCard> m_list = new List<ClientCard>();
List<ClientCard> _sort_list = new List<ClientCard>(Bot.GetMonsters());
_sort_list.Sort(AIFunctions.CompareCardAttack);
_sort_list.Sort(CardContainer.CompareCardAttack);
foreach(ClientCard monster in _sort_list)
{
if (getLinkMarker(monster.Id) == 2)
......@@ -1406,7 +1406,7 @@ namespace WindBot.Game.AI.Decks
if (Bot.Hand.Count == 0) return false;
IList<ClientCard> targets = new List<ClientCard>();
List<ClientCard> sort_list = Bot.GetMonsters();
sort_list.Sort(AIFunctions.CompareCardAttack);
sort_list.Sort(CardContainer.CompareCardAttack);
foreach (ClientCard s_m in sort_list)
{
if ((!s_m.IsCode(CardId.Eater) || (s_m.IsCode(CardId.Eater) && m.IsMonsterHasPreventActivationEffectInBattle())) && getLinkMarker(s_m.Id) <= 2 && s_m.IsFaceup())
......@@ -1426,7 +1426,7 @@ namespace WindBot.Game.AI.Decks
public bool Unicorn_eff()
{
ClientCard m = AI.Utils.GetProblematicEnemyCard();
ClientCard m = Util.GetProblematicEnemyCard();
if (m == null) return false;
// avoid cards that cannot target.
AI.SelectCard(Useless_List());
......@@ -1466,7 +1466,7 @@ namespace WindBot.Game.AI.Decks
}
}
List<ClientCard> sort_main_list = new List<ClientCard>(Bot.GetMonstersInMainZone());
sort_main_list.Sort(AIFunctions.CompareCardAttack);
sort_main_list.Sort(CardContainer.CompareCardAttack);
foreach (ClientCard m in sort_main_list)
{
if (m.Attack < 1900 && !targets.ContainsCardWithId(m.Id) && m.IsFaceup())
......@@ -1493,8 +1493,8 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(Useless_List());
return true;
}
//if (ActivateDescription == AI.Utils.GetStringId(CardId.Snake, 2)) return true;
if (ActivateDescription == AI.Utils.GetStringId(CardId.Snake, 1))
//if (ActivateDescription == Util.GetStringId(CardId.Snake, 2)) return true;
if (ActivateDescription == Util.GetStringId(CardId.Snake, 1))
{
foreach(ClientCard hand in Bot.Hand)
{
......@@ -1525,11 +1525,11 @@ namespace WindBot.Game.AI.Decks
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Enemy.GetMonsterCount() == 0 || AI.Utils.GetProblematicEnemyMonster(2000) == null)
if (Enemy.GetMonsterCount() == 0 || Util.GetProblematicEnemyMonster(2000) == null)
{
AI.SelectMaterials(material_list);
return true;
} else if (AI.Utils.GetProblematicEnemyMonster(2000) != null && Bot.HasInExtra(CardId.Borrel) && !Bot.HasInMonstersZone(CardId.Missus))
} else if (Util.GetProblematicEnemyMonster(2000) != null && Bot.HasInExtra(CardId.Borrel) && !Bot.HasInMonstersZone(CardId.Missus))
{
AI.SelectMaterials(material_list);
return true;
......@@ -1547,9 +1547,9 @@ namespace WindBot.Game.AI.Decks
{
bool already_link2 = false;
IList<ClientCard> material_list = new List<ClientCard>();
if (AI.Utils.GetProblematicEnemyMonster(2000) == null) Logger.DebugWriteLine("***borrel:null");
else Logger.DebugWriteLine("***borrel:" + (AI.Utils.GetProblematicEnemyMonster(2000).Name ?? "unknown"));
if (AI.Utils.GetProblematicEnemyMonster(2000) != null || (Enemy.GetMonsterCount() == 0 && Duel.Phase == DuelPhase.Main1 && Enemy.LifePoints <= 3000))
if (Util.GetProblematicEnemyMonster(2000) == null) Logger.DebugWriteLine("***borrel:null");
else Logger.DebugWriteLine("***borrel:" + (Util.GetProblematicEnemyMonster(2000).Name ?? "unknown"));
if (Util.GetProblematicEnemyMonster(2000) != null || (Enemy.GetMonsterCount() == 0 && Duel.Phase == DuelPhase.Main1 && Enemy.LifePoints <= 3000))
{
foreach(ClientCard e_m in Bot.GetMonstersInExtraZone())
{
......@@ -1560,7 +1560,7 @@ namespace WindBot.Game.AI.Decks
}
}
List<ClientCard> sort_list = new List<ClientCard>(Bot.GetMonstersInMainZone());
sort_list.Sort(AIFunctions.CompareCardAttack);
sort_list.Sort(CardContainer.CompareCardAttack);
foreach(ClientCard m in sort_list)
{
......@@ -1600,7 +1600,7 @@ namespace WindBot.Game.AI.Decks
}
return true;
};
ClientCard BestEnemy = AI.Utils.GetBestEnemyMonster(true);
ClientCard BestEnemy = Util.GetBestEnemyMonster(true);
ClientCard WorstBot = Bot.GetMonsters().GetLowestAttackMonster();
if (BestEnemy == null || BestEnemy.HasPosition(CardPosition.FaceDown)) return false;
if (WorstBot == null || WorstBot.HasPosition(CardPosition.FaceDown)) return false;
......@@ -1618,9 +1618,9 @@ namespace WindBot.Game.AI.Decks
if (!spell_trap_activate()) return false;
if (Duel.LastChainPlayer == 1)
{
if (AI.Utils.GetLastChainCard().IsMonster() && Enemy.HasInGraveyard(AI.Utils.GetLastChainCard().Id))
if (Util.GetLastChainCard().IsMonster() && Enemy.HasInGraveyard(Util.GetLastChainCard().Id))
{
GraveCall_id = AI.Utils.GetLastChainCard().Id;
GraveCall_id = Util.GetLastChainCard().Id;
GraveCall_count = 2;
AI.SelectCard(GraveCall_id);
return true;
......@@ -1671,7 +1671,7 @@ namespace WindBot.Game.AI.Decks
if (newPower > bestPower)
bestPower = newPower;
}
return AI.Utils.IsAllEnemyBetterThanValue(bestPower,true);
return Util.IsAllEnemyBetterThanValue(bestPower,true);
}
public bool MonsterRepos()
......
......@@ -181,8 +181,8 @@ namespace WindBot.Game.AI.Decks
public override IList<ClientCard> OnSelectXyzMaterial(IList<ClientCard> cards, int min, int max)
{
IList<ClientCard> result = AI.Utils.SelectPreferredCards(CardId.YosenjuTsujik, cards, min, max);
return AI.Utils.CheckSelectCount(result, cards, min, max);
IList<ClientCard> result = Util.SelectPreferredCards(CardId.YosenjuTsujik, cards, min, max);
return Util.CheckSelectCount(result, cards, min, max);
}
private bool PotOfDualityEffect()
......@@ -227,7 +227,7 @@ namespace WindBot.Game.AI.Decks
private bool CardOfDemiseEffect()
{
if (AI.Utils.IsTurn1OrMain2())
if (Util.IsTurn1OrMain2())
{
CardOfDemiseUsed = true;
return true;
......@@ -292,15 +292,15 @@ namespace WindBot.Game.AI.Decks
private bool DarkRebellionXyzDragonSummon()
{
int selfBestAttack = AI.Utils.GetBestAttack(Bot);
int oppoBestAttack = AI.Utils.GetBestAttack(Enemy);
int selfBestAttack = Util.GetBestAttack(Bot);
int oppoBestAttack = Util.GetBestAttack(Enemy);
return selfBestAttack <= oppoBestAttack;
}
private bool DarkRebellionXyzDragonEffect()
{
int oppoBestAttack = AI.Utils.GetBestAttack(Enemy);
ClientCard target = AI.Utils.GetOneEnemyBetterThanValue(oppoBestAttack, true);
int oppoBestAttack = Util.GetBestAttack(Enemy);
ClientCard target = Util.GetOneEnemyBetterThanValue(oppoBestAttack, true);
if (target != null)
{
AI.SelectCard(0);
......
......@@ -79,9 +79,9 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.Number61Volcasaurus);
// Weapons
AddExecutor(ExecutorType.Activate, CardId.ZwTornadoBringer);
AddExecutor(ExecutorType.Activate, CardId.ZwLightningBlade);
AddExecutor(ExecutorType.Activate, CardId.ZwAsuraStrike);
AddExecutor(ExecutorType.Activate, CardId.ZwTornadoBringer, ZwWeapon);
AddExecutor(ExecutorType.Activate, CardId.ZwLightningBlade, ZwWeapon);
AddExecutor(ExecutorType.Activate, CardId.ZwAsuraStrike, ZwWeapon);
// Special summons
......@@ -122,6 +122,13 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.SolemnStrike, DefaultSolemnStrike);
}
private int ZwCount = 0;
public override void OnNewTurn()
{
ZwCount = 0;
}
public override bool OnSelectHand()
{
return false;
......@@ -139,35 +146,41 @@ namespace WindBot.Game.AI.Decks
public override IList<ClientCard> OnSelectXyzMaterial(IList<ClientCard> cards, int min, int max)
{
IList<ClientCard> result = AI.Utils.SelectPreferredCards(new[] {
IList<ClientCard> result = Util.SelectPreferredCards(new[] {
CardId.StarDrawing,
CardId.SolarWindJammer,
CardId.Goblindbergh
}, cards, min, max);
return AI.Utils.CheckSelectCount(result, cards, min, max);
return Util.CheckSelectCount(result, cards, min, max);
}
private bool Number39Utopia()
{
if (!AI.Utils.HasChainedTrap(0) && Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Card.HasXyzMaterial(2))
if (!Util.HasChainedTrap(0) && Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Card.HasXyzMaterial(2))
return true;
return false;
}
private bool Number61Volcasaurus()
{
return AI.Utils.IsOneEnemyBetterThanValue(2000, false);
return Util.IsOneEnemyBetterThanValue(2000, false);
}
private bool ZwLionArms()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.ZwLionArms, 0))
if (ActivateDescription == Util.GetStringId(CardId.ZwLionArms, 0))
return true;
if (ActivateDescription == AI.Utils.GetStringId(CardId.ZwLionArms, 1))
return !Card.IsDisabled();
if (ActivateDescription == Util.GetStringId(CardId.ZwLionArms, 1))
return !Card.IsDisabled() && ZwWeapon();
return false;
}
private bool ZwWeapon()
{
ZwCount++;
return ZwCount < 10;
}
private bool ReinforcementOfTheArmy()
{
AI.SelectCard(
......@@ -234,7 +247,7 @@ namespace WindBot.Game.AI.Decks
private bool KagetokageEffect()
{
var lastChainCard = AI.Utils.GetLastChainCard();
var lastChainCard = Util.GetLastChainCard();
if (lastChainCard == null) return true;
return !lastChainCard.IsCode(CardId.Goblindbergh, CardId.TinGoldfish);
}
......
......@@ -157,7 +157,7 @@ namespace WindBot.Game.AI.Decks
|| Duel.Phase == DuelPhase.Damage))
return false;
return Duel.Player==0
|| AI.Utils.IsOneEnemyBetter();
|| Util.IsOneEnemyBetter();
}
return true;
}
......@@ -419,7 +419,7 @@ namespace WindBot.Game.AI.Decks
private bool RatpierMaterialEffect()
{
if (ActivateDescription == AI.Utils.GetStringId(CardId.Ratpier, 1))
if (ActivateDescription == Util.GetStringId(CardId.Ratpier, 1))
{
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
......@@ -479,7 +479,7 @@ namespace WindBot.Game.AI.Decks
{
if (Duel.LastChainPlayer == 0)
return false;
ClientCard target = AI.Utils.GetBestEnemyCard(true);
ClientCard target = Util.GetBestEnemyCard(true);
if (target == null)
return false;
AI.SelectCard(
......
......@@ -43,6 +43,7 @@ namespace WindBot.Game.AI
public const int NumberS39UtopiaTheLightning = 56832966;
public const int Number39Utopia = 84013237;
public const int UltimayaTzolkin = 1686814;
public const int MekkKnightCrusadiaAstram = 21887175;
public const int MoonMirrorShield = 19508728;
public const int PhantomKnightsFogBlade = 25542642;
......@@ -58,6 +59,8 @@ namespace WindBot.Game.AI
public const int GhostOgreAndSnowRabbit = 59438930;
public const int GhostBelle = 73642296;
public const int EffectVeiler = 63845230;
public const int ArtifactLancea = 34267821;
public const int CalledByTheGrave = 24224830;
public const int InfiniteImpermanence = 10045474;
public const int GalaxySoldier = 46659709;
......@@ -148,6 +151,9 @@ namespace WindBot.Game.AI
if (!defender.IsDisabled())
{
if (defender.IsCode(_CardId.MekkKnightCrusadiaAstram) && defender.IsAttack() && attacker.IsSpecialSummoned)
return false;
if (defender.IsCode(_CardId.CrystalWingSynchroDragon) && defender.IsAttack() && attacker.Level >= 5)
return false;
......@@ -179,6 +185,9 @@ namespace WindBot.Game.AI
}
}
if (Enemy.HasInMonstersZone(_CardId.MekkKnightCrusadiaAstram, true) && !(defender).IsCode(_CardId.MekkKnightCrusadiaAstram))
return false;
if (Enemy.HasInMonstersZone(_CardId.DupeFrog, true) && !(defender).IsCode(_CardId.DupeFrog))
return false;
......@@ -216,7 +225,7 @@ namespace WindBot.Game.AI
if (Bot.BattlingMonster == null)
return false;
List<ClientCard> defenders = new List<ClientCard>(Duel.Fields[1].GetMonsters());
defenders.Sort(AIFunctions.CompareDefensePower);
defenders.Sort(CardContainer.CompareDefensePower);
defenders.Reverse();
BattlePhaseAction result = OnSelectAttackTarget(Bot.BattlingMonster, defenders);
if (result != null && result.Action == BattlePhaseAction.BattleAction.Attack)
......@@ -252,7 +261,7 @@ namespace WindBot.Game.AI
if (Duel.Player == 0)
selected = spells.FirstOrDefault(card => card.IsFacedown());
if (Duel.Player == 1)
selected = spells.FirstOrDefault(card => card.HasType(CardType.Continuous) || card.HasType(CardType.Equip));
selected = spells.FirstOrDefault(card => card.HasType(CardType.Continuous) || card.HasType(CardType.Equip) || card.HasType(CardType.Field));
}
if (selected == null)
......@@ -285,7 +294,7 @@ namespace WindBot.Game.AI
if (Card.Location == CardLocation.Grave)
{
selected = AI.Utils.GetBestEnemySpell(true);
selected = Util.GetBestEnemySpell(true);
}
else
{
......@@ -304,7 +313,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultBookOfMoon()
{
if (AI.Utils.IsAllEnemyBetter(true))
if (Util.IsAllEnemyBetter(true))
{
ClientCard monster = Enemy.GetMonsters().GetHighestAttackMonster(true);
if (monster != null && monster.HasType(CardType.Effect) && !monster.HasType(CardType.Link) && (monster.HasType(CardType.Xyz) || monster.Level > 4))
......@@ -321,15 +330,15 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultCompulsoryEvacuationDevice()
{
ClientCard target = AI.Utils.GetProblematicEnemyMonster(0, true);
ClientCard target = Util.GetProblematicEnemyMonster(0, true);
if (target != null)
{
AI.SelectCard(target);
return true;
}
if (AI.Utils.IsChainTarget(Card))
if (Util.IsChainTarget(Card))
{
ClientCard monster = AI.Utils.GetBestEnemyMonster(false, true);
ClientCard monster = Util.GetBestEnemyMonster(false, true);
if (monster != null)
{
AI.SelectCard(monster);
......@@ -344,9 +353,9 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultCallOfTheHaunted()
{
if (!AI.Utils.IsAllEnemyBetter(true))
if (!Util.IsAllEnemyBetter(true))
return false;
ClientCard selected = Bot.Graveyard.OrderByDescending(card => card.Attack).FirstOrDefault();
ClientCard selected = Bot.Graveyard.GetMatchingCards(card => card.IsCanRevive()).OrderByDescending(card => card.Attack).FirstOrDefault();
AI.SelectCard(selected);
return true;
}
......@@ -370,7 +379,7 @@ namespace WindBot.Game.AI
_CardId.UltimateAncientGearGolem,
_CardId.RedDragonArchfiend
}, true)) return false;
if (AI.Utils.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints) return true;
if (Util.GetTotalAttackingMonsterAttack(1) >= Bot.LifePoints) return true;
}
return false;
}
......@@ -391,7 +400,7 @@ namespace WindBot.Game.AI
_CardId.UpstartGoblin,
_CardId.CyberEmergency
};
if (AI.Utils.GetLastChainCard().IsCode(ignoreList))
if (Util.GetLastChainCard().IsCode(ignoreList))
return false;
return Duel.LastChainPlayer == 1;
}
......@@ -400,7 +409,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultGhostOgreAndSnowRabbit()
{
if (AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().IsDisabled())
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsDisabled())
return false;
return DefaultTrap();
}
......@@ -416,8 +425,8 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultEffectVeiler()
{
if (AI.Utils.GetLastChainCard() != null && AI.Utils.GetLastChainCard().IsCode(_CardId.GalaxySoldier) && Enemy.Hand.Count >= 3) return false;
if (AI.Utils.ChainContainsCard(_CardId.EffectVeiler))
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(_CardId.GalaxySoldier) && Enemy.Hand.Count >= 3) return false;
if (Util.ChainContainsCard(_CardId.EffectVeiler))
return false;
return DefaultBreakthroughSkill();
}
......@@ -432,13 +441,15 @@ namespace WindBot.Game.AI
_CardId.LockBird,
_CardId.GhostOgreAndSnowRabbit,
_CardId.AshBlossom,
_CardId.GhostBelle
_CardId.GhostBelle,
_CardId.EffectVeiler,
_CardId.ArtifactLancea
};
if (Duel.LastChainPlayer == 1)
{
foreach (int id in targetList)
{
if (AI.Utils.GetLastChainCard().IsCode(id))
if (Util.GetLastChainCard().IsCode(id))
{
AI.SelectCard(id);
return UniqueFaceupSpell();
......@@ -453,7 +464,9 @@ namespace WindBot.Game.AI
protected bool DefaultInfiniteImpermanence()
{
// TODO: disable s & t
return DefaultBreakthroughSkill();
if (!DefaultUniqueTrap())
return false;
return DefaultDisableMonster();
}
/// <summary>
/// Chain the enemy monster, or disable monster like Rescue Rabbit.
......@@ -462,7 +475,13 @@ namespace WindBot.Game.AI
{
if (!DefaultUniqueTrap())
return false;
return DefaultDisableMonster();
}
/// <summary>
/// Chain the enemy monster, or disable monster like Rescue Rabbit.
/// </summary>
protected bool DefaultDisableMonster()
{
if (Duel.Player == 1)
{
ClientCard target = Enemy.MonsterZone.GetShouldBeDisabledBeforeItUseEffectMonster();
......@@ -473,7 +492,7 @@ namespace WindBot.Game.AI
}
}
ClientCard LastChainCard = AI.Utils.GetLastChainCard();
ClientCard LastChainCard = Util.GetLastChainCard();
if (LastChainCard != null && LastChainCard.Controller == 1 && LastChainCard.Location == CardLocation.MonsterZone &&
!LastChainCard.IsDisabled() && !LastChainCard.IsShouldNotBeTarget() && !LastChainCard.IsShouldNotBeSpellTrapTarget())
......@@ -506,7 +525,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultSolemnJudgment()
{
return !AI.Utils.IsChainTargetOnly(Card) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && DefaultTrap();
return !Util.IsChainTargetOnly(Card) && !(Duel.Player == 0 && Duel.LastChainPlayer == -1) && DefaultTrap();
}
/// <summary>
......@@ -530,7 +549,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultTorrentialTribute()
{
return !AI.Utils.HasChainedTrap(0) && AI.Utils.IsAllEnemyBetter(true);
return !Util.HasChainedTrap(0) && Util.IsAllEnemyBetter(true);
}
/// <summary>
......@@ -554,7 +573,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultHammerShot()
{
return AI.Utils.IsOneEnemyBetter(true);
return Util.IsOneEnemyBetter(true);
}
/// <summary>
......@@ -562,7 +581,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultDarkHole()
{
return AI.Utils.IsOneEnemyBetter();
return Util.IsOneEnemyBetter();
}
/// <summary>
......@@ -570,7 +589,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultRaigeki()
{
return AI.Utils.IsOneEnemyBetter();
return Util.IsOneEnemyBetter();
}
/// <summary>
......@@ -578,7 +597,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultSmashingGround()
{
return AI.Utils.IsOneEnemyBetter();
return Util.IsOneEnemyBetter();
}
/// <summary>
......@@ -639,7 +658,7 @@ namespace WindBot.Game.AI
(4000 - Card.Defense) * 2 > (4000 - Card.Attack))
return true;
bool enemyBetter = AI.Utils.IsAllEnemyBetter(true);
bool enemyBetter = Util.IsAllEnemyBetter(true);
if (Card.IsAttack() && enemyBetter)
return true;
if (Card.IsDefense() && !enemyBetter && Card.Attack >= Card.Defense)
......@@ -677,7 +696,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultOnBecomeTarget()
{
if (AI.Utils.IsChainTarget(Card)) return true;
if (Util.IsChainTarget(Card)) return true;
int[] destroyAllList =
{
_CardId.EvilswarmExcitonKnight,
......@@ -691,7 +710,7 @@ namespace WindBot.Game.AI
_CardId.DarkMagicAttack
};
if (AI.Utils.ChainContainsCard(destroyAllList)) return true;
if (Util.ChainContainsCard(destroyAllList)) return true;
if (Enemy.HasInSpellZone(destroyAllOpponentList, true)) return true;
// TODO: ChainContainsCard(id, player)
return false;
......@@ -709,7 +728,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultUniqueTrap()
{
if (AI.Utils.HasChainedTrap(0))
if (Util.HasChainedTrap(0))
return false;
return UniqueFaceupSpell();
......@@ -750,9 +769,9 @@ namespace WindBot.Game.AI
return false;
if (Bot.LifePoints <= 1000)
return false;
if (Bot.LifePoints <= Enemy.LifePoints && ActivateDescription == AI.Utils.GetStringId(_CardId.ChickenGame, 0))
if (Bot.LifePoints <= Enemy.LifePoints && ActivateDescription == Util.GetStringId(_CardId.ChickenGame, 0))
return true;
if (Bot.LifePoints > Enemy.LifePoints && ActivateDescription == AI.Utils.GetStringId(_CardId.ChickenGame, 1))
if (Bot.LifePoints > Enemy.LifePoints && ActivateDescription == Util.GetStringId(_CardId.ChickenGame, 1))
return true;
return false;
}
......@@ -819,7 +838,7 @@ namespace WindBot.Game.AI
return true;
}
}
ClientCard lastchaincard = AI.Utils.GetLastChainCard();
ClientCard lastchaincard = Util.GetLastChainCard();
if (Duel.LastChainPlayer == 1 && lastchaincard != null && !lastchaincard.IsDisabled())
{
if (lastchaincard.HasType(CardType.Ritual))
......@@ -848,7 +867,7 @@ namespace WindBot.Game.AI
return true;
}
}
if (AI.Utils.IsChainTarget(Card))
if (Util.IsChainTarget(Card))
{
AI.SelectOption(XYZ);
return true;
......@@ -933,7 +952,7 @@ namespace WindBot.Game.AI
AI.SelectCard(card);
return true;
}
card = AI.Utils.GetOneEnemyBetterThanValue(Card.GetDefensePower());
card = Util.GetOneEnemyBetterThanValue(Card.GetDefensePower());
if (card != null)
{
AI.SelectCard(card);
......@@ -947,8 +966,8 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultNumberS39UtopiaTheLightningSummon()
{
int bestBotAttack = AI.Utils.GetBestAttack(Bot);
return AI.Utils.IsOneEnemyBetterThanValue(bestBotAttack, false);
int bestBotAttack = Util.GetBestAttack(Bot);
return Util.IsOneEnemyBetterThanValue(bestBotAttack, false);
}
/// <summary>
......@@ -991,9 +1010,9 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultStardustDragonSummon()
{
int selfBestAttack = AI.Utils.GetBestAttack(Bot);
int oppoBestAttack = AI.Utils.GetBestPower(Enemy);
return (selfBestAttack <= oppoBestAttack && oppoBestAttack <= 2500) || AI.Utils.IsTurn1OrMain2();
int selfBestAttack = Util.GetBestAttack(Bot);
int oppoBestAttack = Util.GetBestPower(Enemy);
return (selfBestAttack <= oppoBestAttack && oppoBestAttack <= 2500) || Util.IsTurn1OrMain2();
}
/// <summary>
......@@ -1009,7 +1028,7 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultCastelTheSkyblasterMusketeerSummon()
{
return AI.Utils.GetProblematicEnemyCard() != null;
return Util.GetProblematicEnemyCard() != null;
}
/// <summary>
......@@ -1017,9 +1036,9 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultCastelTheSkyblasterMusketeerEffect()
{
if (ActivateDescription == AI.Utils.GetStringId(_CardId.CastelTheSkyblasterMusketeer, 0))
if (ActivateDescription == Util.GetStringId(_CardId.CastelTheSkyblasterMusketeer, 0))
return false;
ClientCard target = AI.Utils.GetProblematicEnemyCard();
ClientCard target = Util.GetProblematicEnemyCard();
if (target != null)
{
AI.SelectCard(0);
......@@ -1034,8 +1053,8 @@ namespace WindBot.Game.AI
/// </summary>
protected bool DefaultScarlightRedDragonArchfiendSummon()
{
int selfBestAttack = AI.Utils.GetBestAttack(Bot);
int oppoBestAttack = AI.Utils.GetBestPower(Enemy);
int selfBestAttack = Util.GetBestAttack(Bot);
int oppoBestAttack = Util.GetBestPower(Enemy);
return (selfBestAttack <= oppoBestAttack && oppoBestAttack <= 3000) || DefaultScarlightRedDragonArchfiendEffect();
}
......@@ -1061,7 +1080,7 @@ namespace WindBot.Game.AI
|| ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Defense) && (Bot.BattlingMonster.Attack + Enemy.BattlingMonster.Attack > Enemy.BattlingMonster.Defense)));
}
if (AI.Utils.IsTurn1OrMain2() && HonestEffectCount <= 5)
if (Util.IsTurn1OrMain2() && HonestEffectCount <= 5)
{
HonestEffectCount++;
return true;
......
......@@ -22,5 +22,6 @@
EaterOfMillions = 63845230,
ElShaddollConstruct = 20366274,
ZushintheSleepingGiant = 67547370,
Heart_eartHDragon = 97403510,
}
}
......@@ -80,6 +80,7 @@
CyberDragonInfinity = 10443957,
ImperialCustom = 9995766,
InspectorBoarder = 15397015,
Mashoudou = 76375976
Mashoudou = 76375976,
EternalSoul = 48680970
}
}
......@@ -14,6 +14,7 @@ namespace WindBot.Game.AI
public Duel Duel { get; private set; }
public IList<CardExecutor> Executors { get; private set; }
public GameAI AI { get; private set; }
public AIUtil Util { get; private set; }
protected MainPhase Main { get; private set; }
protected BattlePhase Battle { get; private set; }
......@@ -29,6 +30,7 @@ namespace WindBot.Game.AI
{
Duel = duel;
AI = ai;
Util = new AIUtil(duel);
Executors = new List<CardExecutor>();
Bot = Duel.Fields[0];
......@@ -168,7 +170,7 @@ namespace WindBot.Game.AI
return -1;
}
public virtual int OnSelectPlace(int cardId, int player, int location, int available)
public virtual int OnSelectPlace(int cardId, int player, CardLocation location, int available)
{
// For overriding
return 0;
......
......@@ -34,6 +34,7 @@ namespace WindBot.Game
public int Owner { get; private set; }
public int Controller { get; private set; }
public int Disabled { get; private set; }
public int ProcCompleted { get; private set; }
public int SelectSeq { get; set; }
public int OpParam1 { get; set; }
public int OpParam2 { get; set; }
......@@ -145,7 +146,10 @@ namespace WindBot.Game
Owner = duel.GetLocalPlayer(packet.ReadInt32());
if ((flag & (int)Query.Status) != 0) {
int status = packet.ReadInt32();
Disabled = status & 0x0001;
const int STATUS_DISABLED = 0x0001;
const int STATUS_PROC_COMPLETE = 0x0008;
Disabled = status & STATUS_DISABLED;
ProcCompleted = status & STATUS_PROC_COMPLETE;
}
if ((flag & (int)Query.LScale) != 0)
LScale = packet.ReadInt32();
......@@ -312,6 +316,11 @@ namespace WindBot.Game
return Disabled != 0;
}
public bool IsCanRevive()
{
return ProcCompleted != 0 || !(IsExtraCard() || HasType(CardType.Ritual) || HasType(CardType.SpSummon));
}
public bool IsCode(int id)
{
return Id == id || Alias != 0 && Alias == id;
......
......@@ -150,12 +150,17 @@ namespace WindBot.Game
public List<ClientCard> GetMonstersInExtraZone()
{
return GetMonsters().Where((card, i) => i >= 5).ToList();
return GetMonsters().Where(card => card.Sequence >= 5).ToList();
}
public List<ClientCard> GetMonstersInMainZone()
{
return GetMonsters().Where((card, i) => i < 5).ToList();
return GetMonsters().Where(card => card.Sequence < 5).ToList();
}
public ClientCard GetFieldSpellCard()
{
return SpellZone[5];
}
public bool HasInHand(int cardId)
......
......@@ -10,7 +10,6 @@ namespace WindBot.Game
public GameClient Game { get; private set; }
public Duel Duel { get; private set; }
public Executor Executor { get; set; }
public AIFunctions Utils { get; private set; }
private Dialogs _dialogs;
......@@ -18,7 +17,6 @@ namespace WindBot.Game
{
Game = game;
Duel = duel;
Utils = new AIFunctions(duel);
_dialogs = new Dialogs(game);
}
......@@ -165,11 +163,11 @@ namespace WindBot.Game
// Sort the attackers and defenders, make monster with higher attack go first.
List<ClientCard> attackers = new List<ClientCard>(battle.AttackableCards);
attackers.Sort(AIFunctions.CompareCardAttack);
attackers.Sort(CardContainer.CompareCardAttack);
attackers.Reverse();
List<ClientCard> defenders = new List<ClientCard>(Duel.Fields[1].GetMonsters());
defenders.Sort(AIFunctions.CompareDefensePower);
defenders.Sort(CardContainer.CompareDefensePower);
defenders.Reverse();
// Let executor decide which card should attack first.
......@@ -373,7 +371,7 @@ namespace WindBot.Game
{
foreach (CardExecutor exec in Executor.Executors)
{
if (ShouldExecute(exec, card, ExecutorType.Activate))
if (ShouldExecute(exec, card, ExecutorType.Activate, desc))
return true;
}
return false;
......@@ -440,7 +438,7 @@ namespace WindBot.Game
}
if (ShouldExecute(exec, card, ExecutorType.SummonOrSet))
{
if (Utils.IsAllEnemyBetter(true) && Utils.IsAllEnemyBetterThanValue(card.Attack + 300, false) &&
if (Executor.Util.IsAllEnemyBetter(true) && Executor.Util.IsAllEnemyBetterThanValue(card.Attack + 300, false) &&
main.MonsterSetableCards.Contains(card))
{
_dialogs.SendSetMonster();
......@@ -481,7 +479,7 @@ namespace WindBot.Game
return 0; // Always select the first option.
}
public int OnSelectPlace(int cardId, int player, int location, int available)
public int OnSelectPlace(int cardId, int player, CardLocation location, int available)
{
int selector_selected = m_place;
m_place = 0;
......@@ -702,7 +700,7 @@ namespace WindBot.Game
// Always choose the minimum and lowest atk.
List<ClientCard> sorted = new List<ClientCard>();
sorted.AddRange(cards);
sorted.Sort(AIFunctions.CompareCardAttack);
sorted.Sort(CardContainer.CompareCardAttack);
IList<ClientCard> selected = new List<ClientCard>();
......
......@@ -514,6 +514,12 @@ namespace WindBot.Game
_duel.Fields[1].BattlingMonster = null;
_duel.Fields[0].UnderAttack = false;
_duel.Fields[1].UnderAttack = false;
List<ClientCard> monsters = _duel.Fields[0].GetMonsters();
foreach (ClientCard monster in monsters)
{
monster.Attacked = false;
}
_select_hint = 0;
_ai.OnNewPhase();
}
......@@ -990,7 +996,6 @@ namespace WindBot.Game
}
IList<ClientCard> selected = func(cards, (finishable ? 0 : 1), 1, _select_hint, cancelable);
_select_hint = 0;
if (selected.Count == 0 && cancelable)
{
......@@ -1123,6 +1128,14 @@ namespace WindBot.Game
packet.ReadByte();
int desc = packet.ReadInt32();
if (desc == 0 || desc == 221)
{
// 0: phase trigger effect
// 221: trigger effect
// for compatibility
desc = -1;
}
ClientCard card = _duel.GetCard(player, loc, seq);
if (card == null)
{
......@@ -1218,48 +1231,44 @@ namespace WindBot.Game
packet.ReadByte(); // min
int field = ~packet.ReadInt32();
const int LOCATION_MZONE = 0x4;
const int LOCATION_SZONE = 0x8;
const int LOCATION_PZONE = 0x200;
int player;
int location;
CardLocation location;
int filter;
if ((field & 0x7f) != 0)
{
player = 0;
location = LOCATION_MZONE;
location = CardLocation.MonsterZone;
filter = field & Zones.MonsterZones;
}
else if ((field & 0x1f00) != 0)
{
player = 0;
location = LOCATION_SZONE;
location = CardLocation.SpellZone;
filter = (field >> 8) & Zones.SpellZones;
}
else if ((field & 0xc000) != 0)
{
player = 0;
location = LOCATION_PZONE;
location = CardLocation.PendulumZone;
filter = (field >> 14) & Zones.PendulumZones;
}
else if ((field & 0x7f0000) != 0)
{
player = 1;
location = LOCATION_MZONE;
location = CardLocation.MonsterZone;
filter = (field >> 16) & Zones.MonsterZones;
}
else if ((field & 0x1f000000) != 0)
{
player = 1;
location = LOCATION_SZONE;
location = CardLocation.SpellZone;
filter = (field >> 24) & Zones.SpellZones;
}
else
{
player = 1;
location = LOCATION_PZONE;
location = CardLocation.PendulumZone;
filter = (field >> 30) & Zones.PendulumZones;
}
......@@ -1269,7 +1278,7 @@ namespace WindBot.Game
byte[] resp = new byte[3];
resp[0] = (byte)GetLocalPlayer(player);
if (location != LOCATION_PZONE)
if (location != CardLocation.PendulumZone)
{
resp[1] = (byte)location;
if ((selected & filter) > 0)
......@@ -1285,7 +1294,7 @@ namespace WindBot.Game
}
else
{
resp[1] = (byte)LOCATION_SZONE;
resp[1] = (byte)CardLocation.SpellZone;
if ((selected & filter) > 0)
filter &= selected;
......
......@@ -59,7 +59,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Config.cs" />
<Compile Include="Game\AI\AIFunctions.cs" />
<Compile Include="Game\AI\AIUtil.cs" />
<Compile Include="Game\AI\CardContainer.cs" />
<Compile Include="Game\AI\CardExecutor.cs" />
<Compile Include="Game\AI\CardExtension.cs" />
......@@ -68,8 +68,10 @@
<Compile Include="Game\AI\DecksManager.cs" />
<Compile Include="Game\AI\Decks\AltergeistExecutor.cs" />
<Compile Include="Game\AI\Decks\BlackwingExecutor.cs" />
<Compile Include="Game\AI\Decks\SalamangreatExecutor.cs" />
<Compile Include="Game\AI\Decks\CyberDragonExecutor.cs" />
<Compile Include="Game\AI\Decks\DarkMagicianExecutor.cs" />
<Compile Include="Game\AI\Decks\OrcustExecutor.cs" />
<Compile Include="Game\AI\Decks\SkyStrikerExecutor.cs" />
<Compile Include="Game\AI\Decks\MokeyMokeyKingExecutor.cs" />
<Compile Include="Game\AI\Decks\MokeyMokeyExecutor.cs" />
......
......@@ -110,6 +110,16 @@
"deck": "DarkMagician",
"dialog": "ayane.zh-CN"
},
{
"name": "彩音",
"deck": "Orcust",
"dialog": "ayane.zh-CN"
},
{
"name": "朱露咲浅羽",
"deck": "Salamangreat",
"dialog": "nlch1.zh-CN"
},
{
"name": "永远之魂",
"deck": "Burn",
......
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