Commit 361a65e9 authored by mercury233's avatar mercury233

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

parents 18af9bdb 40a5021b
...@@ -93,3 +93,8 @@ SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE ...@@ -93,3 +93,8 @@ SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
Name=燃血鬥士 Deck=ChainBurn Dialog=kiwi.zh-TW Name=燃血鬥士 Deck=ChainBurn Dialog=kiwi.zh-TW
连锁烧卡组。 连锁烧卡组。
SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE
!复制梁龙-闪刀姬
Name=复制梁龙 Deck=SkyStriker Dialog=anothercopy.zh-CN
纯闪刀姬卡组。
SUPPORT_NEW_MASTER_RULE
#created by ...
#main
26077387
26077387
26077387
14558127
14558127
59438930
23434538
23434538
23434538
9742784
97268402
97268402
25955749
32807846
35726888
35726888
35726888
63166095
63166095
63166095
70368879
70368879
70368879
73594093
99550630
43898403
43898403
43898403
52340444
52340444
52340444
98338152
98338152
98338152
24010609
97616504
50005218
41420027
84749824
84749824
#extra
42110604
5821478
61665245
38342335
2857636
50588353
8491308
8491308
63288573
63288573
63288573
90673288
90673288
90673288
41999284
!side
{
"welcome": [
"你好,我是一个机器人。",
"AI功能正在测试中,遇到问题请及时反馈。"
],
"deckerror": [
"我的超主流卡组需要{0}才能玩。"
],
"duelstart": [
"闪刀姬卡组测试中,渣操是正常情况,请多指教。",
"超主流是游戏王的一环,不爽不要玩。",
"抄主流是游戏王的一环,不爽不要玩。",
"抄来的卡组不会用,怎么办?"
],
"newturn": [
"到我的回合了,抽卡!",
"我的回合,抽卡!",
"我抽了一张卡。"
],
"endturn": [
"回合结束。",
"我的回合结束了。",
"总觉得这波有点亏……",
"轮到你了。"
],
"directattack": [
"{0},直接攻击!",
"{0},直接攻击对手!",
"{0},没有防守的地方,攻击!",
"{0},攻击对手的生命值!",
"{0},直接攻击对手的生命值!",
"{0},通过直接攻击打倒对手!",
"{0},使用直接攻击打倒对手!",
"{0},直接攻击释放你的力量吧!",
"我的{0}将会粉碎你的生命值!",
"向对手展示你的力量吧,{0}!",
"你已经无法阻止我了。{0},攻击!"
],
"attack": [
"{0},攻击这只{1}!",
"{0},消灭这只{1}!",
"{0},打倒{1}!",
"{0},冲向那只{1}!",
"{0},把你的力量释放到{1}上吧!"
],
"ondirectattack": [
"可恶……",
"不过是{0}而已!",
"果然我还是太弱了……"
],
"facedownmonstername": "怪兽",
"activate": [
"我发动{0}。",
"我使用{0}的效果。",
"我使用{0}的力量。"
],
"summon": [
"我召唤{0}。",
"出来吧,{0}!",
"出现吧,{0}!",
"我召唤了美丽的{0}!",
"我呼唤{0}参加战斗!",
"我呼唤出{0}。",
"让我召唤{0}。"
],
"setmonster": [
"我放置了一只怪兽。",
"我里侧表示放置了一只怪兽。"
],
"chaining": [
"看这里!我发动{0}!",
"我使用{0}的力量。",
"准备!我使用{0}!",
"看样子你忘了我的{0}!",
"你考虑过我有{0}吗?"
]
}
...@@ -132,6 +132,25 @@ namespace WindBot.Game.AI ...@@ -132,6 +132,25 @@ namespace WindBot.Game.AI
return IsAllEnemyBetterThanValue(bestBotPower, onlyATK); return IsAllEnemyBetterThanValue(bestBotPower, onlyATK);
} }
public ClientCard GetBestBotMonster(bool onlyATK = false)
{
int bestPower = -1;
ClientCard bestMonster = null;
for (int i = 0; i < 7; ++i)
{
ClientCard card = Bot.MonsterZone[i];
if (card == null || card.Data == null) continue;
if (onlyATK && card.IsDefense()) continue;
int newPower = card.GetDefensePower();
if (newPower > bestPower)
{
bestPower = newPower;
bestMonster = card;
}
}
return bestMonster;
}
public ClientCard GetOneEnemyBetterThanValue(int value, bool onlyATK = false) public ClientCard GetOneEnemyBetterThanValue(int value, bool onlyATK = false)
{ {
ClientCard bestCard = null; ClientCard bestCard = null;
......
...@@ -590,7 +590,12 @@ namespace WindBot.Game.AI.Decks ...@@ -590,7 +590,12 @@ namespace WindBot.Game.AI.Decks
return false; return false;
} }
private bool CardOfDemiseeff() private bool CardOfDemiseeff()
{ {
foreach (ClientCard card in Bot.GetMonsters())
{
if (card.Id == CardId.CardcarD && card.IsFaceup())
return false;
}
if (Bot.GetHandCount() == 1 && Bot.GetSpellCountWithoutField() <= 3) if (Bot.GetHandCount() == 1 && Bot.GetSpellCountWithoutField() <= 3)
{ {
no_sp = true; no_sp = true;
......
...@@ -134,7 +134,7 @@ namespace WindBot.Game.AI.Decks ...@@ -134,7 +134,7 @@ namespace WindBot.Game.AI.Decks
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, DefaultKaijuSpsummon); 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
...@@ -353,13 +353,19 @@ namespace WindBot.Game.AI.Decks ...@@ -353,13 +353,19 @@ namespace WindBot.Game.AI.Decks
} }
return false; return false;
}
private bool GamecieltheSeaTurtleKaijusp()
{
if (!Bot.HasInMonstersZone(CardId.UltimateConductorTytanno))
return DefaultKaijuSpsummon();
return false;
} }
private bool RadiantheMultidimensionalKaijusp() private bool RadiantheMultidimensionalKaijusp()
{ {
if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true; if (Enemy.HasInMonstersZone(CardId.GamecieltheSeaTurtleKaiju)) return true;
if (Bot.HasInHand(CardId.DogorantheMadFlameKaiju)) return DefaultKaijuSpsummon(); if (Bot.HasInHand(CardId.DogorantheMadFlameKaiju) && !Bot.HasInMonstersZone(CardId.UltimateConductorTytanno)) return DefaultKaijuSpsummon();
return false; return false;
} }
...@@ -403,8 +409,11 @@ namespace WindBot.Game.AI.Decks ...@@ -403,8 +409,11 @@ namespace WindBot.Game.AI.Decks
} }
private bool MonsterRepos() private bool MonsterRepos()
{ {
if (Card.Id == CardId.UltimateConductorTytanno && Card.IsFacedown()) return true;
if (Card.Id == CardId.ElShaddollConstruct && Card.IsFacedown()) return true;
if (Card.Id == CardId.ElShaddollConstruct && Card.IsAttack()) return false; if (Card.Id == CardId.ElShaddollConstruct && Card.IsAttack()) return false;
if (Card.Id == CardId.GlowUpBulb && Card.IsDefense()) return false;
if (Card.Id == CardId.ShaddollDragon && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true; if (Card.Id == CardId.ShaddollDragon && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true;
if (Card.Id == CardId.ShaddollSquamata && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true; if (Card.Id == CardId.ShaddollSquamata && Card.IsFacedown() && Enemy.GetMonsterCount() >= 0) return true;
return base.DefaultMonsterRepos(); return base.DefaultMonsterRepos();
...@@ -540,7 +549,14 @@ namespace WindBot.Game.AI.Decks ...@@ -540,7 +549,14 @@ namespace WindBot.Game.AI.Decks
int spell_count = 0; int spell_count = 0;
IList<ClientCard> grave = Bot.Graveyard; IList<ClientCard> grave = Bot.Graveyard;
IList<ClientCard> all = new List<ClientCard>(); IList<ClientCard> all = new List<ClientCard>();
foreach (ClientCard check in grave)
{
if (check.Id == CardId.GiantRex)
{
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))
...@@ -556,12 +572,8 @@ namespace WindBot.Game.AI.Decks ...@@ -556,12 +572,8 @@ namespace WindBot.Game.AI.Decks
all.Add(check); all.Add(check);
} }
} }
if (AI.Utils.GetLastChainCard()!=null) if (AI.Utils.ChainContainsCard(CardId.FairyTailSnow)) return false;
{
if (AI.Utils.GetLastChainCard().Id == CardId.FairyTailSnow) return false;
}
if ( Duel.Player == 1 && Duel.Phase == DuelPhase.BattleStart && Bot.BattlingMonster == null && Enemy_atk >=Bot.LifePoints || 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 Duel.Player == 0 && Duel.Phase==DuelPhase.BattleStart && Enemy.BattlingMonster == null && Enemy.LifePoints<=1850
) )
...@@ -577,10 +589,10 @@ namespace WindBot.Game.AI.Decks ...@@ -577,10 +589,10 @@ namespace WindBot.Game.AI.Decks
private bool SouleatingOviraptoreff() private bool SouleatingOviraptoreff()
{ {
if (!OvertexCoatlseff_used) if (!OvertexCoatlseff_used && Bot.GetRemainingCount(CardId.OvertexCoatls, 3) > 0)
{ {
AI.SelectCard(CardId.OvertexCoatls); AI.SelectCard(CardId.OvertexCoatls);
AI.SelectYesNo(false); AI.SelectYesNo(false);
} }
else else
{ {
...@@ -721,13 +733,13 @@ namespace WindBot.Game.AI.Decks ...@@ -721,13 +733,13 @@ namespace WindBot.Game.AI.Decks
{ {
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)) 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)) if (monster.HasType(CardType.Synchro) || monster.HasType(CardType.Fusion) || monster.HasType(CardType.Xyz) || monster.HasType(CardType.Link))
deck_check = true; deck_check = true;
} }
...@@ -748,7 +760,7 @@ namespace WindBot.Game.AI.Decks ...@@ -748,7 +760,7 @@ namespace WindBot.Game.AI.Decks
CardId.ShaddollHedgehog, CardId.ShaddollHedgehog,
CardId.ShaddollDragon, CardId.ShaddollDragon,
CardId.ShaddollFalco, CardId.ShaddollFalco,
CardId.FairyTailSnow,
}); });
AI.SelectPosition(CardPosition.FaceUpAttack); AI.SelectPosition(CardPosition.FaceUpAttack);
return true; return true;
...@@ -891,11 +903,9 @@ namespace WindBot.Game.AI.Decks ...@@ -891,11 +903,9 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
if (Enemy.GetMonsterCount() == 0) return false;
ClientCard target = AI.Utils.GetBestEnemyMonster(); ClientCard target = AI.Utils.GetBestEnemyMonster();
AI.SelectCard(target); AI.SelectCard(target);
if (Enemy.GetMonsterCount() == 0)
return false;
} }
return true; return true;
} }
...@@ -972,6 +982,7 @@ namespace WindBot.Game.AI.Decks ...@@ -972,6 +982,7 @@ namespace WindBot.Game.AI.Decks
} }
else else
{ {
if (Enemy.GetSpellCount() == 0) return false;
ClientCard target = AI.Utils.GetBestEnemySpell(); ClientCard target = AI.Utils.GetBestEnemySpell();
AI.SelectCard(target); AI.SelectCard(target);
return true; return true;
...@@ -981,6 +992,8 @@ namespace WindBot.Game.AI.Decks ...@@ -981,6 +992,8 @@ namespace WindBot.Game.AI.Decks
private bool LostWindeff() private bool LostWindeff()
{ {
if (Card.Location == CardLocation.Grave)
return true;
List<ClientCard> check = Enemy.GetMonsters(); List<ClientCard> check = Enemy.GetMonsters();
foreach (ClientCard m in check) foreach (ClientCard m in check)
{ {
......
using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic;
using WindBot;
using WindBot.Game;
using WindBot.Game.AI;
namespace WindBot.Game.AI.Decks
{
[Deck("SkyStriker", "AI_SkyStriker", "NotFinished")]
public class SkyStrikerExecutor : DefaultExecutor
{
public class CardId
{
public const int Rei = 26077387;
public const int Kagari = 63288573;
public const int Shizuku = 90673288;
public const int Hayate = 8491308;
public const int Token = 52340445;
public const int Engage = 63166095;
public const int HornetBit = 52340444;
public const int WidowAnchor = 98338152;
public const int Afterburner = 99550630;
public const int JammingWave = 25955749;
public const int MultiRoll = 24010609;
public const int HerculesBase = 97616504;
public const int AreaZero = 50005218;
public const int AshBlossom = 14558127;
public const int GhostRabbit = 59438930;
public const int MaxxC = 23434538;
public const int JetSynchron = 9742784;
public const int EffectVeiler = 97268402;
public const int ReinforcementOfTheArmy = 32807846;
public const int FoolishBurialGoods = 35726888;
public const int UpstartGoblin = 70368879;
public const int MetalfoesFusion = 73594093;
public const int TwinTwisters = 43898403;
public const int SolemnJudgment = 41420027;
public const int SolemnWarning = 84749824;
public const int HiSpeedroidChanbara = 42110604;
public const int TopologicBomberDragon = 5821478;
public const int TopologicTrisbaena = 72529749;
public const int SummonSorceress = 61665245;
public const int TroymareUnicorn = 38342335;
public const int TroymarePhoenix = 2857636;
public const int CrystronNeedlefiber = 50588353;
public const int Linkuriboh = 41999284;
}
bool KagariSummoned = false;
bool ShizukuSummoned = false;
bool HayateSummoned = false;
ClientCard WidowAnchorTarget = null;
public SkyStrikerExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, CardId.AshBlossom, DefaultTrap);
AddExecutor(ExecutorType.Activate, CardId.GhostRabbit, DefaultTrap);
AddExecutor(ExecutorType.Activate, CardId.EffectVeiler, DefaultBreakthroughSkill);
AddExecutor(ExecutorType.Activate, CardId.SolemnWarning, DefaultSolemnWarning);
AddExecutor(ExecutorType.Activate, CardId.SolemnJudgment, DefaultSolemnJudgment);
AddExecutor(ExecutorType.Activate, CardId.MaxxC, MaxxCEffect);
AddExecutor(ExecutorType.Activate, CardId.ReinforcementOfTheArmy);
AddExecutor(ExecutorType.Activate, CardId.UpstartGoblin);
AddExecutor(ExecutorType.Activate, CardId.FoolishBurialGoods, FoolishBurialGoodsEffect);
AddExecutor(ExecutorType.Activate, CardId.TwinTwisters, TwinTwistersEffect);
//
AddExecutor(ExecutorType.Activate, CardId.MultiRoll, MultiRollHandEffect);
AddExecutor(ExecutorType.Activate, CardId.WidowAnchor, WidowAnchorEffectFirst);
AddExecutor(ExecutorType.Activate, CardId.Afterburner, AfterburnerEffect);
AddExecutor(ExecutorType.Activate, CardId.JammingWave, JammingWaveEffect);
AddExecutor(ExecutorType.Activate, CardId.Engage, EngageEffectFirst);
AddExecutor(ExecutorType.Activate, CardId.HornetBit, HornetBitEffect);
AddExecutor(ExecutorType.Activate, CardId.WidowAnchor, WidowAnchorEffect);
AddExecutor(ExecutorType.Activate, CardId.HerculesBase, HerculesBaseEffect);
AddExecutor(ExecutorType.Activate, CardId.AreaZero, AreaZeroEffect);
AddExecutor(ExecutorType.Activate, CardId.MultiRoll, MultiRollEffect);
AddExecutor(ExecutorType.Activate, CardId.Engage, EngageEffect);
//
AddExecutor(ExecutorType.Summon, CardId.JetSynchron, TunerSummon);
AddExecutor(ExecutorType.Summon, CardId.EffectVeiler, TunerSummon);
AddExecutor(ExecutorType.Summon, CardId.GhostRabbit, TunerSummon);
AddExecutor(ExecutorType.Summon, CardId.AshBlossom, TunerSummon);
AddExecutor(ExecutorType.Activate, CardId.Rei, ReiEffect);
AddExecutor(ExecutorType.SpSummon, CardId.Kagari, KagariSummon);
AddExecutor(ExecutorType.Activate, CardId.Kagari, KagariEffect);
AddExecutor(ExecutorType.SpSummon, CardId.CrystronNeedlefiber, CrystronNeedlefiberSummon);
AddExecutor(ExecutorType.Activate, CardId.CrystronNeedlefiber, CrystronNeedlefiberEffect);
AddExecutor(ExecutorType.SpSummon, CardId.SummonSorceress);
AddExecutor(ExecutorType.Activate, CardId.SummonSorceress, SummonSorceressEffect);
AddExecutor(ExecutorType.Activate, CardId.JetSynchron, JetSynchronEffect);
AddExecutor(ExecutorType.SpSummon, CardId.HiSpeedroidChanbara);
AddExecutor(ExecutorType.SpSummon, CardId.Shizuku, ShizukuSummon);
AddExecutor(ExecutorType.Activate, CardId.Shizuku, ShizukuEffect);
AddExecutor(ExecutorType.SpSummon, CardId.Hayate, HayateSummon);
AddExecutor(ExecutorType.Activate, CardId.Hayate, HayateEffect);
AddExecutor(ExecutorType.SpSummon, CardId.TopologicBomberDragon, AI.Utils.IsTurn1OrMain2);
AddExecutor(ExecutorType.Summon, CardId.Rei, ReiSummon);
//
AddExecutor(ExecutorType.SpellSet, CardId.SolemnJudgment);
AddExecutor(ExecutorType.SpellSet, CardId.SolemnWarning);
AddExecutor(ExecutorType.SpellSet, CardId.WidowAnchor);
AddExecutor(ExecutorType.SpellSet, CardId.HerculesBase);
AddExecutor(ExecutorType.SpellSet, CardId.TwinTwisters, HandFull);
AddExecutor(ExecutorType.SpellSet, CardId.HornetBit, HandFull);
//
AddExecutor(ExecutorType.Activate, CardId.MetalfoesFusion);
AddExecutor(ExecutorType.Activate, CardId.MultiRoll, MultiRollEPEffect);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
}
public override bool OnSelectHand()
{
// go first
return true;
}
public override void OnNewTurn()
{
KagariSummoned = false;
ShizukuSummoned = false;
HayateSummoned = false;
WidowAnchorTarget = null;
}
public override bool OnPreBattleBetween(ClientCard attacker, ClientCard defender)
{
if (!defender.IsMonsterHasPreventActivationEffectInBattle())
{
if (attacker.Id == CardId.HiSpeedroidChanbara && !attacker.IsDisabled())
attacker.RealPower = attacker.RealPower + 200;
}
return base.OnPreBattleBetween(attacker, defender);
}
public override bool OnSelectYesNo(int desc)
{
if (desc == AI.Utils.GetStringId(CardId.SummonSorceress, 2)) // summon to the field of opponent?
return false;
if (desc == AI.Utils.GetStringId(CardId.Engage, 0)) // draw card?
return true;
if (desc == AI.Utils.GetStringId(CardId.WidowAnchor, 0)) // get control?
return true;
if (desc == AI.Utils.GetStringId(CardId.JammingWave, 0)) // destroy monster?
{
ClientCard target = AI.Utils.GetBestEnemyMonster();
if (target != null)
{
AI.SelectCard(target);
return true;
}
else
return false;
}
if (desc == AI.Utils.GetStringId(CardId.Afterburner, 0)) // destroy spell & trap?
{
ClientCard target = AI.Utils.GetBestEnemySpell();
if (target != null)
{
AI.SelectCard(target);
return true;
}
else
return false;
}
return base.OnSelectYesNo(desc);
}
private bool MaxxCEffect()
{
return Duel.Player == 1;
}
private bool TwinTwistersEffect()
{
if (AI.Utils.ChainContainsCard(CardId.TwinTwisters))
return false;
IList<ClientCard> targets = new List<ClientCard>();
foreach (ClientCard target in Enemy.GetSpells())
{
if (target.IsFloodgate())
targets.Add(target);
if (targets.Count >= 2)
break;
}
if (targets.Count < 2)
{
foreach (ClientCard target in Enemy.GetSpells())
{
targets.Add(target);
if (targets.Count >= 2)
break;
}
}
if (targets.Count > 0)
{
AI.SelectCard(GetDiscardHand());
AI.SelectNextCard(targets);
return true;
}
return false;
}
private bool FoolishBurialGoodsEffect()
{
AI.SelectCard(new[]{
CardId.MetalfoesFusion,
CardId.WidowAnchor,
CardId.Engage,
CardId.HornetBit
});
return true;
}
private bool MultiRollHandEffect()
{
return Card.Location == CardLocation.Hand;
}
private bool MultiRollEPEffect()
{
if (Duel.Phase != DuelPhase.End)
return false;
IList<int> targets = new[] {
CardId.Engage,
CardId.HornetBit,
CardId.WidowAnchor
};
AI.SelectCard(targets);
AI.SelectNextCard(targets);
AI.SelectThirdCard(targets);
return true;
}
private bool AfterburnerEffect()
{
ClientCard target = AI.Utils.GetBestEnemyMonster(true);
if (target != null)
{
AI.SelectCard(target);
return true;
}
return false;
}
private bool JammingWaveEffect()
{
ClientCard target = null;
foreach(ClientCard card in Enemy.GetSpells())
{
if (card.IsFacedown())
{
target = card;
break;
}
}
if (target != null)
{
AI.SelectCard(target);
return true;
}
return false;
}
private bool WidowAnchorEffectFirst()
{
ClientCard target = AI.Utils.GetProblematicEnemyMonster();
if (target != null)
{
WidowAnchorTarget = target;
AI.SelectCard(target);
return true;
}
return false;
}
private bool EngageEffectFirst()
{
if (!HaveThreeSpellsInGrave())
return false;
int target = GetCardToSearch();
if (target > 0)
AI.SelectCard(target);
else
AI.SelectCard(new[] {
CardId.MultiRoll,
CardId.AreaZero,
CardId.Afterburner,
CardId.JammingWave,
CardId.Rei
});
return true;
}
private bool EngageEffect()
{
int target = GetCardToSearch();
if (target > 0)
AI.SelectCard(target);
else
AI.SelectCard(new[] {
CardId.MultiRoll,
CardId.AreaZero,
CardId.Afterburner,
CardId.JammingWave,
CardId.Rei
});
return true;
}
private bool HornetBitEffect()
{
if (Duel.Player == 1)
{
return Duel.Phase == DuelPhase.End;
}
else
{
if (Duel.Phase != DuelPhase.Main1)
return false;
if (Duel.CurrentChain.Count > 0)
return false;
if (Bot.GetMonstersExtraZoneCount() == 0)
return true;
if (Bot.HasInMonstersZone(CardId.SummonSorceress))
return true;
if (Bot.HasInMonstersZone(CardId.TopologicBomberDragon) && Enemy.GetMonsterCount() > 1)
return true;
if (!AI.Utils.IsTurn1OrMain2())
{
foreach (ClientCard card in Bot.Hand)
{
if (card.IsTuner())
return true;
}
}
}
return false;
}
private bool WidowAnchorEffect()
{
if (DefaultBreakthroughSkill())
{
WidowAnchorTarget = AI.Utils.GetLastChainCard();
return true;
}
if (!HaveThreeSpellsInGrave() || Duel.Player == 1 || Duel.Phase < DuelPhase.Main1 || Duel.Phase >= DuelPhase.Main2 || AI.Utils.ChainContainsCard(CardId.WidowAnchor))
return false;
ClientCard target = AI.Utils.GetBestEnemyMonster(true);
if (target != null && !target.IsDisabled() && !target.HasType(CardType.Normal))
{
WidowAnchorTarget = target;
AI.SelectCard(target);
return true;
}
return false;
}
private bool HerculesBaseEffect()
{
if (Card.Location == CardLocation.Grave)
{
IList<ClientCard> targets = new List<ClientCard>();
foreach(ClientCard card in Bot.GetGraveyardMonsters())
{
if (card.Id == CardId.Hayate || card.Id == CardId.Kagari || card.Id == CardId.Shizuku)
targets.Add(card);
}
if (targets.Count > 0)
{
AI.SelectCard(targets);
return true;
}
}
else
{
if (AI.Utils.IsTurn1OrMain2())
return false;
ClientCard bestBotMonster = AI.Utils.GetBestBotMonster(true);
if (bestBotMonster != null)
{
int bestPower = bestBotMonster.Attack;
int count = 0;
bool have3 = HaveThreeSpellsInGrave();
foreach (ClientCard target in Enemy.GetMonsters())
{
if (target.GetDefensePower() < bestPower && !target.IsMonsterInvincible())
{
count++;
if (count > 1 || have3)
{
AI.SelectCard(bestBotMonster);
return true;
}
}
}
}
}
return false;
}
private bool AreaZeroEffect()
{
if (Card.Location == CardLocation.Hand || Card.Location == CardLocation.Grave)
{
return true;
}
foreach (ClientCard target in Bot.GetMonsters())
{
if (target == WidowAnchorTarget && Duel.Phase == DuelPhase.Main2)
{
AI.SelectCard(target);
return true;
}
}
foreach (ClientCard target in Bot.GetMonsters())
{
if (target.Id == CardId.Rei && Bot.GetMonstersExtraZoneCount() == 0)
{
AI.SelectCard(target);
return true;
}
}
foreach (ClientCard target in Bot.GetSpells())
{
if (target.Id != CardId.AreaZero && target.Id != CardId.MultiRoll && target.Id != CardId.WidowAnchor && target.IsSpell())
{
AI.SelectCard(target);
return true;
}
}
return false;
}
private bool MultiRollEffect()
{
if (Card.Location == CardLocation.SpellZone)
{
foreach (ClientCard target in Bot.GetMonsters())
{
if (target == WidowAnchorTarget && Duel.Phase == DuelPhase.Main2)
{
AI.SelectCard(target);
return true;
}
}
foreach (ClientCard target in Bot.GetMonsters())
{
if (target.Id == CardId.Rei && Bot.GetMonstersExtraZoneCount() == 0)
{
AI.SelectCard(target);
return true;
}
}
foreach (ClientCard target in Bot.GetSpells())
{
if (target.Id == CardId.AreaZero)
{
AI.SelectCard(target);
return true;
}
}
foreach (ClientCard target in Bot.GetSpells())
{
if (target.Id != CardId.MultiRoll && target.Id != CardId.WidowAnchor && target.IsSpell())
{
AI.SelectCard(target);
return true;
}
}
}
return false;
}
private bool ReiSummon()
{
if (Bot.GetMonstersExtraZoneCount() == 0)
{
return true;
}
return false;
}
private bool ReiEffect()
{
if (Card.Location == CardLocation.Grave)
{
return true;
}
if (Card.IsDisabled())
{
return false;
}
if (AI.Utils.IsChainTarget(Card))
{
ReiSelectTarget();
return true;
}
if (Card.Attacked && Duel.Phase == DuelPhase.BattleStart)
{
ReiSelectTarget();
return true;
}
if (Card == Bot.BattlingMonster && Duel.Player == 1)
{
ReiSelectTarget();
return true;
}
if (Duel.Phase == DuelPhase.Main2)
{
ReiSelectTarget();
return true;
}
return false;
}
private void ReiSelectTarget()
{
if (!KagariSummoned && Bot.HasInGraveyard(new[] {
CardId.Engage,
CardId.HornetBit,
CardId.WidowAnchor
}))
{
AI.SelectCard(CardId.Kagari);
}
else
{
AI.SelectCard(new[] {
CardId.Shizuku,
CardId.Kagari,
CardId.Hayate
});
}
}
private bool KagariSummon()
{
if (Bot.HasInGraveyard(new[] {
CardId.Engage,
CardId.HornetBit,
CardId.WidowAnchor
}))
{
KagariSummoned = true;
return true;
}
return false;
}
private bool KagariEffect()
{
if (EmptyMainMonsterZone() && AI.Utils.GetProblematicEnemyMonster() != null && Bot.HasInGraveyard(CardId.Afterburner))
{
AI.SelectCard(CardId.Afterburner);
}
else if (EmptyMainMonsterZone() && AI.Utils.GetProblematicEnemySpell() != null && Bot.HasInGraveyard(CardId.JammingWave))
{
AI.SelectCard(CardId.JammingWave);
}
else
AI.SelectCard(new[] {
CardId.Engage,
CardId.HornetBit,
CardId.WidowAnchor
});
return true;
}
private bool ShizukuSummon()
{
if (AI.Utils.IsTurn1OrMain2())
{
ShizukuSummoned = true;
return true;
}
return false;
}
private bool ShizukuEffect()
{
int target = GetCardToSearch();
if (target != 0)
AI.SelectCard(target);
else
AI.SelectCard(new[] {
CardId.Engage,
CardId.HornetBit,
CardId.WidowAnchor
});
return true;
}
private bool HayateSummon()
{
if (AI.Utils.IsTurn1OrMain2())
return false;
HayateSummoned = true;
return true;
}
private bool HayateEffect()
{
if (!Bot.HasInGraveyard(CardId.Rei))
AI.SelectCard(CardId.Rei);
else if (!Bot.HasInGraveyard(CardId.HornetBit))
AI.SelectCard(CardId.HornetBit);
else if (!Bot.HasInGraveyard(CardId.WidowAnchor))
AI.SelectCard(CardId.WidowAnchor);
return true;
}
private bool TunerSummon()
{
return !Bot.HasInMonstersZone(new[] {
CardId.AshBlossom,
CardId.EffectVeiler,
CardId.GhostRabbit,
CardId.JetSynchron
}) && !AI.Utils.IsTurn1OrMain2()
&& Bot.GetMonsterCount() > 0
&& Bot.HasInExtra(CardId.CrystronNeedlefiber);
}
private bool CrystronNeedlefiberSummon()
{
return !AI.Utils.IsTurn1OrMain2();
}
private bool CrystronNeedlefiberEffect()
{
AI.SelectCard(CardId.JetSynchron);
return true;
}
private bool SummonSorceressEffect()
{
if (ActivateDescription == -1)
return false;
return true;
}
private bool JetSynchronEffect()
{
if (Bot.HasInMonstersZone(CardId.Rei) || Bot.HasInMonstersZone(CardId.CrystronNeedlefiber))
{
AI.SelectCard(GetDiscardHand());
AI.SelectPosition(CardPosition.FaceUpDefence);
return true;
}
return false;
}
private bool HandFull()
{
return Bot.GetSpellCountWithoutField() < 4 && Bot.Hand.Count > 4;
}
private int GetDiscardHand()
{
if (Bot.HasInHand(CardId.MetalfoesFusion))
return CardId.MetalfoesFusion;
if (Bot.HasInHand(CardId.Rei) && !Bot.HasInGraveyard(CardId.Rei))
return CardId.Rei;
if (Bot.HasInHand(CardId.JetSynchron))
return CardId.JetSynchron;
if (Bot.HasInHand(CardId.ReinforcementOfTheArmy))
return CardId.ReinforcementOfTheArmy;
if (Bot.HasInHand(CardId.FoolishBurialGoods))
return CardId.FoolishBurialGoods;
return 0;
}
private int GetCardToSearch()
{
if (!Bot.HasInHand(CardId.HornetBit) && Bot.GetRemainingCount(CardId.HornetBit, 3) > 0)
{
return CardId.HornetBit;
}
else if (AI.Utils.GetProblematicEnemyMonster() != null && Bot.GetRemainingCount(CardId.WidowAnchor, 3) > 0)
{
return CardId.WidowAnchor;
}
else if (EmptyMainMonsterZone() && AI.Utils.GetProblematicEnemyMonster() != null && Bot.GetRemainingCount(CardId.Afterburner, 1) > 0)
{
return CardId.Afterburner;
}
else if (EmptyMainMonsterZone() && AI.Utils.GetProblematicEnemySpell() != null && Bot.GetRemainingCount(CardId.JammingWave, 1) > 0)
{
return CardId.JammingWave;
}
else if (!Bot.HasInHand(CardId.Rei) && !Bot.HasInMonstersZone(CardId.Rei) && Bot.GetRemainingCount(CardId.Rei, 3) > 0)
{
return CardId.Rei;
}
else if (!Bot.HasInHand(CardId.WidowAnchor) && !Bot.HasInSpellZone(CardId.WidowAnchor) && Bot.GetRemainingCount(CardId.WidowAnchor, 3) > 0)
{
return CardId.WidowAnchor;
}
return 0;
}
private bool EmptyMainMonsterZone()
{
for (int i = 0; i < 5; i++)
{
if (Bot.MonsterZone[i] != null)
return false;
}
return true;
}
private bool HaveThreeSpellsInGrave()
{
int count = 0;
foreach(ClientCard card in Bot.Graveyard)
{
if (card.IsSpell())
{
count++;
}
}
return count >= 3;
}
private bool DefaultNoExecutor()
{
foreach (CardExecutor exec in Executors)
{
if (exec.Type == Type && exec.CardId == Card.Id)
return false;
}
return true;
}
}
}
\ No newline at end of file
...@@ -154,6 +154,11 @@ namespace WindBot.Game ...@@ -154,6 +154,11 @@ namespace WindBot.Game
return HasType(CardType.Monster); return HasType(CardType.Monster);
} }
public bool IsTuner()
{
return HasType(CardType.Tuner);
}
public bool IsSpell() public bool IsSpell()
{ {
return HasType(CardType.Spell); return HasType(CardType.Spell);
......
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
<Compile Include="Game\AI\DecksManager.cs" /> <Compile Include="Game\AI\DecksManager.cs" />
<Compile Include="Game\AI\Decks\BlackwingExecutor.cs" /> <Compile Include="Game\AI\Decks\BlackwingExecutor.cs" />
<Compile Include="Game\AI\Decks\CyberDragonExecutor.cs" /> <Compile Include="Game\AI\Decks\CyberDragonExecutor.cs" />
<Compile Include="Game\AI\Decks\SkyStrikerExecutor.cs" />
<Compile Include="Game\AI\Decks\MokeyMokeyKingExecutor.cs" /> <Compile Include="Game\AI\Decks\MokeyMokeyKingExecutor.cs" />
<Compile Include="Game\AI\Decks\MokeyMokeyExecutor.cs" /> <Compile Include="Game\AI\Decks\MokeyMokeyExecutor.cs" />
<Compile Include="Game\AI\Decks\ToadallyAwesomeExecutor.cs" /> <Compile Include="Game\AI\Decks\ToadallyAwesomeExecutor.cs" />
......
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