Commit f2d7219b authored by mercury233's avatar mercury233

Merge branch 'master' of https://github.com/IceYGO/windbot

parents e6a8cac1 a927ee30
...@@ -2,27 +2,32 @@ ...@@ -2,27 +2,32 @@
# !name # !name
# command # command
# description # description
# flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE, SUPPORT_MASTER_RULE_2020) # flags (avail flags: SUPPORT_MASTER_RULE_3, SUPPORT_NEW_MASTER_RULE, SUPPORT_MASTER_RULE_2020, SELECT_DECKFILE)
!随机-非常简单 !随机-非常简单
Random=AI_LV1 Random=AI_LV1
主要是一些沙包。 主要是一些沙包。
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 SUPPORT_MASTER_RULE_2020
!随机-简单 !随机-简单
Random=AI_LV2 Random=AI_LV2
一些比较弱的卡组。 一些比较弱的卡组。
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 SUPPORT_MASTER_RULE_2020
!随机-普通 !随机-普通
Random=AI_LV3 Random=AI_LV3
一些环境里可以看到的卡组。 一些环境里可以看到的卡组。
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 SUPPORT_MASTER_RULE_2020
!随机-报社 !随机-报社
Random=AI_ANTI_META Random=AI_ANTI_META
一些报复社会(针对主流卡组的弱点)的卡组。 一些报复社会(针对主流卡组的弱点)的卡组。
SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 SUPPORT_MASTER_RULE_2020
!P2-自选卡组
Name=P2 Deck=Lucky Dialog=gugugu.zh-CN
人机卡组由你选择。随缘出牌。可将你的卡组文件(.ydk)复制到WindBot的对应文件夹。
SELECT_DECKFILE SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!悠悠 !悠悠
Name=悠悠 Deck=MokeyMokey Dialog=mokey.zh-CN Name=悠悠 Deck=MokeyMokey Dialog=mokey.zh-CN
...@@ -47,17 +52,17 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 ...@@ -47,17 +52,17 @@ AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-R5 !谜之剑士LV4-R5
Name=谜之剑士LV4 Deck='Rank V' Dialog=swordsman.zh-CN Name=谜之剑士LV4 Deck='Rank V' Dialog=swordsman.zh-CN
5阶超量卡组。 5阶超量卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!谜之剑士LV4-异热同心武器 !谜之剑士LV4-异热同心武器
Name=谜之剑士LV4 Deck='Zexal Weapons' Dialog=swordsman.zh-CN Name=谜之剑士LV4 Deck='Zexal Weapons' Dialog=swordsman.zh-CN
神装电光皇卡组。 神装电光皇卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!琪露诺-彩虹 !琪露诺-彩虹
Name=琪露诺 Deck=Rainbow Dialog=cirno.zh-CN Name=琪露诺 Deck=Rainbow Dialog=cirno.zh-CN
全属性凡骨卡组。 全属性凡骨卡组。
AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV2 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!琪露诺-饼蛙 !琪露诺-饼蛙
Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN Name=琪露诺 Deck='Toadally Awesome' Dialog=cirno.zh-CN
...@@ -67,7 +72,7 @@ SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020 ...@@ -67,7 +72,7 @@ SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!复制植物-青眼 !复制植物-青眼
Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN Name=复制植物 Deck=Blue-Eyes Dialog=copy.zh-CN
青眼卡组。 青眼卡组。
AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020 AI_LV3 SUPPORT_MASTER_RULE_3 SUPPORT_MASTER_RULE_2020
!复制植物-十二兽 !复制植物-十二兽
Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN Name=复制植物 Deck=Zoodiac Dialog=copy.zh-CN
......
{
"welcome": [
"大家好我是新人",
"游戏王是怎么玩来着?",
"还好我不玩游戏王"
],
"deckerror": [
"卡组里{0}鸽了"
],
"duelstart": [
"不想干活怎么办",
"智商欠费不想干活怎么办"
],
"newturn": [
"好多可怕的新卡啊",
"这游戏好难玩",
"so lazy cant move"
],
"endturn": [
"搞得我只能鸽了",
"不是在此时,不知在何时",
"too hot need ice cream"
],
"directattack": [
"听起来很鸽",
"老鸽,稳"
],
"attack": [
"听起来不是很鸽",
"可怕"
],
"ondirectattack": [
"哇!",
"这么可怕的吗",
"听起来非常鸽",
"承受不住"
],
"facedownmonstername": "鸽子",
"activate": [
"不明觉鸽",
"鸽了,爽"
],
"summon": [
"可怕",
"不关我事",
"那还是不关我事",
"鸽了,爽"
],
"setmonster": [
"摸鱼中,不想更新",
"那还是鸽置吧"
],
"chaining": [
"那是什么",
"但我鸽了",
"无此服务",
"可怕"
]
}
...@@ -11,7 +11,9 @@ namespace WindBot.Game.AI ...@@ -11,7 +11,9 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
public static bool IsMonsterInvincible(this ClientCard card) public static bool IsMonsterInvincible(this ClientCard card)
{ {
return !card.IsDisabled() && Enum.IsDefined(typeof(InvincibleMonster), card.Id); return !card.IsDisabled() &&
(card.Controller == 0 && Enum.IsDefined(typeof(InvincibleBotMonster), card.Id) ||
card.Controller == 1 && Enum.IsDefined(typeof(InvincibleEnemyMonster), card.Id));
} }
/// <summary> /// <summary>
......
...@@ -2742,8 +2742,6 @@ namespace WindBot.Game.AI.Decks ...@@ -2742,8 +2742,6 @@ namespace WindBot.Game.AI.Decks
public override IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable) public override IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable)
{ {
int HIINT_TOGRAVE = 504;
if (max == 1 && cards[0].Location == CardLocation.Deck if (max == 1 && cards[0].Location == CardLocation.Deck
&& Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(23002292) && Bot.GetRemainingCount(CardId.WakingtheDragon,1) > 0) && Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(23002292) && Bot.GetRemainingCount(CardId.WakingtheDragon,1) > 0)
{ {
...@@ -2764,7 +2762,7 @@ namespace WindBot.Game.AI.Decks ...@@ -2764,7 +2762,7 @@ namespace WindBot.Game.AI.Decks
Logger.DebugWriteLine("EvenlyMatched: min=" + min.ToString() + ", max=" + max.ToString()); Logger.DebugWriteLine("EvenlyMatched: min=" + min.ToString() + ", max=" + max.ToString());
} }
else if (cards[0].Location == CardLocation.Hand && cards[cards.Count - 1].Location == CardLocation.Hand else if (cards[0].Location == CardLocation.Hand && cards[cards.Count - 1].Location == CardLocation.Hand
&& (hint == 501 || hint == HIINT_TOGRAVE) && min == max) && (hint == HintMsg.Discard || hint == HintMsg.ToGrave) && min == max)
{ {
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.OneForOne)) return null; if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.OneForOne)) return null;
Logger.DebugWriteLine("Hand drop except OneForOne"); Logger.DebugWriteLine("Hand drop except OneForOne");
......
...@@ -20,7 +20,7 @@ namespace WindBot.Game.AI.Decks ...@@ -20,7 +20,7 @@ namespace WindBot.Game.AI.Decks
{ {
AddExecutor(ExecutorType.SpSummon); AddExecutor(ExecutorType.SpSummon);
AddExecutor(ExecutorType.Activate, DefaultDontChainMyself); AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
AddExecutor(ExecutorType.SummonOrSet); AddExecutor(ExecutorType.SummonOrSet, DefaultMonsterSummon);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.SpellSet); AddExecutor(ExecutorType.SpellSet);
} }
......
using YGOSharp.OCGWrapper; using YGOSharp.OCGWrapper;
using YGOSharp.OCGWrapper.Enums; using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic; using System.Collections.Generic;
using WindBot; using WindBot;
using WindBot.Game; using WindBot.Game;
using WindBot.Game.AI; using WindBot.Game.AI;
using System.Linq; using System.Linq;
namespace WindBot.Game.AI.Decks namespace WindBot.Game.AI.Decks
{ {
[Deck("FamiliarPossessed", "AI_FamiliarPossessed")] [Deck("FamiliarPossessed", "AI_FamiliarPossessed")]
public class FamiliarPossessedExecutor : DefaultExecutor public class FamiliarPossessedExecutor : DefaultExecutor
{ {
public class CardId public class CardId
{ {
public const int MetalSnake = 71197066; public const int MetalSnake = 71197066;
public const int InspectBoarder = 15397015; public const int InspectBoarder = 15397015;
public const int AshBlossomAndJoyousSpring = 14558127; public const int AshBlossomAndJoyousSpring = 14558127;
public const int GrenMajuDaEizo = 36584821; public const int GrenMajuDaEizo = 36584821;
public const int MaxxC = 23434538; public const int MaxxC = 23434538;
public const int Aussa = 31887906; public const int Aussa = 31887906;
...@@ -27,31 +27,31 @@ namespace WindBot.Game.AI.Decks ...@@ -27,31 +27,31 @@ namespace WindBot.Game.AI.Decks
public const int Awakening = 62256492; public const int Awakening = 62256492;
public const int Unpossessed = 25704359; public const int Unpossessed = 25704359;
public const int NaturalExterio = 99916754; public const int NaturalExterio = 99916754;
public const int NaturalBeast = 33198837; public const int NaturalBeast = 33198837;
public const int SwordsmanLV7 = 37267041; public const int SwordsmanLV7 = 37267041;
public const int RoyalDecreel = 51452091; public const int RoyalDecreel = 51452091;
public const int HarpieFeatherDuster = 18144506; public const int HarpieFeatherDuster = 18144506;
public const int PotOfDesires = 35261759; public const int PotOfDesires = 35261759;
public const int PotofExtravagance = 49238328; public const int PotofExtravagance = 49238328;
public const int Scapegoat = 73915051; public const int Scapegoat = 73915051;
public const int MacroCosmos = 30241314; public const int MacroCosmos = 30241314;
public const int Crackdown = 36975314; public const int Crackdown = 36975314;
public const int ImperialOrder = 61740673; public const int ImperialOrder = 61740673;
public const int SolemnWarning = 84749824; public const int SolemnWarning = 84749824;
public const int SolemStrike = 40605147; public const int SolemStrike = 40605147;
public const int SolemnJudgment = 41420027; public const int SolemnJudgment = 41420027;
public const int SkillDrain = 82732705; public const int SkillDrain = 82732705;
public const int Mistake = 59305593; public const int Mistake = 59305593;
public const int BorreloadDragon = 31833038; public const int BorreloadDragon = 31833038;
public const int BirrelswordDragon = 85289965; public const int BirrelswordDragon = 85289965;
public const int KnightmareGryphon = 65330383; public const int KnightmareGryphon = 65330383;
public const int KnightmareUnicorn = 38342335; public const int KnightmareUnicorn = 38342335;
public const int KnightmarePhoenix = 2857636; public const int KnightmarePhoenix = 2857636;
public const int KnightmareCerberus = 75452921; public const int KnightmareCerberus = 75452921;
public const int LinkSpider = 98978921; public const int LinkSpider = 98978921;
public const int Linkuriboh = 41999284; public const int Linkuriboh = 41999284;
public const int GagagaCowboy = 12014404; public const int GagagaCowboy = 12014404;
...@@ -61,569 +61,569 @@ namespace WindBot.Game.AI.Decks ...@@ -61,569 +61,569 @@ namespace WindBot.Game.AI.Decks
public const int HiitaP = 48815792; public const int HiitaP = 48815792;
public const int LynaP = 9839945; public const int LynaP = 9839945;
} }
public FamiliarPossessedExecutor(GameAI ai, Duel duel) public FamiliarPossessedExecutor(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
{ {
// do first // do first
AddExecutor(ExecutorType.Activate, CardId.PotofExtravagance, PotofExtravaganceActivate); AddExecutor(ExecutorType.Activate, CardId.PotofExtravagance, PotofExtravaganceActivate);
// burn if enemy's LP is below 800 // burn if enemy's LP is below 800
AddExecutor(ExecutorType.SpSummon, CardId.GagagaCowboy, GagagaCowboySummon); AddExecutor(ExecutorType.SpSummon, CardId.GagagaCowboy, GagagaCowboySummon);
AddExecutor(ExecutorType.Activate, CardId.GagagaCowboy); AddExecutor(ExecutorType.Activate, CardId.GagagaCowboy);
//Sticker //Sticker
AddExecutor(ExecutorType.Activate, CardId.MacroCosmos, MacroCosmoseff); AddExecutor(ExecutorType.Activate, CardId.MacroCosmos, MacroCosmoseff);
//counter //counter
AddExecutor(ExecutorType.Activate, CardId.AshBlossomAndJoyousSpring, DefaultAshBlossomAndJoyousSpring); AddExecutor(ExecutorType.Activate, CardId.AshBlossomAndJoyousSpring, DefaultAshBlossomAndJoyousSpring);
AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC); AddExecutor(ExecutorType.Activate, CardId.MaxxC, DefaultMaxxC);
AddExecutor(ExecutorType.Activate, CardId.SolemnWarning, DefaultSolemnWarning); AddExecutor(ExecutorType.Activate, CardId.SolemnWarning, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, CardId.SolemStrike, DefaultSolemnStrike); AddExecutor(ExecutorType.Activate, CardId.SolemStrike, DefaultSolemnStrike);
AddExecutor(ExecutorType.Activate, CardId.ImperialOrder, ImperialOrderfirst); AddExecutor(ExecutorType.Activate, CardId.ImperialOrder, ImperialOrderfirst);
AddExecutor(ExecutorType.Activate, CardId.ImperialOrder, ImperialOrdereff); AddExecutor(ExecutorType.Activate, CardId.ImperialOrder, ImperialOrdereff);
AddExecutor(ExecutorType.Activate, CardId.SolemnJudgment, DefaultSolemnJudgment); AddExecutor(ExecutorType.Activate, CardId.SolemnJudgment, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, CardId.SkillDrain, SkillDrainEffect); AddExecutor(ExecutorType.Activate, CardId.SkillDrain, SkillDrainEffect);
AddExecutor(ExecutorType.Activate, CardId.Mistake, DefaultUniqueTrap); AddExecutor(ExecutorType.Activate, CardId.Mistake, DefaultUniqueTrap);
AddExecutor(ExecutorType.Activate, CardId.Awakening); AddExecutor(ExecutorType.Activate, CardId.Awakening);
AddExecutor(ExecutorType.Activate, CardId.Unpossessed, UnpossessedEffect); AddExecutor(ExecutorType.Activate, CardId.Unpossessed, UnpossessedEffect);
//first do //first do
AddExecutor(ExecutorType.Activate, CardId.HarpieFeatherDuster, DefaultHarpiesFeatherDusterFirst); AddExecutor(ExecutorType.Activate, CardId.HarpieFeatherDuster, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, CardId.PotOfDesires, PotOfDesireseff); AddExecutor(ExecutorType.Activate, CardId.PotOfDesires, PotOfDesireseff);
//sp //sp
AddExecutor(ExecutorType.Activate, CardId.Linkuriboh, Linkuriboheff); AddExecutor(ExecutorType.Activate, CardId.Linkuriboh, Linkuriboheff);
AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, Linkuribohsp); AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, Linkuribohsp);
AddExecutor(ExecutorType.SpSummon, CardId.KnightmareCerberus, Knightmaresp); AddExecutor(ExecutorType.SpSummon, CardId.KnightmareCerberus, Knightmaresp);
AddExecutor(ExecutorType.SpSummon, CardId.KnightmarePhoenix, Knightmaresp); AddExecutor(ExecutorType.SpSummon, CardId.KnightmarePhoenix, Knightmaresp);
AddExecutor(ExecutorType.SpSummon, CardId.AussaP, AussaPsp); AddExecutor(ExecutorType.SpSummon, CardId.AussaP, AussaPsp);
AddExecutor(ExecutorType.Activate, CardId.AussaP, AussaPeff); AddExecutor(ExecutorType.Activate, CardId.AussaP, AussaPeff);
AddExecutor(ExecutorType.SpSummon, CardId.EriaP, EriaPsp); AddExecutor(ExecutorType.SpSummon, CardId.EriaP, EriaPsp);
AddExecutor(ExecutorType.Activate, CardId.EriaP, EriaPeff); AddExecutor(ExecutorType.Activate, CardId.EriaP, EriaPeff);
AddExecutor(ExecutorType.SpSummon, CardId.WynnP, WynnPsp); AddExecutor(ExecutorType.SpSummon, CardId.WynnP, WynnPsp);
AddExecutor(ExecutorType.Activate, CardId.WynnP, WynnPeff); AddExecutor(ExecutorType.Activate, CardId.WynnP, WynnPeff);
AddExecutor(ExecutorType.SpSummon, CardId.HiitaP, HiitaPsp); AddExecutor(ExecutorType.SpSummon, CardId.HiitaP, HiitaPsp);
AddExecutor(ExecutorType.Activate, CardId.HiitaP, HiitaPeff); AddExecutor(ExecutorType.Activate, CardId.HiitaP, HiitaPeff);
AddExecutor(ExecutorType.SpSummon, CardId.LynaP, LynaPsp); AddExecutor(ExecutorType.SpSummon, CardId.LynaP, LynaPsp);
AddExecutor(ExecutorType.Activate, CardId.LynaP, LynaPeff); AddExecutor(ExecutorType.Activate, CardId.LynaP, LynaPeff);
AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, Linkuribohsp); AddExecutor(ExecutorType.SpSummon, CardId.Linkuriboh, Linkuribohsp);
AddExecutor(ExecutorType.SpSummon, CardId.LinkSpider); AddExecutor(ExecutorType.SpSummon, CardId.LinkSpider);
AddExecutor(ExecutorType.SpSummon, CardId.BorreloadDragon, BorreloadDragonsp); AddExecutor(ExecutorType.SpSummon, CardId.BorreloadDragon, BorreloadDragonsp);
AddExecutor(ExecutorType.Activate, CardId.BorreloadDragon, BorreloadDragoneff); AddExecutor(ExecutorType.Activate, CardId.BorreloadDragon, BorreloadDragoneff);
AddExecutor(ExecutorType.SpSummon, CardId.BirrelswordDragon, BirrelswordDragonsp); AddExecutor(ExecutorType.SpSummon, CardId.BirrelswordDragon, BirrelswordDragonsp);
AddExecutor(ExecutorType.Activate, CardId.BirrelswordDragon, BirrelswordDragoneff); AddExecutor(ExecutorType.Activate, CardId.BirrelswordDragon, BirrelswordDragoneff);
// normal summon // normal summon
AddExecutor(ExecutorType.Summon, CardId.InspectBoarder, InspectBoardersummon); AddExecutor(ExecutorType.Summon, CardId.InspectBoarder, InspectBoardersummon);
AddExecutor(ExecutorType.Summon, CardId.GrenMajuDaEizo, GrenMajuDaEizosummon); AddExecutor(ExecutorType.Summon, CardId.GrenMajuDaEizo, GrenMajuDaEizosummon);
AddExecutor(ExecutorType.SpSummon, CardId.BorreloadDragon, BorreloadDragonspsecond); AddExecutor(ExecutorType.SpSummon, CardId.BorreloadDragon, BorreloadDragonspsecond);
AddExecutor(ExecutorType.Summon, CardId.Aussa, FamiliarPossessedsummon); AddExecutor(ExecutorType.Summon, CardId.Aussa, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Summon, CardId.Eria, FamiliarPossessedsummon); AddExecutor(ExecutorType.Summon, CardId.Eria, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Summon, CardId.Wynn, FamiliarPossessedsummon); AddExecutor(ExecutorType.Summon, CardId.Wynn, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Summon, CardId.Hiita, FamiliarPossessedsummon); AddExecutor(ExecutorType.Summon, CardId.Hiita, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Summon, CardId.Lyna, FamiliarPossessedsummon); AddExecutor(ExecutorType.Summon, CardId.Lyna, FamiliarPossessedsummon);
AddExecutor(ExecutorType.Activate, CardId.MetalSnake, MetalSnakesp); AddExecutor(ExecutorType.Activate, CardId.MetalSnake, MetalSnakesp);
AddExecutor(ExecutorType.Activate, CardId.MetalSnake, MetalSnakeeff); AddExecutor(ExecutorType.Activate, CardId.MetalSnake, MetalSnakeeff);
//spell //spell
AddExecutor(ExecutorType.Activate, CardId.Crackdown, Crackdowneff); AddExecutor(ExecutorType.Activate, CardId.Crackdown, Crackdowneff);
AddExecutor(ExecutorType.Activate, CardId.Scapegoat, DefaultScapegoat); AddExecutor(ExecutorType.Activate, CardId.Scapegoat, DefaultScapegoat);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos); AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
//set //set
AddExecutor(ExecutorType.SpellSet, SpellSet); AddExecutor(ExecutorType.SpellSet, SpellSet);
} }
public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List<int> avoid_list = null) public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List<int> avoid_list = null)
{ {
List<int> list = new List<int> { 0, 1, 2, 3, 4 }; List<int> list = new List<int> { 0, 1, 2, 3, 4 };
int n = list.Count; int n = list.Count;
while (n-- > 1) while (n-- > 1)
{ {
int index = Program.Rand.Next(n + 1); int index = Program.Rand.Next(n + 1);
int temp = list[index]; int temp = list[index];
list[index] = list[n]; list[index] = list[n];
list[n] = temp; list[n] = temp;
} }
foreach (int seq in list) foreach (int seq in list)
{ {
int zone = (int)System.Math.Pow(2, seq); int zone = (int)System.Math.Pow(2, seq);
if (Bot.SpellZone[seq] == null) if (Bot.SpellZone[seq] == null)
{ {
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence) continue; if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence) continue;
if (avoid_list != null && avoid_list.Contains(seq)) continue; if (avoid_list != null && avoid_list.Contains(seq)) continue;
AI.SelectPlace(zone); AI.SelectPlace(zone);
return; return;
}; };
} }
AI.SelectPlace(0); AI.SelectPlace(0);
} }
public bool SpellNegatable(bool isCounter = false, ClientCard target = null) public bool SpellNegatable(bool isCounter = false, ClientCard target = null)
{ {
// target default set // target default set
if (target == null) target = Card; if (target == null) target = Card;
// won't negate if not on field // won't negate if not on field
if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false;
// negate judge // negate judge
if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true;
if (target.IsSpell()) if (target.IsSpell())
{ {
if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true; if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true;
if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true; if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true;
if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true; if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true;
} }
if (target.IsTrap()) if (target.IsTrap())
{ {
if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return true; if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return true;
} }
// how to get here? // how to get here?
return false; return false;
} }
private bool MacroCosmoseff() private bool MacroCosmoseff()
{ {
return (Duel.LastChainPlayer == 1 || Duel.LastSummonPlayer == 1 || Duel.Player == 0) && UniqueFaceupSpell(); return (Duel.LastChainPlayer == 1 || Duel.LastSummonPlayer == 1 || Duel.Player == 0) && UniqueFaceupSpell();
} }
private bool ImperialOrderfirst() private bool ImperialOrderfirst()
{ {
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.PotOfDesires)) if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.PotOfDesires))
return false; return false;
return DefaultOnBecomeTarget() && Util.GetLastChainCard().HasType(CardType.Spell); return DefaultOnBecomeTarget() && Util.GetLastChainCard().HasType(CardType.Spell);
} }
private bool ImperialOrdereff() private bool ImperialOrdereff()
{ {
if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.PotOfDesires)) if (Util.GetLastChainCard() != null && Util.GetLastChainCard().IsCode(CardId.PotOfDesires))
return false; return false;
if (Duel.LastChainPlayer == 1) if (Duel.LastChainPlayer == 1)
{ {
foreach (ClientCard check in Enemy.GetSpells()) foreach (ClientCard check in Enemy.GetSpells())
{ {
if (Util.GetLastChainCard() == check) if (Util.GetLastChainCard() == check)
return true; return true;
} }
} }
return false; return false;
} }
private bool PotOfDesireseff() private bool PotOfDesireseff()
{ {
return Bot.Deck.Count > 14 && !DefaultSpellWillBeNegated(); return Bot.Deck.Count > 14 && !DefaultSpellWillBeNegated();
} }
// activate of PotofExtravagance // activate of PotofExtravagance
public bool PotofExtravaganceActivate() public bool PotofExtravaganceActivate()
{ {
// won't activate if it'll be negate // won't activate if it'll be negate
if (SpellNegatable()) return false; if (SpellNegatable()) return false;
SelectSTPlace(Card, true); SelectSTPlace(Card, true);
AI.SelectOption(1); AI.SelectOption(1);
return true; return true;
} }
private bool Crackdowneff() private bool Crackdowneff()
{ {
if (Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack) if (Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack)
AI.SelectCard(Util.GetOneEnemyBetterThanMyBest(true, true)); AI.SelectCard(Util.GetOneEnemyBetterThanMyBest(true, true));
return Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack; return Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack;
} }
private bool SkillDrainEffect() private bool SkillDrainEffect()
{ {
return (Bot.LifePoints > 1000) && DefaultUniqueTrap(); return (Bot.LifePoints > 1000) && DefaultUniqueTrap();
} }
private bool UnpossessedEffect() private bool UnpossessedEffect()
{ {
AI.SelectCard(new List<int>() { AI.SelectCard(new List<int>() {
CardId.Lyna, CardId.Lyna,
CardId.Hiita, CardId.Hiita,
CardId.Wynn, CardId.Wynn,
CardId.Eria, CardId.Eria,
CardId.Aussa CardId.Aussa
}); });
return true; return true;
} }
private bool InspectBoardersummon() private bool InspectBoardersummon()
{ {
if (Bot.MonsterZone[0] == null) if (Bot.MonsterZone[0] == null)
AI.SelectPlace(Zones.z0); AI.SelectPlace(Zones.z0);
else else
AI.SelectPlace(Zones.z4); AI.SelectPlace(Zones.z4);
return true; return true;
} }
private bool GrenMajuDaEizosummon() private bool GrenMajuDaEizosummon()
{ {
if (Duel.Turn == 1) return false; if (Duel.Turn == 1) return false;
if (Bot.HasInSpellZone(CardId.SkillDrain) || Enemy.HasInSpellZone(CardId.SkillDrain)) return false; if (Bot.HasInSpellZone(CardId.SkillDrain) || Enemy.HasInSpellZone(CardId.SkillDrain)) return false;
if (Bot.MonsterZone[0] == null) if (Bot.MonsterZone[0] == null)
AI.SelectPlace(Zones.z0); AI.SelectPlace(Zones.z0);
else else
AI.SelectPlace(Zones.z4); AI.SelectPlace(Zones.z4);
return Bot.Banished.Count >= 6; return Bot.Banished.Count >= 6;
} }
private bool FamiliarPossessedsummon() private bool FamiliarPossessedsummon()
{ {
if (Bot.MonsterZone[0] == null) if (Bot.MonsterZone[0] == null)
AI.SelectPlace(Zones.z0); AI.SelectPlace(Zones.z0);
else else
AI.SelectPlace(Zones.z4); AI.SelectPlace(Zones.z4);
return true; return true;
} }
private bool BorreloadDragonsp() private bool BorreloadDragonsp()
{ {
if (!(Bot.HasInMonstersZone(new[] { CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP }))) return false; if (!(Bot.HasInMonstersZone(new[] { CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP }))) return false;
IList<ClientCard> material_list = new List<ClientCard>(); IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters()) foreach (ClientCard monster in Bot.GetMonsters())
{ {
if (monster.IsCode(CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LinkSpider, CardId.Linkuriboh)) if (monster.IsCode(CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LinkSpider, CardId.Linkuriboh))
material_list.Add(monster); material_list.Add(monster);
if (material_list.Count == 3) break; if (material_list.Count == 3) break;
} }
if (material_list.Count >= 3) if (material_list.Count >= 3)
{ {
AI.SelectMaterials(material_list); AI.SelectMaterials(material_list);
return true; return true;
} }
return false; return false;
} }
private bool BorreloadDragonspsecond() private bool BorreloadDragonspsecond()
{ {
if (!(Bot.HasInMonstersZone(new[] { CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP }))) return false; if (!(Bot.HasInMonstersZone(new[] { CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP }))) return false;
IList<ClientCard> material_list = new List<ClientCard>(); IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters()) foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.IsCode(CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LinkSpider, CardId.Linkuriboh))
material_list.Add(monster);
if (material_list.Count == 3) break;
}
if (material_list.Count >= 3)
{
AI.SelectMaterials(material_list);
return true;
}
return false;
}
public bool BorreloadDragoneff()
{
if (ActivateDescription == -1 && (Duel.Phase == DuelPhase.BattleStart || Duel.Phase == DuelPhase.End))
{
ClientCard enemy_monster = Enemy.BattlingMonster;
if (enemy_monster != null && enemy_monster.HasPosition(CardPosition.Attack))
{
return (Card.Attack - enemy_monster.Attack < Enemy.LifePoints);
}
return 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;
if (BestEnemy.Attack >= WorstBot.RealPower)
{
AI.SelectCard(BestEnemy);
return true;
}
return false;
}
private bool BirrelswordDragonsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard m in Bot.GetMonsters())
{
if (m.IsCode(CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP))
{
material_list.Add(m);
break;
}
}
foreach (ClientCard m in Bot.GetMonsters())
{
if (m.IsCode(CardId.Linkuriboh) || m.Level == 1)
{
material_list.Add(m);
if (material_list.Count == 3)
break;
}
}
if (material_list.Count == 3)
{
AI.SelectMaterials(material_list);
return true;
}
return false;
}
private bool BirrelswordDragoneff()
{
if (ActivateDescription == Util.GetStringId(CardId.BirrelswordDragon, 0))
{ {
if (Util.IsChainTarget(Card) && Util.GetBestEnemyMonster(true, true) != null) if (monster.IsCode(CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LinkSpider, CardId.Linkuriboh))
{ material_list.Add(monster);
AI.SelectCard(Util.GetBestEnemyMonster(true, true)); if (material_list.Count == 3) break;
return true;
}
if (Duel.Player == 1 && Bot.BattlingMonster == Card)
{
AI.SelectCard(Enemy.BattlingMonster);
return true;
}
if (Duel.Player == 1 && Bot.BattlingMonster != null &&
(Enemy.BattlingMonster.Attack - Bot.BattlingMonster.Attack) >= Bot.LifePoints)
{
AI.SelectCard(Enemy.BattlingMonster);
return true;
}
if (Duel.Player == 0 && Duel.Phase == DuelPhase.BattleStart)
{
foreach (ClientCard check in Enemy.GetMonsters())
{
if (check.IsAttack())
{
AI.SelectCard(check);
return true;
}
}
}
return false;
}
return true;
}
private bool MetalSnakesp()
{
if (ActivateDescription == Util.GetStringId(CardId.MetalSnake, 0) && !Bot.HasInMonstersZone(CardId.MetalSnake))
{
if (Duel.Player == 1 && Duel.Phase >= DuelPhase.BattleStart)
return Bot.Deck.Count >= 12;
if (Duel.Player == 0 && Duel.Phase >= DuelPhase.Main1)
return Bot.Deck.Count >= 12;
} }
return false; if (material_list.Count >= 3)
} {
AI.SelectMaterials(material_list);
private bool MetalSnakeeff() return true;
{ }
ClientCard target = Util.GetOneEnemyBetterThanMyBest(true, true); return false;
if (ActivateDescription == Util.GetStringId(CardId.MetalSnake, 1) && target != null) }
{ public bool BorreloadDragoneff()
AI.SelectCard(new[] {
if (ActivateDescription == -1 && (Duel.Phase == DuelPhase.BattleStart || Duel.Phase == DuelPhase.End))
{
ClientCard enemy_monster = Enemy.BattlingMonster;
if (enemy_monster != null && enemy_monster.HasPosition(CardPosition.Attack))
{
return (Card.Attack - enemy_monster.Attack < Enemy.LifePoints);
}
return 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;
if (BestEnemy.Attack >= WorstBot.RealPower)
{
AI.SelectCard(BestEnemy);
return true;
}
return false;
}
private bool BirrelswordDragonsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard m in Bot.GetMonsters())
{
if (m.IsCode(CardId.KnightmareCerberus, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP))
{
material_list.Add(m);
break;
}
}
foreach (ClientCard m in Bot.GetMonsters())
{
if (m.IsCode(CardId.Linkuriboh) || m.Level == 1)
{
material_list.Add(m);
if (material_list.Count == 3)
break;
}
}
if (material_list.Count == 3)
{
AI.SelectMaterials(material_list);
return true;
}
return false;
}
private bool BirrelswordDragoneff()
{
if (ActivateDescription == Util.GetStringId(CardId.BirrelswordDragon, 0))
{
if (Util.IsChainTarget(Card) && Util.GetBestEnemyMonster(true, true) != null)
{
AI.SelectCard(Util.GetBestEnemyMonster(true, true));
return true;
}
if (Duel.Player == 1 && Bot.BattlingMonster == Card)
{
AI.SelectCard(Enemy.BattlingMonster);
return true;
}
if (Duel.Player == 1 && Bot.BattlingMonster != null &&
(Enemy.BattlingMonster.Attack - Bot.BattlingMonster.Attack) >= Bot.LifePoints)
{
AI.SelectCard(Enemy.BattlingMonster);
return true;
}
if (Duel.Player == 0 && Duel.Phase == DuelPhase.BattleStart)
{
foreach (ClientCard check in Enemy.GetMonsters())
{
if (check.IsAttack())
{
AI.SelectCard(check);
return true;
}
}
}
return false;
}
return true;
}
private bool MetalSnakesp()
{
if (ActivateDescription == Util.GetStringId(CardId.MetalSnake, 0) && !Bot.HasInMonstersZone(CardId.MetalSnake))
{
if (Duel.Player == 1 && Duel.Phase >= DuelPhase.BattleStart)
return Bot.Deck.Count >= 12;
if (Duel.Player == 0 && Duel.Phase >= DuelPhase.Main1)
return Bot.Deck.Count >= 12;
}
return false;
}
private bool MetalSnakeeff()
{
ClientCard target = Util.GetOneEnemyBetterThanMyBest(true, true);
if (ActivateDescription == Util.GetStringId(CardId.MetalSnake, 1) && target != null)
{
AI.SelectCard(new[]
{ {
CardId.LynaP, CardId.LynaP,
CardId.HiitaP, CardId.HiitaP,
CardId.WynnP, CardId.WynnP,
CardId.EriaP, CardId.EriaP,
CardId.KnightmareGryphon CardId.KnightmareGryphon
}); });
AI.SelectNextCard(target); AI.SelectNextCard(target);
return true; return true;
} }
return false; return false;
} }
private bool AussaPsp() private bool AussaPsp()
{ {
IList<ClientCard> material_list = new List<ClientCard>(); IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters()) foreach (ClientCard monster in Bot.GetMonsters())
{ {
if (monster.HasAttribute(CardAttribute.Earth) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon)) if (monster.HasAttribute(CardAttribute.Earth) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster); material_list.Add(monster);
if (material_list.Count == 2) break; if (material_list.Count == 2) break;
} }
if (material_list.Count < 2) return false; if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.AussaP)) return false; if (Bot.HasInMonstersZone(CardId.AussaP)) return false;
AI.SelectMaterials(material_list); AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null) if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5); AI.SelectPlace(Zones.z5);
else else
AI.SelectPlace(Zones.z6); AI.SelectPlace(Zones.z6);
return true; return true;
} }
private bool AussaPeff() private bool AussaPeff()
{ {
AI.SelectCard(CardId.MaxxC, CardId.Aussa); AI.SelectCard(CardId.MaxxC, CardId.Aussa);
return true; return true;
} }
private bool EriaPsp() private bool EriaPsp()
{ {
IList<ClientCard> material_list = new List<ClientCard>(); IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters()) foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Water) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.EriaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool EriaPeff()
{
AI.SelectCard(CardId.Eria);
return true;
}
private bool WynnPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Wind) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.WynnP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool WynnPeff()
{
AI.SelectCard(CardId.Wynn);
return true;
}
private bool HiitaPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Fire) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.HiitaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool HiitaPeff()
{
AI.SelectCard(CardId.Hiita);
return true;
}
private bool LynaPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Light) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.LynaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool LynaPeff()
{
AI.SelectCard(CardId.Lyna);
return true;
}
private bool Linkuribohsp()
{
foreach (ClientCard c in Bot.GetMonsters())
{ {
if (c.Level == 1) if (monster.HasAttribute(CardAttribute.Water) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
{ material_list.Add(monster);
AI.SelectMaterials(c); if (material_list.Count == 2) break;
return true; }
} if (material_list.Count < 2) return false;
} if (Bot.HasInMonstersZone(CardId.EriaP)) return false;
return false; AI.SelectMaterials(material_list);
} if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
private bool Knightmaresp() else
{ AI.SelectPlace(Zones.z6);
int[] firstMats = new[] { return true;
CardId.KnightmareCerberus, }
CardId.KnightmarePhoenix
}; private bool EriaPeff()
if (Bot.MonsterZone.GetMatchingCardsCount(card => card.IsCode(firstMats)) >= 1) return false; {
foreach (ClientCard c in Bot.GetMonsters()) AI.SelectCard(CardId.Eria);
{ return true;
if (c.Level == 1) }
{
AI.SelectMaterials(c); private bool WynnPsp()
return true; {
} IList<ClientCard> material_list = new List<ClientCard>();
} foreach (ClientCard monster in Bot.GetMonsters())
return false; {
} if (monster.HasAttribute(CardAttribute.Wind) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
private bool Linkuriboheff() material_list.Add(monster);
{ if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.WynnP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool WynnPeff()
{
AI.SelectCard(CardId.Wynn);
return true;
}
private bool HiitaPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Fire) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.HiitaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool HiitaPeff()
{
AI.SelectCard(CardId.Hiita);
return true;
}
private bool LynaPsp()
{
IList<ClientCard> material_list = new List<ClientCard>();
foreach (ClientCard monster in Bot.GetMonsters())
{
if (monster.HasAttribute(CardAttribute.Light) && !monster.IsCode(CardId.KnightmareCerberus, CardId.InspectBoarder, CardId.GrenMajuDaEizo, CardId.KnightmarePhoenix, CardId.LynaP, CardId.HiitaP, CardId.WynnP, CardId.EriaP, CardId.AussaP, CardId.KnightmareUnicorn, CardId.KnightmareGryphon, CardId.BorreloadDragon, CardId.BirrelswordDragon))
material_list.Add(monster);
if (material_list.Count == 2) break;
}
if (material_list.Count < 2) return false;
if (Bot.HasInMonstersZone(CardId.LynaP)) return false;
AI.SelectMaterials(material_list);
if (Bot.MonsterZone[0] == null && Bot.MonsterZone[2] == null && Bot.MonsterZone[5] == null)
AI.SelectPlace(Zones.z5);
else
AI.SelectPlace(Zones.z6);
return true;
}
private bool LynaPeff()
{
AI.SelectCard(CardId.Lyna);
return true;
}
private bool Linkuribohsp()
{
foreach (ClientCard c in Bot.GetMonsters())
{
if (c.Level == 1)
{
AI.SelectMaterials(c);
return true;
}
}
return false;
}
private bool Knightmaresp()
{
int[] firstMats = new[] {
CardId.KnightmareCerberus,
CardId.KnightmarePhoenix
};
if (Bot.MonsterZone.GetMatchingCardsCount(card => card.IsCode(firstMats)) >= 1) return false;
foreach (ClientCard c in Bot.GetMonsters())
{
if (c.Level == 1)
{
AI.SelectMaterials(c);
return true;
}
}
return false;
}
private bool Linkuriboheff()
{
if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false; if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Linkuriboh)) return false;
return true; return true;
} }
private bool GagagaCowboySummon() private bool GagagaCowboySummon()
{ {
if (Enemy.LifePoints <= 800 || (Bot.GetMonsterCount() >= 4 && Enemy.LifePoints <= 1600)) if (Enemy.LifePoints <= 800 || (Bot.GetMonsterCount() >= 4 && Enemy.LifePoints <= 1600))
{ {
AI.SelectPosition(CardPosition.FaceUpDefence); AI.SelectPosition(CardPosition.FaceUpDefence);
return true; return true;
} }
return false; return false;
} }
private bool SpellSet() private bool SpellSet()
{ {
if (Card.IsCode(CardId.MacroCosmos) && Bot.HasInSpellZone(CardId.MacroCosmos)) return false; if (Card.IsCode(CardId.MacroCosmos) && Bot.HasInSpellZone(CardId.MacroCosmos)) return false;
if (Card.IsCode(CardId.Unpossessed) && Bot.HasInSpellZone(CardId.Unpossessed)) return false; if (Card.IsCode(CardId.Unpossessed) && Bot.HasInSpellZone(CardId.Unpossessed)) return false;
if (Card.IsCode(CardId.Crackdown) && Bot.HasInSpellZone(CardId.Crackdown)) return false; if (Card.IsCode(CardId.Crackdown) && Bot.HasInSpellZone(CardId.Crackdown)) return false;
if (Card.IsCode(CardId.SkillDrain) && Bot.HasInSpellZone(CardId.SkillDrain)) return false; if (Card.IsCode(CardId.SkillDrain) && Bot.HasInSpellZone(CardId.SkillDrain)) return false;
if (Card.IsCode(CardId.Mistake) && Bot.HasInSpellZone(CardId.Mistake)) return false; if (Card.IsCode(CardId.Mistake) && Bot.HasInSpellZone(CardId.Mistake)) return false;
if (Card.IsCode(CardId.Scapegoat)) if (Card.IsCode(CardId.Scapegoat))
return true; return true;
if (Card.HasType(CardType.Trap)) if (Card.HasType(CardType.Trap))
return Bot.GetSpellCountWithoutField() < 4; return Bot.GetSpellCountWithoutField() < 4;
return false; return false;
} }
public override ClientCard OnSelectAttacker(IList<ClientCard> attackers, IList<ClientCard> defenders) public override ClientCard OnSelectAttacker(IList<ClientCard> attackers, IList<ClientCard> defenders)
{ {
for (int i = 0; i < attackers.Count; ++i) for (int i = 0; i < attackers.Count; ++i)
{ {
ClientCard attacker = attackers[i]; ClientCard attacker = attackers[i];
if (attacker.IsCode(CardId.BirrelswordDragon, CardId.BorreloadDragon)) return attacker; if (attacker.IsCode(CardId.BirrelswordDragon, CardId.BorreloadDragon)) return attacker;
} }
return null; return null;
} }
public override bool OnSelectHand() public override bool OnSelectHand()
{ {
return true; return true;
} }
} }
} }
\ No newline at end of file
...@@ -83,18 +83,10 @@ namespace WindBot.Game.AI.Decks ...@@ -83,18 +83,10 @@ namespace WindBot.Game.AI.Decks
private int m_swapFrogSummoned; private int m_swapFrogSummoned;
private int m_flipFlopFrogSummoned; private int m_flipFlopFrogSummoned;
private int m_treebornFrogCount = 0;
public override void OnNewTurn()
{
m_treebornFrogCount = 0;
base.OnNewTurn();
}
private bool TreebornFrog() private bool TreebornFrog()
{ {
m_treebornFrogCount++; return true;
return m_treebornFrogCount <= 5;
} }
private bool SwapFrogSummon() private bool SwapFrogSummon()
......
...@@ -56,7 +56,7 @@ namespace WindBot.Game.AI.Decks ...@@ -56,7 +56,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, MonsterReborn); AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, MonsterReborn);
AddExecutor(ExecutorType.Summon, CardId.WhiteNightDragon, WhiteNightDragon); AddExecutor(ExecutorType.Summon, CardId.WhiteNightDragon, WhiteNightDragon);
AddExecutor(ExecutorType.Summon, CardId.HorusTheBlackFlameDragonLv6, DefaultTributeSummon); AddExecutor(ExecutorType.Summon, CardId.HorusTheBlackFlameDragonLv6, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.AlexandriteDragon); AddExecutor(ExecutorType.Summon, CardId.AlexandriteDragon);
AddExecutor(ExecutorType.SummonOrSet, CardId.AxeDragonute); AddExecutor(ExecutorType.SummonOrSet, CardId.AxeDragonute);
AddExecutor(ExecutorType.SummonOrSet, CardId.DodgerDragon); AddExecutor(ExecutorType.SummonOrSet, CardId.DodgerDragon);
...@@ -157,7 +157,7 @@ namespace WindBot.Game.AI.Decks ...@@ -157,7 +157,7 @@ namespace WindBot.Game.AI.Decks
if (card.IsCode(11224103)) if (card.IsCode(11224103))
return false; return false;
return DefaultTributeSummon(); return DefaultMonsterSummon();
} }
private bool HorusTheBlackFlameDragonLv8() private bool HorusTheBlackFlameDragonLv8()
......
...@@ -184,7 +184,6 @@ namespace WindBot.Game.AI.Decks ...@@ -184,7 +184,6 @@ namespace WindBot.Game.AI.Decks
private bool JetSynchronUsed = false; private bool JetSynchronUsed = false;
private bool ScrapWyvernUsed = false; private bool ScrapWyvernUsed = false;
private bool MaskedChameleonUsed = false; private bool MaskedChameleonUsed = false;
private int ShootingRiserDragonCount = 0;
private int[] HandCosts = new[] private int[] HandCosts = new[]
{ {
...@@ -218,7 +217,6 @@ namespace WindBot.Game.AI.Decks ...@@ -218,7 +217,6 @@ namespace WindBot.Game.AI.Decks
JetSynchronUsed = false; JetSynchronUsed = false;
ScrapWyvernUsed = false; ScrapWyvernUsed = false;
MaskedChameleonUsed = false; MaskedChameleonUsed = false;
ShootingRiserDragonCount = 0;
} }
public override void OnChainEnd() public override void OnChainEnd()
...@@ -845,9 +843,8 @@ namespace WindBot.Game.AI.Decks ...@@ -845,9 +843,8 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
if (Duel.LastChainPlayer == 0 || ShootingRiserDragonCount >= 10) if (Duel.LastChainPlayer == 0)
return false; return false;
ShootingRiserDragonCount++;
AI.SelectCard(new[] { AI.SelectCard(new[] {
CardId.BlackRoseMoonlightDragon, CardId.BlackRoseMoonlightDragon,
CardId.ScrapDragon, CardId.ScrapDragon,
......
using YGOSharp.OCGWrapper.Enums; using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic; using System.Collections.Generic;
using WindBot; using WindBot;
using WindBot.Game; using WindBot.Game;
using WindBot.Game.AI; using WindBot.Game.AI;
namespace WindBot.Game.AI.Decks namespace WindBot.Game.AI.Decks
{ {
[Deck("LightswornShaddoldinosour", "AI_LightswornShaddoldinosour")] [Deck("LightswornShaddoldinosour", "AI_LightswornShaddoldinosour")]
public class LightswornShaddoldinosour : DefaultExecutor public class LightswornShaddoldinosour : DefaultExecutor
{ {
public class CardId public class CardId
{ {
//monster //monster
public const int UltimateConductorTytanno = 18940556; public const int UltimateConductorTytanno = 18940556;
public const int DogorantheMadFlameKaiju = 93332803; public const int DogorantheMadFlameKaiju = 93332803;
public const int GamecieltheSeaTurtleKaiju = 55063751; public const int GamecieltheSeaTurtleKaiju = 55063751;
public const int RadiantheMultidimensionalKaiju = 28674152; public const int RadiantheMultidimensionalKaiju = 28674152;
public const int OvertexCoatls = 41782653; public const int OvertexCoatls = 41782653;
public const int ShaddollBeast = 3717252; public const int ShaddollBeast = 3717252;
public const int GiantRex = 80280944; public const int GiantRex = 80280944;
public const int ShaddollDragon = 77723643; public const int ShaddollDragon = 77723643;
public const int FairyTailSnow = 55623480; public const int FairyTailSnow = 55623480;
public const int KeeperOfDragonicMagic = 48048590; public const int KeeperOfDragonicMagic = 48048590;
public const int ShaddollSquamata = 30328508; public const int ShaddollSquamata = 30328508;
public const int SouleatingOviraptor = 44335251; public const int SouleatingOviraptor = 44335251;
public const int Raiden = 77558536; public const int Raiden = 77558536;
public const int Lumina = 95503687; public const int Lumina = 95503687;
public const int ShaddollHedgehog = 4939890; public const int ShaddollHedgehog = 4939890;
public const int AshBlossom = 14558127; public const int AshBlossom = 14558127;
public const int GhostOgre = 59438930; public const int GhostOgre = 59438930;
public const int ShaddollFalco = 37445295; public const int ShaddollFalco = 37445295;
public const int MaxxC = 23434538; public const int MaxxC = 23434538;
public const int PlaguespreaderZombie = 33420078; public const int PlaguespreaderZombie = 33420078;
public const int GlowUpBulb = 67441435; public const int GlowUpBulb = 67441435;
//spell //spell
public const int AllureofDarkness = 1475311; public const int AllureofDarkness = 1475311;
public const int ThatGrassLooksgreener = 11110587; public const int ThatGrassLooksgreener = 11110587;
public const int HarpiesFeatherDuster = 18144506; public const int HarpiesFeatherDuster = 18144506;
public const int DoubleEvolutionPill = 38179121; public const int DoubleEvolutionPill = 38179121;
public const int ShaddollFusion = 44394295; public const int ShaddollFusion = 44394295;
public const int PotOfAvarice = 67169062; public const int PotOfAvarice = 67169062;
public const int FoolishBurial = 81439173; public const int FoolishBurial = 81439173;
public const int MonsterReborn = 83764718; public const int MonsterReborn = 83764718;
public const int ChargeOfTheLightBrigade = 94886282; public const int ChargeOfTheLightBrigade = 94886282;
public const int InterruptedKaijuSlumber = 99330325; public const int InterruptedKaijuSlumber = 99330325;
//public const int ElShaddollFusion = 6417578; //public const int ElShaddollFusion = 6417578;
//trap //trap
public const int infiniteTransience = 10045474; public const int infiniteTransience = 10045474;
public const int LostWind = 74003290; public const int LostWind = 74003290;
public const int SinisterShadowGames = 77505534; public const int SinisterShadowGames = 77505534;
public const int ShaddollCore = 4904633; public const int ShaddollCore = 4904633;
//extra //extra
public const int ElShaddollShekhinaga = 74822425; public const int ElShaddollShekhinaga = 74822425;
public const int ElShaddollConstruct = 20366274; public const int ElShaddollConstruct = 20366274;
public const int ElShaddollGrysra = 48424886; public const int ElShaddollGrysra = 48424886;
public const int ElShaddollWinda = 94977269; public const int ElShaddollWinda = 94977269;
public const int CrystalWingSynchroDragon = 50954680; public const int CrystalWingSynchroDragon = 50954680;
public const int ScarlightRedDragon = 80666118; public const int ScarlightRedDragon = 80666118;
public const int Michael = 4779823; public const int Michael = 4779823;
public const int BlackRoseMoonlightDragon = 33698022; public const int BlackRoseMoonlightDragon = 33698022;
public const int RedWyvern = 76547525; public const int RedWyvern = 76547525;
public const int CoralDragon = 42566602; public const int CoralDragon = 42566602;
public const int TG_WonderMagician = 98558751; public const int TG_WonderMagician = 98558751;
public const int MinervaTheExalte = 30100551; public const int MinervaTheExalte = 30100551;
public const int Sdulldeat = 74997493; public const int Sdulldeat = 74997493;
public const int CrystronNeedlefiber = 50588353; public const int CrystronNeedlefiber = 50588353;
} }
public LightswornShaddoldinosour(GameAI ai, Duel duel) public LightswornShaddoldinosour(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
{ {
//counter //counter
AddExecutor(ExecutorType.Activate, CardId.GhostOgre, Hand_act_eff); AddExecutor(ExecutorType.Activate, CardId.GhostOgre, Hand_act_eff);
AddExecutor(ExecutorType.Activate, CardId.AshBlossom, Hand_act_eff); AddExecutor(ExecutorType.Activate, CardId.AshBlossom, Hand_act_eff);
AddExecutor(ExecutorType.Activate, CardId.MaxxC,MaxxC); AddExecutor(ExecutorType.Activate, CardId.MaxxC,MaxxC);
//first do //first do
AddExecutor(ExecutorType.Activate, CardId.HarpiesFeatherDuster, DefaultHarpiesFeatherDusterFirst); AddExecutor(ExecutorType.Activate, CardId.HarpiesFeatherDuster, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, CardId.infiniteTransience, DefaultBreakthroughSkill); AddExecutor(ExecutorType.Activate, CardId.infiniteTransience, DefaultBreakthroughSkill);
AddExecutor(ExecutorType.Activate, CardId.ThatGrassLooksgreener); AddExecutor(ExecutorType.Activate, CardId.ThatGrassLooksgreener);
AddExecutor(ExecutorType.Summon, CardId.SouleatingOviraptor); AddExecutor(ExecutorType.Summon, CardId.SouleatingOviraptor);
AddExecutor(ExecutorType.Activate, CardId.SouleatingOviraptor, SouleatingOviraptoreff); AddExecutor(ExecutorType.Activate, CardId.SouleatingOviraptor, SouleatingOviraptoreff);
AddExecutor(ExecutorType.Activate, CardId.AllureofDarkness, DefaultAllureofDarkness); AddExecutor(ExecutorType.Activate, CardId.AllureofDarkness, DefaultAllureofDarkness);
AddExecutor(ExecutorType.Activate, CardId.PotOfAvarice, PotofAvariceeff); AddExecutor(ExecutorType.Activate, CardId.PotOfAvarice, PotofAvariceeff);
AddExecutor(ExecutorType.Activate, CardId.ChargeOfTheLightBrigade, ChargeOfTheLightBrigadeEffect); AddExecutor(ExecutorType.Activate, CardId.ChargeOfTheLightBrigade, ChargeOfTheLightBrigadeEffect);
AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect); AddExecutor(ExecutorType.Activate, CardId.FoolishBurial, FoolishBurialEffect);
AddExecutor(ExecutorType.Activate, CardId.InterruptedKaijuSlumber, InterruptedKaijuSlumbereff); AddExecutor(ExecutorType.Activate, CardId.InterruptedKaijuSlumber, InterruptedKaijuSlumbereff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollFusion, ShaddollFusioneff); AddExecutor(ExecutorType.Activate, CardId.ShaddollFusion, ShaddollFusioneff);
//Normal Summon //Normal Summon
AddExecutor(ExecutorType.Summon, CardId.Raiden); AddExecutor(ExecutorType.Summon, CardId.Raiden);
AddExecutor(ExecutorType.Activate, CardId.Raiden); AddExecutor(ExecutorType.Activate, CardId.Raiden);
AddExecutor(ExecutorType.Summon , CardId.KeeperOfDragonicMagic); AddExecutor(ExecutorType.Summon , CardId.KeeperOfDragonicMagic);
AddExecutor(ExecutorType.Activate, CardId.KeeperOfDragonicMagic, KeeperOfDragonicMagiceff); AddExecutor(ExecutorType.Activate, CardId.KeeperOfDragonicMagic, KeeperOfDragonicMagiceff);
AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollSquamata); AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollSquamata);
AddExecutor(ExecutorType.MonsterSet, CardId.GlowUpBulb); AddExecutor(ExecutorType.MonsterSet, CardId.GlowUpBulb);
AddExecutor(ExecutorType.Summon, CardId.Lumina, Luminasummon); AddExecutor(ExecutorType.Summon, CardId.Lumina, Luminasummon);
AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollHedgehog); AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollHedgehog);
AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollDragon); AddExecutor(ExecutorType.MonsterSet, CardId.ShaddollDragon);
AddExecutor(ExecutorType.Summon, CardId.FairyTailSnow,FairyTailSnowsummon); AddExecutor(ExecutorType.Summon, CardId.FairyTailSnow,FairyTailSnowsummon);
AddExecutor(ExecutorType.Activate, CardId.FairyTailSnow, FairyTailSnoweff); AddExecutor(ExecutorType.Activate, CardId.FairyTailSnow, FairyTailSnoweff);
AddExecutor(ExecutorType.Activate, CardId.Lumina, Luminaeff); AddExecutor(ExecutorType.Activate, CardId.Lumina, Luminaeff);
//activate //activate
AddExecutor(ExecutorType.Activate, CardId.GlowUpBulb, GlowUpBulbeff); AddExecutor(ExecutorType.Activate, CardId.GlowUpBulb, GlowUpBulbeff);
AddExecutor(ExecutorType.Activate, CardId.TG_WonderMagician, TG_WonderMagicianeff); AddExecutor(ExecutorType.Activate, CardId.TG_WonderMagician, TG_WonderMagicianeff);
AddExecutor(ExecutorType.Activate, CardId.CoralDragon, CoralDragoneff); AddExecutor(ExecutorType.Activate, CardId.CoralDragon, CoralDragoneff);
AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff); AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff);
AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff); AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff);
AddExecutor(ExecutorType.Activate, CardId.BlackRoseMoonlightDragon, BlackRoseMoonlightDragoneff); AddExecutor(ExecutorType.Activate, CardId.BlackRoseMoonlightDragon, BlackRoseMoonlightDragoneff);
AddExecutor(ExecutorType.Activate, CardId.Sdulldeat, Sdulldeateff); AddExecutor(ExecutorType.Activate, CardId.Sdulldeat, Sdulldeateff);
AddExecutor(ExecutorType.Activate, CardId.Michael, Michaeleff); AddExecutor(ExecutorType.Activate, CardId.Michael, Michaeleff);
AddExecutor(ExecutorType.Activate, CardId.ScarlightRedDragon, ScarlightRedDragoneff); AddExecutor(ExecutorType.Activate, CardId.ScarlightRedDragon, ScarlightRedDragoneff);
//Sp Summon //Sp Summon
AddExecutor(ExecutorType.Activate, CardId.CrystronNeedlefiber, CrystronNeedlefibereff); AddExecutor(ExecutorType.Activate, CardId.CrystronNeedlefiber, CrystronNeedlefibereff);
AddExecutor(ExecutorType.SpSummon, CardId.UltimateConductorTytanno, UltimateConductorTytannosp); AddExecutor(ExecutorType.SpSummon, CardId.UltimateConductorTytanno, UltimateConductorTytannosp);
AddExecutor(ExecutorType.Activate, CardId.UltimateConductorTytanno, UltimateConductorTytannoeff); AddExecutor(ExecutorType.Activate, CardId.UltimateConductorTytanno, UltimateConductorTytannoeff);
AddExecutor(ExecutorType.Activate, CardId.DoubleEvolutionPill, DoubleEvolutionPilleff); AddExecutor(ExecutorType.Activate, CardId.DoubleEvolutionPill, DoubleEvolutionPilleff);
//extra //extra
AddExecutor(ExecutorType.SpSummon, CardId.CrystalWingSynchroDragon); AddExecutor(ExecutorType.SpSummon, CardId.CrystalWingSynchroDragon);
AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff); AddExecutor(ExecutorType.Activate, CardId.CrystalWingSynchroDragon, CrystalWingSynchroDragoneff);
AddExecutor(ExecutorType.SpSummon, CardId.ScarlightRedDragon, ScarlightRedDragonsp); AddExecutor(ExecutorType.SpSummon, CardId.ScarlightRedDragon, ScarlightRedDragonsp);
AddExecutor(ExecutorType.Activate, CardId.ScarlightRedDragon, ScarlightRedDragoneff); AddExecutor(ExecutorType.Activate, CardId.ScarlightRedDragon, ScarlightRedDragoneff);
AddExecutor(ExecutorType.SpSummon, CardId.Michael, Michaelsp); AddExecutor(ExecutorType.SpSummon, CardId.Michael, Michaelsp);
AddExecutor(ExecutorType.Activate, CardId.Michael, Michaeleff); AddExecutor(ExecutorType.Activate, CardId.Michael, Michaeleff);
AddExecutor(ExecutorType.SpSummon, CardId.RedWyvern, RedWyvernsp); AddExecutor(ExecutorType.SpSummon, CardId.RedWyvern, RedWyvernsp);
AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff); AddExecutor(ExecutorType.Activate, CardId.RedWyvern, RedWyverneff);
AddExecutor(ExecutorType.SpSummon, CardId.MinervaTheExalte); AddExecutor(ExecutorType.SpSummon, CardId.MinervaTheExalte);
AddExecutor(ExecutorType.Activate, CardId.MinervaTheExalte, MinervaTheExaltedEffect); AddExecutor(ExecutorType.Activate, CardId.MinervaTheExalte, MinervaTheExaltedEffect);
AddExecutor(ExecutorType.SpSummon, CardId.CrystronNeedlefiber, CrystronNeedlefibersp); AddExecutor(ExecutorType.SpSummon, CardId.CrystronNeedlefiber, CrystronNeedlefibersp);
//Kaiju //Kaiju
AddExecutor(ExecutorType.SpSummon, CardId.GamecieltheSeaTurtleKaiju, GamecieltheSeaTurtleKaijusp); AddExecutor(ExecutorType.SpSummon, CardId.GamecieltheSeaTurtleKaiju, GamecieltheSeaTurtleKaijusp);
AddExecutor(ExecutorType.SpSummon, CardId.RadiantheMultidimensionalKaiju, RadiantheMultidimensionalKaijusp); AddExecutor(ExecutorType.SpSummon, CardId.RadiantheMultidimensionalKaiju, RadiantheMultidimensionalKaijusp);
AddExecutor(ExecutorType.SpSummon, CardId.DogorantheMadFlameKaiju, DogorantheMadFlameKaijusp); AddExecutor(ExecutorType.SpSummon, CardId.DogorantheMadFlameKaiju, DogorantheMadFlameKaijusp);
//Reborn //Reborn
AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, Reborneff); AddExecutor(ExecutorType.Activate, CardId.MonsterReborn, Reborneff);
//activate chain //activate chain
AddExecutor(ExecutorType.Activate, CardId.OvertexCoatls, OvertexCoatlseff); AddExecutor(ExecutorType.Activate, CardId.OvertexCoatls, OvertexCoatlseff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollCore, ShaddollCoreeff); AddExecutor(ExecutorType.Activate, CardId.ShaddollCore, ShaddollCoreeff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollBeast, ShaddollBeasteff); AddExecutor(ExecutorType.Activate, CardId.ShaddollBeast, ShaddollBeasteff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollFalco, ShaddollFalcoeff); AddExecutor(ExecutorType.Activate, CardId.ShaddollFalco, ShaddollFalcoeff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollDragon, ShaddollDragoneff); AddExecutor(ExecutorType.Activate, CardId.ShaddollDragon, ShaddollDragoneff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollHedgehog, ShaddollHedgehogeff); AddExecutor(ExecutorType.Activate, CardId.ShaddollHedgehog, ShaddollHedgehogeff);
AddExecutor(ExecutorType.Activate, CardId.ShaddollSquamata, ShaddollSquamataeff); AddExecutor(ExecutorType.Activate, CardId.ShaddollSquamata, ShaddollSquamataeff);
AddExecutor(ExecutorType.Activate, CardId.GiantRex); AddExecutor(ExecutorType.Activate, CardId.GiantRex);
AddExecutor(ExecutorType.Activate, CardId.ElShaddollConstruct, ElShaddollConstructeff); AddExecutor(ExecutorType.Activate, CardId.ElShaddollConstruct, ElShaddollConstructeff);
AddExecutor(ExecutorType.Activate, CardId.ElShaddollGrysra, ElShaddollGrysraeff); AddExecutor(ExecutorType.Activate, CardId.ElShaddollGrysra, ElShaddollGrysraeff);
AddExecutor(ExecutorType.Activate, CardId.ElShaddollShekhinaga, ElShaddollShekhinagaeff); AddExecutor(ExecutorType.Activate, CardId.ElShaddollShekhinaga, ElShaddollShekhinagaeff);
AddExecutor(ExecutorType.Activate, CardId.ElShaddollWinda); AddExecutor(ExecutorType.Activate, CardId.ElShaddollWinda);
//spellset //spellset
AddExecutor(ExecutorType.SpellSet, CardId.ThatGrassLooksgreener, SpellSetZone); AddExecutor(ExecutorType.SpellSet, CardId.ThatGrassLooksgreener, SpellSetZone);
AddExecutor(ExecutorType.SpellSet, SpellSetZone); AddExecutor(ExecutorType.SpellSet, SpellSetZone);
//trapset //trapset
AddExecutor(ExecutorType.SpellSet, CardId.LostWind); AddExecutor(ExecutorType.SpellSet, CardId.LostWind);
AddExecutor(ExecutorType.SpellSet, CardId.SinisterShadowGames); AddExecutor(ExecutorType.SpellSet, CardId.SinisterShadowGames);
AddExecutor(ExecutorType.SpellSet, CardId.ShaddollCore); AddExecutor(ExecutorType.SpellSet, CardId.ShaddollCore);
AddExecutor(ExecutorType.SpellSet, CardId.infiniteTransience, SetIsFieldEmpty); AddExecutor(ExecutorType.SpellSet, CardId.infiniteTransience, SetIsFieldEmpty);
//trap activate //trap activate
AddExecutor(ExecutorType.Activate, CardId.LostWind, LostWindeff); AddExecutor(ExecutorType.Activate, CardId.LostWind, LostWindeff);
AddExecutor(ExecutorType.Activate, CardId.SinisterShadowGames, SinisterShadowGameseff); AddExecutor(ExecutorType.Activate, CardId.SinisterShadowGames, SinisterShadowGameseff);
AddExecutor(ExecutorType.Repos, MonsterRepos); AddExecutor(ExecutorType.Repos, MonsterRepos);
} }
public int[] all_List() public int[] all_List()
{ {
return new[] return new[]
{ {
CardId.UltimateConductorTytanno, CardId.UltimateConductorTytanno,
CardId.DogorantheMadFlameKaiju, CardId.DogorantheMadFlameKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.GamecieltheSeaTurtleKaiju,
CardId.RadiantheMultidimensionalKaiju, CardId.RadiantheMultidimensionalKaiju,
CardId.OvertexCoatls, CardId.OvertexCoatls,
CardId.ShaddollBeast, CardId.ShaddollBeast,
CardId.GiantRex, CardId.GiantRex,
CardId.ShaddollDragon, CardId.ShaddollDragon,
CardId.FairyTailSnow, CardId.FairyTailSnow,
CardId.KeeperOfDragonicMagic, CardId.KeeperOfDragonicMagic,
CardId.ShaddollSquamata, CardId.ShaddollSquamata,
CardId.SouleatingOviraptor, CardId.SouleatingOviraptor,
CardId.Raiden, CardId.Raiden,
CardId.Lumina, CardId.Lumina,
CardId.ShaddollHedgehog, CardId.ShaddollHedgehog,
CardId.AshBlossom, CardId.AshBlossom,
CardId.GhostOgre, CardId.GhostOgre,
CardId.ShaddollFalco, CardId.ShaddollFalco,
CardId.MaxxC, CardId.MaxxC,
CardId.PlaguespreaderZombie, CardId.PlaguespreaderZombie,
CardId.GlowUpBulb, CardId.GlowUpBulb,
CardId.AllureofDarkness, CardId.AllureofDarkness,
CardId.ThatGrassLooksgreener, CardId.ThatGrassLooksgreener,
CardId.HarpiesFeatherDuster, CardId.HarpiesFeatherDuster,
CardId.DoubleEvolutionPill, CardId.DoubleEvolutionPill,
CardId.ShaddollFusion, CardId.ShaddollFusion,
CardId.PotOfAvarice, CardId.PotOfAvarice,
CardId.FoolishBurial, CardId.FoolishBurial,
CardId.MonsterReborn, CardId.MonsterReborn,
CardId.ChargeOfTheLightBrigade, CardId.ChargeOfTheLightBrigade,
CardId.InterruptedKaijuSlumber, CardId.InterruptedKaijuSlumber,
//CardId.ElShaddollFusion, //CardId.ElShaddollFusion,
CardId.infiniteTransience, CardId.infiniteTransience,
CardId.LostWind, CardId.LostWind,
CardId.SinisterShadowGames, CardId.SinisterShadowGames,
CardId.ShaddollCore, CardId.ShaddollCore,
}; };
} }
public int[] Useless_List() public int[] Useless_List()
{ {
return new[] return new[]
{ {
CardId.GlowUpBulb, CardId.GlowUpBulb,
CardId.PlaguespreaderZombie, CardId.PlaguespreaderZombie,
CardId.ChargeOfTheLightBrigade, CardId.ChargeOfTheLightBrigade,
CardId.ThatGrassLooksgreener, CardId.ThatGrassLooksgreener,
CardId.HarpiesFeatherDuster, CardId.HarpiesFeatherDuster,
CardId.FairyTailSnow, CardId.FairyTailSnow,
CardId.GiantRex, CardId.GiantRex,
CardId.Lumina, CardId.Lumina,
CardId.OvertexCoatls, CardId.OvertexCoatls,
CardId.InterruptedKaijuSlumber, CardId.InterruptedKaijuSlumber,
CardId.FoolishBurial, CardId.FoolishBurial,
}; };
} }
int Ultimate_ss = 0; int Ultimate_ss = 0;
int Enemy_atk = 0; int Enemy_atk = 0;
int TG_WonderMagician_count = 0; bool Pillused = false;
bool Pillused = false; bool CrystronNeedlefibereff_used = false;
bool CrystronNeedlefibereff_used = false; bool OvertexCoatlseff_used = false;
bool OvertexCoatlseff_used = false; bool ShaddollBeast_used = false;
bool ShaddollBeast_used = false; bool ShaddollFalco_used = false;
bool ShaddollFalco_used = false; bool ShaddollSquamata_used = false;
bool ShaddollSquamata_used = false; bool ShaddollDragon_used = false;
bool ShaddollDragon_used = false; bool ShaddollHedgehog_used = false;
bool ShaddollHedgehog_used = false;
public int GetTotalATK(IList<ClientCard> list)
public int GetTotalATK(IList<ClientCard> list) {
{
int atk = 0;
int atk = 0; foreach (ClientCard c in list)
foreach (ClientCard c in list) {
{ if (c == null) continue;
if (c == null) continue; atk += c.Attack;
atk += c.Attack; }
} return atk;
return atk; }
}
public override void OnNewPhase()
public override void OnNewPhase() {
{ Enemy_atk = 0;
Enemy_atk = 0; IList<ClientCard> list = new List<ClientCard>();
IList<ClientCard> list = new List<ClientCard>(); foreach (ClientCard monster in Enemy.GetMonsters())
foreach (ClientCard monster in Enemy.GetMonsters()) {
{ if(monster.IsAttack())
if(monster.IsAttack()) list.Add(monster);
list.Add(monster); }
} //if (GetTotalATK(list) / 2 >= Bot.LifePoints) return false;
//if (GetTotalATK(list) / 2 >= Bot.LifePoints) return false; Enemy_atk = GetTotalATK(list);
Enemy_atk = GetTotalATK(list); //SLogger.DebugWriteLine("++++++++++++++++++" + Enemy_atk + "++++++++++++");
//SLogger.DebugWriteLine("++++++++++++++++++" + Enemy_atk + "++++++++++++"); }
} public override void OnNewTurn()
public override void OnNewTurn() {
{ Pillused = false;
Pillused = false; OvertexCoatlseff_used = false;
OvertexCoatlseff_used = false; CrystronNeedlefibereff_used = false;
CrystronNeedlefibereff_used = false; ShaddollBeast_used = false;
ShaddollBeast_used = false; ShaddollFalco_used = false;
ShaddollFalco_used = false; ShaddollSquamata_used = false;
ShaddollSquamata_used = false; ShaddollDragon_used = false;
ShaddollDragon_used = false; ShaddollHedgehog_used = false;
ShaddollHedgehog_used = false; }
TG_WonderMagician_count = 0;
} private bool Luminasummon()
{
private bool Luminasummon() if (Bot.Deck.Count >= 20) return true;
{ IList<ClientCard> extra = Bot.GetMonstersInExtraZone();
if (Bot.Deck.Count >= 20) return true; if (extra != null)
IList<ClientCard> extra = Bot.GetMonstersInExtraZone(); foreach (ClientCard monster in extra)
if (extra != null) if (!monster.HasType(CardType.Link))
foreach (ClientCard monster in extra) return false;
if (!monster.HasType(CardType.Link)) if (Bot.LifePoints <= 3000) return true;
return false; if (Bot.HasInGraveyard(CardId.Raiden)) return true;
if (Bot.LifePoints <= 3000) return true; return false;
if (Bot.HasInGraveyard(CardId.Raiden)) return true; }
return false; private bool Luminaeff()
} {
private bool Luminaeff() if (Bot.HasInGraveyard(CardId.Raiden))
{ {
if (Bot.HasInGraveyard(CardId.Raiden)) AI.SelectCard(Useless_List());
{ AI.SelectNextCard(CardId.Raiden);
AI.SelectCard(Useless_List()); return true;
AI.SelectNextCard(CardId.Raiden); }
return true; return false;
} }
return false;
}
private bool UltimateConductorTytannoeff()
{
private bool UltimateConductorTytannoeff() IList<int> targets = new[] {
{ CardId.OvertexCoatls,
IList<int> targets = new[] { CardId.ShaddollBeast,
CardId.OvertexCoatls, CardId.ShaddollSquamata,
CardId.ShaddollBeast, CardId.ShaddollHedgehog,
CardId.ShaddollSquamata, CardId.ShaddollDragon,
CardId.ShaddollHedgehog, CardId.ShaddollFalco,
CardId.ShaddollDragon, CardId.GlowUpBulb,
CardId.ShaddollFalco, CardId.PlaguespreaderZombie,
CardId.GlowUpBulb, CardId.FairyTailSnow,
CardId.PlaguespreaderZombie, CardId.KeeperOfDragonicMagic,
CardId.FairyTailSnow, CardId.DogorantheMadFlameKaiju,
CardId.KeeperOfDragonicMagic, CardId.GamecieltheSeaTurtleKaiju,
CardId.DogorantheMadFlameKaiju, CardId.RadiantheMultidimensionalKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.GiantRex,
CardId.RadiantheMultidimensionalKaiju, CardId.ShaddollCore,
CardId.GiantRex, CardId.SouleatingOviraptor,
CardId.ShaddollCore, CardId.Raiden,
CardId.SouleatingOviraptor, CardId.Lumina,
CardId.Raiden, CardId.AshBlossom,
CardId.Lumina, CardId.GhostOgre,
CardId.AshBlossom, CardId.MaxxC,
CardId.GhostOgre, };
CardId.MaxxC,
}; if (Duel.Phase == DuelPhase.Main1)
{
if (Duel.Phase == DuelPhase.Main1) if(Duel.Player==0)
{ {
if(Duel.Player==0) int count = 0;
{ IList<ClientCard> check = Enemy.GetMonsters();
int count = 0; foreach (ClientCard monster in check)
IList<ClientCard> check = Enemy.GetMonsters(); if (monster.Attack > 2500 || monster == Enemy.MonsterZone.GetDangerousMonster())
foreach (ClientCard monster in check) count++;
if (monster.Attack > 2500 || monster == Enemy.MonsterZone.GetDangerousMonster()) if(count==0)return false;
count++; }
if(count==0)return false; if (!Bot.HasInHand(targets))
} {
if (!Bot.HasInHand(targets)) if(!Bot.HasInMonstersZone(targets))
{ return false;
if(!Bot.HasInMonstersZone(targets)) }
return false; AI.SelectCard(targets);
} return true;
AI.SelectCard(targets); }
return true; if (Duel.Phase == DuelPhase.BattleStart)
} {
if (Duel.Phase == DuelPhase.BattleStart) AI.SelectYesNo(true);
{ return true;
AI.SelectYesNo(true); }
return true; return false;
}
return false; }
} private bool GamecieltheSeaTurtleKaijusp()
{
private bool GamecieltheSeaTurtleKaijusp() if (!Bot.HasInMonstersZone(CardId.UltimateConductorTytanno))
{ return DefaultKaijuSpsummon();
if (!Bot.HasInMonstersZone(CardId.UltimateConductorTytanno)) return false;
return DefaultKaijuSpsummon(); }
return false;
} private bool RadiantheMultidimensionalKaijusp()
{
private bool RadiantheMultidimensionalKaijusp() if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true;
{ if (Bot.HasInHand(CardId.DogorantheMadFlameKaiju) && !Bot.HasInMonstersZone(CardId.UltimateConductorTytanno)) return DefaultKaijuSpsummon();
if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true; return false;
if (Bot.HasInHand(CardId.DogorantheMadFlameKaiju) && !Bot.HasInMonstersZone(CardId.UltimateConductorTytanno)) return DefaultKaijuSpsummon(); }
return false;
}
private bool DogorantheMadFlameKaijusp()
{
private bool DogorantheMadFlameKaijusp() if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true;
{ if (Enemy.HasInMonstersZone(CardId.RadiantheMultidimensionalKaiju)) return true;
if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true; return false;
if (Enemy.HasInMonstersZone(CardId.RadiantheMultidimensionalKaiju)) return true; }
return false;
}
private bool InterruptedKaijuSlumbereff()
{
private bool InterruptedKaijuSlumbereff() if (Enemy.GetMonsterCount() - Bot.GetMonsterCount() >= 2 )
{ return DefaultInterruptedKaijuSlumber();
if (Enemy.GetMonsterCount() - Bot.GetMonsterCount() >= 2 ) return false;
return DefaultInterruptedKaijuSlumber(); }
return false; private bool UltimateConductorTytannosp()
} {
private bool UltimateConductorTytannosp()
{ Pillused = true;
foreach (ClientCard card in Bot.GetMonsters())
Pillused = true; {
foreach (ClientCard card in Bot.GetMonsters()) if (card.IsCode(CardId.UltimateConductorTytanno) && card.IsFaceup())
{ return false;
if (card.IsCode(CardId.UltimateConductorTytanno) && card.IsFaceup()) }
return false; Ultimate_ss++;
} return true;
Ultimate_ss++;
return true; }
} private bool KeeperOfDragonicMagiceff()
{
private bool KeeperOfDragonicMagiceff() if (ActivateDescription == -1)
{ {
if (ActivateDescription == -1) AI.SelectCard(Useless_List());
{ return true;
AI.SelectCard(Useless_List()); }
return true; return true;
} }
return true;
} private bool MonsterRepos()
{
private bool MonsterRepos() if (Card.IsCode(CardId.UltimateConductorTytanno) && Card.IsFacedown()) return true;
{ if (Card.IsCode(CardId.ElShaddollConstruct) && Card.IsFacedown()) return true;
if (Card.IsCode(CardId.UltimateConductorTytanno) && Card.IsFacedown()) return true; if (Card.IsCode(CardId.ElShaddollConstruct) && Card.IsAttack()) return false;
if (Card.IsCode(CardId.ElShaddollConstruct) && Card.IsFacedown()) return true; if (Card.IsCode(CardId.GlowUpBulb) && Card.IsDefense()) return false;
if (Card.IsCode(CardId.ElShaddollConstruct) && Card.IsAttack()) return false; if (Card.IsCode(CardId.ShaddollDragon) && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true;
if (Card.IsCode(CardId.GlowUpBulb) && Card.IsDefense()) return false; if (Card.IsCode(CardId.ShaddollSquamata) && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true;
if (Card.IsCode(CardId.ShaddollDragon) && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true; return base.DefaultMonsterRepos();
if (Card.IsCode(CardId.ShaddollSquamata) && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true; }
return base.DefaultMonsterRepos();
} private bool OvertexCoatlseff()
{
private bool OvertexCoatlseff() if (Card.Location == CardLocation.MonsterZone) return false;
{ OvertexCoatlseff_used = true;
if (Card.Location == CardLocation.MonsterZone) return false; return true;
OvertexCoatlseff_used = true; }
return true;
} private bool DoubleEvolutionPilleff()
{
private bool DoubleEvolutionPilleff() foreach (ClientCard card in Bot.GetMonsters())
{ {
foreach (ClientCard card in Bot.GetMonsters()) if (card.IsCode(CardId.UltimateConductorTytanno) && card.IsFaceup())
{ return false;
if (card.IsCode(CardId.UltimateConductorTytanno) && card.IsFaceup()) }
return false; if (Pillused == true) return false;
} Pillused = true;
if (Pillused == true) return false; IList<int> targets = new[] {
Pillused = true; CardId.GiantRex,
IList<int> targets = new[] { CardId.DogorantheMadFlameKaiju,
CardId.GiantRex, CardId.GamecieltheSeaTurtleKaiju,
CardId.DogorantheMadFlameKaiju, CardId.RadiantheMultidimensionalKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.OvertexCoatls,
CardId.RadiantheMultidimensionalKaiju, CardId.SouleatingOviraptor,
CardId.OvertexCoatls, CardId.UltimateConductorTytanno,
CardId.SouleatingOviraptor, };
CardId.UltimateConductorTytanno, if (Bot.HasInGraveyard(targets))
}; {
if (Bot.HasInGraveyard(targets)) AI.SelectCard(CardId.GiantRex, CardId.DogorantheMadFlameKaiju, CardId.OvertexCoatls, CardId.GamecieltheSeaTurtleKaiju, CardId.RadiantheMultidimensionalKaiju, CardId.SouleatingOviraptor, CardId.UltimateConductorTytanno);
{ }
AI.SelectCard(CardId.GiantRex, CardId.DogorantheMadFlameKaiju, CardId.OvertexCoatls, CardId.GamecieltheSeaTurtleKaiju, CardId.RadiantheMultidimensionalKaiju, CardId.SouleatingOviraptor, CardId.UltimateConductorTytanno); else
} {
else AI.SelectCard(CardId.GiantRex, CardId.DogorantheMadFlameKaiju, CardId.GamecieltheSeaTurtleKaiju, CardId.RadiantheMultidimensionalKaiju, CardId.OvertexCoatls, CardId.SouleatingOviraptor, CardId.UltimateConductorTytanno);
{ }
AI.SelectCard(CardId.GiantRex, CardId.DogorantheMadFlameKaiju, CardId.GamecieltheSeaTurtleKaiju, CardId.RadiantheMultidimensionalKaiju, CardId.OvertexCoatls, CardId.SouleatingOviraptor, CardId.UltimateConductorTytanno); IList<int> targets2 = new[] {
} CardId.GiantRex,
IList<int> targets2 = new[] { CardId.DogorantheMadFlameKaiju,
CardId.GiantRex, CardId.GamecieltheSeaTurtleKaiju,
CardId.DogorantheMadFlameKaiju, CardId.RadiantheMultidimensionalKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.OvertexCoatls,
CardId.RadiantheMultidimensionalKaiju, CardId.SouleatingOviraptor,
CardId.OvertexCoatls, CardId.UltimateConductorTytanno,
CardId.SouleatingOviraptor, };
CardId.UltimateConductorTytanno, if (Bot.HasInGraveyard(targets))
}; {
if (Bot.HasInGraveyard(targets)) AI.SelectNextCard(CardId.ShaddollBeast, CardId.ShaddollDragon, CardId.KeeperOfDragonicMagic, CardId.ShaddollSquamata, CardId.SouleatingOviraptor, CardId.Raiden, CardId.Lumina, CardId.ShaddollHedgehog, CardId.AshBlossom, CardId.GhostOgre, CardId.ShaddollFalco, CardId.MaxxC, CardId.PlaguespreaderZombie, CardId.GlowUpBulb, CardId.FairyTailSnow);
{ }
AI.SelectNextCard(CardId.ShaddollBeast, CardId.ShaddollDragon, CardId.KeeperOfDragonicMagic, CardId.ShaddollSquamata, CardId.SouleatingOviraptor, CardId.Raiden, CardId.Lumina, CardId.ShaddollHedgehog, CardId.AshBlossom, CardId.GhostOgre, CardId.ShaddollFalco, CardId.MaxxC, CardId.PlaguespreaderZombie, CardId.GlowUpBulb, CardId.FairyTailSnow); else
} AI.SelectNextCard(CardId.ShaddollBeast, CardId.ShaddollDragon, CardId.KeeperOfDragonicMagic, CardId.ShaddollSquamata, CardId.SouleatingOviraptor, CardId.Raiden, CardId.Lumina, CardId.ShaddollHedgehog, CardId.AshBlossom, CardId.GhostOgre, CardId.ShaddollFalco, CardId.MaxxC, CardId.PlaguespreaderZombie, CardId.GlowUpBulb, CardId.FairyTailSnow);
else
AI.SelectNextCard(CardId.ShaddollBeast, CardId.ShaddollDragon, CardId.KeeperOfDragonicMagic, CardId.ShaddollSquamata, CardId.SouleatingOviraptor, CardId.Raiden, CardId.Lumina, CardId.ShaddollHedgehog, CardId.AshBlossom, CardId.GhostOgre, CardId.ShaddollFalco, CardId.MaxxC, CardId.PlaguespreaderZombie, CardId.GlowUpBulb, CardId.FairyTailSnow); AI.SelectThirdCard(new[] {
CardId.UltimateConductorTytanno,
AI.SelectThirdCard(new[] {
CardId.UltimateConductorTytanno, });
}); return Enemy.GetMonsterCount() >= 1;
}
return Enemy.GetMonsterCount() >= 1;
}
private bool FairyTailSnowsummon()
{
private bool FairyTailSnowsummon() ClientCard target = Util.GetBestEnemyMonster(true, true);
{ if(target != null)
ClientCard target = Util.GetBestEnemyMonster(true, true); {
if(target != null) return true;
{ }
return true; return false;
} }
return false;
}
private bool FairyTailSnoweff()
{
private bool FairyTailSnoweff()
{ if (Card.Location == CardLocation.MonsterZone)
{
if (Card.Location == CardLocation.MonsterZone) AI.SelectCard(Util.GetBestEnemyMonster(true, true));
{ return true;
AI.SelectCard(Util.GetBestEnemyMonster(true, true)); }
return true; else
} {
else
{ int spell_count = 0;
IList<ClientCard> grave = Bot.Graveyard;
int spell_count = 0; IList<ClientCard> all = new List<ClientCard>();
IList<ClientCard> grave = Bot.Graveyard; foreach (ClientCard check in grave)
IList<ClientCard> all = new List<ClientCard>(); {
foreach (ClientCard check in grave) if (check.IsCode(CardId.GiantRex))
{ {
if (check.IsCode(CardId.GiantRex)) all.Add(check);
{ }
all.Add(check); }
} foreach (ClientCard check in grave)
} {
foreach (ClientCard check in grave) if(check.HasType(CardType.Spell)||check.HasType(CardType.Trap))
{ {
if(check.HasType(CardType.Spell)||check.HasType(CardType.Trap)) spell_count++;
{ all.Add(check);
spell_count++; }
all.Add(check); }
} foreach (ClientCard check in grave)
} {
foreach (ClientCard check in grave) if (check.HasType(CardType.Monster))
{ {
if (check.HasType(CardType.Monster)) all.Add(check);
{ }
all.Add(check); }
} if (Util.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
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(Util.GetBestEnemyMonster());
AI.SelectCard(all); return true;
AI.SelectNextCard(Util.GetBestEnemyMonster()); }
return true; }
} return false;
} }
return false;
}
private bool SouleatingOviraptoreff()
{
private bool SouleatingOviraptoreff() if (!OvertexCoatlseff_used && Bot.GetRemainingCount(CardId.OvertexCoatls, 3) > 0)
{ {
if (!OvertexCoatlseff_used && Bot.GetRemainingCount(CardId.OvertexCoatls, 3) > 0) AI.SelectCard(CardId.OvertexCoatls);
{ AI.SelectOption(0);
AI.SelectCard(CardId.OvertexCoatls); }
AI.SelectOption(0); else
} {
else AI.SelectCard(CardId.UltimateConductorTytanno);
{ AI.SelectOption(1);
AI.SelectCard(CardId.UltimateConductorTytanno); }
AI.SelectOption(1); return true;
} }
return true;
} private bool GlowUpBulbeff()
{
private bool GlowUpBulbeff() IList<ClientCard> check = Bot.GetMonstersInExtraZone();
{ foreach (ClientCard monster in check)
IList<ClientCard> check = Bot.GetMonstersInExtraZone(); if (monster.HasType(CardType.Fusion)) return false;
foreach (ClientCard monster in check) if (Bot.HasInMonstersZone(CardId.Lumina) ||
if (monster.HasType(CardType.Fusion)) return false; Bot.HasInMonstersZone(CardId.FairyTailSnow) ||
if (Bot.HasInMonstersZone(CardId.Lumina) || Bot.HasInMonstersZone(CardId.KeeperOfDragonicMagic) ||
Bot.HasInMonstersZone(CardId.FairyTailSnow) || Bot.HasInMonstersZone(CardId.SouleatingOviraptor) ||
Bot.HasInMonstersZone(CardId.KeeperOfDragonicMagic) || Bot.HasInMonstersZone(CardId.GiantRex) ||
Bot.HasInMonstersZone(CardId.SouleatingOviraptor) || Bot.HasInMonstersZone(CardId.Raiden)
Bot.HasInMonstersZone(CardId.GiantRex) || )
Bot.HasInMonstersZone(CardId.Raiden) {
) AI.SelectPosition(CardPosition.FaceUpDefence);
{ return true;
AI.SelectPosition(CardPosition.FaceUpDefence); }
return true; return false;
} }
return false;
}
private bool TG_WonderMagicianeff() private bool TG_WonderMagicianeff()
{ {
TG_WonderMagician_count++; return true;
return TG_WonderMagician_count <= 10; }
} private bool AllureofDarkness()
private bool AllureofDarkness() {
{ IList<ClientCard> materials = Bot.Hand;
IList<ClientCard> materials = Bot.Hand; // IList<ClientCard> check = new List<ClientCard>();
// IList<ClientCard> check = new List<ClientCard>(); ClientCard mat = null;
ClientCard mat = null; foreach (ClientCard card in materials)
foreach (ClientCard card in materials) {
{ if (card.HasAttribute(CardAttribute.Dark))
if (card.HasAttribute(CardAttribute.Dark)) {
{ mat = card;
mat = card; break;
break; }
} }
} if (mat != null)
if (mat != null) {
{ return true;
return true; }
} return false;
return false; }
}
private bool Reborneff()
private bool Reborneff() {
{ if(Bot.HasInGraveyard(CardId.UltimateConductorTytanno)&&Ultimate_ss>0)
if(Bot.HasInGraveyard(CardId.UltimateConductorTytanno)&&Ultimate_ss>0) {
{ AI.SelectCard(CardId.UltimateConductorTytanno);
AI.SelectCard(CardId.UltimateConductorTytanno); return true;
return true; }
} if (!Util.IsOneEnemyBetter(true)) return false;
if (!Util.IsOneEnemyBetter(true)) return false; IList<int> targets = new[] {
IList<int> targets = new[] { CardId.ElShaddollConstruct,
CardId.ElShaddollConstruct, CardId.DogorantheMadFlameKaiju,
CardId.DogorantheMadFlameKaiju, CardId.GamecieltheSeaTurtleKaiju,
CardId.GamecieltheSeaTurtleKaiju, CardId.SouleatingOviraptor,
CardId.SouleatingOviraptor, };
}; if (!Bot.HasInGraveyard(targets))
if (!Bot.HasInGraveyard(targets)) {
{ return false;
return false; }
} AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
}
private bool PotofAvariceeff()
private bool PotofAvariceeff() {
{ return true;
return true; }
}
private bool MaxxC()
private bool MaxxC() {
{ return Duel.Player == 1;
return Duel.Player == 1; }
}
private bool SetIsFieldEmpty()
private bool SetIsFieldEmpty() {
{ return !Bot.IsFieldEmpty();
return !Bot.IsFieldEmpty(); }
}
private bool SpellSetZone()
private bool SpellSetZone() {
{ return (Bot.GetHandCount()>6 && Duel.Phase==DuelPhase.Main2);
return (Bot.GetHandCount()>6 && Duel.Phase==DuelPhase.Main2); }
}
private bool ChargeOfTheLightBrigadeEffect()
private bool ChargeOfTheLightBrigadeEffect() {
{ if (Bot.HasInGraveyard(CardId.Raiden) || Bot.HasInHand(CardId.Raiden))
if (Bot.HasInGraveyard(CardId.Raiden) || Bot.HasInHand(CardId.Raiden)) AI.SelectCard(CardId.Lumina);
AI.SelectCard(CardId.Lumina); else
else AI.SelectCard(CardId.Raiden);
AI.SelectCard(CardId.Raiden); return true;
return true; }
}
// all Shaddoll
// all Shaddoll private bool SinisterShadowGameseff()
private bool SinisterShadowGameseff() {
{ if (Bot.HasInGraveyard(CardId.ShaddollFusion))
if (Bot.HasInGraveyard(CardId.ShaddollFusion)) AI.SelectCard(CardId.ShaddollCore);
AI.SelectCard(CardId.ShaddollCore); else
else AI.SelectCard(new[]
AI.SelectCard(new[] {
{ CardId.ShaddollBeast,
CardId.ShaddollBeast, });
}); return true;
return true; }
}
private bool ShaddollCoreeff()
private bool ShaddollCoreeff() {
{ if (Card.Location == CardLocation.SpellZone)
if (Card.Location == CardLocation.SpellZone) {
{
if (Duel.Player == 1 && Bot.BattlingMonster == null && Duel.Phase==DuelPhase.BattleStart|| DefaultOnBecomeTarget())
if (Duel.Player == 1 && Bot.BattlingMonster == null && Duel.Phase==DuelPhase.BattleStart|| DefaultOnBecomeTarget()) {
{ Logger.DebugWriteLine("+++++++++++ShaddollCoreeffdododoo++++++++++");
Logger.DebugWriteLine("+++++++++++ShaddollCoreeffdododoo++++++++++"); AI.SelectPosition(CardPosition.FaceUpDefence);
AI.SelectPosition(CardPosition.FaceUpDefence); return true;
return true; }
} return false;
return false; }
} return true;
return true; }
}
private bool ShaddollFusioneff()
private bool ShaddollFusioneff() {
{ List<ClientCard> extra_zone_check = Bot.GetMonstersInExtraZone();
List<ClientCard> extra_zone_check = Bot.GetMonstersInExtraZone(); foreach (ClientCard extra_monster in extra_zone_check)
foreach (ClientCard extra_monster in extra_zone_check) if (extra_monster.HasType(CardType.Xyz) || extra_monster.HasType(CardType.Fusion) || extra_monster.HasType(CardType.Synchro)) return false;
if (extra_monster.HasType(CardType.Xyz) || extra_monster.HasType(CardType.Fusion) || extra_monster.HasType(CardType.Synchro)) return false;
bool deck_check = false;
bool deck_check = false; List<ClientCard> monsters = Enemy.GetMonsters();
List<ClientCard> monsters = Enemy.GetMonsters(); foreach (ClientCard monster in monsters)
foreach (ClientCard monster in monsters) {
{ if (monster.HasType(CardType.Synchro) || monster.HasType(CardType.Fusion) || monster.HasType(CardType.Xyz) || monster.HasType(CardType.Link))
if (monster.HasType(CardType.Synchro) || monster.HasType(CardType.Fusion) || monster.HasType(CardType.Xyz) || monster.HasType(CardType.Link)) deck_check = true;
deck_check = true; }
}
if (deck_check)
if (deck_check) {
{ AI.SelectCard(
AI.SelectCard( CardId.ElShaddollConstruct,
CardId.ElShaddollConstruct, CardId.ElShaddollShekhinaga,
CardId.ElShaddollShekhinaga, CardId.ElShaddollGrysra,
CardId.ElShaddollGrysra, CardId.ElShaddollWinda
CardId.ElShaddollWinda );
); AI.SelectNextCard(
AI.SelectNextCard( CardId.ShaddollSquamata,
CardId.ShaddollSquamata, CardId.ShaddollBeast,
CardId.ShaddollBeast, CardId.ShaddollHedgehog,
CardId.ShaddollHedgehog, CardId.ShaddollDragon,
CardId.ShaddollDragon, CardId.ShaddollFalco,
CardId.ShaddollFalco, CardId.FairyTailSnow
CardId.FairyTailSnow );
); AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); return true;
return true; }
}
if (Enemy.GetMonsterCount() == 0)
if (Enemy.GetMonsterCount() == 0) {
{ int dark_count = 0;
int dark_count = 0; IList<ClientCard> m0 = Bot.Hand;
IList<ClientCard> m0 = Bot.Hand; IList<ClientCard> m1 = Bot.MonsterZone;
IList<ClientCard> m1 = Bot.MonsterZone; IList<ClientCard> all = new List<ClientCard>();
IList<ClientCard> all = new List<ClientCard>(); foreach (ClientCard monster in m0)
foreach (ClientCard monster in m0) {
{ if (dark_count == 2) break;
if (dark_count == 2) break; if (monster.HasAttribute(CardAttribute.Dark))
if (monster.HasAttribute(CardAttribute.Dark)) {
{ dark_count++;
dark_count++; all.Add(monster);
all.Add(monster); }
} }
} foreach (ClientCard monster in m1)
foreach (ClientCard monster in m1) {
{ if (dark_count == 2) break;
if (dark_count == 2) break; if (monster != null)
if (monster != null) {
{ if (monster.HasAttribute(CardAttribute.Dark))
if (monster.HasAttribute(CardAttribute.Dark)) {
{ dark_count++;
dark_count++; all.Add(monster);
all.Add(monster); }
} }
}
}
} if (dark_count == 2)
if (dark_count == 2) {
{ AI.SelectCard(CardId.ElShaddollWinda);
AI.SelectCard(CardId.ElShaddollWinda); AI.SelectMaterials(all);
AI.SelectMaterials(all); AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); return true;
return true; }
} }
} if (!Util.IsOneEnemyBetter()) return false;
if (!Util.IsOneEnemyBetter()) return false;
foreach (ClientCard monster in Bot.Hand)
foreach (ClientCard monster in Bot.Hand) {
{ if (monster.HasAttribute(CardAttribute.Light))
if (monster.HasAttribute(CardAttribute.Light)) {
{ AI.SelectCard(CardId.ElShaddollConstruct);
AI.SelectCard(CardId.ElShaddollConstruct); AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); return true;
return true; }
}
}
} List<ClientCard> material_1 = Bot.GetMonsters();
List<ClientCard> material_1 = Bot.GetMonsters(); foreach (ClientCard monster in material_1)
foreach (ClientCard monster in material_1) {
{ if (monster == null) break;
if (monster == null) break; if (monster.HasAttribute(CardAttribute.Light))
if (monster.HasAttribute(CardAttribute.Light)) {
{ AI.SelectCard(CardId.ElShaddollConstruct);
AI.SelectCard(CardId.ElShaddollConstruct); AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); return true;
return true; }
}
}
} return false;
return false;
}
}
private bool ElShaddollShekhinagaeff()
private bool ElShaddollShekhinagaeff() {
{ if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) return true;
return true; else
else {
{ if (DefaultBreakthroughSkill())
if (DefaultBreakthroughSkill()) {
{ AI.SelectCard(
AI.SelectCard( CardId.ShaddollBeast,
CardId.ShaddollBeast, CardId.ShaddollSquamata,
CardId.ShaddollSquamata, CardId.ShaddollHedgehog,
CardId.ShaddollHedgehog, CardId.ShaddollDragon,
CardId.ShaddollDragon, CardId.ShaddollFalco
CardId.ShaddollFalco );
); }
} else
else return false;
return false; }
} return true;
return true; }
}
private bool ElShaddollGrysraeff()
private bool ElShaddollGrysraeff() {
{ if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) return true;
return true; return true;
return true; }
}
private bool ElShaddollConstructeff()
private bool ElShaddollConstructeff() {
{
if (!ShaddollBeast_used)
if (!ShaddollBeast_used) AI.SelectCard(CardId.ShaddollBeast);
AI.SelectCard(CardId.ShaddollBeast); else
else AI.SelectCard(CardId.ShaddollFalco);
AI.SelectCard(CardId.ShaddollFalco);
return true;
return true; }
}
private bool ShaddollSquamataeff()
private bool ShaddollSquamataeff() {
{ ShaddollSquamata_used = true;
ShaddollSquamata_used = true; if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) {
{ if(Util.ChainContainsCard(CardId.ElShaddollConstruct))
if(Util.ChainContainsCard(CardId.ElShaddollConstruct)) {
{ if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion))
if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion)) AI.SelectNextCard(CardId.ShaddollCore);
AI.SelectNextCard(CardId.ShaddollCore); if (!ShaddollBeast_used) AI.SelectNextCard(CardId.ShaddollBeast);
if (!ShaddollBeast_used) AI.SelectNextCard(CardId.ShaddollBeast); else if (!ShaddollFalco_used) AI.SelectNextCard(CardId.ShaddollFalco);
else if (!ShaddollFalco_used) AI.SelectNextCard(CardId.ShaddollFalco); else if(!ShaddollHedgehog_used) AI.SelectNextCard(CardId.ShaddollHedgehog);
else if(!ShaddollHedgehog_used) AI.SelectNextCard(CardId.ShaddollHedgehog); }
} else
else {
{ if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion))
if (!Bot.HasInHand(CardId.ShaddollFusion) && Bot.HasInGraveyard(CardId.ShaddollFusion)) AI.SelectCard(CardId.ShaddollCore);
AI.SelectCard(CardId.ShaddollCore); if (!ShaddollBeast_used) AI.SelectCard(CardId.ShaddollBeast);
if (!ShaddollBeast_used) AI.SelectCard(CardId.ShaddollBeast); else if (!ShaddollFalco_used) AI.SelectCard(CardId.ShaddollFalco);
else if (!ShaddollFalco_used) AI.SelectCard(CardId.ShaddollFalco); else if (!ShaddollHedgehog_used) AI.SelectCard(CardId.ShaddollHedgehog);
else if (!ShaddollHedgehog_used) AI.SelectCard(CardId.ShaddollHedgehog); }
}
}
} else
else {
{ if (Enemy.GetMonsterCount() == 0) return false;
if (Enemy.GetMonsterCount() == 0) return false; ClientCard target = Util.GetBestEnemyMonster();
ClientCard target = Util.GetBestEnemyMonster(); AI.SelectCard(target);
AI.SelectCard(target); }
} return true;
return true; }
}
private bool ShaddollBeasteff()
private bool ShaddollBeasteff() {
{ ShaddollBeast_used = true;
ShaddollBeast_used = true; return true;
return true; }
}
private bool ShaddollFalcoeff()
private bool ShaddollFalcoeff() {
{ ShaddollFalco_used = true;
ShaddollFalco_used = true; if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) return true;
return true; else
else {
{ AI.SelectCard(
AI.SelectCard( CardId.ElShaddollConstruct,
CardId.ElShaddollConstruct, CardId.ElShaddollShekhinaga,
CardId.ElShaddollShekhinaga, CardId.ElShaddollGrysra,
CardId.ElShaddollGrysra, CardId.ElShaddollWinda,
CardId.ElShaddollWinda, CardId.ShaddollSquamata
CardId.ShaddollSquamata );
);
}
} return true;
return true; }
}
private bool ShaddollHedgehogeff()
private bool ShaddollHedgehogeff() {
{ ShaddollHedgehog_used = true;
ShaddollHedgehog_used = true; if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) {
{ if (Util.ChainContainsCard(CardId.ElShaddollConstruct))
if (Util.ChainContainsCard(CardId.ElShaddollConstruct)) {
{ AI.SelectNextCard(
AI.SelectNextCard( CardId.ShaddollFalco,
CardId.ShaddollFalco, CardId.ShaddollSquamata,
CardId.ShaddollSquamata, CardId.ShaddollDragon
CardId.ShaddollDragon );
);
}
} else
else {
{ AI.SelectCard(
AI.SelectCard( CardId.ShaddollSquamata,
CardId.ShaddollSquamata, CardId.ShaddollDragon
CardId.ShaddollDragon );
); }
}
}
} else
else {
{ AI.SelectCard(
AI.SelectCard( CardId.ShaddollFusion,
CardId.ShaddollFusion, CardId.SinisterShadowGames
CardId.SinisterShadowGames );
); }
} return true;
return true; }
}
private bool ShaddollDragoneff()
private bool ShaddollDragoneff() {
{ ShaddollDragon_used = true;
ShaddollDragon_used = true; if (Card.Location == CardLocation.MonsterZone)
if (Card.Location == CardLocation.MonsterZone) {
{ ClientCard target = Util.GetBestEnemyCard();
ClientCard target = Util.GetBestEnemyCard(); AI.SelectCard(target);
AI.SelectCard(target); return true;
return true; }
} else
else {
{ if (Enemy.GetSpellCount() == 0) return false;
if (Enemy.GetSpellCount() == 0) return false; ClientCard target = Util.GetBestEnemySpell();
ClientCard target = Util.GetBestEnemySpell(); AI.SelectCard(target);
AI.SelectCard(target); return true;
return true; }
} }
}
private bool LostWindeff()
private bool LostWindeff() {
{ if (Card.Location == CardLocation.Grave)
if (Card.Location == CardLocation.Grave) return true;
return true; List<ClientCard> check = Enemy.GetMonsters();
List<ClientCard> check = Enemy.GetMonsters(); foreach (ClientCard m in check)
foreach (ClientCard m in check) {
{ if (m.Attack>=2000) return DefaultBreakthroughSkill();
if (m.Attack>=2000) return DefaultBreakthroughSkill(); }
} return false;
return false; }
}
private bool FoolishBurialEffect()
private bool FoolishBurialEffect() {
{ if (Bot.GetRemainingCount(CardId.DoubleEvolutionPill, 3) > 0)
if (Bot.GetRemainingCount(CardId.DoubleEvolutionPill, 3) > 0) {
{ if (!OvertexCoatlseff_used)
if (!OvertexCoatlseff_used) {
{ AI.SelectCard(new[]
AI.SelectCard(new[] {
{ CardId.OvertexCoatls,
CardId.OvertexCoatls, });
}); return true;
return true; }
} return false;
return false; }
} else
else {
{ AI.SelectCard(CardId.ShaddollSquamata, CardId.FairyTailSnow);
AI.SelectCard(CardId.ShaddollSquamata, CardId.FairyTailSnow); }
} return true;
return true; }
}
public bool Hand_act_eff()
public bool Hand_act_eff() {
{ //if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false;
//if (Card.IsCode(CardId.Urara) && Bot.HasInHand(CardId.LockBird) && Bot.HasInSpellZone(CardId.Re)) return false; if (Card.IsCode(CardId.GhostOgre) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GhostOgre)) return false;
if (Card.IsCode(CardId.GhostOgre) && Card.Location == CardLocation.Hand && Bot.HasInMonstersZone(CardId.GhostOgre)) return false; return (Duel.LastChainPlayer == 1);
return (Duel.LastChainPlayer == 1); }
} //other extra
//other extra
private bool Michaelsp()
private bool Michaelsp() {
{ IList<int> targets = new[] {
IList<int> targets = new[] { CardId.Raiden,
CardId.Raiden, CardId.Lumina
CardId.Lumina };
}; if (!Bot.HasInMonstersZone(targets))
if (!Bot.HasInMonstersZone(targets)) return false;
return false; AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} private bool Michaeleff()
private bool Michaeleff() {
{ if (Card.Location == CardLocation.Grave)
if (Card.Location == CardLocation.Grave) return true;
return true; if (Bot.LifePoints <= 1000) return false;
if (Bot.LifePoints <= 1000) return false; ClientCard select = Util.GetBestEnemyCard();
ClientCard select = Util.GetBestEnemyCard(); if (select == null) return false;
if (select == null) return false; if(select!=null)
if(select!=null) {
{
AI.SelectCard(select);
AI.SelectCard(select); return true;
return true; }
} return false;
return false; }
}
private bool MinervaTheExaltedEffect()
private bool MinervaTheExaltedEffect() {
{ if (Card.Location == CardLocation.MonsterZone)
if (Card.Location == CardLocation.MonsterZone) {
{ if (Bot.Deck.Count <= 10) return false;
if (Bot.Deck.Count <= 10) return false; return true;
return true; }
} else
else {
{ IList<ClientCard> targets = new List<ClientCard>();
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = Util.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster(); if (target1 != null)
if (target1 != null) targets.Add(target1);
targets.Add(target1); ClientCard target2 = Util.GetBestEnemySpell();
ClientCard target2 = Util.GetBestEnemySpell(); if (target2 != null)
if (target2 != null) targets.Add(target2);
targets.Add(target2);
foreach (ClientCard target in Enemy.GetMonsters())
foreach (ClientCard target in Enemy.GetMonsters()) {
{ if (targets.Count >= 3)
if (targets.Count >= 3) break;
break; if (!targets.Contains(target))
if (!targets.Contains(target)) targets.Add(target);
targets.Add(target); }
} foreach (ClientCard target in Enemy.GetSpells())
foreach (ClientCard target in Enemy.GetSpells()) {
{ if (targets.Count >= 3)
if (targets.Count >= 3) break;
break; if (!targets.Contains(target))
if (!targets.Contains(target)) targets.Add(target);
targets.Add(target); }
} if (targets.Count == 0)
if (targets.Count == 0) return false;
return false;
AI.SelectCard(0);
AI.SelectCard(0); AI.SelectNextCard(targets);
AI.SelectNextCard(targets); return true;
return true; }
} }
}
public bool CrystronNeedlefibersp()
public bool CrystronNeedlefibersp() {
{ if (Bot.HasInMonstersZone(CardId.ElShaddollConstruct) ||
if (Bot.HasInMonstersZone(CardId.ElShaddollConstruct) || Bot.HasInMonstersZone(CardId.ElShaddollGrysra) ||
Bot.HasInMonstersZone(CardId.ElShaddollGrysra) || Bot.HasInMonstersZone(CardId.ElShaddollShekhinaga) ||
Bot.HasInMonstersZone(CardId.ElShaddollShekhinaga) || Bot.HasInMonstersZone(CardId.ElShaddollWinda))
Bot.HasInMonstersZone(CardId.ElShaddollWinda)) return false;
return false;
if (CrystronNeedlefibereff_used) return false;
if (CrystronNeedlefibereff_used) return false; if (Bot.HasInMonstersZone(CardId.CrystronNeedlefiber)) return false;
if (Bot.HasInMonstersZone(CardId.CrystronNeedlefiber)) return false; IList<int> check = new[]
IList<int> check = new[] {
{ CardId.GlowUpBulb,
CardId.GlowUpBulb, CardId.FairyTailSnow,
CardId.FairyTailSnow, CardId.KeeperOfDragonicMagic,
CardId.KeeperOfDragonicMagic, CardId.SouleatingOviraptor,
CardId.SouleatingOviraptor, CardId.GiantRex,
CardId.GiantRex, CardId.Lumina,
CardId.Lumina, CardId.Raiden,
CardId.Raiden,
};
}; int count=0;
int count=0; foreach (ClientCard monster in Bot.GetMonsters())
foreach (ClientCard monster in Bot.GetMonsters()) if (monster.IsCode(CardId.GlowUpBulb, CardId.FairyTailSnow, CardId.KeeperOfDragonicMagic,
if (monster.IsCode(CardId.GlowUpBulb, CardId.FairyTailSnow, CardId.KeeperOfDragonicMagic, CardId.SouleatingOviraptor, CardId.GiantRex, CardId.Lumina, CardId.Raiden))
CardId.SouleatingOviraptor, CardId.GiantRex, CardId.Lumina, CardId.Raiden)) count++;
count++; if (!Bot.HasInMonstersZone(CardId.GlowUpBulb) || count<2)
if (!Bot.HasInMonstersZone(CardId.GlowUpBulb) || count<2) return false;
return false; AI.SelectCard(check);
AI.SelectCard(check); AI.SelectNextCard(check);
AI.SelectNextCard(check);
return true;
return true; }
}
public bool CrystronNeedlefibereff()
public bool CrystronNeedlefibereff() {
{ bool DarkHole = false;
bool DarkHole = false; foreach (ClientCard card in Enemy.GetSpells())
foreach (ClientCard card in Enemy.GetSpells()) {
{ if (card.IsCode(53129443) && card.IsFaceup())
if (card.IsCode(53129443) && card.IsFaceup()) {
{ DarkHole = true;
DarkHole = true; }
} }
} if (Duel.Player == 0)
if (Duel.Player == 0) {
{
CrystronNeedlefibereff_used = true;
CrystronNeedlefibereff_used = true; AI.SelectCard(
AI.SelectCard( CardId.GhostOgre,
CardId.GhostOgre, CardId.GlowUpBulb,
CardId.GlowUpBulb, CardId.PlaguespreaderZombie,
CardId.PlaguespreaderZombie, CardId.ShaddollFalco
CardId.ShaddollFalco );
); return true;
return true; }
}
else if (DarkHole || Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null)
else if (DarkHole || Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null) {
{ AI.SelectCard(CardId.TG_WonderMagician);
AI.SelectCard(CardId.TG_WonderMagician); return true;
return true; }
}
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(1500, true))
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(1500, true)) {
{ AI.SelectCard(CardId.TG_WonderMagician);
AI.SelectCard(CardId.TG_WonderMagician); if (Util.IsOneEnemyBetterThanValue(1900, true))
if (Util.IsOneEnemyBetterThanValue(1900, true)) {
{ AI.SelectPosition(CardPosition.FaceUpDefence);
AI.SelectPosition(CardPosition.FaceUpDefence); }
} else
else {
{ AI.SelectPosition(CardPosition.FaceUpAttack);
AI.SelectPosition(CardPosition.FaceUpAttack); }
} return true;
return true; }
} return false;
return false; }
}
private bool ScarlightRedDragonsp()
private bool ScarlightRedDragonsp() {
{ return false;
return false; }
}
private bool ScarlightRedDragoneff()
private bool ScarlightRedDragoneff() {
{ IList<ClientCard> targets = new List<ClientCard>();
IList<ClientCard> targets = new List<ClientCard>(); ClientCard target1 = Util.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster(); if (target1 != null)
if (target1 != null) {
{ targets.Add(target1);
targets.Add(target1); AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} return false;
return false; }
}
private bool CrystalWingSynchroDragoneff()
private bool CrystalWingSynchroDragoneff() {
{ return Duel.LastChainPlayer != 0;
return Duel.LastChainPlayer != 0; }
}
private bool Sdulldeateff()
private bool Sdulldeateff() {
{ /* if (snake_four_s)
/* if (snake_four_s) {
{ snake_four_s = false;
snake_four_s = false; AI.SelectCard(Useless_List());
AI.SelectCard(Useless_List()); return true;
return true; }
} //if (ActivateDescription == Util.GetStringId(CardId.snake, 2)) return true;
//if (ActivateDescription == Util.GetStringId(CardId.snake, 2)) return true; if (ActivateDescription == Util.GetStringId(CardId.snake, 1))
if (ActivateDescription == Util.GetStringId(CardId.snake, 1)) {
{ foreach (ClientCard hand in Bot.Hand)
foreach (ClientCard hand in Bot.Hand) {
{ if (hand.IsCode(CardId.Red, CardId.Pink))
if (hand.IsCode(CardId.Red, CardId.Pink)) {
{ AI.SelectCard(hand);
AI.SelectCard(hand); return true;
return true; }
} if (hand.IsCode(CardId.Urara, CardId.Ghost))
if (hand.IsCode(CardId.Urara, CardId.Ghost)) {
{ if (Tuner_ss())
if (Tuner_ss()) {
{ AI.SelectCard(hand);
AI.SelectCard(hand); return true;
return true; }
} }
} }
} }*/
}*/ return false;
return false; }
}
private bool BlackRoseMoonlightDragoneff()
private bool BlackRoseMoonlightDragoneff() {
{ IList<ClientCard> targets = new List<ClientCard>();
IList<ClientCard> targets = new List<ClientCard>(); ClientCard target1 = Util.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster(); if (target1 != null)
if (target1 != null) {
{ targets.Add(target1);
targets.Add(target1); AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} return false;
return false;
}
}
private bool RedWyvernsp()
private bool RedWyvernsp() {
{ return false;
return false; }
}
private bool RedWyverneff()
private bool RedWyverneff() {
{ IList<ClientCard> check = Enemy.GetMonsters();
IList<ClientCard> check = Enemy.GetMonsters(); ClientCard best = null;
ClientCard best = null; foreach (ClientCard monster in check)
foreach (ClientCard monster in check) {
{ if (monster.Attack >= 2400) best = monster;
if (monster.Attack >= 2400) best = monster; }
} if (best != null)
if (best != null) {
{ AI.SelectCard(best);
AI.SelectCard(best); return true;
return true; }
} return false;
return false; }
}
private bool CoralDragoneff()
private bool CoralDragoneff() {
{ if (Card.Location != CardLocation.MonsterZone)
if (Card.Location != CardLocation.MonsterZone) return true;
return true; IList<ClientCard> targets = new List<ClientCard>();
IList<ClientCard> targets = new List<ClientCard>();
ClientCard target1 = Util.GetBestEnemyMonster();
ClientCard target1 = Util.GetBestEnemyMonster(); if (target1 != null)
if (target1 != null) targets.Add(target1);
targets.Add(target1); ClientCard target2 = Util.GetBestEnemySpell();
ClientCard target2 = Util.GetBestEnemySpell(); if (target2 != null)
if (target2 != null) targets.Add(target2);
targets.Add(target2); else if (Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null)
else if (Util.IsChainTarget(Card) || Util.GetProblematicEnemySpell() != null) {
{ AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(2400, true))
else if (Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Util.IsOneEnemyBetterThanValue(2400, true)) {
{ AI.SelectCard(targets);
AI.SelectCard(targets); return true;
return true; }
} return false;
return false; }
}
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) {
{ if (!defender.IsMonsterHasPreventActivationEffectInBattle())
if (!defender.IsMonsterHasPreventActivationEffectInBattle()) {
{ if (attacker.IsCode(CardId.ElShaddollConstruct) && !attacker.IsDisabled()) // TODO: && defender.IsSpecialSummoned
if (attacker.IsCode(CardId.ElShaddollConstruct) && !attacker.IsDisabled()) // TODO: && defender.IsSpecialSummoned attacker.RealPower = 9999;
attacker.RealPower = 9999; if (attacker.IsCode(CardId.UltimateConductorTytanno) && !attacker.IsDisabled() && defender.IsDefense())
if (attacker.IsCode(CardId.UltimateConductorTytanno) && !attacker.IsDisabled() && defender.IsDefense()) attacker.RealPower = 9999;
attacker.RealPower = 9999; }
} return base.OnPreBattleBetween(attacker, defender);
return base.OnPreBattleBetween(attacker, defender); }
}
public override bool OnSelectHand()
public override bool OnSelectHand() {
{ return true;
return true; }
} /*
/* private bool GoblindberghSummon()
private bool GoblindberghSummon() {
{ foreach (ClientCard card in Bot.Hand.GetMonsters())
foreach (ClientCard card in Bot.Hand.GetMonsters()) {
{ if (!card.Equals(Card) && card.Level == 4)
if (!card.Equals(Card) && card.Level == 4) return true;
return true; }
} return false;
return false; }*/
}*/
}
}
} }
\ No newline at end of file
using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic;
using System.Linq;
using WindBot;
using WindBot.Game;
using WindBot.Game.AI;
namespace WindBot.Game.AI.Decks
{
[Deck("Lucky", "AI_Test", "Test")]
public class LuckyExecutor : DefaultExecutor
{
public LuckyExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, ImFeelingLucky);
AddExecutor(ExecutorType.SpSummon, ImFeelingLucky);
AddExecutor(ExecutorType.SpSummon, ImFeelingUnlucky);
AddExecutor(ExecutorType.Activate, ImFeelingUnlucky);
AddExecutor(ExecutorType.SummonOrSet, ImFeelingLazy);
AddExecutor(ExecutorType.SpellSet, DefaultSpellSet);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Activate, _CardId.MysticalSpaceTyphoon, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, _CardId.CosmicCyclone, DefaultCosmicCyclone);
AddExecutor(ExecutorType.Activate, _CardId.GalaxyCyclone, DefaultGalaxyCyclone);
AddExecutor(ExecutorType.Activate, _CardId.BookOfMoon, DefaultBookOfMoon);
AddExecutor(ExecutorType.Activate, _CardId.CompulsoryEvacuationDevice, DefaultCompulsoryEvacuationDevice);
AddExecutor(ExecutorType.Activate, _CardId.CallOfTheHaunted, DefaultCallOfTheHaunted);
AddExecutor(ExecutorType.Activate, _CardId.Scapegoat, DefaultScapegoat);
AddExecutor(ExecutorType.Activate, _CardId.MaxxC, DefaultMaxxC);
AddExecutor(ExecutorType.Activate, _CardId.AshBlossom, DefaultAshBlossomAndJoyousSpring);
AddExecutor(ExecutorType.Activate, _CardId.GhostOgreAndSnowRabbit, DefaultGhostOgreAndSnowRabbit);
AddExecutor(ExecutorType.Activate, _CardId.GhostBelle, DefaultGhostBelleAndHauntedMansion);
AddExecutor(ExecutorType.Activate, _CardId.EffectVeiler, DefaultEffectVeiler);
AddExecutor(ExecutorType.Activate, _CardId.CalledByTheGrave, DefaultCalledByTheGrave);
AddExecutor(ExecutorType.Activate, _CardId.InfiniteImpermanence, DefaultInfiniteImpermanence);
AddExecutor(ExecutorType.Activate, _CardId.BreakthroughSkill, DefaultBreakthroughSkill);
AddExecutor(ExecutorType.Activate, _CardId.SolemnJudgment, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, _CardId.SolemnWarning, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, _CardId.SolemnStrike, DefaultSolemnStrike);
AddExecutor(ExecutorType.Activate, _CardId.TorrentialTribute, DefaultTorrentialTribute);
AddExecutor(ExecutorType.Activate, _CardId.HeavyStorm, DefaultHeavyStorm);
AddExecutor(ExecutorType.Activate, _CardId.HarpiesFeatherDuster, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, _CardId.HammerShot, DefaultHammerShot);
AddExecutor(ExecutorType.Activate, _CardId.DarkHole, DefaultDarkHole);
AddExecutor(ExecutorType.Activate, _CardId.Raigeki, DefaultRaigeki);
AddExecutor(ExecutorType.Activate, _CardId.SmashingGround, DefaultSmashingGround);
AddExecutor(ExecutorType.Activate, _CardId.PotOfDesires, DefaultPotOfDesires);
AddExecutor(ExecutorType.Activate, _CardId.AllureofDarkness, DefaultAllureofDarkness);
AddExecutor(ExecutorType.Activate, _CardId.DimensionalBarrier, DefaultDimensionalBarrier);
AddExecutor(ExecutorType.Activate, _CardId.InterruptedKaijuSlumber, DefaultInterruptedKaijuSlumber);
AddExecutor(ExecutorType.SpSummon, _CardId.JizukirutheStarDestroyingKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.GadarlatheMysteryDustKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.GamecieltheSeaTurtleKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.RadiantheMultidimensionalKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.KumongoustheStickyStringKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.ThunderKingtheLightningstrikeKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.DogorantheMadFlameKaiju, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.SuperAntiKaijuWarMachineMechaDogoran, DefaultKaijuSpsummon);
AddExecutor(ExecutorType.SpSummon, _CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightSummon);
AddExecutor(ExecutorType.Activate, _CardId.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect);
AddExecutor(ExecutorType.Summon, _CardId.SandaionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.GabrionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.MichionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.ZaphionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.HailonTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.RaphionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.SadionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.MetaionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.KamionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.LazionTheTimelord, DefaultTimelordSummon);
AddExecutor(ExecutorType.Summon, _CardId.LeftArmofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.RightLegofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.LeftLegofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.RightArmofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.ExodiaTheForbiddenOne, JustDontIt);
}
private List<int> HintMsgForEnemy = new List<int>
{
HintMsg.Release, HintMsg.Destroy, HintMsg.Remove, HintMsg.ToGrave, HintMsg.ReturnToHand, HintMsg.ToDeck,
HintMsg.FusionMaterial, HintMsg.SynchroMaterial, HintMsg.XyzMaterial, HintMsg.LinkMaterial, HintMsg.Disable
};
private List<int> HintMsgForDeck = new List<int>
{
HintMsg.SpSummon, HintMsg.ToGrave, HintMsg.Remove, HintMsg.AddToHand, HintMsg.FusionMaterial
};
private List<int> HintMsgForSelf = new List<int>
{
HintMsg.Equip
};
private List<int> HintMsgForMaterial = new List<int>
{
HintMsg.FusionMaterial, HintMsg.SynchroMaterial, HintMsg.XyzMaterial, HintMsg.LinkMaterial, HintMsg.Release
};
private List<int> HintMsgForMaxSelect = new List<int>
{
HintMsg.SpSummon, HintMsg.ToGrave, HintMsg.AddToHand, HintMsg.FusionMaterial, HintMsg.Destroy
};
public override IList<ClientCard> OnSelectCard(IList<ClientCard> _cards, int min, int max, int hint, bool cancelable)
{
if (Duel.Phase == DuelPhase.BattleStart)
return null;
if (AI.HaveSelectedCards())
return null;
IList<ClientCard> selected = new List<ClientCard>();
IList<ClientCard> cards = new List<ClientCard>(_cards);
if (max > cards.Count)
max = cards.Count;
if (HintMsgForEnemy.Contains(hint))
{
IList<ClientCard> enemyCards = cards.Where(card => card.Controller == 1).ToList();
// select enemy's card first
while (enemyCards.Count > 0 && selected.Count < max)
{
ClientCard card = enemyCards[Program.Rand.Next(enemyCards.Count)];
selected.Add(card);
enemyCards.Remove(card);
cards.Remove(card);
}
}
if (HintMsgForDeck.Contains(hint))
{
IList<ClientCard> deckCards = cards.Where(card => card.Location == CardLocation.Deck).ToList();
// select deck's card first
while (deckCards.Count > 0 && selected.Count < max)
{
ClientCard card = deckCards[Program.Rand.Next(deckCards.Count)];
selected.Add(card);
deckCards.Remove(card);
cards.Remove(card);
}
}
if (HintMsgForSelf.Contains(hint))
{
IList<ClientCard> botCards = cards.Where(card => card.Controller == 0).ToList();
// select bot's card first
while (botCards.Count > 0 && selected.Count < max)
{
ClientCard card = botCards[Program.Rand.Next(botCards.Count)];
selected.Add(card);
botCards.Remove(card);
cards.Remove(card);
}
}
if (HintMsgForMaterial.Contains(hint))
{
IList<ClientCard> materials = cards.OrderBy(card => card.Attack).ToList();
// select low attack first
while (materials.Count > 0 && selected.Count < min)
{
ClientCard card = materials[0];
selected.Add(card);
materials.Remove(card);
cards.Remove(card);
}
}
// select random cards
while (selected.Count < min)
{
ClientCard card = cards[Program.Rand.Next(cards.Count)];
selected.Add(card);
cards.Remove(card);
}
if (HintMsgForMaxSelect.Contains(hint))
{
// select max cards
while (selected.Count < max)
{
ClientCard card = cards[Program.Rand.Next(cards.Count)];
selected.Add(card);
cards.Remove(card);
}
}
return selected;
}
public override int OnSelectOption(IList<int> options)
{
return Program.Rand.Next(options.Count);
}
public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{
YGOSharp.OCGWrapper.NamedCard cardData = YGOSharp.OCGWrapper.NamedCard.Get(cardId);
if (cardData != null)
{
if (cardData.Attack < 0)
return CardPosition.FaceUpAttack;
if (cardData.Attack <= 1000)
return CardPosition.FaceUpDefence;
}
return 0;
}
private bool ImFeelingLucky()
{
return Program.Rand.Next(10) >= 5 && DefaultDontChainMyself();
}
private bool ImFeelingUnlucky()
{
return DefaultDontChainMyself();
}
private bool ImFeelingLazy()
{
if (Executors.Any(exec => (exec.Type == ExecutorType.SummonOrSet || exec.Type == ExecutorType.Summon || exec.Type == ExecutorType.MonsterSet) && exec.CardId == Card.Id))
return false;
return DefaultMonsterSummon();
}
private bool JustDontIt()
{
return false;
}
}
}
\ No newline at end of file
...@@ -46,8 +46,8 @@ namespace WindBot.Game.AI.Decks ...@@ -46,8 +46,8 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.SwordsOfRevealingLight, SwordsOfRevealingLight); AddExecutor(ExecutorType.Activate, CardId.SwordsOfRevealingLight, SwordsOfRevealingLight);
AddExecutor(ExecutorType.Activate, CardId.DoubleSummon, DoubleSummon); AddExecutor(ExecutorType.Activate, CardId.DoubleSummon, DoubleSummon);
AddExecutor(ExecutorType.Summon, CardId.AncientGearGolem, DefaultTributeSummon); AddExecutor(ExecutorType.Summon, CardId.AncientGearGolem, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.Frostosaurus, DefaultTributeSummon); AddExecutor(ExecutorType.Summon, CardId.Frostosaurus, DefaultMonsterSummon);
AddExecutor(ExecutorType.SummonOrSet, CardId.AlexandriteDragon); AddExecutor(ExecutorType.SummonOrSet, CardId.AlexandriteDragon);
AddExecutor(ExecutorType.SummonOrSet, CardId.GeneWarpedWarwolf); AddExecutor(ExecutorType.SummonOrSet, CardId.GeneWarpedWarwolf);
AddExecutor(ExecutorType.MonsterSet, CardId.GearGolemTheMovingFortress); AddExecutor(ExecutorType.MonsterSet, CardId.GearGolemTheMovingFortress);
......
...@@ -181,7 +181,6 @@ namespace WindBot.Game.AI.Decks ...@@ -181,7 +181,6 @@ namespace WindBot.Game.AI.Decks
private bool CymbalSkeletonUsed = false; private bool CymbalSkeletonUsed = false;
private bool BorrelswordDragonUsed = false; private bool BorrelswordDragonUsed = false;
private ClientCard RustyBardicheTarget = null; private ClientCard RustyBardicheTarget = null;
private int ShootingRiserDragonCount = 0;
private int[] HandCosts = new[] private int[] HandCosts = new[]
{ {
...@@ -215,7 +214,6 @@ namespace WindBot.Game.AI.Decks ...@@ -215,7 +214,6 @@ namespace WindBot.Game.AI.Decks
CymbalSkeletonUsed = false; CymbalSkeletonUsed = false;
BorrelswordDragonUsed = false; BorrelswordDragonUsed = false;
RustyBardicheTarget = null; RustyBardicheTarget = null;
ShootingRiserDragonCount = 0;
} }
public override void OnChainEnd() public override void OnChainEnd()
...@@ -611,10 +609,7 @@ namespace WindBot.Game.AI.Decks ...@@ -611,10 +609,7 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
if (Duel.LastChainPlayer == 0) return Duel.LastChainPlayer != 0;
return false;
ShootingRiserDragonCount++;
return ShootingRiserDragonCount <= 10;
} }
} }
...@@ -825,8 +820,8 @@ namespace WindBot.Game.AI.Decks ...@@ -825,8 +820,8 @@ namespace WindBot.Game.AI.Decks
if (ActivateDescription == 96) if (ActivateDescription == 96)
{ {
// TODO: more FogBlade lost target // TODO: more FogBlade lost target
if ((Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && Duel.CurrentChain.Count == 0) if ((Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) && Duel.CurrentChain.Count == 0)
return false; return false;
AI.SelectCard(CardId.OrcustCymbalSkeleton); AI.SelectCard(CardId.OrcustCymbalSkeleton);
return true; return true;
} }
...@@ -1130,22 +1125,22 @@ namespace WindBot.Game.AI.Decks ...@@ -1130,22 +1125,22 @@ namespace WindBot.Game.AI.Decks
{ {
return Duel.LastChainPlayer == 1; return Duel.LastChainPlayer == 1;
} }
else if (Duel.Phase == DuelPhase.End) else if (Duel.Phase == DuelPhase.End)
{ {
ClientCard target = null; ClientCard target = null;
target = Bot.Banished.GetFirstMatchingFaceupCard(card=>card.IsCode(CardId.OrcustCymbalSkeleton)); target = Bot.Banished.GetFirstMatchingFaceupCard(card=>card.IsCode(CardId.OrcustCymbalSkeleton));
if (target == null) if (target == null)
target = Bot.Banished.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.OrcustHarpHorror)); target = Bot.Banished.GetFirstMatchingFaceupCard(card => card.IsCode(CardId.OrcustHarpHorror));
if (target != null) if (target != null)
{ {
AI.SelectCard(target); AI.SelectCard(target);
return true; return true;
} }
if(!Bot.HasInHand(CardId.OrcustHarpHorror) && Bot.GetRemainingCount(CardId.OrcustHarpHorror, 2) > 1) if(!Bot.HasInHand(CardId.OrcustHarpHorror) && Bot.GetRemainingCount(CardId.OrcustHarpHorror, 2) > 1)
{ {
AI.SelectCard(CardId.OrcustHarpHorror); AI.SelectCard(CardId.OrcustHarpHorror);
return true; return true;
} }
} }
return false; return false;
} }
......
...@@ -117,13 +117,11 @@ namespace WindBot.Game.AI.Decks ...@@ -117,13 +117,11 @@ namespace WindBot.Game.AI.Decks
bool summon_used = false; bool summon_used = false;
bool CardOfDemiseeff_used = false; bool CardOfDemiseeff_used = false;
bool SeaStealthAttackeff_used = false; bool SeaStealthAttackeff_used = false;
int City_count = 0;
public override void OnNewTurn() public override void OnNewTurn()
{ {
summon_used = false; summon_used = false;
CardOfDemiseeff_used = false; CardOfDemiseeff_used = false;
SeaStealthAttackeff_used = false; SeaStealthAttackeff_used = false;
City_count = 0;
base.OnNewTurn(); base.OnNewTurn();
} }
private bool PreventFeatherDustereff() private bool PreventFeatherDustereff()
...@@ -356,9 +354,6 @@ namespace WindBot.Game.AI.Decks ...@@ -356,9 +354,6 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
if (City_count > 10)
return false;
ClientCard target = null; ClientCard target = null;
foreach(ClientCard s in Bot.GetSpells()) foreach(ClientCard s in Bot.GetSpells())
{ {
...@@ -380,7 +375,6 @@ namespace WindBot.Game.AI.Decks ...@@ -380,7 +375,6 @@ namespace WindBot.Game.AI.Decks
break; break;
} }
} }
City_count++;
AI.SelectPlace(Zones.z1 | Zones.z3); AI.SelectPlace(Zones.z1 | Zones.z3);
AI.SelectCard(CardId.PhantasmSprialBattle); AI.SelectCard(CardId.PhantasmSprialBattle);
return true; return true;
......
...@@ -215,8 +215,7 @@ namespace WindBot.Game.AI.Decks ...@@ -215,8 +215,7 @@ namespace WindBot.Game.AI.Decks
private bool Summon_used; private bool Summon_used;
private bool Pilica_eff; private bool Pilica_eff;
private bool plan_A; private bool plan_A;
private int SnowBell_count = 0;
//TODO: reset the flags when they should reset ( public override void OnNewTurn() )
public PureWindsExecutor(GameAI ai, Duel duel) public PureWindsExecutor(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
{ {
...@@ -302,7 +301,6 @@ namespace WindBot.Game.AI.Decks ...@@ -302,7 +301,6 @@ namespace WindBot.Game.AI.Decks
Summon_used = false; Summon_used = false;
Pilica_eff = false; Pilica_eff = false;
plan_A = false; plan_A = false;
SnowBell_count = 0;
base.OnNewTurn(); base.OnNewTurn();
} }
private bool windaset() private bool windaset()
...@@ -770,7 +768,6 @@ namespace WindBot.Game.AI.Decks ...@@ -770,7 +768,6 @@ namespace WindBot.Game.AI.Decks
private bool WindwitchSnowBellsp() private bool WindwitchSnowBellsp()
{ {
if (SnowBell_count >= 5) return false;
if ((Bot.HasInMonstersZone(CardId.CrystalWingSynchroDragon) || if ((Bot.HasInMonstersZone(CardId.CrystalWingSynchroDragon) ||
Bot.HasInMonstersZone(CardId.DaigustoSphreez) || Bot.HasInMonstersZone(CardId.DaigustoSphreez) ||
Bot.HasInMonstersZone(CardId.MistWurm)) && Bot.HasInMonstersZone(CardId.MistWurm)) &&
...@@ -786,7 +783,6 @@ namespace WindBot.Game.AI.Decks ...@@ -786,7 +783,6 @@ namespace WindBot.Game.AI.Decks
(Util.GetBotAvailZonesFromExtraDeck() == 0)) (Util.GetBotAvailZonesFromExtraDeck() == 0))
return false; return false;
AI.SelectPosition(CardPosition.FaceUpDefence); AI.SelectPosition(CardPosition.FaceUpDefence);
SnowBell_count++;
return true; return true;
} }
private bool DaigustoSphreezsp() private bool DaigustoSphreezsp()
......
using YGOSharp.OCGWrapper; using YGOSharp.OCGWrapper;
using YGOSharp.OCGWrapper.Enums; using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic; using System.Collections.Generic;
using WindBot; using WindBot;
using WindBot.Game; using WindBot.Game;
using WindBot.Game.AI; using WindBot.Game.AI;
using System.Linq; using System.Linq;
namespace WindBot.Game.AI.Decks namespace WindBot.Game.AI.Decks
{ {
[Deck("TimeThief", "AI_Timethief")] [Deck("TimeThief", "AI_Timethief")]
public class TimeThiefExecutor : DefaultExecutor public class TimeThiefExecutor : DefaultExecutor
{ {
public class Monsters public class Monsters
{ {
//monsters //monsters
public const int TimeThiefWinder = 56308388; public const int TimeThiefWinder = 56308388;
public const int TimeThiefBezelShip = 82496079; public const int TimeThiefBezelShip = 82496079;
public const int TimeThiefCronocorder = 74578720; public const int TimeThiefCronocorder = 74578720;
public const int TimeThiefRegulator = 19891131; public const int TimeThiefRegulator = 19891131;
public const int PhotonTrasher = 65367484; public const int PhotonTrasher = 65367484;
public const int PerformTrickClown = 67696066; public const int PerformTrickClown = 67696066;
public const int ThunderKingRaiOh = 71564252; public const int ThunderKingRaiOh = 71564252;
public const int MaxxC = 23434538; public const int MaxxC = 23434538;
public const int AshBlossomAndJoyousSpring = 14558127; public const int AshBlossomAndJoyousSpring = 14558127;
} }
public class CardId public class CardId
{ {
public const int ImperialOrder = 61740673; public const int ImperialOrder = 61740673;
public const int NaturalExterio = 99916754; public const int NaturalExterio = 99916754;
public const int NaturalBeast = 33198837; public const int NaturalBeast = 33198837;
public const int SwordsmanLV7 = 37267041; public const int SwordsmanLV7 = 37267041;
public const int RoyalDecreel = 51452091; public const int RoyalDecreel = 51452091;
} }
public class Spells public class Spells
{ {
// spells // spells
public const int Raigeki = 12580477; public const int Raigeki = 12580477;
public const int FoolishBurial = 81439173; public const int FoolishBurial = 81439173;
public const int TimeThiefStartup = 10877309; public const int TimeThiefStartup = 10877309;
public const int TimeThiefHack = 81670445; public const int TimeThiefHack = 81670445;
public const int HarpieFeatherDuster = 18144506; public const int HarpieFeatherDuster = 18144506;
public const int PotOfDesires = 35261759; public const int PotOfDesires = 35261759;
public const int PotofExtravagance = 49238328; public const int PotofExtravagance = 49238328;
} }
public class Traps public class Traps
{ {
//traps //traps
public const int SolemnWarning = 84749824; public const int SolemnWarning = 84749824;
public const int SolemStrike = 40605147; public const int SolemStrike = 40605147;
public const int SolemnJudgment = 41420027; public const int SolemnJudgment = 41420027;
public const int TimeThiefRetrograte = 76587747; public const int TimeThiefRetrograte = 76587747;
public const int PhantomKnightsShade = 98827725; public const int PhantomKnightsShade = 98827725;
public const int TimeThiefFlyBack = 18678554; public const int TimeThiefFlyBack = 18678554;
public const int Crackdown = 36975314; public const int Crackdown = 36975314;
} }
public class XYZs public class XYZs
{ {
//xyz //xyz
public const int TimeThiefRedoer = 55285840; public const int TimeThiefRedoer = 55285840;
public const int TimeThiefPerpetua = 59208943; public const int TimeThiefPerpetua = 59208943;
public const int CrazyBox = 42421606; public const int CrazyBox = 42421606;
public const int GagagaCowboy = 12014404; public const int GagagaCowboy = 12014404;
public const int Number39Utopia = 84013237; public const int Number39Utopia = 84013237;
public const int NumberS39UtopiatheLightning = 56832966; public const int NumberS39UtopiatheLightning = 56832966;
public const int NumberS39UtopiaOne = 86532744; public const int NumberS39UtopiaOne = 86532744;
public const int DarkRebellionXyzDragon = 16195942; public const int DarkRebellionXyzDragon = 16195942;
public const int EvilswarmExcitonKnight = 46772449; public const int EvilswarmExcitonKnight = 46772449;
} }
public TimeThiefExecutor(GameAI ai, Duel duel) public TimeThiefExecutor(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
{ {
// executors // executors
//Spell activate //Spell activate
AddExecutor(ExecutorType.Activate, Spells.Raigeki, DefaultDarkHole); AddExecutor(ExecutorType.Activate, Spells.Raigeki, DefaultDarkHole);
AddExecutor(ExecutorType.Activate, Spells.FoolishBurial, FoolishBurialTarget); AddExecutor(ExecutorType.Activate, Spells.FoolishBurial, FoolishBurialTarget);
AddExecutor(ExecutorType.Activate, Spells.TimeThiefStartup, TimeThiefStartupEffect); AddExecutor(ExecutorType.Activate, Spells.TimeThiefStartup, TimeThiefStartupEffect);
AddExecutor(ExecutorType.Activate, Spells.TimeThiefHack); AddExecutor(ExecutorType.Activate, Spells.TimeThiefHack);
AddExecutor(ExecutorType.Activate, Spells.PotofExtravagance, PotofExtravaganceActivate); AddExecutor(ExecutorType.Activate, Spells.PotofExtravagance, PotofExtravaganceActivate);
AddExecutor(ExecutorType.Activate, Spells.HarpieFeatherDuster, DefaultHarpiesFeatherDusterFirst); AddExecutor(ExecutorType.Activate, Spells.HarpieFeatherDuster, DefaultHarpiesFeatherDusterFirst);
AddExecutor(ExecutorType.Activate, Spells.PotOfDesires, PotOfDesireseff); AddExecutor(ExecutorType.Activate, Spells.PotOfDesires, PotOfDesireseff);
// trap executors set // trap executors set
AddExecutor(ExecutorType.SpellSet, Traps.PhantomKnightsShade); AddExecutor(ExecutorType.SpellSet, Traps.PhantomKnightsShade);
AddExecutor(ExecutorType.SpellSet, Traps.TimeThiefRetrograte); AddExecutor(ExecutorType.SpellSet, Traps.TimeThiefRetrograte);
AddExecutor(ExecutorType.SpellSet, Traps.TimeThiefFlyBack); AddExecutor(ExecutorType.SpellSet, Traps.TimeThiefFlyBack);
AddExecutor(ExecutorType.SpellSet, Traps.SolemnWarning); AddExecutor(ExecutorType.SpellSet, Traps.SolemnWarning);
AddExecutor(ExecutorType.SpellSet, Traps.SolemStrike); AddExecutor(ExecutorType.SpellSet, Traps.SolemStrike);
AddExecutor(ExecutorType.SpellSet, Traps.SolemnJudgment); AddExecutor(ExecutorType.SpellSet, Traps.SolemnJudgment);
AddExecutor(ExecutorType.SpellSet, Traps.Crackdown); AddExecutor(ExecutorType.SpellSet, Traps.Crackdown);
//normal summons //normal summons
AddExecutor(ExecutorType.Summon, Monsters.TimeThiefRegulator); AddExecutor(ExecutorType.Summon, Monsters.TimeThiefRegulator);
AddExecutor(ExecutorType.SpSummon, Monsters.PhotonTrasher, SummonToDef); AddExecutor(ExecutorType.SpSummon, Monsters.PhotonTrasher, SummonToDef);
AddExecutor(ExecutorType.Summon, Monsters.TimeThiefWinder); AddExecutor(ExecutorType.Summon, Monsters.TimeThiefWinder);
AddExecutor(ExecutorType.Summon, Monsters.TimeThiefBezelShip); AddExecutor(ExecutorType.Summon, Monsters.TimeThiefBezelShip);
AddExecutor(ExecutorType.Summon, Monsters.PerformTrickClown); AddExecutor(ExecutorType.Summon, Monsters.PerformTrickClown);
AddExecutor(ExecutorType.Summon, Monsters.TimeThiefCronocorder); AddExecutor(ExecutorType.Summon, Monsters.TimeThiefCronocorder);
AddExecutor(ExecutorType.Summon, Monsters.ThunderKingRaiOh, ThunderKingRaiOhsummon); AddExecutor(ExecutorType.Summon, Monsters.ThunderKingRaiOh, ThunderKingRaiOhsummon);
//xyz summons //xyz summons
AddExecutor(ExecutorType.SpSummon, XYZs.TimeThiefRedoer); AddExecutor(ExecutorType.SpSummon, XYZs.TimeThiefRedoer);
AddExecutor(ExecutorType.SpSummon, XYZs.TimeThiefPerpetua); AddExecutor(ExecutorType.SpSummon, XYZs.TimeThiefPerpetua);
AddExecutor(ExecutorType.SpSummon, XYZs.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightSummon); AddExecutor(ExecutorType.SpSummon, XYZs.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightSummon);
AddExecutor(ExecutorType.SpSummon, XYZs.GagagaCowboy, GagagaCowboySummon); AddExecutor(ExecutorType.SpSummon, XYZs.GagagaCowboy, GagagaCowboySummon);
AddExecutor(ExecutorType.SpSummon, XYZs.Number39Utopia, DefaultNumberS39UtopiaTheLightningSummon); AddExecutor(ExecutorType.SpSummon, XYZs.Number39Utopia, DefaultNumberS39UtopiaTheLightningSummon);
AddExecutor(ExecutorType.SpSummon, XYZs.NumberS39UtopiaOne); AddExecutor(ExecutorType.SpSummon, XYZs.NumberS39UtopiaOne);
AddExecutor(ExecutorType.SpSummon, XYZs.NumberS39UtopiatheLightning); AddExecutor(ExecutorType.SpSummon, XYZs.NumberS39UtopiatheLightning);
AddExecutor(ExecutorType.SpSummon, XYZs.DarkRebellionXyzDragon, DarkRebellionXyzDragonSummon); AddExecutor(ExecutorType.SpSummon, XYZs.DarkRebellionXyzDragon, DarkRebellionXyzDragonSummon);
//activate trap //activate trap
AddExecutor(ExecutorType.Activate, Traps.PhantomKnightsShade); AddExecutor(ExecutorType.Activate, Traps.PhantomKnightsShade);
AddExecutor(ExecutorType.Activate, Traps.TimeThiefRetrograte, RetrograteEffect); AddExecutor(ExecutorType.Activate, Traps.TimeThiefRetrograte, RetrograteEffect);
AddExecutor(ExecutorType.Activate, Traps.TimeThiefFlyBack); AddExecutor(ExecutorType.Activate, Traps.TimeThiefFlyBack);
AddExecutor(ExecutorType.Activate, Traps.SolemnWarning, DefaultSolemnWarning); AddExecutor(ExecutorType.Activate, Traps.SolemnWarning, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, Traps.SolemStrike, DefaultSolemnStrike); AddExecutor(ExecutorType.Activate, Traps.SolemStrike, DefaultSolemnStrike);
AddExecutor(ExecutorType.Activate, Traps.SolemnJudgment, DefaultSolemnJudgment); AddExecutor(ExecutorType.Activate, Traps.SolemnJudgment, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, Traps.Crackdown, Crackdowneff); AddExecutor(ExecutorType.Activate, Traps.Crackdown, Crackdowneff);
//xyz effects //xyz effects
AddExecutor(ExecutorType.Activate, XYZs.TimeThiefRedoer, RedoerEffect); AddExecutor(ExecutorType.Activate, XYZs.TimeThiefRedoer, RedoerEffect);
AddExecutor(ExecutorType.Activate, XYZs.TimeThiefPerpetua, PerpertuaEffect); AddExecutor(ExecutorType.Activate, XYZs.TimeThiefPerpetua, PerpertuaEffect);
AddExecutor(ExecutorType.Activate, XYZs.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect); AddExecutor(ExecutorType.Activate, XYZs.EvilswarmExcitonKnight, DefaultEvilswarmExcitonKnightEffect);
AddExecutor(ExecutorType.Activate, XYZs.GagagaCowboy); AddExecutor(ExecutorType.Activate, XYZs.GagagaCowboy);
AddExecutor(ExecutorType.Activate, XYZs.NumberS39UtopiatheLightning, DefaultNumberS39UtopiaTheLightningEffect); AddExecutor(ExecutorType.Activate, XYZs.NumberS39UtopiatheLightning, DefaultNumberS39UtopiaTheLightningEffect);
AddExecutor(ExecutorType.Activate, XYZs.DarkRebellionXyzDragon, DarkRebellionXyzDragonEffect); AddExecutor(ExecutorType.Activate, XYZs.DarkRebellionXyzDragon, DarkRebellionXyzDragonEffect);
//monster effects //monster effects
AddExecutor(ExecutorType.Activate, Monsters.TimeThiefRegulator, RegulatorEffect); AddExecutor(ExecutorType.Activate, Monsters.TimeThiefRegulator, RegulatorEffect);
AddExecutor(ExecutorType.Activate, Monsters.TimeThiefWinder); AddExecutor(ExecutorType.Activate, Monsters.TimeThiefWinder);
AddExecutor(ExecutorType.Activate, Monsters.TimeThiefCronocorder); AddExecutor(ExecutorType.Activate, Monsters.TimeThiefCronocorder);
AddExecutor(ExecutorType.Activate, Monsters.PerformTrickClown, TrickClownEffect); AddExecutor(ExecutorType.Activate, Monsters.PerformTrickClown, TrickClownEffect);
AddExecutor(ExecutorType.Activate, Monsters.TimeThiefBezelShip); AddExecutor(ExecutorType.Activate, Monsters.TimeThiefBezelShip);
AddExecutor(ExecutorType.Activate, Monsters.ThunderKingRaiOh, ThunderKingRaiOheff); AddExecutor(ExecutorType.Activate, Monsters.ThunderKingRaiOh, ThunderKingRaiOheff);
AddExecutor(ExecutorType.Activate, Monsters.AshBlossomAndJoyousSpring, DefaultAshBlossomAndJoyousSpring); AddExecutor(ExecutorType.Activate, Monsters.AshBlossomAndJoyousSpring, DefaultAshBlossomAndJoyousSpring);
AddExecutor(ExecutorType.Activate, Monsters.MaxxC, DefaultMaxxC); AddExecutor(ExecutorType.Activate, Monsters.MaxxC, DefaultMaxxC);
}
public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List<int> avoid_list = null)
{
List<int> list = new List<int> { 0, 1, 2, 3, 4 };
int n = list.Count;
while (n-- > 1)
{
int index = Program.Rand.Next(n + 1);
int temp = list[index];
list[index] = list[n];
list[n] = temp;
}
foreach (int seq in list)
{
int zone = (int)System.Math.Pow(2, seq);
if (Bot.SpellZone[seq] == null)
{
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence) continue;
if (avoid_list != null && avoid_list.Contains(seq)) continue;
AI.SelectPlace(zone);
return;
};
}
AI.SelectPlace(0);
}
public bool SpellNegatable(bool isCounter = false, ClientCard target = null)
{
// target default set
if (target == null) target = Card;
// won't negate if not on field
if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false;
// negate judge
if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true;
if (target.IsSpell())
{
if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true;
if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true;
if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true;
}
if (target.IsTrap())
{
if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return true;
}
// how to get here?
return false;
}
private bool SummonToDef()
{
AI.SelectPosition(CardPosition.Defence);
return true;
}
private bool RegulatorEffect()
{
if (Card.Location == CardLocation.MonsterZone)
{
AI.SelectCard(Monsters.TimeThiefCronocorder);
AI.SelectCard(Monsters.TimeThiefWinder);
return true;
}
if (Card.Location == CardLocation.Grave)
{
return true;
}
return false;
} }
public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List<int> avoid_list = null) private bool PerpertuaEffect()
{ {
List<int> list = new List<int> { 0, 1, 2, 3, 4 }; if (Bot.HasInGraveyard(XYZs.TimeThiefRedoer))
int n = list.Count; {
while (n-- > 1) AI.SelectCard(XYZs.TimeThiefRedoer);
{ return true;
int index = Program.Rand.Next(n + 1); }
int temp = list[index];
list[index] = list[n]; if (Bot.HasInMonstersZone(XYZs.TimeThiefRedoer))
list[n] = temp; {
} AI.SelectCard(Monsters.TimeThiefBezelShip);
foreach (int seq in list) AI.SelectNextCard(XYZs.TimeThiefRedoer);
{ return true;
int zone = (int)System.Math.Pow(2, seq); }
if (Bot.SpellZone[seq] == null)
{ return false;
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence) continue;
if (avoid_list != null && avoid_list.Contains(seq)) continue;
AI.SelectPlace(zone);
return;
};
}
AI.SelectPlace(0);
} }
public bool SpellNegatable(bool isCounter = false, ClientCard target = null) private int _totalAttack;
{ private int _totalBotAttack;
// target default set private bool RedoerEffect()
if (target == null) target = Card; {
// won't negate if not on field
if (target.Location != CardLocation.SpellZone && target.Location != CardLocation.Hand) return false; List<ClientCard> enemy = Enemy.GetMonstersInMainZone();
List<int> units = Card.Overlays;
// negate judge if (Duel.Phase == DuelPhase.Standby && (AI.Executor.Util.GetStringId(XYZs.TimeThiefRedoer, 0) ==
if (Enemy.HasInMonstersZone(CardId.NaturalExterio, true) && !isCounter) return true; ActivateDescription))
if (target.IsSpell())
{
if (Enemy.HasInMonstersZone(CardId.NaturalBeast, true)) return true;
if (Enemy.HasInSpellZone(CardId.ImperialOrder, true) || Bot.HasInSpellZone(CardId.ImperialOrder, true)) return true;
if (Enemy.HasInMonstersZone(CardId.SwordsmanLV7, true) || Bot.HasInMonstersZone(CardId.SwordsmanLV7, true)) return true;
}
if (target.IsTrap())
{
if (Enemy.HasInSpellZone(CardId.RoyalDecreel, true) || Bot.HasInSpellZone(CardId.RoyalDecreel, true)) return true;
}
// how to get here?
return false;
}
private bool SummonToDef()
{
AI.SelectPosition(CardPosition.Defence);
return true;
}
private bool RegulatorEffect()
{
if (Card.Location == CardLocation.MonsterZone)
{
AI.SelectCard(Monsters.TimeThiefCronocorder);
AI.SelectCard(Monsters.TimeThiefWinder);
return true;
}
if (Card.Location == CardLocation.Grave)
{
return true;
}
return false;
}
private bool PerpertuaEffect()
{
if (Bot.HasInGraveyard(XYZs.TimeThiefRedoer))
{
AI.SelectCard(XYZs.TimeThiefRedoer);
return true;
}
if (Bot.HasInMonstersZone(XYZs.TimeThiefRedoer))
{
AI.SelectCard(Monsters.TimeThiefBezelShip);
AI.SelectNextCard(XYZs.TimeThiefRedoer);
return true;
}
return false;
}
private int _totalAttack;
private int _totalBotAttack;
private bool RedoerEffect()
{
List<ClientCard> enemy = Enemy.GetMonstersInMainZone();
List<int> units = Card.Overlays;
if (Duel.Phase == DuelPhase.Standby && (AI.Executor.Util.GetStringId(XYZs.TimeThiefRedoer, 0) ==
ActivateDescription))
{ {
return true; return true;
} }
try try
{ {
for (int i = 0; i < enemy.Count; i++) for (int i = 0; i < enemy.Count; i++)
{ {
_totalAttack += enemy[i].Attack; _totalAttack += enemy[i].Attack;
} }
foreach (var t in Bot.GetMonsters()) foreach (var t in Bot.GetMonsters())
{ {
_totalBotAttack += t.Attack; _totalBotAttack += t.Attack;
} }
if (_totalAttack > Bot.LifePoints + _totalBotAttack) if (_totalAttack > Bot.LifePoints + _totalBotAttack)
{ {
return false; return false;
} }
foreach (var t in enemy) foreach (var t in enemy)
{ {
if (t.Attack < 2400 || !t.IsAttack()) continue; if (t.Attack < 2400 || !t.IsAttack()) continue;
try try
{ {
AI.SelectCard(t.Id); AI.SelectCard(t.Id);
AI.SelectCard(t.Id); AI.SelectCard(t.Id);
} }
catch { } catch { }
return true; return true;
} }
} }
catch { } catch { }
if (Bot.UnderAttack) if (Bot.UnderAttack)
{ {
//AI.SelectCard(Util.GetBestEnemyMonster()); //AI.SelectCard(Util.GetBestEnemyMonster());
return true; return true;
} }
return false; return false;
} }
private bool RetrograteEffect() private bool RetrograteEffect()
{ {
if (Card.Owner == 1) if (Card.Owner == 1)
{ {
return true; return true;
} }
return false; return false;
} }
private bool TimeThiefStartupEffect() private bool TimeThiefStartupEffect()
{ {
if (Card.Location == CardLocation.Hand) if (Card.Location == CardLocation.Hand)
{ {
if (Bot.HasInHand(Monsters.TimeThiefRegulator) && !(Bot.GetMonsterCount() > 0)) if (Bot.HasInHand(Monsters.TimeThiefRegulator) && !(Bot.GetMonsterCount() > 0))
{ {
AI.SelectCard(Monsters.TimeThiefRegulator); AI.SelectCard(Monsters.TimeThiefRegulator);
return true; return true;
} }
if (Bot.HasInHand(Monsters.TimeThiefWinder) && Bot.GetMonsterCount() > 1) if (Bot.HasInHand(Monsters.TimeThiefWinder) && Bot.GetMonsterCount() > 1)
{ {
AI.SelectCard(Monsters.TimeThiefWinder); AI.SelectCard(Monsters.TimeThiefWinder);
return true; return true;
} }
return true; return true;
} }
if (Card.Location == CardLocation.Grave) if (Card.Location == CardLocation.Grave)
{ {
AI.SelectCard(Monsters.TimeThiefCronocorder); AI.SelectCard(Monsters.TimeThiefCronocorder);
AI.SelectCard(Spells.TimeThiefHack); AI.SelectCard(Spells.TimeThiefHack);
AI.SelectCard(Traps.TimeThiefFlyBack); AI.SelectCard(Traps.TimeThiefFlyBack);
return true; return true;
} }
return false; return false;
} }
private bool FoolishBurialTarget() private bool FoolishBurialTarget()
{ {
AI.SelectCard(Monsters.PerformTrickClown); AI.SelectCard(Monsters.PerformTrickClown);
return true; return true;
}
private bool TrickClownEffect()
{
if (Bot.LifePoints <= 1000)
{
return false;
}
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
private bool GagagaCowboySummon()
{
if (Enemy.LifePoints <= 800 || (Bot.GetMonsterCount() >= 4 && Enemy.LifePoints <= 1600))
{
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
return false;
} }
private bool TrickClownEffect() private bool DarkRebellionXyzDragonSummon()
{ {
if (Bot.LifePoints <= 1000) int selfBestAttack = Util.GetBestAttack(Bot);
{ int oppoBestAttack = Util.GetBestAttack(Enemy);
return false; return selfBestAttack <= oppoBestAttack;
}
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
} }
private bool GagagaCowboySummon()
{ private bool DarkRebellionXyzDragonEffect()
if (Enemy.LifePoints <= 800 || (Bot.GetMonsterCount() >= 4 && Enemy.LifePoints <= 1600)) {
{ int oppoBestAttack = Util.GetBestAttack(Enemy);
AI.SelectPosition(CardPosition.FaceUpDefence); ClientCard target = Util.GetOneEnemyBetterThanValue(oppoBestAttack, true);
return true; if (target != null)
} {
return false; AI.SelectCard(0);
} AI.SelectNextCard(target);
}
private bool DarkRebellionXyzDragonSummon()
{
int selfBestAttack = Util.GetBestAttack(Bot);
int oppoBestAttack = Util.GetBestAttack(Enemy);
return selfBestAttack <= oppoBestAttack;
}
private bool DarkRebellionXyzDragonEffect()
{
int oppoBestAttack = Util.GetBestAttack(Enemy);
ClientCard target = Util.GetOneEnemyBetterThanValue(oppoBestAttack, true);
if (target != null)
{
AI.SelectCard(0);
AI.SelectNextCard(target);
}
return true; return true;
} }
private bool ThunderKingRaiOhsummon() private bool ThunderKingRaiOhsummon()
{ {
if (Bot.MonsterZone[0] == null) if (Bot.MonsterZone[0] == null)
AI.SelectPlace(Zones.z0); AI.SelectPlace(Zones.z0);
else else
AI.SelectPlace(Zones.z4); AI.SelectPlace(Zones.z4);
return true; return true;
} }
private bool ThunderKingRaiOheff() private bool ThunderKingRaiOheff()
{ {
if (Duel.SummoningCards.Count > 0) if (Duel.SummoningCards.Count > 0)
{ {
foreach (ClientCard m in Duel.SummoningCards) foreach (ClientCard m in Duel.SummoningCards)
{ {
if (m.Attack >= 1900) if (m.Attack >= 1900)
return true; return true;
} }
} }
return false; return false;
}
private bool Crackdowneff()
{
if (Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack)
AI.SelectCard(Util.GetOneEnemyBetterThanMyBest(true, true));
return Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack;
} }
private bool Crackdowneff() private bool PotOfDesireseff()
{ {
if (Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack) return Bot.Deck.Count > 14 && !DefaultSpellWillBeNegated();
AI.SelectCard(Util.GetOneEnemyBetterThanMyBest(true, true));
return Util.GetOneEnemyBetterThanMyBest(true, true) != null && Bot.UnderAttack;
} }
private bool PotOfDesireseff()
// activate of PotofExtravagance
public bool PotofExtravaganceActivate()
{ {
return Bot.Deck.Count > 14 && !DefaultSpellWillBeNegated(); // won't activate if it'll be negate
} if (SpellNegatable()) return false;
SelectSTPlace(Card, true);
// activate of PotofExtravagance AI.SelectOption(1);
public bool PotofExtravaganceActivate() return true;
{ }
// won't activate if it'll be negate
if (SpellNegatable()) return false;
SelectSTPlace(Card, true); }
AI.SelectOption(1);
return true; }
}
}
}
...@@ -73,7 +73,6 @@ namespace WindBot.Game.AI.Decks ...@@ -73,7 +73,6 @@ namespace WindBot.Game.AI.Decks
bool snake_four_s = false; bool snake_four_s = false;
bool tuner_eff_used = false; bool tuner_eff_used = false;
bool crystal_eff_used = false; bool crystal_eff_used = false;
int red_ss_count = 0;
bool white_eff_used = false; bool white_eff_used = false;
bool lockbird_useful = false; bool lockbird_useful = false;
bool lockbird_used = false; bool lockbird_used = false;
...@@ -758,7 +757,6 @@ namespace WindBot.Game.AI.Decks ...@@ -758,7 +757,6 @@ namespace WindBot.Game.AI.Decks
public bool Red_ss() public bool Red_ss()
{ {
if (red_ss_count >= 6) return false;
if ((Util.ChainContainsCard(CardId.DarkHole) || Util.ChainContainsCard(99330325) || Util.ChainContainsCard(53582587)) && Util.ChainContainsCard(CardId.Red)) return false; 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)) if (Duel.LastChainPlayer == 0 && Util.GetLastChainCard().IsCode(CardId.Red))
{ {
...@@ -766,7 +764,6 @@ namespace WindBot.Game.AI.Decks ...@@ -766,7 +764,6 @@ namespace WindBot.Game.AI.Decks
{ {
if (Util.IsChainTarget(m) && IsTrickstar(m.Id)) if (Util.IsChainTarget(m) && IsTrickstar(m.Id))
{ {
red_ss_count += 1;
AI.SelectCard(m); AI.SelectCard(m);
Red_SelectPos(); Red_SelectPos();
return true; return true;
...@@ -789,7 +786,6 @@ namespace WindBot.Game.AI.Decks ...@@ -789,7 +786,6 @@ namespace WindBot.Game.AI.Decks
{ {
AI.SelectCard(c); AI.SelectCard(c);
Red_SelectPos(c); Red_SelectPos(c);
red_ss_count += 1;
return true; return true;
} }
if (c.IsCode(CardId.Pink)) return false; if (c.IsCode(CardId.Pink)) return false;
...@@ -800,14 +796,12 @@ namespace WindBot.Game.AI.Decks ...@@ -800,14 +796,12 @@ namespace WindBot.Game.AI.Decks
if (tosolve_enemy.Attack > 3200) AI.SelectPosition(CardPosition.FaceUpDefence); if (tosolve_enemy.Attack > 3200) AI.SelectPosition(CardPosition.FaceUpDefence);
AI.SelectCard(c); AI.SelectCard(c);
Red_SelectPos(c); Red_SelectPos(c);
red_ss_count += 1;
return true; return true;
} }
if (!Bot.HasInHand(CardId.White) && tosolve_enemy.Attack <= 3200 && c.IsCode(CardId.White)) if (!Bot.HasInHand(CardId.White) && tosolve_enemy.Attack <= 3200 && c.IsCode(CardId.White))
{ {
AI.SelectCard(c); AI.SelectCard(c);
Red_SelectPos(c); Red_SelectPos(c);
red_ss_count += 1;
return true; return true;
} }
if (!Bot.HasInHand(CardId.White) && c.Attack < tosolve_enemy.Attack) if (!Bot.HasInHand(CardId.White) && c.Attack < tosolve_enemy.Attack)
...@@ -824,7 +818,6 @@ namespace WindBot.Game.AI.Decks ...@@ -824,7 +818,6 @@ namespace WindBot.Game.AI.Decks
if (tosolve_enemy.Attack > 1600) AI.SelectPosition(CardPosition.FaceUpDefence); if (tosolve_enemy.Attack > 1600) AI.SelectPosition(CardPosition.FaceUpDefence);
AI.SelectCard(c); AI.SelectCard(c);
Red_SelectPos(c); Red_SelectPos(c);
red_ss_count += 1;
return true; return true;
} }
} }
...@@ -845,7 +838,6 @@ namespace WindBot.Game.AI.Decks ...@@ -845,7 +838,6 @@ namespace WindBot.Game.AI.Decks
{ {
AI.SelectCard(card); AI.SelectCard(card);
Red_SelectPos(card); Red_SelectPos(card);
red_ss_count += 1;
return true; return true;
} }
} }
...@@ -1710,7 +1702,6 @@ namespace WindBot.Game.AI.Decks ...@@ -1710,7 +1702,6 @@ namespace WindBot.Game.AI.Decks
pink_ss = false; pink_ss = false;
snake_four_s = false; snake_four_s = false;
crystal_eff_used = false; crystal_eff_used = false;
red_ss_count = 0;
white_eff_used = false; white_eff_used = false;
lockbird_useful = false; lockbird_useful = false;
lockbird_used = false; lockbird_used = false;
......
...@@ -197,7 +197,6 @@ namespace WindBot.Game.AI.Decks ...@@ -197,7 +197,6 @@ namespace WindBot.Game.AI.Decks
bool MagicianRightHand_used = false; bool MagicianRightHand_used = false;
ClientCard MagiciansLeftHand_negate = null; ClientCard MagiciansLeftHand_negate = null;
ClientCard MagicianRightHand_negate = null; ClientCard MagicianRightHand_negate = null;
int PSYOmega_count = 0;
// go first // go first
public override bool OnSelectHand() public override bool OnSelectHand()
...@@ -271,7 +270,6 @@ namespace WindBot.Game.AI.Decks ...@@ -271,7 +270,6 @@ namespace WindBot.Game.AI.Decks
public override void OnNewTurn() public override void OnNewTurn()
{ {
CrossoutDesignatorTarget = 0; CrossoutDesignatorTarget = 0;
PSYOmega_count = 0;
MadameVerreGainedATK = false; MadameVerreGainedATK = false;
summoned = false; summoned = false;
enemy_activate_MaxxC = false; enemy_activate_MaxxC = false;
...@@ -311,8 +309,8 @@ namespace WindBot.Game.AI.Decks ...@@ -311,8 +309,8 @@ namespace WindBot.Game.AI.Decks
// overwrite OnSelectCard to act normally in SelectUnselect // overwrite OnSelectCard to act normally in SelectUnselect
public override IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable) public override IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable)
{ {
// Patronus HINTMSG_ATOHAND // Patronus
if (hint == 506) if (hint == HintMsg.AddToHand)
{ {
bool flag = true; bool flag = true;
foreach(ClientCard card in cards) foreach(ClientCard card in cards)
...@@ -336,8 +334,8 @@ namespace WindBot.Game.AI.Decks ...@@ -336,8 +334,8 @@ namespace WindBot.Game.AI.Decks
return selected; return selected;
} }
} }
// MaxxC HINTMSG_SPSUMMON // MaxxC solution
if (hint == 509 && enemy_activate_MaxxC) if (hint == HintMsg.SpSummon && enemy_activate_MaxxC)
{ {
// check whether SS from deck while using effect // check whether SS from deck while using effect
bool flag = true; bool flag = true;
...@@ -394,8 +392,8 @@ namespace WindBot.Game.AI.Decks ...@@ -394,8 +392,8 @@ namespace WindBot.Game.AI.Decks
} }
} }
} }
// MadameVerre HINTMSG_CONFIRM // MadameVerre
if (hint == 526) if (hint == HintMsg.Confirm)
{ {
Logger.DebugWriteLine("** min-max: " + min.ToString() + " / " + max.ToString()); Logger.DebugWriteLine("** min-max: " + min.ToString() + " / " + max.ToString());
foreach (ClientCard card in cards) foreach (ClientCard card in cards)
...@@ -2501,20 +2499,15 @@ namespace WindBot.Game.AI.Decks ...@@ -2501,20 +2499,15 @@ namespace WindBot.Game.AI.Decks
// recycle from grave // recycle from grave
if (Card.Location == CardLocation.Grave) if (Card.Location == CardLocation.Grave)
{ {
if (PSYOmega_count >= 5){
return false;
}
List<ClientCard> enemy_danger = CheckDangerousCardinEnemyGrave(); List<ClientCard> enemy_danger = CheckDangerousCardinEnemyGrave();
if (enemy_danger.Count > 0) if (enemy_danger.Count > 0)
{ {
AI.SelectCard(enemy_danger); AI.SelectCard(enemy_danger);
PSYOmega_count ++;
return true; return true;
} }
if (!Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.Holiday) && Bot.HasInGraveyard(important_witchcraft)) if (!Bot.HasInHandOrInSpellZoneOrInGraveyard(CardId.Holiday) && Bot.HasInGraveyard(important_witchcraft))
{ {
AI.SelectCard(important_witchcraft); AI.SelectCard(important_witchcraft);
PSYOmega_count ++;
return true; return true;
} }
if (CheckProblematicCards() == null) if (CheckProblematicCards() == null)
...@@ -2523,7 +2516,6 @@ namespace WindBot.Game.AI.Decks ...@@ -2523,7 +2516,6 @@ namespace WindBot.Game.AI.Decks
CardId.MaxxC, CardId.AshBlossom_JoyousSpring, CardId.MaxxC, CardId.AshBlossom_JoyousSpring,
CardId.MagicianRightHand, CardId.MagiciansLeftHand, CardId.MagiciansRestage, CardId.Patronus, CardId.MagicianRightHand, CardId.MagiciansLeftHand, CardId.MagiciansRestage, CardId.Patronus,
CardId.LightningStorm, CardId.Reasoning); CardId.LightningStorm, CardId.Reasoning);
PSYOmega_count ++;
return true; return true;
} }
} }
......
...@@ -100,6 +100,7 @@ namespace WindBot.Game.AI.Decks ...@@ -100,6 +100,7 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Summon, CardId.Goblindbergh); AddExecutor(ExecutorType.Summon, CardId.Goblindbergh);
AddExecutor(ExecutorType.Summon, CardId.TinGoldfish); AddExecutor(ExecutorType.Summon, CardId.TinGoldfish);
AddExecutor(ExecutorType.Summon, CardId.SummonerMonk); AddExecutor(ExecutorType.Summon, CardId.SummonerMonk);
AddExecutor(ExecutorType.Summon, CardId.Honest);
// Summons: Effects // Summons: Effects
AddExecutor(ExecutorType.Activate, CardId.Goblindbergh, GoblindberghEffect); AddExecutor(ExecutorType.Activate, CardId.Goblindbergh, GoblindberghEffect);
...@@ -122,13 +123,6 @@ namespace WindBot.Game.AI.Decks ...@@ -122,13 +123,6 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Activate, CardId.SolemnStrike, DefaultSolemnStrike); AddExecutor(ExecutorType.Activate, CardId.SolemnStrike, DefaultSolemnStrike);
} }
private int ZwCount = 0;
public override void OnNewTurn()
{
ZwCount = 0;
}
public override bool OnSelectHand() public override bool OnSelectHand()
{ {
return false; return false;
...@@ -177,8 +171,7 @@ namespace WindBot.Game.AI.Decks ...@@ -177,8 +171,7 @@ namespace WindBot.Game.AI.Decks
private bool ZwWeapon() private bool ZwWeapon()
{ {
ZwCount++; return true;
return ZwCount < 10;
} }
private bool ReinforcementOfTheArmy() private bool ReinforcementOfTheArmy()
......
...@@ -47,7 +47,6 @@ namespace WindBot.Game.AI.Decks ...@@ -47,7 +47,6 @@ namespace WindBot.Game.AI.Decks
bool TigermortarSpsummoned = false; bool TigermortarSpsummoned = false;
bool ChakanineSpsummoned = false; bool ChakanineSpsummoned = false;
bool BroadbullSpsummoned = false; bool BroadbullSpsummoned = false;
int WhiptailEffectCount = 0;
public ZoodiacExecutor(GameAI ai, Duel duel) public ZoodiacExecutor(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
...@@ -128,7 +127,6 @@ namespace WindBot.Game.AI.Decks ...@@ -128,7 +127,6 @@ namespace WindBot.Game.AI.Decks
TigermortarSpsummoned = false; TigermortarSpsummoned = false;
ChakanineSpsummoned = false; ChakanineSpsummoned = false;
BroadbullSpsummoned = false; BroadbullSpsummoned = false;
WhiptailEffectCount = 0;
} }
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
...@@ -431,7 +429,7 @@ namespace WindBot.Game.AI.Decks ...@@ -431,7 +429,7 @@ namespace WindBot.Game.AI.Decks
{ {
if (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2) if (Duel.Phase == DuelPhase.Main1 || Duel.Phase == DuelPhase.Main2)
return false; return false;
if (Card.IsDisabled() || WhiptailEffectCount >= 3) if (Card.IsDisabled())
return false; return false;
ClientCard target = null; ClientCard target = null;
List<ClientCard> monsters = Bot.GetMonsters(); List<ClientCard> monsters = Bot.GetMonsters();
...@@ -461,7 +459,6 @@ namespace WindBot.Game.AI.Decks ...@@ -461,7 +459,6 @@ namespace WindBot.Game.AI.Decks
CardId.Drident CardId.Drident
}); });
} }
WhiptailEffectCount++;
return true; return true;
} }
......
...@@ -21,6 +21,23 @@ namespace WindBot.Game.AI ...@@ -21,6 +21,23 @@ namespace WindBot.Game.AI
public const int GamecieltheSeaTurtleKaiju = 55063751; public const int GamecieltheSeaTurtleKaiju = 55063751;
public const int SuperAntiKaijuWarMachineMechaDogoran = 84769941; public const int SuperAntiKaijuWarMachineMechaDogoran = 84769941;
public const int SandaionTheTimelord = 33015627;
public const int GabrionTheTimelord = 6616912;
public const int MichionTheTimelord = 7733560;
public const int ZaphionTheTimelord = 28929131;
public const int HailonTheTimelord = 34137269;
public const int RaphionTheTimelord = 60222213;
public const int SadionTheTimelord = 65314286;
public const int MetaionTheTimelord = 74530899;
public const int KamionTheTimelord = 91712985;
public const int LazionTheTimelord = 92435533;
public const int LeftArmofTheForbiddenOne = 7902349;
public const int RightLegofTheForbiddenOne = 8124921;
public const int LeftLegofTheForbiddenOne = 44519536;
public const int RightArmofTheForbiddenOne = 70903634;
public const int ExodiaTheForbiddenOne = 33396948;
public const int UltimateConductorTytanno = 18940556; public const int UltimateConductorTytanno = 18940556;
public const int ElShaddollConstruct = 20366274; public const int ElShaddollConstruct = 20366274;
public const int AllyOfJusticeCatastor = 26593852; public const int AllyOfJusticeCatastor = 26593852;
...@@ -36,8 +53,27 @@ namespace WindBot.Game.AI ...@@ -36,8 +53,27 @@ namespace WindBot.Game.AI
public const int DarkMagicAttack = 2314238; public const int DarkMagicAttack = 2314238;
public const int MysticalSpaceTyphoon = 5318639; public const int MysticalSpaceTyphoon = 5318639;
public const int CosmicCyclone = 8267140; public const int CosmicCyclone = 8267140;
public const int ChickenGame = 67616300; public const int GalaxyCyclone = 5133471;
public const int BookOfMoon = 14087893;
public const int CompulsoryEvacuationDevice = 94192409;
public const int CallOfTheHaunted = 97077563;
public const int Scapegoat = 73915051;
public const int BreakthroughSkill = 78474168;
public const int SolemnJudgment = 41420027;
public const int SolemnWarning = 84749824;
public const int SolemnStrike = 40605147;
public const int TorrentialTribute = 53582587;
public const int HeavyStorm = 19613556;
public const int HammerShot = 26412047;
public const int DarkHole = 53129443;
public const int Raigeki = 12580477;
public const int SmashingGround = 97169186;
public const int PotOfDesires = 35261759;
public const int AllureofDarkness = 1475311;
public const int DimensionalBarrier = 83326048;
public const int InterruptedKaijuSlumber = 99330325;
public const int ChickenGame = 67616300;
public const int SantaClaws = 46565218; public const int SantaClaws = 46565218;
public const int CastelTheSkyblasterMusketeer = 82633039; public const int CastelTheSkyblasterMusketeer = 82633039;
...@@ -61,7 +97,7 @@ namespace WindBot.Game.AI ...@@ -61,7 +97,7 @@ namespace WindBot.Game.AI
public const int LockBird = 94145021; public const int LockBird = 94145021;
public const int GhostOgreAndSnowRabbit = 59438930; public const int GhostOgreAndSnowRabbit = 59438930;
public const int GhostBelle = 73642296; public const int GhostBelle = 73642296;
public const int EffectVeiler = 63845230; public const int EffectVeiler = 97268402;
public const int ArtifactLancea = 34267821; public const int ArtifactLancea = 34267821;
public const int CalledByTheGrave = 24224830; public const int CalledByTheGrave = 24224830;
...@@ -80,12 +116,11 @@ namespace WindBot.Game.AI ...@@ -80,12 +116,11 @@ namespace WindBot.Game.AI
public const int RedDragonArchfiend = 70902743; public const int RedDragonArchfiend = 70902743;
public const int ImperialOrder = 61740673; public const int ImperialOrder = 61740673;
public const int RoyalDecreel = 51452091;
public const int NaturiaBeast = 33198837; public const int NaturiaBeast = 33198837;
public const int AntiSpellFragrance = 58921041; public const int AntiSpellFragrance = 58921041;
} }
int HonestEffectCount = 0;
protected DefaultExecutor(GameAI ai, Duel duel) protected DefaultExecutor(GameAI ai, Duel duel)
: base(ai, duel) : base(ai, duel)
{ {
...@@ -127,9 +162,6 @@ namespace WindBot.Game.AI ...@@ -127,9 +162,6 @@ namespace WindBot.Game.AI
/// <returns>false if the attack shouldn't be done.</returns> /// <returns>false if the attack shouldn't be done.</returns>
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
{ {
if (attacker.RealPower <= 0)
return false;
if (!attacker.IsMonsterHasPreventActivationEffectInBattle()) if (!attacker.IsMonsterHasPreventActivationEffectInBattle())
{ {
if (defender.IsMonsterInvincible() && defender.IsDefense()) if (defender.IsMonsterInvincible() && defender.IsDefense())
...@@ -180,6 +212,12 @@ namespace WindBot.Game.AI ...@@ -180,6 +212,12 @@ namespace WindBot.Game.AI
if (attacker.IsCode(_CardId.NumberS39UtopiaTheLightning) && !attacker.IsDisabled() && attacker.HasXyzMaterial(2, _CardId.Number39Utopia)) if (attacker.IsCode(_CardId.NumberS39UtopiaTheLightning) && !attacker.IsDisabled() && attacker.HasXyzMaterial(2, _CardId.Number39Utopia))
attacker.RealPower = 5000; attacker.RealPower = 5000;
if (attacker.IsCode(_CardId.EaterOfMillions) && !attacker.IsDisabled())
attacker.RealPower = 9999;
if (attacker.IsMonsterInvincible())
attacker.RealPower = 9999;
foreach (ClientCard equip in attacker.EquipCards) foreach (ClientCard equip in attacker.EquipCards)
{ {
if (equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled()) if (equip.IsCode(_CardId.MoonMirrorShield) && !equip.IsDisabled())
...@@ -210,6 +248,29 @@ namespace WindBot.Game.AI ...@@ -210,6 +248,29 @@ namespace WindBot.Game.AI
return true; return true;
} }
public override bool OnPreActivate(ClientCard card)
{
ClientCard LastChainCard = Util.GetLastChainCard();
if (LastChainCard != null && Duel.Phase == DuelPhase.Standby &&
LastChainCard.IsCode(
_CardId.SandaionTheTimelord,
_CardId.GabrionTheTimelord,
_CardId.MichionTheTimelord,
_CardId.ZaphionTheTimelord,
_CardId.HailonTheTimelord,
_CardId.RaphionTheTimelord,
_CardId.SadionTheTimelord,
_CardId.MetaionTheTimelord,
_CardId.KamionTheTimelord,
_CardId.LazionTheTimelord
))
return false;
if ((card.Location == CardLocation.Hand || card.Location == CardLocation.SpellZone && card.IsFacedown()) &&
(card.IsSpell() && DefaultSpellWillBeNegated() || card.IsTrap() && DefaultTrapWillBeNegated()))
return false;
return true;
}
/// <summary> /// <summary>
/// Called when the AI has to select a card position. /// Called when the AI has to select a card position.
/// </summary> /// </summary>
...@@ -242,9 +303,12 @@ namespace WindBot.Game.AI ...@@ -242,9 +303,12 @@ namespace WindBot.Game.AI
return false; return false;
} }
public override void OnNewTurn() /// <summary>
/// Set when this card can't beat the enemies
/// </summary>
public override bool OnSelectMonsterSummonOrSet(ClientCard card)
{ {
HonestEffectCount = 0; return card.Level <= 4 && Bot.GetMonsters().Count(m => m.IsFaceup()) == 0 && Util.IsAllEnemyBetterThanValue(card.Attack, true);
} }
/// <summary> /// <summary>
...@@ -622,14 +686,17 @@ namespace WindBot.Game.AI ...@@ -622,14 +686,17 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultSpellSet() protected bool DefaultSpellSet()
{ {
return (Card.IsTrap() || Card.HasType(CardType.QuickPlay)) && Bot.GetSpellCountWithoutField() < 4; return (Card.IsTrap() || Card.HasType(CardType.QuickPlay) || DefaultSpellMustSetFirst()) && Bot.GetSpellCountWithoutField() < 4;
} }
/// <summary> /// <summary>
/// Summon with tributes ATK lower. /// Summon with no tribute, or with tributes ATK lower.
/// </summary> /// </summary>
protected bool DefaultTributeSummon() protected bool DefaultMonsterSummon()
{ {
if (Card.Level <= 4)
return true;
if (!UniqueFaceupMonster()) if (!UniqueFaceupMonster())
return false; return false;
int tributecount = (int)Math.Ceiling((Card.Level - 4.0d) / 2.0d); int tributecount = (int)Math.Ceiling((Card.Level - 4.0d) / 2.0d);
...@@ -656,8 +723,13 @@ namespace WindBot.Game.AI ...@@ -656,8 +723,13 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultMonsterRepos() protected bool DefaultMonsterRepos()
{ {
if (Card.IsFaceup() && Card.IsDefense() && Card.Attack == 0) if (Card.Attack == 0)
return false; {
if (Card.IsFaceup() && Card.IsAttack())
return true;
if (Card.IsFaceup() && Card.IsDefense())
return false;
}
if (Enemy.HasInMonstersZone(_CardId.BlueEyesChaosMAXDragon, true) && if (Enemy.HasInMonstersZone(_CardId.BlueEyesChaosMAXDragon, true) &&
Card.IsAttack() && (4000 - Card.Defense) * 2 > (4000 - Card.Attack)) Card.IsAttack() && (4000 - Card.Defense) * 2 > (4000 - Card.Attack))
...@@ -667,10 +739,10 @@ namespace WindBot.Game.AI ...@@ -667,10 +739,10 @@ namespace WindBot.Game.AI
(4000 - Card.Defense) * 2 > (4000 - Card.Attack)) (4000 - Card.Defense) * 2 > (4000 - Card.Attack))
return true; return true;
bool enemyBetter = Util.IsAllEnemyBetter(true); bool enemyBetter = Util.IsAllEnemyBetter();
if (Card.IsAttack() && enemyBetter) if (Card.IsAttack() && enemyBetter)
return true; return true;
if (Card.IsDefense() && !enemyBetter && Card.Attack >= Card.Defense) if (Card.IsDefense() && !enemyBetter && (Card.Attack >= Card.Defense || Card.Attack >= Util.GetBestPower(Enemy)))
return true; return true;
return false; return false;
...@@ -681,7 +753,15 @@ namespace WindBot.Game.AI ...@@ -681,7 +753,15 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultSpellWillBeNegated() protected bool DefaultSpellWillBeNegated()
{ {
return Bot.HasInSpellZone(_CardId.ImperialOrder, true, true) || Enemy.HasInSpellZone(_CardId.ImperialOrder, true) || Enemy.HasInMonstersZone(_CardId.NaturiaBeast, true); return (Bot.HasInSpellZone(_CardId.ImperialOrder, true, true) || Enemy.HasInSpellZone(_CardId.ImperialOrder, true)) && !Util.ChainContainsCard(_CardId.ImperialOrder);
}
/// <summary>
/// If trap will be negated
/// </summary>
protected bool DefaultTrapWillBeNegated()
{
return (Bot.HasInSpellZone(_CardId.RoyalDecreel, true, true) || Enemy.HasInSpellZone(_CardId.RoyalDecreel, true)) && !Util.ChainContainsCard(_CardId.RoyalDecreel);
} }
/// <summary> /// <summary>
...@@ -689,15 +769,7 @@ namespace WindBot.Game.AI ...@@ -689,15 +769,7 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultSpellMustSetFirst() protected bool DefaultSpellMustSetFirst()
{ {
ClientCard card = null; return Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true, true) || Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true);
foreach (ClientCard check in Bot.GetSpells())
{
if (check.IsCode(_CardId.AntiSpellFragrance) && !check.IsDisabled())
card = check;
}
if (card != null && card.IsFaceup())
return true;
return Bot.HasInSpellZone(_CardId.AntiSpellFragrance, true, true) || Enemy.HasInSpellZone(_CardId.AntiSpellFragrance, true);
} }
/// <summary> /// <summary>
...@@ -764,6 +836,8 @@ namespace WindBot.Game.AI ...@@ -764,6 +836,8 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
protected bool DefaultDontChainMyself() protected bool DefaultDontChainMyself()
{ {
if (Type != ExecutorType.Activate)
return true;
if (Executors.Any(exec => exec.Type == Type && exec.CardId == Card.Id)) if (Executors.Any(exec => exec.Type == Type && exec.CardId == Card.Id))
return false; return false;
return Duel.LastChainPlayer != 0; return Duel.LastChainPlayer != 0;
...@@ -776,6 +850,8 @@ namespace WindBot.Game.AI ...@@ -776,6 +850,8 @@ namespace WindBot.Game.AI
{ {
if (Executors.Count(exec => exec.Type == Type && exec.CardId == Card.Id) > 1) if (Executors.Count(exec => exec.Type == Type && exec.CardId == Card.Id) > 1)
return false; return false;
if (Card.IsFacedown())
return true;
if (Bot.LifePoints <= 1000) if (Bot.LifePoints <= 1000)
return false; return false;
if (Bot.LifePoints <= Enemy.LifePoints && ActivateDescription == Util.GetStringId(_CardId.ChickenGame, 0)) if (Bot.LifePoints <= Enemy.LifePoints && ActivateDescription == Util.GetStringId(_CardId.ChickenGame, 0))
...@@ -1067,6 +1143,11 @@ namespace WindBot.Game.AI ...@@ -1067,6 +1143,11 @@ namespace WindBot.Game.AI
return (selfBestAttack <= oppoBestAttack && oppoBestAttack <= 3000) || DefaultScarlightRedDragonArchfiendEffect(); return (selfBestAttack <= oppoBestAttack && oppoBestAttack <= 3000) || DefaultScarlightRedDragonArchfiendEffect();
} }
protected bool DefaultTimelordSummon()
{
return Bot.GetMonsterCount() == 0;
}
/// <summary> /// <summary>
/// Activate when we have less monsters than enemy, or when enemy have more than 3 monsters. /// Activate when we have less monsters than enemy, or when enemy have more than 3 monsters.
/// </summary> /// </summary>
...@@ -1089,13 +1170,7 @@ namespace WindBot.Game.AI ...@@ -1089,13 +1170,7 @@ namespace WindBot.Game.AI
|| ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Defense) && (Bot.BattlingMonster.Attack + Enemy.BattlingMonster.Attack > Enemy.BattlingMonster.Defense))); || ((Bot.BattlingMonster.Attack < Enemy.BattlingMonster.Defense) && (Bot.BattlingMonster.Attack + Enemy.BattlingMonster.Attack > Enemy.BattlingMonster.Defense)));
} }
if (Util.IsTurn1OrMain2() && HonestEffectCount <= 5) return Util.IsTurn1OrMain2();
{
HonestEffectCount++;
return true;
}
return false;
} }
} }
} }
...@@ -59,7 +59,7 @@ namespace WindBot.Game.AI ...@@ -59,7 +59,7 @@ namespace WindBot.Game.AI
_game = game; _game = game;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DialogsData)); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DialogsData));
string dialogfilename = game.Dialog; string dialogfilename = game.Dialog;
using (FileStream fs = File.OpenRead("Dialogs/" + dialogfilename + ".json")) using (FileStream fs = Program.ReadFile("Dialogs", dialogfilename, "json"))
{ {
DialogsData data = (DialogsData)serializer.ReadObject(fs); DialogsData data = (DialogsData)serializer.ReadObject(fs);
_welcome = data.welcome; _welcome = data.welcome;
......
namespace WindBot.Game.AI.Enums namespace WindBot.Game.AI.Enums
{ {
/// <summary>
/// Cards that are invincible to battle and should always attack to use effect.
/// </summary>
public enum InvincibleBotMonster
{
YubelTheUltimateNightmare = 31764700,
YubelTerrorIncarnate = 4779091,
SandaionTheTimelord = 33015627,
GabrionTheTimelord = 6616912,
MichionTheTimelord = 7733560,
ZaphionTheTimelord = 28929131,
HailonTheTimelord = 34137269,
RaphionTheTimelord = 60222213,
SadionTheTimelord = 65314286,
MetaionTheTimelord = 74530899,
KamionTheTimelord = 91712985,
LazionTheTimelord = 92435533,
TimelordProgenitorVorpgate = 67508932,
RocketWarrior = 30860696,
GoDDDDivineZeroKingRage = 40227329,
BloomDivaTheMelodiousChoir = 84988419,
BlackwingArmorMaster = 69031175,
DaigustoSphreez = 29552709,
Number92HearteartHDragon = 97403510,
NumberC96DarkStorm = 77205367,
Number54LionHeart = 54366836
}
/// <summary> /// <summary>
/// Cards that are invincible to battle. /// Cards that are invincible to battle.
/// </summary> /// </summary>
public enum InvincibleMonster public enum InvincibleEnemyMonster
{ {
SpiritReaper = 23205979, SpiritReaper = 23205979,
YubelTheUltimateNightmare = 31764700, YubelTheUltimateNightmare = 31764700,
......
...@@ -73,13 +73,19 @@ namespace WindBot.Game.AI ...@@ -73,13 +73,19 @@ namespace WindBot.Game.AI
public virtual BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders) public virtual BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders)
{ {
// Overrided in DefalultExecutor // Overrided in DefaultExecutor
return null; return null;
} }
public virtual bool OnPreBattleBetween(ClientCard attacker, ClientCard defender) public virtual bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
{ {
// Overrided in DefalultExecutor // Overrided in DefaultExecutor
return true;
}
public virtual bool OnPreActivate(ClientCard card)
{
// Overrided in DefaultExecutor
return true; return true;
} }
...@@ -178,13 +184,23 @@ namespace WindBot.Game.AI ...@@ -178,13 +184,23 @@ namespace WindBot.Game.AI
public virtual CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions) public virtual CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
{ {
// Overrided in DefalultExecutor // Overrided in DefaultExecutor
return 0; return 0;
} }
public virtual bool OnSelectBattleReplay() public virtual bool OnSelectBattleReplay()
{ {
// Overrided in DefalultExecutor // Overrided in DefaultExecutor
return false;
}
/// <summary>
/// Called when the executor type is SummonOrSet
/// </summary>
/// <returns>True if select to set the monster.</returns>
public virtual bool OnSelectMonsterSummonOrSet(ClientCard card)
{
// Overrided in DefaultExecutor
return false; return false;
} }
......
namespace WindBot.Game.AI
{
public static class HintMsg
{
public const int Release = 500,
Discard = 501,
Destroy = 502,
Remove = 503,
ToGrave = 504,
ReturnToHand = 505,
AddToHand = 506,
ToDeck = 507,
Summon = 508,
SpSummon = 509,
Set = 510,
FusionMaterial = 511,
SynchroMaterial = 512,
XyzMaterial = 513,
Faceup = 514,
Facedown = 515,
Attack = 516,
Defense = 517,
Equip = 518,
RemoveXyz = 519,
Control = 520,
DestroyReplace = 521,
FaceupAttack = 522,
FaceupDefense = 523,
FacedownAttack = 524,
FacedownDefense = 525,
Confirm = 526,
ToField = 527,
PosChange = 528,
Self = 529,
Oppo = 530,
Tribute = 531,
DeattachFrom = 532,
LinkMaterial = 533,
AttackTarget = 549,
Effect = 550,
Target = 551,
Coin = 552,
Dice = 553,
CardType = 554,
Option = 555,
ResolveEffect = 556,
Select = 560,
Position = 561,
Attribute = 562,
Race = 563,
Code = 564,
Number = 565,
LvRank = 567,
ResolveCard = 568,
Zone = 569,
DisableZone = 570,
ToZone = 571,
Counter = 572,
Disable = 573,
OperateCard = 574;
}
}
\ No newline at end of file
...@@ -32,7 +32,7 @@ namespace WindBot.Game ...@@ -32,7 +32,7 @@ namespace WindBot.Game
public int RealPower { get; set; } public int RealPower { get; set; }
public List<int> Overlays { get; private set; } public List<int> Overlays { get; private set; }
public int Owner { get; private set; } public int Owner { get; private set; }
public int Controller { get; private set; } public int Controller { get; set; }
public int Disabled { get; private set; } public int Disabled { get; private set; }
public int ProcCompleted { get; private set; } public int ProcCompleted { get; private set; }
public int SelectSeq { get; set; } public int SelectSeq { get; set; }
......
...@@ -43,7 +43,7 @@ namespace WindBot.Game ...@@ -43,7 +43,7 @@ namespace WindBot.Game
StreamReader reader = null; StreamReader reader = null;
try try
{ {
reader = new StreamReader(new FileStream("Decks/" + name + ".ydk", FileMode.Open, FileAccess.Read)); reader = new StreamReader(Program.ReadFile("Decks", name, "ydk"));
Deck deck = new Deck(); Deck deck = new Deck();
bool side = false; bool side = false;
......
...@@ -96,30 +96,8 @@ namespace WindBot.Game ...@@ -96,30 +96,8 @@ namespace WindBot.Game
public void AddCard(CardLocation loc, int cardId, int player, int seq, int pos) public void AddCard(CardLocation loc, int cardId, int player, int seq, int pos)
{ {
switch (loc) ClientCard card = new ClientCard(cardId, loc, seq, pos);
{ AddCard(loc, card, player, seq, pos, cardId);
case CardLocation.Hand:
Fields[player].Hand.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.Grave:
Fields[player].Graveyard.Add(new ClientCard(cardId, loc,-1, pos));
break;
case CardLocation.Removed:
Fields[player].Banished.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.MonsterZone:
Fields[player].MonsterZone[seq] = new ClientCard(cardId, loc, seq, pos);
break;
case CardLocation.SpellZone:
Fields[player].SpellZone[seq] = new ClientCard(cardId, loc, seq, pos);
break;
case CardLocation.Deck:
Fields[player].Deck.Add(new ClientCard(cardId, loc, -1, pos));
break;
case CardLocation.Extra:
Fields[player].ExtraDeck.Add(new ClientCard(cardId, loc, -1, pos));
break;
}
} }
public void AddCard(CardLocation loc, ClientCard card, int player, int seq, int pos, int id) public void AddCard(CardLocation loc, ClientCard card, int player, int seq, int pos, int id)
...@@ -127,6 +105,7 @@ namespace WindBot.Game ...@@ -127,6 +105,7 @@ namespace WindBot.Game
card.Location = loc; card.Location = loc;
card.Sequence = seq; card.Sequence = seq;
card.Position = pos; card.Position = pos;
card.Controller = player;
card.SetId(id); card.SetId(id);
switch (loc) switch (loc)
{ {
......
...@@ -13,12 +13,16 @@ namespace WindBot.Game ...@@ -13,12 +13,16 @@ namespace WindBot.Game
private Dialogs _dialogs; private Dialogs _dialogs;
// record activated count to prevent infinite actions
private Dictionary<int, int> _activatedCards;
public GameAI(GameClient game, Duel duel) public GameAI(GameClient game, Duel duel)
{ {
Game = game; Game = game;
Duel = duel; Duel = duel;
_dialogs = new Dialogs(game); _dialogs = new Dialogs(game);
_activatedCards = new Dictionary<int, int>();
} }
/// <summary> /// <summary>
...@@ -81,6 +85,7 @@ namespace WindBot.Game ...@@ -81,6 +85,7 @@ namespace WindBot.Game
/// </summary> /// </summary>
public void OnNewTurn() public void OnNewTurn()
{ {
_activatedCards.Clear();
Executor.OnNewTurn(); Executor.OnNewTurn();
} }
...@@ -190,12 +195,8 @@ namespace WindBot.Game ...@@ -190,12 +195,8 @@ namespace WindBot.Game
if (defenders.Count == 0) if (defenders.Count == 0)
{ {
// Attack with the monster with the lowest attack first // Attack with the monster with the lowest attack first
for (int i = attackers.Count - 1; i >= 0; --i) ClientCard attacker = attackers[attackers.Count - 1];
{ return Attack(attacker, null);
ClientCard attacker = attackers[i];
if (attacker.Attack > 0)
return Attack(attacker, null);
}
} }
else else
{ {
...@@ -226,18 +227,12 @@ namespace WindBot.Game ...@@ -226,18 +227,12 @@ namespace WindBot.Game
/// <returns>A new list containing the selected cards.</returns> /// <returns>A new list containing the selected cards.</returns>
public IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable) public IList<ClientCard> OnSelectCard(IList<ClientCard> cards, int min, int max, int hint, bool cancelable)
{ {
const int HINTMSG_FMATERIAL = 511;
const int HINTMSG_SMATERIAL = 512;
const int HINTMSG_XMATERIAL = 513;
const int HINTMSG_LMATERIAL = 533;
const int HINTMSG_SPSUMMON = 509;
// Check for the executor. // Check for the executor.
IList<ClientCard> result = Executor.OnSelectCard(cards, min, max, hint, cancelable); IList<ClientCard> result = Executor.OnSelectCard(cards, min, max, hint, cancelable);
if (result != null) if (result != null)
return result; return result;
if (hint == HINTMSG_SPSUMMON && min == 1 && max > min) // pendulum summon if (hint == HintMsg.SpSummon && min == 1 && max > min) // pendulum summon
{ {
result = Executor.OnSelectPendulumSummon(cards, max); result = Executor.OnSelectPendulumSummon(cards, max);
if (result != null) if (result != null)
...@@ -245,7 +240,7 @@ namespace WindBot.Game ...@@ -245,7 +240,7 @@ namespace WindBot.Game
} }
CardSelector selector = null; CardSelector selector = null;
if (hint == HINTMSG_FMATERIAL || hint == HINTMSG_SMATERIAL || hint == HINTMSG_XMATERIAL || hint == HINTMSG_LMATERIAL) if (hint == HintMsg.FusionMaterial || hint == HintMsg.SynchroMaterial || hint == HintMsg.XyzMaterial || hint == HintMsg.LinkMaterial)
{ {
if (m_materialSelector != null) if (m_materialSelector != null)
{ {
...@@ -254,13 +249,13 @@ namespace WindBot.Game ...@@ -254,13 +249,13 @@ namespace WindBot.Game
} }
else else
{ {
if (hint == HINTMSG_FMATERIAL) if (hint == HintMsg.FusionMaterial)
result = Executor.OnSelectFusionMaterial(cards, min, max); result = Executor.OnSelectFusionMaterial(cards, min, max);
if (hint == HINTMSG_SMATERIAL) if (hint == HintMsg.SynchroMaterial)
result = Executor.OnSelectSynchroMaterial(cards, 0, min, max); result = Executor.OnSelectSynchroMaterial(cards, 0, min, max);
if (hint == HINTMSG_XMATERIAL) if (hint == HintMsg.XyzMaterial)
result = Executor.OnSelectXyzMaterial(cards, min, max); result = Executor.OnSelectXyzMaterial(cards, min, max);
if (hint == HINTMSG_LMATERIAL) if (hint == HintMsg.LinkMaterial)
result = Executor.OnSelectLinkMaterial(cards, min, max); result = Executor.OnSelectLinkMaterial(cards, min, max);
if (result != null) if (result != null)
...@@ -439,8 +434,7 @@ namespace WindBot.Game ...@@ -439,8 +434,7 @@ namespace WindBot.Game
} }
if (ShouldExecute(exec, card, ExecutorType.SummonOrSet)) if (ShouldExecute(exec, card, ExecutorType.SummonOrSet))
{ {
if (Executor.Util.IsAllEnemyBetter(true) && Executor.Util.IsAllEnemyBetterThanValue(card.Attack + 300, false) && if (main.MonsterSetableCards.Contains(card) && Executor.OnSelectMonsterSummonOrSet(card))
main.MonsterSetableCards.Contains(card))
{ {
_dialogs.SendSetMonster(); _dialogs.SendSetMonster();
return new MainPhaseAction(MainPhaseAction.MainAction.SetMonster, card.ActionIndex); return new MainPhaseAction(MainPhaseAction.MainAction.SetMonster, card.ActionIndex);
...@@ -448,7 +442,7 @@ namespace WindBot.Game ...@@ -448,7 +442,7 @@ namespace WindBot.Game
_dialogs.SendSummon(card.Name); _dialogs.SendSummon(card.Name);
return new MainPhaseAction(MainPhaseAction.MainAction.Summon, card.ActionIndex); return new MainPhaseAction(MainPhaseAction.MainAction.Summon, card.ActionIndex);
} }
} }
foreach (ClientCard card in main.SpellSetableCards) foreach (ClientCard card in main.SpellSetableCards)
{ {
if (ShouldExecute(exec, card, ExecutorType.SpellSet)) if (ShouldExecute(exec, card, ExecutorType.SpellSet))
...@@ -529,16 +523,13 @@ namespace WindBot.Game ...@@ -529,16 +523,13 @@ namespace WindBot.Game
/// <returns></returns> /// <returns></returns>
public IList<ClientCard> OnSelectSum(IList<ClientCard> cards, int sum, int min, int max, int hint, bool mode) public IList<ClientCard> OnSelectSum(IList<ClientCard> cards, int sum, int min, int max, int hint, bool mode)
{ {
const int HINTMSG_RELEASE = 500;
const int HINTMSG_SMATERIAL = 512;
IList<ClientCard> selected = Executor.OnSelectSum(cards, sum, min, max, hint, mode); IList<ClientCard> selected = Executor.OnSelectSum(cards, sum, min, max, hint, mode);
if (selected != null) if (selected != null)
{ {
return selected; return selected;
} }
if (hint == HINTMSG_RELEASE || hint == HINTMSG_SMATERIAL) if (hint == HintMsg.Release || hint == HintMsg.SynchroMaterial)
{ {
if (m_materialSelector != null) if (m_materialSelector != null)
{ {
...@@ -548,10 +539,10 @@ namespace WindBot.Game ...@@ -548,10 +539,10 @@ namespace WindBot.Game
{ {
switch (hint) switch (hint)
{ {
case HINTMSG_SMATERIAL: case HintMsg.SynchroMaterial:
selected = Executor.OnSelectSynchroMaterial(cards, sum, min, max); selected = Executor.OnSelectSynchroMaterial(cards, sum, min, max);
break; break;
case HINTMSG_RELEASE: case HintMsg.Release:
selected = Executor.OnSelectRitualTribute(cards, sum, min, max); selected = Executor.OnSelectRitualTribute(cards, sum, min, max);
break; break;
} }
...@@ -951,6 +942,11 @@ namespace WindBot.Game ...@@ -951,6 +942,11 @@ namespace WindBot.Game
m_materialSelector = null; m_materialSelector = null;
} }
public bool HaveSelectedCards()
{
return m_selector.Count > 0 || m_materialSelector != null;
}
public CardSelector GetSelectedCards() public CardSelector GetSelectedCards()
{ {
CardSelector selected = null; CardSelector selected = null;
...@@ -1102,11 +1098,30 @@ namespace WindBot.Game ...@@ -1102,11 +1098,30 @@ namespace WindBot.Game
private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type, int desc = -1) private bool ShouldExecute(CardExecutor exec, ClientCard card, ExecutorType type, int desc = -1)
{ {
if (card.Id != 0 && type == ExecutorType.Activate)
{
if (_activatedCards.ContainsKey(card.Id) && _activatedCards[card.Id] >= 9)
return false;
if (!Executor.OnPreActivate(card))
return false;
}
Executor.SetCard(type, card, desc); Executor.SetCard(type, card, desc);
return card != null && bool result = card != null && exec.Type == type &&
exec.Type == type && (exec.CardId == -1 || exec.CardId == card.Id) &&
(exec.CardId == -1 || exec.CardId == card.Id) && (exec.Func == null || exec.Func());
(exec.Func == null || exec.Func()); if (card.Id != 0 && type == ExecutorType.Activate && result)
{
int count = card.IsDisabled() ? 3 : 1;
if (!_activatedCards.ContainsKey(card.Id))
{
_activatedCards.Add(card.Id, count);
}
else
{
_activatedCards[card.Id] += count;
}
}
return result;
} }
} }
} }
...@@ -44,7 +44,7 @@ namespace WindBot.Game ...@@ -44,7 +44,7 @@ namespace WindBot.Game
_ai = new GameAI(Game, _duel); _ai = new GameAI(Game, _duel);
_ai.Executor = DecksManager.Instantiate(_ai, _duel); _ai.Executor = DecksManager.Instantiate(_ai, _duel);
Deck = Deck.Load(_ai.Executor.Deck); Deck = Deck.Load(Game.DeckFile ?? _ai.Executor.Deck);
_select_hint = 0; _select_hint = 0;
} }
...@@ -1048,7 +1048,7 @@ namespace WindBot.Game ...@@ -1048,7 +1048,7 @@ namespace WindBot.Game
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)
{ {
packet.ReadByte(); // flag packet.ReadByte(); // flag
packet.ReadInt32(); // card id int id = packet.ReadInt32();
int con = GetLocalPlayer(packet.ReadByte()); int con = GetLocalPlayer(packet.ReadByte());
int loc = packet.ReadByte(); int loc = packet.ReadByte();
int seq = packet.ReadByte(); int seq = packet.ReadByte();
...@@ -1059,7 +1059,12 @@ namespace WindBot.Game ...@@ -1059,7 +1059,12 @@ namespace WindBot.Game
{ {
desc = 0; desc = 0;
} }
cards.Add(_duel.GetCard(con, loc, seq, sseq));
ClientCard card = _duel.GetCard(con, loc, seq, sseq);
if (card.Id == 0)
card.SetId(id);
cards.Add(card);
descs.Add(desc); descs.Add(desc);
} }
......
...@@ -13,6 +13,7 @@ namespace WindBot.Game ...@@ -13,6 +13,7 @@ namespace WindBot.Game
public YGOClient Connection { get; private set; } public YGOClient Connection { get; private set; }
public string Username; public string Username;
public string Deck; public string Deck;
public string DeckFile;
public string Dialog; public string Dialog;
public int Hand; public int Hand;
public bool Debug; public bool Debug;
...@@ -29,6 +30,7 @@ namespace WindBot.Game ...@@ -29,6 +30,7 @@ namespace WindBot.Game
{ {
Username = Info.Name; Username = Info.Name;
Deck = Info.Deck; Deck = Info.Deck;
DeckFile = Info.DeckFile;
Dialog = Info.Dialog; Dialog = Info.Dialog;
Hand = Info.Hand; Hand = Info.Hand;
Debug = Info.Debug; Debug = Info.Debug;
......
...@@ -68,6 +68,7 @@ namespace WindBot ...@@ -68,6 +68,7 @@ namespace WindBot
WindBotInfo Info = new WindBotInfo(); WindBotInfo Info = new WindBotInfo();
Info.Name = Config.GetString("Name", Info.Name); Info.Name = Config.GetString("Name", Info.Name);
Info.Deck = Config.GetString("Deck", Info.Deck); Info.Deck = Config.GetString("Deck", Info.Deck);
Info.DeckFile = Config.GetString("DeckFile", Info.DeckFile);
Info.Dialog = Config.GetString("Dialog", Info.Dialog); Info.Dialog = Config.GetString("Dialog", Info.Dialog);
Info.Host = Config.GetString("Host", Info.Host); Info.Host = Config.GetString("Host", Info.Host);
Info.Port = Config.GetInt("Port", Info.Port); Info.Port = Config.GetInt("Port", Info.Port);
...@@ -104,6 +105,9 @@ namespace WindBot ...@@ -104,6 +105,9 @@ namespace WindBot
string port = HttpUtility.ParseQueryString(RawUrl).Get("port"); string port = HttpUtility.ParseQueryString(RawUrl).Get("port");
if (port != null) if (port != null)
Info.Port = Int32.Parse(port); Info.Port = Int32.Parse(port);
string deckfile = HttpUtility.ParseQueryString(RawUrl).Get("deckfile");
if (deckfile != null)
Info.DeckFile = deckfile;
string dialog = HttpUtility.ParseQueryString(RawUrl).Get("dialog"); string dialog = HttpUtility.ParseQueryString(RawUrl).Get("dialog");
if (dialog != null) if (dialog != null)
Info.Dialog = dialog; Info.Dialog = dialog;
...@@ -193,5 +197,22 @@ namespace WindBot ...@@ -193,5 +197,22 @@ namespace WindBot
} }
#endif #endif
} }
public static FileStream ReadFile(string directory, string filename, string extension)
{
string tryfilename = filename + "." + extension;
string fullpath = Path.Combine(directory, tryfilename);
if (!File.Exists(fullpath))
fullpath = filename;
if (!File.Exists(fullpath))
fullpath = Path.Combine("../", filename);
if (!File.Exists(fullpath))
fullpath = Path.Combine("../deck/", filename);
if (!File.Exists(fullpath))
fullpath = Path.Combine("../", tryfilename);
if (!File.Exists(fullpath))
fullpath = Path.Combine("../deck/", tryfilename);
return new FileStream(fullpath, FileMode.Open, FileAccess.Read);
}
} }
} }
...@@ -20,6 +20,11 @@ The nickname for the bot. ...@@ -20,6 +20,11 @@ The nickname for the bot.
`Deck` `Deck`
The deck to be used by the bot. Available decks are listed below. Keep empty to use random deck. The deck to be used by the bot. Available decks are listed below. Keep empty to use random deck.
`DeckFile`
The deck file (.ydk) to be used by the bot. Will be set by `Deck` automatically, but you can override it.
Note: Most cards not in the original deck are unknown to the bot, and won't be summoned or activated in the duel.
`Dialog` `Dialog`
The dialog texts to be used by the bot. See Dialogs folder for list. The dialog texts to be used by the bot. See Dialogs folder for list.
......
...@@ -72,6 +72,7 @@ ...@@ -72,6 +72,7 @@
<Compile Include="Game\AI\Decks\AltergeistExecutor.cs" /> <Compile Include="Game\AI\Decks\AltergeistExecutor.cs" />
<Compile Include="Game\AI\Decks\FamiliarPossessedExecutor.cs" /> <Compile Include="Game\AI\Decks\FamiliarPossessedExecutor.cs" />
<Compile Include="Game\AI\Decks\BlackwingExecutor.cs" /> <Compile Include="Game\AI\Decks\BlackwingExecutor.cs" />
<Compile Include="Game\AI\Decks\LuckyExecutor.cs" />
<Compile Include="Game\AI\Decks\MathMechExecutor.cs" /> <Compile Include="Game\AI\Decks\MathMechExecutor.cs" />
<Compile Include="Game\AI\Decks\PureWindsExecutor.cs" /> <Compile Include="Game\AI\Decks\PureWindsExecutor.cs" />
<Compile Include="Game\AI\Decks\DragunExecutor.cs" /> <Compile Include="Game\AI\Decks\DragunExecutor.cs" />
...@@ -124,6 +125,7 @@ ...@@ -124,6 +125,7 @@
<Compile Include="Game\AI\Enums\InvincibleMonster.cs" /> <Compile Include="Game\AI\Enums\InvincibleMonster.cs" />
<Compile Include="Game\AI\Enums\Floodgate.cs" /> <Compile Include="Game\AI\Enums\Floodgate.cs" />
<Compile Include="Game\AI\Executor.cs" /> <Compile Include="Game\AI\Executor.cs" />
<Compile Include="Game\AI\HintMsg.cs" />
<Compile Include="Game\AI\Opcodes.cs" /> <Compile Include="Game\AI\Opcodes.cs" />
<Compile Include="Game\AI\Zones.cs" /> <Compile Include="Game\AI\Zones.cs" />
<Compile Include="Game\AI\ExecutorType.cs" /> <Compile Include="Game\AI\ExecutorType.cs" />
......
...@@ -6,6 +6,7 @@ namespace WindBot ...@@ -6,6 +6,7 @@ namespace WindBot
{ {
public string Name { get; set; } public string Name { get; set; }
public string Deck { get; set; } public string Deck { get; set; }
public string DeckFile { get; set; }
public string Dialog { get; set; } public string Dialog { get; set; }
public string Host { get; set; } public string Host { get; set; }
public int Port { get; set; } public int Port { get; set; }
...@@ -18,6 +19,7 @@ namespace WindBot ...@@ -18,6 +19,7 @@ namespace WindBot
{ {
Name = "WindBot"; Name = "WindBot";
Deck = null; Deck = null;
DeckFile = null;
Dialog = "default"; Dialog = "default";
Host = "127.0.0.1"; Host = "127.0.0.1";
Port = 7911; Port = 7911;
......
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